From b47c35af7073aec37219e4cfec6d2da55f0e817b Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 13 Jun 2018 16:16:46 -0400 Subject: [PATCH 0001/1312] first commit to own fork --- .gitignore | 3 + cmakecmd | 7 + src/apps/chem/SCF.cc | 15 +- src/apps/moldft/CMakeLists.txt | 5 +- src/apps/moldft/DF.cc | 1645 ++++++++++++++++++++++++++++++ src/apps/moldft/DF.h | 142 +++ src/apps/moldft/DFParameters.h | 199 ++++ src/apps/moldft/DFdriver.cc | 54 + src/apps/moldft/DFdriver.pbs | 71 ++ src/apps/moldft/ESInterface.h | 153 +++ src/apps/moldft/InitParameters.h | 419 ++++++++ src/apps/moldft/NWChem.cc | 973 ++++++++++++++++++ src/apps/moldft/NWChem.h | 102 ++ src/apps/moldft/Plot_VTK.h | 77 ++ src/apps/moldft/basis.h | 70 ++ src/apps/moldft/fcwf.cc | 400 ++++++++ src/apps/moldft/fcwf.h | 110 ++ src/apps/moldft/gaussian.cc | 1457 ++++++++++++++++++++++++++ src/apps/moldft/gaussian.h | 393 +++++++ src/apps/moldft/input | 52 +- src/apps/moldft/polynomial.cc | 148 +++ src/apps/moldft/polynomial.h | 235 +++++ src/madness/mra/funcimpl.h | 66 +- 23 files changed, 6779 insertions(+), 17 deletions(-) create mode 100644 cmakecmd create mode 100644 src/apps/moldft/DF.cc create mode 100644 src/apps/moldft/DF.h create mode 100644 src/apps/moldft/DFParameters.h create mode 100644 src/apps/moldft/DFdriver.cc create mode 100644 src/apps/moldft/DFdriver.pbs create mode 100644 src/apps/moldft/ESInterface.h create mode 100644 src/apps/moldft/InitParameters.h create mode 100644 src/apps/moldft/NWChem.cc create mode 100644 src/apps/moldft/NWChem.h create mode 100644 src/apps/moldft/Plot_VTK.h create mode 100644 src/apps/moldft/basis.h create mode 100644 src/apps/moldft/fcwf.cc create mode 100644 src/apps/moldft/fcwf.h create mode 100644 src/apps/moldft/gaussian.cc create mode 100644 src/apps/moldft/gaussian.h create mode 100644 src/apps/moldft/polynomial.cc create mode 100644 src/apps/moldft/polynomial.h diff --git a/.gitignore b/.gitignore index 8bfd1f708f9..083b7844017 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Build directory +build/* + # Compiled Object files *.slo *.lo diff --git a/cmakecmd b/cmakecmd new file mode 100644 index 00000000000..b0e77f636bd --- /dev/null +++ b/cmakecmd @@ -0,0 +1,7 @@ +cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/generic-mkl-tbb.cmake \ + -DCMAKE_BUILD_TYPE=Debug \ + -DBUILD_SHARED_LIBS=OFF \ + -DLIBXC_LIBRARIES=/gpfs/projects/rjh/libxc-3.0.0/lib/libxc.a \ + -DLIBXC_INCLUDE_DIRS=/gpfs/projects/rjh/libxc-3.0.0/include \ + .. +# -DBLA_STATIC=TRUE diff --git a/src/apps/chem/SCF.cc b/src/apps/chem/SCF.cc index 7ff7de2fd18..8e25e1165b4 100644 --- a/src/apps/chem/SCF.cc +++ b/src/apps/chem/SCF.cc @@ -249,7 +249,7 @@ namespace madness { archive::ParallelOutputArchive ar(world, "restartdata", param.nio); ar & current_energy & param.spin_restricted; ar & (unsigned int) (amo.size()); - ar & aeps & aocc & aset; + ar & aeps & aocc & aset & param.L & FunctionDefaults<3>::get_k() & molecule; for (unsigned int i = 0; i < amo.size(); ++i) ar & amo[i]; if (!param.spin_restricted) { @@ -295,6 +295,11 @@ namespace madness { repeat for beta if !spinrestricted */ + + //Local copies for basic check + double L; + Molecule molecule1; + int k1; // LOTS OF LOGIC MISSING HERE TO CHANGE OCCUPATION NO., SET, // EPS, SWAP, ... sigh @@ -302,7 +307,13 @@ namespace madness { ar & nmo; MADNESS_ASSERT(nmo >= unsigned(param.nmo_alpha)); - ar & aeps & aocc & aset; + ar & aeps & aocc & aset & L & k1 & molecule1; + + //Some basic checks + if(L != param.L){ + if(world.rank()==0) print("Warning: Box size mismatch between archive and input parameter. Archive value:", L, "Param value:", param.L); + } + amo.resize(nmo); for (unsigned int i = 0; i < amo.size(); ++i) ar & amo[i]; diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index 50cfe5bfe93..4c695c2c7ea 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -15,4 +15,7 @@ target_link_libraries(testpg MADchem) add_executable(testperiodic_moldft testperiodic.cc) target_link_libraries(testperiodic_moldft MADchem) -install(TARGETS moldft mcpfit DESTINATION "${MADNESS_INSTALL_BINDIR}") \ No newline at end of file +add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) +target_link_libraries(DFdriver MADchem MADmra) + +install(TARGETS moldft mcpfit DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc new file mode 100644 index 00000000000..20b7974b38b --- /dev/null +++ b/src/apps/moldft/DF.cc @@ -0,0 +1,1645 @@ +/* + * + * Written by: bsundahl and jscanderson + * Date: A long time ago... + * + * TODO: + * - Use energies calculated in diagonalization and calculate various totals at the end + * - Use total of orbital energies as convergence criterion, rather than recalculating + * - + * + */ + +#include "DF.h" +//#include "Plot_VTK.h" +#include "fcwf.h" +#include "../chem/potentialmanager.h" + +using namespace madness; + +// Needed for rebalancing +template +struct lbcost { + double leaf_value; + double parent_value; + lbcost(double leaf_value=1.0, double parent_value=0.0) : leaf_value(leaf_value), parent_value(parent_value) {} + double operator()(const Key& key, const FunctionNode& node) const { + if (key.level() < 1) { + return 100.0*(leaf_value+parent_value); + } + else if (node.is_leaf()) { + return leaf_value; + } + else { + return parent_value; + } + } +}; + +// Pulled from SCF.cc, starts a timer +void DF::start_timer(World& world) +{ + world.gop.fence(); + ttt.push_back(wall_time()); + sss.push_back(cpu_time()); +} + +// Needed for timers +double DF::pop(std::vector& v) +{ + double x = v.back(); + v.pop_back(); + return x; +} + +// Stops a timer +Tensor DF::end_timer(World& world) +{ + Tensor times(2); + times[0] = wall_time() - pop(ttt); + times[1] = cpu_time() - pop(sss); + return times; +} + +//reports back with time spent in calculation (current time - the first time in ttt,sss) +Tensor DF::get_times(World& world){ + Tensor times(2); + times[0] = wall_time() - ttt[0]; + times[1] = cpu_time() - sss[0]; + return times; +} + +//Changes a real function to a complex function +template +struct function_real2complex_op +{ + typedef std::complex resultT; + Tensor operator()(const Key& key, const Tensor& t) const + { + Tensor result(t.ndim(), t.dims()); + BINARY_OPTIMIZED_ITERATOR(const Q, t, resultT, result, *_p1 = resultT(*_p0,0.0);); + return result; + } + template + void serialize(Archive& ar) {} +}; + +Function,3> function_real2complex(const Function& r) +{ + return unary_op_coeffs(r, function_real2complex_op()); +} + +/// Factory function generating operator for convolution with grad(bsh) in 3D +/// Returns a 3-vector containing the convolution operator for the +/// x, y, and z components of grad(bsh) +static +inline +std::vector< std::shared_ptr< SeparatedConvolution > > +GradBSHOperator_Joel(World& world, + double mu, + double lo, + double eps, + const BoundaryConditions<3>& bc=FunctionDefaults<3>::get_bc(), + int k=FunctionDefaults<3>::get_k()) +{ + typedef SeparatedConvolution real_convolution_3d; + typedef std::shared_ptr real_convolution_3d_ptr; + const double pi = constants::pi; + const Tensor width = FunctionDefaults<3>::get_cell_width(); + double hi = width.normf(); // Diagonal width of cell + const bool isperiodicsum = (bc(0,0)==BC_PERIODIC); + if (isperiodicsum) hi *= 100; // Extend range for periodic summation + + GFit fit=GFit::BSHFit(mu,1e-16,hi,eps,false); + Tensor coeff=fit.coeffs(); + Tensor expnt=fit.exponents(); + + if (bc(0,0) == BC_PERIODIC) { + fit.truncate_periodic_expansion(coeff, expnt, width.max(), true); + } + + int rank = coeff.dim(0); + + std::vector gradG(3); + + for (int dir=0; dir<3; dir++) { + std::vector< ConvolutionND > ops(rank); + for (int mu=0; mu::get(k, expnt(mu)*width[d]*width[d], 0, isperiodicsum)); + } + ops[mu].setop(dir,GaussianConvolution1DCache::get(k, expnt(mu)*width[dir]*width[dir], 1, isperiodicsum)); + } + gradG[dir] = real_convolution_3d_ptr(new SeparatedConvolution(world, ops)); + } + + return gradG; +} + + +//Functor to make the (Gaussian) nuclear potential +class GaussianNucleusFunctor : public FunctionFunctorInterface { + private: + std::vector m_Zlist; + std::vector m_Rlist; + std::vector m_Alist; + std::vector m_xi; + public: + // Constructor + GaussianNucleusFunctor(Molecule& molecule){ + + //get atom coordinates + m_Rlist = molecule.get_all_coords_vec(); + + //get atomic numbers + for(unsigned int i = 0; i < m_Rlist.size(); i++){ + m_Zlist.push_back(molecule.get_atom_number(i)); + } + + //find atomic mass numbers for each atom + int Alist[116] = {1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,59,63,65,70,72,75,79,80,84,85,87,89,91,93,96,98,101,103,106,108,112,115,119,122,127,127,131,133,137,139,140,141,144,145,150,152,157,159,162,165,167,169,173,175,178,181,184,186,190,192,195,197,200,204,207,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,261,262,263,262,264,266,264,272,277,284,289,288,292}; + for(unsigned int i = 0; i < m_Zlist.size(); i++){ + m_Alist.push_back(Alist[m_Zlist[i]-1]); + } + + //calculate factors necessary for the potential + for(unsigned int i = 0; i < m_Zlist.size(); i++){ + m_xi.push_back(sqrt(3.0/2.0)/(0.836*pow(m_Alist[i],1.0/3.0)+0.57)*52917.7211); + } + } + + //overload () operator + double operator() (const coord_3d&r) const { + double result = 0.0; + int n = m_Zlist.size(); + for(int i = 0; i < n; i++){ + double x = r[0] - m_Rlist[i][0]; + double y = r[1] - m_Rlist[i][1]; + double z = r[2] - m_Rlist[i][2]; + double r = sqrt(x*x+y*y+z*z); + result += -m_Zlist[i]*erf(m_xi[i]*r)/r; + } + return result; + } + + //some getters + std::vector get_Zlist(){ + return m_Zlist; + } + std::vector get_Rlist(){ + return m_Rlist; + } + std::vector get_Alist(){ + return m_Alist; + } + std::vector get_xi(){ + return m_xi; + } + int get_num_atoms(){ + return m_Rlist.size(); + } +}; + + +//Functor to make the fermi nuclear charge distribution (not normalized) for a given center +class FermiNucDistFunctor : public FunctionFunctorInterface { + private: + int m_A; + double m_T; + double m_C; + std::vector m_R; + public: + // Constructor + FermiNucDistFunctor(int& Z, coord_3d R){ + m_T = 0.000043463700858425666; //2.3 fm in bohr + m_R.push_back(R); + + //find atomic mass numbers for each atom + int Alist[116] = {1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,59,63,65,70,72,75,79,80,84,85,87,89,91,93,96,98,101,103,106,108,112,115,119,122,127,127,131,133,137,139,140,141,144,145,150,152,157,159,162,165,167,169,173,175,178,181,184,186,190,192,195,197,200,204,207,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,261,262,263,262,264,266,264,272,277,284,289,288,292}; + m_A = Alist[Z-1]; + + double PI = constants::pi; + if(m_A < 5){ + m_C = 0.000022291*pow(m_A, 1.0/3.0) - 0.0000090676; + } + else{ + m_C = sqrt(5.0/3.0*pow((0.836*pow(m_A,1.0/3.0)+0.570)/52917.7211,2) - 7.0/3.0*pow(PI*m_T/4.0/log(3.0),2)); + } + } + + //overload () operator + double operator() (const coord_3d&r) const { + double x = r[0] - m_R[0][0]; + double y = r[1] - m_R[0][1]; + double z = r[2] - m_R[0][2]; + double rr = sqrt(x*x+y*y+z*z); + double result = 1.0/(1.0+exp(4.0*log(3.0)*(rr-m_C)/m_T)); + return result; + } + + //Because the distribution is only nonzero in a small window around the center, need to create a special point + std::vector special_points() const { + return m_R; + } + + madness::Level special_level() { + return 18; + } +}; + + +//Creates the fermi nuclear potential. Also calculates the nuclear repulsion energy +void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_function_3d& potential, double& nuclear_repulsion_energy){ + if(world.rank()==0) print("\n***Making a Fermi Potential***"); + + //Get list of atom coordinates + std::vector Rlist = Init_params.molecule.get_all_coords_vec(); + std::vector Zlist(Rlist.size()); + unsigned int num_atoms = Rlist.size(); + real_function_3d temp; + double tempnorm; + + for(unsigned int i = 0; i < num_atoms; i++){ + Zlist[i] = Init_params.molecule.get_atom_number(i); + FermiNucDistFunctor rho(Zlist[i], Rlist[i]); + temp = real_factory_3d(world).functor(rho).truncate_mode(0); + tempnorm = temp.trace(); + temp.scale(-Zlist[i]/tempnorm); + if(i == 0){ + potential = temp; + } + else{ + potential += temp; + } + } + + potential = apply(op,potential); + + + nuclear_repulsion_energy = 0.0; + double rr; + for(unsigned int m = 0; m < num_atoms; m++){ + for(unsigned int n = m+1; n < num_atoms; n++){ + coord_3d dist = Rlist[m] - Rlist[n]; + rr = std::sqrt(dist[0]*dist[0]+dist[1]*dist[1]+dist[2]*dist[2]); + nuclear_repulsion_energy += Zlist[m]*Zlist[n]/rr; + } + } + +} + +// Collective constructor +DF::DF(World & world, const char* filename) : DF(world, (world.rank() == 0 ? std::make_shared(filename) : nullptr)) +{} + +// Constructor that actually does stuff +DF::DF(World & world,std::shared_ptr input) { + // Start the timer + start_timer(world); + + // Try and open input file + if(world.rank() == 0){ + if (input->fail()) MADNESS_EXCEPTION("Dirac Fock failed to open input stream", 0); + + // Welcome user + print("\n Preparing to solve the Dirac-Hartree-Fock equations.\n"); + + // Read input files + DFparams.read(*input); + + // Print out what was read in + DFparams.print_params(); + } + + // Broadcast to all other nodes + world.gop.broadcast_serializable(DFparams, 0); + + // Read in archive + if(DFparams.nwchem){ + Init_params.readnw(world, DFparams.archive); + } + else{ + Init_params.read(world, DFparams.archive, DFparams.restart); + } + if(world.rank() == 0){ + Init_params.print_params(); + print_molecule(world); + } + + // Set some function defaults + //FunctionDefaults<3>::set_cubic_cell(-Init_params.L, Init_params.L); + //FunctionDefaults<3>::set_k(Init_params.order); + FunctionDefaults<3>::set_thresh(DFparams.thresh); + FunctionDefaults<3>::set_truncate_mode(1); + + energies = Init_params.energies; + v_energies = Init_params.v_energies; + occupieds = Init_params.orbitals; + virtuals = Init_params.virtuals; + total_energy = Init_params.Init_total_energy; + +} + +//function to calculate the kinetic + rest energy expectation value using Dirac Hamiltonian c*\alpha*p+\Beta*m*c*c +double DF::rele(World& world, const Fcwf& psi){ + std::complex energy = 0.0; + double myc = 137.0359895; //speed of light in atomic units + std::complex myi(0,1); + complex_derivative_3d Dx(world,0); + complex_derivative_3d Dy(world,1); + complex_derivative_3d Dz(world,2); + Fcwf Tpsi(world); + complex_function_3d temp(world); + + Tpsi[0] = Dz(psi[2]) + Dx(psi[3]) - myi*Dy(psi[3]) + myc*myi*psi[0]; + Tpsi[1] = Dx(psi[2]) + myi*Dy(psi[2]) - Dz(psi[3]) + myc*myi*psi[1]; + Tpsi[2] = Dz(psi[0]) + Dx(psi[1]) - myi*Dy(psi[1]) - myc*myi*psi[2]; + Tpsi[3] = Dx(psi[0]) + myi*Dy(psi[0]) - Dz(psi[1]) - myc*myi*psi[3]; + + //The giant block below this exists because I was debugging + //some hung queues. I still don't know what's causing them + //but they occur in this function somewhere, somehow + + //if(world.rank()==0) print("a"); + //temp = Dz(psi[2]); + //world.gop.fence(); + //if(world.rank()==0) print("b"); + //temp += Dx(psi[3]); + //world.gop.fence(); + //if(world.rank()==0) print("c"); + //temp -= myi*Dy(psi[3]); + //world.gop.fence(); + //if(world.rank()==0) print("d"); + //temp += myc*myi*psi[0]; + //world.gop.fence(); + //if(world.rank()==0) print("e"); + //Tpsi[0] = copy(temp); + //world.gop.fence(); + + //if(world.rank()==0) print("f"); + //temp = Dx(psi[2]); + //world.gop.fence(); + //if(world.rank()==0) print("g"); + //temp += myi*Dy(psi[2]); + //world.gop.fence(); + //if(world.rank()==0) print("h"); + //temp -= Dz(psi[3]); + //world.gop.fence(); + //if(world.rank()==0) print("i"); + //temp += myc*myi*psi[1]; + //world.gop.fence(); + //if(world.rank()==0) print("j"); + //Tpsi[1] = copy(temp); + //world.gop.fence(); + // + //if(world.rank()==0) print("k"); + //temp = Dz(psi[0]); + //world.gop.fence(); + //if(world.rank()==0) print("l"); + //temp += Dx(psi[1]); + //world.gop.fence(); + //if(world.rank()==0) print("m"); + //temp -= myi*Dy(psi[1]); + //world.gop.fence(); + //if(world.rank()==0) print("n"); + //temp -= myc*myi*psi[2]; + //world.gop.fence(); + //if(world.rank()==0) print("o"); + //Tpsi[2] = copy(temp); + //world.gop.fence(); + // + //if(world.rank()==0) print("p"); + //temp = Dx(psi[0]); + //world.gop.fence(); + //if(world.rank()==0) print("q"); + //temp += myi*Dy(psi[0]); + //world.gop.fence(); + //if(world.rank()==0) print("r"); + //temp -= Dz(psi[1]); + //world.gop.fence(); + //if(world.rank()==0) print("s"); + //temp -= myc*myi*psi[3]; + //world.gop.fence(); + //if(world.rank()==0) print("t"); + //Tpsi[3] = copy(temp); + //world.gop.fence(); + //if(world.rank()==0) print("u"); + + energy = inner(psi, Tpsi); + energy *= -1.0*myi*myc; + + return energy.real(); +} + +//returns a new Fcwf that is the result of applying the Dirac free-particle hamiltonian on psi +Fcwf apply_T(World& world, const Fcwf& psi){ + double myc = 137.0359895; //speed of light in atomic units + std::complex myi(0,1); + complex_derivative_3d Dx(world,0); + complex_derivative_3d Dy(world,1); + complex_derivative_3d Dz(world,2); + Fcwf Tpsi(world); + + Tpsi[0] = Dz(psi[2]) + Dx(psi[3]) - myi*Dy(psi[3]) + myc*myi*psi[0]; + Tpsi[1] = Dx(psi[2]) + myi*Dy(psi[2]) - Dz(psi[3]) + myc*myi*psi[1]; + Tpsi[2] = Dz(psi[0]) + Dx(psi[1]) - myi*Dy(psi[1]) - myc*myi*psi[2]; + Tpsi[3] = Dx(psi[0]) + myi*Dy(psi[0]) - Dz(psi[1]) - myc*myi*psi[3]; + + return Tpsi * (-myi*myc); +} + +//Calculates K*psi for each psi in the orbitals vector and stores them in result +void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsis){ + complex_function_3d temp(world); + + unsigned int n = Init_params.num_occupied; + for(unsigned int i = 0; i < n; i++){ + for(unsigned int j = 0; j < n; j++){ + temp = inner_func(occupieds[j],occupieds[i]); + + //try truncating + temp.truncate(); + + temp = apply(op,temp); + if(j == 0){ + Kpsis[i] = occupieds[j]*temp; + } + else{ + Kpsis[i] += occupieds[j]*temp; + } + } + + //here too + Kpsis[i].truncate(); + } +} + +Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ + complex_function_3d temp(world); + Fcwf result(world); + + unsigned int n = Init_params.num_occupied; + for(unsigned int i = 0; i < n; i++){ + temp = inner_func(occupieds[i],phi); + temp.truncate(); + temp = apply(op,temp); + if(i == 0){ + result = occupieds[i]*temp; + } + else{ + result += occupieds[i]*temp; + } + } + result.truncate(); + return result; +} + +//Diagonalize psiss in the Fock space. psis is modified in place. requires Kpsis to be precomputed +//Kpsis are transformed in place. +void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op, std::vector& Kpsis){ + + if(world.rank()==0) print("\n***Diagonalizing***"); + + unsigned int n = Init_params.num_occupied; + Tensor> fock(n, n); + Tensor> overlap(n, n); + Tensor> U(n,n); + Tensor evals(n); + std::vector temp_orbitals; + + if(world.rank()==0) print(" Forming Matrices"); + + ////Form the Fock Matrix + //first apply Fock operator to all orbitals + + if(world.rank() == 0) print(" Moving K*psi"); + //Move Kpsis to new orbitals, as they are part of the fock operator + for(unsigned int j = 0; j < n; j++){ + temp_orbitals.push_back(Kpsis[j]); + temp_orbitals[j].scale(-1.0); + } + + //calculate coulomb part + if(world.rank() == 0) print(" Adding (V+J)psi"); + real_function_3d rho = real_factory_3d(world); + for(unsigned int j = 0; j < n; j++){ + rho += squaremod(occupieds[j]); + } + real_function_3d potential = myV + apply(op,rho); + + //add in coulomb parts to neworbitals + for(unsigned int j = 0; j < n; j++){ + temp_orbitals[j] += occupieds[j]*potential; //add in coulomb term + } + + //add in T_psi + if(world.rank()==0) print(" Adding T*psi"); + for(unsigned int j = 0; j < n; j++){ + temp_orbitals[j] += apply_T(world, occupieds[j]); //add in "kinetic" term + } + + if(world.rank()==0) print(" Integrating to form Fock Matrix"); + DF::start_timer(world); + + //We now have a vector of F*psi for each psi (in neworbitals). + //Calculate each element of the fock matrix + // + //New method: Make a matrix for each component and add the matrices. This facilitates the + //use of the new inner product + // + //1) Create four std::vectors each from occupieds and temp_orbitals, one for each component + //2) Call the new matrix inner for each component. Result in each case gives a matrix + //3) Sum all the matrices + std::vector occupieds_1; + std::vector occupieds_2; + std::vector occupieds_3; + std::vector occupieds_4; + std::vector temp_orbitals_1; + std::vector temp_orbitals_2; + std::vector temp_orbitals_3; + std::vector temp_orbitals_4; + for(unsigned int i = 0; i < n; i++){ + occupieds_1.push_back(occupieds[i][0]); + occupieds_2.push_back(occupieds[i][1]); + occupieds_3.push_back(occupieds[i][2]); + occupieds_4.push_back(occupieds[i][3]); + temp_orbitals_1.push_back(temp_orbitals[i][0]); + temp_orbitals_2.push_back(temp_orbitals[i][1]); + temp_orbitals_3.push_back(temp_orbitals[i][2]); + temp_orbitals_4.push_back(temp_orbitals[i][3]); + } + Tensor> component1 = matrix_inner(world,occupieds_1,temp_orbitals_1); + Tensor> component2 = matrix_inner(world,occupieds_2,temp_orbitals_2); + Tensor> component3 = matrix_inner(world,occupieds_3,temp_orbitals_3); + Tensor> component4 = matrix_inner(world,occupieds_4,temp_orbitals_4); + + fock = component1+component2+component3+component4; + + //Old Method here: + //for(unsigned int j = 0; j < n; j++){ + // for(unsigned int k = 0; k < n; k++){ + // fock(j,k) = inner(occupieds[j],temp_orbitals[k]); + // } + //} + + Tensor focktimes = DF::end_timer(world); + if(world.rank()==0) print(" time:", focktimes[0]); + + + ////Form the overlap matrix + if(world.rank()==0) print(" Integrating to form Overlap Matrix"); + for(unsigned int j = 0; j < n; j++){ + for(unsigned int k = 0; k < n; k++){ + overlap(j,k) = inner(occupieds[j],occupieds[k]); + } + } + + ////debugging: print fock and overlap matrices + //if(world.rank()==0){ + //print("fock:\n", fock); + //print("\noverlap:\n", overlap); + //} + + + if(world.rank()==0) print(" Eigensolver"); + + //Diagonalize + sygv(fock, overlap, 1, U, evals); + + //debugging: print matrix of eigenvectors + //if(world.rank()==0) print("U:\n", U); + + //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. + if(world.rank()==0) print(" Removing Rotations"); + + double thresh_degenerate = DFparams.thresh*100.0; + double csquared = 137.0359895*137.0359895; //electron rest energy + //swap columns for a diagonally dominant matrix + bool switched = true; + while (switched) { + switched = false; + for (unsigned int kk = 0; kk < Init_params.num_occupied; kk++) { + for (unsigned int j = kk + 1; j < Init_params.num_occupied; j++) { + //double sold = std::norm(U(kk, kk)) + std::norm(U(j, j)); + //double snew = std::norm(U(kk, j)) + std::norm(U(j, kk)); + double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); + double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); + if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { + if(world.rank()==0){ + print(" swapping columns ", kk+1, " and ", j+1); + } + Tensor> tmp = copy(U(_, kk)); + U(_, kk) = U(_, j); + U(_, j) = tmp; + std::swap(evals[kk], evals[j]); + switched = true; + } + } + } + } + + // Fix phases. + for (unsigned int kk = 0; kk < Init_params.num_occupied; ++kk) + U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); + + + //Find clusters of degenerate eigenvalues and rotate eigenvectors to maximize overlap with previous ones + unsigned int ilo = 0; // first element of cluster + if(world.rank()==0) print(" Degeneracy threshold: ",thresh_degenerate); + + while (ilo < Init_params.num_occupied - 1) { + unsigned int ihi = ilo; + while (fabs(evals[ilo] - evals[ihi + 1]) + < thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { + ++ihi; + if (ihi == Init_params.num_occupied - 1) + break; + } + unsigned int nclus = ihi - ilo + 1; + if (nclus > 1) { + if(world.rank()==0){ + print(" found cluster from ", ilo + 1, " to " , ihi + 1); + for(unsigned int kk = ilo; kk <= ihi; kk++){ + print(" ",evals[kk] - csquared); + } + } + + + //Use the polar decomposition to undo rotations: + Tensor> q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); + Tensor> VH(nclus,nclus); + Tensor> W(nclus,nclus); + Tensor sigma(nclus); + + svd(q, W, sigma, VH); + //W*VH is the rotation part of q. Undo it by taking the adjoint and right-multiplying + q = conj_transpose(inner(W,VH)); + U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + + } + ilo = ihi + 1; + } + + + //if(world.rank()==0) print("U:\n", U); + + + fock = inner(conj_transpose(U), inner(fock, U)); + //if(world.rank()==0)print("\n U^* F U:\n",fock,"\n"); + + if(world.rank()==0) print(" Applying Transformation"); + + ////Apply the transformation to the Exchange + for(unsigned int j = 0; j < n; j++){ + temp_orbitals[j] = Fcwf(world); + for(unsigned int k = 0; k < n; k++){ + temp_orbitals[j] += Kpsis[k]*U(k,j); + } + } + for(unsigned int m = 0; m < n; m++){ + Kpsis[m] = temp_orbitals[m]; + } + + ////Apply the transformation to the orbitals + for(unsigned int j = 0; j < n; j++){ + temp_orbitals[j] = Fcwf(world); + for(unsigned int k = 0; k < n; k++){ + temp_orbitals[j] += occupieds[k]*U(k,j); + } + } + for(unsigned int j = 0; j < n; j++){ + occupieds[j] = temp_orbitals[j]; + } + +} + +//returns a vector of orthonormal Fcwfs constructed from the input vector of Fcwfs +std::vector orthogonalize(World& world, std::vector orbitals){ + if(world.rank()==0) print("\n***Orthonormalizing***"); + int n = orbitals.size(); + std::vector result; + for(int i = 0; i < n; i++){ + result.push_back(copy(orbitals[i])); + } + std::complex r(0.0,0.0); + + for(int i = 0; i < n; i++){ + result[i].normalize(); + for(int j = i+1; j < n; j++){ + r = inner(result[i],result[j]); + result[j] -= result[i]*r; + } + } + return result; + +} + +//Different diagonalize function that doesn't try to calculate a coulomb part internally +Tensor DF::diagonalize_virtuals(World& world, real_function_3d& JandV,real_convolution_3d& op, std::vector& Kpsis){ + + if(world.rank()==0) print("\n***Diagonalizing***"); + + unsigned int n = Init_params.num_virtuals; + Tensor> fock(n, n); + Tensor> overlap(n, n); + Tensor> U(n,n); + Tensor evals(n); + std::vector temp_orbitals; + + if(world.rank()==0) print(" Forming Matrices"); + + ////Form the Fock Matrix + //first apply Fock operator to all orbitals + + if(world.rank() == 0) print(" Moving K*psi"); + //Move Kpsis to new orbitals, as they are part of the fock operator + for(unsigned int j = 0; j < n; j++){ + temp_orbitals.push_back(Kpsis[j]); + temp_orbitals[j].scale(-1.0); + } + + //add in coulomb parts to neworbitals + for(unsigned int j = 0; j < n; j++){ + temp_orbitals[j] += virtuals[j]*JandV; //add in coulomb term + } + + //add in T_psi + if(world.rank()==0) print(" Adding T*psi"); + for(unsigned int j = 0; j < n; j++){ + temp_orbitals[j] += apply_T(world, virtuals[j]); //add in "kinetic" term + } + + //We now have a vector of F*psi for each psi (in temp_orbitals). + //Calculate each element of the fock matrix + if(world.rank()==0) print(" Integrating to form Fock Matrix"); + for(unsigned int j = 0; j < n; j++){ + for(unsigned int k = 0; k < n; k++){ + fock(j,k) = inner(virtuals[j],temp_orbitals[k]); + } + } + + ////Form the overlap matrix + if(world.rank()==0) print(" Integrating to form Overlap Matrix"); + for(unsigned int j = 0; j < n; j++){ + for(unsigned int k = 0; k < n; k++){ + overlap(j,k) = inner(virtuals[j],virtuals[k]); + } + } + + //debugging: print fock and overlap matrices + //if(world.rank()==0){ + // print("real(fock):\n", real(fock)); + // print("imag(fock):\n", imag(fock)); + // print("\nreal(overlap):\n", real(overlap)); + // print("\nimag(overlap):\n", imag(overlap)); + //} + + + if(world.rank()==0) print(" Eigensolver"); + + //Diagonalize + sygv(fock, overlap, 1, U, evals); + + //debugging: print matrix of eigenvectors and eigenvalues + //if(world.rank()==0) print("U:\n", U); + //if(world.rank()==0) print("\nevals:\n",evals); + + //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. + if(world.rank()==0) print(" Removing Rotations"); + + double thresh_degenerate = DFparams.thresh*100.0; + double csquared = 137.0359895*137.0359895; //electron rest energy + //swap columns for a diagonally dominant matrix + bool switched = true; + while (switched) { + switched = false; + for (unsigned int kk = 0; kk < n; kk++) { + for (unsigned int j = kk + 1; j < n; j++) { + //double sold = std::norm(U(kk, kk)) + std::norm(U(j, j)); + //double snew = std::norm(U(kk, j)) + std::norm(U(j, kk)); + double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); + double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); + if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { + if(world.rank()==0){ + print(" swapping columns ", kk+1, " and ", j+1); + } + Tensor> tmp = copy(U(_, kk)); + U(_, kk) = U(_, j); + U(_, j) = tmp; + std::swap(evals[kk], evals[j]); + switched = true; + } + } + } + } + + // Fix phases. + for (unsigned int kk = 0; kk < n; ++kk) + U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); + + + //Find clusters of degenerate eigenvalues and rotate eigenvectors to maximize overlap with previous ones + unsigned int ilo = 0; // first element of cluster + if(world.rank()==0) print(" Degeneracy threshold: ",thresh_degenerate); + + while (ilo < n - 1) { + unsigned int ihi = ilo; + while (fabs(evals[ilo] - evals[ihi + 1]) + < thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { + ++ihi; + if (ihi == n - 1) + break; + } + unsigned int nclus = ihi - ilo + 1; + if (nclus > 1) { + if(world.rank()==0){ + print(" found cluster from ", ilo + 1, " to " , ihi + 1); + for(unsigned int kk = ilo; kk <= ihi; kk++){ + print(" ",evals[kk] - csquared); + } + } + + + //Use the polar decomposition to undo rotations: + Tensor> q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); + Tensor> VH(nclus,nclus); + Tensor> W(nclus,nclus); + Tensor sigma(nclus); + + svd(q, W, sigma, VH); + //W*VH is the rotation part of q. Undo it by taking the adjoint and right-multiplying + q = conj_transpose(inner(W,VH)); + U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + + } + ilo = ihi + 1; + } + + + //if(world.rank()==0) print("U:\n", U); + + + fock = inner(conj_transpose(U), inner(fock, U)); + //if(world.rank()==0)print("\n U^* F U:\n",fock,"\n"); + + if(world.rank()==0) print(" Applying Transformation"); + + ////Apply the transformation to the Exchange + for(unsigned int j = 0; j < n; j++){ + temp_orbitals[j] = Fcwf(world); + for(unsigned int k = 0; k < n; k++){ + temp_orbitals[j] += Kpsis[k]*U(k,j); + } + } + for(unsigned int m = 0; m < n; m++){ + Kpsis[m] = temp_orbitals[m]; + } + + ////Apply the transformation to the orbitals + for(unsigned int j = 0; j < n; j++){ + temp_orbitals[j] = Fcwf(world); + for(unsigned int k = 0; k < n; k++){ + temp_orbitals[j] += virtuals[k]*U(k,j); + } + } + for(unsigned int j = 0; j < n; j++){ + virtuals[j] = temp_orbitals[j]; + } + + return evals; + +} + +//Apply's Green's function to a single Fcwf, return new Fcwf +//double iterate(World& world, complex_function_3d& V, Fcwf& psi, double& eps){ +Fcwf apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thresh){ + + + double myc = 137.0359895; //speed of light + + //calculate exponent for equivalent BSH operator + double mu = std::sqrt((myc*myc*myc*myc-eps*eps)/myc/myc); + + //if(world.rank() == 0) print("Hi, this is apply_BSH! mu is: ", mu); + + //create gradient BSH operators + //TODO: make my own GradBSH that first computes BSH with a ridiculous lo, and then accumulated to CDelta + std::vector>> op3 = GradBSHOperator(world, mu, small, thresh); + + //create BSH operator + real_convolution_3d op = BSHOperator3D(world, mu,small,thresh); // Finer length scale and accuracy control + //create Fcwfs for intermediate functions necessary to compute new components + Fcwf oppsi(apply(op,Vpsi)); //BSH(Vpsi) + Fcwf oppsix(apply(*op3[0],Vpsi)); //GradBSH_x(Vpsi) + Fcwf oppsiy(apply(*op3[1],Vpsi)); //GradBSH_y(Vpsi) + Fcwf oppsiz(apply(*op3[2],Vpsi)); //GradBSH_z(Vpsi) + Fcwf temp(world); //will hold the new wavefunction 4-vector + //manually compute new components of wavefunction. See Blackledge paper and any definition of the Dirac single-particle Hamiltonian + std::complex myi(0,1); + temp[0] = myc*myc*oppsi[0]-myi*myc*oppsiz[2]-myi*myc*(oppsix[3]-myi*oppsiy[3]); + temp[1] = myc*myc*oppsi[1]-myi*myc*(oppsix[2]+myi*oppsiy[2])+myi*myc*oppsiz[3]; + temp[2] = -myi*myc*oppsiz[0]-myi*myc*(oppsix[1]-myi*oppsiy[1])-myc*myc*oppsi[2]; + temp[3] = -myi*myc*(oppsix[0]+myi*oppsiy[0])+myi*myc*oppsiz[1]-myc*myc*oppsi[3]; + //finish up application of the dirac green's function + temp = (temp+(oppsi*eps))*(1.0/(myc*myc)); + temp.normalize(); + + return temp; +} + + +// Prints norms of the given vector of functions +void DF::print_norms(World & world, + std::vector f) +{ + // Container + Tensor norms(f.size()); + + // Calc the norms + for(unsigned int i = 0; i < f.size(); i++){ + norms(i) = f[i].norm2(); + } + + // Print em in a smart way + if(world.rank() == 0) print(norms); +} + +// Small function to print geometry of a molecule nicely +// Straight up stolen from Bryan +void DF::print_molecule(World &world) +{ + if(world.rank() == 0) + { + // Precision is set to 10 coming in, drop it to 5 + std::cout.precision(5); + std::cout << std::fixed; + + // First get atoms + const std::vector atoms = Init_params.molecule.get_atoms(); + int num_atoms = atoms.size(); + + // Now print + print("\n Geometry Information"); + print(" --------------------\n"); + print(" Units: a.u.\n"); + print(" Atom x y z"); + print("----------------------------------------------------------------"); + for(int j = 0; j < num_atoms; j++) + { + Vector coords = atoms[j].get_coords(); + std::cout << std::setw(3) << atomic_number_to_symbol(atoms[j].get_atomic_number()); + std::cout << std::setw(18) << std::right << coords[0] << std::setw(18) << coords[1] << std::setw(18) << coords[2] << endl; + } + print(""); + + // Reset precision + std::cout.precision(10); + std::cout << std::scientific; + } +} + +// Generates initial guess functions from nonrelativistic orbitals. Note that +// The length of the returned vector is twice that of the input vector +std::vector to_fcwfs(World & world, std::vector & orbitals){ + // Get size + unsigned int n = orbitals.size(); + + complex_function_3d complexreader; + std::vector result; + Fcwf spinup(world); + Fcwf spindown(world); + + //Loop over input orbitals + for(unsigned int i = 0; i < n; i++){ + complexreader = function_real2complex(orbitals[i]); + spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + spindown = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + result.push_back(spinup); + result.push_back(spindown); + + } + + return result; + +} + +//Duplicates the energies in a vector of energies and adds the electron rest energy to each +Tensor make_initial_energies(Tensor energies){ + int n = energies.size(); + Tensor result(2*n); + double csquared = 137.0359895*137.0359895; //electron rest energy + double temp; + for(int i = 0; i < n; i++){ + temp = energies(i) + csquared; + result(2*i) = temp; + result(2*i+1) = temp; //energies get repeated because we double the number of orbitals + } + return result; +} + +void DF::saveDF(World& world){ + Tensor times = get_times(world); + if(world.rank()==0) print("\n***Saving at time: ",times[0]," ***"); + try{ + archive::ParallelOutputArchive output(world, DFparams.savefile.c_str(), 1); + output & total_energy & Init_params.spinrestricted & Init_params.num_occupied & energies & Init_params.L & Init_params.order & Init_params.molecule; + for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + for(int j = 0; j < 4; j++){ + output & occupieds[i][j]; + } + } + } + catch(const char* s){ + if(world.rank()==0) print("Failed to save DF restart data with error message:", s); + } +} + +//Creates the nuclear potential from the molecule object +void DF::make_gaussian_potential(World& world, real_function_3d& potential){ + if(world.rank()==0) print("\n***Making a Gaussian Potential***"); + GaussianNucleusFunctor Vfunctor(Init_params.molecule); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0); +} + +//Creates the nuclear potential from the molecule object. Also calculates the nuclear repulsion energy +void DF::make_gaussian_potential(World& world, real_function_3d& potential, double& nuclear_repulsion_energy){ + if(world.rank()==0) print("\n***Making a Gaussian Potential***"); + GaussianNucleusFunctor Vfunctor(Init_params.molecule); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0); + std::vector Rlist = Vfunctor.get_Rlist(); + std::vector Zlist = Vfunctor.get_Zlist(); + nuclear_repulsion_energy = 0.0; + double rr; + int num_atoms = Rlist.size(); + for(int m = 0; m < num_atoms; m++){ + for(int n = m+1; n < num_atoms; n++){ + coord_3d dist = Rlist[m] - Rlist[n]; + rr = std::sqrt(dist[0]*dist[0]+dist[1]*dist[1]+dist[2]*dist[2]); + nuclear_repulsion_energy += Zlist[m]*Zlist[n]/rr; + } + } + +} + + +void DF::DF_load_balance(World& world, real_function_3d& Vnuc){ + if(world.rank()==0) print("\n***Load Balancing***"); + LoadBalanceDeux<3> lb(world); + lb.add_tree(Vnuc, lbcost(12.0,96.0),true); + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + for(int kk = 0; kk < 4; kk++){ + lb.add_tree(occupieds[j][kk], lbcost,3>(24.0,192.0),true); + } + } + FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); + +} + +void DF::make_component_lineplots(World& world, const char* filename1, const char* filename2, int npt, double endpnt){ + std::vector large_densities; + std::vector small_densities; + for(unsigned int i=0; i < Init_params.num_occupied; i++){ + large_densities.push_back(squaremod_large(occupieds[i])); + small_densities.push_back(squaremod_small(occupieds[i])); + } + + //double h = Init_params.L*(1.0/(npt-1)); + double h = endpnt*(1.0/(npt-1)); + for(unsigned int i=0; i < Init_params.num_occupied; i++){ + large_densities[i].reconstruct(); + small_densities[i].reconstruct(); + } + if(world.rank()==0){ + FILE* file1 = fopen(filename1,"w"); + FILE* file2 = fopen(filename2,"w"); + if(!file1) MADNESS_EXCEPTION("DF density lineplots: failed to open the plot file",0); + if(!file2) MADNESS_EXCEPTION("DF density lineplots: failed to open the plot file",0); + for(unsigned int i=0; i densities; + real_function_3d zero(world); + for(unsigned int i=0; i < Init_params.num_occupied; i++){ + densities.push_back(squaremod(occupieds[i])); + //densities.push_back(copy(zero)); + } + + //double h = Init_params.L*(1.0/(npt-1)); + double h = endpnt*(1.0/(npt-1)); + for(unsigned int i=0; i < Init_params.num_occupied; i++){ + densities[i].reconstruct(); + } + if(world.rank()==0){ + FILE* file = fopen(filename,"w"); + if(!file) MADNESS_EXCEPTION("DF density lineplots: failed to open the plot file",0); + for(unsigned int i=0; i& Kpsis, XNonlinearSolver, std::complex, Fcwf_vector_allocator>& kainsolver, double& tolerance, int& iteration_number, double& nuclear_repulsion_energy){ + + Tensor times = get_times(world); + + if(world.rank()==0) print("\n\n\nIteration: ", iteration_number, " at ",times[0]); + if(world.rank()==0) print("--------------"); + + std::vector Residuals; + Fcwf temp_function(world); + double residualnorm; + + bool iterate_again = false; //Assume iterations will stop + + //Diagonalize, but not on the first iteration, unless it's a restarted job + if(iteration_number != 1 or DFparams.restart) diagonalize(world, V, op, Kpsis); + + //Actually let's see what happens if I always diagonalize + //diagonalize(world, V, op, Kpsis); + + + + //Apply BSH to each psi + if(world.rank()==0) print("\n***Applying BSH operator***"); + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + + //construct the function to which we will apply the BSH + occupieds[j].truncate(); + temp_function = occupieds[j]*JandV; + temp_function.scale(-1.0); + temp_function += Kpsis[j]; + temp_function.truncate(); + + //temp_function now holds (K-V-J)psi, so apply the BSH + temp_function = apply_BSH(world, temp_function, energies[j], DFparams.small, DFparams.thresh); + + //Now calculate the residual + temp_function = occupieds[j] - temp_function; + residualnorm = temp_function.norm2(); + + //Print residual norm to keep track + if(world.rank()==0) printf(" Orbital: %3i, Resid: %.10e\n",j+1, residualnorm); + + //If the norm is big enough, we'll need to iterate again. + if(residualnorm > tolerance) iterate_again = true; + + //Store residual function if we're using KAIN. Not necessary if we're not using kain + if(DFparams.kain){ + Residuals.push_back(temp_function); + } + else{ + occupieds[j] = occupieds[j] - temp_function; + } + } + + //Apply the kain solver, if called for + if(DFparams.kain){ + if(world.rank()==0) print("\n***Applying KAIN Solver***"); + occupieds = kainsolver.update(occupieds, Residuals); + } + + //orthogonalize + occupieds = orthogonalize(world,occupieds); + + //calculate new exchange + if(world.rank()==0) print("\n***Recalculating Exchange***"); + exchange(world, op, Kpsis); + + //Calculate new J+V term + if(world.rank()==0) print("\n***Recalculating Coulomb***"); + real_function_3d rho = real_factory_3d(world); + for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ + rho += squaremod(occupieds[kk]); + } + JandV = V + apply(op,rho); + + //Calculate and print total energy + //Simultaneously update eps + if(world.rank()==0){ + print("\n***Printing Current Energies***"); + } + double kinetic_energy = 0.0; + double coulomb_energy = 0.0; + double exchange_energy = 0.0; + double nuclear_attraction_energy = 0.0; + double old_total_energy = total_energy; + double myc = 137.0359895; //speed of light + double nuclear_attraction_energy_correction; + double coulomb_energy_correction; + double exchange_energy_correction; + + real_function_3d Jop = apply(op,rho); + + if(world.rank()==0) print(" Recalculating Energies"); + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + + if(world.rank()==0) print(" Adding terms for orbital ", j); + energies[j] = rele(world,occupieds[j]); + + kinetic_energy += (energies[j] - myc*myc); + if(world.rank()==0) print(" Kinetic done."); + + temp_function = occupieds[j]*V; + nuclear_attraction_energy_correction = real(inner(occupieds[j],temp_function)); + nuclear_attraction_energy += nuclear_attraction_energy_correction; + if(world.rank()==0) print(" Nuclear Attraction done."); + + temp_function = occupieds[j]*Jop; + coulomb_energy_correction = real(inner(occupieds[j],temp_function)); + energies[j] += coulomb_energy_correction + nuclear_attraction_energy_correction; + coulomb_energy += 0.5*coulomb_energy_correction; + if(world.rank()==0) print(" Coulomb Repulsion done."); + + exchange_energy_correction = real(inner(occupieds[j],Kpsis[j])); + energies[j] -= exchange_energy_correction; + exchange_energy += 0.5*exchange_energy_correction; + if(world.rank()==0) print(" Exchange done."); + } + total_energy = kinetic_energy + coulomb_energy - exchange_energy + nuclear_attraction_energy + nuclear_repulsion_energy; + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + if(world.rank()==0){ + printf(" Orbital: %3i, Energy: %.10e\n",j+1, energies[j]-myc*myc); + } + } + if(world.rank()==0){ + print("\n Kinetic Energy: ",kinetic_energy); + print(" Coulomb Energy: ",coulomb_energy); + print(" Exchange Energy: ",exchange_energy); + print(" Nuclear Attraction Energy: ",nuclear_attraction_energy); + print(" Nuclear Repulsion Energy: ",nuclear_repulsion_energy); + print(" Total Energy: ",total_energy); + print(" Total Energy Residual: ", std::fabs(total_energy - old_total_energy)); + print("Energy Convergence Threshold: " , DFparams.thresh*pow(10,floor(log10(std::fabs(total_energy)))),"\n"); + } + + //check total energy for convergence. the global variable thresh determines how many significant figures we look for + if(std::fabs(total_energy-old_total_energy) > DFparams.thresh*pow(10,floor(log10(std::fabs(total_energy))))){ + iterate_again = true; + } + + //truncate + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + occupieds[j].truncate(); + } + + return iterate_again; +} + +// Solves the for occupied orbitals +void DF::solve_occupied(World & world) +{ + + //State what we're doing here + if(world.rank()==0) print("\nSolving for ", Init_params.num_occupied, " occupied orbitals\n-----------------------------------\n"); + + //Will need a coulomb operator + real_convolution_3d op = CoulombOperator(world,DFparams.small,DFparams.thresh); + + //allocator is useful to have + Fcwf_vector_allocator allocator(world,Init_params.num_occupied); + + //initialize kain solver + XNonlinearSolver, std::complex, Fcwf_vector_allocator> kainsolver(allocator); + kainsolver.set_maxsub(DFparams.maxsub); + + //normalize initial guesses + for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + occupieds[i].normalize(); + } + + //Form nuclear potential + real_function_3d Vnuc; + double nuclear_repulsion_energy; + if(DFparams.nucleus == 1){ + make_fermi_potential(world, op, Vnuc, nuclear_repulsion_energy); + } + else{ + make_gaussian_potential(world, Vnuc, nuclear_repulsion_energy); + } + + //Initial load balance + DF_load_balance(world, Vnuc); + + //Initialize vector of Fcwfs to hold exchange applied to Psis + std::vector Kpsis = allocator(); + + //Calculate initial exchange + if(world.rank()==0) print("\n***Calculating Initial Exchange***"); + exchange(world, op, Kpsis); + + //Calculate initial J+V term + if(world.rank()==0) print("\n***Calculating Initial Coulomb***"); + real_function_3d rho = real_factory_3d(world); + for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ + rho += squaremod(occupieds[kk]); + } + real_function_3d JandV = Vnuc + apply(op,rho); + + //Set tolerance for residuals + double tol = pow(10,floor(0.5*log10(DFparams.thresh))); + + + //Now time to start iterating + bool keep_going = true; + int iteration_number = 1; + while(keep_going and iteration_number < DFparams.max_iter){ + keep_going = iterate(world, Vnuc, op, JandV, Kpsis, kainsolver, tol, iteration_number, nuclear_repulsion_energy); + + //Load balance and save between iterations + if(keep_going and iteration_number <= DFparams.lb_iter) DF_load_balance(world, Vnuc); + if(DFparams.do_save) saveDF(world); + + //Increment iteration counter + iteration_number++; + } + + +} + +void DF::solve(World& world){ + + // Get start time + Tensor start_time = end_timer(world); + if(world.rank() == 0){ + print("\n\n Dirac Fock Calculation"); + print(" ------------------------"); + } + + if(DFparams.job == 0){ + solve_occupied(world); + } + else if(DFparams.job == 1){ + solve_virtuals1(world); + } + else{ + if(world.rank()==0) print("Specify a better job parameter."); + } + + + //Make density lineplots? + make_density_lineplots(world, "density_lineplots", 10000, 0.5); + make_component_lineplots(world, "large_component_lineplots", "small_component_lineplots", 10000, 0.5); + + // Print total time + // Precision is set to 10 coming in, drop it to 2 + std::cout.precision(2); + std::cout << std::fixed; + + // Get start time + Tensor current_time = end_timer(world); + current_time = current_time - start_time; + + //Tensor current_time = end_timer(world); + if(world.rank() == 0) print("\n Total time:", current_time[0],"\n"); +} + +void DF::solve_virtuals1(World& world){ + + //First, move final occupied orbital to be first virtual orbital + Fcwf final_occupied = copy(occupieds.back()); + occupieds.pop_back(); + Init_params.num_occupied -= 1; + virtuals.emplace(virtuals.begin(),final_occupied); + Init_params.num_virtuals += 1; + + //Do the same for energies + double temp_energy = energies(energies.dim(0)-1); + energies = energies(Slice(0,energies.dim(0)-2)); + Tensor temp_v_energies(Init_params.num_virtuals); + temp_v_energies[0] = temp_energy; + for(unsigned int i = 1; i < Init_params.num_virtuals; i++){ + temp_v_energies(i) = v_energies(i-1); + } + v_energies = temp_v_energies; + + //First, perform Dirac Fock on the n-1 occupied orbitals + solve_occupied(world); + + //Next, calculate the last occupied orbital simultaneously with the virtuals + if(world.rank()==0) print("***Calculating Final Occupied and Virtual Orbitals***"); + + //For now, recalculate JandV. In the future, maybe get this out of solve_occupied? + //Will need a coulomb operator + real_convolution_3d op = CoulombOperator(world,DFparams.small,DFparams.thresh); + //Form nuclear potential + real_function_3d Vnuc; + double nuclear_repulsion_energy; + if(DFparams.nucleus == 1){ + make_fermi_potential(world, op, Vnuc, nuclear_repulsion_energy); + } + else{ + make_gaussian_potential(world, Vnuc, nuclear_repulsion_energy); + } + //Calculate initial J+V term + real_function_3d rho = real_factory_3d(world); + for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ + rho += squaremod(occupieds[kk]); + } + real_function_3d JandV = Vnuc + apply(op,rho); + + //Set tolerance for residuals + double tol = pow(10,floor(0.5*log10(DFparams.thresh))); + + //Orthogonalize the functions against the occupieds + std::complex tempcomplex; + for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + tempcomplex = inner(virtuals[i], occupieds[j]); + virtuals[i] -= occupieds[j]*tempcomplex; + } + virtuals[i].normalize(); + } + + //orthonormalize the functions internally + orthogonalize(world,virtuals); + + //Initialize exchange vector + Fcwf_vector_allocator allocator(world,Init_params.num_virtuals); + std::vector Kpsis = allocator(); + for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ + Kpsis[i] = apply_K(world, op, virtuals[i]); + } + + bool keep_going = true; + int iteration_number = 1; + double csquared = 137.0359895*137.0359895; //electron rest energy + std::vector Residuals = allocator(); + XNonlinearSolver, std::complex, Fcwf_vector_allocator> kainsolver(allocator); + kainsolver.set_maxsub(DFparams.maxsub); + Fcwf tempfcwf(world); + while(keep_going and iteration_number < DFparams.max_iter){ + + if(world.rank()==0) print("Iteration:", iteration_number); + + keep_going = false; + + //diagonalize + v_energies = diagonalize_virtuals(world, JandV, op, Kpsis); + + //Apply BSH to each function individually + for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ + + //Calculate function to apply BSH to + tempfcwf = virtuals[i] * JandV; + tempfcwf.scale(-1.0); + tempfcwf += Kpsis[i]; + + //if(world.rank()==0) print("Going into BSH, energy is:",v_energies[i] - csquared); + tempfcwf = apply_BSH(world,tempfcwf,v_energies[i],DFparams.small,DFparams.thresh); + Residuals[i] = virtuals[i] - tempfcwf; + double residualnorm = Residuals[i].norm2(); + if(world.rank()==0) print("Virtual ", i, " Residual: ", residualnorm); + if(residualnorm > tol) keep_going = true; + } + + //Apply KAIN, if called for + if(DFparams.kain){ + virtuals = kainsolver.update(virtuals, Residuals); + } + else{ + virtuals = virtuals - Residuals; + } + + //Orthogonalize the functions against the occupieds + for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + tempcomplex = inner(virtuals[i], occupieds[j]); + virtuals[i] -= occupieds[j]*tempcomplex; + } + virtuals[i].normalize(); + } + + //orthonormalize the functions internally + orthogonalize(world,virtuals); + + //Recalculate exchange + for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ + Kpsis[i] = apply_K(world, op, virtuals[i]); + } + + //Recalculate and print energies for the output + if(world.rank()==0){ + print("\n***Printing Current Energies***"); + } + + for(unsigned int j = 0; j < Init_params.num_virtuals; j++){ + v_energies[j] = rele(world,virtuals[j]); + v_energies[j] += real(inner(virtuals[j],virtuals[j]*JandV)); + v_energies[j] -= real(inner(virtuals[j],Kpsis[j])); + } + + for(unsigned int j = 0; j < Init_params.num_virtuals; j++){ + if(world.rank()==0){ + printf(" Virtual: %3i, Energy: %.10e\n",j+1, v_energies[j]-csquared); + } + } + + } + + + //Fix the location of the last occupied orbital + occupieds.push_back(copy(virtuals[0])); + for(unsigned int i = 0; i < Init_params.num_virtuals-1; i++){ + virtuals[i] = virtuals[i+1]; + } + virtuals.pop_back(); + Tensor tempenergies(Init_params.num_occupied + 1); + tempenergies(Init_params.num_occupied) = v_energies[0]; + for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + tempenergies(i) = energies(i); + } + energies = tempenergies; + v_energies = v_energies(Slice(1,Init_params.num_virtuals - 1)); + Init_params.num_occupied += 1; + Init_params.num_virtuals -= 1; + + //Recalculate and print total energy for the output + if(world.rank()==0){ + print("\n***Printing Current Energies***"); + } + double kinetic_energy = 0.0; + double coulomb_energy = 0.0; + double exchange_energy = 0.0; + double nuclear_attraction_energy = 0.0; + double myc = 137.0359895; //speed of light + + rho = real_factory_3d(world); + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + rho += squaremod(occupieds[j]); + } + real_function_3d Jop = apply(op,rho); + + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + energies[j] = rele(world,occupieds[j]); + kinetic_energy += (energies[j] - myc*myc); + double nuclear_attraction_energy_correction = real(inner(occupieds[j],occupieds[j]*Vnuc)); + nuclear_attraction_energy += nuclear_attraction_energy_correction; + double coulomb_energy_correction = real(inner(occupieds[j],occupieds[j]*Jop)); + energies[j] += coulomb_energy_correction + nuclear_attraction_energy_correction; + coulomb_energy += 0.5*coulomb_energy_correction; + double exchange_energy_correction = real(inner(occupieds[j],apply_K(world,op,occupieds[j]))); + energies[j] -= exchange_energy_correction; + exchange_energy += 0.5*exchange_energy_correction; + } + total_energy = kinetic_energy + coulomb_energy - exchange_energy + nuclear_attraction_energy + nuclear_repulsion_energy; + + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + if(world.rank()==0){ + printf(" Orbital: %3i, Energy: %.10e\n",j+1, energies[j]-myc*myc); + } + } + if(world.rank()==0){ + print("\n Kinetic Energy: ",kinetic_energy); + print(" Coulomb Energy: ",coulomb_energy); + print(" Exchange Energy: ",exchange_energy); + print(" Nuclear Attraction Energy: ",nuclear_attraction_energy); + print(" Nuclear Repulsion Energy: ",nuclear_repulsion_energy); + print(" Total Energy: ",total_energy); + } + + //Below is where we can now solve for virtual orbitals + + + +} + +//kthxbye + + + diff --git a/src/apps/moldft/DF.h b/src/apps/moldft/DF.h new file mode 100644 index 00000000000..55c8b1c57df --- /dev/null +++ b/src/apps/moldft/DF.h @@ -0,0 +1,142 @@ +#ifndef MADNESS_APPS_DF_H_INCLUDED +#define MADNESS_APPS_DF_H_INCLUDED + +#include +#include +#include +#include // The kain solver +#include +#include +#include +#include +#include +#include +#include +#include +#include "../chem/molecule.h" +#include "DFParameters.h" +#include "InitParameters.h" + + +using namespace madness; + + +/// Given a molecule and nonrelativistic ground state orbitals, solve the Dirac-Hartree-Fock equations +class DF { + private: + // Member variables + + // DFParameter object to hold all user input variables + DFParameters DFparams; + + // NRParameter object to hold all variables needed from + // nonrelativistic ground state calculation. Read from an archive + InitParameters Init_params; + + // Timer variables + std::vector sss, ttt; + + // Tensor for holding energies + Tensor energies; + + //Tensor for holding energies of virtual orbitals + Tensor v_energies; + + //Vector of DF Fcwf occupied orbitals + std::vector occupieds; + + //Vector of DF Fcwf virtual orbitals + std::vector virtuals; + + //Total energy of the system + double total_energy; + + public: + + // Start a timer + void start_timer(World & world); + + // Needed to do timers correctly + double pop(std::vector & v); + + // Stop a timer + Tensor end_timer(World & world); + + //Find current time (relative to job start) + Tensor get_times(World& world); + + // Collective constructor for response uses contents of file \c filename and broadcasts to all nodes + DF(World & world, // MADNESS world object + const char* input_file); // Input file + + // Collective constructor for DF uses contents of stream \c input and broadcasts to all nodes + DF(World & world, // MADNESS world object + std::shared_ptr input); // Pointer to input stream + + //Calculates the kinetic+rest energy expectation value of psi + double rele(World& world, const Fcwf& psi); + + //Applies the exchange operator to all of psis + void exchange(World& world, real_convolution_3d& op, std::vector& Kpsis); + + //Applies the exchange operator defined by psis to a single generic input fcwf + Fcwf apply_K(World& world, real_convolution_3d& op, Fcwf& phi); + + //diagonalizes psis in the Fock space. Transforms psis and Kpsis. + void diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op, std::vector& Kpsis); + + //diagonalizes virtual orbitals. Transforms virtuals and Kpsis + Tensor diagonalize_virtuals(World& world, real_function_3d& JandV,real_convolution_3d& op, std::vector& Kpsis); + + //Prints norms of the given vector of functions. + void print_norms(World & world, std::vector f); + + // Small function to print geometry of a molecule nicely + // Straight up stolen from Bryan + void print_molecule(World &world); + + //Saves the state of a DF job so that it can be restarted + void saveDF(World& world); + + //Creates the gaussian nuclear potential from the molecule object + void make_gaussian_potential(World& world, real_function_3d& potential); + + //Creates the gaussian nuclear potential from the molecule object. Also calculates the nuclear repulsion energy + void make_gaussian_potential(World& world, real_function_3d& potential, double& nuclear_repulsion_energy); + + //Creates the fermi nuclear potential from the molecule object + void make_fermi_potential(World& world, real_convolution_3d& op, real_function_3d& potential); + + //Creates the fermi nuclear potential from the molecule object. Also calculates the nuclear repulsion energy + void make_fermi_potential(World& world, real_convolution_3d& op, real_function_3d& potential, double& nuclear_repulsion_energy); + + //Load balancing function + void DF_load_balance(World& world, real_function_3d& Vnuc); + + //Does one full SCF iteration + bool iterate(World& world, real_function_3d& V, real_convolution_3d& op, real_function_3d& JandV, std::vector& Kpsis, XNonlinearSolver, std::complex, Fcwf_vector_allocator>& kainsolver, double& tolerance, int& iteration_number, double& nuclear_repulsion_energy); + + + //Runs the job specified in the input parameters + void solve(World& world); + + //solves the Dirac Fock equation for the occupied orbitals + void solve_occupied(World & world); + + //solves for n-1 occupieds, then the last occupied, then some number of virtuals + void solve_virtuals1(World& world); + + //Lineplot the densities. Currently only along x axis from 0 to L + void make_density_lineplots(World& world, const char* filename, int npt, double endpnt); + + //Lineplot the densities of the large and small component separately. only along x axis from 0 to L + void make_component_lineplots(World& world, const char* filename1, const char* filename2, int npt, double endpnt); + + +}; + + +#endif + +//kthxbye + diff --git a/src/apps/moldft/DFParameters.h b/src/apps/moldft/DFParameters.h new file mode 100644 index 00000000000..cb24c22589e --- /dev/null +++ b/src/apps/moldft/DFParameters.h @@ -0,0 +1,199 @@ + +/// \file DFParameters +/// \brief Input parameters for a Dirac Fock calculation. + +#ifndef MADNESS_APPS_DFPARAMS_H_INCLUDED +#define MADNESS_APPS_DFPARAMS_H_INCLUDED + +#include + +namespace madness { + + struct DFParameters{ + // List of input parameters + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // If you add something here, don't forget to add it to serializable! + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + std::string archive; ///< Name of input archive to read in ground state + int job; ///< Indicates the type of job to do + ///< Values | Job + ///< -------------------------------------------------------------- + ///< 0 | Dirac Fock on occupied orbitals only (Default) + ///< -------------------------------------------------------------- + ///< 1 | "Method 1" calculation of virtuals of a + ///< | single-valence state. + ///< + int print_level; ///< Controls the amount and style of printing. Higher values print more + ///< Values | What gets printed + ///< ---------------------------- + ///< 1 | Print out each step in the calculation, + ///< | along with timings + ///< ---------------------------- + ///< 2 | Debug level. Prints EVERYTHING!!! + + bool plot; ///< Turn on plotting of final orbitals. Output format is .vts + bool plot_range; ///< Controls which orbitals will be plotted + std::vector plot_data; ///< Orbitals to plot + int max_iter; ///< Maximum number of iterations + //double econv; ///< Convergence criterion for the orbital energies + double small; ///< Minimum length scale to be resolved + double thresh; ///< Accuracy criterion when truncating + bool kain; ///< Turns on KAIN nonlinear solver + int maxsub; ///< Sets maximum subspace size for KAIN + bool restart; ///< Indicates this is a restarted DF job + int nucleus; ///< Indicates which nucleus model to use (1 for fermi, anything else for Gaussian) + bool do_save; ///< Whether or not to save after each iteration. Defaults to true. Turn off with 'no_save' + std::string savefile; ///< Gives the file to save the archive each iteration Default: DFrestartdata (in working directory) + int lb_iter; ///< How many iterations to load balance (after the initial load balancing) + bool nwchem; ///< Indicates archive given is actually an nwchem file for starting the job + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // If you add something here, don't forget to add it to serializable! + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + // NOT YET IMPLEMENTED + std::vector protocol_data; + bool localized; ///< Flag to use localized orbitals or not. MUST BE TRUE IF USING LOCALIZED GROUND STATE ORBITALS!! + + template + void serialize(Archive& ar){ + ar & archive & job & print_level & max_iter & small & thresh & kain & maxsub & restart & nucleus & do_save & savefile & lb_iter & nwchem; + } + + // Default constructor + DFParameters() + : job(0) + , print_level(0) + , plot(false) + , max_iter(20) + , small(1e-5) + , thresh(1e-6) + , kain(false) + , maxsub(10) + , restart(false) + , nucleus(0) + , do_save(true) + , savefile("DFrestartdata") + , lb_iter(20) + , nwchem(false) + {} + + // Initializes DFParameters using the contents of file \c filename + void read_file(const std::string& filename){ + std::ifstream f(filename.c_str()); + read(f); + } + + // Initializes DFParameters using the contents of stream \c f + void read(std::istream& f){ + position_stream(f, "DiracFock"); + std::string s; + + while(f >> s){ + if(s == "end"){ + break; + } + else if (s == "archive"){ + f >> archive; + } + else if (s == "job"){ + f >> job; + } + else if (s == "print_level"){ + f >> print_level; + } + else if (s == "plot"){ + plot = true; + std::string buf; + std::getline(f,buf); + plot_data = std::vector(); + std::string d; + std::stringstream t(buf); + t >> d; + if (d == "range"){ + plot_range = true; + t >> d; + plot_data.push_back(std::stoi(d)); + t >> d; + for(int z = plot_data[0]; z < std::stoi(d); z++) plot_data.push_back(z); + } + else{ + // Add in the one we just read + plot_data.push_back(std::stoi(d)); + while(t >> d) plot_data.push_back(std::stoi(d)); + } + } + else if (s == "max_iter"){ + f >> max_iter; + } + else if (s == "small"){ + f >> small; + } + else if (s == "thresh"){ + f >> thresh; + } + else if (s == "kain"){ + kain = true; + } + else if (s == "maxsub"){ + f >> maxsub; + } + else if (s == "restart"){ + restart = true; + } + else if (s == "nucleus"){ + f >> nucleus; + } + else if (s == "no_save"){ + do_save = false; + } + else if (s == "savefile"){ + f >> savefile; + } + else if (s == "lb_iter"){ + f >> lb_iter; + } + else if (s == "nwchem"){ + nwchem = true; + } + else{ + std::cout << "Dirac Fock: unrecognized input keyword " << s << std::endl; + MADNESS_EXCEPTION("input error", 0); + } + } + } // end read() + + // Prints all information + void print_params() const{ + madness::print("\n Input Dirac Fock Parameters"); + madness::print(" -------------------------"); + madness::print(" Initial Guess File:", archive); + madness::print(" Job:", job); + madness::print(" Refinement Threshold:", thresh); + madness::print("Smallest Resolved Length Scale:", small); + madness::print(" Max Iterations:", max_iter); + madness::print(" Use KAIN Solver:", kain); + if(kain) madness::print(" KAIN Solver Subspace Size:", maxsub); + madness::print(" Save:", do_save); + madness::print(" save file:", savefile); + if(nucleus == 1){ + madness::print(" Nucleus: fermi"); + } + else{ + madness::print(" Nucleus: gaussian"); + } + madness::print(" Plot Final Orbitals:", plot); + if(plot and plot_range) madness::print(" Plot Start:", plot_data[0]); + if(plot and plot_range) madness::print(" Plot End:", plot_data[1]); + if(plot and not plot_range) madness::print(" Orbitals to be Plotted:", plot_data); + madness::print(" Print Level:", print_level); + } + }; + +} +#endif + +//kthxbye diff --git a/src/apps/moldft/DFdriver.cc b/src/apps/moldft/DFdriver.cc new file mode 100644 index 00000000000..6b512fe52a8 --- /dev/null +++ b/src/apps/moldft/DFdriver.cc @@ -0,0 +1,54 @@ +/* + * Written by: bsundahl and jscanderson + * Date: A long time ago... + * + */ + + +#include "DF.h" // All response functions/objects enter through this +#include + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) +#include +#include +#include +static inline int file_exists(const char * inpname) +{ + struct stat buffer; + int rc = stat(inpname, &buffer); + return (rc==0); +} +#endif + +int main(int argc, char** argv) +{ + // Initialize MADNESS mpi + initialize(argc, argv); + World world(SafeMPI::COMM_WORLD); + startup(world,argc,argv); + std::cout.precision(10); + + // This makes a default input file name of 'input' + const char * input = "input"; + for (int i=1; i $$.hosts +let NPROC=$PBS_NUM_NODES*2 +cat $$.hosts &> $MY_OUTPUT + +#write job message to output +echo &>> $MY_OUTPUT +echo 'Job message:' &>> $MY_OUTPUT +echo $MY_JOB_MESSAGE &>> $MY_OUTPUT +echo &>> $MY_OUTPUT + +# Now run the job +#mpirun -npernode 2 $MY_EXE DFinput_He &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_Be &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_Ne &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_Mg &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_Ar &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_Ca &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_Zn &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_Kr &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_Xe &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_HF &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_N2 &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_BH3 &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_H2O &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_H2S &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput_H2Se &>> $MY_OUTPUT +#mpirun -npernode 2 $MY_EXE DFinput &>> $MY_OUTPUT +#remora mpirun -npernode 2 $MY_EXE DFinput &>> $MY_OUTPUT + +#Use with +mpirun -f $$.hosts -ppn 2 -n $NPROC $MY_EXE DFinput &>> $MY_OUTPUT +mpirun -f $$.hosts -ppn 2 -n $NPROC $MY_EXE DFinput &>> $MY_OUTPUT +mpirun -f $$.hosts -ppn 2 -n $NPROC $MY_EXE DFinput &>> $MY_OUTPUT +mpirun -f $$.hosts -ppn 2 -n $NPROC $MY_EXE DFinput &>> $MY_OUTPUT +mpirun -f $$.hosts -ppn 2 -n $NPROC $MY_EXE DFinput &>> $MY_OUTPUT + diff --git a/src/apps/moldft/ESInterface.h b/src/apps/moldft/ESInterface.h new file mode 100644 index 00000000000..1f47f4a75e9 --- /dev/null +++ b/src/apps/moldft/ESInterface.h @@ -0,0 +1,153 @@ +/* This file is a part of Slymer, which is distributed under the Creative + Commons Attribution-NonCommercial 4.0 International Public License. + + (c) 2017 Stony Brook University. */ + +/** + * \file ESInterface/ESInterface.h + * \brief API and helper routines for interfacing with electronic structure codes. + * + * Provides a common (abstract) framework for extracting information from + * external electronic structure calculations. + */ + +#ifndef __ESInterface_ESInterface_h__ +#define __ESInterface_ESInterface_h__ + +#include +#include +#include +#include +#include +#include +#include "basis.h" + +namespace slymer { + +/// An atom (symbol and position). +struct Atom { + std::string symbol; ///< The atom's symbol. + std::array position; ///< The atom's location, in angstroms. +}; + +/// A set of atoms. +using Atoms = std::vector; + +namespace Properties { + /** + * \brief Different properties that can be read from electronic structure codes. + * + * C-style bitflags via (\c std::bitset) are used for specifying the properties. + * + * Some properties might require reading others, and this framework is designed + * to facilitate reading multiple properties in one go through the output file(s). + */ + using Properties = std::bitset<5>; + + constexpr Properties None = 0; ///< No properties. + constexpr Properties Basis = 1 << 0; ///< The basis set. + constexpr Properties Atoms = 1 << 1; ///< The atoms & positions. + constexpr Properties Energies = 1 << 2; ///< The MO energies. + constexpr Properties MOs = 1 << 3; ///< The MO vector coefficients. + constexpr Properties Occupancies = 1 << 4; ///< MO occupancies. +} // namespace Properties + +/// Abstract base class for interfacing with electronic structure codes. +class ES_Interface { +protected: + Properties::Properties my_properties; ///< The properties that have been read. + BasisSet my_basis_set; ///< The basis set. + Atoms my_atoms; ///< The atoms (symbols and positions, in angstroms). + madness::Tensor my_energies; ///< Alpha molecular orbital energies + madness::Tensor my_MOs; ///< Alpha molecular orbital expansions coefficients. Column is the MO, row is the basis function. + madness::Tensor my_occupancies; ///< Alpha molecular orbital occupancies. + madness::Tensor my_beta_energies; ///< Beta molecular orbital energies + madness::Tensor my_beta_MOs; ///< Beta molecular orbital expansions coefficients. Column is the MO, row is the basis function. + madness::Tensor my_beta_occupancies; ///< Beta molecular orbital occupancies. + +public: + std::reference_wrapper err; ///< Output stream for messages. + const Properties::Properties &properties; ///< Publically accessible list of read properties. + const BasisSet &basis_set; ///< Publicly accessible basis set. + const Atoms &atoms; ///< Publically accessible list of atoms. + const madness::Tensor &energies; ///< Publically accessible list of alpha MO energies. + const madness::Tensor &MOs; ///< Publically accessible alpha MO expansions coefficients. Column is the MO, row is the basis function. + const madness::Tensor &occupancies; ///< Publically accessible list of alpha MO occupancies (in eV). + const madness::Tensor &beta_energies; ///< Publically accessible list of beta MO energies (in eV). + const madness::Tensor &beta_MOs; ///< Publically accessible beta MO expansions coefficients. Column is the MO, row is the basis function. + const madness::Tensor &beta_occupancies; ///< Publically accessible list of beta MO occupancies (in eV). + + + /// No default constructor. + ES_Interface() = delete; + + /** + * \brief Move constructor. + * + * \param[in] es The existing interface to move. + */ + ES_Interface(ES_Interface &&es) + : my_properties{std::move(es.my_properties)}, my_energies{std::move(es.my_energies)}, + my_MOs{std::move(es.my_MOs)}, my_occupancies{std::move(es.my_occupancies)}, + my_beta_energies{std::move(es.my_beta_energies)}, my_beta_MOs{std::move(es.my_beta_MOs)}, + my_beta_occupancies{std::move(es.my_beta_occupancies)}, err(es.err), properties(my_properties), + basis_set(my_basis_set), atoms(my_atoms), energies(my_energies), MOs(my_MOs), occupancies(my_occupancies), + beta_energies(my_beta_energies), beta_MOs(my_beta_MOs), beta_occupancies(my_beta_occupancies) + {} + + /** + * \brief Copy constructor. + * + * \param[in] es The existing interface to copy. + */ + ES_Interface(const ES_Interface &es) + : my_properties{es.my_properties}, my_energies{es.my_energies}, + my_MOs{es.my_MOs}, my_occupancies{es.my_occupancies}, my_beta_energies{es.my_beta_energies}, + my_beta_MOs{es.my_beta_MOs}, my_beta_occupancies{es.my_occupancies}, + err(es.err), properties(my_properties), basis_set(my_basis_set), atoms(my_atoms), + energies(my_energies), MOs(my_MOs), occupancies(my_occupancies), beta_energies(my_beta_energies), + beta_MOs(my_beta_MOs), beta_occupancies(my_beta_occupancies) + {} + + /** + * \brief Constructor that sets the error/warning stream and the references. + * + * \param[in,out] err_ Output stream for messages. This can be updated later. + */ + ES_Interface(std::ostream &err_) + : my_properties{Properties::None}, my_energies(1), my_MOs(1, 1), + my_occupancies(1), my_beta_energies(1), my_beta_MOs(1,1), my_beta_occupancies(1), + err(err_), properties(my_properties), basis_set(my_basis_set), + atoms(my_atoms), energies(my_energies), MOs(my_MOs), occupancies(my_occupancies), + beta_energies(my_beta_energies), beta_MOs(my_beta_MOs), beta_occupancies(my_beta_occupancies) + {} + + virtual ~ES_Interface() = default; + +protected: + /// Reset the interface. + void reset() { + my_properties = Properties::None; + my_basis_set.clear(); + my_atoms.clear(); + my_energies.reshape(1); + my_MOs.reshape(1, 1); + my_occupancies.reshape(1); + my_beta_energies.reshape(1); + my_beta_MOs.reshape(1, 1); + my_beta_occupancies.reshape(1); + } + +public: + /** + * \brief Read the specified properties and store them in the member variables. + * + * \param[in] props The properties to be read, using a bit flag combination. + */ + virtual void read(Properties::Properties props) = 0; + +}; + +} // namespace slymer + +#endif diff --git a/src/apps/moldft/InitParameters.h b/src/apps/moldft/InitParameters.h new file mode 100644 index 00000000000..486385457fc --- /dev/null +++ b/src/apps/moldft/InitParameters.h @@ -0,0 +1,419 @@ + +/// \file InitParameters +/// \brief Input parameters for a Dirac Fock calculation, read from a specified archive resulting from a nonrelativistic moldft calculation or restarted from a previous Dirac Fock calculation. + + +#ifndef MADNESS_APPS_DFGUESSPARAMS_H_INCLUDED +#define MADNESS_APPS_DFGUESSPARAMS_H_INCLUDED + +#include "fcwf.h" +#include "NWChem.h" + +Function,3> function_real2complex(const Function& r); + +namespace madness{ + + + struct InitParameters{ + // Ground state parameters that are read in from archive + std::string inFile; ///< Name of input archive to read in ground state + double Init_total_energy; ///< Total energy of the nonrelativistic ground state + bool spinrestricted; ///< Indicates if ground state calc. was open or closed shell + unsigned int num_occupied; ///< Number of orbitals in ground state + unsigned int num_virtuals; + Tensor energies; ///< Energy of ground state orbitals + Tensor v_energies; + Tensor occ; ///< Occupancy of ground state orbitals + double L; ///< Box size of ground state - Dirac Fock calcluation is in same box + int order; ///< Order of polynomial used in ground state + Molecule molecule; ///< The molecule used in ground state calculation + std::vector orbitals; ///< The ground state orbitals + std::vector virtuals; + + // Default constructor + InitParameters() {} + + // Initializes NRParameters using the contents of file \c filename + void read(World& world, const std::string& filename, bool restart){ + // Save the filename + inFile = filename; + + if(restart){ + if(world.rank()==0) print("\n Reading initial data from restarted DF calculation"); + archive::ParallelInputArchive input(world, filename.c_str()); + input & Init_total_energy; + input & spinrestricted; + input & num_occupied; + input & energies; + input & L; + input & order; + input & molecule; + + // Set this so we can read in whats + // written in the archive + FunctionDefaults<3>::set_k(order); + FunctionDefaults<3>::set_cubic_cell(-L, L); + + //Now we just have to unpack the orbitals + for(unsigned int i=0; i < num_occupied; i++){ + Fcwf reader(world); + for(int j=0; j < 4; j++){ + input & reader[j]; + } + orbitals.push_back(copy(reader)); + } + } + else{ + std::vector dummy2; + Tensor temp_energies; + + archive::ParallelInputArchive input(world, filename.c_str()); + input & Init_total_energy; // double + input & spinrestricted; // bool + input & num_occupied; // int + input & temp_energies; // Tensor orbital energies + input & occ; // Tensor orbital occupations + input & dummy2; // std::vector sets of orbitals(?) + input & L; // double box size + input & order; // int wavelet order + input & molecule; // Molecule + + // Check that order is positive and less than 30 + if (order < 1 or order > 30){ + if(world.rank() == 0) print("\n ***PLEASE NOTE***\n Invalid wavelet order read from archive, setting to 8.\n This seems to happen when the default wavelet order is used in moldft."); + order = 8; + } + + // Set this so we can read in whats + // written in the archive + FunctionDefaults<3>::set_k(order); + FunctionDefaults<3>::set_cubic_cell(-L, L); + + + if(spinrestricted){ + // Read in nonrelativistic ground state orbitals, changing them to Fcwfs + real_function_3d reader; + complex_function_3d complexreader; + Fcwf spinup(world); + Fcwf spindown(world); + for(unsigned int i = 0; i < num_occupied; i++){ + input & reader; + complexreader = function_real2complex(reader); + spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + spindown = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + orbitals.push_back(spinup); + orbitals.push_back(spindown); + } + + //duplicate the energies + energies = Tensor(2*num_occupied); + double csquared = 137.0359895*137.0359895; + double temp; + for(unsigned int i = 0; i < num_occupied; i++){ + temp = temp_energies(i)+csquared; + energies(2*i) = temp; + energies(2*i+1) = temp; + } + + //correct the number of orbitals + num_occupied *= 2; + } + else{ + + // Read in alpha ground state orbitals + real_function_3d reader; + complex_function_3d complexreader; + Fcwf fcwfreader(world); + for(unsigned int i = 0; i < num_occupied; i++){ + input & reader; + complexreader = function_real2complex(reader); + fcwfreader = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + orbitals.push_back(fcwfreader); + } + + // Read in beta quantities + unsigned int num_betas; + input & num_betas; + + Tensor beta_energies; + input & beta_energies; + //NEED TO ADD THESE INTO TOTAL ENERGIES MATRIX + + Tensor dummy3; + input & dummy3; + + std::vector dummy4; + input & dummy4; + + //read in beta ground state orbitals + for(unsigned int i = 0; i < num_betas; i++){ + input & reader; + complexreader = function_real2complex(reader); + fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + orbitals.push_back(fcwfreader); + } + + //fix up energies tensor and num_occupied + energies = Tensor(num_occupied + num_betas); + double csquared = 137.0359895*137.0359895; + for(unsigned int i = 0; i < num_occupied; i++){ + energies(i) = temp_energies(i) + csquared; + } + for(unsigned int i = 0; i < num_betas; i++){ + energies(num_occupied + i) = beta_energies(i) + csquared; + } + num_occupied += num_betas; + + } + + //For convenience, reorder orbitals and energies in ascending order. + double tempdouble; + Fcwf fcwfreader(world); + for(unsigned int i = 0; i < num_occupied; i++){ + for(unsigned int j = i+1; j < num_occupied; j++){ + if(energies(j) < energies(i)){ + if(world.rank()==0) print("swapping orbitals", i, " and ", j); + tempdouble = energies(j); + energies(j) = energies(i); + energies(i) = tempdouble; + fcwfreader = orbitals[j]; + orbitals[j] = orbitals[i]; + orbitals[i] = fcwfreader; + } + } + } + + + } + } + + void readnw(World& world, const std::string& filename){ + //Called to read in initial parameters from an nwchem output file + + //For now just use default values for L and order + order = 6; + L = 50.0; + FunctionDefaults<3>::set_k(order); + FunctionDefaults<3>::set_cubic_cell(-L, L); + + //Need to set this to something... + Init_total_energy = 0.0; + + //Construct interface object from slymer namespace + slymer::NWChem_Interface nwchem(filename,std::cout); + + //For parallel runs, silencing all but 1 slymer instance + if(world.rank() != 0) { + std::ostream dev_null(nullptr); + nwchem.err = dev_null; + } + + //Read in basis set + nwchem.read(slymer::Properties::Basis); + + //Read in the molecular orbital coefficients, energies, and occupancies + nwchem.read(slymer::Properties::Energies | slymer::Properties::MOs | slymer::Properties::Occupancies); + + //Need to construct a molecule object by ourselves + molecule = Molecule(); + unsigned int anum; + double x,y,z,q; + for(unsigned int i=0; i < nwchem.atoms.size(); i++){ + anum = symbol_to_atomic_number(nwchem.atoms[i].symbol); + q = anum*1.0; + x = nwchem.atoms[i].position[0]; + y = nwchem.atoms[i].position[1]; + z = nwchem.atoms[i].position[2]; + molecule.add_atom(x,y,z,q,anum); + } + + //Find out how many orbitals we're dealing with by looking at the occupancies + unsigned int numalpha(0), numbeta(0); + num_virtuals = 0; + + bool have_beta(false); + for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ + if(nwchem.beta_occupancies[i] > 0.0) have_beta = true; + } + + if(have_beta){ + //we're reading from an open-shell calculation + for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ + (nwchem.occupancies[i] == 1.0) ? numalpha+=1 : num_virtuals+=1; + } + for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ + (nwchem.beta_occupancies[i] == 1.0) ? numbeta+=1 : num_virtuals+=1; + } + } + else{ + for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ + (nwchem.occupancies[i] == 2.0) ? numalpha += 1 : num_virtuals += 2; + } + numbeta = numalpha; + } + num_occupied = numalpha+numbeta; + + //Let's print everything so we have a visual check on what we're working with (for now) + if(world.rank()==0) print("\nalpha occupancies:\n",nwchem.occupancies); + if(world.rank()==0) print("\nbeta occupancies:\n",nwchem.beta_occupancies); + if(world.rank()==0) print("\nenergies:\n",nwchem.energies); + if(world.rank()==0) print("\nbeta energies:\n",nwchem.beta_energies); + if(world.rank()==0) print("num alpha",numalpha); + if(world.rank()==0) print("num beta",numbeta); + if(world.rank()==0) print("num virtuals",num_virtuals); + + + //Now that we know how many orbitals we have. initialize energy tensors + energies = Tensor(num_occupied); + v_energies = Tensor(num_virtuals); + + //Cast the 'basis set' into a Gaussian basis and iterate over it + vector_real_function_3d temp1; + int ii = 0; + for(auto basis : slymer::cast_basis(nwchem.basis_set)) { + //Get the center of gaussian as its special point + std::vector centers; + coord_3d r; + r[0] = basis.get().center[0]; r[1] = basis.get().center[1]; r[2] = basis.get().center[2]; + centers.push_back(r); + + //Now make the function + temp1.push_back(FunctionFactory(world).functor(std::shared_ptr>(new slymer::Gaussian_Functor(basis.get(), centers)))); + double norm2 = temp1[ii].norm2(); + if(world.rank() == 0) print("function", ii, "has norm", norm2); + ii++; + } + + //Normalize aos + normalize(world, temp1); + + //Transform aos now to get alpha mos + vector_real_function_3d temp = transform(world, temp1, nwchem.MOs , true); + + //Keep track of how many energies i've stored + int energy_index = 0; + int v_energy_index = 0; + + //nonrelativistic energies need to be adjusted for relativistic calculations + double csquared = 137.0359895*137.0359895; + + //Convert and store alpha occupied MOs and virtuals. If closed shell, do betas too. + complex_function_3d complexreader(world); + Fcwf fcwfreader(world); + for(unsigned int i = 0; i < temp.size(); i++){ + complexreader = function_real2complex(temp[i]); + fcwfreader = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + if(have_beta){ + if(nwchem.occupancies[i] == 1.0){ + orbitals.push_back(fcwfreader); + energies[energy_index] = nwchem.energies[i] + csquared; + energy_index++; + } + else{ + virtuals.push_back(fcwfreader); + v_energies[v_energy_index] = nwchem.energies[i] + csquared; + v_energy_index++; + } + + } + else{ + if(nwchem.occupancies[i] == 2.0){ + orbitals.push_back(fcwfreader); + energies[energy_index] = nwchem.energies[i] + csquared; + energy_index++; + fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + orbitals.push_back(fcwfreader); + energies[energy_index] = nwchem.energies[i] + csquared; + energy_index++; + + } + else{ + virtuals.push_back(fcwfreader); + v_energies[v_energy_index] = nwchem.energies[i] + csquared; + v_energy_index++; + fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + virtuals.push_back(fcwfreader); + v_energies[v_energy_index] = nwchem.energies[i] + csquared; + v_energy_index++; + } + } + } + + + //If we're doing an open shell calculation we need to read in the beta orbitals explicitly + if(have_beta){ + //Transform aos again to get beta mos + temp = transform(world, temp1, nwchem.beta_MOs, true); + + //Convert and store beta occupied MOs and virtuals + for(unsigned int i = 0; i < temp.size(); i++){ + complexreader = function_real2complex(temp[i]); + fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + if(nwchem.beta_occupancies[i] == 1.0){ + orbitals.push_back(fcwfreader); + energies[energy_index] = nwchem.beta_energies[i] + csquared; + energy_index++; + } + else{ + virtuals.push_back(fcwfreader); + v_energies[v_energy_index] = nwchem.beta_energies[i] + csquared; + v_energy_index++; + } + } + } + + //Assure that the numbers line up + MADNESS_ASSERT(num_occupied == orbitals.size()); + MADNESS_ASSERT(num_virtuals == virtuals.size()); + + //Need to sort + double tempdouble; + //Sort occupied + for(unsigned int i = 0; i < num_occupied; i++){ + for(unsigned int j = i+1; j < num_occupied; j++){ + if(energies(j) < energies(i)){ + if(world.rank()==0) print("swapping orbitals", i, " and ", j); + tempdouble = energies(j); + energies(j) = energies(i); + energies(i) = tempdouble; + fcwfreader = orbitals[j]; + orbitals[j] = orbitals[i]; + orbitals[i] = fcwfreader; + } + } + } + //sort virtual + for(unsigned int i = 0; i < num_virtuals; i++){ + for(unsigned int j = i+1; j < num_virtuals; j++){ + if(v_energies(j) < v_energies(i)){ + if(world.rank()==0) print("swapping virtuals", i, " and ", j); + tempdouble = v_energies(j); + v_energies(j) = v_energies(i); + v_energies(i) = tempdouble; + fcwfreader = virtuals[j]; + virtuals[j] = virtuals[i]; + virtuals[i] = fcwfreader; + } + } + } + + } + + // Prints all information + void print_params() const + { + madness::print("\n Input Parameters"); + madness::print(" -------------------------"); + madness::print(" Input Archive:", inFile); + madness::print(" Spin Restricted:", spinrestricted); + madness::print(" No. of occ. orbitals:", num_occupied); + madness::print(" L:", L); + madness::print(" Wavelet Order:", order); + madness::print(" Initial Total Energy:", Init_total_energy); + madness::print(" Orbital Energies:", energies); + } + }; +} +#endif + +//kthxbye diff --git a/src/apps/moldft/NWChem.cc b/src/apps/moldft/NWChem.cc new file mode 100644 index 00000000000..f789435c6ae --- /dev/null +++ b/src/apps/moldft/NWChem.cc @@ -0,0 +1,973 @@ +/* This file is a part of Slymer, which is distributed under the Creative + Commons Attribution-NonCommercial 4.0 International Public License. + + (c) 2017 Stony Brook University. */ + +/** + * \file ESInterface/NWChem.cc + * \brief Implementation of the interface for NWChem. + */ + +#include +#include "NWChem.h" +#include +#include +#include +#include +#include +#include +#include +#include "gaussian.h" + +namespace slymer { + +// helper functions + +void NWChem_Interface::read(Properties::Properties props) { + // figure out which properties we need to read: + // 1) Work out dependencies (for instance, basis needs atoms). + // 2) Omit ones that are already read. That is, we need properties that are + // specified in props (post step 1), but not already read (in my_properties). + // ... bitwise and props with (not my_properties) -- has to be requested and + // not read. + + // basis requires atoms + if((props & Properties::Basis).any()) + props |= Properties::Atoms; + + // if we're doing the MO expansion coefficients, we might as well do the + // energies + if((props & Properties::MOs).any()) + props |= Properties::Energies; + + // skip things we've already read + props &= ~my_properties; + + // do we need to open and read fname.out? + if((props & Properties::Atoms).any() || + (props & Properties::Basis).any()) { + + // open the NWChem log file: fname.out + std::ifstream in(fname + ".out"); + if(!in) + throw std::invalid_argument("Cannot open " + fname + ".out for reading."); + + if((props & Properties::Atoms).any()) + read_atoms(in); + if((props & Properties::Basis).any()) + read_basis_set(in); + + in.close(); + } + + // do we need to open and read fname.movecs? + if((props & Properties::Energies).any() || + (props & Properties::MOs).any() || + (props & Properties::Occupancies).any()) { + + // open the NWChem movecs file: fname.movecs + // this file is binary + std::ifstream in(fname + ".movecs", std::ios::binary); + if(!in) + throw std::invalid_argument("Cannot open " + fname + ".movecs for reading."); + in.unsetf(std::ios::skipws); + + read_movecs(props, in); + + in.close(); + } +} + +void NWChem_Interface::read_atoms(std::istream &in) { + my_atoms.clear(); + + // state variables + std::string line; // current line of the NWChem output + bool reading = false; // are we in the block of text where we can read basis functions? + double unitcf = 1.; // Conversion factor to go from units in the NWChem file to angstroms + + // regex search strings + std::regex startline{R"(Geometry)"}, + unitline{R"(Output coordinates in (a.u.|angstroms|nanometer|picometer|.+) \(scale)"}, + atomline{R"([[:digit:]]+[[:space:]]+([[:alpha:]]+)[[:space:]]+[^[:space:]]+[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+))"}, + doneline{R"(Atomic Mass)"}; + std::smatch matches; + + // note that NWChem outputs the orbitals by atom type, listing ang. momentum, exponents, and coefficients + while(std::getline(in, line)) { + // is this the start of the basis function output? + if(!reading && std::regex_search(line, startline)) { + reading = true; + } + + // in what units are the atomic positions? + else if(reading && std::regex_search(line, matches, unitline)) { + bool doprint = true; + if(matches[1] == "angstroms") + unitcf = 1./0.529177; + else if(matches[1] == "a.u.") + unitcf = 1.0; + else if(matches[1] == "nanometer") + unitcf = 10./0.529177; + else if(matches[1] == "picometer") + unitcf = 0.01/0.529177; + else { + err.get() << "Unknown units: " << matches[1] << ". Assuming angstroms." << std::endl; + unitcf = 1.; + doprint = false; + } + if(doprint) + err.get() << "NWChem uses " << matches[1] << ". Conversion to a.u. is " + << unitcf << '.' << std::endl; + } + + // does this line have an atomic position? + else if(reading && std::regex_search(line, matches, atomline)) { + err.get() << matches[1] << " at (" << matches[2] << ", " << matches[3] << ", " << matches[4] << ")." << std::endl; + Atom addme; + addme.symbol = matches[1]; + addme.position = {{std::stod(matches[2]) * unitcf, std::stod(matches[3]) * unitcf, std::stod(matches[4]) * unitcf}}; + my_atoms.emplace_back(std::move(addme)); + } + + // are we done? + else if(reading && std::regex_search(line, doneline)) { + break; + } + } + + my_properties = my_properties | Properties::Atoms; +} + + + +// helper functions and data types for reading the basis set + +/** + * \brief Store information on a shell of basis functions as it's being read. + * + * Used when reading the basis functions. + */ +struct BasisShell { + char type; ///< Type of basis function. + std::vector coeffs, ///< Expansion coefficient for each primitive. + exps; ///< Exponent for each primitive. +}; + +static std::ostream &operator<< (std::ostream &out, const BasisShell &bs) { + out << "Type " << bs.type << ", exps = [ "; + for(auto ex : bs.exps) + out << ex << ' '; + out << "], coeffs = [ "; + for(auto coeff : bs.coeffs) + out << coeff << ' '; + out << "]"; + return out; +} + +void NWChem_Interface::read_basis_set(std::istream &in) { + my_basis_set.clear(); + // First we have to read the basis functions (and types) that are on each atom + + // state variables + std::string line; // current line of the NWChem output + bool reading = false; // are we in the block of text where we can read basis functions? + bool spherical = true; // are we using spherical orbitals (true) or Cartesian (false)? + std::string curatom; // Symbol of the current atom being read. + unsigned curnum = 1; // The current basis function number (for the symbol) being read. + BasisShell curfunc; // The current basis function being read. + std::map> basisperatom; // List of basis functions for the given symbol (map key). + std::list basiscuratom; // List of basis functions for the current atom. + + // regex search strings + std::regex startline{R"(Basis.*(cartesian|spherical))"}, + newatomline{R"(([[:alpha:]]+)[[:space:]]+\(([[:alpha:]]+)\))"}, + orbitalline{R"(([[:digit:]]+)[[:space:]]+([[:alpha:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+))"}, + doneline{R"(Summary)"}; + std::smatch matches; + + // note that NWChem outputs the orbitals by atom type, listing ang. momentum, exponents, and coefficients + while(std::getline(in, line)) { + // is this the start of the basis function output? + if(!reading && std::regex_search(line, matches, startline)) { + reading = true; // we're now in the basis function block + + // determine the type of basis function being used + if(matches[1] == "cartesian") + spherical = false; + else if(matches[1] == "spherical") + spherical = true; + + err.get() << "Using " << (spherical ? "spherical" : "Cartesian") << " orbitals." << std::endl; + } + + // Are we done reading orbitals? + else if(reading && std::regex_search(line, doneline)) { + if(curatom.length() > 0) { + err.get() << " Function " << curnum << ": " << curfunc << std::endl; + basiscuratom.emplace_back(std::move(curfunc)); + basisperatom.emplace(std::move(curatom), std::move(basiscuratom)); + } + break; // nothing more to read + } + + // Is this the start of a new atom? + else if(reading && std::regex_search(line, matches, newatomline)) { + // if this isn't the first symbol, store the previous symbol's basis and reset + if(curatom.length() > 0) { + err.get() << " Function " << curnum << ": " << curfunc << std::endl; + + basiscuratom.emplace_back(std::move(curfunc)); + basisperatom.emplace(std::move(curatom), std::move(basiscuratom)); + } + + curatom = matches[1]; + curnum = 1; + err.get() << "Reading basis for " << curatom << " (" << matches[2] << ")." << std::endl; + } + + else if(reading && std::regex_search(line, matches, orbitalline)) { + // this line is an uncontracted orbital shell + const unsigned func = std::stoul(matches[1]); + if(func == curnum + 1) { + // store the old basis function and prepare to start reading a new one + err.get() << " Function " << curnum << ": " << curfunc << std::endl; + basiscuratom.emplace_back(std::move(curfunc)); + ++curnum; + } + + if(func == curnum) { + // add a new primitive (uncontracted Gaussian) to this overall shell + const std::string type = matches[2]; + if(curfunc.exps.size() == 0) + // first one. set the type + curfunc.type = type[0]; + else if(curfunc.type != type[0]) + throw std::runtime_error("Inconsistent orbital types while reading NWChem basis set."); + + curfunc.exps.push_back(std::stod(matches[3])); + curfunc.coeffs.push_back(std::stod(matches[4])); + } + else + throw std::runtime_error("Inconsistent basis function counting while reading NWChem basis set."); + } + } + + // now we need to go through the atoms in the calculation and create the basis + // functions centered on each. + err.get() << "Processing basis functions for each atom." << std::endl; + + for(const Atom &atom : atoms) { + unsigned nfunc = 0; + + err.get() << "Atom: " << atom.symbol << " at (" << atom.position[0] << + ", " << atom.position[1] << ", " << atom.position[2] << "): "; + + // add the basis functions for this atom type, centered at this location + for(const BasisShell &bs : basisperatom[atom.symbol]) { + if(bs.type == 'S') { + gaussians.emplace_back( + new GaussianFunction(GaussianType::s, atom.position, bs.exps, + bs.coeffs)); + ++nfunc; + } + else if(bs.type == 'P') { + gaussians.emplace_back( + new GaussianFunction(GaussianType::px, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::py, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::pz, atom.position, bs.exps, + bs.coeffs)); + nfunc += 3; + } + else if(bs.type == 'D' && !spherical) { + throw std::runtime_error("Cartesian D shell requested: These are not tested or verified."); + + // THESE ROUTINES HAVE NOT BEEN TESTED + gaussians.emplace_back( + new GaussianFunction(GaussianType::dxx, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::dxy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::dxz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::dyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::dyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::dzz, atom.position, bs.exps, + bs.coeffs)); + nfunc += 6; + } + else if(bs.type == 'D' && spherical) { + gaussians.emplace_back( + new GaussianFunction(GaussianType::dxy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::dyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::dzzmrr, atom.position, bs.exps, + bs.coeffs)); + + std::unique_ptr dxz( + new GaussianFunction(GaussianType::dxz, atom.position, bs.exps, + bs.coeffs)); + dxz->operator*=(-1.); + gaussians.emplace_back(std::move(dxz)); + + gaussians.emplace_back( + new GaussianFunction(GaussianType::dxxmyy, atom.position, bs.exps, + bs.coeffs)); + nfunc += 5; + } + else if(bs.type == 'F' && !spherical) { + throw std::runtime_error("Cartesian F shell requested: These are not tested or verified."); + + // THESE ROUTINES HAVE NOT BEEN TESTED + gaussians.emplace_back( + new GaussianFunction(GaussianType::fxxx, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fxxy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fxxz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fxyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fxyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fxzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fyyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fyyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fyzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fzzz, atom.position, bs.exps, + bs.coeffs)); + nfunc += 10; + } + else if(bs.type == 'F' && spherical) { + gaussians.emplace_back( + new GaussianFunction(GaussianType::fxxymyyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fxyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fyzzmrry, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fzzzmrrz, atom.position, bs.exps, + bs.coeffs)); + + std::unique_ptr fxzzmrrx( + new GaussianFunction(GaussianType::fxzzmrrx, atom.position, bs.exps, + bs.coeffs)); + fxzzmrrx->operator*=(-1.); + gaussians.emplace_back(std::move(fxzzmrrx)); + + gaussians.emplace_back( + new GaussianFunction(GaussianType::fxxzmyyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::fxyymxxx, atom.position, bs.exps, + bs.coeffs)); + nfunc += 7; + } + else if(bs.type == 'G' && !spherical) { + throw std::runtime_error("Cartesian G shell requested: These are not tested or verified."); + + // THESE FUNCTIONS HAVE NOT BEEN TESTED OR VERIFIED!!! + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxxxx, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxxxy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxxxz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxxyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxxyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxxzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxyyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxyyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxyzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxzzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gyyyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gyyyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gyyzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gyzzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gzzzz, atom.position, bs.exps, + bs.coeffs)); + nfunc += 15; + } + else if(bs.type == 'G' && spherical) { + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxydx2my2, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gyzdx2my2, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxydz2mr2, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gyzdz2mr2, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gzero, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxzdz2mr2, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gx2my2dz2mr2, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gxzdx2my2, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::gx4mx2y2py4, atom.position, bs.exps, + bs.coeffs)); + nfunc += 9; + } + else if(bs.type == 'H' && !spherical) { + throw std::runtime_error("Cartesian H shell requested: These are not tested or verified."); + + // THESE FUNCTIONS HAVE NOT BEEN TESTED OR VERIFIED!!! + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxxxxx, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxxxxy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxxxxz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxxxyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxxxyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxxxzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxxyyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxxyyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxxyzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxxzzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxyyyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxyyyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxyyzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxyzzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hxzzzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hyyyyy, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hyyyyz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hyyyzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hyyzzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hyzzzz, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hzzzzz, atom.position, bs.exps, + bs.coeffs)); + nfunc += 21; + } + else if(bs.type == 'H' && spherical) { + gaussians.emplace_back( + new GaussianFunction(GaussianType::hm5, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hm4, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hm3, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hm2, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hm1, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hzero, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hp1, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hp2, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hp3, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hp4, atom.position, bs.exps, + bs.coeffs)); + gaussians.emplace_back( + new GaussianFunction(GaussianType::hp5, atom.position, bs.exps, + bs.coeffs)); + nfunc += 11; + } + else + throw std::runtime_error(std::string("Unknown or unimplemented shell type: ") + bs.type); + } + + err.get() << nfunc << " basis functions." << std::endl; + } + + unsigned size = gaussians.size(); + for(unsigned j = 0; j < size; ++j) { + // add a {reference to the basis function} to the basis set vector + my_basis_set.emplace_back(std::ref(*gaussians[j].get())); + } + + my_properties = my_properties | Properties::Basis; +} + + + +// helper routine for read_movecs + +/** + * \brief Read bytes from a binary file into the specified type. + * + * Attempts to account for the endian-ness of the binary data. This should + * hopefully make the routine more robust to running NWChem jobs on one + * machine and processing the files on another. + * + * \tparam T Type of data to be read (only really need the size). + * \param [in,out] in The input stream. + * \param [in] swap Change the endian-ness of the read data? + * \return The read data, in the requested type. + */ +template +static T read_endian(std::istream &in, const bool swap) { + T ret; + char * const ptr = reinterpret_cast(&ret); + const unsigned bytes = sizeof(T); + + if(swap) { + // need to swap the endian-ness of the data + // read byte-by-byte, in reverse order + for(unsigned j = 0; j < bytes; ++j) + in.read(ptr + (bytes - j - 1), 1); + } + else + // use the data as-is + in.read(ptr, bytes); + + return ret; +} + +void NWChem_Interface::read_movecs(const Properties::Properties props, + std::istream &in) +{ + int32_t num[2]; + bool swap_endian = false; + unsigned nsets, nbasis; + const std::runtime_error errmess("Error reading NWChem movecs file."); + + // what properties are we storing? (all will be read from the movecs file) + const bool do_occupancies = (props & Properties::Occupancies).any(); + const bool do_energies = (props & Properties::Energies).any(); + const bool do_MOs = (props & Properties::MOs).any(); + + // temporary storage places (in case errors pop up while/after reading) + madness::Tensor temp_occupancies, temp_energies; + madness::Tensor temp_MOs; + + // this function is based on the mov2asc program + // https://github.com/jeffhammond/nwchem/blob/master/contrib/mov2asc/mov2asc.F + + // every write statement in fortran puts a 4-byte integer before and after + // the data. this integer contains the size of the data. the num array here + // is used to read these values. + + // read the header information + // first up is a FORTRAN integer (4 bytes) telling the number of characters + // this should be 142 = 3*32 + 20 + 26 or 110 = 2*32 + 20 + 26 + num[0] = read_endian(in, false); + if(num[0] != 142 && num[0] != 110) { + // try the other endian-ness + err.get() << "Unable to read header. Trying opposite endian-ness." << std::endl; + char * const ptr = reinterpret_cast(num); + std::swap(ptr[0], ptr[3]); + std::swap(ptr[1], ptr[2]); // all four of these chars make up num[0] + swap_endian = true; + if(num[0] != 142 && num[0] != 110) { + err.get() << "Still unable to read header. Abort." << std::endl; + throw errmess; + } + else + err.get() << "Using opposite endian-ness for the remainder of this read." << std::endl; + } + // basissum, geomsum, bqsum, scftype20, and date. bqsum may be skipped + in.seekg(num[0], std::ios_base::cur); + // bookend for the length of the above strings combined + num[1] = read_endian(in, swap_endian); + if(num[1] != num[0]) { + err.get() << "Error reading header (basissum, ..., date)." << std::endl; + throw errmess; + } + + // for whatever reason the scftype20 is repeated, with bookends (now = 20) + num[0] = read_endian(in, swap_endian); + if(num[0] != 20) { + err.get() << "Error reading header (scftype20)." << std::endl; + throw errmess; + } + // scftype20 + in.seekg(20, std::ios_base::cur); + num[0] = read_endian(in, swap_endian); + if(num[0] != 20) { + err.get() << "Error reading header (scftype20)." << std::endl; + throw errmess; + } + + // size of the title (lentit) + num[0] = read_endian(in, swap_endian); + // lentit. don't check size explicitly, it's probably either 4 or 8 + // depending on the fortran compiler/environment + in.seekg(num[0], std::ios_base::cur); + num[1] = read_endian(in, swap_endian); + if(num[0] != num[1]) { + err.get() << "Error reading header (lentit)." << std::endl; + throw errmess; + } + + // read the title itself + num[0] = read_endian(in, swap_endian); + // the title. varying length + in.seekg(num[0], std::ios_base::cur); + num[1] = read_endian(in, swap_endian); + if(num[0] != num[1]) { + err.get() << "Error reading title of NWChem job in header." << std::endl; + throw errmess; + } + + // length of the basis set name (lenbas) + num[0] = read_endian(in, swap_endian); + // lentit. don't check size explicitly, it's probably either 4 or 8 + // depending on the fortran compiler/environment + in.seekg(num[0], std::ios_base::cur); + num[1] = read_endian(in, swap_endian); + if(num[0] != num[1]) { + err.get() << "Error reading header (lenbas)." << std::endl; + throw errmess; + } + + // read the basis name itself + num[0] = read_endian(in, swap_endian); + // the title. varying length + in.seekg(num[0], std::ios_base::cur); + num[1] = read_endian(in, swap_endian); + if(num[0] != num[1]) { + err.get() << "Error reading basis set name in header." << std::endl; + throw errmess; + } + + // the number of MO sets (nsets) + num[0] = read_endian(in, swap_endian); + if(num[0] == 4) { + int32_t temp; + temp = read_endian(in, swap_endian); + nsets = static_cast(temp); + } + else if(num[0] == 8) { + int64_t temp; + temp = read_endian(in, swap_endian); + nsets = static_cast(temp); + } + else { + err.get() << "Unknown or unimplemented integer type for the number of sets in header." << std::endl; + throw errmess; + } + num[1] = read_endian(in, swap_endian); + if(num[0] != num[1]) { + err.get() << "Error reading number of sets in header." << std::endl; + throw errmess; + } + if(nsets > 2) { + err.get() << "The read_MOs basis has only been tested for movecs files that have a one or two sets.\n" << + "The results from this function need to be verified before use (" << nsets << " sets).\n" + "Only the last two sets will be kept." << std::endl; + } + + // size of the basis set (NBF in the mov2asc script) + num[0] = read_endian(in, swap_endian); + if(num[0] == 4) { + int32_t temp; + temp = read_endian(in, swap_endian); + nbasis = static_cast(temp); + } + else if(num[0] == 8) { + int64_t temp; + temp = read_endian(in, swap_endian); + nbasis = static_cast(temp); + } + else { + err.get() << "Unknown or unimplemented integer type for basis set size in header." << std::endl; + throw errmess; + } + num[1] = read_endian(in, swap_endian); + if(num[0] != num[1]) { + err.get() << "Error reading basis set size in header." << std::endl; + throw errmess; + } + // make sure this agrees with any information we've already read + if((properties & Properties::Basis) != Properties::None && nbasis != basis_set.size()) { + err.get() << "The number of basis functions in read_MOs does not match the number of " << + "basis functions read\nfrom the NWChem log file. Use the following results with caution." + << std::endl; + } + + // read the number of vectors in each set (nmo) + //std::vector nmo(nsets); + //for(unsigned j = 0; j < nsets; ++j) { + // num[0] = read_endian(in, swap_endian); + // if(num[0] == 4) { + // int32_t temp; + // temp = read_endian(in, swap_endian); + // nmo[j] = static_cast(temp); + // } + // else if(num[0] == 8) { + // int64_t temp; + // temp = read_endian(in, swap_endian); + // nmo[j] = static_cast(temp); + // } + // else { + // err.get() << "Unknown or unimplemented integer type for nmo[" << j << "] in header." << std::endl; + // throw errmess; + // } + // num[1] = read_endian(in, swap_endian); + // if(num[0] != num[1]) { + // err.get() << "Error reading nmo[" << j << "] in header." << std::endl; + // throw errmess; + // } + //} + + // Fix ? + std::vector nmo(nsets); + num[0] = read_endian(in, swap_endian); + if(num[0] == 4) { + int32_t temp; + temp = read_endian(in, swap_endian); + nmo[0] = static_cast(temp); + } + if(num[0] == 8) { + int64_t temp; + temp = read_endian(in, swap_endian); + nmo[0] = static_cast(temp); + } + else if(num[0] > 8) { + int64_t temp; + for(unsigned j = 0; j < nsets; ++j) { + temp = read_endian(in, swap_endian); + nmo[j] = static_cast(temp); + } + } + num[1] = read_endian(in, swap_endian); + if(num[0] != num[1]) { + err.get() << "Error reading nmo sizes in header." << std::endl; + throw errmess; + } + + // go through the sets + for(unsigned set = 0; set < nsets; ++set) { + // Doing this inside so that temp variables get reset correctly + // allocate space to store the occupation numbers, the eigenvalues, and the + // eigenvectors (MO vectors), as desired by the request + if(do_occupancies) { + madness::Tensor one(nmo[nsets-1]); + temp_occupancies = copy(one); + } + if(do_energies) { + madness::Tensor two(nmo[nsets - 1]); + temp_energies = copy(two); + } + if(do_MOs) { + madness::Tensor three(nmo[nsets - 1], nmo[nsets - 1]); + temp_MOs = copy(three); + } + + // first read the occupancies + // number of bits bookend (8 for double * nmo[set]); + num[0] = read_endian(in, swap_endian); + if(num[0] != static_cast(8*nmo[set])) { + err.get() << "Unexpected number of occupancies for set " << set << '.' + << std::endl; + throw errmess; + } + if(do_occupancies) + for(unsigned j = 0; j < nmo[set]; ++j) + temp_occupancies[j] = read_endian(in, swap_endian); + else + in.seekg(num[0], std::ios_base::cur); // just buzz past them. + num[1] = read_endian(in, swap_endian); + if(num[0] != num[1]) { + err.get() << "Error reading occupancies for set " << set << '.' << std::endl; + throw errmess; + } + + // next up are the eigenvalues (energies) + // number of bits bookend (8 for double * nmo[set]); + num[0] = read_endian(in, swap_endian); + if(num[0] != static_cast(8*nmo[set])) { + err.get() << "Unexpected number of energies for set " << set << '.' + << std::endl; + throw errmess; + } + if(do_energies) + for(unsigned j = 0; j < nmo[set]; ++j) + // NWChem reports energies in Hartrees + temp_energies[j] = read_endian(in, swap_endian); + else + in.seekg(num[0], std::ios_base::cur); // just buzz past them. + num[1] = read_endian(in, swap_endian); + if(num[0] != num[1]) { + err.get() << "Error reading energies for set " << set << '.' << std::endl; + throw errmess; + } + + // finally, read the MO vectors, which were written vector-by-vector + for(unsigned mo = 0; mo < nmo[set]; ++mo) { + // bookend size of the vector + num[0] = read_endian(in, swap_endian); + if(num[0] != static_cast(8*nbasis)) { + err.get() << "Unexpected number of coefficients in MO " << mo << " of set " + << set << '.' << std::endl; + throw errmess; + } + if(do_MOs) + for(unsigned coeff = 0; coeff < nbasis; ++coeff) + temp_MOs(coeff, mo) = read_endian(in, swap_endian); + else + in.seekg(num[0], std::ios_base::cur); // just buzz past the MO + // bookend size of the vector + num[1] = read_endian(in, swap_endian); + if(num[0] != num[1]) { + err.get() << "Error reading coefficients of MO " << mo << " of set " + << set << '.' << std::endl; + throw errmess; + } + } + + // move/swap the placeholders into the class's storage space + // ALPHA + if(do_occupancies && set == 0) { + my_occupancies = std::move(temp_occupancies); + my_properties = my_properties | Properties::Occupancies; + } + if(do_energies && set == 0) { + my_energies = std::move(temp_energies); + my_properties = my_properties | Properties::Energies; + } + if(do_MOs && set == 0) { + my_MOs = std::move(temp_MOs); + my_properties = my_properties | Properties::MOs; + } + + // move/swap the placeholders into the class's storage space + // BETA + if(do_occupancies && set == 1) { + my_beta_occupancies = std::move(temp_occupancies); + my_properties = my_properties | Properties::Occupancies; + } + if(do_energies && set == 1) { + my_beta_energies = std::move(temp_energies); + my_properties = my_properties | Properties::Energies; + } + if(do_MOs && set == 1) { + my_beta_MOs = std::move(temp_MOs); + my_properties = my_properties | Properties::MOs; + } + } + + // at the very end of the movecs file is the total energy and nuclear repulsion + // energy of the system + num[0] = read_endian(in, swap_endian); + if(num[0] != 16) { + err.get() << "Unexpected size reading the footer." << std::endl; + throw errmess; + } + read_endian(in, swap_endian); // total energy + read_endian(in, swap_endian); // nuclear repulsion + num[1] = read_endian(in, swap_endian); + if(num[1] != 16) { + err.get() << "Error reading the footer." << std::endl; + throw errmess; + } +} + +} // namespace slymer diff --git a/src/apps/moldft/NWChem.h b/src/apps/moldft/NWChem.h new file mode 100644 index 00000000000..b9981f6baf3 --- /dev/null +++ b/src/apps/moldft/NWChem.h @@ -0,0 +1,102 @@ +/* This file is a part of Slymer, which is distributed under the Creative + Commons Attribution-NonCommercial 4.0 International Public License. + + (c) 2017 Stony Brook University. */ + +/** + * \file ESInterface/NWChem.h + * \brief API and helper routines for interfacing with NWChem. + */ + +#ifndef __ESInterface_NWChem_h__ +#define __ESInterface_NWChem_h__ + +#include +#include +#include "ESInterface.h" +#include "gaussian.h" + +namespace slymer { + +/// Class for interfacing with NWChem (tested on version 6.6). +class NWChem_Interface : public ES_Interface { +protected: + /// The base file name of the NWChem output. + std::string my_fname; + + /// Storage for the actual basis functions. + std::vector> gaussians; + +public: + NWChem_Interface() = delete; + + /// Publically-accessible version of the file name. + const std::string &fname; + + /** + * \brief Wrap the output of a NWChem computation. + * + * The parameter is the base file name (potentially including path) for the + * NWChem output files. For example, the NWChem log file will be fname.out, + * the molecular orbitals file will be fname.movecs, etc. + * + * \param[in] fname_ Base file name for the NWChem computation. + * \param[in,out] err_ Output stream for error or warning messages. + */ + NWChem_Interface(const std::string &fname_, std::ostream &err_) + : ES_Interface(err_), my_fname(fname_), gaussians(0), fname(my_fname) {} + + /** + * \brief Changes the base file name. + * + * \param[in] fname_ The new base file name for the NWChem computation. + */ + void reset(const std::string &fname_) { + ES_Interface::reset(); + my_fname = fname_; + gaussians.clear(); + } + + /** + * \brief Read the specified properties and store them in the member variables. + * + * \throw std::invalid_argument if the NWChem logfile (fname.out) cannot be + * opened. + * \throw std::runtime_error if there is an error reading the NWChem output + * file. + * + * \param[in] props The properties to be read, using a bit flag combination. + */ + virtual void read(Properties::Properties props) override; + +protected: + /** + * \brief Extract and store the atom types and positions. + * + * \param[in,out] in The stream containing the NWChem output file. + */ + void read_atoms(std::istream &in); + + /** + * \brief Extract and store the basis set. + * + * \todo Reading Cartesian-type d and f shells has not been tested. + * \note Only shells of type s, p, d, and f are implemented. + * + * \param[in,out] in The stream containing the NWChem output file. + */ + void read_basis_set(std::istream &in); + + /** + * \brief Read the NWChem movecs file containing occupation numbers, + * MO energies, and MO coefficients. + * + * \param[in] props Properties to store from the read (from the list above). + * \param[in,out] in The stream for the NWChem output movecs file. + */ + void read_movecs(const Properties::Properties props, std::istream &in); +}; + +} // namespace slymer + +#endif diff --git a/src/apps/moldft/Plot_VTK.h b/src/apps/moldft/Plot_VTK.h new file mode 100644 index 00000000000..972c170d63d --- /dev/null +++ b/src/apps/moldft/Plot_VTK.h @@ -0,0 +1,77 @@ +/* My function to save a vtk file that visit can use + * + * Input params: + * + * npt_plot - number of points in each direction for plot + * L - box size + * plotlo - lowest orbital number to plot + * plothi - highest orbital number to plot + * molecule - molecule object, for creating the .xyz file + * densities - vector of densities to be ploted + * name - name you would like for orbital plots + */ +void do_vtk_plots(World& world, + int npt_plot, + double L, + int plotlo, + int plothi, + Molecule molecule, + std::vector densities, + std::string name) +{ + // Stuff needed to plot + std::string b; + const char* filename; + Vector points{npt_plot, npt_plot, npt_plot}; + + // Plot the whole box? + Vector box_lo{-L, -L,-L}; + Vector box_hi{ L, L, L}; + + // Write an .xyz file with current geometry (to deal with molecular reorientations that might occur) + FILE *f = 0; + b = "geometry.xyz"; + f = fopen(b.c_str(), "w"); + + // Write the header + fprintf(f,"%d", molecule.natom()); + fprintf(f,"\n\n"); + + // Get the data + std::vector< Vector > coords = molecule.get_all_coords_vec(); + + // Write the data + for(int i = 0; i < molecule.natom(); i++) + { + std::fprintf(f, "%5s %16.12f %16.12f %16.12f\n", atomic_number_to_symbol(molecule.get_atom_number(i)).c_str(), coords[i][0], coords[i][1], coords[i][2]); + } + + // Clean up + fclose(f); + + // Needed to plot the full electron density + real_function_3d rho = real_factory_3d(world); + + // Plot each orbital requested + for (int i = plotlo; i < plothi; i++) + { + // Add to total + rho += densities[i]; + + // Create filename in such a way that visit associates them together + b = name + "_" +std::to_string(i) + ".vts"; + filename = b.c_str(); + + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(densities[i], "electrondensity", world, filename, box_lo, box_hi, points, true, false); + plotvtk_end<3>(world, filename, true); + } + + // Plot the full density + b = "total-electrondensity.vts"; + filename= b.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(rho, "total-electrondensity", world, filename, box_lo, box_hi, points, true, false); + plotvtk_end<3>(world, filename, true); +} diff --git a/src/apps/moldft/basis.h b/src/apps/moldft/basis.h new file mode 100644 index 00000000000..96071927a04 --- /dev/null +++ b/src/apps/moldft/basis.h @@ -0,0 +1,70 @@ +/* This file is a part of Slymer, which is distributed under the Creative + Commons Attribution-NonCommercial 4.0 International Public License. + + (c) 2017 Stony Brook University. */ + +/** + * \file Basis/basis.h + * \brief Basis function API and routines. + * + * Sets up the interface for general basis functions and related calculations. + */ + +#ifndef __Basis_basis_h__ +#define __Basis_basis_h__ + +#include +#include +#include +#include +#include + +namespace slymer { + +/// Abstract base class for generic basis functions. +class BasisFunction { +public: + virtual ~BasisFunction() = default; + + /** + * \brief Evaluate the basis function at the specified point. + * + * \param[in] x The point. + * \return The basis function evaluated at the point x. + */ + virtual double operator() (const std::array &x) const = 0; + +}; + +/// Type for a basis set (collection of basis functions). +using BasisSet = std::vector>; + +/** + * \brief Convert a generic basis set to basis functions with the specific + * type. + * + * \throw std::runtime_error if a basis function in the basis set is not + * of the specified type. + * + * \tparam T The intended type of each basis function. + * \param[in] bset The basis set. + * \return A vector with cast references to the basis functions. + */ +template +std::vector> cast_basis(const BasisSet &bset) { + const unsigned size = bset.size(); + std::vector> casts; + + for(unsigned j = 0; j < size; ++j) { + const T *ptr = dynamic_cast(&bset[j].get()); + if(ptr == nullptr) + throw std::runtime_error("A basis function is not of the specified type."); + casts.emplace_back(std::cref(*ptr)); + } + + return casts; +} + +} // namespace slymer + +#endif diff --git a/src/apps/moldft/fcwf.cc b/src/apps/moldft/fcwf.cc new file mode 100644 index 00000000000..a8ce91f9772 --- /dev/null +++ b/src/apps/moldft/fcwf.cc @@ -0,0 +1,400 @@ +#include "fcwf.h" + +using namespace madness; + + + Fcwf::Fcwf(){ + m_initialized = false; + } + + + Fcwf::Fcwf(const complex_function_3d& wf1, + const complex_function_3d& wf2, + const complex_function_3d& wf3, + const complex_function_3d& wf4){ + MADNESS_ASSERT(m_psi.size() == 0); + m_psi.push_back(copy(wf1)); + m_psi.push_back(copy(wf2)); + m_psi.push_back(copy(wf3)); + m_psi.push_back(copy(wf4)); + m_initialized = true; + } + + Fcwf::Fcwf(World& world){ + MADNESS_ASSERT(m_psi.size() == 0); + for(int i = 0 ; i < 4 ; i ++){ + m_psi.push_back(complex_factory_3d(world)); + } + m_initialized = true; + } + + complex_function_3d& Fcwf::operator[](const int i){ + MADNESS_ASSERT(i >= 0 && i <= 3); + MADNESS_ASSERT(m_initialized); + return m_psi[i]; + } + + const complex_function_3d& Fcwf::operator[](const int i) const { + MADNESS_ASSERT(i >= 0 && i <= 3); + MADNESS_ASSERT(m_initialized); + return m_psi[i]; + } + + Fcwf::Fcwf(std::vector& phi){ + MADNESS_ASSERT(m_psi.size() == 0); + MADNESS_ASSERT(phi.size() == 4); + for(int i = 0 ; i < 4 ; i++){ + m_psi.push_back(copy(phi[i])); + } + m_initialized=true; + } + + bool Fcwf::getinitialize(){ + return m_initialized; + } + + bool Fcwf::getinitialize() const { + return m_initialized; + } + + unsigned int Fcwf::size(){ + MADNESS_ASSERT(m_initialized); + return m_psi.size(); + } + + unsigned int Fcwf::size() const { + MADNESS_ASSERT(m_initialized); + return m_psi.size(); + } + + //copy contructor defaults to deep copy + Fcwf::Fcwf(const Fcwf& phi){ + MADNESS_ASSERT(m_psi.size() == 0); + MADNESS_ASSERT(phi.size() == 4); + for(int i = 0 ; i < 4 ; i++){ + m_psi.push_back(copy(phi[i])); + } + m_initialized = true; + } + + //Assignment operator defaults to deep copy + Fcwf Fcwf::operator=(const Fcwf& phi){ + MADNESS_ASSERT(phi.getinitialize()); + if (this != &phi) { + if(m_psi.size() == 4){ + for(int i = 0 ; i < 4 ; i++){ + m_psi[i] = copy(phi[i]); + } + } + else { + MADNESS_ASSERT(m_psi.size() == 0); + for(int i = 0 ; i < 4 ; i++){ + m_psi.push_back(copy(phi[i])); + } + } + } + m_initialized = true; + return *this; + } + + Fcwf Fcwf::operator-(const Fcwf& phi) const { + MADNESS_ASSERT(phi.getinitialize()); + std::vector temp; + if(m_initialized){ + for(int i = 0 ; i < 4 ; i++){ + temp.push_back(m_psi[i] - phi[i]); + } + } + else { + for(int i = 0 ; i < 4 ; i++){ + temp.push_back(copy(phi[i])); + temp[i].scale(-1.0); + } + } + return Fcwf(temp); + } + + Fcwf Fcwf::operator+(const Fcwf& phi){ + MADNESS_ASSERT(phi.getinitialize()); + std::vector temp; + if(m_initialized){ + for(int i = 0 ; i < 4 ; i++){ + temp.push_back(m_psi[i] + phi[i]); + } + } + else { + for(int i = 0 ; i < 4 ; i++){ + temp.push_back(copy(phi[i])); + } + } + return Fcwf(temp); + } + + Fcwf Fcwf::operator*(std::complex a){ + //print("multiply1"); + MADNESS_ASSERT(m_initialized); + std::vector temp(4); + //print("multiply2"); + for(int i = 0 ; i < 4 ; i++){ + //print("multiply3, ",i); + temp[i] = a*m_psi[i]; + } + //print("multiply4"); + return Fcwf(temp); + } + + void Fcwf::scale(std::complex a){ + MADNESS_ASSERT(m_initialized); + for(int i = 0 ; i < 4 ; i++){ + m_psi[i] = a*m_psi[i]; + } + } + + Fcwf Fcwf::operator+=(const Fcwf& phi){ + if(m_initialized){ + for(int i = 0 ; i < 4 ; i++){ + m_psi[i] += phi[i]; + } + } + else { + MADNESS_ASSERT(m_psi.size()==0); + for(int i = 0 ; i < 4 ; i++){ + m_psi.push_back(copy(phi[i])); + } + m_initialized = true; + } + return *this; + } + + Fcwf Fcwf::operator-=(const Fcwf& phi){ + if(m_initialized){ + //print("inpl substract 1"); + for(int i = 0 ; i < 4 ; i++){ + //print("inpl subtract 2, ", i); + m_psi[i] -= phi[i]; + } + } + else { + //print("inpl subtract 3"); + MADNESS_ASSERT(m_psi.size()==0); + for(int i = 0 ; i < 4 ; i++){ + //print("inpl subtract 4, ",i); + m_psi.push_back(copy(phi[i])); + //print("inpl subtract 5, ",i); + m_psi[i].scale(-1.0); + } + //print("inpl subtract 6"); + m_initialized = true; + } + //print("inpl subtract 7"); + return *this; + } + + + double Fcwf::norm2(){ + MADNESS_ASSERT(m_initialized); + std::complex temp(0,0); + for(int i = 0 ; i < 4 ; i++){ + temp += madness::inner(m_psi[i],m_psi[i]); + } + return std::sqrt(std::real(temp)); + } + + void Fcwf::normalize(){ + MADNESS_ASSERT(m_initialized); + //print("normalize1"); + double norm = norm2(); + //print("normalize2", norm); + MADNESS_ASSERT(norm != 0.0); + for(int i = 0 ; i < 4 ; i++){ + //print("normalize3, ", i); + m_psi[i] = (1.0/norm)*m_psi[i]; + } + } + + Fcwf Fcwf::operator*(madness::complex_function_3d phi){ + MADNESS_ASSERT(m_initialized); + std::vector temp(4); + for(int i = 0 ; i < 4 ; i++){ + temp[i] = phi*m_psi[i]; + } + return Fcwf(temp); + } + + Fcwf Fcwf::operator*(madness::real_function_3d phi){ + MADNESS_ASSERT(m_initialized); + std::vector temp(4); + for(int i = 0 ; i < 4 ; i++){ + temp[i] = phi*m_psi[i]; + } + return Fcwf(temp); + } + + void Fcwf::truncate(){ + MADNESS_ASSERT(m_initialized); + for(int i = 0 ; i < 4 ; i++){ + m_psi[i].truncate(); + } + } + + +std::complex inner(const Fcwf& psi, const Fcwf& phi){ + //print("inner 1"); + std::complex result(0,0); + for(int i = 0 ; i < 4 ; i++){ + //print("inner 2, ",i); + result += madness::inner(psi[i],phi[i]); + } + //print("inner 3"); + return result; +} + +Fcwf apply(real_convolution_3d& op, const Fcwf& psi){ + std::vector temp; + for(int i = 0 ; i < 4 ; i++){ + temp.push_back(madness::apply(op, psi[i])); + } + return Fcwf(temp); +} + +real_function_3d squaremod(Fcwf psi){ + MADNESS_ASSERT(psi.getinitialize()); + real_function_3d temp = abssq(psi[0]) + abssq(psi[1]) + abssq(psi[2]) + abssq(psi[3]); + return temp; +} + +real_function_3d squaremod_small(Fcwf psi){ + MADNESS_ASSERT(psi.getinitialize()); + real_function_3d temp = abssq(psi[2]) + abssq(psi[3]); + return temp; +} + +real_function_3d squaremod_large(Fcwf psi){ + MADNESS_ASSERT(psi.getinitialize()); + real_function_3d temp = abssq(psi[0]) + abssq(psi[1]); + return temp; +} + +complex_function_3d inner_func(Fcwf psi, Fcwf phi){ + MADNESS_ASSERT(psi.getinitialize() && phi.getinitialize()); + complex_function_3d result = conj(psi[0])*phi[0]; + result += conj(psi[1])*phi[1]; + result += conj(psi[2])*phi[2]; + result += conj(psi[3])*phi[3]; + return result; +} + +Fcwf copy(Fcwf psi){ + return Fcwf(psi); + +} + +std::complex inner(std::vector a, std::vector b){ + //print("inner 1"); + MADNESS_ASSERT(a.size() == b.size()); + std::complex result(0,0); + for(int i = 0; i < a.size(); i++){ + //print("inner 2, i =", i); + result += inner(a[i],b[i]); + } + //print("inner 3"); + return result; +} + +std::vector operator*(std::vector psis, std::complex a){ + std::vector result; + //print("multiply 1"); + if(psis.size() != 0){ + for(int i = 0; i < psis.size(); i++){ + //print("multiply 2, ", i); + result.push_back(psis[i]*a); + } + } + //print("multiply 3"); + return result; +} + +std::vector operator*(std::complex a, std::vector psis){ + std::vector result; + //print("multiply 1"); + if(psis.size() != 0){ + for(int i = 0; i < psis.size(); i++){ + //print("multiply 2, ", i); + result.push_back(psis[i]*a); + } + } + //print("multiply 3"); + return result; +} + +void operator+=(std::vector& phi, std::vector psi){ + std::vector result; + //print("inplace add 1"); + if(phi.size()==0){ + //print("inplace add 2"); + phi = psi; + } + else if(psi.size() != 0){ + //print("inplace add 3"); + MADNESS_ASSERT(phi.size()==psi.size()); + for(int i=0; i < psi.size(); i++){ + //print("inplace add 4, i =", i); + phi[i]+=psi[i]; + } + } + //print("inplace add 5"); + return; +} + +std::vector operator-(std::vector phi, std::vector psi){ + std::vector result; + //print("subtract 1"); + if(phi.size()==0){ + //print("subtract 2"); + std::vector temp = -1.0*psi; + return temp; + } + else if(psi.size()==0){ + //print("subtract 3"); + return phi; + } + else{ + //print("subtract 4"); + MADNESS_ASSERT(phi.size()==psi.size()); + for(int i=0; i < psi.size(); i++){ + //print("subtract 5, i =", i ); + result.push_back(phi[i]-psi[i]); + } + } + //print("subtract 6"); + return result; +} + + //Constructor + Fcwf_vector_allocator::Fcwf_vector_allocator(World& world, unsigned int m_size) + : world(world) + , m_size(m_size) + {} + + //Overloading () operator + std::vector Fcwf_vector_allocator::operator()(){ + std::vector result; + for(int i=0; i < m_size; i++){ + result.push_back(Fcwf(world)); + } + return result; + } + + //Copy Constructor + //according to Bryan, according to Jakob, this is necessary for KAIN? + Fcwf_vector_allocator Fcwf_vector_allocator::operator=(const Fcwf_vector_allocator& other){ + Fcwf_vector_allocator tmp(world, other.m_size); + return tmp; + } + + void Fcwf_vector_allocator::set_size(int size){ + m_size = size; + } + + +//kthxbye diff --git a/src/apps/moldft/fcwf.h b/src/apps/moldft/fcwf.h new file mode 100644 index 00000000000..a3f9e1c1c73 --- /dev/null +++ b/src/apps/moldft/fcwf.h @@ -0,0 +1,110 @@ +#ifndef MADNESS_APPS_MOLDFT_FCWF_H_INCLUDED +#define MADNESS_APPS_MOLDFT_FCWF_H_INCLUDED + +#include +#include +#include +#include +#include + +using namespace madness; + +class Fcwf{ + std::vector m_psi; + bool m_initialized; + +public: + + Fcwf(); + + Fcwf(const complex_function_3d& wf1, + const complex_function_3d& wf2, + const complex_function_3d& wf3, + const complex_function_3d& wf4); + + Fcwf(World& world); + + complex_function_3d& operator[](const int i); + + const complex_function_3d& operator[](const int i) const ; + + Fcwf(std::vector& phi); + + bool getinitialize(); + + bool getinitialize() const ; + + unsigned int size(); + + unsigned int size() const ; + + Fcwf(const Fcwf& phi); + + Fcwf operator=(const Fcwf& phi); + + Fcwf operator-(const Fcwf& phi) const ; + + Fcwf operator+(const Fcwf& phi); + + Fcwf operator*(std::complex a); + + void scale(std::complex a); + + Fcwf operator+=(const Fcwf& phi); + + Fcwf operator-=(const Fcwf& phi); + + double norm2(); + + void normalize(); + + Fcwf operator*(madness::complex_function_3d phi); + + Fcwf operator*(madness::real_function_3d phi); + + void truncate(); + +}; + +std::complex inner(const Fcwf& psi, const Fcwf& phi); + +Fcwf apply(real_convolution_3d& op, const Fcwf& psi); + +real_function_3d squaremod(Fcwf psi); +real_function_3d squaremod_small(Fcwf psi); +real_function_3d squaremod_large(Fcwf psi); + +complex_function_3d inner_func(Fcwf psi, Fcwf phi); + +Fcwf copy(Fcwf psi); + +std::complex inner(std::vector a, std::vector b); + +std::vector operator*(std::vector psis, std::complex a); + +std::vector operator*(std::complex a, std::vector psis); + +void operator+=(std::vector& phi, std::vector psi); + +std::vector operator-(std::vector phi, std::vector psi); + +class Fcwf_vector_allocator { + World& world; + unsigned int m_size; + public: + //Constructor + Fcwf_vector_allocator(World& world, unsigned int m_size); + + //Overloading () operator + std::vector operator()(); + + //Copy Constructor + //according to Bryan, according to Jakob, this is necessary for KAIN? + Fcwf_vector_allocator operator=(const Fcwf_vector_allocator& other); + + void set_size(int size); +}; + +#endif + +//kthxbye diff --git a/src/apps/moldft/gaussian.cc b/src/apps/moldft/gaussian.cc new file mode 100644 index 00000000000..94ced60a3cf --- /dev/null +++ b/src/apps/moldft/gaussian.cc @@ -0,0 +1,1457 @@ +/* This file is a part of Slymer, which is distributed under the Creative + Commons Attribution-NonCommercial 4.0 International Public License. + + (c) 2017 Stony Brook University. */ + +/** + * \file Basis/gaussian.cc + * \brief Implementation of Gaussian basis function API and routines. + */ + +#include "../../madness.h" +#include "gaussian.h" +#include +#include +#include + +const static double pi = 4.*atan(1.); + +namespace slymer { + +/////////////////////////////////////////////////////////////////////////// +// CartesianPrimitive implementations +/////////////////////////////////////////////////////////////////////////// +PrimitiveGaussian::PrimitiveGaussian(const GaussianType &type, + const std::array ¢er, const double ec) + : prefactor(0), exppoly(2) { + + // make sure the decay constant is positive + if(ec <= 0.) + throw std::invalid_argument("Gaussian decay constant must be positive."); + + // set the exponent array; expand out (x-x0)^2 and similarly for y, z + exppoly[{{2,0,0}}] = -ec; + exppoly[{{1,0,0}}] = 2.*ec*center[0]; + exppoly[{{0,0,0}}] = -ec*center[0]*center[0]; + exppoly[{{0,2,0}}] = -ec; + exppoly[{{0,1,0}}] = 2.*ec*center[1]; + exppoly[{{0,0,0}}] += -ec*center[1]*center[1]; + exppoly[{{0,0,2}}] = -ec; + exppoly[{{0,0,1}}] = 2.*ec*center[2]; + exppoly[{{0,0,0}}] += -ec*center[2]*center[2]; + + if(type == GaussianType::s) { + prefactor[{{0,0,0}}] = pow(2.*ec/pi, 0.75); + } + else if(type == GaussianType::px) { + prefactor = PolynomialCoeffs(1); + prefactor[{{1,0,0}}] = 1.; + prefactor[{{0,0,0}}] = -center[0]; + prefactor *= pow(2.*ec/pi, 0.5) * 2.*pow(2.*ec*ec*ec/pi, 0.25); + } + else if(type == GaussianType::py) { + prefactor = PolynomialCoeffs(1); + prefactor[{{0,1,0}}] = 1.; + prefactor[{{0,0,0}}] = -center[1]; + prefactor *= pow(2.*ec/pi, 0.5) * 2.*pow(2.*ec*ec*ec/pi, 0.25); + } + else if(type == GaussianType::pz) { + prefactor = PolynomialCoeffs(1); + prefactor[{{0,0,1}}] = 1.; + prefactor[{{0,0,0}}] = -center[2]; + prefactor *= pow(2.*ec/pi, 0.5) * 2.*pow(2.*ec*ec*ec/pi, 0.25); + } + + // Cartesian and shared d-types + else if(type == GaussianType::dxx) { + prefactor = PolynomialCoeffs(2); + prefactor[{{2,0,0}}] = 1.; + prefactor[{{1,0,0}}] = -2. * center[0]; + prefactor[{{0,0,0}}] = center[0] * center[0]; + prefactor *= pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + } + else if(type == GaussianType::dxy) { + prefactor = PolynomialCoeffs(2); + prefactor[{{1,1,0}}] = 1.; + prefactor[{{1,0,0}}] = -center[1]; + prefactor[{{0,1,0}}] = -center[0]; + prefactor[{{0,0,0}}] = center[0] * center[1]; + prefactor *= pow(2.*ec/pi, 0.25) * 4.*pow(2.*ec*ec*ec/pi, 0.5); + } + else if(type == GaussianType::dxz) { + prefactor = PolynomialCoeffs(2); + prefactor[{{1,0,1}}] = 1.; + prefactor[{{1,0,0}}] = -center[2]; + prefactor[{{0,0,1}}] = -center[0]; + prefactor[{{0,0,0}}] = center[0] * center[2]; + prefactor *= pow(2.*ec/pi, 0.25) * 4.*pow(2.*ec*ec*ec/pi, 0.5); + } + else if(type == GaussianType::dyy) { + prefactor = PolynomialCoeffs(2); + prefactor[{{0,2,0}}] = 1.; + prefactor[{{0,1,0}}] = -2. * center[1]; + prefactor[{{0,0,0}}] = center[1] * center[1]; + prefactor *= pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + } + else if(type == GaussianType::dyz) { + prefactor = PolynomialCoeffs(2); + prefactor[{{0,1,1}}] = 1.; + prefactor[{{0,1,0}}] = -center[2]; + prefactor[{{0,0,1}}] = -center[1]; + prefactor[{{0,0,0}}] = center[1] * center[2]; + prefactor *= pow(2.*ec/pi, 0.25) * 4.*pow(2.*ec*ec*ec/pi, 0.5); + } + else if(type == GaussianType::dzz) { + prefactor = PolynomialCoeffs(2); + prefactor[{{0,0,2}}] = 1.; + prefactor[{{0,0,1}}] = -2. * center[2]; + prefactor[{{0,0,0}}] = center[2] * center[2]; + prefactor *= pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + } + + else if(type == GaussianType::fxxx) { + prefactor = PolynomialCoeffs(3); + prefactor[{{3,0,0}}] = 1.; + prefactor[{{2,0,0}}] = -3. * center[0]; + prefactor[{{1,0,0}}] = 3. * center[0] * center[0]; + prefactor[{{0,0,0}}] = -center[0] * center[0] * center[0]; + prefactor *= pow(2.*ec/pi, 0.5) * 8.*ec*pow(2.*ec*ec*ec/pi, 0.25)/sqrt(15.); + } + else if(type == GaussianType::fxxy) { + prefactor = PolynomialCoeffs(3); + prefactor[{{2,1,0}}] = 1.; + prefactor[{{2,0,0}}] = -center[1]; + prefactor[{{1,1,0}}] = -2. * center[0]; + prefactor[{{1,0,0}}] = 2. * center[0] * center[1]; + prefactor[{{0,1,0}}] = center[0] * center[0]; + prefactor[{{0,0,0}}] = -center[0] * center[0] * center[1]; + prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + } + else if(type == GaussianType::fxxz) { + prefactor = PolynomialCoeffs(3); + prefactor[{{2,0,1}}] = 1.; + prefactor[{{2,0,0}}] = -center[2]; + prefactor[{{1,0,1}}] = -2. * center[0]; + prefactor[{{1,0,0}}] = 2. * center[0] * center[2]; + prefactor[{{0,0,1}}] = center[0] * center[0]; + prefactor[{{0,0,0}}] = -center[0] * center[0] * center[2]; + prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + } + else if(type == GaussianType::fxyy) { + prefactor = PolynomialCoeffs(3); + prefactor[{{1,2,0}}] = 1.; + prefactor[{{0,2,0}}] = -center[0]; + prefactor[{{1,1,0}}] = -2. * center[1]; + prefactor[{{0,1,0}}] = 2. * center[0] * center[1]; + prefactor[{{1,0,0}}] = center[1] * center[1]; + prefactor[{{0,0,0}}] = -center[0] * center[1] * center[1]; + prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + } + else if(type == GaussianType::fxyz) { + prefactor = PolynomialCoeffs(3); + prefactor[{{1,1,1}}] = 1.; + prefactor[{{1,1,0}}] = -center[2]; + prefactor[{{1,0,1}}] = -center[1]; + prefactor[{{0,1,1}}] = -center[0]; + prefactor[{{1,0,0}}] = center[1] * center[2]; + prefactor[{{0,1,0}}] = center[0] * center[2]; + prefactor[{{0,0,1}}] = center[0] * center[1]; + prefactor[{{0,0,0}}] = -center[0] * center[1] * center[2]; + prefactor *= 8.*pow(2.*ec*ec*ec/pi, 0.75); + } + else if(type == GaussianType::fxzz) { + prefactor = PolynomialCoeffs(3); + prefactor[{{1,0,2}}] = 1.; + prefactor[{{0,0,2}}] = -center[0]; + prefactor[{{1,0,1}}] = -2. * center[2]; + prefactor[{{0,0,1}}] = 2. * center[0] * center[2]; + prefactor[{{1,0,0}}] = center[2] * center[2]; + prefactor[{{0,0,0}}] = -center[0] * center[2] * center[2]; + prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + } + else if(type == GaussianType::fyyy) { + prefactor = PolynomialCoeffs(3); + prefactor[{{0,3,0}}] = 1.; + prefactor[{{0,2,0}}] = -3. * center[1]; + prefactor[{{0,1,0}}] = 3. * center[1] * center[1]; + prefactor[{{0,0,0}}] = -center[1] * center[1] * center[1]; + prefactor *= pow(2.*ec/pi, 0.5) * 8.*ec*pow(2.*ec*ec*ec/pi, 0.25)/sqrt(15.); + } + else if(type == GaussianType::fyyz) { + prefactor = PolynomialCoeffs(3); + prefactor[{{0,2,1}}] = 1.; + prefactor[{{0,2,0}}] = -center[2]; + prefactor[{{0,1,1}}] = -2. * center[1]; + prefactor[{{0,1,0}}] = 2. * center[1] * center[2]; + prefactor[{{0,0,1}}] = center[1] * center[1]; + prefactor[{{0,0,0}}] = -center[1] * center[1] * center[2]; + prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + } + else if(type == GaussianType::fyzz) { + prefactor = PolynomialCoeffs(3); + prefactor[{{0,1,2}}] = 1.; + prefactor[{{0,0,2}}] = -center[1]; + prefactor[{{0,1,1}}] = -2. * center[2]; + prefactor[{{0,0,1}}] = 2. * center[1] * center[2]; + prefactor[{{0,1,0}}] = center[2] * center[2]; + prefactor[{{0,0,0}}] = -center[1] * center[2] * center[2]; + prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + } + else if(type == GaussianType::fzzz) { + prefactor = PolynomialCoeffs(3); + prefactor[{{0,0,3}}] = 1.; + prefactor[{{0,0,2}}] = -3. * center[2]; + prefactor[{{0,0,1}}] = 3. * center[2] * center[2]; + prefactor[{{0,0,0}}] = -center[2] * center[2] * center[2]; + prefactor *= pow(2.*ec/pi, 0.5) * 8.*ec*pow(2.*ec*ec*ec/pi, 0.25)/sqrt(15.); + } + + // spherical d orbitals + else if(type == GaussianType::dzzmrr) { + // setup as dzz - dxx/2 - dyy/2 + PolynomialCoeffs predxx(2), predyy(2), predzz(2); + predxx[{{2,0,0}}] = 1.; + predxx[{{1,0,0}}] = -2. * center[0]; + predxx[{{0,0,0}}] = center[0] * center[0]; + predxx *= -pow(2.*ec/pi, 0.5) * 2.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + predyy[{{0,2,0}}] = 1.; + predyy[{{0,1,0}}] = -2. * center[1]; + predyy[{{0,0,0}}] = center[1] * center[1]; + predyy *= -pow(2.*ec/pi, 0.5) * 2.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + predzz[{{0,0,2}}] = 1.; + predzz[{{0,0,1}}] = -2. * center[2]; + predzz[{{0,0,0}}] = center[2] * center[2]; + predzz *= pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); + prefactor = predxx + predyy + predzz; + } + else if(type == GaussianType::dxxmyy) { + // setup as sqrt(3)*dxx/2 - sqrt(3)*dyy/2 + PolynomialCoeffs predxx(2), predyy(2); + predxx[{{2,0,0}}] = 1.; + predxx[{{1,0,0}}] = -2. * center[0]; + predxx[{{0,0,0}}] = center[0] * center[0]; + predxx *= pow(2.*ec/pi, 0.5) * 2.*ec*pow(2.*ec/pi, 0.25); + predyy[{{0,2,0}}] = 1.; + predyy[{{0,1,0}}] = -2. * center[1]; + predyy[{{0,0,0}}] = center[1] * center[1]; + predyy *= -pow(2.*ec/pi, 0.5) * 2.*ec*pow(2.*ec/pi, 0.25); + prefactor = predxx + predyy; + } + + // spherical f orbitals + else if(type == GaussianType::fxyymxxx) { + // setup dxx and dyy, get (3dyy - dxx), normalize, and multiply by x + PolynomialCoeffs xfact(1), predxx(2), predyy(2); + xfact[{{1,0,0}}] = 1.; + xfact[{{0,0,0}}] = -center[0]; + predxx[{{2,0,0}}] = 1.; + predxx[{{1,0,0}}] = -2. * center[0]; + predxx[{{0,0,0}}] = center[0] * center[0]; + predxx *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.) * sqrt(0.5*ec); + predyy[{{0,2,0}}] = 1.; + predyy[{{0,1,0}}] = -2. * center[1]; + predyy[{{0,0,0}}] = center[1] * center[1]; + predyy *= sqrt(3.) * pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25) * sqrt(0.5*ec); + prefactor = xfact * (predxx + predyy); + } + else if(type == GaussianType::fxxzmyyz) { + // setup dxx and dyy, get (dxx - dyy), normalize, and multiply by z + PolynomialCoeffs zfact(1), predxx(2), predyy(2); + zfact[{{0,0,1}}] = 1.; + zfact[{{0,0,0}}] = -center[2]; + predxx[{{2,0,0}}] = 1.; + predxx[{{1,0,0}}] = -2. * center[0]; + predxx[{{0,0,0}}] = center[0] * center[0]; + predxx *= pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec); + predyy[{{0,2,0}}] = 1.; + predyy[{{0,1,0}}] = -2. * center[1]; + predyy[{{0,0,0}}] = center[1] * center[1]; + predyy *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec); + prefactor = zfact * (predxx + predyy); + } + else if(type == GaussianType::fxzzmrrx) { + // setup dxx, dyy, and dzz; get (4dzz-dxx-dyy); normalize; and multiply by x + PolynomialCoeffs xfact(1), predxx(2), predyy(2), predzz(2); + xfact[{{1,0,0}}] = 1.; + xfact[{{0,0,0}}] = -center[0]; + predxx[{{2,0,0}}] = 1.; + predxx[{{1,0,0}}] = -2. * center[0]; + predxx[{{0,0,0}}] = center[0] * center[0]; + predxx *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); + predyy[{{0,2,0}}] = 1.; + predyy[{{0,1,0}}] = -2. * center[1]; + predyy[{{0,0,0}}] = center[1] * center[1]; + predyy *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); + predzz[{{0,0,2}}] = 1.; + predzz[{{0,0,1}}] = -2. * center[2]; + predzz[{{0,0,0}}] = center[2] * center[2]; + predzz *= 4.*pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); + prefactor = xfact * (predxx + predyy + predzz); + } + else if(type == GaussianType::fzzzmrrz) { + // setup dxx, dyy, and dzz; get (2dzz-3dxx-3dyy); normalize; and multiply by z + PolynomialCoeffs zfact(1), predxx(2), predyy(2), predzz(2); + zfact[{{0,0,1}}] = 1.; + zfact[{{0,0,0}}] = -center[2]; + predxx[{{2,0,0}}] = 1.; + predxx[{{1,0,0}}] = -2. * center[0]; + predxx[{{0,0,0}}] = center[0] * center[0]; + predxx *= -pow(2.*ec/pi, 0.5) * 12.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec/15.); + predyy[{{0,2,0}}] = 1.; + predyy[{{0,1,0}}] = -2. * center[1]; + predyy[{{0,0,0}}] = center[1] * center[1]; + predyy *= -pow(2.*ec/pi, 0.5) * 12.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec/15.); + predzz[{{0,0,2}}] = 1.; + predzz[{{0,0,1}}] = -2. * center[2]; + predzz[{{0,0,0}}] = center[2] * center[2]; + predzz *= pow(2.*ec/pi, 0.5) * 8.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec/15.); + prefactor = zfact * (predxx + predyy + predzz); + } + else if(type == GaussianType::fyzzmrry) { + // setup dxx, dyy, and dzz; get (4dzz-dxx-dyy); normalize; and multiply by y + PolynomialCoeffs yfact(1), predxx(2), predyy(2), predzz(2); + yfact[{{0,1,0}}] = 1.; + yfact[{{0,0,0}}] = -center[1]; + predxx[{{2,0,0}}] = 1.; + predxx[{{1,0,0}}] = -2. * center[0]; + predxx[{{0,0,0}}] = center[0] * center[0]; + predxx *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); + predyy[{{0,2,0}}] = 1.; + predyy[{{0,1,0}}] = -2. * center[1]; + predyy[{{0,0,0}}] = center[1] * center[1]; + predyy *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); + predzz[{{0,0,2}}] = 1.; + predzz[{{0,0,1}}] = -2. * center[2]; + predzz[{{0,0,0}}] = center[2] * center[2]; + predzz *= pow(2.*ec/pi, 0.5) * 16.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); + prefactor = yfact * (predxx + predyy + predzz); + } + else if(type == GaussianType::fxxymyyy) { + // setup dxx and dyy, get (3dxx-dyy), normalize, and multiply by y + PolynomialCoeffs yfact(1), predxx(2), predyy(2); + yfact[{{0,1,0}}] = 1.; + yfact[{{0,0,0}}] = -center[1]; + predxx[{{2,0,0}}] = 1.; + predxx[{{1,0,0}}] = -2. * center[0]; + predxx[{{0,0,0}}] = center[0] * center[0]; + predxx *= pow(2.*ec/pi, 0.5) * 12.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec/6.); + predyy[{{0,2,0}}] = 1.; + predyy[{{0,1,0}}] = -2. * center[1]; + predyy[{{0,0,0}}] = center[1] * center[1]; + predyy *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec/6); + prefactor = yfact * (predxx + predyy); + } + + // Cartesian g orbitals + else if(type == GaussianType::gxxxx) { + prefactor = PolynomialCoeffs(4); + prefactor[{{4,0,0}}] = 1.; + prefactor[{{3,0,0}}] = -4. * center[0]; + prefactor[{{2,0,0}}] = 6. * center[0] * center[0]; + prefactor[{{1,0,0}}] = -4. * pow(center[0], 3); + prefactor[{{0,0,0}}] = pow(center[0], 4); + prefactor *= 16./sqrt(105.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gxxxy) { + prefactor = PolynomialCoeffs(4); + prefactor[{{3,1,0}}] = 1.; + prefactor[{{2,1,0}}] = -3. * center[0]; + prefactor[{{1,1,0}}] = 3. * center[0] * center[0]; + prefactor[{{0,1,0}}] = -pow(center[0], 3); + prefactor[{{3,0,0}}] = -center[1]; + prefactor[{{2,0,0}}] = 3. * center[0] * center[1]; + prefactor[{{1,0,0}}] = -3. * center[0] * center[0] * center[1]; + prefactor[{{0,0,0}}] = pow(center[0], 3) * center[1]; + prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gxxxz) { + prefactor = PolynomialCoeffs(4); + prefactor[{{3,0,1}}] = 1.; + prefactor[{{2,0,1}}] = -3. * center[0]; + prefactor[{{1,0,1}}] = 3. * center[0] * center[0]; + prefactor[{{0,0,1}}] = -pow(center[0], 3); + prefactor[{{3,0,0}}] = -center[2]; + prefactor[{{2,0,0}}] = 3. * center[0] * center[2]; + prefactor[{{1,0,0}}] = -3. * center[0] * center[0] * center[2]; + prefactor[{{0,0,0}}] = pow(center[0], 3) * center[2]; + prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gxxyy) { + prefactor = PolynomialCoeffs(4); + prefactor[{{2,2,0}}] = 1.; + prefactor[{{1,2,0}}] = -2. * center[0]; + prefactor[{{0,2,0}}] = center[0] * center[0]; + prefactor[{{2,1,0}}] = -2. * center[1]; + prefactor[{{1,1,0}}] = 4. * center[0] * center[1]; + prefactor[{{0,1,0}}] = -2. * center[0] * center[0] * center[1]; + prefactor[{{2,0,0}}] = center[1] * center[1]; + prefactor[{{1,0,0}}] = -2. * center[0] * center[1] * center[1]; + prefactor[{{0,0,0}}] = center[0] * center[0] * center[1] * center[1]; + prefactor *= 16./3. * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gxxyz) { + prefactor = PolynomialCoeffs(4); + prefactor[{{2,1,1}}] = 1.; + prefactor[{{1,1,1}}] = -2. * center[0]; + prefactor[{{0,1,1}}] = center[0] * center[0]; + prefactor[{{2,0,1}}] = -center[1]; + prefactor[{{1,0,1}}] = 2. * center[0] * center[1]; + prefactor[{{0,0,1}}] = -center[0] * center[0] * center[1]; + prefactor[{{2,1,0}}] = -center[2]; + prefactor[{{1,1,0}}] = 2. * center[0] * center[2]; + prefactor[{{0,1,0}}] = -center[0] * center[0] * center[2]; + prefactor[{{2,0,0}}] = center[1] * center[2]; + prefactor[{{1,0,0}}] = -2. * center[0] * center[1] * center[2]; + prefactor[{{0,0,0}}] = center[0] * center[0] * center[1] * center[2]; + prefactor *= 16./sqrt(3.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gxxzz) { + prefactor = PolynomialCoeffs(4); + prefactor[{{2,0,2}}] = 1.; + prefactor[{{1,0,2}}] = -2. * center[0]; + prefactor[{{0,0,2}}] = center[0] * center[0]; + prefactor[{{2,0,1}}] = -2. * center[2]; + prefactor[{{1,0,1}}] = 4. * center[0] * center[2]; + prefactor[{{0,0,1}}] = -2. * center[0] * center[0] * center[2]; + prefactor[{{2,0,0}}] = center[2] * center[2]; + prefactor[{{1,0,0}}] = -2. * center[0] * center[2] * center[2]; + prefactor[{{0,0,0}}] = center[0] * center[0] * center[2] * center[2]; + prefactor *= 16./3. * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gxyyy) { + prefactor = PolynomialCoeffs(4); + prefactor[{{1,3,0}}] = 1.; + prefactor[{{0,3,0}}] = -center[0]; + prefactor[{{1,2,0}}] = -3. * center[1]; + prefactor[{{0,2,0}}] = 3. * center[0] * center[1]; + prefactor[{{1,1,0}}] = 3. * center[1] * center[1]; + prefactor[{{0,1,0}}] = -3. * center[0] * center[1] * center[1]; + prefactor[{{1,0,0}}] = -pow(center[1], 3); + prefactor[{{0,0,0}}] = center[0] * pow(center[1], 3); + prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gxyyz) { + prefactor = PolynomialCoeffs(4); + prefactor[{{1,2,1}}] = 1.; + prefactor[{{0,2,1}}] = -center[0]; + prefactor[{{1,1,1}}] = -2. * center[1]; + prefactor[{{0,1,1}}] = 2. * center[0] * center[1]; + prefactor[{{1,0,1}}] = center[1] * center[1]; + prefactor[{{0,0,1}}] = -center[0] * center[1] * center[1]; + prefactor[{{1,2,0}}] = -center[2]; + prefactor[{{0,2,0}}] = center[0] * center[2]; + prefactor[{{1,1,0}}] = 2. * center[1] * center[2]; + prefactor[{{0,1,0}}] = -2. * center[0] * center[1] * center[2]; + prefactor[{{1,0,0}}] = -center[1] * center[1] * center[2]; + prefactor[{{0,0,0}}] = center[0] * center[1] * center[1] * center[2]; + prefactor *= 16./sqrt(3.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gxyzz) { + prefactor = PolynomialCoeffs(4); + prefactor[{{1,1,2}}] = 1.; + prefactor[{{0,1,2}}] = -center[0]; + prefactor[{{1,0,2}}] = -center[1]; + prefactor[{{0,0,2}}] = center[0] * center[1]; + prefactor[{{1,1,1}}] = -2. * center[2]; + prefactor[{{0,1,1}}] = 2. * center[0] * center[2]; + prefactor[{{1,0,1}}] = 2. * center[1] * center[2]; + prefactor[{{0,0,1}}] = -2. * center[0] * center[1] * center[2]; + prefactor[{{1,1,0}}] = center[2] * center[2]; + prefactor[{{0,1,0}}] = -center[0] * center[2] * center[2]; + prefactor[{{1,0,0}}] = -center[1] * center[2] * center[2]; + prefactor[{{0,0,0}}] = center[0] * center[1] * center[2] * center[2]; + prefactor *= 16./sqrt(3.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gxzzz) { + prefactor = PolynomialCoeffs(4); + prefactor[{{1,0,3}}] = 1.; + prefactor[{{0,0,3}}] = -center[0]; + prefactor[{{1,0,2}}] = -3. * center[2]; + prefactor[{{0,0,2}}] = 3. * center[0] * center[2]; + prefactor[{{1,0,1}}] = 3. * center[2] * center[2]; + prefactor[{{0,0,1}}] = -3. * center[0] * center[2] * center[2]; + prefactor[{{1,0,0}}] = -pow(center[2], 3); + prefactor[{{0,0,0}}] = center[0] * pow(center[2], 3); + prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gyyyy) { + prefactor = PolynomialCoeffs(4); + prefactor[{{0,4,0}}] = 1.; + prefactor[{{0,3,0}}] = -4. * center[1]; + prefactor[{{0,2,0}}] = 6. * center[1] * center[1]; + prefactor[{{0,1,0}}] = -4. * pow(center[1], 3); + prefactor[{{0,0,0}}] = + pow(center[1], 4); + prefactor *= 16./sqrt(105.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gyyyz) { + prefactor = PolynomialCoeffs(4); + prefactor[{{0,3,1}}] = 1.; + prefactor[{{0,2,1}}] = -3. * center[1]; + prefactor[{{0,1,1}}] = 3. * center[1] * center[1]; + prefactor[{{0,0,1}}] = -pow(center[1], 3); + prefactor[{{0,3,0}}] = -center[2]; + prefactor[{{0,2,0}}] = 3. * center[1] * center[2]; + prefactor[{{0,1,0}}] = -3. * center[1] * center[1] * center[2]; + prefactor[{{0,0,0}}] = pow(center[1], 3) * center[2]; + prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gyyzz) { + prefactor = PolynomialCoeffs(4); + prefactor[{{0,2,2}}] = 1.; + prefactor[{{0,1,2}}] = -2. * center[1]; + prefactor[{{0,0,2}}] = center[1] * center[1]; + prefactor[{{0,2,1}}] = -2. * center[2]; + prefactor[{{0,1,1}}] = 4. * center[1] * center[2]; + prefactor[{{0,0,1}}] = -2. * center[1] * center[1] * center[2]; + prefactor[{{0,2,0}}] = center[2] * center[2]; + prefactor[{{0,1,0}}] = -2. * center[1] * center[2] * center[2]; + prefactor[{{0,0,0}}] = center[1] * center[1] * center[2] * center[2]; + prefactor *= 16./3. * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gyzzz) { + prefactor = PolynomialCoeffs(4); + prefactor[{{0,1,3}}] = 1.; + prefactor[{{0,0,3}}] = -center[1]; + prefactor[{{0,1,2}}] = -3. * center[2]; + prefactor[{{0,0,2}}] = 3. * center[1] * center[2]; + prefactor[{{0,1,1}}] = 3. * center[2] * center[2]; + prefactor[{{0,0,1}}] = -3. * center[1] * center[2] * center[2]; + prefactor[{{0,1,0}}] = -pow(center[2], 3); + prefactor[{{0,0,0}}] = center[1] * pow(center[2], 3); + prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + else if(type == GaussianType::gzzzz) { + prefactor = PolynomialCoeffs(4); + prefactor[{{0,0,4}}] = 1.; + prefactor[{{0,0,3}}] = -4. * center[2]; + prefactor[{{0,0,2}}] = 6. * center[2] * center[2]; + prefactor[{{0,0,1}}] = -4. * pow(center[2], 3); + prefactor[{{0,0,0}}] = pow(center[2], 4); + prefactor *= 16./sqrt(105.) * pow(ec, 2.75) * pow(2./pi, 0.75); + } + + // spherical g orbitals + // (l,m) = (4,-4) + else if(type == GaussianType::gxydx2my2 ) { + // get (xx-yy), multiply by xy, normalize + PolynomialCoeffs xx(2), yy(2), x(1), y(1); + x[{{1,0,0}}] = 1.; + x[{{0,0,0}}] = -center[0]; + y[{{0,1,0}}] = 1.; + y[{{0,0,0}}] = -center[1]; + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + double norm = 8./sqrt(3.) * pow(ec, 2.75) * pow(2./pi, 0.75); + prefactor = norm * x * y * (xx + (-1. * yy)); + } + // (l,m) = (4,-3) + else if(type == GaussianType::gyzdx2my2) { + // get (3xx - yy), multiply by y*z, normalize + PolynomialCoeffs xx(2), yy(2), y(1), z(1); + y[{{0,1,0}}] = 1.; + y[{{0,0,0}}] = -center[1]; + z[{{0,0,1}}] = 1.; + z[{{0,0,0}}] = -center[2]; + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + double norm = 8./sqrt(3.) * pow(ec, 2.75) * pow(2., 0.25) * pow(1./pi, 0.75); + prefactor = norm * y * z * (3. * xx + (-1. * yy)); + } + // (l,m) = (4,-2) + else if(type == GaussianType::gxydz2mr2) { + // get (7zz - rr), multiply by x*y, normalize + PolynomialCoeffs zz(2), rr(2), x(1), y(1); + x[{{1,0,0}}] = 1.; + x[{{0,0,0}}] = -center[0]; + y[{{0,1,0}}] = 1.; + y[{{0,0,0}}] = -center[1]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + rr[{{2,0,0}}] = 1.; + rr[{{1,0,0}}] = -2. * center[0]; + rr[{{0,2,0}}] = 1.; + rr[{{0,1,0}}] = -2. * center[1]; + rr[{{0,0,2}}] = 1.; + rr[{{0,0,1}}] = -2. * center[2]; + rr[{{0,0,0}}] = center[0] * center[0] + center[1] * center[1] + center[2] * center[2]; + double norm = 8./sqrt(21.) * pow(ec, 2.75) * pow(2./pi, 0.75); + prefactor = norm * x * y * (7. * zz + (-1. * rr)); + } + // (l,m) = (4,-1) + else if(type == GaussianType::gyzdz2mr2) { + // get (7zz - 3rr), multiply by y*z, normalize + PolynomialCoeffs zz(2), rr(2), y(1), z(1); + y[{{0,1,0}}] = 1.; + y[{{0,0,0}}] = -center[1]; + z[{{0,0,1}}] = 1.; + z[{{0,0,0}}] = -center[2]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + rr[{{2,0,0}}] = 1.; + rr[{{1,0,0}}] = -2. * center[0]; + rr[{{0,2,0}}] = 1.; + rr[{{0,1,0}}] = -2. * center[1]; + rr[{{0,0,2}}] = 1.; + rr[{{0,0,1}}] = -2. * center[2]; + rr[{{0,0,0}}] = center[0] * center[0] + center[1] * center[1] + center[2] * center[2]; + double norm = 8./sqrt(21.) * pow(2., 0.25) * pow(ec, 2.75) * pow(1./pi, 0.75); + prefactor = norm * y * z * (7. * zz + (-3. * rr)); + } + // (l,m) = (4,0) + else if(type == GaussianType::gzero) { + // we want: 3x^4 + 6x^2y^2 + 3y^4 - 24x^2z^2 - 24y^2z^2 + 8z^4 + PolynomialCoeffs x4(4), y4(4), z4(4), xx(2), yy(2), zz(2); + x4[{{4,0,0}}] = 1.; + x4[{{3,0,0}}] = -4. * center[0]; + x4[{{2,0,0}}] = 6. * pow(center[0], 2); + x4[{{1,0,0}}] = -4. * pow(center[0], 3); + x4[{{0,0,0}}] = pow(center[0], 4); + y4[{{0,4,0}}] = 1.; + y4[{{0,3,0}}] = -4. * center[1]; + y4[{{0,2,0}}] = 6. * pow(center[1], 2); + y4[{{0,1,0}}] = -4. * pow(center[1], 3); + y4[{{0,0,0}}] = pow(center[1], 4); + z4[{{0,0,4}}] = 1.; + z4[{{0,0,3}}] = -4. * center[2]; + z4[{{0,0,2}}] = 6. * pow(center[2], 2); + z4[{{0,0,1}}] = -4. * pow(center[2], 3); + z4[{{0,0,0}}] = pow(center[2], 4); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = pow(center[0], 2); + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = pow(center[1], 2); + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = pow(center[2], 2); + double norm = 2./sqrt(105.) * pow(ec, 2.75) * pow(2./pi, 0.75); + prefactor = norm * (3.*x4 + 3.*y4 + 8.*z4 + 6.*xx*yy + (-24.*xx*zz) + (-24.*yy*zz)); + } + // (l,m) = (4,1) + else if(type == GaussianType::gxzdz2mr2) { + // get (7zz - 3rr), multiply by x*z, normalize + PolynomialCoeffs zz(2), rr(2), x(1), z(1); + x[{{1,0,0}}] = 1.; + x[{{0,0,0}}] = -center[0]; + z[{{0,0,1}}] = 1.; + z[{{0,0,0}}] = -center[2]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + rr[{{2,0,0}}] = 1.; + rr[{{1,0,0}}] = -2. * center[0]; + rr[{{0,2,0}}] = 1.; + rr[{{0,1,0}}] = -2. * center[1]; + rr[{{0,0,2}}] = 1.; + rr[{{0,0,1}}] = -2. * center[2]; + rr[{{0,0,0}}] = center[0] * center[0] + center[1] * center[1] + center[2] * center[2]; + double norm = 8./sqrt(21.) * pow(2, 0.25) * pow(ec, 2.75) * pow(1./pi, 0.75); + // Testing shows nwchem uses the negative + prefactor = (-1.) * norm * x * z * (7.*zz + (-3.*rr)); + } + // (l,m) = (4,2) + else if(type == GaussianType::gx2my2dz2mr2) { + // get (7zz - rr) and (xx - yy), multiply together, normalize + PolynomialCoeffs xx(2), yy(2), zz(2), rr(2); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + rr[{{2,0,0}}] = 1.; + rr[{{1,0,0}}] = -2. * center[0]; + rr[{{0,2,0}}] = 1.; + rr[{{0,1,0}}] = -2. * center[1]; + rr[{{0,0,2}}] = 1.; + rr[{{0,0,1}}] = -2. * center[2]; + rr[{{0,0,0}}] = center[0] * center[0] + center[1] * center[1] + center[2] * center[2]; + double norm = 4./sqrt(21.) * pow(ec, 2.75) * pow(2./pi, 0.75); + prefactor = norm * (xx + (-1*yy)) * (7.*zz + (-1.*rr)); + } + // (l,m) = (4,3) + else if(type == GaussianType::gxzdx2my2) { + // get (xx - 3yy), multiply by xz, normalize + PolynomialCoeffs xx(2), yy(2), x(1), z(1); + x[{{1,0,0}}] = 1.; + x[{{0,0,0}}] = -center[0]; + z[{{0,0,1}}] = 1.; + z[{{0,0,0}}] = -center[2]; + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + double norm = 8./sqrt(3.) * pow(2., 0.25) * pow(ec, 2.75) * pow(1./pi, 0.75); + // Testing shows nwchem uses the negative + prefactor = norm * x * z * (3.*yy + -1.*xx); + } + // (l,m) = (4,4) + else if(type == GaussianType::gx4mx2y2py4) { + // we want: x^4 - 6x^2y^2 + y^4, then normalize + PolynomialCoeffs x4(4), y4(4), xx(2), yy(2); + x4[{{4,0,0}}] = 1.; + x4[{{3,0,0}}] = -4. * center[0]; + x4[{{2,0,0}}] = 6. * center[0] * center[0]; + x4[{{1,0,0}}] = -4. * pow(center[0], 3); + x4[{{0,0,0}}] = pow(center[0], 4); + y4[{{0,4,0}}] = 1.; + y4[{{0,3,0}}] = -4 * center[1]; + y4[{{0,2,0}}] = 6. * center[1] * center[1]; + y4[{{0,1,0}}] = -4. * pow(center[1], 3); + y4[{{0,0,0}}] = pow(center[1], 4); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + double norm = 2./sqrt(3.) * pow(ec, 2.75) * pow(2./pi, 0.75); + prefactor = norm * (x4 + (-6.*xx*yy) + y4); + } + + // Cartesian h orbitals + else if(type == GaussianType::hxxxxx) { + prefactor = PolynomialCoeffs(5); + prefactor[{{5,0,0}}] = 1.; + prefactor[{{4,0,0}}] = -5. * center[0]; + prefactor[{{3,0,0}}] = 10. * center[0] * center[0]; + prefactor[{{2,0,0}}] = -10. * pow(center[0], 3); + prefactor[{{1,0,0}}] = 5. * pow(center[0], 4); + prefactor[{{0,0,0}}] = -pow(center[0], 5); + prefactor *= 32./(3.*sqrt(105.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxxxxy) { + prefactor = PolynomialCoeffs(5); + prefactor[{{4,1,0}}] = 1.; + prefactor[{{3,1,0}}] = -4. * center[0]; + prefactor[{{2,1,0}}] = 6. * center[0] * center[0]; + prefactor[{{1,1,0}}] = -4. * pow(center[0], 3); + prefactor[{{0,1,0}}] = pow(center[0], 4); + prefactor[{{4,0,0}}] = -1. * center[1]; + prefactor[{{3,0,0}}] = 4. * center[0] * center[1]; + prefactor[{{2,0,0}}] = -6. * center[0] * center[0] * center[1]; + prefactor[{{1,0,0}}] = 4. * pow(center[0], 3) * center[1]; + prefactor[{{0,0,0}}] = -pow(center[0], 4) * center[1]; + prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxxxxz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{4,0,1}}] = 1.; + prefactor[{{3,0,1}}] = -4. * center[0]; + prefactor[{{2,0,1}}] = 6. * center[0] * center[0]; + prefactor[{{1,0,1}}] = -4. * pow(center[0], 3); + prefactor[{{0,0,1}}] = pow(center[0], 4); + prefactor[{{4,0,0}}] = -center[2]; + prefactor[{{3,0,0}}] = 4. * center[0] * center[2]; + prefactor[{{2,0,0}}] = -6. * center[0] * center[0] * center[2]; + prefactor[{{1,0,0}}] = 4. * pow(center[0], 3) * center[2]; + prefactor[{{0,0,0}}] = -pow(center[0], 4) * center[2]; + prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxxxyy) { + prefactor = PolynomialCoeffs(5); + prefactor[{{3,2,0}}] = 1.; + prefactor[{{2,2,0}}] = -3. * center[0]; + prefactor[{{1,2,0}}] = 3. * center[0] * center[0]; + prefactor[{{0,2,0}}] = -pow(center[0], 3); + prefactor[{{3,1,0}}] = -2. * center[1]; + prefactor[{{2,1,0}}] = 6. * center[0] * center[1]; + prefactor[{{1,1,0}}] = -6. * center[0] * center[0] * center[1]; + prefactor[{{0,1,0}}] = 2. * pow(center[0], 3) * center[1]; + prefactor[{{3,0,0}}] = center[1] * center[1]; + prefactor[{{2,0,0}}] = -3. * center[0] * center[1] * center[1]; + prefactor[{{1,0,0}}] = 3. * center[0] * center[0] * center[1] * center[1]; + prefactor[{{0,0,0}}] = -pow(center[0], 3) * center[1] * center[1]; + prefactor *= 32./(3.*sqrt(5.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxxxyz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{3,1,1}}] = 1.; + prefactor[{{2,1,1}}] = -3. * center[0]; + prefactor[{{1,1,1}}] = 3. * center[0] * center[0]; + prefactor[{{0,1,1}}] = -pow(center[0], 3); + prefactor[{{3,0,1}}] = -center[1]; + prefactor[{{2,0,1}}] = 3. * center[0] * center[1]; + prefactor[{{1,0,1}}] = -3. * center[0] * center[0] * center[1]; + prefactor[{{0,0,1}}] = pow(center[0], 3) * center[1]; + prefactor[{{3,1,0}}] = -center[2]; + prefactor[{{2,1,0}}] = 3. * center[0] * center[2]; + prefactor[{{1,1,0}}] = -3. * center[0] * center[0] * center[2]; + prefactor[{{0,1,0}}] = pow(center[0], 3) * center[2]; + prefactor[{{3,0,0}}] = center[1] * center[2]; + prefactor[{{2,0,0}}] = -3. * center[0] * center[1] * center[2]; + prefactor[{{1,0,0}}] = 3. * center[0] * center[0] * center[1] * center[2]; + prefactor[{{0,0,0}}] = -pow(center[0], 3) * center[1] * center[2]; + prefactor *= 32./sqrt(15.) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxxxzz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{3,0,2}}] = 1.; + prefactor[{{2,0,2}}] = -3. * center[0]; + prefactor[{{1,0,2}}] = 3. * center[0] * center[0]; + prefactor[{{0,0,2}}] = -pow(center[0], 3); + prefactor[{{3,0,1}}] = -2. * center[2]; + prefactor[{{2,0,1}}] = 6. * center[0] * center[2]; + prefactor[{{1,0,1}}] = -6. * center[0] * center[0] * center[2]; + prefactor[{{0,0,1}}] = 2. * pow(center[0], 3) * center[2]; + prefactor[{{3,0,0}}] = center[2] * center[2]; + prefactor[{{2,0,0}}] = -3. * center[0] * center[2] * center[2]; + prefactor[{{1,0,0}}] = 3. * center[0] * center[0] * center[2] * center[2]; + prefactor[{{0,0,0}}] = -pow(center[0], 3) * center[2] * center[2]; + prefactor *= 32./(3.*sqrt(5.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxxyyy) { + prefactor = PolynomialCoeffs(5); + prefactor[{{2,3,0}}] = 1.; + prefactor[{{1,3,0}}] = -2. * center[0]; + prefactor[{{0,3,0}}] = center[0] * center[0]; + prefactor[{{2,2,0}}] = -3. * center[1]; + prefactor[{{1,2,0}}] = 6. * center[0] * center[1]; + prefactor[{{0,2,0}}] = -3. * center[0] * center[0] * center[1]; + prefactor[{{2,1,0}}] = 3. * center[1] * center[1]; + prefactor[{{1,1,0}}] = -6. * center[0] * center[1] * center[1]; + prefactor[{{0,1,0}}] = 3. * center[0] * center[0] * center[1] * center[1]; + prefactor[{{2,0,0}}] = -pow(center[1], 3); + prefactor[{{1,0,0}}] = 2. * center[0] * pow(center[1], 3); + prefactor[{{0,0,0}}] = -center[0] * center[0] * pow(center[1], 3); + prefactor *= 32./(3.*sqrt(5)) * pow(ec, 13./4) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxxyyz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{2,2,1}}] = 1.; + prefactor[{{1,2,1}}] = -2. * center[0]; + prefactor[{{0,2,1}}] = center[0] * center[0]; + prefactor[{{2,1,1}}] = -2. * center[1]; + prefactor[{{1,1,1}}] = 4. * center[0] * center[1]; + prefactor[{{0,1,1}}] = -2. * center[0] * center[0] * center[1]; + prefactor[{{2,0,1}}] = center[1] * center[1]; + prefactor[{{1,0,1}}] = -2. * center[0] * center[1] * center[1]; + prefactor[{{0,0,1}}] = center[0] * center[0] * center[1] * center[1]; + prefactor[{{2,2,0}}] = -center[2]; + prefactor[{{1,2,0}}] = 2. * center[0] * center[2]; + prefactor[{{0,2,0}}] = -center[0] * center[0] * center[2]; + prefactor[{{2,1,0}}] = 2. * center[1] * center[2]; + prefactor[{{1,1,0}}] = -4. * center[0] * center[1] * center[2]; + prefactor[{{0,1,0}}] = 2. * center[0] * center[0] * center[1] * center[2]; + prefactor[{{2,0,0}}] = -center[1] * center[1] * center[2]; + prefactor[{{1,0,0}}] = 2. * center[0] * center[1] * center[1] * center[2]; + prefactor[{{0,0,0}}] = -center[0] * center[0] * center[1] * center[1] * center[2]; + prefactor *= 32./3. * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxxyzz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{2,1,2}}] = 1.; + prefactor[{{1,1,2}}] = -2. * center[0]; + prefactor[{{0,1,2}}] = center[0] * center[0]; + prefactor[{{2,0,2}}] = -center[1]; + prefactor[{{1,0,2}}] = 2. * center[0] * center[1]; + prefactor[{{0,0,2}}] = -center[0] * center[0] * center[1]; + prefactor[{{2,1,1}}] = -2. * center[2]; + prefactor[{{1,1,1}}] = 4. * center[0] * center[2]; + prefactor[{{0,1,1}}] = -2. * center[0] * center[0] * center[2]; + prefactor[{{2,0,1}}] = 2. * center[1] * center[2]; + prefactor[{{1,0,1}}] = -4. * center[0] * center[1] * center[2]; + prefactor[{{0,0,1}}] = 2. * center[0] * center[0] * center[1] * center[2]; + prefactor[{{2,1,0}}] = center[2] * center[2]; + prefactor[{{1,1,0}}] = -2. * center[0] * pow(center[2], 2); + prefactor[{{0,1,0}}] = center[0] * center[0] * center[2] * center[2]; + prefactor[{{2,0,0}}] = -center[1] * center[2] * center[2]; + prefactor[{{1,0,0}}] = 2. * center[0] * center[1] * center[2] * center[2]; + prefactor[{{0,0,0}}] = -center[0] * center[0] * center[1] * center[2] * center[2]; + prefactor *= 32./3. * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxxzzz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{2,0,3}}] = 1.; + prefactor[{{1,0,3}}] = -2. * center[0]; + prefactor[{{0,0,3}}] = center[0] * center[0]; + prefactor[{{2,0,2}}] = -3. * center[2]; + prefactor[{{1,0,2}}] = 6. * center[0] * center[2]; + prefactor[{{0,0,2}}] = -3. * center[0] * center[0] * center[2]; + prefactor[{{2,0,1}}] = 3. * center[2] * center[2]; + prefactor[{{1,0,1}}] = -6. * center[0] * center[2] * center[2]; + prefactor[{{0,0,1}}] = 3. * center[0] * center[0] * center[2] * center[2]; + prefactor[{{2,0,0}}] = -pow(center[2], 3); + prefactor[{{1,0,0}}] = 2. * center[0] * pow(center[2], 3); + prefactor[{{0,0,0}}] = -center[0] * center[0] * pow(center[2], 3); + prefactor *= 32./(3.*sqrt(5.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxyyyy) { + prefactor = PolynomialCoeffs(5); + prefactor[{{1,4,0}}] = 1.; + prefactor[{{0,4,0}}] = -center[0]; + prefactor[{{1,3,0}}] = -4. * center[1]; + prefactor[{{0,3,0}}] = 4. * center[0] * center[1]; + prefactor[{{1,2,0}}] = 6. * center[1] * center[1]; + prefactor[{{0,2,0}}] = -6. * center[0] * center[1] * center[1]; + prefactor[{{1,1,0}}] = -4. * pow(center[1], 3); + prefactor[{{0,1,0}}] = 4. * center[0] * pow(center[1], 3); + prefactor[{{1,0,0}}] = pow(center[1], 4); + prefactor[{{0,0,0}}] = -center[0] * pow(center[1], 4); + prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxyyyz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{1,3,1}}] = 1.; + prefactor[{{0,3,1}}] = -center[0]; + prefactor[{{1,2,1}}] = -3. * center[1]; + prefactor[{{0,2,1}}] = 3. * center[0] * center[1]; + prefactor[{{1,1,1}}] = 3. * center[1] * center[1]; + prefactor[{{0,1,1}}] = -3. * center[0] * center[1] * center[1]; + prefactor[{{1,0,1}}] = -pow(center[1], 3); + prefactor[{{0,0,1}}] = center[0] * pow(center[1], 3); + prefactor[{{1,3,0}}] = -center[2]; + prefactor[{{0,3,0}}] = center[0] * center[2]; + prefactor[{{1,2,0}}] = 3. * center[1] * center[2]; + prefactor[{{0,2,0}}] = -3. * center[0] * center[1] * center[2]; + prefactor[{{1,1,0}}] = -3. * center[1] * center[1] * center[2]; + prefactor[{{0,1,0}}] = 3. * center[0] * center[1] * center[1] * center[2]; + prefactor[{{1,0,0}}] = pow(center[1], 3) * center[2]; + prefactor[{{0,0,0}}] = -center[0] * pow(center[1], 3) * center[2]; + prefactor *= 32./sqrt(15.) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxyyzz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{1,2,2}}] = 1.; + prefactor[{{0,2,2}}] = -center[0]; + prefactor[{{1,1,2}}] = -2. * center[1]; + prefactor[{{0,1,2}}] = 2. * center[0] * center[1]; + prefactor[{{1,0,2}}] = center[1] * center[1]; + prefactor[{{0,0,2}}] = -center[0] * pow(center[1], 2); + prefactor[{{1,2,1}}] = -2. * center[2]; + prefactor[{{0,2,1}}] = 2. * center[0] * center[2]; + prefactor[{{1,1,1}}] = 4. * center[1] * center[2]; + prefactor[{{0,1,1}}] = -4. * center[0] * center[1] * center[2]; + prefactor[{{1,0,1}}] = -2. * center[1] * center[1] * center[2]; + prefactor[{{0,0,1}}] = 2. * center[0] * center[1] * center[1] * center[2]; + prefactor[{{1,2,0}}] = center[2] * center[2]; + prefactor[{{0,2,0}}] = -center[0] * center[2] * center[2]; + prefactor[{{1,1,0}}] = -2. * center[1] * center[2] * center[2]; + prefactor[{{0,1,0}}] = 2. * center[0] * center[1] * center[2] * center[2]; + prefactor[{{1,0,0}}] = center[1] * center[1] * center[2] * center[2]; + prefactor[{{0,0,0}}] = -center[0] * center[1] * center[1] * center[2] * center[2]; + prefactor *= 32./3. * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxyzzz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{1,1,3}}] = 1.; + prefactor[{{0,1,3}}] = -center[0]; + prefactor[{{1,0,3}}] = -center[1]; + prefactor[{{0,0,3}}] = center[0] * center[1]; + prefactor[{{1,1,2}}] = -3. * center[2]; + prefactor[{{0,1,2}}] = 3. * center[0] * center[2]; + prefactor[{{1,0,2}}] = 3. * center[1] * center[2]; + prefactor[{{0,0,2}}] = -3. * center[0] * center[1] * center[2]; + prefactor[{{1,1,1}}] = 3. * center[2] * center[2]; + prefactor[{{0,1,1}}] = -3. * center[0] * center[2] * center[2]; + prefactor[{{1,0,1}}] = -3. * center[1] * center[2] * center[2]; + prefactor[{{0,0,1}}] = 3. * center[0] * center[1] * center[2] * center[2]; + prefactor[{{1,1,0}}] = -pow(center[2], 3); + prefactor[{{0,1,0}}] = center[0] * pow(center[2], 3); + prefactor[{{1,0,0}}] = center[1] * pow(center[2], 3); + prefactor[{{0,0,0}}] = -center[0] * center[1] * pow(center[2], 3); + prefactor *= 32./sqrt(15.) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hxzzzz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{1,0,4}}] = 1.; + prefactor[{{0,0,4}}] = -center[0]; + prefactor[{{1,0,3}}] = -4. * center[2]; + prefactor[{{0,0,3}}] = 4. * center[0] * center[2]; + prefactor[{{1,0,2}}] = 6. * center[2] * center[2]; + prefactor[{{0,0,2}}] = -6. * center[0] * center[2] * center[2]; + prefactor[{{1,0,1}}] = -4. * pow(center[2], 3); + prefactor[{{0,0,1}}] = 4. * center[0] * pow(center[2], 3); + prefactor[{{1,0,0}}] = pow(center[2], 4); + prefactor[{{0,0,0}}] = -center[0] * pow(center[2], 4); + prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hyyyyy) { + prefactor = PolynomialCoeffs(5); + prefactor[{{0,5,0}}] = 1.; + prefactor[{{0,4,0}}] = -5. * center[1]; + prefactor[{{0,3,0}}] = 10. * center[1] * center[1]; + prefactor[{{0,2,0}}] = -10. * pow(center[1], 3); + prefactor[{{0,1,0}}] = 5. * pow(center[1], 4); + prefactor[{{0,0,0}}] = -pow(center[1], 5); + prefactor *= 32./(3.*sqrt(105.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hyyyyz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{0,4,1}}] = 1.; + prefactor[{{0,3,1}}] = -4. * center[1]; + prefactor[{{0,2,1}}] = 6. * center[1] * center[1]; + prefactor[{{0,1,1}}] = -4. * pow(center[1], 3); + prefactor[{{0,0,1}}] = pow(center[1], 4); + prefactor[{{0,4,0}}] = -center[2]; + prefactor[{{0,3,0}}] = 4. * center[1] * center[2]; + prefactor[{{0,2,0}}] = -6. * center[1] * center[1] * center[2]; + prefactor[{{0,1,0}}] = 4. * pow(center[1], 3) * center[2]; + prefactor[{{0,0,0}}] = -pow(center[1], 4) * center[2]; + prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hyyyzz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{0,3,2}}] = 1.; + prefactor[{{0,2,2}}] = -3. * center[1]; + prefactor[{{0,1,2}}] = 3. * center[1] * center[1]; + prefactor[{{0,0,2}}] = -pow(center[1], 3); + prefactor[{{0,3,1}}] = -2. * center[2]; + prefactor[{{0,2,1}}] = 6. * center[1] * center[2]; + prefactor[{{0,1,1}}] = -6. * center[1] * center[1] * center[2]; + prefactor[{{0,0,1}}] = 2. * pow(center[1], 3) * center[2]; + prefactor[{{0,3,0}}] = center[2] * center[2]; + prefactor[{{0,2,0}}] = -3. * center[1] * center[2] * center[2]; + prefactor[{{0,1,0}}] = 3. * center[1] * center[1] * center[2] * center[2]; + prefactor[{{0,0,0}}] = -pow(center[1], 3) * center[2] * center[2]; + prefactor *= 32./(3.*sqrt(5.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hyyzzz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{0,2,3}}] = 1.; + prefactor[{{0,1,3}}] = -2. * center[1]; + prefactor[{{0,0,3}}] = center[1] * center[1]; + prefactor[{{0,2,2}}] = -3. * center[2]; + prefactor[{{0,1,2}}] = 6. * center[1] * center[2]; + prefactor[{{0,0,2}}] = -3. * center[1] * center[1] * center[2]; + prefactor[{{0,2,1}}] = 3. * center[2] * center[2]; + prefactor[{{0,1,1}}] = -6. * center[1] * pow(center[2], 2); + prefactor[{{0,0,1}}] = 3. * center[1] * center[1] * center[2] * center[2]; + prefactor[{{0,2,0}}] = -pow(center[2], 3); + prefactor[{{0,1,0}}] = 2. * center[1] * pow(center[2], 3); + prefactor[{{0,0,0}}] = -center[1] * center[1] * pow(center[2], 3); + prefactor *= 32./(3.*sqrt(5.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hyzzzz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{0,1,4}}] = 1.; + prefactor[{{0,0,4}}] = -center[1]; + prefactor[{{0,1,3}}] = -4. * center[2]; + prefactor[{{0,0,3}}] = 4. * center[1] * center[2]; + prefactor[{{0,1,2}}] = 6. * center[2] * center[2]; + prefactor[{{0,0,2}}] = -6. * center[1] * center[2] * center[2]; + prefactor[{{0,1,1}}] = -4. * pow(center[2], 3); + prefactor[{{0,0,1}}] = 4. * center[1] * pow(center[2], 3); + prefactor[{{0,1,0}}] = pow(center[2], 4); + prefactor[{{0,0,0}}] = -center[1] * pow(center[2], 4); + prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + else if(type == GaussianType::hzzzzz) { + prefactor = PolynomialCoeffs(5); + prefactor[{{0,0,5}}] = 1.; + prefactor[{{0,0,4}}] = -5. * center[2]; + prefactor[{{0,0,3}}] = 10. * center[2] * center[2]; + prefactor[{{0,0,2}}] = -10. * pow(center[2], 3); + prefactor[{{0,0,1}}] = 5. * pow(center[2], 4); + prefactor[{{0,0,0}}] = -pow(center[2], 5); + prefactor *= 32./(3.*sqrt(105.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + } + + // h sphericals + // (l,m) = (5,-5) + else if(type == GaussianType::hm5) { + // (5x^4-10x^2y^2+y^4), multiply by y, normalize + PolynomialCoeffs y(1), x4(4), xx(2), yy(2), y4(4); + y[{{0,1,0}}] = 1.; + y[{{0,0,0}}] = -center[1]; + x4[{{4,0,0}}] = 1.; + x4[{{3,0,0}}] = -4. * center[0]; + x4[{{2,0,0}}] = 6. * center[0] * center[0]; + x4[{{1,0,0}}] = -4. * pow(center[0], 3); + x4[{{0,0,0}}] = pow(center[0], 4); + y4[{{0,4,0}}] = 1.; + y4[{{0,3,0}}] = -4. * center[1]; + y4[{{0,2,0}}] = 6. * center[1] * center[1]; + y4[{{0,1,0}}] = -4. * pow(center[1], 3); + y4[{{0,0,0}}] = pow(center[1], 4); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + double norm = 4./sqrt(15.) * pow(2., 0.25) * pow(ec, 3.25) * pow(1./pi, 0.75); + prefactor = norm * y * (5.*x4 + (-10.*xx*yy) + y4); + } + // (l,m) = (5,-4) + else if(type == GaussianType::hm4) { + // get (x^2-y^2), multiply by xyz, normalize + PolynomialCoeffs xx(2), yy(2), x(1), y(1), z(1); + x[{{1,0,0}}] = 1.; + x[{{0,0,0}}] = -center[0]; + y[{{0,1,0}}] = 1.; + y[{{0,0,0}}] = -center[1]; + z[{{0,0,1}}] = 1.; + z[{{0,0,0}}] = -center[2]; + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + double norm = 16./sqrt(3.) * pow(ec, 3.25) * pow(2./pi, 0.75); + prefactor = norm * x * y * z * (xx + (-1.*yy)); + } + // (l,m) = (5,-3) + else if(type == GaussianType::hm3) { + // get y, (3x^2-y^2) and (8z^2-x^2-y^2), multiply together, normalize + PolynomialCoeffs xx(2), yy(2), zz(2), y(1); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + y[{{0,1,0}}] = 1.; + y[{{0,0,0}}] = -center[1]; + double norm = 4./(3.*sqrt(3.)) * pow(2., 0.25) * pow(ec, 3.25) * pow(1./pi, 0.75); + prefactor = norm * y * (3.*xx + (-1.*yy)) * (8.*zz + (-1.*xx) + (-1.*yy)); + } + // (l,m) = (5,-2) + else if(type == GaussianType::hm2) { + // get (2z^2-x^2-y^2), multiply by xyz, normalize + PolynomialCoeffs xx(2), yy(2), zz(2), x(1), y(1), z(1); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + x[{{1,0,0}}] = 1.; + x[{{0,0,0}}] = -center[0]; + y[{{0,1,0}}] = 1.; + y[{{0,0,0}}] = -center[1]; + z[{{0,0,1}}] = 1.; + z[{{0,0,0}}] = -center[2]; + double norm = 16./3. * pow(ec, 3.25) * pow(2./pi, 0.75); + prefactor = norm * x * y * z * (2.*zz + (-1.*xx) + (-1.*yy)); + } + // (l,m) = (5,-1) + else if(type == GaussianType::hm1) { + // get x^4+2x^2y^2-12x^2z^2+y^4-12y^2z^2+8z^4 + // multiply by y, normalize + PolynomialCoeffs x4(4), xx(2), yy(2), y4(4), zz(2), z4(4), y(1); + x4[{{4,0,0}}] = 1.; + x4[{{3,0,0}}] = -4. * center[0]; + x4[{{2,0,0}}] = 6. * center[0] * center[0]; + x4[{{1,0,0}}] = -4. * pow(center[0], 3); + x4[{{0,0,0}}] = 1. * pow(center[0], 4); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + y4[{{0,4,0}}] = 1.; + y4[{{0,3,0}}] = -4. * center[1]; + y4[{{0,2,0}}] = 6. * center[1] * center[1]; + y4[{{0,1,0}}] = -4. * pow(center[1], 3); + y4[{{0,0,0}}] = 1. * pow(center[1], 4); + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + z4[{{0,0,4}}] = 1.; + z4[{{0,0,3}}] = -4. * center[2]; + z4[{{0,0,2}}] = 6. * center[2] * center[2]; + z4[{{0,0,1}}] = -4. * pow(center[2], 3); + z4[{{0,0,0}}] = 1. * pow(center[2], 4); + y[{{0,1,0}}] = 1.; + y[{{0,0,0}}] = -center[1]; + double norm = 4./(3.*sqrt(7.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + prefactor = norm * y * (x4 + 2.*xx*yy + (-12.*xx*zz) + y4 + (-12.*yy*zz) + 8.*z4); + } + // (l,m) = (5,0) + else if(type == GaussianType::hzero) { + // get 15x^4+30x^2y^2-40x^2z^2+15y^4-40y^2z^2+8z^4 + // multiply by z, normalize + PolynomialCoeffs x4(4), xx(2), zz(2), y4(4), yy(2), z4(4), z(1); + x4[{{4,0,0}}] = 1.; + x4[{{3,0,0}}] = -4. * center[0]; + x4[{{2,0,0}}] = 6. * center[0] * center[0]; + x4[{{1,0,0}}] = -4. * pow(center[0], 3); + x4[{{0,0,0}}] = 1. * pow(center[0], 4); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + y4[{{0,4,0}}] = 1.; + y4[{{0,3,0}}] = -4. * center[1]; + y4[{{0,2,0}}] = 6. * center[1] * center[1]; + y4[{{0,1,0}}] = -4. * pow(center[1], 3); + y4[{{0,0,0}}] = 1. * pow(center[1], 4); + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = pow(center[1], 2); + z4[{{0,0,4}}] = 1.; + z4[{{0,0,3}}] = -4. * center[2]; + z4[{{0,0,2}}] = 6. * center[2] * center[2]; + z4[{{0,0,1}}] = -4. * pow(center[2], 3); + z4[{{0,0,0}}] = 1. * pow(center[2], 4); + z[{{0,0,1}}] = 1.; + z[{{0,0,0}}] = -center[2]; + double norm = 4./(3.*sqrt(105.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + prefactor = norm * z * (15.*x4 + 30.*xx*yy + (-40.*xx*zz) + 15.*y4 + (-40.*yy*zz) + 8.*z4); + } + // (l,m) = (5,1) + else if(type == GaussianType::hp1) { + // get x^4+2x^2y^2-12x^2z^2+y^4-12y^2z^2+8z^4 + // multiply by x, normalize + PolynomialCoeffs x4(4), xx(2), zz(2), y4(4), yy(2), z4(4), x(1); + x4[{{4,0,0}}] = 1.; + x4[{{3,0,0}}] = -4. * center[0]; + x4[{{2,0,0}}] = 6. * center[0] * center[0]; + x4[{{1,0,0}}] = -4. * pow(center[0], 3); + x4[{{0,0,0}}] = 1. * pow(center[0], 4); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + y4[{{0,4,0}}] = 1.; + y4[{{0,3,0}}] = -4. * center[1]; + y4[{{0,2,0}}] = 6. * center[1] * center[1]; + y4[{{0,1,0}}] = -4. * pow(center[1], 3); + y4[{{0,0,0}}] = 1. * pow(center[1], 4); + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + z4[{{0,0,4}}] = 1.; + z4[{{0,0,3}}] = -4. * center[2]; + z4[{{0,0,2}}] = 6. * center[2] * center[2]; + z4[{{0,0,1}}] = -4. * pow(center[2], 3); + z4[{{0,0,0}}] = 1. * pow(center[2], 4); + x[{{1,0,0}}] = 1.; + x[{{0,0,0}}] = -center[0]; + double norm = 4./(3.*sqrt(7.)) * pow(ec, 3.25) * pow(2./pi, 0.75); + // Testing shows nwchem uses the negative of this + prefactor = (-1.) * norm * x * (x4 + 2.*xx*yy + (-12.*xx*zz) + y4 + (-12.*yy*zz) + 8.*z4); + } + // (l,m) = (5,2) + else if(type == GaussianType::hp2) { + // get z * (x^2-y^2) * (2z^2 - x^2 - y^2), and normalize + PolynomialCoeffs xx(2), yy(2), zz(2), z(1); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + z[{{0,0,1}}] = 1.; + z[{{0,0,0}}] = -center[2]; + double norm = 8./3. * pow(ec, 3.25) * pow(2./pi, 0.75); + prefactor = norm * z * (xx + (-1.*yy)) * (2.*zz + (-1.*xx) + (-1.*yy)); + } + // (l,m) = (5,3) + else if(type == GaussianType::hp3) { + // get x, (x^2-3y^2) and (8z^2-x^2-y^2), + // multiply and normalize + PolynomialCoeffs xx(2), yy(2), zz(2), x(1); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + zz[{{0,0,2}}] = 1.; + zz[{{0,0,1}}] = -2. * center[2]; + zz[{{0,0,0}}] = center[2] * center[2]; + x[{{1,0,0}}] = 1.; + x[{{0,0,0}}] = -center[0]; + double norm = 4./(3.*sqrt(3.)) * pow(2., 0.25) * pow(ec, 3.25) * pow(1./pi, 0.75); + // Testing shows nwchem uses the negative of this + prefactor = (-1.) * norm * x * (xx + (-3.*yy)) * (8.*zz + (-1.*xx) + (-1.*yy)); + } + // (l,m) = (5,4) + else if(type == GaussianType::hp4) { + // setup x^4, x^2y^2, y^4, get (x^4-6x^2y^2+y^4), normalize, multiply by z + PolynomialCoeffs z(1), x4(4), xx(2), yy(2), y4(4); + z[{{0,0,1}}] = 1.; + z[{{0,0,0}}] = -center[2]; + x4[{{4,0,0}}] = 1.; + x4[{{3,0,0}}] = -4. * center[0]; + x4[{{2,0,0}}] = 6. * center[0] * center[0]; + x4[{{1,0,0}}] = -4. * pow(center[0], 3); + x4[{{0,0,0}}] = pow(center[0], 4); + y4[{{0,4,0}}] = 1.; + y4[{{0,3,0}}] = -4. * center[1]; + y4[{{0,2,0}}] = 6. * center[1] * center[1]; + y4[{{0,1,0}}] = -4. * pow(center[1], 3); + y4[{{0,0,0}}] = pow(center[1], 4); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. *center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + double norm = 4./sqrt(3.) * pow(ec, 3.25) * pow(2./pi, 0.75); + prefactor = norm * z * (x4 + (-6.*xx*yy) + y4); + } + // (l,m) = (5,5) + else if(type == GaussianType::hp5) { + // get x, (x^4-10x^2y^2+5y^4), multiply, normalize + PolynomialCoeffs x(1), x4(4), xx(2), yy(2), y4(4); + x[{{1,0,0}}] = 1.; + x[{{0,0,0}}] = -center[0]; + x4[{{4,0,0}}] = 1.; + x4[{{3,0,0}}] = -4. * center[0]; + x4[{{2,0,0}}] = 6. * center[0] * center[0]; + x4[{{1,0,0}}] = -4. * pow(center[0], 3); + x4[{{0,0,0}}] = pow(center[0], 4); + y4[{{0,4,0}}] = 1.; + y4[{{0,3,0}}] = -4. * center[1]; + y4[{{0,2,0}}] = 6. * center[1] * center[1]; + y4[{{0,1,0}}] = -4. * pow(center[1], 3); + y4[{{0,0,0}}] = pow(center[1], 4); + xx[{{2,0,0}}] = 1.; + xx[{{1,0,0}}] = -2. * center[0]; + xx[{{0,0,0}}] = center[0] * center[0]; + yy[{{0,2,0}}] = 1.; + yy[{{0,1,0}}] = -2. * center[1]; + yy[{{0,0,0}}] = center[1] * center[1]; + double norm = 4./sqrt(15.) * pow(2., 0.25) * pow(ec, 3.25) * pow(1./pi, 0.75); + // Testing shows nwchem uses the negative of this + prefactor = (-1.) * norm * x * (x4 + (-10.*xx*yy) + 5.*y4); + } +} + +PrimitiveGaussian::PrimitiveGaussian(const PolynomialCoeffs &exppoly_, + const PolynomialCoeffs &prefactor_) + : prefactor(prefactor_), exppoly(exppoly_) { + + const unsigned degree = exppoly_.get_degree(); + if(degree > 2) + throw std::invalid_argument("Exponential in a Gaussian must have degree at most 2."); + else if(degree < 2) { + // it will be assumed in other functions that exppoly's degree is 2 + exppoly = PolynomialCoeffs(2); + exppoly[{{0,0,0}}] = exppoly_[{{0,0,0}}]; + if(degree == 1) { + exppoly[{{1,0,0}}] = exppoly_[{{1,0,0}}]; + exppoly[{{0,1,0}}] = exppoly_[{{0,1,0}}]; + exppoly[{{0,0,1}}] = exppoly_[{{0,0,1}}]; + } + } +} + +double PrimitiveGaussian::operator() (const std::array &x) const { + return exp(exppoly(x)) * prefactor(x); +} + +PrimitiveGaussian PrimitiveGaussian::operator*(const PrimitiveGaussian &rhs) const { + PrimitiveGaussian ret; + ret.prefactor = prefactor * rhs.prefactor; + ret.exppoly = exppoly + rhs.exppoly; + + return ret; +} + +/////////////////////////////////////////////////////////////////////////// +// Implementation of the GaussianFunction class. +/////////////////////////////////////////////////////////////////////////// +GaussianFunction::GaussianFunction(const GaussianType type, + const std::array ¢er, const std::vector &expcoeff, + const std::vector &coeff) { + + if(expcoeff.size() != coeff.size()) + throw std::invalid_argument("A Gaussian function must have the same number of linear expansion and exponential coefficients."); + + // go through each of the primitives and construct the Gaussian function + for(auto iterexpcoeff = expcoeff.cbegin(), + itercoeff = coeff.cbegin(), + end = expcoeff.cend(); + iterexpcoeff != end; + iterexpcoeff++, itercoeff++) { + + terms.emplace_front(*itercoeff, PrimitiveGaussian(type, center, *iterexpcoeff)); + } + + // prune any small terms in the expansion + removeSmallTerms(); + + // store the center + this->center = center; +} + +double GaussianFunction::operator() (const std::array &x) const { + double ret = 0.; + for(const TermT &term : terms) + ret += term.first * term.second(x); + return ret; +} + +GaussianFunction GaussianFunction::operator- () const { + GaussianFunction ret(*this); + + for(TermT &term : ret.terms) + term.first *= -1.; + + return ret; +} + +GaussianFunction GaussianFunction::operator+(const GaussianFunction &rhs) const { + GaussianFunction ret; + ret.terms = terms; // deep copy + for(const TermT &term : rhs.terms) + ret.terms.push_front(term); + return ret; +} + +GaussianFunction &GaussianFunction::operator+=(const GaussianFunction &rhs) { + if(this == &rhs) + for(TermT &term : terms) + term.first *= 2.; + else + for(const TermT &term : rhs.terms) + terms.push_front(term); + return *this; +} + +GaussianFunction &GaussianFunction::operator*=(const double rhs) { + for(TermT &term : terms) + term.first *= rhs; + removeSmallTerms(); + return *this; +} + +GaussianFunction GaussianFunction::operator*(const GaussianFunction &rhs) const { + GaussianFunction ret; + for(const TermT &term : terms) + for(const TermT &rterm : rhs.terms) { + ret.terms.emplace_front( + term.first * rterm.first, + term.second * rterm.second + ); + } + ret.removeSmallTerms(); + return ret; +} + +} // namespace slymer diff --git a/src/apps/moldft/gaussian.h b/src/apps/moldft/gaussian.h new file mode 100644 index 00000000000..700a34363ff --- /dev/null +++ b/src/apps/moldft/gaussian.h @@ -0,0 +1,393 @@ +/* This file is a part of Slymer, which is distributed under the Creative + Commons Attribution-NonCommercial 4.0 International Public License. + + (c) 2017 Stony Brook University. */ + +/** + * \file Basis/gaussian.h + * \brief Gaussian basis function API and routines. + * + * Handles Gaussian basis functions as special cases (class inheritance). Both + * primitive and contracted Gaussians from electronic structure codes are + * implemented, but not using those labels. + */ + +#ifndef __Basis_gaussian_h__ +#define __Basis_gaussian_h__ + +#include +#include +#include "basis.h" +#include "polynomial.h" +#include "ESInterface.h" +#include + +namespace slymer { + +/// Implemented types of Gaussian orbitals (from quantum chemistry codes). +enum class GaussianType { + // both Cartesian and spherical + s, px, py, pz, + + // Cartesian (and possibly spherical) + dxx, dxy, dxz, dyy, dyz, dzz, + fxxx, fxxy, fxxz, fxyy, fxyz, fxzz, fyyy, fyyz, fyzz, fzzz, + + // spherical only ('m' denotes "minus") + dzzmrr, dxxmyy, + fxyymxxx, fxxzmyyz, fxzzmrrx, fzzzmrrz, fyzzmrry, fxxymyyy, + + // g + // cartesian + gxxxx, gxxxy, gxxxz, gxxyy, gxxyz, gxxzz, gxyyy, gxyyz, gxyzz, + gxzzz, gyyyy, gyyyz, gyyzz, gyzzz, gzzzz, + // spherical + // ('d' denotes "dot" for multiplication) + // (numbers in names indicate powers of preceding variable) + gxydx2my2, gyzdx2my2, gxydz2mr2, gyzdz2mr2, gzero, + gxzdz2mr2, gx2my2dz2mr2, gxzdx2my2, gx4mx2y2py4, + + // h + // cartesian + hxxxxx, hxxxxy, hxxxxz, hxxxyy, hxxxyz, hxxxzz, hxxyyy, hxxyyz, + hxxyzz, hxxzzz, hxyyyy, hxyyyz, hxyyzz, hxyzzz, hxzzzz, hyyyyy, + hyyyyz, hyyyzz, hyyzzz, hyzzzz, hzzzzz, + // spherical + // at this point, just giving names corresponding to value + // quantum number m + hm5, hm4, hm3, hm2, hm1, hzero, hp1, hp2, hp3, hp4, hp5 + +}; + +// forward declaration +class GaussianFunction; + +/** + * \brief A primitive Gaussian function. + * + * This basis function has the form \f[ + * f(x,y,z) = p(x,y,z) \exp[(x-x_0)^T \Sigma (x-x_0)], + * \f] + * where \f$p\f$ is a polynomial and \f$x_0\f$ is the ``center'' of the + * Gaussian and \f$\Sigma\f$ is the variance/covariance matrix. + * + * This class is designed to work with Gaussian basis functions in quantum + * chemistry codes, but is made to be a bit more general for other + * applications. + * + * The wikipedia page on multivariable normal distributions may be helpful + * (https://en.wikipedia.org/wiki/Multivariate_normal_distribution). + */ +class PrimitiveGaussian { + +protected: + /// Polynomial prefactor (\f$p\f$ in the class description). + PolynomialCoeffs prefactor; + + /// Coefficients in the exponent's quadratic function. + PolynomialCoeffs exppoly; + + /** + * \brief Return type for the function's canonical form. + * + * The first element is the polynomial prefactor, converted to use the principal coordinates. + * The second element is the array of decay values (eigenvalues of the covariance matrix). + * The third element is the \f$\nu\f$ vector (essentially the center of the Gaussian). + * The fourth element are the canonical axes in the original coordinates (for debugging purposes). + */ + using CF = std::tuple, std::array, std::array, 3>>; + +public: + /// Default constructor: Make the function 1 (\f$p=1\f$, \f$f(\vec{x})=0\f$). + PrimitiveGaussian() + : prefactor(0), exppoly(2) + { + prefactor[{{0,0,0}}] = 1.; + } + + /** + * \brief Create a primitive Gaussian function centered on the specific point, + * with the specified decay constant and type. + * + * \throw std::invalid_argument if the decay constant is non-positive. + * + * \param[in] type The orbital type of the Gaussian. + * \param[in] center The center of the Gaussian. + * \param[in] ec The decay constant in the exponential. + */ + PrimitiveGaussian(const GaussianType &type, + const std::array ¢er, const double ec); + + /** + * \brief Create a primitive Gaussian function with the specified exponential + * polynomial (quadratic) and polynomial prefactor. + * + * \throw std::invalid_argument if the exponential polynomial is not + * quadratic (or constant or linear as subsets). + * + * \param[in] exppoly_ The exponential polynomial. + * \param[in] prefactor_ The degree of the prefactor. + */ + PrimitiveGaussian(const PolynomialCoeffs &exppoly_, + const PolynomialCoeffs &prefactor_); + + /** + * \brief Evaluate the Gaussian primitive at the specified point. + * + * \param[in] x The point. + * \return The Gaussian primitive evaluated at the point x. + */ + double operator() (const std::array &x) const; + + /** + * \brief Multiply two primitive Gaussians. The result is another. + * + * \param[in] rhs The right-hand object. + * \result The product. + */ + PrimitiveGaussian operator*(const PrimitiveGaussian &rhs) const; +}; + + +/** + * \brief A Gaussian basis function used by chemistry electronic structure + * codes. + * + * This basis function has the form \f[ + * \sum_j c_j x^{l_j} y^{m_j} z^{n_j} \exp[f_j(\vec{x})], + * \f] + * where \f$f_j(\vec{x})\f$ is a quadratic function. Note that this functional + * form is a bit more general than that used by standard electronic structure + * codes; we do not require the prinicpal axes of the Gaussian function to be + * coincident with the x-, y-, and z-axes. This class can also hold/handle any + * linear combination of primitive Gaussian functions (the exponents and + * centers do not have to be the same). + */ +class GaussianFunction : public BasisFunction { + +protected: + /// Helper class for storing terms in the sum of Gaussian primitives. + using TermT = std::pair; + + /// The list of terms in the sum of Gaussian primitives. + std::forward_list terms; + + /** + * \brief Removes terms with very small linear expansion coefficients. + * + * \param[in] eps The threshold for "small". Defaults to 1.e-6. + */ + void removeSmallTerms(const double eps = 1.e-6) { + terms.remove_if( + [eps](const TermT &t) { + return std::abs(t.first) < eps; + } + ); + } + +public: + + /// The center of the gaussian + std::array center; + + /// Default constructor: Make the function 0. + GaussianFunction() : terms(0), center({{0,0,0}}) {} + + /** + * \brief Create a Gaussian orbital (uncontracted or contracted) from + * quantum chemistry codes. + * + * Both Cartesian and spherical orbitals are supported. The expcoeff and + * coeff parameters must be arrays. If the orbital is uncontracted, the + * arrays will be length 1. + * + * All uncontracted primitive Gaussian orbitals used underneath the + * GaussianFunction are normalized. + * + * \throw invalid_argument If a non-positive exponential coefficient is + * passed or if the lengths of expcoeff and coeff are not equal. + * + * \param[in] type The orbital type (from enum OrbitalType). + * \param[in] center The center of the Gaussian orbital. + * \param[in] expcoeff Array of coefficients in the exponents of the + * primitive Gaussians. + * \param[in] coeff Array of linear expansion coefficients of the primitive + * Gaussians. + */ + GaussianFunction(const GaussianType type, const std::array ¢er, + const std::vector &expcoeff, const std::vector &coeff); + + /** + * \brief Create an uncontracted Gaussian orbital (shortcut to the more + * general constructor for Gaussian orbitals). + * + * \param[in] type The orbital type (from enum OrbitalType). + * \param[in] center The center of the Gaussian orbital. + * \param[in] expcoeff The coefficient in the exponent of the primitive + * Gaussian. + */ + GaussianFunction(const GaussianType type, const std::array ¢er, + const double expcoeff) + : GaussianFunction(type, center, {expcoeff}, {1.}) {} + + /** + * \brief Evaluate the Gaussian function at the specified point. + * + * \param[in] x The point. + * \return The Gaussian function evaluated at the point x. + */ + virtual double operator() (const std::array &x) const override; + + /** + * \brief Evaluate the Gaussian function at the specified point. + * + * \param[in] x The point. + * \return The Gaussian function evaluated at the point x. + */ + double operator() (const madness::coord_3d& r) const { + return operator()(std::array{{r[0], r[1], r[2]}}); + }; + + /** + * \brief Additive inverse of the GaussianFunction (deep copy). + * + * \return The negated function. + */ + GaussianFunction operator- () const; + + /** + * \brief Add two GaussianFunction objects, resulting in a new one. + * + * \param[in] rhs The right-hand GaussianFunction. + * \return The sum of this GaussianFunction and rhs. + */ + GaussianFunction operator+(const GaussianFunction &rhs) const; + + /** + * \brief Add a GaussianFunction to this GaussianFunction. + * + * \param[in] rhs The right-hand GaussianFunction. + * \return The sum of this GaussianFunction and rhs, stored in *this. + */ + GaussianFunction &operator+=(const GaussianFunction &rhs); + + /** + * \brief Subtract a GaussianFunction from this one, returning the difference. + * + * \param[in] rhs The GaussianFunction to be subtracted. + * \return The difference of the two GaussianFunction objects. + */ + GaussianFunction operator-(const GaussianFunction &rhs) const { + return *this + (-rhs); + } + + /** + * \brief Subtract a GaussianFunction from this one. + * + * \param[in] rhs The GaussianFunction to be subtracted. + * \return This GaussianFunction (the difference). + */ + GaussianFunction &operator-=(const GaussianFunction &rhs) { + return operator+=(-rhs); + } + + /** + * \brief Multiply the GaussianFunction by a scalar. + * + * \param[in] rhs The scalar multiplicative factor. + * \return This GaussianFunction, which has been scaled. + */ + GaussianFunction &operator*=(const double rhs); + + /** + * \brief Multiply the GaussianFunction by another. + * + * \param[in] rhs The right-hand GaussianFunction object. + * \return This GaussianFunction, which is now the product. + */ + GaussianFunction &operator*=(const GaussianFunction &rhs) { + GaussianFunction ret = (*this) * rhs; + terms.swap(ret.terms); + return *this; + } + + /** + * \brief Multiply the GaussianFunction by a scalar. + * + * \param[in] rhs The scalar multiplicative factor. + * \return The scaled GaussianFunction. + */ + GaussianFunction operator*(const double rhs) const { + GaussianFunction ret(*this); + ret *= rhs; + return ret; + } + + /** + * \brief Multiply two GaussianFunctions. + * + * \param[in] rhs The right-hand GaussianFunction object. + * \return The product. + */ + GaussianFunction operator*(const GaussianFunction &rhs) const; + + /** + * \brief Divide the GaussianFunction by a scalar. + * + * Does not check that the scalar is nonzero. + * + * \param[in] rhs The scalar factor. + * \return This GaussianFunction, which has been scaled. + */ + GaussianFunction &operator/=(const double rhs) { + operator*=(1./rhs); + return *this; + } + + /** + * \brief Divide the GaussianFunction by a scalar. + * + * \param[in] rhs The scalar factor. + * \return The scaled GaussianFunction. + */ + GaussianFunction operator/(const double rhs) const { + return (*this) * (1./rhs); + } +}; + + +// helper functions + +/** + * \brief Multiply a GaussianFunction by a scalar. + * + * \param[in] lhs The scalar multiplicative factor. + * \param[in] rhs The GaussianFunction. + * \return The scaled GaussianFunction. + */ +inline GaussianFunction operator*(const double lhs, const GaussianFunction &rhs) { + return rhs * lhs; +} + +class Gaussian_Functor : public madness::FunctionFunctorInterface { +private: + GaussianFunction func; + std::vector centers; +public: + Gaussian_Functor(GaussianFunction func, std::vector centers) : func(func), centers(centers) {} + + double operator()(const madness::coord_3d& r) const { + return func(r); + } + + std::vector special_points() const { + return centers; + } + + madness::Level special_level() { + return 14; + } +}; + +} // namespace slymer +#endif diff --git a/src/apps/moldft/input b/src/apps/moldft/input index 220b508d99d..14853ca4fbd 100644 --- a/src/apps/moldft/input +++ b/src/apps/moldft/input @@ -1,9 +1,30 @@ dft - xc LDA + xc Hf maxsub 5 + protocol 1e-4 1e-6 + k 12 + canon + save true end #xc GGA_X_PBE .75 GGA_C_PBE 1. HF_X .25 +geometry + S 0.0 -0.144329 -0.526855 + H 0.0 -1.880889 1.281475 + H 0.0 1.778267 1.080687 +end + +geometry + He 0.0 0.0 0.0 +end + +geometry + Se -1.4905006099 0.7338066337 -0.0885972121 + H 0.0251541168 0.8917228966 0.1076319820 + H -1.7582384563 1.6823418413 1.0900673282 +end + + # water*1 geometry O 0.0 0.0 0.0 @@ -11,6 +32,35 @@ geometry H -1.4375 0.0 1.15 end +geometry + B 0.16963984 0.12447403 -0.06316061 + H -0.03706239 0.02808500 2.16758150 + H 0.26127104 -1.76716998 -1.26350202 + H 0.28937654 2.11297478 -1.09371745 +end + +geometry + N 0.0 0.0 -1.00661983 + N 0.0 0.0 1.00661983 +end + +geometry + H 0.0 0.0 -2.048537 + F 0.0 0.0 -0.351463 +end + +geometry + Zn 0.0 0.0 0.0 +end + +geometry + units angstrom + Hg 0.0 0.0 0.0 + Hg 1.0174310209 2.0491370411 0.0 +end + + + # water dimer geometry units angstrom diff --git a/src/apps/moldft/polynomial.cc b/src/apps/moldft/polynomial.cc new file mode 100644 index 00000000000..07c9427ab0d --- /dev/null +++ b/src/apps/moldft/polynomial.cc @@ -0,0 +1,148 @@ +/* This file is a part of Slymer, which is distributed under the Creative + Commons Attribution-NonCommercial 4.0 International Public License. + + (c) 2017 Stony Brook University. */ + +/** + * \file Basis/polynomial.cc + * \brief Implementation of polynomial API and routines. + */ + +#include +#include +#include "polynomial.h" + +namespace slymer { + +double PolynomialCoeffs::operator() (const std::array &pt) const { + double ret = 0.; + + for(unsigned j = 0; j <= degree; ++j) + for(unsigned k = 0; k <= degree - j; ++k) + for(unsigned l = 0; l <= degree - j - k; ++l) + ret += coeffs[polyIndex({{j,k,l}})] + * ::pow(pt[0], j) * ::pow(pt[1], k) * ::pow(pt[2], l); + + return ret; +} + +PolynomialCoeffs PolynomialCoeffs::operator+ (const PolynomialCoeffs &rhs) const +{ + if(degree >= rhs.degree) { + PolynomialCoeffs ret(degree); + + unsigned size = rhs.coeffs.size(); + for(unsigned j = 0; j < size; ++j) + ret.coeffs[j] = coeffs[j] + rhs.coeffs[j]; + size = coeffs.size(); + for(unsigned j = rhs.coeffs.size(); j < size; ++j) + ret.coeffs[j] = coeffs[j]; + + return ret; + } + else { + PolynomialCoeffs ret(rhs.degree); + + unsigned size = coeffs.size(); + for(unsigned j = 0; j < size; ++j) + ret.coeffs[j] = coeffs[j] + rhs.coeffs[j]; + size = rhs.coeffs.size(); + for(unsigned j = coeffs.size(); j < size; ++j) + ret.coeffs[j] = rhs.coeffs[j]; + + return ret; + } +} + +PolynomialCoeffs &PolynomialCoeffs::operator+= (const PolynomialCoeffs &rhs) { + if(degree >= rhs.degree) { + const unsigned size = rhs.coeffs.size(); + for(unsigned j = 0; j < size; ++j) + coeffs[j] += rhs.coeffs[j]; + } + else { + PolynomialCoeffs newpoly(rhs.degree); + + unsigned size = coeffs.size(); + for(unsigned j = 0; j < size; ++j) + newpoly.coeffs[j] = coeffs[j] + rhs.coeffs[j]; + size = rhs.coeffs.size(); + for(unsigned j = coeffs.size(); j < size; ++j) + newpoly.coeffs[j] = rhs.coeffs[j]; + + std::swap(coeffs, newpoly.coeffs); + degree = rhs.degree; + } + + return *this; +} + +PolynomialCoeffs PolynomialCoeffs::operator* (const double c) const { + PolynomialCoeffs ret(*this); + + for(double &coeff : ret.coeffs) + coeff *= c; + + return ret; +} + +PolynomialCoeffs &PolynomialCoeffs::operator*= (const double c) { + for(double &coeff : coeffs) + coeff *= c; + + return *this; +} + +PolynomialCoeffs PolynomialCoeffs::operator* (const PolynomialCoeffs &rhs) const +{ + // make an output vector with the appropriate size for a multinomial of degree j + const unsigned deg = degree + rhs.degree; + PolynomialCoeffs ret(deg); + + // go through all combinations for the product + for(unsigned x1 = 0; x1 <= degree; ++x1) + for(unsigned y1 = 0; y1 <= degree - x1; ++y1) + for(unsigned z1 = 0; z1 <= degree - x1 - y1; ++z1) { + + for(unsigned x2 = 0; x2 <= rhs.degree; ++x2) + for(unsigned y2 = 0; y2 <= rhs.degree - x2; ++y2) + for(unsigned z2 = 0; z2 <= rhs.degree - x2 - y2; ++z2) { + ret[{{x1+x2, y1+y2, z1+z2}}] += + operator[]({{x1, y1, z1}}) * rhs[{{x2, y2, z2}}]; + } + } + + return ret; +} + +PolynomialCoeffs PolynomialCoeffs::pow(const unsigned j) const { + // this function is only intended to work with polynomials of degree 1 + if(degree != 1) + throw std::runtime_error("PolynomialCoeffs::pow can only be applied to polynomials with degree 1."); + + // array with factorials + const std::array fact{{1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800}}; + + if(j >= fact.size()) + throw std::invalid_argument("Degree is too big in PolynomialCoeffs::pow."); + + // setup a PolynomialCoeffs for the return values + PolynomialCoeffs ret(j); + + // cycle through all exponent orders that add up to j + for(unsigned ex1 = 0; ex1 <= j; ++ex1) + for(unsigned ex2 = 0; ex2 <= j - ex1; ++ex2) + for(unsigned ex3 = 0; ex3 <= j - ex1 - ex2; ++ex3) { + unsigned ex4 = j - ex1 - ex2 - ex3; // the ex coefficients add up to j + + // calculate the coefficient on x^ex1 y^ex2 z^ex3, per the multinomial theorem + ret[{{ex1, ex2, ex3}}] = + (fact[j] / fact[ex1] / fact[ex2] / fact[ex3] / fact[ex4]) + * ::pow(operator[]({{1,0,0}}), ex1) * ::pow(operator[]({{0,1,0}}), ex2) + * ::pow(operator[]({{0,0,1}}), ex3) * ::pow(operator[]({{0,0,0}}), ex4); + } + + return ret; +} + +} // namespace slymer diff --git a/src/apps/moldft/polynomial.h b/src/apps/moldft/polynomial.h new file mode 100644 index 00000000000..0e9651cd8a9 --- /dev/null +++ b/src/apps/moldft/polynomial.h @@ -0,0 +1,235 @@ +/* This file is a part of Slymer, which is distributed under the Creative + Commons Attribution-NonCommercial 4.0 International Public License. + + (c) 2017 Stony Brook University. */ + +/** + * \file Basis/polynomial.h + * \brief API and helper functions for describing polynomial functions of + * three variables. + * + * The array is indexed by the polyIndex function. Each element of the array + * is a coefficient on the polynomial. + */ + +#ifndef __Basis_polynomial_h__ +#define __Basis_polynomial_h__ + +#include +#include + +namespace slymer { + +/** + * \brief Array for storing coefficients of a polynomial of three variables + * with specified degree. + * + * The general polynomial of three variables is written as + * \f[ \sum_{i,j,k} c_{i,j,k} x^i y^j z^k, \f] + * where \f$0\le i+j+k\le N\f$. This data structure stores the coefficients + * in a vector and provides access routines in terms of the exponents \f$i\f$, + * \f$j\f$, and \f$k\f$. + * + * \note This class is not designed for polynomials with a large degree. + */ +class PolynomialCoeffs { + +protected: + /// The degree of the polynomial. + unsigned degree; + + /** + * \brief Array storing the coefficients. + * + * For a given degree n, there are \f$(n+1)(n+2)/2\f$ monomials. The total + * array thus has \f$(n+1)*(n+2)*(n+3)/6\f$ terms. The array stores all terms + * with degree 0, then degree 1, then degree 2, etc. + */ + std::vector coeffs; + + /** + * \brief Gets the array index for the coefficient of a particular term. + * + * Terms of degree 0 are stored before those of degree 1, etc. + * + * Within a particular degree, think of the problem in the combinatorial "stars + * and bars" idea: there are n stars and two bars dividing them into three + * parts. (Each part corresponds to the number of x, y, or z factors.) The first + * array element will be bars in the 0 and 1 positions, then 0 and 2, ..., 0 and + * n+1, then 1 and 2, etc. + * + * \param[in] pows The powers of x, y, and z for this term. + * \return The array offset, as described above. + */ + static inline unsigned polyIndex(const std::array &pows) { + const unsigned n = pows[0] + pows[1] + pows[2]; + + // calculate the offset within the level of the degree... + // x-y offset. All terms with pows[0] == 0 are first; there are n+1 of them. + // Then pows[0] == 1; there are n, etc. + unsigned ret = (n+1)*pows[0] - (pows[0]-1)*pows[0] / 2; + // y-z offset. how many y factors are there? pows[1]. This value being 0 + // comes first, then 1, then 2, etc. + ret += pows[1]; + + // calculate the offset for smaller degrees. There are (n+1)(n+2)/2 elements + // for degree n; add up all the smaller degrees. + ret += n*(n+1)*(n+2)/6; + + return ret; + } + +public: + /** + * \brief Get the degree of the polynomial. + * + * \return The degree of the polynomial. + */ + unsigned get_degree() const { + return degree; + } + + PolynomialCoeffs() = delete; + + /** + * \brief Create a linear function with the specified coefficients. + * + * \param[in] constant The constant term. + * \param[in] x The coefficient on x. + * \param[in] y The coefficient on y. + * \param[in] z The coefficient on z. + */ + PolynomialCoeffs(const double constant, const double x, const double y, + const double z) : degree(1), coeffs(4) { + + coeffs[polyIndex({{0,0,0}})] = constant; + coeffs[polyIndex({{1,0,0}})] = x; + coeffs[polyIndex({{0,1,0}})] = y; + coeffs[polyIndex({{0,0,1}})] = z; + } + + /** + * \brief Create a polynomial of degree N. + * + * \param[in] N The degree of the polynomial. + */ + PolynomialCoeffs(const unsigned N) + : degree(N), coeffs((N+1)*(N+2)*(N+3)/6) { + + for(double &coeff : coeffs) + coeff = 0.; + } + + /** + * \brief Access the coefficient for the specified term. + * + * \param[in] pows The powers of x, y, and z for this term. + * \return Reference to the array term. + */ + double &operator[] (const std::array &pows) { + return coeffs[polyIndex(pows)]; + } + + /** + * \brief Access the coefficient for the specified term. + * + * \param[in] pows The powers of x, y, and z for this term. + * \return The array term. + */ + double operator[] (const std::array &pows) const { + return coeffs[polyIndex(pows)]; + } + + /** + * \brief Evaluate the polynomial at the specified point. + * + * \note This implemention is a bit naive; it is not intended for + * polynomials with a large degree. + * + * \param[in] pt The point at which the polynomial is evaluated. + * \return The value of the polynomial at the point. + */ + double operator() (const std::array &pt) const; + + /** + * \brief Add two polynomials together. + * + * *this is one of the polynomials. + * + * \param[in] rhs The other polynomial. + * \return The sum of *this and rhs. + */ + PolynomialCoeffs operator+ (const PolynomialCoeffs &rhs) const; + + /** + * \brief Adds another polynomial to this one. + * + * \param[in] rhs The other polynomial. + * \return The sum of *this and rhs, in *this. + */ + PolynomialCoeffs &operator+= (const PolynomialCoeffs &rhs); + + /** + * \brief Multiply a polynomial by a constant value. + * + * *this is one of the polynomials. + * + * \param[in] c The constant value. + * \return The product of c and the polynomial. + */ + PolynomialCoeffs operator* (const double c) const; + + /** + * \brief Scale the polynomial by a constant. + * + * \param[in] c The scale factor. + * \return The scaled polynomial (*this). + */ + PolynomialCoeffs &operator*= (const double c); + + /** + * \brief Multiply two polynomials together. + * + * *this is one of the polynomials. + * + * \param[in] rhs The other polynomial. + * \return The product of *this and rhs. + */ + PolynomialCoeffs operator* (const PolynomialCoeffs &rhs) const; + + /** + * \brief Expands a linear polynomial raised to a power. + * + * Essentially expands the polynomial + * \f[ (coeffs[0] + coeffs[1]*x + coeffs[2]*y + coeffs[3]*z)^j \f] + * into a new PolynomialCoeffs object. That is, output[{{p,q,r}}] is the + * coefficient on the \f$x^p y^q z^r\f$ term. + * + * This function requires multinomial coefficients, which involve + * factorials. We assume that the arguments to the factorials will not + * be large and hard-code small values. An error will be thrown if + * the maximum value is exceeded. + * + * \throw std::runtime_error if the polynomial does not have degree 1. + * + * \param[in] j The exponent of the expansion. + * \return The polynomial, ordered using the polyIndex scheme. + */ + PolynomialCoeffs pow(const unsigned j) const; + +}; // class PolynomialCoeffs + +/** + * \brief Multiply a polynomial by a constant value. + * + * \param[in] c The constant value. + * \param[in] poly The polynomial. + * \return The product of c and the polynomial. + */ +inline PolynomialCoeffs operator* (const double c, const PolynomialCoeffs &poly) { + return poly * c; +} + +} // namespace slymer + +#endif diff --git a/src/madness/mra/funcimpl.h b/src/madness/mra/funcimpl.h index 7ece969de78..b07d15eda4f 100644 --- a/src/madness/mra/funcimpl.h +++ b/src/madness/mra/funcimpl.h @@ -5000,6 +5000,43 @@ namespace madness { } + //template + //static void do_inner_localX(const typename mapT::iterator lstart, + // const typename mapT::iterator lend, + // typename FunctionImpl::mapT* rmap_ptr, + // const bool sym, + // Tensor< TENSOR_RESULT_TYPE(T,R) >* result_ptr, + // Mutex* mutex) { + // Tensor< TENSOR_RESULT_TYPE(T,R) >& result = *result_ptr; + // Tensor< TENSOR_RESULT_TYPE(T,R) > r(result.dim(0),result.dim(1)); + // for (typename mapT::iterator lit=lstart; lit!=lend; ++lit) { + // const keyT& key = lit->first; + // typename FunctionImpl::mapT::iterator rit=rmap_ptr->find(key); + // if (rit != rmap_ptr->end()) { + // const mapvecT& leftv = lit->second; + // const typename FunctionImpl::mapvecT& rightv =rit->second; + // const int nleft = leftv.size(); + // const int nright= rightv.size(); + + // for (int iv=0; iv* iptr = leftv[iv].second; + + // for (int jv=0; jv* jptr = rightv[jv].second; + + // if (!sym || (sym && i<=j)) + // r(i,j) += iptr->trace_conj(*jptr); + // } + // } + // } + // } + // mutex->lock(); + // result += r; + // mutex->unlock(); + //} + template static void do_inner_localX(const typename mapT::iterator lstart, const typename mapT::iterator lend, @@ -5008,7 +5045,7 @@ namespace madness { Tensor< TENSOR_RESULT_TYPE(T,R) >* result_ptr, Mutex* mutex) { Tensor< TENSOR_RESULT_TYPE(T,R) >& result = *result_ptr; - Tensor< TENSOR_RESULT_TYPE(T,R) > r(result.dim(0),result.dim(1)); + //Tensor< TENSOR_RESULT_TYPE(T,R) > r(result.dim(0),result.dim(1)); for (typename mapT::iterator lit=lstart; lit!=lend; ++lit) { const keyT& key = lit->first; typename FunctionImpl::mapT::iterator rit=rmap_ptr->find(key); @@ -5018,23 +5055,26 @@ namespace madness { const int nleft = leftv.size(); const int nright= rightv.size(); - for (int iv=0; ivsize(); + Tensor Left(nleft, size); + Tensor Right(nright, size); + Tensor< TENSOR_RESULT_TYPE(T,R)> r(nleft, nright); + for(unsigned int iv = 0; iv < nleft; ++iv) Left(iv,_) = *(leftv[iv].second); + for(unsigned int jv = 0; jv < nright; ++jv) Right(jv,_) = *(rightv[jv].second); + // call mxmT from mxm.h in tensor + Left = Left.conj(); //Should handle complex case and leave real case alone + mxmT(nleft, nright, size, r.ptr(), Left.ptr(), Right.ptr()); + mutex->lock(); + for(unsigned int iv = 0; iv < nleft; ++iv) { const int i = leftv[iv].first; - const GenTensor* iptr = leftv[iv].second; - - for (int jv=0; jv* jptr = rightv[jv].second; - - if (!sym || (sym && i<=j)) - r(i,j) += iptr->trace_conj(*jptr); + for(unsigned int jv = 0; jv < nright; ++jv) { + const int j = rightv[jv].first; + if (!sym || (sym && i<=j)) result(i,j) += r(iv,jv); } } + mutex->unlock(); } } - mutex->lock(); - result += r; - mutex->unlock(); } static double conj(double x) { From b9a5ba91d7aac6f417b0af46ccbab95396722cf0 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 27 Jun 2018 13:38:59 -0400 Subject: [PATCH 0002/1312] initial commit for dkh --- src/apps/moldft/CMakeLists.txt | 6 + src/apps/moldft/DKhydrogen3.cc | 242 ++++++++++++++ src/apps/moldft/DKops.h | 187 +++++++++++ src/apps/moldft/relops.cc | 558 +++++++++++++++++++++++++++++++++ src/apps/moldft/rk-2.cc | 435 +++++++++++++++++++++++++ 5 files changed, 1428 insertions(+) create mode 100644 src/apps/moldft/DKhydrogen3.cc create mode 100644 src/apps/moldft/DKops.h create mode 100644 src/apps/moldft/relops.cc create mode 100644 src/apps/moldft/rk-2.cc diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index 4c695c2c7ea..f882ff2d68c 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -18,4 +18,10 @@ target_link_libraries(testperiodic_moldft MADchem) add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) target_link_libraries(DFdriver MADchem MADmra) +add_executable(rk relops.cc rk-2.cc) +target_link_libraries(rk MADchem MADmra -lgmp -lmpfr) + +add_executable(dk DKhydrogen3.cc) +target_link_libraries(dk MADchem MADmra -lgmp -lmpfr) + install(TARGETS moldft mcpfit DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/moldft/DKhydrogen3.cc b/src/apps/moldft/DKhydrogen3.cc new file mode 100644 index 00000000000..4c8ff3b4aa7 --- /dev/null +++ b/src/apps/moldft/DKhydrogen3.cc @@ -0,0 +1,242 @@ +//Solves for the ground state energy of the hydrogenic atom +//Using first-order Douglas Kroll +// +//TODO: +//1. Update operators. Current ones are only accurate to ~1e-10 (fixed, I think) +//2. Update rele, calculating the expectation value of the Hamiltonian: Using the straight potential is wrong. + +#include +#include +#include +#include //for atoi +#include +#include "DKops.h" + +using namespace madness; + +static const long k = 8; //wavelet order in madness +static const double thresh = 1e-6; //desired precision when refining +static const double speedoflight = 137.0359895; //speed of light +static const double PI = constants::pi; //mmm, pie +static const double small = 1e-8; // shortest length scale we want to resolve + +static double ttt; +static void START_TIMER(World& world){ + world.gop.fence(); + ttt=wall_time(); +} + +static void END_TIMER(World& world, char* message){ + world.gop.fence(); + ttt = wall_time() - ttt; + if(world.rank()==0) print(message, ttt); +} + +//Functor to make the nuclear potential, slightly perturbed to remove singularity +class PotentialFunctor : public FunctionFunctorInterface { + private: + int m_Z; + public: + PotentialFunctor(int Z){ + m_Z = Z; + } + double operator() (const coord_3d&r) const { + return -m_Z/(sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]+small*small)); + } +}; + +//norelativistic ground state functor +class NRGFunctor : public FunctionFunctorInterface { + private: + int m_Z; + + public: + NRGFunctor(int Z){ + m_Z = Z; + } + + double operator() (const coord_3d& r) const { + return std::exp(-m_Z*std::sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]+small*small)); + } + +}; + +double exact_energy(double Z) { + double c = speedoflight; + double d = sqrt(1 - Z*Z/(c*c)); + return c*c / sqrt(1.0 + Z*Z/(c*c*d*d)) - c*c; // may lose a few digits +} + + +double rele(World& world, const real_function_3d& psi, const real_function_3d Vpsi, real_convolution_3d& Pbarop, real_function_3d& Vnuc){ + if(world.rank() == 0) print("Now in rele"); + real_function_3d result = real_factory_3d(world); + double answer(0.0); + for(int axis = 0; axis < 3; axis++){ + real_derivative_3d D = free_space_derivative(world,axis); + real_function_3d dpsi = D(psi); + dpsi = D(dpsi); + result -= 0.5*dpsi; + } + + answer = inner(psi,result)/inner(psi,psi); + if(world.rank()==0) print(" Nonrelativistic KE: ", answer); + + result = apply(Pbarop, result); + result.scale(2.0*speedoflight); + answer = inner(psi,result)/inner(psi,psi); + + answer = answer/pow(2.0*PI,1.5); //I can't find this factor in my notes but I know it's here..... + + if(world.rank()==0) print(" Relativistic KE: ", answer); + + double PE = inner(psi, Vnuc*psi)/inner(psi,psi); + + if(world.rank()==0) print("Non-adjusted potential energy: ", PE); + + //double PE = inner(psi,Vpsi)/inner(psi,psi); //not really the potential energy + + //if(world.rank()==0) print(" Adjusted potential energy: ", PE); + + return answer + PE; +} + +real_function_3d makerightside(World& world, real_function_3d& V, real_function_3d& psi, real_convolution_3d& PbarAop, real_convolution_3d& Aop){ + + if(world.rank()==0) print("now in makerightside"); + real_function_3d Vpsi = V*psi; + Vpsi.truncate(); + real_function_3d AVpsi = apply(Aop,Vpsi); + real_function_3d VApsi = V*apply(Aop,psi); + real_function_3d AVApsi = apply(Aop,VApsi); + + real_function_3d result = 4.0*pow(PI,3.0)*Vpsi + 2.0*pow(PI,1.5)*(AVpsi + VApsi) + AVApsi; + //result = pow(2.0*PI,-1.5)*result; + //real_function_3d result = 0.5*Vpsi + (1.0/sqrt(2.0))*(AVpsi + VApsi) + AVApsi; + + + //double ttemp = inner(psi,result)/inner(psi,psi); + //if(world.rank()==0) print("AVApsi expectation value:", ttemp); + if(world.rank()==0) print(" made functions"); + + result = pow(2*PI,-3.0)*result; //I can't find this factor in my notes either, but it has to be in here.... + result.truncate(); + + real_function_3d temporary(world); + for(int axis=0; axis<3; axis++){ + real_derivative_3d D = free_space_derivative(world,axis); + real_function_3d t = D(psi); + t = apply(PbarAop,t); + t = V*t; + t = D(t); + t = apply(PbarAop,t); + temporary += t; + } + temporary = pow(2.0*PI,-1.5)*temporary; + + //ttemp = inner(temporary,psi)/inner(psi,psi); + //if(world.rank()==0) print("APVPApsi expectation value: ", ttemp); + if(world.rank()==0) print("made result"); + + result = result + temporary; + + //ttemp = result.norm2(); + //if(world.rank()==0) print("Made a rightside! Norm is: ", ttemp); + + return result; +} + +double iterate(World& world, real_function_3d Vpsi, real_function_3d& psi, real_convolution_3d& Ebarop){ + + Vpsi.truncate(); //Vpsi should already contain the result of makerightside + Vpsi.scale(-1.0); //move Vpsi to the right hand side of the equation + + real_function_3d tmp = apply(Ebarop, Vpsi); + double norm = tmp.norm2(); + tmp.scale(1.0/norm); + real_function_3d residual = psi-tmp; + double resid = residual.norm2(); + if(world.rank()==0) print("Residual: ", resid); + psi = tmp; + + return resid; + + +} + +int main(int argc, char** argv){ + //set up parallel environment (this is boiler-plate) + initialize(argc, argv); + World world(SafeMPI::COMM_WORLD); + startup(world,argc,argv); + std::cout.precision(10); + int Z = atoi(argv[1]); + + //some of our madness parameters depend on Z: + const double L = 46.0/Z; + const double initialguessenergy = -Z*Z/2.0; + + + //Set necessary madness parameters + FunctionDefaults<3>::set_k(k); + FunctionDefaults<3>::set_thresh(thresh); + FunctionDefaults<3>::set_truncate_mode(1); + FunctionDefaults<3>::set_cubic_cell(-L/2,L/2); + //FunctionDefaults<3>::set_initial_level(5); + + //Starting guess is the nonrelativistic exact solution + NRGFunctor nonrelguess(Z); + real_function_3d psi = real_factory_3d(world).functor(nonrelguess); + double normconst = psi.norm2(); + psi.scale(1.0/normconst); + + //make potential + PotentialFunctor myV(Z); + real_function_3d Vnuc = real_factory_3d(world).functor(myV).truncate_mode(0); + + //make operators + real_convolution_3d Pbarop = Pbar(world); + real_convolution_3d Aop = A(world); + real_convolution_3d PbarAop = PbarA(world); + real_function_3d rightside = makerightside(world, Vnuc, psi, PbarAop, Aop); + + + double energy = initialguessenergy; + const double exact = exact_energy(Z); + double residual = 1.0/thresh; + int iter = 1; + if(world.rank()==0) { + print("\n Box Width: ", L); + print(" Wavelet Order: ", k); + print(" Refinement Threshold: ", thresh); + print(" Z: ", Z); + print(" Exact Dirac Energy: ", exact); + print(" Starting Energy: ", energy, "\n"); + } + + + //iterate solution + //while(residual > sqrt(thresh)){ + while(residual > sqrt(thresh)/10.0 or iter < 4){ + psi.truncate(); + if(world.rank()==0) print("Iteration: ", iter++); + real_convolution_3d Ebarop = Ebar(world,energy); + residual = iterate(world, rightside, psi, Ebarop); + rightside = makerightside(world, Vnuc, psi, PbarAop, Aop); + energy = rele(world, psi, rightside, Pbarop, Vnuc); + if(world.rank()==0) print("Energy: ", energy); + //energy = exact; + } + + if(world.rank()==0) { + print("\nFinal Energy: ", energy); + print("Calculated Relativistic Correction: ", initialguessenergy - energy); + print("Scaled Energy (-eps/Z^2): ", -energy/(Z*Z), "\n"); + } + + world.gop.fence(); + finalize(); + return 0; +} + +//kthxbye diff --git a/src/apps/moldft/DKops.h b/src/apps/moldft/DKops.h new file mode 100644 index 00000000000..6aeafa47b17 --- /dev/null +++ b/src/apps/moldft/DKops.h @@ -0,0 +1,187 @@ +#ifndef MADNESS_APPS_MOLDFT_DKOPS_H_INCLUDED +#define MADNESS_APPS_MOLDFT_DKOPS_H_INCLUDED + + +#include +#include +#include + +//#include "../../../../mpfrc++-3/mpreal.h" + +using namespace madness; + +static const double opthresh = 1e-16; + +double q(double t){ + return exp(-t); +} + +double w(double t, double eps){ + double c = 137.0359895; + double PI = constants::pi; + return 1.0/(c*sqrt(PI))*exp(-1.0/2.0*t-c*c*exp(-t))-(1.0+eps/(c*c))*exp((2.0*eps+(eps*eps)/(c*c))*exp(-t)-t)*(erfc((c+eps/c)*(exp(-t/2.0)))-2.0); +} + +double Ebark(double t, double eps){ + double R = 1e-8; + return pow(1.0/(2.0*q(t)), 1.5)*w(t, eps)*exp(-1.0/(4.0*q(t))*R*R); +} + +real_convolution_3d Ebar(World& world, double eps){ + Vector args = vec(0.0,0.0,0.0); + + + std::vector cvec; + std::vector tvec; + + double dt = 1.0/8.0; + double tval = -10.0; + while(tval < 100.0){ + + if(Ebark(tval, eps) > opthresh){ + //if(world.rank()==0) print(" Ebark(",tval,",",eps," = ",Ebark(tval,eps)); + cvec.push_back(dt/pow(2.0*q(tval),1.5)*w(tval,eps)); + tvec.push_back(1.0/(4.0*q(tval))); + } + //else{ + //if(world.rank()==0) print("Ebark(",tval,",",eps," = ",Ebark(tval,eps)); + + //} + tval = tval + dt; + } + + Tensor ctensor(cvec.size()); + Tensor ttensor(tvec.size()); + for(int i = 0; i < cvec.size(); i++){ + ctensor[i] = cvec[i]; + ttensor[i] = tvec[i]; + } + + int n = cvec.size(); + if(world.rank()==0) print("Made an Ebar! n = ",n); + //if(world.rank()==0) print("Made an Ebar! Here's what's inside:\n\nc:\n",ctensor,"\nt:\n",ttensor); + + //test ebar? + /* + if(world.rank()==0) print("Testing Ebar. Value should be ~22.680321967196"); + double testvalue = 0.0; + for(int i = 0; i < cvec.size(); i++){ + testvalue += ctensor[i]*exp(-1e-2*ttensor[i]); + } + if(world.rank()==0) print("And the result is: ", testvalue); + */ + + //return real_convolution_3d(world, args, ctensor, ttensor); + return real_convolution_3d(world, ctensor, ttensor); +} + +real_convolution_3d Ebar_fixed(World& world){ + //Tensor c(305l), t(305l); + std::vector c(365), t(365); + Vector args = vec(0.0,0.0,0.0); + #include "RelCoeffs/Ebar_coeffs.dat" + int n = 305; + + for(int i=0; i < n; i++){ + if(c[i]*exp(-t[i]*1e-16) < opthresh){ + c.erase(c.begin()+i); + t.erase(t.begin()+i); + i--; + n--; + } + } + + //print("n = ", n); + + Tensor ctens(n), ttens(n); + for(int i = 0; i < n; i++){ + ctens[i] = c[i]; + ttens[i] = t[i]; + } + //if(world.rank()==0) print("Made a Ebar (fixed)! n = ", n); + //if(world.rank()==0) print("Made a Pbar! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); + //return real_convolution_3d(world, args, ctens, ttens); + return real_convolution_3d(world, ctens, ttens); +} + +real_convolution_3d Pbar(World& world){ + //Tensor c(305l), t(305l); + std::vector c(564), t(564); + Vector args = vec(0.0,0.0,0.0); + #include "RelCoeffs/Pbar_coeffs.dat" + int n = c.size(); + + for(int i=0; i < n; i++){ + if(c[i]*exp(-t[i]*1e-30) < opthresh){ + c.erase(c.begin()+i); + t.erase(t.begin()+i); + i--; + n--; + } + } + + //print("n = ", n); + + Tensor ctens(n), ttens(n); + for(int i = 0; i < n; i++){ + ctens[i] = c[i]; + ttens[i] = t[i]; + } + if(world.rank()==0) print("Made a Pbar! n = ", n); + //if(world.rank()==0) print("Made a Pbar! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); + //return real_convolution_3d(world, args, ctens, ttens); + return real_convolution_3d(world, ctens, ttens); +} + +real_convolution_3d A(World& world){ + //Tensor c(301l), t(301l); + std::vector c(561), t(561); + Vector args = vec(0.0,0.0,0.0); + #include "RelCoeffs/A_coeffs.dat" + int n = c.size(); + + for(int i=0; i < n; i++){ + if(c[i]*exp(-t[i]*1e-30) < opthresh){ + c.erase(c.begin()+i); + t.erase(t.begin()+i); + i--; + n--; + } + } + + Tensor ctens(n), ttens(n); + for(int i = 0; i < n; i++){ + ctens[i] = c[i]; + ttens[i] = t[i]; + } + if(world.rank()==0) print("Made an A!, n = ", n); + //if(world.rank()==0) print("Made an A! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); + //return real_convolution_3d(world, args, ctens, ttens); + return real_convolution_3d(world, ctens, ttens); +} + +real_convolution_3d PbarA(World& world){ + //Tensor c(441l), t(441l); + std::vector c(300), t(300); + Vector args = vec(0.0,0.0,0.0); + #include "RelCoeffs/PbarA_coeffs.dat" + int n = c.size(); + for(int i=0; i < n; i++){ + if(c[i]*exp(-t[i]*1e-30) < opthresh){ + c.erase(c.begin()+i); + t.erase(t.begin()+i); + i--; + n--; + } + } + Tensor ctens(n), ttens(n); + for(int i = 0; i < n; i++){ + ctens[i] = c[i]; + ttens[i] = t[i]; + } + if(world.rank()==0) print("Made a PbarA!, n = ", n); + //if(world.rank()==0) print("Made a PbarA! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); + //return real_convolution_3d(world, args, ctens, ttens); + return real_convolution_3d(world, ctens, ttens); +} +#endif diff --git a/src/apps/moldft/relops.cc b/src/apps/moldft/relops.cc new file mode 100644 index 00000000000..f1622b0ebde --- /dev/null +++ b/src/apps/moldft/relops.cc @@ -0,0 +1,558 @@ +#include +#include +#include +#include +#include //for erfc + +#include "../../../../mpfrc++-3/mpreal.h" + +static const double m = 1.0; +static const double c = 137.0359895; +static const double mc2 = m*c*c; +static const double PI = 3.14159265358979323846264338328; + +/// Exponents in Fourier space quadrature over t +double q(double t) { + return std::exp(-t)/(m*m*c*c); +} + +// Convert Fourier gaussian exponent a into real space exponent +double Q(double a) { + return 0.25/a; +} + +/// Additional factor when transforming gaussian exponent a from fourier to real space +double C(double a) { + return 0.125/std::pow(a*PI,1.5); +} + + +/// This fast summation of an oscillating series is based upon Pade. + +/// http://people.mpim-bonn.mpg.de/zagier/files/exp-math-9/fulltext.pdf +/// +/// For Tbar I think it works for the right reasons for t>0 but for large negative t I think it gets lucky. +/// C(k) is a function/functor that returns the k'th term in the series for k=0,...,nmax +template +double fastsum_oscillating(const T& C, int nmax) { + double d, b, c, s, k; + + d = std::pow(3.0+sqrt(8.0),nmax); + d = (d+1.0/d)*0.5; + b = -1.0; + c = -d; + s = 0.0; + for (k=0; k 100.0) { + return 0.0; + } + else { + double a = fastsum_oscillating(Tbar_omega(t), 35); + //return (2.0*c/sqrt(PI)*exp(t-c*c*exp(-t))-2.0*c*c*exp(t/2.0)*erfc(c*exp(-t/2.0)))/pow(2*PI,3.0); //doesn't work + double b = 2.0*c/sqrt(PI)*exp(-t/2.0)*exp(-c*c*exp(-t))-2.0*c*c*exp(-t)*erfc(c*exp(-t/2.0)); + //printf("t: %f \nold: %f \nnew: %f\n\n",t,a,b); + return b; + } +} + + +/// Computes at quadrature point t the infinte Fourier-space sum defining A +double a_OMEGA(double t) { + if (t < -4.0 || t > 100.0) { + return 0.0; + } + else { + return fastsum_oscillating(A_omega(t), 35); + } +} + +/// Computes at quadrature point t the infinte Fourier-space sum defining Pbar + +/// Computes at quadrature point t the infinte Fourier-space sum defining Pbar +double pbar_OMEGA(double t) { + if (t < -4.0 || t > 100.0) { + return 0.0; + } + else { + //return fastsum_oscillating(Pbar_omega(t), 35); + double b = 1.0/sqrt(PI)*exp(-t/2.0)*exp(-c*c*exp(-t))-c*exp(-t)*erfc(c*exp(-t/2.0)); + return b; + } +} + +/// Computes at quadrature point t the infinte Fourier-space sum defining APbar +double apbar_OMEGA(double t) { + if (t < -4.0 || t > 100.0) { + return 0.0; + } + else { + return fastsum_oscillating(APbar_omega(t), 35); + } +} + + +// adjust quadrature points onto common mesh for all operators +void munge_quadrature_points(int& npt, double& tlo, double& thi, double& h) { + //std::cout << "munge before " << npt << " " << tlo << " " << thi << " " << h << std::endl; + h = floor(64.0*h)/64.0; + + // Round thi/lo up/down to an integral multiple of quadrature + // points by using a common origin below that used by any operator + + const double base = -1000.0; + tlo = base + floor((tlo-base)/h)*h; + thi = base + ceil((thi-base)/h)*h; + npt = ceil(thi-tlo)/h+1; + //std::cout << "munge after " << npt << " " << tlo << " " << thi << " " << h << std::endl; +} + +double relops_h(const double quadacc) { + return -5.0/std::log10(std::min(1e-6,quadacc)); +} + + +void tbar_fit(const double dx, const double thresh, const double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta) { + const double expnt_max = 1.0/(dx*dx); + + double h = relops_h(quadacc); //CHANGE THIS TO REFLECT OPERATOR USED IN MAPLE CODE + double tlo = -4.0; + double thi = 90.0; + int npt; + + munge_quadrature_points(npt, tlo, thi, h); + + coeffs.clear(); + expnts.clear(); + + double sum = 0.0; + double sum_trunc = 0.0; + + Cdelta = 0.0; + + for (int i=0; i expnt_max) { + Cdelta += coeff*norm; + } + else if (coeff > 0.1*thresh) { + coeffs.push_back(coeff); + expnts.push_back(expnt); + + sum_trunc += coeff*norm; + + //std::cout << coeff << " " << expnt << std::endl; + } + } + + double trace = 1.0; + + // std::cout << "Tbar: " << npt << " " << coeffs.size() << std::endl; + // std::cout << "Tbar: " << sum << " " << std::abs(trace-sum) << std::endl; + // std::cout << "Tbar: " << sum_trunc << " " << std::abs(trace-sum_trunc) << std::endl; + // std::cout << "Tbar: " << sum_trunc+Cdelta << " " << std::abs(trace-sum_trunc-Cdelta)<< std::endl; + // std::cout << std::endl; +} + +void pbar_fit(const double dx, const double thresh, const double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta) { + const double expnt_max = 1.0/(dx*dx); + + double h = relops_h(quadacc); + double tlo = -4.0; + double thi = 90.0; + int npt; + + munge_quadrature_points(npt, tlo, thi, h); + + coeffs.clear(); + expnts.clear(); + + double sum = 0.0; + double sum_trunc = 0.0; + + Cdelta = 0.0; + + for (int i=0; i expnt_max) { + Cdelta += coeff*norm; + } + else if (coeff > 0.1*thresh) { + coeffs.push_back(coeff); + expnts.push_back(expnt); + + sum_trunc += coeff*norm; + + //std::cout << coeff << " " << expnt << std::endl; + } + } + + double trace = 0.5/(c*m); + + // std::cout << "Pbar: " << npt << " " << coeffs.size() << std::endl; + // std::cout << "Pbar: " << sum << " " << std::abs(trace-sum) << std::endl; + // std::cout << "Pbar: " << sum_trunc << " " << std::abs(trace-sum_trunc) << std::endl; + // std::cout << "Pbar: " << sum_trunc+Cdelta << " " << std::abs(trace-sum_trunc-Cdelta)<< std::endl; + // std::cout << std::endl; +} + +void apbar_fit(const double dx, const double thresh, const double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta) { + const double expnt_max = 1.0/(dx*dx); + + double h = relops_h(quadacc); + double tlo = -4.0; + double thi = 90.0; + int npt; + + munge_quadrature_points(npt, tlo, thi, h); + + coeffs.clear(); + expnts.clear(); + + double sum = 0.0; + double sum_trunc = 0.0; + + Cdelta = 0.0; + + for (int i=0; i expnt_max) { + Cdelta += coeff*norm; + } + else if (coeff > 0.1*thresh) { + coeffs.push_back(coeff); + expnts.push_back(expnt); + + sum_trunc += coeff*norm; + + //std::cout << coeff << " " << expnt << std::endl; + } + } + + double trace = 0.5/(c*m); + + // std::cout << "Apbar: " << npt << " " << coeffs.size() << std::endl; + // std::cout << "Apbar: " << sum << " " << std::abs(trace-sum) << std::endl; + // std::cout << "Apbar: " << sum_trunc << " " << std::abs(trace-sum_trunc) << std::endl; + // std::cout << "Apbar: " << sum_trunc+Cdelta << " " << std::abs(trace-sum_trunc-Cdelta)<< std::endl; + // std::cout << std::endl; +} + + +void a_fit(const double dx, const double thresh, const double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta) { + const double expnt_max = 1.0/(dx*dx); + + double h = relops_h(quadacc); + double tlo = -4.0; + double thi = 90.0; + int npt; + + munge_quadrature_points(npt, tlo, thi, h); + + coeffs.clear(); + expnts.clear(); + + double sum = 0.0; + double sum_trunc = 0.0; + + Cdelta = 0.0; + + for (int i=0; i expnt_max) { + Cdelta += coeff*norm; + } + else if (coeff > 0.1*thresh) { + coeffs.push_back(coeff); + expnts.push_back(expnt); + + sum_trunc += coeff*norm; + + //std::cout << coeff << " " << expnt << std::endl; + } + } + + Cdelta += sqrt(0.5); + + double trace = 1.0; + // std::cout << "A: " << npt << " " << coeffs.size() << std::endl; + // std::cout << "A: " << sum_trunc+Cdelta << " " << std::abs(trace-sum_trunc-Cdelta)<< std::endl; + // std::cout << std::endl; +} + + +double bshrel_omega(double t, int k, double epsilon) { + // return + // std::pow(mc2, -(k+1.0)) * + // std::pow(mc2 + epsilon, (double) k) * + // std::exp(-std::exp(-t) - 0.5*(k+1.0)*t - lgamma(0.5*(k+1))); + + // std::cout << std::endl; + // std::cout << t << " " << k << " " << epsilon << std::endl; + // std::cout << std::exp(-t) << std::endl; + // std::cout << 0.5*(k+1.0)*t << std::endl; + // std::cout << lgamma(0.5*(k+1)) << std::endl; + // std::cout << std::endl; + + // Note, cancellation for large k and negative t so must use extended precision + if (t>0.0) { + // return + // std::pow(1 + epsilon/mc2, (double) k) * + // std::exp(-std::exp(-t) - 0.5*(k+1.0)*t - lgamma(0.5*(k+1))) / mc2; + return + std::exp(-std::exp(-t) - 0.5*(k+1.0)*t - std::lgamma(0.5*(k+1)) + k*std::log(1.0 + epsilon/mc2)) / mc2; + } + else { + mpfr::mpreal mt=t, mk=k, half=0.5, one=1.0, meps=epsilon, mmc2=mc2; + mpfr::mpreal arg = -mpfr::exp(-mt) - half*(mk+one)*mt - mpfr::lngamma(half*(mk+one)) + mk*mpfr::log(1.0 + meps/mmc2); + mpfr::mpreal val = mpfr::exp(arg)/mmc2; + return double(val); + } +} + + +/* +double bshrel_OMEGA(double t, double epsilon) { + const double thresh = 1e-20; + const int kk = std::ceil(2*std::exp(-t)); + double value=0.0; + + int k = kk; + while (true) { + double term = bshrel_omega(t, k, epsilon); + value += term; + k++; + if (term < thresh) break; + } + + k = kk-1; + while (true) { + if (k<0) break; + double term = bshrel_omega(t, k, epsilon); + value += term; + k--; + if (term < thresh) break; + } + + return value; +} +*/ + + +double bshrel_OMEGA(double t, double epsilon) { + //printf("bshrel_OMEGA called with t = %f\n",t); + double result = 1/(c*sqrt(8*PI))*exp(t-c*c*exp(-t))-1/sqrt(8)*(1+epsilon/(c*c))*exp((2*epsilon+epsilon*epsilon/(c*c))*exp(-t)+t/2.0)*(erfc((c+epsilon/c)*exp(-t/2.0))-2); + result = result/pow(2*PI,3.0/2.0); + return result; +} + + +void bshrel_fit(double epsilon, const double dx, const double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta) { + const double tlo = -5.0; + const double thi = 80.0; + //const int npt = 200; // about 4 digits in 2-norm of operator + //const int npt = 300; // about 7 digits + // const int npt = 400; // about 9 digits // was using this + //const int npt = 500; // about 11 digits + //const int npt = 600; // about 12 digits + //const int npt = 800; + const int npt = 350; + + const double h = (thi-tlo)/(npt-1); + + const double expnt_max = 1.0/(dx*dx); + + //std::cout << "h " << h << std::endl; + + coeffs.clear(); + expnts.clear(); + + double sum = 0.0; + + double sum_trunc = 0.0; + + Cdelta = 0.0; + + for (int i=0; i expnt_max) { + Cdelta += coeff*norm; + } + else if (coeff > 0.1*thresh) { + coeffs.push_back(coeff); + expnts.push_back(expnt); + + sum_trunc += coeff*norm; + + //std::cout << coeff << " " << expnt << std::endl; + } + } + + //std::cout << sum << " " << -1.0/epsilon << " " << std::abs((sum+1.0/epsilon)*epsilon) << std::endl; + //std::cout << sum_trunc << " " << -1.0/epsilon << " " << std::abs((sum_trunc+1.0/epsilon)*epsilon) << std::endl; + //std::cout << sum_trunc << " " << -1.0/epsilon << " " << std::abs((sum_trunc+1.0/epsilon)*epsilon) << std::endl; +} + +bool check(double value, double correct, double thresh, const char* msg) { + double err = std::abs(value-correct); + if (err<=thresh) { + std::cout << msg << " : passed " << std::endl; + return true; + } + else { + std::cout << msg << " : failed |" << value << "-" << correct << "| = " << err << " > " << thresh << std::endl; + return false; + } +} + +// int main() { +// mpfr::mpreal::set_default_rnd(GMP_RNDN); +// mpfr::mpreal::set_default_prec(256); + +// // // std::cout.precision(16); +// // // check(bshrel_omega(0.1,3,-0.01),0.0000176402701584786376862159169871,1e-20,"omega(.1, 3, -0.1e-1)"); +// // // check(bshrel_OMEGA(1.0,-0.01),0.000044133601851009832964,1e-19,"OMEGA(1.0,-0.01)"); +// // // check(bshrel_OMEGA(0.1,-0.01),0.000099327541717740664618,1e-19,"OMEGA(0.1,-0.01)"); +// // // check(bshrel_OMEGA(-1.0,-0.01),0.000289917644952772489991,1e-19,"OMEGA(-1.0,-0.01)"); +// // // check(bshrel_OMEGA(-10.0,-0.01),2.29148640330432807356574,1e-19,"OMEGA(-10.0,-0.01)"); + +// std::vector coeffs, expnts; +// double Cdelta; +// // // bshrel_fit(-6500.0,coeffs,expnts,Cdelta); +// // // bshrel_fit(-0.1,coeffs,expnts,Cdelta); + +// check(A_omega(0.1)(3),0.00914998206504088871,1e-14,"Aomega(0.1)(3)"); +// check(Pbar_omega(0.1)(3),0.0024173557380369478775,1e-14,"Pbaromega(0.1)(3)"); +// check(APbar_omega(0.1)(3),0.000534165198408167875,1e-14,"APbaromega(0.1)(3)"); +// check(apbar_OMEGA(0.1),0.0006128434915269844710,1e-14,"apbarOMEGA(0.1)"); + +// // tbar_fit(1e-6, 1e-6, 1e-6, coeffs,expnts,Cdelta); +// // tbar_fit(1e-6, 1e-6, 1e-8, coeffs,expnts,Cdelta); +// // tbar_fit(1e-6, 1e-6, 1e-10, coeffs,expnts,Cdelta); +// // tbar_fit(1e-6, 1e-6, 1e-12, coeffs,expnts,Cdelta); +// // tbar_fit(1e-6, 1e-6, 1e-14, coeffs,expnts,Cdelta); +// // tbar_fit(1e-6, 1e-6, 1e-16, coeffs,expnts,Cdelta); + +// // a_fit(1e-6, 1e-6, 1e-6, coeffs,expnts,Cdelta); +// // a_fit(1e-6, 1e-6, 1e-8, coeffs,expnts,Cdelta); +// // a_fit(1e-6, 1e-6, 1e-10, coeffs,expnts,Cdelta); +// // a_fit(1e-6, 1e-6, 1e-12, coeffs,expnts,Cdelta); +// // a_fit(1e-6, 1e-6, 1e-14, coeffs,expnts,Cdelta); +// // a_fit(1e-6, 1e-6, 1e-16, coeffs,expnts,Cdelta); + +// // pbar_fit(1e-6, 1e-6, 1e-6, coeffs,expnts,Cdelta); +// // pbar_fit(1e-6, 1e-6, 1e-8, coeffs,expnts,Cdelta); +// // pbar_fit(1e-6, 1e-6, 1e-10, coeffs,expnts,Cdelta); +// // pbar_fit(1e-6, 1e-6, 1e-12, coeffs,expnts,Cdelta); +// // pbar_fit(1e-6, 1e-6, 1e-14, coeffs,expnts,Cdelta); +// // pbar_fit(1e-6, 1e-6, 1e-16, coeffs,expnts,Cdelta); + +// apbar_fit(1e-6, 1e-6, 1e-6, coeffs,expnts,Cdelta); +// apbar_fit(1e-6, 1e-6, 1e-8, coeffs,expnts,Cdelta); +// apbar_fit(1e-6, 1e-6, 1e-10, coeffs,expnts,Cdelta); +// apbar_fit(1e-6, 1e-6, 1e-12, coeffs,expnts,Cdelta); +// apbar_fit(1e-6, 1e-6, 1e-14, coeffs,expnts,Cdelta); +// apbar_fit(1e-6, 1e-6, 1e-16, coeffs,expnts,Cdelta); + +// return 0; +// } + diff --git a/src/apps/moldft/rk-2.cc b/src/apps/moldft/rk-2.cc new file mode 100644 index 00000000000..0ccd1008af7 --- /dev/null +++ b/src/apps/moldft/rk-2.cc @@ -0,0 +1,435 @@ +#include +#include +#include +#include +#include + +void apbar_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); +void pbar_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); +void a_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); +void tbar_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); +void bshrel_fit(double epsilon, double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); + +using namespace madness; + +static double Z = -1; + +// Nuclear half-charge radius of H (proton) is 1.3e-5 and the exponent +// of its finite-size Gaussian approximation is 2.12e9. So this +// choice for dx resolves one-two orders of magnitude finer scale. +static const double op_dx=1e-16; //TRY CHANGING THIS 1e-16 +static const double op_quadacc=1e-8; //FIND ALL INSTANCES OF THIS AND DEAL WITH IT +static const double op_thresh=1e-8; + +static const long k = 8; // wavelet order +static const double thresh = 1e-6; // precision +static const double L = 50.0; // box size + +static const bool FINITENUC = false; + +// Pick ONE of the following three +static const bool NONREL = false; +static const bool RK = false; +static const bool DK1 = true; + +class FiniteNucleusPotential : public FunctionFunctorInterface { + const double xi; + + static double expnt(int Z) { + const Vector xi + {2.1248239171e+09,1.1671538870e+09,8.9266848806e+08,7.8788802914e+08,7.1178709563e+08,6.8077502929e+08,6.2865615725e+08,5.8631436655e+08,5.3546911034e+08,5.2105715255e+08,4.8349721509e+08,4.7254270882e+08,4.4335984491e+08,4.3467748823e+08,4.1117553148e+08,4.0407992047e+08,3.8463852873e+08,3.5722217300e+08,3.6228128110e+08,3.5722217300e+08,3.3451324570e+08,3.2263108827e+08,3.1181925878e+08,3.0842641793e+08,2.9881373610e+08,2.9578406371e+08,2.8716667270e+08,2.8996391416e+08,2.7665979354e+08,2.7419021043e+08,2.6267002737e+08,2.5235613399e+08,2.5042024280e+08,2.4130163719e+08,2.4305454351e+08,2.3461213272e+08,2.3301551109e+08,2.2839354730e+08,2.2690621893e+08,2.2544431039e+08,2.2120420724e+08,2.1458511597e+08,2.1458511597e+08,2.0965270287e+08,2.0846586999e+08,2.0500935221e+08,2.0389047621e+08,1.9648639618e+08,1.9548577691e+08,1.9067718154e+08,1.8975246242e+08,1.8193056289e+08,1.8444240538e+08,1.8030529331e+08,1.7950688281e+08,1.7565009043e+08,1.7490463170e+08,1.7416744147e+08,1.7343837120e+08,1.7129844956e+08,1.7060044589e+08,1.6591550422e+08,1.6527352089e+08,1.6215880671e+08,1.6155419421e+08,1.5977529080e+08,1.5977529080e+08,1.5636673634e+08,1.5581702004e+08,1.5314257850e+08,1.5262201512e+08,1.5008710340e+08,1.4959325643e+08,1.4813689532e+08,1.4671710337e+08,1.4442808782e+08,1.4398142103e+08,1.4309883584e+08,1.4223027307e+08,1.4011788914e+08,1.3888925203e+08,1.3768840081e+08,1.3729411599e+08,1.3729411599e+08,1.3690277000e+08,1.3242350205e+08,1.3206733609e+08,1.3101367628e+08,1.3066730974e+08,1.2897067480e+08,1.2930539512e+08,1.2700881714e+08,1.2733038109e+08,1.2512299012e+08,1.2543221826e+08,1.2420711085e+08,1.2420711085e+08,1.2301273547e+08,1.2271879740e+08,1.2127611477e+08,1.2099285491e+08,1.2071131346e+08,1.1987683191e+08,1.2015331850e+08,1.1987683191e+08,1.1960199758e+08,1.1987683191e+08,1.1905722195e+08,1.1878724932e+08}; + + if (Z < 1) return 1.0/(op_dx*op_dx); // Use point charge if Z<1 + else return xi[Z]; + } + +public: + FiniteNucleusPotential(int Z) : xi(expnt(Z)) {} + + double operator()(const coord_3d& r) const { + const double x=r[0], y=r[1], z=r[2]; + const double R=sqrt(x*x+y*y+z*z); + const double arg=R*sqrt(xi); + double q = -Z; + if (arg<6) q *= std::erf(arg); + return q/R; + } +}; + +/// Given coefficients and exponents make the 3D operator adding delta part to last Gaussian +real_convolution_3d make_operator(World& world, + const std::vector& C, + const std::vector& T, + double Cdelta) { + Tensor c(C.size()), t(T.size()); + + for (unsigned int i=0; i +make_grad_operator(World& world, + std::vector C, // TAKES A COPY SINCE WE MODIFY TI + const std::vector T, + const double Cdelta, + int k=FunctionDefaults<3>::get_k()) +{ + //typedef SeparatedConvolution real_convolution_3d; + //typedef std::shared_ptr real_convolution_3d_ptr; + const double pi = constants::pi; + const Tensor width = FunctionDefaults<3>::get_cell_width(); + double hi = width.normf(); // Diagonal width of cell + + const int rank = C.size(); + + C[rank-1] += Cdelta * pow(T[rank-1]/constants::pi,1.5); + + std::vector gradG(3); + + for (int dir=0; dir<3; dir++) { + std::vector< ConvolutionND > ops(rank); + for (int mu=0; mu::get(k, T[mu]*width[d]*width[d], 0, false)); + } + ops[mu].setop(dir,GaussianConvolution1DCache::get(k, T[mu]*width[dir]*width[dir], 1, false)); + } + gradG[dir] = real_convolution_3d_ptr(new SeparatedConvolution(world, ops)); + } + + return gradG; +} + + +/// Makes the relativistic equivalent of the BSH operator +real_convolution_3d BSHrel(World& world, double epsilon) { + std::vector C, T; + double Cdelta; + bshrel_fit(epsilon, op_dx, op_thresh, op_quadacc, C, T, Cdelta); + return make_operator(world, C, T, Cdelta); +} + +/// Makes the Tbar operator (T_rel = E0-mc2 = Tbar T_nonrel = -1/2 Tbar del**2) +real_convolution_3d Tbar(World& world) { + std::vector C, T; + double Cdelta; + tbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); + return make_operator(world, C, T, Cdelta); +} + +/// Makes the Pbar operator +real_convolution_3d Pbar(World& world) { + std::vector C, T; + double Cdelta; + pbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); + return make_operator(world, C, T, Cdelta); +} + +/// Makes the APbar operator +real_convolution_3d APbar(World& world) { + std::vector C, T; + double Cdelta; + apbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); + return make_operator(world, C, T, Cdelta); +} + +/// Makes the gradient of the APbar operator +std::vector gradAPbar(World& world) { + std::vector C, T; + double Cdelta; + apbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); + return make_grad_operator(world, C, T, Cdelta); +} + + +/// Makes the A operator (including the 1/sqrt(2) piece) +real_convolution_3d A(World& world) { + std::vector C, T; + double Cdelta; + a_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); + return make_operator(world, C, T, Cdelta); +} + +/// Returns the exponent of the wavefunction cusp at the origin for RK +double rk_v(double Z) { + if (NONREL) return 0.0; + if (DK1) Z *= 0.5; + + static const double c = 137.0359895; + double v = -2.0*Z/(constants::pi*c); + while (true) { + double vnew = -2.0*std::atan(Z/(c*(v+1.0)))/constants::pi; + if (std::abs(v-vnew) < 1e-8) break; + v = vnew; + } + return v; +} + +class Guess : public FunctionFunctorInterface { + const double Z; + const double fac; + const double v; + std::vector specialpt; + +public: + Guess(double Z) + : Z (Z) + , fac(sqrt(Z*Z*Z/(8.0*constants::pi))) + , v(rk_v(Z)) + , specialpt(1,coord_3d{0.0,0.0,0.0}) + {} + + double operator()(const coord_3d& r) const { + const double x=r[0], y=r[1], z=r[2]; + const double R=sqrt(x*x+y*y+z*z+op_dx*op_dx); + return fac*exp(-Z*R)*pow(R,-v); + //return fac*exp(-Z*R); + } + + std::vector special_points() const {return specialpt;} + + Level special_level() const {return 5;} +}; + +// static double V(const coord_3d& r) { +// const double x=r[0], y=r[1], z=r[2]; +// return -Z/(sqrt(x*x+y*y+z*z+1e-10)); +// } + +real_function_3d apply_potential(const real_function_3d& Vnuc, const real_function_3d& psi) { + World& world = Vnuc.world(); + + if (NONREL || RK) { + return Vnuc*psi; + } + else if (DK1) { + // A (V + Pp . V pP ) A psi = A V A psi + AP p . V p AP psi + + real_convolution_3d Aop = A(world); + real_convolution_3d APbarop = APbar(world); + + real_function_3d Vpsi = Aop((Vnuc*Aop(psi)).truncate()); + + // // This works + // real_function_3d APbarpsi = APbarop(psi); + // for (int axis=0; axis<3; axis++) { + // real_derivative_3d D = free_space_derivative(world, axis); + // Vpsi -= APbarop((D(Vnuc*D(APbarpsi))).truncate()); + // } + + // This combines derivative and integral operators and seems both faster and more accurate?? + std::vector gradAPbarop = gradAPbar(world); + for (int axis=0; axis<3; axis++) { + real_convolution_3d& op = *(gradAPbarop[axis]); + Vpsi -= op((Vnuc*op(psi)).truncate()); + } + + return Vpsi.truncate(); + } + else { + throw "confusion"; + } +} + +double compute_energy(World& world, const real_function_3d& psi, const real_function_3d& V, bool doprint=false) { + real_convolution_3d Tbarop = Tbar(world); + + double kinetic_energy = 0.0; + for (int axis=0; axis<3; axis++) { + real_derivative_3d D = free_space_derivative(world, axis); + real_function_3d dpsi = D(psi); + + if (NONREL) { + kinetic_energy += 0.5*inner(dpsi,dpsi); + } + else { + kinetic_energy += 0.5*inner(dpsi,apply(Tbarop,dpsi)); + } + } + + double nuclear_attraction_energy = inner(psi, apply_potential(V,psi)); + double total_energy = kinetic_energy + nuclear_attraction_energy; + + if (world.rank() == 0 && doprint) { + if (NONREL) print("Non-relativistic"); + else if (RK) print("RK"); + else if (DK1) print("DK1"); + else throw "confused"; + + print(" Kinetic energy ", kinetic_energy); + print(" Nuclear attraction energy ", nuclear_attraction_energy); + print(" Total energy ", total_energy); + print(" Virial ", nuclear_attraction_energy / kinetic_energy); + } + + return total_energy; +} + +real_function_3d apply_laplacian(World& world, const real_function_3d& psi) { + real_function_3d delsqpsi(world); + + for (int axis=0; axis<3; axis++) { + real_derivative_3d D = free_space_derivative(world, axis); + delsqpsi += D(D(psi)); + } + + return delsqpsi; +} + +real_convolution_3d make_bsh_operator(World& world, double eps, double& fac) { + if (NONREL) { + fac = -2.0; + return BSHOperator3D(world, sqrt(-2*eps), 0.001, 1e-6); + } + else { + fac = -1.0; + return BSHrel(world, eps); + } +} + +real_function_3d iterate(World& world, const real_function_3d& V, const real_function_3d& psi, double& eps) { + /* + + (Tbar T + V) psi = E psi + + (T + Tbar T - T + V) psi = E psi + + (T - E) psi = - (Tbar T - T + V) psi --> but this suffers from numerical noise + + instead + + psi = - (TbarT - E)^-1 V psi + + */ + + eps = compute_energy(world, psi, V, false); + + double fac; + real_convolution_3d op = make_bsh_operator(world, eps, fac); + + real_function_3d Vpsi = apply_potential(V,psi); + + Vpsi.scale(fac).truncate(); + + real_function_3d tmp = apply(op,Vpsi).truncate(); + double norm = tmp.norm2(); + real_function_3d r = psi-tmp; + // double eps_new = eps - 0.5*inner(Vpsi,r)/(norm*norm); + // eps = eps_new; + + return r; +} + +void logplot(double Z, const real_function_3d& psi, double lo=1e-7, double hi=L*0.5) { + char fname[256]; + + if (NONREL) sprintf(fname, "nonrel-%3.3d.dat", int(Z)); + else if (RK) sprintf(fname, "rk-%3.3d.dat", int(Z)); + else if (DK1) sprintf(fname, "dk1-%3.3d.dat", int(Z)); + else throw "jdsalkfjalks"; + + std::ofstream file; + file.open (fname); + file.precision(12); + psi.reconstruct(); + const double fac = pow(10.0,1.0/16.0); + double rr = lo; + while (rr::set_k(k); + FunctionDefaults<3>::set_thresh(thresh); + FunctionDefaults<3>::set_truncate_mode(0); + FunctionDefaults<3>::set_truncate_on_project(true); + FunctionDefaults<3>::set_cubic_cell(-L/2,L/2); + + //double Zlist[] = {1.0,2.0,3.0,4.0,6.0,8.0,10.0,12.0,16.0,20.0,30.0,40.0,60.0,80.0}; + double Zlist[] = {1.0,2.0,4.0,8.0,16.0,20.0,32.0,40.0,48.0,56.0,60.0,64.0,72.0,76.0,80.0,100.0}; + //double Zlist[] = {20.0,40.0,56.0,60.0,64.0,72.0,76.0,80.0}; + //double Zlist[] = {100.0}; + const int NumZs = sizeof(Zlist)/sizeof(Z); + + for (unsigned int i=0; i c(305l), t(305l); +// std::vector c(365), t(365); +// Vector args = vec(0.0,0.0,0.0); +// #include "RelCoeffs/Ebar_coeffs.dat" +// int n = 305; +// +// for(int i=0; i < n; i++){ +// if(c[i]*exp(-t[i]*1e-16) < opthresh){ +// c.erase(c.begin()+i); +// t.erase(t.begin()+i); +// i--; +// n--; +// } +// } +// +// //print("n = ", n); +// +// Tensor ctens(n), ttens(n); +// for(int i = 0; i < n; i++){ +// ctens[i] = c[i]; +// ttens[i] = t[i]; +// } +// //if(world.rank()==0) print("Made a Ebar (fixed)! n = ", n); +// //if(world.rank()==0) print("Made a Pbar! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); +// //return real_convolution_3d(world, args, ctens, ttens); +// return real_convolution_3d(world, ctens, ttens); +//} + +real_convolution_3d Pbar(World& world){ //Tensor c(305l), t(305l); - std::vector c(365), t(365); + std::vector c; + std::vector t; Vector args = vec(0.0,0.0,0.0); - #include "RelCoeffs/Ebar_coeffs.dat" - int n = 305; - - for(int i=0; i < n; i++){ - if(c[i]*exp(-t[i]*1e-16) < opthresh){ - c.erase(c.begin()+i); - t.erase(t.begin()+i); - i--; - n--; - } + + std::ifstream inf("/gpfs/home/jscanderson/DKproject/Pbar_t.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open Pbar_t.csv" << std::endl; + exit(1); } - - //print("n = ", n); + std::string strInput; + getline(inf, strInput); + while(inf){ + if(world.rank()==0) print("a",strInput,"b"); + t.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); - Tensor ctens(n), ttens(n); - for(int i = 0; i < n; i++){ - ctens[i] = c[i]; - ttens[i] = t[i]; + inf.open("/gpfs/home/jscanderson/DKproject/Pbar_c.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open Pbar_c.csv" << std::endl; + exit(1); } - //if(world.rank()==0) print("Made a Ebar (fixed)! n = ", n); - //if(world.rank()==0) print("Made a Pbar! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); - //return real_convolution_3d(world, args, ctens, ttens); - return real_convolution_3d(world, ctens, ttens); -} + getline(inf, strInput); + while(inf){ + c.push_back(std::stod(strInput)); + if(world.rank()==0) print(c.back()); + getline(inf, strInput); + } + inf.close(); + -real_convolution_3d Pbar(World& world){ - //Tensor c(305l), t(305l); - std::vector c(564), t(564); - Vector args = vec(0.0,0.0,0.0); - #include "RelCoeffs/Pbar_coeffs.dat" int n = c.size(); for(int i=0; i < n; i++){ @@ -137,7 +168,32 @@ real_convolution_3d A(World& world){ //Tensor c(301l), t(301l); std::vector c(561), t(561); Vector args = vec(0.0,0.0,0.0); - #include "RelCoeffs/A_coeffs.dat" + + std::ifstream inf("/gpfs/home/jscanderson/DKproject/A_t.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open A_t.csv" << std::endl; + exit(1); + } + std::string strInput; + getline(inf, strInput); + while(inf){ + t.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); + + inf.open("/gpfs/home/jscanderson/DKproject/A_c.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open A_c.csv" << std::endl; + exit(1); + } + getline(inf, strInput); + while(inf){ + c.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); + int n = c.size(); for(int i=0; i < n; i++){ @@ -164,7 +220,32 @@ real_convolution_3d PbarA(World& world){ //Tensor c(441l), t(441l); std::vector c(300), t(300); Vector args = vec(0.0,0.0,0.0); - #include "RelCoeffs/PbarA_coeffs.dat" + + std::ifstream inf("/gpfs/home/jscanderson/DKproject/PbarA_t.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open PbarA_t.csv" << std::endl; + exit(1); + } + std::string strInput; + getline(inf, strInput); + while(inf){ + t.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); + + inf.open("/gpfs/home/jscanderson/DKproject/PbarA_c.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open PbarA_c.csv" << std::endl; + exit(1); + } + getline(inf, strInput); + while(inf){ + c.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); + int n = c.size(); for(int i=0; i < n; i++){ if(c[i]*exp(-t[i]*1e-30) < opthresh){ From a67d8aafca3c83802f3b728c163a1963204bb1f9 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 25 Jul 2018 04:52:28 -0400 Subject: [PATCH 0004/1312] working Douglas Kroll 1 --- src/apps/moldft/CMakeLists.txt | 2 +- src/apps/moldft/DF.cc | 17 +- src/apps/moldft/DKops.h | 229 +++++++++++++- src/apps/moldft/rk-2.cc | 4 +- src/apps/moldft/rk-3.cc | 527 +++++++++++++++++++++++++++++++++ 5 files changed, 756 insertions(+), 23 deletions(-) create mode 100644 src/apps/moldft/rk-3.cc diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index f882ff2d68c..75df07901df 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -18,7 +18,7 @@ target_link_libraries(testperiodic_moldft MADchem) add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) target_link_libraries(DFdriver MADchem MADmra) -add_executable(rk relops.cc rk-2.cc) +add_executable(rk rk-3.cc) target_link_libraries(rk MADchem MADmra -lgmp -lmpfr) add_executable(dk DKhydrogen3.cc) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 20b7974b38b..0e586b9a341 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -593,12 +593,17 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op ////Form the overlap matrix - if(world.rank()==0) print(" Integrating to form Overlap Matrix"); - for(unsigned int j = 0; j < n; j++){ - for(unsigned int k = 0; k < n; k++){ - overlap(j,k) = inner(occupieds[j],occupieds[k]); - } - } + //if(world.rank()==0) print(" Integrating to form Overlap Matrix"); + //for(unsigned int j = 0; j < n; j++){ + // for(unsigned int k = 0; k < n; k++){ + // overlap(j,k) = inner(occupieds[j],occupieds[k]); + // } + //} + component1 = matrix_inner(world,occupieds_1,occupieds_1); + component2 = matrix_inner(world,occupieds_2,occupieds_2); + component3 = matrix_inner(world,occupieds_3,occupieds_3); + component4 = matrix_inner(world,occupieds_4,occupieds_4); + overlap = component1 + component2 + component3 + component4; ////debugging: print fock and overlap matrices //if(world.rank()==0){ diff --git a/src/apps/moldft/DKops.h b/src/apps/moldft/DKops.h index 9f1a62ed99e..63125778c88 100644 --- a/src/apps/moldft/DKops.h +++ b/src/apps/moldft/DKops.h @@ -7,6 +7,7 @@ #include #include #include +#include //#include "../../../../mpfrc++-3/mpreal.h" @@ -36,13 +37,14 @@ real_convolution_3d Ebar(World& world, double eps){ std::vector cvec; std::vector tvec; + double fac = pow(2.0*constants::pi,-1.5); double dt = 1.0/8.0; double tval = -10.0; while(tval < 100.0){ if(Ebark(tval, eps) > opthresh){ //if(world.rank()==0) print(" Ebark(",tval,",",eps," = ",Ebark(tval,eps)); - cvec.push_back(dt/pow(2.0*q(tval),1.5)*w(tval,eps)); + cvec.push_back(dt/pow(2.0*q(tval),1.5)*w(tval,eps)*fac); tvec.push_back(1.0/(4.0*q(tval))); } //else{ @@ -60,7 +62,7 @@ real_convolution_3d Ebar(World& world, double eps){ } int n = cvec.size(); - if(world.rank()==0) print("Made an Ebar! n = ",n); + //if(world.rank()==0) print("Made an Ebar! n = ",n); //if(world.rank()==0) print("Made an Ebar! Here's what's inside:\n\nc:\n",ctensor,"\nt:\n",ttensor); //test ebar? @@ -120,11 +122,11 @@ real_convolution_3d Pbar(World& world){ std::string strInput; getline(inf, strInput); while(inf){ - if(world.rank()==0) print("a",strInput,"b"); t.push_back(std::stod(strInput)); getline(inf, strInput); } inf.close(); + //if(world.rank()==0) print("Done Reading Pbar_t"); inf.open("/gpfs/home/jscanderson/DKproject/Pbar_c.csv"); if(!inf){ @@ -133,15 +135,16 @@ real_convolution_3d Pbar(World& world){ } getline(inf, strInput); while(inf){ + //if(world.rank()==0) print("a", strInput, "b"); c.push_back(std::stod(strInput)); - if(world.rank()==0) print(c.back()); getline(inf, strInput); } inf.close(); - + //if(world.rank()==0) print("Done Reading Pbar_c"); + int n = c.size(); - + /* for(int i=0; i < n; i++){ if(c[i]*exp(-t[i]*1e-30) < opthresh){ c.erase(c.begin()+i); @@ -150,7 +153,66 @@ real_convolution_3d Pbar(World& world){ n--; } } + */ + //print("n = ", n); + + Tensor ctens(n), ttens(n); + for(int i = 0; i < n; i++){ + ctens[i] = c[i]; + ttens[i] = t[i]; + } + //if(world.rank()==0) print("Made a Pbar! n = ", n); + //if(world.rank()==0) print("Made a Pbar! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); + //return real_convolution_3d(world, args, ctens, ttens); + return real_convolution_3d(world, ctens, ttens); +} + +real_convolution_3d Tbar(World& world){ + //Tensor c(305l), t(305l); + std::vector c; + std::vector t; + Vector args = vec(0.0,0.0,0.0); + + std::ifstream inf("/gpfs/home/jscanderson/DKproject/Tbar_t.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open Tbar_t.csv" << std::endl; + exit(1); + } + std::string strInput; + getline(inf, strInput); + while(inf){ + t.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); + //if(world.rank()==0) print("Done Reading Tbar_t"); + + inf.open("/gpfs/home/jscanderson/DKproject/Tbar_c.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open Tbar_c.csv" << std::endl; + exit(1); + } + getline(inf, strInput); + while(inf){ + //if(world.rank()==0) print("a", strInput, "b"); + c.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); + //if(world.rank()==0) print("Done Reading Tbar_c"); + + int n = c.size(); + /* + for(int i=0; i < n; i++){ + if(c[i]*exp(-t[i]*1e-30) < opthresh){ + c.erase(c.begin()+i); + t.erase(t.begin()+i); + i--; + n--; + } + } + */ //print("n = ", n); Tensor ctens(n), ttens(n); @@ -158,15 +220,16 @@ real_convolution_3d Pbar(World& world){ ctens[i] = c[i]; ttens[i] = t[i]; } - if(world.rank()==0) print("Made a Pbar! n = ", n); + //if(world.rank()==0) print("Made a Tbar! n = ", n); //if(world.rank()==0) print("Made a Pbar! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); //return real_convolution_3d(world, args, ctens, ttens); return real_convolution_3d(world, ctens, ttens); } + real_convolution_3d A(World& world){ //Tensor c(301l), t(301l); - std::vector c(561), t(561); + std::vector c, t; Vector args = vec(0.0,0.0,0.0); std::ifstream inf("/gpfs/home/jscanderson/DKproject/A_t.csv"); @@ -181,6 +244,7 @@ real_convolution_3d A(World& world){ getline(inf, strInput); } inf.close(); + //if(world.rank()==0) print("Done Reading A_t"); inf.open("/gpfs/home/jscanderson/DKproject/A_c.csv"); if(!inf){ @@ -193,9 +257,10 @@ real_convolution_3d A(World& world){ getline(inf, strInput); } inf.close(); + //if(world.rank()==0) print("Done Reading A_c"); int n = c.size(); - + /* for(int i=0; i < n; i++){ if(c[i]*exp(-t[i]*1e-30) < opthresh){ c.erase(c.begin()+i); @@ -204,13 +269,70 @@ real_convolution_3d A(World& world){ n--; } } - + */ Tensor ctens(n), ttens(n); for(int i = 0; i < n; i++){ ctens[i] = c[i]; ttens[i] = t[i]; } - if(world.rank()==0) print("Made an A!, n = ", n); + //if(world.rank()==0) print("Made an A!, n = ", n); + //if(world.rank()==0) print("Made an A! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); + //return real_convolution_3d(world, args, ctens, ttens); + return real_convolution_3d(world, ctens, ttens); +} + +//Same as A(World& world) above but adds 1/sqrt(2) to the largest coefficient +real_convolution_3d A2(World& world){ + //Tensor c(301l), t(301l); + std::vector c, t; + Vector args = vec(0.0,0.0,0.0); + + std::ifstream inf("/gpfs/home/jscanderson/DKproject/A_t.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open A_t.csv" << std::endl; + exit(1); + } + std::string strInput; + getline(inf, strInput); + while(inf){ + t.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); + //if(world.rank()==0) print("Done Reading A_t"); + + inf.open("/gpfs/home/jscanderson/DKproject/A_c.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open A_c.csv" << std::endl; + exit(1); + } + getline(inf, strInput); + while(inf){ + c.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); + //if(world.rank()==0) print("Done Reading A_c"); + + int n = c.size(); + /* + for(int i=0; i < n; i++){ + if(c[i]*exp(-t[i]*1e-30) < opthresh){ + c.erase(c.begin()+i); + t.erase(t.begin()+i); + i--; + n--; + } + } + */ + double fac = pow(2.0*constants::pi,1.5); + Tensor ctens(n), ttens(n); + for(int i = 0; i < n; i++){ + ctens[i] = c[i]*fac; + ttens[i] = t[i]; + } + //c[n-1] += 1/sqrt(2)*fac*std::pow(t[n-1]*constants::pi,1.5); //largest exponent is at the end, so add 1/sqrt(2) to the coefficient there + //if(world.rank()==0) print("Made an A!, n = ", n); //if(world.rank()==0) print("Made an A! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); //return real_convolution_3d(world, args, ctens, ttens); return real_convolution_3d(world, ctens, ttens); @@ -218,7 +340,7 @@ real_convolution_3d A(World& world){ real_convolution_3d PbarA(World& world){ //Tensor c(441l), t(441l); - std::vector c(300), t(300); + std::vector c, t; Vector args = vec(0.0,0.0,0.0); std::ifstream inf("/gpfs/home/jscanderson/DKproject/PbarA_t.csv"); @@ -233,6 +355,7 @@ real_convolution_3d PbarA(World& world){ getline(inf, strInput); } inf.close(); + //if(world.rank()==0) print("Done Reading PbarA_t"); inf.open("/gpfs/home/jscanderson/DKproject/PbarA_c.csv"); if(!inf){ @@ -245,8 +368,10 @@ real_convolution_3d PbarA(World& world){ getline(inf, strInput); } inf.close(); + //if(world.rank()==0) print("Done Reading PbarA_c"); int n = c.size(); + /* for(int i=0; i < n; i++){ if(c[i]*exp(-t[i]*1e-30) < opthresh){ c.erase(c.begin()+i); @@ -255,14 +380,90 @@ real_convolution_3d PbarA(World& world){ n--; } } + */ + double fac = pow(2.0*constants::pi,1.5); Tensor ctens(n), ttens(n); for(int i = 0; i < n; i++){ - ctens[i] = c[i]; + ctens[i] = c[i]*fac; ttens[i] = t[i]; } - if(world.rank()==0) print("Made a PbarA!, n = ", n); + //if(world.rank()==0) print("Made a PbarA!, n = ", n); //if(world.rank()==0) print("Made a PbarA! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); //return real_convolution_3d(world, args, ctens, ttens); return real_convolution_3d(world, ctens, ttens); } + +std::vector gradPbarA(World& world){ + const double pi = constants::pi; + std::vector c, t; + + std::ifstream inf("/gpfs/home/jscanderson/DKproject/PbarA_t.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open PbarA_t.csv" << std::endl; + exit(1); + } + std::string strInput; + getline(inf, strInput); + while(inf){ + t.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); + //if(world.rank()==0) print("Done Reading PbarA_t"); + + inf.open("/gpfs/home/jscanderson/DKproject/PbarA_c.csv"); + if(!inf){ + if(world.rank() == 0) std::cerr << "Unable to open PbarA_c.csv" << std::endl; + exit(1); + } + getline(inf, strInput); + while(inf){ + c.push_back(std::stod(strInput)); + getline(inf, strInput); + } + inf.close(); + //if(world.rank()==0) print("Done Reading PbarA_c"); + + int n = c.size(); + /* + for(int i=0; i < n; i++){ + if(c[i]*exp(-t[i]*1e-30) < opthresh){ + c.erase(c.begin()+i); + t.erase(t.begin()+i); + i--; + n--; + } + } + */ + double fac = pow(2.0*pi,1.5); + for(int i = 0; i < n; i++){ + c[i] = c[i]*fac; + } + + const Tensor width = FunctionDefaults<3>::get_cell_width(); + const int k = FunctionDefaults<3>::get_k(); + double hi = width.normf(); // Diagonal width of cell + + std::vector gradG(3); + + for (int dir=0; dir<3; dir++) { + std::vector< ConvolutionND > ops(n); + for (int mu=0; mu::get(k, t[mu]*width[d]*width[d], 0, false)); + } + ops[mu].setop(dir,GaussianConvolution1DCache::get(k, t[mu]*width[dir]*width[dir], 1, false)); + } + gradG[dir] = real_convolution_3d_ptr(new SeparatedConvolution(world, ops)); + } + + return gradG; + +} + #endif diff --git a/src/apps/moldft/rk-2.cc b/src/apps/moldft/rk-2.cc index 0ccd1008af7..e0505d72f9d 100644 --- a/src/apps/moldft/rk-2.cc +++ b/src/apps/moldft/rk-2.cc @@ -21,8 +21,8 @@ static const double op_dx=1e-16; //TRY CHANGING THIS 1e-16 static const double op_quadacc=1e-8; //FIND ALL INSTANCES OF THIS AND DEAL WITH IT static const double op_thresh=1e-8; -static const long k = 8; // wavelet order -static const double thresh = 1e-6; // precision +static const long k = 10; // wavelet order +static const double thresh = 1e-8; // precision static const double L = 50.0; // box size static const bool FINITENUC = false; diff --git a/src/apps/moldft/rk-3.cc b/src/apps/moldft/rk-3.cc new file mode 100644 index 00000000000..241e3a248f7 --- /dev/null +++ b/src/apps/moldft/rk-3.cc @@ -0,0 +1,527 @@ +#include +#include +#include +#include +#include +#include "DKops.h" + +void apbar_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); +void pbar_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); +void a_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); +void tbar_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); +void bshrel_fit(double epsilon, double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); + +using namespace madness; + +// Needed for rebalancing +template +struct lbcost { + double leaf_value; + double parent_value; + lbcost(double leaf_value=1.0, double parent_value=0.0) : leaf_value(leaf_value), parent_value(parent_value) {} + double operator()(const Key& key, const FunctionNode& node) const { + if (key.level() < 1) { + return 100.0*(leaf_value+parent_value); + } + else if (node.is_leaf()) { + return leaf_value; + } + else { + return parent_value; + } + } +}; + +static double Z = -1; + +// Nuclear half-charge radius of H (proton) is 1.3e-5 and the exponent +// of its finite-size Gaussian approximation is 2.12e9. So this +// choice for dx resolves one-two orders of magnitude finer scale. +static const double op_dx=1e-16; //TRY CHANGING THIS 1e-16 +static const double op_quadacc=1e-8; //FIND ALL INSTANCES OF THIS AND DEAL WITH IT +static const double op_thresh=1e-8; + +static const long k = 10; // wavelet order +static const double thresh = 1e-8; // precision +static const double L = 50.0; // box size + +static const bool FINITENUC = false; + +// Pick ONE of the following three +static const bool NONREL = false; +static const bool RK = false; +static const bool DK1 = true; + +class FiniteNucleusPotential : public FunctionFunctorInterface { + const double xi; + + static double expnt(int Z) { + const Vector xi + {2.1248239171e+09,1.1671538870e+09,8.9266848806e+08,7.8788802914e+08,7.1178709563e+08,6.8077502929e+08,6.2865615725e+08,5.8631436655e+08,5.3546911034e+08,5.2105715255e+08,4.8349721509e+08,4.7254270882e+08,4.4335984491e+08,4.3467748823e+08,4.1117553148e+08,4.0407992047e+08,3.8463852873e+08,3.5722217300e+08,3.6228128110e+08,3.5722217300e+08,3.3451324570e+08,3.2263108827e+08,3.1181925878e+08,3.0842641793e+08,2.9881373610e+08,2.9578406371e+08,2.8716667270e+08,2.8996391416e+08,2.7665979354e+08,2.7419021043e+08,2.6267002737e+08,2.5235613399e+08,2.5042024280e+08,2.4130163719e+08,2.4305454351e+08,2.3461213272e+08,2.3301551109e+08,2.2839354730e+08,2.2690621893e+08,2.2544431039e+08,2.2120420724e+08,2.1458511597e+08,2.1458511597e+08,2.0965270287e+08,2.0846586999e+08,2.0500935221e+08,2.0389047621e+08,1.9648639618e+08,1.9548577691e+08,1.9067718154e+08,1.8975246242e+08,1.8193056289e+08,1.8444240538e+08,1.8030529331e+08,1.7950688281e+08,1.7565009043e+08,1.7490463170e+08,1.7416744147e+08,1.7343837120e+08,1.7129844956e+08,1.7060044589e+08,1.6591550422e+08,1.6527352089e+08,1.6215880671e+08,1.6155419421e+08,1.5977529080e+08,1.5977529080e+08,1.5636673634e+08,1.5581702004e+08,1.5314257850e+08,1.5262201512e+08,1.5008710340e+08,1.4959325643e+08,1.4813689532e+08,1.4671710337e+08,1.4442808782e+08,1.4398142103e+08,1.4309883584e+08,1.4223027307e+08,1.4011788914e+08,1.3888925203e+08,1.3768840081e+08,1.3729411599e+08,1.3729411599e+08,1.3690277000e+08,1.3242350205e+08,1.3206733609e+08,1.3101367628e+08,1.3066730974e+08,1.2897067480e+08,1.2930539512e+08,1.2700881714e+08,1.2733038109e+08,1.2512299012e+08,1.2543221826e+08,1.2420711085e+08,1.2420711085e+08,1.2301273547e+08,1.2271879740e+08,1.2127611477e+08,1.2099285491e+08,1.2071131346e+08,1.1987683191e+08,1.2015331850e+08,1.1987683191e+08,1.1960199758e+08,1.1987683191e+08,1.1905722195e+08,1.1878724932e+08}; + + if (Z < 1) return 1.0/(op_dx*op_dx); // Use point charge if Z<1 + else return xi[Z]; + } + +public: + FiniteNucleusPotential(int Z) : xi(expnt(Z)) {} + + double operator()(const coord_3d& r) const { + const double x=r[0], y=r[1], z=r[2]; + const double R=sqrt(x*x+y*y+z*z); + const double arg=R*sqrt(xi); + double q = -Z; + if (arg<6) q *= std::erf(arg); + return q/R; + } +}; + +/// Given coefficients and exponents make the 3D operator adding delta part to last Gaussian +real_convolution_3d make_operator(World& world, + const std::vector& C, + const std::vector& T, + double Cdelta) { + Tensor c(C.size()), t(T.size()); + + for (unsigned int i=0; i +make_grad_operator(World& world, + std::vector C, // TAKES A COPY SINCE WE MODIFY TI + const std::vector T, + const double Cdelta, + int k=FunctionDefaults<3>::get_k()) +{ + //typedef SeparatedConvolution real_convolution_3d; + //typedef std::shared_ptr real_convolution_3d_ptr; + const double pi = constants::pi; + const Tensor width = FunctionDefaults<3>::get_cell_width(); + double hi = width.normf(); // Diagonal width of cell + + const int rank = C.size(); + + C[rank-1] += Cdelta * pow(T[rank-1]/constants::pi,1.5); + + std::vector gradG(3); + + for (int dir=0; dir<3; dir++) { + std::vector< ConvolutionND > ops(rank); + for (int mu=0; mu::get(k, T[mu]*width[d]*width[d], 0, false)); + } + ops[mu].setop(dir,GaussianConvolution1DCache::get(k, T[mu]*width[dir]*width[dir], 1, false)); + } + gradG[dir] = real_convolution_3d_ptr(new SeparatedConvolution(world, ops)); + } + + return gradG; +} + + +/// Makes the relativistic equivalent of the BSH operator +//real_convolution_3d BSHrel(World& world, double epsilon) { +// std::vector C, T; +// double Cdelta; +// bshrel_fit(epsilon, op_dx, op_thresh, op_quadacc, C, T, Cdelta); +// return make_operator(world, C, T, Cdelta); +//} + +/// Makes the Tbar operator (T_rel = E0-mc2 = Tbar T_nonrel = -1/2 Tbar del**2) +//real_convolution_3d Tbar(World& world) { +// std::vector C, T; +// double Cdelta; +// tbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); +// return make_operator(world, C, T, Cdelta); +//} + +/// Makes the Pbar operator +//real_convolution_3d Pbar(World& world) { +// std::vector C, T; +// double Cdelta; +// pbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); +// return make_operator(world, C, T, Cdelta); +//} + +/// Makes the APbar operator +//real_convolution_3d APbar(World& world) { +// std::vector C, T; +// double Cdelta; +// apbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); +// return make_operator(world, C, T, Cdelta); +//} + +/// Makes the gradient of the APbar operator +//std::vector gradAPbar(World& world) { +// std::vector C, T; +// double Cdelta; +// apbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); +// return make_grad_operator(world, C, T, Cdelta); +//} + + +/// Makes the A operator (including the 1/sqrt(2) piece) +//real_convolution_3d A(World& world) { +// std::vector C, T; +// double Cdelta; +// a_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); +// return make_operator(world, C, T, Cdelta); +//} + +/// Returns the exponent of the wavefunction cusp at the origin for RK +double rk_v(double Z) { + if (NONREL) return 0.0; + if (DK1) Z *= 0.5; + + static const double c = 137.0359895; + double v = -2.0*Z/(constants::pi*c); + while (true) { + double vnew = -2.0*std::atan(Z/(c*(v+1.0)))/constants::pi; + if (std::abs(v-vnew) < 1e-8) break; + v = vnew; + } + return v; +} + +class Guess : public FunctionFunctorInterface { + const double Z; + const double fac; + const double v; + std::vector specialpt; + +public: + Guess(double Z) + : Z (Z) + , fac(sqrt(Z*Z*Z/(8.0*constants::pi))) + , v(rk_v(Z)) + , specialpt(1,coord_3d{0.0,0.0,0.0}) + {} + + double operator()(const coord_3d& r) const { + const double x=r[0], y=r[1], z=r[2]; + const double R=sqrt(x*x+y*y+z*z+op_dx*op_dx); + return fac*exp(-Z*R)*pow(R,-v); + //return fac*exp(-Z*R); + } + + std::vector special_points() const {return specialpt;} + + Level special_level() const {return 5;} +}; + +// static double V(const coord_3d& r) { +// const double x=r[0], y=r[1], z=r[2]; +// return -Z/(sqrt(x*x+y*y+z*z+1e-10)); +// } + +real_function_3d apply_potential(const real_function_3d& Vnuc, const real_function_3d& psi) { + World& world = Vnuc.world(); + + if (NONREL || RK) { + return Vnuc*psi; + } + else if (DK1) { + // A (V + Pp . V pP ) A psi = A V A psi + AP p . V p AP psi + + real_convolution_3d Aop = A2(world); + real_convolution_3d APbarop = PbarA(world); + real_function_3d tempfunc(world); + double tempdouble; + double fac = pow(2.0*constants::pi,-3.0/2.0); + + tempfunc = (fac*fac)*Aop((Vnuc*Aop(psi)).truncate()); + //tempdouble = tempfunc.norm2(); + //tempdouble = (psi*tempfunc).trace(); + //if(world.rank()==0) print("expec AVApsi: ", tempdouble); + real_function_3d Vpsi = tempfunc; + + tempfunc = fac*(1.0/sqrt(2.0))*Aop((Vnuc*psi).truncate()); + //tempdouble = tempfunc.norm2(); + //tempdouble = (psi*tempfunc).trace(); + //if(world.rank()==0) print("expec AVpsi: ", tempdouble); + Vpsi += tempfunc; + + tempfunc = fac*(1.0/sqrt(2.0))*Vnuc*Aop(psi); + //tempdouble = tempfunc.norm2(); + //tempdouble = (psi*tempfunc).trace(); + //if(world.rank()==0) print("expec VApsi: ", tempdouble); + Vpsi += tempfunc; + + tempfunc = (1.0/2.0)*Vnuc*psi; + //tempdouble = tempfunc.norm2(); + //tempdouble = (psi*tempfunc).trace(); + //if(world.rank()==0) print("expec Vpsi: ", tempdouble); + Vpsi += tempfunc; + + + //// This works + //real_function_3d APbarpsi = APbarop(psi); + //for (int axis=0; axis<3; axis++) { + // real_derivative_3d D = free_space_derivative(world, axis); + // tempfunc = (fac*fac)*APbarop((D(Vnuc*D(APbarpsi))).truncate()); + // //tempdouble = tempfunc.norm2(); + // //if(world.rank()==0) print("expec PApVpPA[",axis,"]: ", tempdouble); + // Vpsi -= tempfunc; + //} + + // This combines derivative and integral operators and seems both faster and more accurate?? + std::vector gradAPbarop = gradPbarA(world); + for (int axis=0; axis<3; axis++) { + real_convolution_3d& op = *(gradAPbarop[axis]); + tempfunc = (fac*fac)*op((Vnuc*op(psi)).truncate()); + Vpsi -= tempfunc; //should be minus? + } + + return Vpsi.truncate(); + } + else { + throw "confusion"; + } +} + +double compute_energy(World& world, const real_function_3d& psi, const real_function_3d& V, bool doprint=false) { + real_convolution_3d Tbarop = Tbar(world); + + double kinetic_energy = 0.0; + for (int axis=0; axis<3; axis++) { + real_derivative_3d D = free_space_derivative(world, axis); + real_function_3d dpsi = D(psi); + + if (NONREL) { + kinetic_energy += 0.5*inner(dpsi,dpsi); + } + else { + kinetic_energy += 0.5*inner(dpsi,apply(Tbarop,dpsi)); + } + } + + double nuclear_attraction_energy = inner(psi, apply_potential(V,psi)); + double total_energy = kinetic_energy + nuclear_attraction_energy; + + if (world.rank() == 0 && doprint) { + if (NONREL) print("Non-relativistic"); + else if (RK) print("RK"); + else if (DK1) print("DK1"); + else throw "confused"; + + print(" Kinetic energy ", kinetic_energy); + print(" Nuclear attraction energy ", nuclear_attraction_energy); + print(" Total energy ", total_energy); + print(" Virial ", nuclear_attraction_energy / kinetic_energy); + } + + return total_energy; +} + +double compute_energy_simple(World& world, const real_function_3d& psi, const real_function_3d& Vpsi, bool doprint=false) { + real_convolution_3d Tbarop = Tbar(world); + + double kinetic_energy = 0.0; + for (int axis=0; axis<3; axis++) { + real_derivative_3d D = free_space_derivative(world, axis); + real_function_3d dpsi = D(psi); + + if (NONREL) { + kinetic_energy += 0.5*inner(dpsi,dpsi); + } + else { + kinetic_energy += 0.5*inner(dpsi,apply(Tbarop,dpsi)); + } + } + + double nuclear_attraction_energy = inner(psi, Vpsi); + double total_energy = kinetic_energy + nuclear_attraction_energy; + + if (world.rank() == 0 && doprint) { + if (NONREL) print("Non-relativistic"); + else if (RK) print("RK"); + else if (DK1) print("DK1"); + else throw "confused"; + + print(" Kinetic energy ", kinetic_energy); + print(" Nuclear attraction energy ", nuclear_attraction_energy); + print(" Total energy ", total_energy); + print(" Virial ", nuclear_attraction_energy / kinetic_energy); + } + + return total_energy; +} + +real_function_3d apply_laplacian(World& world, const real_function_3d& psi) { + real_function_3d delsqpsi(world); + + for (int axis=0; axis<3; axis++) { + real_derivative_3d D = free_space_derivative(world, axis); + delsqpsi += D(D(psi)); + } + + return delsqpsi; +} + +real_convolution_3d make_bsh_operator(World& world, double eps, double& fac) { + if (NONREL) { + fac = -2.0; + return BSHOperator3D(world, sqrt(-2*eps), 0.001, 1e-6); + } + else { + fac = -1.0; + return Ebar(world, eps); + } +} + +real_function_3d iterate(World& world, const real_function_3d& V, const real_function_3d& psi, double& eps) { + /* + + (Tbar T + V) psi = E psi + + (T + Tbar T - T + V) psi = E psi + + (T - E) psi = - (Tbar T - T + V) psi --> but this suffers from numerical noise + + instead + + psi = - (TbarT - E)^-1 V psi + + */ + + real_function_3d Vpsi = apply_potential(V,psi); + eps = compute_energy_simple(world, psi, Vpsi, false); + + double fac; + real_convolution_3d op = make_bsh_operator(world, eps, fac); + + Vpsi.scale(fac).truncate(); + + real_function_3d tmp = apply(op,Vpsi).truncate(); + double norm = tmp.norm2(); + real_function_3d r = psi-tmp; + // double eps_new = eps - 0.5*inner(Vpsi,r)/(norm*norm); + // eps = eps_new; + + return r; +} + +void logplot(double Z, const real_function_3d& psi, double lo=1e-7, double hi=L*0.5) { + char fname[256]; + + if (NONREL) sprintf(fname, "nonrel-%3.3d.dat", int(Z)); + else if (RK) sprintf(fname, "rk-%3.3d.dat", int(Z)); + else if (DK1) sprintf(fname, "dk1-%3.3d.dat", int(Z)); + else throw "jdsalkfjalks"; + + std::ofstream file; + file.open (fname); + file.precision(12); + psi.reconstruct(); + const double fac = pow(10.0,1.0/16.0); + double rr = lo; + while (rr::set_k(k); + FunctionDefaults<3>::set_thresh(thresh); + FunctionDefaults<3>::set_truncate_mode(0); //See what happens to lighter elements with mode 1 (hyp more accuracy for lighter elements, but too long for higher elements) + FunctionDefaults<3>::set_truncate_on_project(true); + FunctionDefaults<3>::set_cubic_cell(-L/2,L/2); + + //double Zlist[] = {1.0,2.0,3.0,4.0,6.0,8.0,10.0,12.0,16.0,20.0,30.0,40.0,60.0,80.0}; + //double Zlist[] = {1.0,2.0,4.0,8.0,10.0,16.0,20.0,32.0,40.0,48.0,56.0,60.0,64.0,72.0,76.0,80.0}; + double Zlist[] = {80.0}; + //double Zlist[] = {40.0,48.0,56.0,60.0,64.0,72.0,76.0,80.0}; + //double Zlist[] = {20.0,40.0,56.0,60.0,64.0,72.0,76.0,80.0}; + //double Zlist[] = {100.0}; + const int NumZs = sizeof(Zlist)/sizeof(Z); + + + for (unsigned int i=0; i 0.1) { + psi = 0.5*psi_new + 0.5*psi; + } + else { + psi = psi_new; + } + + if (world.rank() == 0) { + print(" eps=",eps," err(psi)=",rnorm); + } + //if (iter>3 && rnorm < pow(10,0.5*log10(thresh))) break; + if (iter>3 && rnorm < thresh*50.0) break; + LoadBalanceDeux<3> lb(world); + lb.add_tree(Vnuc, lbcost(12.0,96.0),true); + lb.add_tree(psi, lbcost(12.0,96.0),true); + FunctionDefaults<3>::redistribute(world,lb.load_balance(2)); + } + + psi.scale(1.0/psi.norm2()); + compute_energy(world, psi, Vnuc, true); + + logplot(Z,psi); + } + + world.gop.fence(); + + finalize(); + return 0; +} From 38df91eb9f00bbfebb6cedd8c2424199ca878e0c Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 30 Jul 2018 09:41:43 -0400 Subject: [PATCH 0005/1312] updated print statements --- src/apps/moldft/DF.cc | 110 +++++++++++++++++++++++++-------- src/apps/moldft/rk-3.cc | 6 +- src/madness/mra/funcdefaults.h | 4 +- src/madness/world/worlddc.h | 6 +- 4 files changed, 92 insertions(+), 34 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 0e586b9a341..7d6da8e3064 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -300,7 +300,7 @@ DF::DF(World & world, const char* filename) : DF(world, (world.rank() == 0 ? std // Constructor that actually does stuff DF::DF(World & world,std::shared_ptr input) { - // Start the timer + // Start a timer start_timer(world); // Try and open input file @@ -344,6 +344,9 @@ DF::DF(World & world,std::shared_ptr input) { virtuals = Init_params.virtuals; total_energy = Init_params.Init_total_energy; + Tensor times = end_timer(world); + if(world.rank()==0) print("Preparation complete: ", times[0]); + } //function to calculate the kinetic + rest energy expectation value using Dirac Hamiltonian c*\alpha*p+\Beta*m*c*c @@ -456,6 +459,9 @@ Fcwf apply_T(World& world, const Fcwf& psi){ //Calculates K*psi for each psi in the orbitals vector and stores them in result void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsis){ + //start timer + start_timer(world); + complex_function_3d temp(world); unsigned int n = Init_params.num_occupied; @@ -478,6 +484,10 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //here too Kpsis[i].truncate(); } + + //Report time + Tensor times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); } Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ @@ -505,6 +515,7 @@ Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op, std::vector& Kpsis){ if(world.rank()==0) print("\n***Diagonalizing***"); + start_timer(world); unsigned int n = Init_params.num_occupied; Tensor> fock(n, n); @@ -514,6 +525,7 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op std::vector temp_orbitals; if(world.rank()==0) print(" Forming Matrices"); + start_timer(world); ////Form the Fock Matrix //first apply Fock operator to all orbitals @@ -588,12 +600,13 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op // } //} - Tensor focktimes = DF::end_timer(world); - if(world.rank()==0) print(" time:", focktimes[0]); + Tensor times = DF::end_timer(world); + if(world.rank()==0) print(" ", times[0]); ////Form the overlap matrix - //if(world.rank()==0) print(" Integrating to form Overlap Matrix"); + if(world.rank()==0) print(" Integrating to form Overlap Matrix"); + start_timer(world); //for(unsigned int j = 0; j < n; j++){ // for(unsigned int k = 0; k < n; k++){ // overlap(j,k) = inner(occupieds[j],occupieds[k]); @@ -605,6 +618,11 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op component4 = matrix_inner(world,occupieds_4,occupieds_4); overlap = component1 + component2 + component3 + component4; + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); + ////debugging: print fock and overlap matrices //if(world.rank()==0){ //print("fock:\n", fock); @@ -613,15 +631,19 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op if(world.rank()==0) print(" Eigensolver"); + start_timer(world); //Diagonalize sygv(fock, overlap, 1, U, evals); + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); //debugging: print matrix of eigenvectors //if(world.rank()==0) print("U:\n", U); //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. if(world.rank()==0) print(" Removing Rotations"); + start_timer(world); double thresh_degenerate = DFparams.thresh*100.0; double csquared = 137.0359895*137.0359895; //electron rest energy @@ -696,9 +718,12 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op fock = inner(conj_transpose(U), inner(fock, U)); + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); //if(world.rank()==0)print("\n U^* F U:\n",fock,"\n"); if(world.rank()==0) print(" Applying Transformation"); + start_timer(world); ////Apply the transformation to the Exchange for(unsigned int j = 0; j < n; j++){ @@ -721,12 +746,15 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op for(unsigned int j = 0; j < n; j++){ occupieds[j] = temp_orbitals[j]; } + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); } //returns a vector of orthonormal Fcwfs constructed from the input vector of Fcwfs std::vector orthogonalize(World& world, std::vector orbitals){ - if(world.rank()==0) print("\n***Orthonormalizing***"); int n = orbitals.size(); std::vector result; for(int i = 0; i < n; i++){ @@ -1050,6 +1078,7 @@ Tensor make_initial_energies(Tensor energies){ void DF::saveDF(World& world){ Tensor times = get_times(world); + start_timer(world); if(world.rank()==0) print("\n***Saving at time: ",times[0]," ***"); try{ archive::ParallelOutputArchive output(world, DFparams.savefile.c_str(), 1); @@ -1063,6 +1092,8 @@ void DF::saveDF(World& world){ catch(const char* s){ if(world.rank()==0) print("Failed to save DF restart data with error message:", s); } + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); } //Creates the nuclear potential from the molecule object @@ -1095,6 +1126,7 @@ void DF::make_gaussian_potential(World& world, real_function_3d& potential, doub void DF::DF_load_balance(World& world, real_function_3d& Vnuc){ if(world.rank()==0) print("\n***Load Balancing***"); + start_timer(world); LoadBalanceDeux<3> lb(world); lb.add_tree(Vnuc, lbcost(12.0,96.0),true); for(unsigned int j = 0; j < Init_params.num_occupied; j++){ @@ -1102,7 +1134,9 @@ void DF::DF_load_balance(World& world, real_function_3d& Vnuc){ lb.add_tree(occupieds[j][kk], lbcost,3>(24.0,192.0),true); } } - FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); + FunctionDefaults<3>::redistribute(world, lb.load_balance(2), false); + Tensor times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); } @@ -1185,6 +1219,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) print("\n\n\nIteration: ", iteration_number, " at ",times[0]); if(world.rank()==0) print("--------------"); + start_timer(world); std::vector Residuals; Fcwf temp_function(world); @@ -1202,6 +1237,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Apply BSH to each psi if(world.rank()==0) print("\n***Applying BSH operator***"); + start_timer(world); for(unsigned int j = 0; j < Init_params.num_occupied; j++){ //construct the function to which we will apply the BSH @@ -1232,15 +1268,25 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea occupieds[j] = occupieds[j] - temp_function; } } + if(world.rank()==0) printf(" tolerance: %.10e\n",tolerance); + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); //Apply the kain solver, if called for if(DFparams.kain){ if(world.rank()==0) print("\n***Applying KAIN Solver***"); + start_timer(world); occupieds = kainsolver.update(occupieds, Residuals); + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); } //orthogonalize + if(world.rank()==0) print("\n***Orthonormalizing***"); + start_timer(world); occupieds = orthogonalize(world,occupieds); + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); //calculate new exchange if(world.rank()==0) print("\n***Recalculating Exchange***"); @@ -1248,17 +1294,21 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Calculate new J+V term if(world.rank()==0) print("\n***Recalculating Coulomb***"); + start_timer(world); real_function_3d rho = real_factory_3d(world); for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ rho += squaremod(occupieds[kk]); } JandV = V + apply(op,rho); + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); //Calculate and print total energy //Simultaneously update eps if(world.rank()==0){ print("\n***Printing Current Energies***"); } + start_timer(world); double kinetic_energy = 0.0; double coulomb_energy = 0.0; double exchange_energy = 0.0; @@ -1271,32 +1321,36 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea real_function_3d Jop = apply(op,rho); - if(world.rank()==0) print(" Recalculating Energies"); + //if(world.rank()==0) print(" Recalculating Energies"); for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - if(world.rank()==0) print(" Adding terms for orbital ", j); + //if(world.rank()==0) print(" Adding terms for orbital ", j); energies[j] = rele(world,occupieds[j]); kinetic_energy += (energies[j] - myc*myc); - if(world.rank()==0) print(" Kinetic done."); + //if(world.rank()==0) print(" Kinetic done."); temp_function = occupieds[j]*V; nuclear_attraction_energy_correction = real(inner(occupieds[j],temp_function)); nuclear_attraction_energy += nuclear_attraction_energy_correction; - if(world.rank()==0) print(" Nuclear Attraction done."); + //if(world.rank()==0) print(" Nuclear Attraction done."); temp_function = occupieds[j]*Jop; coulomb_energy_correction = real(inner(occupieds[j],temp_function)); energies[j] += coulomb_energy_correction + nuclear_attraction_energy_correction; coulomb_energy += 0.5*coulomb_energy_correction; - if(world.rank()==0) print(" Coulomb Repulsion done."); + //if(world.rank()==0) print(" Coulomb Repulsion done."); exchange_energy_correction = real(inner(occupieds[j],Kpsis[j])); energies[j] -= exchange_energy_correction; exchange_energy += 0.5*exchange_energy_correction; - if(world.rank()==0) print(" Exchange done."); + //if(world.rank()==0) print(" Exchange done."); } total_energy = kinetic_energy + coulomb_energy - exchange_energy + nuclear_attraction_energy + nuclear_repulsion_energy; + + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ if(world.rank()==0){ printf(" Orbital: %3i, Energy: %.10e\n",j+1, energies[j]-myc*myc); @@ -1370,11 +1424,14 @@ void DF::solve_occupied(World & world) //Calculate initial J+V term if(world.rank()==0) print("\n***Calculating Initial Coulomb***"); + start_timer(world); real_function_3d rho = real_factory_3d(world); for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ rho += squaremod(occupieds[kk]); } real_function_3d JandV = Vnuc + apply(op,rho); + Tensor times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); //Set tolerance for residuals double tol = pow(10,floor(0.5*log10(DFparams.thresh))); @@ -1399,8 +1456,10 @@ void DF::solve_occupied(World & world) void DF::solve(World& world){ - // Get start time - Tensor start_time = end_timer(world); + // Start timer + start_timer(world); + + //Begin calculation if(world.rank() == 0){ print("\n\n Dirac Fock Calculation"); print(" ------------------------"); @@ -1416,22 +1475,21 @@ void DF::solve(World& world){ if(world.rank()==0) print("Specify a better job parameter."); } - - //Make density lineplots? - make_density_lineplots(world, "density_lineplots", 10000, 0.5); - make_component_lineplots(world, "large_component_lineplots", "small_component_lineplots", 10000, 0.5); - - // Print total time + // Report calculation time // Precision is set to 10 coming in, drop it to 2 std::cout.precision(2); std::cout << std::fixed; + Tensor times = end_timer(world); + if(world.rank() == 0) print("\n Calculation time:", times[0],"\n"); - // Get start time - Tensor current_time = end_timer(world); - current_time = current_time - start_time; - - //Tensor current_time = end_timer(world); - if(world.rank() == 0) print("\n Total time:", current_time[0],"\n"); + //Make density lineplots + start_timer(world); + if(world.rank()==0) print("***Making lineplots***"); + make_density_lineplots(world, "density_lineplots", 50000, 0.5); + make_component_lineplots(world, "large_component_lineplots", "small_component_lineplots", 50000, 0.5); + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); + } void DF::solve_virtuals1(World& world){ diff --git a/src/apps/moldft/rk-3.cc b/src/apps/moldft/rk-3.cc index 241e3a248f7..3163c116464 100644 --- a/src/apps/moldft/rk-3.cc +++ b/src/apps/moldft/rk-3.cc @@ -41,8 +41,8 @@ static const double op_dx=1e-16; //TRY CHANGING THIS 1e-16 static const double op_quadacc=1e-8; //FIND ALL INSTANCES OF THIS AND DEAL WITH IT static const double op_thresh=1e-8; -static const long k = 10; // wavelet order -static const double thresh = 1e-8; // precision +static const long k = 12; // wavelet order +static const double thresh = 1e-10; // precision static const double L = 50.0; // box size static const bool FINITENUC = false; @@ -489,7 +489,7 @@ int main(int argc, char** argv) { //if(world.rank()==0) print("eps beforehand: ", eps); NonlinearSolver solver(10); - for (int iter=0; iter<10; iter++) { + for (int iter=0; iter<20; iter++) { psi.scale(1.0/psi.norm2()); //double eps = compute_energy(world, psi, Vnuc); real_function_3d residual = iterate(world, Vnuc, psi, eps); diff --git a/src/madness/mra/funcdefaults.h b/src/madness/mra/funcdefaults.h index 074b4d1d1e2..75794f1f1ea 100644 --- a/src/madness/mra/funcdefaults.h +++ b/src/madness/mra/funcdefaults.h @@ -448,8 +448,8 @@ namespace madness { } /// Sets the default process map and redistributes all functions using the old map - static void redistribute(World& world, const std::shared_ptr< WorldDCPmapInterface< Key > >& newpmap) { - pmap->redistribute(world,newpmap); + static void redistribute(World& world, const std::shared_ptr< WorldDCPmapInterface< Key > >& newpmap, bool doprint=true) { + pmap->redistribute(world,newpmap, doprint); pmap = newpmap; } diff --git a/src/madness/world/worlddc.h b/src/madness/world/worlddc.h index bd67e187a5b..d9c3bc97b65 100644 --- a/src/madness/world/worlddc.h +++ b/src/madness/world/worlddc.h @@ -111,8 +111,8 @@ namespace madness { /// new map and no objects will be registered in the current map. /// @param[in] world The associated world /// @param[in] newpmap The new process map - void redistribute(World& world, const std::shared_ptr< WorldDCPmapInterface >& newpmap) { - print_data_sizes(world, "before redistributing"); + void redistribute(World& world, const std::shared_ptr< WorldDCPmapInterface >& newpmap, bool doprint=true) { + if(doprint) print_data_sizes(world, "before redistributing"); world.gop.fence(); for (typename std::set::iterator iter = ptrs.begin(); iter != ptrs.end(); @@ -134,7 +134,7 @@ namespace madness { } world.gop.fence(); ptrs.clear(); - newpmap->print_data_sizes(world, "after redistributing"); + if(doprint) newpmap->print_data_sizes(world, "after redistributing"); } /// Counts global number of entries in all containers associated with this process map From 3521c3b288296c44f4ceee88edd5114ea510af1e Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 7 Aug 2018 10:30:55 -0400 Subject: [PATCH 0006/1312] bugfix --- src/madness/mra/vmra.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index 29ac99a52a8..e3ee3eda6a1 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -843,7 +843,8 @@ namespace madness { bool fence=true) { compress(world, f); - Function r=real_factory_3d(world).compressed(); + //Function r=real_factory_3d(world).compressed(); //This line causes problems for T complex, NDIM != 3 + Function r = FunctionFactory(world).compressed(); for (unsigned int i=0; i Date: Tue, 7 Aug 2018 10:31:19 -0400 Subject: [PATCH 0007/1312] major code speedup --- src/apps/moldft/DF.cc | 333 +++++++++++++++++++++++++-------- src/apps/moldft/DF.h | 2 + src/apps/moldft/DFParameters.h | 8 +- src/apps/moldft/fcwf.cc | 209 +++++++++++++-------- src/apps/moldft/fcwf.h | 31 +-- 5 files changed, 409 insertions(+), 174 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 7d6da8e3064..e58284dfec5 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -143,6 +143,15 @@ GradBSHOperator_Joel(World& world, } +//Stolen from SCF.cc to aid in orthonormalization +Tensor> Q2(const Tensor>& s) { + Tensor> Q = -0.5*s; + for (int i=0; i { private: @@ -457,6 +466,36 @@ Fcwf apply_T(World& world, const Fcwf& psi){ return Tpsi * (-myi*myc); } +////Calculates K*psi for each psi in the orbitals vector and stores them in result +//void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsis){ +// //start timer +// start_timer(world); +// +// complex_function_3d temp(world); +// +// unsigned int n = Init_params.num_occupied; +// for(unsigned int i = 0; i < n; i++){ +// for(unsigned int j = 0; j < n ; j++){ +// temp = inner_func(world,occupieds[j],occupieds[i]); +// temp.truncate(); +// +// temp = apply(op,temp); +// if(j == 0){ +// Kpsis[i] = occupieds[j]*temp; +// } +// else{ +// Kpsis[i] += occupieds[j]*temp; +// } +// } +// +// //here too +// Kpsis[i].truncate(); +// } +// +// //Report time +// Tensor times = end_timer(world); +// if(world.rank()==0) print(" ", times[0]); +//} //Calculates K*psi for each psi in the orbitals vector and stores them in result void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsis){ //start timer @@ -466,18 +505,26 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi unsigned int n = Init_params.num_occupied; for(unsigned int i = 0; i < n; i++){ - for(unsigned int j = 0; j < n; j++){ - temp = inner_func(occupieds[j],occupieds[i]); - - //try truncating + for(unsigned int j = i; j < n ; j++){ + temp = inner_func(world,occupieds[j],occupieds[i]); temp.truncate(); temp = apply(op,temp); - if(j == 0){ + if(i == 0 && j == 0){ Kpsis[i] = occupieds[j]*temp; } + else if(i == 0){ + Kpsis[i] += occupieds[j]*temp; + temp = temp.conj(); + Kpsis[j] = occupieds[i]*temp; + } + else if(i == j){ + Kpsis[i] += occupieds[j]*temp; + } else{ Kpsis[i] += occupieds[j]*temp; + temp = temp.conj(); + Kpsis[j] += occupieds[i]*temp; } } @@ -496,7 +543,7 @@ Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ unsigned int n = Init_params.num_occupied; for(unsigned int i = 0; i < n; i++){ - temp = inner_func(occupieds[i],phi); + temp = inner_func(world, occupieds[i], phi); temp.truncate(); temp = apply(op,temp); if(i == 0){ @@ -557,7 +604,7 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op } if(world.rank()==0) print(" Integrating to form Fock Matrix"); - DF::start_timer(world); + start_timer(world); //We now have a vector of F*psi for each psi (in neworbitals). //Calculate each element of the fock matrix @@ -568,30 +615,31 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op //1) Create four std::vectors each from occupieds and temp_orbitals, one for each component //2) Call the new matrix inner for each component. Result in each case gives a matrix //3) Sum all the matrices - std::vector occupieds_1; - std::vector occupieds_2; - std::vector occupieds_3; - std::vector occupieds_4; - std::vector temp_orbitals_1; - std::vector temp_orbitals_2; - std::vector temp_orbitals_3; - std::vector temp_orbitals_4; - for(unsigned int i = 0; i < n; i++){ - occupieds_1.push_back(occupieds[i][0]); - occupieds_2.push_back(occupieds[i][1]); - occupieds_3.push_back(occupieds[i][2]); - occupieds_4.push_back(occupieds[i][3]); - temp_orbitals_1.push_back(temp_orbitals[i][0]); - temp_orbitals_2.push_back(temp_orbitals[i][1]); - temp_orbitals_3.push_back(temp_orbitals[i][2]); - temp_orbitals_4.push_back(temp_orbitals[i][3]); - } - Tensor> component1 = matrix_inner(world,occupieds_1,temp_orbitals_1); - Tensor> component2 = matrix_inner(world,occupieds_2,temp_orbitals_2); - Tensor> component3 = matrix_inner(world,occupieds_3,temp_orbitals_3); - Tensor> component4 = matrix_inner(world,occupieds_4,temp_orbitals_4); - - fock = component1+component2+component3+component4; + //std::vector occupieds_1; + //std::vector occupieds_2; + //std::vector occupieds_3; + //std::vector occupieds_4; + //std::vector temp_orbitals_1; + //std::vector temp_orbitals_2; + //std::vector temp_orbitals_3; + //std::vector temp_orbitals_4; + //for(unsigned int i = 0; i < n; i++){ + // occupieds_1.push_back(occupieds[i][0]); + // occupieds_2.push_back(occupieds[i][1]); + // occupieds_3.push_back(occupieds[i][2]); + // occupieds_4.push_back(occupieds[i][3]); + // temp_orbitals_1.push_back(temp_orbitals[i][0]); + // temp_orbitals_2.push_back(temp_orbitals[i][1]); + // temp_orbitals_3.push_back(temp_orbitals[i][2]); + // temp_orbitals_4.push_back(temp_orbitals[i][3]); + //} + //Tensor> component1 = matrix_inner(world,occupieds_1,temp_orbitals_1); + //Tensor> component2 = matrix_inner(world,occupieds_2,temp_orbitals_2); + //Tensor> component3 = matrix_inner(world,occupieds_3,temp_orbitals_3); + //Tensor> component4 = matrix_inner(world,occupieds_4,temp_orbitals_4); + + //fock = component1+component2+component3+component4; + fock = matrix_inner(world, occupieds, temp_orbitals); //Old Method here: //for(unsigned int j = 0; j < n; j++){ @@ -600,7 +648,7 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op // } //} - Tensor times = DF::end_timer(world); + Tensor times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -612,11 +660,12 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op // overlap(j,k) = inner(occupieds[j],occupieds[k]); // } //} - component1 = matrix_inner(world,occupieds_1,occupieds_1); - component2 = matrix_inner(world,occupieds_2,occupieds_2); - component3 = matrix_inner(world,occupieds_3,occupieds_3); - component4 = matrix_inner(world,occupieds_4,occupieds_4); - overlap = component1 + component2 + component3 + component4; + //component1 = matrix_inner(world,occupieds_1,occupieds_1); + //component2 = matrix_inner(world,occupieds_2,occupieds_2); + //component3 = matrix_inner(world,occupieds_3,occupieds_3); + //component4 = matrix_inner(world,occupieds_4,occupieds_4); + //overlap = component1 + component2 + component3 + component4; + overlap = matrix_inner(world,occupieds,occupieds); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -726,26 +775,66 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op start_timer(world); ////Apply the transformation to the Exchange - for(unsigned int j = 0; j < n; j++){ - temp_orbitals[j] = Fcwf(world); - for(unsigned int k = 0; k < n; k++){ - temp_orbitals[j] += Kpsis[k]*U(k,j); - } - } - for(unsigned int m = 0; m < n; m++){ - Kpsis[m] = temp_orbitals[m]; - } + //for(unsigned int j = 0; j < n; j++){ + // temp_orbitals[j] = Fcwf(world); + // for(unsigned int k = 0; k < n; k++){ + // temp_orbitals[j] += Kpsis[k]*U(k,j); + // } + //} + //for(unsigned int m = 0; m < n; m++){ + // Kpsis[m] = temp_orbitals[m]; + //} + + //Trying a different method of applying the transformation, using vmra's transform + //for(unsigned int i = 0; i < n; i++){ + // temp_orbitals_1[i] = Kpsis[i][0]; + // temp_orbitals_2[i] = Kpsis[i][1]; + // temp_orbitals_3[i] = Kpsis[i][2]; + // temp_orbitals_4[i] = Kpsis[i][3]; + //} + //temp_orbitals_1 = transform(world, temp_orbitals_1, U); + //temp_orbitals_2 = transform(world, temp_orbitals_2, U); + //temp_orbitals_3 = transform(world, temp_orbitals_3, U); + //temp_orbitals_4 = transform(world, temp_orbitals_4, U); + //for(unsigned int i = 0; i < n; i++){ + // Kpsis[i][0] = temp_orbitals_1[i]; + // Kpsis[i][1] = temp_orbitals_2[i]; + // Kpsis[i][2] = temp_orbitals_3[i]; + // Kpsis[i][3] = temp_orbitals_4[i]; + //} + transform(world, Kpsis, U); ////Apply the transformation to the orbitals - for(unsigned int j = 0; j < n; j++){ - temp_orbitals[j] = Fcwf(world); - for(unsigned int k = 0; k < n; k++){ - temp_orbitals[j] += occupieds[k]*U(k,j); - } - } - for(unsigned int j = 0; j < n; j++){ - occupieds[j] = temp_orbitals[j]; - } + //for(unsigned int j = 0; j < n; j++){ + // temp_orbitals[j] = Fcwf(world); + // for(unsigned int k = 0; k < n; k++){ + // temp_orbitals[j] += occupieds[k]*U(k,j); + // } + //} + //for(unsigned int j = 0; j < n; j++){ + // occupieds[j] = temp_orbitals[j]; + //} + + //Trying a different method of applying the transformation, using vmra's transform + //for(unsigned int i = 0; i < n; i++){ + // temp_orbitals_1[i] = occupieds[i][0]; + // temp_orbitals_2[i] = occupieds[i][1]; + // temp_orbitals_3[i] = occupieds[i][2]; + // temp_orbitals_4[i] = occupieds[i][3]; + //} + //temp_orbitals_1 = transform(world, temp_orbitals_1, U); + //temp_orbitals_2 = transform(world, temp_orbitals_2, U); + //temp_orbitals_3 = transform(world, temp_orbitals_3, U); + //temp_orbitals_4 = transform(world, temp_orbitals_4, U); + //for(unsigned int i = 0; i < n; i++){ + // occupieds[i][0] = temp_orbitals_1[i]; + // occupieds[i][1] = temp_orbitals_2[i]; + // occupieds[i][2] = temp_orbitals_3[i]; + // occupieds[i][3] = temp_orbitals_4[i]; + //} + transform(world, occupieds, U); + + times = end_timer(world); if(world.rank()==0) print(" ", times[0]); times = end_timer(world); @@ -773,6 +862,45 @@ std::vector orthogonalize(World& world, std::vector orbitals){ } +//faster orthogonalize that modifies the input functions in place +//Make this a member function of DF +void DF::orthogonalize_inplace(World& world){ + + unsigned int n = occupieds.size(); + double maxq; + + //Debugging: original overlap matrix for comparison + //Tensor> overlap = matrix_inner(world, occupieds, occupieds); + //if(world.rank()==0) print("\noriginal overlap:\n", overlap); + + //normalize beforehand + for(unsigned int i = 0; i < n; i++){ + occupieds[i].normalize(); + } + + //Basically stolen from SCF.cc + do{ + Tensor> Q = Q2(matrix_inner(world,occupieds,occupieds)); + maxq = 0.0; + for(unsigned int j=1; j0.01); + + //normalize afterward + for(unsigned int i = 0; i < n; i++){ + occupieds[i].normalize(); + } + + //Debugging: print new overlap matrix + //overlap = matrix_inner(world, occupieds, occupieds); + //if(world.rank()==0) print("\nnew overlap:\n", overlap); + +} + //Different diagonalize function that doesn't try to calculate a coulomb part internally Tensor DF::diagonalize_virtuals(World& world, real_function_3d& JandV,real_convolution_3d& op, std::vector& Kpsis){ @@ -1284,7 +1412,8 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //orthogonalize if(world.rank()==0) print("\n***Orthonormalizing***"); start_timer(world); - occupieds = orthogonalize(world,occupieds); + //occupieds = orthogonalize(world,occupieds); + orthogonalize_inplace(world); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -1315,9 +1444,9 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea double nuclear_attraction_energy = 0.0; double old_total_energy = total_energy; double myc = 137.0359895; //speed of light - double nuclear_attraction_energy_correction; - double coulomb_energy_correction; - double exchange_energy_correction; + Tensor nuclear_attraction_tensor; + Tensor coulomb_tensor; + Tensor exchange_tensor; real_function_3d Jop = apply(op,rho); @@ -1329,22 +1458,61 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea kinetic_energy += (energies[j] - myc*myc); //if(world.rank()==0) print(" Kinetic done."); + } - temp_function = occupieds[j]*V; - nuclear_attraction_energy_correction = real(inner(occupieds[j],temp_function)); - nuclear_attraction_energy += nuclear_attraction_energy_correction; - //if(world.rank()==0) print(" Nuclear Attraction done."); - - temp_function = occupieds[j]*Jop; - coulomb_energy_correction = real(inner(occupieds[j],temp_function)); - energies[j] += coulomb_energy_correction + nuclear_attraction_energy_correction; - coulomb_energy += 0.5*coulomb_energy_correction; - //if(world.rank()==0) print(" Coulomb Repulsion done."); - - exchange_energy_correction = real(inner(occupieds[j],Kpsis[j])); - energies[j] -= exchange_energy_correction; - exchange_energy += 0.5*exchange_energy_correction; - //if(world.rank()==0) print(" Exchange done."); + //temp_function = occupieds[j]*V; + //nuclear_attraction_energy_correction = real(inner(occupieds[j],temp_function)); + //nuclear_attraction_energy += nuclear_attraction_energy_correction; + std::vector occupieds1(Init_params.num_occupied); + std::vector occupieds2(Init_params.num_occupied); + std::vector occupieds3(Init_params.num_occupied); + std::vector occupieds4(Init_params.num_occupied); + for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + occupieds1[i] = occupieds[i][0]; + occupieds2[i] = occupieds[i][1]; + occupieds3[i] = occupieds[i][2]; + occupieds4[i] = occupieds[i][3]; + } + nuclear_attraction_tensor = real(inner(world,occupieds1,mul(world,V,occupieds1))); + nuclear_attraction_tensor += real(inner(world,occupieds2,mul(world,V,occupieds2))); + nuclear_attraction_tensor += real(inner(world,occupieds3,mul(world,V,occupieds3))); + nuclear_attraction_tensor += real(inner(world,occupieds4,mul(world,V,occupieds4))); + nuclear_attraction_energy = nuclear_attraction_tensor.sum(); + //if(world.rank()==0) print(" Nuclear Attraction done."); + + //temp_function = occupieds[j]*Jop; + //coulomb_energy_correction = real(inner(occupieds[j],temp_function)); + //energies[j] += coulomb_energy_correction + nuclear_attraction_energy_correction; + //coulomb_energy += 0.5*coulomb_energy_correction; + coulomb_tensor = real(inner(world,occupieds1,mul(world,Jop,occupieds1))); + coulomb_tensor += real(inner(world,occupieds2,mul(world,Jop,occupieds2))); + coulomb_tensor += real(inner(world,occupieds3,mul(world,Jop,occupieds3))); + coulomb_tensor += real(inner(world,occupieds4,mul(world,Jop,occupieds4))); + coulomb_energy = 0.5*coulomb_tensor.sum(); + //if(world.rank()==0) print(" Coulomb Repulsion done."); + + //exchange_energy_correction = real(inner(occupieds[j],Kpsis[j])); + //energies[j] -= exchange_energy_correction; + //exchange_energy += 0.5*exchange_energy_correction; + std::vector Kpsis1(Init_params.num_occupied); + std::vector Kpsis2(Init_params.num_occupied); + std::vector Kpsis3(Init_params.num_occupied); + std::vector Kpsis4(Init_params.num_occupied); + for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + Kpsis1[i] = Kpsis[i][0]; + Kpsis2[i] = Kpsis[i][1]; + Kpsis3[i] = Kpsis[i][2]; + Kpsis4[i] = Kpsis[i][3]; + } + exchange_tensor = real(inner(world,occupieds1,Kpsis1)); + exchange_tensor += real(inner(world,occupieds2,Kpsis2)); + exchange_tensor += real(inner(world,occupieds3,Kpsis3)); + exchange_tensor += real(inner(world,occupieds4,Kpsis4)); + exchange_energy = 0.5*exchange_tensor.sum(); + //if(world.rank()==0) print(" Exchange done."); + + for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + energies[i] += nuclear_attraction_tensor[i]+coulomb_tensor[i] - exchange_tensor[i]; } total_energy = kinetic_energy + coulomb_energy - exchange_energy + nuclear_attraction_energy + nuclear_repulsion_energy; @@ -1376,6 +1544,9 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea for(unsigned int j = 0; j < Init_params.num_occupied; j++){ occupieds[j].truncate(); } + + times = end_timer(world); + if(world.rank()==0) print(" Iteration time:", times[0]); return iterate_again; } @@ -1483,12 +1654,14 @@ void DF::solve(World& world){ if(world.rank() == 0) print("\n Calculation time:", times[0],"\n"); //Make density lineplots - start_timer(world); - if(world.rank()==0) print("***Making lineplots***"); - make_density_lineplots(world, "density_lineplots", 50000, 0.5); - make_component_lineplots(world, "large_component_lineplots", "small_component_lineplots", 50000, 0.5); - times = end_timer(world); - if(world.rank()==0) print(" ", times[0]); + if(DFparams.lineplot){ + start_timer(world); + if(world.rank()==0) print("***Making lineplots***"); + make_density_lineplots(world, "density_lineplots", 50000, 0.5); + make_component_lineplots(world, "large_component_lineplots", "small_component_lineplots", 50000, 0.5); + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); + } } diff --git a/src/apps/moldft/DF.h b/src/apps/moldft/DF.h index 55c8b1c57df..a5297cac5a0 100644 --- a/src/apps/moldft/DF.h +++ b/src/apps/moldft/DF.h @@ -132,6 +132,8 @@ class DF { //Lineplot the densities of the large and small component separately. only along x axis from 0 to L void make_component_lineplots(World& world, const char* filename1, const char* filename2, int npt, double endpnt); + void orthogonalize_inplace(World& world); + }; diff --git a/src/apps/moldft/DFParameters.h b/src/apps/moldft/DFParameters.h index cb24c22589e..8b831e6d3da 100644 --- a/src/apps/moldft/DFParameters.h +++ b/src/apps/moldft/DFParameters.h @@ -48,6 +48,7 @@ namespace madness { std::string savefile; ///< Gives the file to save the archive each iteration Default: DFrestartdata (in working directory) int lb_iter; ///< How many iterations to load balance (after the initial load balancing) bool nwchem; ///< Indicates archive given is actually an nwchem file for starting the job + bool lineplot; ///< Whether or not to make lineplots at the end of the job //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // If you add something here, don't forget to add it to serializable! @@ -60,7 +61,7 @@ namespace madness { template void serialize(Archive& ar){ - ar & archive & job & print_level & max_iter & small & thresh & kain & maxsub & restart & nucleus & do_save & savefile & lb_iter & nwchem; + ar & archive & job & print_level & max_iter & small & thresh & kain & maxsub & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot; } // Default constructor @@ -79,6 +80,7 @@ namespace madness { , savefile("DFrestartdata") , lb_iter(20) , nwchem(false) + , lineplot(false) {} // Initializes DFParameters using the contents of file \c filename @@ -159,6 +161,9 @@ namespace madness { else if (s == "nwchem"){ nwchem = true; } + else if (s == "lineplot"){ + lineplot = true; + } else{ std::cout << "Dirac Fock: unrecognized input keyword " << s << std::endl; MADNESS_EXCEPTION("input error", 0); @@ -185,6 +190,7 @@ namespace madness { else{ madness::print(" Nucleus: gaussian"); } + madness::print(" Do Lineplots:", lineplot); madness::print(" Plot Final Orbitals:", plot); if(plot and plot_range) madness::print(" Plot Start:", plot_data[0]); if(plot and plot_range) madness::print(" Plot End:", plot_data[1]); diff --git a/src/apps/moldft/fcwf.cc b/src/apps/moldft/fcwf.cc index a8ce91f9772..c433914bcdc 100644 --- a/src/apps/moldft/fcwf.cc +++ b/src/apps/moldft/fcwf.cc @@ -130,16 +130,12 @@ using namespace madness; return Fcwf(temp); } - Fcwf Fcwf::operator*(std::complex a){ - //print("multiply1"); + Fcwf Fcwf::operator*(std::complex a) const { MADNESS_ASSERT(m_initialized); std::vector temp(4); - //print("multiply2"); for(int i = 0 ; i < 4 ; i++){ - //print("multiply3, ",i); temp[i] = a*m_psi[i]; } - //print("multiply4"); return Fcwf(temp); } @@ -193,10 +189,11 @@ using namespace madness; double Fcwf::norm2(){ MADNESS_ASSERT(m_initialized); - std::complex temp(0,0); - for(int i = 0 ; i < 4 ; i++){ - temp += madness::inner(m_psi[i],m_psi[i]); - } + std::complex temp = madness::inner(m_psi[0].world(), m_psi, m_psi).sum(); + //std::complex temp(0,0); + //for(int i = 0 ; i < 4 ; i++){ + // temp += madness::inner(m_psi[i],m_psi[i]); + //} return std::sqrt(std::real(temp)); } @@ -212,7 +209,7 @@ using namespace madness; } } - Fcwf Fcwf::operator*(madness::complex_function_3d phi){ + Fcwf Fcwf::operator*(madness::complex_function_3d& phi){ MADNESS_ASSERT(m_initialized); std::vector temp(4); for(int i = 0 ; i < 4 ; i++){ @@ -221,7 +218,7 @@ using namespace madness; return Fcwf(temp); } - Fcwf Fcwf::operator*(madness::real_function_3d phi){ + Fcwf Fcwf::operator*(madness::real_function_3d& phi){ MADNESS_ASSERT(m_initialized); std::vector temp(4); for(int i = 0 ; i < 4 ; i++){ @@ -237,16 +234,20 @@ using namespace madness; } } + std::complex Fcwf::inner(World& world, const Fcwf& phi) const{ + MADNESS_ASSERT(m_initialized && phi.getinitialize()); + return madness::inner(world, m_psi, phi.m_psi).sum(); + } + std::complex inner(const Fcwf& psi, const Fcwf& phi){ - //print("inner 1"); - std::complex result(0,0); - for(int i = 0 ; i < 4 ; i++){ - //print("inner 2, ",i); - result += madness::inner(psi[i],phi[i]); - } - //print("inner 3"); - return result; + //std::complex result(0,0); + //for(int i = 0 ; i < 4 ; i++){ + // result += madness::inner(psi[i],phi[i]); + //} + //return result; + MADNESS_ASSERT(psi.getinitialize() && phi.getinitialize()); + return psi.inner(psi[0].world(), phi); } Fcwf apply(real_convolution_3d& op, const Fcwf& psi){ @@ -257,30 +258,33 @@ Fcwf apply(real_convolution_3d& op, const Fcwf& psi){ return Fcwf(temp); } -real_function_3d squaremod(Fcwf psi){ +real_function_3d squaremod(Fcwf& psi){ MADNESS_ASSERT(psi.getinitialize()); real_function_3d temp = abssq(psi[0]) + abssq(psi[1]) + abssq(psi[2]) + abssq(psi[3]); return temp; } -real_function_3d squaremod_small(Fcwf psi){ +real_function_3d squaremod_small(Fcwf& psi){ MADNESS_ASSERT(psi.getinitialize()); real_function_3d temp = abssq(psi[2]) + abssq(psi[3]); return temp; } -real_function_3d squaremod_large(Fcwf psi){ +real_function_3d squaremod_large(Fcwf& psi){ MADNESS_ASSERT(psi.getinitialize()); real_function_3d temp = abssq(psi[0]) + abssq(psi[1]); return temp; } -complex_function_3d inner_func(Fcwf psi, Fcwf phi){ +complex_function_3d inner_func(World& world, Fcwf& psi, Fcwf& phi){ MADNESS_ASSERT(psi.getinitialize() && phi.getinitialize()); - complex_function_3d result = conj(psi[0])*phi[0]; - result += conj(psi[1])*phi[1]; - result += conj(psi[2])*phi[2]; - result += conj(psi[3])*phi[3]; + std::vector a(4); + std::vector b(4); + for(unsigned int i = 0; i < 4; i++){ + a[i] = psi[i]; + b[i] = phi[i]; + } + complex_function_3d result = sum(world, mul(world, conj(world, a), b)); return result; } @@ -289,112 +293,155 @@ Fcwf copy(Fcwf psi){ } -std::complex inner(std::vector a, std::vector b){ - //print("inner 1"); +std::complex inner(std::vector& a, std::vector& b){ MADNESS_ASSERT(a.size() == b.size()); std::complex result(0,0); for(int i = 0; i < a.size(); i++){ - //print("inner 2, i =", i); result += inner(a[i],b[i]); } - //print("inner 3"); return result; } -std::vector operator*(std::vector psis, std::complex a){ +std::vector operator*(const std::vector& psis, std::complex a){ std::vector result; - //print("multiply 1"); if(psis.size() != 0){ for(int i = 0; i < psis.size(); i++){ - //print("multiply 2, ", i); result.push_back(psis[i]*a); } } - //print("multiply 3"); return result; } -std::vector operator*(std::complex a, std::vector psis){ +std::vector operator*(std::complex a, const std::vector& psis){ std::vector result; - //print("multiply 1"); if(psis.size() != 0){ for(int i = 0; i < psis.size(); i++){ - //print("multiply 2, ", i); result.push_back(psis[i]*a); } } - //print("multiply 3"); return result; } -void operator+=(std::vector& phi, std::vector psi){ +void operator+=(std::vector& phi, const std::vector& psi){ std::vector result; - //print("inplace add 1"); if(phi.size()==0){ - //print("inplace add 2"); phi = psi; } else if(psi.size() != 0){ - //print("inplace add 3"); MADNESS_ASSERT(phi.size()==psi.size()); for(int i=0; i < psi.size(); i++){ - //print("inplace add 4, i =", i); phi[i]+=psi[i]; } } - //print("inplace add 5"); - return; } -std::vector operator-(std::vector phi, std::vector psi){ +std::vector operator-(const std::vector& phi, const std::vector& psi){ std::vector result; - //print("subtract 1"); - if(phi.size()==0){ - //print("subtract 2"); - std::vector temp = -1.0*psi; - return temp; + if(psi.size()==0){ + result = phi; } - else if(psi.size()==0){ - //print("subtract 3"); - return phi; + else if(phi.size()==0){ + result = -1.0*psi; } else{ - //print("subtract 4"); MADNESS_ASSERT(phi.size()==psi.size()); for(int i=0; i < psi.size(); i++){ - //print("subtract 5, i =", i ); result.push_back(phi[i]-psi[i]); } } - //print("subtract 6"); return result; } - //Constructor - Fcwf_vector_allocator::Fcwf_vector_allocator(World& world, unsigned int m_size) - : world(world) - , m_size(m_size) - {} - - //Overloading () operator - std::vector Fcwf_vector_allocator::operator()(){ - std::vector result; - for(int i=0; i < m_size; i++){ - result.push_back(Fcwf(world)); - } - return result; - } +//Constructor +Fcwf_vector_allocator::Fcwf_vector_allocator(World& world, unsigned int m_size) +: world(world) +, m_size(m_size) +{} - //Copy Constructor - //according to Bryan, according to Jakob, this is necessary for KAIN? - Fcwf_vector_allocator Fcwf_vector_allocator::operator=(const Fcwf_vector_allocator& other){ - Fcwf_vector_allocator tmp(world, other.m_size); - return tmp; - } +//Overloading () operator +std::vector Fcwf_vector_allocator::operator()(){ + std::vector result; + for(int i=0; i < m_size; i++){ + result.push_back(Fcwf(world)); + } + return result; +} - void Fcwf_vector_allocator::set_size(int size){ - m_size = size; - } +//Copy Constructor +//according to Bryan, according to Jakob, this is necessary for KAIN? +Fcwf_vector_allocator Fcwf_vector_allocator::operator=(const Fcwf_vector_allocator& other){ + Fcwf_vector_allocator tmp(world, other.m_size); + return tmp; +} + +void Fcwf_vector_allocator::set_size(int size){ + m_size = size; +} + +//Forms the outer product between two vectors of Fcwfs, where each matrix element is the inner product of the two contributing Fcwfs. +Tensor> matrix_inner(World& world, std::vector& a, std::vector& b){ + unsigned int n = a.size(); + unsigned int m = b.size(); + MADNESS_ASSERT(n==m); + + std::vector a_1(n); + std::vector a_2(n); + std::vector a_3(n); + std::vector a_4(n); + std::vector b_1(n); + std::vector b_2(n); + std::vector b_3(n); + std::vector b_4(n); + + for(unsigned int i = 0; i < n; i++){ + a_1[i] = a[i][0]; + a_2[i] = a[i][1]; + a_3[i] = a[i][2]; + a_4[i] = a[i][3]; + b_1[i] = b[i][0]; + b_2[i] = b[i][1]; + b_3[i] = b[i][2]; + b_4[i] = b[i][3]; + } + + Tensor> component1 = matrix_inner(world, a_1, b_1); + Tensor> component2 = matrix_inner(world, a_2, b_2); + Tensor> component3 = matrix_inner(world, a_3, b_3); + Tensor> component4 = matrix_inner(world, a_4, b_4); + component1=component1+component2+component3+component4; + return component1; +} + +void transform(World& world, std::vector& a, Tensor> U){ + unsigned int n = a.size(); + unsigned int m = U.dim(0); + unsigned int k = U.dim(1); + MADNESS_ASSERT(n==m); + MADNESS_ASSERT(m==k); //for now only support square transformation + + std::vector a_1(n); + std::vector a_2(n); + std::vector a_3(n); + std::vector a_4(n); + for(unsigned int i = 0; i < n; i++){ + a_1[i] = a[i][0]; + a_2[i] = a[i][1]; + a_3[i] = a[i][2]; + a_4[i] = a[i][3]; + } + a_1 = transform(world, a_1, U); + a_2 = transform(world, a_2, U); + a_3 = transform(world, a_3, U); + a_4 = transform(world, a_4, U); + + for(unsigned int i = 0; i < n; i++){ + a[i][0] = a_1[i]; + a[i][1] = a_2[i]; + a[i][2] = a_3[i]; + a[i][3] = a_4[i]; + } + +} //kthxbye diff --git a/src/apps/moldft/fcwf.h b/src/apps/moldft/fcwf.h index a3f9e1c1c73..294fa209d3d 100644 --- a/src/apps/moldft/fcwf.h +++ b/src/apps/moldft/fcwf.h @@ -46,7 +46,7 @@ class Fcwf{ Fcwf operator+(const Fcwf& phi); - Fcwf operator*(std::complex a); + Fcwf operator*(std::complex a) const ; void scale(std::complex a); @@ -58,35 +58,42 @@ class Fcwf{ void normalize(); - Fcwf operator*(madness::complex_function_3d phi); + Fcwf operator*(madness::complex_function_3d& phi); - Fcwf operator*(madness::real_function_3d phi); + Fcwf operator*(madness::real_function_3d& phi); void truncate(); + std::complex inner(World& world, const Fcwf& phi) const; + }; std::complex inner(const Fcwf& psi, const Fcwf& phi); Fcwf apply(real_convolution_3d& op, const Fcwf& psi); -real_function_3d squaremod(Fcwf psi); -real_function_3d squaremod_small(Fcwf psi); -real_function_3d squaremod_large(Fcwf psi); +real_function_3d squaremod(Fcwf& psi); +real_function_3d squaremod_small(Fcwf& psi); +real_function_3d squaremod_large(Fcwf& psi); -complex_function_3d inner_func(Fcwf psi, Fcwf phi); +complex_function_3d inner_func(World& world, Fcwf& psi, Fcwf& phi); Fcwf copy(Fcwf psi); -std::complex inner(std::vector a, std::vector b); +std::complex inner(std::vector& a, std::vector& b); + +std::vector operator*(const std::vector& psis, std::complex a); + +std::vector operator*(std::complex a, const std::vector& psis); + +void operator+=(std::vector& phi, const std::vector& psi); -std::vector operator*(std::vector psis, std::complex a); +std::vector operator-(const std::vector& phi, const std::vector& psi); -std::vector operator*(std::complex a, std::vector psis); -void operator+=(std::vector& phi, std::vector psi); +Tensor> matrix_inner(World& world, std::vector& a, std::vector& b); -std::vector operator-(std::vector phi, std::vector psi); +void transform(World& world, std::vector& a, Tensor> U); class Fcwf_vector_allocator { World& world; From 03789c529c6f0474173f90fbe5bfdb993b4e194b Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Thu, 16 Aug 2018 12:50:31 -0400 Subject: [PATCH 0008/1312] more speedup tweaks --- src/madness/mra/vmra.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index e3ee3eda6a1..2c8b2c74526 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -941,7 +941,8 @@ namespace madness { if (op.is_slaterf12) { MADNESS_ASSERT(not op.destructive()); for (unsigned int i=0; i Date: Fri, 21 Sep 2018 16:10:54 -0400 Subject: [PATCH 0009/1312] various DF optimizations --- src/apps/moldft/DF.cc | 206 +++++++++++++++----- src/apps/moldft/fcwf.cc | 406 +++++++++++++++++++++------------------- src/apps/moldft/fcwf.h | 7 +- src/apps/moldft/rk-3.cc | 9 +- 4 files changed, 380 insertions(+), 248 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index e58284dfec5..e223edb9727 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -503,9 +503,27 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi complex_function_3d temp(world); + //reconstruct + for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + occupieds[i].reconstruct(); + } + unsigned int n = Init_params.num_occupied; for(unsigned int i = 0; i < n; i++){ - for(unsigned int j = i; j < n ; j++){ + for(unsigned int j = i; j < n ; j++){ //parallelize this loop using 4-vectors approach + + /*TODO (vector inner_func) + * loop over 4 component indices + * gather the n-i+1 (here, index j) functions for the component index + * vector multiply by occupieds[i] component + * accumulate result + * truncate + */ + + + //load balance like in SCF.cc KE routine + + temp = inner_func(world,occupieds[j],occupieds[i]); temp.truncate(); @@ -528,7 +546,6 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi } } - //here too Kpsis[i].truncate(); } @@ -559,7 +576,7 @@ Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ //Diagonalize psiss in the Fock space. psis is modified in place. requires Kpsis to be precomputed //Kpsis are transformed in place. -void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op, std::vector& Kpsis){ +void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& op, std::vector& Kpsis){ if(world.rank()==0) print("\n***Diagonalizing***"); start_timer(world); @@ -576,25 +593,27 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op ////Form the Fock Matrix //first apply Fock operator to all orbitals + // - if(world.rank() == 0) print(" Moving K*psi"); - //Move Kpsis to new orbitals, as they are part of the fock operator - for(unsigned int j = 0; j < n; j++){ - temp_orbitals.push_back(Kpsis[j]); - temp_orbitals[j].scale(-1.0); - } - //calculate coulomb part if(world.rank() == 0) print(" Adding (V+J)psi"); real_function_3d rho = real_factory_3d(world); for(unsigned int j = 0; j < n; j++){ rho += squaremod(occupieds[j]); } + //TODO: Here try moving the apply out to operate on the sum of the nuclear and electronic charge distributions real_function_3d potential = myV + apply(op,rho); + potential.truncate(); //add in coulomb parts to neworbitals for(unsigned int j = 0; j < n; j++){ - temp_orbitals[j] += occupieds[j]*potential; //add in coulomb term + temp_orbitals.push_back(occupieds[j]*potential); //add in coulomb term + } + + if(world.rank() == 0) print(" Subtracting K*psi"); + //Move Kpsis to new orbitals, as they are part of the fock operator + for(unsigned int j = 0; j < n; j++){ + temp_orbitals[j] -= Kpsis[j]; //yes this needs to be subtraction. exchange function doesn't include the negative. } //add in T_psi @@ -689,6 +708,7 @@ void DF::diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op //debugging: print matrix of eigenvectors //if(world.rank()==0) print("U:\n", U); + //if(world.rank()==0) print("evals:\n", evals); //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. if(world.rank()==0) print(" Removing Rotations"); @@ -864,6 +884,7 @@ std::vector orthogonalize(World& world, std::vector orbitals){ //faster orthogonalize that modifies the input functions in place //Make this a member function of DF +//TODO: The function below mimics one from SCF.cc. In the future we will probably want a different variant (which also should exist in SCF.cc or somwhere like that) that treats core and valence orbitals differently: i.e. doesn't mix valence orbitals into the core orbitals void DF::orthogonalize_inplace(World& world){ unsigned int n = occupieds.size(); @@ -1077,12 +1098,16 @@ Tensor DF::diagonalize_virtuals(World& world, real_function_3d& JandV,re } -//Apply's Green's function to a single Fcwf, return new Fcwf +//Apply's Green's function to Vpsi (a Fcwf). Overwrites Vpsi with new Fcwf //double iterate(World& world, complex_function_3d& V, Fcwf& psi, double& eps){ -Fcwf apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thresh){ +void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thresh){ + //necessary constants double myc = 137.0359895; //speed of light + double c2 = myc*myc; + std::complex myi(0,1); //imaginary number + std::complex ic = myi*myc; //calculate exponent for equivalent BSH operator double mu = std::sqrt((myc*myc*myc*myc-eps*eps)/myc/myc); @@ -1090,28 +1115,85 @@ Fcwf apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr //if(world.rank() == 0) print("Hi, this is apply_BSH! mu is: ", mu); //create gradient BSH operators - //TODO: make my own GradBSH that first computes BSH with a ridiculous lo, and then accumulated to CDelta + //TODO: make my own GradBSH that first computes BSH with a ridiculous lo, and then accumulates to CDelta, then need something intelligent for the derivative of that result + world.gop.fence(); + //double ttt = wall_time(); + //create BSH operator + std::shared_ptr op = std::shared_ptr(BSHOperatorPtr3D(world, mu,small,thresh)); // Finer length scale and accuracy control std::vector>> op3 = GradBSHOperator(world, mu, small, thresh); + std::vector>> allops(16); + for(unsigned int i = 0; i < 4; i++){ + allops[i] = op; + allops[4+i] = op3[0]; + allops[8+i] = op3[1]; + allops[12+i] = op3[2]; + } + - //create BSH operator - real_convolution_3d op = BSHOperator3D(world, mu,small,thresh); // Finer length scale and accuracy control - //create Fcwfs for intermediate functions necessary to compute new components - Fcwf oppsi(apply(op,Vpsi)); //BSH(Vpsi) - Fcwf oppsix(apply(*op3[0],Vpsi)); //GradBSH_x(Vpsi) - Fcwf oppsiy(apply(*op3[1],Vpsi)); //GradBSH_y(Vpsi) - Fcwf oppsiz(apply(*op3[2],Vpsi)); //GradBSH_z(Vpsi) - Fcwf temp(world); //will hold the new wavefunction 4-vector + //world.gop.fence(); + //ttt = wall_time() - ttt; + //if(world.rank()==0) print(" create operators:", ttt); + + + //create intermediate functions necessary to compute new components + //ttt = wall_time(); + std::vector temp(16); + for(unsigned int i = 0; i < 4; i++){ + temp[i] = Vpsi[i]; + temp[4+i] = Vpsi[i]; + temp[8+i] = Vpsi[i]; + temp[12+i] = Vpsi[i]; + } + + //Fcwf oppsi = apply(world, op, Vpsi); //BSH(Vpsi) + //Fcwf oppsix = apply(world, *op3[0], Vpsi); //GradBSH_x(Vpsi) + //Fcwf oppsiy = apply(world, *op3[1], Vpsi); //GradBSH_y(Vpsi) + //Fcwf oppsiz = apply(world, *op3[2], Vpsi); //GradBSH_z(Vpsi) + temp = apply(world, allops, temp); + //world.gop.fence(); + //ttt = wall_time() - ttt; + //if(world.rank()==0) print(" create derivatives:", ttt); //manually compute new components of wavefunction. See Blackledge paper and any definition of the Dirac single-particle Hamiltonian - std::complex myi(0,1); - temp[0] = myc*myc*oppsi[0]-myi*myc*oppsiz[2]-myi*myc*(oppsix[3]-myi*oppsiy[3]); - temp[1] = myc*myc*oppsi[1]-myi*myc*(oppsix[2]+myi*oppsiy[2])+myi*myc*oppsiz[3]; - temp[2] = -myi*myc*oppsiz[0]-myi*myc*(oppsix[1]-myi*oppsiy[1])-myc*myc*oppsi[2]; - temp[3] = -myi*myc*(oppsix[0]+myi*oppsiy[0])+myi*myc*oppsiz[1]-myc*myc*oppsi[3]; - //finish up application of the dirac green's function - temp = (temp+(oppsi*eps))*(1.0/(myc*myc)); - temp.normalize(); - - return temp; + //ttt = wall_time(); + + + + //build transformation tensor + Tensor> U(16,4); + U(0,0) = c2+eps; U(14,0) = -ic; U(7,0) = -ic; U(11,0) = -myc; + U(1,1) = c2+eps; U(6,1) = -ic; U(10,1) = myc; U(15,1) = ic; + U(12,2) = -ic; U(5,2) = -ic; U(9,2) = -myc; U(2,2) = eps-c2; + U(4,3) = -ic; U(8,3) = myc; U(13,3) = ic; U(3,3) = eps-c2; + U *= (1.0/c2); + + ////build vector to be transformed + //std::vector temp(16); + //temp[0] = oppsi[0]; temp[1] = oppsi[1]; temp[2] = oppsi[2]; temp[3] = oppsi[3]; + //temp[4] = oppsix[0]; temp[5] = oppsix[1]; temp[6] = oppsix[2]; temp[7] = oppsix[3]; + //temp[8] = oppsiy[0]; temp[9] = oppsiy[1]; temp[10] = oppsiy[2]; temp[11] = oppsiy[3]; + //temp[12] = oppsiz[0]; temp[13] = oppsiz[1]; temp[14] = oppsiz[2]; temp[15] = oppsiz[3]; + + temp = transform(world, temp, U); + Vpsi[0] = temp[0]; + Vpsi[1] = temp[1]; + Vpsi[2] = temp[2]; + Vpsi[3] = temp[3]; + + //Vpsi[0] = myc*myc*oppsi[0]-myi*myc*oppsiz[2]-myi*myc*(oppsix[3]-myi*oppsiy[3]); + //Vpsi[1] = myc*myc*oppsi[1]-myi*myc*(oppsix[2]+myi*oppsiy[2])+myi*myc*oppsiz[3]; + //Vpsi[2] = -myi*myc*oppsiz[0]-myi*myc*(oppsix[1]-myi*oppsiy[1])-myc*myc*oppsi[2]; + //Vpsi[3] = -myi*myc*(oppsix[0]+myi*oppsiy[0])+myi*myc*oppsiz[1]-myc*myc*oppsi[3]; + ////finish up application of the dirac green's function + //Vpsi = (Vpsi+(oppsi*eps))*(1.0/(myc*myc)); + + + + + //Vpsi.normalize(); //Don't want to do this because it messes with the equation KAIN is trying to solve. + //world.gop.fence(); + //ttt = wall_time() - ttt; + //if(world.rank()==0) print(" apply transformation:", ttt); + } @@ -1179,8 +1261,8 @@ std::vector to_fcwfs(World & world, std::vector & orbita //Loop over input orbitals for(unsigned int i = 0; i < n; i++){ complexreader = function_real2complex(orbitals[i]); - spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); - spindown = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + spinup = Fcwf(copy(complexreader), complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + spindown = Fcwf(complex_factory_3d(world), copy(complexreader), complex_factory_3d(world), complex_factory_3d(world)); result.push_back(spinup); result.push_back(spindown); @@ -1228,14 +1310,14 @@ void DF::saveDF(World& world){ void DF::make_gaussian_potential(World& world, real_function_3d& potential){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule); - potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); } //Creates the nuclear potential from the molecule object. Also calculates the nuclear repulsion energy void DF::make_gaussian_potential(World& world, real_function_3d& potential, double& nuclear_repulsion_energy){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule); - potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); std::vector Rlist = Vfunctor.get_Rlist(); std::vector Zlist = Vfunctor.get_Zlist(); nuclear_repulsion_energy = 0.0; @@ -1257,11 +1339,12 @@ void DF::DF_load_balance(World& world, real_function_3d& Vnuc){ start_timer(world); LoadBalanceDeux<3> lb(world); lb.add_tree(Vnuc, lbcost(12.0,96.0),true); - for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - for(int kk = 0; kk < 4; kk++){ - lb.add_tree(occupieds[j][kk], lbcost,3>(24.0,192.0),true); - } - } + //Commenting out below block to test memory issues + //for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + // for(int kk = 0; kk < 4; kk++){ + // lb.add_tree(occupieds[j][kk], lbcost,3>(24.0,192.0),true); + // } + //} FunctionDefaults<3>::redistribute(world, lb.load_balance(2), false); Tensor times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -1352,13 +1435,21 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea std::vector Residuals; Fcwf temp_function(world); double residualnorm; + real_function_3d rho = real_factory_3d(world); bool iterate_again = false; //Assume iterations will stop //Diagonalize, but not on the first iteration, unless it's a restarted job - if(iteration_number != 1 or DFparams.restart) diagonalize(world, V, op, Kpsis); + if(iteration_number != 1 or DFparams.restart){ + diagonalize(world, V, op, Kpsis); + //update JandV + for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ + rho += squaremod(occupieds[kk]); + } + JandV = V + apply(op,rho); + } - //Actually let's see what happens if I always diagonalize + //Actually let's see what happens if I always diagonalize. Answer: still messes up first iteration //diagonalize(world, V, op, Kpsis); @@ -1376,7 +1467,22 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea temp_function.truncate(); //temp_function now holds (K-V-J)psi, so apply the BSH - temp_function = apply_BSH(world, temp_function, energies[j], DFparams.small, DFparams.thresh); + apply_BSH(world, temp_function, energies[j], DFparams.small, DFparams.thresh); + + //debugging: Look at size of function before and after truncating here to see what it's doing + std::size_t funcsize = temp_function[0].size(); + funcsize += temp_function[1].size(); + funcsize += temp_function[2].size(); + funcsize += temp_function[3].size(); + if(world.rank()==0) print(" size after BSH:", funcsize); + + temp_function.truncate(); //try truncating here + + funcsize = temp_function[0].size(); + funcsize += temp_function[1].size(); + funcsize += temp_function[2].size(); + funcsize += temp_function[3].size(); + if(world.rank()==0) print(" size after truncate:", funcsize); //Now calculate the residual temp_function = occupieds[j] - temp_function; @@ -1409,11 +1515,19 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) print(" ", times[0]); } + //truncate here + for(unsigned int i = 0; i < Init_params.num_occupied; i++) occupieds[i].truncate(); + //orthogonalize if(world.rank()==0) print("\n***Orthonormalizing***"); start_timer(world); //occupieds = orthogonalize(world,occupieds); orthogonalize_inplace(world); + //truncate here and normalize again + for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + occupieds[i].truncate(); + occupieds[i].normalize(); + } times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -1424,7 +1538,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Calculate new J+V term if(world.rank()==0) print("\n***Recalculating Coulomb***"); start_timer(world); - real_function_3d rho = real_factory_3d(world); + rho = real_factory_3d(world); for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ rho += squaremod(occupieds[kk]); } @@ -1757,7 +1871,7 @@ void DF::solve_virtuals1(World& world){ tempfcwf += Kpsis[i]; //if(world.rank()==0) print("Going into BSH, energy is:",v_energies[i] - csquared); - tempfcwf = apply_BSH(world,tempfcwf,v_energies[i],DFparams.small,DFparams.thresh); + apply_BSH(world,tempfcwf,v_energies[i],DFparams.small,DFparams.thresh); Residuals[i] = virtuals[i] - tempfcwf; double residualnorm = Residuals[i].norm2(); if(world.rank()==0) print("Virtual ", i, " Residual: ", residualnorm); diff --git a/src/apps/moldft/fcwf.cc b/src/apps/moldft/fcwf.cc index c433914bcdc..c9fb6adc008 100644 --- a/src/apps/moldft/fcwf.cc +++ b/src/apps/moldft/fcwf.cc @@ -3,241 +3,243 @@ using namespace madness; - Fcwf::Fcwf(){ - m_initialized = false; - } - +Fcwf::Fcwf(){ + m_initialized = false; +} - Fcwf::Fcwf(const complex_function_3d& wf1, - const complex_function_3d& wf2, - const complex_function_3d& wf3, - const complex_function_3d& wf4){ - MADNESS_ASSERT(m_psi.size() == 0); - m_psi.push_back(copy(wf1)); - m_psi.push_back(copy(wf2)); - m_psi.push_back(copy(wf3)); - m_psi.push_back(copy(wf4)); - m_initialized = true; - } - Fcwf::Fcwf(World& world){ - MADNESS_ASSERT(m_psi.size() == 0); - for(int i = 0 ; i < 4 ; i ++){ - m_psi.push_back(complex_factory_3d(world)); - } - m_initialized = true; - } +Fcwf::Fcwf(const complex_function_3d& wf1, + const complex_function_3d& wf2, + const complex_function_3d& wf3, + const complex_function_3d& wf4){ + MADNESS_ASSERT(m_psi.size() == 0); + m_psi.push_back(wf1); + m_psi.push_back(wf2); + m_psi.push_back(wf3); + m_psi.push_back(wf4); + m_initialized = true; +} - complex_function_3d& Fcwf::operator[](const int i){ - MADNESS_ASSERT(i >= 0 && i <= 3); - MADNESS_ASSERT(m_initialized); - return m_psi[i]; +Fcwf::Fcwf(World& world){ + MADNESS_ASSERT(m_psi.size() == 0); + for(int i = 0 ; i < 4 ; i ++){ + m_psi.push_back(complex_factory_3d(world)); } + m_initialized = true; +} - const complex_function_3d& Fcwf::operator[](const int i) const { - MADNESS_ASSERT(i >= 0 && i <= 3); - MADNESS_ASSERT(m_initialized); - return m_psi[i]; - } - - Fcwf::Fcwf(std::vector& phi){ - MADNESS_ASSERT(m_psi.size() == 0); - MADNESS_ASSERT(phi.size() == 4); - for(int i = 0 ; i < 4 ; i++){ - m_psi.push_back(copy(phi[i])); - } - m_initialized=true; - } +complex_function_3d& Fcwf::operator[](const int i){ + MADNESS_ASSERT(i >= 0 && i <= 3); + MADNESS_ASSERT(m_initialized); + return m_psi[i]; +} - bool Fcwf::getinitialize(){ - return m_initialized; - } +const complex_function_3d& Fcwf::operator[](const int i) const { + MADNESS_ASSERT(i >= 0 && i <= 3); + MADNESS_ASSERT(m_initialized); + return m_psi[i]; +} - bool Fcwf::getinitialize() const { - return m_initialized; +Fcwf::Fcwf(std::vector& phi){ + MADNESS_ASSERT(m_psi.size() == 0); + MADNESS_ASSERT(phi.size() == 4); + for(int i = 0 ; i < 4 ; i++){ + m_psi.push_back(phi[i]); } + m_initialized=true; +} - unsigned int Fcwf::size(){ - MADNESS_ASSERT(m_initialized); - return m_psi.size(); - } +bool Fcwf::getinitialize(){ + return m_initialized; +} - unsigned int Fcwf::size() const { - MADNESS_ASSERT(m_initialized); - return m_psi.size(); - } +bool Fcwf::getinitialize() const { + return m_initialized; +} - //copy contructor defaults to deep copy - Fcwf::Fcwf(const Fcwf& phi){ - MADNESS_ASSERT(m_psi.size() == 0); - MADNESS_ASSERT(phi.size() == 4); - for(int i = 0 ; i < 4 ; i++){ - m_psi.push_back(copy(phi[i])); - } - m_initialized = true; - } +unsigned int Fcwf::size(){ + MADNESS_ASSERT(m_initialized); + return m_psi.size(); +} - //Assignment operator defaults to deep copy - Fcwf Fcwf::operator=(const Fcwf& phi){ - MADNESS_ASSERT(phi.getinitialize()); - if (this != &phi) { - if(m_psi.size() == 4){ - for(int i = 0 ; i < 4 ; i++){ - m_psi[i] = copy(phi[i]); - } - } - else { - MADNESS_ASSERT(m_psi.size() == 0); - for(int i = 0 ; i < 4 ; i++){ - m_psi.push_back(copy(phi[i])); - } - } - } - m_initialized = true; - return *this; - } +unsigned int Fcwf::size() const { + MADNESS_ASSERT(m_initialized); + return m_psi.size(); +} - Fcwf Fcwf::operator-(const Fcwf& phi) const { - MADNESS_ASSERT(phi.getinitialize()); - std::vector temp; - if(m_initialized){ - for(int i = 0 ; i < 4 ; i++){ - temp.push_back(m_psi[i] - phi[i]); - } - } - else { - for(int i = 0 ; i < 4 ; i++){ - temp.push_back(copy(phi[i])); - temp[i].scale(-1.0); - } - } - return Fcwf(temp); +//copy contructor defaults to deep copy +//if this ever changes, you will need to change the copy() function, as it calls this +Fcwf::Fcwf(const Fcwf& phi){ + MADNESS_ASSERT(m_psi.size() == 0); + MADNESS_ASSERT(phi.size() == 4); + for(int i = 0 ; i < 4 ; i++){ + m_psi.push_back(copy(phi[i])); } + m_initialized = true; +} - Fcwf Fcwf::operator+(const Fcwf& phi){ - MADNESS_ASSERT(phi.getinitialize()); - std::vector temp; - if(m_initialized){ - for(int i = 0 ; i < 4 ; i++){ - temp.push_back(m_psi[i] + phi[i]); - } - } - else { - for(int i = 0 ; i < 4 ; i++){ - temp.push_back(copy(phi[i])); - } - } - return Fcwf(temp); - } +//Assignment operator defaults to shallow copy +Fcwf Fcwf::operator=(const Fcwf& phi){ + //MADNESS_ASSERT(phi.getinitialize()); + //if (this != &phi) { + // if(m_psi.size() == 4){ + // for(int i = 0 ; i < 4 ; i++){ + // m_psi[i] = copy(phi[i]); + // } + // } + // else { + // MADNESS_ASSERT(m_psi.size() == 0); + // for(int i = 0 ; i < 4 ; i++){ + // m_psi.push_back(copy(phi[i])); + // } + // } + //} + //m_initialized = true; + m_psi = phi.m_psi; + m_initialized = phi.m_initialized; + return *this; +} - Fcwf Fcwf::operator*(std::complex a) const { - MADNESS_ASSERT(m_initialized); - std::vector temp(4); +Fcwf Fcwf::operator-(const Fcwf& phi) const { + MADNESS_ASSERT(phi.getinitialize()); + std::vector temp; + if(m_initialized){ + //temp = madness::sub(m_psi[0].world(), m_psi, phi.m_psi); for(int i = 0 ; i < 4 ; i++){ - temp[i] = a*m_psi[i]; + temp.push_back(m_psi[i] - phi[i]); } - return Fcwf(temp); } - - void Fcwf::scale(std::complex a){ - MADNESS_ASSERT(m_initialized); + else { for(int i = 0 ; i < 4 ; i++){ - m_psi[i] = a*m_psi[i]; + temp.push_back(copy(phi[i])); + temp[i].scale(-1.0); } } - - Fcwf Fcwf::operator+=(const Fcwf& phi){ - if(m_initialized){ - for(int i = 0 ; i < 4 ; i++){ - m_psi[i] += phi[i]; - } - } - else { - MADNESS_ASSERT(m_psi.size()==0); - for(int i = 0 ; i < 4 ; i++){ - m_psi.push_back(copy(phi[i])); - } - m_initialized = true; - } - return *this; - } + return Fcwf(temp); +} - Fcwf Fcwf::operator-=(const Fcwf& phi){ - if(m_initialized){ - //print("inpl substract 1"); - for(int i = 0 ; i < 4 ; i++){ - //print("inpl subtract 2, ", i); - m_psi[i] -= phi[i]; - } +Fcwf Fcwf::operator+(const Fcwf& phi){ + MADNESS_ASSERT(phi.getinitialize()); + std::vector temp; + if(m_initialized){ + //temp = madness::add(m_psi[0].world(), m_psi, phi.m_psi); + for(int i = 0 ; i < 4 ; i++){ + temp.push_back(m_psi[i] + phi[i]); } - else { - //print("inpl subtract 3"); - MADNESS_ASSERT(m_psi.size()==0); - for(int i = 0 ; i < 4 ; i++){ - //print("inpl subtract 4, ",i); - m_psi.push_back(copy(phi[i])); - //print("inpl subtract 5, ",i); - m_psi[i].scale(-1.0); - } - //print("inpl subtract 6"); - m_initialized = true; + } + else { + for(int i = 0 ; i < 4 ; i++){ + temp.push_back(copy(phi[i])); } - //print("inpl subtract 7"); - return *this; } + return Fcwf(temp); +} +Fcwf Fcwf::operator*(std::complex a) const { + MADNESS_ASSERT(m_initialized); + std::vector temp(4); + for(int i = 0 ; i < 4 ; i++){ + temp[i] = a*m_psi[i]; + } + return Fcwf(temp); +} - double Fcwf::norm2(){ - MADNESS_ASSERT(m_initialized); - std::complex temp = madness::inner(m_psi[0].world(), m_psi, m_psi).sum(); - //std::complex temp(0,0); - //for(int i = 0 ; i < 4 ; i++){ - // temp += madness::inner(m_psi[i],m_psi[i]); - //} - return std::sqrt(std::real(temp)); +void Fcwf::scale(std::complex a){ + MADNESS_ASSERT(m_initialized); + for(int i = 0 ; i < 4 ; i++){ + //m_psi[i] = a*m_psi[i]; + m_psi[i].scale(a); } +} - void Fcwf::normalize(){ - MADNESS_ASSERT(m_initialized); - //print("normalize1"); - double norm = norm2(); - //print("normalize2", norm); - MADNESS_ASSERT(norm != 0.0); +Fcwf Fcwf::operator+=(const Fcwf& phi){ + if(m_initialized){ + //m_psi = madness::add(m_psi[0].world(), m_psi, phi.m_psi); for(int i = 0 ; i < 4 ; i++){ - //print("normalize3, ", i); - m_psi[i] = (1.0/norm)*m_psi[i]; + m_psi[i] += phi[i]; } } - - Fcwf Fcwf::operator*(madness::complex_function_3d& phi){ - MADNESS_ASSERT(m_initialized); - std::vector temp(4); + else { + MADNESS_ASSERT(m_psi.size()==0); for(int i = 0 ; i < 4 ; i++){ - temp[i] = phi*m_psi[i]; + m_psi.push_back(copy(phi[i])); } - return Fcwf(temp); + m_initialized = true; } + return *this; +} - Fcwf Fcwf::operator*(madness::real_function_3d& phi){ - MADNESS_ASSERT(m_initialized); - std::vector temp(4); +Fcwf Fcwf::operator-=(const Fcwf& phi){ + if(m_initialized){ + //m_psi = madness::sub(m_psi[0].world(), m_psi, phi.m_psi); for(int i = 0 ; i < 4 ; i++){ - temp[i] = phi*m_psi[i]; + m_psi[i] -= phi[i]; } - return Fcwf(temp); } - - void Fcwf::truncate(){ - MADNESS_ASSERT(m_initialized); + else { + MADNESS_ASSERT(m_psi.size()==0); for(int i = 0 ; i < 4 ; i++){ - m_psi[i].truncate(); + m_psi.push_back(copy(phi[i])); + m_psi[i].scale(-1.0); } + m_initialized = true; + } + return *this; +} + + +double Fcwf::norm2(){ + MADNESS_ASSERT(m_initialized); + std::complex temp = madness::inner(m_psi[0].world(), m_psi, m_psi).sum(); + //std::complex temp(0,0); + //for(int i = 0 ; i < 4 ; i++){ + // temp += madness::inner(m_psi[i],m_psi[i]); + //} + return std::sqrt(std::real(temp)); +} + +void Fcwf::normalize(){ + MADNESS_ASSERT(m_initialized); + double norm = norm2(); + MADNESS_ASSERT(norm != 0.0); + for(int i = 0 ; i < 4 ; i++){ + m_psi[i].scale(1.0/norm);// = (1.0/norm)*m_psi[i]; } +} + +Fcwf Fcwf::operator*(madness::complex_function_3d& phi){ + MADNESS_ASSERT(m_initialized); + std::vector temp(4);// = mul(m_psi[0].world(), phi, m_psi); + for(int i = 0 ; i < 4 ; i++){ + temp[i] = phi*m_psi[i]; + } + return Fcwf(temp); +} - std::complex Fcwf::inner(World& world, const Fcwf& phi) const{ - MADNESS_ASSERT(m_initialized && phi.getinitialize()); - return madness::inner(world, m_psi, phi.m_psi).sum(); +Fcwf Fcwf::operator*(madness::real_function_3d& phi){ + MADNESS_ASSERT(m_initialized); + std::vector temp(4);// = madness::mul(m_psi[0].world(), phi, m_psi); + for(int i = 0 ; i < 4 ; i++){ + temp[i] = phi*m_psi[i]; + } + return Fcwf(temp); +} + +void Fcwf::truncate(){ + MADNESS_ASSERT(m_initialized); + for(int i = 0 ; i < 4 ; i++){ + m_psi[i].truncate(); } +} + +std::complex Fcwf::inner(World& world, const Fcwf& phi) const{ + MADNESS_ASSERT(m_initialized && phi.getinitialize()); + return madness::inner(world, m_psi, phi.m_psi).sum(); +} + +void Fcwf::apply(World& world, real_convolution_3d& op){ + m_psi = madness::apply(world, op, m_psi); +} std::complex inner(const Fcwf& psi, const Fcwf& phi){ @@ -250,14 +252,20 @@ std::complex inner(const Fcwf& psi, const Fcwf& phi){ return psi.inner(psi[0].world(), phi); } -Fcwf apply(real_convolution_3d& op, const Fcwf& psi){ - std::vector temp; - for(int i = 0 ; i < 4 ; i++){ - temp.push_back(madness::apply(op, psi[i])); - } - return Fcwf(temp); +//Fcwf apply(real_convolution_3d& op, const Fcwf& psi){ +// std::vector temp; +// for(int i = 0 ; i < 4 ; i++){ +// temp.push_back(madness::apply(op, psi[i])); +// } +// return Fcwf(temp); +//} +Fcwf apply(World& world, real_convolution_3d& op, const Fcwf& psi){ + Fcwf temp = copy(psi); + temp.apply(world, op); + return temp; } + real_function_3d squaremod(Fcwf& psi){ MADNESS_ASSERT(psi.getinitialize()); real_function_3d temp = abssq(psi[0]) + abssq(psi[1]) + abssq(psi[2]) + abssq(psi[3]); @@ -443,5 +451,11 @@ void transform(World& world, std::vector& a, Tensor> } +//loop through fcwf and reconstruct each function +void Fcwf::reconstruct(){ + MADNESS_ASSERT(m_initialized); //needed? + for(unsigned int i = 0; i < 4; i++) m_psi[i].reconstruct(); +} + //kthxbye diff --git a/src/apps/moldft/fcwf.h b/src/apps/moldft/fcwf.h index 294fa209d3d..82f65e86d2e 100644 --- a/src/apps/moldft/fcwf.h +++ b/src/apps/moldft/fcwf.h @@ -66,11 +66,16 @@ class Fcwf{ std::complex inner(World& world, const Fcwf& phi) const; + void apply(World& world, real_convolution_3d& op); + + void reconstruct(); + }; std::complex inner(const Fcwf& psi, const Fcwf& phi); -Fcwf apply(real_convolution_3d& op, const Fcwf& psi); +//Fcwf apply(real_convolution_3d& op, const Fcwf& psi); +Fcwf apply(World& world, real_convolution_3d& op, const Fcwf& psi); real_function_3d squaremod(Fcwf& psi); real_function_3d squaremod_small(Fcwf& psi); diff --git a/src/apps/moldft/rk-3.cc b/src/apps/moldft/rk-3.cc index 3163c116464..c8b880d3322 100644 --- a/src/apps/moldft/rk-3.cc +++ b/src/apps/moldft/rk-3.cc @@ -41,8 +41,8 @@ static const double op_dx=1e-16; //TRY CHANGING THIS 1e-16 static const double op_quadacc=1e-8; //FIND ALL INSTANCES OF THIS AND DEAL WITH IT static const double op_thresh=1e-8; -static const long k = 12; // wavelet order -static const double thresh = 1e-10; // precision +static const long k = 10; // wavelet order +static const double thresh = 1e-8; // precision static const double L = 50.0; // box size static const bool FINITENUC = false; @@ -457,8 +457,7 @@ int main(int argc, char** argv) { //double Zlist[] = {1.0,2.0,3.0,4.0,6.0,8.0,10.0,12.0,16.0,20.0,30.0,40.0,60.0,80.0}; //double Zlist[] = {1.0,2.0,4.0,8.0,10.0,16.0,20.0,32.0,40.0,48.0,56.0,60.0,64.0,72.0,76.0,80.0}; - double Zlist[] = {80.0}; - //double Zlist[] = {40.0,48.0,56.0,60.0,64.0,72.0,76.0,80.0}; + double Zlist[] = {60.0,64.0,72.0,76.0,80.0}; //double Zlist[] = {20.0,40.0,56.0,60.0,64.0,72.0,76.0,80.0}; //double Zlist[] = {100.0}; const int NumZs = sizeof(Zlist)/sizeof(Z); @@ -511,7 +510,7 @@ int main(int argc, char** argv) { LoadBalanceDeux<3> lb(world); lb.add_tree(Vnuc, lbcost(12.0,96.0),true); lb.add_tree(psi, lbcost(12.0,96.0),true); - FunctionDefaults<3>::redistribute(world,lb.load_balance(2)); + FunctionDefaults<3>::redistribute(world,lb.load_balance(2),false); } psi.scale(1.0/psi.norm2()); From 9ceaa69f448720a388250ef3fa9ec24cae316b8c Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 1 Oct 2018 11:28:08 -0400 Subject: [PATCH 0010/1312] more vectorized exchange --- src/apps/moldft/DF.cc | 127 ++++++++++++++++++++++++++++++++---------- 1 file changed, 97 insertions(+), 30 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index e223edb9727..2242f54ee37 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -501,50 +501,117 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //start timer start_timer(world); - complex_function_3d temp(world); + //zero out Kpsis + for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + Kpsis[i] = Fcwf(world); + } //reconstruct for(unsigned int i = 0; i < Init_params.num_occupied; i++){ occupieds[i].reconstruct(); } + //form occupied orbitals into 4 vectors of components unsigned int n = Init_params.num_occupied; - for(unsigned int i = 0; i < n; i++){ - for(unsigned int j = i; j < n ; j++){ //parallelize this loop using 4-vectors approach + //std::vector occupieds0(n); + //std::vector occupieds1(n); + //std::vector occupieds2(n); + //std::vector occupieds3(n); + //for(unsigned int i = 0; i < n; i++){ + // occupieds0[i] = occupieds[i][0]; + // occupieds1[i] = occupieds[i][1]; + // occupieds2[i] = occupieds[i][2]; + // occupieds3[i] = occupieds[i][3]; + //} - /*TODO (vector inner_func) - * loop over 4 component indices - * gather the n-i+1 (here, index j) functions for the component index - * vector multiply by occupieds[i] component - * accumulate result - * truncate - */ + //Calculate and accumulate exchange contributions + for(unsigned int i = 0; i < n; i++){ + std::vector temp(n-i); + for(unsigned int j = 0; j < n-i; j++){ + temp[j] = complex_factory_3d(world); + } - //load balance like in SCF.cc KE routine + std::vector temp0(n-i); + std::vector temp1(n-i); + std::vector temp2(n-i); + std::vector temp3(n-i); + for(unsigned int j = i; j < n; j++){ + temp0[j-i] = occupieds[j][0]; + temp1[j-i] = occupieds[j][1]; + temp2[j-i] = occupieds[j][2]; + temp3[j-i] = occupieds[j][3]; + } + gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*conj(world, temp0)); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*conj(world, temp1)); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][2]*conj(world, temp2)); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][3]*conj(world, temp3)); - temp = inner_func(world,occupieds[j],occupieds[i]); - temp.truncate(); + temp = apply(world, op, temp); - temp = apply(op,temp); - if(i == 0 && j == 0){ - Kpsis[i] = occupieds[j]*temp; - } - else if(i == 0){ - Kpsis[i] += occupieds[j]*temp; - temp = temp.conj(); - Kpsis[j] = occupieds[i]*temp; - } - else if(i == j){ - Kpsis[i] += occupieds[j]*temp; - } - else{ - Kpsis[i] += occupieds[j]*temp; - temp = temp.conj(); - Kpsis[j] += occupieds[i]*temp; - } + //IDEA: Kpsis[i][k] += sum(mul(world, temp, occupieds)) + Kpsis[i][0] += sum(world, mul(world, temp, temp0)); + Kpsis[i][1] += sum(world, mul(world, temp, temp1)); + Kpsis[i][2] += sum(world, mul(world, temp, temp2)); + Kpsis[i][3] += sum(world, mul(world, temp, temp3)); + + temp = conj(world, temp); + //temp0 = mul(world, temp, temp0); + //temp1 = mul(world, temp, temp1); + //temp2 = mul(world, temp, temp2); + //temp3 = mul(world, temp, temp3); + temp0 = occupieds[i][0]*temp; + temp1 = occupieds[i][1]*temp; + temp2 = occupieds[i][2]*temp; + temp3 = occupieds[i][3]*temp; + for(unsigned int j = i+1; j < n; j++){ + Kpsis[j][0] += temp0[j-i]; + Kpsis[j][1] += temp1[j-i]; + Kpsis[j][2] += temp2[j-i]; + Kpsis[j][3] += temp3[j-i]; } + + + + + + + //for(unsigned int j = i; j < n ; j++){ //parallelize this loop using 4-vectors approach + + // /*TODO (vector inner_func) + // * loop over 4 component indices + // * gather the n-i+1 (here, index j) functions for the component index + // * vector multiply by occupieds[i] component + // * accumulate result + // * truncate + // */ + + + // //load balance like in SCF.cc KE routine + + + // temp = inner_func(world,occupieds[j],occupieds[i]); + // temp.truncate(); + + // temp = apply(op,temp); + // if(i == 0 && j == 0){ + // Kpsis[i] = occupieds[j]*temp; + // } + // else if(i == 0){ + // Kpsis[i] += occupieds[j]*temp; + // temp = temp.conj(); + // Kpsis[j] = occupieds[i]*temp; + // } + // else if(i == j){ + // Kpsis[i] += occupieds[j]*temp; + // } + // else{ + // Kpsis[i] += occupieds[j]*temp; + // temp = temp.conj(); + // Kpsis[j] += occupieds[i]*temp; + // } + //} Kpsis[i].truncate(); } From 51092582dbbdeb9062ee99d5ef5065392c8869be Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 12 Oct 2018 11:33:39 -0400 Subject: [PATCH 0011/1312] change to get intel compilers right --- cmakecmd | 1 + 1 file changed, 1 insertion(+) diff --git a/cmakecmd b/cmakecmd index b0e77f636bd..5a5b9df041f 100644 --- a/cmakecmd +++ b/cmakecmd @@ -3,5 +3,6 @@ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/generic-mkl-tbb.cmake \ -DBUILD_SHARED_LIBS=OFF \ -DLIBXC_LIBRARIES=/gpfs/projects/rjh/libxc-3.0.0/lib/libxc.a \ -DLIBXC_INCLUDE_DIRS=/gpfs/projects/rjh/libxc-3.0.0/include \ + -DCMAKE_CXX_COMPILER=mpiicpc \ .. # -DBLA_STATIC=TRUE From ec92eea74c0bcbd1b2eef2a6c89404d530f29296 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Thu, 13 Dec 2018 13:11:07 -0500 Subject: [PATCH 0012/1312] commiting before working on new gradBSH --- src/apps/moldft/DF.cc | 116 ++++++++++++++++++++++++++------- src/apps/moldft/DFParameters.h | 13 +++- src/apps/moldft/fcwf.cc | 1 - 3 files changed, 106 insertions(+), 24 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 2242f54ee37..e4c7f85de87 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -344,9 +344,32 @@ DF::DF(World & world,std::shared_ptr input) { // Set some function defaults //FunctionDefaults<3>::set_cubic_cell(-Init_params.L, Init_params.L); //FunctionDefaults<3>::set_k(Init_params.order); - FunctionDefaults<3>::set_thresh(DFparams.thresh); + FunctionDefaults<3>::set_thresh(DFparams.thresh); //Always use user-specified thresh FunctionDefaults<3>::set_truncate_mode(1); + //If user requests different k, then project functions + if(DFparams.k != Init_params.order){ + FunctionDefaults<3>::set_k(DFparams.k); + for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + for(unsigned int j = 0; j < 4; j++){ + //if(world.rank()==0) print(i,j); + Init_params.orbitals[i][j] = project(Init_params.orbitals[i][j], FunctionDefaults<3>::get_k(), DFparams.thresh, false); + } + world.gop.fence(); + Init_params.orbitals[i].truncate(); + } + if(DFparams.job == 1){ + for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ + for(unsigned int j = 0; j < 4; j++){ + //if(world.rank()==0) print(i,j); + Init_params.virtuals[i][j] = project(Init_params.virtuals[i][j], FunctionDefaults<3>::get_k(), DFparams.thresh, false); + } + world.gop.fence(); + Init_params.virtuals[i].truncate(); + } + } + } + energies = Init_params.energies; v_energies = Init_params.v_energies; occupieds = Init_params.orbitals; @@ -550,17 +573,13 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi temp = apply(world, op, temp); - //IDEA: Kpsis[i][k] += sum(mul(world, temp, occupieds)) Kpsis[i][0] += sum(world, mul(world, temp, temp0)); Kpsis[i][1] += sum(world, mul(world, temp, temp1)); Kpsis[i][2] += sum(world, mul(world, temp, temp2)); Kpsis[i][3] += sum(world, mul(world, temp, temp3)); temp = conj(world, temp); - //temp0 = mul(world, temp, temp0); - //temp1 = mul(world, temp, temp1); - //temp2 = mul(world, temp, temp2); - //temp3 = mul(world, temp, temp3); + temp0 = occupieds[i][0]*temp; temp1 = occupieds[i][1]*temp; temp2 = occupieds[i][2]*temp; @@ -641,7 +660,7 @@ Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ return result; } -//Diagonalize psiss in the Fock space. psis is modified in place. requires Kpsis to be precomputed +//Diagonalize psis in the Fock space. psis is modified in place. requires Kpsis to be precomputed //Kpsis are transformed in place. void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& op, std::vector& Kpsis){ @@ -758,10 +777,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - ////debugging: print fock and overlap matrices + //debugging: print fock and overlap matrices //if(world.rank()==0){ - //print("fock:\n", fock); - //print("\noverlap:\n", overlap); + // print("fock:\n", fock); + // print("\noverlap:\n", overlap); //} @@ -774,8 +793,13 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print matrix of eigenvectors - //if(world.rank()==0) print("U:\n", U); - //if(world.rank()==0) print("evals:\n", evals); + if(world.rank()==0) print("U:\n", U); + //if(world.rank()==0) { + // print("evals:"); + // for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + // print(evals[j] - 137.0359895*137.0359895); + // } + //} //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. if(world.rank()==0) print(" Removing Rotations"); @@ -850,7 +874,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o } - //if(world.rank()==0) print("U:\n", U); + if(world.rank()==0) print("U:\n", U); fock = inner(conj_transpose(U), inner(fock, U)); @@ -927,6 +951,9 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o times = end_timer(world); if(world.rank()==0) print(" ", times[0]); + //Debugging? Let's try setting energies to evals like we're supposed to. + //energies = evals; + } //returns a vector of orthonormal Fcwfs constructed from the input vector of Fcwfs @@ -966,7 +993,7 @@ void DF::orthogonalize_inplace(World& world){ occupieds[i].normalize(); } - //Basically stolen from SCF.cc + //Basically stolen from SCF.cc. Orthogonalization based on Taylor expansion of (overlap)^(1/2) do{ Tensor> Q = Q2(matrix_inner(world,occupieds,occupieds)); maxq = 0.0; @@ -1515,9 +1542,14 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea } JandV = V + apply(op,rho); } - + //Actually let's see what happens if I always diagonalize. Answer: still messes up first iteration + //Returning to this idea since it turns out I wasn't updating JandV... //diagonalize(world, V, op, Kpsis); + //for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ + // rho += squaremod(occupieds[kk]); + //} + //JandV = V + apply(op,rho); @@ -1526,6 +1558,17 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea start_timer(world); for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + //Debugging + std::vector temporbitalnorms(4); + if(world.rank()==0) print("\nbefore:"); + for(unsigned int l = 0; l < 4; l++) temporbitalnorms[l] = occupieds[j][l].norm2(); + if(world.rank()==0) { + print(" ", temporbitalnorms[0]); + print(" ", temporbitalnorms[1]); + print(" ", temporbitalnorms[2]); + print(" ", temporbitalnorms[3]); + } + //construct the function to which we will apply the BSH occupieds[j].truncate(); temp_function = occupieds[j]*JandV; @@ -1535,6 +1578,17 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //temp_function now holds (K-V-J)psi, so apply the BSH apply_BSH(world, temp_function, energies[j], DFparams.small, DFparams.thresh); + + + if(world.rank()==0) print("after:"); + for(unsigned int l = 0; l < 4; l++) temporbitalnorms[l] = temp_function[l].norm2(); + if(world.rank()==0) { + print(" ", temporbitalnorms[0]); + print(" ", temporbitalnorms[1]); + print(" ", temporbitalnorms[2]); + print(" ", temporbitalnorms[3]); + print("\n"); + } //debugging: Look at size of function before and after truncating here to see what it's doing std::size_t funcsize = temp_function[0].size(); @@ -1552,8 +1606,8 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) print(" size after truncate:", funcsize); //Now calculate the residual - temp_function = occupieds[j] - temp_function; - residualnorm = temp_function.norm2(); + //temp_function = occupieds[j] - temp_function; + residualnorm = (occupieds[j] - temp_function).norm2(); //Print residual norm to keep track if(world.rank()==0) printf(" Orbital: %3i, Resid: %.10e\n",j+1, residualnorm); @@ -1562,11 +1616,11 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(residualnorm > tolerance) iterate_again = true; //Store residual function if we're using KAIN. Not necessary if we're not using kain - if(DFparams.kain){ - Residuals.push_back(temp_function); + if(iteration_number != 1 and DFparams.kain){ + Residuals.push_back(occupieds[j] - temp_function); } else{ - occupieds[j] = occupieds[j] - temp_function; + occupieds[j] = temp_function; } } if(world.rank()==0) printf(" tolerance: %.10e\n",tolerance); @@ -1574,10 +1628,26 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) print(" ", times[0]); //Apply the kain solver, if called for - if(DFparams.kain){ + if(iteration_number != 1 and DFparams.kain){ if(world.rank()==0) print("\n***Applying KAIN Solver***"); start_timer(world); - occupieds = kainsolver.update(occupieds, Residuals); + + //occupieds = kainsolver.update(occupieds, Residuals); + + //Replace above line with kain + step restriction + Residuals = kainsolver.update(occupieds, Residuals); //Using Residuals for new orbitals to save storage + for(unsigned int i=0; i < Init_params.num_occupied; i++){ + residualnorm = (occupieds[i]-Residuals[i]).norm2(); + if(residualnorm > DFparams.maxrotn){ + double s = DFparams.maxrotn / residualnorm; + if(world.rank()==0) print(" restricting step for orbital: ", i+1); + occupieds[i] = Residuals[i]*s + occupieds[i]*(1.0-s); + } + else{ + occupieds[i] = Residuals[i]; + } + } + times = end_timer(world); if(world.rank()==0) print(" ", times[0]); } @@ -1792,6 +1862,7 @@ void DF::solve_occupied(World & world) //Now time to start iterating bool keep_going = true; int iteration_number = 1; + //while(iteration_number < DFparams.max_iter){ while(keep_going and iteration_number < DFparams.max_iter){ keep_going = iterate(world, Vnuc, op, JandV, Kpsis, kainsolver, tol, iteration_number, nuclear_repulsion_energy); @@ -1804,6 +1875,7 @@ void DF::solve_occupied(World & world) } + } void DF::solve(World& world){ diff --git a/src/apps/moldft/DFParameters.h b/src/apps/moldft/DFParameters.h index 8b831e6d3da..787246df06e 100644 --- a/src/apps/moldft/DFParameters.h +++ b/src/apps/moldft/DFParameters.h @@ -40,8 +40,10 @@ namespace madness { //double econv; ///< Convergence criterion for the orbital energies double small; ///< Minimum length scale to be resolved double thresh; ///< Accuracy criterion when truncating + int k; ///< Number of legendre polynomials in scaling basis bool kain; ///< Turns on KAIN nonlinear solver int maxsub; ///< Sets maximum subspace size for KAIN + double maxrotn; ///< maximum step allowed by kain bool restart; ///< Indicates this is a restarted DF job int nucleus; ///< Indicates which nucleus model to use (1 for fermi, anything else for Gaussian) bool do_save; ///< Whether or not to save after each iteration. Defaults to true. Turn off with 'no_save' @@ -61,7 +63,7 @@ namespace madness { template void serialize(Archive& ar){ - ar & archive & job & print_level & max_iter & small & thresh & kain & maxsub & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot; + ar & archive & job & print_level & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot; } // Default constructor @@ -71,9 +73,11 @@ namespace madness { , plot(false) , max_iter(20) , small(1e-5) + , k(8) , thresh(1e-6) , kain(false) , maxsub(10) + , maxrotn(0.25) , restart(false) , nucleus(0) , do_save(true) @@ -137,12 +141,18 @@ namespace madness { else if (s == "thresh"){ f >> thresh; } + else if (s == "k"){ + f >> k; + } else if (s == "kain"){ kain = true; } else if (s == "maxsub"){ f >> maxsub; } + else if (s == "maxrotn"){ + f >> maxrotn; + } else if (s == "restart"){ restart = true; } @@ -178,6 +188,7 @@ namespace madness { madness::print(" Initial Guess File:", archive); madness::print(" Job:", job); madness::print(" Refinement Threshold:", thresh); + madness::print(" k:", k); madness::print("Smallest Resolved Length Scale:", small); madness::print(" Max Iterations:", max_iter); madness::print(" Use KAIN Solver:", kain); diff --git a/src/apps/moldft/fcwf.cc b/src/apps/moldft/fcwf.cc index c9fb6adc008..7c171a001f9 100644 --- a/src/apps/moldft/fcwf.cc +++ b/src/apps/moldft/fcwf.cc @@ -331,7 +331,6 @@ std::vector operator*(std::complex a, const std::vector& psi } void operator+=(std::vector& phi, const std::vector& psi){ - std::vector result; if(phi.size()==0){ phi = psi; } From dd89ed2c91996ce94c0cfec6e37c0dd5a4f6c641 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Thu, 3 Jan 2019 11:30:57 -0500 Subject: [PATCH 0013/1312] new cmakecmd for intel 19 --- cmakecmd | 1 + 1 file changed, 1 insertion(+) diff --git a/cmakecmd b/cmakecmd index 5a5b9df041f..4f85263df41 100644 --- a/cmakecmd +++ b/cmakecmd @@ -4,5 +4,6 @@ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/generic-mkl-tbb.cmake \ -DLIBXC_LIBRARIES=/gpfs/projects/rjh/libxc-3.0.0/lib/libxc.a \ -DLIBXC_INCLUDE_DIRS=/gpfs/projects/rjh/libxc-3.0.0/include \ -DCMAKE_CXX_COMPILER=mpiicpc \ + -DCMAKE_CXX_COMPILER=mpiicc \ .. # -DBLA_STATIC=TRUE From 4eedfd4e1cc42a2b4b0c9dc7952b1acd02118c5c Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 18 Feb 2019 13:01:39 -0500 Subject: [PATCH 0014/1312] bug fix --- cmakecmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmakecmd b/cmakecmd index 4f85263df41..52f56481401 100644 --- a/cmakecmd +++ b/cmakecmd @@ -4,6 +4,6 @@ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/generic-mkl-tbb.cmake \ -DLIBXC_LIBRARIES=/gpfs/projects/rjh/libxc-3.0.0/lib/libxc.a \ -DLIBXC_INCLUDE_DIRS=/gpfs/projects/rjh/libxc-3.0.0/include \ -DCMAKE_CXX_COMPILER=mpiicpc \ - -DCMAKE_CXX_COMPILER=mpiicc \ + -DCMAKE_C_COMPILER=mpiicc \ .. # -DBLA_STATIC=TRUE From 8e6c48927bb6482af46d0a883bacfbf0f6bc9ad8 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 18 Feb 2019 13:09:56 -0500 Subject: [PATCH 0015/1312] change for more consistency in relativistic BSH --- src/madness/mra/gfit.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/mra/gfit.h b/src/madness/mra/gfit.h index d785adbab48..8b0d0562453 100644 --- a/src/madness/mra/gfit.h +++ b/src/madness/mra/gfit.h @@ -285,7 +285,7 @@ class GFit { // in the moment list // // cj = - const long nmom = 1; + const long nmom = 0; if (nmom > 0) { Tensor q(4), qg(4); double range = sqrt(-log(1e-6)/expnt[nmom-1]); From a68788d5146e0673f103a7d7793ac5022d936b0d Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 18 Feb 2019 13:13:36 -0500 Subject: [PATCH 0016/1312] changes to ensure intel mkl is used for this fork --- src/madness/tensor/mxm.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/madness/tensor/mxm.h b/src/madness/tensor/mxm.h index e2b5362eae6..88f9ede1e90 100644 --- a/src/madness/tensor/mxm.h +++ b/src/madness/tensor/mxm.h @@ -61,6 +61,7 @@ namespace madness { static inline void mxm_reference(long dimi, long dimj, long dimk, T* MADNESS_RESTRICT c, const Q* MADNESS_RESTRICT a, const S* MADNESS_RESTRICT b) { + throw; /* c(i,j) = c(i,j) + sum(k) a(i,k)*b(k,j) @@ -84,6 +85,7 @@ namespace madness { void mTxm_reference(long dimi, long dimj, long dimk, T* MADNESS_RESTRICT c, const Q* MADNESS_RESTRICT a, const S* MADNESS_RESTRICT b) { + throw; /* c(i,j) = c(i,j) + sum(k) a(k,i)*b(k,j) @@ -107,6 +109,7 @@ namespace madness { static inline void mxmT_reference (long dimi, long dimj, long dimk, T* MADNESS_RESTRICT c, const Q* MADNESS_RESTRICT a, const S* MADNESS_RESTRICT b) { + throw; /* c(i,j) = c(i,j) + sum(k) a(i,k)*b(j,k) @@ -132,6 +135,7 @@ namespace madness { static inline void mTxmT_reference(long dimi, long dimj, long dimk, T* MADNESS_RESTRICT c, const Q* MADNESS_RESTRICT a, const S* MADNESS_RESTRICT b) { + throw; /* c(i,j) = c(i,j) + sum(k) a(k,i)*b(j,k) @@ -163,6 +167,7 @@ namespace madness { template void mTxmq_reference(long dimi, long dimj, long dimk, cT* MADNESS_RESTRICT c, const aT* a, const bT* b, long ldb=-1) { + throw; if (ldb == -1) ldb=dimj; MADNESS_ASSERT(ldb>=dimj); //std::cout << "IN GENERIC mTxmq " << tensor_type_names[TensorTypeData::id] << " " << tensor_type_names[TensorTypeData::id] << " " << tensor_type_names[TensorTypeData::id] << "\n"; @@ -262,7 +267,7 @@ namespace madness { } #else - + #error 'mxm Intel MKL else error' // Fall back to reference implementations template From 30fc919a1c9d0a0a8cdf037f72534c60ae96cd63 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 18 Feb 2019 13:15:50 -0500 Subject: [PATCH 0017/1312] new BSH application and starting guess --- src/apps/moldft/DF.cc | 351 ++++++++++++++++++++++++++----- src/apps/moldft/DF.h | 2 + src/apps/moldft/DFParameters.h | 7 +- src/apps/moldft/InitParameters.h | 23 +- 4 files changed, 323 insertions(+), 60 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index e4c7f85de87..c4f6fc2d531 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -110,15 +110,56 @@ GradBSHOperator_Joel(World& world, const bool isperiodicsum = (bc(0,0)==BC_PERIODIC); if (isperiodicsum) hi *= 100; // Extend range for periodic summation - GFit fit=GFit::BSHFit(mu,1e-16,hi,eps,false); + GFit fit=GFit::BSHFit(mu,lo,hi,eps,false); Tensor coeff=fit.coeffs(); Tensor expnt=fit.exponents(); + // Stuff that Joel added + // Go through coeff and expnt and lump together terms with higher exponents than we want to use + // -------------------------------------------------------------------------------------------- + + // First, select how large of an exponent we're going to keep + double max_expnt = 10000.0; //Just taking a stab at this for now + + // Then need to truncate coeff and expnt into new Tensors + //if(world.rank()==0) print("Initial expnts are: \n",expnt, "\n"); + //if(world.rank()==0) print("Initial coeffs are: \n",coeff, "\n"); + int rank = coeff.dim(0); + double Cdelta = 0.0; + double max_kept; + int max_j; + for(int j = 0; j < rank; j++){ + if(expnt[j] > max_expnt){ + Cdelta += coeff[j]*std::pow(constants::pi/expnt[j],1.5); + } + else{ + max_kept = expnt[j]; + max_j = j; + break; + } + } + //if(world.rank()==0) print("limit exponent is: ", max_expnt, " and max kept is: ", max_kept); + coeff = coeff(Slice(max_j,-1)); + expnt = expnt(Slice(max_j,-1)); + //if(world.rank()==0) print("new expnts are: \n", expnt, "\n"); + //if(world.rank()==0) print("new coeffs are: \n", coeff, "\n"); + + // Then calculate what the new coefficient needs to be out front + coeff[0] = coeff[0] + Cdelta * std::pow(expnt[0]/constants::pi,1.5); + + //reset rank because we use it below + rank = coeff.dim(0); + //---------------------------------------------------------------------------------------------- + + + + if(world.rank()==0) print("rank: ", rank, "\nexponents:\n", expnt, "\ncoefficients:\n", coeff); + + if (bc(0,0) == BC_PERIODIC) { fit.truncate_periodic_expansion(coeff, expnt, width.max(), true); } - int rank = coeff.dim(0); std::vector gradG(3); @@ -262,6 +303,10 @@ class FermiNucDistFunctor : public FunctionFunctorInterface { } }; +//generic f(r)=||r|| function for calculation of the radial expectation value +double myr(const coord_3d& r){ + return std::sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]); +} //Creates the fermi nuclear potential. Also calculates the nuclear repulsion energy void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_function_3d& potential, double& nuclear_repulsion_energy){ @@ -480,7 +525,7 @@ Fcwf apply_T(World& world, const Fcwf& psi){ complex_derivative_3d Dy(world,1); complex_derivative_3d Dz(world,2); Fcwf Tpsi(world); - + Tpsi[0] = Dz(psi[2]) + Dx(psi[3]) - myi*Dy(psi[3]) + myc*myi*psi[0]; Tpsi[1] = Dx(psi[2]) + myi*Dy(psi[2]) - Dz(psi[3]) + myc*myi*psi[1]; Tpsi[2] = Dz(psi[0]) + Dx(psi[1]) - myi*Dy(psi[1]) - myc*myi*psi[2]; @@ -687,6 +732,38 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o for(unsigned int j = 0; j < n; j++){ rho += squaremod(occupieds[j]); } + + //---------------------------------------------------------------------------------------------------------- + //DEBUGGING: Print each matrix that goes into the Fock matrix + + //real_function_3d fred = apply(op,rho); + //for(unsigned int j = 0; j < n; j++){ + // temp_orbitals.push_back(occupieds[j]*fred); //add in coulomb term + //} + //fock = matrix_inner(world, occupieds, temp_orbitals); + //if(world.rank()==0) print("J:\n",fock); + + //for(unsigned int j = 0; j < n; j++){ + // temp_orbitals[j] = occupieds[j]*myV; + //} + //fock = matrix_inner(world, occupieds, temp_orbitals); + //if(world.rank()==0) print("V:\n",fock); + + // + //for(unsigned int j = 0; j < n; j++){ + // temp_orbitals[j] = Kpsis[j]*(-1.0); + //} + //fock = matrix_inner(world, occupieds, temp_orbitals); + //if(world.rank()==0) print("-K:\n",fock); + + //for(unsigned int j = 0; j < n; j++){ + // temp_orbitals[j] = apply_T(world, occupieds[j]); + //} + //fock = matrix_inner(world, occupieds, temp_orbitals); + //if(world.rank()==0) print("T:\n",fock); + //END DEBUGGING + //---------------------------------------------------------------------------------------------------------- + //TODO: Here try moving the apply out to operate on the sum of the nuclear and electronic charge distributions real_function_3d potential = myV + apply(op,rho); potential.truncate(); @@ -694,6 +771,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //add in coulomb parts to neworbitals for(unsigned int j = 0; j < n; j++){ temp_orbitals.push_back(occupieds[j]*potential); //add in coulomb term + //temp_orbitals[j] = occupieds[j]*potential; } if(world.rank() == 0) print(" Subtracting K*psi"); @@ -793,7 +871,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print matrix of eigenvectors - if(world.rank()==0) print("U:\n", U); + //if(world.rank()==0) print("U:\n", U); //if(world.rank()==0) { // print("evals:"); // for(unsigned int j = 0; j < Init_params.num_occupied; j++){ @@ -873,8 +951,8 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o ilo = ihi + 1; } - - if(world.rank()==0) print("U:\n", U); + //Debugging: Print transformation matrix after rotation removal + //if(world.rank()==0) print("U:\n", U); fock = inner(conj_transpose(U), inner(fock, U)); @@ -913,6 +991,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o // Kpsis[i][2] = temp_orbitals_3[i]; // Kpsis[i][3] = temp_orbitals_4[i]; //} + transform(world, Kpsis, U); ////Apply the transformation to the orbitals @@ -943,6 +1022,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o // occupieds[i][2] = temp_orbitals_3[i]; // occupieds[i][3] = temp_orbitals_4[i]; //} + transform(world, occupieds, U); @@ -1213,8 +1293,10 @@ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr world.gop.fence(); //double ttt = wall_time(); //create BSH operator + if(world.rank()==0) print("mu: ", mu); std::shared_ptr op = std::shared_ptr(BSHOperatorPtr3D(world, mu,small,thresh)); // Finer length scale and accuracy control std::vector>> op3 = GradBSHOperator(world, mu, small, thresh); + //std::vector>> op3 = GradBSHOperator_Joel(world, mu, 1e-8, thresh); std::vector>> allops(16); for(unsigned int i = 0; i < 4; i++){ allops[i] = op; @@ -1290,6 +1372,112 @@ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr } +//Apply's Green's function to Vpsi (a Fcwf). Overwrites Vpsi with new Fcwf +//double iterate(World& world, complex_function_3d& V, Fcwf& psi, double& eps){ +void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& thresh){ + + + //necessary constants + double myc = 137.0359895; //speed of light + double c2 = myc*myc; + std::complex myi(0,1); //imaginary number + std::complex ic = myi*myc; + + //calculate exponent for equivalent BSH operator + double mu = std::sqrt((myc*myc*myc*myc-eps*eps)/myc/myc); + + //if(world.rank() == 0) print("Hi, this is apply_BSH! mu is: ", mu); + + //create gradient BSH operators + //TODO: make my own GradBSH that first computes BSH with a ridiculous lo, and then accumulates to CDelta, then need something intelligent for the derivative of that result + world.gop.fence(); + //double ttt = wall_time(); + //create BSH operator + //if(world.rank()==0) print("mu: ", mu); + + real_convolution_3d op = BSHOperator3D(world, mu,small,thresh); // Finer length scale and accuracy control + + Vpsi = apply(world, op, Vpsi); + Vpsi = (apply_T(world, Vpsi) + Vpsi * eps) * (1.0/c2); + + //Vpsi = apply(world, op, apply_T(world, Vpsi) + Vpsi * eps) * (1.0/c2); + + //std::vector>> op3 = GradBSHOperator(world, mu, 1e-8, thresh); + //std::vector>> op3 = GradBSHOperator_Joel(world, mu, 1e-8, thresh); + //std::vector>> allops(16); + //for(unsigned int i = 0; i < 4; i++){ + // allops[i] = op; + // allops[4+i] = op3[0]; + // allops[8+i] = op3[1]; + // allops[12+i] = op3[2]; + //} + + + //world.gop.fence(); + //ttt = wall_time() - ttt; + //if(world.rank()==0) print(" create operators:", ttt); + + + //create intermediate functions necessary to compute new components + //ttt = wall_time(); + //std::vector temp(16); + //for(unsigned int i = 0; i < 4; i++){ + // temp[i] = Vpsi[i]; + // temp[4+i] = Vpsi[i]; + // temp[8+i] = Vpsi[i]; + // temp[12+i] = Vpsi[i]; + //} + + //Fcwf oppsi = apply(world, op, Vpsi); //BSH(Vpsi) + //Fcwf oppsix = apply(world, *op3[0], Vpsi); //GradBSH_x(Vpsi) + //Fcwf oppsiy = apply(world, *op3[1], Vpsi); //GradBSH_y(Vpsi) + //Fcwf oppsiz = apply(world, *op3[2], Vpsi); //GradBSH_z(Vpsi) + //temp = apply(world, allops, temp); + //world.gop.fence(); + //ttt = wall_time() - ttt; + //if(world.rank()==0) print(" create derivatives:", ttt); + //manually compute new components of wavefunction. See Blackledge paper and any definition of the Dirac single-particle Hamiltonian + //ttt = wall_time(); + + + + //build transformation tensor + //Tensor> U(16,4); + //U(0,0) = c2+eps; U(14,0) = -ic; U(7,0) = -ic; U(11,0) = -myc; + //U(1,1) = c2+eps; U(6,1) = -ic; U(10,1) = myc; U(15,1) = ic; + //U(12,2) = -ic; U(5,2) = -ic; U(9,2) = -myc; U(2,2) = eps-c2; + //U(4,3) = -ic; U(8,3) = myc; U(13,3) = ic; U(3,3) = eps-c2; + //U *= (1.0/c2); + + ////build vector to be transformed + //std::vector temp(16); + //temp[0] = oppsi[0]; temp[1] = oppsi[1]; temp[2] = oppsi[2]; temp[3] = oppsi[3]; + //temp[4] = oppsix[0]; temp[5] = oppsix[1]; temp[6] = oppsix[2]; temp[7] = oppsix[3]; + //temp[8] = oppsiy[0]; temp[9] = oppsiy[1]; temp[10] = oppsiy[2]; temp[11] = oppsiy[3]; + //temp[12] = oppsiz[0]; temp[13] = oppsiz[1]; temp[14] = oppsiz[2]; temp[15] = oppsiz[3]; + + //temp = transform(world, temp, U); + //Vpsi[0] = temp[0]; + //Vpsi[1] = temp[1]; + //Vpsi[2] = temp[2]; + //Vpsi[3] = temp[3]; + + //Vpsi[0] = myc*myc*oppsi[0]-myi*myc*oppsiz[2]-myi*myc*(oppsix[3]-myi*oppsiy[3]); + //Vpsi[1] = myc*myc*oppsi[1]-myi*myc*(oppsix[2]+myi*oppsiy[2])+myi*myc*oppsiz[3]; + //Vpsi[2] = -myi*myc*oppsiz[0]-myi*myc*(oppsix[1]-myi*oppsiy[1])-myc*myc*oppsi[2]; + //Vpsi[3] = -myi*myc*(oppsix[0]+myi*oppsiy[0])+myi*myc*oppsiz[1]-myc*myc*oppsi[3]; + ////finish up application of the dirac green's function + //Vpsi = (Vpsi+(oppsi*eps))*(1.0/(myc*myc)); + + + + + //Vpsi.normalize(); //Don't want to do this because it messes with the equation KAIN is trying to solve. + //world.gop.fence(); + //ttt = wall_time() - ttt; + //if(world.rank()==0) print(" apply transformation:", ttt); + +} // Prints norms of the given vector of functions void DF::print_norms(World & world, @@ -1484,6 +1672,44 @@ void DF::make_component_lineplots(World& world, const char* filename1, const cha } +void DF::make_component_logplots(World& world, const char* filename1, const char* filename2, int npt, int startpnt, int endpnt){ + std::vector large_densities; + std::vector small_densities; + for(unsigned int i=0; i < Init_params.num_occupied; i++){ + large_densities.push_back(squaremod_large(occupieds[i])); + small_densities.push_back(squaremod_small(occupieds[i])); + } + + //double h = Init_params.L*(1.0/(npt-1)); + double h = (endpnt-startpnt)*(1.0/(npt-1)); + for(unsigned int i=0; i < Init_params.num_occupied; i++){ + large_densities[i].reconstruct(); + small_densities[i].reconstruct(); + } + if(world.rank()==0){ + FILE* file1 = fopen(filename1,"w"); + FILE* file2 = fopen(filename2,"w"); + if(!file1) MADNESS_EXCEPTION("DF density lineplots: failed to open the plot file",0); + if(!file2) MADNESS_EXCEPTION("DF density lineplots: failed to open the plot file",0); + for(unsigned int i=0; i temporbitalnorms(4); - if(world.rank()==0) print("\nbefore:"); - for(unsigned int l = 0; l < 4; l++) temporbitalnorms[l] = occupieds[j][l].norm2(); - if(world.rank()==0) { - print(" ", temporbitalnorms[0]); - print(" ", temporbitalnorms[1]); - print(" ", temporbitalnorms[2]); - print(" ", temporbitalnorms[3]); - } + //std::vector temporbitalnorms(4); + //if(world.rank()==0) print("\nbefore:"); + //for(unsigned int l = 0; l < 4; l++) temporbitalnorms[l] = occupieds[j][l].norm2(); + //if(world.rank()==0) { + // print(" ", temporbitalnorms[0]); + // print(" ", temporbitalnorms[1]); + // print(" ", temporbitalnorms[2]); + // print(" ", temporbitalnorms[3]); + //} //construct the function to which we will apply the BSH occupieds[j].truncate(); @@ -1577,33 +1803,34 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea temp_function.truncate(); //temp_function now holds (K-V-J)psi, so apply the BSH - apply_BSH(world, temp_function, energies[j], DFparams.small, DFparams.thresh); + //apply_BSH(world, temp_function, energies[j], DFparams.small, DFparams.thresh); + apply_BSH_new(world, temp_function, energies[j], DFparams.small, DFparams.thresh); - if(world.rank()==0) print("after:"); - for(unsigned int l = 0; l < 4; l++) temporbitalnorms[l] = temp_function[l].norm2(); - if(world.rank()==0) { - print(" ", temporbitalnorms[0]); - print(" ", temporbitalnorms[1]); - print(" ", temporbitalnorms[2]); - print(" ", temporbitalnorms[3]); - print("\n"); - } + //if(world.rank()==0) print("after:"); + //for(unsigned int l = 0; l < 4; l++) temporbitalnorms[l] = temp_function[l].norm2(); + //if(world.rank()==0) { + // print(" ", temporbitalnorms[0]); + // print(" ", temporbitalnorms[1]); + // print(" ", temporbitalnorms[2]); + // print(" ", temporbitalnorms[3]); + // print("\n"); + //} //debugging: Look at size of function before and after truncating here to see what it's doing - std::size_t funcsize = temp_function[0].size(); - funcsize += temp_function[1].size(); - funcsize += temp_function[2].size(); - funcsize += temp_function[3].size(); - if(world.rank()==0) print(" size after BSH:", funcsize); + //std::size_t funcsize = temp_function[0].size(); + //funcsize += temp_function[1].size(); + //funcsize += temp_function[2].size(); + //funcsize += temp_function[3].size(); + //if(world.rank()==0) print(" size after BSH:", funcsize); temp_function.truncate(); //try truncating here - funcsize = temp_function[0].size(); - funcsize += temp_function[1].size(); - funcsize += temp_function[2].size(); - funcsize += temp_function[3].size(); - if(world.rank()==0) print(" size after truncate:", funcsize); + //funcsize = temp_function[0].size(); + //funcsize += temp_function[1].size(); + //funcsize += temp_function[2].size(); + //funcsize += temp_function[3].size(); + //if(world.rank()==0) print(" size after truncate:", funcsize); //Now calculate the residual //temp_function = occupieds[j] - temp_function; @@ -1770,9 +1997,13 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea times = end_timer(world); if(world.rank()==0) print(" ", times[0]); + //Need r function to print r expectation values + real_function_3d rfunc = real_factory_3d(world).f(myr); + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + double r_expec = std::real(inner(occupieds[j], occupieds[j]*rfunc)); if(world.rank()==0){ - printf(" Orbital: %3i, Energy: %.10e\n",j+1, energies[j]-myc*myc); + printf(" Orbital: %3i, Energy: %.10e, : %8e\n",j+1, energies[j]-myc*myc, r_expec); } } if(world.rank()==0){ @@ -1889,14 +2120,19 @@ void DF::solve(World& world){ print(" ------------------------"); } - if(DFparams.job == 0){ - solve_occupied(world); - } - else if(DFparams.job == 1){ - solve_virtuals1(world); + if(not DFparams.no_compute){ + if(DFparams.job == 0){ + solve_occupied(world); + } + else if(DFparams.job == 1){ + solve_virtuals1(world); + } + else{ + if(world.rank()==0) print("Specify a better job parameter."); + } } else{ - if(world.rank()==0) print("Specify a better job parameter."); + if(world.rank()==0) print("Requested no computation."); } // Report calculation time @@ -1910,8 +2146,9 @@ void DF::solve(World& world){ if(DFparams.lineplot){ start_timer(world); if(world.rank()==0) print("***Making lineplots***"); - make_density_lineplots(world, "density_lineplots", 50000, 0.5); - make_component_lineplots(world, "large_component_lineplots", "small_component_lineplots", 50000, 0.5); + //make_density_lineplots(world, "density_lineplots", 100000, 0.005); + //make_component_lineplots(world, "large_component_lineplots", "small_component_lineplots", 100000, 5); + make_component_logplots(world, "large_component_lineplots", "small_component_lineplots", 1000, -6, 1); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); } diff --git a/src/apps/moldft/DF.h b/src/apps/moldft/DF.h index a5297cac5a0..f8e48c73e9d 100644 --- a/src/apps/moldft/DF.h +++ b/src/apps/moldft/DF.h @@ -134,6 +134,8 @@ class DF { void orthogonalize_inplace(World& world); + //Lineplot the densities of the large and small component separately. only along x axis on log scale from 10^-startpnt to 10^endpnt with pts evenly spaced in log space + void make_component_logplots(World& world, const char* filename1, const char* filename2, int npt, int startpnt, int endpnt); }; diff --git a/src/apps/moldft/DFParameters.h b/src/apps/moldft/DFParameters.h index 787246df06e..348513fcfd3 100644 --- a/src/apps/moldft/DFParameters.h +++ b/src/apps/moldft/DFParameters.h @@ -51,6 +51,7 @@ namespace madness { int lb_iter; ///< How many iterations to load balance (after the initial load balancing) bool nwchem; ///< Indicates archive given is actually an nwchem file for starting the job bool lineplot; ///< Whether or not to make lineplots at the end of the job + bool no_compute; ///< If true, will skip all computation //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // If you add something here, don't forget to add it to serializable! @@ -63,7 +64,7 @@ namespace madness { template void serialize(Archive& ar){ - ar & archive & job & print_level & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot; + ar & archive & job & print_level & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot & no_compute; } // Default constructor @@ -85,6 +86,7 @@ namespace madness { , lb_iter(20) , nwchem(false) , lineplot(false) + , no_compute(false) {} // Initializes DFParameters using the contents of file \c filename @@ -174,6 +176,9 @@ namespace madness { else if (s == "lineplot"){ lineplot = true; } + else if (s == "no_compute"){ + no_compute = true; + } else{ std::cout << "Dirac Fock: unrecognized input keyword " << s << std::endl; MADNESS_EXCEPTION("input error", 0); diff --git a/src/apps/moldft/InitParameters.h b/src/apps/moldft/InitParameters.h index 486385457fc..a9f067bdad7 100644 --- a/src/apps/moldft/InitParameters.h +++ b/src/apps/moldft/InitParameters.h @@ -96,11 +96,30 @@ namespace madness{ complex_function_3d complexreader; Fcwf spinup(world); Fcwf spindown(world); + complex_derivative_3d Dx(world,0); + complex_derivative_3d Dy(world,1); + complex_derivative_3d Dz(world,2); + double myc = 137.0359895; //speed of light in atomic units + std::complex myi(0,1); for(unsigned int i = 0; i < num_occupied; i++){ input & reader; complexreader = function_real2complex(reader); - spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); - spindown = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + spinup[0] = complexreader; + spinup[1] = complex_factory_3d(world); + spinup[2] = (-myi/myc) * Dz(complexreader); + spinup[2].scale(0.5); + spinup[3] = (-myi/myc) * (Dx(complexreader) + myi * Dy(complexreader)); + spinup[3].scale(0.5); + spinup.normalize(); + spindown[0] = complex_factory_3d(world); + spindown[1] = complexreader; + spindown[2] = (-myi/myc) * (Dx(complexreader) - myi * Dy(complexreader)); + spindown[2].scale(0.5); + spindown[3] = (myi/myc) * Dz(complexreader); + spindown[3].scale(0.5); + spindown.normalize(); + //spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + //spindown = Fcwf(complex_factory_3d(world), copy(complexreader), complex_factory_3d(world), complex_factory_3d(world)); orbitals.push_back(spinup); orbitals.push_back(spindown); } From abdd01c0c4a2adabeaf0c964e2f3ad6ce00fd7c9 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 27 Feb 2019 14:30:08 -0500 Subject: [PATCH 0018/1312] fixed initial guess construction for open-shell --- src/apps/moldft/InitParameters.h | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/apps/moldft/InitParameters.h b/src/apps/moldft/InitParameters.h index a9f067bdad7..b0a37599fee 100644 --- a/src/apps/moldft/InitParameters.h +++ b/src/apps/moldft/InitParameters.h @@ -90,17 +90,17 @@ namespace madness{ FunctionDefaults<3>::set_cubic_cell(-L, L); + complex_derivative_3d Dx(world,0); + complex_derivative_3d Dy(world,1); + complex_derivative_3d Dz(world,2); + double myc = 137.0359895; //speed of light in atomic units + std::complex myi(0,1); if(spinrestricted){ // Read in nonrelativistic ground state orbitals, changing them to Fcwfs real_function_3d reader; complex_function_3d complexreader; Fcwf spinup(world); Fcwf spindown(world); - complex_derivative_3d Dx(world,0); - complex_derivative_3d Dy(world,1); - complex_derivative_3d Dz(world,2); - double myc = 137.0359895; //speed of light in atomic units - std::complex myi(0,1); for(unsigned int i = 0; i < num_occupied; i++){ input & reader; complexreader = function_real2complex(reader); @@ -139,6 +139,8 @@ namespace madness{ } else{ + if(world.rank()==0) print("num_occupied is:" ,num_occupied); + // Read in alpha ground state orbitals real_function_3d reader; complex_function_3d complexreader; @@ -146,7 +148,13 @@ namespace madness{ for(unsigned int i = 0; i < num_occupied; i++){ input & reader; complexreader = function_real2complex(reader); - fcwfreader = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + fcwfreader[0] = complexreader; + fcwfreader[1] = complex_factory_3d(world); + fcwfreader[2] = (-myi/myc) * Dz(complexreader); + fcwfreader[2].scale(0.5); + fcwfreader[3] = (-myi/myc) * (Dx(complexreader) + myi * Dy(complexreader)); + fcwfreader[3].scale(0.5); + fcwfreader.normalize(); orbitals.push_back(fcwfreader); } @@ -164,11 +172,19 @@ namespace madness{ std::vector dummy4; input & dummy4; + if(world.rank()==0) print("made it here: ", num_betas); + //read in beta ground state orbitals for(unsigned int i = 0; i < num_betas; i++){ input & reader; complexreader = function_real2complex(reader); - fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + fcwfreader[0] = complex_factory_3d(world); + fcwfreader[1] = complexreader; + fcwfreader[2] = (-myi/myc) * (Dx(complexreader) - myi * Dy(complexreader)); + fcwfreader[2].scale(0.5); + fcwfreader[3] = (myi/myc) * Dz(complexreader); + fcwfreader[3].scale(0.5); + fcwfreader.normalize(); orbitals.push_back(fcwfreader); } From 02d2529fc2155746ee7925b67343b2907fbbf17a Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 22 Mar 2019 18:26:32 -0400 Subject: [PATCH 0019/1312] new printing and convergence criteria --- src/apps/moldft/DF.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index c4f6fc2d531..e9f0a1244cc 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -2002,8 +2002,12 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea for(unsigned int j = 0; j < Init_params.num_occupied; j++){ double r_expec = std::real(inner(occupieds[j], occupieds[j]*rfunc)); + int numcoeffs = occupieds[j][0].size() + occupieds[j][1].size() + occupieds[j][2].size() + occupieds[j][3].size(); + int maxdepth = std::max(occupieds[j][0].max_depth(), occupieds[j][1].max_depth()); + maxdepth = std::max(int(occupieds[j][2].max_depth()), maxdepth); + maxdepth = std::max(int(occupieds[j][3].max_depth()), maxdepth); if(world.rank()==0){ - printf(" Orbital: %3i, Energy: %.10e, : %8e\n",j+1, energies[j]-myc*myc, r_expec); + printf(" Orbital: %3i, Energy: %.10e, : %8e, No. coeffs: %7i, Max depth: %3i\n",j+1, energies[j], r_expec, numcoeffs, maxdepth); } } if(world.rank()==0){ @@ -2014,13 +2018,13 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea print(" Nuclear Repulsion Energy: ",nuclear_repulsion_energy); print(" Total Energy: ",total_energy); print(" Total Energy Residual: ", std::fabs(total_energy - old_total_energy)); - print("Energy Convergence Threshold: " , DFparams.thresh*pow(10,floor(log10(std::fabs(total_energy)))),"\n"); + //print("Energy Convergence Threshold: " , DFparams.thresh*pow(10,floor(log10(std::fabs(total_energy)))),"\n"); } //check total energy for convergence. the global variable thresh determines how many significant figures we look for - if(std::fabs(total_energy-old_total_energy) > DFparams.thresh*pow(10,floor(log10(std::fabs(total_energy))))){ - iterate_again = true; - } + //if(std::fabs(total_energy-old_total_energy) > DFparams.thresh*pow(10,floor(log10(std::fabs(total_energy))))){ + // iterate_again = true; + //} //truncate for(unsigned int j = 0; j < Init_params.num_occupied; j++){ @@ -2087,7 +2091,8 @@ void DF::solve_occupied(World & world) if(world.rank()==0) print(" ", times[0]); //Set tolerance for residuals - double tol = pow(10,floor(0.5*log10(DFparams.thresh))); + //double tol = pow(10,floor(0.5*log10(DFparams.thresh))); + double tol = 10.0*DFparams.thresh; //Now time to start iterating From 161daa9ab8bb6cade4b7c969da88f13685bf38c2 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 29 Mar 2019 13:53:48 -0400 Subject: [PATCH 0020/1312] input sample file added --- src/apps/moldft/DFinput_sample | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/apps/moldft/DFinput_sample diff --git a/src/apps/moldft/DFinput_sample b/src/apps/moldft/DFinput_sample new file mode 100644 index 00000000000..9e3b1dd894a --- /dev/null +++ b/src/apps/moldft/DFinput_sample @@ -0,0 +1,10 @@ +DiracFock +archive /gpfs/projects/rjh/JoelsRestartData/H2Orestartdata +job 0 +small 1e-5 +thresh 1e-6 +k 8 +kain +maxsub 5 +no_save +end From 08572bf4a6d6b7c1f23c7eee96baa98a76605510 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 29 Mar 2019 14:02:35 -0400 Subject: [PATCH 0021/1312] fixed printing, tighter cluster tol, fixed Alist values --- src/apps/moldft/DF.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index e9f0a1244cc..fa6de8a288e 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -213,7 +213,7 @@ class GaussianNucleusFunctor : public FunctionFunctorInterface { } //find atomic mass numbers for each atom - int Alist[116] = {1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,59,63,65,70,72,75,79,80,84,85,87,89,91,93,96,98,101,103,106,108,112,115,119,122,127,127,131,133,137,139,140,141,144,145,150,152,157,159,162,165,167,169,173,175,178,181,184,186,190,192,195,197,200,204,207,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,261,262,263,262,264,266,264,272,277,284,289,288,292}; + int Alist[116] = {1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,58,63,64,69,74,75,80,79,84,85,88,89,90,93,98,98,102,103,106,107,114,115,120,121,130,127,132,133,138,139,140,141,144,145,152,153,158,159,162,162,168,169,174,175,180,181,184,187,192,193,195,197,202,205,208,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,261,262,263,262,265,266,264,272,277,284,289,288,292}; for(unsigned int i = 0; i < m_Zlist.size(); i++){ m_Alist.push_back(Alist[m_Zlist[i]-1]); } @@ -271,7 +271,7 @@ class FermiNucDistFunctor : public FunctionFunctorInterface { m_R.push_back(R); //find atomic mass numbers for each atom - int Alist[116] = {1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,59,63,65,70,72,75,79,80,84,85,87,89,91,93,96,98,101,103,106,108,112,115,119,122,127,127,131,133,137,139,140,141,144,145,150,152,157,159,162,165,167,169,173,175,178,181,184,186,190,192,195,197,200,204,207,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,261,262,263,262,264,266,264,272,277,284,289,288,292}; + int Alist[116] = {1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,58,63,64,69,74,75,80,79,84,85,88,89,90,93,98,98,102,103,106,107,114,115,120,121,130,127,132,133,138,139,140,141,144,145,152,153,158,159,162,162,168,169,174,175,180,181,184,187,192,193,195,197,202,205,208,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,261,262,263,262,265,266,264,272,277,284,289,288,292}; m_A = Alist[Z-1]; double PI = constants::pi; @@ -883,7 +883,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" Removing Rotations"); start_timer(world); - double thresh_degenerate = DFparams.thresh*100.0; + double thresh_degenerate = DFparams.thresh*10.0; double csquared = 137.0359895*137.0359895; //electron rest energy //swap columns for a diagonally dominant matrix bool switched = true; @@ -2007,7 +2007,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea maxdepth = std::max(int(occupieds[j][2].max_depth()), maxdepth); maxdepth = std::max(int(occupieds[j][3].max_depth()), maxdepth); if(world.rank()==0){ - printf(" Orbital: %3i, Energy: %.10e, : %8e, No. coeffs: %7i, Max depth: %3i\n",j+1, energies[j], r_expec, numcoeffs, maxdepth); + printf(" Orbital: %3i, Energy: %.10e, : %8e, No. coeffs: %7i, Max depth: %3i\n",j+1, energies[j]-myc*myc, r_expec, numcoeffs, maxdepth); } } if(world.rank()==0){ From 3f88a10be4f167a035febed51191871c236d7bf0 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 9 Apr 2019 12:13:33 -0400 Subject: [PATCH 0022/1312] new convergence criteria, new param bohr_rad --- README_JOEL | 14 ++++++++++++ src/apps/moldft/CMakeLists.txt | 3 +++ src/apps/moldft/DF.cc | 39 +++++++++++++++++++++++++++------- src/apps/moldft/DFParameters.h | 7 +++++- 4 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 README_JOEL diff --git a/README_JOEL b/README_JOEL new file mode 100644 index 00000000000..ba47816c90e --- /dev/null +++ b/README_JOEL @@ -0,0 +1,14 @@ +README file for Joel Anderson's fork of MADNESS + +Notes: +After configuration with cmake, you may need to go to /src/madness/config.h and change the line: + +/*undef HAVE_INTEL_MKL */ + +to: + +def HAVE_INTEL_MKL 1 + +making sure that you do in fact have Intel MKL. + +This is due to a bug that I don't know how to fix, where even if you have Intel MKL, cmake doesn't set the right preprocessing macros, and ends up compiling pieces of code without it. diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index 75df07901df..ff51d08cb4d 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -18,6 +18,9 @@ target_link_libraries(testperiodic_moldft MADchem) add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) target_link_libraries(DFdriver MADchem MADmra) +add_executable(DFdriver2 DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) +target_link_libraries(DFdriver2 MADchem MADmra) + add_executable(rk rk-3.cc) target_link_libraries(rk MADchem MADmra -lgmp -lmpfr) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index fa6de8a288e..75c0dd6ef8e 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -202,7 +202,7 @@ class GaussianNucleusFunctor : public FunctionFunctorInterface { std::vector m_xi; public: // Constructor - GaussianNucleusFunctor(Molecule& molecule){ + GaussianNucleusFunctor(Molecule& molecule, double bohr_rad){ //get atom coordinates m_Rlist = molecule.get_all_coords_vec(); @@ -220,7 +220,7 @@ class GaussianNucleusFunctor : public FunctionFunctorInterface { //calculate factors necessary for the potential for(unsigned int i = 0; i < m_Zlist.size(); i++){ - m_xi.push_back(sqrt(3.0/2.0)/(0.836*pow(m_Alist[i],1.0/3.0)+0.57)*52917.7211); + m_xi.push_back(sqrt(3.0/2.0)/(0.836*pow(m_Alist[i],1.0/3.0)+0.57)*bohr_rad); } } @@ -266,8 +266,9 @@ class FermiNucDistFunctor : public FunctionFunctorInterface { std::vector m_R; public: // Constructor - FermiNucDistFunctor(int& Z, coord_3d R){ - m_T = 0.000043463700858425666; //2.3 fm in bohr + FermiNucDistFunctor(int& Z, coord_3d R, double bohr_rad){ + //m_T = 0.000043463700858425666; //2.3 fm in bohr + m_T = 2.3/bohr_rad; m_R.push_back(R); //find atomic mass numbers for each atom @@ -279,7 +280,7 @@ class FermiNucDistFunctor : public FunctionFunctorInterface { m_C = 0.000022291*pow(m_A, 1.0/3.0) - 0.0000090676; } else{ - m_C = sqrt(5.0/3.0*pow((0.836*pow(m_A,1.0/3.0)+0.570)/52917.7211,2) - 7.0/3.0*pow(PI*m_T/4.0/log(3.0),2)); + m_C = sqrt(5.0/3.0*pow((0.836*pow(m_A,1.0/3.0)+0.570)/bohr_rad,2) - 7.0/3.0*pow(PI*m_T/4.0/log(3.0),2)); } } @@ -301,6 +302,27 @@ class FermiNucDistFunctor : public FunctionFunctorInterface { madness::Level special_level() { return 18; } + + void print_details(World& world){ + int Alist[116] = {1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,58,63,64,69,74,75,80,79,84,85,88,89,90,93,98,98,102,103,106,107,114,115,120,121,130,127,132,133,138,139,140,141,144,145,152,153,158,159,162,162,168,169,174,175,180,181,184,187,192,193,195,197,202,205,208,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,261,262,263,262,265,266,264,272,277,284,289,288,292}; + double T = 2.3/52917.72490083583; + double PI = constants::pi; + + if(world.rank()==0){ + for(int i = 0; i < 116; i++){ + double RMS = (0.836*pow(Alist[i],1.0/3.0)+0.570)/52917.72490083583; + double C; + if(Alist[i] < 5){ + C = 0.000022291*pow(Alist[i], 1.0/3.0) - 0.0000090676; + } + else{ + C = sqrt(5.0/3.0*pow(RMS,2)-7.0/3.0*pow(PI*T/4.0/log(3.0),2)); + } + double xi = 3.0/2.0/pow(RMS,2); + printf("Z: %3i, A: %3i, RMS: %.10e, C: %.10e, xi: %.10e\n", i+1, Alist[i], RMS, C, xi); + } + } + } }; //generic f(r)=||r|| function for calculation of the radial expectation value @@ -321,12 +343,13 @@ void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_functi for(unsigned int i = 0; i < num_atoms; i++){ Zlist[i] = Init_params.molecule.get_atom_number(i); - FermiNucDistFunctor rho(Zlist[i], Rlist[i]); + FermiNucDistFunctor rho(Zlist[i], Rlist[i],DFparams.bohr_rad); temp = real_factory_3d(world).functor(rho).truncate_mode(0); tempnorm = temp.trace(); temp.scale(-Zlist[i]/tempnorm); if(i == 0){ potential = temp; + //rho.print_details(world); } else{ potential += temp; @@ -1591,14 +1614,14 @@ void DF::saveDF(World& world){ //Creates the nuclear potential from the molecule object void DF::make_gaussian_potential(World& world, real_function_3d& potential){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); - GaussianNucleusFunctor Vfunctor(Init_params.molecule); + GaussianNucleusFunctor Vfunctor(Init_params.molecule, DFparams.bohr_rad); potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); } //Creates the nuclear potential from the molecule object. Also calculates the nuclear repulsion energy void DF::make_gaussian_potential(World& world, real_function_3d& potential, double& nuclear_repulsion_energy){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); - GaussianNucleusFunctor Vfunctor(Init_params.molecule); + GaussianNucleusFunctor Vfunctor(Init_params.molecule,DFparams.bohr_rad); potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); std::vector Rlist = Vfunctor.get_Rlist(); std::vector Zlist = Vfunctor.get_Zlist(); diff --git a/src/apps/moldft/DFParameters.h b/src/apps/moldft/DFParameters.h index 348513fcfd3..8d23037a055 100644 --- a/src/apps/moldft/DFParameters.h +++ b/src/apps/moldft/DFParameters.h @@ -52,6 +52,7 @@ namespace madness { bool nwchem; ///< Indicates archive given is actually an nwchem file for starting the job bool lineplot; ///< Whether or not to make lineplots at the end of the job bool no_compute; ///< If true, will skip all computation + double bohr_rad; ///< bohr radius in fm (default: 52917.7211) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // If you add something here, don't forget to add it to serializable! @@ -64,7 +65,7 @@ namespace madness { template void serialize(Archive& ar){ - ar & archive & job & print_level & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot & no_compute; + ar & archive & job & print_level & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot & no_compute & bohr_rad; } // Default constructor @@ -87,6 +88,7 @@ namespace madness { , nwchem(false) , lineplot(false) , no_compute(false) + , bohr_rad(52917.7211) {} // Initializes DFParameters using the contents of file \c filename @@ -179,6 +181,9 @@ namespace madness { else if (s == "no_compute"){ no_compute = true; } + else if (s == "bohr_rad"){ + f >> bohr_rad; + } else{ std::cout << "Dirac Fock: unrecognized input keyword " << s << std::endl; MADNESS_EXCEPTION("input error", 0); From 6fc3c9729dd135febdd63e3ae2b16222edf20e3a Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Thu, 2 May 2019 13:08:12 -0400 Subject: [PATCH 0023/1312] More printing and restructured T application --- src/apps/moldft/DF.cc | 87 ++++++++++++++++++++++---------- src/apps/moldft/DFParameters.h | 7 ++- src/apps/moldft/InitParameters.h | 6 +-- src/apps/moldft/fcwf.cc | 13 +++++ src/apps/moldft/fcwf.h | 3 ++ src/madness/mra/derivative.h | 2 +- src/madness/mra/mra.h | 1 + 7 files changed, 86 insertions(+), 33 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 75c0dd6ef8e..84b2c98b0b2 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -221,6 +221,7 @@ class GaussianNucleusFunctor : public FunctionFunctorInterface { //calculate factors necessary for the potential for(unsigned int i = 0; i < m_Zlist.size(); i++){ m_xi.push_back(sqrt(3.0/2.0)/(0.836*pow(m_Alist[i],1.0/3.0)+0.57)*bohr_rad); + //std::cout << m_xi << std::endl; } } @@ -460,10 +461,10 @@ double DF::rele(World& world, const Fcwf& psi){ Fcwf Tpsi(world); complex_function_3d temp(world); - Tpsi[0] = Dz(psi[2]) + Dx(psi[3]) - myi*Dy(psi[3]) + myc*myi*psi[0]; - Tpsi[1] = Dx(psi[2]) + myi*Dy(psi[2]) - Dz(psi[3]) + myc*myi*psi[1]; - Tpsi[2] = Dz(psi[0]) + Dx(psi[1]) - myi*Dy(psi[1]) - myc*myi*psi[2]; - Tpsi[3] = Dx(psi[0]) + myi*Dy(psi[0]) - Dz(psi[1]) - myc*myi*psi[3]; + Tpsi[0] = Dz(psi[2]) + Dx(psi[3]) - myi*Dy(psi[3]);// + myc*myi*psi[0]; + Tpsi[1] = Dx(psi[2]) + myi*Dy(psi[2]) - Dz(psi[3]);// + myc*myi*psi[1]; + Tpsi[2] = Dz(psi[0]) + Dx(psi[1]) - myi*Dy(psi[1]) - 2*myc*myi*psi[2]; + Tpsi[3] = Dx(psi[0]) + myi*Dy(psi[0]) - Dz(psi[1]) - 2*myc*myi*psi[3]; //The giant block below this exists because I was debugging //some hung queues. I still don't know what's causing them @@ -541,18 +542,38 @@ double DF::rele(World& world, const Fcwf& psi){ } //returns a new Fcwf that is the result of applying the Dirac free-particle hamiltonian on psi -Fcwf apply_T(World& world, const Fcwf& psi){ +Fcwf apply_T(World& world, Fcwf& psi){ double myc = 137.0359895; //speed of light in atomic units std::complex myi(0,1); complex_derivative_3d Dx(world,0); complex_derivative_3d Dy(world,1); complex_derivative_3d Dz(world,2); Fcwf Tpsi(world); - - Tpsi[0] = Dz(psi[2]) + Dx(psi[3]) - myi*Dy(psi[3]) + myc*myi*psi[0]; - Tpsi[1] = Dx(psi[2]) + myi*Dy(psi[2]) - Dz(psi[3]) + myc*myi*psi[1]; - Tpsi[2] = Dz(psi[0]) + Dx(psi[1]) - myi*Dy(psi[1]) - myc*myi*psi[2]; - Tpsi[3] = Dx(psi[0]) + myi*Dy(psi[0]) - Dz(psi[1]) - myc*myi*psi[3]; + + //reconstruct psi + psi.reconstruct(); + + //take derivatives + Fcwf psix = apply(world,Dx,psi); + Fcwf psiy = apply(world,Dy,psi); + Fcwf psiz = apply(world,Dz,psi); + + //compress + psix.compress(); + psiy.compress(); + psiz.compress(); + psi.compress(); + + //combine to calculate application of T + Tpsi[0] = psiz[2] + psix[3] - myi*psiy[3]; + Tpsi[1] = psix[2] + myi*psiy[2] - psiz[3]; + Tpsi[2] = psiz[0] + psix[1] - myi*psiy[1] - 2*myc*myi*psi[2]; + Tpsi[3] = psix[0] + myi*psiy[0] - psiz[1] - 2*myc*myi*psi[3]; + + //Tpsi[0] = Dz(psi[2]) + Dx(psi[3]) - myi*Dy(psi[3]);// + myc*myi*psi[0]; + //Tpsi[1] = Dx(psi[2]) + myi*Dy(psi[2]) - Dz(psi[3]);// + myc*myi*psi[1]; + //Tpsi[2] = Dz(psi[0]) + Dx(psi[1]) - myi*Dy(psi[1]) - 2*myc*myi*psi[2]; + //Tpsi[3] = Dx(psi[0]) + myi*Dy(psi[0]) - Dz(psi[1]) - 2*myc*myi*psi[3]; return Tpsi * (-myi*myc); } @@ -622,6 +643,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi for(unsigned int j = 0; j < n-i; j++){ temp[j] = complex_factory_3d(world); } + compress(world, temp); std::vector temp0(n-i); std::vector temp1(n-i); @@ -634,13 +656,17 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi temp3[j-i] = occupieds[j][3]; } - gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*conj(world, temp0)); - gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*conj(world, temp1)); - gaxpy(world, 1.0, temp, 1.0, occupieds[i][2]*conj(world, temp2)); - gaxpy(world, 1.0, temp, 1.0, occupieds[i][3]*conj(world, temp3)); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*conj(world,temp0)); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*conj(world,temp1)); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][2]*conj(world,temp2)); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][3]*conj(world,temp3)); + + if(world.rank()==0) print("Starting apply phase in K"); temp = apply(world, op, temp); + if(world.rank()==0) print("Exiting apply phase in K"); + Kpsis[i][0] += sum(world, mul(world, temp, temp0)); Kpsis[i][1] += sum(world, mul(world, temp, temp1)); Kpsis[i][2] += sum(world, mul(world, temp, temp2)); @@ -660,10 +686,6 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi } - - - - //for(unsigned int j = i; j < n ; j++){ //parallelize this loop using 4-vectors approach // /*TODO (vector inner_func) @@ -918,7 +940,8 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //double snew = std::norm(U(kk, j)) + std::norm(U(j, kk)); double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); - if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { + //if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { + if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::fabs(evals[kk])) ) { if(world.rank()==0){ print(" swapping columns ", kk+1, " and ", j+1); } @@ -944,7 +967,8 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o while (ilo < Init_params.num_occupied - 1) { unsigned int ihi = ilo; while (fabs(evals[ilo] - evals[ihi + 1]) - < thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { + < thresh_degenerate * std::fabs(evals[ilo])){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { + //< thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { ++ihi; if (ihi == Init_params.num_occupied - 1) break; @@ -954,7 +978,8 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0){ print(" found cluster from ", ilo + 1, " to " , ihi + 1); for(unsigned int kk = ilo; kk <= ihi; kk++){ - print(" ",evals[kk] - csquared); + //print(" ",evals[kk] - csquared); + print(" ",evals[kk]); } } @@ -1407,9 +1432,10 @@ void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& std::complex ic = myi*myc; //calculate exponent for equivalent BSH operator - double mu = std::sqrt((myc*myc*myc*myc-eps*eps)/myc/myc); + //double mu = std::sqrt((myc*myc*myc*myc-eps*eps)/myc/myc); + double mu = std::sqrt(-(2*eps*c2+eps*eps)/c2); - //if(world.rank() == 0) print("Hi, this is apply_BSH! mu is: ", mu); + //if(world.rank()==0) print("in apply, mu = ", mu); //create gradient BSH operators //TODO: make my own GradBSH that first computes BSH with a ridiculous lo, and then accumulates to CDelta, then need something intelligent for the derivative of that result @@ -1421,7 +1447,7 @@ void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& real_convolution_3d op = BSHOperator3D(world, mu,small,thresh); // Finer length scale and accuracy control Vpsi = apply(world, op, Vpsi); - Vpsi = (apply_T(world, Vpsi) + Vpsi * eps) * (1.0/c2); + Vpsi = (apply_T(world, Vpsi) + Vpsi * (eps+2*c2)) * (1.0/c2); //Vpsi = apply(world, op, apply_T(world, Vpsi) + Vpsi * eps) * (1.0/c2); @@ -1805,6 +1831,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Apply BSH to each psi if(world.rank()==0) print("\n***Applying BSH operator***"); start_timer(world); + double maxresidual = -1.0; for(unsigned int j = 0; j < Init_params.num_occupied; j++){ //Debugging @@ -1861,6 +1888,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Print residual norm to keep track if(world.rank()==0) printf(" Orbital: %3i, Resid: %.10e\n",j+1, residualnorm); + maxresidual = std::max(maxresidual, residualnorm); //If the norm is big enough, we'll need to iterate again. if(residualnorm > tolerance) iterate_again = true; @@ -1873,6 +1901,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea occupieds[j] = temp_function; } } + if(world.rank()==0) printf(" max Resid: %.10e\n",maxresidual); if(world.rank()==0) printf(" tolerance: %.10e\n",tolerance); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -1957,7 +1986,8 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //if(world.rank()==0) print(" Adding terms for orbital ", j); energies[j] = rele(world,occupieds[j]); - kinetic_energy += (energies[j] - myc*myc); + //kinetic_energy += (energies[j] - myc*myc); + kinetic_energy += (energies[j]); //if(world.rank()==0) print(" Kinetic done."); } @@ -2030,7 +2060,8 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea maxdepth = std::max(int(occupieds[j][2].max_depth()), maxdepth); maxdepth = std::max(int(occupieds[j][3].max_depth()), maxdepth); if(world.rank()==0){ - printf(" Orbital: %3i, Energy: %.10e, : %8e, No. coeffs: %7i, Max depth: %3i\n",j+1, energies[j]-myc*myc, r_expec, numcoeffs, maxdepth); + //printf(" Orbital: %3i, Energy: %.10e, : %8e, No. coeffs: %7i, Max depth: %3i\n",j+1, energies[j]-myc*myc, r_expec, numcoeffs, maxdepth); + printf(" Orbital: %3i, Energy: %.10e, : %8e, No. coeffs: %7i, Max depth: %3i\n",j+1, energies[j], r_expec, numcoeffs, maxdepth); } } if(world.rank()==0){ @@ -2115,14 +2146,14 @@ void DF::solve_occupied(World & world) //Set tolerance for residuals //double tol = pow(10,floor(0.5*log10(DFparams.thresh))); - double tol = 10.0*DFparams.thresh; + double tol = 50.0*DFparams.thresh; //Now time to start iterating bool keep_going = true; int iteration_number = 1; //while(iteration_number < DFparams.max_iter){ - while(keep_going and iteration_number < DFparams.max_iter){ + while((keep_going and iteration_number <= DFparams.max_iter) or iteration_number <= DFparams.min_iter){ keep_going = iterate(world, Vnuc, op, JandV, Kpsis, kainsolver, tol, iteration_number, nuclear_repulsion_energy); //Load balance and save between iterations diff --git a/src/apps/moldft/DFParameters.h b/src/apps/moldft/DFParameters.h index 8d23037a055..6eea877703b 100644 --- a/src/apps/moldft/DFParameters.h +++ b/src/apps/moldft/DFParameters.h @@ -53,6 +53,7 @@ namespace madness { bool lineplot; ///< Whether or not to make lineplots at the end of the job bool no_compute; ///< If true, will skip all computation double bohr_rad; ///< bohr radius in fm (default: 52917.7211) + int min_iter; ///< minimum number of iterations (default: 2) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // If you add something here, don't forget to add it to serializable! @@ -65,7 +66,7 @@ namespace madness { template void serialize(Archive& ar){ - ar & archive & job & print_level & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot & no_compute & bohr_rad; + ar & archive & job & print_level & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot & no_compute & bohr_rad & min_iter; } // Default constructor @@ -89,6 +90,7 @@ namespace madness { , lineplot(false) , no_compute(false) , bohr_rad(52917.7211) + , min_iter(2) {} // Initializes DFParameters using the contents of file \c filename @@ -184,6 +186,9 @@ namespace madness { else if (s == "bohr_rad"){ f >> bohr_rad; } + else if (s == "min_iter"){ + f >> min_iter; + } else{ std::cout << "Dirac Fock: unrecognized input keyword " << s << std::endl; MADNESS_EXCEPTION("input error", 0); diff --git a/src/apps/moldft/InitParameters.h b/src/apps/moldft/InitParameters.h index b0a37599fee..2ed6345b6d7 100644 --- a/src/apps/moldft/InitParameters.h +++ b/src/apps/moldft/InitParameters.h @@ -129,7 +129,7 @@ namespace madness{ double csquared = 137.0359895*137.0359895; double temp; for(unsigned int i = 0; i < num_occupied; i++){ - temp = temp_energies(i)+csquared; + temp = temp_energies(i);//+csquared; energies(2*i) = temp; energies(2*i+1) = temp; } @@ -192,10 +192,10 @@ namespace madness{ energies = Tensor(num_occupied + num_betas); double csquared = 137.0359895*137.0359895; for(unsigned int i = 0; i < num_occupied; i++){ - energies(i) = temp_energies(i) + csquared; + energies(i) = temp_energies(i);// + csquared; } for(unsigned int i = 0; i < num_betas; i++){ - energies(num_occupied + i) = beta_energies(i) + csquared; + energies(num_occupied + i) = beta_energies(i);// + csquared; } num_occupied += num_betas; diff --git a/src/apps/moldft/fcwf.cc b/src/apps/moldft/fcwf.cc index 7c171a001f9..4629524b130 100644 --- a/src/apps/moldft/fcwf.cc +++ b/src/apps/moldft/fcwf.cc @@ -241,6 +241,9 @@ void Fcwf::apply(World& world, real_convolution_3d& op){ m_psi = madness::apply(world, op, m_psi); } +void Fcwf::apply(World& world, complex_derivative_3d& D){ + m_psi = madness::apply(world, D, m_psi); +} std::complex inner(const Fcwf& psi, const Fcwf& phi){ //std::complex result(0,0); @@ -265,6 +268,11 @@ Fcwf apply(World& world, real_convolution_3d& op, const Fcwf& psi){ return temp; } +Fcwf apply(World& world, complex_derivative_3d& D, const Fcwf& psi){ + Fcwf temp = copy(psi); + temp.apply(world, D); + return temp; +} real_function_3d squaremod(Fcwf& psi){ MADNESS_ASSERT(psi.getinitialize()); @@ -456,5 +464,10 @@ void Fcwf::reconstruct(){ for(unsigned int i = 0; i < 4; i++) m_psi[i].reconstruct(); } +//loop through fcwf and compress each function +void Fcwf::compress(){ + MADNESS_ASSERT(m_initialized); //needed? + for(unsigned int i = 0; i < 4; i++) m_psi[i].compress(); +} //kthxbye diff --git a/src/apps/moldft/fcwf.h b/src/apps/moldft/fcwf.h index 82f65e86d2e..cc7ced418e8 100644 --- a/src/apps/moldft/fcwf.h +++ b/src/apps/moldft/fcwf.h @@ -67,8 +67,10 @@ class Fcwf{ std::complex inner(World& world, const Fcwf& phi) const; void apply(World& world, real_convolution_3d& op); + void apply(World& world, complex_derivative_3d& D); void reconstruct(); + void compress(); }; @@ -76,6 +78,7 @@ std::complex inner(const Fcwf& psi, const Fcwf& phi); //Fcwf apply(real_convolution_3d& op, const Fcwf& psi); Fcwf apply(World& world, real_convolution_3d& op, const Fcwf& psi); +Fcwf apply(World& world, complex_derivative_3d& op, const Fcwf& psi); real_function_3d squaremod(Fcwf& psi); real_function_3d squaremod_small(Fcwf& psi); diff --git a/src/madness/mra/derivative.h b/src/madness/mra/derivative.h index 6d08a19c207..2200f96eab1 100644 --- a/src/madness/mra/derivative.h +++ b/src/madness/mra/derivative.h @@ -195,7 +195,7 @@ namespace madness { functionT df; df.set_impl(f,false); - + df.get_impl()->world.gop.fence(); // <<<<<<< perhaps unneccessary fence added by Robert df.get_impl()->diff(this, f.get_impl().get(), fence); return df; } diff --git a/src/madness/mra/mra.h b/src/madness/mra/mra.h index 322d18ecdf7..fb41eaf3a01 100644 --- a/src/madness/mra/mra.h +++ b/src/madness/mra/mra.h @@ -1536,6 +1536,7 @@ namespace madness { if (VERIFY_TREE) left.verify_tree(); if (VERIFY_TREE) right.verify_tree(); impl.reset(new implT(*left.get_impl(), left.get_pmap(), false)); + impl->world.gop.fence(); //<<<<<<<<<< perhaps unneccessary fence added by Robert impl->gaxpy(alpha,*left.get_impl(),beta,*right.get_impl(),fence); return *this; } From 1fbc872c95ab25c6c886cf2c92c944bbdafd749e Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 3 May 2019 09:40:30 -0400 Subject: [PATCH 0024/1312] code cleanup --- src/apps/moldft/DF.cc | 690 +++++------------------------------------- src/apps/moldft/DF.h | 5 +- 2 files changed, 81 insertions(+), 614 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 84b2c98b0b2..74a0fabe8d0 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -411,8 +411,6 @@ DF::DF(World & world,std::shared_ptr input) { } // Set some function defaults - //FunctionDefaults<3>::set_cubic_cell(-Init_params.L, Init_params.L); - //FunctionDefaults<3>::set_k(Init_params.order); FunctionDefaults<3>::set_thresh(DFparams.thresh); //Always use user-specified thresh FunctionDefaults<3>::set_truncate_mode(1); @@ -421,7 +419,6 @@ DF::DF(World & world,std::shared_ptr input) { FunctionDefaults<3>::set_k(DFparams.k); for(unsigned int i = 0; i < Init_params.num_occupied; i++){ for(unsigned int j = 0; j < 4; j++){ - //if(world.rank()==0) print(i,j); Init_params.orbitals[i][j] = project(Init_params.orbitals[i][j], FunctionDefaults<3>::get_k(), DFparams.thresh, false); } world.gop.fence(); @@ -430,7 +427,6 @@ DF::DF(World & world,std::shared_ptr input) { if(DFparams.job == 1){ for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ for(unsigned int j = 0; j < 4; j++){ - //if(world.rank()==0) print(i,j); Init_params.virtuals[i][j] = project(Init_params.virtuals[i][j], FunctionDefaults<3>::get_k(), DFparams.thresh, false); } world.gop.fence(); @@ -439,6 +435,7 @@ DF::DF(World & world,std::shared_ptr input) { } } + //Set local orbitals and energies to those from the archive energies = Init_params.energies; v_energies = Init_params.v_energies; occupieds = Init_params.orbitals; @@ -450,97 +447,6 @@ DF::DF(World & world,std::shared_ptr input) { } -//function to calculate the kinetic + rest energy expectation value using Dirac Hamiltonian c*\alpha*p+\Beta*m*c*c -double DF::rele(World& world, const Fcwf& psi){ - std::complex energy = 0.0; - double myc = 137.0359895; //speed of light in atomic units - std::complex myi(0,1); - complex_derivative_3d Dx(world,0); - complex_derivative_3d Dy(world,1); - complex_derivative_3d Dz(world,2); - Fcwf Tpsi(world); - complex_function_3d temp(world); - - Tpsi[0] = Dz(psi[2]) + Dx(psi[3]) - myi*Dy(psi[3]);// + myc*myi*psi[0]; - Tpsi[1] = Dx(psi[2]) + myi*Dy(psi[2]) - Dz(psi[3]);// + myc*myi*psi[1]; - Tpsi[2] = Dz(psi[0]) + Dx(psi[1]) - myi*Dy(psi[1]) - 2*myc*myi*psi[2]; - Tpsi[3] = Dx(psi[0]) + myi*Dy(psi[0]) - Dz(psi[1]) - 2*myc*myi*psi[3]; - - //The giant block below this exists because I was debugging - //some hung queues. I still don't know what's causing them - //but they occur in this function somewhere, somehow - - //if(world.rank()==0) print("a"); - //temp = Dz(psi[2]); - //world.gop.fence(); - //if(world.rank()==0) print("b"); - //temp += Dx(psi[3]); - //world.gop.fence(); - //if(world.rank()==0) print("c"); - //temp -= myi*Dy(psi[3]); - //world.gop.fence(); - //if(world.rank()==0) print("d"); - //temp += myc*myi*psi[0]; - //world.gop.fence(); - //if(world.rank()==0) print("e"); - //Tpsi[0] = copy(temp); - //world.gop.fence(); - - //if(world.rank()==0) print("f"); - //temp = Dx(psi[2]); - //world.gop.fence(); - //if(world.rank()==0) print("g"); - //temp += myi*Dy(psi[2]); - //world.gop.fence(); - //if(world.rank()==0) print("h"); - //temp -= Dz(psi[3]); - //world.gop.fence(); - //if(world.rank()==0) print("i"); - //temp += myc*myi*psi[1]; - //world.gop.fence(); - //if(world.rank()==0) print("j"); - //Tpsi[1] = copy(temp); - //world.gop.fence(); - // - //if(world.rank()==0) print("k"); - //temp = Dz(psi[0]); - //world.gop.fence(); - //if(world.rank()==0) print("l"); - //temp += Dx(psi[1]); - //world.gop.fence(); - //if(world.rank()==0) print("m"); - //temp -= myi*Dy(psi[1]); - //world.gop.fence(); - //if(world.rank()==0) print("n"); - //temp -= myc*myi*psi[2]; - //world.gop.fence(); - //if(world.rank()==0) print("o"); - //Tpsi[2] = copy(temp); - //world.gop.fence(); - // - //if(world.rank()==0) print("p"); - //temp = Dx(psi[0]); - //world.gop.fence(); - //if(world.rank()==0) print("q"); - //temp += myi*Dy(psi[0]); - //world.gop.fence(); - //if(world.rank()==0) print("r"); - //temp -= Dz(psi[1]); - //world.gop.fence(); - //if(world.rank()==0) print("s"); - //temp -= myc*myi*psi[3]; - //world.gop.fence(); - //if(world.rank()==0) print("t"); - //Tpsi[3] = copy(temp); - //world.gop.fence(); - //if(world.rank()==0) print("u"); - - energy = inner(psi, Tpsi); - energy *= -1.0*myi*myc; - - return energy.real(); -} - //returns a new Fcwf that is the result of applying the Dirac free-particle hamiltonian on psi Fcwf apply_T(World& world, Fcwf& psi){ double myc = 137.0359895; //speed of light in atomic units @@ -570,44 +476,18 @@ Fcwf apply_T(World& world, Fcwf& psi){ Tpsi[2] = psiz[0] + psix[1] - myi*psiy[1] - 2*myc*myi*psi[2]; Tpsi[3] = psix[0] + myi*psiy[0] - psiz[1] - 2*myc*myi*psi[3]; - //Tpsi[0] = Dz(psi[2]) + Dx(psi[3]) - myi*Dy(psi[3]);// + myc*myi*psi[0]; - //Tpsi[1] = Dx(psi[2]) + myi*Dy(psi[2]) - Dz(psi[3]);// + myc*myi*psi[1]; - //Tpsi[2] = Dz(psi[0]) + Dx(psi[1]) - myi*Dy(psi[1]) - 2*myc*myi*psi[2]; - //Tpsi[3] = Dx(psi[0]) + myi*Dy(psi[0]) - Dz(psi[1]) - 2*myc*myi*psi[3]; - return Tpsi * (-myi*myc); } -////Calculates K*psi for each psi in the orbitals vector and stores them in result -//void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsis){ -// //start timer -// start_timer(world); -// -// complex_function_3d temp(world); -// -// unsigned int n = Init_params.num_occupied; -// for(unsigned int i = 0; i < n; i++){ -// for(unsigned int j = 0; j < n ; j++){ -// temp = inner_func(world,occupieds[j],occupieds[i]); -// temp.truncate(); -// -// temp = apply(op,temp); -// if(j == 0){ -// Kpsis[i] = occupieds[j]*temp; -// } -// else{ -// Kpsis[i] += occupieds[j]*temp; -// } -// } -// -// //here too -// Kpsis[i].truncate(); -// } -// -// //Report time -// Tensor times = end_timer(world); -// if(world.rank()==0) print(" ", times[0]); -//} +//function to calculate the kinetic + rest energy expectation value using Dirac Hamiltonian c*\alpha*p+\Beta*m*c*c +double DF::rele(World& world, Fcwf& psi){ + Fcwf Tpsi = apply_T(world, psi); + + std::complex energy = inner(psi, Tpsi); + + return energy.real(); +} + //Calculates K*psi for each psi in the orbitals vector and stores them in result void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsis){ //start timer @@ -623,20 +503,9 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi occupieds[i].reconstruct(); } - //form occupied orbitals into 4 vectors of components - unsigned int n = Init_params.num_occupied; - //std::vector occupieds0(n); - //std::vector occupieds1(n); - //std::vector occupieds2(n); - //std::vector occupieds3(n); - //for(unsigned int i = 0; i < n; i++){ - // occupieds0[i] = occupieds[i][0]; - // occupieds1[i] = occupieds[i][1]; - // occupieds2[i] = occupieds[i][2]; - // occupieds3[i] = occupieds[i][3]; - //} //Calculate and accumulate exchange contributions + unsigned int n = Init_params.num_occupied; for(unsigned int i = 0; i < n; i++){ std::vector temp(n-i); @@ -661,23 +530,28 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi gaxpy(world, 1.0, temp, 1.0, occupieds[i][2]*conj(world,temp2)); gaxpy(world, 1.0, temp, 1.0, occupieds[i][3]*conj(world,temp3)); - if(world.rank()==0) print("Starting apply phase in K"); + if(world.rank()==0) print(i, "Starting apply phase in K"); temp = apply(world, op, temp); - if(world.rank()==0) print("Exiting apply phase in K"); + if(world.rank()==0) print(i, "Exiting apply phase in K"); Kpsis[i][0] += sum(world, mul(world, temp, temp0)); Kpsis[i][1] += sum(world, mul(world, temp, temp1)); Kpsis[i][2] += sum(world, mul(world, temp, temp2)); Kpsis[i][3] += sum(world, mul(world, temp, temp3)); + if(world.rank()==0) print(i, "Exiting sum block in K"); + temp = conj(world, temp); temp0 = occupieds[i][0]*temp; temp1 = occupieds[i][1]*temp; temp2 = occupieds[i][2]*temp; temp3 = occupieds[i][3]*temp; + + if(world.rank()==0) print(i, "Entering final loop in K"); + for(unsigned int j = i+1; j < n; j++){ Kpsis[j][0] += temp0[j-i]; Kpsis[j][1] += temp1[j-i]; @@ -685,42 +559,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi Kpsis[j][3] += temp3[j-i]; } - - //for(unsigned int j = i; j < n ; j++){ //parallelize this loop using 4-vectors approach - - // /*TODO (vector inner_func) - // * loop over 4 component indices - // * gather the n-i+1 (here, index j) functions for the component index - // * vector multiply by occupieds[i] component - // * accumulate result - // * truncate - // */ - - - // //load balance like in SCF.cc KE routine - - - // temp = inner_func(world,occupieds[j],occupieds[i]); - // temp.truncate(); - - // temp = apply(op,temp); - // if(i == 0 && j == 0){ - // Kpsis[i] = occupieds[j]*temp; - // } - // else if(i == 0){ - // Kpsis[i] += occupieds[j]*temp; - // temp = temp.conj(); - // Kpsis[j] = occupieds[i]*temp; - // } - // else if(i == j){ - // Kpsis[i] += occupieds[j]*temp; - // } - // else{ - // Kpsis[i] += occupieds[j]*temp; - // temp = temp.conj(); - // Kpsis[j] += occupieds[i]*temp; - // } - //} + if(world.rank()==0) print(i, "Exiting final loop in K"); Kpsis[i].truncate(); } @@ -730,6 +569,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi if(world.rank()==0) print(" ", times[0]); } +//This function is old an only used in the virtual solver (that doesn't work) Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ complex_function_3d temp(world); Fcwf result(world); @@ -768,9 +608,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o start_timer(world); ////Form the Fock Matrix - //first apply Fock operator to all orbitals - // - + //calculate coulomb part if(world.rank() == 0) print(" Adding (V+J)psi"); real_function_3d rho = real_factory_3d(world); @@ -778,37 +616,6 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o rho += squaremod(occupieds[j]); } - //---------------------------------------------------------------------------------------------------------- - //DEBUGGING: Print each matrix that goes into the Fock matrix - - //real_function_3d fred = apply(op,rho); - //for(unsigned int j = 0; j < n; j++){ - // temp_orbitals.push_back(occupieds[j]*fred); //add in coulomb term - //} - //fock = matrix_inner(world, occupieds, temp_orbitals); - //if(world.rank()==0) print("J:\n",fock); - - //for(unsigned int j = 0; j < n; j++){ - // temp_orbitals[j] = occupieds[j]*myV; - //} - //fock = matrix_inner(world, occupieds, temp_orbitals); - //if(world.rank()==0) print("V:\n",fock); - - // - //for(unsigned int j = 0; j < n; j++){ - // temp_orbitals[j] = Kpsis[j]*(-1.0); - //} - //fock = matrix_inner(world, occupieds, temp_orbitals); - //if(world.rank()==0) print("-K:\n",fock); - - //for(unsigned int j = 0; j < n; j++){ - // temp_orbitals[j] = apply_T(world, occupieds[j]); - //} - //fock = matrix_inner(world, occupieds, temp_orbitals); - //if(world.rank()==0) print("T:\n",fock); - //END DEBUGGING - //---------------------------------------------------------------------------------------------------------- - //TODO: Here try moving the apply out to operate on the sum of the nuclear and electronic charge distributions real_function_3d potential = myV + apply(op,rho); potential.truncate(); @@ -816,7 +623,6 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //add in coulomb parts to neworbitals for(unsigned int j = 0; j < n; j++){ temp_orbitals.push_back(occupieds[j]*potential); //add in coulomb term - //temp_orbitals[j] = occupieds[j]*potential; } if(world.rank() == 0) print(" Subtracting K*psi"); @@ -834,65 +640,16 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" Integrating to form Fock Matrix"); start_timer(world); - //We now have a vector of F*psi for each psi (in neworbitals). - //Calculate each element of the fock matrix - // - //New method: Make a matrix for each component and add the matrices. This facilitates the - //use of the new inner product - // - //1) Create four std::vectors each from occupieds and temp_orbitals, one for each component - //2) Call the new matrix inner for each component. Result in each case gives a matrix - //3) Sum all the matrices - //std::vector occupieds_1; - //std::vector occupieds_2; - //std::vector occupieds_3; - //std::vector occupieds_4; - //std::vector temp_orbitals_1; - //std::vector temp_orbitals_2; - //std::vector temp_orbitals_3; - //std::vector temp_orbitals_4; - //for(unsigned int i = 0; i < n; i++){ - // occupieds_1.push_back(occupieds[i][0]); - // occupieds_2.push_back(occupieds[i][1]); - // occupieds_3.push_back(occupieds[i][2]); - // occupieds_4.push_back(occupieds[i][3]); - // temp_orbitals_1.push_back(temp_orbitals[i][0]); - // temp_orbitals_2.push_back(temp_orbitals[i][1]); - // temp_orbitals_3.push_back(temp_orbitals[i][2]); - // temp_orbitals_4.push_back(temp_orbitals[i][3]); - //} - //Tensor> component1 = matrix_inner(world,occupieds_1,temp_orbitals_1); - //Tensor> component2 = matrix_inner(world,occupieds_2,temp_orbitals_2); - //Tensor> component3 = matrix_inner(world,occupieds_3,temp_orbitals_3); - //Tensor> component4 = matrix_inner(world,occupieds_4,temp_orbitals_4); - - //fock = component1+component2+component3+component4; + //Now compute the fock matrix fock = matrix_inner(world, occupieds, temp_orbitals); - //Old Method here: - //for(unsigned int j = 0; j < n; j++){ - // for(unsigned int k = 0; k < n; k++){ - // fock(j,k) = inner(occupieds[j],temp_orbitals[k]); - // } - //} - Tensor times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - ////Form the overlap matrix + ////and the overlap matrix if(world.rank()==0) print(" Integrating to form Overlap Matrix"); start_timer(world); - //for(unsigned int j = 0; j < n; j++){ - // for(unsigned int k = 0; k < n; k++){ - // overlap(j,k) = inner(occupieds[j],occupieds[k]); - // } - //} - //component1 = matrix_inner(world,occupieds_1,occupieds_1); - //component2 = matrix_inner(world,occupieds_2,occupieds_2); - //component3 = matrix_inner(world,occupieds_3,occupieds_3); - //component4 = matrix_inner(world,occupieds_4,occupieds_4); - //overlap = component1 + component2 + component3 + component4; overlap = matrix_inner(world,occupieds,occupieds); times = end_timer(world); @@ -906,7 +663,6 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o // print("\noverlap:\n", overlap); //} - if(world.rank()==0) print(" Eigensolver"); start_timer(world); @@ -917,12 +673,6 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //debugging: print matrix of eigenvectors //if(world.rank()==0) print("U:\n", U); - //if(world.rank()==0) { - // print("evals:"); - // for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - // print(evals[j] - 137.0359895*137.0359895); - // } - //} //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. if(world.rank()==0) print(" Removing Rotations"); @@ -930,14 +680,13 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o double thresh_degenerate = DFparams.thresh*10.0; double csquared = 137.0359895*137.0359895; //electron rest energy + //swap columns for a diagonally dominant matrix bool switched = true; while (switched) { switched = false; for (unsigned int kk = 0; kk < Init_params.num_occupied; kk++) { for (unsigned int j = kk + 1; j < Init_params.num_occupied; j++) { - //double sold = std::norm(U(kk, kk)) + std::norm(U(j, j)); - //double snew = std::norm(U(kk, j)) + std::norm(U(j, kk)); double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); //if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { @@ -978,7 +727,6 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0){ print(" found cluster from ", ilo + 1, " to " , ihi + 1); for(unsigned int kk = ilo; kk <= ihi; kk++){ - //print(" ",evals[kk] - csquared); print(" ",evals[kk]); } } @@ -991,6 +739,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o Tensor sigma(nclus); svd(q, W, sigma, VH); + //W*VH is the rotation part of q. Undo it by taking the adjoint and right-multiplying q = conj_transpose(inner(W,VH)); U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); @@ -1003,74 +752,16 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //if(world.rank()==0) print("U:\n", U); - fock = inner(conj_transpose(U), inner(fock, U)); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - //if(world.rank()==0)print("\n U^* F U:\n",fock,"\n"); if(world.rank()==0) print(" Applying Transformation"); start_timer(world); ////Apply the transformation to the Exchange - //for(unsigned int j = 0; j < n; j++){ - // temp_orbitals[j] = Fcwf(world); - // for(unsigned int k = 0; k < n; k++){ - // temp_orbitals[j] += Kpsis[k]*U(k,j); - // } - //} - //for(unsigned int m = 0; m < n; m++){ - // Kpsis[m] = temp_orbitals[m]; - //} - - //Trying a different method of applying the transformation, using vmra's transform - //for(unsigned int i = 0; i < n; i++){ - // temp_orbitals_1[i] = Kpsis[i][0]; - // temp_orbitals_2[i] = Kpsis[i][1]; - // temp_orbitals_3[i] = Kpsis[i][2]; - // temp_orbitals_4[i] = Kpsis[i][3]; - //} - //temp_orbitals_1 = transform(world, temp_orbitals_1, U); - //temp_orbitals_2 = transform(world, temp_orbitals_2, U); - //temp_orbitals_3 = transform(world, temp_orbitals_3, U); - //temp_orbitals_4 = transform(world, temp_orbitals_4, U); - //for(unsigned int i = 0; i < n; i++){ - // Kpsis[i][0] = temp_orbitals_1[i]; - // Kpsis[i][1] = temp_orbitals_2[i]; - // Kpsis[i][2] = temp_orbitals_3[i]; - // Kpsis[i][3] = temp_orbitals_4[i]; - //} - transform(world, Kpsis, U); - ////Apply the transformation to the orbitals - //for(unsigned int j = 0; j < n; j++){ - // temp_orbitals[j] = Fcwf(world); - // for(unsigned int k = 0; k < n; k++){ - // temp_orbitals[j] += occupieds[k]*U(k,j); - // } - //} - //for(unsigned int j = 0; j < n; j++){ - // occupieds[j] = temp_orbitals[j]; - //} - - //Trying a different method of applying the transformation, using vmra's transform - //for(unsigned int i = 0; i < n; i++){ - // temp_orbitals_1[i] = occupieds[i][0]; - // temp_orbitals_2[i] = occupieds[i][1]; - // temp_orbitals_3[i] = occupieds[i][2]; - // temp_orbitals_4[i] = occupieds[i][3]; - //} - //temp_orbitals_1 = transform(world, temp_orbitals_1, U); - //temp_orbitals_2 = transform(world, temp_orbitals_2, U); - //temp_orbitals_3 = transform(world, temp_orbitals_3, U); - //temp_orbitals_4 = transform(world, temp_orbitals_4, U); - //for(unsigned int i = 0; i < n; i++){ - // occupieds[i][0] = temp_orbitals_1[i]; - // occupieds[i][1] = temp_orbitals_2[i]; - // occupieds[i][2] = temp_orbitals_3[i]; - // occupieds[i][3] = temp_orbitals_4[i]; - //} - + ////Apply the transformation to the orbitals transform(world, occupieds, U); @@ -1079,9 +770,6 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - //Debugging? Let's try setting energies to evals like we're supposed to. - //energies = evals; - } //returns a vector of orthonormal Fcwfs constructed from the input vector of Fcwfs @@ -1105,17 +793,12 @@ std::vector orthogonalize(World& world, std::vector orbitals){ } //faster orthogonalize that modifies the input functions in place -//Make this a member function of DF //TODO: The function below mimics one from SCF.cc. In the future we will probably want a different variant (which also should exist in SCF.cc or somwhere like that) that treats core and valence orbitals differently: i.e. doesn't mix valence orbitals into the core orbitals void DF::orthogonalize_inplace(World& world){ unsigned int n = occupieds.size(); double maxq; - //Debugging: original overlap matrix for comparison - //Tensor> overlap = matrix_inner(world, occupieds, occupieds); - //if(world.rank()==0) print("\noriginal overlap:\n", overlap); - //normalize beforehand for(unsigned int i = 0; i < n; i++){ occupieds[i].normalize(); @@ -1138,12 +821,9 @@ void DF::orthogonalize_inplace(World& world){ occupieds[i].normalize(); } - //Debugging: print new overlap matrix - //overlap = matrix_inner(world, occupieds, occupieds); - //if(world.rank()==0) print("\nnew overlap:\n", overlap); - } +//This is an old function for virtual orbitals that probably doesn't work anymore //Different diagonalize function that doesn't try to calculate a coulomb part internally Tensor DF::diagonalize_virtuals(World& world, real_function_3d& JandV,real_convolution_3d& op, std::vector& Kpsis){ @@ -1321,7 +1001,6 @@ Tensor DF::diagonalize_virtuals(World& world, real_function_3d& JandV,re } //Apply's Green's function to Vpsi (a Fcwf). Overwrites Vpsi with new Fcwf -//double iterate(World& world, complex_function_3d& V, Fcwf& psi, double& eps){ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thresh){ @@ -1337,12 +1016,11 @@ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr //if(world.rank() == 0) print("Hi, this is apply_BSH! mu is: ", mu); //create gradient BSH operators - //TODO: make my own GradBSH that first computes BSH with a ridiculous lo, and then accumulates to CDelta, then need something intelligent for the derivative of that result world.gop.fence(); - //double ttt = wall_time(); + //create BSH operator if(world.rank()==0) print("mu: ", mu); - std::shared_ptr op = std::shared_ptr(BSHOperatorPtr3D(world, mu,small,thresh)); // Finer length scale and accuracy control + std::shared_ptr op = std::shared_ptr(BSHOperatorPtr3D(world, mu,small,thresh)); std::vector>> op3 = GradBSHOperator(world, mu, small, thresh); //std::vector>> op3 = GradBSHOperator_Joel(world, mu, 1e-8, thresh); std::vector>> allops(16); @@ -1353,12 +1031,6 @@ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr allops[12+i] = op3[2]; } - - //world.gop.fence(); - //ttt = wall_time() - ttt; - //if(world.rank()==0) print(" create operators:", ttt); - - //create intermediate functions necessary to compute new components //ttt = wall_time(); std::vector temp(16); @@ -1369,18 +1041,7 @@ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr temp[12+i] = Vpsi[i]; } - //Fcwf oppsi = apply(world, op, Vpsi); //BSH(Vpsi) - //Fcwf oppsix = apply(world, *op3[0], Vpsi); //GradBSH_x(Vpsi) - //Fcwf oppsiy = apply(world, *op3[1], Vpsi); //GradBSH_y(Vpsi) - //Fcwf oppsiz = apply(world, *op3[2], Vpsi); //GradBSH_z(Vpsi) temp = apply(world, allops, temp); - //world.gop.fence(); - //ttt = wall_time() - ttt; - //if(world.rank()==0) print(" create derivatives:", ttt); - //manually compute new components of wavefunction. See Blackledge paper and any definition of the Dirac single-particle Hamiltonian - //ttt = wall_time(); - - //build transformation tensor Tensor> U(16,4); @@ -1390,38 +1051,19 @@ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr U(4,3) = -ic; U(8,3) = myc; U(13,3) = ic; U(3,3) = eps-c2; U *= (1.0/c2); - ////build vector to be transformed - //std::vector temp(16); - //temp[0] = oppsi[0]; temp[1] = oppsi[1]; temp[2] = oppsi[2]; temp[3] = oppsi[3]; - //temp[4] = oppsix[0]; temp[5] = oppsix[1]; temp[6] = oppsix[2]; temp[7] = oppsix[3]; - //temp[8] = oppsiy[0]; temp[9] = oppsiy[1]; temp[10] = oppsiy[2]; temp[11] = oppsiy[3]; - //temp[12] = oppsiz[0]; temp[13] = oppsiz[1]; temp[14] = oppsiz[2]; temp[15] = oppsiz[3]; - + //Apply transformation tensor and store back in Vpsi temp = transform(world, temp, U); Vpsi[0] = temp[0]; Vpsi[1] = temp[1]; Vpsi[2] = temp[2]; Vpsi[3] = temp[3]; - //Vpsi[0] = myc*myc*oppsi[0]-myi*myc*oppsiz[2]-myi*myc*(oppsix[3]-myi*oppsiy[3]); - //Vpsi[1] = myc*myc*oppsi[1]-myi*myc*(oppsix[2]+myi*oppsiy[2])+myi*myc*oppsiz[3]; - //Vpsi[2] = -myi*myc*oppsiz[0]-myi*myc*(oppsix[1]-myi*oppsiy[1])-myc*myc*oppsi[2]; - //Vpsi[3] = -myi*myc*(oppsix[0]+myi*oppsiy[0])+myi*myc*oppsiz[1]-myc*myc*oppsi[3]; - ////finish up application of the dirac green's function - //Vpsi = (Vpsi+(oppsi*eps))*(1.0/(myc*myc)); - - - - - //Vpsi.normalize(); //Don't want to do this because it messes with the equation KAIN is trying to solve. - //world.gop.fence(); - //ttt = wall_time() - ttt; - //if(world.rank()==0) print(" apply transformation:", ttt); - } //Apply's Green's function to Vpsi (a Fcwf). Overwrites Vpsi with new Fcwf -//double iterate(World& world, complex_function_3d& V, Fcwf& psi, double& eps){ +// +//Instead of using the derivative of the Green's function, first applies the +//nonrelativistic Green's function, then applied (H_D + eps) to the result void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& thresh){ @@ -1432,116 +1074,20 @@ void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& std::complex ic = myi*myc; //calculate exponent for equivalent BSH operator - //double mu = std::sqrt((myc*myc*myc*myc-eps*eps)/myc/myc); double mu = std::sqrt(-(2*eps*c2+eps*eps)/c2); - //if(world.rank()==0) print("in apply, mu = ", mu); - //create gradient BSH operators - //TODO: make my own GradBSH that first computes BSH with a ridiculous lo, and then accumulates to CDelta, then need something intelligent for the derivative of that result world.gop.fence(); - //double ttt = wall_time(); - //create BSH operator - //if(world.rank()==0) print("mu: ", mu); + //create BSH operator real_convolution_3d op = BSHOperator3D(world, mu,small,thresh); // Finer length scale and accuracy control + //Apply BSH operator to Vpsi Vpsi = apply(world, op, Vpsi); - Vpsi = (apply_T(world, Vpsi) + Vpsi * (eps+2*c2)) * (1.0/c2); - - //Vpsi = apply(world, op, apply_T(world, Vpsi) + Vpsi * eps) * (1.0/c2); - - //std::vector>> op3 = GradBSHOperator(world, mu, 1e-8, thresh); - //std::vector>> op3 = GradBSHOperator_Joel(world, mu, 1e-8, thresh); - //std::vector>> allops(16); - //for(unsigned int i = 0; i < 4; i++){ - // allops[i] = op; - // allops[4+i] = op3[0]; - // allops[8+i] = op3[1]; - // allops[12+i] = op3[2]; - //} - - - //world.gop.fence(); - //ttt = wall_time() - ttt; - //if(world.rank()==0) print(" create operators:", ttt); - - - //create intermediate functions necessary to compute new components - //ttt = wall_time(); - //std::vector temp(16); - //for(unsigned int i = 0; i < 4; i++){ - // temp[i] = Vpsi[i]; - // temp[4+i] = Vpsi[i]; - // temp[8+i] = Vpsi[i]; - // temp[12+i] = Vpsi[i]; - //} - - //Fcwf oppsi = apply(world, op, Vpsi); //BSH(Vpsi) - //Fcwf oppsix = apply(world, *op3[0], Vpsi); //GradBSH_x(Vpsi) - //Fcwf oppsiy = apply(world, *op3[1], Vpsi); //GradBSH_y(Vpsi) - //Fcwf oppsiz = apply(world, *op3[2], Vpsi); //GradBSH_z(Vpsi) - //temp = apply(world, allops, temp); - //world.gop.fence(); - //ttt = wall_time() - ttt; - //if(world.rank()==0) print(" create derivatives:", ttt); - //manually compute new components of wavefunction. See Blackledge paper and any definition of the Dirac single-particle Hamiltonian - //ttt = wall_time(); - - - - //build transformation tensor - //Tensor> U(16,4); - //U(0,0) = c2+eps; U(14,0) = -ic; U(7,0) = -ic; U(11,0) = -myc; - //U(1,1) = c2+eps; U(6,1) = -ic; U(10,1) = myc; U(15,1) = ic; - //U(12,2) = -ic; U(5,2) = -ic; U(9,2) = -myc; U(2,2) = eps-c2; - //U(4,3) = -ic; U(8,3) = myc; U(13,3) = ic; U(3,3) = eps-c2; - //U *= (1.0/c2); - - ////build vector to be transformed - //std::vector temp(16); - //temp[0] = oppsi[0]; temp[1] = oppsi[1]; temp[2] = oppsi[2]; temp[3] = oppsi[3]; - //temp[4] = oppsix[0]; temp[5] = oppsix[1]; temp[6] = oppsix[2]; temp[7] = oppsix[3]; - //temp[8] = oppsiy[0]; temp[9] = oppsiy[1]; temp[10] = oppsiy[2]; temp[11] = oppsiy[3]; - //temp[12] = oppsiz[0]; temp[13] = oppsiz[1]; temp[14] = oppsiz[2]; temp[15] = oppsiz[3]; - - //temp = transform(world, temp, U); - //Vpsi[0] = temp[0]; - //Vpsi[1] = temp[1]; - //Vpsi[2] = temp[2]; - //Vpsi[3] = temp[3]; - - //Vpsi[0] = myc*myc*oppsi[0]-myi*myc*oppsiz[2]-myi*myc*(oppsix[3]-myi*oppsiy[3]); - //Vpsi[1] = myc*myc*oppsi[1]-myi*myc*(oppsix[2]+myi*oppsiy[2])+myi*myc*oppsiz[3]; - //Vpsi[2] = -myi*myc*oppsiz[0]-myi*myc*(oppsix[1]-myi*oppsiy[1])-myc*myc*oppsi[2]; - //Vpsi[3] = -myi*myc*(oppsix[0]+myi*oppsiy[0])+myi*myc*oppsiz[1]-myc*myc*oppsi[3]; - ////finish up application of the dirac green's function - //Vpsi = (Vpsi+(oppsi*eps))*(1.0/(myc*myc)); - + //Apply (1/c^2)(H_D + eps) to Vpsi. Using apply_T for convenience, but this requires adding 2c^2Vpsi + Vpsi = (apply_T(world, Vpsi) + Vpsi * (eps+2*c2)) * (1.0/c2); - - //Vpsi.normalize(); //Don't want to do this because it messes with the equation KAIN is trying to solve. - //world.gop.fence(); - //ttt = wall_time() - ttt; - //if(world.rank()==0) print(" apply transformation:", ttt); - -} - -// Prints norms of the given vector of functions -void DF::print_norms(World & world, - std::vector f) -{ - // Container - Tensor norms(f.size()); - - // Calc the norms - for(unsigned int i = 0; i < f.size(); i++){ - norms(i) = f[i].norm2(); - } - - // Print em in a smart way - if(world.rank() == 0) print(norms); } // Small function to print geometry of a molecule nicely @@ -1578,44 +1124,6 @@ void DF::print_molecule(World &world) } } -// Generates initial guess functions from nonrelativistic orbitals. Note that -// The length of the returned vector is twice that of the input vector -std::vector to_fcwfs(World & world, std::vector & orbitals){ - // Get size - unsigned int n = orbitals.size(); - - complex_function_3d complexreader; - std::vector result; - Fcwf spinup(world); - Fcwf spindown(world); - - //Loop over input orbitals - for(unsigned int i = 0; i < n; i++){ - complexreader = function_real2complex(orbitals[i]); - spinup = Fcwf(copy(complexreader), complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); - spindown = Fcwf(complex_factory_3d(world), copy(complexreader), complex_factory_3d(world), complex_factory_3d(world)); - result.push_back(spinup); - result.push_back(spindown); - - } - - return result; - -} - -//Duplicates the energies in a vector of energies and adds the electron rest energy to each -Tensor make_initial_energies(Tensor energies){ - int n = energies.size(); - Tensor result(2*n); - double csquared = 137.0359895*137.0359895; //electron rest energy - double temp; - for(int i = 0; i < n; i++){ - temp = energies(i) + csquared; - result(2*i) = temp; - result(2*i+1) = temp; //energies get repeated because we double the number of orbitals - } - return result; -} void DF::saveDF(World& world){ Tensor times = get_times(world); @@ -1760,16 +1268,13 @@ void DF::make_component_logplots(World& world, const char* filename1, const char } -//Heavily editing this to debug void DF::make_density_lineplots(World& world, const char* filename, int npt, double endpnt){ std::vector densities; real_function_3d zero(world); for(unsigned int i=0; i < Init_params.num_occupied; i++){ densities.push_back(squaremod(occupieds[i])); - //densities.push_back(copy(zero)); } - //double h = Init_params.L*(1.0/(npt-1)); double h = endpnt*(1.0/(npt-1)); for(unsigned int i=0; i < Init_params.num_occupied; i++){ densities[i].reconstruct(); @@ -1808,19 +1313,10 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea bool iterate_again = false; //Assume iterations will stop - //Diagonalize, but not on the first iteration, unless it's a restarted job - //if(iteration_number != 1 or DFparams.restart){ - // diagonalize(world, V, op, Kpsis); - // //update JandV - // for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - // rho += squaremod(occupieds[kk]); - // } - // JandV = V + apply(op,rho); - //} - - //Actually let's see what happens if I always diagonalize. Answer: still messes up first iteration - //Returning to this idea since it turns out I wasn't updating JandV... + //Diagonalize diagonalize(world, V, op, Kpsis); + + //Diagonalization forces us to recompute J for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ rho += squaremod(occupieds[kk]); } @@ -1834,17 +1330,6 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea double maxresidual = -1.0; for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - //Debugging - //std::vector temporbitalnorms(4); - //if(world.rank()==0) print("\nbefore:"); - //for(unsigned int l = 0; l < 4; l++) temporbitalnorms[l] = occupieds[j][l].norm2(); - //if(world.rank()==0) { - // print(" ", temporbitalnorms[0]); - // print(" ", temporbitalnorms[1]); - // print(" ", temporbitalnorms[2]); - // print(" ", temporbitalnorms[3]); - //} - //construct the function to which we will apply the BSH occupieds[j].truncate(); temp_function = occupieds[j]*JandV; @@ -1853,41 +1338,18 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea temp_function.truncate(); //temp_function now holds (K-V-J)psi, so apply the BSH - //apply_BSH(world, temp_function, energies[j], DFparams.small, DFparams.thresh); apply_BSH_new(world, temp_function, energies[j], DFparams.small, DFparams.thresh); - - //if(world.rank()==0) print("after:"); - //for(unsigned int l = 0; l < 4; l++) temporbitalnorms[l] = temp_function[l].norm2(); - //if(world.rank()==0) { - // print(" ", temporbitalnorms[0]); - // print(" ", temporbitalnorms[1]); - // print(" ", temporbitalnorms[2]); - // print(" ", temporbitalnorms[3]); - // print("\n"); - //} - - //debugging: Look at size of function before and after truncating here to see what it's doing - //std::size_t funcsize = temp_function[0].size(); - //funcsize += temp_function[1].size(); - //funcsize += temp_function[2].size(); - //funcsize += temp_function[3].size(); - //if(world.rank()==0) print(" size after BSH:", funcsize); - - temp_function.truncate(); //try truncating here - - //funcsize = temp_function[0].size(); - //funcsize += temp_function[1].size(); - //funcsize += temp_function[2].size(); - //funcsize += temp_function[3].size(); - //if(world.rank()==0) print(" size after truncate:", funcsize); - + //truncate + temp_function.truncate(); + //Now calculate the residual - //temp_function = occupieds[j] - temp_function; residualnorm = (occupieds[j] - temp_function).norm2(); //Print residual norm to keep track if(world.rank()==0) printf(" Orbital: %3i, Resid: %.10e\n",j+1, residualnorm); + + //Compare so that at the end we know the max residual maxresidual = std::max(maxresidual, residualnorm); //If the norm is big enough, we'll need to iterate again. @@ -1898,7 +1360,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea Residuals.push_back(occupieds[j] - temp_function); } else{ - occupieds[j] = temp_function; + occupieds[j] = temp_function; //if not using KAIN, then just use the new orbital } } if(world.rank()==0) printf(" max Resid: %.10e\n",maxresidual); @@ -1914,9 +1376,13 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //occupieds = kainsolver.update(occupieds, Residuals); //Replace above line with kain + step restriction - Residuals = kainsolver.update(occupieds, Residuals); //Using Residuals for new orbitals to save storage + Residuals = kainsolver.update(occupieds, Residuals); //Using Residuals for updated orbitals to save storage for(unsigned int i=0; i < Init_params.num_occupied; i++){ + + //see how big of a step KAIN took for each orbital residualnorm = (occupieds[i]-Residuals[i]).norm2(); + + //Restrict the step taken by KAIN if it's took big if(residualnorm > DFparams.maxrotn){ double s = DFparams.maxrotn / residualnorm; if(world.rank()==0) print(" restricting step for orbital: ", i+1); @@ -1931,23 +1397,25 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) print(" ", times[0]); } - //truncate here + //truncate for(unsigned int i = 0; i < Init_params.num_occupied; i++) occupieds[i].truncate(); //orthogonalize if(world.rank()==0) print("\n***Orthonormalizing***"); start_timer(world); - //occupieds = orthogonalize(world,occupieds); + orthogonalize_inplace(world); + //truncate here and normalize again for(unsigned int i = 0; i < Init_params.num_occupied; i++){ occupieds[i].truncate(); occupieds[i].normalize(); } + times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - //calculate new exchange + //calculate new exchange. Has timer built in. if(world.rank()==0) print("\n***Recalculating Exchange***"); exchange(world, op, Kpsis); @@ -1967,7 +1435,9 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0){ print("\n***Printing Current Energies***"); } + start_timer(world); + double kinetic_energy = 0.0; double coulomb_energy = 0.0; double exchange_energy = 0.0; @@ -1980,20 +1450,13 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea real_function_3d Jop = apply(op,rho); - //if(world.rank()==0) print(" Recalculating Energies"); + //Compute kinetic energy contribution for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - - //if(world.rank()==0) print(" Adding terms for orbital ", j); energies[j] = rele(world,occupieds[j]); - - //kinetic_energy += (energies[j] - myc*myc); kinetic_energy += (energies[j]); - //if(world.rank()==0) print(" Kinetic done."); } - //temp_function = occupieds[j]*V; - //nuclear_attraction_energy_correction = real(inner(occupieds[j],temp_function)); - //nuclear_attraction_energy += nuclear_attraction_energy_correction; + //Compute electron-nuclear attraction energy contribution, taking advantage of vmra's inner std::vector occupieds1(Init_params.num_occupied); std::vector occupieds2(Init_params.num_occupied); std::vector occupieds3(Init_params.num_occupied); @@ -2009,22 +1472,15 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea nuclear_attraction_tensor += real(inner(world,occupieds3,mul(world,V,occupieds3))); nuclear_attraction_tensor += real(inner(world,occupieds4,mul(world,V,occupieds4))); nuclear_attraction_energy = nuclear_attraction_tensor.sum(); - //if(world.rank()==0) print(" Nuclear Attraction done."); - //temp_function = occupieds[j]*Jop; - //coulomb_energy_correction = real(inner(occupieds[j],temp_function)); - //energies[j] += coulomb_energy_correction + nuclear_attraction_energy_correction; - //coulomb_energy += 0.5*coulomb_energy_correction; + //Compute electron-electron repulsion energy contribution, again using vmra coulomb_tensor = real(inner(world,occupieds1,mul(world,Jop,occupieds1))); coulomb_tensor += real(inner(world,occupieds2,mul(world,Jop,occupieds2))); coulomb_tensor += real(inner(world,occupieds3,mul(world,Jop,occupieds3))); coulomb_tensor += real(inner(world,occupieds4,mul(world,Jop,occupieds4))); coulomb_energy = 0.5*coulomb_tensor.sum(); - //if(world.rank()==0) print(" Coulomb Repulsion done."); - //exchange_energy_correction = real(inner(occupieds[j],Kpsis[j])); - //energies[j] -= exchange_energy_correction; - //exchange_energy += 0.5*exchange_energy_correction; + //Calculate Exchange energy contribution std::vector Kpsis1(Init_params.num_occupied); std::vector Kpsis2(Init_params.num_occupied); std::vector Kpsis3(Init_params.num_occupied); @@ -2040,11 +1496,14 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea exchange_tensor += real(inner(world,occupieds3,Kpsis3)); exchange_tensor += real(inner(world,occupieds4,Kpsis4)); exchange_energy = 0.5*exchange_tensor.sum(); - //if(world.rank()==0) print(" Exchange done."); + //Loop through energies and calculate their new values using the individual contributions + //(inside the "tensor" variables for(unsigned int i = 0; i < Init_params.num_occupied; i++){ energies[i] += nuclear_attraction_tensor[i]+coulomb_tensor[i] - exchange_tensor[i]; } + + //compute total energy total_energy = kinetic_energy + coulomb_energy - exchange_energy + nuclear_attraction_energy + nuclear_repulsion_energy; times = end_timer(world); @@ -2053,17 +1512,29 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Need r function to print r expectation values real_function_3d rfunc = real_factory_3d(world).f(myr); + //Loop through occupied orbitals. Calculate , number of coefficients, max depth. + //Print these along with updated energies for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + + //calculate double r_expec = std::real(inner(occupieds[j], occupieds[j]*rfunc)); + + //find number of coefficients int numcoeffs = occupieds[j][0].size() + occupieds[j][1].size() + occupieds[j][2].size() + occupieds[j][3].size(); + + //find maximum depth int maxdepth = std::max(occupieds[j][0].max_depth(), occupieds[j][1].max_depth()); maxdepth = std::max(int(occupieds[j][2].max_depth()), maxdepth); maxdepth = std::max(int(occupieds[j][3].max_depth()), maxdepth); + + //Print everything if(world.rank()==0){ - //printf(" Orbital: %3i, Energy: %.10e, : %8e, No. coeffs: %7i, Max depth: %3i\n",j+1, energies[j]-myc*myc, r_expec, numcoeffs, maxdepth); printf(" Orbital: %3i, Energy: %.10e, : %8e, No. coeffs: %7i, Max depth: %3i\n",j+1, energies[j], r_expec, numcoeffs, maxdepth); + } } + + //Print aggregate information if(world.rank()==0){ print("\n Kinetic Energy: ",kinetic_energy); print(" Coulomb Energy: ",coulomb_energy); @@ -2072,10 +1543,9 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea print(" Nuclear Repulsion Energy: ",nuclear_repulsion_energy); print(" Total Energy: ",total_energy); print(" Total Energy Residual: ", std::fabs(total_energy - old_total_energy)); - //print("Energy Convergence Threshold: " , DFparams.thresh*pow(10,floor(log10(std::fabs(total_energy)))),"\n"); } - //check total energy for convergence. the global variable thresh determines how many significant figures we look for + //check total energy for convergence. //if(std::fabs(total_energy-old_total_energy) > DFparams.thresh*pow(10,floor(log10(std::fabs(total_energy))))){ // iterate_again = true; //} diff --git a/src/apps/moldft/DF.h b/src/apps/moldft/DF.h index f8e48c73e9d..cecf155e797 100644 --- a/src/apps/moldft/DF.h +++ b/src/apps/moldft/DF.h @@ -74,7 +74,7 @@ class DF { std::shared_ptr input); // Pointer to input stream //Calculates the kinetic+rest energy expectation value of psi - double rele(World& world, const Fcwf& psi); + double rele(World& world, Fcwf& psi); //Applies the exchange operator to all of psis void exchange(World& world, real_convolution_3d& op, std::vector& Kpsis); @@ -88,9 +88,6 @@ class DF { //diagonalizes virtual orbitals. Transforms virtuals and Kpsis Tensor diagonalize_virtuals(World& world, real_function_3d& JandV,real_convolution_3d& op, std::vector& Kpsis); - //Prints norms of the given vector of functions. - void print_norms(World & world, std::vector f); - // Small function to print geometry of a molecule nicely // Straight up stolen from Bryan void print_molecule(World &world); From a4b43d64db250498beaac179a51a350792b011bd Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 15 May 2019 13:47:16 -0400 Subject: [PATCH 0025/1312] truncate mode fixed to 1 --- src/apps/moldft/DF.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 74a0fabe8d0..85f6104bdea 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -345,7 +345,7 @@ void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_functi for(unsigned int i = 0; i < num_atoms; i++){ Zlist[i] = Init_params.molecule.get_atom_number(i); FermiNucDistFunctor rho(Zlist[i], Rlist[i],DFparams.bohr_rad); - temp = real_factory_3d(world).functor(rho).truncate_mode(0); + temp = real_factory_3d(world).functor(rho).truncate_mode(1); tempnorm = temp.trace(); temp.scale(-Zlist[i]/tempnorm); if(i == 0){ @@ -1149,14 +1149,14 @@ void DF::saveDF(World& world){ void DF::make_gaussian_potential(World& world, real_function_3d& potential){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule, DFparams.bohr_rad); - potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(1).truncate_on_project(); } //Creates the nuclear potential from the molecule object. Also calculates the nuclear repulsion energy void DF::make_gaussian_potential(World& world, real_function_3d& potential, double& nuclear_repulsion_energy){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule,DFparams.bohr_rad); - potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(1).truncate_on_project(); std::vector Rlist = Vfunctor.get_Rlist(); std::vector Zlist = Vfunctor.get_Zlist(); nuclear_repulsion_energy = 0.0; From 335f7174d3441c4ac6c09a8d2a7190b320adc8b9 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 15 May 2019 20:13:36 -0400 Subject: [PATCH 0026/1312] initial changes --- src/apps/moldft/DF.cc | 33 +++++++++++++----------- src/apps/moldft/InitParameters.h | 16 ++++++------ src/apps/moldft/fcwf.cc | 43 ++++++++++++++++++++++++-------- 3 files changed, 58 insertions(+), 34 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 85f6104bdea..b47a550d28e 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -473,10 +473,10 @@ Fcwf apply_T(World& world, Fcwf& psi){ //combine to calculate application of T Tpsi[0] = psiz[2] + psix[3] - myi*psiy[3]; Tpsi[1] = psix[2] + myi*psiy[2] - psiz[3]; - Tpsi[2] = psiz[0] + psix[1] - myi*psiy[1] - 2*myc*myi*psi[2]; - Tpsi[3] = psix[0] + myi*psiy[0] - psiz[1] - 2*myc*myi*psi[3]; + Tpsi[2] = myc*(psiz[0] + psix[1] - myi*psiy[1] - 2*myi*psi[2]); + Tpsi[3] = myc*(psix[0] + myi*psiy[0] - psiz[1] - 2*myi*psi[3]); - return Tpsi * (-myi*myc); + return Tpsi * (-myi); } //function to calculate the kinetic + rest energy expectation value using Dirac Hamiltonian c*\alpha*p+\Beta*m*c*c @@ -506,6 +506,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //Calculate and accumulate exchange contributions unsigned int n = Init_params.num_occupied; + double myc = 137.0359895; //speed of light in atomic units for(unsigned int i = 0; i < n; i++){ std::vector temp(n-i); @@ -527,8 +528,8 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*conj(world,temp0)); gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*conj(world,temp1)); - gaxpy(world, 1.0, temp, 1.0, occupieds[i][2]*conj(world,temp2)); - gaxpy(world, 1.0, temp, 1.0, occupieds[i][3]*conj(world,temp3)); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*conj(world,temp2)); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*conj(world,temp3)); if(world.rank()==0) print(i, "Starting apply phase in K"); @@ -571,6 +572,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //This function is old an only used in the virtual solver (that doesn't work) Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ + throw; complex_function_3d temp(world); Fcwf result(world); @@ -658,10 +660,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print fock and overlap matrices - //if(world.rank()==0){ - // print("fock:\n", fock); - // print("\noverlap:\n", overlap); - //} + if(world.rank()==0){ + print("fock:\n", fock); + print("\noverlap:\n", overlap); + } if(world.rank()==0) print(" Eigensolver"); start_timer(world); @@ -774,6 +776,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //returns a vector of orthonormal Fcwfs constructed from the input vector of Fcwfs std::vector orthogonalize(World& world, std::vector orbitals){ + throw; int n = orbitals.size(); std::vector result; for(int i = 0; i < n; i++){ @@ -1469,15 +1472,15 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea } nuclear_attraction_tensor = real(inner(world,occupieds1,mul(world,V,occupieds1))); nuclear_attraction_tensor += real(inner(world,occupieds2,mul(world,V,occupieds2))); - nuclear_attraction_tensor += real(inner(world,occupieds3,mul(world,V,occupieds3))); - nuclear_attraction_tensor += real(inner(world,occupieds4,mul(world,V,occupieds4))); + nuclear_attraction_tensor += real(inner(world,occupieds3,mul(world,V,occupieds3)))*(1.0/(myc*myc)); + nuclear_attraction_tensor += real(inner(world,occupieds4,mul(world,V,occupieds4)))*(1.0/(myc*myc)); nuclear_attraction_energy = nuclear_attraction_tensor.sum(); //Compute electron-electron repulsion energy contribution, again using vmra coulomb_tensor = real(inner(world,occupieds1,mul(world,Jop,occupieds1))); coulomb_tensor += real(inner(world,occupieds2,mul(world,Jop,occupieds2))); - coulomb_tensor += real(inner(world,occupieds3,mul(world,Jop,occupieds3))); - coulomb_tensor += real(inner(world,occupieds4,mul(world,Jop,occupieds4))); + coulomb_tensor += real(inner(world,occupieds3,mul(world,Jop,occupieds3)))*(1.0/(myc*myc)); + coulomb_tensor += real(inner(world,occupieds4,mul(world,Jop,occupieds4)))*(1.0/(myc*myc)); coulomb_energy = 0.5*coulomb_tensor.sum(); //Calculate Exchange energy contribution @@ -1493,8 +1496,8 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea } exchange_tensor = real(inner(world,occupieds1,Kpsis1)); exchange_tensor += real(inner(world,occupieds2,Kpsis2)); - exchange_tensor += real(inner(world,occupieds3,Kpsis3)); - exchange_tensor += real(inner(world,occupieds4,Kpsis4)); + exchange_tensor += real(inner(world,occupieds3,Kpsis3))*(1.0/(myc*myc)); + exchange_tensor += real(inner(world,occupieds4,Kpsis4))*(1.0/(myc*myc)); exchange_energy = 0.5*exchange_tensor.sum(); //Loop through energies and calculate their new values using the individual contributions diff --git a/src/apps/moldft/InitParameters.h b/src/apps/moldft/InitParameters.h index 2ed6345b6d7..c3b42d1db07 100644 --- a/src/apps/moldft/InitParameters.h +++ b/src/apps/moldft/InitParameters.h @@ -106,16 +106,16 @@ namespace madness{ complexreader = function_real2complex(reader); spinup[0] = complexreader; spinup[1] = complex_factory_3d(world); - spinup[2] = (-myi/myc) * Dz(complexreader); + spinup[2] = (-myi) * Dz(complexreader); spinup[2].scale(0.5); - spinup[3] = (-myi/myc) * (Dx(complexreader) + myi * Dy(complexreader)); + spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); spinup[3].scale(0.5); spinup.normalize(); spindown[0] = complex_factory_3d(world); spindown[1] = complexreader; - spindown[2] = (-myi/myc) * (Dx(complexreader) - myi * Dy(complexreader)); + spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); spindown[2].scale(0.5); - spindown[3] = (myi/myc) * Dz(complexreader); + spindown[3] = (myi) * Dz(complexreader); spindown[3].scale(0.5); spindown.normalize(); //spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); @@ -150,9 +150,9 @@ namespace madness{ complexreader = function_real2complex(reader); fcwfreader[0] = complexreader; fcwfreader[1] = complex_factory_3d(world); - fcwfreader[2] = (-myi/myc) * Dz(complexreader); + fcwfreader[2] = (-myi) * Dz(complexreader); fcwfreader[2].scale(0.5); - fcwfreader[3] = (-myi/myc) * (Dx(complexreader) + myi * Dy(complexreader)); + fcwfreader[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); fcwfreader[3].scale(0.5); fcwfreader.normalize(); orbitals.push_back(fcwfreader); @@ -180,9 +180,9 @@ namespace madness{ complexreader = function_real2complex(reader); fcwfreader[0] = complex_factory_3d(world); fcwfreader[1] = complexreader; - fcwfreader[2] = (-myi/myc) * (Dx(complexreader) - myi * Dy(complexreader)); + fcwfreader[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); fcwfreader[2].scale(0.5); - fcwfreader[3] = (myi/myc) * Dz(complexreader); + fcwfreader[3] = (myi) * Dz(complexreader); fcwfreader[3].scale(0.5); fcwfreader.normalize(); orbitals.push_back(fcwfreader); diff --git a/src/apps/moldft/fcwf.cc b/src/apps/moldft/fcwf.cc index 4629524b130..dad0b58537c 100644 --- a/src/apps/moldft/fcwf.cc +++ b/src/apps/moldft/fcwf.cc @@ -190,11 +190,15 @@ Fcwf Fcwf::operator-=(const Fcwf& phi){ double Fcwf::norm2(){ MADNESS_ASSERT(m_initialized); - std::complex temp = madness::inner(m_psi[0].world(), m_psi, m_psi).sum(); - //std::complex temp(0,0); - //for(int i = 0 ; i < 4 ; i++){ - // temp += madness::inner(m_psi[i],m_psi[i]); - //} + //std::complex temp = madness::inner(m_psi[0].world(), m_psi, m_psi).sum(); + double c2 = 137.0359895*137.0359895; //speed of light in atomic units + std::complex temp(0,0); + + temp += madness::inner(m_psi[0],m_psi[0]); + temp += madness::inner(m_psi[1],m_psi[1]); + temp += madness::inner(m_psi[2],m_psi[2])/c2; + temp += madness::inner(m_psi[3],m_psi[3])/c2; + return std::sqrt(std::real(temp)); } @@ -234,7 +238,15 @@ void Fcwf::truncate(){ std::complex Fcwf::inner(World& world, const Fcwf& phi) const{ MADNESS_ASSERT(m_initialized && phi.getinitialize()); - return madness::inner(world, m_psi, phi.m_psi).sum(); + double c2 = 137.0359895*137.0359895; //speed of light in atomic units + std::complex temp(0,0); + + temp += madness::inner(m_psi[0],phi.m_psi[0]); + temp += madness::inner(m_psi[1],phi.m_psi[1]); + temp += madness::inner(m_psi[2],phi.m_psi[2])/c2; + temp += madness::inner(m_psi[3],phi.m_psi[3])/c2; + + return temp; } void Fcwf::apply(World& world, real_convolution_3d& op){ @@ -276,13 +288,15 @@ Fcwf apply(World& world, complex_derivative_3d& D, const Fcwf& psi){ real_function_3d squaremod(Fcwf& psi){ MADNESS_ASSERT(psi.getinitialize()); - real_function_3d temp = abssq(psi[0]) + abssq(psi[1]) + abssq(psi[2]) + abssq(psi[3]); + double c2 = 137.0359895*137.0359895; //speed of light in atomic units + real_function_3d temp = abssq(psi[0]) + abssq(psi[1]) + abssq(psi[2]).scale(1.0/c2) + abssq(psi[3]).scale(1.0/c2); return temp; } real_function_3d squaremod_small(Fcwf& psi){ MADNESS_ASSERT(psi.getinitialize()); - real_function_3d temp = abssq(psi[2]) + abssq(psi[3]); + double c2 = 137.0359895*137.0359895; //speed of light in atomic units + real_function_3d temp = (abssq(psi[2]) + abssq(psi[3])).scale(1.0/c2); return temp; } @@ -294,12 +308,17 @@ real_function_3d squaremod_large(Fcwf& psi){ complex_function_3d inner_func(World& world, Fcwf& psi, Fcwf& phi){ MADNESS_ASSERT(psi.getinitialize() && phi.getinitialize()); + double c = 137.0359895; //speed of light in atomic units std::vector a(4); std::vector b(4); - for(unsigned int i = 0; i < 4; i++){ + for(unsigned int i = 0; i < 2; i++){ a[i] = psi[i]; b[i] = phi[i]; } + for(unsigned int i = 2; i < 4; i++){ + a[i] = copy(psi[i]).scale(1.0/c); + b[i] = copy(phi[i]).scale(1.0/c); + } complex_function_3d result = sum(world, mul(world, conj(world, a), b)); return result; } @@ -399,6 +418,8 @@ Tensor> matrix_inner(World& world, std::vector& a, st unsigned int m = b.size(); MADNESS_ASSERT(n==m); + double c2 = 137.0359895*137.0359895; //speed of light in atomic units + std::vector a_1(n); std::vector a_2(n); std::vector a_3(n); @@ -421,8 +442,8 @@ Tensor> matrix_inner(World& world, std::vector& a, st Tensor> component1 = matrix_inner(world, a_1, b_1); Tensor> component2 = matrix_inner(world, a_2, b_2); - Tensor> component3 = matrix_inner(world, a_3, b_3); - Tensor> component4 = matrix_inner(world, a_4, b_4); + Tensor> component3 = (1.0/c2)*matrix_inner(world, a_3, b_3); + Tensor> component4 = (1.0/c2)*matrix_inner(world, a_4, b_4); component1=component1+component2+component3+component4; return component1; } From 76e04c225c2521a958aa979aec62eb347a3852af Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Thu, 16 May 2019 15:40:54 -0400 Subject: [PATCH 0027/1312] debugging --- src/apps/moldft/DF.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index b47a550d28e..2eb45f3801d 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -1079,6 +1079,7 @@ void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& //calculate exponent for equivalent BSH operator double mu = std::sqrt(-(2*eps*c2+eps*eps)/c2); + if(world.rank()==0) print(" mu = ", mu); world.gop.fence(); @@ -1088,8 +1089,14 @@ void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& //Apply BSH operator to Vpsi Vpsi = apply(world, op, Vpsi); + mu = Vpsi.norm2(); + if(world.rank()==0) print(" after BSH = ", mu); + //Apply (1/c^2)(H_D + eps) to Vpsi. Using apply_T for convenience, but this requires adding 2c^2Vpsi - Vpsi = (apply_T(world, Vpsi) + Vpsi * (eps+2*c2)) * (1.0/c2); + Vpsi = apply_T(world, Vpsi)*(1.0/c2) + Vpsi * ((eps+2*c2)/c2); + + mu = Vpsi.norm2(); + if(world.rank()==0) print(" after full apply = ", mu); } From 408560c2a592874f57e852198f1b9ec61c59b5dd Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Thu, 16 May 2019 16:22:56 -0400 Subject: [PATCH 0028/1312] debugging --- src/apps/moldft/DF.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 2eb45f3801d..51d2edb1e09 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -484,6 +484,7 @@ double DF::rele(World& world, Fcwf& psi){ Fcwf Tpsi = apply_T(world, psi); std::complex energy = inner(psi, Tpsi); + if(world.rank()==0) print(" in rele: ", energy.real()); return energy.real(); } From 7ca1414d1f0d8cce5bca90d8a28a6e4a976c06a5 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 17 May 2019 14:05:07 -0400 Subject: [PATCH 0029/1312] debugging --- src/apps/moldft/DF.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 51d2edb1e09..2a1928b4c16 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -767,6 +767,11 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o ////Apply the transformation to the orbitals transform(world, occupieds, U); + //debugging + for(unsigned int j=0; j < Init_params.num_occupied; j++){ + double tempdouble = rele(world, occupieds[j]); + if(world.rank()==0) print(" after diag, rele ",j," = ",tempdouble); + } times = end_timer(world); if(world.rank()==0) print(" ", times[0]); From 1cf623f1869f67656afc418278fb43537b0155f1 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 17 May 2019 15:09:53 -0400 Subject: [PATCH 0030/1312] debugging --- src/apps/moldft/DF.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 2a1928b4c16..c2ac4d707d9 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -1384,6 +1384,13 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea times = end_timer(world); if(world.rank()==0) print(" ", times[0]); + //debugging + for(unsigned int j=0; j < Init_params.num_occupied; j++){ + double tempdouble = rele(world, occupieds[j]); + if(world.rank()==0) print(" after BSH, rele ",j," = ",tempdouble); + } + + //Apply the kain solver, if called for if(iteration_number != 1 and DFparams.kain){ if(world.rank()==0) print("\n***Applying KAIN Solver***"); From d8edc3fdfc9afee7b0b810232e2ece08d2cbc2b2 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 17 May 2019 15:29:52 -0400 Subject: [PATCH 0031/1312] debugging --- src/apps/moldft/DF.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index c2ac4d707d9..539286da235 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -1095,8 +1095,8 @@ void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& //Apply BSH operator to Vpsi Vpsi = apply(world, op, Vpsi); - mu = Vpsi.norm2(); - if(world.rank()==0) print(" after BSH = ", mu); + mu = (apply_T(world,Vpsi)*(1.0/c2)).norm2(); + if(world.rank()==0) print(" after BSH and T= ", mu); //Apply (1/c^2)(H_D + eps) to Vpsi. Using apply_T for convenience, but this requires adding 2c^2Vpsi Vpsi = apply_T(world, Vpsi)*(1.0/c2) + Vpsi * ((eps+2*c2)/c2); From 815f75252713a5941910cbf574b28ee19d195a27 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 20 May 2019 00:59:09 -0400 Subject: [PATCH 0032/1312] bug fixed --- src/apps/moldft/DF.cc | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 539286da235..e5476aee4e3 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -473,8 +473,8 @@ Fcwf apply_T(World& world, Fcwf& psi){ //combine to calculate application of T Tpsi[0] = psiz[2] + psix[3] - myi*psiy[3]; Tpsi[1] = psix[2] + myi*psiy[2] - psiz[3]; - Tpsi[2] = myc*(psiz[0] + psix[1] - myi*psiy[1] - 2*myi*psi[2]); - Tpsi[3] = myc*(psix[0] + myi*psiy[0] - psiz[1] - 2*myi*psi[3]); + Tpsi[2] = (myc*myc)*(psiz[0] + psix[1] - myi*psiy[1] - 2*myi*psi[2]); + Tpsi[3] = (myc*myc)*(psix[0] + myi*psiy[0] - psiz[1] - 2*myi*psi[3]); return Tpsi * (-myi); } @@ -484,7 +484,7 @@ double DF::rele(World& world, Fcwf& psi){ Fcwf Tpsi = apply_T(world, psi); std::complex energy = inner(psi, Tpsi); - if(world.rank()==0) print(" in rele: ", energy.real()); + //if(world.rank()==0) print(" in rele: ", energy.real()); return energy.real(); } @@ -661,10 +661,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print fock and overlap matrices - if(world.rank()==0){ - print("fock:\n", fock); - print("\noverlap:\n", overlap); - } + //if(world.rank()==0){ + // print("fock:\n", fock); + // print("\noverlap:\n", overlap); + //} if(world.rank()==0) print(" Eigensolver"); start_timer(world); @@ -768,10 +768,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o transform(world, occupieds, U); //debugging - for(unsigned int j=0; j < Init_params.num_occupied; j++){ - double tempdouble = rele(world, occupieds[j]); - if(world.rank()==0) print(" after diag, rele ",j," = ",tempdouble); - } + //for(unsigned int j=0; j < Init_params.num_occupied; j++){ + // double tempdouble = rele(world, occupieds[j]); + // if(world.rank()==0) print(" after diag, rele ",j," = ",tempdouble); + //} times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -1085,7 +1085,7 @@ void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& //calculate exponent for equivalent BSH operator double mu = std::sqrt(-(2*eps*c2+eps*eps)/c2); - if(world.rank()==0) print(" mu = ", mu); + //if(world.rank()==0) print(" mu = ", mu); world.gop.fence(); @@ -1095,14 +1095,14 @@ void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& //Apply BSH operator to Vpsi Vpsi = apply(world, op, Vpsi); - mu = (apply_T(world,Vpsi)*(1.0/c2)).norm2(); - if(world.rank()==0) print(" after BSH and T= ", mu); + //mu = (apply_T(world,Vpsi)*(1.0/c2)).norm2(); + //if(world.rank()==0) print(" after BSH and T= ", mu); //Apply (1/c^2)(H_D + eps) to Vpsi. Using apply_T for convenience, but this requires adding 2c^2Vpsi Vpsi = apply_T(world, Vpsi)*(1.0/c2) + Vpsi * ((eps+2*c2)/c2); - mu = Vpsi.norm2(); - if(world.rank()==0) print(" after full apply = ", mu); + //mu = Vpsi.norm2(); + //if(world.rank()==0) print(" after full apply = ", mu); } @@ -1385,10 +1385,10 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) print(" ", times[0]); //debugging - for(unsigned int j=0; j < Init_params.num_occupied; j++){ - double tempdouble = rele(world, occupieds[j]); - if(world.rank()==0) print(" after BSH, rele ",j," = ",tempdouble); - } + //for(unsigned int j=0; j < Init_params.num_occupied; j++){ + // double tempdouble = rele(world, occupieds[j]); + // if(world.rank()==0) print(" after BSH, rele ",j," = ",tempdouble); + //} //Apply the kain solver, if called for From 8e89615a00ce288d011ac02b492eed4cf7b16db9 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Sat, 25 May 2019 04:05:09 -0400 Subject: [PATCH 0033/1312] Roberts suggested changes --- src/apps/moldft/DF.cc | 60 +++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index e5476aee4e3..2cde5625c7d 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -345,7 +345,7 @@ void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_functi for(unsigned int i = 0; i < num_atoms; i++){ Zlist[i] = Init_params.molecule.get_atom_number(i); FermiNucDistFunctor rho(Zlist[i], Rlist[i],DFparams.bohr_rad); - temp = real_factory_3d(world).functor(rho).truncate_mode(1); + temp = real_factory_3d(world).functor(rho).truncate_mode(0); tempnorm = temp.trace(); temp.scale(-Zlist[i]/tempnorm); if(i == 0){ @@ -532,9 +532,13 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*conj(world,temp2)); gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*conj(world,temp3)); + truncate(world, temp); + if(world.rank()==0) print(i, "Starting apply phase in K"); temp = apply(world, op, temp); + + truncate(world,temp); if(world.rank()==0) print(i, "Exiting apply phase in K"); @@ -645,6 +649,9 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //Now compute the fock matrix fock = matrix_inner(world, occupieds, temp_orbitals); + + //symmetrize + fock = (1.0/2.0)*(fock + conj_transpose(fock)); Tensor times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -655,6 +662,9 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o start_timer(world); overlap = matrix_inner(world,occupieds,occupieds); + //symmetrize + overlap = (1.0/2.0)*(overlap + conj_transpose(overlap)); + times = end_timer(world); if(world.rank()==0) print(" ", times[0]); times = end_timer(world); @@ -764,15 +774,29 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o ////Apply the transformation to the Exchange transform(world, Kpsis, U); + ////Apply the transformation to the orbitals transform(world, occupieds, U); - + + //truncate + for(int kk = 0; kk < Init_params.num_occupied; kk++){ + Kpsis[kk].truncate(); + occupieds[kk].truncate(); + } + + + //truncate + //debugging //for(unsigned int j=0; j < Init_params.num_occupied; j++){ // double tempdouble = rele(world, occupieds[j]); // if(world.rank()==0) print(" after diag, rele ",j," = ",tempdouble); //} + + //Set energies = evals, and fix the energy printing stage. + energies = evals; + times = end_timer(world); if(world.rank()==0) print(" ", times[0]); times = end_timer(world); @@ -1165,14 +1189,14 @@ void DF::saveDF(World& world){ void DF::make_gaussian_potential(World& world, real_function_3d& potential){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule, DFparams.bohr_rad); - potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(1).truncate_on_project(); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); } //Creates the nuclear potential from the molecule object. Also calculates the nuclear repulsion energy void DF::make_gaussian_potential(World& world, real_function_3d& potential, double& nuclear_repulsion_energy){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule,DFparams.bohr_rad); - potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(1).truncate_on_project(); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); std::vector Rlist = Vfunctor.get_Rlist(); std::vector Zlist = Vfunctor.get_Zlist(); nuclear_repulsion_energy = 0.0; @@ -1195,12 +1219,12 @@ void DF::DF_load_balance(World& world, real_function_3d& Vnuc){ LoadBalanceDeux<3> lb(world); lb.add_tree(Vnuc, lbcost(12.0,96.0),true); //Commenting out below block to test memory issues - //for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - // for(int kk = 0; kk < 4; kk++){ - // lb.add_tree(occupieds[j][kk], lbcost,3>(24.0,192.0),true); - // } - //} - FunctionDefaults<3>::redistribute(world, lb.load_balance(2), false); + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + for(int kk = 0; kk < 4; kk++){ + lb.add_tree(occupieds[j][kk], lbcost,3>(24.0,192.0),true); + } + } + FunctionDefaults<3>::redistribute(world, lb.load_balance(2), true); Tensor times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -1337,6 +1361,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea rho += squaremod(occupieds[kk]); } JandV = V + apply(op,rho); + JandV.truncate(); @@ -1347,7 +1372,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea for(unsigned int j = 0; j < Init_params.num_occupied; j++){ //construct the function to which we will apply the BSH - occupieds[j].truncate(); + //occupieds[j].truncate(); temp_function = occupieds[j]*JandV; temp_function.scale(-1.0); temp_function += Kpsis[j]; @@ -1450,6 +1475,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea rho += squaremod(occupieds[kk]); } JandV = V + apply(op,rho); + JandV.truncate(); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -1475,8 +1501,9 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Compute kinetic energy contribution for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - energies[j] = rele(world,occupieds[j]); - kinetic_energy += (energies[j]); + //energies[j] = rele(world,occupieds[j]); + //kinetic_energy += (energies[j]); + kinetic_energy += rele(world, occupieds[j]); } //Compute electron-nuclear attraction energy contribution, taking advantage of vmra's inner @@ -1522,9 +1549,9 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Loop through energies and calculate their new values using the individual contributions //(inside the "tensor" variables - for(unsigned int i = 0; i < Init_params.num_occupied; i++){ - energies[i] += nuclear_attraction_tensor[i]+coulomb_tensor[i] - exchange_tensor[i]; - } + //for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + // energies[i] += nuclear_attraction_tensor[i]+coulomb_tensor[i] - exchange_tensor[i]; + //} //compute total energy total_energy = kinetic_energy + coulomb_energy - exchange_energy + nuclear_attraction_energy + nuclear_repulsion_energy; @@ -1634,6 +1661,7 @@ void DF::solve_occupied(World & world) rho += squaremod(occupieds[kk]); } real_function_3d JandV = Vnuc + apply(op,rho); + JandV.truncate(); Tensor times = end_timer(world); if(world.rank()==0) print(" ", times[0]); From 0882883aad2aade6fc011182a4334794a18c3703 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 28 May 2019 04:42:16 -0400 Subject: [PATCH 0034/1312] initial attempt. buggy --- src/apps/moldft/DF.cc | 82 +++++++++++------ src/apps/moldft/DF.h | 3 + src/apps/moldft/InitParameters.h | 146 +++++++++++++++---------------- 3 files changed, 133 insertions(+), 98 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 2cde5625c7d..f018ef40a9a 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -441,6 +441,8 @@ DF::DF(World & world,std::shared_ptr input) { occupieds = Init_params.orbitals; virtuals = Init_params.virtuals; total_energy = Init_params.Init_total_energy; + closed_shell = Init_params.spinrestricted; //If nonrelativistic calculation was spinrestricted then we're doing a closed shell calculation + Tensor times = end_timer(world); if(world.rank()==0) print("Preparation complete: ", times[0]); @@ -534,20 +536,20 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi truncate(world, temp); - if(world.rank()==0) print(i, "Starting apply phase in K"); + //if(world.rank()==0) print(i, "Starting apply phase in K"); temp = apply(world, op, temp); truncate(world,temp); - if(world.rank()==0) print(i, "Exiting apply phase in K"); + //if(world.rank()==0) print(i, "Exiting apply phase in K"); Kpsis[i][0] += sum(world, mul(world, temp, temp0)); Kpsis[i][1] += sum(world, mul(world, temp, temp1)); Kpsis[i][2] += sum(world, mul(world, temp, temp2)); Kpsis[i][3] += sum(world, mul(world, temp, temp3)); - if(world.rank()==0) print(i, "Exiting sum block in K"); + //if(world.rank()==0) print(i, "Exiting sum block in K"); temp = conj(world, temp); @@ -556,7 +558,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi temp2 = occupieds[i][2]*temp; temp3 = occupieds[i][3]*temp; - if(world.rank()==0) print(i, "Entering final loop in K"); + // if(world.rank()==0) print(i, "Entering final loop in K"); for(unsigned int j = i+1; j < n; j++){ Kpsis[j][0] += temp0[j-i]; @@ -565,7 +567,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi Kpsis[j][3] += temp3[j-i]; } - if(world.rank()==0) print(i, "Exiting final loop in K"); + //if(world.rank()==0) print(i, "Exiting final loop in K"); Kpsis[i].truncate(); } @@ -620,13 +622,42 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank() == 0) print(" Adding (V+J)psi"); real_function_3d rho = real_factory_3d(world); for(unsigned int j = 0; j < n; j++){ - rho += squaremod(occupieds[j]); + rho += 2*squaremod(occupieds[j]); } - //TODO: Here try moving the apply out to operate on the sum of the nuclear and electronic charge distributions real_function_3d potential = myV + apply(op,rho); potential.truncate(); + + //Debugging + std::vector debug_orbitals; + for(unsigned int j = 0; j < n; j++){ + debug_orbitals.push_back(occupieds[j]*myV); + } + fock = matrix_inner(world,occupieds,debug_orbitals); + if(world.rank()==0) print("\nVnuc matrix:\n",fock); + real_function_3d idk = apply(op,rho); + for(unsigned int j = 0; j < n; j++){ + debug_orbitals[j] = occupieds[j]*idk; + } + fock = matrix_inner(world,occupieds,debug_orbitals); + if(world.rank()==0) print("\nJ matrix:\n",fock); + for(unsigned int j = 0; j < n; j++){ + debug_orbitals[j] = Kpsis[j]; + } + fock = matrix_inner(world,occupieds,debug_orbitals); + if(world.rank()==0) print("\nK matrix:\n",fock); + for(unsigned int j = 0; j < n; j++){ + debug_orbitals[j] = apply_T(world,occupieds[j]); + } + fock = matrix_inner(world,occupieds,debug_orbitals); + if(world.rank()==0) print("\nT matrix:\n",fock); + + + + + + //add in coulomb parts to neworbitals for(unsigned int j = 0; j < n; j++){ temp_orbitals.push_back(occupieds[j]*potential); //add in coulomb term @@ -671,10 +702,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print fock and overlap matrices - //if(world.rank()==0){ - // print("fock:\n", fock); - // print("\noverlap:\n", overlap); - //} + if(world.rank()==0){ + print("fock:\n", fock); + print("\noverlap:\n", overlap); + } if(world.rank()==0) print(" Eigensolver"); start_timer(world); @@ -762,7 +793,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o } //Debugging: Print transformation matrix after rotation removal - //if(world.rank()==0) print("U:\n", U); + if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); times = end_timer(world); @@ -784,15 +815,11 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o occupieds[kk].truncate(); } - - //truncate - //debugging //for(unsigned int j=0; j < Init_params.num_occupied; j++){ // double tempdouble = rele(world, occupieds[j]); // if(world.rank()==0) print(" after diag, rele ",j," = ",tempdouble); //} - //Set energies = evals, and fix the energy printing stage. energies = evals; @@ -1358,7 +1385,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Diagonalization forces us to recompute J for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += squaremod(occupieds[kk]); + rho += 2*squaremod(occupieds[kk]); } JandV = V + apply(op,rho); JandV.truncate(); @@ -1472,7 +1499,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea start_timer(world); rho = real_factory_3d(world); for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += squaremod(occupieds[kk]); + rho += 2*squaremod(occupieds[kk]); } JandV = V + apply(op,rho); JandV.truncate(); @@ -1502,8 +1529,8 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Compute kinetic energy contribution for(unsigned int j = 0; j < Init_params.num_occupied; j++){ //energies[j] = rele(world,occupieds[j]); - //kinetic_energy += (energies[j]); - kinetic_energy += rele(world, occupieds[j]); + //kinetic_energy += 2*(energies[j]); + kinetic_energy += 2*rele(world, occupieds[j]); } //Compute electron-nuclear attraction energy contribution, taking advantage of vmra's inner @@ -1521,14 +1548,14 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea nuclear_attraction_tensor += real(inner(world,occupieds2,mul(world,V,occupieds2))); nuclear_attraction_tensor += real(inner(world,occupieds3,mul(world,V,occupieds3)))*(1.0/(myc*myc)); nuclear_attraction_tensor += real(inner(world,occupieds4,mul(world,V,occupieds4)))*(1.0/(myc*myc)); - nuclear_attraction_energy = nuclear_attraction_tensor.sum(); + nuclear_attraction_energy = 2*nuclear_attraction_tensor.sum(); //Compute electron-electron repulsion energy contribution, again using vmra coulomb_tensor = real(inner(world,occupieds1,mul(world,Jop,occupieds1))); coulomb_tensor += real(inner(world,occupieds2,mul(world,Jop,occupieds2))); coulomb_tensor += real(inner(world,occupieds3,mul(world,Jop,occupieds3)))*(1.0/(myc*myc)); coulomb_tensor += real(inner(world,occupieds4,mul(world,Jop,occupieds4)))*(1.0/(myc*myc)); - coulomb_energy = 0.5*coulomb_tensor.sum(); + coulomb_energy = coulomb_tensor.sum();//*0.5; //Calculate Exchange energy contribution std::vector Kpsis1(Init_params.num_occupied); @@ -1545,7 +1572,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea exchange_tensor += real(inner(world,occupieds2,Kpsis2)); exchange_tensor += real(inner(world,occupieds3,Kpsis3))*(1.0/(myc*myc)); exchange_tensor += real(inner(world,occupieds4,Kpsis4))*(1.0/(myc*myc)); - exchange_energy = 0.5*exchange_tensor.sum(); + exchange_energy = exchange_tensor.sum();//*0.5; //Loop through energies and calculate their new values using the individual contributions //(inside the "tensor" variables @@ -1616,7 +1643,8 @@ void DF::solve_occupied(World & world) { //State what we're doing here - if(world.rank()==0) print("\nSolving for ", Init_params.num_occupied, " occupied orbitals\n-----------------------------------\n"); + if(closed_shell and world.rank()==0) print("\nSolving for ", Init_params.num_occupied, " doubly-occupied orbitals\n----------------------------\n"); + if((not closed_shell) and world.rank()==0) print("\nSolving for ", Init_params.num_occupied-1, " doubly-occupied, 1 singly-occupied orbitals\n---------------\n"); //Will need a coulomb operator real_convolution_3d op = CoulombOperator(world,DFparams.small,DFparams.thresh); @@ -1633,6 +1661,10 @@ void DF::solve_occupied(World & world) occupieds[i].normalize(); } + + //debugging: orthonormalize here to see the difference + orthogonalize_inplace(world); + //Form nuclear potential real_function_3d Vnuc; double nuclear_repulsion_energy; @@ -1658,7 +1690,7 @@ void DF::solve_occupied(World & world) start_timer(world); real_function_3d rho = real_factory_3d(world); for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += squaremod(occupieds[kk]); + rho += 2*squaremod(occupieds[kk]); } real_function_3d JandV = Vnuc + apply(op,rho); JandV.truncate(); diff --git a/src/apps/moldft/DF.h b/src/apps/moldft/DF.h index cecf155e797..b4e4d242867 100644 --- a/src/apps/moldft/DF.h +++ b/src/apps/moldft/DF.h @@ -51,6 +51,9 @@ class DF { //Total energy of the system double total_energy; + //Whether or not the calculation to be done is closed shell + bool closed_shell; + public: // Start a timer diff --git a/src/apps/moldft/InitParameters.h b/src/apps/moldft/InitParameters.h index c3b42d1db07..811036ef6d8 100644 --- a/src/apps/moldft/InitParameters.h +++ b/src/apps/moldft/InitParameters.h @@ -16,24 +16,24 @@ namespace madness{ struct InitParameters{ // Ground state parameters that are read in from archive - std::string inFile; ///< Name of input archive to read in ground state - double Init_total_energy; ///< Total energy of the nonrelativistic ground state - bool spinrestricted; ///< Indicates if ground state calc. was open or closed shell - unsigned int num_occupied; ///< Number of orbitals in ground state + std::string inFile; ///< Name of input archive to read in + double Init_total_energy; ///< Total energy of the nonrelativistic ground state + bool spinrestricted; ///< Indicates if input calc. was spin-restricted + unsigned int num_occupied; ///< Number of orbitals unsigned int num_virtuals; - Tensor energies; ///< Energy of ground state orbitals + Tensor energies; ///< Energies of input orbitals Tensor v_energies; - Tensor occ; ///< Occupancy of ground state orbitals - double L; ///< Box size of ground state - Dirac Fock calcluation is in same box - int order; ///< Order of polynomial used in ground state - Molecule molecule; ///< The molecule used in ground state calculation - std::vector orbitals; ///< The ground state orbitals + Tensor occ; ///< Occupancy of input orbitals + double L; ///< Box size of input - Dirac Fock calcluation is in same box + int order; ///< Order of polynomial used in input + Molecule molecule; ///< The molecule used in input calculation + std::vector orbitals; ///< The occupied orbitals std::vector virtuals; // Default constructor InitParameters() {} - // Initializes NRParameters using the contents of file \c filename + // Initializes InitParameters using the contents of file \c filename void read(World& world, const std::string& filename, bool restart){ // Save the filename inFile = filename; @@ -71,7 +71,7 @@ namespace madness{ input & Init_total_energy; // double input & spinrestricted; // bool input & num_occupied; // int - input & temp_energies; // Tensor orbital energies + input & energies; // Tensor orbital energies input & occ; // Tensor orbital occupations input & dummy2; // std::vector sets of orbitals(?) input & L; // double box size @@ -100,7 +100,7 @@ namespace madness{ real_function_3d reader; complex_function_3d complexreader; Fcwf spinup(world); - Fcwf spindown(world); + //Fcwf spindown(world); for(unsigned int i = 0; i < num_occupied; i++){ input & reader; complexreader = function_real2complex(reader); @@ -111,35 +111,35 @@ namespace madness{ spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); spinup[3].scale(0.5); spinup.normalize(); - spindown[0] = complex_factory_3d(world); - spindown[1] = complexreader; - spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); - spindown[2].scale(0.5); - spindown[3] = (myi) * Dz(complexreader); - spindown[3].scale(0.5); - spindown.normalize(); + //spindown[0] = complex_factory_3d(world); + //spindown[1] = complexreader; + //spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); + //spindown[2].scale(0.5); + //spindown[3] = (myi) * Dz(complexreader); + //spindown[3].scale(0.5); + //spindown.normalize(); //spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); //spindown = Fcwf(complex_factory_3d(world), copy(complexreader), complex_factory_3d(world), complex_factory_3d(world)); orbitals.push_back(spinup); - orbitals.push_back(spindown); + //orbitals.push_back(spindown); } //duplicate the energies - energies = Tensor(2*num_occupied); - double csquared = 137.0359895*137.0359895; - double temp; - for(unsigned int i = 0; i < num_occupied; i++){ - temp = temp_energies(i);//+csquared; - energies(2*i) = temp; - energies(2*i+1) = temp; - } - - //correct the number of orbitals - num_occupied *= 2; + //energies = Tensor(2*num_occupied); + //double csquared = 137.0359895*137.0359895; + //double temp; + //for(unsigned int i = 0; i < num_occupied; i++){ + // temp = temp_energies(i);//+csquared; + // energies(2*i) = temp; + // energies(2*i+1) = temp; + //} + + ////correct the number of orbitals + //num_occupied *= 2; } else{ - if(world.rank()==0) print("num_occupied is:" ,num_occupied); + if(world.rank()==0) print("number of alpha read in is:" ,num_occupied); // Read in alpha ground state orbitals real_function_3d reader; @@ -158,46 +158,46 @@ namespace madness{ orbitals.push_back(fcwfreader); } - // Read in beta quantities - unsigned int num_betas; - input & num_betas; - - Tensor beta_energies; - input & beta_energies; - //NEED TO ADD THESE INTO TOTAL ENERGIES MATRIX - - Tensor dummy3; - input & dummy3; - - std::vector dummy4; - input & dummy4; - - if(world.rank()==0) print("made it here: ", num_betas); - - //read in beta ground state orbitals - for(unsigned int i = 0; i < num_betas; i++){ - input & reader; - complexreader = function_real2complex(reader); - fcwfreader[0] = complex_factory_3d(world); - fcwfreader[1] = complexreader; - fcwfreader[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); - fcwfreader[2].scale(0.5); - fcwfreader[3] = (myi) * Dz(complexreader); - fcwfreader[3].scale(0.5); - fcwfreader.normalize(); - orbitals.push_back(fcwfreader); - } - - //fix up energies tensor and num_occupied - energies = Tensor(num_occupied + num_betas); - double csquared = 137.0359895*137.0359895; - for(unsigned int i = 0; i < num_occupied; i++){ - energies(i) = temp_energies(i);// + csquared; - } - for(unsigned int i = 0; i < num_betas; i++){ - energies(num_occupied + i) = beta_energies(i);// + csquared; - } - num_occupied += num_betas; + //// Read in beta quantities + //unsigned int num_betas; + //input & num_betas; + + //Tensor beta_energies; + //input & beta_energies; + ////NEED TO ADD THESE INTO TOTAL ENERGIES MATRIX + + //Tensor dummy3; + //input & dummy3; + + //std::vector dummy4; + //input & dummy4; + + //if(world.rank()==0) print("made it here: ", num_betas); + // + ////read in beta ground state orbitals + //for(unsigned int i = 0; i < num_betas; i++){ + // input & reader; + // complexreader = function_real2complex(reader); + // fcwfreader[0] = complex_factory_3d(world); + // fcwfreader[1] = complexreader; + // fcwfreader[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); + // fcwfreader[2].scale(0.5); + // fcwfreader[3] = (myi) * Dz(complexreader); + // fcwfreader[3].scale(0.5); + // fcwfreader.normalize(); + // orbitals.push_back(fcwfreader); + //} + + ////fix up energies tensor and num_occupied + //energies = Tensor(num_occupied + num_betas); + //double csquared = 137.0359895*137.0359895; + //for(unsigned int i = 0; i < num_occupied; i++){ + // energies(i) = temp_energies(i);// + csquared; + //} + //for(unsigned int i = 0; i < num_betas; i++){ + // energies(num_occupied + i) = beta_energies(i);// + csquared; + //} + //num_occupied += num_betas; } From 6488f853862ce064e544aff3060aa428f932a563 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 29 May 2019 01:06:48 -0400 Subject: [PATCH 0035/1312] debugging --- src/apps/moldft/DF.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index f018ef40a9a..8056ddc1757 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -345,7 +345,7 @@ void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_functi for(unsigned int i = 0; i < num_atoms; i++){ Zlist[i] = Init_params.molecule.get_atom_number(i); FermiNucDistFunctor rho(Zlist[i], Rlist[i],DFparams.bohr_rad); - temp = real_factory_3d(world).functor(rho).truncate_mode(0); + temp = real_factory_3d(world).functor(rho).truncate_mode(1); tempnorm = temp.trace(); temp.scale(-Zlist[i]/tempnorm); if(i == 0){ @@ -1216,14 +1216,14 @@ void DF::saveDF(World& world){ void DF::make_gaussian_potential(World& world, real_function_3d& potential){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule, DFparams.bohr_rad); - potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(1).truncate_on_project(); } //Creates the nuclear potential from the molecule object. Also calculates the nuclear repulsion energy void DF::make_gaussian_potential(World& world, real_function_3d& potential, double& nuclear_repulsion_energy){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule,DFparams.bohr_rad); - potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(1).truncate_on_project(); std::vector Rlist = Vfunctor.get_Rlist(); std::vector Zlist = Vfunctor.get_Zlist(); nuclear_repulsion_energy = 0.0; @@ -1662,8 +1662,6 @@ void DF::solve_occupied(World & world) } - //debugging: orthonormalize here to see the difference - orthogonalize_inplace(world); //Form nuclear potential real_function_3d Vnuc; From 94d8ccd6b793596100a6dc088d00c580680fb041 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 7 Jun 2019 13:35:33 -0400 Subject: [PATCH 0036/1312] first stab at Eeff --- src/apps/moldft/DF.cc | 45 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 2cde5625c7d..b8400ec6e5c 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -671,10 +671,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print fock and overlap matrices - //if(world.rank()==0){ - // print("fock:\n", fock); - // print("\noverlap:\n", overlap); - //} + if(world.rank()==0){ + print("fock:\n", fock); + print("\noverlap:\n", overlap); + } if(world.rank()==0) print(" Eigensolver"); start_timer(world); @@ -685,7 +685,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print matrix of eigenvectors - //if(world.rank()==0) print("U:\n", U); + if(world.rank()==0) print("U:\n", U); //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. if(world.rank()==0) print(" Removing Rotations"); @@ -762,7 +762,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o } //Debugging: Print transformation matrix after rotation removal - //if(world.rank()==0) print("U:\n", U); + if(world.rank()==0) print("U:\n", U); times = end_timer(world); @@ -1685,6 +1685,37 @@ void DF::solve_occupied(World & world) iteration_number++; } + //Calculation of Effective Electric Field: + if(world.rank()==0) print("Effective Electric Field calculation"); + std::complex myi(0,1); + std::complex one(1,0); + real_derivative_3d Dx(world,0); + real_derivative_3d Dy(world,1); + real_derivative_3d Dz(world,2); + double Eeff(0.0); + for(unsigned int j; j < Init_params.num_occupied; j++){ + real_function_3d LL(world); + for(unsigned int kk; kk < Init_params.num_occupied; kk++){ + if(kk != j){ + LL += squaremod(occupieds[kk]); + } + } + LL = apply(op,LL); + LL += Vnuc; + complex_function_3d Lx = one*Dx(LL); + complex_function_3d Ly = one*Dy(LL); + complex_function_3d Lz = one*Dz(LL); + Fcwf temp(world); + + temp[0] = Lz*occupieds[j][0] + (Lx - myi*Ly)*occupieds[j][1]; + temp[1] = (Lx + myi*Ly)*occupieds[j][0] - Lz*occupieds[j][1]; + temp[2] = Lz*occupieds[j][2] + (Lx - myi*Ly)*occupieds[j][3]; + temp[2].scale(-1.0); + temp[3] = Lz*occupieds[j][3] - (Lx + myi*Ly)*occupieds[j][2]; + + Eeff += std::real(inner(occupieds[0],temp)); + } + if(world.rank()==0) print("Eeff = ", Eeff); } @@ -1722,6 +1753,8 @@ void DF::solve(World& world){ Tensor times = end_timer(world); if(world.rank() == 0) print("\n Calculation time:", times[0],"\n"); + + //Make density lineplots if(DFparams.lineplot){ start_timer(world); From 3d72b3fe135699b76b60c31b275929f8779fe177 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 12 Jun 2019 13:15:06 -0400 Subject: [PATCH 0037/1312] turned off some printing --- src/apps/moldft/DF.cc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index b8400ec6e5c..d1d226587b2 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -534,20 +534,20 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi truncate(world, temp); - if(world.rank()==0) print(i, "Starting apply phase in K"); + //if(world.rank()==0) print(i, "Starting apply phase in K"); temp = apply(world, op, temp); truncate(world,temp); - if(world.rank()==0) print(i, "Exiting apply phase in K"); + //if(world.rank()==0) print(i, "Exiting apply phase in K"); Kpsis[i][0] += sum(world, mul(world, temp, temp0)); Kpsis[i][1] += sum(world, mul(world, temp, temp1)); Kpsis[i][2] += sum(world, mul(world, temp, temp2)); Kpsis[i][3] += sum(world, mul(world, temp, temp3)); - if(world.rank()==0) print(i, "Exiting sum block in K"); + //if(world.rank()==0) print(i, "Exiting sum block in K"); temp = conj(world, temp); @@ -556,7 +556,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi temp2 = occupieds[i][2]*temp; temp3 = occupieds[i][3]*temp; - if(world.rank()==0) print(i, "Entering final loop in K"); + //if(world.rank()==0) print(i, "Entering final loop in K"); for(unsigned int j = i+1; j < n; j++){ Kpsis[j][0] += temp0[j-i]; @@ -565,7 +565,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi Kpsis[j][3] += temp3[j-i]; } - if(world.rank()==0) print(i, "Exiting final loop in K"); + //if(world.rank()==0) print(i, "Exiting final loop in K"); Kpsis[i].truncate(); } @@ -671,10 +671,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print fock and overlap matrices - if(world.rank()==0){ - print("fock:\n", fock); - print("\noverlap:\n", overlap); - } + //if(world.rank()==0){ + // print("fock:\n", fock); + // print("\noverlap:\n", overlap); + //} if(world.rank()==0) print(" Eigensolver"); start_timer(world); @@ -685,7 +685,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print matrix of eigenvectors - if(world.rank()==0) print("U:\n", U); + //if(world.rank()==0) print("U:\n", U); //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. if(world.rank()==0) print(" Removing Rotations"); @@ -762,7 +762,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o } //Debugging: Print transformation matrix after rotation removal - if(world.rank()==0) print("U:\n", U); + //if(world.rank()==0) print("U:\n", U); times = end_timer(world); From 49d373454d34f5becb29be0f660c4b80317afbab Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Sun, 14 Jul 2019 16:22:05 -0400 Subject: [PATCH 0038/1312] saving progress --- src/apps/moldft/DF.cc | 147 +++++++++++++++++++++---------- src/apps/moldft/InitParameters.h | 73 ++++++++++++++- 2 files changed, 171 insertions(+), 49 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 8056ddc1757..1f1a40c5f11 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -17,6 +17,13 @@ using namespace madness; +double myxfunc(const madness::coord_3d& r){ + return r[0]; +} +double myyfunc(const madness::coord_3d& r){ + return r[1]; +} + // Needed for rebalancing template struct lbcost { @@ -493,6 +500,9 @@ double DF::rele(World& world, Fcwf& psi){ //Calculates K*psi for each psi in the orbitals vector and stores them in result void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsis){ + + + //start timer start_timer(world); @@ -510,67 +520,110 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //Calculate and accumulate exchange contributions unsigned int n = Init_params.num_occupied; double myc = 137.0359895; //speed of light in atomic units - for(unsigned int i = 0; i < n; i++){ - std::vector temp(n-i); - for(unsigned int j = 0; j < n-i; j++){ - temp[j] = complex_factory_3d(world); + //for debugging + Tensor> exchange1(n,n); //spin-up contributions + Tensor> exchange2(n,n); //spin-down contributions + + + //Working on spin-restricted version of exchange now. For now do it the stupid way + for(unsigned int i=0; i < n; i++){ + Fcwf K1 = Fcwf(world); + Fcwf K2 = Fcwf(world); + for(unsigned int j=0; j temp0(n-i); - std::vector temp1(n-i); - std::vector temp2(n-i); - std::vector temp3(n-i); - for(unsigned int j = i; j < n; j++){ - temp0[j-i] = occupieds[j][0]; - temp1[j-i] = occupieds[j][1]; - temp2[j-i] = occupieds[j][2]; - temp3[j-i] = occupieds[j][3]; + + for(unsigned int j = 0; j < n; j++){ + exchange1(i,j) = inner(occupieds[j],K1); + exchange2(i,j) = inner(occupieds[j],K2); } - gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*conj(world,temp0)); - gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*conj(world,temp1)); - gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*conj(world,temp2)); - gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*conj(world,temp3)); + Kpsis[i] = K1+K2; - truncate(world, temp); + } - //if(world.rank()==0) print(i, "Starting apply phase in K"); + if(world.rank()==0) print("K1:\n",exchange1,"\nK2:\n",exchange2,"\nsum:\n",exchange1+exchange2); - temp = apply(world, op, temp); - - truncate(world,temp); - //if(world.rank()==0) print(i, "Exiting apply phase in K"); + //for(unsigned int i = 0; i < n; i++){ - Kpsis[i][0] += sum(world, mul(world, temp, temp0)); - Kpsis[i][1] += sum(world, mul(world, temp, temp1)); - Kpsis[i][2] += sum(world, mul(world, temp, temp2)); - Kpsis[i][3] += sum(world, mul(world, temp, temp3)); - - //if(world.rank()==0) print(i, "Exiting sum block in K"); + // std::vector temp(n-i); + // for(unsigned int j = 0; j < n-i; j++){ + // temp[j] = complex_factory_3d(world); + // } + // compress(world, temp); - temp = conj(world, temp); + // std::vector temp0(n-i); + // std::vector temp1(n-i); + // std::vector temp2(n-i); + // std::vector temp3(n-i); + // for(unsigned int j = i; j < n; j++){ + // temp0[j-i] = occupieds[j][0]; + // temp1[j-i] = occupieds[j][1]; + // temp2[j-i] = occupieds[j][2]; + // temp3[j-i] = occupieds[j][3]; + // } - temp0 = occupieds[i][0]*temp; - temp1 = occupieds[i][1]*temp; - temp2 = occupieds[i][2]*temp; - temp3 = occupieds[i][3]*temp; + // gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*conj(world,temp0)); + // gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*conj(world,temp1)); + // gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*conj(world,temp2)); + // gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*conj(world,temp3)); - // if(world.rank()==0) print(i, "Entering final loop in K"); + // truncate(world, temp); - for(unsigned int j = i+1; j < n; j++){ - Kpsis[j][0] += temp0[j-i]; - Kpsis[j][1] += temp1[j-i]; - Kpsis[j][2] += temp2[j-i]; - Kpsis[j][3] += temp3[j-i]; - } - - //if(world.rank()==0) print(i, "Exiting final loop in K"); + // //if(world.rank()==0) print(i, "Starting apply phase in K"); - Kpsis[i].truncate(); - } + // temp = apply(world, op, temp); + // + // truncate(world,temp); + + // //if(world.rank()==0) print(i, "Exiting apply phase in K"); + + // Kpsis[i][0] += sum(world, mul(world, temp, temp0)); + // Kpsis[i][1] += sum(world, mul(world, temp, temp1)); + // Kpsis[i][2] += sum(world, mul(world, temp, temp2)); + // Kpsis[i][3] += sum(world, mul(world, temp, temp3)); + // + // //if(world.rank()==0) print(i, "Exiting sum block in K"); + + // temp = conj(world, temp); + + // temp0 = occupieds[i][0]*temp; + // temp1 = occupieds[i][1]*temp; + // temp2 = occupieds[i][2]*temp; + // temp3 = occupieds[i][3]*temp; + + // // if(world.rank()==0) print(i, "Entering final loop in K"); + + // for(unsigned int j = i+1; j < n; j++){ + // Kpsis[j][0] += temp0[j-i]; + // Kpsis[j][1] += temp1[j-i]; + // Kpsis[j][2] += temp2[j-i]; + // Kpsis[j][3] += temp3[j-i]; + // } + // + // //if(world.rank()==0) print(i, "Exiting final loop in K"); + + // Kpsis[i].truncate(); + //} //Report time Tensor times = end_timer(world); diff --git a/src/apps/moldft/InitParameters.h b/src/apps/moldft/InitParameters.h index 811036ef6d8..f8f60f10fdd 100644 --- a/src/apps/moldft/InitParameters.h +++ b/src/apps/moldft/InitParameters.h @@ -10,6 +10,8 @@ #include "NWChem.h" Function,3> function_real2complex(const Function& r); +double myxfunc(const madness::coord_3d& r); +double myyfunc(const madness::coord_3d& r); namespace madness{ @@ -100,8 +102,11 @@ namespace madness{ real_function_3d reader; complex_function_3d complexreader; Fcwf spinup(world); - //Fcwf spindown(world); - for(unsigned int i = 0; i < num_occupied; i++){ + Fcwf spindown(world); + real_function_3d xfunc = real_factory_3d(world).f(myxfunc); + real_function_3d yfunc = real_factory_3d(world).f(myyfunc); + if(num_occupied != 5) throw; + for(unsigned int i = 0; i < 2; i++){ input & reader; complexreader = function_real2complex(reader); spinup[0] = complexreader; @@ -124,6 +129,70 @@ namespace madness{ //orbitals.push_back(spindown); } + //Bring in p block, construct 4-component wavefunctions, and diagonalize under j_z + std::vector jzorbitals; + std::vector justorbitals; + for(unsigned int i=0; i<3; i++){ + input & reader; + complexreader = function_real2complex(reader); + spinup[0] = complexreader; + spinup[1] = complex_factory_3d(world); + spinup[2] = (-myi) * Dz(complexreader); + spinup[2].scale(0.5); + spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); + spinup[3].scale(0.5); + spinup.normalize(); + spindown[0] = complex_factory_3d(world); + spindown[1] = complexreader; + spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); + spindown[2].scale(0.5); + spindown[3] = (myi) * Dz(complexreader); + spindown[3].scale(0.5); + spindown.normalize(); + ////spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + ////spindown = Fcwf(complex_factory_3d(world), copy(complexreader), complex_factory_3d(world), complex_factory_3d(world)); + //spinup = spinup + spindown; + //orbitals.push_back(spinup); + //orbitals.push_back(spindown); + justorbitals.push_back(spinup); + justorbitals.push_back(spindown); + } + + + //for(unsigned int i=0; i<6; i++){ + // spinup[0] = -myi*(xfunc*Dy(justorbitals[i][0])-yfunc*Dx(justorbitals[i][0])) + 0.5*justorbitals[i][0]; + // spinup[1] = -myi*(xfunc*Dy(justorbitals[i][1])-yfunc*Dx(justorbitals[i][1])) - 0.5*justorbitals[i][1]; + // spinup[2] = -myi*(xfunc*Dy(justorbitals[i][2])-yfunc*Dx(justorbitals[i][2])) + 0.5*justorbitals[i][2]; + // spinup[3] = -myi*(xfunc*Dy(justorbitals[i][3])-yfunc*Dx(justorbitals[i][3])) - 0.5*justorbitals[i][3]; + // jzorbitals.push_back(spinup); + //} + + //Tensor> jztensor = matrix_inner(world,justorbitals,jzorbitals); + //Tensor> overlap = matrix_inner(world,justorbitals,justorbitals); + + //Tensor> U(6,6); + //Tensor evals(6); + + //if(world.rank()==0){ + // print("\njz:\n", jztensor); + // print("\noverlap:\n", overlap); + //} + // + //sygv(jztensor,overlap,1,U,evals); + + //if(world.rank()==0) print("U:\n",U); + //if(world.rank()==0) print("evals:\n",evals); + + //transform(world,justorbitals,U); + //for(unsigned int i = 0; i < 6; i++){ + // if(evals[i] > 0){ + // if(world.rank()==0) print("Add in state with eval: ", evals[i]); + // orbitals.push_back(justorbitals[i]); + // } + //} + orbitals.push_back(justorbitals[0]); + orbitals.push_back(justorbitals[2]); + orbitals.push_back(justorbitals[4]); //duplicate the energies //energies = Tensor(2*num_occupied); //double csquared = 137.0359895*137.0359895; From 9f0384510bb7a42109877dd02aefcc6f0ef73c45 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 12 Aug 2019 10:07:01 -0400 Subject: [PATCH 0039/1312] new printing --- src/apps/moldft/DF.cc | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index d1d226587b2..6ffe60885d9 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -797,6 +797,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //Set energies = evals, and fix the energy printing stage. energies = evals; + times = end_timer(world); if(world.rank()==0) print(" ", times[0]); times = end_timer(world); @@ -1564,6 +1565,13 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Loop through occupied orbitals. Calculate , number of coefficients, max depth. //Print these along with updated energies + std::vector r_expec_vec(Init_params.num_occupied); + std::vector numcoeffs_vec(Init_params.num_occupied); + std::vector maxdepth_vec(Init_params.num_occupied); + std::vector comp1norm(Init_params.num_occupied); + std::vector comp2norm(Init_params.num_occupied); + std::vector comp3norm(Init_params.num_occupied); + std::vector comp4norm(Init_params.num_occupied); for(unsigned int j = 0; j < Init_params.num_occupied; j++){ //calculate @@ -1577,10 +1585,23 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea maxdepth = std::max(int(occupieds[j][2].max_depth()), maxdepth); maxdepth = std::max(int(occupieds[j][3].max_depth()), maxdepth); - //Print everything - if(world.rank()==0){ - printf(" Orbital: %3i, Energy: %.10e, : %8e, No. coeffs: %7i, Max depth: %3i\n",j+1, energies[j], r_expec, numcoeffs, maxdepth); + //Store in vectors + r_expec_vec[j] = r_expec; + numcoeffs_vec[j] = numcoeffs; + maxdepth_vec[j] = maxdepth; + comp1norm[j] = occupieds[j][0].norm2(); + comp2norm[j] = occupieds[j][1].norm2(); + comp3norm[j] = occupieds[j][2].norm2()/myc; + comp4norm[j] = occupieds[j][3].norm2()/myc; + + } + //Print everything + if(world.rank()==0){ + print("Orbital Energy No. coeffs Max depth ||1|| ||2|| ||3|| ||4||"); + print("------------------------------------------------------------------------------------------------------------------------------"); + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + printf("%7i %22.10e %14.5e %14i %13i %12.5e %12.5e %12.5e %12.5e\n",j+1,energies[j],r_expec_vec[j],numcoeffs_vec[j],maxdepth_vec[j],comp1norm[j],comp2norm[j],comp3norm[j],comp4norm[j]); } } From 15c6f2c562e67bbcb7df62c7d2e3330ae452e751 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 14 Aug 2019 15:30:07 -0400 Subject: [PATCH 0040/1312] trying diagonalization of entire fock matrix. initial attempt. --- src/apps/moldft/DF.cc | 141 +++++++++++++++++++++++++++------------- src/apps/moldft/fcwf.cc | 8 +++ src/apps/moldft/fcwf.h | 2 + 3 files changed, 105 insertions(+), 46 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 1f1a40c5f11..38e1a6c1515 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -660,11 +660,12 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o start_timer(world); unsigned int n = Init_params.num_occupied; - Tensor> fock(n, n); - Tensor> overlap(n, n); - Tensor> U(n,n); - Tensor evals(n); + Tensor> fock(2*n, 2*n); + Tensor> overlap(2*n, 2*n); + Tensor> U(2*n,2*n); + Tensor evals(2*n); std::vector temp_orbitals; + std::vector kramers_pairs; if(world.rank()==0) print(" Forming Matrices"); start_timer(world); @@ -682,33 +683,29 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o potential.truncate(); - //Debugging - std::vector debug_orbitals; - for(unsigned int j = 0; j < n; j++){ - debug_orbitals.push_back(occupieds[j]*myV); - } - fock = matrix_inner(world,occupieds,debug_orbitals); - if(world.rank()==0) print("\nVnuc matrix:\n",fock); - real_function_3d idk = apply(op,rho); - for(unsigned int j = 0; j < n; j++){ - debug_orbitals[j] = occupieds[j]*idk; - } - fock = matrix_inner(world,occupieds,debug_orbitals); - if(world.rank()==0) print("\nJ matrix:\n",fock); - for(unsigned int j = 0; j < n; j++){ - debug_orbitals[j] = Kpsis[j]; - } - fock = matrix_inner(world,occupieds,debug_orbitals); - if(world.rank()==0) print("\nK matrix:\n",fock); - for(unsigned int j = 0; j < n; j++){ - debug_orbitals[j] = apply_T(world,occupieds[j]); - } - fock = matrix_inner(world,occupieds,debug_orbitals); - if(world.rank()==0) print("\nT matrix:\n",fock); - - - - + ////Debugging + //std::vector debug_orbitals; + //for(unsigned int j = 0; j < n; j++){ + // debug_orbitals.push_back(occupieds[j]*myV); + //} + //fock = matrix_inner(world,occupieds,debug_orbitals); + //if(world.rank()==0) print("\nVnuc matrix:\n",fock); + //real_function_3d idk = apply(op,rho); + //for(unsigned int j = 0; j < n; j++){ + // debug_orbitals[j] = occupieds[j]*idk; + //} + //fock = matrix_inner(world,occupieds,debug_orbitals); + //if(world.rank()==0) print("\nJ matrix:\n",fock); + //for(unsigned int j = 0; j < n; j++){ + // debug_orbitals[j] = Kpsis[j]; + //} + //fock = matrix_inner(world,occupieds,debug_orbitals); + //if(world.rank()==0) print("\nK matrix:\n",fock); + //for(unsigned int j = 0; j < n; j++){ + // debug_orbitals[j] = apply_T(world,occupieds[j]); + //} + //fock = matrix_inner(world,occupieds,debug_orbitals); + //if(world.rank()==0) print("\nT matrix:\n",fock); //add in coulomb parts to neworbitals @@ -716,11 +713,14 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o temp_orbitals.push_back(occupieds[j]*potential); //add in coulomb term } - if(world.rank() == 0) print(" Subtracting K*psi"); + + //Handle K separately because the relations are a little different + // + //if(world.rank() == 0) print(" Subtracting K*psi"); //Move Kpsis to new orbitals, as they are part of the fock operator - for(unsigned int j = 0; j < n; j++){ - temp_orbitals[j] -= Kpsis[j]; //yes this needs to be subtraction. exchange function doesn't include the negative. - } + //for(unsigned int j = 0; j < n; j++){ + // temp_orbitals[j] -= Kpsis[j]; //yes this needs to be subtraction. exchange function doesn't include the negative. + //} //add in T_psi if(world.rank()==0) print(" Adding T*psi"); @@ -731,9 +731,32 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" Integrating to form Fock Matrix"); start_timer(world); - //Now compute the fock matrix - fock = matrix_inner(world, occupieds, temp_orbitals); + //Also make the vector of Kramers Pairs + //TODO: Actually roll this into a variant of matrix inner that doesn't explictly store this vector in order to save memory. + for(unsigned int j = 0; j < n; j++){ + kramers_pairs.push_back(occupieds[j].KramersPair()); + } + + //Now compute the fock matrix + Tensor> tempmatrix = matrix_inner(world, occupieds, temp_orbitals); + fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); + fock(Slice(n,2*n-1),Slice(n,2*n-1)) = -1.0*conj(tempmatrix); + tempmatrix = matrix_inner(world,kramers_pairs,temp_orbitals); + fock(Slice(0,n-1),Slice(n,2*n-1)) = copy(tempmatrix); + fock(Slice(n,2*n-1),Slice(0,n-1)) = conj(tempmatrix); + + //Put in Exchange part + tempmatrix = matrix_inner(world,occupieds,Kpsis); + fock(Slice(0,n-1),Slice(0,n-1)) = fock(Slice(0,n-1),Slice(0,n-1)) + tempmatrix; + fock(Slice(n,2*n-1),Slice(n,2*n-1)) = fock(Slice(n,2*n-1),Slice(n,2*n-1)) + transpose(tempmatrix); + tempmatrix = matrix_inner(world, kramers_pairs, Kpsis); + fock(Slice(n,2*n-1),Slice(0,n-1)) = fock(Slice(n,2*n-1),Slice(0,n-1)) + tempmatrix; + fock(Slice(0,n-1),Slice(n,2*n-1)) = fock(Slice(0,n-1),Slice(n,2*n-1)) - conj(tempmatrix); + + //DEBUGGING: + if(world.rank()==0) print("new fock matrix:\n",fock); + //symmetrize fock = (1.0/2.0)*(fock + conj_transpose(fock)); @@ -744,7 +767,13 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o ////and the overlap matrix if(world.rank()==0) print(" Integrating to form Overlap Matrix"); start_timer(world); - overlap = matrix_inner(world,occupieds,occupieds); + overlap(Slice(0,n-1),Slice(0,n-1)) = matrix_inner(world,occupieds,occupieds); + overlap(Slice(0,n-1),Slice(n,2*n-1)) = matrix_inner(world,occupieds,kramers_pairs); + overlap(Slice(n,2*n-1),Slice(0,n-1)) = matrix_inner(world,kramers_pairs,occupieds); + overlap(Slice(n,2*n-1),Slice(n,2*n-1)) = matrix_inner(world,kramers_pairs,kramers_pairs); + + //DEBUGGING: + if(world.rank()==0) print("new overlap matrix:\n",overlap); //symmetrize overlap = (1.0/2.0)*(overlap + conj_transpose(overlap)); @@ -755,10 +784,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print fock and overlap matrices - if(world.rank()==0){ - print("fock:\n", fock); - print("\noverlap:\n", overlap); - } + //if(world.rank()==0){ + // print("fock:\n", fock); + // print("\noverlap:\n", overlap); + //} if(world.rank()==0) print(" Eigensolver"); start_timer(world); @@ -769,7 +798,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print matrix of eigenvectors - //if(world.rank()==0) print("U:\n", U); + if(world.rank()==0) print("U:\n", U); //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. if(world.rank()==0) print(" Removing Rotations"); @@ -855,12 +884,32 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" Applying Transformation"); start_timer(world); + + ////Apply the transformation to the orbitals + tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); + print("a"); + transform(world, occupieds, tempmatrix); + + tempmatrix = U(Slice(n,2*n-1),Slice(0,n-1)); + print("a"); + transform(world, kramers_pairs, tempmatrix); + + occupieds += kramers_pairs; + print("a"); + ////Apply the transformation to the Exchange - transform(world, Kpsis, U); + for(unsigned int j = 0; j < n; j++){ + kramers_pairs[j] = Kpsis[j].KramersPair(); + } + tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); + print("a"); + transform(world, Kpsis, tempmatrix); + tempmatrix = U(Slice(n,2*n-1),Slice(0,n-1)); + print("a"); + transform(world, kramers_pairs, tempmatrix); + Kpsis += kramers_pairs; - ////Apply the transformation to the orbitals - transform(world, occupieds, U); //truncate for(int kk = 0; kk < Init_params.num_occupied; kk++){ diff --git a/src/apps/moldft/fcwf.cc b/src/apps/moldft/fcwf.cc index dad0b58537c..8b13c318a90 100644 --- a/src/apps/moldft/fcwf.cc +++ b/src/apps/moldft/fcwf.cc @@ -257,6 +257,14 @@ void Fcwf::apply(World& world, complex_derivative_3d& D){ m_psi = madness::apply(world, D, m_psi); } +Fcwf Fcwf::KramersPair(){ + complex_function_3d phi0 = -1.0*conj(m_psi[1]); + complex_function_3d phi1 = conj(m_psi[0]); + complex_function_3d phi2 = -1.0*conj(m_psi[3]); + complex_function_3d phi3 = conj(m_psi[2]); + return Fcwf(phi0,phi1,phi2,phi3); +} + std::complex inner(const Fcwf& psi, const Fcwf& phi){ //std::complex result(0,0); //for(int i = 0 ; i < 4 ; i++){ diff --git a/src/apps/moldft/fcwf.h b/src/apps/moldft/fcwf.h index cc7ced418e8..20a4636ac4b 100644 --- a/src/apps/moldft/fcwf.h +++ b/src/apps/moldft/fcwf.h @@ -72,6 +72,8 @@ class Fcwf{ void reconstruct(); void compress(); + Fcwf KramersPair(); + }; std::complex inner(const Fcwf& psi, const Fcwf& phi); From 08bb06a377e69a3149d928a519185396358a0a7f Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 21 Aug 2019 14:57:53 -0400 Subject: [PATCH 0041/1312] closed shell restricted code working --- src/apps/moldft/DF.cc | 327 +++++++++++++++++++++---------- src/apps/moldft/InitParameters.h | 147 +++++++------- 2 files changed, 293 insertions(+), 181 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index de4dd86e9bc..8646935f9b1 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -522,108 +522,186 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi double myc = 137.0359895; //speed of light in atomic units //for debugging - Tensor> exchange1(n,n); //spin-up contributions - Tensor> exchange2(n,n); //spin-down contributions + /////////////Tensor> exchange1(n,n); //spin-up contributions + /////////////Tensor> exchange2(n,n); //spin-down contributions - //Working on spin-restricted version of exchange now. For now do it the stupid way - for(unsigned int i=0; i < n; i++){ - Fcwf K1 = Fcwf(world); - Fcwf K2 = Fcwf(world); - for(unsigned int j=0; j temp(n-i); + for(unsigned int j = 0; j < n-i; j++){ + temp[j] = complex_factory_3d(world); } - - for(unsigned int j = 0; j < n; j++){ - exchange1(i,j) = inner(occupieds[j],K1); - exchange2(i,j) = inner(occupieds[j],K2); + compress(world, temp); + + std::vector temp0(n-i); + std::vector temp1(n-i); + std::vector temp2(n-i); + std::vector temp3(n-i); + for(unsigned int j = i; j < n; j++){ + temp0[j-i] = occupieds[j][0]; + temp1[j-i] = occupieds[j][1]; + temp2[j-i] = occupieds[j][2]; + temp3[j-i] = occupieds[j][3]; } - Kpsis[i] = K1+K2; + gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*conj(world,temp0)); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*conj(world,temp1)); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*conj(world,temp2)); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*conj(world,temp3)); + truncate(world, temp); + + //if(world.rank()==0) print(i, "Starting apply phase in K"); + + temp = apply(world, op, temp); + + truncate(world,temp); + + //if(world.rank()==0) print(i, "Exiting apply phase in K"); + + Kpsis[i][0] += sum(world, mul(world, temp, temp0)); + Kpsis[i][1] += sum(world, mul(world, temp, temp1)); + Kpsis[i][2] += sum(world, mul(world, temp, temp2)); + Kpsis[i][3] += sum(world, mul(world, temp, temp3)); + + //if(world.rank()==0) print(i, "Exiting sum block in K"); + + temp = conj(world, temp); + + temp0 = occupieds[i][0]*temp; + temp1 = occupieds[i][1]*temp; + temp2 = occupieds[i][2]*temp; + temp3 = occupieds[i][3]*temp; + + // if(world.rank()==0) print(i, "Entering final loop in K"); + + for(unsigned int j = i+1; j < n; j++){ + Kpsis[j][0] += temp0[j-i]; + Kpsis[j][1] += temp1[j-i]; + Kpsis[j][2] += temp2[j-i]; + Kpsis[j][3] += temp3[j-i]; + } + + //if(world.rank()==0) print(i, "Exiting final loop in K"); + + Kpsis[i].truncate(); } - if(world.rank()==0) print("K1:\n",exchange1,"\nK2:\n",exchange2,"\nsum:\n",exchange1+exchange2); - //for(unsigned int i = 0; i < n; i++){ - // std::vector temp(n-i); - // for(unsigned int j = 0; j < n-i; j++){ - // temp[j] = complex_factory_3d(world); - // } - // compress(world, temp); + //Now we need exchange contributions from the time-reversed orbitals that we don't explicitly store. - // std::vector temp0(n-i); - // std::vector temp1(n-i); - // std::vector temp2(n-i); - // std::vector temp3(n-i); - // for(unsigned int j = i; j < n; j++){ - // temp0[j-i] = occupieds[j][0]; - // temp1[j-i] = occupieds[j][1]; - // temp2[j-i] = occupieds[j][2]; - // temp3[j-i] = occupieds[j][3]; - // } - // gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*conj(world,temp0)); - // gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*conj(world,temp1)); - // gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*conj(world,temp2)); - // gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*conj(world,temp3)); + for(unsigned int i = 0; i < n; i++){ - // truncate(world, temp); + std::vector temp(n-i); + for(unsigned int j = 0; j < n-i; j++){ + temp[j] = complex_factory_3d(world); + } + compress(world, temp); + + std::vector temp0(n-i); + std::vector temp1(n-i); + std::vector temp2(n-i); + std::vector temp3(n-i); + for(unsigned int j = i; j < n; j++){ + temp0[j-i] = -1.0*occupieds[j][1]; + temp1[j-i] = occupieds[j][0]; + temp2[j-i] = -1.0*occupieds[j][3]; + temp3[j-i] = occupieds[j][2]; + } - // //if(world.rank()==0) print(i, "Starting apply phase in K"); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*temp0); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*temp1); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*temp2); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*temp3); - // temp = apply(world, op, temp); - // - // truncate(world,temp); + truncate(world, temp); - // //if(world.rank()==0) print(i, "Exiting apply phase in K"); + //if(world.rank()==0) print(i, "Starting apply phase in K"); - // Kpsis[i][0] += sum(world, mul(world, temp, temp0)); - // Kpsis[i][1] += sum(world, mul(world, temp, temp1)); - // Kpsis[i][2] += sum(world, mul(world, temp, temp2)); - // Kpsis[i][3] += sum(world, mul(world, temp, temp3)); - // - // //if(world.rank()==0) print(i, "Exiting sum block in K"); + temp = apply(world, op, temp); + + truncate(world,temp); - // temp = conj(world, temp); + //if(world.rank()==0) print(i, "Exiting apply phase in K"); - // temp0 = occupieds[i][0]*temp; - // temp1 = occupieds[i][1]*temp; - // temp2 = occupieds[i][2]*temp; - // temp3 = occupieds[i][3]*temp; + Kpsis[i][0] += sum(world, mul(world, temp, conj(world,temp0))); + Kpsis[i][1] += sum(world, mul(world, temp, conj(world,temp1))); + Kpsis[i][2] += sum(world, mul(world, temp, conj(world,temp2))); + Kpsis[i][3] += sum(world, mul(world, temp, conj(world,temp3))); + + //if(world.rank()==0) print(i, "Exiting sum block in K"); - // // if(world.rank()==0) print(i, "Entering final loop in K"); + //Below line commented out, negative shifted to next block of code + //temp = -1.0*temp; - // for(unsigned int j = i+1; j < n; j++){ - // Kpsis[j][0] += temp0[j-i]; - // Kpsis[j][1] += temp1[j-i]; - // Kpsis[j][2] += temp2[j-i]; - // Kpsis[j][3] += temp3[j-i]; - // } - // - // //if(world.rank()==0) print(i, "Exiting final loop in K"); + temp0 = conj(occupieds[i][1])*temp; + temp1 = -1.0*conj(occupieds[i][0])*temp; + temp2 = conj(occupieds[i][3])*temp; + temp3 = -1.0*conj(occupieds[i][2])*temp; - // Kpsis[i].truncate(); - //} + // if(world.rank()==0) print(i, "Entering final loop in K"); + + for(unsigned int j = i+1; j < n; j++){ + Kpsis[j][0] += temp0[j-i]; + Kpsis[j][1] += temp1[j-i]; + Kpsis[j][2] += temp2[j-i]; + Kpsis[j][3] += temp3[j-i]; + } + + //if(world.rank()==0) print(i, "Exiting final loop in K"); + + Kpsis[i].truncate(); + } //Report time Tensor times = end_timer(world); @@ -667,6 +745,16 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o std::vector temp_orbitals; std::vector kramers_pairs; + //Make a permutation matrix for use later + Tensor P(2*n,2*n); + for(unsigned int j=0; j < n; j++){ + P(j,2*j) = 1; + P(n+j,2*j+1) = 1; + } + + //Debugging + if(world.rank()==0) print("P:\n", P); + if(world.rank()==0) print(" Forming Matrices"); start_timer(world); @@ -681,6 +769,12 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o real_function_3d potential = myV + apply(op,rho); potential.truncate(); + // + //Also make the vector of Kramers Pairs + //TODO: Actually roll this into a variant of matrix inner that doesn't explictly store this vector in order to save memory. + for(unsigned int j = 0; j < n; j++){ + kramers_pairs.push_back(occupieds[j].KramersPair()); + } ////Debugging @@ -688,23 +782,39 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //for(unsigned int j = 0; j < n; j++){ // debug_orbitals.push_back(occupieds[j]*myV); //} - //fock = matrix_inner(world,occupieds,debug_orbitals); + //tempmatrix = matrix_inner(world,occupieds,debug_orbitals); + //fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); + //fock(Slice(n,2*n-1),Slice(n,2*n-1)) = -1.0*conj(tempmatrix); + //tempmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); + //fock(Slice(0,n-1),Slice(n,2*n-1)) = conj(tempmatrix); + //fock(Slice(n,2*n-1),Slice(0,n-1)) = copy(tempmatrix); //if(world.rank()==0) print("\nVnuc matrix:\n",fock); + + + //real_function_3d idk = apply(op,rho); //for(unsigned int j = 0; j < n; j++){ // debug_orbitals[j] = occupieds[j]*idk; //} - //fock = matrix_inner(world,occupieds,debug_orbitals); + //tempmatrix = matrix_inner(world,occupieds,debug_orbitals); + //fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); + //fock(Slice(n,2*n-1),Slice(n,2*n-1)) = -1.0*conj(tempmatrix); + //tempmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); + //fock(Slice(0,n-1),Slice(n,2*n-1)) = conj(tempmatrix); + //fock(Slice(n,2*n-1),Slice(0,n-1)) = copy(tempmatrix); //if(world.rank()==0) print("\nJ matrix:\n",fock); + + + //for(unsigned int j = 0; j < n; j++){ // debug_orbitals[j] = Kpsis[j]; //} - //fock = matrix_inner(world,occupieds,debug_orbitals); + //tempmatrix = matrix_inner(world,occupieds,debug_orbitals); //if(world.rank()==0) print("\nK matrix:\n",fock); //for(unsigned int j = 0; j < n; j++){ // debug_orbitals[j] = apply_T(world,occupieds[j]); //} - //fock = matrix_inner(world,occupieds,debug_orbitals); + //tempmatrix = matrix_inner(world,occupieds,debug_orbitals); //if(world.rank()==0) print("\nT matrix:\n",fock); @@ -732,32 +842,29 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o start_timer(world); - //Also make the vector of Kramers Pairs - //TODO: Actually roll this into a variant of matrix inner that doesn't explictly store this vector in order to save memory. - for(unsigned int j = 0; j < n; j++){ - kramers_pairs.push_back(occupieds[j].KramersPair()); - } //Now compute the fock matrix + //sign doesn't line up with the notes, but I can't find out why Tensor> tempmatrix = matrix_inner(world, occupieds, temp_orbitals); fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); - fock(Slice(n,2*n-1),Slice(n,2*n-1)) = -1.0*conj(tempmatrix); + fock(Slice(n,2*n-1),Slice(n,2*n-1)) = conj(tempmatrix); tempmatrix = matrix_inner(world,kramers_pairs,temp_orbitals); - fock(Slice(0,n-1),Slice(n,2*n-1)) = copy(tempmatrix); - fock(Slice(n,2*n-1),Slice(0,n-1)) = conj(tempmatrix); + fock(Slice(0,n-1),Slice(n,2*n-1)) = -1.0*conj(tempmatrix); + fock(Slice(n,2*n-1),Slice(0,n-1)) = copy(tempmatrix); //Put in Exchange part tempmatrix = matrix_inner(world,occupieds,Kpsis); - fock(Slice(0,n-1),Slice(0,n-1)) = fock(Slice(0,n-1),Slice(0,n-1)) + tempmatrix; - fock(Slice(n,2*n-1),Slice(n,2*n-1)) = fock(Slice(n,2*n-1),Slice(n,2*n-1)) + transpose(tempmatrix); + fock(Slice(0,n-1),Slice(0,n-1)) = fock(Slice(0,n-1),Slice(0,n-1)) - tempmatrix; + fock(Slice(n,2*n-1),Slice(n,2*n-1)) = fock(Slice(n,2*n-1),Slice(n,2*n-1)) - transpose(tempmatrix); tempmatrix = matrix_inner(world, kramers_pairs, Kpsis); - fock(Slice(n,2*n-1),Slice(0,n-1)) = fock(Slice(n,2*n-1),Slice(0,n-1)) + tempmatrix; - fock(Slice(0,n-1),Slice(n,2*n-1)) = fock(Slice(0,n-1),Slice(n,2*n-1)) - conj(tempmatrix); + fock(Slice(n,2*n-1),Slice(0,n-1)) = fock(Slice(n,2*n-1),Slice(0,n-1)) - tempmatrix; + fock(Slice(0,n-1),Slice(n,2*n-1)) = fock(Slice(0,n-1),Slice(n,2*n-1)) + conj(tempmatrix); //DEBUGGING: if(world.rank()==0) print("new fock matrix:\n",fock); - //symmetrize + //permute and symmetrize + fock = inner(transpose(P),inner(fock,P)); fock = (1.0/2.0)*(fock + conj_transpose(fock)); Tensor times = end_timer(world); @@ -775,7 +882,8 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //DEBUGGING: if(world.rank()==0) print("new overlap matrix:\n",overlap); - //symmetrize + //permute symmetrize + overlap = inner(transpose(P),inner(overlap,P)); overlap = (1.0/2.0)*(overlap + conj_transpose(overlap)); times = end_timer(world); @@ -783,11 +891,12 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o times = end_timer(world); if(world.rank()==0) print(" ", times[0]); + //debugging: print fock and overlap matrices - //if(world.rank()==0){ - // print("fock:\n", fock); - // print("\noverlap:\n", overlap); - //} + if(world.rank()==0){ + print("permuted fock:\n", fock); + print("\npermuted overlap:\n", overlap); + } if(world.rank()==0) print(" Eigensolver"); start_timer(world); @@ -798,7 +907,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print matrix of eigenvectors - if(world.rank()==0) print("U:\n", U); + if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. if(world.rank()==0) print(" Removing Rotations"); @@ -811,8 +920,8 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o bool switched = true; while (switched) { switched = false; - for (unsigned int kk = 0; kk < Init_params.num_occupied; kk++) { - for (unsigned int j = kk + 1; j < Init_params.num_occupied; j++) { + for (unsigned int kk = 0; kk < 2*Init_params.num_occupied; kk++) { + for (unsigned int j = kk + 1; j < 2*Init_params.num_occupied; j++) { double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); //if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { @@ -831,21 +940,22 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o } // Fix phases. - for (unsigned int kk = 0; kk < Init_params.num_occupied; ++kk) + for (unsigned int kk = 0; kk < 2*Init_params.num_occupied; ++kk) U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); + if(world.rank()==0) print("After column swapping\nU:\n", U, "\nevals:\n", evals); //Find clusters of degenerate eigenvalues and rotate eigenvectors to maximize overlap with previous ones unsigned int ilo = 0; // first element of cluster if(world.rank()==0) print(" Degeneracy threshold: ",thresh_degenerate); - while (ilo < Init_params.num_occupied - 1) { + while (ilo < 2*Init_params.num_occupied - 1) { unsigned int ihi = ilo; while (fabs(evals[ilo] - evals[ihi + 1]) < thresh_degenerate * std::fabs(evals[ilo])){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { //< thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { ++ihi; - if (ihi == Init_params.num_occupied - 1) + if (ihi == 2*Init_params.num_occupied - 1) break; } unsigned int nclus = ihi - ilo + 1; @@ -877,6 +987,9 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //Debugging: Print transformation matrix after rotation removal if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); + U = inner(P,inner(U,transpose(P))); + evals = inner(evals,transpose(P)); + if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -924,7 +1037,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //} //Set energies = evals, and fix the energy printing stage. - energies = evals; + energies = evals(Slice(0,n-1)); times = end_timer(world); diff --git a/src/apps/moldft/InitParameters.h b/src/apps/moldft/InitParameters.h index f8f60f10fdd..36cc179053c 100644 --- a/src/apps/moldft/InitParameters.h +++ b/src/apps/moldft/InitParameters.h @@ -103,10 +103,9 @@ namespace madness{ complex_function_3d complexreader; Fcwf spinup(world); Fcwf spindown(world); - real_function_3d xfunc = real_factory_3d(world).f(myxfunc); - real_function_3d yfunc = real_factory_3d(world).f(myyfunc); - if(num_occupied != 5) throw; - for(unsigned int i = 0; i < 2; i++){ + real_function_3d xfunc = real_factory_3d(world).f(myxfunc); + real_function_3d yfunc = real_factory_3d(world).f(myyfunc); + for(unsigned int i = 0; i < num_occupied; i++){ input & reader; complexreader = function_real2complex(reader); spinup[0] = complexreader; @@ -129,79 +128,79 @@ namespace madness{ //orbitals.push_back(spindown); } - //Bring in p block, construct 4-component wavefunctions, and diagonalize under j_z - std::vector jzorbitals; - std::vector justorbitals; - for(unsigned int i=0; i<3; i++){ - input & reader; - complexreader = function_real2complex(reader); - spinup[0] = complexreader; - spinup[1] = complex_factory_3d(world); - spinup[2] = (-myi) * Dz(complexreader); - spinup[2].scale(0.5); - spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); - spinup[3].scale(0.5); - spinup.normalize(); - spindown[0] = complex_factory_3d(world); - spindown[1] = complexreader; - spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); - spindown[2].scale(0.5); - spindown[3] = (myi) * Dz(complexreader); - spindown[3].scale(0.5); - spindown.normalize(); - ////spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); - ////spindown = Fcwf(complex_factory_3d(world), copy(complexreader), complex_factory_3d(world), complex_factory_3d(world)); - //spinup = spinup + spindown; - //orbitals.push_back(spinup); - //orbitals.push_back(spindown); - justorbitals.push_back(spinup); - justorbitals.push_back(spindown); - } - - - //for(unsigned int i=0; i<6; i++){ - // spinup[0] = -myi*(xfunc*Dy(justorbitals[i][0])-yfunc*Dx(justorbitals[i][0])) + 0.5*justorbitals[i][0]; - // spinup[1] = -myi*(xfunc*Dy(justorbitals[i][1])-yfunc*Dx(justorbitals[i][1])) - 0.5*justorbitals[i][1]; - // spinup[2] = -myi*(xfunc*Dy(justorbitals[i][2])-yfunc*Dx(justorbitals[i][2])) + 0.5*justorbitals[i][2]; - // spinup[3] = -myi*(xfunc*Dy(justorbitals[i][3])-yfunc*Dx(justorbitals[i][3])) - 0.5*justorbitals[i][3]; - // jzorbitals.push_back(spinup); - //} - - //Tensor> jztensor = matrix_inner(world,justorbitals,jzorbitals); - //Tensor> overlap = matrix_inner(world,justorbitals,justorbitals); - - //Tensor> U(6,6); - //Tensor evals(6); - - //if(world.rank()==0){ - // print("\njz:\n", jztensor); - // print("\noverlap:\n", overlap); + ////Bring in p block, construct 4-component wavefunctions, and diagonalize under j_z + //std::vector jzorbitals; + //std::vector justorbitals; + //for(unsigned int i=0; i<3; i++){ + // input & reader; + // complexreader = function_real2complex(reader); + // spinup[0] = complexreader; + // spinup[1] = complex_factory_3d(world); + // spinup[2] = (-myi) * Dz(complexreader); + // spinup[2].scale(0.5); + // spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); + // spinup[3].scale(0.5); + // spinup.normalize(); + // spindown[0] = complex_factory_3d(world); + // spindown[1] = complexreader; + // spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); + // spindown[2].scale(0.5); + // spindown[3] = (myi) * Dz(complexreader); + // spindown[3].scale(0.5); + // spindown.normalize(); + // ////spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + // ////spindown = Fcwf(complex_factory_3d(world), copy(complexreader), complex_factory_3d(world), complex_factory_3d(world)); + // //spinup = spinup + spindown; + // //orbitals.push_back(spinup); + // //orbitals.push_back(spindown); + // justorbitals.push_back(spinup); + // justorbitals.push_back(spindown); //} - // - //sygv(jztensor,overlap,1,U,evals); - //if(world.rank()==0) print("U:\n",U); - //if(world.rank()==0) print("evals:\n",evals); - //transform(world,justorbitals,U); - //for(unsigned int i = 0; i < 6; i++){ - // if(evals[i] > 0){ - // if(world.rank()==0) print("Add in state with eval: ", evals[i]); - // orbitals.push_back(justorbitals[i]); - // } - //} - orbitals.push_back(justorbitals[0]); - orbitals.push_back(justorbitals[2]); - orbitals.push_back(justorbitals[4]); - //duplicate the energies - //energies = Tensor(2*num_occupied); - //double csquared = 137.0359895*137.0359895; - //double temp; - //for(unsigned int i = 0; i < num_occupied; i++){ - // temp = temp_energies(i);//+csquared; - // energies(2*i) = temp; - // energies(2*i+1) = temp; - //} + ////for(unsigned int i=0; i<6; i++){ + //// spinup[0] = -myi*(xfunc*Dy(justorbitals[i][0])-yfunc*Dx(justorbitals[i][0])) + 0.5*justorbitals[i][0]; + //// spinup[1] = -myi*(xfunc*Dy(justorbitals[i][1])-yfunc*Dx(justorbitals[i][1])) - 0.5*justorbitals[i][1]; + //// spinup[2] = -myi*(xfunc*Dy(justorbitals[i][2])-yfunc*Dx(justorbitals[i][2])) + 0.5*justorbitals[i][2]; + //// spinup[3] = -myi*(xfunc*Dy(justorbitals[i][3])-yfunc*Dx(justorbitals[i][3])) - 0.5*justorbitals[i][3]; + //// jzorbitals.push_back(spinup); + ////} + + ////Tensor> jztensor = matrix_inner(world,justorbitals,jzorbitals); + ////Tensor> overlap = matrix_inner(world,justorbitals,justorbitals); + + ////Tensor> U(6,6); + ////Tensor evals(6); + + ////if(world.rank()==0){ + //// print("\njz:\n", jztensor); + //// print("\noverlap:\n", overlap); + ////} + //// + ////sygv(jztensor,overlap,1,U,evals); + + ////if(world.rank()==0) print("U:\n",U); + ////if(world.rank()==0) print("evals:\n",evals); + + ////transform(world,justorbitals,U); + ////for(unsigned int i = 0; i < 6; i++){ + //// if(evals[i] > 0){ + //// if(world.rank()==0) print("Add in state with eval: ", evals[i]); + //// orbitals.push_back(justorbitals[i]); + //// } + ////} + //orbitals.push_back(justorbitals[0]); + //orbitals.push_back(justorbitals[2]); + //orbitals.push_back(justorbitals[4]); + ////duplicate the energies + ////energies = Tensor(2*num_occupied); + ////double csquared = 137.0359895*137.0359895; + ////double temp; + ////for(unsigned int i = 0; i < num_occupied; i++){ + //// temp = temp_energies(i);//+csquared; + //// energies(2*i) = temp; + //// energies(2*i+1) = temp; + ////} ////correct the number of orbitals //num_occupied *= 2; From 48684652cc4c4a59636cb40e756a6ae7baad941f Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 18 Sep 2019 14:35:47 -0400 Subject: [PATCH 0042/1312] E effective calculation causing hangs. Commenting out now. --- src/apps/moldft/DF.cc | 60 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 6ffe60885d9..0d96686b365 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -1707,36 +1707,36 @@ void DF::solve_occupied(World & world) } //Calculation of Effective Electric Field: - if(world.rank()==0) print("Effective Electric Field calculation"); - std::complex myi(0,1); - std::complex one(1,0); - real_derivative_3d Dx(world,0); - real_derivative_3d Dy(world,1); - real_derivative_3d Dz(world,2); - double Eeff(0.0); - for(unsigned int j; j < Init_params.num_occupied; j++){ - real_function_3d LL(world); - for(unsigned int kk; kk < Init_params.num_occupied; kk++){ - if(kk != j){ - LL += squaremod(occupieds[kk]); - } - } - LL = apply(op,LL); - LL += Vnuc; - complex_function_3d Lx = one*Dx(LL); - complex_function_3d Ly = one*Dy(LL); - complex_function_3d Lz = one*Dz(LL); - Fcwf temp(world); - - temp[0] = Lz*occupieds[j][0] + (Lx - myi*Ly)*occupieds[j][1]; - temp[1] = (Lx + myi*Ly)*occupieds[j][0] - Lz*occupieds[j][1]; - temp[2] = Lz*occupieds[j][2] + (Lx - myi*Ly)*occupieds[j][3]; - temp[2].scale(-1.0); - temp[3] = Lz*occupieds[j][3] - (Lx + myi*Ly)*occupieds[j][2]; - - Eeff += std::real(inner(occupieds[0],temp)); - } - if(world.rank()==0) print("Eeff = ", Eeff); + //if(world.rank()==0) print("Effective Electric Field calculation"); + //std::complex myi(0,1); + //std::complex one(1,0); + //real_derivative_3d Dx(world,0); + //real_derivative_3d Dy(world,1); + //real_derivative_3d Dz(world,2); + //double Eeff(0.0); + //for(unsigned int j; j < Init_params.num_occupied; j++){ + // real_function_3d LL(world); + // for(unsigned int kk; kk < Init_params.num_occupied; kk++){ + // if(kk != j){ + // LL += squaremod(occupieds[kk]); + // } + // } + // LL = apply(op,LL); + // LL += Vnuc; + // complex_function_3d Lx = one*Dx(LL); + // complex_function_3d Ly = one*Dy(LL); + // complex_function_3d Lz = one*Dz(LL); + // Fcwf temp(world); + + // temp[0] = Lz*occupieds[j][0] + (Lx - myi*Ly)*occupieds[j][1]; + // temp[1] = (Lx + myi*Ly)*occupieds[j][0] - Lz*occupieds[j][1]; + // temp[2] = Lz*occupieds[j][2] + (Lx - myi*Ly)*occupieds[j][3]; + // temp[2].scale(-1.0); + // temp[3] = Lz*occupieds[j][3] - (Lx + myi*Ly)*occupieds[j][2]; + + // Eeff += std::real(inner(occupieds[0],temp)); + //} + //if(world.rank()==0) print("Eeff = ", Eeff); } From 0e55d76966cc74278ed6d26da7992e2f9f4bb65d Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 18 Sep 2019 15:29:34 -0400 Subject: [PATCH 0043/1312] working, but slow --- src/apps/moldft/DF.cc | 93 ++++++++++++++++++++++++++++++------------- src/apps/moldft/DF.h | 2 + 2 files changed, 68 insertions(+), 27 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 8646935f9b1..4e0027618b9 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -17,14 +17,17 @@ using namespace madness; +//Just a function for f(x,y,z) = x double myxfunc(const madness::coord_3d& r){ return r[0]; } + +//Just a function for f(x,y,z) = y double myyfunc(const madness::coord_3d& r){ return r[1]; } -// Needed for rebalancing +// A function that constructs a cost tree, which is a heuristic used for load balancing template struct lbcost { double leaf_value; @@ -51,7 +54,7 @@ void DF::start_timer(World& world) sss.push_back(cpu_time()); } -// Needed for timers +// Used by end_timer double DF::pop(std::vector& v) { double x = v.back(); @@ -68,7 +71,7 @@ Tensor DF::end_timer(World& world) return times; } -//reports back with time spent in calculation (current time - the first time in ttt,sss) +//reports back with time spent in calculation so far (current time - the first time in ttt,sss) Tensor DF::get_times(World& world){ Tensor times(2); times[0] = wall_time() - ttt[0]; @@ -99,6 +102,7 @@ Function,3> function_real2complex(const Function& /// Factory function generating operator for convolution with grad(bsh) in 3D /// Returns a 3-vector containing the convolution operator for the /// x, y, and z components of grad(bsh) +//Mostly copied from a function written by W. Scott Thornton static inline std::vector< std::shared_ptr< SeparatedConvolution > > @@ -191,7 +195,7 @@ GradBSHOperator_Joel(World& world, } -//Stolen from SCF.cc to aid in orthonormalization +//Stolen from SCF.cc to aid in orthonormalization. Used in orthogonalize_inplace. Tensor> Q2(const Tensor>& s) { Tensor> Q = -0.5*s; for (int i=0; i { m_Zlist.push_back(molecule.get_atom_number(i)); } - //find atomic mass numbers for each atom + //find atomic mass numbers for each atom. This list matches that of Visccher and Dyall (1997) int Alist[116] = {1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,58,63,64,69,74,75,80,79,84,85,88,89,90,93,98,98,102,103,106,107,114,115,120,121,130,127,132,133,138,139,140,141,144,145,152,153,158,159,162,162,168,169,174,175,180,181,184,187,192,193,195,197,202,205,208,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,261,262,263,262,265,266,264,272,277,284,289,288,292}; for(unsigned int i = 0; i < m_Zlist.size(); i++){ m_Alist.push_back(Alist[m_Zlist[i]-1]); @@ -265,7 +269,7 @@ class GaussianNucleusFunctor : public FunctionFunctorInterface { }; -//Functor to make the fermi nuclear charge distribution (not normalized) for a given center +//Functor to make the fermi nuclear charge distribution (NOT the potential, and NOT normalized) for a given center class FermiNucDistFunctor : public FunctionFunctorInterface { private: int m_A; @@ -279,7 +283,7 @@ class FermiNucDistFunctor : public FunctionFunctorInterface { m_T = 2.3/bohr_rad; m_R.push_back(R); - //find atomic mass numbers for each atom + //find atomic mass numbers for each atom. This list matches that of Visccher and Dyall (1997) int Alist[116] = {1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,58,63,64,69,74,75,80,79,84,85,88,89,90,93,98,98,102,103,106,107,114,115,120,121,130,127,132,133,138,139,140,141,144,145,152,153,158,159,162,162,168,169,174,175,180,181,184,187,192,193,195,197,202,205,208,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,261,262,263,262,265,266,264,272,277,284,289,288,292}; m_A = Alist[Z-1]; @@ -311,7 +315,10 @@ class FermiNucDistFunctor : public FunctionFunctorInterface { return 18; } + //Print the parameters of the Fermi nuclear charge distribution void print_details(World& world){ + + //Constants necessary to print the details. Technically need to use bohr_rad parameter here int Alist[116] = {1,4,7,9,11,12,14,16,19,20,23,24,27,28,31,32,35,40,39,40,45,48,51,52,55,56,59,58,63,64,69,74,75,80,79,84,85,88,89,90,93,98,98,102,103,106,107,114,115,120,121,130,127,132,133,138,139,140,141,144,145,152,153,158,159,162,162,168,169,174,175,180,181,184,187,192,193,195,197,202,205,208,209,209,210,222,223,226,227,232,231,238,237,244,243,247,247,251,252,257,258,259,262,261,262,263,262,265,266,264,272,277,284,289,288,292}; double T = 2.3/52917.72490083583; double PI = constants::pi; @@ -338,7 +345,7 @@ double myr(const coord_3d& r){ return std::sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]); } -//Creates the fermi nuclear potential. Also calculates the nuclear repulsion energy +//Creates the fermi nuclear potentiali from the charge distribution. Also calculates the nuclear repulsion energy void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_function_3d& potential, double& nuclear_repulsion_energy){ if(world.rank()==0) print("\n***Making a Fermi Potential***"); @@ -346,9 +353,12 @@ void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_functi std::vector Rlist = Init_params.molecule.get_all_coords_vec(); std::vector Zlist(Rlist.size()); unsigned int num_atoms = Rlist.size(); + + //variables for upcoming loop real_function_3d temp; double tempnorm; + //Go through the atoms in the molecule and construct the total charge distribution due to all nuclei for(unsigned int i = 0; i < num_atoms; i++){ Zlist[i] = Init_params.molecule.get_atom_number(i); FermiNucDistFunctor rho(Zlist[i], Rlist[i],DFparams.bohr_rad); @@ -364,9 +374,12 @@ void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_functi } } + //Potential is found by application of the coulomb operator to the charge distribution potential = apply(op,potential); - + //Calculate the nuclear repulsion energy + //It doesn't change iteration to iteration, so we want to calculate it once and store the result + //We calculate it inside this function because here we already have access to the nuclear charges and coordinates nuclear_repulsion_energy = 0.0; double rr; for(unsigned int m = 0; m < num_atoms; m++){ @@ -380,10 +393,12 @@ void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_functi } // Collective constructor +// Design of this was mostly taken from Bryan Sundahl's response code DF::DF(World & world, const char* filename) : DF(world, (world.rank() == 0 ? std::make_shared(filename) : nullptr)) {} // Constructor that actually does stuff +// Design of this was mostly taken from Bryan Sundahl's response code DF::DF(World & world,std::shared_ptr input) { // Start a timer start_timer(world); @@ -405,13 +420,15 @@ DF::DF(World & world,std::shared_ptr input) { // Broadcast to all other nodes world.gop.broadcast_serializable(DFparams, 0); - // Read in archive + // Read in archive, but first find out if we're reading an nwchem file or other archive if(DFparams.nwchem){ Init_params.readnw(world, DFparams.archive); } else{ Init_params.read(world, DFparams.archive, DFparams.restart); } + + //print initialization parameters and molecule geometry if(world.rank() == 0){ Init_params.print_params(); print_molecule(world); @@ -419,6 +436,8 @@ DF::DF(World & world,std::shared_ptr input) { // Set some function defaults FunctionDefaults<3>::set_thresh(DFparams.thresh); //Always use user-specified thresh + + //Truncate mode 0 is preferrable, but currently way too expensive for relativistic calculations, so for now use 1 FunctionDefaults<3>::set_truncate_mode(1); //If user requests different k, then project functions @@ -631,7 +650,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //if(world.rank()==0) print(i, "Exiting final loop in K"); - Kpsis[i].truncate(); + //Kpsis[i].truncate(); } @@ -753,7 +772,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o } //Debugging - if(world.rank()==0) print("P:\n", P); + //if(world.rank()==0) print("P:\n", P); if(world.rank()==0) print(" Forming Matrices"); start_timer(world); @@ -861,7 +880,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o fock(Slice(0,n-1),Slice(n,2*n-1)) = fock(Slice(0,n-1),Slice(n,2*n-1)) + conj(tempmatrix); //DEBUGGING: - if(world.rank()==0) print("new fock matrix:\n",fock); + //if(world.rank()==0) print("new fock matrix:\n",fock); //permute and symmetrize fock = inner(transpose(P),inner(fock,P)); @@ -880,7 +899,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o overlap(Slice(n,2*n-1),Slice(n,2*n-1)) = matrix_inner(world,kramers_pairs,kramers_pairs); //DEBUGGING: - if(world.rank()==0) print("new overlap matrix:\n",overlap); + //if(world.rank()==0) print("new overlap matrix:\n",overlap); //permute symmetrize overlap = inner(transpose(P),inner(overlap,P)); @@ -893,10 +912,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //debugging: print fock and overlap matrices - if(world.rank()==0){ - print("permuted fock:\n", fock); - print("\npermuted overlap:\n", overlap); - } + //if(world.rank()==0){ + // print("permuted fock:\n", fock); + // print("\npermuted overlap:\n", overlap); + //} if(world.rank()==0) print(" Eigensolver"); start_timer(world); @@ -907,7 +926,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //debugging: print matrix of eigenvectors - if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); + //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. if(world.rank()==0) print(" Removing Rotations"); @@ -985,11 +1004,11 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o } //Debugging: Print transformation matrix after rotation removal - if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); + //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); U = inner(P,inner(U,transpose(P))); evals = inner(evals,transpose(P)); - if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); + //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -1000,30 +1019,29 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o ////Apply the transformation to the orbitals tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); - print("a"); + //print("a"); transform(world, occupieds, tempmatrix); tempmatrix = U(Slice(n,2*n-1),Slice(0,n-1)); - print("a"); + //print("a"); transform(world, kramers_pairs, tempmatrix); occupieds += kramers_pairs; - print("a"); + //print("a"); ////Apply the transformation to the Exchange for(unsigned int j = 0; j < n; j++){ kramers_pairs[j] = Kpsis[j].KramersPair(); } tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); - print("a"); + //print("a"); transform(world, Kpsis, tempmatrix); tempmatrix = U(Slice(n,2*n-1),Slice(0,n-1)); - print("a"); + //print("a"); transform(world, kramers_pairs, tempmatrix); Kpsis += kramers_pairs; - //truncate for(int kk = 0; kk < Init_params.num_occupied; kk++){ Kpsis[kk].truncate(); @@ -1589,6 +1607,8 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) print("--------------"); start_timer(world); + print_sizes(world); + std::vector Residuals; Fcwf temp_function(world); double residualnorm; @@ -1598,6 +1618,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Diagonalize diagonalize(world, V, op, Kpsis); + print_sizes(world); //Diagonalization forces us to recompute J for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ @@ -1651,6 +1672,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) printf(" tolerance: %.10e\n",tolerance); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); + print_sizes(world); //debugging //for(unsigned int j=0; j < Init_params.num_occupied; j++){ @@ -1690,18 +1712,21 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //truncate for(unsigned int i = 0; i < Init_params.num_occupied; i++) occupieds[i].truncate(); + print_sizes(world); //orthogonalize if(world.rank()==0) print("\n***Orthonormalizing***"); start_timer(world); orthogonalize_inplace(world); + print_sizes(world); //truncate here and normalize again for(unsigned int i = 0; i < Init_params.num_occupied; i++){ occupieds[i].truncate(); occupieds[i].normalize(); } + print_sizes(world); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -2244,6 +2269,20 @@ void DF::solve_virtuals1(World& world){ } +void DF::print_sizes(World& world){ + if(world.rank()==0) print("\nPrinting orbital sizes:\n"); + int n = Init_params.num_occupied; + int a; + for(unsigned int j=0; j < n; j++){ + a = 0; + a += occupieds[j][0].size(); + a += occupieds[j][1].size(); + a += occupieds[j][2].size(); + a += occupieds[j][3].size(); + if(world.rank()==0) print("Orbital; ",j+1," size: ",a); + } +} + //kthxbye diff --git a/src/apps/moldft/DF.h b/src/apps/moldft/DF.h index b4e4d242867..0f6e8981642 100644 --- a/src/apps/moldft/DF.h +++ b/src/apps/moldft/DF.h @@ -137,6 +137,8 @@ class DF { //Lineplot the densities of the large and small component separately. only along x axis on log scale from 10^-startpnt to 10^endpnt with pts evenly spaced in log space void make_component_logplots(World& world, const char* filename1, const char* filename2, int npt, int startpnt, int endpnt); + void print_sizes(World& world); + }; From d5c162772f3e7202b015720a610f303385d60455 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 9 Oct 2019 19:42:22 -0400 Subject: [PATCH 0044/1312] fixed slowness issue --- src/apps/moldft/DF.cc | 95 +++++++++++++++++++++++-------------------- src/apps/moldft/DF.h | 2 +- 2 files changed, 52 insertions(+), 45 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 4e0027618b9..ca545902afb 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -520,8 +520,6 @@ double DF::rele(World& world, Fcwf& psi){ //Calculates K*psi for each psi in the orbitals vector and stores them in result void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsis){ - - //start timer start_timer(world); @@ -582,23 +580,19 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi /////////////if(world.rank()==0) print("K1:\n",exchange1,"\nK2:\n",exchange2,"\nsum:\n",exchange1+exchange2); - - - - - - - - //Calculates exchange contributions from the orbitals that we have stored + + //Loop through orbitals phi_i, computing K(phi_i), and while we're at it, use symmetry to start calculating contributions to later orbitals for(unsigned int i = 0; i < n; i++){ + //temp will hold the contributions (results of the coulomb operator application) that we need to finish calculation of K(phi_i) std::vector temp(n-i); for(unsigned int j = 0; j < n-i; j++){ temp[j] = complex_factory_3d(world); } compress(world, temp); + //break up ith through nth orbitals into their components to facilitate use of vmra functions std::vector temp0(n-i); std::vector temp1(n-i); std::vector temp2(n-i); @@ -610,57 +604,58 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi temp3[j-i] = occupieds[j][3]; } + //These gaxpy calls accomplish the (\phi_j^\dagger)(\phi_i) in the numerator gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*conj(world,temp0)); gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*conj(world,temp1)); gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*conj(world,temp2)); gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*conj(world,temp3)); + //truncate before apply phase truncate(world, temp); - //if(world.rank()==0) print(i, "Starting apply phase in K"); - + //apply coulomb operator temp = apply(world, op, temp); + //truncate again truncate(world,temp); - //if(world.rank()==0) print(i, "Exiting apply phase in K"); - + //Now multiply by phi_j's and accumulate to K(phi_i) Kpsis[i][0] += sum(world, mul(world, temp, temp0)); Kpsis[i][1] += sum(world, mul(world, temp, temp1)); Kpsis[i][2] += sum(world, mul(world, temp, temp2)); Kpsis[i][3] += sum(world, mul(world, temp, temp3)); - //if(world.rank()==0) print(i, "Exiting sum block in K"); + //Everything in temp can be used to accumulate a small part of K(phi_k) for k in [i+1,n] so we avoid calculating the same quantity on future iterations + + //First, take the complex conjugate of the contributions we have temp = conj(world, temp); + //multiply by phi_i temp0 = occupieds[i][0]*temp; temp1 = occupieds[i][1]*temp; temp2 = occupieds[i][2]*temp; temp3 = occupieds[i][3]*temp; - // if(world.rank()==0) print(i, "Entering final loop in K"); - + //acummulate for(unsigned int j = i+1; j < n; j++){ Kpsis[j][0] += temp0[j-i]; Kpsis[j][1] += temp1[j-i]; Kpsis[j][2] += temp2[j-i]; Kpsis[j][3] += temp3[j-i]; } - - //if(world.rank()==0) print(i, "Exiting final loop in K"); - + + //truncate if we're done, but for Kramers-restricted calculations we still have work to do //Kpsis[i].truncate(); } - - //Now we need exchange contributions from the time-reversed orbitals that we don't explicitly store. - - + //This will look very similar to the above loop (over i), but with rearrangements to the temporary vectors + //Later, these can probably be combined into a single loop for(unsigned int i = 0; i < n; i++){ + //RESUME HERE commenting (can use above for guidance) std::vector temp(n-i); for(unsigned int j = 0; j < n-i; j++){ temp[j] = complex_factory_3d(world); @@ -962,7 +957,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o for (unsigned int kk = 0; kk < 2*Init_params.num_occupied; ++kk) U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); - if(world.rank()==0) print("After column swapping\nU:\n", U, "\nevals:\n", evals); + //if(world.rank()==0) print("After column swapping\nU:\n", U, "\nevals:\n", evals); //Find clusters of degenerate eigenvalues and rotate eigenvectors to maximize overlap with previous ones unsigned int ilo = 0; // first element of cluster @@ -1377,6 +1372,7 @@ void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& //create BSH operator real_convolution_3d op = BSHOperator3D(world, mu,small,thresh); // Finer length scale and accuracy control + //Apply BSH operator to Vpsi Vpsi = apply(world, op, Vpsi); @@ -1386,6 +1382,7 @@ void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& //Apply (1/c^2)(H_D + eps) to Vpsi. Using apply_T for convenience, but this requires adding 2c^2Vpsi Vpsi = apply_T(world, Vpsi)*(1.0/c2) + Vpsi * ((eps+2*c2)/c2); + //mu = Vpsi.norm2(); //if(world.rank()==0) print(" after full apply = ", mu); @@ -1450,14 +1447,14 @@ void DF::saveDF(World& world){ void DF::make_gaussian_potential(World& world, real_function_3d& potential){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule, DFparams.bohr_rad); - potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(1).truncate_on_project(); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); } //Creates the nuclear potential from the molecule object. Also calculates the nuclear repulsion energy void DF::make_gaussian_potential(World& world, real_function_3d& potential, double& nuclear_repulsion_energy){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule,DFparams.bohr_rad); - potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(1).truncate_on_project(); + potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); std::vector Rlist = Vfunctor.get_Rlist(); std::vector Zlist = Vfunctor.get_Zlist(); nuclear_repulsion_energy = 0.0; @@ -1607,7 +1604,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) print("--------------"); start_timer(world); - print_sizes(world); + //print_sizes(world); std::vector Residuals; Fcwf temp_function(world); @@ -1618,23 +1615,23 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Diagonalize diagonalize(world, V, op, Kpsis); - print_sizes(world); + //print_sizes(world); //Diagonalization forces us to recompute J for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += 2*squaremod(occupieds[kk]); + rho += squaremod(occupieds[kk]); } + rho.scale(2.0); JandV = V + apply(op,rho); JandV.truncate(); - - //Apply BSH to each psi if(world.rank()==0) print("\n***Applying BSH operator***"); start_timer(world); double maxresidual = -1.0; for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + //construct the function to which we will apply the BSH //occupieds[j].truncate(); temp_function = occupieds[j]*JandV; @@ -1672,7 +1669,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) printf(" tolerance: %.10e\n",tolerance); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - print_sizes(world); + //print_sizes(world); //debugging //for(unsigned int j=0; j < Init_params.num_occupied; j++){ @@ -1712,21 +1709,21 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //truncate for(unsigned int i = 0; i < Init_params.num_occupied; i++) occupieds[i].truncate(); - print_sizes(world); + //print_sizes(world); //orthogonalize if(world.rank()==0) print("\n***Orthonormalizing***"); start_timer(world); orthogonalize_inplace(world); - print_sizes(world); + //print_sizes(world); //truncate here and normalize again for(unsigned int i = 0; i < Init_params.num_occupied; i++){ occupieds[i].truncate(); occupieds[i].normalize(); } - print_sizes(world); + //print_sizes(world); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -1934,6 +1931,9 @@ void DF::solve_occupied(World & world) make_gaussian_potential(world, Vnuc, nuclear_repulsion_energy); } + double Vnucsize = Vnuc.size(); + if(world.rank()==0) print("VNUC SIZE =",Vnucsize); + //Initial load balance DF_load_balance(world, Vnuc); @@ -2269,17 +2269,24 @@ void DF::solve_virtuals1(World& world){ } -void DF::print_sizes(World& world){ +void DF::print_sizes(World& world, bool individual=false){ if(world.rank()==0) print("\nPrinting orbital sizes:\n"); int n = Init_params.num_occupied; - int a; + double a,b1,b2,b3,b4; for(unsigned int j=0; j < n; j++){ - a = 0; - a += occupieds[j][0].size(); - a += occupieds[j][1].size(); - a += occupieds[j][2].size(); - a += occupieds[j][3].size(); - if(world.rank()==0) print("Orbital; ",j+1," size: ",a); + b1 = occupieds[j][0].size(); + b2 = occupieds[j][1].size(); + b3 = occupieds[j][2].size(); + b4 = occupieds[j][3].size(); + a = b1+b2+b3+b4; + if(world.rank()==0){ + if(individual){ + print("Orbital; ",j+1," size: ",b1,"+",b2,"+",b3,"+",b4,"=",a); + } + else{ + print("Orbital; ",j+1," size: ",a); + } + } } } diff --git a/src/apps/moldft/DF.h b/src/apps/moldft/DF.h index 0f6e8981642..e2a59d42af0 100644 --- a/src/apps/moldft/DF.h +++ b/src/apps/moldft/DF.h @@ -137,7 +137,7 @@ class DF { //Lineplot the densities of the large and small component separately. only along x axis on log scale from 10^-startpnt to 10^endpnt with pts evenly spaced in log space void make_component_logplots(World& world, const char* filename1, const char* filename2, int npt, int startpnt, int endpnt); - void print_sizes(World& world); + void print_sizes(World& world, bool individual); }; From 2fa6bb7104e69aa4dcebf9649c8105e19d3b9c42 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Thu, 17 Oct 2019 13:22:03 -0400 Subject: [PATCH 0045/1312] First buggy attempt at ROHF --- src/apps/moldft/DF.cc | 214 +++++++++++++++++++++++++++++----------- src/apps/moldft/fcwf.cc | 31 +++--- src/apps/moldft/fcwf.h | 2 +- 3 files changed, 177 insertions(+), 70 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index ca545902afb..127ec0b0c97 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -523,11 +523,13 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //start timer start_timer(world); + //zero out Kpsis for(unsigned int i = 0; i < Init_params.num_occupied; i++){ Kpsis[i] = Fcwf(world); } + //reconstruct for(unsigned int i = 0; i < Init_params.num_occupied; i++){ occupieds[i].reconstruct(); @@ -653,20 +655,26 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //Now we need exchange contributions from the time-reversed orbitals that we don't explicitly store. //This will look very similar to the above loop (over i), but with rearrangements to the temporary vectors //Later, these can probably be combined into a single loop - for(unsigned int i = 0; i < n; i++){ + + int num_contrib=n; + if(!closed_shell){ + num_contrib = n-1; + } + + for(unsigned int i = 0; i < num_contrib; i++){ //RESUME HERE commenting (can use above for guidance) - std::vector temp(n-i); - for(unsigned int j = 0; j < n-i; j++){ + std::vector temp(num_contrib-i); + for(unsigned int j = 0; j < num_contrib-i; j++){ temp[j] = complex_factory_3d(world); } compress(world, temp); - std::vector temp0(n-i); - std::vector temp1(n-i); - std::vector temp2(n-i); - std::vector temp3(n-i); - for(unsigned int j = i; j < n; j++){ + std::vector temp0(num_contrib-i); + std::vector temp1(num_contrib-i); + std::vector temp2(num_contrib-i); + std::vector temp3(num_contrib-i); + for(unsigned int j = i; j < num_contrib; j++){ temp0[j-i] = -1.0*occupieds[j][1]; temp1[j-i] = occupieds[j][0]; temp2[j-i] = -1.0*occupieds[j][3]; @@ -705,7 +713,7 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi // if(world.rank()==0) print(i, "Entering final loop in K"); - for(unsigned int j = i+1; j < n; j++){ + for(unsigned int j = i+1; j < num_contrib; j++){ Kpsis[j][0] += temp0[j-i]; Kpsis[j][1] += temp1[j-i]; Kpsis[j][2] += temp2[j-i]; @@ -715,6 +723,48 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //if(world.rank()==0) print(i, "Exiting final loop in K"); Kpsis[i].truncate(); + + } + + //For open shell calculations need to calculate final contributions for the singly-occupied orbital + //Could put this as an addition to the first iteration of the loop above for more concise, though less readable code + if(!closed_shell){ + std::vector temp(n-1); + for(unsigned int j = 0; j < n-1; j++){ + temp[j] = complex_factory_3d(world); + } + compress(world, temp); + + std::vector temp0(n-1); + std::vector temp1(n-1); + std::vector temp2(n-1); + std::vector temp3(n-1); + for(unsigned int j = 0; j < n-1; j++){ + temp0[j] = -1.0*occupieds[j][1]; + temp1[j] = occupieds[j][0]; + temp2[j] = -1.0*occupieds[j][3]; + temp3[j] = occupieds[j][2]; + } + + gaxpy(world, 1.0, temp, 1.0, occupieds[n-1][0]*temp0); + gaxpy(world, 1.0, temp, 1.0, occupieds[n-1][1]*temp1); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[n-1][2]*temp2); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[n-1][3]*temp3); + + truncate(world, temp); + + + temp = apply(world, op, temp); + + truncate(world,temp); + + Kpsis[n-1][0] += sum(world, mul(world, temp, conj(world,temp0))); + Kpsis[n-1][1] += sum(world, mul(world, temp, conj(world,temp1))); + Kpsis[n-1][2] += sum(world, mul(world, temp, conj(world,temp2))); + Kpsis[n-1][3] += sum(world, mul(world, temp, conj(world,temp3))); + + Kpsis[n-1].truncate(); + } //Report time @@ -752,19 +802,33 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o start_timer(world); unsigned int n = Init_params.num_occupied; - Tensor> fock(2*n, 2*n); - Tensor> overlap(2*n, 2*n); - Tensor> U(2*n,2*n); - Tensor evals(2*n); + + unsigned int np = Init_params.num_occupied; //number of PAIRS + if(!closed_shell) np -= 1; + + unsigned int m = 2*n; //Size of matrix to use + if(!closed_shell) m-=1; + + Tensor> fock(m, m); + Tensor> overlap(m, m); + Tensor> U(m,m); + Tensor evals(m); std::vector temp_orbitals; std::vector kramers_pairs; //Make a permutation matrix for use later - Tensor P(2*n,2*n); - for(unsigned int j=0; j < n; j++){ + //Fock matrix is built with orbitals in the following order: + // + // stored (doubly occupied) orbitals, singly-occupied orbital (if open shell), then kramers pairs of doubly-occupied orbitals + // + //However, before diagonalization we want the fock matrix as if our orbitals were in order of increasing energy. + //This permutation matrix will accomplish the column and row swapping necessary to reorder + Tensor P(m,m); + for(unsigned int j=0; j < np; j++){ P(j,2*j) = 1; P(n+j,2*j+1) = 1; } + if(!closed_shell) P(n-1,m) = 1; //Debugging //if(world.rank()==0) print("P:\n", P); @@ -777,16 +841,18 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //calculate coulomb part if(world.rank() == 0) print(" Adding (V+J)psi"); real_function_3d rho = real_factory_3d(world); - for(unsigned int j = 0; j < n; j++){ + for(unsigned int j = 0; j < np; j++){ rho += 2*squaremod(occupieds[j]); } + if(!closed_shell) rho += squaremod(occupieds[n-1]); real_function_3d potential = myV + apply(op,rho); potential.truncate(); - // + + //Also make the vector of Kramers Pairs //TODO: Actually roll this into a variant of matrix inner that doesn't explictly store this vector in order to save memory. - for(unsigned int j = 0; j < n; j++){ + for(unsigned int j = 0; j < np; j++){ kramers_pairs.push_back(occupieds[j].KramersPair()); } @@ -859,25 +925,33 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //Now compute the fock matrix //sign doesn't line up with the notes, but I can't find out why + if(world.rank()==0) print("a"); Tensor> tempmatrix = matrix_inner(world, occupieds, temp_orbitals); fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); - fock(Slice(n,2*n-1),Slice(n,2*n-1)) = conj(tempmatrix); + fock(Slice(n,m-1),Slice(n,m-1)) = conj(tempmatrix(Slice(0,np-1),Slice(0,np-1))); + + if(world.rank()==0) print("b"); tempmatrix = matrix_inner(world,kramers_pairs,temp_orbitals); - fock(Slice(0,n-1),Slice(n,2*n-1)) = -1.0*conj(tempmatrix); - fock(Slice(n,2*n-1),Slice(0,n-1)) = copy(tempmatrix); + //if(world.rank()==0) print(occupieds.size(), Kpsis.size(), fock.dim(0), fock.dim(1), tempmatrix.dim(0), tempmatrix.dim(1)); + fock(Slice(n,m-1),Slice(0,n-1)) = copy(tempmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj(tempmatrix); //Put in Exchange part + if(world.rank()==0) print("c"); tempmatrix = matrix_inner(world,occupieds,Kpsis); fock(Slice(0,n-1),Slice(0,n-1)) = fock(Slice(0,n-1),Slice(0,n-1)) - tempmatrix; - fock(Slice(n,2*n-1),Slice(n,2*n-1)) = fock(Slice(n,2*n-1),Slice(n,2*n-1)) - transpose(tempmatrix); + fock(Slice(n,m-1),Slice(n,m-1)) = fock(Slice(n,m-1),Slice(n,m-1)) - transpose(tempmatrix(Slice(0,np-1),Slice(0,np-1))); + + if(world.rank()==0) print("d"); tempmatrix = matrix_inner(world, kramers_pairs, Kpsis); - fock(Slice(n,2*n-1),Slice(0,n-1)) = fock(Slice(n,2*n-1),Slice(0,n-1)) - tempmatrix; - fock(Slice(0,n-1),Slice(n,2*n-1)) = fock(Slice(0,n-1),Slice(n,2*n-1)) + conj(tempmatrix); + fock(Slice(n,m-1),Slice(0,n-1)) = fock(Slice(n,m-1),Slice(0,n-1)) - tempmatrix; + fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) + conj(tempmatrix); //DEBUGGING: //if(world.rank()==0) print("new fock matrix:\n",fock); //permute and symmetrize + if(world.rank()==0) print("e"); fock = inner(transpose(P),inner(fock,P)); fock = (1.0/2.0)*(fock + conj_transpose(fock)); @@ -889,9 +963,9 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" Integrating to form Overlap Matrix"); start_timer(world); overlap(Slice(0,n-1),Slice(0,n-1)) = matrix_inner(world,occupieds,occupieds); - overlap(Slice(0,n-1),Slice(n,2*n-1)) = matrix_inner(world,occupieds,kramers_pairs); - overlap(Slice(n,2*n-1),Slice(0,n-1)) = matrix_inner(world,kramers_pairs,occupieds); - overlap(Slice(n,2*n-1),Slice(n,2*n-1)) = matrix_inner(world,kramers_pairs,kramers_pairs); + overlap(Slice(0,n-1),Slice(n,m-1)) = matrix_inner(world,occupieds,kramers_pairs); + overlap(Slice(n,m-1),Slice(0,n-1)) = matrix_inner(world,kramers_pairs,occupieds); + overlap(Slice(n,m-1),Slice(n,m-1)) = matrix_inner(world,kramers_pairs,kramers_pairs); //DEBUGGING: //if(world.rank()==0) print("new overlap matrix:\n",overlap); @@ -1001,6 +1075,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //Debugging: Print transformation matrix after rotation removal //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); + //Now undo permutations before thr transformation phase U = inner(P,inner(U,transpose(P))); evals = inner(evals,transpose(P)); //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); @@ -1011,34 +1086,26 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" Applying Transformation"); start_timer(world); - + //RESUME HERE ////Apply the transformation to the orbitals tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); - //print("a"); - transform(world, occupieds, tempmatrix); + occupieds = transform(world, occupieds, tempmatrix); - tempmatrix = U(Slice(n,2*n-1),Slice(0,n-1)); - //print("a"); - transform(world, kramers_pairs, tempmatrix); - - occupieds += kramers_pairs; - //print("a"); + tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); + occupieds += transform(world, kramers_pairs, tempmatrix); ////Apply the transformation to the Exchange for(unsigned int j = 0; j < n; j++){ kramers_pairs[j] = Kpsis[j].KramersPair(); } tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); - //print("a"); - transform(world, Kpsis, tempmatrix); + Kpsis = transform(world, Kpsis, tempmatrix); tempmatrix = U(Slice(n,2*n-1),Slice(0,n-1)); - //print("a"); - transform(world, kramers_pairs, tempmatrix); - Kpsis += kramers_pairs; + Kpsis += transform(world, kramers_pairs, tempmatrix); //truncate - for(int kk = 0; kk < Init_params.num_occupied; kk++){ + for(int kk = 0; kk < n; kk++){ Kpsis[kk].truncate(); occupieds[kk].truncate(); } @@ -1049,7 +1116,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o // if(world.rank()==0) print(" after diag, rele ",j," = ",tempdouble); //} - //Set energies = evals, and fix the energy printing stage. + //Set energies = evals energies = evals(Slice(0,n-1)); @@ -1102,7 +1169,7 @@ void DF::orthogonalize_inplace(World& world){ maxq = std::max(std::abs(Q(j,i)),maxq); } } - transform(world, occupieds, Q); + occupieds = transform(world, occupieds, Q); } while (maxq>0.01); //normalize afterward @@ -1598,6 +1665,7 @@ void DF::make_density_lineplots(World& world, const char* filename, int npt, dou //One iteration bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, real_function_3d& JandV, std::vector& Kpsis, XNonlinearSolver, std::complex, Fcwf_vector_allocator>& kainsolver, double& tolerance, int& iteration_number, double& nuclear_repulsion_energy){ + //RESUME HERE updating code for ROHF Tensor times = get_times(world); if(world.rank()==0) print("\n\n\nIteration: ", iteration_number, " at ",times[0]); @@ -1618,10 +1686,17 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //print_sizes(world); //Diagonalization forces us to recompute J - for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += squaremod(occupieds[kk]); + if(closed_shell){ + for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ + rho += 2*squaremod(occupieds[kk]); + } + } + else{ + for(unsigned int kk = 0; kk < Init_params.num_occupied-1; kk++){ + rho += 2*squaremod(occupieds[kk]); + } + rho+= squaremod(occupieds[Init_params.num_occupied-1]); } - rho.scale(2.0); JandV = V + apply(op,rho); JandV.truncate(); @@ -1736,8 +1811,16 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea if(world.rank()==0) print("\n***Recalculating Coulomb***"); start_timer(world); rho = real_factory_3d(world); - for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += 2*squaremod(occupieds[kk]); + if(closed_shell){ + for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ + rho += 2*squaremod(occupieds[kk]); + } + } + else{ + for(unsigned int kk = 0; kk < Init_params.num_occupied-1; kk++){ + rho += 2*squaremod(occupieds[kk]); + } + rho+= squaremod(occupieds[Init_params.num_occupied-1]); } JandV = V + apply(op,rho); JandV.truncate(); @@ -1765,10 +1848,16 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea real_function_3d Jop = apply(op,rho); //Compute kinetic energy contribution - for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - //energies[j] = rele(world,occupieds[j]); - //kinetic_energy += 2*(energies[j]); - kinetic_energy += 2*rele(world, occupieds[j]); + if(closed_shell){ + for(unsigned int j = 0; j < Init_params.num_occupied; j++){ + kinetic_energy += 2*rele(world, occupieds[j]); + } + } + else{ + for(unsigned int j = 0; j < Init_params.num_occupied-1; j++){ + kinetic_energy += 2*rele(world, occupieds[j]); + } + kinetic_energy += rele(world, occupieds[Init_params.num_occupied]); } //Compute electron-nuclear attraction energy contribution, taking advantage of vmra's inner @@ -1787,6 +1876,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea nuclear_attraction_tensor += real(inner(world,occupieds3,mul(world,V,occupieds3)))*(1.0/(myc*myc)); nuclear_attraction_tensor += real(inner(world,occupieds4,mul(world,V,occupieds4)))*(1.0/(myc*myc)); nuclear_attraction_energy = 2*nuclear_attraction_tensor.sum(); + if(!closed_shell) nuclear_attraction_energy -= nuclear_attraction_tensor(Init_params.num_occupied-1); //Compute electron-electron repulsion energy contribution, again using vmra coulomb_tensor = real(inner(world,occupieds1,mul(world,Jop,occupieds1))); @@ -1794,6 +1884,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea coulomb_tensor += real(inner(world,occupieds3,mul(world,Jop,occupieds3)))*(1.0/(myc*myc)); coulomb_tensor += real(inner(world,occupieds4,mul(world,Jop,occupieds4)))*(1.0/(myc*myc)); coulomb_energy = coulomb_tensor.sum();//*0.5; + if(!closed_shell) coulomb_energy -= 0.5*coulomb_tensor(Init_params.num_occupied); //Calculate Exchange energy contribution std::vector Kpsis1(Init_params.num_occupied); @@ -1811,6 +1902,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea exchange_tensor += real(inner(world,occupieds3,Kpsis3))*(1.0/(myc*myc)); exchange_tensor += real(inner(world,occupieds4,Kpsis4))*(1.0/(myc*myc)); exchange_energy = exchange_tensor.sum();//*0.5; + if(!closed_shell) exchange_energy -= 0.5*exchange_tensor(Init_params.num_occupied); //Loop through energies and calculate their new values using the individual contributions //(inside the "tensor" variables @@ -1931,8 +2023,8 @@ void DF::solve_occupied(World & world) make_gaussian_potential(world, Vnuc, nuclear_repulsion_energy); } - double Vnucsize = Vnuc.size(); - if(world.rank()==0) print("VNUC SIZE =",Vnucsize); + //double Vnucsize = Vnuc.size(); + //if(world.rank()==0) print("VNUC SIZE =",Vnucsize); //Initial load balance DF_load_balance(world, Vnuc); @@ -1948,8 +2040,16 @@ void DF::solve_occupied(World & world) if(world.rank()==0) print("\n***Calculating Initial Coulomb***"); start_timer(world); real_function_3d rho = real_factory_3d(world); - for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += 2*squaremod(occupieds[kk]); + if(closed_shell){ + for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ + rho += 2*squaremod(occupieds[kk]); + } + } + else{ + for(unsigned int kk = 0; kk < Init_params.num_occupied-1; kk++){ + rho += 2*squaremod(occupieds[kk]); + } + rho+= squaremod(occupieds[Init_params.num_occupied-1]); } real_function_3d JandV = Vnuc + apply(op,rho); JandV.truncate(); diff --git a/src/apps/moldft/fcwf.cc b/src/apps/moldft/fcwf.cc index 8b13c318a90..d7a70422a84 100644 --- a/src/apps/moldft/fcwf.cc +++ b/src/apps/moldft/fcwf.cc @@ -424,7 +424,7 @@ void Fcwf_vector_allocator::set_size(int size){ Tensor> matrix_inner(World& world, std::vector& a, std::vector& b){ unsigned int n = a.size(); unsigned int m = b.size(); - MADNESS_ASSERT(n==m); + //MADNESS_ASSERT(n==m); double c2 = 137.0359895*137.0359895; //speed of light in atomic units @@ -432,16 +432,18 @@ Tensor> matrix_inner(World& world, std::vector& a, st std::vector a_2(n); std::vector a_3(n); std::vector a_4(n); - std::vector b_1(n); - std::vector b_2(n); - std::vector b_3(n); - std::vector b_4(n); + std::vector b_1(m); + std::vector b_2(m); + std::vector b_3(m); + std::vector b_4(m); for(unsigned int i = 0; i < n; i++){ a_1[i] = a[i][0]; a_2[i] = a[i][1]; a_3[i] = a[i][2]; a_4[i] = a[i][3]; + } + for(unsigned int i = 0; i < m; i++){ b_1[i] = b[i][0]; b_2[i] = b[i][1]; b_3[i] = b[i][2]; @@ -456,12 +458,11 @@ Tensor> matrix_inner(World& world, std::vector& a, st return component1; } -void transform(World& world, std::vector& a, Tensor> U){ +std::vector transform(World& world, std::vector& a, Tensor> U){ unsigned int n = a.size(); unsigned int m = U.dim(0); unsigned int k = U.dim(1); MADNESS_ASSERT(n==m); - MADNESS_ASSERT(m==k); //for now only support square transformation std::vector a_1(n); std::vector a_2(n); @@ -478,12 +479,18 @@ void transform(World& world, std::vector& a, Tensor> a_3 = transform(world, a_3, U); a_4 = transform(world, a_4, U); - for(unsigned int i = 0; i < n; i++){ - a[i][0] = a_1[i]; - a[i][1] = a_2[i]; - a[i][2] = a_3[i]; - a[i][3] = a_4[i]; + std::vector result; + Fcwf reader(world); + + for(unsigned int i = 0; i < k; i++){ + reader[0] = a_1[i]; + reader[1] = a_2[i]; + reader[2] = a_3[i]; + reader[3] = a_4[i]; + result.push_back(reader); //need a copy here? } + + return result; } diff --git a/src/apps/moldft/fcwf.h b/src/apps/moldft/fcwf.h index 20a4636ac4b..bfe4ff45087 100644 --- a/src/apps/moldft/fcwf.h +++ b/src/apps/moldft/fcwf.h @@ -103,7 +103,7 @@ std::vector operator-(const std::vector& phi, const std::vector> matrix_inner(World& world, std::vector& a, std::vector& b); -void transform(World& world, std::vector& a, Tensor> U); +std::vector transform(World& world, std::vector& a, Tensor> U); class Fcwf_vector_allocator { World& world; From 2d582beb86cc4f3097feb6b360b654868aa42b31 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Thu, 17 Oct 2019 16:12:28 -0400 Subject: [PATCH 0046/1312] bugfixes --- src/apps/moldft/DF.cc | 48 ++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 127ec0b0c97..7a0d0c01488 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -806,8 +806,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o unsigned int np = Init_params.num_occupied; //number of PAIRS if(!closed_shell) np -= 1; - unsigned int m = 2*n; //Size of matrix to use - if(!closed_shell) m-=1; + unsigned int m = n+np; //Size of matrix to use Tensor> fock(m, m); Tensor> overlap(m, m); @@ -827,8 +826,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o for(unsigned int j=0; j < np; j++){ P(j,2*j) = 1; P(n+j,2*j+1) = 1; + //if(world.rank()==0) print("\nP:\n", P); } - if(!closed_shell) P(n-1,m) = 1; + if(!closed_shell) P(n-1,m-1) = 1; + //if(world.rank()==0) print("\nP:\n", P); //Debugging //if(world.rank()==0) print("P:\n", P); @@ -925,33 +926,33 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //Now compute the fock matrix //sign doesn't line up with the notes, but I can't find out why - if(world.rank()==0) print("a"); + //if(world.rank()==0) print("a"); Tensor> tempmatrix = matrix_inner(world, occupieds, temp_orbitals); fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); fock(Slice(n,m-1),Slice(n,m-1)) = conj(tempmatrix(Slice(0,np-1),Slice(0,np-1))); - if(world.rank()==0) print("b"); + //if(world.rank()==0) print("b"); tempmatrix = matrix_inner(world,kramers_pairs,temp_orbitals); //if(world.rank()==0) print(occupieds.size(), Kpsis.size(), fock.dim(0), fock.dim(1), tempmatrix.dim(0), tempmatrix.dim(1)); fock(Slice(n,m-1),Slice(0,n-1)) = copy(tempmatrix); - fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj(tempmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(tempmatrix); //Put in Exchange part - if(world.rank()==0) print("c"); + //if(world.rank()==0) print("c"); tempmatrix = matrix_inner(world,occupieds,Kpsis); fock(Slice(0,n-1),Slice(0,n-1)) = fock(Slice(0,n-1),Slice(0,n-1)) - tempmatrix; fock(Slice(n,m-1),Slice(n,m-1)) = fock(Slice(n,m-1),Slice(n,m-1)) - transpose(tempmatrix(Slice(0,np-1),Slice(0,np-1))); - if(world.rank()==0) print("d"); + //if(world.rank()==0) print("d"); tempmatrix = matrix_inner(world, kramers_pairs, Kpsis); fock(Slice(n,m-1),Slice(0,n-1)) = fock(Slice(n,m-1),Slice(0,n-1)) - tempmatrix; - fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) + conj(tempmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) + conj_transpose(tempmatrix); //DEBUGGING: //if(world.rank()==0) print("new fock matrix:\n",fock); //permute and symmetrize - if(world.rank()==0) print("e"); + //if(world.rank()==0) print("e"); fock = inner(transpose(P),inner(fock,P)); fock = (1.0/2.0)*(fock + conj_transpose(fock)); @@ -990,6 +991,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o start_timer(world); //Diagonalize + //if(world.rank()==0) print("P:\n", P, "\nfock:\n", fock, "\noverlap:\n", overlap, "\nU:\n", U); sygv(fock, overlap, 1, U, evals); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -1008,8 +1010,8 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o bool switched = true; while (switched) { switched = false; - for (unsigned int kk = 0; kk < 2*Init_params.num_occupied; kk++) { - for (unsigned int j = kk + 1; j < 2*Init_params.num_occupied; j++) { + for (unsigned int kk = 0; kk < m; kk++) { + for (unsigned int j = kk + 1; j < m; j++) { double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); //if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { @@ -1028,7 +1030,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o } // Fix phases. - for (unsigned int kk = 0; kk < 2*Init_params.num_occupied; ++kk) + for (unsigned int kk = 0; kk < m; ++kk) U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); //if(world.rank()==0) print("After column swapping\nU:\n", U, "\nevals:\n", evals); @@ -1037,13 +1039,13 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o unsigned int ilo = 0; // first element of cluster if(world.rank()==0) print(" Degeneracy threshold: ",thresh_degenerate); - while (ilo < 2*Init_params.num_occupied - 1) { + while (ilo < m - 1) { unsigned int ihi = ilo; while (fabs(evals[ilo] - evals[ihi + 1]) < thresh_degenerate * std::fabs(evals[ilo])){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { //< thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { ++ihi; - if (ihi == 2*Init_params.num_occupied - 1) + if (ihi == m - 1) break; } unsigned int nclus = ihi - ilo + 1; @@ -1086,21 +1088,25 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" Applying Transformation"); start_timer(world); - //RESUME HERE ////Apply the transformation to the orbitals + //if(world.rank()==0) print("a"); tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); occupieds = transform(world, occupieds, tempmatrix); + //if(world.rank()==0) print("b"); tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); occupieds += transform(world, kramers_pairs, tempmatrix); + //if(world.rank()==0) print("c"); ////Apply the transformation to the Exchange - for(unsigned int j = 0; j < n; j++){ + for(unsigned int j = 0; j < n-1; j++){ kramers_pairs[j] = Kpsis[j].KramersPair(); } + //if(world.rank()==0) print("d"); tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); Kpsis = transform(world, Kpsis, tempmatrix); - tempmatrix = U(Slice(n,2*n-1),Slice(0,n-1)); + //if(world.rank()==0) print("e"); + tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); Kpsis += transform(world, kramers_pairs, tempmatrix); @@ -1857,7 +1863,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea for(unsigned int j = 0; j < Init_params.num_occupied-1; j++){ kinetic_energy += 2*rele(world, occupieds[j]); } - kinetic_energy += rele(world, occupieds[Init_params.num_occupied]); + kinetic_energy += rele(world, occupieds[Init_params.num_occupied-1]); } //Compute electron-nuclear attraction energy contribution, taking advantage of vmra's inner @@ -1884,7 +1890,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea coulomb_tensor += real(inner(world,occupieds3,mul(world,Jop,occupieds3)))*(1.0/(myc*myc)); coulomb_tensor += real(inner(world,occupieds4,mul(world,Jop,occupieds4)))*(1.0/(myc*myc)); coulomb_energy = coulomb_tensor.sum();//*0.5; - if(!closed_shell) coulomb_energy -= 0.5*coulomb_tensor(Init_params.num_occupied); + if(!closed_shell) coulomb_energy -= 0.5*coulomb_tensor(Init_params.num_occupied-1); //Calculate Exchange energy contribution std::vector Kpsis1(Init_params.num_occupied); @@ -1902,7 +1908,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea exchange_tensor += real(inner(world,occupieds3,Kpsis3))*(1.0/(myc*myc)); exchange_tensor += real(inner(world,occupieds4,Kpsis4))*(1.0/(myc*myc)); exchange_energy = exchange_tensor.sum();//*0.5; - if(!closed_shell) exchange_energy -= 0.5*exchange_tensor(Init_params.num_occupied); + if(!closed_shell) exchange_energy -= 0.5*exchange_tensor(Init_params.num_occupied-1); //Loop through energies and calculate their new values using the individual contributions //(inside the "tensor" variables From 6685f1b6ecb1d537f9423ebdcca597f99969e156 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 5 Nov 2019 16:34:38 -0500 Subject: [PATCH 0047/1312] typo --- src/apps/moldft/DF.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 7a0d0c01488..fe853aba6c4 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -1773,7 +1773,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //see how big of a step KAIN took for each orbital residualnorm = (occupieds[i]-Residuals[i]).norm2(); - //Restrict the step taken by KAIN if it's took big + //Restrict the step taken by KAIN if it's too big if(residualnorm > DFparams.maxrotn){ double s = DFparams.maxrotn / residualnorm; if(world.rank()==0) print(" restricting step for orbital: ", i+1); From e8d5ee483e1b3da3f412d977015b153a826a785c Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 19 Nov 2019 13:48:34 -0500 Subject: [PATCH 0048/1312] some debugging print messages --- src/apps/moldft/DF.cc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 0d96686b365..e56e5dae96f 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -610,6 +610,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o Tensor> U(n,n); Tensor evals(n); std::vector temp_orbitals; + if(world.rank()==0) print(" Forming Matrices"); start_timer(world); @@ -622,6 +623,34 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o for(unsigned int j = 0; j < n; j++){ rho += squaremod(occupieds[j]); } + + ////Debugging + std::vector debug_orbitals; + for(unsigned int j = 0; j < n; j++){ + debug_orbitals.push_back(occupieds[j]*myV); + } + fock = matrix_inner(world,occupieds,debug_orbitals); + if(world.rank()==0) print("\nVnuc matrix:\n",fock); + + real_function_3d idk = apply(op,rho); + for(unsigned int j = 0; j < n; j++){ + debug_orbitals[j] = occupieds[j]*idk; + } + fock = matrix_inner(world,occupieds,debug_orbitals); + if(world.rank()==0) print("\nJ matrix:\n",fock); + + for(unsigned int j = 0; j < n; j++){ + debug_orbitals[j] = Kpsis[j]; + } + fock = matrix_inner(world,occupieds,debug_orbitals); + if(world.rank()==0) print("\nK matrix:\n",fock); + + for(unsigned int j = 0; j < n; j++){ + debug_orbitals[j] = apply_T(world,occupieds[j]); + } + fock = matrix_inner(world,occupieds,debug_orbitals); + if(world.rank()==0) print("\nT matrix:\n",fock); + //End Debugging //TODO: Here try moving the apply out to operate on the sum of the nuclear and electronic charge distributions real_function_3d potential = myV + apply(op,rho); From 2c8873d81b421a1880551f0e84ff6e7802e0d3d9 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 19 Nov 2019 15:49:05 -0500 Subject: [PATCH 0049/1312] bugfix --- src/apps/moldft/DF.cc | 144 +++++++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 66 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index fe853aba6c4..b2fd4a47f73 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -859,44 +859,56 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o ////Debugging - //std::vector debug_orbitals; - //for(unsigned int j = 0; j < n; j++){ - // debug_orbitals.push_back(occupieds[j]*myV); - //} - //tempmatrix = matrix_inner(world,occupieds,debug_orbitals); - //fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); - //fock(Slice(n,2*n-1),Slice(n,2*n-1)) = -1.0*conj(tempmatrix); - //tempmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); - //fock(Slice(0,n-1),Slice(n,2*n-1)) = conj(tempmatrix); - //fock(Slice(n,2*n-1),Slice(0,n-1)) = copy(tempmatrix); - //if(world.rank()==0) print("\nVnuc matrix:\n",fock); - - - - //real_function_3d idk = apply(op,rho); - //for(unsigned int j = 0; j < n; j++){ - // debug_orbitals[j] = occupieds[j]*idk; - //} - //tempmatrix = matrix_inner(world,occupieds,debug_orbitals); - //fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); - //fock(Slice(n,2*n-1),Slice(n,2*n-1)) = -1.0*conj(tempmatrix); - //tempmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); - //fock(Slice(0,n-1),Slice(n,2*n-1)) = conj(tempmatrix); - //fock(Slice(n,2*n-1),Slice(0,n-1)) = copy(tempmatrix); - //if(world.rank()==0) print("\nJ matrix:\n",fock); + std::vector debug_orbitals; + for(unsigned int j = 0; j < n; j++){ + debug_orbitals.push_back(occupieds[j]*myV); + } + Tensor> debugmatrix = matrix_inner(world,occupieds,debug_orbitals); + fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); + fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); + debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); + fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); + fock = inner(transpose(P),inner(fock,P)); + if(world.rank()==0) print("\nVnuc matrix:\n",fock); + real_function_3d idk = apply(op,rho); + for(unsigned int j = 0; j < n; j++){ + debug_orbitals[j] = occupieds[j]*idk; + } + debugmatrix = matrix_inner(world,occupieds,debug_orbitals); + fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); + fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); + debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); + fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); + fock = inner(transpose(P),inner(fock,P)); + if(world.rank()==0) print("\nJ matrix:\n",fock); + for(unsigned int j = 0; j < n; j++){ + debug_orbitals[j] = Kpsis[j]; + } + debugmatrix = matrix_inner(world,occupieds,debug_orbitals); + fock(Slice(0,n-1),Slice(0,n-1)) = -1.0 * debugmatrix; + fock(Slice(n,m-1),Slice(n,m-1)) = -1.0 * transpose(debugmatrix(Slice(0,np-1),Slice(0,np-1))); + debugmatrix = matrix_inner(world, kramers_pairs, debug_orbitals); + fock(Slice(n,m-1),Slice(0,n-1)) = -1.0 * debugmatrix; + fock(Slice(0,n-1),Slice(n,m-1)) = conj_transpose(debugmatrix); + fock = inner(transpose(P),inner(fock,P)); + if(world.rank()==0) print("\nK matrix:\n",fock); - //for(unsigned int j = 0; j < n; j++){ - // debug_orbitals[j] = Kpsis[j]; - //} - //tempmatrix = matrix_inner(world,occupieds,debug_orbitals); - //if(world.rank()==0) print("\nK matrix:\n",fock); - //for(unsigned int j = 0; j < n; j++){ - // debug_orbitals[j] = apply_T(world,occupieds[j]); - //} - //tempmatrix = matrix_inner(world,occupieds,debug_orbitals); - //if(world.rank()==0) print("\nT matrix:\n",fock); + for(unsigned int j = 0; j < n; j++){ + debug_orbitals[j] = apply_T(world,occupieds[j]); + } + debugmatrix = matrix_inner(world,occupieds,debug_orbitals); + fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); + fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); + debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); + fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); + fock = inner(transpose(P),inner(fock,P)); + if(world.rank()==0) print("\nT matrix:\n",fock); + //End debugging //add in coulomb parts to neworbitals @@ -2082,37 +2094,37 @@ void DF::solve_occupied(World & world) iteration_number++; } - //Calculation of Effective Electric Field: - if(world.rank()==0) print("Effective Electric Field calculation"); - std::complex myi(0,1); - std::complex one(1,0); - real_derivative_3d Dx(world,0); - real_derivative_3d Dy(world,1); - real_derivative_3d Dz(world,2); - double Eeff(0.0); - for(unsigned int j; j < Init_params.num_occupied; j++){ - real_function_3d LL(world); - for(unsigned int kk; kk < Init_params.num_occupied; kk++){ - if(kk != j){ - LL += squaremod(occupieds[kk]); - } - } - LL = apply(op,LL); - LL += Vnuc; - complex_function_3d Lx = one*Dx(LL); - complex_function_3d Ly = one*Dy(LL); - complex_function_3d Lz = one*Dz(LL); - Fcwf temp(world); - - temp[0] = Lz*occupieds[j][0] + (Lx - myi*Ly)*occupieds[j][1]; - temp[1] = (Lx + myi*Ly)*occupieds[j][0] - Lz*occupieds[j][1]; - temp[2] = Lz*occupieds[j][2] + (Lx - myi*Ly)*occupieds[j][3]; - temp[2].scale(-1.0); - temp[3] = Lz*occupieds[j][3] - (Lx + myi*Ly)*occupieds[j][2]; - - Eeff += std::real(inner(occupieds[0],temp)); - } - if(world.rank()==0) print("Eeff = ", Eeff); + ////Calculation of Effective Electric Field: + //if(world.rank()==0) print("Effective Electric Field calculation"); + //std::complex myi(0,1); + //std::complex one(1,0); + //real_derivative_3d Dx(world,0); + //real_derivative_3d Dy(world,1); + //real_derivative_3d Dz(world,2); + //double Eeff(0.0); + //for(unsigned int j; j < Init_params.num_occupied; j++){ + // real_function_3d LL(world); + // for(unsigned int kk; kk < Init_params.num_occupied; kk++){ + // if(kk != j){ + // LL += squaremod(occupieds[kk]); + // } + // } + // LL = apply(op,LL); + // LL += Vnuc; + // complex_function_3d Lx = one*Dx(LL); + // complex_function_3d Ly = one*Dy(LL); + // complex_function_3d Lz = one*Dz(LL); + // Fcwf temp(world); + + // temp[0] = Lz*occupieds[j][0] + (Lx - myi*Ly)*occupieds[j][1]; + // temp[1] = (Lx + myi*Ly)*occupieds[j][0] - Lz*occupieds[j][1]; + // temp[2] = Lz*occupieds[j][2] + (Lx - myi*Ly)*occupieds[j][3]; + // temp[2].scale(-1.0); + // temp[3] = Lz*occupieds[j][3] - (Lx + myi*Ly)*occupieds[j][2]; + + // Eeff += std::real(inner(occupieds[0],temp)); + //} + //if(world.rank()==0) print("Eeff = ", Eeff); } From 8a8fb75321ece824873887093ecc4b3e0a25fa00 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 20 Nov 2019 14:20:20 -0500 Subject: [PATCH 0050/1312] more debug printing --- src/apps/moldft/DF.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index e56e5dae96f..ed56d2f562b 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -638,6 +638,11 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o } fock = matrix_inner(world,occupieds,debug_orbitals); if(world.rank()==0) print("\nJ matrix:\n",fock); + for(unsigned int j = 0; j < n; j++){ + double aa = occupieds[j].norm2(); + double bb = debug_orbitals[j].norm2(); + if(world.rank()==0) print(" ", j+1, aa, bb); + } for(unsigned int j = 0; j < n; j++){ debug_orbitals[j] = Kpsis[j]; From f8986162e5678934e36e7866b5a1dd4176b5607e Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 20 Nov 2019 14:38:43 -0500 Subject: [PATCH 0051/1312] more debugging printing --- src/apps/moldft/DF.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index b2fd4a47f73..50cf39daeb2 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -846,6 +846,13 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o rho += 2*squaremod(occupieds[j]); } if(!closed_shell) rho += squaremod(occupieds[n-1]); + for(unsigned int j = 0; j < n; j++){ + double aa = occupieds[j][0].norm2(); + double bb = occupieds[j][1].norm2(); + double cc = occupieds[j][2].norm2(); + double dd = occupieds[j][3].norm2(); + if(world.rank()==0) print(" ", j+1, aa, bb, cc, dd); + } real_function_3d potential = myV + apply(op,rho); potential.truncate(); @@ -884,6 +891,11 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); fock = inner(transpose(P),inner(fock,P)); if(world.rank()==0) print("\nJ matrix:\n",fock); + for(unsigned int j = 0; j < n; j++){ + double aa = occupieds[j].norm2(); + double bb = debug_orbitals[j].norm2(); + if(world.rank()==0) print(" ", j+1, aa, bb); + } for(unsigned int j = 0; j < n; j++){ debug_orbitals[j] = Kpsis[j]; From 784bd059fd0980c9d0646ca348cf8da051b1218b Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 20 Nov 2019 14:51:15 -0500 Subject: [PATCH 0052/1312] more debug printing --- src/apps/moldft/DF.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index ed56d2f562b..332248132e6 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -623,6 +623,13 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o for(unsigned int j = 0; j < n; j++){ rho += squaremod(occupieds[j]); } + for(unsigned int j = 0; j < n; j++){ + double aa = occupieds[j][0].norm2(); + double bb = occupieds[j][1].norm2(); + double cc = occupieds[j][2].norm2(); + double dd = occupieds[j][3].norm2(); + if(world.rank()==0) print(" ", j+1, aa, bb, cc, dd); + } ////Debugging std::vector debug_orbitals; From 86641abc9db3b4f5c775724639b853b40b1a7e93 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 20 Dec 2019 14:59:51 -0500 Subject: [PATCH 0053/1312] closed shell case was broken. fixed this. open shell case is likely broken now. will fix in future commits. --- src/apps/moldft/DF.cc | 33 ++++++++++++++------------------- src/apps/moldft/fcwf.cc | 2 +- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 50cf39daeb2..3681657de09 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -952,28 +952,28 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //sign doesn't line up with the notes, but I can't find out why //if(world.rank()==0) print("a"); Tensor> tempmatrix = matrix_inner(world, occupieds, temp_orbitals); + if(world.rank()==0) print("a:\n", tempmatrix); fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); fock(Slice(n,m-1),Slice(n,m-1)) = conj(tempmatrix(Slice(0,np-1),Slice(0,np-1))); - - //if(world.rank()==0) print("b"); tempmatrix = matrix_inner(world,kramers_pairs,temp_orbitals); - //if(world.rank()==0) print(occupieds.size(), Kpsis.size(), fock.dim(0), fock.dim(1), tempmatrix.dim(0), tempmatrix.dim(1)); + if(world.rank()==0) print("b:\n", tempmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj(tempmatrix); fock(Slice(n,m-1),Slice(0,n-1)) = copy(tempmatrix); - fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(tempmatrix); //Put in Exchange part //if(world.rank()==0) print("c"); tempmatrix = matrix_inner(world,occupieds,Kpsis); + if(world.rank()==0) print("c:\n", tempmatrix); fock(Slice(0,n-1),Slice(0,n-1)) = fock(Slice(0,n-1),Slice(0,n-1)) - tempmatrix; fock(Slice(n,m-1),Slice(n,m-1)) = fock(Slice(n,m-1),Slice(n,m-1)) - transpose(tempmatrix(Slice(0,np-1),Slice(0,np-1))); - - //if(world.rank()==0) print("d"); tempmatrix = matrix_inner(world, kramers_pairs, Kpsis); + if(world.rank()==0) print("d:\n", tempmatrix); fock(Slice(n,m-1),Slice(0,n-1)) = fock(Slice(n,m-1),Slice(0,n-1)) - tempmatrix; - fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) + conj_transpose(tempmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) + conj(tempmatrix); //DEBUGGING: - //if(world.rank()==0) print("new fock matrix:\n",fock); + if(world.rank()==0) print("new fock matrix:\n",fock); + if(world.rank()==0) print("P:\n",P); //permute and symmetrize //if(world.rank()==0) print("e"); @@ -1006,10 +1006,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //debugging: print fock and overlap matrices - //if(world.rank()==0){ - // print("permuted fock:\n", fock); - // print("\npermuted overlap:\n", overlap); - //} + if(world.rank()==0){ + print("permuted fock:\n", fock); + print("\npermuted overlap:\n", overlap); + } if(world.rank()==0) print(" Eigensolver"); start_timer(world); @@ -1113,23 +1113,17 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o start_timer(world); ////Apply the transformation to the orbitals - //if(world.rank()==0) print("a"); tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); occupieds = transform(world, occupieds, tempmatrix); - - //if(world.rank()==0) print("b"); tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); occupieds += transform(world, kramers_pairs, tempmatrix); - //if(world.rank()==0) print("c"); ////Apply the transformation to the Exchange - for(unsigned int j = 0; j < n-1; j++){ + for(unsigned int j = 0; j < np; j++){ kramers_pairs[j] = Kpsis[j].KramersPair(); } - //if(world.rank()==0) print("d"); tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); Kpsis = transform(world, Kpsis, tempmatrix); - //if(world.rank()==0) print("e"); tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); Kpsis += transform(world, kramers_pairs, tempmatrix); @@ -1730,6 +1724,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea JandV = V + apply(op,rho); JandV.truncate(); + //Apply BSH to each psi if(world.rank()==0) print("\n***Applying BSH operator***"); start_timer(world); diff --git a/src/apps/moldft/fcwf.cc b/src/apps/moldft/fcwf.cc index d7a70422a84..85eef8b1970 100644 --- a/src/apps/moldft/fcwf.cc +++ b/src/apps/moldft/fcwf.cc @@ -487,7 +487,7 @@ std::vector transform(World& world, std::vector& a, Tensor Date: Wed, 1 Jan 2020 17:21:04 -0500 Subject: [PATCH 0054/1312] converted previous fixes for ROHF. Still not converging. --- src/apps/moldft/DF.cc | 138 ++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 67 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 3681657de09..1a55387f60a 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -846,13 +846,15 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o rho += 2*squaremod(occupieds[j]); } if(!closed_shell) rho += squaremod(occupieds[n-1]); - for(unsigned int j = 0; j < n; j++){ - double aa = occupieds[j][0].norm2(); - double bb = occupieds[j][1].norm2(); - double cc = occupieds[j][2].norm2(); - double dd = occupieds[j][3].norm2(); - if(world.rank()==0) print(" ", j+1, aa, bb, cc, dd); - } + + //Debugging + //for(unsigned int j = 0; j < n; j++){ + // double aa = occupieds[j][0].norm2(); + // double bb = occupieds[j][1].norm2(); + // double cc = occupieds[j][2].norm2(); + // double dd = occupieds[j][3].norm2(); + // if(world.rank()==0) print(" ", j+1, aa, bb, cc, dd); + //} real_function_3d potential = myV + apply(op,rho); potential.truncate(); @@ -866,60 +868,60 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o ////Debugging - std::vector debug_orbitals; - for(unsigned int j = 0; j < n; j++){ - debug_orbitals.push_back(occupieds[j]*myV); - } - Tensor> debugmatrix = matrix_inner(world,occupieds,debug_orbitals); - fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); - fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); - debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); - fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); - fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); - fock = inner(transpose(P),inner(fock,P)); - if(world.rank()==0) print("\nVnuc matrix:\n",fock); - - real_function_3d idk = apply(op,rho); - for(unsigned int j = 0; j < n; j++){ - debug_orbitals[j] = occupieds[j]*idk; - } - debugmatrix = matrix_inner(world,occupieds,debug_orbitals); - fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); - fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); - debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); - fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); - fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); - fock = inner(transpose(P),inner(fock,P)); - if(world.rank()==0) print("\nJ matrix:\n",fock); - for(unsigned int j = 0; j < n; j++){ - double aa = occupieds[j].norm2(); - double bb = debug_orbitals[j].norm2(); - if(world.rank()==0) print(" ", j+1, aa, bb); - } + //std::vector debug_orbitals; + //for(unsigned int j = 0; j < n; j++){ + // debug_orbitals.push_back(occupieds[j]*myV); + //} + //Tensor> debugmatrix = matrix_inner(world,occupieds,debug_orbitals); + //fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); + //fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); + //debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); + //fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); + //fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); + //fock = inner(transpose(P),inner(fock,P)); + //if(world.rank()==0) print("\nVnuc matrix:\n",fock); + + //real_function_3d idk = apply(op,rho); + //for(unsigned int j = 0; j < n; j++){ + // debug_orbitals[j] = occupieds[j]*idk; + //} + //debugmatrix = matrix_inner(world,occupieds,debug_orbitals); + //fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); + //fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); + //debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); + //fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); + //fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); + //fock = inner(transpose(P),inner(fock,P)); + //if(world.rank()==0) print("\nJ matrix:\n",fock); + //for(unsigned int j = 0; j < n; j++){ + // double aa = occupieds[j].norm2(); + // double bb = debug_orbitals[j].norm2(); + // if(world.rank()==0) print(" ", j+1, aa, bb); + //} - for(unsigned int j = 0; j < n; j++){ - debug_orbitals[j] = Kpsis[j]; - } - debugmatrix = matrix_inner(world,occupieds,debug_orbitals); - fock(Slice(0,n-1),Slice(0,n-1)) = -1.0 * debugmatrix; - fock(Slice(n,m-1),Slice(n,m-1)) = -1.0 * transpose(debugmatrix(Slice(0,np-1),Slice(0,np-1))); - debugmatrix = matrix_inner(world, kramers_pairs, debug_orbitals); - fock(Slice(n,m-1),Slice(0,n-1)) = -1.0 * debugmatrix; - fock(Slice(0,n-1),Slice(n,m-1)) = conj_transpose(debugmatrix); - fock = inner(transpose(P),inner(fock,P)); - if(world.rank()==0) print("\nK matrix:\n",fock); + //for(unsigned int j = 0; j < n; j++){ + // debug_orbitals[j] = Kpsis[j]; + //} + //debugmatrix = matrix_inner(world,occupieds,debug_orbitals); + //fock(Slice(0,n-1),Slice(0,n-1)) = -1.0 * debugmatrix; + //fock(Slice(n,m-1),Slice(n,m-1)) = -1.0 * transpose(debugmatrix(Slice(0,np-1),Slice(0,np-1))); + //debugmatrix = matrix_inner(world, kramers_pairs, debug_orbitals); + //fock(Slice(n,m-1),Slice(0,n-1)) = -1.0 * debugmatrix; + //fock(Slice(0,n-1),Slice(n,m-1)) = conj_transpose(debugmatrix); + //fock = inner(transpose(P),inner(fock,P)); + //if(world.rank()==0) print("\nK matrix:\n",fock); - for(unsigned int j = 0; j < n; j++){ - debug_orbitals[j] = apply_T(world,occupieds[j]); - } - debugmatrix = matrix_inner(world,occupieds,debug_orbitals); - fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); - fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); - debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); - fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); - fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); - fock = inner(transpose(P),inner(fock,P)); - if(world.rank()==0) print("\nT matrix:\n",fock); + //for(unsigned int j = 0; j < n; j++){ + // debug_orbitals[j] = apply_T(world,occupieds[j]); + //} + //debugmatrix = matrix_inner(world,occupieds,debug_orbitals); + //fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); + //fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); + //debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); + //fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); + //fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); + //fock = inner(transpose(P),inner(fock,P)); + //if(world.rank()==0) print("\nT matrix:\n",fock); //End debugging @@ -957,8 +959,9 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o fock(Slice(n,m-1),Slice(n,m-1)) = conj(tempmatrix(Slice(0,np-1),Slice(0,np-1))); tempmatrix = matrix_inner(world,kramers_pairs,temp_orbitals); if(world.rank()==0) print("b:\n", tempmatrix); - fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj(tempmatrix); fock(Slice(n,m-1),Slice(0,n-1)) = copy(tempmatrix); + //fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj(tempmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = conj_transpose(tempmatrix); //Put in Exchange part //if(world.rank()==0) print("c"); @@ -969,11 +972,12 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o tempmatrix = matrix_inner(world, kramers_pairs, Kpsis); if(world.rank()==0) print("d:\n", tempmatrix); fock(Slice(n,m-1),Slice(0,n-1)) = fock(Slice(n,m-1),Slice(0,n-1)) - tempmatrix; - fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) + conj(tempmatrix); + //fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) + conj(tempmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) - conj_transpose(tempmatrix); //DEBUGGING: - if(world.rank()==0) print("new fock matrix:\n",fock); - if(world.rank()==0) print("P:\n",P); + //if(world.rank()==0) print("new fock matrix:\n",fock); + //if(world.rank()==0) print("P:\n",P); //permute and symmetrize //if(world.rank()==0) print("e"); @@ -1006,10 +1010,10 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //debugging: print fock and overlap matrices - if(world.rank()==0){ - print("permuted fock:\n", fock); - print("\npermuted overlap:\n", overlap); - } + //if(world.rank()==0){ + // print("permuted fock:\n", fock); + // print("\npermuted overlap:\n", overlap); + //} if(world.rank()==0) print(" Eigensolver"); start_timer(world); From 97975f29669d5626b1fad8b228ff193cd8281fa8 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Thu, 2 Jan 2020 15:52:31 -0500 Subject: [PATCH 0055/1312] removed debug printing for now --- src/apps/moldft/DF.cc | 154 +++++++++++++++++++++--------------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 1a55387f60a..63e779ff1a0 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -954,11 +954,11 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //sign doesn't line up with the notes, but I can't find out why //if(world.rank()==0) print("a"); Tensor> tempmatrix = matrix_inner(world, occupieds, temp_orbitals); - if(world.rank()==0) print("a:\n", tempmatrix); + //if(world.rank()==0) print("a:\n", tempmatrix); fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); fock(Slice(n,m-1),Slice(n,m-1)) = conj(tempmatrix(Slice(0,np-1),Slice(0,np-1))); tempmatrix = matrix_inner(world,kramers_pairs,temp_orbitals); - if(world.rank()==0) print("b:\n", tempmatrix); + //if(world.rank()==0) print("b:\n", tempmatrix); fock(Slice(n,m-1),Slice(0,n-1)) = copy(tempmatrix); //fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj(tempmatrix); fock(Slice(0,n-1),Slice(n,m-1)) = conj_transpose(tempmatrix); @@ -966,11 +966,11 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //Put in Exchange part //if(world.rank()==0) print("c"); tempmatrix = matrix_inner(world,occupieds,Kpsis); - if(world.rank()==0) print("c:\n", tempmatrix); + //if(world.rank()==0) print("c:\n", tempmatrix); fock(Slice(0,n-1),Slice(0,n-1)) = fock(Slice(0,n-1),Slice(0,n-1)) - tempmatrix; fock(Slice(n,m-1),Slice(n,m-1)) = fock(Slice(n,m-1),Slice(n,m-1)) - transpose(tempmatrix(Slice(0,np-1),Slice(0,np-1))); tempmatrix = matrix_inner(world, kramers_pairs, Kpsis); - if(world.rank()==0) print("d:\n", tempmatrix); + //if(world.rank()==0) print("d:\n", tempmatrix); fock(Slice(n,m-1),Slice(0,n-1)) = fock(Slice(n,m-1),Slice(0,n-1)) - tempmatrix; //fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) + conj(tempmatrix); fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) - conj_transpose(tempmatrix); @@ -1028,79 +1028,81 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. - if(world.rank()==0) print(" Removing Rotations"); - start_timer(world); - - double thresh_degenerate = DFparams.thresh*10.0; - double csquared = 137.0359895*137.0359895; //electron rest energy - - //swap columns for a diagonally dominant matrix - bool switched = true; - while (switched) { - switched = false; - for (unsigned int kk = 0; kk < m; kk++) { - for (unsigned int j = kk + 1; j < m; j++) { - double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); - double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); - //if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { - if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::fabs(evals[kk])) ) { - if(world.rank()==0){ - print(" swapping columns ", kk+1, " and ", j+1); - } - Tensor> tmp = copy(U(_, kk)); - U(_, kk) = U(_, j); - U(_, j) = tmp; - std::swap(evals[kk], evals[j]); - switched = true; - } - } - } - } - - // Fix phases. - for (unsigned int kk = 0; kk < m; ++kk) - U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); - - //if(world.rank()==0) print("After column swapping\nU:\n", U, "\nevals:\n", evals); - - //Find clusters of degenerate eigenvalues and rotate eigenvectors to maximize overlap with previous ones - unsigned int ilo = 0; // first element of cluster - if(world.rank()==0) print(" Degeneracy threshold: ",thresh_degenerate); - - while (ilo < m - 1) { - unsigned int ihi = ilo; - while (fabs(evals[ilo] - evals[ihi + 1]) - < thresh_degenerate * std::fabs(evals[ilo])){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { - //< thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { - ++ihi; - if (ihi == m - 1) - break; - } - unsigned int nclus = ihi - ilo + 1; - if (nclus > 1) { - if(world.rank()==0){ - print(" found cluster from ", ilo + 1, " to " , ihi + 1); - for(unsigned int kk = ilo; kk <= ihi; kk++){ - print(" ",evals[kk]); - } - } - - - //Use the polar decomposition to undo rotations: - Tensor> q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); - Tensor> VH(nclus,nclus); - Tensor> W(nclus,nclus); - Tensor sigma(nclus); + //if(world.rank()==0) print(" Removing Rotations"); + //start_timer(world); + + //double thresh_degenerate = DFparams.thresh*10.0; + //double csquared = 137.0359895*137.0359895; //electron rest energy + + ////swap columns for a diagonally dominant matrix + //bool switched = true; + //while (switched) { + // switched = false; + // for (unsigned int kk = 0; kk < m; kk++) { + // for (unsigned int j = kk + 1; j < m; j++) { + // double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); + // double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); + // //if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { + // if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::fabs(evals[kk])) ) { + // if(world.rank()==0){ + // print(" swapping columns ", kk+1, " and ", j+1); + // } + // Tensor> tmp = copy(U(_, kk)); + // U(_, kk) = U(_, j); + // U(_, j) = tmp; + // std::swap(evals[kk], evals[j]); + // switched = true; + // } + // } + // } + //} - svd(q, W, sigma, VH); + //// Fix phases. + //for (unsigned int kk = 0; kk < m; ++kk) + // U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); - //W*VH is the rotation part of q. Undo it by taking the adjoint and right-multiplying - q = conj_transpose(inner(W,VH)); - U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); - - } - ilo = ihi + 1; - } + ////if(world.rank()==0) print("After column swapping\nU:\n", U, "\nevals:\n", evals); + // + ////Find clusters of degenerate eigenvalues and rotate eigenvectors to maximize overlap with previous ones + //unsigned int ilo = 0; // first element of cluster + //if(world.rank()==0) print(" Degeneracy threshold: ",thresh_degenerate); + // + //while (ilo < m - 1) { + // unsigned int ihi = ilo; + // while (fabs(evals[ilo] - evals[ihi + 1]) + // < thresh_degenerate * std::fabs(evals[ilo])){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { + // //< thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { + // ++ihi; + // if (ihi == m - 1) + // break; + // } + // unsigned int nclus = ihi - ilo + 1; + // if (nclus > 1) { + // if(world.rank()==0){ + // print(" found cluster from ", ilo + 1, " to " , ihi + 1); + // for(unsigned int kk = ilo; kk <= ihi; kk++){ + // print(" ",evals[kk]); + // } + // } + + + // //Use the polar decomposition to undo rotations: + // Tensor> q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); + // Tensor> VH(nclus,nclus); + // Tensor> W(nclus,nclus); + // Tensor sigma(nclus); + + // svd(q, W, sigma, VH); + + // //W*VH is the rotation part of q. Undo it by taking the adjoint and right-multiplying + // q = conj_transpose(inner(W,VH)); + // U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + // + // } + // ilo = ihi + 1; + //} + //times = end_timer(world); + //if(world.rank()==0) print(" ", times[0]); //Debugging: Print transformation matrix after rotation removal //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); @@ -1110,8 +1112,6 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o evals = inner(evals,transpose(P)); //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); - times = end_timer(world); - if(world.rank()==0) print(" ", times[0]); if(world.rank()==0) print(" Applying Transformation"); start_timer(world); From 4020392298dc10b2839fd39cfc41cf7450157e2b Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 13 Jan 2020 14:24:20 -0500 Subject: [PATCH 0056/1312] adjustments after merge with master --- cmakecmd | 14 +-- src/apps/chem/SCF.cc | 228 +++++++++++++----------------------- src/apps/moldft/DF.cc | 186 ++++++++++++++--------------- src/apps/moldft/DFdriver.cc | 1 + 4 files changed, 181 insertions(+), 248 deletions(-) diff --git a/cmakecmd b/cmakecmd index 52f56481401..51ff01663d9 100644 --- a/cmakecmd +++ b/cmakecmd @@ -1,9 +1,9 @@ -cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/generic-mkl-tbb.cmake \ - -DCMAKE_BUILD_TYPE=Debug \ - -DBUILD_SHARED_LIBS=OFF \ - -DLIBXC_LIBRARIES=/gpfs/projects/rjh/libxc-3.0.0/lib/libxc.a \ - -DLIBXC_INCLUDE_DIRS=/gpfs/projects/rjh/libxc-3.0.0/include \ - -DCMAKE_CXX_COMPILER=mpiicpc \ - -DCMAKE_C_COMPILER=mpiicc \ +cmake -D ENABLE_TBB=ON \ + -D ENABLE_MKL=1 \ + -D CMAKE_BUILD_TYPE=Release \ + -D BUILD_SHARED_LIBS=OFF \ + -D CMAKE_CXX_COMPILER=mpiicpc \ + -D CMAKE_C_COMPILER=mpiicc \ + -D CMAKE_CXX_STANDARD=17 \ .. # -DBLA_STATIC=TRUE diff --git a/src/apps/chem/SCF.cc b/src/apps/chem/SCF.cc index 72540d56fb9..d89cbafa5c1 100644 --- a/src/apps/chem/SCF.cc +++ b/src/apps/chem/SCF.cc @@ -234,154 +234,86 @@ void SCF::load_mos(World& world) { repeat for beta if !spinrestricted - */ - - //Local copies for basic check - double L; - Molecule molecule1; - int k1; - - // LOTS OF LOGIC MISSING HERE TO CHANGE OCCUPATION NO., SET, - // EPS, SWAP, ... sigh - ar & current_energy & spinrest; - - ar & nmo; - MADNESS_ASSERT(nmo >= unsigned(param.nmo_alpha)); - ar & aeps & aocc & aset & L & k1 & molecule1; - - //Some basic checks - if(L != param.L){ - if(world.rank()==0) print("Warning: Box size mismatch between archive and input parameter. Archive value:", L, "Param value:", param.L); - } - - amo.resize(nmo); - for (unsigned int i = 0; i < amo.size(); ++i) - ar & amo[i]; - unsigned int n_core = molecule.n_core_orb_all(); - if (nmo > unsigned(param.nmo_alpha)) { - aset = vector(aset.begin() + n_core, - aset.begin() + n_core + param.nmo_alpha); - amo = vecfuncT(amo.begin() + n_core, - amo.begin() + n_core + param.nmo_alpha); - aeps = copy(aeps(Slice(n_core, n_core + param.nmo_alpha - 1))); - aocc = copy(aocc(Slice(n_core, n_core + param.nmo_alpha - 1))); - } - - if (amo[0].k() != k) { - reconstruct(world, amo); - for (unsigned int i = 0; i < amo.size(); ++i) - amo[i] = madness::project(amo[i], k, thresh, false); - world.gop.fence(); - } - set_thresh(world,amo,thresh); - - // normalize(world, amo); - // amo = transform(world, amo, Q3(matrix_inner(world, amo, amo)), trantol, true); - // truncate(world, amo); - // normalize(world, amo); - - if (!param.spin_restricted) { - - if (spinrest) { // Only alpha spin orbitals were on disk - MADNESS_ASSERT(param.nmo_alpha >= param.nmo_beta); - bmo.resize(param.nmo_beta); - bset.resize(param.nmo_beta); - beps = copy(aeps(Slice(0, param.nmo_beta - 1))); - bocc = copy(aocc(Slice(0, param.nmo_beta - 1))); - for (int i = 0; i < param.nmo_beta; ++i) - bmo[i] = copy(amo[i]); - } else { - ar & nmo; - ar & beps & bocc & bset; - - bmo.resize(nmo); - for (unsigned int i = 0; i < bmo.size(); ++i) - ar & bmo[i]; - - if (nmo > unsigned(param.nmo_beta)) { - bset = vector(bset.begin() + n_core, - bset.begin() + n_core + param.nmo_beta); - bmo = vecfuncT(bmo.begin() + n_core, - bmo.begin() + n_core + param.nmo_beta); - beps = copy(beps(Slice(n_core, n_core + param.nmo_beta - 1))); - bocc = copy(bocc(Slice(n_core, n_core + param.nmo_beta - 1))); - } - - if (bmo[0].k() != k) { - reconstruct(world, bmo); - for (unsigned int i = 0; i < bmo.size(); ++i) - bmo[i] = madness::project(bmo[i], k, thresh, false); - world.gop.fence(); - } - set_thresh(world,amo,thresh); - - // LOTS OF LOGIC MISSING HERE TO CHANGE OCCUPATION NO., SET, - // EPS, SWAP, ... sigh - ar & current_energy & spinrest; - - ar & nmo; - MADNESS_ASSERT(nmo >= unsigned(param.nmo_alpha())); - ar & aeps & aocc & aset; - amo.resize(nmo); - for (unsigned int i = 0; i < amo.size(); ++i) - ar & amo[i]; - unsigned int n_core = molecule.n_core_orb_all(); - if (nmo > unsigned(param.nmo_alpha())) { - aset = vector(aset.begin() + n_core, - aset.begin() + n_core + param.nmo_alpha()); - amo = vecfuncT(amo.begin() + n_core, - amo.begin() + n_core + param.nmo_alpha()); - aeps = copy(aeps(Slice(n_core, n_core + param.nmo_alpha() - 1))); - aocc = copy(aocc(Slice(n_core, n_core + param.nmo_alpha() - 1))); - } - - if (amo[0].k() != k) { - reconstruct(world, amo); - for (unsigned int i = 0; i < amo.size(); ++i) - amo[i] = madness::project(amo[i], k, thresh, false); - world.gop.fence(); - } - set_thresh(world,amo,thresh); - - // normalize(world, amo); - // amo = transform(world, amo, Q3(matrix_inner(world, amo, amo)), trantol, true); - // truncate(world, amo); - // normalize(world, amo); - - if (!param.spin_restricted()) { - - if (spinrest) { // Only alpha spin orbitals were on disk - MADNESS_ASSERT(param.nmo_alpha() >= param.nmo_beta()); - bmo.resize(param.nmo_beta()); - bset.resize(param.nmo_beta()); - beps = copy(aeps(Slice(0, param.nmo_beta() - 1))); - bocc = copy(aocc(Slice(0, param.nmo_beta() - 1))); - for (int i = 0; i < param.nmo_beta(); ++i) - bmo[i] = copy(amo[i]); - } else { - ar & nmo; - ar & beps & bocc & bset; - - bmo.resize(nmo); - for (unsigned int i = 0; i < bmo.size(); ++i) - ar & bmo[i]; - - if (nmo > unsigned(param.nmo_beta())) { - bset = vector(bset.begin() + n_core, - bset.begin() + n_core + param.nmo_beta()); - bmo = vecfuncT(bmo.begin() + n_core, - bmo.begin() + n_core + param.nmo_beta()); - beps = copy(beps(Slice(n_core, n_core + param.nmo_beta() - 1))); - bocc = copy(bocc(Slice(n_core, n_core + param.nmo_beta() - 1))); - } - - if (bmo[0].k() != k) { - reconstruct(world, bmo); - for (unsigned int i = 0; i < bmo.size(); ++i) - bmo[i] = madness::project(bmo[i], k, thresh, false); - world.gop.fence(); - } - set_thresh(world,amo,thresh); + */ + + //Local copies for basic check + double L; + Molecule molecule1; + int k1; + + // LOTS OF LOGIC MISSING HERE TO CHANGE OCCUPATION NO., SET, + // EPS, SWAP, ... sigh + ar & current_energy & spinrest; + + ar & nmo; + MADNESS_ASSERT(nmo >= unsigned(param.nmo_alpha())); + ar & aeps & aocc & aset & L & k1 & molecule1; + + //Some basic checks + if(L != param.L()){ + if(world.rank()==0) print("Warning: Box size mismatch between archive and input parameter. Archive value:", L, "Param value:", param.L()); + } + + amo.resize(nmo); + for (unsigned int i = 0; i < amo.size(); ++i) + ar & amo[i]; + unsigned int n_core = molecule.n_core_orb_all(); + if (nmo > unsigned(param.nmo_alpha())) { + aset = vector(aset.begin() + n_core, + aset.begin() + n_core + param.nmo_alpha()); + amo = vecfuncT(amo.begin() + n_core, + amo.begin() + n_core + param.nmo_alpha()); + aeps = copy(aeps(Slice(n_core, n_core + param.nmo_alpha() - 1))); + aocc = copy(aocc(Slice(n_core, n_core + param.nmo_alpha() - 1))); + } + + if (amo[0].k() != k) { + reconstruct(world, amo); + for (unsigned int i = 0; i < amo.size(); ++i) + amo[i] = madness::project(amo[i], k, thresh, false); + world.gop.fence(); + } + set_thresh(world,amo,thresh); + + // normalize(world, amo); + // amo = transform(world, amo, Q3(matrix_inner(world, amo, amo)), trantol, true); + // truncate(world, amo); + // normalize(world, amo); + + if (!param.spin_restricted()) { + + if (spinrest) { // Only alpha spin orbitals were on disk + MADNESS_ASSERT(param.nmo_alpha() >= param.nmo_beta()); + bmo.resize(param.nmo_beta()); + bset.resize(param.nmo_beta()); + beps = copy(aeps(Slice(0, param.nmo_beta() - 1))); + bocc = copy(aocc(Slice(0, param.nmo_beta() - 1))); + for (int i = 0; i < param.nmo_beta(); ++i) + bmo[i] = copy(amo[i]); + } else { + ar & nmo; + ar & beps & bocc & bset; + + bmo.resize(nmo); + for (unsigned int i = 0; i < bmo.size(); ++i) + ar & bmo[i]; + + if (nmo > unsigned(param.nmo_beta())) { + bset = vector(bset.begin() + n_core, + bset.begin() + n_core + param.nmo_beta()); + bmo = vecfuncT(bmo.begin() + n_core, + bmo.begin() + n_core + param.nmo_beta()); + beps = copy(beps(Slice(n_core, n_core + param.nmo_beta() - 1))); + bocc = copy(bocc(Slice(n_core, n_core + param.nmo_beta() - 1))); + } + + if (bmo[0].k() != k) { + reconstruct(world, bmo); + for (unsigned int i = 0; i < bmo.size(); ++i) + bmo[i] = madness::project(bmo[i], k, thresh, false); + world.gop.fence(); + } + set_thresh(world,amo,thresh); // normalize(world, bmo); // bmo = transform(world, bmo, Q3(matrix_inner(world, bmo, bmo)), trantol, true); diff --git a/src/apps/moldft/DF.cc b/src/apps/moldft/DF.cc index 63e779ff1a0..25caf57065f 100644 --- a/src/apps/moldft/DF.cc +++ b/src/apps/moldft/DF.cc @@ -773,26 +773,26 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi } //This function is old an only used in the virtual solver (that doesn't work) -Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ - throw; - complex_function_3d temp(world); - Fcwf result(world); - - unsigned int n = Init_params.num_occupied; - for(unsigned int i = 0; i < n; i++){ - temp = inner_func(world, occupieds[i], phi); - temp.truncate(); - temp = apply(op,temp); - if(i == 0){ - result = occupieds[i]*temp; - } - else{ - result += occupieds[i]*temp; - } - } - result.truncate(); - return result; -} +//Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ +// throw; +// complex_function_3d temp(world); +// Fcwf result(world); +// +// unsigned int n = Init_params.num_occupied; +// for(unsigned int i = 0; i < n; i++){ +// temp = inner_func(world, occupieds[i], phi); +// temp.truncate(); +// temp = apply(op,temp); +// if(i == 0){ +// result = occupieds[i]*temp; +// } +// else{ +// result += occupieds[i]*temp; +// } +// } +// result.truncate(); +// return result; +//} //Diagonalize psis in the Fock space. psis is modified in place. requires Kpsis to be precomputed //Kpsis are transformed in place. @@ -1028,81 +1028,81 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. - //if(world.rank()==0) print(" Removing Rotations"); - //start_timer(world); - - //double thresh_degenerate = DFparams.thresh*10.0; - //double csquared = 137.0359895*137.0359895; //electron rest energy - - ////swap columns for a diagonally dominant matrix - //bool switched = true; - //while (switched) { - // switched = false; - // for (unsigned int kk = 0; kk < m; kk++) { - // for (unsigned int j = kk + 1; j < m; j++) { - // double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); - // double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); - // //if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { - // if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::fabs(evals[kk])) ) { - // if(world.rank()==0){ - // print(" swapping columns ", kk+1, " and ", j+1); - // } - // Tensor> tmp = copy(U(_, kk)); - // U(_, kk) = U(_, j); - // U(_, j) = tmp; - // std::swap(evals[kk], evals[j]); - // switched = true; - // } - // } - // } - //} + if(world.rank()==0) print(" Removing Rotations"); + start_timer(world); - //// Fix phases. - //for (unsigned int kk = 0; kk < m; ++kk) - // U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); + double thresh_degenerate = DFparams.thresh*10.0; + double csquared = 137.0359895*137.0359895; //electron rest energy - ////if(world.rank()==0) print("After column swapping\nU:\n", U, "\nevals:\n", evals); - // - ////Find clusters of degenerate eigenvalues and rotate eigenvectors to maximize overlap with previous ones - //unsigned int ilo = 0; // first element of cluster - //if(world.rank()==0) print(" Degeneracy threshold: ",thresh_degenerate); - // - //while (ilo < m - 1) { - // unsigned int ihi = ilo; - // while (fabs(evals[ilo] - evals[ihi + 1]) - // < thresh_degenerate * std::fabs(evals[ilo])){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { - // //< thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { - // ++ihi; - // if (ihi == m - 1) - // break; - // } - // unsigned int nclus = ihi - ilo + 1; - // if (nclus > 1) { - // if(world.rank()==0){ - // print(" found cluster from ", ilo + 1, " to " , ihi + 1); - // for(unsigned int kk = ilo; kk <= ihi; kk++){ - // print(" ",evals[kk]); - // } - // } - - - // //Use the polar decomposition to undo rotations: - // Tensor> q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); - // Tensor> VH(nclus,nclus); - // Tensor> W(nclus,nclus); - // Tensor sigma(nclus); - - // svd(q, W, sigma, VH); - - // //W*VH is the rotation part of q. Undo it by taking the adjoint and right-multiplying - // q = conj_transpose(inner(W,VH)); - // U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); - // - // } - // ilo = ihi + 1; - //} - //times = end_timer(world); - //if(world.rank()==0) print(" ", times[0]); + //swap columns for a diagonally dominant matrix + bool switched = true; + while (switched) { + switched = false; + for (unsigned int kk = 0; kk < m; kk++) { + for (unsigned int j = kk + 1; j < m; j++) { + double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); + double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); + //if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { + if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::fabs(evals[kk])) ) { + if(world.rank()==0){ + print(" swapping columns ", kk+1, " and ", j+1); + } + Tensor> tmp = copy(U(_, kk)); + U(_, kk) = U(_, j); + U(_, j) = tmp; + std::swap(evals[kk], evals[j]); + switched = true; + } + } + } + } + + // Fix phases. + for (unsigned int kk = 0; kk < m; ++kk) + U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); + + //if(world.rank()==0) print("After column swapping\nU:\n", U, "\nevals:\n", evals); + + //Find clusters of degenerate eigenvalues and rotate eigenvectors to maximize overlap with previous ones + unsigned int ilo = 0; // first element of cluster + if(world.rank()==0) print(" Degeneracy threshold: ",thresh_degenerate); + + while (ilo < m - 1) { + unsigned int ihi = ilo; + while (fabs(evals[ilo] - evals[ihi + 1]) + < thresh_degenerate * std::fabs(evals[ilo])){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { + //< thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { + ++ihi; + if (ihi == m - 1) + break; + } + unsigned int nclus = ihi - ilo + 1; + if (nclus > 1) { + if(world.rank()==0){ + print(" found cluster from ", ilo + 1, " to " , ihi + 1); + for(unsigned int kk = ilo; kk <= ihi; kk++){ + print(" ",evals[kk]); + } + } + + + //Use the polar decomposition to undo rotations: + Tensor> q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); + Tensor> VH(nclus,nclus); + Tensor> W(nclus,nclus); + Tensor sigma(nclus); + + svd(q, W, sigma, VH); + + //W*VH is the rotation part of q. Undo it by taking the adjoint and right-multiplying + q = conj_transpose(inner(W,VH)); + U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + + } + ilo = ihi + 1; + } + times = end_timer(world); + if(world.rank()==0) print(" ", times[0]); //Debugging: Print transformation matrix after rotation removal //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); diff --git a/src/apps/moldft/DFdriver.cc b/src/apps/moldft/DFdriver.cc index 6b512fe52a8..5afd3635013 100644 --- a/src/apps/moldft/DFdriver.cc +++ b/src/apps/moldft/DFdriver.cc @@ -45,6 +45,7 @@ int main(int argc, char** argv) my_calc.solve(world); //my_calc.virtuals(world); + world.gop.fence(); world.gop.fence(); finalize(); From 199b4551f023db737da4378e3cc506c6d9f2ea5d Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 15 Jan 2020 14:22:41 -0500 Subject: [PATCH 0057/1312] move my stuff to new directory --- src/apps/CMakeLists.txt | 1 + src/apps/dirac/CMakeLists.txt | 8 ++++++++ src/apps/{moldft => dirac}/DF.cc | 0 src/apps/{moldft => dirac}/DF.h | 0 src/apps/{moldft => dirac}/DFParameters.h | 0 src/apps/{moldft => dirac}/DFdriver.cc | 0 src/apps/{moldft => dirac}/DKops.h | 0 src/apps/{moldft => dirac}/ESInterface.h | 0 src/apps/{moldft => dirac}/InitParameters.h | 0 src/apps/{moldft => dirac}/NWChem.cc | 0 src/apps/{moldft => dirac}/NWChem.h | 0 src/apps/{moldft => dirac}/basis.h | 0 src/apps/{moldft => dirac}/fcwf.cc | 0 src/apps/{moldft => dirac}/fcwf.h | 0 src/apps/{moldft => dirac}/gaussian.cc | 0 src/apps/{moldft => dirac}/gaussian.h | 0 src/apps/{moldft => dirac}/polynomial.cc | 0 src/apps/{moldft => dirac}/polynomial.h | 0 src/apps/{moldft => dirac}/relops.cc | 0 src/apps/{moldft/rk-3.cc => dirac/rk.cc} | 0 src/apps/moldft/CMakeLists.txt | 9 --------- 21 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 src/apps/dirac/CMakeLists.txt rename src/apps/{moldft => dirac}/DF.cc (100%) rename src/apps/{moldft => dirac}/DF.h (100%) rename src/apps/{moldft => dirac}/DFParameters.h (100%) rename src/apps/{moldft => dirac}/DFdriver.cc (100%) rename src/apps/{moldft => dirac}/DKops.h (100%) rename src/apps/{moldft => dirac}/ESInterface.h (100%) rename src/apps/{moldft => dirac}/InitParameters.h (100%) rename src/apps/{moldft => dirac}/NWChem.cc (100%) rename src/apps/{moldft => dirac}/NWChem.h (100%) rename src/apps/{moldft => dirac}/basis.h (100%) rename src/apps/{moldft => dirac}/fcwf.cc (100%) rename src/apps/{moldft => dirac}/fcwf.h (100%) rename src/apps/{moldft => dirac}/gaussian.cc (100%) rename src/apps/{moldft => dirac}/gaussian.h (100%) rename src/apps/{moldft => dirac}/polynomial.cc (100%) rename src/apps/{moldft => dirac}/polynomial.h (100%) rename src/apps/{moldft => dirac}/relops.cc (100%) rename src/apps/{moldft/rk-3.cc => dirac/rk.cc} (100%) diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt index b3da7ff9f67..ed433a4616d 100644 --- a/src/apps/CMakeLists.txt +++ b/src/apps/CMakeLists.txt @@ -7,6 +7,7 @@ add_subdirectory(tdse) add_subdirectory(moldft) add_subdirectory(pno) add_subdirectory(cis) +add_subdirectory(dirac) #add_subdirectory(exciting) #add_subdirectory(hf) #add_subdirectory(ii) diff --git a/src/apps/dirac/CMakeLists.txt b/src/apps/dirac/CMakeLists.txt new file mode 100644 index 00000000000..7fcd956f5eb --- /dev/null +++ b/src/apps/dirac/CMakeLists.txt @@ -0,0 +1,8 @@ +# src/apps/moldft + +add_executable(DFdriverJ DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) +target_link_libraries(DFdriverJ MADchem MADmra) + +add_executable(rkJ rk.cc) +target_link_libraries(rkJ MADchem MADmra -lgmp -lmpfr) + diff --git a/src/apps/moldft/DF.cc b/src/apps/dirac/DF.cc similarity index 100% rename from src/apps/moldft/DF.cc rename to src/apps/dirac/DF.cc diff --git a/src/apps/moldft/DF.h b/src/apps/dirac/DF.h similarity index 100% rename from src/apps/moldft/DF.h rename to src/apps/dirac/DF.h diff --git a/src/apps/moldft/DFParameters.h b/src/apps/dirac/DFParameters.h similarity index 100% rename from src/apps/moldft/DFParameters.h rename to src/apps/dirac/DFParameters.h diff --git a/src/apps/moldft/DFdriver.cc b/src/apps/dirac/DFdriver.cc similarity index 100% rename from src/apps/moldft/DFdriver.cc rename to src/apps/dirac/DFdriver.cc diff --git a/src/apps/moldft/DKops.h b/src/apps/dirac/DKops.h similarity index 100% rename from src/apps/moldft/DKops.h rename to src/apps/dirac/DKops.h diff --git a/src/apps/moldft/ESInterface.h b/src/apps/dirac/ESInterface.h similarity index 100% rename from src/apps/moldft/ESInterface.h rename to src/apps/dirac/ESInterface.h diff --git a/src/apps/moldft/InitParameters.h b/src/apps/dirac/InitParameters.h similarity index 100% rename from src/apps/moldft/InitParameters.h rename to src/apps/dirac/InitParameters.h diff --git a/src/apps/moldft/NWChem.cc b/src/apps/dirac/NWChem.cc similarity index 100% rename from src/apps/moldft/NWChem.cc rename to src/apps/dirac/NWChem.cc diff --git a/src/apps/moldft/NWChem.h b/src/apps/dirac/NWChem.h similarity index 100% rename from src/apps/moldft/NWChem.h rename to src/apps/dirac/NWChem.h diff --git a/src/apps/moldft/basis.h b/src/apps/dirac/basis.h similarity index 100% rename from src/apps/moldft/basis.h rename to src/apps/dirac/basis.h diff --git a/src/apps/moldft/fcwf.cc b/src/apps/dirac/fcwf.cc similarity index 100% rename from src/apps/moldft/fcwf.cc rename to src/apps/dirac/fcwf.cc diff --git a/src/apps/moldft/fcwf.h b/src/apps/dirac/fcwf.h similarity index 100% rename from src/apps/moldft/fcwf.h rename to src/apps/dirac/fcwf.h diff --git a/src/apps/moldft/gaussian.cc b/src/apps/dirac/gaussian.cc similarity index 100% rename from src/apps/moldft/gaussian.cc rename to src/apps/dirac/gaussian.cc diff --git a/src/apps/moldft/gaussian.h b/src/apps/dirac/gaussian.h similarity index 100% rename from src/apps/moldft/gaussian.h rename to src/apps/dirac/gaussian.h diff --git a/src/apps/moldft/polynomial.cc b/src/apps/dirac/polynomial.cc similarity index 100% rename from src/apps/moldft/polynomial.cc rename to src/apps/dirac/polynomial.cc diff --git a/src/apps/moldft/polynomial.h b/src/apps/dirac/polynomial.h similarity index 100% rename from src/apps/moldft/polynomial.h rename to src/apps/dirac/polynomial.h diff --git a/src/apps/moldft/relops.cc b/src/apps/dirac/relops.cc similarity index 100% rename from src/apps/moldft/relops.cc rename to src/apps/dirac/relops.cc diff --git a/src/apps/moldft/rk-3.cc b/src/apps/dirac/rk.cc similarity index 100% rename from src/apps/moldft/rk-3.cc rename to src/apps/dirac/rk.cc diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index 9c3f8078da7..79a93bbe55d 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -15,15 +15,6 @@ target_link_libraries(testpg MADchem ${DISABLEPIE_LINKER_FLAG}) add_executable(testperiodic_moldft testperiodic.cc) target_link_libraries(testperiodic_moldft MADchem ${DISABLEPIE_LINKER_FLAG}) -add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) -target_link_libraries(DFdriver MADchem MADmra) - -add_executable(DFdriver2 DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) -target_link_libraries(DFdriver2 MADchem MADmra) - -add_executable(rk rk-3.cc) -target_link_libraries(rk MADchem MADmra -lgmp -lmpfr) - add_executable(dk DKhydrogen3.cc) target_link_libraries(dk MADchem MADmra -lgmp -lmpfr) From d0ebddfd3418ec7d03bce64d2c4abff7ede88ed2 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 20 Jan 2020 14:01:48 -0500 Subject: [PATCH 0058/1312] first round of trimming and commenting --- src/apps/dirac/DF.cc | 1125 ++++++++++-------------------------- src/apps/dirac/DF.h | 27 +- src/apps/dirac/DFdriver.cc | 9 +- src/apps/dirac/fcwf.cc | 125 ++-- src/apps/dirac/fcwf.h | 9 +- 5 files changed, 386 insertions(+), 909 deletions(-) diff --git a/src/apps/dirac/DF.cc b/src/apps/dirac/DF.cc index 25caf57065f..01a301d24ea 100644 --- a/src/apps/dirac/DF.cc +++ b/src/apps/dirac/DF.cc @@ -4,8 +4,8 @@ * Date: A long time ago... * * TODO: - * - Use energies calculated in diagonalization and calculate various totals at the end - * - Use total of orbital energies as convergence criterion, rather than recalculating + * - Reading input from NWChem needs to be updated for the spin-restricted version of the code + * - Try setting truncate mode to 0 just for the final calculation of the energy * - * */ @@ -133,8 +133,6 @@ GradBSHOperator_Joel(World& world, double max_expnt = 10000.0; //Just taking a stab at this for now // Then need to truncate coeff and expnt into new Tensors - //if(world.rank()==0) print("Initial expnts are: \n",expnt, "\n"); - //if(world.rank()==0) print("Initial coeffs are: \n",coeff, "\n"); int rank = coeff.dim(0); double Cdelta = 0.0; double max_kept; @@ -149,11 +147,8 @@ GradBSHOperator_Joel(World& world, break; } } - //if(world.rank()==0) print("limit exponent is: ", max_expnt, " and max kept is: ", max_kept); coeff = coeff(Slice(max_j,-1)); expnt = expnt(Slice(max_j,-1)); - //if(world.rank()==0) print("new expnts are: \n", expnt, "\n"); - //if(world.rank()==0) print("new coeffs are: \n", coeff, "\n"); // Then calculate what the new coefficient needs to be out front coeff[0] = coeff[0] + Cdelta * std::pow(expnt[0]/constants::pi,1.5); @@ -162,16 +157,10 @@ GradBSHOperator_Joel(World& world, rank = coeff.dim(0); //---------------------------------------------------------------------------------------------- - - - if(world.rank()==0) print("rank: ", rank, "\nexponents:\n", expnt, "\ncoefficients:\n", coeff); - - if (bc(0,0) == BC_PERIODIC) { fit.truncate_periodic_expansion(coeff, expnt, width.max(), true); } - std::vector gradG(3); for (int dir=0; dir<3; dir++) { @@ -202,15 +191,13 @@ Tensor> Q2(const Tensor>& s) { return Q; } - - //Functor to make the (Gaussian) nuclear potential class GaussianNucleusFunctor : public FunctionFunctorInterface { private: - std::vector m_Zlist; - std::vector m_Rlist; - std::vector m_Alist; - std::vector m_xi; + std::vector m_Zlist; //list of nuclear charges + std::vector m_Rlist; //list of nuclear coordinates + std::vector m_Alist; //list of mass numbers + std::vector m_xi; //list of gaussian coefficients public: // Constructor GaussianNucleusFunctor(Molecule& molecule, double bohr_rad){ @@ -270,6 +257,7 @@ class GaussianNucleusFunctor : public FunctionFunctorInterface { //Functor to make the fermi nuclear charge distribution (NOT the potential, and NOT normalized) for a given center +//This is based on Visscher and Dyall's 1997 paper on nuclear charge distributions. class FermiNucDistFunctor : public FunctionFunctorInterface { private: int m_A; @@ -345,7 +333,7 @@ double myr(const coord_3d& r){ return std::sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]); } -//Creates the fermi nuclear potentiali from the charge distribution. Also calculates the nuclear repulsion energy +//Creates the fermi nuclear potential from the charge distribution. Also calculates the nuclear repulsion energy void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_function_3d& potential, double& nuclear_repulsion_energy){ if(world.rank()==0) print("\n***Making a Fermi Potential***"); @@ -442,33 +430,33 @@ DF::DF(World & world,std::shared_ptr input) { //If user requests different k, then project functions if(DFparams.k != Init_params.order){ + + //set function default FunctionDefaults<3>::set_k(DFparams.k); + + //Loop over orbitals for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + + //Look over 4 components of orbitals for(unsigned int j = 0; j < 4; j++){ + + //project Init_params.orbitals[i][j] = project(Init_params.orbitals[i][j], FunctionDefaults<3>::get_k(), DFparams.thresh, false); } + + //fence and truncate world.gop.fence(); Init_params.orbitals[i].truncate(); } - if(DFparams.job == 1){ - for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ - for(unsigned int j = 0; j < 4; j++){ - Init_params.virtuals[i][j] = project(Init_params.virtuals[i][j], FunctionDefaults<3>::get_k(), DFparams.thresh, false); - } - world.gop.fence(); - Init_params.virtuals[i].truncate(); - } - } } //Set local orbitals and energies to those from the archive energies = Init_params.energies; - v_energies = Init_params.v_energies; occupieds = Init_params.orbitals; - virtuals = Init_params.virtuals; total_energy = Init_params.Init_total_energy; - closed_shell = Init_params.spinrestricted; //If nonrelativistic calculation was spinrestricted then we're doing a closed shell calculation - + //If nonrelativistic calculation was spinrestricted then we're doing a closed shell calculation + //This is a little incorrect, as we're equating two separate concepts, but it works for now. + closed_shell = Init_params.spinrestricted; Tensor times = end_timer(world); if(world.rank()==0) print("Preparation complete: ", times[0]); @@ -510,10 +498,7 @@ Fcwf apply_T(World& world, Fcwf& psi){ //function to calculate the kinetic + rest energy expectation value using Dirac Hamiltonian c*\alpha*p+\Beta*m*c*c double DF::rele(World& world, Fcwf& psi){ Fcwf Tpsi = apply_T(world, psi); - std::complex energy = inner(psi, Tpsi); - //if(world.rank()==0) print(" in rele: ", energy.real()); - return energy.real(); } @@ -523,71 +508,26 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //start timer start_timer(world); - //zero out Kpsis for(unsigned int i = 0; i < Init_params.num_occupied; i++){ Kpsis[i] = Fcwf(world); } - //reconstruct for(unsigned int i = 0; i < Init_params.num_occupied; i++){ occupieds[i].reconstruct(); } - //Calculate and accumulate exchange contributions unsigned int n = Init_params.num_occupied; double myc = 137.0359895; //speed of light in atomic units - //for debugging - /////////////Tensor> exchange1(n,n); //spin-up contributions - /////////////Tensor> exchange2(n,n); //spin-down contributions - - - ///////////////Working on spin-restricted version of exchange now. For now do it the stupid way - /////////////for(unsigned int i=0; i < n; i++){ - ///////////// Fcwf K1 = Fcwf(world); - ///////////// Fcwf K2 = Fcwf(world); - ///////////// for(unsigned int j=0; j temp(n-i); for(unsigned int j = 0; j < n-i; j++){ temp[j] = complex_factory_3d(world); @@ -647,11 +587,8 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi Kpsis[j][3] += temp3[j-i]; } - //truncate if we're done, but for Kramers-restricted calculations we still have work to do - //Kpsis[i].truncate(); } - //Now we need exchange contributions from the time-reversed orbitals that we don't explicitly store. //This will look very similar to the above loop (over i), but with rearrangements to the temporary vectors //Later, these can probably be combined into a single loop @@ -661,58 +598,59 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi num_contrib = n-1; } + //Loop through orbitals phi_i, computing K(phi_i), and while we're at it, use symmetry to start calculating contributions to later orbitals for(unsigned int i = 0; i < num_contrib; i++){ - //RESUME HERE commenting (can use above for guidance) + //temp will hold the contributions (results of the coulomb operator application) that we need to finish calculation of K(phi_i) + //For the first iteration, we need all n "contributions," so temp has length n, but this will decrease by 1 each iteration std::vector temp(num_contrib-i); for(unsigned int j = 0; j < num_contrib-i; j++){ temp[j] = complex_factory_3d(world); } compress(world, temp); + //break up the time-reversals of the ith through nth orbitals into their components to facilitate use of vmra functions std::vector temp0(num_contrib-i); std::vector temp1(num_contrib-i); std::vector temp2(num_contrib-i); std::vector temp3(num_contrib-i); for(unsigned int j = i; j < num_contrib; j++){ + //the next four lines accomplish the rearrangement needed to get the time reversal rather than the orbital itself, but skip the complex conjugation, which will come later temp0[j-i] = -1.0*occupieds[j][1]; temp1[j-i] = occupieds[j][0]; temp2[j-i] = -1.0*occupieds[j][3]; temp3[j-i] = occupieds[j][2]; } + //These gaxpy calls accomplish the (\phi_j^T)(\phi_i) in the numerator. Conjugation of phi_j is left to later gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*temp0); gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*temp1); gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*temp2); gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*temp3); + //truncate before apply phase truncate(world, temp); - //if(world.rank()==0) print(i, "Starting apply phase in K"); - + //apply coulomb operator temp = apply(world, op, temp); + //truncate again truncate(world,temp); - //if(world.rank()==0) print(i, "Exiting apply phase in K"); - + //Now multiply by phi_j's and accumulate to K(phi_i) + //Here is where we put the complex conjugation we've left out. This allows for one conjugation here instead of two conjugations earlier. Kpsis[i][0] += sum(world, mul(world, temp, conj(world,temp0))); Kpsis[i][1] += sum(world, mul(world, temp, conj(world,temp1))); Kpsis[i][2] += sum(world, mul(world, temp, conj(world,temp2))); Kpsis[i][3] += sum(world, mul(world, temp, conj(world,temp3))); - //if(world.rank()==0) print(i, "Exiting sum block in K"); - - //Below line commented out, negative shifted to next block of code - //temp = -1.0*temp; - + //Now for the next part (accumulating the n-i "symmetric" contributions), we already have the complex conjugate of temp, so we can go straight to multiplication by the time-reversal of phi_i temp0 = conj(occupieds[i][1])*temp; temp1 = -1.0*conj(occupieds[i][0])*temp; temp2 = conj(occupieds[i][3])*temp; temp3 = -1.0*conj(occupieds[i][2])*temp; - // if(world.rank()==0) print(i, "Entering final loop in K"); - + //accumulate for(unsigned int j = i+1; j < num_contrib; j++){ Kpsis[j][0] += temp0[j-i]; Kpsis[j][1] += temp1[j-i]; @@ -720,13 +658,10 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi Kpsis[j][3] += temp3[j-i]; } - //if(world.rank()==0) print(i, "Exiting final loop in K"); - - Kpsis[i].truncate(); - } //For open shell calculations need to calculate final contributions for the singly-occupied orbital + //This will look very similar to the two above loops //Could put this as an addition to the first iteration of the loop above for more concise, though less readable code if(!closed_shell){ std::vector temp(n-1); @@ -753,7 +688,6 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi truncate(world, temp); - temp = apply(world, op, temp); truncate(world,temp); @@ -763,51 +697,31 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi Kpsis[n-1][2] += sum(world, mul(world, temp, conj(world,temp2))); Kpsis[n-1][3] += sum(world, mul(world, temp, conj(world,temp3))); - Kpsis[n-1].truncate(); - } + + //Truncate + for(unsigned int i=0; i < n; i++) Kpsis[i].truncate(); //Report time Tensor times = end_timer(world); if(world.rank()==0) print(" ", times[0]); } -//This function is old an only used in the virtual solver (that doesn't work) -//Fcwf DF::apply_K(World& world, real_convolution_3d& op, Fcwf& phi){ -// throw; -// complex_function_3d temp(world); -// Fcwf result(world); -// -// unsigned int n = Init_params.num_occupied; -// for(unsigned int i = 0; i < n; i++){ -// temp = inner_func(world, occupieds[i], phi); -// temp.truncate(); -// temp = apply(op,temp); -// if(i == 0){ -// result = occupieds[i]*temp; -// } -// else{ -// result += occupieds[i]*temp; -// } -// } -// result.truncate(); -// return result; -//} - -//Diagonalize psis in the Fock space. psis is modified in place. requires Kpsis to be precomputed -//Kpsis are transformed in place. +//Diagonalize occupieds in the Fock space of occupieds. +//occupieds is transformed in place. +//This requires Kpsis to be precomputed. +//Kpsis are transformed in place as well. void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& op, std::vector& Kpsis){ if(world.rank()==0) print("\n***Diagonalizing***"); start_timer(world); - unsigned int n = Init_params.num_occupied; - - unsigned int np = Init_params.num_occupied; //number of PAIRS - if(!closed_shell) np -= 1; - + //Create a few integers to help keep track of loops + unsigned int n = Init_params.num_occupied; //number of orbitals we have stored + unsigned int np = closed_shell ? n : n-1; //number of PAIRS we want in computations unsigned int m = n+np; //Size of matrix to use + //Initialize tensors and vectors to store temporary wavefunctions needed for computation Tensor> fock(m, m); Tensor> overlap(m, m); Tensor> U(m,m); @@ -816,128 +730,60 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o std::vector kramers_pairs; //Make a permutation matrix for use later - //Fock matrix is built with orbitals in the following order: - // - // stored (doubly occupied) orbitals, singly-occupied orbital (if open shell), then kramers pairs of doubly-occupied orbitals - // + //Fock matrix is built with orbitals in the following order: stored (doubly occupied) orbitals, singly-occupied orbital (if open shell), then kramers pairs of doubly-occupied orbitals //However, before diagonalization we want the fock matrix as if our orbitals were in order of increasing energy. //This permutation matrix will accomplish the column and row swapping necessary to reorder Tensor P(m,m); for(unsigned int j=0; j < np; j++){ P(j,2*j) = 1; P(n+j,2*j+1) = 1; - //if(world.rank()==0) print("\nP:\n", P); } if(!closed_shell) P(n-1,m-1) = 1; - //if(world.rank()==0) print("\nP:\n", P); - //Debugging - //if(world.rank()==0) print("P:\n", P); + //Also make the vector of Kramers Pairs for use later + for(unsigned int j = 0; j < np; j++){ + kramers_pairs.push_back(occupieds[j].KramersPair()); + } if(world.rank()==0) print(" Forming Matrices"); start_timer(world); ////Form the Fock Matrix + // + //With the orbitals in the order described above, the Fock matrix can be thought of as a 2x2 block matrix. + // + //The dimensions are (using F to indicate blocks of the Fock matrix): + //F_11: n x n + //F_12: n x np + //F_21: np x n + //F_22: np x np + // + //If the system is closed shell, then n=np. + // + //To save on computation we explicity calculate F_11 and F_21, and then use these to calculate the remaining blocks + // + //We do this by first making a vector of F*psi for all psi in the orbitals we have stored - //calculate coulomb part + //calculate potential due to nuclei and mean field if(world.rank() == 0) print(" Adding (V+J)psi"); real_function_3d rho = real_factory_3d(world); for(unsigned int j = 0; j < np; j++){ rho += 2*squaremod(occupieds[j]); } if(!closed_shell) rho += squaremod(occupieds[n-1]); - - //Debugging - //for(unsigned int j = 0; j < n; j++){ - // double aa = occupieds[j][0].norm2(); - // double bb = occupieds[j][1].norm2(); - // double cc = occupieds[j][2].norm2(); - // double dd = occupieds[j][3].norm2(); - // if(world.rank()==0) print(" ", j+1, aa, bb, cc, dd); - //} - real_function_3d potential = myV + apply(op,rho); potential.truncate(); - - - //Also make the vector of Kramers Pairs - //TODO: Actually roll this into a variant of matrix inner that doesn't explictly store this vector in order to save memory. - for(unsigned int j = 0; j < np; j++){ - kramers_pairs.push_back(occupieds[j].KramersPair()); - } - - - ////Debugging - //std::vector debug_orbitals; - //for(unsigned int j = 0; j < n; j++){ - // debug_orbitals.push_back(occupieds[j]*myV); - //} - //Tensor> debugmatrix = matrix_inner(world,occupieds,debug_orbitals); - //fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); - //fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); - //debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); - //fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); - //fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); - //fock = inner(transpose(P),inner(fock,P)); - //if(world.rank()==0) print("\nVnuc matrix:\n",fock); - - //real_function_3d idk = apply(op,rho); - //for(unsigned int j = 0; j < n; j++){ - // debug_orbitals[j] = occupieds[j]*idk; - //} - //debugmatrix = matrix_inner(world,occupieds,debug_orbitals); - //fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); - //fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); - //debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); - //fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); - //fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); - //fock = inner(transpose(P),inner(fock,P)); - //if(world.rank()==0) print("\nJ matrix:\n",fock); - //for(unsigned int j = 0; j < n; j++){ - // double aa = occupieds[j].norm2(); - // double bb = debug_orbitals[j].norm2(); - // if(world.rank()==0) print(" ", j+1, aa, bb); - //} - - //for(unsigned int j = 0; j < n; j++){ - // debug_orbitals[j] = Kpsis[j]; - //} - //debugmatrix = matrix_inner(world,occupieds,debug_orbitals); - //fock(Slice(0,n-1),Slice(0,n-1)) = -1.0 * debugmatrix; - //fock(Slice(n,m-1),Slice(n,m-1)) = -1.0 * transpose(debugmatrix(Slice(0,np-1),Slice(0,np-1))); - //debugmatrix = matrix_inner(world, kramers_pairs, debug_orbitals); - //fock(Slice(n,m-1),Slice(0,n-1)) = -1.0 * debugmatrix; - //fock(Slice(0,n-1),Slice(n,m-1)) = conj_transpose(debugmatrix); - //fock = inner(transpose(P),inner(fock,P)); - //if(world.rank()==0) print("\nK matrix:\n",fock); - - //for(unsigned int j = 0; j < n; j++){ - // debug_orbitals[j] = apply_T(world,occupieds[j]); - //} - //debugmatrix = matrix_inner(world,occupieds,debug_orbitals); - //fock(Slice(0,n-1),Slice(0,n-1)) = copy(debugmatrix); - //fock(Slice(n,m-1),Slice(n,m-1)) = conj(debugmatrix(Slice(0,np-1),Slice(0,np-1))); - //debugmatrix = matrix_inner(world,kramers_pairs,debug_orbitals); - //fock(Slice(n,m-1),Slice(0,n-1)) = copy(debugmatrix); - //fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj_transpose(debugmatrix); - //fock = inner(transpose(P),inner(fock,P)); - //if(world.rank()==0) print("\nT matrix:\n",fock); - //End debugging - //add in coulomb parts to neworbitals for(unsigned int j = 0; j < n; j++){ temp_orbitals.push_back(occupieds[j]*potential); //add in coulomb term } - - //Handle K separately because the relations are a little different - // - //if(world.rank() == 0) print(" Subtracting K*psi"); + if(world.rank() == 0) print(" Subtracting K*psi"); //Move Kpsis to new orbitals, as they are part of the fock operator - //for(unsigned int j = 0; j < n; j++){ - // temp_orbitals[j] -= Kpsis[j]; //yes this needs to be subtraction. exchange function doesn't include the negative. - //} + for(unsigned int j = 0; j < n; j++){ + temp_orbitals[j] -= Kpsis[j]; //Must be subtracted because exchange function doesn't include the negative. + } //add in T_psi if(world.rank()==0) print(" Adding T*psi"); @@ -945,45 +791,23 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o temp_orbitals[j] += apply_T(world, occupieds[j]); //add in "kinetic" term } + //Now that we have F*psi (temp_orbitals), we can get on with integration if(world.rank()==0) print(" Integrating to form Fock Matrix"); start_timer(world); - - //Now compute the fock matrix - //sign doesn't line up with the notes, but I can't find out why - //if(world.rank()==0) print("a"); Tensor> tempmatrix = matrix_inner(world, occupieds, temp_orbitals); - //if(world.rank()==0) print("a:\n", tempmatrix); fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); fock(Slice(n,m-1),Slice(n,m-1)) = conj(tempmatrix(Slice(0,np-1),Slice(0,np-1))); tempmatrix = matrix_inner(world,kramers_pairs,temp_orbitals); - //if(world.rank()==0) print("b:\n", tempmatrix); fock(Slice(n,m-1),Slice(0,n-1)) = copy(tempmatrix); - //fock(Slice(0,n-1),Slice(n,m-1)) = -1.0*conj(tempmatrix); fock(Slice(0,n-1),Slice(n,m-1)) = conj_transpose(tempmatrix); - //Put in Exchange part - //if(world.rank()==0) print("c"); - tempmatrix = matrix_inner(world,occupieds,Kpsis); - //if(world.rank()==0) print("c:\n", tempmatrix); - fock(Slice(0,n-1),Slice(0,n-1)) = fock(Slice(0,n-1),Slice(0,n-1)) - tempmatrix; - fock(Slice(n,m-1),Slice(n,m-1)) = fock(Slice(n,m-1),Slice(n,m-1)) - transpose(tempmatrix(Slice(0,np-1),Slice(0,np-1))); - tempmatrix = matrix_inner(world, kramers_pairs, Kpsis); - //if(world.rank()==0) print("d:\n", tempmatrix); - fock(Slice(n,m-1),Slice(0,n-1)) = fock(Slice(n,m-1),Slice(0,n-1)) - tempmatrix; - //fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) + conj(tempmatrix); - fock(Slice(0,n-1),Slice(n,m-1)) = fock(Slice(0,n-1),Slice(n,m-1)) - conj_transpose(tempmatrix); - - //DEBUGGING: - //if(world.rank()==0) print("new fock matrix:\n",fock); - //if(world.rank()==0) print("P:\n",P); - //permute and symmetrize - //if(world.rank()==0) print("e"); fock = inner(transpose(P),inner(fock,P)); fock = (1.0/2.0)*(fock + conj_transpose(fock)); + //End timer for Fock matrix calculation Tensor times = end_timer(world); if(world.rank()==0) print(" ", times[0]); @@ -996,43 +820,35 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o overlap(Slice(n,m-1),Slice(0,n-1)) = matrix_inner(world,kramers_pairs,occupieds); overlap(Slice(n,m-1),Slice(n,m-1)) = matrix_inner(world,kramers_pairs,kramers_pairs); - //DEBUGGING: - //if(world.rank()==0) print("new overlap matrix:\n",overlap); - - //permute symmetrize + //permute and symmetrize overlap = inner(transpose(P),inner(overlap,P)); overlap = (1.0/2.0)*(overlap + conj_transpose(overlap)); + //End timers for overlap calculation and total matrix formation times = end_timer(world); if(world.rank()==0) print(" ", times[0]); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - - //debugging: print fock and overlap matrices - //if(world.rank()==0){ - // print("permuted fock:\n", fock); - // print("\npermuted overlap:\n", overlap); - //} - + //Now call eigensolver if(world.rank()==0) print(" Eigensolver"); start_timer(world); - - //Diagonalize - //if(world.rank()==0) print("P:\n", P, "\nfock:\n", fock, "\noverlap:\n", overlap, "\nU:\n", U); sygv(fock, overlap, 1, U, evals); times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - //debugging: print matrix of eigenvectors - //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); - //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. + //This is done in three steps: + // 1) Column-swapping in order to obtain a diagonally dominant matrix + // 2) Removal of complex phases, so the diagonal is comprised of positive real numbers + // 3) Identification of clusters with the same eigenvalue (within some tolerance) and removal of arbitrary + // rotations within the eigenspaces formed by those clusters + // + //This is largely stolen from SCF.cc, but heavily changed for FCWFs if(world.rank()==0) print(" Removing Rotations"); start_timer(world); - double thresh_degenerate = DFparams.thresh*10.0; - double csquared = 137.0359895*137.0359895; //electron rest energy + double thresh_degenerate = DFparams.thresh*10.0; //threshold for determining if eigenvalues are equal //swap columns for a diagonally dominant matrix bool switched = true; @@ -1042,7 +858,6 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o for (unsigned int j = kk + 1; j < m; j++) { double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); - //if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::fabs(evals[kk])) ) { if(world.rank()==0){ print(" swapping columns ", kk+1, " and ", j+1); @@ -1061,32 +876,28 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o for (unsigned int kk = 0; kk < m; ++kk) U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); - //if(world.rank()==0) print("After column swapping\nU:\n", U, "\nevals:\n", evals); - //Find clusters of degenerate eigenvalues and rotate eigenvectors to maximize overlap with previous ones unsigned int ilo = 0; // first element of cluster if(world.rank()==0) print(" Degeneracy threshold: ",thresh_degenerate); - + while (ilo < m - 1) { unsigned int ihi = ilo; - while (fabs(evals[ilo] - evals[ihi + 1]) - < thresh_degenerate * std::fabs(evals[ilo])){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { - //< thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { + while (fabs(evals[ilo] - evals[ihi + 1]) < thresh_degenerate * std::fabs(evals[ilo])){ ++ihi; - if (ihi == m - 1) - break; + if (ihi == m - 1) break; } - unsigned int nclus = ihi - ilo + 1; + unsigned int nclus = ihi - ilo + 1; //size of the cluster if (nclus > 1) { if(world.rank()==0){ + //some printing to tell the user about the clusters found print(" found cluster from ", ilo + 1, " to " , ihi + 1); for(unsigned int kk = ilo; kk <= ihi; kk++){ print(" ",evals[kk]); } } - //Use the polar decomposition to undo rotations: + //For a description of how this works see Matrix Computations by Golub and Van Loan, 4th Ed., Section 6.4.1 Tensor> q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); Tensor> VH(nclus,nclus); Tensor> W(nclus,nclus); @@ -1104,25 +915,21 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - //Debugging: Print transformation matrix after rotation removal - //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); - - //Now undo permutations before thr transformation phase + //Now undo permutations before the transformation phase U = inner(P,inner(U,transpose(P))); evals = inner(evals,transpose(P)); - //if(world.rank()==0) print("U:\n", U, "\nevals:\n", evals); - if(world.rank()==0) print(" Applying Transformation"); start_timer(world); - ////Apply the transformation to the orbitals + //Apply the transformation to the orbitals by right-multiplying + // Because we have n orbitals but the matrix has n+np rows, this happens in two stages tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); occupieds = transform(world, occupieds, tempmatrix); tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); occupieds += transform(world, kramers_pairs, tempmatrix); - ////Apply the transformation to the Exchange + ////Apply the transformation to the Exchange-applied functions as well for(unsigned int j = 0; j < np; j++){ kramers_pairs[j] = Kpsis[j].KramersPair(); } @@ -1131,23 +938,16 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); Kpsis += transform(world, kramers_pairs, tempmatrix); - //truncate for(int kk = 0; kk < n; kk++){ Kpsis[kk].truncate(); occupieds[kk].truncate(); } - //debugging - //for(unsigned int j=0; j < Init_params.num_occupied; j++){ - // double tempdouble = rele(world, occupieds[j]); - // if(world.rank()==0) print(" after diag, rele ",j," = ",tempdouble); - //} - //Set energies = evals energies = evals(Slice(0,n-1)); - + //End timers for this function times = end_timer(world); if(world.rank()==0) print(" ", times[0]); times = end_timer(world); @@ -1155,29 +955,7 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o } -//returns a vector of orthonormal Fcwfs constructed from the input vector of Fcwfs -std::vector orthogonalize(World& world, std::vector orbitals){ - throw; - int n = orbitals.size(); - std::vector result; - for(int i = 0; i < n; i++){ - result.push_back(copy(orbitals[i])); - } - std::complex r(0.0,0.0); - - for(int i = 0; i < n; i++){ - result[i].normalize(); - for(int j = i+1; j < n; j++){ - r = inner(result[i],result[j]); - result[j] -= result[i]*r; - } - } - return result; - -} - -//faster orthogonalize that modifies the input functions in place -//TODO: The function below mimics one from SCF.cc. In the future we will probably want a different variant (which also should exist in SCF.cc or somwhere like that) that treats core and valence orbitals differently: i.e. doesn't mix valence orbitals into the core orbitals +//orthogonalize occupieds in place. This function mimics a similar one from SCF.cc void DF::orthogonalize_inplace(World& world){ unsigned int n = occupieds.size(); @@ -1207,206 +985,32 @@ void DF::orthogonalize_inplace(World& world){ } -//This is an old function for virtual orbitals that probably doesn't work anymore -//Different diagonalize function that doesn't try to calculate a coulomb part internally -Tensor DF::diagonalize_virtuals(World& world, real_function_3d& JandV,real_convolution_3d& op, std::vector& Kpsis){ - - if(world.rank()==0) print("\n***Diagonalizing***"); - - unsigned int n = Init_params.num_virtuals; - Tensor> fock(n, n); - Tensor> overlap(n, n); - Tensor> U(n,n); - Tensor evals(n); - std::vector temp_orbitals; - - if(world.rank()==0) print(" Forming Matrices"); - - ////Form the Fock Matrix - //first apply Fock operator to all orbitals - - if(world.rank() == 0) print(" Moving K*psi"); - //Move Kpsis to new orbitals, as they are part of the fock operator - for(unsigned int j = 0; j < n; j++){ - temp_orbitals.push_back(Kpsis[j]); - temp_orbitals[j].scale(-1.0); - } - - //add in coulomb parts to neworbitals - for(unsigned int j = 0; j < n; j++){ - temp_orbitals[j] += virtuals[j]*JandV; //add in coulomb term - } - - //add in T_psi - if(world.rank()==0) print(" Adding T*psi"); - for(unsigned int j = 0; j < n; j++){ - temp_orbitals[j] += apply_T(world, virtuals[j]); //add in "kinetic" term - } - - //We now have a vector of F*psi for each psi (in temp_orbitals). - //Calculate each element of the fock matrix - if(world.rank()==0) print(" Integrating to form Fock Matrix"); - for(unsigned int j = 0; j < n; j++){ - for(unsigned int k = 0; k < n; k++){ - fock(j,k) = inner(virtuals[j],temp_orbitals[k]); - } - } - - ////Form the overlap matrix - if(world.rank()==0) print(" Integrating to form Overlap Matrix"); - for(unsigned int j = 0; j < n; j++){ - for(unsigned int k = 0; k < n; k++){ - overlap(j,k) = inner(virtuals[j],virtuals[k]); - } - } - - //debugging: print fock and overlap matrices - //if(world.rank()==0){ - // print("real(fock):\n", real(fock)); - // print("imag(fock):\n", imag(fock)); - // print("\nreal(overlap):\n", real(overlap)); - // print("\nimag(overlap):\n", imag(overlap)); - //} - - - if(world.rank()==0) print(" Eigensolver"); - - //Diagonalize - sygv(fock, overlap, 1, U, evals); - - //debugging: print matrix of eigenvectors and eigenvalues - //if(world.rank()==0) print("U:\n", U); - //if(world.rank()==0) print("\nevals:\n",evals); - - //Before applying the transformation, fix arbitrary rotations introduced by the eigensolver. - if(world.rank()==0) print(" Removing Rotations"); - - double thresh_degenerate = DFparams.thresh*100.0; - double csquared = 137.0359895*137.0359895; //electron rest energy - //swap columns for a diagonally dominant matrix - bool switched = true; - while (switched) { - switched = false; - for (unsigned int kk = 0; kk < n; kk++) { - for (unsigned int j = kk + 1; j < n; j++) { - //double sold = std::norm(U(kk, kk)) + std::norm(U(j, j)); - //double snew = std::norm(U(kk, j)) + std::norm(U(j, kk)); - double sold = std::real(U(kk,kk)*std::conj(U(kk,kk))) + std::real(U(j,j)*std::conj(U(j,j))); - double snew = std::real(U(kk,j)*std::conj(U(kk,j))) + std::real(U(j,kk)*std::conj(U(j,kk))); - if (snew > sold and not ((evals[j] - evals[kk]) > thresh_degenerate * std::max(std::fabs(evals[kk])-csquared,1.0)) ) { - if(world.rank()==0){ - print(" swapping columns ", kk+1, " and ", j+1); - } - Tensor> tmp = copy(U(_, kk)); - U(_, kk) = U(_, j); - U(_, j) = tmp; - std::swap(evals[kk], evals[j]); - switched = true; - } - } - } - } - - // Fix phases. - for (unsigned int kk = 0; kk < n; ++kk) - U(_, kk).scale(std::conj(U(kk,kk))/std::abs(U(kk,kk))); - - - //Find clusters of degenerate eigenvalues and rotate eigenvectors to maximize overlap with previous ones - unsigned int ilo = 0; // first element of cluster - if(world.rank()==0) print(" Degeneracy threshold: ",thresh_degenerate); - - while (ilo < n - 1) { - unsigned int ihi = ilo; - while (fabs(evals[ilo] - evals[ihi + 1]) - < thresh_degenerate * std::max(std::fabs(evals[ilo]-csquared),1.0)){// pow(10,floor(log10(std::fabs(evals[ilo]))))) { - ++ihi; - if (ihi == n - 1) - break; - } - unsigned int nclus = ihi - ilo + 1; - if (nclus > 1) { - if(world.rank()==0){ - print(" found cluster from ", ilo + 1, " to " , ihi + 1); - for(unsigned int kk = ilo; kk <= ihi; kk++){ - print(" ",evals[kk] - csquared); - } - } - - - //Use the polar decomposition to undo rotations: - Tensor> q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); - Tensor> VH(nclus,nclus); - Tensor> W(nclus,nclus); - Tensor sigma(nclus); - - svd(q, W, sigma, VH); - //W*VH is the rotation part of q. Undo it by taking the adjoint and right-multiplying - q = conj_transpose(inner(W,VH)); - U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); - - } - ilo = ihi + 1; - } - - - //if(world.rank()==0) print("U:\n", U); - - - fock = inner(conj_transpose(U), inner(fock, U)); - //if(world.rank()==0)print("\n U^* F U:\n",fock,"\n"); - - if(world.rank()==0) print(" Applying Transformation"); - - ////Apply the transformation to the Exchange - for(unsigned int j = 0; j < n; j++){ - temp_orbitals[j] = Fcwf(world); - for(unsigned int k = 0; k < n; k++){ - temp_orbitals[j] += Kpsis[k]*U(k,j); - } - } - for(unsigned int m = 0; m < n; m++){ - Kpsis[m] = temp_orbitals[m]; - } - - ////Apply the transformation to the orbitals - for(unsigned int j = 0; j < n; j++){ - temp_orbitals[j] = Fcwf(world); - for(unsigned int k = 0; k < n; k++){ - temp_orbitals[j] += virtuals[k]*U(k,j); - } - } - for(unsigned int j = 0; j < n; j++){ - virtuals[j] = temp_orbitals[j]; - } - - return evals; - -} - //Apply's Green's function to Vpsi (a Fcwf). Overwrites Vpsi with new Fcwf +//Use of this function has largely been replaced by apply_BSH_new, but +//this one is kept in case one wants to avoid use of the derivative operator. void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thresh){ - //necessary constants double myc = 137.0359895; //speed of light - double c2 = myc*myc; - std::complex myi(0,1); //imaginary number - std::complex ic = myi*myc; + double c2 = myc*myc; //speed of light squared + std::complex myi(0,1); //imaginary number i + std::complex ic = myi*myc; //i*c //calculate exponent for equivalent BSH operator - double mu = std::sqrt((myc*myc*myc*myc-eps*eps)/myc/myc); - - //if(world.rank() == 0) print("Hi, this is apply_BSH! mu is: ", mu); + double mu = std::sqrt(-(2*eps*c2+eps*eps)/c2); - //create gradient BSH operators world.gop.fence(); + + //pointer to BSH operator + std::shared_ptr op = std::shared_ptr(BSHOperatorPtr3D(world,mu,small,thresh)); - //create BSH operator - if(world.rank()==0) print("mu: ", mu); - std::shared_ptr op = std::shared_ptr(BSHOperatorPtr3D(world, mu,small,thresh)); + //vector of pointers to the gradient of the BSH operator std::vector>> op3 = GradBSHOperator(world, mu, small, thresh); + + //Subsitute the below line for the above one if you want to screen operator coefficients //std::vector>> op3 = GradBSHOperator_Joel(world, mu, 1e-8, thresh); + + //operators are copied and organized into a vector for use of vmra's more efficient functions std::vector>> allops(16); for(unsigned int i = 0; i < 4; i++){ allops[i] = op; @@ -1416,7 +1020,6 @@ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr } //create intermediate functions necessary to compute new components - //ttt = wall_time(); std::vector temp(16); for(unsigned int i = 0; i < 4; i++){ temp[i] = Vpsi[i]; @@ -1425,17 +1028,19 @@ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr temp[12+i] = Vpsi[i]; } + //vector apply accomplishes all 16 necessary operator applications temp = apply(world, allops, temp); - //build transformation tensor + //All four components of the result fcwf can be written as a linear combination of the functions in temp now + //Easy way to do this is to write out a transformation tensor and then call transform Tensor> U(16,4); - U(0,0) = c2+eps; U(14,0) = -ic; U(7,0) = -ic; U(11,0) = -myc; - U(1,1) = c2+eps; U(6,1) = -ic; U(10,1) = myc; U(15,1) = ic; - U(12,2) = -ic; U(5,2) = -ic; U(9,2) = -myc; U(2,2) = eps-c2; - U(4,3) = -ic; U(8,3) = myc; U(13,3) = ic; U(3,3) = eps-c2; + U(0,0) = 2*c2+eps; U(14,0) = -ic; U(7,0) = -ic; U(11,0) = -myc; + U(1,1) = 2*c2+eps; U(6,1) = -ic; U(10,1) = myc; U(15,1) = ic; + U(12,2) = -ic; U(5,2) = -ic; U(9,2) = -myc; U(2,2) = eps; + U(4,3) = -ic; U(8,3) = myc; U(13,3) = ic; U(3,3) = eps; U *= (1.0/c2); - //Apply transformation tensor and store back in Vpsi + //Apply transformation tensor to temp (a vector of functions) and store back in Vpsi (a FCWF) temp = transform(world, temp, U); Vpsi[0] = temp[0]; Vpsi[1] = temp[1]; @@ -1444,43 +1049,37 @@ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr } -//Apply's Green's function to Vpsi (a Fcwf). Overwrites Vpsi with new Fcwf +//This function applies the Dirac Green's function to Vpsi (a Fcwf), overwriting Vpsi with a new Fcwf. +// +//Instead of using the derivative of the Green's function, this version first applies the +//nonrelativistic Green's function, then applies (H_D + eps) to the result. // -//Instead of using the derivative of the Green's function, first applies the -//nonrelativistic Green's function, then applied (H_D + eps) to the result +//Analytically this is equivalent to apply_BSH, but faster because the application of +//the derivative operator is faster than application of an integral operator. +// +//Empirically this has resulted in no decrease in accuracy void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& thresh){ - //necessary constants double myc = 137.0359895; //speed of light - double c2 = myc*myc; - std::complex myi(0,1); //imaginary number - std::complex ic = myi*myc; + double c2 = myc*myc; //speed of light squared + std::complex myi(0,1); //imaginary number i + std::complex ic = myi*myc; //i*c //calculate exponent for equivalent BSH operator double mu = std::sqrt(-(2*eps*c2+eps*eps)/c2); - //if(world.rank()==0) print(" mu = ", mu); - world.gop.fence(); //create BSH operator - real_convolution_3d op = BSHOperator3D(world, mu,small,thresh); // Finer length scale and accuracy control - + real_convolution_3d op = BSHOperator3D(world, mu,small,thresh); //Apply BSH operator to Vpsi Vpsi = apply(world, op, Vpsi); - //mu = (apply_T(world,Vpsi)*(1.0/c2)).norm2(); - //if(world.rank()==0) print(" after BSH and T= ", mu); - //Apply (1/c^2)(H_D + eps) to Vpsi. Using apply_T for convenience, but this requires adding 2c^2Vpsi Vpsi = apply_T(world, Vpsi)*(1.0/c2) + Vpsi * ((eps+2*c2)/c2); - - //mu = Vpsi.norm2(); - //if(world.rank()==0) print(" after full apply = ", mu); - } // Small function to print geometry of a molecule nicely @@ -1517,15 +1116,38 @@ void DF::print_molecule(World &world) } } - +//Saves everything necessary to restart a DFdriver job. void DF::saveDF(World& world){ + + //get current time Tensor times = get_times(world); + + //start timer start_timer(world); + + //print time of save if(world.rank()==0) print("\n***Saving at time: ",times[0]," ***"); + + //Create archive and save the following: + // 1) Total energy (double) + // 2) spinrestricted (boolean) + // 3) number of occupied orbitals (int) + // 4) orbital energies (vector of doubles) + // 5) box size (double) + // 6) wavelet order (int) + // 7) molecule (molecule) + // 8) occupied orbitals as complex functions try{ + //create archive archive::ParallelOutputArchive output(world, DFparams.savefile.c_str(), 1); + + //save simulation parameters and calculated properties output & total_energy & Init_params.spinrestricted & Init_params.num_occupied & energies & Init_params.L & Init_params.order & Init_params.molecule; + + //Save orbitals + //Loop over all occupied orbitals for(unsigned int i = 0; i < Init_params.num_occupied; i++){ + //Loop over four components for(int j = 0; j < 4; j++){ output & occupieds[i][j]; } @@ -1534,18 +1156,19 @@ void DF::saveDF(World& world){ catch(const char* s){ if(world.rank()==0) print("Failed to save DF restart data with error message:", s); } + times = end_timer(world); if(world.rank()==0) print(" ", times[0]); } -//Creates the nuclear potential from the molecule object +//Creates the (Gaussian) nuclear potential from the molecule object void DF::make_gaussian_potential(World& world, real_function_3d& potential){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule, DFparams.bohr_rad); potential = real_factory_3d(world).functor(Vfunctor).truncate_mode(0).truncate_on_project(); } -//Creates the nuclear potential from the molecule object. Also calculates the nuclear repulsion energy +//Creates the (Gaussian) nuclear potential from the molecule object. Also calculates the nuclear repulsion energy void DF::make_gaussian_potential(World& world, real_function_3d& potential, double& nuclear_repulsion_energy){ if(world.rank()==0) print("\n***Making a Gaussian Potential***"); GaussianNucleusFunctor Vfunctor(Init_params.molecule,DFparams.bohr_rad); @@ -1565,56 +1188,84 @@ void DF::make_gaussian_potential(World& world, real_function_3d& potential, doub } - +//Own version of load balancing for DF. Load balance on the functions as well as the nuclear potential void DF::DF_load_balance(World& world, real_function_3d& Vnuc){ if(world.rank()==0) print("\n***Load Balancing***"); start_timer(world); + + //create Load balance object LoadBalanceDeux<3> lb(world); + + //Add functions that we want to load balance based on lb.add_tree(Vnuc, lbcost(12.0,96.0),true); - //Commenting out below block to test memory issues for(unsigned int j = 0; j < Init_params.num_occupied; j++){ for(int kk = 0; kk < 4; kk++){ lb.add_tree(occupieds[j][kk], lbcost,3>(24.0,192.0),true); } } + + //Redistribute FunctionDefaults<3>::redistribute(world, lb.load_balance(2), true); + + //End timers Tensor times = end_timer(world); if(world.rank()==0) print(" ", times[0]); } +//Function to output 2*n lineplots. For each orbital we make one "density" from the large component +//and one from the small component, evaluated on a grid with npt points from 0 to endpnt on the x axis void DF::make_component_lineplots(World& world, const char* filename1, const char* filename2, int npt, double endpnt){ + + //vectors to store densities std::vector large_densities; std::vector small_densities; + + //Push back densities for(unsigned int i=0; i < Init_params.num_occupied; i++){ large_densities.push_back(squaremod_large(occupieds[i])); small_densities.push_back(squaremod_small(occupieds[i])); } - //double h = Init_params.L*(1.0/(npt-1)); - double h = endpnt*(1.0/(npt-1)); + //reconstruct for(unsigned int i=0; i < Init_params.num_occupied; i++){ large_densities[i].reconstruct(); small_densities[i].reconstruct(); } + + //create lineplots + double h = endpnt*(1.0/(npt-1)); if(world.rank()==0){ + //open files FILE* file1 = fopen(filename1,"w"); FILE* file2 = fopen(filename2,"w"); if(!file1) MADNESS_EXCEPTION("DF density lineplots: failed to open the plot file",0); if(!file2) MADNESS_EXCEPTION("DF density lineplots: failed to open the plot file",0); + + //Loop through occupied orbitals for(unsigned int i=0; i large_densities; std::vector small_densities; + + //Push back densities for(unsigned int i=0; i < Init_params.num_occupied; i++){ large_densities.push_back(squaremod_large(occupieds[i])); small_densities.push_back(squaremod_small(occupieds[i])); } - //double h = Init_params.L*(1.0/(npt-1)); - double h = (endpnt-startpnt)*(1.0/(npt-1)); + //reconstruct for(unsigned int i=0; i < Init_params.num_occupied; i++){ large_densities[i].reconstruct(); small_densities[i].reconstruct(); } + + //create lineplots + double h = (endpnt-startpnt)*(1.0/(npt-1)); if(world.rank()==0){ + //open files FILE* file1 = fopen(filename1,"w"); FILE* file2 = fopen(filename2,"w"); if(!file1) MADNESS_EXCEPTION("DF density lineplots: failed to open the plot file",0); if(!file2) MADNESS_EXCEPTION("DF density lineplots: failed to open the plot file",0); + + //Loop through occupied orbitals for(unsigned int i=0; i densities; - real_function_3d zero(world); + + //Push back densities for(unsigned int i=0; i < Init_params.num_occupied; i++){ densities.push_back(squaremod(occupieds[i])); } - double h = endpnt*(1.0/(npt-1)); + //reconstruct for(unsigned int i=0; i < Init_params.num_occupied; i++){ densities[i].reconstruct(); } + + //create lineplots + double h = endpnt*(1.0/(npt-1)); if(world.rank()==0){ + //open file FILE* file = fopen(filename,"w"); if(!file) MADNESS_EXCEPTION("DF density lineplots: failed to open the plot file",0); + + //Loop through occupied orbitals for(unsigned int i=0; i& Kpsis, XNonlinearSolver, std::complex, Fcwf_vector_allocator>& kainsolver, double& tolerance, int& iteration_number, double& nuclear_repulsion_energy){ - //RESUME HERE updating code for ROHF + //Get and print the time of this iteration's start, and start a timer Tensor times = get_times(world); - if(world.rank()==0) print("\n\n\nIteration: ", iteration_number, " at ",times[0]); if(world.rank()==0) print("--------------"); start_timer(world); - //print_sizes(world); - + //A vector to hold residuals after BSH application std::vector Residuals; - Fcwf temp_function(world); + + //Norm of a residual. We use these norms one-at-a-time, so no vector is needed double residualnorm; + + //A working FCWF that will have multiple uses + Fcwf temp_function(world); + + //A function to hold the charge density due to the occupied orbitals real_function_3d rho = real_factory_3d(world); - bool iterate_again = false; //Assume iterations will stop + //Boolean used in while loop. + bool iterate_again = false; //Initialize to false = assume iterations will stop - //Diagonalize + //First diagonalize the occupied orbitals in the Fock space (of occupied orbitals). Also transforms Kpsis. diagonalize(world, V, op, Kpsis); - //print_sizes(world); - //Diagonalization forces us to recompute J + //Diagonalization forces us to recompute density if(closed_shell){ for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ rho += 2*squaremod(occupieds[kk]); @@ -1729,15 +1424,13 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea JandV.truncate(); - //Apply BSH to each psi + //Apply Dirac BSH to each psi if(world.rank()==0) print("\n***Applying BSH operator***"); start_timer(world); double maxresidual = -1.0; for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - //construct the function to which we will apply the BSH - //occupieds[j].truncate(); temp_function = occupieds[j]*JandV; temp_function.scale(-1.0); temp_function += Kpsis[j]; @@ -1752,44 +1445,40 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Now calculate the residual residualnorm = (occupieds[j] - temp_function).norm2(); - //Print residual norm to keep track + //Print residual norm for user to keep track if(world.rank()==0) printf(" Orbital: %3i, Resid: %.10e\n",j+1, residualnorm); - //Compare so that at the end we know the max residual + //Keep track of the maximum residual maxresidual = std::max(maxresidual, residualnorm); - //If the norm is big enough, we'll need to iterate again. - if(residualnorm > tolerance) iterate_again = true; - //Store residual function if we're using KAIN. Not necessary if we're not using kain + //We don't use KAIN on the first iteration. if(iteration_number != 1 and DFparams.kain){ Residuals.push_back(occupieds[j] - temp_function); } else{ - occupieds[j] = temp_function; //if not using KAIN, then just use the new orbital + occupieds[j] = temp_function; //if not using KAIN, then the result is the new orbital } } + + //Print max residual and the tolerance that we're using if(world.rank()==0) printf(" max Resid: %.10e\n",maxresidual); if(world.rank()==0) printf(" tolerance: %.10e\n",tolerance); + + //End timers times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - //print_sizes(world); - //debugging - //for(unsigned int j=0; j < Init_params.num_occupied; j++){ - // double tempdouble = rele(world, occupieds[j]); - // if(world.rank()==0) print(" after BSH, rele ",j," = ",tempdouble); - //} - + //If any residual is still larger than the tolerance then we need to iterate again. + //Can just enforce this on the max residual + if(maxresidual > tolerance) iterate_again = true; //Apply the kain solver, if called for if(iteration_number != 1 and DFparams.kain){ if(world.rank()==0) print("\n***Applying KAIN Solver***"); start_timer(world); - //occupieds = kainsolver.update(occupieds, Residuals); - - //Replace above line with kain + step restriction + //Implement KAIN, but enforce a step restriction to KAIN doesn't take too large of a step Residuals = kainsolver.update(occupieds, Residuals); //Using Residuals for updated orbitals to save storage for(unsigned int i=0; i < Init_params.num_occupied; i++){ @@ -1797,6 +1486,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea residualnorm = (occupieds[i]-Residuals[i]).norm2(); //Restrict the step taken by KAIN if it's too big + //This code is basically stolen from SCF.cc if(residualnorm > DFparams.maxrotn){ double s = DFparams.maxrotn / residualnorm; if(world.rank()==0) print(" restricting step for orbital: ", i+1); @@ -1807,38 +1497,39 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea } } + //End timers times = end_timer(world); if(world.rank()==0) print(" ", times[0]); } - //truncate + //truncate after BSH(+KAIN) application for(unsigned int i = 0; i < Init_params.num_occupied; i++) occupieds[i].truncate(); - //print_sizes(world); - //orthogonalize + //orthonormalize if(world.rank()==0) print("\n***Orthonormalizing***"); start_timer(world); orthogonalize_inplace(world); - //print_sizes(world); //truncate here and normalize again for(unsigned int i = 0; i < Init_params.num_occupied; i++){ occupieds[i].truncate(); occupieds[i].normalize(); } - //print_sizes(world); + //End orthonormalization timer times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - //calculate new exchange. Has timer built in. + //Now calculate new exchange functions. Has timer built in. if(world.rank()==0) print("\n***Recalculating Exchange***"); exchange(world, op, Kpsis); //Calculate new J+V term if(world.rank()==0) print("\n***Recalculating Coulomb***"); start_timer(world); + + //Make density rho = real_factory_3d(world); if(closed_shell){ for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ @@ -1851,13 +1542,16 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea } rho+= squaremod(occupieds[Init_params.num_occupied-1]); } + + //Apply coulomb operator to density and combine with V to get total potential JandV = V + apply(op,rho); JandV.truncate(); + + //End timer for coulombic potential calculation times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - //Calculate and print total energy - //Simultaneously update eps + //Calculate and print total energy each iteration, as well as a breakdown of different contributions if(world.rank()==0){ print("\n***Printing Current Energies***"); } @@ -1874,9 +1568,10 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea Tensor coulomb_tensor; Tensor exchange_tensor; + //Potential due to the density only (no nuclear potential) real_function_3d Jop = apply(op,rho); - //Compute kinetic energy contribution + //Compute kinetic energy contributions if(closed_shell){ for(unsigned int j = 0; j < Init_params.num_occupied; j++){ kinetic_energy += 2*rele(world, occupieds[j]); @@ -1889,7 +1584,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea kinetic_energy += rele(world, occupieds[Init_params.num_occupied-1]); } - //Compute electron-nuclear attraction energy contribution, taking advantage of vmra's inner + //Compute electron-nuclear attraction energy contributions, taking advantage of vmra's inner std::vector occupieds1(Init_params.num_occupied); std::vector occupieds2(Init_params.num_occupied); std::vector occupieds3(Init_params.num_occupied); @@ -1933,23 +1628,23 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea exchange_energy = exchange_tensor.sum();//*0.5; if(!closed_shell) exchange_energy -= 0.5*exchange_tensor(Init_params.num_occupied-1); - //Loop through energies and calculate their new values using the individual contributions - //(inside the "tensor" variables - //for(unsigned int i = 0; i < Init_params.num_occupied; i++){ - // energies[i] += nuclear_attraction_tensor[i]+coulomb_tensor[i] - exchange_tensor[i]; - //} - - //compute total energy + //compute total energy using the above computed contributions total_energy = kinetic_energy + coulomb_energy - exchange_energy + nuclear_attraction_energy + nuclear_repulsion_energy; + //End timers for total energy calculation times = end_timer(world); if(world.rank()==0) print(" ", times[0]); - //Need r function to print r expectation values + //Now we calculate other quantities for later printing: + // 1) expectation values for r + // 2) number of coefficients used to represent each orbital + // 3) maximum depth used in representing each orbital + // 4) norms of each component of each orbital + + //Need function f(r)=r for the expectation values real_function_3d rfunc = real_factory_3d(world).f(myr); - //Loop through occupied orbitals. Calculate , number of coefficients, max depth. - //Print these along with updated energies + //Now loop through occupied orbitals, computing desired quantities (above) std::vector r_expec_vec(Init_params.num_occupied); std::vector numcoeffs_vec(Init_params.num_occupied); std::vector maxdepth_vec(Init_params.num_occupied); @@ -1962,10 +1657,10 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //calculate double r_expec = std::real(inner(occupieds[j], occupieds[j]*rfunc)); - //find number of coefficients + //find number of coefficients (sum over all components) int numcoeffs = occupieds[j][0].size() + occupieds[j][1].size() + occupieds[j][2].size() + occupieds[j][3].size(); - //find maximum depth + //find maximum depth (max over all components) int maxdepth = std::max(occupieds[j][0].max_depth(), occupieds[j][1].max_depth()); maxdepth = std::max(int(occupieds[j][2].max_depth()), maxdepth); maxdepth = std::max(int(occupieds[j][3].max_depth()), maxdepth); @@ -1974,6 +1669,8 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea r_expec_vec[j] = r_expec; numcoeffs_vec[j] = numcoeffs; maxdepth_vec[j] = maxdepth; + + //Compute and store norms of each component. Remember to scale small component by c comp1norm[j] = occupieds[j][0].norm2(); comp2norm[j] = occupieds[j][1].norm2(); comp3norm[j] = occupieds[j][2].norm2()/myc; @@ -2000,13 +1697,8 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea print(" Total Energy: ",total_energy); print(" Total Energy Residual: ", std::fabs(total_energy - old_total_energy)); } - - //check total energy for convergence. - //if(std::fabs(total_energy-old_total_energy) > DFparams.thresh*pow(10,floor(log10(std::fabs(total_energy))))){ - // iterate_again = true; - //} - //truncate + //final truncatation of orbitals now that we've computed properties for(unsigned int j = 0; j < Init_params.num_occupied; j++){ occupieds[j].truncate(); } @@ -2017,7 +1709,7 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea return iterate_again; } -// Solves the for occupied orbitals +// Solves for the ground state Dirac Hartree Fock orbitals void DF::solve_occupied(World & world) { @@ -2028,7 +1720,7 @@ void DF::solve_occupied(World & world) //Will need a coulomb operator real_convolution_3d op = CoulombOperator(world,DFparams.small,DFparams.thresh); - //allocator is useful to have + //allocator is useful to have, but also required for use of KAIN Fcwf_vector_allocator allocator(world,Init_params.num_occupied); //initialize kain solver @@ -2040,8 +1732,6 @@ void DF::solve_occupied(World & world) occupieds[i].normalize(); } - - //Form nuclear potential real_function_3d Vnuc; double nuclear_repulsion_energy; @@ -2052,13 +1742,10 @@ void DF::solve_occupied(World & world) make_gaussian_potential(world, Vnuc, nuclear_repulsion_energy); } - //double Vnucsize = Vnuc.size(); - //if(world.rank()==0) print("VNUC SIZE =",Vnucsize); - //Initial load balance DF_load_balance(world, Vnuc); - //Initialize vector of Fcwfs to hold exchange applied to Psis + //Initialize vector of Fcwfs to hold exchange applied to the orbitals std::vector Kpsis = allocator(); //Calculate initial exchange @@ -2086,14 +1773,11 @@ void DF::solve_occupied(World & world) if(world.rank()==0) print(" ", times[0]); //Set tolerance for residuals - //double tol = pow(10,floor(0.5*log10(DFparams.thresh))); double tol = 50.0*DFparams.thresh; - //Now time to start iterating bool keep_going = true; int iteration_number = 1; - //while(iteration_number < DFparams.max_iter){ while((keep_going and iteration_number <= DFparams.max_iter) or iteration_number <= DFparams.min_iter){ keep_going = iterate(world, Vnuc, op, JandV, Kpsis, kainsolver, tol, iteration_number, nuclear_repulsion_energy); @@ -2155,9 +1839,6 @@ void DF::solve(World& world){ if(DFparams.job == 0){ solve_occupied(world); } - else if(DFparams.job == 1){ - solve_virtuals1(world); - } else{ if(world.rank()==0) print("Specify a better job parameter."); } @@ -2173,8 +1854,6 @@ void DF::solve(World& world){ Tensor times = end_timer(world); if(world.rank() == 0) print("\n Calculation time:", times[0],"\n"); - - //Make density lineplots if(DFparams.lineplot){ start_timer(world); @@ -2186,216 +1865,6 @@ void DF::solve(World& world){ if(world.rank()==0) print(" ", times[0]); } -} - -void DF::solve_virtuals1(World& world){ - - //First, move final occupied orbital to be first virtual orbital - Fcwf final_occupied = copy(occupieds.back()); - occupieds.pop_back(); - Init_params.num_occupied -= 1; - virtuals.emplace(virtuals.begin(),final_occupied); - Init_params.num_virtuals += 1; - - //Do the same for energies - double temp_energy = energies(energies.dim(0)-1); - energies = energies(Slice(0,energies.dim(0)-2)); - Tensor temp_v_energies(Init_params.num_virtuals); - temp_v_energies[0] = temp_energy; - for(unsigned int i = 1; i < Init_params.num_virtuals; i++){ - temp_v_energies(i) = v_energies(i-1); - } - v_energies = temp_v_energies; - - //First, perform Dirac Fock on the n-1 occupied orbitals - solve_occupied(world); - - //Next, calculate the last occupied orbital simultaneously with the virtuals - if(world.rank()==0) print("***Calculating Final Occupied and Virtual Orbitals***"); - - //For now, recalculate JandV. In the future, maybe get this out of solve_occupied? - //Will need a coulomb operator - real_convolution_3d op = CoulombOperator(world,DFparams.small,DFparams.thresh); - //Form nuclear potential - real_function_3d Vnuc; - double nuclear_repulsion_energy; - if(DFparams.nucleus == 1){ - make_fermi_potential(world, op, Vnuc, nuclear_repulsion_energy); - } - else{ - make_gaussian_potential(world, Vnuc, nuclear_repulsion_energy); - } - //Calculate initial J+V term - real_function_3d rho = real_factory_3d(world); - for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += squaremod(occupieds[kk]); - } - real_function_3d JandV = Vnuc + apply(op,rho); - - //Set tolerance for residuals - double tol = pow(10,floor(0.5*log10(DFparams.thresh))); - - //Orthogonalize the functions against the occupieds - std::complex tempcomplex; - for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ - for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - tempcomplex = inner(virtuals[i], occupieds[j]); - virtuals[i] -= occupieds[j]*tempcomplex; - } - virtuals[i].normalize(); - } - - //orthonormalize the functions internally - orthogonalize(world,virtuals); - - //Initialize exchange vector - Fcwf_vector_allocator allocator(world,Init_params.num_virtuals); - std::vector Kpsis = allocator(); - for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ - Kpsis[i] = apply_K(world, op, virtuals[i]); - } - - bool keep_going = true; - int iteration_number = 1; - double csquared = 137.0359895*137.0359895; //electron rest energy - std::vector Residuals = allocator(); - XNonlinearSolver, std::complex, Fcwf_vector_allocator> kainsolver(allocator); - kainsolver.set_maxsub(DFparams.maxsub); - Fcwf tempfcwf(world); - while(keep_going and iteration_number < DFparams.max_iter){ - - if(world.rank()==0) print("Iteration:", iteration_number); - - keep_going = false; - - //diagonalize - v_energies = diagonalize_virtuals(world, JandV, op, Kpsis); - - //Apply BSH to each function individually - for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ - - //Calculate function to apply BSH to - tempfcwf = virtuals[i] * JandV; - tempfcwf.scale(-1.0); - tempfcwf += Kpsis[i]; - - //if(world.rank()==0) print("Going into BSH, energy is:",v_energies[i] - csquared); - apply_BSH(world,tempfcwf,v_energies[i],DFparams.small,DFparams.thresh); - Residuals[i] = virtuals[i] - tempfcwf; - double residualnorm = Residuals[i].norm2(); - if(world.rank()==0) print("Virtual ", i, " Residual: ", residualnorm); - if(residualnorm > tol) keep_going = true; - } - - //Apply KAIN, if called for - if(DFparams.kain){ - virtuals = kainsolver.update(virtuals, Residuals); - } - else{ - virtuals = virtuals - Residuals; - } - - //Orthogonalize the functions against the occupieds - for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ - for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - tempcomplex = inner(virtuals[i], occupieds[j]); - virtuals[i] -= occupieds[j]*tempcomplex; - } - virtuals[i].normalize(); - } - - //orthonormalize the functions internally - orthogonalize(world,virtuals); - - //Recalculate exchange - for(unsigned int i = 0; i < Init_params.num_virtuals; i++){ - Kpsis[i] = apply_K(world, op, virtuals[i]); - } - - //Recalculate and print energies for the output - if(world.rank()==0){ - print("\n***Printing Current Energies***"); - } - - for(unsigned int j = 0; j < Init_params.num_virtuals; j++){ - v_energies[j] = rele(world,virtuals[j]); - v_energies[j] += real(inner(virtuals[j],virtuals[j]*JandV)); - v_energies[j] -= real(inner(virtuals[j],Kpsis[j])); - } - - for(unsigned int j = 0; j < Init_params.num_virtuals; j++){ - if(world.rank()==0){ - printf(" Virtual: %3i, Energy: %.10e\n",j+1, v_energies[j]-csquared); - } - } - - } - - - //Fix the location of the last occupied orbital - occupieds.push_back(copy(virtuals[0])); - for(unsigned int i = 0; i < Init_params.num_virtuals-1; i++){ - virtuals[i] = virtuals[i+1]; - } - virtuals.pop_back(); - Tensor tempenergies(Init_params.num_occupied + 1); - tempenergies(Init_params.num_occupied) = v_energies[0]; - for(unsigned int i = 0; i < Init_params.num_occupied; i++){ - tempenergies(i) = energies(i); - } - energies = tempenergies; - v_energies = v_energies(Slice(1,Init_params.num_virtuals - 1)); - Init_params.num_occupied += 1; - Init_params.num_virtuals -= 1; - - //Recalculate and print total energy for the output - if(world.rank()==0){ - print("\n***Printing Current Energies***"); - } - double kinetic_energy = 0.0; - double coulomb_energy = 0.0; - double exchange_energy = 0.0; - double nuclear_attraction_energy = 0.0; - double myc = 137.0359895; //speed of light - - rho = real_factory_3d(world); - for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - rho += squaremod(occupieds[j]); - } - real_function_3d Jop = apply(op,rho); - - for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - energies[j] = rele(world,occupieds[j]); - kinetic_energy += (energies[j] - myc*myc); - double nuclear_attraction_energy_correction = real(inner(occupieds[j],occupieds[j]*Vnuc)); - nuclear_attraction_energy += nuclear_attraction_energy_correction; - double coulomb_energy_correction = real(inner(occupieds[j],occupieds[j]*Jop)); - energies[j] += coulomb_energy_correction + nuclear_attraction_energy_correction; - coulomb_energy += 0.5*coulomb_energy_correction; - double exchange_energy_correction = real(inner(occupieds[j],apply_K(world,op,occupieds[j]))); - energies[j] -= exchange_energy_correction; - exchange_energy += 0.5*exchange_energy_correction; - } - total_energy = kinetic_energy + coulomb_energy - exchange_energy + nuclear_attraction_energy + nuclear_repulsion_energy; - - for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - if(world.rank()==0){ - printf(" Orbital: %3i, Energy: %.10e\n",j+1, energies[j]-myc*myc); - } - } - if(world.rank()==0){ - print("\n Kinetic Energy: ",kinetic_energy); - print(" Coulomb Energy: ",coulomb_energy); - print(" Exchange Energy: ",exchange_energy); - print(" Nuclear Attraction Energy: ",nuclear_attraction_energy); - print(" Nuclear Repulsion Energy: ",nuclear_repulsion_energy); - print(" Total Energy: ",total_energy); - } - - //Below is where we can now solve for virtual orbitals - - - } void DF::print_sizes(World& world, bool individual=false){ diff --git a/src/apps/dirac/DF.h b/src/apps/dirac/DF.h index e2a59d42af0..f3fce031d71 100644 --- a/src/apps/dirac/DF.h +++ b/src/apps/dirac/DF.h @@ -29,7 +29,7 @@ class DF { // DFParameter object to hold all user input variables DFParameters DFparams; - // NRParameter object to hold all variables needed from + // InitParametesr object to hold all variables needed from // nonrelativistic ground state calculation. Read from an archive InitParameters Init_params; @@ -39,15 +39,9 @@ class DF { // Tensor for holding energies Tensor energies; - //Tensor for holding energies of virtual orbitals - Tensor v_energies; - //Vector of DF Fcwf occupied orbitals std::vector occupieds; - //Vector of DF Fcwf virtual orbitals - std::vector virtuals; - //Total energy of the system double total_energy; @@ -68,29 +62,23 @@ class DF { //Find current time (relative to job start) Tensor get_times(World& world); - // Collective constructor for response uses contents of file \c filename and broadcasts to all nodes + // Collective constructor uses contents of file \c filename and broadcasts to all nodes DF(World & world, // MADNESS world object const char* input_file); // Input file - // Collective constructor for DF uses contents of stream \c input and broadcasts to all nodes + // Collective constructor uses contents of stream \c input and broadcasts to all nodes DF(World & world, // MADNESS world object std::shared_ptr input); // Pointer to input stream //Calculates the kinetic+rest energy expectation value of psi double rele(World& world, Fcwf& psi); - //Applies the exchange operator to all of psis + //Applies the exchange operator to all of occupieds void exchange(World& world, real_convolution_3d& op, std::vector& Kpsis); - //Applies the exchange operator defined by psis to a single generic input fcwf - Fcwf apply_K(World& world, real_convolution_3d& op, Fcwf& phi); - - //diagonalizes psis in the Fock space. Transforms psis and Kpsis. + //diagonalizes occupieds in the Fock space. Transforms occupieds and Kpsis. void diagonalize(World& world, real_function_3d& myV,real_convolution_3d& op, std::vector& Kpsis); - //diagonalizes virtual orbitals. Transforms virtuals and Kpsis - Tensor diagonalize_virtuals(World& world, real_function_3d& JandV,real_convolution_3d& op, std::vector& Kpsis); - // Small function to print geometry of a molecule nicely // Straight up stolen from Bryan void print_molecule(World &world); @@ -123,20 +111,19 @@ class DF { //solves the Dirac Fock equation for the occupied orbitals void solve_occupied(World & world); - //solves for n-1 occupieds, then the last occupied, then some number of virtuals - void solve_virtuals1(World& world); - //Lineplot the densities. Currently only along x axis from 0 to L void make_density_lineplots(World& world, const char* filename, int npt, double endpnt); //Lineplot the densities of the large and small component separately. only along x axis from 0 to L void make_component_lineplots(World& world, const char* filename1, const char* filename2, int npt, double endpnt); + //orthogonormalize occupieds, overwriting the ones in memory void orthogonalize_inplace(World& world); //Lineplot the densities of the large and small component separately. only along x axis on log scale from 10^-startpnt to 10^endpnt with pts evenly spaced in log space void make_component_logplots(World& world, const char* filename1, const char* filename2, int npt, int startpnt, int endpnt); + //print the number of coefficients used to represent all occupied orbitals. primarily used when debugging. void print_sizes(World& world, bool individual); }; diff --git a/src/apps/dirac/DFdriver.cc b/src/apps/dirac/DFdriver.cc index 5afd3635013..a5a456089bc 100644 --- a/src/apps/dirac/DFdriver.cc +++ b/src/apps/dirac/DFdriver.cc @@ -1,11 +1,11 @@ /* - * Written by: bsundahl and jscanderson - * Date: A long time ago... + * + * Main source file for the Dirac Fock code * */ -#include "DF.h" // All response functions/objects enter through this +#include "DF.h" // All Dirac-Fock functions/objects enter through this #include #if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) @@ -38,12 +38,11 @@ int main(int argc, char** argv) } if (!file_exists(input)) throw "input file not found"; - // Create the TDHF object + // Create the DF object DF my_calc(world, input); // Have it iterate to convergence my_calc.solve(world); - //my_calc.virtuals(world); world.gop.fence(); world.gop.fence(); diff --git a/src/apps/dirac/fcwf.cc b/src/apps/dirac/fcwf.cc index 85eef8b1970..d6b9424b7ec 100644 --- a/src/apps/dirac/fcwf.cc +++ b/src/apps/dirac/fcwf.cc @@ -1,13 +1,18 @@ #include "fcwf.h" +//Fcwf (Four component wavefunction) implementation file +//NOTE: The small component of an Fcwf is scaled by c and then stored +//This means that when computing properties and some other operations, +//care must be taken to remove the extra factors of c in the result + using namespace madness; - +//Default constructor can't do much other than state that the fcwf hasn't been initialized Fcwf::Fcwf(){ m_initialized = false; } - +//Constructor that takes four complex functions and uses them to make the Fcwf Fcwf::Fcwf(const complex_function_3d& wf1, const complex_function_3d& wf2, const complex_function_3d& wf3, @@ -20,6 +25,7 @@ Fcwf::Fcwf(const complex_function_3d& wf1, m_initialized = true; } +//This constructor creates a zero Fcwf Fcwf::Fcwf(World& world){ MADNESS_ASSERT(m_psi.size() == 0); for(int i = 0 ; i < 4 ; i ++){ @@ -28,6 +34,7 @@ Fcwf::Fcwf(World& world){ m_initialized = true; } +//give access to the individual components complex_function_3d& Fcwf::operator[](const int i){ MADNESS_ASSERT(i >= 0 && i <= 3); MADNESS_ASSERT(m_initialized); @@ -40,6 +47,7 @@ const complex_function_3d& Fcwf::operator[](const int i) const { return m_psi[i]; } +//Can also initialize from a vector of complex functions Fcwf::Fcwf(std::vector& phi){ MADNESS_ASSERT(m_psi.size() == 0); MADNESS_ASSERT(phi.size() == 4); @@ -49,6 +57,7 @@ Fcwf::Fcwf(std::vector& phi){ m_initialized=true; } +//learn whether an Fcwf is initialized bool Fcwf::getinitialize(){ return m_initialized; } @@ -57,6 +66,7 @@ bool Fcwf::getinitialize() const { return m_initialized; } +//Probably don't need this, but get the size of m_psi, which should only be 0 or 4 unsigned int Fcwf::size(){ MADNESS_ASSERT(m_initialized); return m_psi.size(); @@ -80,31 +90,16 @@ Fcwf::Fcwf(const Fcwf& phi){ //Assignment operator defaults to shallow copy Fcwf Fcwf::operator=(const Fcwf& phi){ - //MADNESS_ASSERT(phi.getinitialize()); - //if (this != &phi) { - // if(m_psi.size() == 4){ - // for(int i = 0 ; i < 4 ; i++){ - // m_psi[i] = copy(phi[i]); - // } - // } - // else { - // MADNESS_ASSERT(m_psi.size() == 0); - // for(int i = 0 ; i < 4 ; i++){ - // m_psi.push_back(copy(phi[i])); - // } - // } - //} - //m_initialized = true; m_psi = phi.m_psi; m_initialized = phi.m_initialized; return *this; } +//subtract two Fcwfs. The Fcwf being subtracted must be initialized Fcwf Fcwf::operator-(const Fcwf& phi) const { MADNESS_ASSERT(phi.getinitialize()); std::vector temp; if(m_initialized){ - //temp = madness::sub(m_psi[0].world(), m_psi, phi.m_psi); for(int i = 0 ; i < 4 ; i++){ temp.push_back(m_psi[i] - phi[i]); } @@ -118,11 +113,11 @@ Fcwf Fcwf::operator-(const Fcwf& phi) const { return Fcwf(temp); } +//add two Fcwfs. The Fcwf being added must be initialized Fcwf Fcwf::operator+(const Fcwf& phi){ MADNESS_ASSERT(phi.getinitialize()); std::vector temp; if(m_initialized){ - //temp = madness::add(m_psi[0].world(), m_psi, phi.m_psi); for(int i = 0 ; i < 4 ; i++){ temp.push_back(m_psi[i] + phi[i]); } @@ -135,6 +130,7 @@ Fcwf Fcwf::operator+(const Fcwf& phi){ return Fcwf(temp); } +//multiply an Fcwf by a complex number a Fcwf Fcwf::operator*(std::complex a) const { MADNESS_ASSERT(m_initialized); std::vector temp(4); @@ -144,23 +140,23 @@ Fcwf Fcwf::operator*(std::complex a) const { return Fcwf(temp); } +//scale an Fcwf in place by a complex number a void Fcwf::scale(std::complex a){ MADNESS_ASSERT(m_initialized); for(int i = 0 ; i < 4 ; i++){ - //m_psi[i] = a*m_psi[i]; m_psi[i].scale(a); } } +//in place addition of Fcwfs. Fcwf on right must be initialized Fcwf Fcwf::operator+=(const Fcwf& phi){ + MADNESS_ASSERT(phi.getinitialize()) if(m_initialized){ - //m_psi = madness::add(m_psi[0].world(), m_psi, phi.m_psi); for(int i = 0 ; i < 4 ; i++){ m_psi[i] += phi[i]; } } else { - MADNESS_ASSERT(m_psi.size()==0); for(int i = 0 ; i < 4 ; i++){ m_psi.push_back(copy(phi[i])); } @@ -169,15 +165,15 @@ Fcwf Fcwf::operator+=(const Fcwf& phi){ return *this; } +//in place subtraction of Fcwfs. Fcwf on right must be initialized Fcwf Fcwf::operator-=(const Fcwf& phi){ + MADNESS_ASSERT(phi.getinitialize()) if(m_initialized){ - //m_psi = madness::sub(m_psi[0].world(), m_psi, phi.m_psi); for(int i = 0 ; i < 4 ; i++){ m_psi[i] -= phi[i]; } } else { - MADNESS_ASSERT(m_psi.size()==0); for(int i = 0 ; i < 4 ; i++){ m_psi.push_back(copy(phi[i])); m_psi[i].scale(-1.0); @@ -187,33 +183,36 @@ Fcwf Fcwf::operator-=(const Fcwf& phi){ return *this; } - +//Returns the 2-norm of an initialized Fcwf double Fcwf::norm2(){ MADNESS_ASSERT(m_initialized); - //std::complex temp = madness::inner(m_psi[0].world(), m_psi, m_psi).sum(); double c2 = 137.0359895*137.0359895; //speed of light in atomic units std::complex temp(0,0); temp += madness::inner(m_psi[0],m_psi[0]); temp += madness::inner(m_psi[1],m_psi[1]); + + //Small component is stored with an additional factor of c, so remove it here temp += madness::inner(m_psi[2],m_psi[2])/c2; temp += madness::inner(m_psi[3],m_psi[3])/c2; return std::sqrt(std::real(temp)); } +//Normalize the input Fcwf void Fcwf::normalize(){ MADNESS_ASSERT(m_initialized); double norm = norm2(); MADNESS_ASSERT(norm != 0.0); for(int i = 0 ; i < 4 ; i++){ - m_psi[i].scale(1.0/norm);// = (1.0/norm)*m_psi[i]; + m_psi[i].scale(1.0/norm); } } +//multiply an Fcwf by a complex function Fcwf Fcwf::operator*(madness::complex_function_3d& phi){ MADNESS_ASSERT(m_initialized); - std::vector temp(4);// = mul(m_psi[0].world(), phi, m_psi); + std::vector temp(4); for(int i = 0 ; i < 4 ; i++){ temp[i] = phi*m_psi[i]; } @@ -222,13 +221,14 @@ Fcwf Fcwf::operator*(madness::complex_function_3d& phi){ Fcwf Fcwf::operator*(madness::real_function_3d& phi){ MADNESS_ASSERT(m_initialized); - std::vector temp(4);// = madness::mul(m_psi[0].world(), phi, m_psi); + std::vector temp(4); for(int i = 0 ; i < 4 ; i++){ temp[i] = phi*m_psi[i]; } return Fcwf(temp); } +//truncate void Fcwf::truncate(){ MADNESS_ASSERT(m_initialized); for(int i = 0 ; i < 4 ; i++){ @@ -236,6 +236,7 @@ void Fcwf::truncate(){ } } +//Returns the inner product of two Fcwfs std::complex Fcwf::inner(World& world, const Fcwf& phi) const{ MADNESS_ASSERT(m_initialized && phi.getinitialize()); double c2 = 137.0359895*137.0359895; //speed of light in atomic units @@ -243,20 +244,25 @@ std::complex Fcwf::inner(World& world, const Fcwf& phi) const{ temp += madness::inner(m_psi[0],phi.m_psi[0]); temp += madness::inner(m_psi[1],phi.m_psi[1]); + + //Small component is stored with an extra factor of c, so remove that here temp += madness::inner(m_psi[2],phi.m_psi[2])/c2; temp += madness::inner(m_psi[3],phi.m_psi[3])/c2; return temp; } +//Apply an integral operator to an Fcwf void Fcwf::apply(World& world, real_convolution_3d& op){ m_psi = madness::apply(world, op, m_psi); } +//Apply a derivative operator to an Fcwf void Fcwf::apply(World& world, complex_derivative_3d& D){ m_psi = madness::apply(world, D, m_psi); } +//Return result of time-reversal of the input Fcwf Fcwf Fcwf::KramersPair(){ complex_function_3d phi0 = -1.0*conj(m_psi[1]); complex_function_3d phi1 = conj(m_psi[0]); @@ -265,35 +271,27 @@ Fcwf Fcwf::KramersPair(){ return Fcwf(phi0,phi1,phi2,phi3); } +//function for computing the inner product of two Fcwfs std::complex inner(const Fcwf& psi, const Fcwf& phi){ - //std::complex result(0,0); - //for(int i = 0 ; i < 4 ; i++){ - // result += madness::inner(psi[i],phi[i]); - //} - //return result; MADNESS_ASSERT(psi.getinitialize() && phi.getinitialize()); return psi.inner(psi[0].world(), phi); } -//Fcwf apply(real_convolution_3d& op, const Fcwf& psi){ -// std::vector temp; -// for(int i = 0 ; i < 4 ; i++){ -// temp.push_back(madness::apply(op, psi[i])); -// } -// return Fcwf(temp); -//} +//function for applying an integral operator fo an Fcwf Fcwf apply(World& world, real_convolution_3d& op, const Fcwf& psi){ Fcwf temp = copy(psi); temp.apply(world, op); return temp; } +//function for applying an integral operator fo an Fcwf Fcwf apply(World& world, complex_derivative_3d& D, const Fcwf& psi){ Fcwf temp = copy(psi); temp.apply(world, D); return temp; } +//Returns the square modulus of an Fcwf, which is a real function real_function_3d squaremod(Fcwf& psi){ MADNESS_ASSERT(psi.getinitialize()); double c2 = 137.0359895*137.0359895; //speed of light in atomic units @@ -301,19 +299,22 @@ real_function_3d squaremod(Fcwf& psi){ return temp; } +//Returns the square modulus of the small component of an Fcwf, which is a real function real_function_3d squaremod_small(Fcwf& psi){ MADNESS_ASSERT(psi.getinitialize()); double c2 = 137.0359895*137.0359895; //speed of light in atomic units - real_function_3d temp = (abssq(psi[2]) + abssq(psi[3])).scale(1.0/c2); + real_function_3d temp = (abssq(psi[2]) + abssq(psi[3])).scale(1.0/c2); //don't forget the factor of c^2 return temp; } +//Returns the square modulus of the large component of an Fcwf, which is a real function real_function_3d squaremod_large(Fcwf& psi){ MADNESS_ASSERT(psi.getinitialize()); real_function_3d temp = abssq(psi[0]) + abssq(psi[1]); return temp; } +//compute the function inner product between two Fcwfs. Result is a complex function. complex_function_3d inner_func(World& world, Fcwf& psi, Fcwf& phi){ MADNESS_ASSERT(psi.getinitialize() && phi.getinitialize()); double c = 137.0359895; //speed of light in atomic units @@ -323,19 +324,23 @@ complex_function_3d inner_func(World& world, Fcwf& psi, Fcwf& phi){ a[i] = psi[i]; b[i] = phi[i]; } + //Small components are stored with an extra factor of c, so remove those here for(unsigned int i = 2; i < 4; i++){ a[i] = copy(psi[i]).scale(1.0/c); b[i] = copy(phi[i]).scale(1.0/c); } + //vmra function call takes care of the rest complex_function_3d result = sum(world, mul(world, conj(world, a), b)); return result; } +//deep copy of an Fcwf Fcwf copy(Fcwf psi){ return Fcwf(psi); } +//takes the inner product between two vectors of Fcwfs. Result is a complex number std::complex inner(std::vector& a, std::vector& b){ MADNESS_ASSERT(a.size() == b.size()); std::complex result(0,0); @@ -345,6 +350,7 @@ std::complex inner(std::vector& a, std::vector& b){ return result; } +//Multiply a vector of Fcwfs by a scalar std::vector operator*(const std::vector& psis, std::complex a){ std::vector result; if(psis.size() != 0){ @@ -365,6 +371,7 @@ std::vector operator*(std::complex a, const std::vector& psi return result; } +//In-place addition for a vector of Fcwfs void operator+=(std::vector& phi, const std::vector& psi){ if(phi.size()==0){ phi = psi; @@ -377,6 +384,7 @@ void operator+=(std::vector& phi, const std::vector& psi){ } } +//Subtraction for two vectors of Fcwfs std::vector operator-(const std::vector& phi, const std::vector& psi){ std::vector result; if(psi.size()==0){ @@ -394,7 +402,7 @@ std::vector operator-(const std::vector& phi, const std::vector Fcwf_vector_allocator::operator()(){ return result; } -//Copy Constructor -//according to Bryan, according to Jakob, this is necessary for KAIN? +//Copy Constructor for allocator. Necessary for KAIN Fcwf_vector_allocator Fcwf_vector_allocator::operator=(const Fcwf_vector_allocator& other){ Fcwf_vector_allocator tmp(world, other.m_size); return tmp; @@ -428,11 +435,12 @@ Tensor> matrix_inner(World& world, std::vector& a, st double c2 = 137.0359895*137.0359895; //speed of light in atomic units - std::vector a_1(n); - std::vector a_2(n); + //Reassign the vectors of Fcwfs to vectors of complex functions to facilitate use of vmra functions + std::vector a_1(n); //all first components of Fcwfs in input a + std::vector a_2(n); //all second components of Fcwfs in input a std::vector a_3(n); std::vector a_4(n); - std::vector b_1(m); + std::vector b_1(m); //all first components of Fcwfs in input b std::vector b_2(m); std::vector b_3(m); std::vector b_4(m); @@ -450,20 +458,29 @@ Tensor> matrix_inner(World& world, std::vector& a, st b_4[i] = b[i][3]; } + //create 4 matrices which are the inner products of the components and add them Tensor> component1 = matrix_inner(world, a_1, b_1); Tensor> component2 = matrix_inner(world, a_2, b_2); + + //don't forget that small components are scaled by c Tensor> component3 = (1.0/c2)*matrix_inner(world, a_3, b_3); Tensor> component4 = (1.0/c2)*matrix_inner(world, a_4, b_4); + + //add component1=component1+component2+component3+component4; + + //return return component1; } +//Transform a (row) vector of Fcwfs by right-multiplying by a transformation matrix U std::vector transform(World& world, std::vector& a, Tensor> U){ unsigned int n = a.size(); unsigned int m = U.dim(0); unsigned int k = U.dim(1); - MADNESS_ASSERT(n==m); + MADNESS_ASSERT(n==m); //make sure dimensions align + //Make vectors of the individual components to facilitate use of vmra std::vector a_1(n); std::vector a_2(n); std::vector a_3(n); @@ -474,14 +491,16 @@ std::vector transform(World& world, std::vector& a, Tensor result; - Fcwf reader(world); - + Fcwf reader(world); for(unsigned int i = 0; i < k; i++){ reader[0] = a_1[i]; reader[1] = a_2[i]; @@ -496,13 +515,13 @@ std::vector transform(World& world, std::vector& a, Tensor inner(World& world, const Fcwf& phi) const; void apply(World& world, real_convolution_3d& op); + void apply(World& world, complex_derivative_3d& D); void reconstruct(); + void compress(); Fcwf KramersPair(); @@ -78,12 +80,14 @@ class Fcwf{ std::complex inner(const Fcwf& psi, const Fcwf& phi); -//Fcwf apply(real_convolution_3d& op, const Fcwf& psi); Fcwf apply(World& world, real_convolution_3d& op, const Fcwf& psi); + Fcwf apply(World& world, complex_derivative_3d& op, const Fcwf& psi); real_function_3d squaremod(Fcwf& psi); + real_function_3d squaremod_small(Fcwf& psi); + real_function_3d squaremod_large(Fcwf& psi); complex_function_3d inner_func(World& world, Fcwf& psi, Fcwf& phi); @@ -100,11 +104,11 @@ void operator+=(std::vector& phi, const std::vector& psi); std::vector operator-(const std::vector& phi, const std::vector& psi); - Tensor> matrix_inner(World& world, std::vector& a, std::vector& b); std::vector transform(World& world, std::vector& a, Tensor> U); +//allocator class needed for KAIN class Fcwf_vector_allocator { World& world; unsigned int m_size; @@ -116,7 +120,6 @@ class Fcwf_vector_allocator { std::vector operator()(); //Copy Constructor - //according to Bryan, according to Jakob, this is necessary for KAIN? Fcwf_vector_allocator operator=(const Fcwf_vector_allocator& other); void set_size(int size); From b920e1463d7a5f6f5a849dac6366d33c4e4d2776 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 21 Jan 2020 15:35:59 -0500 Subject: [PATCH 0059/1312] squashed small bug in rk --- src/apps/dirac/DKops.h | 5 +++-- src/apps/dirac/rk.cc | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/apps/dirac/DKops.h b/src/apps/dirac/DKops.h index 63125778c88..730954c5fac 100644 --- a/src/apps/dirac/DKops.h +++ b/src/apps/dirac/DKops.h @@ -270,9 +270,10 @@ real_convolution_3d A(World& world){ } } */ + double fac = pow(2.0*constants::pi,1.5); Tensor ctens(n), ttens(n); for(int i = 0; i < n; i++){ - ctens[i] = c[i]; + ctens[i] = c[i]*fac; ttens[i] = t[i]; } //if(world.rank()==0) print("Made an A!, n = ", n); @@ -331,7 +332,7 @@ real_convolution_3d A2(World& world){ ctens[i] = c[i]*fac; ttens[i] = t[i]; } - //c[n-1] += 1/sqrt(2)*fac*std::pow(t[n-1]*constants::pi,1.5); //largest exponent is at the end, so add 1/sqrt(2) to the coefficient there + c[n-1] += 1/sqrt(2)*fac*std::pow(t[n-1]*constants::pi,1.5); //largest exponent is at the end, so add 1/sqrt(2) to the coefficient there //if(world.rank()==0) print("Made an A!, n = ", n); //if(world.rank()==0) print("Made an A! Here's what's inside:\n\nc:\n",ctens,"\nt:\n",ttens); //return real_convolution_3d(world, args, ctens, ttens); diff --git a/src/apps/dirac/rk.cc b/src/apps/dirac/rk.cc index c8b880d3322..be087448eb3 100644 --- a/src/apps/dirac/rk.cc +++ b/src/apps/dirac/rk.cc @@ -37,8 +37,8 @@ static double Z = -1; // Nuclear half-charge radius of H (proton) is 1.3e-5 and the exponent // of its finite-size Gaussian approximation is 2.12e9. So this // choice for dx resolves one-two orders of magnitude finer scale. -static const double op_dx=1e-16; //TRY CHANGING THIS 1e-16 -static const double op_quadacc=1e-8; //FIND ALL INSTANCES OF THIS AND DEAL WITH IT +static const double op_dx=1e-16; +static const double op_quadacc=1e-8; static const double op_thresh=1e-8; static const long k = 10; // wavelet order @@ -243,7 +243,7 @@ real_function_3d apply_potential(const real_function_3d& Vnuc, const real_functi else if (DK1) { // A (V + Pp . V pP ) A psi = A V A psi + AP p . V p AP psi - real_convolution_3d Aop = A2(world); + real_convolution_3d Aop = A(world); real_convolution_3d APbarop = PbarA(world); real_function_3d tempfunc(world); double tempdouble; @@ -455,9 +455,9 @@ int main(int argc, char** argv) { FunctionDefaults<3>::set_truncate_on_project(true); FunctionDefaults<3>::set_cubic_cell(-L/2,L/2); - //double Zlist[] = {1.0,2.0,3.0,4.0,6.0,8.0,10.0,12.0,16.0,20.0,30.0,40.0,60.0,80.0}; + double Zlist[] = {1.0,2.0,3.0,4.0,6.0,8.0,10.0,12.0,16.0,20.0,30.0,40.0,60.0,80.0}; //double Zlist[] = {1.0,2.0,4.0,8.0,10.0,16.0,20.0,32.0,40.0,48.0,56.0,60.0,64.0,72.0,76.0,80.0}; - double Zlist[] = {60.0,64.0,72.0,76.0,80.0}; + //double Zlist[] = {60.0,64.0,72.0,76.0,80.0}; //double Zlist[] = {20.0,40.0,56.0,60.0,64.0,72.0,76.0,80.0}; //double Zlist[] = {100.0}; const int NumZs = sizeof(Zlist)/sizeof(Z); From 2008ef052c6893a4b3b875457d2addbd1e1912aa Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 21 Jan 2020 15:37:28 -0500 Subject: [PATCH 0060/1312] executable name change --- src/apps/dirac/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/dirac/CMakeLists.txt b/src/apps/dirac/CMakeLists.txt index 7fcd956f5eb..2b1dcd454c4 100644 --- a/src/apps/dirac/CMakeLists.txt +++ b/src/apps/dirac/CMakeLists.txt @@ -1,8 +1,8 @@ # src/apps/moldft -add_executable(DFdriverJ DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) -target_link_libraries(DFdriverJ MADchem MADmra) +add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) +target_link_libraries(DFdriver MADchem MADmra) -add_executable(rkJ rk.cc) -target_link_libraries(rkJ MADchem MADmra -lgmp -lmpfr) +add_executable(rk rk.cc) +target_link_libraries(rk MADchem MADmra -lgmp -lmpfr) From 7ab12496da4c1a72a61f2bcbeb41761ee4969f76 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 21 Jan 2020 16:07:01 -0500 Subject: [PATCH 0061/1312] more cleanup --- src/apps/dirac/DFParameters.h | 54 +--------------- src/apps/dirac/InitParameters.h | 107 ++++++-------------------------- 2 files changed, 23 insertions(+), 138 deletions(-) diff --git a/src/apps/dirac/DFParameters.h b/src/apps/dirac/DFParameters.h index 6eea877703b..07ddf2160a9 100644 --- a/src/apps/dirac/DFParameters.h +++ b/src/apps/dirac/DFParameters.h @@ -22,22 +22,9 @@ namespace madness { ///< -------------------------------------------------------------- ///< 0 | Dirac Fock on occupied orbitals only (Default) ///< -------------------------------------------------------------- - ///< 1 | "Method 1" calculation of virtuals of a - ///< | single-valence state. + ///< Add more values here ///< - int print_level; ///< Controls the amount and style of printing. Higher values print more - ///< Values | What gets printed - ///< ---------------------------- - ///< 1 | Print out each step in the calculation, - ///< | along with timings - ///< ---------------------------- - ///< 2 | Debug level. Prints EVERYTHING!!! - - bool plot; ///< Turn on plotting of final orbitals. Output format is .vts - bool plot_range; ///< Controls which orbitals will be plotted - std::vector plot_data; ///< Orbitals to plot int max_iter; ///< Maximum number of iterations - //double econv; ///< Convergence criterion for the orbital energies double small; ///< Minimum length scale to be resolved double thresh; ///< Accuracy criterion when truncating int k; ///< Number of legendre polynomials in scaling basis @@ -60,24 +47,18 @@ namespace madness { //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // NOT YET IMPLEMENTED - std::vector protocol_data; - bool localized; ///< Flag to use localized orbitals or not. MUST BE TRUE IF USING LOCALIZED GROUND STATE ORBITALS!! - template void serialize(Archive& ar){ - ar & archive & job & print_level & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot & no_compute & bohr_rad & min_iter; + ar & archive & job & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot & no_compute & bohr_rad & min_iter; } // Default constructor DFParameters() : job(0) - , print_level(0) - , plot(false) , max_iter(20) , small(1e-5) - , k(8) , thresh(1e-6) + , k(8) , kain(false) , maxsub(10) , maxrotn(0.25) @@ -114,30 +95,6 @@ namespace madness { else if (s == "job"){ f >> job; } - else if (s == "print_level"){ - f >> print_level; - } - else if (s == "plot"){ - plot = true; - std::string buf; - std::getline(f,buf); - plot_data = std::vector(); - std::string d; - std::stringstream t(buf); - t >> d; - if (d == "range"){ - plot_range = true; - t >> d; - plot_data.push_back(std::stoi(d)); - t >> d; - for(int z = plot_data[0]; z < std::stoi(d); z++) plot_data.push_back(z); - } - else{ - // Add in the one we just read - plot_data.push_back(std::stoi(d)); - while(t >> d) plot_data.push_back(std::stoi(d)); - } - } else if (s == "max_iter"){ f >> max_iter; } @@ -217,11 +174,6 @@ namespace madness { madness::print(" Nucleus: gaussian"); } madness::print(" Do Lineplots:", lineplot); - madness::print(" Plot Final Orbitals:", plot); - if(plot and plot_range) madness::print(" Plot Start:", plot_data[0]); - if(plot and plot_range) madness::print(" Plot End:", plot_data[1]); - if(plot and not plot_range) madness::print(" Orbitals to be Plotted:", plot_data); - madness::print(" Print Level:", print_level); } }; diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index 36cc179053c..2b48549f7ab 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -22,15 +22,12 @@ namespace madness{ double Init_total_energy; ///< Total energy of the nonrelativistic ground state bool spinrestricted; ///< Indicates if input calc. was spin-restricted unsigned int num_occupied; ///< Number of orbitals - unsigned int num_virtuals; Tensor energies; ///< Energies of input orbitals - Tensor v_energies; Tensor occ; ///< Occupancy of input orbitals double L; ///< Box size of input - Dirac Fock calcluation is in same box int order; ///< Order of polynomial used in input Molecule molecule; ///< The molecule used in input calculation std::vector orbitals; ///< The occupied orbitals - std::vector virtuals; // Default constructor InitParameters() {} @@ -40,6 +37,7 @@ namespace madness{ // Save the filename inFile = filename; + //First check to see if we're starting the job from a saved DF calculation rather than a moldft calculation if(restart){ if(world.rank()==0) print("\n Reading initial data from restarted DF calculation"); archive::ParallelInputArchive input(world, filename.c_str()); @@ -65,10 +63,13 @@ namespace madness{ orbitals.push_back(copy(reader)); } } - else{ + else{ //If we're not reading in from DF, then we're reading in from moldft + + //some dummy variables for reading/computing std::vector dummy2; Tensor temp_energies; + //read in what's in the archive. See SCF.cc for how these archives are stored archive::ParallelInputArchive input(world, filename.c_str()); input & Init_total_energy; // double input & spinrestricted; // bool @@ -91,23 +92,32 @@ namespace madness{ FunctionDefaults<3>::set_k(order); FunctionDefaults<3>::set_cubic_cell(-L, L); - + //Now read in the orbitals and construct Fcwfs from them. complex_derivative_3d Dx(world,0); complex_derivative_3d Dy(world,1); complex_derivative_3d Dz(world,2); double myc = 137.0359895; //speed of light in atomic units std::complex myi(0,1); if(spinrestricted){ - // Read in nonrelativistic ground state orbitals, changing them to Fcwfs + //If the calculation was spin-restricted, then we only have "spin-up" orbitals + + //Initialize some functions for reading in the orbitals real_function_3d reader; complex_function_3d complexreader; Fcwf spinup(world); - Fcwf spindown(world); + //Fcwf spindown(world); real_function_3d xfunc = real_factory_3d(world).f(myxfunc); real_function_3d yfunc = real_factory_3d(world).f(myyfunc); + + //Loop over the occupied orbitals and convert for(unsigned int i = 0; i < num_occupied; i++){ + //read in orbital input & reader; + + //change to a complex function complexreader = function_real2complex(reader); + + //build up the corresponding fcwf, using kinetic balance to define the small component spinup[0] = complexreader; spinup[1] = complex_factory_3d(world); spinup[2] = (-myi) * Dz(complexreader); @@ -122,86 +132,10 @@ namespace madness{ //spindown[3] = (myi) * Dz(complexreader); //spindown[3].scale(0.5); //spindown.normalize(); - //spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); - //spindown = Fcwf(complex_factory_3d(world), copy(complexreader), complex_factory_3d(world), complex_factory_3d(world)); orbitals.push_back(spinup); //orbitals.push_back(spindown); } - ////Bring in p block, construct 4-component wavefunctions, and diagonalize under j_z - //std::vector jzorbitals; - //std::vector justorbitals; - //for(unsigned int i=0; i<3; i++){ - // input & reader; - // complexreader = function_real2complex(reader); - // spinup[0] = complexreader; - // spinup[1] = complex_factory_3d(world); - // spinup[2] = (-myi) * Dz(complexreader); - // spinup[2].scale(0.5); - // spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); - // spinup[3].scale(0.5); - // spinup.normalize(); - // spindown[0] = complex_factory_3d(world); - // spindown[1] = complexreader; - // spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); - // spindown[2].scale(0.5); - // spindown[3] = (myi) * Dz(complexreader); - // spindown[3].scale(0.5); - // spindown.normalize(); - // ////spinup = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); - // ////spindown = Fcwf(complex_factory_3d(world), copy(complexreader), complex_factory_3d(world), complex_factory_3d(world)); - // //spinup = spinup + spindown; - // //orbitals.push_back(spinup); - // //orbitals.push_back(spindown); - // justorbitals.push_back(spinup); - // justorbitals.push_back(spindown); - //} - - - ////for(unsigned int i=0; i<6; i++){ - //// spinup[0] = -myi*(xfunc*Dy(justorbitals[i][0])-yfunc*Dx(justorbitals[i][0])) + 0.5*justorbitals[i][0]; - //// spinup[1] = -myi*(xfunc*Dy(justorbitals[i][1])-yfunc*Dx(justorbitals[i][1])) - 0.5*justorbitals[i][1]; - //// spinup[2] = -myi*(xfunc*Dy(justorbitals[i][2])-yfunc*Dx(justorbitals[i][2])) + 0.5*justorbitals[i][2]; - //// spinup[3] = -myi*(xfunc*Dy(justorbitals[i][3])-yfunc*Dx(justorbitals[i][3])) - 0.5*justorbitals[i][3]; - //// jzorbitals.push_back(spinup); - ////} - - ////Tensor> jztensor = matrix_inner(world,justorbitals,jzorbitals); - ////Tensor> overlap = matrix_inner(world,justorbitals,justorbitals); - - ////Tensor> U(6,6); - ////Tensor evals(6); - - ////if(world.rank()==0){ - //// print("\njz:\n", jztensor); - //// print("\noverlap:\n", overlap); - ////} - //// - ////sygv(jztensor,overlap,1,U,evals); - - ////if(world.rank()==0) print("U:\n",U); - ////if(world.rank()==0) print("evals:\n",evals); - - ////transform(world,justorbitals,U); - ////for(unsigned int i = 0; i < 6; i++){ - //// if(evals[i] > 0){ - //// if(world.rank()==0) print("Add in state with eval: ", evals[i]); - //// orbitals.push_back(justorbitals[i]); - //// } - ////} - //orbitals.push_back(justorbitals[0]); - //orbitals.push_back(justorbitals[2]); - //orbitals.push_back(justorbitals[4]); - ////duplicate the energies - ////energies = Tensor(2*num_occupied); - ////double csquared = 137.0359895*137.0359895; - ////double temp; - ////for(unsigned int i = 0; i < num_occupied; i++){ - //// temp = temp_energies(i);//+csquared; - //// energies(2*i) = temp; - //// energies(2*i+1) = temp; - ////} - ////correct the number of orbitals //num_occupied *= 2; } @@ -232,7 +166,6 @@ namespace madness{ //Tensor beta_energies; //input & beta_energies; - ////NEED TO ADD THESE INTO TOTAL ENERGIES MATRIX //Tensor dummy3; //input & dummy3; @@ -240,8 +173,6 @@ namespace madness{ //std::vector dummy4; //input & dummy4; - //if(world.rank()==0) print("made it here: ", num_betas); - // ////read in beta ground state orbitals //for(unsigned int i = 0; i < num_betas; i++){ // input & reader; @@ -269,7 +200,7 @@ namespace madness{ } - //For convenience, reorder orbitals and energies in ascending order. + //reorder orbitals and energies in ascending order, if necessary. double tempdouble; Fcwf fcwfreader(world); for(unsigned int i = 0; i < num_occupied; i++){ @@ -290,6 +221,8 @@ namespace madness{ } } + //This function no longer works, because the code only perform Kramers-restricted calculations! + //TODO: Update this function before using it void readnw(World& world, const std::string& filename){ //Called to read in initial parameters from an nwchem output file From 899fda372b3775a3c3a290a0b1a86d65b0167e0c Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 22 Jan 2020 16:17:57 -0500 Subject: [PATCH 0062/1312] next round of commenting and trimming --- src/apps/dirac/DF.cc | 3 +- src/apps/dirac/InitParameters.h | 422 ++++++++++++++++---------------- src/apps/dirac/fcwf.cc | 4 +- 3 files changed, 215 insertions(+), 214 deletions(-) diff --git a/src/apps/dirac/DF.cc b/src/apps/dirac/DF.cc index 01a301d24ea..980f0fb1378 100644 --- a/src/apps/dirac/DF.cc +++ b/src/apps/dirac/DF.cc @@ -410,7 +410,8 @@ DF::DF(World & world,std::shared_ptr input) { // Read in archive, but first find out if we're reading an nwchem file or other archive if(DFparams.nwchem){ - Init_params.readnw(world, DFparams.archive); + throw; //The nwchem input reading needs to be redone + //Init_params.readnw(world, DFparams.archive); } else{ Init_params.read(world, DFparams.archive, DFparams.restart); diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index 2b48549f7ab..ca5862eb435 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -223,217 +223,217 @@ namespace madness{ //This function no longer works, because the code only perform Kramers-restricted calculations! //TODO: Update this function before using it - void readnw(World& world, const std::string& filename){ - //Called to read in initial parameters from an nwchem output file - - //For now just use default values for L and order - order = 6; - L = 50.0; - FunctionDefaults<3>::set_k(order); - FunctionDefaults<3>::set_cubic_cell(-L, L); - - //Need to set this to something... - Init_total_energy = 0.0; - - //Construct interface object from slymer namespace - slymer::NWChem_Interface nwchem(filename,std::cout); - - //For parallel runs, silencing all but 1 slymer instance - if(world.rank() != 0) { - std::ostream dev_null(nullptr); - nwchem.err = dev_null; - } - - //Read in basis set - nwchem.read(slymer::Properties::Basis); - - //Read in the molecular orbital coefficients, energies, and occupancies - nwchem.read(slymer::Properties::Energies | slymer::Properties::MOs | slymer::Properties::Occupancies); - - //Need to construct a molecule object by ourselves - molecule = Molecule(); - unsigned int anum; - double x,y,z,q; - for(unsigned int i=0; i < nwchem.atoms.size(); i++){ - anum = symbol_to_atomic_number(nwchem.atoms[i].symbol); - q = anum*1.0; - x = nwchem.atoms[i].position[0]; - y = nwchem.atoms[i].position[1]; - z = nwchem.atoms[i].position[2]; - molecule.add_atom(x,y,z,q,anum); - } - - //Find out how many orbitals we're dealing with by looking at the occupancies - unsigned int numalpha(0), numbeta(0); - num_virtuals = 0; - - bool have_beta(false); - for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ - if(nwchem.beta_occupancies[i] > 0.0) have_beta = true; - } - - if(have_beta){ - //we're reading from an open-shell calculation - for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ - (nwchem.occupancies[i] == 1.0) ? numalpha+=1 : num_virtuals+=1; - } - for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ - (nwchem.beta_occupancies[i] == 1.0) ? numbeta+=1 : num_virtuals+=1; - } - } - else{ - for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ - (nwchem.occupancies[i] == 2.0) ? numalpha += 1 : num_virtuals += 2; - } - numbeta = numalpha; - } - num_occupied = numalpha+numbeta; - - //Let's print everything so we have a visual check on what we're working with (for now) - if(world.rank()==0) print("\nalpha occupancies:\n",nwchem.occupancies); - if(world.rank()==0) print("\nbeta occupancies:\n",nwchem.beta_occupancies); - if(world.rank()==0) print("\nenergies:\n",nwchem.energies); - if(world.rank()==0) print("\nbeta energies:\n",nwchem.beta_energies); - if(world.rank()==0) print("num alpha",numalpha); - if(world.rank()==0) print("num beta",numbeta); - if(world.rank()==0) print("num virtuals",num_virtuals); - - - //Now that we know how many orbitals we have. initialize energy tensors - energies = Tensor(num_occupied); - v_energies = Tensor(num_virtuals); - - //Cast the 'basis set' into a Gaussian basis and iterate over it - vector_real_function_3d temp1; - int ii = 0; - for(auto basis : slymer::cast_basis(nwchem.basis_set)) { - //Get the center of gaussian as its special point - std::vector centers; - coord_3d r; - r[0] = basis.get().center[0]; r[1] = basis.get().center[1]; r[2] = basis.get().center[2]; - centers.push_back(r); - - //Now make the function - temp1.push_back(FunctionFactory(world).functor(std::shared_ptr>(new slymer::Gaussian_Functor(basis.get(), centers)))); - double norm2 = temp1[ii].norm2(); - if(world.rank() == 0) print("function", ii, "has norm", norm2); - ii++; - } - - //Normalize aos - normalize(world, temp1); - - //Transform aos now to get alpha mos - vector_real_function_3d temp = transform(world, temp1, nwchem.MOs , true); - - //Keep track of how many energies i've stored - int energy_index = 0; - int v_energy_index = 0; - - //nonrelativistic energies need to be adjusted for relativistic calculations - double csquared = 137.0359895*137.0359895; - - //Convert and store alpha occupied MOs and virtuals. If closed shell, do betas too. - complex_function_3d complexreader(world); - Fcwf fcwfreader(world); - for(unsigned int i = 0; i < temp.size(); i++){ - complexreader = function_real2complex(temp[i]); - fcwfreader = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); - if(have_beta){ - if(nwchem.occupancies[i] == 1.0){ - orbitals.push_back(fcwfreader); - energies[energy_index] = nwchem.energies[i] + csquared; - energy_index++; - } - else{ - virtuals.push_back(fcwfreader); - v_energies[v_energy_index] = nwchem.energies[i] + csquared; - v_energy_index++; - } - - } - else{ - if(nwchem.occupancies[i] == 2.0){ - orbitals.push_back(fcwfreader); - energies[energy_index] = nwchem.energies[i] + csquared; - energy_index++; - fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); - orbitals.push_back(fcwfreader); - energies[energy_index] = nwchem.energies[i] + csquared; - energy_index++; - - } - else{ - virtuals.push_back(fcwfreader); - v_energies[v_energy_index] = nwchem.energies[i] + csquared; - v_energy_index++; - fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); - virtuals.push_back(fcwfreader); - v_energies[v_energy_index] = nwchem.energies[i] + csquared; - v_energy_index++; - } - } - } - - - //If we're doing an open shell calculation we need to read in the beta orbitals explicitly - if(have_beta){ - //Transform aos again to get beta mos - temp = transform(world, temp1, nwchem.beta_MOs, true); - - //Convert and store beta occupied MOs and virtuals - for(unsigned int i = 0; i < temp.size(); i++){ - complexreader = function_real2complex(temp[i]); - fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); - if(nwchem.beta_occupancies[i] == 1.0){ - orbitals.push_back(fcwfreader); - energies[energy_index] = nwchem.beta_energies[i] + csquared; - energy_index++; - } - else{ - virtuals.push_back(fcwfreader); - v_energies[v_energy_index] = nwchem.beta_energies[i] + csquared; - v_energy_index++; - } - } - } - - //Assure that the numbers line up - MADNESS_ASSERT(num_occupied == orbitals.size()); - MADNESS_ASSERT(num_virtuals == virtuals.size()); - - //Need to sort - double tempdouble; - //Sort occupied - for(unsigned int i = 0; i < num_occupied; i++){ - for(unsigned int j = i+1; j < num_occupied; j++){ - if(energies(j) < energies(i)){ - if(world.rank()==0) print("swapping orbitals", i, " and ", j); - tempdouble = energies(j); - energies(j) = energies(i); - energies(i) = tempdouble; - fcwfreader = orbitals[j]; - orbitals[j] = orbitals[i]; - orbitals[i] = fcwfreader; - } - } - } - //sort virtual - for(unsigned int i = 0; i < num_virtuals; i++){ - for(unsigned int j = i+1; j < num_virtuals; j++){ - if(v_energies(j) < v_energies(i)){ - if(world.rank()==0) print("swapping virtuals", i, " and ", j); - tempdouble = v_energies(j); - v_energies(j) = v_energies(i); - v_energies(i) = tempdouble; - fcwfreader = virtuals[j]; - virtuals[j] = virtuals[i]; - virtuals[i] = fcwfreader; - } - } - } - - } + //void readnw(World& world, const std::string& filename){ + // //Called to read in initial parameters from an nwchem output file + // + // //For now just use default values for L and order + // order = 6; + // L = 50.0; + // FunctionDefaults<3>::set_k(order); + // FunctionDefaults<3>::set_cubic_cell(-L, L); + + // //Need to set this to something... + // Init_total_energy = 0.0; + // + // //Construct interface object from slymer namespace + // slymer::NWChem_Interface nwchem(filename,std::cout); + + // //For parallel runs, silencing all but 1 slymer instance + // if(world.rank() != 0) { + // std::ostream dev_null(nullptr); + // nwchem.err = dev_null; + // } + + // //Read in basis set + // nwchem.read(slymer::Properties::Basis); + + // //Read in the molecular orbital coefficients, energies, and occupancies + // nwchem.read(slymer::Properties::Energies | slymer::Properties::MOs | slymer::Properties::Occupancies); + + // //Need to construct a molecule object by ourselves + // molecule = Molecule(); + // unsigned int anum; + // double x,y,z,q; + // for(unsigned int i=0; i < nwchem.atoms.size(); i++){ + // anum = symbol_to_atomic_number(nwchem.atoms[i].symbol); + // q = anum*1.0; + // x = nwchem.atoms[i].position[0]; + // y = nwchem.atoms[i].position[1]; + // z = nwchem.atoms[i].position[2]; + // molecule.add_atom(x,y,z,q,anum); + // } + + // //Find out how many orbitals we're dealing with by looking at the occupancies + // unsigned int numalpha(0), numbeta(0); + // num_virtuals = 0; + + // bool have_beta(false); + // for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ + // if(nwchem.beta_occupancies[i] > 0.0) have_beta = true; + // } + // + // if(have_beta){ + // //we're reading from an open-shell calculation + // for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ + // (nwchem.occupancies[i] == 1.0) ? numalpha+=1 : num_virtuals+=1; + // } + // for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ + // (nwchem.beta_occupancies[i] == 1.0) ? numbeta+=1 : num_virtuals+=1; + // } + // } + // else{ + // for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ + // (nwchem.occupancies[i] == 2.0) ? numalpha += 1 : num_virtuals += 2; + // } + // numbeta = numalpha; + // } + // num_occupied = numalpha+numbeta; + + // //Let's print everything so we have a visual check on what we're working with (for now) + // if(world.rank()==0) print("\nalpha occupancies:\n",nwchem.occupancies); + // if(world.rank()==0) print("\nbeta occupancies:\n",nwchem.beta_occupancies); + // if(world.rank()==0) print("\nenergies:\n",nwchem.energies); + // if(world.rank()==0) print("\nbeta energies:\n",nwchem.beta_energies); + // if(world.rank()==0) print("num alpha",numalpha); + // if(world.rank()==0) print("num beta",numbeta); + // if(world.rank()==0) print("num virtuals",num_virtuals); + + + // //Now that we know how many orbitals we have. initialize energy tensors + // energies = Tensor(num_occupied); + // v_energies = Tensor(num_virtuals); + + // //Cast the 'basis set' into a Gaussian basis and iterate over it + // vector_real_function_3d temp1; + // int ii = 0; + // for(auto basis : slymer::cast_basis(nwchem.basis_set)) { + // //Get the center of gaussian as its special point + // std::vector centers; + // coord_3d r; + // r[0] = basis.get().center[0]; r[1] = basis.get().center[1]; r[2] = basis.get().center[2]; + // centers.push_back(r); + + // //Now make the function + // temp1.push_back(FunctionFactory(world).functor(std::shared_ptr>(new slymer::Gaussian_Functor(basis.get(), centers)))); + // double norm2 = temp1[ii].norm2(); + // if(world.rank() == 0) print("function", ii, "has norm", norm2); + // ii++; + // } + + // //Normalize aos + // normalize(world, temp1); + + // //Transform aos now to get alpha mos + // vector_real_function_3d temp = transform(world, temp1, nwchem.MOs , true); + + // //Keep track of how many energies i've stored + // int energy_index = 0; + // int v_energy_index = 0; + + // //nonrelativistic energies need to be adjusted for relativistic calculations + // double csquared = 137.0359895*137.0359895; + + // //Convert and store alpha occupied MOs and virtuals. If closed shell, do betas too. + // complex_function_3d complexreader(world); + // Fcwf fcwfreader(world); + // for(unsigned int i = 0; i < temp.size(); i++){ + // complexreader = function_real2complex(temp[i]); + // fcwfreader = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + // if(have_beta){ + // if(nwchem.occupancies[i] == 1.0){ + // orbitals.push_back(fcwfreader); + // energies[energy_index] = nwchem.energies[i] + csquared; + // energy_index++; + // } + // else{ + // virtuals.push_back(fcwfreader); + // v_energies[v_energy_index] = nwchem.energies[i] + csquared; + // v_energy_index++; + // } + + // } + // else{ + // if(nwchem.occupancies[i] == 2.0){ + // orbitals.push_back(fcwfreader); + // energies[energy_index] = nwchem.energies[i] + csquared; + // energy_index++; + // fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + // orbitals.push_back(fcwfreader); + // energies[energy_index] = nwchem.energies[i] + csquared; + // energy_index++; + + // } + // else{ + // virtuals.push_back(fcwfreader); + // v_energies[v_energy_index] = nwchem.energies[i] + csquared; + // v_energy_index++; + // fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + // virtuals.push_back(fcwfreader); + // v_energies[v_energy_index] = nwchem.energies[i] + csquared; + // v_energy_index++; + // } + // } + // } + + + // //If we're doing an open shell calculation we need to read in the beta orbitals explicitly + // if(have_beta){ + // //Transform aos again to get beta mos + // temp = transform(world, temp1, nwchem.beta_MOs, true); + + // //Convert and store beta occupied MOs and virtuals + // for(unsigned int i = 0; i < temp.size(); i++){ + // complexreader = function_real2complex(temp[i]); + // fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + // if(nwchem.beta_occupancies[i] == 1.0){ + // orbitals.push_back(fcwfreader); + // energies[energy_index] = nwchem.beta_energies[i] + csquared; + // energy_index++; + // } + // else{ + // virtuals.push_back(fcwfreader); + // v_energies[v_energy_index] = nwchem.beta_energies[i] + csquared; + // v_energy_index++; + // } + // } + // } + // + // //Assure that the numbers line up + // MADNESS_ASSERT(num_occupied == orbitals.size()); + // MADNESS_ASSERT(num_virtuals == virtuals.size()); + + // //Need to sort + // double tempdouble; + // //Sort occupied + // for(unsigned int i = 0; i < num_occupied; i++){ + // for(unsigned int j = i+1; j < num_occupied; j++){ + // if(energies(j) < energies(i)){ + // if(world.rank()==0) print("swapping orbitals", i, " and ", j); + // tempdouble = energies(j); + // energies(j) = energies(i); + // energies(i) = tempdouble; + // fcwfreader = orbitals[j]; + // orbitals[j] = orbitals[i]; + // orbitals[i] = fcwfreader; + // } + // } + // } + // //sort virtual + // for(unsigned int i = 0; i < num_virtuals; i++){ + // for(unsigned int j = i+1; j < num_virtuals; j++){ + // if(v_energies(j) < v_energies(i)){ + // if(world.rank()==0) print("swapping virtuals", i, " and ", j); + // tempdouble = v_energies(j); + // v_energies(j) = v_energies(i); + // v_energies(i) = tempdouble; + // fcwfreader = virtuals[j]; + // virtuals[j] = virtuals[i]; + // virtuals[i] = fcwfreader; + // } + // } + // } + + //} // Prints all information void print_params() const diff --git a/src/apps/dirac/fcwf.cc b/src/apps/dirac/fcwf.cc index d6b9424b7ec..ab81953ca31 100644 --- a/src/apps/dirac/fcwf.cc +++ b/src/apps/dirac/fcwf.cc @@ -150,7 +150,7 @@ void Fcwf::scale(std::complex a){ //in place addition of Fcwfs. Fcwf on right must be initialized Fcwf Fcwf::operator+=(const Fcwf& phi){ - MADNESS_ASSERT(phi.getinitialize()) + MADNESS_ASSERT(phi.getinitialize()); if(m_initialized){ for(int i = 0 ; i < 4 ; i++){ m_psi[i] += phi[i]; @@ -167,7 +167,7 @@ Fcwf Fcwf::operator+=(const Fcwf& phi){ //in place subtraction of Fcwfs. Fcwf on right must be initialized Fcwf Fcwf::operator-=(const Fcwf& phi){ - MADNESS_ASSERT(phi.getinitialize()) + MADNESS_ASSERT(phi.getinitialize()); if(m_initialized){ for(int i = 0 ; i < 4 ; i++){ m_psi[i] -= phi[i]; From 394633aa7b63e40a81d8314fd0f70b03715ba423 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Thu, 13 Feb 2020 14:55:36 -0500 Subject: [PATCH 0063/1312] Put unrestricted capability back in --- cmakecmd | 6 +- src/apps/dirac/DF.cc | 379 ++++++++++++++++++-------------- src/apps/dirac/DFParameters.h | 8 +- src/apps/dirac/InitParameters.h | 191 ++++++++++------ 4 files changed, 345 insertions(+), 239 deletions(-) diff --git a/cmakecmd b/cmakecmd index 51ff01663d9..f619377f18d 100644 --- a/cmakecmd +++ b/cmakecmd @@ -1,9 +1,9 @@ cmake -D ENABLE_TBB=ON \ -D ENABLE_MKL=1 \ - -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_BUILD_TYPE=Debug \ -D BUILD_SHARED_LIBS=OFF \ - -D CMAKE_CXX_COMPILER=mpiicpc \ - -D CMAKE_C_COMPILER=mpiicc \ + -D CMAKE_CXX_COMPILER=mpicxx \ + -D CMAKE_C_COMPILER=mpicc \ -D CMAKE_CXX_STANDARD=17 \ .. # -DBLA_STATIC=TRUE diff --git a/src/apps/dirac/DF.cc b/src/apps/dirac/DF.cc index 980f0fb1378..099461a6a1b 100644 --- a/src/apps/dirac/DF.cc +++ b/src/apps/dirac/DF.cc @@ -350,7 +350,7 @@ void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_functi for(unsigned int i = 0; i < num_atoms; i++){ Zlist[i] = Init_params.molecule.get_atom_number(i); FermiNucDistFunctor rho(Zlist[i], Rlist[i],DFparams.bohr_rad); - temp = real_factory_3d(world).functor(rho).truncate_mode(1); + temp = real_factory_3d(world).functor(rho).truncate_mode(0); tempnorm = temp.trace(); temp.scale(-Zlist[i]/tempnorm); if(i == 0){ @@ -414,7 +414,7 @@ DF::DF(World & world,std::shared_ptr input) { //Init_params.readnw(world, DFparams.archive); } else{ - Init_params.read(world, DFparams.archive, DFparams.restart); + Init_params.read(world, DFparams.archive, DFparams.restart, DFparams.Krestricted); } //print initialization parameters and molecule geometry @@ -427,7 +427,7 @@ DF::DF(World & world,std::shared_ptr input) { FunctionDefaults<3>::set_thresh(DFparams.thresh); //Always use user-specified thresh //Truncate mode 0 is preferrable, but currently way too expensive for relativistic calculations, so for now use 1 - FunctionDefaults<3>::set_truncate_mode(1); + FunctionDefaults<3>::set_truncate_mode(0); //If user requests different k, then project functions if(DFparams.k != Init_params.order){ @@ -457,7 +457,7 @@ DF::DF(World & world,std::shared_ptr input) { total_energy = Init_params.Init_total_energy; //If nonrelativistic calculation was spinrestricted then we're doing a closed shell calculation //This is a little incorrect, as we're equating two separate concepts, but it works for now. - closed_shell = Init_params.spinrestricted; + closed_shell = Init_params.closed_shell; Tensor times = end_timer(world); if(world.rank()==0) print("Preparation complete: ", times[0]); @@ -490,8 +490,8 @@ Fcwf apply_T(World& world, Fcwf& psi){ //combine to calculate application of T Tpsi[0] = psiz[2] + psix[3] - myi*psiy[3]; Tpsi[1] = psix[2] + myi*psiy[2] - psiz[3]; - Tpsi[2] = (myc*myc)*(psiz[0] + psix[1] - myi*psiy[1] - 2*myi*psi[2]); - Tpsi[3] = (myc*myc)*(psix[0] + myi*psiy[0] - psiz[1] - 2*myi*psi[3]); + Tpsi[2] = (myc*myc)*(psiz[0] + psix[1] - myi*psiy[1] - (2.0*myi)*psi[2]); + Tpsi[3] = (myc*myc)*(psix[0] + myi*psiy[0] - psiz[1] - (2.0*myi)*psi[3]); return Tpsi * (-myi); } @@ -590,116 +590,118 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi } - //Now we need exchange contributions from the time-reversed orbitals that we don't explicitly store. + //If our calculation is Kramers-restricted we need exchange contributions from the time-reversed orbitals that we don't explicitly store. //This will look very similar to the above loop (over i), but with rearrangements to the temporary vectors //Later, these can probably be combined into a single loop - int num_contrib=n; - if(!closed_shell){ - num_contrib = n-1; - } - - //Loop through orbitals phi_i, computing K(phi_i), and while we're at it, use symmetry to start calculating contributions to later orbitals - for(unsigned int i = 0; i < num_contrib; i++){ - - //temp will hold the contributions (results of the coulomb operator application) that we need to finish calculation of K(phi_i) - //For the first iteration, we need all n "contributions," so temp has length n, but this will decrease by 1 each iteration - std::vector temp(num_contrib-i); - for(unsigned int j = 0; j < num_contrib-i; j++){ - temp[j] = complex_factory_3d(world); - } - compress(world, temp); - - //break up the time-reversals of the ith through nth orbitals into their components to facilitate use of vmra functions - std::vector temp0(num_contrib-i); - std::vector temp1(num_contrib-i); - std::vector temp2(num_contrib-i); - std::vector temp3(num_contrib-i); - for(unsigned int j = i; j < num_contrib; j++){ - //the next four lines accomplish the rearrangement needed to get the time reversal rather than the orbital itself, but skip the complex conjugation, which will come later - temp0[j-i] = -1.0*occupieds[j][1]; - temp1[j-i] = occupieds[j][0]; - temp2[j-i] = -1.0*occupieds[j][3]; - temp3[j-i] = occupieds[j][2]; + if(DFparams.Krestricted){ + int num_contrib=n; + if(!closed_shell){ + num_contrib = n-1; } - //These gaxpy calls accomplish the (\phi_j^T)(\phi_i) in the numerator. Conjugation of phi_j is left to later - gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*temp0); - gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*temp1); - gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*temp2); - gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*temp3); + //Loop through orbitals phi_i, computing K(phi_i), and while we're at it, use symmetry to start calculating contributions to later orbitals + for(unsigned int i = 0; i < num_contrib; i++){ - //truncate before apply phase - truncate(world, temp); + //temp will hold the contributions (results of the coulomb operator application) that we need to finish calculation of K(phi_i) + //For the first iteration, we need all n "contributions," so temp has length n, but this will decrease by 1 each iteration + std::vector temp(num_contrib-i); + for(unsigned int j = 0; j < num_contrib-i; j++){ + temp[j] = complex_factory_3d(world); + } + compress(world, temp); + + //break up the time-reversals of the ith through nth orbitals into their components to facilitate use of vmra functions + std::vector temp0(num_contrib-i); + std::vector temp1(num_contrib-i); + std::vector temp2(num_contrib-i); + std::vector temp3(num_contrib-i); + for(unsigned int j = i; j < num_contrib; j++){ + //the next four lines accomplish the rearrangement needed to get the time reversal rather than the orbital itself, but skip the complex conjugation, which will come later + temp0[j-i] = -1.0*occupieds[j][1]; + temp1[j-i] = occupieds[j][0]; + temp2[j-i] = -1.0*occupieds[j][3]; + temp3[j-i] = occupieds[j][2]; + } - //apply coulomb operator - temp = apply(world, op, temp); - - //truncate again - truncate(world,temp); + //These gaxpy calls accomplish the (\phi_j^T)(\phi_i) in the numerator. Conjugation of phi_j is left to later + gaxpy(world, 1.0, temp, 1.0, occupieds[i][0]*temp0); + gaxpy(world, 1.0, temp, 1.0, occupieds[i][1]*temp1); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][2]*temp2); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[i][3]*temp3); - //Now multiply by phi_j's and accumulate to K(phi_i) - //Here is where we put the complex conjugation we've left out. This allows for one conjugation here instead of two conjugations earlier. - Kpsis[i][0] += sum(world, mul(world, temp, conj(world,temp0))); - Kpsis[i][1] += sum(world, mul(world, temp, conj(world,temp1))); - Kpsis[i][2] += sum(world, mul(world, temp, conj(world,temp2))); - Kpsis[i][3] += sum(world, mul(world, temp, conj(world,temp3))); - - //Now for the next part (accumulating the n-i "symmetric" contributions), we already have the complex conjugate of temp, so we can go straight to multiplication by the time-reversal of phi_i - temp0 = conj(occupieds[i][1])*temp; - temp1 = -1.0*conj(occupieds[i][0])*temp; - temp2 = conj(occupieds[i][3])*temp; - temp3 = -1.0*conj(occupieds[i][2])*temp; - - //accumulate - for(unsigned int j = i+1; j < num_contrib; j++){ - Kpsis[j][0] += temp0[j-i]; - Kpsis[j][1] += temp1[j-i]; - Kpsis[j][2] += temp2[j-i]; - Kpsis[j][3] += temp3[j-i]; - } - - } + //truncate before apply phase + truncate(world, temp); - //For open shell calculations need to calculate final contributions for the singly-occupied orbital - //This will look very similar to the two above loops - //Could put this as an addition to the first iteration of the loop above for more concise, though less readable code - if(!closed_shell){ - std::vector temp(n-1); - for(unsigned int j = 0; j < n-1; j++){ - temp[j] = complex_factory_3d(world); + //apply coulomb operator + temp = apply(world, op, temp); + + //truncate again + truncate(world,temp); + + //Now multiply by phi_j's and accumulate to K(phi_i) + //Here is where we put the complex conjugation we've left out. This allows for one conjugation here instead of two conjugations earlier. + Kpsis[i][0] += sum(world, mul(world, temp, conj(world,temp0))); + Kpsis[i][1] += sum(world, mul(world, temp, conj(world,temp1))); + Kpsis[i][2] += sum(world, mul(world, temp, conj(world,temp2))); + Kpsis[i][3] += sum(world, mul(world, temp, conj(world,temp3))); + + //Now for the next part (accumulating the n-i "symmetric" contributions), we already have the complex conjugate of temp, so we can go straight to multiplication by the time-reversal of phi_i + temp0 = conj(occupieds[i][1])*temp; + temp1 = -1.0*conj(occupieds[i][0])*temp; + temp2 = conj(occupieds[i][3])*temp; + temp3 = -1.0*conj(occupieds[i][2])*temp; + + //accumulate + for(unsigned int j = i+1; j < num_contrib; j++){ + Kpsis[j][0] += temp0[j-i]; + Kpsis[j][1] += temp1[j-i]; + Kpsis[j][2] += temp2[j-i]; + Kpsis[j][3] += temp3[j-i]; + } + } - compress(world, temp); - std::vector temp0(n-1); - std::vector temp1(n-1); - std::vector temp2(n-1); - std::vector temp3(n-1); - for(unsigned int j = 0; j < n-1; j++){ - temp0[j] = -1.0*occupieds[j][1]; - temp1[j] = occupieds[j][0]; - temp2[j] = -1.0*occupieds[j][3]; - temp3[j] = occupieds[j][2]; - } + //For open shell calculations need to calculate final contributions for the singly-occupied orbital + //This will look very similar to the two above loops + //Could put this as an addition to the first iteration of the loop above for more concise, though less readable code + if(!closed_shell){ + std::vector temp(n-1); + for(unsigned int j = 0; j < n-1; j++){ + temp[j] = complex_factory_3d(world); + } + compress(world, temp); + + std::vector temp0(n-1); + std::vector temp1(n-1); + std::vector temp2(n-1); + std::vector temp3(n-1); + for(unsigned int j = 0; j < n-1; j++){ + temp0[j] = -1.0*occupieds[j][1]; + temp1[j] = occupieds[j][0]; + temp2[j] = -1.0*occupieds[j][3]; + temp3[j] = occupieds[j][2]; + } - gaxpy(world, 1.0, temp, 1.0, occupieds[n-1][0]*temp0); - gaxpy(world, 1.0, temp, 1.0, occupieds[n-1][1]*temp1); - gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[n-1][2]*temp2); - gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[n-1][3]*temp3); + gaxpy(world, 1.0, temp, 1.0, occupieds[n-1][0]*temp0); + gaxpy(world, 1.0, temp, 1.0, occupieds[n-1][1]*temp1); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[n-1][2]*temp2); + gaxpy(world, 1.0, temp, 1.0/(myc*myc), occupieds[n-1][3]*temp3); - truncate(world, temp); + truncate(world, temp); - temp = apply(world, op, temp); - - truncate(world,temp); + temp = apply(world, op, temp); + + truncate(world,temp); - Kpsis[n-1][0] += sum(world, mul(world, temp, conj(world,temp0))); - Kpsis[n-1][1] += sum(world, mul(world, temp, conj(world,temp1))); - Kpsis[n-1][2] += sum(world, mul(world, temp, conj(world,temp2))); - Kpsis[n-1][3] += sum(world, mul(world, temp, conj(world,temp3))); - + Kpsis[n-1][0] += sum(world, mul(world, temp, conj(world,temp0))); + Kpsis[n-1][1] += sum(world, mul(world, temp, conj(world,temp1))); + Kpsis[n-1][2] += sum(world, mul(world, temp, conj(world,temp2))); + Kpsis[n-1][3] += sum(world, mul(world, temp, conj(world,temp3))); + + } } - + //Truncate for(unsigned int i=0; i < n; i++) Kpsis[i].truncate(); @@ -714,13 +716,14 @@ void DF::exchange(World& world, real_convolution_3d& op, std::vector& Kpsi //Kpsis are transformed in place as well. void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& op, std::vector& Kpsis){ + if(world.rank()==0) print("\n***Diagonalizing***"); start_timer(world); //Create a few integers to help keep track of loops unsigned int n = Init_params.num_occupied; //number of orbitals we have stored unsigned int np = closed_shell ? n : n-1; //number of PAIRS we want in computations - unsigned int m = n+np; //Size of matrix to use + unsigned int m = DFparams.Krestricted ? n+np : n; //Size of matrix to use //Initialize tensors and vectors to store temporary wavefunctions needed for computation Tensor> fock(m, m); @@ -730,27 +733,39 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o std::vector temp_orbitals; std::vector kramers_pairs; - //Make a permutation matrix for use later - //Fock matrix is built with orbitals in the following order: stored (doubly occupied) orbitals, singly-occupied orbital (if open shell), then kramers pairs of doubly-occupied orbitals + //Make a permutation matrix for use later (in the Kramers-restricted case) + //Fock matrix in the Kramers-restricted case is built with orbitals in the following order: + // + //stored (doubly occupied) orbitals, + //singly-occupied orbital (if open shell), + //then kramers pairs of doubly-occupied orbitals + // //However, before diagonalization we want the fock matrix as if our orbitals were in order of increasing energy. //This permutation matrix will accomplish the column and row swapping necessary to reorder Tensor P(m,m); - for(unsigned int j=0; j < np; j++){ - P(j,2*j) = 1; - P(n+j,2*j+1) = 1; + if(DFparams.Krestricted){ + for(unsigned int j=0; j < np; j++){ + P(j,2*j) = 1; + P(n+j,2*j+1) = 1; + } + if(!closed_shell) P(n-1,m-1) = 1; } - if(!closed_shell) P(n-1,m-1) = 1; - //Also make the vector of Kramers Pairs for use later - for(unsigned int j = 0; j < np; j++){ - kramers_pairs.push_back(occupieds[j].KramersPair()); + //Also make the vector of Kramers Pairs for use later (if Kramers-restricted) + if(DFparams.Krestricted){ + for(unsigned int j = 0; j < np; j++){ + kramers_pairs.push_back(occupieds[j].KramersPair()); + } } - if(world.rank()==0) print(" Forming Matrices"); start_timer(world); ////Form the Fock Matrix // + //In the Kramers-unrestricted case, the Fock matrix is simply nxn (or mxm, as n=m) + // + //In the Kramers restricted case, construction of the Fock matrix is a bit more complicated: + // //With the orbitals in the order described above, the Fock matrix can be thought of as a 2x2 block matrix. // //The dimensions are (using F to indicate blocks of the Fock matrix): @@ -768,8 +783,9 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //calculate potential due to nuclei and mean field if(world.rank() == 0) print(" Adding (V+J)psi"); real_function_3d rho = real_factory_3d(world); + double fac = (DFparams.Krestricted ? 2.0 : 1.0); for(unsigned int j = 0; j < np; j++){ - rho += 2*squaremod(occupieds[j]); + rho += fac*squaremod(occupieds[j]); } if(!closed_shell) rho += squaremod(occupieds[n-1]); real_function_3d potential = myV + apply(op,rho); @@ -798,14 +814,19 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o //Now compute the fock matrix Tensor> tempmatrix = matrix_inner(world, occupieds, temp_orbitals); - fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); - fock(Slice(n,m-1),Slice(n,m-1)) = conj(tempmatrix(Slice(0,np-1),Slice(0,np-1))); - tempmatrix = matrix_inner(world,kramers_pairs,temp_orbitals); - fock(Slice(n,m-1),Slice(0,n-1)) = copy(tempmatrix); - fock(Slice(0,n-1),Slice(n,m-1)) = conj_transpose(tempmatrix); + if(DFparams.Krestricted){ + fock(Slice(0,n-1),Slice(0,n-1)) = copy(tempmatrix); + fock(Slice(n,m-1),Slice(n,m-1)) = conj(tempmatrix(Slice(0,np-1),Slice(0,np-1))); + tempmatrix = matrix_inner(world,kramers_pairs,temp_orbitals); + fock(Slice(n,m-1),Slice(0,n-1)) = copy(tempmatrix); + fock(Slice(0,n-1),Slice(n,m-1)) = conj_transpose(tempmatrix); + } + else{ + fock = tempmatrix; + } //permute and symmetrize - fock = inner(transpose(P),inner(fock,P)); + if(DFparams.Krestricted) fock = inner(transpose(P),inner(fock,P)); fock = (1.0/2.0)*(fock + conj_transpose(fock)); //End timer for Fock matrix calculation @@ -816,13 +837,18 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o ////and the overlap matrix if(world.rank()==0) print(" Integrating to form Overlap Matrix"); start_timer(world); - overlap(Slice(0,n-1),Slice(0,n-1)) = matrix_inner(world,occupieds,occupieds); - overlap(Slice(0,n-1),Slice(n,m-1)) = matrix_inner(world,occupieds,kramers_pairs); - overlap(Slice(n,m-1),Slice(0,n-1)) = matrix_inner(world,kramers_pairs,occupieds); - overlap(Slice(n,m-1),Slice(n,m-1)) = matrix_inner(world,kramers_pairs,kramers_pairs); + if(DFparams.Krestricted){ + overlap(Slice(0,n-1),Slice(0,n-1)) = matrix_inner(world,occupieds,occupieds); + overlap(Slice(0,n-1),Slice(n,m-1)) = matrix_inner(world,occupieds,kramers_pairs); + overlap(Slice(n,m-1),Slice(0,n-1)) = matrix_inner(world,kramers_pairs,occupieds); + overlap(Slice(n,m-1),Slice(n,m-1)) = matrix_inner(world,kramers_pairs,kramers_pairs); + } + else{ + overlap = matrix_inner(world,occupieds,occupieds); + } //permute and symmetrize - overlap = inner(transpose(P),inner(overlap,P)); + if(DFparams.Krestricted) overlap = inner(transpose(P),inner(overlap,P)); overlap = (1.0/2.0)*(overlap + conj_transpose(overlap)); //End timers for overlap calculation and total matrix formation @@ -917,27 +943,39 @@ void DF::diagonalize(World& world, real_function_3d& myV, real_convolution_3d& o if(world.rank()==0) print(" ", times[0]); //Now undo permutations before the transformation phase - U = inner(P,inner(U,transpose(P))); - evals = inner(evals,transpose(P)); + if(DFparams.Krestricted){ + U = inner(P,inner(U,transpose(P))); + evals = inner(evals,transpose(P)); + } if(world.rank()==0) print(" Applying Transformation"); start_timer(world); //Apply the transformation to the orbitals by right-multiplying - // Because we have n orbitals but the matrix has n+np rows, this happens in two stages - tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); - occupieds = transform(world, occupieds, tempmatrix); - tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); - occupieds += transform(world, kramers_pairs, tempmatrix); + //(if Krestricted) Because we have n orbitals but the matrix has n+np rows, this happens in two stages + if(DFparams.Krestricted){ + tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); + occupieds = transform(world, occupieds, tempmatrix); + tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); + occupieds += transform(world, kramers_pairs, tempmatrix); + } + else{ + occupieds = transform(world,occupieds,U); + } ////Apply the transformation to the Exchange-applied functions as well - for(unsigned int j = 0; j < np; j++){ - kramers_pairs[j] = Kpsis[j].KramersPair(); + if(DFparams.Krestricted){ + for(unsigned int j = 0; j < np; j++){ + kramers_pairs[j] = Kpsis[j].KramersPair(); + } + tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); + Kpsis = transform(world, Kpsis, tempmatrix); + tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); + Kpsis += transform(world, kramers_pairs, tempmatrix); + } + else{ + Kpsis = transform(world,Kpsis,U); } - tempmatrix = U(Slice(0,n-1),Slice(0,n-1)); - Kpsis = transform(world, Kpsis, tempmatrix); - tempmatrix = U(Slice(n,m-1),Slice(0,n-1)); - Kpsis += transform(world, kramers_pairs, tempmatrix); //truncate for(int kk = 0; kk < n; kk++){ @@ -1058,7 +1096,7 @@ void apply_BSH(World& world, Fcwf& Vpsi, double& eps, double& small, double& thr //Analytically this is equivalent to apply_BSH, but faster because the application of //the derivative operator is faster than application of an integral operator. // -//Empirically this has resulted in no decrease in accuracy +//Empirically this has resulted in no decrease in accuracy, despite reliance on the "noisier" derivative operator void apply_BSH_new(World& world, Fcwf& Vpsi, double& eps, double& small, double& thresh){ //necessary constants @@ -1131,7 +1169,8 @@ void DF::saveDF(World& world){ //Create archive and save the following: // 1) Total energy (double) - // 2) spinrestricted (boolean) + // 2) Krestricted (boolean) + // 3) closed_shell (boolean) // 3) number of occupied orbitals (int) // 4) orbital energies (vector of doubles) // 5) box size (double) @@ -1143,7 +1182,7 @@ void DF::saveDF(World& world){ archive::ParallelOutputArchive output(world, DFparams.savefile.c_str(), 1); //save simulation parameters and calculated properties - output & total_energy & Init_params.spinrestricted & Init_params.num_occupied & energies & Init_params.L & Init_params.order & Init_params.molecule; + output & total_energy & DFparams.Krestricted & closed_shell & Init_params.num_occupied & energies & Init_params.L & Init_params.order & Init_params.molecule; //Save orbitals //Loop over all occupied orbitals @@ -1400,9 +1439,6 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //A working FCWF that will have multiple uses Fcwf temp_function(world); - //A function to hold the charge density due to the occupied orbitals - real_function_3d rho = real_factory_3d(world); - //Boolean used in while loop. bool iterate_again = false; //Initialize to false = assume iterations will stop @@ -1410,17 +1446,21 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea diagonalize(world, V, op, Kpsis); //Diagonalization forces us to recompute density + real_function_3d rho = real_factory_3d(world); + double fac = (DFparams.Krestricted ? 2 : 1); if(closed_shell){ for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += 2*squaremod(occupieds[kk]); + rho += fac*squaremod(occupieds[kk]); } } else{ for(unsigned int kk = 0; kk < Init_params.num_occupied-1; kk++){ - rho += 2*squaremod(occupieds[kk]); + rho += fac*squaremod(occupieds[kk]); } - rho+= squaremod(occupieds[Init_params.num_occupied-1]); + rho += squaremod(occupieds[Init_params.num_occupied-1]); } + + //Apply coulomb operator to density and combine with V to get total potential JandV = V + apply(op,rho); JandV.truncate(); @@ -1534,14 +1574,14 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea rho = real_factory_3d(world); if(closed_shell){ for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += 2*squaremod(occupieds[kk]); + rho += fac*squaremod(occupieds[kk]); } } else{ for(unsigned int kk = 0; kk < Init_params.num_occupied-1; kk++){ - rho += 2*squaremod(occupieds[kk]); + rho += fac*squaremod(occupieds[kk]); } - rho+= squaremod(occupieds[Init_params.num_occupied-1]); + rho += squaremod(occupieds[Init_params.num_occupied-1]); } //Apply coulomb operator to density and combine with V to get total potential @@ -1575,12 +1615,12 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea //Compute kinetic energy contributions if(closed_shell){ for(unsigned int j = 0; j < Init_params.num_occupied; j++){ - kinetic_energy += 2*rele(world, occupieds[j]); + kinetic_energy += fac*rele(world, occupieds[j]); } } else{ for(unsigned int j = 0; j < Init_params.num_occupied-1; j++){ - kinetic_energy += 2*rele(world, occupieds[j]); + kinetic_energy += fac*rele(world, occupieds[j]); } kinetic_energy += rele(world, occupieds[Init_params.num_occupied-1]); } @@ -1600,18 +1640,23 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea nuclear_attraction_tensor += real(inner(world,occupieds2,mul(world,V,occupieds2))); nuclear_attraction_tensor += real(inner(world,occupieds3,mul(world,V,occupieds3)))*(1.0/(myc*myc)); nuclear_attraction_tensor += real(inner(world,occupieds4,mul(world,V,occupieds4)))*(1.0/(myc*myc)); - nuclear_attraction_energy = 2*nuclear_attraction_tensor.sum(); - if(!closed_shell) nuclear_attraction_energy -= nuclear_attraction_tensor(Init_params.num_occupied-1); + nuclear_attraction_energy = fac*nuclear_attraction_tensor.sum(); + if(!closed_shell and DFparams.Krestricted) nuclear_attraction_energy -= nuclear_attraction_tensor(Init_params.num_occupied-1); //Compute electron-electron repulsion energy contribution, again using vmra + //Regarding use of fac here: + // Normally, this sum runs over all *unique* pairs of orbitals + // Our sum runs over all pairs of orbitals, so we divide by 2. + // In the Kramers-restricted case, we multiply by 2 and this cancels. + // In the Kramers-restricted open-shell case, the doubling doesn't apply to the last orbital, so we subtract the excess coulomb_tensor = real(inner(world,occupieds1,mul(world,Jop,occupieds1))); coulomb_tensor += real(inner(world,occupieds2,mul(world,Jop,occupieds2))); coulomb_tensor += real(inner(world,occupieds3,mul(world,Jop,occupieds3)))*(1.0/(myc*myc)); coulomb_tensor += real(inner(world,occupieds4,mul(world,Jop,occupieds4)))*(1.0/(myc*myc)); - coulomb_energy = coulomb_tensor.sum();//*0.5; - if(!closed_shell) coulomb_energy -= 0.5*coulomb_tensor(Init_params.num_occupied-1); + coulomb_energy = coulomb_tensor.sum()*(fac/2.0); + if(!closed_shell and DFparams.Krestricted) coulomb_energy -= 0.5*coulomb_tensor(Init_params.num_occupied-1); - //Calculate Exchange energy contribution + //Calculate Exchange energy contribution, with some similar logic to the above std::vector Kpsis1(Init_params.num_occupied); std::vector Kpsis2(Init_params.num_occupied); std::vector Kpsis3(Init_params.num_occupied); @@ -1626,8 +1671,8 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea exchange_tensor += real(inner(world,occupieds2,Kpsis2)); exchange_tensor += real(inner(world,occupieds3,Kpsis3))*(1.0/(myc*myc)); exchange_tensor += real(inner(world,occupieds4,Kpsis4))*(1.0/(myc*myc)); - exchange_energy = exchange_tensor.sum();//*0.5; - if(!closed_shell) exchange_energy -= 0.5*exchange_tensor(Init_params.num_occupied-1); + exchange_energy = exchange_tensor.sum()*(fac/2.0); + if(!closed_shell and DFparams.Krestricted) exchange_energy -= 0.5*exchange_tensor(Init_params.num_occupied-1); //compute total energy using the above computed contributions total_energy = kinetic_energy + coulomb_energy - exchange_energy + nuclear_attraction_energy + nuclear_repulsion_energy; @@ -1715,8 +1760,15 @@ void DF::solve_occupied(World & world) { //State what we're doing here - if(closed_shell and world.rank()==0) print("\nSolving for ", Init_params.num_occupied, " doubly-occupied orbitals\n----------------------------\n"); - if((not closed_shell) and world.rank()==0) print("\nSolving for ", Init_params.num_occupied-1, " doubly-occupied, 1 singly-occupied orbitals\n---------------\n"); + if(world.rank()==0){ + if(DFparams.Krestricted){ + if(closed_shell) print("\nSolving for ", Init_params.num_occupied, " doubly-occupied orbitals\n------------------------------\n"); + else print("\nSolving for ", Init_params.num_occupied-1, " doubly-occupied, 1 singly-occupied orbitals\n------------------------------\n"); + } + else{ + print("\nSolving for ", Init_params.num_occupied, " single-occupied orbitals\n------------------------------\n"); + } + } //Will need a coulomb operator real_convolution_3d op = CoulombOperator(world,DFparams.small,DFparams.thresh); @@ -1757,16 +1809,17 @@ void DF::solve_occupied(World & world) if(world.rank()==0) print("\n***Calculating Initial Coulomb***"); start_timer(world); real_function_3d rho = real_factory_3d(world); + double fac = (DFparams.Krestricted ? 2 : 1); if(closed_shell){ for(unsigned int kk = 0; kk < Init_params.num_occupied; kk++){ - rho += 2*squaremod(occupieds[kk]); + rho += fac*squaremod(occupieds[kk]); } } else{ for(unsigned int kk = 0; kk < Init_params.num_occupied-1; kk++){ - rho += 2*squaremod(occupieds[kk]); + rho += fac*squaremod(occupieds[kk]); } - rho+= squaremod(occupieds[Init_params.num_occupied-1]); + rho += squaremod(occupieds[Init_params.num_occupied-1]); } real_function_3d JandV = Vnuc + apply(op,rho); JandV.truncate(); @@ -1868,6 +1921,8 @@ void DF::solve(World& world){ } +//Print the number of coefficients being used by each orbital. +//This has been useful in the past for debugging void DF::print_sizes(World& world, bool individual=false){ if(world.rank()==0) print("\nPrinting orbital sizes:\n"); int n = Init_params.num_occupied; diff --git a/src/apps/dirac/DFParameters.h b/src/apps/dirac/DFParameters.h index 07ddf2160a9..45225700ffb 100644 --- a/src/apps/dirac/DFParameters.h +++ b/src/apps/dirac/DFParameters.h @@ -41,6 +41,7 @@ namespace madness { bool no_compute; ///< If true, will skip all computation double bohr_rad; ///< bohr radius in fm (default: 52917.7211) int min_iter; ///< minimum number of iterations (default: 2) + bool Krestricted; ///< Calculation should be performed in Kramers-restricted manner (default: false) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // If you add something here, don't forget to add it to serializable! @@ -49,7 +50,7 @@ namespace madness { template void serialize(Archive& ar){ - ar & archive & job & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot & no_compute & bohr_rad & min_iter; + ar & archive & job & max_iter & small & thresh & k & kain & maxsub & maxrotn & restart & nucleus & do_save & savefile & lb_iter & nwchem & lineplot & no_compute & bohr_rad & min_iter & Krestricted; } // Default constructor @@ -72,6 +73,7 @@ namespace madness { , no_compute(false) , bohr_rad(52917.7211) , min_iter(2) + , Krestricted(false) {} // Initializes DFParameters using the contents of file \c filename @@ -146,6 +148,9 @@ namespace madness { else if (s == "min_iter"){ f >> min_iter; } + else if (s == "Krestricted"){ + Krestricted = true; + } else{ std::cout << "Dirac Fock: unrecognized input keyword " << s << std::endl; MADNESS_EXCEPTION("input error", 0); @@ -173,6 +178,7 @@ namespace madness { else{ madness::print(" Nucleus: gaussian"); } + madness::print(" Kramers restriction:", Krestricted); madness::print(" Do Lineplots:", lineplot); } }; diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index ca5862eb435..cb132aa966d 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -21,6 +21,7 @@ namespace madness{ std::string inFile; ///< Name of input archive to read in double Init_total_energy; ///< Total energy of the nonrelativistic ground state bool spinrestricted; ///< Indicates if input calc. was spin-restricted + bool closed_shell; unsigned int num_occupied; ///< Number of orbitals Tensor energies; ///< Energies of input orbitals Tensor occ; ///< Occupancy of input orbitals @@ -33,7 +34,7 @@ namespace madness{ InitParameters() {} // Initializes InitParameters using the contents of file \c filename - void read(World& world, const std::string& filename, bool restart){ + void read(World& world, const std::string& filename, bool restart, bool Krestricted){ // Save the filename inFile = filename; @@ -43,12 +44,17 @@ namespace madness{ archive::ParallelInputArchive input(world, filename.c_str()); input & Init_total_energy; input & spinrestricted; + input & closed_shell; input & num_occupied; input & energies; input & L; input & order; input & molecule; + //Code breaks if spinrestricted (state of archive) and Krestricted (requested by user) don't match + //This functionality could probably be added at some point, but it's a bit of work + MADNESS_CHECK(spinrestricted != Krestricted); + // Set this so we can read in whats // written in the archive FunctionDefaults<3>::set_k(order); @@ -74,13 +80,16 @@ namespace madness{ input & Init_total_energy; // double input & spinrestricted; // bool input & num_occupied; // int - input & energies; // Tensor orbital energies + input & temp_energies; // Tensor orbital energies input & occ; // Tensor orbital occupations input & dummy2; // std::vector sets of orbitals(?) input & L; // double box size input & order; // int wavelet order input & molecule; // Molecule + //For now assume spin-restricted means closed shell in moldft + closed_shell = spinrestricted; + // Check that order is positive and less than 30 if (order < 1 or order > 30){ if(world.rank() == 0) print("\n ***PLEASE NOTE***\n Invalid wavelet order read from archive, setting to 8.\n This seems to happen when the default wavelet order is used in moldft."); @@ -99,49 +108,80 @@ namespace madness{ double myc = 137.0359895; //speed of light in atomic units std::complex myi(0,1); if(spinrestricted){ - //If the calculation was spin-restricted, then we only have "spin-up" orbitals + //If the calculation was spin-restricted in moldft, then we only have "spin-up" orbitals //Initialize some functions for reading in the orbitals real_function_3d reader; complex_function_3d complexreader; Fcwf spinup(world); - //Fcwf spindown(world); + Fcwf spindown(world); //used if !Krestricted real_function_3d xfunc = real_factory_3d(world).f(myxfunc); real_function_3d yfunc = real_factory_3d(world).f(myyfunc); + + //Handle Kramers-restricted and unrestricted cases differently + if(Krestricted){ + //Loop over the occupied orbitals and convert + for(unsigned int i = 0; i < num_occupied; i++){ + //read in orbital + input & reader; + + //change to a complex function + complexreader = function_real2complex(reader); + + //build up the corresponding fcwfs, using kinetic balance to define the small component + spinup[0] = complexreader; + spinup[1] = complex_factory_3d(world); + spinup[2] = (-myi) * Dz(complexreader); + spinup[2].scale(0.5); + spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); + spinup[3].scale(0.5); + spinup.normalize(); + orbitals.push_back(spinup); + } - //Loop over the occupied orbitals and convert - for(unsigned int i = 0; i < num_occupied; i++){ - //read in orbital - input & reader; - - //change to a complex function - complexreader = function_real2complex(reader); - - //build up the corresponding fcwf, using kinetic balance to define the small component - spinup[0] = complexreader; - spinup[1] = complex_factory_3d(world); - spinup[2] = (-myi) * Dz(complexreader); - spinup[2].scale(0.5); - spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); - spinup[3].scale(0.5); - spinup.normalize(); - //spindown[0] = complex_factory_3d(world); - //spindown[1] = complexreader; - //spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); - //spindown[2].scale(0.5); - //spindown[3] = (myi) * Dz(complexreader); - //spindown[3].scale(0.5); - //spindown.normalize(); - orbitals.push_back(spinup); - //orbitals.push_back(spindown); + //Update energies + energies = temp_energies; } + else{ + //Loop over the occupied orbitals and convert + for(unsigned int i = 0; i < num_occupied; i++){ + //read in orbital + input & reader; + + //change to a complex function + complexreader = function_real2complex(reader); + + //build up the corresponding fcwfs, using kinetic balance to define the small component + spinup[0] = complexreader; + spinup[1] = complex_factory_3d(world); + spinup[2] = (-myi) * Dz(complexreader); + spinup[2].scale(0.5); + spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); + spinup[3].scale(0.5); + spinup.normalize(); + spindown[0] = complex_factory_3d(world); + spindown[1] = complexreader; + spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); + spindown[2].scale(0.5); + spindown[3] = (myi) * Dz(complexreader); + spindown[3].scale(0.5); + spindown.normalize(); + orbitals.push_back(spinup); + orbitals.push_back(spindown); + } - ////correct the number of orbitals - //num_occupied *= 2; + //Double length of energies tensor and fill in as needed. + energies = Tensor(2*num_occupied); + for(unsigned int i = 0; i < num_occupied; i++){ + energies[2*i] = temp_energies[i]; + energies[2*i+1] = temp_energies[i]; + } + num_occupied *= 2; + } } else{ - if(world.rank()==0) print("number of alpha read in is:" ,num_occupied); + if(world.rank()==0) print("number of alpha read in from moldft is:" ,num_occupied); // Read in alpha ground state orbitals real_function_3d reader; @@ -160,46 +200,53 @@ namespace madness{ orbitals.push_back(fcwfreader); } - //// Read in beta quantities - //unsigned int num_betas; - //input & num_betas; - - //Tensor beta_energies; - //input & beta_energies; - - //Tensor dummy3; - //input & dummy3; - - //std::vector dummy4; - //input & dummy4; - - ////read in beta ground state orbitals - //for(unsigned int i = 0; i < num_betas; i++){ - // input & reader; - // complexreader = function_real2complex(reader); - // fcwfreader[0] = complex_factory_3d(world); - // fcwfreader[1] = complexreader; - // fcwfreader[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); - // fcwfreader[2].scale(0.5); - // fcwfreader[3] = (myi) * Dz(complexreader); - // fcwfreader[3].scale(0.5); - // fcwfreader.normalize(); - // orbitals.push_back(fcwfreader); - //} - - ////fix up energies tensor and num_occupied - //energies = Tensor(num_occupied + num_betas); - //double csquared = 137.0359895*137.0359895; - //for(unsigned int i = 0; i < num_occupied; i++){ - // energies(i) = temp_energies(i);// + csquared; - //} - //for(unsigned int i = 0; i < num_betas; i++){ - // energies(num_occupied + i) = beta_energies(i);// + csquared; - //} - //num_occupied += num_betas; + if(!Krestricted){ + // Read in beta quantities + unsigned int num_betas; + input & num_betas; + + Tensor beta_energies; + input & beta_energies; + + Tensor dummy3; + input & dummy3; + + std::vector dummy4; + input & dummy4; + + //read in beta ground state orbitals + for(unsigned int i = 0; i < num_betas; i++){ + input & reader; + complexreader = function_real2complex(reader); + fcwfreader[0] = complex_factory_3d(world); + fcwfreader[1] = complexreader; + fcwfreader[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); + fcwfreader[2].scale(0.5); + fcwfreader[3] = (myi) * Dz(complexreader); + fcwfreader[3].scale(0.5); + fcwfreader.normalize(); + orbitals.push_back(fcwfreader); + } - } + //Handle energy tensor and number of occupied orbitals + energies = Tensor(num_occupied + num_betas); + for(unsigned int i = 0; i < num_occupied; i++){ + energies(i) = temp_energies(i); + } + for(unsigned int i = 0; i < num_betas; i++){ + energies(num_occupied + i) = beta_energies(i); + } + num_occupied += num_betas; + } + else{ + energies = temp_energies; + } + + + + } + //reorder orbitals and energies in ascending order, if necessary. double tempdouble; Fcwf fcwfreader(world); @@ -216,12 +263,10 @@ namespace madness{ } } } - - } } - //This function no longer works, because the code only perform Kramers-restricted calculations! + //This function no longer works //TODO: Update this function before using it //void readnw(World& world, const std::string& filename){ // //Called to read in initial parameters from an nwchem output file From 671d219ffdea32286996ae6e605d8af7cfbb9441 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 17 Feb 2020 10:45:04 -0500 Subject: [PATCH 0064/1312] saving progress on fixing nwchem implementation. tests pending. --- src/apps/dirac/DF.cc | 3 +- src/apps/dirac/InitParameters.h | 366 ++++++++++++++------------------ 2 files changed, 156 insertions(+), 213 deletions(-) diff --git a/src/apps/dirac/DF.cc b/src/apps/dirac/DF.cc index 099461a6a1b..1df0cb6761b 100644 --- a/src/apps/dirac/DF.cc +++ b/src/apps/dirac/DF.cc @@ -410,8 +410,7 @@ DF::DF(World & world,std::shared_ptr input) { // Read in archive, but first find out if we're reading an nwchem file or other archive if(DFparams.nwchem){ - throw; //The nwchem input reading needs to be redone - //Init_params.readnw(world, DFparams.archive); + Init_params.readnw(world, DFparams.archive, DFparams.Krestricted); } else{ Init_params.read(world, DFparams.archive, DFparams.restart, DFparams.Krestricted); diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index cb132aa966d..403cbcb05c5 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -268,217 +268,161 @@ namespace madness{ //This function no longer works //TODO: Update this function before using it - //void readnw(World& world, const std::string& filename){ - // //Called to read in initial parameters from an nwchem output file - // - // //For now just use default values for L and order - // order = 6; - // L = 50.0; - // FunctionDefaults<3>::set_k(order); - // FunctionDefaults<3>::set_cubic_cell(-L, L); - - // //Need to set this to something... - // Init_total_energy = 0.0; - // - // //Construct interface object from slymer namespace - // slymer::NWChem_Interface nwchem(filename,std::cout); - - // //For parallel runs, silencing all but 1 slymer instance - // if(world.rank() != 0) { - // std::ostream dev_null(nullptr); - // nwchem.err = dev_null; - // } - - // //Read in basis set - // nwchem.read(slymer::Properties::Basis); - - // //Read in the molecular orbital coefficients, energies, and occupancies - // nwchem.read(slymer::Properties::Energies | slymer::Properties::MOs | slymer::Properties::Occupancies); - - // //Need to construct a molecule object by ourselves - // molecule = Molecule(); - // unsigned int anum; - // double x,y,z,q; - // for(unsigned int i=0; i < nwchem.atoms.size(); i++){ - // anum = symbol_to_atomic_number(nwchem.atoms[i].symbol); - // q = anum*1.0; - // x = nwchem.atoms[i].position[0]; - // y = nwchem.atoms[i].position[1]; - // z = nwchem.atoms[i].position[2]; - // molecule.add_atom(x,y,z,q,anum); - // } - - // //Find out how many orbitals we're dealing with by looking at the occupancies - // unsigned int numalpha(0), numbeta(0); - // num_virtuals = 0; - - // bool have_beta(false); - // for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ - // if(nwchem.beta_occupancies[i] > 0.0) have_beta = true; - // } - // - // if(have_beta){ - // //we're reading from an open-shell calculation - // for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ - // (nwchem.occupancies[i] == 1.0) ? numalpha+=1 : num_virtuals+=1; - // } - // for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ - // (nwchem.beta_occupancies[i] == 1.0) ? numbeta+=1 : num_virtuals+=1; - // } - // } - // else{ - // for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ - // (nwchem.occupancies[i] == 2.0) ? numalpha += 1 : num_virtuals += 2; - // } - // numbeta = numalpha; - // } - // num_occupied = numalpha+numbeta; - - // //Let's print everything so we have a visual check on what we're working with (for now) - // if(world.rank()==0) print("\nalpha occupancies:\n",nwchem.occupancies); - // if(world.rank()==0) print("\nbeta occupancies:\n",nwchem.beta_occupancies); - // if(world.rank()==0) print("\nenergies:\n",nwchem.energies); - // if(world.rank()==0) print("\nbeta energies:\n",nwchem.beta_energies); - // if(world.rank()==0) print("num alpha",numalpha); - // if(world.rank()==0) print("num beta",numbeta); - // if(world.rank()==0) print("num virtuals",num_virtuals); - - - // //Now that we know how many orbitals we have. initialize energy tensors - // energies = Tensor(num_occupied); - // v_energies = Tensor(num_virtuals); - - // //Cast the 'basis set' into a Gaussian basis and iterate over it - // vector_real_function_3d temp1; - // int ii = 0; - // for(auto basis : slymer::cast_basis(nwchem.basis_set)) { - // //Get the center of gaussian as its special point - // std::vector centers; - // coord_3d r; - // r[0] = basis.get().center[0]; r[1] = basis.get().center[1]; r[2] = basis.get().center[2]; - // centers.push_back(r); - - // //Now make the function - // temp1.push_back(FunctionFactory(world).functor(std::shared_ptr>(new slymer::Gaussian_Functor(basis.get(), centers)))); - // double norm2 = temp1[ii].norm2(); - // if(world.rank() == 0) print("function", ii, "has norm", norm2); - // ii++; - // } - - // //Normalize aos - // normalize(world, temp1); - - // //Transform aos now to get alpha mos - // vector_real_function_3d temp = transform(world, temp1, nwchem.MOs , true); - - // //Keep track of how many energies i've stored - // int energy_index = 0; - // int v_energy_index = 0; - - // //nonrelativistic energies need to be adjusted for relativistic calculations - // double csquared = 137.0359895*137.0359895; - - // //Convert and store alpha occupied MOs and virtuals. If closed shell, do betas too. - // complex_function_3d complexreader(world); - // Fcwf fcwfreader(world); - // for(unsigned int i = 0; i < temp.size(); i++){ - // complexreader = function_real2complex(temp[i]); - // fcwfreader = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); - // if(have_beta){ - // if(nwchem.occupancies[i] == 1.0){ - // orbitals.push_back(fcwfreader); - // energies[energy_index] = nwchem.energies[i] + csquared; - // energy_index++; - // } - // else{ - // virtuals.push_back(fcwfreader); - // v_energies[v_energy_index] = nwchem.energies[i] + csquared; - // v_energy_index++; - // } - - // } - // else{ - // if(nwchem.occupancies[i] == 2.0){ - // orbitals.push_back(fcwfreader); - // energies[energy_index] = nwchem.energies[i] + csquared; - // energy_index++; - // fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); - // orbitals.push_back(fcwfreader); - // energies[energy_index] = nwchem.energies[i] + csquared; - // energy_index++; - - // } - // else{ - // virtuals.push_back(fcwfreader); - // v_energies[v_energy_index] = nwchem.energies[i] + csquared; - // v_energy_index++; - // fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); - // virtuals.push_back(fcwfreader); - // v_energies[v_energy_index] = nwchem.energies[i] + csquared; - // v_energy_index++; - // } - // } - // } - - - // //If we're doing an open shell calculation we need to read in the beta orbitals explicitly - // if(have_beta){ - // //Transform aos again to get beta mos - // temp = transform(world, temp1, nwchem.beta_MOs, true); - - // //Convert and store beta occupied MOs and virtuals - // for(unsigned int i = 0; i < temp.size(); i++){ - // complexreader = function_real2complex(temp[i]); - // fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); - // if(nwchem.beta_occupancies[i] == 1.0){ - // orbitals.push_back(fcwfreader); - // energies[energy_index] = nwchem.beta_energies[i] + csquared; - // energy_index++; - // } - // else{ - // virtuals.push_back(fcwfreader); - // v_energies[v_energy_index] = nwchem.beta_energies[i] + csquared; - // v_energy_index++; - // } - // } - // } - // - // //Assure that the numbers line up - // MADNESS_ASSERT(num_occupied == orbitals.size()); - // MADNESS_ASSERT(num_virtuals == virtuals.size()); - - // //Need to sort - // double tempdouble; - // //Sort occupied - // for(unsigned int i = 0; i < num_occupied; i++){ - // for(unsigned int j = i+1; j < num_occupied; j++){ - // if(energies(j) < energies(i)){ - // if(world.rank()==0) print("swapping orbitals", i, " and ", j); - // tempdouble = energies(j); - // energies(j) = energies(i); - // energies(i) = tempdouble; - // fcwfreader = orbitals[j]; - // orbitals[j] = orbitals[i]; - // orbitals[i] = fcwfreader; - // } - // } - // } - // //sort virtual - // for(unsigned int i = 0; i < num_virtuals; i++){ - // for(unsigned int j = i+1; j < num_virtuals; j++){ - // if(v_energies(j) < v_energies(i)){ - // if(world.rank()==0) print("swapping virtuals", i, " and ", j); - // tempdouble = v_energies(j); - // v_energies(j) = v_energies(i); - // v_energies(i) = tempdouble; - // fcwfreader = virtuals[j]; - // virtuals[j] = virtuals[i]; - // virtuals[i] = fcwfreader; - // } - // } - // } - - //} + void readnw(World& world, const std::string& filename, bool Krestricted){ + //Called to read in initial parameters from an nwchem output file + + //For now just use default values for L and order + order = 6; + L = 50.0; + FunctionDefaults<3>::set_k(order); + FunctionDefaults<3>::set_cubic_cell(-L, L); + + //Need to set this to something... + Init_total_energy = 0.0; + + //Construct interface object from slymer namespace + slymer::NWChem_Interface nwchem(filename,std::cout); + + //For parallel runs, silencing all but 1 slymer instance + if(world.rank() != 0) { + std::ostream dev_null(nullptr); + nwchem.err = dev_null; + } + + //Read in basis set + nwchem.read(slymer::Properties::Basis); + + //Read in the molecular orbital coefficients, energies, and occupancies + nwchem.read(slymer::Properties::Energies | slymer::Properties::MOs | slymer::Properties::Occupancies); + + //Need to construct a molecule object by ourselves + molecule = Molecule(); + unsigned int anum; + double x,y,z,q; + for(unsigned int i=0; i < nwchem.atoms.size(); i++){ + anum = symbol_to_atomic_number(nwchem.atoms[i].symbol); + q = anum*1.0; + x = nwchem.atoms[i].position[0]; + y = nwchem.atoms[i].position[1]; + z = nwchem.atoms[i].position[2]; + molecule.add_atom(x,y,z,q,anum); + } + + //Find out how many orbitals we're dealing with by looking at the occupancies + unsigned int numalpha(0), numbeta(0); + num_virtuals = 0; + + bool have_beta(false); + for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ + if(nwchem.beta_occupancies[i] > 0.0) have_beta = true; + } + + if(have_beta){ + //we're reading from an unrestricted calculation + //and for now we will assume this is an open shell calculation + for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ + (nwchem.occupancies[i] == 1.0) ? numalpha+=1 : num_virtuals+=1; + } + for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ + (nwchem.beta_occupancies[i] == 1.0) ? numbeta+=1 : num_virtuals+=1; + } + + //Right now DF can only handle a single unpaired electron + MADNESS_CHECK(numalpha-1 == numbeta); + } + else{ + for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ + (nwchem.occupancies[i] == 2.0) ? numalpha += 1 : num_virtuals += 2; + } + numbeta = numalpha; + } + closed_shell = !have_beta; + + //correctly set the number of occupied orbitals for the DF calculation + if(Krestricted){ + num_occupied = numalpha; + } + else{ + num_occupied = numalpha+numbeta; + } + + + //Let's print everything so we have a visual check on what we're working with (for now) + if(world.rank()==0) print("\nalpha occupancies:\n",nwchem.occupancies); + if(world.rank()==0) print("\nbeta occupancies:\n",nwchem.beta_occupancies); + if(world.rank()==0) print("\nenergies:\n",nwchem.energies); + if(world.rank()==0) print("\nbeta energies:\n",nwchem.beta_energies); + if(world.rank()==0) print("num alpha",numalpha); + if(world.rank()==0) print("num beta",numbeta); + if(world.rank()==0) print("num virtuals",num_virtuals); + + + //Now that we know how many orbitals we have. initialize and fill energy tensor + energies = Tensor(num_occupied); + if(Krestricted){ + for(unsigned int i=0; i < nwchem.energies.size(); i++){ + energies[i] = nwchem.energies[i]; + } + } + else{ + if(closed_shell){ + for(unsigned int i=0; i < nwchem.energies.size(); i++){ + energies[2*i] = nwchem.energies[i]; + energies[2*i+1] = nwchem.energies[i]; + } + } + else{ + for(unsigned int i=0; i < nwchem.energies.size()-1; i++){ + energies[2*i] = nwchem.energies[i]; + energies[2*i+1] = nwchem.energies[i]; + } + energies[2*(nwchem.energies.size()-1] = nwchem.energies[nwchem.energies.size()-1]; + } + } + + //Cast the 'basis set' into a Gaussian basis and iterate over it + vector_real_function_3d temp1; + int ii = 0; + for(auto basis : slymer::cast_basis(nwchem.basis_set)) { + //Get the center of gaussian as its special point + std::vector centers; + coord_3d r; + r[0] = basis.get().center[0]; r[1] = basis.get().center[1]; r[2] = basis.get().center[2]; + centers.push_back(r); + + //Now make the function + temp1.push_back(FunctionFactory(world).functor(std::shared_ptr>(new slymer::Gaussian_Functor(basis.get(), centers)))); + double norm2 = temp1[ii].norm2(); + if(world.rank() == 0) print("function", ii, "has norm", norm2); + ii++; + } + + //Normalize aos + normalize(world, temp1); + + //Transform aos now to get alpha mos + vector_real_function_3d temp = transform(world, temp1, nwchem.MOs , true); + + //Convert and store alpha occupied MOs. + complex_function_3d complexreader(world); + Fcwf fcwfreader(world); + for(unsigned int i = 0; i < temp.size()-1; i++){ + complexreader = function_real2complex(temp[i]); + fcwfreader = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + orbitals.push_back(fcwfreader); + if(!Krestricted){ + fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); + orbitals.push_back(fcwfreader); + } + } + complexreader = function_real2complex(temp[temp.size()i-1]); + fcwfreader = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); + orbitals.push_back(fcwfreader); + + //Assure that the numbers line up + MADNESS_ASSERT(num_occupied == orbitals.size()); + + } // Prints all information void print_params() const From cd6124fc1a92491e3668f9c566ad277716459a31 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 17 Feb 2020 13:25:40 -0500 Subject: [PATCH 0065/1312] debugged nwchem interface --- src/apps/dirac/InitParameters.h | 67 ++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index 403cbcb05c5..74893a18ab2 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -310,7 +310,6 @@ namespace madness{ //Find out how many orbitals we're dealing with by looking at the occupancies unsigned int numalpha(0), numbeta(0); - num_virtuals = 0; bool have_beta(false); for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ @@ -321,10 +320,10 @@ namespace madness{ //we're reading from an unrestricted calculation //and for now we will assume this is an open shell calculation for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ - (nwchem.occupancies[i] == 1.0) ? numalpha+=1 : num_virtuals+=1; + if(nwchem.occupancies[i] == 1.0) numalpha+=1; } for(unsigned int i = 0; i < nwchem.beta_occupancies.size(); i++){ - (nwchem.beta_occupancies[i] == 1.0) ? numbeta+=1 : num_virtuals+=1; + if(nwchem.beta_occupancies[i] == 1.0) numbeta+=1; } //Right now DF can only handle a single unpaired electron @@ -332,7 +331,7 @@ namespace madness{ } else{ for(unsigned int i = 0; i < nwchem.occupancies.size(); i++){ - (nwchem.occupancies[i] == 2.0) ? numalpha += 1 : num_virtuals += 2; + if(nwchem.occupancies[i] == 2.0) numalpha += 1; } numbeta = numalpha; } @@ -354,29 +353,28 @@ namespace madness{ if(world.rank()==0) print("\nbeta energies:\n",nwchem.beta_energies); if(world.rank()==0) print("num alpha",numalpha); if(world.rank()==0) print("num beta",numbeta); - if(world.rank()==0) print("num virtuals",num_virtuals); //Now that we know how many orbitals we have. initialize and fill energy tensor energies = Tensor(num_occupied); if(Krestricted){ - for(unsigned int i=0; i < nwchem.energies.size(); i++){ + for(unsigned int i=0; i < numalpha; i++){ energies[i] = nwchem.energies[i]; } } else{ if(closed_shell){ - for(unsigned int i=0; i < nwchem.energies.size(); i++){ + for(unsigned int i=0; i < numalpha; i++){ energies[2*i] = nwchem.energies[i]; energies[2*i+1] = nwchem.energies[i]; } } else{ - for(unsigned int i=0; i < nwchem.energies.size()-1; i++){ + for(unsigned int i=0; i < numalpha-1; i++){ energies[2*i] = nwchem.energies[i]; energies[2*i+1] = nwchem.energies[i]; } - energies[2*(nwchem.energies.size()-1] = nwchem.energies[nwchem.energies.size()-1]; + energies[2*(numalpha-1)] = nwchem.energies[numalpha-1]; } } @@ -405,19 +403,52 @@ namespace madness{ //Convert and store alpha occupied MOs. complex_function_3d complexreader(world); - Fcwf fcwfreader(world); - for(unsigned int i = 0; i < temp.size()-1; i++){ + Fcwf spinup(world); + Fcwf spindown(world); + complex_derivative_3d Dx(world,0); + complex_derivative_3d Dy(world,1); + complex_derivative_3d Dz(world,2); + std::complex myi(0,1); + for(unsigned int i = 0; i < numalpha-1; i++){ complexreader = function_real2complex(temp[i]); - fcwfreader = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); - orbitals.push_back(fcwfreader); + spinup[0] = complexreader; + spinup[1] = complex_factory_3d(world); + spinup[2] = (-myi) * Dz(complexreader); + spinup[2].scale(0.5); + spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); + spinup[3].scale(0.5); + spinup.normalize(); + orbitals.push_back(spinup); if(!Krestricted){ - fcwfreader = Fcwf(complex_factory_3d(world), complexreader, complex_factory_3d(world), complex_factory_3d(world)); - orbitals.push_back(fcwfreader); + spindown[0] = complex_factory_3d(world); + spindown[1] = complexreader; + spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); + spindown[2].scale(0.5); + spindown[3] = (myi) * Dz(complexreader); + spindown[3].scale(0.5); + spindown.normalize(); + orbitals.push_back(spindown); } } - complexreader = function_real2complex(temp[temp.size()i-1]); - fcwfreader = Fcwf(complexreader, complex_factory_3d(world), complex_factory_3d(world), complex_factory_3d(world)); - orbitals.push_back(fcwfreader); + complexreader = function_real2complex(temp[numalpha-1]); + spinup[0] = complexreader; + spinup[1] = complex_factory_3d(world); + spinup[2] = (-myi) * Dz(complexreader); + spinup[2].scale(0.5); + spinup[3] = (-myi) * (Dx(complexreader) + myi * Dy(complexreader)); + spinup[3].scale(0.5); + spinup.normalize(); + orbitals.push_back(spinup); + if(closed_shell and not Krestricted){ + spindown[0] = complex_factory_3d(world); + spindown[1] = complexreader; + spindown[2] = (-myi) * (Dx(complexreader) - myi * Dy(complexreader)); + spindown[2].scale(0.5); + spindown[3] = (myi) * Dz(complexreader); + spindown[3].scale(0.5); + spindown.normalize(); + orbitals.push_back(spindown); + } //Assure that the numbers line up MADNESS_ASSERT(num_occupied == orbitals.size()); From b041b2a0024161d1d4402a8c6ba1e191fb592d42 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Fri, 28 Feb 2020 15:54:51 -0500 Subject: [PATCH 0066/1312] convert integrals from pnos --- src/apps/pno/CMakeLists.txt | 4 +- src/apps/pno/compute_integrals.h | 117 +++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/apps/pno/compute_integrals.h diff --git a/src/apps/pno/CMakeLists.txt b/src/apps/pno/CMakeLists.txt index 19febdc1b26..6f43cb513f4 100644 --- a/src/apps/pno/CMakeLists.txt +++ b/src/apps/pno/CMakeLists.txt @@ -2,5 +2,7 @@ add_executable(pno pno.cpp) target_link_libraries(pno MADchem ${DISABLEPIE_LINKER_FLAG}) +add_executable(make_canonical_integrals make_canonical_integrals.cpp) +target_link_libraries(make_canonical_integrals MADchem ${DISABLEPIE_LINKER_FLAG}) -install(TARGETS pno DESTINATION "${MADNESS_INSTALL_BINDIR}") \ No newline at end of file +install(TARGETS pno DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/pno/compute_integrals.h b/src/apps/pno/compute_integrals.h new file mode 100644 index 00000000000..36a8bd9dda6 --- /dev/null +++ b/src/apps/pno/compute_integrals.h @@ -0,0 +1,117 @@ +/* + * compute_integrals.h + * + * Created on: Feb. 28, 2020 + * Author: jsk + */ + + + + +//#define WORLD_INSTANTIATE_STATIC_TEMPLATES +#include +#include +#include +#include + +using namespace madness; + +// DEFINE PARAMETER TAGS FOR THE INPUT FILE +const std::string TAG_PNO = "pno"; +const std::string TAG_F12 = "f12"; +const std::string TAG_CP = "computeprotocol"; + + +int main(int argc, char** argv) { + initialize(argc, argv); + World world(SafeMPI::COMM_WORLD); + if (world.rank() == 0) printf("starting at time %.1f\n", wall_time()); + const double time_start = wall_time(); + std::cout.precision(6); + + startup(world,argc,argv,true); + print_meminfo(world.rank(), "startup"); + + if(world.rank()==0){ + std::cout << "\n\n"; + std::cout << "-------------------------------------------------------------------------------------\n"; + std::cout << "SOLVING MRA-PNO-F12 as described in \n"; + std::cout << "J.S. Kottmann, F.A. Bischoff, E.F. Valeev\n"; + std::cout << "Direct determination of optimal pair-natural orbitals in a real-space representation:\n"; + std::cout << "the second-order Møller-Plesset energy\n"; + std::cout << "Journal of Chemical Physics ... 2019\n"; + std::cout << "-------------------------------------------------------------------------------------\n"; + std::cout << "\n\n"; + } + + // Get the name of the input file (if given) + const std::string input = (argc > 1) ? argv[1] : "input"; + + // Compute the SCF Reference + const double time_scf_start = wall_time(); + std::shared_ptr calc(new SCF(world, input)); + Nemo nemo(world, calc, input); + nemo.get_calc()->param.print(); + const double scf_energy = nemo.value(); + if (world.rank() == 0) print("nemo energy: ", scf_energy); + if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); + const double time_scf_end = wall_time(); + + // Compute MRA-PNO-MP2-F12 + const double time_pno_start = wall_time(); + PNOParameters parameters(world,input,nemo.get_calc()->molecule,TAG_PNO); + F12Parameters paramf12(world, input, parameters, TAG_F12); + PNO pno(world, nemo, parameters, paramf12); + std::vector all_pairs; + pno.solve(all_pairs); + const double time_pno_end = wall_time(); + + + if(world.rank()==0){ + std::cout << std::setfill(' '); + std::cout << "\n\n\n"; + std::cout << "--------------------------------------------------\n"; + std::cout << "MRA-PNO-MP2-F12 ended \n"; + std::cout << "--------------------------------------------------\n"; + std::cout << std::setw(25) << "time scf" << " = " << time_scf_end - time_scf_start << "\n"; + std::cout << std::setw(25) << "energy scf" << " = " << scf_energy << "\n"; + std::cout << "--------------------------------------------------\n"; + } + double mp2_energy = 0.0; + PNOPairs mp2_data; + std::cout<< std::setw(25) << "time pno" << " = " << time_pno_end - time_pno_start << "\n"; + for(const auto& pairs: all_pairs){ + if(pairs.type == MP2_PAIRTYPE){ + mp2_energy = pairs.energies.total_energy(); + mp2_data = pairs; + } + std::pair ranks= pno.get_average_rank(pairs.pno_ij); + if(world.rank()==0){ + std::string name; + std::stringstream ss; + ss << pairs.type; + ss >> name; + std::cout<< std::setw(25) << "energy "+name << " = " << pairs.energies.total_energy() << "\n"; + std::cout<< std::setw(25) << "average pno rank " + name << " = " << ranks.first << "\n"; + std::cout<< std::setw(25) << "max pno rank " + name << " = " << ranks.second << "\n"; + } + } + if(world.rank()==0 and mp2_energy != 0.0){ + std::cout << "--------------------------------------------------\n"; + std::cout<< std::setw(25) << "energy(total)" << " = " << scf_energy + mp2_energy << "\n"; + std::cout << "--------------------------------------------------\n"; + std::cout << "\n\n\n"; + } + + + // compute integrals and dump + + + + + world.gop.fence(); + if (world.rank() == 0) printf("finished at time %.1f\n", wall_time()); + print_stats(world); + finalize(); + return 0; +} From 23035718a8b387a4298de848d42eb44d865b71a0 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Mon, 2 Mar 2020 11:47:06 -0500 Subject: [PATCH 0067/1312] added pno integrals --- src/apps/pno/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/pno/CMakeLists.txt b/src/apps/pno/CMakeLists.txt index 6f43cb513f4..e79487c090e 100644 --- a/src/apps/pno/CMakeLists.txt +++ b/src/apps/pno/CMakeLists.txt @@ -2,7 +2,7 @@ add_executable(pno pno.cpp) target_link_libraries(pno MADchem ${DISABLEPIE_LINKER_FLAG}) -add_executable(make_canonical_integrals make_canonical_integrals.cpp) -target_link_libraries(make_canonical_integrals MADchem ${DISABLEPIE_LINKER_FLAG}) +add_executable(pno_integrals pno_integrals.cpp) +target_link_libraries(pno_integrals MADchem ${DISABLEPIE_LINKER_FLAG}) install(TARGETS pno DESTINATION "${MADNESS_INSTALL_BINDIR}") From 130d15071609535a285a5fbac30beb2197d2f5d5 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Tue, 3 Mar 2020 15:10:45 -0500 Subject: [PATCH 0068/1312] added pno-integrals --- src/apps/pno/pno_integrals.cpp | 279 +++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 src/apps/pno/pno_integrals.cpp diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp new file mode 100644 index 00000000000..28cd96089db --- /dev/null +++ b/src/apps/pno/pno_integrals.cpp @@ -0,0 +1,279 @@ +/* + * pno_integrals.hpp + * + * Created on: Feb. 28, 2020 + * Author: jsk + + + CURRENTLY TO PLAY AROUND + A LOT IS HARDCODED FOR H2 + SO BE CAREFUL WITH DIFFERENT INPUTS + + + */ + + +//#define WORLD_INSTANTIATE_STATIC_TEMPLATES +#include +#include +#include +#include +#include + +using namespace madness; + +// DEFINE PARAMETER TAGS FOR THE INPUT FILE +const std::string TAG_PNO = "pno"; +const std::string TAG_F12 = "f12"; +const std::string TAG_CP = "computeprotocol"; + +#include "NumCpp.hpp" + + +int main(int argc, char** argv) { + madness::initialize(argc, argv); + World world(SafeMPI::COMM_WORLD); + if (world.rank() == 0) printf("starting at time %.1f\n", wall_time()); + const double time_start = wall_time(); + std::cout.precision(6); + + startup(world,argc,argv,true); + print_meminfo(world.rank(), "startup"); + + if(world.rank()==0){ + std::cout << "\n\n"; + std::cout << "-------------------------------------------------------------------------------------\n"; + std::cout << "SOLVING MRA-PNO-F12 as described in \n"; + std::cout << "J.S. Kottmann, F.A. Bischoff, E.F. Valeev\n"; + std::cout << "Direct determination of optimal pair-natural orbitals in a real-space representation:\n"; + std::cout << "the second-order Møller-Plesset energy\n"; + std::cout << "Journal of Chemical Physics ... 2020\n"; + std::cout << "-------------------------------------------------------------------------------------\n"; + std::cout << "\n\n"; + } + + // Get the name of the input file (if given) + const std::string input = (argc > 1) ? argv[1] : "input"; + + // Compute the SCF Reference + const double time_scf_start = wall_time(); + std::shared_ptr calc(new SCF(world, input)); + Nemo nemo(world, calc, input); + nemo.get_calc()->param.print(); + const double scf_energy = nemo.value(); + if (world.rank() == 0) print("nemo energy: ", scf_energy); + if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); + const double time_scf_end = wall_time(); + + // Compute MRA-PNO-MP2-F12 + const double time_pno_start = wall_time(); + PNOParameters parameters(world,input,nemo.get_calc()->molecule,TAG_PNO); + F12Parameters paramf12(world, input, parameters, TAG_F12); + PNO pno(world, nemo, parameters, paramf12); + std::vector all_pairs; + pno.solve(all_pairs); + const double time_pno_end = wall_time(); + + + if(world.rank()==0){ + std::cout << std::setfill(' '); + std::cout << "\n\n\n"; + std::cout << "--------------------------------------------------\n"; + std::cout << "MRA-PNO-MP2-F12 ended \n"; + std::cout << "--------------------------------------------------\n"; + std::cout << std::setw(25) << "time scf" << " = " << time_scf_end - time_scf_start << "\n"; + std::cout << std::setw(25) << "energy scf" << " = " << scf_energy << "\n"; + std::cout << "--------------------------------------------------\n"; + } + double mp2_energy = 0.0; + std::cout<< std::setw(25) << "time pno" << " = " << time_pno_end - time_pno_start << "\n"; + for(const auto& pairs: all_pairs){ + if(pairs.type == MP2_PAIRTYPE){ + mp2_energy = pairs.energies.total_energy(); + } + std::pair ranks= pno.get_average_rank(pairs.pno_ij); + if(world.rank()==0){ + std::string name; + std::stringstream ss; + ss << pairs.type; + ss >> name; + std::cout<< std::setw(25) << "energy "+name << " = " << pairs.energies.total_energy() << "\n"; + std::cout<< std::setw(25) << "average pno rank " + name << " = " << ranks.first << "\n"; + std::cout<< std::setw(25) << "max pno rank " + name << " = " << ranks.second << "\n"; + } + } + if(world.rank()==0 and mp2_energy != 0.0){ + std::cout << "--------------------------------------------------\n"; + std::cout<< std::setw(25) << "energy(total)" << " = " << scf_energy + mp2_energy << "\n"; + std::cout << "--------------------------------------------------\n"; + std::cout << "\n\n\n"; + } + + // compute orthogonalized mp2 basis and print out hamiltonian tensors + std::cout << std::setprecision(8); + std::cout << std::fixed; + std::cout << std::showpos; + + bool canonicalize = false; + bool quadratic_correction = true; + const double h_thresh = 1.e-4; + const double thresh = 1.e-4;//parameters.thresh(); + const auto amo = nemo.get_calc()->amo; + + if (quadratic_correction){ + // hardcoded for H2, only MP2 groundstate + // take the first PNO (which is highly occupied) and do quadratic CCD like correction + // generalize over PNO occupation number and possible additional threshold + // maybe everything over 0.1 + + madness::ASSERT(all_pairs[0].pno_ij.size() == 1); + auto& f = all_pairs[0].pno_ij[0]; + auto mp2_potential = pno.compute_V_aj_i(); + + } + + + for(const auto& pairs: all_pairs){ + + const auto& pno_ij = pairs.pno_ij; + const bool is_gs = pairs.type == MP2_PAIRTYPE; + std::string name = "gs"; + + vecfuncT reference = amo; + if (not is_gs){ + const auto& x = pairs.cis.x; + reference.insert(reference.end(), x.begin(), x.end()); + name = "ex" + std::to_string(pairs.cis.number); + } + + std::vector all_basis_functions;// = nemo.get_calc()->amo; + + for (const auto& pair: pno_ij){ + all_basis_functions.insert(all_basis_functions.end(), pair.begin(), pair.end()); + } + + // reference projector (not fullfilled for CIS) + madness::QProjector Q(world, reference); + all_basis_functions = Q(all_basis_functions); + + // // compute overlap for cholesky decomposition + const auto S = madness::matrix_inner(world, all_basis_functions, all_basis_functions, true); + if(world.rank()==0) std::cout << "Overlap Matrix of all PNOs:\n"; + for (int i=0;i (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); + auto basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); + if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; + if(world.rank()==0) std::cout << "Adding Reference orbitals\n"; + const auto amo = nemo.get_calc()->amo; + basis.insert(basis.begin(), reference.begin(), reference.end()); + + madness::Tensor g(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = + + madness::truncate(basis, parameters.thresh()); + + + if(canonicalize){ + auto F = madness::Fock(world, &nemo); + const auto Fmat = F(basis, basis); + Tensor U, evals; + syev(Fmat, U, evals); + basis = madness::transform(world, basis, U); + } + + std::vector PQ; + for (const auto& x : basis){ + PQ.push_back(madness::truncate(x*basis,thresh)); + } + std::vector GPQ; + for (const auto& x : basis){ + GPQ.push_back(madness::truncate(madness::apply(world, *gop, madness::truncate(x*basis,thresh)), thresh)); + } + + auto J = madness::Coulomb(world, &nemo); + auto K = madness::Exchange(world, &nemo, 0); + auto Jmat = J(basis, basis); + auto Kmat = K(basis, basis); + + + + int non_zero=0; + if(world.rank() ==0 ) std::cout << "Compute G Tensor:\n"; + for (auto p=0; p h_thresh ){ + if(world.rank()==0) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + ++non_zero; + } + } + } + } + } + } + int non_zero_h = 0; + + Tensor h; + if(canonicalize){ + auto F = madness::Fock(world, &nemo); + h = F(basis, basis); + }else{ + auto T = madness::Kinetic(world); + auto V = madness::Nuclear(world, &nemo); + h = T(basis,basis) + V(basis,basis); + } + for (int i=0;i h_thresh){ + if(world.rank()==0) std::cout << " h " << i << " "<< j << " "<< h(i,j) << "\n"; + ++non_zero_h; + } + } + } + + if(world.rank()==0) std::cout << "non zero elements:\n g : " << non_zero << "\n h : " << non_zero_h << "\n"; + + h = h.flat(); + nc::NdArray hh(h.ptr(), h.size(), 1); + hh.tofile(name+"_hcore.bin", ""); + + g = g.flat(); + nc::NdArray gg(g.ptr(), g.size(), 1); + gg.tofile(name+"_gtensor.bin", ""); + + auto Fop = madness::Fock(world, &nemo); + auto F = Fop(basis, basis); + std::cout << "F\n" << F << "\n"; + + const auto Stest = madness::matrix_inner(world, basis, basis, true); + std::cout << "Overlap over whole basis\n" << Stest << "\n"; + + } + + + + + world.gop.fence(); + if (world.rank() == 0) printf("finished at time %.1f\n", wall_time()); + + + print_stats(world); + finalize(); + + return 0; + +} From 65554299b825851dab977842a7e5de004e4df803 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Tue, 10 Mar 2020 00:47:38 -0400 Subject: [PATCH 0069/1312] working prototype for h2 --- src/apps/CMakeLists.txt | 1 + src/apps/chem/PNO.cpp | 8 +- src/apps/pno/pno_integrals.cpp | 8 +- src/apps/tequila/CMakeLists.txt | 11 ++ src/apps/tequila/tequila.cpp | 189 ++++++++++++++++++++++++++ src/apps/tequila/tequila_test.cpp | 212 ++++++++++++++++++++++++++++++ 6 files changed, 423 insertions(+), 6 deletions(-) create mode 100644 src/apps/tequila/CMakeLists.txt create mode 100644 src/apps/tequila/tequila.cpp create mode 100644 src/apps/tequila/tequila_test.cpp diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt index b3da7ff9f67..07eb9ccacc4 100644 --- a/src/apps/CMakeLists.txt +++ b/src/apps/CMakeLists.txt @@ -7,6 +7,7 @@ add_subdirectory(tdse) add_subdirectory(moldft) add_subdirectory(pno) add_subdirectory(cis) +add_subdirectory(tequila) #add_subdirectory(exciting) #add_subdirectory(hf) #add_subdirectory(ii) diff --git a/src/apps/chem/PNO.cpp b/src/apps/chem/PNO.cpp index ce1812a87ae..b22d536cbc3 100644 --- a/src/apps/chem/PNO.cpp +++ b/src/apps/chem/PNO.cpp @@ -563,12 +563,16 @@ std::vector PNO::solve_cispd(std::vector& result) const { std::cout << "\n\nComputung GS part of CIS(D) energy:\n\n"; cispd_energies = compute_cispd_correction_gs(xcis, mp2); - cispd_energies=compute_cispd_f12_correction_gs(xcis,cispd_energies); + if (param.f12()){ + cispd_energies=compute_cispd_f12_correction_gs(xcis,cispd_energies); + } cispd_energies.update(); omega_gs = cispd_energies.total_energy(); } - cispd_energies=compute_cispd_f12_correction_es(xcis,cispd_energies); + if (param.f12()){ + cispd_energies=compute_cispd_f12_correction_es(xcis,cispd_energies); + } cispd_energies.update(); MyTimer timer_cispd = MyTimer(world).start(); diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 28cd96089db..b2c57871a14 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -115,7 +115,7 @@ int main(int argc, char** argv) { std::cout << std::showpos; bool canonicalize = false; - bool quadratic_correction = true; + bool quadratic_correction = false; const double h_thresh = 1.e-4; const double thresh = 1.e-4;//parameters.thresh(); const auto amo = nemo.get_calc()->amo; @@ -126,9 +126,9 @@ int main(int argc, char** argv) { // generalize over PNO occupation number and possible additional threshold // maybe everything over 0.1 - madness::ASSERT(all_pairs[0].pno_ij.size() == 1); - auto& f = all_pairs[0].pno_ij[0]; - auto mp2_potential = pno.compute_V_aj_i(); +// madness::ASSERT(all_pairs[0].pno_ij.size() == 1); +// auto& f = all_pairs[0].pno_ij[0]; +// auto mp2_potential = pno.compute_V_aj_i(); } diff --git a/src/apps/tequila/CMakeLists.txt b/src/apps/tequila/CMakeLists.txt new file mode 100644 index 00000000000..1f995f566fe --- /dev/null +++ b/src/apps/tequila/CMakeLists.txt @@ -0,0 +1,11 @@ +# src/apps/moldft + +add_executable(tequila_test tequila_test.cpp) +target_link_libraries(tequila_test MADchem ${DISABLEPIE_LINKER_FLAG}) + +find_library(CNPY_LOCATION cnpy HINTS /home/jsk/install/cnpy/lib/) + +add_executable(tequila tequila.cpp) +target_link_libraries(tequila MADchem ${DISABLEPIE_LINKER_FLAG}) +target_link_libraries(tequila ${CNPY_LOCATION}) + diff --git a/src/apps/tequila/tequila.cpp b/src/apps/tequila/tequila.cpp new file mode 100644 index 00000000000..7dc565ed387 --- /dev/null +++ b/src/apps/tequila/tequila.cpp @@ -0,0 +1,189 @@ +/* + * tequila.cpp + * + * Created on: Mar. 9, 2020 + * Author: jsk + */ + +//#include +#include "/home/jsk/install/cnpy/include/cnpy.h" // integrate into cmake! +#include "NumCpp.hpp" // integrate into cmake (inluce only just pass cxx flag -I/home/jsk/install/numcpp/include/ +#include +#include +#include +#include +#include + +using namespace madness; + +Tensor load_tensor(const std::string& name){ + cnpy::NpyArray data = cnpy::npy_load(name+".npy"); + Tensor result(data.num_vals); + auto data_ptr = data.data(); + UNARYITERATOR(double, result, *_p0 = data_ptr[_i]); + std::vector shape; + for(const auto& i:data.shape){ + shape.push_back(long(i)); + } + + result = result.reshape(shape); + return result; +} + +template +Tensor compute_one_electron_tensor(const vecfuncT& basis, const opT& op){ + return op(basis,basis); +} + +template +Tensor compute_two_electron_tensor(World& world, const vecfuncT& basis, const opT& op){ + // = = = + Tensor g(basis.size(), basis.size(),basis.size(),basis.size()); + double energy1 = 0.0; + double energy2 = 0.0; + const auto& f = basis; + for (auto i=0; i& hij, const Tensor& gijkl, const Tensor& dij, const Tensor& dijkl){ + std::cout << "dij.ndim()=" << dij.flat().ndim() << "\ndijkl.ndim()" << dijkl.flat().ndim() << "\n"; + std::cout << "hij.ndim()=" << hij.flat().ndim() << "\ngijkl.ndim()" << gijkl.flat().ndim() << "\n"; + + const auto one_particle_energy = hij.flat().trace(dij.flat()); + std::cout << "one particle energy = " << one_particle_energy << "\n"; + const auto two_particle_energy = gijkl.flat().trace(dijkl.flat()); + std::cout << "two particle energy = " << two_particle_energy << "\n"; + + return one_particle_energy + 0.5*two_particle_energy; +} + +Nemo compute_scf(World& world, const std::string& input="input"){ + const double time_scf_start = wall_time(); + std::shared_ptr calc(new SCF(world, input)); + Nemo nemo(world, calc, input); + nemo.get_calc()->param.print(); + const double scf_energy = nemo.value(); + if (world.rank() == 0) print("nemo energy: ", scf_energy); + if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); + const double time_scf_end = wall_time(); + return nemo; +} + +vecfuncT compute_initial_guess(const Nemo& nemo){ + // replace this with guess factory of pno or cis + + // extract what we need from nemo + const auto amo = nemo.get_calc()->amo; + MADNESS_ASSERT(amo.size()==1); + const auto atomic_guess = nemo.get_calc() -> ao; + + + QProjector Q(nemo.world, amo); + + auto atomic_mo = atomic_guess[0] + atomic_guess[1]; + auto atomic_vi = atomic_guess[0] - atomic_guess[1]; + atomic_mo.scale(1.0/atomic_mo.norm2()); + atomic_vi.scale(1.0/atomic_vi.norm2()); + + auto vi = Q(atomic_vi); + atomic_vi.scale(1.0/atomic_vi.norm2()); + + vecfuncT basis = {amo[0], atomic_vi}; + return basis; +} + +int main(int argc, char** argv) { + initialize(argc, argv); + World world(SafeMPI::COMM_WORLD); + if (world.rank() == 0) printf("starting at time %.1f\n", wall_time()); + const double time_start = wall_time(); + std::cout.precision(6); + + startup(world,argc,argv,true); + //print_meminfo(world.rank(), "startup"); + + // read in the spin integrated density matrices + auto dij = load_tensor("dij"); + auto dijkl = load_tensor("dijkl"); + + std::cout << "dij\n" << dij << '\n'; + std::cout << "dijkl " << dijkl.dims() << " " << dijkl.ndim()<< "\n" << dijkl << '\n'; + + auto nemo = compute_scf(world); + const double nuc_rep = nemo.get_calc() -> molecule.nuclear_repulsion_energy(); + auto basis = compute_initial_guess(nemo); + + auto T = Kinetic(world); + auto Vnuc = Nuclear(world, &nemo); + auto gop = CoulombOperator(world, 1.e-6,1.e-6); + QProjector Q(nemo.world, nemo.get_calc()->amo); + // will only optimize the virtuals here + NonlinearSolver solver; + for(auto i=0; i<100; i++){ + auto vi = basis.back(); + auto mo = basis.front(); + auto h = Vnuc(basis,basis) + T(basis,basis); + auto g11 = gop(vi*vi); + auto g01 = gop(mo*vi); + auto V = Vnuc(vi)*dij(1,1) + Q(dijkl(1,1,1,1)*g11*vi + dijkl(1,1,0,0)*g01*mo) - dij(1,1)*h(0,1)*mo; + const double lambda = dij(1,1)*T(vi,vi) + vi.inner(V) ; + auto BSH = BSHOperator3D(world, sqrt(-2.0 * lambda/dij(1,1)), 1.e-6, 1.e-6); + auto vi2 = BSH(-2.0/dij(1,1)*V); + auto res = vi - vi2; + auto err = res.norm2(); + std::cout << "err=" << err << " lambda=" << lambda << "\n"; + //vi = vi2; + vi = solver.update(vi, res); + + vi = Q(vi); + const auto norm = vi.norm2(); + std::cout << "norm of updated function " << norm << "\n"; + vi.scale(1.0/norm); + basis = {mo, vi}; + if(std::fabs(err) < 1.e-3) break; + } + + auto hij = compute_one_electron_tensor(basis, T); + hij += compute_one_electron_tensor(basis, Vnuc); + const auto gijkl = compute_two_electron_tensor(world, basis, gop); + const auto energy = compute_energy(hij, gijkl, dij, dijkl); + std::cout << "final energy = " << 2.0* energy + nuc_rep << "\n"; // factor 2 currently missing in density matrices (or because its only AB) + +// { +// auto h = hij.flat(); +// nc::NdArray hh(h.ptr(), h.size(), 1); +// hh.tofile("hij.bin", ""); +// }{ +// auto h = dij.flat(); +// nc::NdArray hh(h.ptr(), h.size(), 1); +// hh.tofile("dij.bin", ""); +// }{ +// auto g = gijkl.flat(); +// nc::NdArray gg(g.ptr(), g.size(), 1); +// gg.tofile("gijkl.bin", ""); +// }{ +// auto g = dijkl.flat(); +// nc::NdArray gg(g.ptr(), g.size(), 1); +// gg.tofile("dijkl.bin", ""); +// } + + + + print_stats(world); + finalize(); +} diff --git a/src/apps/tequila/tequila_test.cpp b/src/apps/tequila/tequila_test.cpp new file mode 100644 index 00000000000..267cb6f7495 --- /dev/null +++ b/src/apps/tequila/tequila_test.cpp @@ -0,0 +1,212 @@ +/* + * tequila.cpp + * + * Madness tequila interface and + * an empirical proove that I suck at naming things + * + * Created on: Mar. 5, 2020 + * Author: jsk + */ + +//#define WORLD_INSTANTIATE_STATIC_TEMPLATES +#include +#include +#include +#include + +#include "NumCpp.hpp" + +using namespace madness; + +// DEFINE PARAMETER TAGS FOR THE INPUT FILE +const std::string TAG_TQ = "tequila"; + +std::vector > solve_two_electron_cid(const vecfuncT& occ, const vecfuncT& virt, madness::Nemo& nemo){ + /// Primitive CI doubles solver for a closed shell two electron system + /// returns the one and two electron density matrices in determinantal basis + const double thresh=1.e-5; + //madness::MADNESS_ASSERT(occ.size() ==1); + //madness::MADNESS_ASSERT(virt.size() ==1); + + const auto mo = occ[0]; + const auto vi = virt[0]; + World& world=mo.world(); + + madness::Nuclear V(world, &nemo); + madness::Kinetic T(world); + auto gop = std::shared_ptr < real_convolution_3d > (madness::CoulombOperatorPtr(world, 1.e-6,1.e-6)); + + Tensor detmat(2,2); + detmat(0,0) = 2.0*(V(mo,mo) + T(mo,mo)) + (mo*mo).inner((*gop)(mo*mo)); + detmat(1,1) = 2.0*(V(vi,vi) + T(vi,vi)) + (vi*vi).inner((*gop)(vi*vi)); + detmat(0,1) = (mo*vi).inner((*gop)(vi*mo)); + detmat(1,0) = detmat(0,1); + + Tensor U, evals; + syev(detmat, U, evals); + if(world.rank()==0) std::cout << "CI Matrix:\n" << detmat << "\n"; + if(world.rank()==0) std::cout << "CI Results:\n" << evals << "\n" << U << "\n"; + + // compute the reduced one particle density matrix of the ground state + // no single exictations in this example so it is diagonal + Tensor Dij(2,2); + Dij(0,0) = U(0,0)*U(0,0); + Dij(1,1) = U(1,0)*U(1,0); + + if(world.rank()==0) std::cout << "One RDM:\n" << Dij.flat() << "\n"; + + // two particle density matrix + Tensor Dijkl(2,2,2,2); + Dijkl(0,0,0,0) = U(0,0)*U(0,0) ; + Dijkl(1,1,1,1) = U(1,0)*U(1,0) ; + Dijkl(1,1,0,0) = U(0,0)*U(1,0) ; + Dijkl(0,0,1,1) = U(1,0)*U(0,0) ; + + if(world.rank()==0) std::cout << "Two RDM:\n" << Dijkl.flat() << "\n"; + + + return {Dij, Dijkl}; + +} + +int main(int argc, char** argv) { + initialize(argc, argv); + World world(SafeMPI::COMM_WORLD); + if (world.rank() == 0) printf("starting at time %.1f\n", wall_time()); + const double time_start = wall_time(); + std::cout.precision(6); + + startup(world,argc,argv,true); + //print_meminfo(world.rank(), "startup"); + + // Get the name of the input file (if given) + const std::string input = (argc > 1) ? argv[1] : "input"; + + // Compute the SCF Reference + const double time_scf_start = wall_time(); + std::shared_ptr calc(new SCF(world, input)); + Nemo nemo(world, calc, input); + nemo.get_calc()->param.print(); + const double scf_energy = nemo.value(); + if (world.rank() == 0) print("nemo energy: ", scf_energy); + if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); + const double time_scf_end = wall_time(); + + // extract what we need from nemo + const auto amo = nemo.get_calc()->amo; + const auto bmo = nemo.get_calc()->bmo; + const auto atomic_guess = nemo.get_calc() -> ao; + const double nuc_rep = nemo.get_calc() -> molecule.nuclear_repulsion_energy(); + madness::Nuclear V(world, &nemo); + madness::Kinetic T(world); + auto gop = std::shared_ptr < real_convolution_3d > (madness::CoulombOperatorPtr(world, 1.e-6,1.e-6)); + QProjector Q(world, amo); + + auto atomic_mo = atomic_guess[0] + atomic_guess[1]; + auto atomic_vi = atomic_guess[0] - atomic_guess[1]; + atomic_mo.scale(1.0/atomic_mo.norm2()); + atomic_vi.scale(1.0/atomic_vi.norm2()); + auto mo = amo[0]; + const double hf_energy_atomic = 2.0*(V(atomic_mo,atomic_mo) + T(atomic_mo,atomic_mo)) + (atomic_mo*atomic_mo).inner((*gop)(atomic_mo*atomic_mo)) + nuc_rep; + std::cout << "Atomic HF Energy = " << hf_energy_atomic << "\n"; + std::cout << "Atomic HF Energy = " << hf_energy_atomic - nuc_rep << " (no nuclear repulsion added)\n"; + + const double hf_energy = 2.0*(V(mo,mo) + T(mo,mo)) + (mo*mo).inner((*gop)(mo*mo)) + nuc_rep; + std::cout << "HF Energy = " << hf_energy << "\n"; + + auto vi = Q(atomic_vi); + atomic_vi.scale(1.0/atomic_vi.norm2()); + + Tensor hij,gijkl,dij,dijkl; + for (auto iter=0; iter<20; iter++){ + std::cout << "Iteration " << iter << "\n"; + +// std::cout << "DOING ATOMIC TEST\n"; +// vecfuncT all_basis_functions = {atomic_mo, atomic_vi}; + vecfuncT all_basis_functions = {mo, vi}; + //vecfuncT all_basis_functions = {atomic_mo, atomic_vi}; + const auto S = madness::matrix_inner(world, all_basis_functions, all_basis_functions, true); + + if(world.rank() ==0 ){ + std::cout << "S:\n"; + std::cout << S << "\n"; + } + + const auto rdms = solve_two_electron_cid(vecfuncT(1,mo), vecfuncT(1,vi), nemo); + dij = rdms[0]; + dijkl = rdms[1]; + + const Tensor h = V(all_basis_functions, all_basis_functions) + T(all_basis_functions, all_basis_functions); + std::cout << "hcore\n" << h << "\n"; + Tensor g(all_basis_functions.size(), all_basis_functions.size(),all_basis_functions.size(),all_basis_functions.size()); + double energy1 = 0.0; + double energy2 = 0.0; + const auto& f = all_basis_functions; + for (auto i=0; i hh(h.ptr(), h.size(), 1); + hh.tofile("hij.bin", ""); + }{ + auto h = dij.flat(); + nc::NdArray hh(h.ptr(), h.size(), 1); + hh.tofile("dij.bin", ""); + }{ + auto g = gijkl.flat(); + nc::NdArray gg(g.ptr(), g.size(), 1); + gg.tofile("gijkl.bin", ""); + }{ + auto g = dijkl.flat(); + nc::NdArray gg(g.ptr(), g.size(), 1); + gg.tofile("dijkl.bin", ""); + } + + + print_stats(world); + finalize(); + return 0; +} + + + + + + + From 984146c79dd65da746535ae3eb8f0721ac219bb5 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Fri, 5 Jun 2020 14:19:52 -0400 Subject: [PATCH 0070/1312] development updates on pno_integrals --- src/apps/chem/PNO.cpp | 2 + src/apps/chem/PNOStructures.h | 1 + src/apps/pno/pno_integrals.cpp | 90 ++++++++---- src/apps/tequila/CMakeLists.txt | 7 + src/apps/tequila/tequila.cpp | 223 +++++++++++++++++++++++++----- src/apps/tequila/tequila_test.cpp | 2 +- src/examples/tiny.cc | 4 +- 7 files changed, 271 insertions(+), 58 deletions(-) diff --git a/src/apps/chem/PNO.cpp b/src/apps/chem/PNO.cpp index b22d536cbc3..89a5275918c 100644 --- a/src/apps/chem/PNO.cpp +++ b/src/apps/chem/PNO.cpp @@ -1416,6 +1416,7 @@ PNOPairs PNO::iterate_pairs_internal(PNOPairs& pairs, const int maxiter, const d } else { rdm_evals_ij = pno_compress(pairs,param.tpno()); } + pairs.rdm_evals_ij = rdm_evals_ij; // test if ampltides are transformed correctly //PairEnergies edb=compute_projected_mp2_energies(t2_ij, pno_ij); @@ -2579,6 +2580,7 @@ Tensor PNO::compute_cispd_fluctuation_matrix(const ElectronPairIterator& } void PNO::canonicalize(PNOPairs& pairs)const{ + pairs.rdm_evals_ij = std::valarray >(); // make clear that they are not valid anymore // diagonalize all Fock matrices std::valarray > U_ij(Tensor(std::vector(2,0)),pairs.npairs); PAIRLOOP(it){ diff --git a/src/apps/chem/PNOStructures.h b/src/apps/chem/PNOStructures.h index bfaf877ef5d..207aefa62de 100644 --- a/src/apps/chem/PNOStructures.h +++ b/src/apps/chem/PNOStructures.h @@ -273,6 +273,7 @@ struct PNOPairs{ const size_t npairs; ///< number of Pairs CISData cis; ///< CIS excitation structure vfT pno_ij; ///< the PNOs for all Pairs + std::valarray > rdm_evals_ij; ///< PNO eigenvalues std::valarray > t_ij; ///< the amplitudes for all Pairs std::valarray > F_ij; ///< Fock matrices of the PNOs std::valarray > W_ij; ///< Fluctuation matrix diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index b2c57871a14..55045025b69 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -40,6 +40,13 @@ int main(int argc, char** argv) { startup(world,argc,argv,true); print_meminfo(world.rank(), "startup"); + // Get the name of the input file (if given) + const std::string input = (argc > 1) ? argv[1] : "input"; + + // get the orthogonalization method (cholesky, canonicalize, none) and basis_size + const std::string orthogonalization = (argc > 2) ? argv[2] : "cholesky"; + const int basis_size = (argc > 3) ? std::atoi(argv[3]) : 10; + if(world.rank()==0){ std::cout << "\n\n"; std::cout << "-------------------------------------------------------------------------------------\n"; @@ -50,10 +57,16 @@ int main(int argc, char** argv) { std::cout << "Journal of Chemical Physics ... 2020\n"; std::cout << "-------------------------------------------------------------------------------------\n"; std::cout << "\n\n"; + + std::cout << "This script will run PNO-MP2 and print out tensors in binary\n"; + std::cout << "Call as: pno_integrals inputfile orthogonalization basis_size"; + std::cout << "input is " << input << "\n"; + std::cout << "orthogonalization is " << orthogonalization << "\n"; + std::cout << "basis size is " << basis_size << "\n"; } - // Get the name of the input file (if given) - const std::string input = (argc > 1) ? argv[1] : "input"; + + // Compute the SCF Reference const double time_scf_start = wall_time(); @@ -114,28 +127,18 @@ int main(int argc, char** argv) { std::cout << std::fixed; std::cout << std::showpos; - bool canonicalize = false; - bool quadratic_correction = false; + const bool canonicalize = orthogonalization == "canonicalize"; + const bool orthogonalize = orthogonalization != "none"; const double h_thresh = 1.e-4; const double thresh = 1.e-4;//parameters.thresh(); const auto amo = nemo.get_calc()->amo; - if (quadratic_correction){ - // hardcoded for H2, only MP2 groundstate - // take the first PNO (which is highly occupied) and do quadratic CCD like correction - // generalize over PNO occupation number and possible additional threshold - // maybe everything over 0.1 - -// madness::ASSERT(all_pairs[0].pno_ij.size() == 1); -// auto& f = all_pairs[0].pno_ij[0]; -// auto mp2_potential = pno.compute_V_aj_i(); - - } - - - for(const auto& pairs: all_pairs){ + if(world.rank()==0) std::cout << "Tightening thresholds to 1.e-6 for post-processing\n"; + FunctionDefaults<3>::set_thresh(1.e-6); + for(auto& pairs: all_pairs){ const auto& pno_ij = pairs.pno_ij; + const auto& rdm_evals = pairs.rdm_evals_ij; const bool is_gs = pairs.type == MP2_PAIRTYPE; std::string name = "gs"; @@ -148,15 +151,41 @@ int main(int argc, char** argv) { std::vector all_basis_functions;// = nemo.get_calc()->amo; + std::vector occ; + // collect PNOs from all pairs and sort by occupation number for (const auto& pair: pno_ij){ all_basis_functions.insert(all_basis_functions.end(), pair.begin(), pair.end()); } + for (auto i=0; i > zipped; + for (auto i=0; i< all_basis_functions.size(); ++i){ + zipped.push_back(std::make_pair(occ[i], all_basis_functions[i])); + } + + std::sort(zipped.begin(), zipped.end(), [](const auto& i, const auto& j) { return i.first > j.first; }); + + std::vector unzipped_first; + std::vector unzipped_second; + for (auto i=0; i Q(world, reference); all_basis_functions = Q(all_basis_functions); - // // compute overlap for cholesky decomposition + // compute overlap for cholesky decomposition const auto S = madness::matrix_inner(world, all_basis_functions, all_basis_functions, true); if(world.rank()==0) std::cout << "Overlap Matrix of all PNOs:\n"; for (int i=0;i (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); - auto basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); - if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; + + auto basis = all_basis_functions; + if (orthogonalize){ + basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); + if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; + } + if(world.rank()==0) std::cout << "Adding Reference orbitals\n"; const auto amo = nemo.get_calc()->amo; basis.insert(basis.begin(), reference.begin(), reference.end()); madness::Tensor g(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = - madness::truncate(basis, parameters.thresh()); - if(canonicalize){ + if(world.rank()==0) std::cout << "canonicalizing!\n"; auto F = madness::Fock(world, &nemo); const auto Fmat = F(basis, basis); Tensor U, evals; @@ -217,7 +250,7 @@ int main(int argc, char** argv) { g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); } if(std::fabs(g(p,q,r,s)) > h_thresh ){ - if(world.rank()==0) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; ++non_zero; } } @@ -239,7 +272,7 @@ int main(int argc, char** argv) { for (int i=0;i h_thresh){ - if(world.rank()==0) std::cout << " h " << i << " "<< j << " "<< h(i,j) << "\n"; + if(world.rank()==0 and basis.size() < 3) std::cout << " h " << i << " "<< j << " "<< h(i,j) << "\n"; ++non_zero_h; } } @@ -255,6 +288,13 @@ int main(int argc, char** argv) { nc::NdArray gg(g.ptr(), g.size(), 1); gg.tofile(name+"_gtensor.bin", ""); + if (not orthogonalize){ + auto S = madness::matrix_inner(world, basis, basis, true); + S = S.flat(); + nc::NdArray gg(S.ptr(), S.size(), 1); + gg.tofile(name+"_overlap.bin", ""); + } + auto Fop = madness::Fock(world, &nemo); auto F = Fop(basis, basis); std::cout << "F\n" << F << "\n"; diff --git a/src/apps/tequila/CMakeLists.txt b/src/apps/tequila/CMakeLists.txt index 1f995f566fe..5162a0b347b 100644 --- a/src/apps/tequila/CMakeLists.txt +++ b/src/apps/tequila/CMakeLists.txt @@ -9,3 +9,10 @@ add_executable(tequila tequila.cpp) target_link_libraries(tequila MADchem ${DISABLEPIE_LINKER_FLAG}) target_link_libraries(tequila ${CNPY_LOCATION}) +add_executable(two_electron_example two_electron_example.cpp) +target_link_libraries(two_electron_example MADchem ${DISABLEPIE_LINKER_FLAG}) +target_link_libraries(two_electron_example ${CNPY_LOCATION}) + +add_executable(compute_two_electron_density_matrix compute_two_electron_density_matrix.cpp) +target_link_libraries(compute_two_electron_density_matrix MADchem ${DISABLEPIE_LINKER_FLAG}) +target_link_libraries(compute_two_electron_density_matrix ${CNPY_LOCATION}) diff --git a/src/apps/tequila/tequila.cpp b/src/apps/tequila/tequila.cpp index 7dc565ed387..254247a9e9d 100644 --- a/src/apps/tequila/tequila.cpp +++ b/src/apps/tequila/tequila.cpp @@ -7,15 +7,34 @@ //#include #include "/home/jsk/install/cnpy/include/cnpy.h" // integrate into cmake! -#include "NumCpp.hpp" // integrate into cmake (inluce only just pass cxx flag -I/home/jsk/install/numcpp/include/ +#include "NumCpp.hpp" // integrate into cmake (include only just pass cxx flag -I/home/jsk/install/numcpp/include/ #include #include #include #include #include +#include using namespace madness; + +//template +//struct allocator { +// World& world; +// const int n; +// +// /// @param[in] world the world +// /// @param[in] nn the number of functions in a given vector +// allocator(World& world, const int nn) : +// world(world), n(nn) { +// } +// +// /// allocate a vector of n empty functions +// std::vector > operator()() { +// return zero_functions(world, n); +// } +//}; + Tensor load_tensor(const std::string& name){ cnpy::NpyArray data = cnpy::npy_load(name+".npy"); Tensor result(data.num_vals); @@ -91,7 +110,7 @@ vecfuncT compute_initial_guess(const Nemo& nemo){ const auto amo = nemo.get_calc()->amo; MADNESS_ASSERT(amo.size()==1); const auto atomic_guess = nemo.get_calc() -> ao; - + std::cout << atomic_guess.size() << " atomic guess orbitals\n"; QProjector Q(nemo.world, amo); @@ -101,12 +120,23 @@ vecfuncT compute_initial_guess(const Nemo& nemo){ atomic_vi.scale(1.0/atomic_vi.norm2()); auto vi = Q(atomic_vi); - atomic_vi.scale(1.0/atomic_vi.norm2()); + vi.scale(1.0/vi.norm2()); - vecfuncT basis = {amo[0], atomic_vi}; + auto tmp = amo[0].inner(vi); + std::cout << "overlap of guess = " << tmp << "\n"; + vecfuncT basis = {amo[0], vi}; return basis; } +void print_orbital_information(World& world, const MolecularOrbitals& orbitals){ + if (world.rank()==0){ + std::cout << orbitals.get_mos().size() << " Molecular orbitals\n"; + std::cout << "irreps: " << orbitals.get_irreps() << "\n"; + std::cout << "occ : " << orbitals.get_occ() << "\n"; + std::cout << "set : " << orbitals.get_localize_sets() << "\n"; + } +} + int main(int argc, char** argv) { initialize(argc, argv); World world(SafeMPI::COMM_WORLD); @@ -117,6 +147,8 @@ int main(int argc, char** argv) { startup(world,argc,argv,true); //print_meminfo(world.rank(), "startup"); + const std::string input = "input"; + // read in the spin integrated density matrices auto dij = load_tensor("dij"); auto dijkl = load_tensor("dijkl"); @@ -124,38 +156,167 @@ int main(int argc, char** argv) { std::cout << "dij\n" << dij << '\n'; std::cout << "dijkl " << dijkl.dims() << " " << dijkl.ndim()<< "\n" << dijkl << '\n'; - auto nemo = compute_scf(world); - const double nuc_rep = nemo.get_calc() -> molecule.nuclear_repulsion_energy(); - auto basis = compute_initial_guess(nemo); + std::shared_ptr scf_ptr(new SCF(world, input)); + Nemo nemo(world, scf_ptr, input); + try{ + nemo.get_calc() -> load_mos(world); + nemo.get_calc() -> ao = nemo.get_calc() -> project_ao_basis(world, nemo.get_calc() -> aobasis); + nemo.get_calc() -> make_nuclear_potential(world); + }catch(MadnessException& e){ + nemo.value(); + } + std::vector irreps; + auto symmetry_projector = nemo.get_symmetry_projector(); + symmetry_projector(nemo.get_calc() -> amo, irreps); + auto alphas = MolecularOrbitals(nemo.get_calc()->amo, nemo.get_calc()->aeps, irreps, nemo.get_calc()->aocc, nemo.get_calc()->aset); + auto betas = MolecularOrbitals(nemo.get_calc()->amo, nemo.get_calc()->aeps, irreps, nemo.get_calc()->aocc, nemo.get_calc()->aset); + const double nuc_rep = nemo.get_calc() -> molecule.nuclear_repulsion_energy(); auto T = Kinetic(world); - auto Vnuc = Nuclear(world, &nemo); + auto Vnuc = Nuclear(world, nemo.get_calc().get()); auto gop = CoulombOperator(world, 1.e-6,1.e-6); QProjector Q(nemo.world, nemo.get_calc()->amo); + + // currently only closed shell + MADNESS_ASSERT(betas.get_mos().size()==0); + print_orbital_information(world, alphas); + + std::cout << "compute initial guess\n"; + auto basis = compute_initial_guess(nemo); + std::cout << "done\n"; + +// std::vector virreps; +// vecfuncT guessvirt = {basis.back()}; +// std::cout << "guessvirt.size() = " << guessvirt.size() << "\n"; +// guessvirt = symmetry_projector(guessvirt, virreps); +// guessvirt = vecfuncT({guessvirt.back()}); +// virreps = std::vector({"b1u"}); +// guessvirt = symmetry_projector(guessvirt, virreps); +// auto virtuals = MolecularOrbitals(guessvirt, Tensor(1), virreps, Tensor(1), std::vector(1,0)); +// print_orbital_information(world, virtuals); + + std::vector airreps; + //basis = symmetry_projector(basis, airreps); + auto bas = MolecularOrbitals(basis, Tensor(basis.size()), airreps, Tensor(basis.size()), std::vector(basis.size(),0)); + print_orbital_information(world, bas); + // will only optimize the virtuals here - NonlinearSolver solver; - for(auto i=0; i<100; i++){ - auto vi = basis.back(); - auto mo = basis.front(); - auto h = Vnuc(basis,basis) + T(basis,basis); - auto g11 = gop(vi*vi); - auto g01 = gop(mo*vi); - auto V = Vnuc(vi)*dij(1,1) + Q(dijkl(1,1,1,1)*g11*vi + dijkl(1,1,0,0)*g01*mo) - dij(1,1)*h(0,1)*mo; - const double lambda = dij(1,1)*T(vi,vi) + vi.inner(V) ; - auto BSH = BSHOperator3D(world, sqrt(-2.0 * lambda/dij(1,1)), 1.e-6, 1.e-6); - auto vi2 = BSH(-2.0/dij(1,1)*V); - auto res = vi - vi2; - auto err = res.norm2(); - std::cout << "err=" << err << " lambda=" << lambda << "\n"; - //vi = vi2; - vi = solver.update(vi, res); - - vi = Q(vi); - const auto norm = vi.norm2(); - std::cout << "norm of updated function " << norm << "\n"; - vi.scale(1.0/norm); - basis = {mo, vi}; - if(std::fabs(err) < 1.e-3) break; + const double thresh = 1.e-4; + auto size = bas.get_mos().size(); + typedef allocator allocT; + typedef XNonlinearSolver >, double, allocT> solverT; + allocT alloc(world, size); + solverT solver(allocT(world, size)); + bool canonicalize = true; + for(auto i=0; i<10; i++){ + // hardcoded for 2e example +// auto mo = alphas.get_mos().front(); +// auto vi = virtuals.get_mos().front(); +// auto h = Vnuc(basis,basis) + T(basis,basis); +// auto g11 = gop(vi*vi); +// auto g01 = gop(mo*vi); +// auto Vx = Vnuc(vi)*dij(1,1) + Q(dijkl(1,1,1,1)*g11*vi + dijkl(1,1,0,0)*g01*mo) - dij(1,1)*h(0,1)*mo; +// const double lambdax = dij(1,1)*T(vi,vi) + vi.inner(Vx) ; +// auto BSH = BSHOperator3D(world, sqrt(-2.0 * lambdax/dij(1,1)), 1.e-6, 1.e-6); +// auto vi2 = BSH(-2.0/dij(1,1)*Vx); +// auto resx = vi - vi2; +// auto err = resx.norm2(); +// std::cout << "err=" << err << " lambda=" << lambdax << "\n"; +// //vi = vi2; +// //vi = solver.update(vi, res); +// vi = Q(vi); +// const auto norm = vi.norm2(); +// std::cout << "norm of updated function " << norm << "\n"; +// vi.scale(1.0/norm); +// Tensor tmp(1); +// tmp[0] = lambdax; +// vecfuncT tmpvi(1,vi); +// virtuals.update_mos_and_eps(tmpvi, tmp); +// if(std::fabs(err) < 1.e-3) break; +// basis = {mo, vi}; + + //vecfuncT hop = T(bas.get_mos()) + Vnuc(bas.get_mos()); // not supported currently; would need for non-diagonal dij + + auto S = matrix_inner(world, bas.get_mos(), bas.get_mos()); + std::cout << "Overlap\n" << S << "\n"; + + std::vector glm; + + for (auto l=0;l kinetic_part(size,size); // diagonal matrix + for (auto a=0; a(world, moa); + kinetic_part(a,a) = dij(a,a)*T(bas.get_mos()[a], bas.get_mos()[a]); + for(auto k=0;k eps(size); + if (canonicalize){ + Tensor U, lambda; + syev(Lambda, U, lambda); + std::cout << "lambdas : " << lambda << "\n"; + bas.update_mos(transform(world, bas.get_mos(), U)); + V = transform(world, V, U); + for (int i = 0;i < size;++i) { + eps[i] = lambda(i)/dij(i,i); + } + }else{ + for (auto a=0; a ops(size); + for (int i = 0;i < size;++i) { + if (eps[i] > 0) { + MADNESS_EXCEPTION("Positive Eigenvalue for BSH Operator?????", 1); + } + ops[i] = poperatorT(BSHOperatorPtr3D(world, sqrt(-2.0 * eps[i]), 1.e-6, 1.e-6)); + } + +// auto res = bas.get_mos() - apply(world, ops, V); +// auto updated = solver.update(bas.get_mos(), res); + auto updated = apply(world,ops,V); + for (auto& u: updated){ + u.scale(1.0/u.norm2()); + } + auto res = bas.get_mos() - updated; + + auto errv = norm2s(world, res); + auto maxerr = std::max_element(std::begin(errv), std::end(errv)); + std::cout << "errv : " << errv << " | max " << *maxerr << "\n"; + if (*maxerr < 1.e-3) break; + + bas.update_mos(updated); + + } auto hij = compute_one_electron_tensor(basis, T); diff --git a/src/apps/tequila/tequila_test.cpp b/src/apps/tequila/tequila_test.cpp index 267cb6f7495..efc644457f7 100644 --- a/src/apps/tequila/tequila_test.cpp +++ b/src/apps/tequila/tequila_test.cpp @@ -177,7 +177,7 @@ int main(int argc, char** argv) { gijkl = g; hij = h; - if(std::fabs(err) < 1.e-3) break; + if(std::fabs(err) < 1.e-5) break; } { diff --git a/src/examples/tiny.cc b/src/examples/tiny.cc index 8c2dba47198..06f25934592 100644 --- a/src/examples/tiny.cc +++ b/src/examples/tiny.cc @@ -278,7 +278,9 @@ int main(int argc, char** argv) { // plot the Gaussian cube file std::vector molecular_info=cubefile_header("input",no_orient); std::string filename=filenames[0]+".cube"; - plot_cubefile<3>(world,vf[0],filename,molecular_info); + for(auto i=0;i(world,vf[i],filename+"_"+std::to_string(i),molecular_info); + } } catch (...) { try { From 99ba3a8ed80b7c8aed41afb776d93c0778a3cc17 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 18 Jun 2020 23:38:37 -0400 Subject: [PATCH 0071/1312] only diag approximation --- src/apps/pno/pno_integrals.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 55045025b69..c273620a26b 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -27,6 +27,7 @@ const std::string TAG_PNO = "pno"; const std::string TAG_F12 = "f12"; const std::string TAG_CP = "computeprotocol"; +// this needs to be added to include #include "NumCpp.hpp" @@ -47,6 +48,8 @@ int main(int argc, char** argv) { const std::string orthogonalization = (argc > 2) ? argv[2] : "cholesky"; const int basis_size = (argc > 3) ? std::atoi(argv[3]) : 10; + const bool only_diag = (argc > 4) ? bool(std::atoi(argv[4])) : false; + if(world.rank()==0){ std::cout << "\n\n"; std::cout << "-------------------------------------------------------------------------------------\n"; @@ -63,6 +66,7 @@ int main(int argc, char** argv) { std::cout << "input is " << input << "\n"; std::cout << "orthogonalization is " << orthogonalization << "\n"; std::cout << "basis size is " << basis_size << "\n"; + std::cout << "only diag is " << only_diag << "\n"; } @@ -153,8 +157,14 @@ int main(int argc, char** argv) { std::vector occ; // collect PNOs from all pairs and sort by occupation number - for (const auto& pair: pno_ij){ - all_basis_functions.insert(all_basis_functions.end(), pair.begin(), pair.end()); + for(ElectronPairIterator it=pno.pit();it;++it){ + if (only_diag and not it.diagonal()){ + std::cout << "skipping pair " << it << "\n"; + continue; + }else{ + const auto& pair = pno_ij[it.ij()]; + all_basis_functions.insert(all_basis_functions.end(), pair.begin(), pair.end()); + } } for (auto i=0; i Date: Thu, 18 Jun 2020 23:41:17 -0400 Subject: [PATCH 0072/1312] only diag approximation --- src/apps/pno/pno_integrals.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index c273620a26b..3f28bee38d7 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -157,9 +157,9 @@ int main(int argc, char** argv) { std::vector occ; // collect PNOs from all pairs and sort by occupation number - for(ElectronPairIterator it=pno.pit();it;++it){ + for(ElectronPairIterator it=pno.f12.pit();it;++it){ if (only_diag and not it.diagonal()){ - std::cout << "skipping pair " << it << "\n"; + std::cout << "skipping pair " << it.name() << "\n"; continue; }else{ const auto& pair = pno_ij[it.ij()]; From 49fbc11d8348ab2226a1acd0b5496e611958a588 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 18 Jun 2020 23:42:06 -0400 Subject: [PATCH 0073/1312] only diag approximation --- src/apps/chem/PNO.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/apps/chem/PNO.h b/src/apps/chem/PNO.h index 449b9836af4..4144892c383 100644 --- a/src/apps/chem/PNO.h +++ b/src/apps/chem/PNO.h @@ -228,6 +228,12 @@ class PNO { /// = basis in which input A is represented, on output = the eigenbasis of A void canonicalize(PNOPairs& v) const; + + /// convenience + size_t nocc()const{return nemo.get_calc()->amo.size();} + size_t nact()const{return nemo.get_calc()->amo.size()-param.freeze();} + ElectronPairIterator pit()const{ return f12.pit();} /// convenience + OrbitalIterator oit()const{return OrbitalIterator(nemo.get_calc()->amo.size(),param.freeze());} private: World& world; PNOParameters param; ///< calculation parameters @@ -241,11 +247,6 @@ class PNO { std::shared_ptr poisson; BasisFunctions basis; ///< class which holds all methods to read or create guess functions for PNO or CABS F12Potentials f12; - /// convenience - size_t nocc()const{return nemo.get_calc()->amo.size();} - size_t nact()const{return nemo.get_calc()->amo.size()-param.freeze();} - ElectronPairIterator pit()const{ return f12.pit();} /// convenience - OrbitalIterator oit()const{return OrbitalIterator(nemo.get_calc()->amo.size(),param.freeze());} CCMessenger msg; }; From aab9b6e4636793c4840658636029ee29888ffcfa Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 18 Jun 2020 23:42:53 -0400 Subject: [PATCH 0074/1312] only diag approximation --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 3f28bee38d7..ee0eb1d3d61 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -157,7 +157,7 @@ int main(int argc, char** argv) { std::vector occ; // collect PNOs from all pairs and sort by occupation number - for(ElectronPairIterator it=pno.f12.pit();it;++it){ + for(ElectronPairIterator it=pno.pit();it;++it){ if (only_diag and not it.diagonal()){ std::cout << "skipping pair " << it.name() << "\n"; continue; From 62b350831fbf78e298d38b2d9d9905733f58d63b Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 18 Jun 2020 23:49:29 -0400 Subject: [PATCH 0075/1312] only diag approximation --- src/apps/pno/pno_integrals.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index ee0eb1d3d61..320418eebfd 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -164,6 +164,9 @@ int main(int argc, char** argv) { }else{ const auto& pair = pno_ij[it.ij()]; all_basis_functions.insert(all_basis_functions.end(), pair.begin(), pair.end()); + for (auto ii=0; ii Date: Mon, 6 Jul 2020 15:29:30 -0400 Subject: [PATCH 0076/1312] added ortho checks --- src/apps/pno/pno_integrals.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 320418eebfd..0b39a787247 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -169,11 +169,6 @@ int main(int argc, char** argv) { } } } - for (auto i=0; i > zipped; for (auto i=0; i< all_basis_functions.size(); ++i){ zipped.push_back(std::make_pair(occ[i], all_basis_functions[i])); @@ -211,8 +206,17 @@ int main(int argc, char** argv) { auto basis = all_basis_functions; if (orthogonalize){ + const auto old = copy(world, basis); basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; + if(world.rank()==0) std::cout << "Overlap Matrix before and after Cholesky\n"; + for (int i=0;i Date: Mon, 6 Jul 2020 15:33:09 -0400 Subject: [PATCH 0077/1312] fixes --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 0b39a787247..9263ac841a3 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -213,7 +213,7 @@ int main(int argc, char** argv) { for (int i=0;i Date: Mon, 6 Jul 2020 15:44:39 -0400 Subject: [PATCH 0078/1312] cd instead of rrcd --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 9263ac841a3..a0ff37f13d5 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -207,7 +207,7 @@ int main(int argc, char** argv) { auto basis = all_basis_functions; if (orthogonalize){ const auto old = copy(world, basis); - basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); + basis = madness::orthonormalize_cd(all_basis_functions, 1.e-5); if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; if(world.rank()==0) std::cout << "Overlap Matrix before and after Cholesky\n"; for (int i=0;i Date: Mon, 6 Jul 2020 15:47:03 -0400 Subject: [PATCH 0079/1312] cd instead of rrcd --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index a0ff37f13d5..b5f5091e2e6 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -207,7 +207,7 @@ int main(int argc, char** argv) { auto basis = all_basis_functions; if (orthogonalize){ const auto old = copy(world, basis); - basis = madness::orthonormalize_cd(all_basis_functions, 1.e-5); + basis = madness::orthonormalize_cd(all_basis_functions); if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; if(world.rank()==0) std::cout << "Overlap Matrix before and after Cholesky\n"; for (int i=0;i Date: Thu, 9 Jul 2020 10:52:20 -0400 Subject: [PATCH 0080/1312] allow cherry picking --- src/apps/pno/pno_integrals.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index b5f5091e2e6..efb75aae223 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -50,6 +50,15 @@ int main(int argc, char** argv) { const bool only_diag = (argc > 4) ? bool(std::atoi(argv[4])) : false; + std::vector cherry_pick(); + for(auto i=0; i<99; ++i){ + if(argc > i){ + int atmp = std::atoi(argv[i]); + cherry_pick.push_back(atmp); + } + } + + if(world.rank()==0){ std::cout << "\n\n"; std::cout << "-------------------------------------------------------------------------------------\n"; @@ -67,6 +76,7 @@ int main(int argc, char** argv) { std::cout << "orthogonalization is " << orthogonalization << "\n"; std::cout << "basis size is " << basis_size << "\n"; std::cout << "only diag is " << only_diag << "\n"; + std::cout << "cherry_pick is " << cherry_pick << "\n"; } From e2987820fd2e6d54d6b7a9cfd254d1bbdfad0358 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 9 Jul 2020 10:54:08 -0400 Subject: [PATCH 0081/1312] allow cherry picking --- src/apps/pno/pno_integrals.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index efb75aae223..e3d540d9f73 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -19,6 +19,7 @@ #include #include #include +#include using namespace madness; @@ -50,7 +51,7 @@ int main(int argc, char** argv) { const bool only_diag = (argc > 4) ? bool(std::atoi(argv[4])) : false; - std::vector cherry_pick(); + std::vector cherry_pick; for(auto i=0; i<99; ++i){ if(argc > i){ int atmp = std::atoi(argv[i]); From 3899af51c46e15d1d31ef39f2d53a81354d19150 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 9 Jul 2020 10:58:18 -0400 Subject: [PATCH 0082/1312] allow cherry picking --- src/apps/pno/pno_integrals.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index e3d540d9f73..38dd8ffe064 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -216,6 +216,18 @@ int main(int argc, char** argv) { auto gop = std::shared_ptr < real_convolution_3d > (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); auto basis = all_basis_functions; + + if(not cherry_pick.empty()){ + vecfuncT cp; + if(world.rank()==0){ + std::cout << "Cherry picking orbitals: " << cherry_pick << " from pno basis\n"; + } + for(auto i: cherry_pick){ + cp.push_back(basis[i]); + } + basis = cp; + } + if (orthogonalize){ const auto old = copy(world, basis); basis = madness::orthonormalize_cd(all_basis_functions); From f5574a7cdbacb3838da88cd4c56df510072d2d45 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 9 Jul 2020 11:00:00 -0400 Subject: [PATCH 0083/1312] allow cherry picking --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 38dd8ffe064..edff89f5e58 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -52,7 +52,7 @@ int main(int argc, char** argv) { const bool only_diag = (argc > 4) ? bool(std::atoi(argv[4])) : false; std::vector cherry_pick; - for(auto i=0; i<99; ++i){ + for(auto i=5; i<99; ++i){ if(argc > i){ int atmp = std::atoi(argv[i]); cherry_pick.push_back(atmp); From 945150bcae48fb2926162d6ba9e69809cdeb4d11 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 9 Jul 2020 11:03:31 -0400 Subject: [PATCH 0084/1312] allow cherry picking --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index edff89f5e58..b270161a8cc 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -230,7 +230,7 @@ int main(int argc, char** argv) { if (orthogonalize){ const auto old = copy(world, basis); - basis = madness::orthonormalize_cd(all_basis_functions); + basis = madness::orthonormalize_cd(basis); if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; if(world.rank()==0) std::cout << "Overlap Matrix before and after Cholesky\n"; for (int i=0;i Date: Thu, 9 Jul 2020 21:19:29 +0200 Subject: [PATCH 0085/1312] first changes towards pno+cabs --- src/apps/CMakeLists.txt | 2 +- src/apps/chem/PNO.h | 445 ++++++++++---------- src/apps/pno/pno_integrals.cpp | 714 +++++++++++++++++++-------------- 3 files changed, 642 insertions(+), 519 deletions(-) diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt index 07eb9ccacc4..75b061c2e06 100644 --- a/src/apps/CMakeLists.txt +++ b/src/apps/CMakeLists.txt @@ -7,7 +7,7 @@ add_subdirectory(tdse) add_subdirectory(moldft) add_subdirectory(pno) add_subdirectory(cis) -add_subdirectory(tequila) +#add_subdirectory(tequila) #add_subdirectory(exciting) #add_subdirectory(hf) #add_subdirectory(ii) diff --git a/src/apps/chem/PNO.h b/src/apps/chem/PNO.h index 4144892c383..c4a74689b41 100644 --- a/src/apps/chem/PNO.h +++ b/src/apps/chem/PNO.h @@ -25,229 +25,230 @@ extern std::vector cubefile_header(std::string filename="input", co class PNO { public: - typedef std::shared_ptr poperatorT; - PNO(World& world, const Nemo& nemo, const PNOParameters& parameters, const F12Parameters& paramf12) - : world(world), - param(parameters), - nemo(nemo), - J(world, &nemo), - K(ParametrizedExchange(world, nemo, parameters.exchange())), - T(world), - V(world, nemo.ncf), - F(world, &nemo), - Q(world, nemo.get_calc()->amo), - basis(world,nemo.get_calc()->molecule,8), - f12(world,nemo,basis,paramf12), - msg(world) - { - poisson = std::shared_ptr(CoulombOperatorPtr( - world, nemo.get_calc()->param.lo(),param.op_thresh())); - MADNESS_ASSERT(param.freeze() == f12.param.freeze()); - } - - /// Compute the projected MP2 energies: 2 - for all pairs - /// gives back the PairEnergies structure with all singlet and triplet energies - PairEnergies compute_projected_mp2_energies(PNOPairs& pairs)const; - - /// solves whatever was specified in input - /// will call solve_mp2, solve_cispd etc - void solve()const{ - std::vector dummy; - solve(dummy); - } - /// Solve for the PairType that is given - void solve(std::vector& all_pairs) const; - - /// interfaces the BasisFunctions class - /// guesses a set of virtuals depending on the guesstype and what was specified in the parameters - vector_real_function_3d guess_virtuals(const vector_real_function_3d& f = vector_real_function_3d(), const GuessType& inpgt = UNKNOWN_GUESSTYPE) const; - - /// convenience - PNOPairs orthonormalize_cholesky(PNOPairs& pairs) const; - - /// only the f12 part of the excited state correction of CIS(D) (namely the terms s2b and s2c) - PairEnergies compute_cispd_f12_correction_es(const vector_real_function_3d& xcis, PairEnergies& energies) const; - /// excited state correction of CIS(D) (namely the terms s2b and s2c) - /// f12 part is excluded (no need to recompute after every iteration) - PairEnergies compute_cispd_correction_es(const vector_real_function_3d& xcis, PNOPairs& pairs) const; - - /// ground state correction of CIS(D) (s4a, s4b, s4c) - /// f12 is excluded to avoid recomputation in iterations - PairEnergies compute_cispd_correction_gs(const vector_real_function_3d& xcis,const PNOPairs& pairs) const; - - /// The f12 part of the ground state correction of CIS(D) (s4a, s4b, s4c) - PairEnergies compute_cispd_f12_correction_gs(const vector_real_function_3d& xcis, PairEnergies& energies) const; - - /// solve PNO-MP2 equations - void solve_mp2(std::vector& pairs)const{ - if(pairs.empty()){ - PNOPairs mp2(MP2_PAIRTYPE,f12.acmos.size()); - solve_mp2(mp2); - pairs.push_back(mp2); - }else{ - solve_mp2(pairs.front()); - } - } - PNOPairs solve_mp2(PNOPairs& pairs) const; - /// solve the PNO-CIS(D) equations - std::vector solve_cispd(std::vector& pairs) const; - - /// compute the average and the maximum rank of a set of PNOs - std::pair get_average_rank(const std::valarray& va) const; - - /// change the state of insignificant pairs to frozen - /// This is based on: - /// 1. External Parameters (are some pairs demanded to be frozen) - /// 2. Energies (if the current energy is significantly below the MRA threshold there is no point in further optimizing) - /// 3. Spatial overlapp (if the norm of the product of the originating MOs is small: i.e. if ||(phi_i)*(phi_j)||_2 is small then pair_ij is insignificant) - PNOPairs freeze_insignificant_pairs(PNOPairs& pairs)const; - - /// Do MRA truncation on all pairs - /// pairs are extracted into one large vector and then compressed and truncated - /// this saves time since there are less fences - PNOPairs truncate_pairs(PNOPairs& pairs) const; - - /// Truncate the ranks of pairs to the given maxrank - PNOPairs truncate_pair_ranks(PNOPairs& pairs) const; - - // small helper function to keep track of all keywords which mess with the guess - bool is_guess_from_scratch(const PairType& ct)const{ - if(param.restart()==ALL_PAIRTYPE) return false; - else if(param.restart()==ct) return false; - else return true; - } - - /// save PNOs on disc - void save_pnos(const PNOPairs& pairs) const; - - /// load PNOs from disc - PNOPairs load_pnos(PNOPairs& pairs) const; - - /// Initialize PNO pairs - /// If the guesstype is the default (UNKNOWN_GUESSTYPE) this will take the guess type from the parameters - PNOPairs initialize_pairs(PNOPairs& pairs, const GuessType& inpgt = UNKNOWN_GUESSTYPE) const; - - /// compute all fluctuation potentials and store them in the pair structure - void update_fluctuation_potentials(PNOPairs& pairs) const; - /// Compute the MP2 fluctuation potential of a speficif pair - PNOPairs compute_fluctuation_potential(const ElectronPairIterator& it, PNOPairs& pairs) const; - /// Compute the CIS(D) fluctuation potential of a specific pair - PNOPairs compute_cispd_fluctuation_potential(const ElectronPairIterator& it, PNOPairs& pairs) const; - /// Iterate the pairs - /// The type of iteration depends on the parameters and the type of PNOPairs structure - /// This will call iterate_pairs_internal at some point - /// Depending on the parameters the pairs will be iterated adaptively or just once with one initial guess - PNOPairs iterate_pairs(PNOPairs& pairs) const; - /// Solve with adaptive solver descriped in the JPC paper - PNOPairs adaptive_solver(PNOPairs& pairs) const; - /// The actual function which interates the pairs - /// Guess functions have to be created before - PNOPairs iterate_pairs_internal(PNOPairs& pairs, const int maxiter, const double econv) const; - - /// Grow the rank of pairs by creating guess functions and adding them - /// The type of guess is controlled by the parameters - PNOPairs grow_rank(PNOPairs& pairs, std::string exop) const; - - /// convenience - EnergyType energytype()const{return ( (param.f12() and f12.param.energytype()==PROJECTED_ENERGYTYPE) ? PROJECTED_ENERGYTYPE : HYLLERAAS_ENERGYTYPE);} - - /// solve the MP2 and CIS(D) amplitude equations - PairEnergies t_solve(PNOPairs& pairs, const Tensor& F_occ, - const double R_convergence_threshold = 1e-6, const size_t max_niter = 100) const; - - /// Compress the PNOs -> lose all PNOs which eigenvalue is below tpno - std::valarray > pno_compress(PNOPairs& pairs, const double tpno) const; - - /// transform the pnos and all the intermediates/potentials and matrices stored in the PNOPair structure - PNOPairs transform_pairs(PNOPairs& pairs, const std::valarray >& U_ij) const; - - /// Print information about the PNO rank of all pairs (i.e. the number of PNO functions) - void print_ranks(const PNOPairs& pairs)const; - - /// Update all PNOs: i.e. compute Fock-residue potential (V+2J-K, K is reused if Kpno_ij intermeidate in pairs is initialized) and apply the Green's function - /// The fluctuation potentials have to be precomputed and stored in the pairs structure - bool update_pno(PNOPairs& pairs, const std::valarray >& rdm_evals_ij,const Tensor& F_occ) const; - - /// Convenience function to initialize all bsh operators - std::vector make_bsh_operators(World& world, const tensorT& evals) const; - - /// get the CIS potentials without Fock residue, i.e Q(2tJ - 2tK)|i> , with transformed K and J - vector_real_function_3d compute_CIS_potentials(const vector_real_function_3d& xcis) const; - - - /// the terms are expanded as follows: - /// Q (-J1 +K1) | i(1) > < a(2) | j(2) > - /// + Q | i(1) > < a(2) | -J(2) + K(2) | j(2) > - /// + i(1) * \int \dr2 1/|r12| a(2) j(2) - /// the first line is zero due to orthogonality of a and j, the second line is zero due to action of Q on i - template - vector_real_function_3d compute_V_aj_i(const real_function_3d& moi, - const real_function_3d& moj, - const vector_real_function_3d& virtuals, - const projector& Qpr) const; - - // not used by CIS(D) -> can still use K intermediates - vector_real_function_3d compute_Vreg_aj_i(const size_t& i, const size_t& j, - const vector_real_function_3d& virtuals, - const vector_real_function_3d& Kpno) const; - - // used by CIS(D) (could also be used by MP2) - template - vector_real_function_3d compute_Vreg_aj_i(const real_function_3d& moi, - const real_function_3d& moj, - const vector_real_function_3d& virtuals, const projector& Qpr, - const vector_real_function_3d& Kpno = - vector_real_function_3d()) const; - - // the Fock residue of the regularized potential for CIS(D) (vanishes for MP2) - // the minus sign is not included here - // this only evalues one part (has to be called twice: -compute_Vreg_aj_i_fock_residue(Vxi,moj) - compute_Vreg_aj_i_fock_residue(moi,Vxj) - // returns = Q(*|ket1> - vector_real_function_3d compute_Vreg_aj_i_fock_residue( - const real_function_3d& ket1, const real_function_3d& ket2, - const vector_real_function_3d& virtuals) const; - // returns _2 = OVx(*|i>) + Q(*|i>), can apply Q global since QOVx=OVx - // use also )^t - vector_real_function_3d compute_Vreg_aj_i_commutator_response( - const real_function_3d& moi, const real_function_3d& moj, - const vector_real_function_3d& virtuals, - const vector_real_function_3d& Vx) const; - - - - // compute Fluctuation Matrix without fluctuation potential (save memory in first iteration) - Tensor compute_fluctuation_matrix(const ElectronPairIterator& it, const vector_real_function_3d& pnos, const vector_real_function_3d& Kpnos_in = vector_real_function_3d()) const; - - Tensor compute_cispd_fluctuation_matrix(const ElectronPairIterator& it, PNOPairs& pairs) const; - - void check_orthonormality(const vector_real_function_3d& v) const; - - - /// \param[in,out] A on input = real symmetric matrix, on output = diagonal - /// matrix of eigenvalues (from smallest to largest) \param[in,out] v on input - /// = basis in which input A is represented, on output = the eigenbasis of A - void canonicalize(PNOPairs& v) const; - - - /// convenience - size_t nocc()const{return nemo.get_calc()->amo.size();} - size_t nact()const{return nemo.get_calc()->amo.size()-param.freeze();} - ElectronPairIterator pit()const{ return f12.pit();} /// convenience - OrbitalIterator oit()const{return OrbitalIterator(nemo.get_calc()->amo.size(),param.freeze());} + typedef std::shared_ptr poperatorT; + PNO(World& world, const Nemo& nemo, const PNOParameters& parameters, const F12Parameters& paramf12) + : world(world), + param(parameters), + nemo(nemo), + J(world, &nemo), + K(ParametrizedExchange(world, nemo, parameters.exchange())), + T(world), + V(world, nemo.ncf), + F(world, &nemo), + Q(world, nemo.get_calc()->amo), + basis(world,nemo.get_calc()->molecule,8), + f12(world,nemo,basis,paramf12), + msg(world) + { + poisson = std::shared_ptr(CoulombOperatorPtr( + world, nemo.get_calc()->param.lo(),param.op_thresh())); + MADNESS_ASSERT(param.freeze() == f12.param.freeze()); + } + + /// Compute the projected MP2 energies: 2 - for all pairs + /// gives back the PairEnergies structure with all singlet and triplet energies + PairEnergies compute_projected_mp2_energies(PNOPairs& pairs)const; + + /// solves whatever was specified in input + /// will call solve_mp2, solve_cispd etc + void solve()const{ + std::vector dummy; + solve(dummy); + } + /// Solve for the PairType that is given + void solve(std::vector& all_pairs) const; + + /// interfaces the BasisFunctions class + /// guesses a set of virtuals depending on the guesstype and what was specified in the parameters + vector_real_function_3d guess_virtuals(const vector_real_function_3d& f = vector_real_function_3d(), const GuessType& inpgt = UNKNOWN_GUESSTYPE) const; + + /// convenience + PNOPairs orthonormalize_cholesky(PNOPairs& pairs) const; + + /// only the f12 part of the excited state correction of CIS(D) (namely the terms s2b and s2c) + PairEnergies compute_cispd_f12_correction_es(const vector_real_function_3d& xcis, PairEnergies& energies) const; + /// excited state correction of CIS(D) (namely the terms s2b and s2c) + /// f12 part is excluded (no need to recompute after every iteration) + PairEnergies compute_cispd_correction_es(const vector_real_function_3d& xcis, PNOPairs& pairs) const; + + /// ground state correction of CIS(D) (s4a, s4b, s4c) + /// f12 is excluded to avoid recomputation in iterations + PairEnergies compute_cispd_correction_gs(const vector_real_function_3d& xcis,const PNOPairs& pairs) const; + + /// The f12 part of the ground state correction of CIS(D) (s4a, s4b, s4c) + PairEnergies compute_cispd_f12_correction_gs(const vector_real_function_3d& xcis, PairEnergies& energies) const; + + /// solve PNO-MP2 equations + void solve_mp2(std::vector& pairs)const{ + if(pairs.empty()){ + PNOPairs mp2(MP2_PAIRTYPE,f12.acmos.size()); + solve_mp2(mp2); + pairs.push_back(mp2); + }else{ + solve_mp2(pairs.front()); + } + } + PNOPairs solve_mp2(PNOPairs& pairs) const; + /// solve the PNO-CIS(D) equations + std::vector solve_cispd(std::vector& pairs) const; + + /// compute the average and the maximum rank of a set of PNOs + std::pair get_average_rank(const std::valarray& va) const; + + /// change the state of insignificant pairs to frozen + /// This is based on: + /// 1. External Parameters (are some pairs demanded to be frozen) + /// 2. Energies (if the current energy is significantly below the MRA threshold there is no point in further optimizing) + /// 3. Spatial overlapp (if the norm of the product of the originating MOs is small: i.e. if ||(phi_i)*(phi_j)||_2 is small then pair_ij is insignificant) + PNOPairs freeze_insignificant_pairs(PNOPairs& pairs)const; + + /// Do MRA truncation on all pairs + /// pairs are extracted into one large vector and then compressed and truncated + /// this saves time since there are less fences + PNOPairs truncate_pairs(PNOPairs& pairs) const; + + /// Truncate the ranks of pairs to the given maxrank + PNOPairs truncate_pair_ranks(PNOPairs& pairs) const; + + // small helper function to keep track of all keywords which mess with the guess + bool is_guess_from_scratch(const PairType& ct)const{ + if(param.restart()==ALL_PAIRTYPE) return false; + else if(param.restart()==ct) return false; + else return true; + } + + /// save PNOs on disc + void save_pnos(const PNOPairs& pairs) const; + + /// load PNOs from disc + PNOPairs load_pnos(PNOPairs& pairs) const; + + /// Initialize PNO pairs + /// If the guesstype is the default (UNKNOWN_GUESSTYPE) this will take the guess type from the parameters + PNOPairs initialize_pairs(PNOPairs& pairs, const GuessType& inpgt = UNKNOWN_GUESSTYPE) const; + + /// compute all fluctuation potentials and store them in the pair structure + void update_fluctuation_potentials(PNOPairs& pairs) const; + /// Compute the MP2 fluctuation potential of a speficif pair + PNOPairs compute_fluctuation_potential(const ElectronPairIterator& it, PNOPairs& pairs) const; + /// Compute the CIS(D) fluctuation potential of a specific pair + PNOPairs compute_cispd_fluctuation_potential(const ElectronPairIterator& it, PNOPairs& pairs) const; + /// Iterate the pairs + /// The type of iteration depends on the parameters and the type of PNOPairs structure + /// This will call iterate_pairs_internal at some point + /// Depending on the parameters the pairs will be iterated adaptively or just once with one initial guess + PNOPairs iterate_pairs(PNOPairs& pairs) const; + /// Solve with adaptive solver descriped in the JPC paper + PNOPairs adaptive_solver(PNOPairs& pairs) const; + /// The actual function which interates the pairs + /// Guess functions have to be created before + PNOPairs iterate_pairs_internal(PNOPairs& pairs, const int maxiter, const double econv) const; + + /// Grow the rank of pairs by creating guess functions and adding them + /// The type of guess is controlled by the parameters + PNOPairs grow_rank(PNOPairs& pairs, std::string exop) const; + + /// convenience + EnergyType energytype()const{return ( (param.f12() and f12.param.energytype()==PROJECTED_ENERGYTYPE) ? PROJECTED_ENERGYTYPE : HYLLERAAS_ENERGYTYPE);} + + /// solve the MP2 and CIS(D) amplitude equations + PairEnergies t_solve(PNOPairs& pairs, const Tensor& F_occ, + const double R_convergence_threshold = 1e-6, const size_t max_niter = 100) const; + + /// Compress the PNOs -> lose all PNOs which eigenvalue is below tpno + std::valarray > pno_compress(PNOPairs& pairs, const double tpno) const; + + /// transform the pnos and all the intermediates/potentials and matrices stored in the PNOPair structure + PNOPairs transform_pairs(PNOPairs& pairs, const std::valarray >& U_ij) const; + + /// Print information about the PNO rank of all pairs (i.e. the number of PNO functions) + void print_ranks(const PNOPairs& pairs)const; + + /// Update all PNOs: i.e. compute Fock-residue potential (V+2J-K, K is reused if Kpno_ij intermeidate in pairs is initialized) and apply the Green's function + /// The fluctuation potentials have to be precomputed and stored in the pairs structure + bool update_pno(PNOPairs& pairs, const std::valarray >& rdm_evals_ij,const Tensor& F_occ) const; + + /// Convenience function to initialize all bsh operators + std::vector make_bsh_operators(World& world, const tensorT& evals) const; + + /// get the CIS potentials without Fock residue, i.e Q(2tJ - 2tK)|i> , with transformed K and J + vector_real_function_3d compute_CIS_potentials(const vector_real_function_3d& xcis) const; + + + /// the terms are expanded as follows: + /// Q (-J1 +K1) | i(1) > < a(2) | j(2) > + /// + Q | i(1) > < a(2) | -J(2) + K(2) | j(2) > + /// + i(1) * \int \dr2 1/|r12| a(2) j(2) + /// the first line is zero due to orthogonality of a and j, the second line is zero due to action of Q on i + template + vector_real_function_3d compute_V_aj_i(const real_function_3d& moi, + const real_function_3d& moj, + const vector_real_function_3d& virtuals, + const projector& Qpr) const; + + // not used by CIS(D) -> can still use K intermediates + vector_real_function_3d compute_Vreg_aj_i(const size_t& i, const size_t& j, + const vector_real_function_3d& virtuals, + const vector_real_function_3d& Kpno) const; + + // used by CIS(D) (could also be used by MP2) + template + vector_real_function_3d compute_Vreg_aj_i(const real_function_3d& moi, + const real_function_3d& moj, + const vector_real_function_3d& virtuals, const projector& Qpr, + const vector_real_function_3d& Kpno = + vector_real_function_3d()) const; + + // the Fock residue of the regularized potential for CIS(D) (vanishes for MP2) + // the minus sign is not included here + // this only evalues one part (has to be called twice: -compute_Vreg_aj_i_fock_residue(Vxi,moj) - compute_Vreg_aj_i_fock_residue(moi,Vxj) + // returns = Q(*|ket1> + vector_real_function_3d compute_Vreg_aj_i_fock_residue( + const real_function_3d& ket1, const real_function_3d& ket2, + const vector_real_function_3d& virtuals) const; + // returns _2 = OVx(*|i>) + Q(*|i>), can apply Q global since QOVx=OVx + // use also )^t + vector_real_function_3d compute_Vreg_aj_i_commutator_response( + const real_function_3d& moi, const real_function_3d& moj, + const vector_real_function_3d& virtuals, + const vector_real_function_3d& Vx) const; + + + + // compute Fluctuation Matrix without fluctuation potential (save memory in first iteration) + Tensor compute_fluctuation_matrix(const ElectronPairIterator& it, const vector_real_function_3d& pnos, const vector_real_function_3d& Kpnos_in = vector_real_function_3d()) const; + + Tensor compute_cispd_fluctuation_matrix(const ElectronPairIterator& it, PNOPairs& pairs) const; + + void check_orthonormality(const vector_real_function_3d& v) const; + + + /// \param[in,out] A on input = real symmetric matrix, on output = diagonal + /// matrix of eigenvalues (from smallest to largest) \param[in,out] v on input + /// = basis in which input A is represented, on output = the eigenbasis of A + void canonicalize(PNOPairs& v) const; + + + /// convenience + size_t nocc()const{return nemo.get_calc()->amo.size();} + size_t nact()const{return nemo.get_calc()->amo.size()-param.freeze();} + ElectronPairIterator pit()const{ return f12.pit();} /// convenience + OrbitalIterator oit()const{return OrbitalIterator(nemo.get_calc()->amo.size(),param.freeze());} + F12Potentials f12; // used to be private private: - World& world; - PNOParameters param; ///< calculation parameters - Nemo nemo; - Coulomb J; - ParametrizedExchange K; - Kinetic T; - Nuclear V; - Fock F; - QProjector Q; - std::shared_ptr poisson; - BasisFunctions basis; ///< class which holds all methods to read or create guess functions for PNO or CABS - F12Potentials f12; - CCMessenger msg; + World& world; + PNOParameters param; ///< calculation parameters + Nemo nemo; + Coulomb J; + ParametrizedExchange K; + Kinetic T; + Nuclear V; + Fock F; + QProjector Q; + std::shared_ptr poisson; + BasisFunctions basis; ///< class which holds all methods to read or create guess functions for PNO or CABS + // was here: (now in public) F12Potentials f12; + CCMessenger msg; }; diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 320418eebfd..7f45a1ab6a6 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -30,303 +30,425 @@ const std::string TAG_CP = "computeprotocol"; // this needs to be added to include #include "NumCpp.hpp" +//std::vector gram_schmidt(World world, std::vector &in_basis){ + //auto out_basis = in_basis; + //out_basis[0] = in_basis[0]; + //std::cout << "norm of 0: " << std::sqrt(out_basis[0].inner(out_basis[0])) << std::endl; + //for (int i=1; i (world, out_basis[j]); + //out_basis[i] = Q(out_basis[i]); + //} + //std::cout << "norm of " << i << ": " << std::sqrt(out_basis[i].inner(out_basis[i])) << std::endl; + //} + + //return out_basis; +//} + int main(int argc, char** argv) { - madness::initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); - if (world.rank() == 0) printf("starting at time %.1f\n", wall_time()); - const double time_start = wall_time(); - std::cout.precision(6); - - startup(world,argc,argv,true); - print_meminfo(world.rank(), "startup"); - - // Get the name of the input file (if given) - const std::string input = (argc > 1) ? argv[1] : "input"; - - // get the orthogonalization method (cholesky, canonicalize, none) and basis_size - const std::string orthogonalization = (argc > 2) ? argv[2] : "cholesky"; - const int basis_size = (argc > 3) ? std::atoi(argv[3]) : 10; - - const bool only_diag = (argc > 4) ? bool(std::atoi(argv[4])) : false; - - if(world.rank()==0){ - std::cout << "\n\n"; - std::cout << "-------------------------------------------------------------------------------------\n"; - std::cout << "SOLVING MRA-PNO-F12 as described in \n"; - std::cout << "J.S. Kottmann, F.A. Bischoff, E.F. Valeev\n"; - std::cout << "Direct determination of optimal pair-natural orbitals in a real-space representation:\n"; - std::cout << "the second-order Møller-Plesset energy\n"; - std::cout << "Journal of Chemical Physics ... 2020\n"; - std::cout << "-------------------------------------------------------------------------------------\n"; - std::cout << "\n\n"; - - std::cout << "This script will run PNO-MP2 and print out tensors in binary\n"; - std::cout << "Call as: pno_integrals inputfile orthogonalization basis_size"; - std::cout << "input is " << input << "\n"; - std::cout << "orthogonalization is " << orthogonalization << "\n"; - std::cout << "basis size is " << basis_size << "\n"; - std::cout << "only diag is " << only_diag << "\n"; - } - - - - - // Compute the SCF Reference - const double time_scf_start = wall_time(); - std::shared_ptr calc(new SCF(world, input)); - Nemo nemo(world, calc, input); - nemo.get_calc()->param.print(); - const double scf_energy = nemo.value(); - if (world.rank() == 0) print("nemo energy: ", scf_energy); - if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); - const double time_scf_end = wall_time(); - - // Compute MRA-PNO-MP2-F12 - const double time_pno_start = wall_time(); - PNOParameters parameters(world,input,nemo.get_calc()->molecule,TAG_PNO); - F12Parameters paramf12(world, input, parameters, TAG_F12); - PNO pno(world, nemo, parameters, paramf12); - std::vector all_pairs; - pno.solve(all_pairs); - const double time_pno_end = wall_time(); - - - if(world.rank()==0){ - std::cout << std::setfill(' '); - std::cout << "\n\n\n"; - std::cout << "--------------------------------------------------\n"; - std::cout << "MRA-PNO-MP2-F12 ended \n"; - std::cout << "--------------------------------------------------\n"; - std::cout << std::setw(25) << "time scf" << " = " << time_scf_end - time_scf_start << "\n"; - std::cout << std::setw(25) << "energy scf" << " = " << scf_energy << "\n"; - std::cout << "--------------------------------------------------\n"; - } - double mp2_energy = 0.0; - std::cout<< std::setw(25) << "time pno" << " = " << time_pno_end - time_pno_start << "\n"; - for(const auto& pairs: all_pairs){ - if(pairs.type == MP2_PAIRTYPE){ - mp2_energy = pairs.energies.total_energy(); - } - std::pair ranks= pno.get_average_rank(pairs.pno_ij); - if(world.rank()==0){ - std::string name; - std::stringstream ss; - ss << pairs.type; - ss >> name; - std::cout<< std::setw(25) << "energy "+name << " = " << pairs.energies.total_energy() << "\n"; - std::cout<< std::setw(25) << "average pno rank " + name << " = " << ranks.first << "\n"; - std::cout<< std::setw(25) << "max pno rank " + name << " = " << ranks.second << "\n"; - } - } - if(world.rank()==0 and mp2_energy != 0.0){ - std::cout << "--------------------------------------------------\n"; - std::cout<< std::setw(25) << "energy(total)" << " = " << scf_energy + mp2_energy << "\n"; - std::cout << "--------------------------------------------------\n"; - std::cout << "\n\n\n"; - } - - // compute orthogonalized mp2 basis and print out hamiltonian tensors - std::cout << std::setprecision(8); - std::cout << std::fixed; - std::cout << std::showpos; - - const bool canonicalize = orthogonalization == "canonicalize"; - const bool orthogonalize = orthogonalization != "none"; - const double h_thresh = 1.e-4; - const double thresh = 1.e-4;//parameters.thresh(); - const auto amo = nemo.get_calc()->amo; - - if(world.rank()==0) std::cout << "Tightening thresholds to 1.e-6 for post-processing\n"; - FunctionDefaults<3>::set_thresh(1.e-6); - - for(auto& pairs: all_pairs){ - const auto& pno_ij = pairs.pno_ij; - const auto& rdm_evals = pairs.rdm_evals_ij; - const bool is_gs = pairs.type == MP2_PAIRTYPE; - std::string name = "gs"; - - vecfuncT reference = amo; - if (not is_gs){ - const auto& x = pairs.cis.x; - reference.insert(reference.end(), x.begin(), x.end()); - name = "ex" + std::to_string(pairs.cis.number); - } - - std::vector all_basis_functions;// = nemo.get_calc()->amo; - - std::vector occ; - // collect PNOs from all pairs and sort by occupation number - for(ElectronPairIterator it=pno.pit();it;++it){ - if (only_diag and not it.diagonal()){ - std::cout << "skipping pair " << it.name() << "\n"; - continue; - }else{ - const auto& pair = pno_ij[it.ij()]; - all_basis_functions.insert(all_basis_functions.end(), pair.begin(), pair.end()); - for (auto ii=0; ii > zipped; - for (auto i=0; i< all_basis_functions.size(); ++i){ - zipped.push_back(std::make_pair(occ[i], all_basis_functions[i])); - } - - std::sort(zipped.begin(), zipped.end(), [](const auto& i, const auto& j) { return i.first > j.first; }); - - std::vector unzipped_first; - std::vector unzipped_second; - for (auto i=0; i Q(world, reference); - all_basis_functions = Q(all_basis_functions); - - // compute overlap for cholesky decomposition - const auto S = madness::matrix_inner(world, all_basis_functions, all_basis_functions, true); - if(world.rank()==0) std::cout << "Overlap Matrix of all PNOs:\n"; - for (int i=0;i (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); - - auto basis = all_basis_functions; - if (orthogonalize){ - basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); - if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; - } - - if(world.rank()==0) std::cout << "Adding Reference orbitals\n"; - const auto amo = nemo.get_calc()->amo; - basis.insert(basis.begin(), reference.begin(), reference.end()); - - madness::Tensor g(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = - - - if(canonicalize){ - if(world.rank()==0) std::cout << "canonicalizing!\n"; - auto F = madness::Fock(world, &nemo); - const auto Fmat = F(basis, basis); - Tensor U, evals; - syev(Fmat, U, evals); - basis = madness::transform(world, basis, U); - } - - std::vector PQ; - for (const auto& x : basis){ - PQ.push_back(madness::truncate(x*basis,thresh)); - } - std::vector GPQ; - for (const auto& x : basis){ - GPQ.push_back(madness::truncate(madness::apply(world, *gop, madness::truncate(x*basis,thresh)), thresh)); - } - - auto J = madness::Coulomb(world, &nemo); - auto K = madness::Exchange(world, &nemo, 0); - auto Jmat = J(basis, basis); - auto Kmat = K(basis, basis); - - - - int non_zero=0; - if(world.rank() ==0 ) std::cout << "Compute G Tensor:\n"; - for (auto p=0; p h_thresh ){ - if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; - ++non_zero; - } - } - } - } - } - } - int non_zero_h = 0; - - Tensor h; - if(canonicalize){ - auto F = madness::Fock(world, &nemo); - h = F(basis, basis); - }else{ - auto T = madness::Kinetic(world); - auto V = madness::Nuclear(world, &nemo); - h = T(basis,basis) + V(basis,basis); - } - for (int i=0;i h_thresh){ - if(world.rank()==0 and basis.size() < 3) std::cout << " h " << i << " "<< j << " "<< h(i,j) << "\n"; - ++non_zero_h; - } - } - } - - if(world.rank()==0) std::cout << "non zero elements:\n g : " << non_zero << "\n h : " << non_zero_h << "\n"; - - h = h.flat(); - nc::NdArray hh(h.ptr(), h.size(), 1); - hh.tofile(name+"_hcore.bin", ""); - - g = g.flat(); - nc::NdArray gg(g.ptr(), g.size(), 1); - gg.tofile(name+"_gtensor.bin", ""); - - if (not orthogonalize){ - auto S = madness::matrix_inner(world, basis, basis, true); - S = S.flat(); - nc::NdArray gg(S.ptr(), S.size(), 1); - gg.tofile(name+"_overlap.bin", ""); - } - - auto Fop = madness::Fock(world, &nemo); - auto F = Fop(basis, basis); - std::cout << "F\n" << F << "\n"; - - const auto Stest = madness::matrix_inner(world, basis, basis, true); - std::cout << "Overlap over whole basis\n" << Stest << "\n"; - - } - - - - - world.gop.fence(); - if (world.rank() == 0) printf("finished at time %.1f\n", wall_time()); - - - print_stats(world); - finalize(); - - return 0; + madness::initialize(argc, argv); + World world(SafeMPI::COMM_WORLD); + if (world.rank() == 0) printf("starting at time %.1f\n", wall_time()); + const double time_start = wall_time(); + std::cout.precision(6); + + startup(world,argc,argv,true); + print_meminfo(world.rank(), "startup"); + + // Get the name of the input file (if given) + const std::string input = (argc > 1) ? argv[1] : "input"; + + // get the orthogonalization method (cholesky, canonicalize, gs -> Gram-Schmidt, none) and basis_size + const std::string orthogonalization = (argc > 2) ? argv[2] : "cholesky"; + const int basis_size = (argc > 3) ? std::atoi(argv[3]) : 10; + + const bool only_diag = (argc > 4) ? bool(std::atoi(argv[4])) : false; + + if(world.rank()==0){ + std::cout << "\n\n"; + std::cout << "-------------------------------------------------------------------------------------\n"; + std::cout << "SOLVING MRA-PNO-F12 as described in \n"; + std::cout << "J.S. Kottmann, F.A. Bischoff, E.F. Valeev\n"; + std::cout << "Direct determination of optimal pair-natural orbitals in a real-space representation:\n"; + std::cout << "the second-order Møller-Plesset energy\n"; + std::cout << "Journal of Chemical Physics ... 2020\n"; + std::cout << "-------------------------------------------------------------------------------------\n"; + std::cout << "\n\n"; + + std::cout << "This script will run PNO-MP2 and print out tensors in binary\n"; + std::cout << "Call as: pno_integrals inputfile orthogonalization basis_size"; + std::cout << "input is " << input << "\n"; + std::cout << "orthogonalization is " << orthogonalization << "\n"; + std::cout << "basis size is " << basis_size << "\n"; + std::cout << "only diag is " << only_diag << "\n"; + } + + + + + // Compute the SCF Reference + const double time_scf_start = wall_time(); + std::shared_ptr calc(new SCF(world, input)); + Nemo nemo(world, calc, input); + nemo.get_calc()->param.print(); + const double scf_energy = nemo.value(); + if (world.rank() == 0) print("nemo energy: ", scf_energy); + if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); + const double time_scf_end = wall_time(); + + // Compute MRA-PNO-MP2-F12 + const double time_pno_start = wall_time(); + PNOParameters parameters(world,input,nemo.get_calc()->molecule,TAG_PNO); + F12Parameters paramf12(world, input, parameters, TAG_F12); + PNO pno(world, nemo, parameters, paramf12); + std::vector all_pairs; + pno.solve(all_pairs); + const double time_pno_end = wall_time(); + + + if(world.rank()==0){ + std::cout << std::setfill(' '); + std::cout << "\n\n\n"; + std::cout << "--------------------------------------------------\n"; + std::cout << "MRA-PNO-MP2-F12 ended \n"; + std::cout << "--------------------------------------------------\n"; + std::cout << std::setw(25) << "time scf" << " = " << time_scf_end - time_scf_start << "\n"; + std::cout << std::setw(25) << "energy scf" << " = " << scf_energy << "\n"; + std::cout << "--------------------------------------------------\n"; + } + double mp2_energy = 0.0; + std::cout<< std::setw(25) << "time pno" << " = " << time_pno_end - time_pno_start << "\n"; + for(const auto& pairs: all_pairs){ + if(pairs.type == MP2_PAIRTYPE){ + mp2_energy = pairs.energies.total_energy(); + } + std::pair ranks= pno.get_average_rank(pairs.pno_ij); + if(world.rank()==0){ + std::string name; + std::stringstream ss; + ss << pairs.type; + ss >> name; + std::cout<< std::setw(25) << "energy "+name << " = " << pairs.energies.total_energy() << "\n"; + std::cout<< std::setw(25) << "average pno rank " + name << " = " << ranks.first << "\n"; + std::cout<< std::setw(25) << "max pno rank " + name << " = " << ranks.second << "\n"; + } + } + if(world.rank()==0 and mp2_energy != 0.0){ + std::cout << "--------------------------------------------------\n"; + std::cout<< std::setw(25) << "energy(total)" << " = " << scf_energy + mp2_energy << "\n"; + std::cout << "--------------------------------------------------\n"; + std::cout << "\n\n\n"; + } + + // compute orthogonalized mp2 basis and print out hamiltonian tensors + std::cout << std::setprecision(8); + std::cout << std::fixed; + std::cout << std::showpos; + + const bool canonicalize = orthogonalization == "canonicalize"; + const bool orthogonalize = orthogonalization != "none"; + const double h_thresh = 1.e-4; + const double thresh = 1.e-4;//parameters.thresh(); + const auto amo = nemo.get_calc()->amo; + + if(world.rank()==0) std::cout << "Tightening thresholds to 1.e-6 for post-processing\n"; + FunctionDefaults<3>::set_thresh(1.e-6); + + for(auto& pairs: all_pairs){ + const auto& pno_ij = pairs.pno_ij; + const auto& rdm_evals = pairs.rdm_evals_ij; + const bool is_gs = pairs.type == MP2_PAIRTYPE; + std::string name = "gs"; + + vecfuncT reference = amo; + if (not is_gs){ + const auto& x = pairs.cis.x; + reference.insert(reference.end(), x.begin(), x.end()); + name = "ex" + std::to_string(pairs.cis.number); + } + + std::vector all_basis_functions;// = nemo.get_calc()->amo; + + std::vector occ; + // collect PNOs from all pairs and sort by occupation number + for(ElectronPairIterator it=pno.pit();it;++it){ + if (only_diag and not it.diagonal()){ + std::cout << "skipping pair " << it.name() << "\n"; + continue; + }else{ + const auto& pair = pno_ij[it.ij()]; + all_basis_functions.insert(all_basis_functions.end(), pair.begin(), pair.end()); + for (auto ii=0; ii > zipped; + for (auto i=0; i< all_basis_functions.size(); ++i){ + zipped.push_back(std::make_pair(occ[i], all_basis_functions[i])); + } + + std::sort(zipped.begin(), zipped.end(), [](const auto& i, const auto& j) { return i.first > j.first; }); + + std::vector unzipped_first; + std::vector unzipped_second; + for (auto i=0; i Q(world, reference); + all_basis_functions = Q(all_basis_functions); + + // compute overlap for cholesky decomposition + const auto S = madness::matrix_inner(world, all_basis_functions, all_basis_functions, true); + if(world.rank()==0) std::cout << "Overlap Matrix of all PNOs:\n"; + for (int i=0;i (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); + + // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + + auto fop = std::shared_ptr < real_convolution_3d > (SlaterF12OperatorPtr(world, paramf12.gamma(), 1.e-6, parameters.op_thresh())); + fop->is_slaterf12 = false; // make sure it is the correct formulation of the exponent + + + /* Here (or 3 lines further up), read in {cabs} basis if required + * -> read in {cabs} + * -> orthogonalize {cabs} + * -> {all_basis_functions} = {all_PNOs} + {cabs} + * -> compute integrals based on {all_basis_functions} + */ + // > define Q here (reference proj now!) + // > different routine for orthonormalization? -> GS? + // > check whether we only project out PNO's used in PNO-basis! + bool corr_cabs = true; // todo: read from params file + auto basis_full = all_basis_functions; + if (corr_cabs) { + std::vector cabs; + cabs = pno.f12.read_cabs_from_file(paramf12.auxbas_file()); // sadly, F12Potential f12 is private member of pno... + if (not cabs.empty()){ + MyTimer time2 = MyTimer(world).start(); + // Project out reference + cabs = Q(cabs); + // Orthonormalize {cabs} + cabs = orthonormalize_cd(cabs); + // Project out {pno} + //for (ElectronPairIterator it = pno.pit(); it; ++it) { + //right now this will make the same guess for all pairs + //const vector_real_function_3d tmp=guess_virtuals(param.abs); + //madness::QProjector Qpno(world, pno[it.ij()]); + //cabs = Qpno(cabs); + //const vector_real_function_3d tmp = Qpno(cabs); + //abs_ij[it.ij()] = tmp; + //} + madness::QProjector Qpno(world, all_basis_functions); + cabs = Qpno(cabs); + time2.stop().print("Make pair specific ABS from PNOS and " + std::to_string(cabs.size()) + " functions"); + } + else if (cabs.empty()) { + std::cout << "Complaining..." << std::endl; // todo: raise exception or so + } + + // Merge {cabs} + {pno} + // necessary? + if(world.rank()==0) std::cout << "Adding {cabs} to {pno}.\n"; + basis_full.insert(basis_full.begin(), cabs.begin(), cabs.end()); + + + } + + + + // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + + + + + + auto basis = basis_full; // all_basis_functions; + + if (orthogonalize){ + + //basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); + //Use standard cd, since pivoting swaps PNOs around + if (orthogonalization == "cholesky") { + basis = madness::orthonormalize_cd(all_basis_functions); + if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; + } + + //do gram-schmidt + else if (orthogonalization == "gs") { + std::cout << "orthonormalize...\n"; + // u_0 = v_0 + double norm_i = std::sqrt(basis[0].inner(basis[0])); + basis[0].scale(1.0/norm_i); + // Gram-Schmidt iterations + for (int i=1; i basis_j(1); + basis_j[0] = basis[j]; + Q = madness::QProjector (world, basis_j); + basis[i] = Q(basis[i]); + } + norm_i = std::sqrt(basis[i].inner(basis[i])); + basis[i].scale(1.0/norm_i); + } + } + + if(world.rank()==0) std::cout << "Basis size after Gram-Schmidt: " << basis.size() << "\n"; + + } + + if(world.rank()==0) std::cout << "Adding Reference orbitals\n"; + const auto amo = nemo.get_calc()->amo; + basis.insert(basis.begin(), reference.begin(), reference.end()); + + madness::Tensor g(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = + madness::Tensor f(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = + + + if(canonicalize){ + if(world.rank()==0) std::cout << "canonicalizing!\n"; + auto F = madness::Fock(world, &nemo); + const auto Fmat = F(basis, basis); + Tensor U, evals; + syev(Fmat, U, evals); + basis = madness::transform(world, basis, U); + } + + std::vector PQ; + for (const auto& x : basis){ + PQ.push_back(madness::truncate(x*basis,thresh)); + } + std::vector GPQ; + std::vector FPQ; + for (const auto& x : basis){ + GPQ.push_back(madness::truncate(madness::apply(world, *gop, madness::truncate(x*basis,thresh)), thresh)); + FPQ.push_back(madness::truncate(madness::apply(world, *fop, madness::truncate(x*basis,thresh)), thresh)); + } + + auto J = madness::Coulomb(world, &nemo); + auto K = madness::Exchange(world, &nemo, 0); + auto Jmat = J(basis, basis); + auto Kmat = K(basis, basis); + + + + int non_zero=0, non_zero_f=0; + if(world.rank() ==0 ) std::cout << "Compute G Tensor:\n"; + for (auto p=0; p h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + ++non_zero; + } + } + if (FPQ[r][s].norm2() < h_thresh) continue; + else{ + f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + if(std::fabs(f(p,q,r,s)) > h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " f " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + ++non_zero_f; + } + } + } + } + } + } + int non_zero_h = 0; + + Tensor h; + if(canonicalize){ + auto F = madness::Fock(world, &nemo); + h = F(basis, basis); + }else{ + auto T = madness::Kinetic(world); + auto V = madness::Nuclear(world, &nemo); + h = T(basis,basis) + V(basis,basis); + } + for (int i=0;i h_thresh){ + if(world.rank()==0 and basis.size() < 3) std::cout << " h " << i << " "<< j << " "<< h(i,j) << "\n"; + ++non_zero_h; + } + } + } + + if(world.rank()==0) { + std::cout << "non zero elements:\n g : " << non_zero; + std::cout << "\n f :" << non_zero_f <<"\n h : " << non_zero_h << "\n"; + } + + h = h.flat(); + nc::NdArray hh(h.ptr(), h.size(), 1); + hh.tofile(name+"_hcore.bin", ""); + + g = g.flat(); + nc::NdArray gg(g.ptr(), g.size(), 1); + gg.tofile(name+"_gtensor.bin", ""); + + f = f.flat(); + nc::NdArray ff(f.ptr(), f.size(), 1); + ff.tofile(name+"_f12tensor.bin", ""); + + if (not orthogonalize){ + auto S = madness::matrix_inner(world, basis, basis, true); + S = S.flat(); + nc::NdArray gg(S.ptr(), S.size(), 1); + gg.tofile(name+"_overlap.bin", ""); + } + + auto Fop = madness::Fock(world, &nemo); + auto F = Fop(basis, basis); + std::cout << "F\n" << F << "\n"; + + const auto Stest = madness::matrix_inner(world, basis, basis, true); + std::cout << "Overlap over whole basis\n" << Stest << "\n"; + + } + + + + + world.gop.fence(); + if (world.rank() == 0) printf("finished at time %.1f\n", wall_time()); + + + print_stats(world); + finalize(); + + return 0; } From 9747f1c73e909d89a8b1d74d4e3a8de4a53509d8 Mon Sep 17 00:00:00 2001 From: oi995116 Date: Fri, 10 Jul 2020 13:31:38 +0200 Subject: [PATCH 0086/1312] cabs for pnos --- src/apps/pno/pno_integrals.cpp | 86 +++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 7f45a1ab6a6..990cf39fb6d 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -225,7 +225,51 @@ int main(int argc, char** argv) { } auto gop = std::shared_ptr < real_convolution_3d > (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); - // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + + auto basis = all_basis_functions; + + if (orthogonalize){ + + //basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); + //Use standard cd, since pivoting swaps PNOs around + if (orthogonalization == "cholesky") { + basis = madness::orthonormalize_cd(all_basis_functions); + if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; + } + + //do gram-schmidt + else if (orthogonalization == "gs") { + std::cout << "orthonormalize...\n"; + // u_0 = v_0 + double norm_i = std::sqrt(basis[0].inner(basis[0])); + basis[0].scale(1.0/norm_i); + // Gram-Schmidt iterations + for (int i=1; i basis_j(1); + basis_j[0] = basis[j]; + Q = madness::QProjector (world, basis_j); + basis[i] = Q(basis[i]); + } + norm_i = std::sqrt(basis[i].inner(basis[i])); + basis[i].scale(1.0/norm_i); + } + } + + if(world.rank()==0) std::cout << "Basis size after Gram-Schmidt: " << basis.size() << "\n"; + + } + + + + + + + + + + // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| auto fop = std::shared_ptr < real_convolution_3d > (SlaterF12OperatorPtr(world, paramf12.gamma(), 1.e-6, parameters.op_thresh())); fop->is_slaterf12 = false; // make sure it is the correct formulation of the exponent @@ -271,7 +315,9 @@ int main(int argc, char** argv) { // Merge {cabs} + {pno} // necessary? if(world.rank()==0) std::cout << "Adding {cabs} to {pno}.\n"; - basis_full.insert(basis_full.begin(), cabs.begin(), cabs.end()); + if(world.rank()==0) std::cout << "Size before: " << basis.size() << ".\n"; + basis.insert(basis.end(), cabs.begin(), cabs.end()); + if(world.rank()==0) std::cout << "Size after: " << basis.size() << ".\n"; } @@ -283,42 +329,6 @@ int main(int argc, char** argv) { - - auto basis = basis_full; // all_basis_functions; - - if (orthogonalize){ - - //basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); - //Use standard cd, since pivoting swaps PNOs around - if (orthogonalization == "cholesky") { - basis = madness::orthonormalize_cd(all_basis_functions); - if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; - } - - //do gram-schmidt - else if (orthogonalization == "gs") { - std::cout << "orthonormalize...\n"; - // u_0 = v_0 - double norm_i = std::sqrt(basis[0].inner(basis[0])); - basis[0].scale(1.0/norm_i); - // Gram-Schmidt iterations - for (int i=1; i basis_j(1); - basis_j[0] = basis[j]; - Q = madness::QProjector (world, basis_j); - basis[i] = Q(basis[i]); - } - norm_i = std::sqrt(basis[i].inner(basis[i])); - basis[i].scale(1.0/norm_i); - } - } - - if(world.rank()==0) std::cout << "Basis size after Gram-Schmidt: " << basis.size() << "\n"; - - } - if(world.rank()==0) std::cout << "Adding Reference orbitals\n"; const auto amo = nemo.get_calc()->amo; basis.insert(basis.begin(), reference.begin(), reference.end()); From e8471487f1b1594384beb26a75a90191d5855258 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Fri, 10 Jul 2020 12:09:24 -0400 Subject: [PATCH 0087/1312] save final pnos --- src/apps/pno/pno_integrals.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index b270161a8cc..c1f7e08dfd6 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -228,6 +228,10 @@ int main(int argc, char** argv) { basis = cp; } + for(auto i=0;iamo; basis.insert(basis.begin(), reference.begin(), reference.end()); From 58f14c4727d0d1318dd98c149ce75d0a37b1a16a Mon Sep 17 00:00:00 2001 From: Philipp Schleich Date: Sun, 12 Jul 2020 16:45:56 +0200 Subject: [PATCH 0088/1312] cabs ctd, add cabs after reference --- src/apps/pno/pno_integrals.cpp | 53 ++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 990cf39fb6d..4c643cc181c 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -261,17 +261,16 @@ int main(int argc, char** argv) { } - - - - - + if(world.rank()==0) std::cout << "Adding Reference orbitals\n"; + const auto amo = nemo.get_calc()->amo; + basis.insert(basis.begin(), reference.begin(), reference.end()); // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| auto fop = std::shared_ptr < real_convolution_3d > (SlaterF12OperatorPtr(world, paramf12.gamma(), 1.e-6, parameters.op_thresh())); + // auto slaterop = SlaterOperator(world, paramf12.gamma(), 1.e-6, parameters.op_thresh()); fop->is_slaterf12 = false; // make sure it is the correct formulation of the exponent @@ -285,17 +284,19 @@ int main(int argc, char** argv) { // > different routine for orthonormalization? -> GS? // > check whether we only project out PNO's used in PNO-basis! bool corr_cabs = true; // todo: read from params file - auto basis_full = all_basis_functions; + auto pno_plus_ref = basis; if (corr_cabs) { std::vector cabs; cabs = pno.f12.read_cabs_from_file(paramf12.auxbas_file()); // sadly, F12Potential f12 is private member of pno... if (not cabs.empty()){ MyTimer time2 = MyTimer(world).start(); - // Project out reference - cabs = Q(cabs); + // Project out reference + //cabs = Q(cabs); + // Project out {pno} + ref + madness::QProjector Qpno(world, pno_plus_ref); + cabs = Qpno(cabs); // Orthonormalize {cabs} cabs = orthonormalize_cd(cabs); - // Project out {pno} //for (ElectronPairIterator it = pno.pit(); it; ++it) { //right now this will make the same guess for all pairs //const vector_real_function_3d tmp=guess_virtuals(param.abs); @@ -304,9 +305,7 @@ int main(int argc, char** argv) { //const vector_real_function_3d tmp = Qpno(cabs); //abs_ij[it.ij()] = tmp; //} - madness::QProjector Qpno(world, all_basis_functions); - cabs = Qpno(cabs); - time2.stop().print("Make pair specific ABS from PNOS and " + std::to_string(cabs.size()) + " functions"); + time2.stop().print("Make pair specific ABS from PNOS and " + std::to_string(cabs.size()) + " functions"); } else if (cabs.empty()) { std::cout << "Complaining..." << std::endl; // todo: raise exception or so @@ -314,7 +313,7 @@ int main(int argc, char** argv) { // Merge {cabs} + {pno} // necessary? - if(world.rank()==0) std::cout << "Adding {cabs} to {pno}.\n"; + if(world.rank()==0) std::cout << "Adding {cabs} to {pno+ref}.\n"; if(world.rank()==0) std::cout << "Size before: " << basis.size() << ".\n"; basis.insert(basis.end(), cabs.begin(), cabs.end()); if(world.rank()==0) std::cout << "Size after: " << basis.size() << ".\n"; @@ -329,12 +328,9 @@ int main(int argc, char** argv) { - if(world.rank()==0) std::cout << "Adding Reference orbitals\n"; - const auto amo = nemo.get_calc()->amo; - basis.insert(basis.begin(), reference.begin(), reference.end()); - madness::Tensor g(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = - madness::Tensor f(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = + madness::Tensor f(basis.size(), basis.size(), basis.size(), basis.size()); + // madness::Tensor slater(basis.size(), basis.size(), basis.size(), basis.size()); if(canonicalize){ @@ -352,9 +348,11 @@ int main(int argc, char** argv) { } std::vector GPQ; std::vector FPQ; + //std::vector slaterPQ; for (const auto& x : basis){ GPQ.push_back(madness::truncate(madness::apply(world, *gop, madness::truncate(x*basis,thresh)), thresh)); FPQ.push_back(madness::truncate(madness::apply(world, *fop, madness::truncate(x*basis,thresh)), thresh)); + //slaterPQ.push_back(madness::truncate(madness::apply(world, slaterop, madness::truncate(x*basis,thresh)), thresh)); } auto J = madness::Coulomb(world, &nemo); @@ -362,7 +360,20 @@ int main(int argc, char** argv) { auto Jmat = J(basis, basis); auto Kmat = K(basis, basis); - + // delete me --------------------------------------------- + for (auto p=0; p h_thresh ){ if(world.rank()==0 and basis.size() < 3) std::cout << " f " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; ++non_zero_f; @@ -432,6 +444,9 @@ int main(int argc, char** argv) { f = f.flat(); nc::NdArray ff(f.ptr(), f.size(), 1); ff.tofile(name+"_f12tensor.bin", ""); + //slater = slater.flat(); + //nc::NdArray ss(slater.ptr(), slater.size(), 1); + //ss.tofile(name+"_f12_tensor.bin", ""); if (not orthogonalize){ auto S = madness::matrix_inner(world, basis, basis, true); From 2b87be1035e75f690a426b8dba523f86b83fe344 Mon Sep 17 00:00:00 2001 From: oi995116 Date: Tue, 14 Jul 2020 09:39:05 +0200 Subject: [PATCH 0089/1312] fixed bug, some problems when orthogonalizing before cabs-creation --- src/apps/pno/pno_integrals.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 7f45a1ab6a6..2e67c789fc7 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -241,7 +241,7 @@ int main(int argc, char** argv) { // > different routine for orthonormalization? -> GS? // > check whether we only project out PNO's used in PNO-basis! bool corr_cabs = true; // todo: read from params file - auto basis_full = all_basis_functions; + auto basis = all_basis_functions; if (corr_cabs) { std::vector cabs; cabs = pno.f12.read_cabs_from_file(paramf12.auxbas_file()); // sadly, F12Potential f12 is private member of pno... @@ -249,8 +249,8 @@ int main(int argc, char** argv) { MyTimer time2 = MyTimer(world).start(); // Project out reference cabs = Q(cabs); - // Orthonormalize {cabs} - cabs = orthonormalize_cd(cabs); + // Orthonormalize {cabs} --> this is done later + //cabs = orthonormalize_cd(cabs); // Project out {pno} //for (ElectronPairIterator it = pno.pit(); it; ++it) { //right now this will make the same guess for all pairs @@ -271,7 +271,7 @@ int main(int argc, char** argv) { // Merge {cabs} + {pno} // necessary? if(world.rank()==0) std::cout << "Adding {cabs} to {pno}.\n"; - basis_full.insert(basis_full.begin(), cabs.begin(), cabs.end()); + basis.insert(basis.end(), cabs.begin(), cabs.end()); } @@ -283,15 +283,14 @@ int main(int argc, char** argv) { - - auto basis = basis_full; // all_basis_functions; + if(world.rank()==0) std::cout << "About to orthogonalize basis..." << std::endl; if (orthogonalize){ //basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); //Use standard cd, since pivoting swaps PNOs around if (orthogonalization == "cholesky") { - basis = madness::orthonormalize_cd(all_basis_functions); + basis = madness::orthonormalize_cd(basis); if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; } @@ -313,9 +312,9 @@ int main(int argc, char** argv) { norm_i = std::sqrt(basis[i].inner(basis[i])); basis[i].scale(1.0/norm_i); } + if(world.rank()==0) std::cout << "Basis size after Gram-Schmidt: " << basis.size() << "\n"; } - if(world.rank()==0) std::cout << "Basis size after Gram-Schmidt: " << basis.size() << "\n"; } From 7d8831ff18582f04419c5fb330401098ce222203 Mon Sep 17 00:00:00 2001 From: Philipp Schleich Date: Wed, 15 Jul 2020 19:18:26 +0200 Subject: [PATCH 0090/1312] fixed bug... inserting basis functions at std.end() does not work! --- src/apps/pno/pno_integrals.cpp | 44 +++++++++++++++------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 4c643cc181c..042f42115dc 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -30,22 +30,6 @@ const std::string TAG_CP = "computeprotocol"; // this needs to be added to include #include "NumCpp.hpp" -//std::vector gram_schmidt(World world, std::vector &in_basis){ - //auto out_basis = in_basis; - //out_basis[0] = in_basis[0]; - //std::cout << "norm of 0: " << std::sqrt(out_basis[0].inner(out_basis[0])) << std::endl; - //for (int i=1; i (world, out_basis[j]); - //out_basis[i] = Q(out_basis[i]); - //} - //std::cout << "norm of " << i << ": " << std::sqrt(out_basis[i].inner(out_basis[i])) << std::endl; - //} - - //return out_basis; -//} - int main(int argc, char** argv) { madness::initialize(argc, argv); @@ -289,14 +273,17 @@ int main(int argc, char** argv) { std::vector cabs; cabs = pno.f12.read_cabs_from_file(paramf12.auxbas_file()); // sadly, F12Potential f12 is private member of pno... if (not cabs.empty()){ + std::cout << "Found CABS..." << std::endl; MyTimer time2 = MyTimer(world).start(); // Project out reference //cabs = Q(cabs); // Project out {pno} + ref - madness::QProjector Qpno(world, pno_plus_ref); + std::cout << "/tProject out PNO + ref" << std::endl; + madness::QProjector Qpno(world, pno_plus_ref); cabs = Qpno(cabs); // Orthonormalize {cabs} - cabs = orthonormalize_cd(cabs); + std::cout << "/tOrthogonalize" << std::endl; + cabs = orthonormalize_rrcd(cabs, 1.e-5); // order does not really matter here.. //for (ElectronPairIterator it = pno.pit(); it; ++it) { //right now this will make the same guess for all pairs //const vector_real_function_3d tmp=guess_virtuals(param.abs); @@ -305,7 +292,7 @@ int main(int argc, char** argv) { //const vector_real_function_3d tmp = Qpno(cabs); //abs_ij[it.ij()] = tmp; //} - time2.stop().print("Make pair specific ABS from PNOS and " + std::to_string(cabs.size()) + " functions"); + time2.stop().print("Made pair specific ABS from PNOS and " + std::to_string(cabs.size()) + " functions"); } else if (cabs.empty()) { std::cout << "Complaining..." << std::endl; // todo: raise exception or so @@ -315,7 +302,10 @@ int main(int argc, char** argv) { // necessary? if(world.rank()==0) std::cout << "Adding {cabs} to {pno+ref}.\n"; if(world.rank()==0) std::cout << "Size before: " << basis.size() << ".\n"; - basis.insert(basis.end(), cabs.begin(), cabs.end()); + auto basis2 = basis; + std::vector basis; + basis.insert(basis.begin(), cabs.begin(), cabs.end()); + basis.insert(basis.begin(), pno_plus_ref.begin(), pno_plus_ref.end()); if(world.rank()==0) std::cout << "Size after: " << basis.size() << ".\n"; @@ -358,21 +348,25 @@ int main(int argc, char** argv) { auto J = madness::Coulomb(world, &nemo); auto K = madness::Exchange(world, &nemo, 0); auto Jmat = J(basis, basis); + auto Jmat1 = J(reference, reference); auto Kmat = K(basis, basis); + auto Kmat1 = K(reference, reference); // delete me --------------------------------------------- - for (auto p=0; p Date: Wed, 15 Jul 2020 20:36:42 +0200 Subject: [PATCH 0091/1312] now cluster is fixed.. --- src/apps/pno/pno_integrals.cpp | 51 +++++----------------------------- 1 file changed, 7 insertions(+), 44 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 5e115842d21..042f42115dc 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -278,9 +278,11 @@ int main(int argc, char** argv) { // Project out reference //cabs = Q(cabs); // Project out {pno} + ref - std::cout << "/tProject out PNO + ref" << std::endl; + std::cout << "/tProject out PNO + ref" << std::endl; + madness::QProjector Qpno(world, pno_plus_ref); + cabs = Qpno(cabs); // Orthonormalize {cabs} - std::cout << "/tOrthogonalize" << std::endl; + std::cout << "/tOrthogonalize" << std::endl; cabs = orthonormalize_rrcd(cabs, 1.e-5); // order does not really matter here.. //for (ElectronPairIterator it = pno.pit(); it; ++it) { //right now this will make the same guess for all pairs @@ -301,9 +303,9 @@ int main(int argc, char** argv) { if(world.rank()==0) std::cout << "Adding {cabs} to {pno+ref}.\n"; if(world.rank()==0) std::cout << "Size before: " << basis.size() << ".\n"; auto basis2 = basis; - std::vector basis; - basis.insert(basis.begin(), cabs.begin(), cabs.end()); - basis.insert(basis.begin(), pno_plus_ref.begin(), pno_plus_ref.end()); + std::vector basis; + basis.insert(basis.begin(), cabs.begin(), cabs.end()); + basis.insert(basis.begin(), pno_plus_ref.begin(), pno_plus_ref.end()); if(world.rank()==0) std::cout << "Size after: " << basis.size() << ".\n"; @@ -316,45 +318,6 @@ int main(int argc, char** argv) { - if(world.rank()==0) std::cout << "About to orthogonalize basis..." << std::endl; - - if (orthogonalize){ - - //basis = madness::orthonormalize_rrcd(all_basis_functions, 1.e-5); - //Use standard cd, since pivoting swaps PNOs around - if (orthogonalization == "cholesky") { - basis = madness::orthonormalize_cd(basis); - if(world.rank()==0) std::cout << "Basis size after global Cholesky: " << basis.size() << "\n"; - } - - //do gram-schmidt - else if (orthogonalization == "gs") { - std::cout << "orthonormalize...\n"; - // u_0 = v_0 - double norm_i = std::sqrt(basis[0].inner(basis[0])); - basis[0].scale(1.0/norm_i); - // Gram-Schmidt iterations - for (int i=1; i basis_j(1); - basis_j[0] = basis[j]; - Q = madness::QProjector (world, basis_j); - basis[i] = Q(basis[i]); - } - norm_i = std::sqrt(basis[i].inner(basis[i])); - basis[i].scale(1.0/norm_i); - } - if(world.rank()==0) std::cout << "Basis size after Gram-Schmidt: " << basis.size() << "\n"; - } - - - } - - if(world.rank()==0) std::cout << "Adding Reference orbitals\n"; - const auto amo = nemo.get_calc()->amo; - basis.insert(basis.begin(), reference.begin(), reference.end()); - madness::Tensor g(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = madness::Tensor f(basis.size(), basis.size(), basis.size(), basis.size()); // madness::Tensor slater(basis.size(), basis.size(), basis.size(), basis.size()); From 947732ef701e6bc664fbdf2716af8ea58b558262 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Tue, 28 Jul 2020 12:33:06 -0400 Subject: [PATCH 0092/1312] update --- src/apps/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt index 07eb9ccacc4..75b061c2e06 100644 --- a/src/apps/CMakeLists.txt +++ b/src/apps/CMakeLists.txt @@ -7,7 +7,7 @@ add_subdirectory(tdse) add_subdirectory(moldft) add_subdirectory(pno) add_subdirectory(cis) -add_subdirectory(tequila) +#add_subdirectory(tequila) #add_subdirectory(exciting) #add_subdirectory(hf) #add_subdirectory(ii) From f4897ffe3240e42debf51fc7f3b6039aaf5b41aa Mon Sep 17 00:00:00 2001 From: oi995116 Date: Fri, 4 Sep 2020 16:05:48 +0200 Subject: [PATCH 0093/1312] cleaned up pno_integrals a bit --- src/apps/pno/pno_integrals.cpp | 351 ++++++++++++++++++++++++--------- 1 file changed, 263 insertions(+), 88 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 042f42115dc..0e951b113a0 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -20,6 +20,8 @@ #include #include +//#include "smart_integrals_for_pno.h" + using namespace madness; // DEFINE PARAMETER TAGS FOR THE INPUT FILE @@ -48,7 +50,10 @@ int main(int argc, char** argv) { const std::string orthogonalization = (argc > 2) ? argv[2] : "cholesky"; const int basis_size = (argc > 3) ? std::atoi(argv[3]) : 10; - const bool only_diag = (argc > 4) ? bool(std::atoi(argv[4])) : false; + const std::string cabs_option = (argc > 4) ? argv[4] : "none"; // options: "cabs-pno", "cabs-gbs" + // Use the first pno_obs pno's as OBS, and the rest until basis_size as CABS -- mandatory for cabs-pno + const int pno_obs_size = (argc > 5) ? std::atoi(argv[5]) : -1; + const bool only_diag = (argc > 6) ? bool(std::atoi(argv[6])) : false; if(world.rank()==0){ std::cout << "\n\n"; @@ -66,6 +71,8 @@ int main(int argc, char** argv) { std::cout << "input is " << input << "\n"; std::cout << "orthogonalization is " << orthogonalization << "\n"; std::cout << "basis size is " << basis_size << "\n"; + std::cout << "using CABS-option: " << cabs_option << "\n"; + std::cout << "with pno-OBS-size: " << pno_obs_size << "\n"; std::cout << "only diag is " << only_diag << "\n"; } @@ -208,8 +215,9 @@ int main(int argc, char** argv) { if(world.rank()==0) std::cout << "\n"; } auto gop = std::shared_ptr < real_convolution_3d > (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); + auto fop = SlaterOperator(world, paramf12.gamma(), 1.e-6, parameters.op_thresh()); - + // reference will be added further below auto basis = all_basis_functions; if (orthogonalize){ @@ -249,40 +257,26 @@ int main(int argc, char** argv) { const auto amo = nemo.get_calc()->amo; basis.insert(basis.begin(), reference.begin(), reference.end()); + auto pno_plus_ref = basis; - // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| - - auto fop = std::shared_ptr < real_convolution_3d > (SlaterF12OperatorPtr(world, paramf12.gamma(), 1.e-6, parameters.op_thresh())); - // auto slaterop = SlaterOperator(world, paramf12.gamma(), 1.e-6, parameters.op_thresh()); - fop->is_slaterf12 = false; // make sure it is the correct formulation of the exponent - - /* Here (or 3 lines further up), read in {cabs} basis if required - * -> read in {cabs} - * -> orthogonalize {cabs} - * -> {all_basis_functions} = {all_PNOs} + {cabs} - * -> compute integrals based on {all_basis_functions} - */ - // > define Q here (reference proj now!) - // > different routine for orthonormalization? -> GS? - // > check whether we only project out PNO's used in PNO-basis! - bool corr_cabs = true; // todo: read from params file - auto pno_plus_ref = basis; - if (corr_cabs) { + // Set up CABS if desired + if (cabs_option.compare("cabs-gbs")==0) { + std::cout << "Looking for external CABS basis..." << std::endl; std::vector cabs; cabs = pno.f12.read_cabs_from_file(paramf12.auxbas_file()); // sadly, F12Potential f12 is private member of pno... - if (not cabs.empty()){ - std::cout << "Found CABS..." << std::endl; + if (not cabs.empty()) { + std::cout << "Found CABS..." << std::endl; MyTimer time2 = MyTimer(world).start(); // Project out reference //cabs = Q(cabs); // Project out {pno} + ref - std::cout << "/tProject out PNO + ref" << std::endl; - madness::QProjector Qpno(world, pno_plus_ref); + std::cout << "\tProject out PNO + ref" << std::endl; + madness::QProjector Qpno(world, pno_plus_ref); cabs = Qpno(cabs); // Orthonormalize {cabs} - std::cout << "/tOrthogonalize" << std::endl; + std::cout << "\tOrthogonalize" << std::endl; cabs = orthonormalize_rrcd(cabs, 1.e-5); // order does not really matter here.. //for (ElectronPairIterator it = pno.pit(); it; ++it) { //right now this will make the same guess for all pairs @@ -293,36 +287,41 @@ int main(int argc, char** argv) { //abs_ij[it.ij()] = tmp; //} time2.stop().print("Made pair specific ABS from PNOS and " + std::to_string(cabs.size()) + " functions"); - } - else if (cabs.empty()) { - std::cout << "Complaining..." << std::endl; // todo: raise exception or so - } - + // Merge {cabs} + {pno} - // necessary? if(world.rank()==0) std::cout << "Adding {cabs} to {pno+ref}.\n"; - if(world.rank()==0) std::cout << "Size before: " << basis.size() << ".\n"; - auto basis2 = basis; - std::vector basis; - basis.insert(basis.begin(), cabs.begin(), cabs.end()); - basis.insert(basis.begin(), pno_plus_ref.begin(), pno_plus_ref.end()); + if(world.rank()==0) std::cout << "Size before: " << pno_plus_ref.size() << ".\n"; + if(world.rank()==0) std::cout << "Size cabs: " << cabs.size() << ".\n"; + basis = cabs; + if(world.rank()==0) std::cout << "Making sure intermediate is ok: " << basis.size() << ".\n"; + //basis.insert(basis.end()-1, cabs.begin(), cabs.end()); + basis.insert(basis.begin(), pno_plus_ref.begin(), pno_plus_ref.end()); if(world.rank()==0) std::cout << "Size after: " << basis.size() << ".\n"; + + } + else if (cabs.empty()) { + std::cout << "CABS basis set not found..." << std::endl; + } + } + // Set up hcore, g and f tensor + int size_full = basis.size(); + int size_obs = pno_plus_ref.size(); + // Overwrite if want to use PNO as CABS + if (pno_obs_size != -1) { + size_obs = pno_obs_size; + } + if (world.rank()==0) { + std::cout << "Set full size to " << size_full << std::endl; + std::cout << "Set OBS size to " << size_obs << std::endl; } - - - // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| - - - - - madness::Tensor g(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = - madness::Tensor f(basis.size(), basis.size(), basis.size(), basis.size()); - // madness::Tensor slater(basis.size(), basis.size(), basis.size(), basis.size()); - + if(world.rank()==0) std::cout << "Allocate g and f tensors." << std::endl; + madness::Tensor g(size_full, size_obs, size_full, size_obs); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = + madness::Tensor f(size_full, size_obs, size_full, size_obs); + if(world.rank()==0) std::cout << "Apply g and f ops." << std::endl; if(canonicalize){ if(world.rank()==0) std::cout << "canonicalizing!\n"; auto F = madness::Fock(world, &nemo); @@ -338,63 +337,207 @@ int main(int argc, char** argv) { } std::vector GPQ; std::vector FPQ; - //std::vector slaterPQ; + unsigned i=0; for (const auto& x : basis){ + if(world.rank()==0) std::cout << "\t " << i << "\t" << std::endl; i++; GPQ.push_back(madness::truncate(madness::apply(world, *gop, madness::truncate(x*basis,thresh)), thresh)); - FPQ.push_back(madness::truncate(madness::apply(world, *fop, madness::truncate(x*basis,thresh)), thresh)); - //slaterPQ.push_back(madness::truncate(madness::apply(world, slaterop, madness::truncate(x*basis,thresh)), thresh)); + FPQ.push_back(madness::truncate(madness::apply(world, fop, madness::truncate(x*basis,thresh)), thresh)); } + if(world.rank()==0) std::cout << "Build J and K tensor." << std::endl; auto J = madness::Coulomb(world, &nemo); auto K = madness::Exchange(world, &nemo, 0); auto Jmat = J(basis, basis); - auto Jmat1 = J(reference, reference); auto Kmat = K(basis, basis); - auto Kmat1 = K(reference, reference); - - // delete me --------------------------------------------- - std::cout << "Jmat:" << std::endl; - for (auto p=0; p=q) { + for (int r=0; r=s*size_obs+r && (p>=q || s>=r)) + if ((p*size_obs+q >= r*size_obs+s)) { + // g-tensor + if (GPQ[r][s].norm2() >= h_thresh){ + g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); + if(canonicalize and p==q){ + g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); + }else if(canonicalize and r==s){ + g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); + } + // symm + g(r,s,p,q) = g(p,q,r,s); + if(std::fabs(g(p,q,r,s)) > h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + non_zero += (p!=r && q!=s)? 2 : 1; + } + } + // f12-tensor, only if cabs are used + if (FPQ[r][s].norm2() >= h_thresh and cabs_option.compare("none")==0) { + //f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + // symm + f(r,s,p,q) = f(p,q,r,s); + if(std::fabs(f(p,q,r,s)) > h_thresh ){ + non_zero_f += (p!=r && q!=s)? 2 : 1; + } + } + } + } + } + } + // (NN|MN) + for (int r=size_obs; r= size_obs) && !(r >= size_obs)) || + // (!(p >= size_obs) && (r >= size_obs)) ) + for (int s=0; s= h_thresh) { + g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); + if(canonicalize and p==q){ + g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); + }else if(canonicalize and r==s){ + g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); + } + if(std::fabs(g(p,q,r,s)) > h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + ++non_zero; + } + } + // f12-tensor + if (FPQ[r][s].norm2() >= h_thresh and cabs_option.compare("none")==0) { + //f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + if(std::fabs(f(p,q,r,s)) > h_thresh ){ + ++non_zero_f; + } + } + } + } + + } + else if (p >= size_obs){ + // special treatment for (MN|MN), M>N + for (int r=size_obs; rqprs->pqsr->qpsr symmetry, others don't + for (int s=0; s<=size_obs; s++){ + if ((p*size_full+q >= r*size_full+s)) { + // g-tensor + if (GPQ[r][s].norm2() >= h_thresh) { + g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); + if(canonicalize and p==q){ + g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); + }else if(canonicalize and r==s){ + g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); + } + g(r,s,p,q) = g(p,q,r,s); + if(std::fabs(g(p,q,r,s)) > h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + ++non_zero; + } + } + // f12-tensor + if (FPQ[r][s].norm2() >= h_thresh and cabs_option.compare("none")==0) { + f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + f(r,s,p,q) = f(p,q,r,s); + if(std::fabs(f(p,q,r,s)) > h_thresh ){ + ++non_zero_f; + } + } + } + } + } + // (MN|NN) + for (int r=0; r= h_thresh) { + g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); + if(canonicalize and p==q){ + g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); + }else if(canonicalize and r==s){ + g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); + } + if(std::fabs(g(p,q,r,s)) > h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + ++non_zero; + } + } + // f12-tensor + if (FPQ[r][s].norm2() >= h_thresh and cabs_option.compare("none")==0) { + f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + if(std::fabs(f(p,q,r,s)) > h_thresh ){ + ++non_zero_f; + } + } + } + } + } + } + } + // Assemble full g,f from symmetries (misses pqrs->qpsr) + if (world.rank()==0) std::cout << "Assemble g,f using symmetries..." << std::endl; + for (int p=0; p G(size_full, size_full, size_full, size_full); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = + //madness::Tensor f(basis.size(), basis.size(), basis.size(), basis.size()); + madness::Tensor Slater(size_full, size_full, size_full, size_full); + + + + if(world.rank() ==0 ) std::cout << "Compute G Tensor:\n"; + for (auto p=0; p h_thresh ){ - if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + if(std::fabs(G(p,q,r,s)) > h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << G(p,q,r,s) << "\n"; ++non_zero; } } if (FPQ[r][s].norm2() < h_thresh) continue; else{ - f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); - //slater(p,q,r,s) = PQ[p][q].inner(slaterPQ[r][s]); - if(std::fabs(f(p,q,r,s)) > h_thresh ){ - if(world.rank()==0 and basis.size() < 3) std::cout << " f " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + Slater(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + if(std::fabs(Slater(p,q,r,s)) > h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " f " << p << " "<< q << " "<< r << " "<< s << " = " << Slater(p,q,r,s) << "\n"; ++non_zero_f; } } @@ -402,6 +545,38 @@ int main(int argc, char** argv) { } } } + double ggg=0; double sss=0; + madness::Tensor diff(size_full, size_full, size_full, size_full); + madness::Tensor diff2(size_full, size_full, size_full, size_full); + if(world.rank() ==0 ) std::cout << "G old:\n"; + for (auto p=0; p h; @@ -427,6 +602,7 @@ int main(int argc, char** argv) { std::cout << "\n f :" << non_zero_f <<"\n h : " << non_zero_h << "\n"; } + // Save tensors to file h = h.flat(); nc::NdArray hh(h.ptr(), h.size(), 1); hh.tofile(name+"_hcore.bin", ""); @@ -435,12 +611,11 @@ int main(int argc, char** argv) { nc::NdArray gg(g.ptr(), g.size(), 1); gg.tofile(name+"_gtensor.bin", ""); - f = f.flat(); - nc::NdArray ff(f.ptr(), f.size(), 1); - ff.tofile(name+"_f12tensor.bin", ""); - //slater = slater.flat(); - //nc::NdArray ss(slater.ptr(), slater.size(), 1); - //ss.tofile(name+"_f12_tensor.bin", ""); + if (cabs_option.compare("none")==0) { + f = f.flat(); + nc::NdArray ff(f.ptr(), f.size(), 1); + ff.tofile(name+"_f12tensor.bin", ""); + } if (not orthogonalize){ auto S = madness::matrix_inner(world, basis, basis, true); From 8be637b3e45302439d054451ddc9488435d63567 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Tue, 8 Sep 2020 10:19:53 -0400 Subject: [PATCH 0094/1312] updated pno_integrals --- src/apps/pno/pno_integrals.cpp | 281 +++++++++++++++++---------------- 1 file changed, 147 insertions(+), 134 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index c1f7e08dfd6..e8406004e5b 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -132,9 +132,9 @@ int main(int argc, char** argv) { } if(world.rank()==0 and mp2_energy != 0.0){ std::cout << "--------------------------------------------------\n"; - std::cout<< std::setw(25) << "energy(total)" << " = " << scf_energy + mp2_energy << "\n"; - std::cout << "--------------------------------------------------\n"; - std::cout << "\n\n\n"; + std::cout<< std::setw(25) << "energy(total)" << " = " << scf_energy + mp2_energy << "\n"; + std::cout << "--------------------------------------------------\n"; + std::cout << "\n\n\n"; } // compute orthogonalized mp2 basis and print out hamiltonian tensors @@ -146,27 +146,28 @@ int main(int argc, char** argv) { const bool orthogonalize = orthogonalization != "none"; const double h_thresh = 1.e-4; const double thresh = 1.e-4;//parameters.thresh(); - const auto amo = nemo.get_calc()->amo; if(world.rank()==0) std::cout << "Tightening thresholds to 1.e-6 for post-processing\n"; FunctionDefaults<3>::set_thresh(1.e-6); + vecfuncT reference = nemo.get_calc()->amo; + vecfuncT all_pnos; + std::string name; for(auto& pairs: all_pairs){ const auto& pno_ij = pairs.pno_ij; const auto& rdm_evals = pairs.rdm_evals_ij; const bool is_gs = pairs.type == MP2_PAIRTYPE; - std::string name = "gs"; - vecfuncT reference = amo; if (not is_gs){ const auto& x = pairs.cis.x; reference.insert(reference.end(), x.begin(), x.end()); name = "ex" + std::to_string(pairs.cis.number); + }else{ + name = "gs"; } - std::vector all_basis_functions;// = nemo.get_calc()->amo; - std::vector occ; + std::vector all_current_pnos; // collect PNOs from all pairs and sort by occupation number for(ElectronPairIterator it=pno.pit();it;++it){ if (only_diag and not it.diagonal()){ @@ -174,15 +175,15 @@ int main(int argc, char** argv) { continue; }else{ const auto& pair = pno_ij[it.ij()]; - all_basis_functions.insert(all_basis_functions.end(), pair.begin(), pair.end()); + all_current_pnos.insert(all_current_pnos.end(), pair.begin(), pair.end()); for (auto ii=0; ii > zipped; - for (auto i=0; i< all_basis_functions.size(); ++i){ - zipped.push_back(std::make_pair(occ[i], all_basis_functions[i])); + for (auto i=0; i< all_current_pnos.size(); ++i){ + zipped.push_back(std::make_pair(occ[i], all_current_pnos[i])); } std::sort(zipped.begin(), zipped.end(), [](const auto& i, const auto& j) { return i.first > j.first; }); @@ -194,165 +195,177 @@ int main(int argc, char** argv) { unzipped_second.push_back(zipped[i].second); } occ = unzipped_first; - all_basis_functions = unzipped_second; + all_current_pnos = unzipped_second; if(world.rank()==0){ std::cout << "all used occupation numbers:\n" << occ << "\n"; } - // reference projector (not fullfilled for CIS) - madness::QProjector Q(world, reference); - all_basis_functions = Q(all_basis_functions); + all_pnos.insert(all_pnos.end(), all_current_pnos.begin(), all_current_pnos.end()); + } - // compute overlap for cholesky decomposition - const auto S = madness::matrix_inner(world, all_basis_functions, all_basis_functions, true); - if(world.rank()==0) std::cout << "Overlap Matrix of all PNOs:\n"; - for (int i=0;i (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); + // reference projector (not automatically fullfilled for CIS) + // projection is to keep the reference and CIS orbitals untouched in the orthogonalization + madness::QProjector Q(world, reference); + all_pnos = Q(all_pnos); - auto basis = all_basis_functions; + auto basis = all_pnos; - if(not cherry_pick.empty()){ - vecfuncT cp; - if(world.rank()==0){ - std::cout << "Cherry picking orbitals: " << cherry_pick << " from pno basis\n"; - } - for(auto i: cherry_pick){ - cp.push_back(basis[i]); - } - basis = cp; + // compute overlap for cholesky decomposition + const auto S = madness::matrix_inner(world, all_pnos, all_pnos, true); + if(world.rank()==0) std::cout << "Overlap Matrix of all PNOs:\n"; + for (int i=0;i (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); + - for(auto i=0;iamo; - basis.insert(basis.begin(), reference.begin(), reference.end()); + for (int i=0;i g(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = + for(auto i=0;i U, evals; - syev(Fmat, U, evals); - basis = madness::transform(world, basis, U); - } + madness::Tensor g(basis.size(), basis.size(), basis.size(), basis.size()); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = - std::vector PQ; - for (const auto& x : basis){ - PQ.push_back(madness::truncate(x*basis,thresh)); - } - std::vector GPQ; - for (const auto& x : basis){ - GPQ.push_back(madness::truncate(madness::apply(world, *gop, madness::truncate(x*basis,thresh)), thresh)); - } - auto J = madness::Coulomb(world, &nemo); - auto K = madness::Exchange(world, &nemo, 0); - auto Jmat = J(basis, basis); - auto Kmat = K(basis, basis); - - - - int non_zero=0; - if(world.rank() ==0 ) std::cout << "Compute G Tensor:\n"; - for (auto p=0; p h_thresh ){ - if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; - ++non_zero; - } + if(canonicalize){ + if(world.rank()==0) std::cout << "canonicalizing!\n"; + auto F = madness::Fock(world, &nemo); + const auto Fmat = F(basis, basis); + Tensor U, evals; + syev(Fmat, U, evals); + basis = madness::transform(world, basis, U); + } + + std::vector PQ; + for (const auto& x : basis){ + PQ.push_back(madness::truncate(x*basis,thresh)); + } + std::vector GPQ; + for (const auto& x : basis){ + GPQ.push_back(madness::truncate(madness::apply(world, *gop, madness::truncate(x*basis,thresh)), thresh)); + } + + auto J = madness::Coulomb(world, &nemo); + auto K = madness::Exchange(world, &nemo, 0); + auto Jmat = J(basis, basis); + auto Kmat = K(basis, basis); + + + + int non_zero=0; + if(world.rank() ==0 ) std::cout << "Compute G Tensor:\n"; + for (auto p=0; p h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + ++non_zero; } } } } } - int non_zero_h = 0; - - Tensor h; - if(canonicalize){ - auto F = madness::Fock(world, &nemo); - h = F(basis, basis); - }else{ - auto T = madness::Kinetic(world); - auto V = madness::Nuclear(world, &nemo); - h = T(basis,basis) + V(basis,basis); - } - for (int i=0;i h_thresh){ - if(world.rank()==0 and basis.size() < 3) std::cout << " h " << i << " "<< j << " "<< h(i,j) << "\n"; - ++non_zero_h; - } + } + int non_zero_h = 0; + + Tensor h; + if(canonicalize){ + auto F = madness::Fock(world, &nemo); + h = F(basis, basis); + }else{ + auto T = madness::Kinetic(world); + auto V = madness::Nuclear(world, &nemo); + h = T(basis,basis) + V(basis,basis); + } + for (int i=0;i h_thresh){ + if(world.rank()==0 and basis.size() < 3) std::cout << " h " << i << " "<< j << " "<< h(i,j) << "\n"; + ++non_zero_h; } } + } - if(world.rank()==0) std::cout << "non zero elements:\n g : " << non_zero << "\n h : " << non_zero_h << "\n"; - - h = h.flat(); - nc::NdArray hh(h.ptr(), h.size(), 1); - hh.tofile(name+"_hcore.bin", ""); - - g = g.flat(); - nc::NdArray gg(g.ptr(), g.size(), 1); - gg.tofile(name+"_gtensor.bin", ""); - - if (not orthogonalize){ - auto S = madness::matrix_inner(world, basis, basis, true); - S = S.flat(); - nc::NdArray gg(S.ptr(), S.size(), 1); - gg.tofile(name+"_overlap.bin", ""); - } + if(world.rank()==0) std::cout << "non zero elements:\n g : " << non_zero << "\n h : " << non_zero_h << "\n"; - auto Fop = madness::Fock(world, &nemo); - auto F = Fop(basis, basis); - std::cout << "F\n" << F << "\n"; + h = h.flat(); + nc::NdArray hh(h.ptr(), h.size(), 1); + hh.tofile(name+"_hcore.bin", ""); - const auto Stest = madness::matrix_inner(world, basis, basis, true); - std::cout << "Overlap over whole basis\n" << Stest << "\n"; + g = g.flat(); + nc::NdArray gg(g.ptr(), g.size(), 1); + gg.tofile(name+"_gtensor.bin", ""); + if (not orthogonalize){ + auto S = madness::matrix_inner(world, basis, basis, true); + S = S.flat(); + nc::NdArray gg(S.ptr(), S.size(), 1); + gg.tofile(name+"_overlap.bin", ""); } + auto Fop = madness::Fock(world, &nemo); + auto F = Fop(basis, basis); + std::cout << "F\n" << F << "\n"; + const auto Stest = madness::matrix_inner(world, basis, basis, true); + std::cout << "Overlap over whole basis\n" << Stest << "\n"; world.gop.fence(); From bd1bd36495a3eaaba37a1ee929b4e713f545afd0 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Tue, 8 Sep 2020 10:20:35 -0400 Subject: [PATCH 0095/1312] updated defaults --- src/apps/pno/pno_integrals.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index e8406004e5b..51dfe46958a 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -45,8 +45,8 @@ int main(int argc, char** argv) { // Get the name of the input file (if given) const std::string input = (argc > 1) ? argv[1] : "input"; - // get the orthogonalization method (cholesky, canonicalize, none) and basis_size - const std::string orthogonalization = (argc > 2) ? argv[2] : "cholesky"; + // get the orthogonalization method (cholesky, symmetric, none) and basis_size + const std::string orthogonalization = (argc > 2) ? argv[2] : "symmetric"; const int basis_size = (argc > 3) ? std::atoi(argv[3]) : 10; const bool only_diag = (argc > 4) ? bool(std::atoi(argv[4])) : false; From 67832c22fa1c8f9c68d8c4c93713a1b983481ef0 Mon Sep 17 00:00:00 2001 From: oi995116 Date: Tue, 8 Sep 2020 16:25:54 +0200 Subject: [PATCH 0096/1312] bug fix f12-integrals not computed with cabs turned off --- src/apps/pno/pno_integrals.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 0e951b113a0..20e9cb04c30 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -288,6 +288,9 @@ int main(int argc, char** argv) { //} time2.stop().print("Made pair specific ABS from PNOS and " + std::to_string(cabs.size()) + " functions"); + // Truncate cabs + madness::truncate(world, cabs, thresh); + // Merge {cabs} + {pno} if(world.rank()==0) std::cout << "Adding {cabs} to {pno+ref}.\n"; if(world.rank()==0) std::cout << "Size before: " << pno_plus_ref.size() << ".\n"; @@ -297,6 +300,7 @@ int main(int argc, char** argv) { //basis.insert(basis.end()-1, cabs.begin(), cabs.end()); basis.insert(basis.begin(), pno_plus_ref.begin(), pno_plus_ref.end()); if(world.rank()==0) std::cout << "Size after: " << basis.size() << ".\n"; + } else if (cabs.empty()) { @@ -413,7 +417,7 @@ int main(int argc, char** argv) { } } // f12-tensor - if (FPQ[r][s].norm2() >= h_thresh and cabs_option.compare("none")==0) { + if (FPQ[r][s].norm2() >= h_thresh and cabs_option.compare("none")!=0) { //f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); if(std::fabs(f(p,q,r,s)) > h_thresh ){ @@ -445,7 +449,7 @@ int main(int argc, char** argv) { } } // f12-tensor - if (FPQ[r][s].norm2() >= h_thresh and cabs_option.compare("none")==0) { + if (FPQ[r][s].norm2() >= h_thresh and cabs_option.compare("none")!=0) { f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); f(r,s,p,q) = f(p,q,r,s); if(std::fabs(f(p,q,r,s)) > h_thresh ){ @@ -472,7 +476,7 @@ int main(int argc, char** argv) { } } // f12-tensor - if (FPQ[r][s].norm2() >= h_thresh and cabs_option.compare("none")==0) { + if (FPQ[r][s].norm2() >= h_thresh and cabs_option.compare("none")!=0) { f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); if(std::fabs(f(p,q,r,s)) > h_thresh ){ ++non_zero_f; @@ -495,7 +499,7 @@ int main(int argc, char** argv) { g(q,p,r,s) = g(p,q,r,s); g(q,p,s,r) = g(p,q,r,s); // f12-tensor - if (cabs_option.compare("none")==0){ + if (cabs_option.compare("none")!=0){ f(p,q,s,r) = f(p,q,r,s); f(q,p,r,s) = f(p,q,r,s); f(q,p,s,r) = f(p,q,r,s); @@ -611,7 +615,7 @@ int main(int argc, char** argv) { nc::NdArray gg(g.ptr(), g.size(), 1); gg.tofile(name+"_gtensor.bin", ""); - if (cabs_option.compare("none")==0) { + if (cabs_option.compare("none")!=0) { f = f.flat(); nc::NdArray ff(f.ptr(), f.size(), 1); ff.tofile(name+"_f12tensor.bin", ""); From e1c6ac4ef386d1c1a04be27bfe04597e8ebafc73 Mon Sep 17 00:00:00 2001 From: philipp-q Date: Fri, 2 Oct 2020 13:03:02 +0200 Subject: [PATCH 0097/1312] write out pno pair information to file, switch for saving pnos --- src/apps/chem/PNOParameters.h | 2 + src/apps/pno/pno_integrals.cpp | 84 ++++++++++++++++++++++++---------- 2 files changed, 61 insertions(+), 25 deletions(-) diff --git a/src/apps/chem/PNOParameters.h b/src/apps/chem/PNOParameters.h index d56ded1fe7c..ed0cbefc3ab 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/apps/chem/PNOParameters.h @@ -95,6 +95,7 @@ class PNOParameters: public QCCalculationParametersBase { initialize >("active_pairs_of_orbital",std::vector(), " All pairs which originate from this orbital will not be frozen all other pairs will, if this vector is not empty"); initialize("no_opt_in_first_iteration", false, "Do not optimize in the first iteration (then the potentials do not have to be evaluated, use this for large guesses)"); initialize("exchange", "full", "approximate exchange with 'neglect' or xc functional -> same syntax as moldft"); + initialize("save_pnos",true, "Save the OBS-PNOs to a file, before and after orthonormalization."); } void set_derived_values(const Molecule& molecule) { @@ -217,6 +218,7 @@ class PNOParameters: public QCCalculationParametersBase { int maxiter_macro()const { return get("maxiter_macro");} bool no_opt_in_first_iteration()const { return get("no_opt_in_first_iteration");} + bool save_pnos()const { return get("save_pnos");} }; diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 2ba0fff60d3..71cfe6dc00e 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -20,6 +20,7 @@ #include #include #include +#include using namespace madness; @@ -188,8 +189,12 @@ int main(int argc, char** argv) { FunctionDefaults<3>::set_thresh(1.e-6); vecfuncT reference = nemo.get_calc()->amo; - vecfuncT all_pnos; + vecfuncT obs_pnos; std::vector rest_pnos; + std::vector occ; + std::vector rest_occ; + std::vector pno_ids; + std::vector rest_ids; std::string name; for(auto& pairs: all_pairs){ const auto& pno_ij = pairs.pno_ij; @@ -204,11 +209,7 @@ int main(int argc, char** argv) { name = "gs"; } - std::vector occ; std::vector all_current_pnos; - std::vector rest_occ; - std::vector pno_ids; - std::vector rest_ids; // collect PNOs from all pairs and sort by occupation number, keeping pair information via name for(ElectronPairIterator it=pno.pit();it;++it){ if (only_diag and not it.diagonal()){ @@ -260,51 +261,82 @@ int main(int argc, char** argv) { rest_ids = unzipped_third; - if(world.rank()==0){ - std::cout << "all used occupation numbers:\n" << occ << std::endl; - std::cout << "corresponding to pairs:\n" << pno_ids << std::endl; - if (cabs_option=="pno" || cabs_option=="mixed") - std::cout << "add remaining occupation numbers for cabs:\n" << rest_occ << std::endl; - std::cout << "corresponding to pairs:\n" << rest_ids << std::endl; - } - - all_pnos.insert(all_pnos.end(), all_current_pnos.begin(), all_current_pnos.end()); + obs_pnos.insert(obs_pnos.end(), all_current_pnos.begin(), all_current_pnos.end()); } // reference projector (not automatically fullfilled for CIS) // projection is to keep the reference and CIS orbitals untouched in the orthogonalization madness::QProjector Q(world, reference); - all_pnos = Q(all_pnos); + obs_pnos = Q(obs_pnos); - auto basis = all_pnos; + auto basis = obs_pnos; // compute overlap of all PNOs before orthogonalization if (paramsint.print_pno_overlap()) { - const auto S = madness::matrix_inner(world, all_pnos, all_pnos, true); + const auto S = madness::matrix_inner(world, obs_pnos, obs_pnos, true); if(world.rank()==0) std::cout << "Overlap Matrix of all PNOs:\n"; - for (int i=0;i cherry_pick = paramsint.cherry_pick(); if(not cherry_pick.empty()){ vecfuncT cp; + std::vector cp_occ; + std::vector cp_pno_ids; if(world.rank()==0){ - std::cout << "Cherry picking orbitals: " << cherry_pick << " from pno basis\n"; + std::cout << "Cherry picking orbitals: " << cherry_pick << " from pno basis." << std::endl; } - for(auto i: cherry_pick){ + for(auto i: cherry_pick){ // TODO: whatever does not get cherry-picked, add to CABS, if CABS! cp.push_back(basis[i]); + cp_occ.push_back(occ[i]); + cp_pno_ids.push_back(pno_ids[i]); } basis = cp; + occ = cp_occ; + pno_ids = cp_pno_ids; } + if(world.rank()==0){ + std::cout << "After cherry pick" << std::endl; + std::cout << "all used occupation numbers:\n" << occ << std::endl; + std::cout << "corresponding to pairs:\n" << pno_ids << std::endl; + if (cabs_option=="pno" || cabs_option=="mixed") { + std::cout << "add remaining occupation numbers for cabs:\n" << rest_occ << std::endl; + std::cout << "corresponding to pairs:\n" << rest_ids << std::endl; + } + } + // Save pair information to file after having picked the cherries + std::ofstream pairwriter ("pairinfo.txt", std::ofstream::out|std::ofstream::trunc); + pairwriter << "PNO Pair information" << std::endl; + for(auto i=0; i Date: Fri, 2 Oct 2020 23:36:41 -0400 Subject: [PATCH 0098/1312] prevent segfaults --- src/apps/pno/pno_integrals.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 71cfe6dc00e..954b232f061 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -467,7 +467,7 @@ int main(int argc, char** argv) { } } // f12-tensor, only if cabs are used - if (FPQ[r][s].norm2() >= h_thresh and cabs_switch) { + if (cabs_switch and FPQ[r][s].norm2() >= h_thresh) { f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); // symm f(r,s,p,q) = f(p,q,r,s); @@ -496,7 +496,7 @@ int main(int argc, char** argv) { } } // f12-tensor - if (FPQ[r][s].norm2() >= h_thresh and cabs_switch) { + if (cabs_switch and FPQ[r][s].norm2() >= h_thresh) { //f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); if(std::fabs(f(p,q,r,s)) > h_thresh ){ @@ -526,7 +526,7 @@ int main(int argc, char** argv) { } } // f12-tensor - if (FPQ[r][s].norm2() >= h_thresh and cabs_switch) { + if (cabs_switch and FPQ[r][s].norm2() >= h_thresh) { f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); f(r,s,p,q) = f(p,q,r,s); if(std::fabs(f(p,q,r,s)) > h_thresh ){ @@ -553,7 +553,7 @@ int main(int argc, char** argv) { } } // f12-tensor - if (FPQ[r][s].norm2() >= h_thresh and cabs_switch) { + if (cabs_switch and FPQ[r][s].norm2() >= h_thresh) { f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); if(std::fabs(f(p,q,r,s)) > h_thresh ){ ++non_zero_f; From 1b14623b3d9e4533f528543256763a2fb92d7d92 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Sat, 3 Oct 2020 00:06:34 -0400 Subject: [PATCH 0099/1312] sync to tq --- src/apps/pno/pno_integrals.cpp | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 954b232f061..30d8c1e3514 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -21,6 +21,7 @@ #include #include #include +#include using namespace madness; @@ -121,6 +122,7 @@ int main(int argc, char** argv) { PNOParameters parameters(world,input,nemo.get_calc()->molecule,TAG_PNO); F12Parameters paramf12(world, input, parameters, TAG_F12); PNOIntParameters paramsint(world, input, parameters, TAG_PNOInt); + paramsint.print("PNO Integrals evaluated as:\npnoint","end"); PNO pno(world, nemo, parameters, paramf12); std::vector all_pairs; pno.solve(all_pairs); @@ -193,8 +195,8 @@ int main(int argc, char** argv) { std::vector rest_pnos; std::vector occ; std::vector rest_occ; - std::vector pno_ids; - std::vector rest_ids; + std::vector> pno_ids; + std::vector> rest_ids; std::string name; for(auto& pairs: all_pairs){ const auto& pno_ij = pairs.pno_ij; @@ -220,12 +222,12 @@ int main(int argc, char** argv) { all_current_pnos.insert(all_current_pnos.end(), pair.begin(), pair.end()); for (auto ii=0; ii > zipped; + std::vector > > zipped; for (auto i=0; i< all_current_pnos.size(); ++i){ zipped.push_back(std::make_tuple(occ[i], all_current_pnos[i], pno_ids[i])); } @@ -234,7 +236,7 @@ int main(int argc, char** argv) { std::vector unzipped_first; std::vector unzipped_second; - std::vector unzipped_third; + std::vector > unzipped_third; for (auto i=0; i(zipped[i])); unzipped_second.push_back(std::get<1>(zipped[i])); @@ -298,7 +300,7 @@ int main(int argc, char** argv) { if(not cherry_pick.empty()){ vecfuncT cp; std::vector cp_occ; - std::vector cp_pno_ids; + std::vector > cp_pno_ids; if(world.rank()==0){ std::cout << "Cherry picking orbitals: " << cherry_pick << " from pno basis." << std::endl; } @@ -321,15 +323,23 @@ int main(int argc, char** argv) { } } // Save pair information to file after having picked the cherries - std::ofstream pairwriter ("pairinfo.txt", std::ofstream::out|std::ofstream::trunc); - pairwriter << "PNO Pair information" << std::endl; + std::ofstream pairwriter ("pnoinfo.txt", std::ofstream::out|std::ofstream::trunc); + pairwriter << "MADNESS MRA-PNO INFORMATION" << std::endl; + pairwriter << "pairinfo="; for(auto i=0; i hh(h.ptr(), h.size(), 1); - hh.tofile(name+"_hcore.bin", ""); + hh.tofile(name+"_htensor.bin", ""); g = g.flat(); nc::NdArray gg(g.ptr(), g.size(), 1); gg.tofile(name+"_gtensor.bin", ""); + if (cabs_switch) { f = f.flat(); nc::NdArray ff(f.ptr(), f.size(), 1); From 485a31248625f2e3e3a3157c0dda9c0bfdc4ce87 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Sat, 3 Oct 2020 00:22:37 -0400 Subject: [PATCH 0100/1312] fixed dying world bug --- src/apps/pno/pno_integrals.cpp | 984 +++++++++++++++++---------------- 1 file changed, 493 insertions(+), 491 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 30d8c1e3514..a6d9fb745ab 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -36,7 +36,7 @@ const std::string TAG_CP = "computeprotocol"; // Function for orthogonalization of a basis std::vector orthonormalize_basis(const std::vector &basis, const std::string orthogonalization, - const double thresh, World& world, const bool print_out) { + const double thresh, World& world, const bool print_out) { // compute overlap, to be passed in orthonormalization routines and potentially printed auto S = madness::matrix_inner(world, basis, basis, true); @@ -72,455 +72,484 @@ std::vector orthonormalize_basis(const std::vector 1) ? argv[1] : "input"; - - if(world.rank()==0){ - std::cout << "\n\n"; - std::cout << "-------------------------------------------------------------------------------------\n"; - std::cout << "SOLVING MRA-PNO-F12 as described in \n"; - std::cout << "J.S. Kottmann, F.A. Bischoff, E.F. Valeev\n"; - std::cout << "Direct determination of optimal pair-natural orbitals in a real-space representation:\n"; - std::cout << "the second-order Møller-Plesset energy\n"; - std::cout << "Journal of Chemical Physics ... 2020\n"; - std::cout << "-------------------------------------------------------------------------------------\n"; - std::cout << "\n\n"; - - std::cout << "This script will run PNO-MP2 and print out tensors in binary\n"; - //std::cout << "Call as: pno_integrals inputfile orthogonalization basis_size"; - std::cout << "Call as: pno_integrals inputfile"; - std::cout << "input is " << input << "\n"; - //std::cout << "orthogonalization is " << orthogonalization << "\n"; - //std::cout << "basis size is " << basis_size << "\n"; - //std::cout << "using CABS-option: " << cabs_option << "\n"; - //std::cout << "with pno-OBS-size: " << pno_obs_size << "\n"; - - //std::cout << "only diag is " << only_diag << "\n"; - //std::cout << "cherry_pick is " << cherry_pick << "\n"; - } + { + World world(SafeMPI::COMM_WORLD); + if (world.rank() == 0) printf("starting at time %.1f\n", wall_time()); + const double time_start = wall_time(); + std::cout.precision(6); + + startup(world,argc,argv,true); + print_meminfo(world.rank(), "startup"); + + // Get the name of the input file (if given) + const std::string input = (argc > 1) ? argv[1] : "input"; - // Compute the SCF Reference - const double time_scf_start = wall_time(); - std::shared_ptr calc(new SCF(world, input)); - Nemo nemo(world, calc, input); - nemo.get_calc()->param.print(); - const double scf_energy = nemo.value(); - if (world.rank() == 0) print("nemo energy: ", scf_energy); - if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); - const double time_scf_end = wall_time(); - - // Compute MRA-PNO-MP2-F12 - const double time_pno_start = wall_time(); - PNOParameters parameters(world,input,nemo.get_calc()->molecule,TAG_PNO); - F12Parameters paramf12(world, input, parameters, TAG_F12); - PNOIntParameters paramsint(world, input, parameters, TAG_PNOInt); - paramsint.print("PNO Integrals evaluated as:\npnoint","end"); - PNO pno(world, nemo, parameters, paramf12); - std::vector all_pairs; - pno.solve(all_pairs); - const double time_pno_end = wall_time(); - - - if(world.rank()==0){ - std::cout << std::setfill(' '); - std::cout << "\n\n\n"; - std::cout << "--------------------------------------------------\n"; - std::cout << "MRA-PNO-MP2-F12 ended \n"; - std::cout << "--------------------------------------------------\n"; - std::cout << std::setw(25) << "time scf" << " = " << time_scf_end - time_scf_start << "\n"; - std::cout << std::setw(25) << "energy scf" << " = " << scf_energy << "\n"; - std::cout << "--------------------------------------------------\n"; - } - double mp2_energy = 0.0; - if(world.rank()==0) std::cout<< std::setw(25) << "time pno" << " = " << time_pno_end - time_pno_start << "\n"; - for(const auto& pairs: all_pairs){ - if(pairs.type == MP2_PAIRTYPE){ - mp2_energy = pairs.energies.total_energy(); - } - std::pair ranks= pno.get_average_rank(pairs.pno_ij); if(world.rank()==0){ - std::string name; - std::stringstream ss; - ss << pairs.type; - ss >> name; - std::cout<< std::setw(25) << "energy "+name << " = " << pairs.energies.total_energy() << "\n"; - std::cout<< std::setw(25) << "average pno rank " + name << " = " << ranks.first << "\n"; - std::cout<< std::setw(25) << "max pno rank " + name << " = " << ranks.second << "\n"; + std::cout << "\n\n"; + std::cout << "-------------------------------------------------------------------------------------\n"; + std::cout << "SOLVING MRA-PNO-F12 as described in \n"; + std::cout << "J.S. Kottmann, F.A. Bischoff, E.F. Valeev\n"; + std::cout << "Direct determination of optimal pair-natural orbitals in a real-space representation:\n"; + std::cout << "the second-order Møller-Plesset energy\n"; + std::cout << "Journal of Chemical Physics ... 2020\n"; + std::cout << "-------------------------------------------------------------------------------------\n"; + std::cout << "\n\n"; + + std::cout << "This script will run PNO-MP2 and print out tensors in binary\n"; + //std::cout << "Call as: pno_integrals inputfile orthogonalization basis_size"; + std::cout << "Call as: pno_integrals inputfile"; + std::cout << "input is " << input << "\n"; + //std::cout << "orthogonalization is " << orthogonalization << "\n"; + //std::cout << "basis size is " << basis_size << "\n"; + //std::cout << "using CABS-option: " << cabs_option << "\n"; + //std::cout << "with pno-OBS-size: " << pno_obs_size << "\n"; + + //std::cout << "only diag is " << only_diag << "\n"; + //std::cout << "cherry_pick is " << cherry_pick << "\n"; } - } - if(world.rank()==0 and mp2_energy != 0.0){ - std::cout << "--------------------------------------------------\n"; - std::cout<< std::setw(25) << "energy(total)" << " = " << scf_energy + mp2_energy << "\n"; - std::cout << "--------------------------------------------------\n"; - std::cout << "\n\n\n"; - } - // compute orthogonalized mp2 basis and print out hamiltonian tensors - std::cout << std::setprecision(8); - std::cout << std::fixed; - std::cout << std::showpos; - - const std::string orthogonalization = paramsint.orthogonalization(); - if (world.rank()==0) std::cout << "Orthonormalization technique used: " << orthogonalization << std::endl; - const bool canonicalize = orthogonalization == "canonical"; - const bool orthogonalize = orthogonalization != "none"; - const double h_thresh = 1.e-4; - const double thresh = parameters.thresh(); - - const std::string cabs_option = paramsint.cabs_option(); - bool cabs_switch = false; - if (cabs_option=="pno" || cabs_option=="gbs" || cabs_option=="mixed") - cabs_switch = true; - if (world.rank()==0) { - if (cabs_switch) std::cout << "CABS option " << cabs_option << std::endl; - else if (!cabs_switch) std::cout << "No CABS used." << std::endl; - } - const bool only_diag = paramsint.only_diag(); - const int basis_size = paramsint.basis_size(); - int pno_cabs_size = paramsint.pno_cabs_size(); - - if(world.rank()==0) std::cout << "Tightening thresholds to 1.e-6 for post-processing\n"; - FunctionDefaults<3>::set_thresh(1.e-6); - - vecfuncT reference = nemo.get_calc()->amo; - vecfuncT obs_pnos; - std::vector rest_pnos; - std::vector occ; - std::vector rest_occ; - std::vector> pno_ids; - std::vector> rest_ids; - std::string name; - for(auto& pairs: all_pairs){ - const auto& pno_ij = pairs.pno_ij; - const auto& rdm_evals = pairs.rdm_evals_ij; - const bool is_gs = pairs.type == MP2_PAIRTYPE; - - if (not is_gs){ - const auto& x = pairs.cis.x; - reference.insert(reference.end(), x.begin(), x.end()); - name = "ex" + std::to_string(pairs.cis.number); - }else{ - name = "gs"; - } + // Compute the SCF Reference + const double time_scf_start = wall_time(); + std::shared_ptr calc(new SCF(world, input)); + Nemo nemo(world, calc, input); + nemo.get_calc()->param.print(); + const double scf_energy = nemo.value(); + if (world.rank() == 0) print("nemo energy: ", scf_energy); + if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); + const double time_scf_end = wall_time(); + + // Compute MRA-PNO-MP2-F12 + const double time_pno_start = wall_time(); + PNOParameters parameters(world,input,nemo.get_calc()->molecule,TAG_PNO); + F12Parameters paramf12(world, input, parameters, TAG_F12); + PNOIntParameters paramsint(world, input, parameters, TAG_PNOInt); + paramsint.print("PNO Integrals evaluated as:\npnoint","end"); + PNO pno(world, nemo, parameters, paramf12); + std::vector all_pairs; + pno.solve(all_pairs); + const double time_pno_end = wall_time(); - std::vector all_current_pnos; - // collect PNOs from all pairs and sort by occupation number, keeping pair information via name - for(ElectronPairIterator it=pno.pit();it;++it){ - if (only_diag and not it.diagonal()){ - if(world.rank()==0) std::cout << "skipping pair " << it.name() << "\n"; - continue; - }else{ - const auto& pair = pno_ij[it.ij()]; - all_current_pnos.insert(all_current_pnos.end(), pair.begin(), pair.end()); - for (auto ii=0; ii ranks= pno.get_average_rank(pairs.pno_ij); + if(world.rank()==0){ + std::string name; + std::stringstream ss; + ss << pairs.type; + ss >> name; + std::cout<< std::setw(25) << "energy "+name << " = " << pairs.energies.total_energy() << "\n"; + std::cout<< std::setw(25) << "average pno rank " + name << " = " << ranks.first << "\n"; + std::cout<< std::setw(25) << "max pno rank " + name << " = " << ranks.second << "\n"; } } - - std::vector > > zipped; - for (auto i=0; i< all_current_pnos.size(); ++i){ - zipped.push_back(std::make_tuple(occ[i], all_current_pnos[i], pno_ids[i])); + if(world.rank()==0 and mp2_energy != 0.0){ + std::cout << "--------------------------------------------------\n"; + std::cout<< std::setw(25) << "energy(total)" << " = " << scf_energy + mp2_energy << "\n"; + std::cout << "--------------------------------------------------\n"; + std::cout << "\n\n\n"; } - - std::sort(zipped.begin(), zipped.end(), [](const auto& i, const auto& j) { return std::get<0>(i) > std::get<0>(j); }); - - std::vector unzipped_first; - std::vector unzipped_second; - std::vector > unzipped_third; - for (auto i=0; i(zipped[i])); - unzipped_second.push_back(std::get<1>(zipped[i])); - unzipped_third.push_back(std::get<2>(zipped[i])); + + // compute orthogonalized mp2 basis and print out hamiltonian tensors + std::cout << std::setprecision(8); + std::cout << std::fixed; + std::cout << std::showpos; + + const std::string orthogonalization = paramsint.orthogonalization(); + if (world.rank()==0) std::cout << "Orthonormalization technique used: " << orthogonalization << std::endl; + const bool canonicalize = orthogonalization == "canonical"; + const bool orthogonalize = orthogonalization != "none"; + const double h_thresh = 1.e-4; + const double thresh = parameters.thresh(); + + const std::string cabs_option = paramsint.cabs_option(); + bool cabs_switch = false; + if (cabs_option=="pno" || cabs_option=="gbs" || cabs_option=="mixed") + cabs_switch = true; + if (world.rank()==0) { + if (cabs_switch) std::cout << "CABS option " << cabs_option << std::endl; + else if (!cabs_switch) std::cout << "No CABS used." << std::endl; } - occ = unzipped_first; - all_current_pnos = unzipped_second; - pno_ids = unzipped_third; - - // if CABS shall be used, keep the remaining PNOs - unzipped_first.clear(); - unzipped_second.clear(); - unzipped_third.clear(); - if (cabs_option=="pno" || cabs_option=="mixed") { - if (pno_cabs_size==-1) pno_cabs_size = int(zipped.size()); - for (int i=basis_size; i::set_thresh(1.e-6); + + vecfuncT reference = nemo.get_calc()->amo; + vecfuncT obs_pnos; + std::vector rest_pnos; + std::vector occ; + std::vector rest_occ; + std::vector> pno_ids; + std::vector> rest_ids; + std::string name; + for(auto& pairs: all_pairs){ + const auto& pno_ij = pairs.pno_ij; + const auto& rdm_evals = pairs.rdm_evals_ij; + const bool is_gs = pairs.type == MP2_PAIRTYPE; + + if (not is_gs){ + const auto& x = pairs.cis.x; + reference.insert(reference.end(), x.begin(), x.end()); + name = "ex" + std::to_string(pairs.cis.number); + }else{ + name = "gs"; + } + + std::vector all_current_pnos; + // collect PNOs from all pairs and sort by occupation number, keeping pair information via name + for(ElectronPairIterator it=pno.pit();it;++it){ + if (only_diag and not it.diagonal()){ + if(world.rank()==0) std::cout << "skipping pair " << it.name() << "\n"; + continue; + }else{ + const auto& pair = pno_ij[it.ij()]; + all_current_pnos.insert(all_current_pnos.end(), pair.begin(), pair.end()); + for (auto ii=0; ii > > zipped; + for (auto i=0; i< all_current_pnos.size(); ++i){ + zipped.push_back(std::make_tuple(occ[i], all_current_pnos[i], pno_ids[i])); + } + + std::sort(zipped.begin(), zipped.end(), [](const auto& i, const auto& j) { return std::get<0>(i) > std::get<0>(j); }); + + std::vector unzipped_first; + std::vector unzipped_second; + std::vector > unzipped_third; + for (auto i=0; i(zipped[i])); unzipped_second.push_back(std::get<1>(zipped[i])); unzipped_third.push_back(std::get<2>(zipped[i])); } - } - rest_occ = unzipped_first; - rest_pnos = unzipped_second; - rest_ids = unzipped_third; + occ = unzipped_first; + all_current_pnos = unzipped_second; + pno_ids = unzipped_third; + + // if CABS shall be used, keep the remaining PNOs + unzipped_first.clear(); + unzipped_second.clear(); + unzipped_third.clear(); + if (cabs_option=="pno" || cabs_option=="mixed") { + if (pno_cabs_size==-1) pno_cabs_size = int(zipped.size()); + for (int i=basis_size; i(zipped[i])); + unzipped_second.push_back(std::get<1>(zipped[i])); + unzipped_third.push_back(std::get<2>(zipped[i])); + } + } + rest_occ = unzipped_first; + rest_pnos = unzipped_second; + rest_ids = unzipped_third; - obs_pnos.insert(obs_pnos.end(), all_current_pnos.begin(), all_current_pnos.end()); - } + obs_pnos.insert(obs_pnos.end(), all_current_pnos.begin(), all_current_pnos.end()); + } - // reference projector (not automatically fullfilled for CIS) - // projection is to keep the reference and CIS orbitals untouched in the orthogonalization - madness::QProjector Q(world, reference); - obs_pnos = Q(obs_pnos); + // reference projector (not automatically fullfilled for CIS) + // projection is to keep the reference and CIS orbitals untouched in the orthogonalization + madness::QProjector Q(world, reference); + obs_pnos = Q(obs_pnos); - auto basis = obs_pnos; + auto basis = obs_pnos; - // compute overlap of all PNOs before orthogonalization - if (paramsint.print_pno_overlap()) { - const auto S = madness::matrix_inner(world, obs_pnos, obs_pnos, true); - if(world.rank()==0) std::cout << "Overlap Matrix of all PNOs:\n"; - for (int i=0;i cherry_pick = paramsint.cherry_pick(); - if(not cherry_pick.empty()){ - vecfuncT cp; - std::vector cp_occ; - std::vector > cp_pno_ids; + // cherry pick PNOs + std::vector cherry_pick = paramsint.cherry_pick(); + if(not cherry_pick.empty()){ + vecfuncT cp; + std::vector cp_occ; + std::vector > cp_pno_ids; + if(world.rank()==0){ + std::cout << "Cherry picking orbitals: " << cherry_pick << " from pno basis." << std::endl; + } + for(auto i: cherry_pick){ // TODO: whatever does not get cherry-picked, add to CABS, if CABS! + cp.push_back(basis[i]); + cp_occ.push_back(occ[i]); + cp_pno_ids.push_back(pno_ids[i]); + } + basis = cp; + occ = cp_occ; + pno_ids = cp_pno_ids; + } if(world.rank()==0){ - std::cout << "Cherry picking orbitals: " << cherry_pick << " from pno basis." << std::endl; + std::cout << "After cherry pick" << std::endl; + std::cout << "all used occupation numbers:\n" << occ << std::endl; + std::cout << "corresponding to pairs:\n" << pno_ids << std::endl; + if (cabs_option=="pno" || cabs_option=="mixed") { + std::cout << "add remaining occupation numbers for cabs:\n" << rest_occ << std::endl; + std::cout << "corresponding to pairs:\n" << rest_ids << std::endl; + } } - for(auto i: cherry_pick){ // TODO: whatever does not get cherry-picked, add to CABS, if CABS! - cp.push_back(basis[i]); - cp_occ.push_back(occ[i]); - cp_pno_ids.push_back(pno_ids[i]); + // Save pair information to file after having picked the cherries + std::ofstream pairwriter ("pnoinfo.txt", std::ofstream::out|std::ofstream::trunc); + pairwriter << "MADNESS MRA-PNO INFORMATION" << std::endl; + pairwriter << "pairinfo="; + for(auto i=0; i cabs; - // Get CABS from rest-pnos or external basis - if (cabs_option == "gbs" || cabs_option == "mixed") { - cabs = pno.f12.read_cabs_from_file(paramf12.auxbas_file()); + // orthogonalize orbital basis + if (orthogonalize){ + basis = orthonormalize_basis(basis, orthogonalization, thresh, world, paramsint.print_pno_overlap()); } - if (cabs_option == "pno" || cabs_option == "mixed") { - cabs.insert(cabs.begin(), rest_pnos.begin(), rest_pnos.end()); + + if (parameters.save_pnos()) { + for(auto i=0;i Qpno(world, pno_plus_ref); - cabs = Qpno(cabs); - // Orthonormalize {cabs} - if(world.rank()==0) std::cout << "\tOrthonormalize CABS" << std::endl; - cabs = orthonormalize_basis(cabs, paramsint.cabs_orthogonalization(), paramsint.cabs_thresh(), - world, paramsint.print_pno_overlap()); - time2.stop().print("Made pair specific ABS from PNOS and " + std::to_string(cabs.size()) + " functions"); - - // Truncate cabs - madness::truncate(world, cabs, thresh); - - // Merge {cabs} + {pno} - if(world.rank()==0) std::cout << "Adding {cabs} to {pno+ref}.\n"; - - basis.clear(); - basis = cabs; - basis.insert(basis.begin(), pno_plus_ref.begin(), pno_plus_ref.end()); + + // will include CIS orbitals for excited states + if(world.rank()==0) std::cout << "Adding " << reference.size() << " Reference orbitals\n"; + basis.insert(basis.begin(), reference.begin(), reference.end()); + + auto size_obs = basis.size(); + + // if desired, build a CABS using either a Gaussian basis set or the remaining PNOs + if (cabs_switch) { + if(world.rank()==0) std::cout << "Trying to use external CABS basis..." << std::endl; + std::vector cabs; + // Get CABS from rest-pnos or external basis + if (cabs_option == "gbs" || cabs_option == "mixed") { + cabs = pno.f12.read_cabs_from_file(paramf12.auxbas_file()); + } + if (cabs_option == "pno" || cabs_option == "mixed") { + cabs.insert(cabs.begin(), rest_pnos.begin(), rest_pnos.end()); + } + // set up CABS + if (!cabs.empty()) { + if(world.rank()==0) std::cout << "Found CABS..." << std::endl; + MyTimer time2 = MyTimer(world).start(); + // Project out reference + //cabs = Q(cabs); + // Project out {pno} + ref + auto pno_plus_ref = basis; + if(world.rank()==0) std::cout << "\tProject out PNO + ref" << std::endl; + madness::QProjector Qpno(world, pno_plus_ref); + cabs = Qpno(cabs); + // Orthonormalize {cabs} + if(world.rank()==0) std::cout << "\tOrthonormalize CABS" << std::endl; + cabs = orthonormalize_basis(cabs, paramsint.cabs_orthogonalization(), paramsint.cabs_thresh(), + world, paramsint.print_pno_overlap()); + time2.stop().print("Made pair specific ABS from PNOS and " + std::to_string(cabs.size()) + " functions"); + + // Truncate cabs + madness::truncate(world, cabs, thresh); + + // Merge {cabs} + {pno} + if(world.rank()==0) std::cout << "Adding {cabs} to {pno+ref}.\n"; + + basis.clear(); + basis = cabs; + basis.insert(basis.begin(), pno_plus_ref.begin(), pno_plus_ref.end()); } else if (cabs.empty()) { if(world.rank()==0) std::cout << "CABS basis set not found..." << std::endl; } - } - - auto size_full = basis.size(); - if(world.rank()==0) std::cout << "Size before adding CABS: " << size_obs << ".\n"; - if(world.rank()==0) std::cout << "Size after adding CABS: " << size_full << ".\n"; - - // Build tensors - // define Coulomb and F12-operator (as SlaterOperator exp[-mu*r] ) - auto gop = std::shared_ptr < real_convolution_3d > (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); - auto fop = SlaterOperator(world, paramsint.gamma(), 1.e-6, parameters.op_thresh()); - - madness::Tensor g(size_full, size_obs, size_full, size_obs); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = - madness::Tensor f(size_full, size_obs, size_full, size_obs); - - if(canonicalize){ - if(world.rank()==0) std::cout << "canonicalizing!\n"; - auto F = madness::Fock(world, &nemo); - const auto Fmat = F(basis, basis); - Tensor U, evals; - syev(Fmat, U, evals); - basis = madness::transform(world, basis, U); - } + } - std::vector PQ; - for (const auto& x : basis){ - PQ.push_back(madness::truncate(x*basis,thresh)); - } - std::vector GPQ; - std::vector FPQ; - for (const auto& x : basis){ - GPQ.push_back(madness::truncate(madness::apply(world, *gop, madness::truncate(x*basis,thresh)), thresh)); - if (cabs_switch){ - FPQ.push_back(madness::truncate(madness::apply(world, fop, madness::truncate(x*basis,thresh)), thresh)); + auto size_full = basis.size(); + if(world.rank()==0) std::cout << "Size before adding CABS: " << size_obs << ".\n"; + if(world.rank()==0) std::cout << "Size after adding CABS: " << size_full << ".\n"; + + // Build tensors + // define Coulomb and F12-operator (as SlaterOperator exp[-mu*r] ) + auto gop = std::shared_ptr < real_convolution_3d > (madness::CoulombOperatorPtr(world, 1.e-6, parameters.op_thresh())); + auto fop = SlaterOperator(world, paramsint.gamma(), 1.e-6, parameters.op_thresh()); + + madness::Tensor g(size_full, size_obs, size_full, size_obs); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = + madness::Tensor f(size_full, size_obs, size_full, size_obs); + + if(canonicalize){ + if(world.rank()==0) std::cout << "canonicalizing!\n"; + auto F = madness::Fock(world, &nemo); + const auto Fmat = F(basis, basis); + Tensor U, evals; + syev(Fmat, U, evals); + basis = madness::transform(world, basis, U); } - } - auto J = madness::Coulomb(world, &nemo); - auto K = madness::Exchange(world, &nemo, 0); - auto Jmat = J(basis, basis); - auto Kmat = K(basis, basis); - - // Build tensors using symmetries (both Coulomb and SlaterOperator are symmetric) TODO maybe in separate function... - // pqrs = qprs = pqsr = qpsr && pqrs = rspq for full-size tensors - int non_zero=0, non_zero_f=0; // TODO check counting! probably far from correct as of now - if(world.rank() ==0 ) std::cout << "Compute G and F Tensor:\n"; - for (int p=0; p=q) { - for (int r=0; r= r*size_obs+s)) { + std::vector PQ; + for (const auto& x : basis){ + PQ.push_back(madness::truncate(x*basis,thresh)); + } + std::vector GPQ; + std::vector FPQ; + for (const auto& x : basis){ + GPQ.push_back(madness::truncate(madness::apply(world, *gop, madness::truncate(x*basis,thresh)), thresh)); + if (cabs_switch){ + FPQ.push_back(madness::truncate(madness::apply(world, fop, madness::truncate(x*basis,thresh)), thresh)); + } + } + + auto J = madness::Coulomb(world, &nemo); + auto K = madness::Exchange(world, &nemo, 0); + auto Jmat = J(basis, basis); + auto Kmat = K(basis, basis); + + // Build tensors using symmetries (both Coulomb and SlaterOperator are symmetric) TODO maybe in separate function... + // pqrs = qprs = pqsr = qpsr && pqrs = rspq for full-size tensors + int non_zero=0, non_zero_f=0; // TODO check counting! probably far from correct as of now + if(world.rank() ==0 ) std::cout << "Compute G and F Tensor:\n"; + for (int p=0; p=q) { + for (int r=0; r= r*size_obs+s)) { + // g-tensor + if (GPQ[r][s].norm2() >= h_thresh){ + g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); + if(canonicalize and p==q){ + g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); + }else if(canonicalize and r==s){ + g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); + } + // symm + g(r,s,p,q) = g(p,q,r,s); + if(std::fabs(g(p,q,r,s)) > h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + non_zero += (p!=r && q!=s)? 2 : 1; + } + } + // f12-tensor, only if cabs are used + if (cabs_switch and FPQ[r][s].norm2() >= h_thresh) { + f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + // symm + f(r,s,p,q) = f(p,q,r,s); + if(std::fabs(f(p,q,r,s)) > h_thresh ){ + non_zero_f += (p!=r && q!=s)? 2 : 1; + } + } + } + } + } + } + // (NN|MN), M>size_obs + for (int r=size_obs; r= h_thresh) { + g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); + if(canonicalize and p==q){ + g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); + }else if(canonicalize and r==s){ + g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); + } + if(std::fabs(g(p,q,r,s)) > h_thresh ){ + if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; + ++non_zero; + } + } + // f12-tensor + if (cabs_switch and FPQ[r][s].norm2() >= h_thresh) { + //f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); + if(std::fabs(f(p,q,r,s)) > h_thresh ){ + ++non_zero_f; + } + } + } + } + } + else if (p >= size_obs){ + // (MN|MN), M>N + for (int r=size_obs; r= r*size_full+s)) { // g-tensor - if (GPQ[r][s].norm2() >= h_thresh){ + if (GPQ[r][s].norm2() >= h_thresh) { g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); if(canonicalize and p==q){ g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); }else if(canonicalize and r==s){ g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); } - // symm g(r,s,p,q) = g(p,q,r,s); if(std::fabs(g(p,q,r,s)) > h_thresh ){ if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; - non_zero += (p!=r && q!=s)? 2 : 1; + ++non_zero; } } - // f12-tensor, only if cabs are used + // f12-tensor if (cabs_switch and FPQ[r][s].norm2() >= h_thresh) { f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); - // symm f(r,s,p,q) = f(p,q,r,s); if(std::fabs(f(p,q,r,s)) > h_thresh ){ - non_zero_f += (p!=r && q!=s)? 2 : 1; + ++non_zero_f; } } } } } - } - // (NN|MN), M>size_obs - for (int r=size_obs; r= h_thresh) { - g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); - if(canonicalize and p==q){ - g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); - }else if(canonicalize and r==s){ - g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); - } - if(std::fabs(g(p,q,r,s)) > h_thresh ){ - if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; - ++non_zero; - } - } - // f12-tensor - if (cabs_switch and FPQ[r][s].norm2() >= h_thresh) { - //f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); - f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); - if(std::fabs(f(p,q,r,s)) > h_thresh ){ - ++non_zero_f; - } - } - } - } - } - else if (p >= size_obs){ - // (MN|MN), M>N - for (int r=size_obs; r= r*size_full+s)) { + // (MN|NN) + for (int r=0; r= h_thresh) { g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); @@ -529,7 +558,6 @@ int main(int argc, char** argv) { }else if(canonicalize and r==s){ g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); } - g(r,s,p,q) = g(p,q,r,s); if(std::fabs(g(p,q,r,s)) > h_thresh ){ if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; ++non_zero; @@ -538,136 +566,110 @@ int main(int argc, char** argv) { // f12-tensor if (cabs_switch and FPQ[r][s].norm2() >= h_thresh) { f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); - f(r,s,p,q) = f(p,q,r,s); if(std::fabs(f(p,q,r,s)) > h_thresh ){ - ++non_zero_f; + ++non_zero_f; } } } } } - // (MN|NN) - for (int r=0; rqpsr) + if (world.rank()==0) std::cout << "Assemble g,f using symmetries..." << std::endl; + for (int p=0; p= h_thresh) { - g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); - if(canonicalize and p==q){ - g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); - }else if(canonicalize and r==s){ - g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); - } - if(std::fabs(g(p,q,r,s)) > h_thresh ){ - if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; - ++non_zero; - } - } + g(p,q,s,r) = g(p,q,r,s); + g(q,p,r,s) = g(p,q,r,s); + g(q,p,s,r) = g(p,q,r,s); + if (p==q && r==s) non_zero += 0; + else if (p==q && r!=s) non_zero += 1; + else if (p!=q && r==s) non_zero += 1; + else if (p!=q && r!=s) non_zero += 3; + non_zero += (p==q && r==s) ? 0 : 3; // f12-tensor - if (cabs_switch and FPQ[r][s].norm2() >= h_thresh) { - f(p,q,r,s) = PQ[p][q].inner(FPQ[r][s]); - if(std::fabs(f(p,q,r,s)) > h_thresh ){ - ++non_zero_f; - } + if (cabs_switch) { + f(p,q,s,r) = f(p,q,r,s); + f(q,p,r,s) = f(p,q,r,s); + f(q,p,s,r) = f(p,q,r,s); + if (p==q && r==s) non_zero_f += 0; + else if (p==q && r!=s) non_zero_f += 1; + else if (p!=q && r==s) non_zero_f += 1; + else if (p!=q && r!=s) non_zero_f += 3; } } } } } - } - // Assemble full g,f from symmetries (misses pqrs->qpsr) - if (world.rank()==0) std::cout << "Assemble g,f using symmetries..." << std::endl; - for (int p=0; p h; - if(canonicalize){ - auto F = madness::Fock(world, &nemo); - h = F(basis, basis); - }else{ - auto T = madness::Kinetic(world); - auto V = madness::Nuclear(world, &nemo); - h = T(basis,basis) + V(basis,basis); - } - for (int i=0;i h_thresh){ - if(world.rank()==0 and basis.size() < 3) std::cout << " h " << i << " "<< j << " "<< h(i,j) << "\n"; - ++non_zero_h; + Tensor h; + if(canonicalize){ + auto F = madness::Fock(world, &nemo); + h = F(basis, basis); + }else{ + auto T = madness::Kinetic(world); + auto V = madness::Nuclear(world, &nemo); + h = T(basis,basis) + V(basis,basis); + } + for (int i=0;i h_thresh){ + if(world.rank()==0 and basis.size() < 3) std::cout << " h " << i << " "<< j << " "<< h(i,j) << "\n"; + ++non_zero_h; + } } } - } - - // print out number of non-zero elements - if(world.rank()==0){ - std::cout << "non zero elements:\n g : " << non_zero << "\n h : " << non_zero_h; - if (cabs_switch) std::cout << "non zero elements:\n f : " << non_zero_f; - std::cout << std::endl; - } - // save integrals to binary files - h = h.flat(); - nc::NdArray hh(h.ptr(), h.size(), 1); - hh.tofile(name+"_htensor.bin", ""); + // print out number of non-zero elements + if(world.rank()==0){ + std::cout << "non zero elements:\n g : " << non_zero << "\n h : " << non_zero_h; + if (cabs_switch) std::cout << "non zero elements:\n f : " << non_zero_f; + std::cout << std::endl; + } - g = g.flat(); - nc::NdArray gg(g.ptr(), g.size(), 1); - gg.tofile(name+"_gtensor.bin", ""); + // save integrals to binary files + h = h.flat(); + nc::NdArray hh(h.ptr(), h.size(), 1); + hh.tofile(name+"_htensor.bin", ""); + g = g.flat(); + nc::NdArray gg(g.ptr(), g.size(), 1); + gg.tofile(name+"_gtensor.bin", ""); - if (cabs_switch) { - f = f.flat(); - nc::NdArray ff(f.ptr(), f.size(), 1); - ff.tofile(name+"_f12tensor.bin", ""); - } - if (not orthogonalize || paramsint.print_pno_overlap()){ - auto S = madness::matrix_inner(world, basis, basis, true); - if(paramsint.print_pno_overlap()) { - if(world.rank()==0) std::cout << "Overlap over whole basis\n" << S << "\n"; + if (cabs_switch) { + f = f.flat(); + nc::NdArray ff(f.ptr(), f.size(), 1); + ff.tofile(name+"_f12tensor.bin", ""); } - if (not orthogonalize) { - S = S.flat(); - nc::NdArray gg(S.ptr(), S.size(), 1); - gg.tofile(name+"_overlap.bin", ""); + + if (not orthogonalize || paramsint.print_pno_overlap()){ + auto S = madness::matrix_inner(world, basis, basis, true); + if(paramsint.print_pno_overlap()) { + if(world.rank()==0) std::cout << "Overlap over whole basis\n" << S << "\n"; + } + if (not orthogonalize) { + S = S.flat(); + nc::NdArray gg(S.ptr(), S.size(), 1); + gg.tofile(name+"_overlap.bin", ""); + } } - } - auto Fop = madness::Fock(world, &nemo); - auto F = Fop(basis, basis); - if(world.rank()==0) std::cout << "F\n" << F << "\n"; + auto Fop = madness::Fock(world, &nemo); + auto F = Fop(basis, basis); + if(world.rank()==0) std::cout << "F\n" << F << "\n"; - world.gop.fence(); - if (world.rank() == 0) printf("finished at time %.1f\n", wall_time()); + world.gop.fence(); + if (world.rank() == 0) printf("finished at time %.1f\n", wall_time()); - print_stats(world); + print_stats(world); + } finalize(); return 0; From 941985e41abccf27e4546b1013b6f0bb9a72e670 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Sat, 3 Oct 2020 02:16:14 -0400 Subject: [PATCH 0101/1312] frozen core in pairinfo --- src/apps/pno/pno_integrals.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index a6d9fb745ab..0f5d4e880fc 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -289,7 +289,7 @@ int main(int argc, char** argv) { if(world.rank()==0){ std::cout << "Before cherry pick" << std::endl; std::cout << "all used occupation numbers:\n" << occ << std::endl; - std::cout << "corresponding to pairs:\n" << pno_ids << std::endl; + std::cout << "corresponding to active pairs:\n" << pno_ids << std::endl; if (cabs_option=="pno" || cabs_option=="mixed") { std::cout << "add remaining occupation numbers for cabs:\n" << rest_occ << std::endl; std::cout << "corresponding to pairs:\n" << rest_ids << std::endl; @@ -317,7 +317,7 @@ int main(int argc, char** argv) { if(world.rank()==0){ std::cout << "After cherry pick" << std::endl; std::cout << "all used occupation numbers:\n" << occ << std::endl; - std::cout << "corresponding to pairs:\n" << pno_ids << std::endl; + std::cout << "corresponding to active pairs:\n" << pno_ids << std::endl; if (cabs_option=="pno" || cabs_option=="mixed") { std::cout << "add remaining occupation numbers for cabs:\n" << rest_occ << std::endl; std::cout << "corresponding to pairs:\n" << rest_ids << std::endl; @@ -330,8 +330,11 @@ int main(int argc, char** argv) { for(auto i=0; i Date: Wed, 7 Oct 2020 16:52:59 -0400 Subject: [PATCH 0102/1312] added possibility to compute virtuals --- src/apps/chem/PNOParameters.h | 2 ++ src/apps/pno/pno_integrals.cpp | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/apps/chem/PNOParameters.h b/src/apps/chem/PNOParameters.h index ed0cbefc3ab..a11a5d9f4d0 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/apps/chem/PNOParameters.h @@ -312,8 +312,10 @@ class PNOIntParameters: public PNOParameters { initialize("auxbas", "none", "atom centered partial wave guess of format like 'h-2s1p-o-3s2p1d' "); initialize("auxbas_file", "none", "Use external comp. aux. basis in addition to the pnos as auxbasis. Give the filename as parameter. Give the auxbas in turbomole format. Don't use contractions. If a file is specified the auxbas parameter has no effect"); initialize("print_pno_overlap", false, "Print overlap matrix at certain steps in computation, for debugging purposes."); + initialize("compute_virtuals", 0, "Compute this number of virtuals and include them in the integral construction."); } + int compute_virtuals()const {return get("compute_virtuals");} std::string orthogonalization()const { return get("orthog");} std::string cabs_orthogonalization()const { if (get("orthog_cabs") == "default") diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 0f5d4e880fc..47eb0479157 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -368,6 +368,17 @@ int main(int argc, char** argv) { if(world.rank()==0) std::cout << "Adding " << reference.size() << " Reference orbitals\n"; basis.insert(basis.begin(), reference.begin(), reference.end()); + // include virtual orbitals if demanded + if (paramsint.compute_virtuals() > 0){ + const auto refsize = reference.size(); + nemo.get_calc() -> param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); + nemo.value(); + for (auto i=refsize; i amo[i]); + } + if(world.rank() ==0) std::cout << "added " << paramsint.compute_virtuals() << " virtuals\n"; + } + auto size_obs = basis.size(); // if desired, build a CABS using either a Gaussian basis set or the remaining PNOs From 0bdd6a13efa928d2892cc5badca733565db148d5 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 17:02:50 -0400 Subject: [PATCH 0103/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 47eb0479157..81934344c97 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -372,6 +372,7 @@ int main(int argc, char** argv) { if (paramsint.compute_virtuals() > 0){ const auto refsize = reference.size(); nemo.get_calc() -> param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); + nemo.coords_sum = 0.0; nemo.value(); for (auto i=refsize; i amo[i]); From 220203ab23292753838dfe3375d661f87e03c434 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 17:07:18 -0400 Subject: [PATCH 0104/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 81934344c97..5cfa769d103 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -371,8 +371,8 @@ int main(int argc, char** argv) { // include virtual orbitals if demanded if (paramsint.compute_virtuals() > 0){ const auto refsize = reference.size(); + Nemo nemo(world, nemo.get_calc(), input); nemo.get_calc() -> param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); - nemo.coords_sum = 0.0; nemo.value(); for (auto i=refsize; i amo[i]); From fead00e6518dfd41555dca2fc4e36a7f57334f5f Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 17:10:16 -0400 Subject: [PATCH 0105/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 5cfa769d103..9d8bd044fe3 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -371,11 +371,14 @@ int main(int argc, char** argv) { // include virtual orbitals if demanded if (paramsint.compute_virtuals() > 0){ const auto refsize = reference.size(); - Nemo nemo(world, nemo.get_calc(), input); - nemo.get_calc() -> param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); - nemo.value(); + std::shared_ptr calcx(new SCF(world, input)); + Nemo nemox(world, calcx, input); + nemox.get_calc() -> param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); + nemox.get_calc() -> param.set_user_defined_value("restart", false); + nemox.get_calc() -> param.set_user_defined_value("no_compute", false); + nemox.value(); for (auto i=refsize; i amo[i]); + basis.push_back(nemox.get_calc()-> amo[i]); } if(world.rank() ==0) std::cout << "added " << paramsint.compute_virtuals() << " virtuals\n"; } From 1ade73fab0c34256ee80dbabcb4d3002716d2a04 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 17:12:59 -0400 Subject: [PATCH 0106/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 9d8bd044fe3..cb93deb817c 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -372,6 +372,9 @@ int main(int argc, char** argv) { if (paramsint.compute_virtuals() > 0){ const auto refsize = reference.size(); std::shared_ptr calcx(new SCF(world, input)); + calcx -> param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); + calcx -> param.set_user_defined_value("restart", false); + calcx -> param.set_user_defined_value("no_compute", false); Nemo nemox(world, calcx, input); nemox.get_calc() -> param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); nemox.get_calc() -> param.set_user_defined_value("restart", false); From fd253bfcbc36978679d938aa54ee382bb8e0ad08 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 17:17:34 -0400 Subject: [PATCH 0107/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index cb93deb817c..e3107db340f 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -371,17 +371,13 @@ int main(int argc, char** argv) { // include virtual orbitals if demanded if (paramsint.compute_virtuals() > 0){ const auto refsize = reference.size(); - std::shared_ptr calcx(new SCF(world, input)); - calcx -> param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); - calcx -> param.set_user_defined_value("restart", false); - calcx -> param.set_user_defined_value("no_compute", false); - Nemo nemox(world, calcx, input); - nemox.get_calc() -> param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); - nemox.get_calc() -> param.set_user_defined_value("restart", false); - nemox.get_calc() -> param.set_user_defined_value("no_compute", false); - nemox.value(); + SCF calcx(world, input); + calcx.param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); + calcx.param.set_user_defined_value("restart", false); + calcx.param.set_user_defined_value("no_compute", false); + calcx.solve(world); for (auto i=refsize; i amo[i]); + basis.push_back(calcx.amo[i]); } if(world.rank() ==0) std::cout << "added " << paramsint.compute_virtuals() << " virtuals\n"; } From 1c1a16ed091d8fb5ffd407d43219241332b706e8 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 17:22:22 -0400 Subject: [PATCH 0108/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index e3107db340f..ec6ba46a98f 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -375,7 +375,8 @@ int main(int argc, char** argv) { calcx.param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); calcx.param.set_user_defined_value("restart", false); calcx.param.set_user_defined_value("no_compute", false); - calcx.solve(world); + MolecularEnergy E(world, calc); + double energy=E.value(calcx.molecule.get_all_coords().flat()); // ugh! for (auto i=refsize; i Date: Wed, 7 Oct 2020 17:23:06 -0400 Subject: [PATCH 0109/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index ec6ba46a98f..72149f011f6 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -369,14 +369,15 @@ int main(int argc, char** argv) { basis.insert(basis.begin(), reference.begin(), reference.end()); // include virtual orbitals if demanded + // not the most elegant solution ... but lets see if we need this first if (paramsint.compute_virtuals() > 0){ const auto refsize = reference.size(); SCF calcx(world, input); calcx.param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); calcx.param.set_user_defined_value("restart", false); calcx.param.set_user_defined_value("no_compute", false); - MolecularEnergy E(world, calc); - double energy=E.value(calcx.molecule.get_all_coords().flat()); // ugh! + MolecularEnergy E(world, calcx); + double energy=E.value(calcx.molecule.get_all_coords().flat()); for (auto i=refsize; i Date: Wed, 7 Oct 2020 17:26:06 -0400 Subject: [PATCH 0110/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 72149f011f6..ce116629a2e 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -376,6 +376,7 @@ int main(int argc, char** argv) { calcx.param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); calcx.param.set_user_defined_value("restart", false); calcx.param.set_user_defined_value("no_compute", false); + calcx.param.print(); MolecularEnergy E(world, calcx); double energy=E.value(calcx.molecule.get_all_coords().flat()); for (auto i=refsize; i Date: Wed, 7 Oct 2020 17:30:40 -0400 Subject: [PATCH 0111/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index ce116629a2e..d0a38f2a072 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -376,6 +376,7 @@ int main(int argc, char** argv) { calcx.param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); calcx.param.set_user_defined_value("restart", false); calcx.param.set_user_defined_value("no_compute", false); + calcx.param.set_user_defined_value("nmo_alpha",calc->param.nalpha() + paramsint.compute_virtuals()); calcx.param.print(); MolecularEnergy E(world, calcx); double energy=E.value(calcx.molecule.get_all_coords().flat()); From fca21a2d5c2cdff3a74852e5938006e445ccf46c Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 17:44:10 -0400 Subject: [PATCH 0112/1312] fixed bug in pno_integrals --- src/apps/chem/PNOParameters.h | 1 + src/apps/pno/pno_integrals.cpp | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/apps/chem/PNOParameters.h b/src/apps/chem/PNOParameters.h index a11a5d9f4d0..799fd4fa347 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/apps/chem/PNOParameters.h @@ -313,6 +313,7 @@ class PNOIntParameters: public PNOParameters { initialize("auxbas_file", "none", "Use external comp. aux. basis in addition to the pnos as auxbasis. Give the filename as parameter. Give the auxbas in turbomole format. Don't use contractions. If a file is specified the auxbas parameter has no effect"); initialize("print_pno_overlap", false, "Print overlap matrix at certain steps in computation, for debugging purposes."); initialize("compute_virtuals", 0, "Compute this number of virtuals and include them in the integral construction."); + initialize("project_virtuals", true, "project the pno basis out of the computed virtuals"); } int compute_virtuals()const {return get("compute_virtuals");} diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index d0a38f2a072..82ee5a5d621 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -330,13 +330,18 @@ int main(int argc, char** argv) { for(auto i=0; i(basis); + virtuals = QB(virtuals); } + basis.insert(basis.end(), virtuals.begin(), virtuals.end()); if(world.rank() ==0) std::cout << "added " << paramsint.compute_virtuals() << " virtuals\n"; } From bbb91fec6462a4e04a2e7872cffae357ccbefcad Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 17:45:49 -0400 Subject: [PATCH 0113/1312] fixed bug in pno_integrals --- src/apps/chem/PNOParameters.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/chem/PNOParameters.h b/src/apps/chem/PNOParameters.h index 799fd4fa347..f3cf9a3aff4 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/apps/chem/PNOParameters.h @@ -316,6 +316,7 @@ class PNOIntParameters: public PNOParameters { initialize("project_virtuals", true, "project the pno basis out of the computed virtuals"); } + bool project_virtuals()const {return get("project_virtuals");} int compute_virtuals()const {return get("compute_virtuals");} std::string orthogonalization()const { return get("orthog");} std::string cabs_orthogonalization()const { From 271cd383802af7079eeea0ee642dc7dade535225 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 17:48:17 -0400 Subject: [PATCH 0114/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 82ee5a5d621..b70ebd2654b 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -393,7 +393,7 @@ int main(int argc, char** argv) { if(world.rank()==0){ std::cout << "Projecting basis out of virtuals\n"; } - auto QB = QProjector(basis); + auto QB = QProjector(world, basis); virtuals = QB(virtuals); } basis.insert(basis.end(), virtuals.begin(), virtuals.end()); From b399d1be61c517e838185dba4f63af57d8ae21f8 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 18:06:28 -0400 Subject: [PATCH 0115/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 70 ++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index b70ebd2654b..9a7cbf437e2 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -323,6 +323,37 @@ int main(int argc, char** argv) { std::cout << "corresponding to pairs:\n" << rest_ids << std::endl; } } + + // include virtual orbitals if demanded + // not the most elegant solution ... but lets see if we need this first + vecfuncT virtuals; + std::vector veps; + if (paramsint.compute_virtuals() > 0){ + const auto refsize = reference.size(); + SCF calcx(world, input); + calcx.param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); + calcx.param.set_user_defined_value("restart", false); + calcx.param.set_user_defined_value("no_compute", false); + calcx.param.set_user_defined_value("nmo_alpha",calc->param.nalpha() + paramsint.compute_virtuals()); + calcx.param.print(); + MolecularEnergy E(world, calcx); + double energy=E.value(calcx.molecule.get_all_coords().flat()); + for (auto i=refsize; i(world, basis); + virtuals = QB(virtuals); + } + basis.insert(basis.end(), virtuals.begin(), virtuals.end()); + if(world.rank() ==0) std::cout << "added " << paramsint.compute_virtuals() << " virtuals\n"; + } + + // Save pair information to file after having picked the cherries std::ofstream pairwriter ("pnoinfo.txt", std::ofstream::out|std::ofstream::trunc); pairwriter << "MADNESS MRA-PNO INFORMATION" << std::endl; @@ -337,18 +368,26 @@ int main(int argc, char** argv) { if (!(i==pno_ids.size()-1))pairwriter << ","; } // print info of virtuals if there - for (auto i=0; i 0){ - const auto refsize = reference.size(); - SCF calcx(world, input); - calcx.param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); - calcx.param.set_user_defined_value("restart", false); - calcx.param.set_user_defined_value("no_compute", false); - calcx.param.set_user_defined_value("nmo_alpha",calc->param.nalpha() + paramsint.compute_virtuals()); - calcx.param.print(); - MolecularEnergy E(world, calcx); - double energy=E.value(calcx.molecule.get_all_coords().flat()); - vecfuncT virtuals; - for (auto i=refsize; i(world, basis); - virtuals = QB(virtuals); - } - basis.insert(basis.end(), virtuals.begin(), virtuals.end()); - if(world.rank() ==0) std::cout << "added " << paramsint.compute_virtuals() << " virtuals\n"; - } - auto size_obs = basis.size(); // if desired, build a CABS using either a Gaussian basis set or the remaining PNOs From 81a385ecb7321729d5ebcdb916db8c605166e836 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 18:21:23 -0400 Subject: [PATCH 0116/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 48 ++++++++++++++-------------------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 9a7cbf437e2..18d980c76d8 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -324,6 +324,15 @@ int main(int argc, char** argv) { } } + // orthogonalize orbital basis + if (orthogonalize){ + basis = orthonormalize_basis(basis, orthogonalization, thresh, world, paramsint.print_pno_overlap()); + } + + // will include CIS orbitals for excited states + if(world.rank()==0) std::cout << "Adding " << reference.size() << " Reference orbitals\n"; + basis.insert(basis.begin(), reference.begin(), reference.end()); + // include virtual orbitals if demanded // not the most elegant solution ... but lets see if we need this first vecfuncT virtuals; @@ -332,9 +341,11 @@ int main(int argc, char** argv) { const auto refsize = reference.size(); SCF calcx(world, input); calcx.param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); + calcx.param.set_user_defined_value("nvbeta", paramsint.compute_virtuals()); calcx.param.set_user_defined_value("restart", false); calcx.param.set_user_defined_value("no_compute", false); calcx.param.set_user_defined_value("nmo_alpha",calc->param.nalpha() + paramsint.compute_virtuals()); + calcx.param.set_user_defined_value("nmo_beta",calc->param.nbeta() + paramsint.compute_virtuals()); calcx.param.print(); MolecularEnergy E(world, calcx); double energy=E.value(calcx.molecule.get_all_coords().flat()); @@ -342,17 +353,17 @@ int main(int argc, char** argv) { virtuals.push_back(calcx.amo[i]); veps.push_back(calcx.aeps(i)); } - if (paramsint.project_virtuals()){ - if(world.rank()==0){ - std::cout << "Projecting basis out of virtuals\n"; - } - auto QB = QProjector(world, basis); - virtuals = QB(virtuals); - } + auto QB = QProjector(world, basis); + virtuals = QB(virtuals); basis.insert(basis.end(), virtuals.begin(), virtuals.end()); if(world.rank() ==0) std::cout << "added " << paramsint.compute_virtuals() << " virtuals\n"; } + if (parameters.save_pnos()) { + for(auto i=0; i Date: Wed, 7 Oct 2020 18:24:47 -0400 Subject: [PATCH 0117/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 18d980c76d8..93648efde69 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -355,6 +355,7 @@ int main(int argc, char** argv) { } auto QB = QProjector(world, basis); virtuals = QB(virtuals); + madness::normalize(world, virtuals); basis.insert(basis.end(), virtuals.begin(), virtuals.end()); if(world.rank() ==0) std::cout << "added " << paramsint.compute_virtuals() << " virtuals\n"; } From fd6d037a1b6de14fc8ed002530fa38c410f4f534 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 18:26:40 -0400 Subject: [PATCH 0118/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 93648efde69..d740ba5e5f8 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -355,7 +355,7 @@ int main(int argc, char** argv) { } auto QB = QProjector(world, basis); virtuals = QB(virtuals); - madness::normalize(world, virtuals); + virtuals = madness::normalize(world, virtuals); basis.insert(basis.end(), virtuals.begin(), virtuals.end()); if(world.rank() ==0) std::cout << "added " << paramsint.compute_virtuals() << " virtuals\n"; } From ff6a0a012abc92551317bc36406402fdf94ac71b Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 18:27:11 -0400 Subject: [PATCH 0119/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index d740ba5e5f8..93648efde69 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -355,7 +355,7 @@ int main(int argc, char** argv) { } auto QB = QProjector(world, basis); virtuals = QB(virtuals); - virtuals = madness::normalize(world, virtuals); + madness::normalize(world, virtuals); basis.insert(basis.end(), virtuals.begin(), virtuals.end()); if(world.rank() ==0) std::cout << "added " << paramsint.compute_virtuals() << " virtuals\n"; } From c5c62191357d468914db1a5682f6c779faef290f Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 18:35:20 -0400 Subject: [PATCH 0120/1312] fixed bug in pno_integrals --- src/apps/chem/PNOParameters.h | 10 ++++------ src/apps/pno/pno_integrals.cpp | 16 ++++++++-------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/apps/chem/PNOParameters.h b/src/apps/chem/PNOParameters.h index f3cf9a3aff4..516a46a66e1 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/apps/chem/PNOParameters.h @@ -301,7 +301,7 @@ class PNOIntParameters: public PNOParameters { void initialize_pnoint_parameters() { initialize("orthog", "symmetric", "orthogonalization method for PNO basis, also current default for a potential CABS. options: symmetric, canonical, cholesky, rr_cholesky, "); initialize("orthog_cabs", "default", "orthogonalization method for CABS basis. options: symmetric, canonical, cholesky, rr_cholesky, uses same as orbitals basis if default."); - initialize("basis_size", 10, "desired size of PNO-basis (orbital space)"); + initialize("n_pno", 10, "desired size of PNO-basis (orbital space)"); initialize("cabs_option", "none", "type of complementary auxiliary basis to be used. can be none ~ no CABS, gbs ~ Gaussian basis set as CABS, requires input via auxbas_file, pno ~ use superfluous PNOs as CABS, mixed ~ gbs&pno-option"); initialize("pno_cabs_size", -1, "size of a potential pno-cabs. defaults to -1 ~ all remaining PNOs, if pno-cabs or mixed-cabs"); initialize("only_diag", false, "use only diagonal elements PNOs"); @@ -312,12 +312,10 @@ class PNOIntParameters: public PNOParameters { initialize("auxbas", "none", "atom centered partial wave guess of format like 'h-2s1p-o-3s2p1d' "); initialize("auxbas_file", "none", "Use external comp. aux. basis in addition to the pnos as auxbasis. Give the filename as parameter. Give the auxbas in turbomole format. Don't use contractions. If a file is specified the auxbas parameter has no effect"); initialize("print_pno_overlap", false, "Print overlap matrix at certain steps in computation, for debugging purposes."); - initialize("compute_virtuals", 0, "Compute this number of virtuals and include them in the integral construction."); - initialize("project_virtuals", true, "project the pno basis out of the computed virtuals"); + initialize("n_virt", 0, "Compute this number of virtuals and include them in the integral construction."); } - bool project_virtuals()const {return get("project_virtuals");} - int compute_virtuals()const {return get("compute_virtuals");} + int n_virt()const {return get("n_virt");} std::string orthogonalization()const { return get("orthog");} std::string cabs_orthogonalization()const { if (get("orthog_cabs") == "default") @@ -327,7 +325,7 @@ class PNOIntParameters: public PNOParameters { } std::string cabs_option()const { return get("cabs_option");} - int basis_size()const { return get("basis_size");} + int n_pno()const { return get("n_pno");} int pno_cabs_size()const { return get("pno_cabs_size");} bool only_diag()const { return get("only_diag"); } std::vector cherry_pick()const { diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 93648efde69..5736cdc66bf 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -185,7 +185,7 @@ int main(int argc, char** argv) { else if (!cabs_switch) std::cout << "No CABS used." << std::endl; } const bool only_diag = paramsint.only_diag(); - const int basis_size = paramsint.basis_size(); + const int basis_size = paramsint.n_pno(); int pno_cabs_size = paramsint.pno_cabs_size(); if(world.rank()==0) std::cout << "Tightening thresholds to 1.e-6 for post-processing\n"; @@ -337,19 +337,19 @@ int main(int argc, char** argv) { // not the most elegant solution ... but lets see if we need this first vecfuncT virtuals; std::vector veps; - if (paramsint.compute_virtuals() > 0){ + if (paramsint.n_virt() > 0){ const auto refsize = reference.size(); SCF calcx(world, input); - calcx.param.set_user_defined_value("nvalpha", paramsint.compute_virtuals()); - calcx.param.set_user_defined_value("nvbeta", paramsint.compute_virtuals()); + calcx.param.set_user_defined_value("nvalpha", paramsint.n_virt()); + calcx.param.set_user_defined_value("nvbeta", paramsint.n_virt()); calcx.param.set_user_defined_value("restart", false); calcx.param.set_user_defined_value("no_compute", false); - calcx.param.set_user_defined_value("nmo_alpha",calc->param.nalpha() + paramsint.compute_virtuals()); - calcx.param.set_user_defined_value("nmo_beta",calc->param.nbeta() + paramsint.compute_virtuals()); + calcx.param.set_user_defined_value("nmo_alpha",calc->param.nalpha() + paramsint.n_virt()); + calcx.param.set_user_defined_value("nmo_beta",calc->param.nbeta() + paramsint.n_virt()); calcx.param.print(); MolecularEnergy E(world, calcx); double energy=E.value(calcx.molecule.get_all_coords().flat()); - for (auto i=refsize; i Date: Wed, 7 Oct 2020 18:49:22 -0400 Subject: [PATCH 0121/1312] fixed bug in pno_integrals --- src/apps/chem/PNOParameters.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/apps/chem/PNOParameters.h b/src/apps/chem/PNOParameters.h index 516a46a66e1..7a6a5ab2050 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/apps/chem/PNOParameters.h @@ -290,11 +290,13 @@ class PNOIntParameters: public PNOParameters { public: PNOIntParameters(const PNOParameters& param) : PNOParameters(param){ initialize_pnoint_parameters(); + set_derived_values(param); } PNOIntParameters(World& world, const std::string& inputfile, const PNOParameters& param, const std::string& TAG="pnoint") : PNOParameters(param){ initialize_pnoint_parameters(); QCCalculationParametersBase::read(world,inputfile,TAG); + set_derived_values(param); } @@ -343,8 +345,13 @@ class PNOIntParameters: public PNOParameters { } bool print_pno_overlap()const { return get("print_pno_overlap"); } - void set_derived_values() { + void set_derived_values(const PNOParameters& param) { set_derived_value("cabs_thresh", thresh()); + auto n_pno = param.maxrank; + if(n_pno>10){ + n_pno=10; + } + set_derived_value("n_pno", n_pno); } }; From 12aeb1965935694ddd9bf59399f792d63499bba3 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 18:52:10 -0400 Subject: [PATCH 0122/1312] fixed bug in pno_integrals --- src/apps/chem/PNOParameters.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/apps/chem/PNOParameters.h b/src/apps/chem/PNOParameters.h index 7a6a5ab2050..8782b3526b7 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/apps/chem/PNOParameters.h @@ -347,11 +347,7 @@ class PNOIntParameters: public PNOParameters { void set_derived_values(const PNOParameters& param) { set_derived_value("cabs_thresh", thresh()); - auto n_pno = param.maxrank; - if(n_pno>10){ - n_pno=10; - } - set_derived_value("n_pno", n_pno); + set_derived_value("n_pno", std::min(10, param.maxrank())); } }; From b40741fa69d7b633b1b91ac81ecd5659e970ae12 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 20:30:44 -0400 Subject: [PATCH 0123/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 5736cdc66bf..9a41677fcc0 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -346,7 +346,21 @@ int main(int argc, char** argv) { calcx.param.set_user_defined_value("no_compute", false); calcx.param.set_user_defined_value("nmo_alpha",calc->param.nalpha() + paramsint.n_virt()); calcx.param.set_user_defined_value("nmo_beta",calc->param.nbeta() + paramsint.n_virt()); + calcx.initial_guess(world); calcx.param.print(); + calcx.amo = calc->amo; + auto F = Fock(world, calc->amo); + auto Fmat = F(calc->ao, calc->ao); + Tensor U, evals; + syev(Fmat, U, evals); + auto vguess = madness::transform(world, calc->ao, U); + for (auto i=0;i(world, basis); virtuals = QB(virtuals); madness::normalize(world, virtuals); - basis.insert(basis.end(), virtuals.begin(), virtuals.end()); + basis.insert(basis.begin(), virtuals.begin(), virtuals.end()); if(world.rank() ==0) std::cout << "added " << paramsint.n_virt() << " virtuals\n"; } From 7bb0cfd1b8bc03b67a0b33d9f2981f5fcc520ee4 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 20:32:58 -0400 Subject: [PATCH 0124/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 9a41677fcc0..39937f8e41a 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -349,7 +349,7 @@ int main(int argc, char** argv) { calcx.initial_guess(world); calcx.param.print(); calcx.amo = calc->amo; - auto F = Fock(world, calc->amo); + auto F = Fock(world, calc.get()); auto Fmat = F(calc->ao, calc->ao); Tensor U, evals; syev(Fmat, U, evals); From a4ea4ff44f8ffae3bea3c785767d81550ee65b15 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 7 Oct 2020 20:37:59 -0400 Subject: [PATCH 0125/1312] fixed bug in pno_integrals --- src/apps/pno/pno_integrals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 39937f8e41a..ab90eebaf20 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -370,7 +370,7 @@ int main(int argc, char** argv) { auto QB = QProjector(world, basis); virtuals = QB(virtuals); madness::normalize(world, virtuals); - basis.insert(basis.begin(), virtuals.begin(), virtuals.end()); + basis.insert(basis.end(), virtuals.begin(), virtuals.end()); if(world.rank() ==0) std::cout << "added " << paramsint.n_virt() << " virtuals\n"; } From 70b7a66abb5088fe4a96533e2fa1936f3689757e Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Wed, 21 Oct 2020 21:16:08 -0400 Subject: [PATCH 0126/1312] added diagonal approximation to PNO; added hardcore boson option to integrals --- src/apps/chem/PNO.cpp | 21 ++++++++++------ src/apps/chem/PNOParameters.h | 4 +++ src/apps/pno/pno_integrals.cpp | 45 +++++++++------------------------- 3 files changed, 28 insertions(+), 42 deletions(-) diff --git a/src/apps/chem/PNO.cpp b/src/apps/chem/PNO.cpp index 89a5275918c..41b1932efb7 100644 --- a/src/apps/chem/PNO.cpp +++ b/src/apps/chem/PNO.cpp @@ -777,6 +777,7 @@ PNOPairs PNO::initialize_pairs(PNOPairs& pairs, const GuessType& inpgt) const { virtuals = orthonormalize_rrcd(virtuals,0.1*param.thresh()); TIMER(timer); PAIRLOOP(it){ + if(param.diagonal() and not it.diagonal()) continue; vector_real_function_3d& pno = pno_ij[it.ij()]; if (not pno.empty()) { msg << it.name() << ": pnos not empty ... project out and assemble\n"; @@ -795,6 +796,7 @@ PNOPairs PNO::initialize_pairs(PNOPairs& pairs, const GuessType& inpgt) const { TIMER(timer); PAIRLOOP(it) { + if(param.diagonal() and not it.diagonal()) continue; vector_real_function_3d& pno = pno_ij[it.ij()]; vector_real_function_3d pair_mo; pair_mo.push_back(nemo.get_calc()->amo[it.i() + param.freeze()]); @@ -838,6 +840,7 @@ PNOPairs PNO::initialize_pairs(PNOPairs& pairs, const GuessType& inpgt) const { TIMER(trt) for (ElectronPairIterator it = pit(); it; ++it) { + if(param.diagonal() and not it.diagonal()) continue; const double size1 = get_size(world, pno_ij[it.ij()]); truncate(world, pno_ij[it.ij()], param.thresh()); const double size2 = get_size(world, pno_ij[it.ij()]); @@ -853,18 +856,20 @@ PNOPairs PNO::initialize_pairs(PNOPairs& pairs, const GuessType& inpgt) const { pairs.maxranks_ij=std::valarray(param.maxrank(),npairs); // init amplitudes as empty tensors pairs.t_ij=std::valarray >(npairs); - if(guesstype==PSI4_GUESSTYPE){ -#if 1 - MADNESS_EXCEPTION("Issues with new parameter structure",1); -#else - Psi4Interface psi4(nocc()); + + // erase off-diagonal pairs and adapt maxranks + // if diagonal approximation is demanded + if(param.diagonal()){ for (ElectronPairIterator it = pit(); it; ++it) { - pairs.t_ij[it.ij()]=psi4.get_amplitudes_ij(it.i()+param.freeze,it.j()+param.freeze); + if(not it.diagonal()){ + pairs.maxranks_ij[it.ij()]=0; + pairs.frozen_ij[it.ij()] = true; + pairs.pno_ij=vecfuncT(); + } } - pno_compress(pairs, param.tpno_tight); -#endif } + timer.stop().print("Initialize Pairs"); pairs.verify(); diff --git a/src/apps/chem/PNOParameters.h b/src/apps/chem/PNOParameters.h index 8782b3526b7..0c94f633267 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/apps/chem/PNOParameters.h @@ -96,6 +96,7 @@ class PNOParameters: public QCCalculationParametersBase { initialize("no_opt_in_first_iteration", false, "Do not optimize in the first iteration (then the potentials do not have to be evaluated, use this for large guesses)"); initialize("exchange", "full", "approximate exchange with 'neglect' or xc functional -> same syntax as moldft"); initialize("save_pnos",true, "Save the OBS-PNOs to a file, before and after orthonormalization."); + initialize("diagonal", false, "Compute only diagonal PNOs"); } void set_derived_values(const Molecule& molecule) { @@ -146,6 +147,7 @@ class PNOParameters: public QCCalculationParametersBase { } return result; } + bool diagonal()const {return get("diagonal");} std::string exchange()const {return get("exchange");} bool exop_trigo()const { return get("exop_trigo");} int rank_increase()const { return get("rank_increase");} @@ -315,6 +317,7 @@ class PNOIntParameters: public PNOParameters { initialize("auxbas_file", "none", "Use external comp. aux. basis in addition to the pnos as auxbasis. Give the filename as parameter. Give the auxbas in turbomole format. Don't use contractions. If a file is specified the auxbas parameter has no effect"); initialize("print_pno_overlap", false, "Print overlap matrix at certain steps in computation, for debugging purposes."); initialize("n_virt", 0, "Compute this number of virtuals and include them in the integral construction."); + initialize("hardcore_boson", false, "compute only integrals for hardcore boson hamiltonian (restricted to double occupations)"); } int n_virt()const {return get("n_virt");} @@ -326,6 +329,7 @@ class PNOIntParameters: public PNOParameters { return get("orthog_cabs"); } + bool hardcore_boson()const{return get("hardcore_boson");} std::string cabs_option()const { return get("cabs_option");} int n_pno()const { return get("n_pno");} int pno_cabs_size()const { return get("pno_cabs_size");} diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index ab90eebaf20..0b585a91039 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -171,7 +171,6 @@ int main(int argc, char** argv) { const std::string orthogonalization = paramsint.orthogonalization(); if (world.rank()==0) std::cout << "Orthonormalization technique used: " << orthogonalization << std::endl; - const bool canonicalize = orthogonalization == "canonical"; const bool orthogonalize = orthogonalization != "none"; const double h_thresh = 1.e-4; const double thresh = parameters.thresh(); @@ -474,15 +473,6 @@ int main(int argc, char** argv) { madness::Tensor g(size_full, size_obs, size_full, size_obs); // using mulliken notation since thats more efficient to compute here: Tensor is (pq|g|rs) = madness::Tensor f(size_full, size_obs, size_full, size_obs); - if(canonicalize){ - if(world.rank()==0) std::cout << "canonicalizing!\n"; - auto F = madness::Fock(world, &nemo); - const auto Fmat = F(basis, basis); - Tensor U, evals; - syev(Fmat, U, evals); - basis = madness::transform(world, basis, U); - } - std::vector PQ; for (const auto& x : basis){ PQ.push_back(madness::truncate(x*basis,thresh)); @@ -513,15 +503,20 @@ int main(int argc, char** argv) { if (p>=q) { for (int r=0; r= r*size_obs+s)) { // g-tensor if (GPQ[r][s].norm2() >= h_thresh){ g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); - if(canonicalize and p==q){ - g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); - }else if(canonicalize and r==s){ - g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); - } // symm g(r,s,p,q) = g(p,q,r,s); if(std::fabs(g(p,q,r,s)) > h_thresh ){ @@ -548,11 +543,6 @@ int main(int argc, char** argv) { // g-tensor if (GPQ[r][s].norm2() >= h_thresh) { g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); - if(canonicalize and p==q){ - g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); - }else if(canonicalize and r==s){ - g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); - } if(std::fabs(g(p,q,r,s)) > h_thresh ){ if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; ++non_zero; @@ -577,11 +567,6 @@ int main(int argc, char** argv) { // g-tensor if (GPQ[r][s].norm2() >= h_thresh) { g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); - if(canonicalize and p==q){ - g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); - }else if(canonicalize and r==s){ - g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); - } g(r,s,p,q) = g(p,q,r,s); if(std::fabs(g(p,q,r,s)) > h_thresh ){ if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; @@ -605,11 +590,6 @@ int main(int argc, char** argv) { // g-tensor if (GPQ[r][s].norm2() >= h_thresh) { g(p,q,r,s) = PQ[p][q].inner(GPQ[r][s]); - if(canonicalize and p==q){ - g(p,q,r,s) += Kmat(r,s) - Jmat(r,s); - }else if(canonicalize and r==s){ - g(p,q,r,s) += Kmat(p,q) - Jmat(p,q); - } if(std::fabs(g(p,q,r,s)) > h_thresh ){ if(world.rank()==0 and basis.size() < 3) std::cout << " g " << p << " "<< q << " "<< r << " "<< s << " = " << g(p,q,r,s) << "\n"; ++non_zero; @@ -661,10 +641,7 @@ int main(int argc, char** argv) { int non_zero_h = 0; Tensor h; - if(canonicalize){ - auto F = madness::Fock(world, &nemo); - h = F(basis, basis); - }else{ + { auto T = madness::Kinetic(world); auto V = madness::Nuclear(world, &nemo); h = T(basis,basis) + V(basis,basis); From 0d6be94f78ae141496756abf27aa616dec1835ee Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 22 Oct 2020 00:01:06 -0400 Subject: [PATCH 0127/1312] prevent that pairs converge, get frozen and are then not considered when integrals are formed --- src/apps/pno/pno_integrals.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 0b585a91039..b7be05730c2 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -125,8 +125,7 @@ int main(int argc, char** argv) { PNOIntParameters paramsint(world, input, parameters, TAG_PNOInt); paramsint.print("PNO Integrals evaluated as:\npnoint","end"); PNO pno(world, nemo, parameters, paramf12); - std::vector all_pairs; - pno.solve(all_pairs); + pno.solve(); const double time_pno_end = wall_time(); @@ -140,6 +139,17 @@ int main(int argc, char** argv) { std::cout << std::setw(25) << "energy scf" << " = " << scf_energy << "\n"; std::cout << "--------------------------------------------------\n"; } + + if(world.rank()==0){ + std::cout << "restarting PNO to reload pairs that converged before and were frozen\n"; + pno.param.set_user_defined_value("restart", "all"); + pno.param.set_user_defined_value("no_opt", "all"); + pno.param.set_user_defined_value("no_guess", "all"); + std::vector all_pairs; + pno.solve(all_pairs); + + } + double mp2_energy = 0.0; if(world.rank()==0) std::cout<< std::setw(25) << "time pno" << " = " << time_pno_end - time_pno_start << "\n"; for(const auto& pairs: all_pairs){ From 624e02af261a307ee48708fc64208779d6b6b65f Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 22 Oct 2020 00:01:24 -0400 Subject: [PATCH 0128/1312] prevent that pairs converge, get frozen and are then not considered when integrals are formed --- src/apps/pno/pno_integrals.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index b7be05730c2..57c2411484d 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -142,13 +142,12 @@ int main(int argc, char** argv) { if(world.rank()==0){ std::cout << "restarting PNO to reload pairs that converged before and were frozen\n"; - pno.param.set_user_defined_value("restart", "all"); - pno.param.set_user_defined_value("no_opt", "all"); - pno.param.set_user_defined_value("no_guess", "all"); - std::vector all_pairs; - pno.solve(all_pairs); - } + pno.param.set_user_defined_value("restart", "all"); + pno.param.set_user_defined_value("no_opt", "all"); + pno.param.set_user_defined_value("no_guess", "all"); + std::vector all_pairs; + pno.solve(all_pairs); double mp2_energy = 0.0; if(world.rank()==0) std::cout<< std::setw(25) << "time pno" << " = " << time_pno_end - time_pno_start << "\n"; From 527f06268710a8918a388b9e43b5c32b22c13852 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 22 Oct 2020 00:03:17 -0400 Subject: [PATCH 0129/1312] made PNO member variables public --- src/apps/chem/PNO.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/chem/PNO.h b/src/apps/chem/PNO.h index c4a74689b41..dbc5022c0dd 100644 --- a/src/apps/chem/PNO.h +++ b/src/apps/chem/PNO.h @@ -235,7 +235,7 @@ class PNO { ElectronPairIterator pit()const{ return f12.pit();} /// convenience OrbitalIterator oit()const{return OrbitalIterator(nemo.get_calc()->amo.size(),param.freeze());} F12Potentials f12; // used to be private -private: +public: World& world; PNOParameters param; ///< calculation parameters Nemo nemo; From 2a90f22e990adec5d2315229dfddf5ed91099c60 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 22 Oct 2020 00:23:19 -0400 Subject: [PATCH 0130/1312] added correct templates --- src/apps/pno/pno_integrals.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 57c2411484d..18cfdd8a79d 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -143,9 +143,9 @@ int main(int argc, char** argv) { if(world.rank()==0){ std::cout << "restarting PNO to reload pairs that converged before and were frozen\n"; } - pno.param.set_user_defined_value("restart", "all"); - pno.param.set_user_defined_value("no_opt", "all"); - pno.param.set_user_defined_value("no_guess", "all"); + pno.param.set_user_defined_value("restart", "all"); + pno.param.set_user_defined_value("no_opt", "all"); + pno.param.set_user_defined_value("no_guess", "all"); std::vector all_pairs; pno.solve(all_pairs); From e16213e52cda7b32a2477dc7344a871e75e084b2 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 22 Oct 2020 01:08:44 -0400 Subject: [PATCH 0131/1312] no adaptive solver in restart --- src/apps/pno/pno_integrals.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 18cfdd8a79d..4b16ca96bad 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -146,6 +146,7 @@ int main(int argc, char** argv) { pno.param.set_user_defined_value("restart", "all"); pno.param.set_user_defined_value("no_opt", "all"); pno.param.set_user_defined_value("no_guess", "all"); + pno.param.set_user_defined_value("adaptive_solver", "none"); std::vector all_pairs; pno.solve(all_pairs); From f54e75f5cdf8d6bf2a93f42243aa5203c2b4deb0 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 22 Oct 2020 01:20:40 -0400 Subject: [PATCH 0132/1312] make restart work with adaptive_solver=None --- src/apps/chem/PNO.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/chem/PNO.cpp b/src/apps/chem/PNO.cpp index 41b1932efb7..acd5ae4d19f 100644 --- a/src/apps/chem/PNO.cpp +++ b/src/apps/chem/PNO.cpp @@ -999,6 +999,8 @@ PNOPairs PNO::adaptive_solver(PNOPairs& pairs)const{ if(pairs.empty() or pairs.npairs==0){ msg.output("Initializing empty Pairs:"); pairs = initialize_pairs(pairs,EMPTY_GUESSTYPE); + // set the maxranks to zero (or to pno_ij size if there was a restart) + PAIRLOOP(it) pairs.maxranks_ij[it.ij()] = pairs.pno_ij[it.ij()].size(); } else{ msg.output("Set back intermediates of pairs:"); From f653716c731facf96b0a6369b7225940f182632e Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 22 Oct 2020 01:26:08 -0400 Subject: [PATCH 0133/1312] make restart work with adaptive_solver=None | moved to right block --- src/apps/chem/PNO.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/chem/PNO.cpp b/src/apps/chem/PNO.cpp index acd5ae4d19f..9aadb183709 100644 --- a/src/apps/chem/PNO.cpp +++ b/src/apps/chem/PNO.cpp @@ -982,6 +982,8 @@ PNOPairs PNO::iterate_pairs(PNOPairs & pairs) const { if(pairs.empty() or pairs.npairs==0){ msg.output("Initializing Pairs:"); pairs = initialize_pairs(pairs,param.guesstype()); + // set the maxranks to zero (or to pno_ij size if there was a restart) + PAIRLOOP(it) pairs.maxranks_ij[it.ij()] = pairs.pno_ij[it.ij()].size(); } else{ msg.warning("Standard solver expects empty pairs!"); @@ -999,8 +1001,6 @@ PNOPairs PNO::adaptive_solver(PNOPairs& pairs)const{ if(pairs.empty() or pairs.npairs==0){ msg.output("Initializing empty Pairs:"); pairs = initialize_pairs(pairs,EMPTY_GUESSTYPE); - // set the maxranks to zero (or to pno_ij size if there was a restart) - PAIRLOOP(it) pairs.maxranks_ij[it.ij()] = pairs.pno_ij[it.ij()].size(); } else{ msg.output("Set back intermediates of pairs:"); From 1512f08cab3c19ee5ed13279793bcac0b50b415c Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 22 Oct 2020 01:39:14 -0400 Subject: [PATCH 0134/1312] make restart work with adaptive_solver=None | moved to right block --- src/apps/chem/PNO.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/chem/PNO.cpp b/src/apps/chem/PNO.cpp index 9aadb183709..3fdfe38af63 100644 --- a/src/apps/chem/PNO.cpp +++ b/src/apps/chem/PNO.cpp @@ -982,8 +982,9 @@ PNOPairs PNO::iterate_pairs(PNOPairs & pairs) const { if(pairs.empty() or pairs.npairs==0){ msg.output("Initializing Pairs:"); pairs = initialize_pairs(pairs,param.guesstype()); - // set the maxranks to zero (or to pno_ij size if there was a restart) - PAIRLOOP(it) pairs.maxranks_ij[it.ij()] = pairs.pno_ij[it.ij()].size(); + // set the maxranks to maxrank (or to pno_ij size if there was a restart) + PAIRLOOP(it) pairs.maxranks_ij[it.ij()] = param.maxrank(); + print_ranks(pairs); } else{ msg.warning("Standard solver expects empty pairs!"); From e4c156444193036731185b41b102aa0ebbcdcd31 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 22 Oct 2020 01:48:20 -0400 Subject: [PATCH 0135/1312] corrected error in freezing offdiagonal pairs --- src/apps/chem/PNO.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/chem/PNO.cpp b/src/apps/chem/PNO.cpp index 3fdfe38af63..3d0edd66af8 100644 --- a/src/apps/chem/PNO.cpp +++ b/src/apps/chem/PNO.cpp @@ -864,7 +864,7 @@ PNOPairs PNO::initialize_pairs(PNOPairs& pairs, const GuessType& inpgt) const { if(not it.diagonal()){ pairs.maxranks_ij[it.ij()]=0; pairs.frozen_ij[it.ij()] = true; - pairs.pno_ij=vecfuncT(); + pairs.pno_ij[it.ij()]=vecfuncT(); } } } From d9159e5feae000dab2818b844a3a3d7acf5956a2 Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Mon, 9 Nov 2020 12:16:17 -0500 Subject: [PATCH 0136/1312] defined ostream operator for vectors --- src/apps/pno/pno_integrals.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 4b16ca96bad..ea52e6194c6 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -34,6 +34,15 @@ const std::string TAG_CP = "computeprotocol"; // this needs to be added to include #include "NumCpp.hpp" +template +std::ostream& operator << (std::ostream& os, const std::vector& v){ + os << "["; + for(auto k:v){ + os << v << " "; + } + os << "]"; +} + // Function for orthogonalization of a basis std::vector orthonormalize_basis(const std::vector &basis, const std::string orthogonalization, const double thresh, World& world, const bool print_out) { From 3990360ae68c130f7f205a26ec79243040f520cc Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Thu, 12 Nov 2020 14:20:52 -0500 Subject: [PATCH 0137/1312] fixed printout issue --- src/apps/pno/pno_integrals.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index ea52e6194c6..a44b384df52 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -14,6 +14,7 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES +#include #include #include #include @@ -34,13 +35,21 @@ const std::string TAG_CP = "computeprotocol"; // this needs to be added to include #include "NumCpp.hpp" +template +std::ostream& operator << (std::ostream& os, const std::pair& v){ + os << "(" << v.first << "," << v.second << ")"; + return os; +} + + template std::ostream& operator << (std::ostream& os, const std::vector& v){ os << "["; - for(auto k:v){ - os << v << " "; + for(auto i=0; i Date: Thu, 12 Nov 2020 17:52:00 -0500 Subject: [PATCH 0138/1312] small cleanup in pno_integrals --- src/apps/CMakeLists.txt | 1 - src/apps/chem/PNO.h | 3 + src/apps/chem/PNOParameters.h | 6 +- src/apps/pno/pno_integrals.cpp | 45 ++-- src/apps/tequila/CMakeLists.txt | 18 -- src/apps/tequila/tequila.cpp | 350 ------------------------------ src/apps/tequila/tequila_test.cpp | 212 ------------------ 7 files changed, 30 insertions(+), 605 deletions(-) delete mode 100644 src/apps/tequila/CMakeLists.txt delete mode 100644 src/apps/tequila/tequila.cpp delete mode 100644 src/apps/tequila/tequila_test.cpp diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt index 75b061c2e06..b3da7ff9f67 100644 --- a/src/apps/CMakeLists.txt +++ b/src/apps/CMakeLists.txt @@ -7,7 +7,6 @@ add_subdirectory(tdse) add_subdirectory(moldft) add_subdirectory(pno) add_subdirectory(cis) -#add_subdirectory(tequila) #add_subdirectory(exciting) #add_subdirectory(hf) #add_subdirectory(ii) diff --git a/src/apps/chem/PNO.h b/src/apps/chem/PNO.h index dbc5022c0dd..851b9b5a8b4 100644 --- a/src/apps/chem/PNO.h +++ b/src/apps/chem/PNO.h @@ -43,6 +43,9 @@ class PNO { poisson = std::shared_ptr(CoulombOperatorPtr( world, nemo.get_calc()->param.lo(),param.op_thresh())); MADNESS_ASSERT(param.freeze() == f12.param.freeze()); + if(nemo.ncf->type() != madness::NuclearCorrelationFactor::None){ + MADNESS_EXCEPTION("Nuclear Correlation Factors not yet supported. Add ncf (none,1.0) to your dft input",1); + } } /// Compute the projected MP2 energies: 2 - for all pairs diff --git a/src/apps/chem/PNOParameters.h b/src/apps/chem/PNOParameters.h index fdc394291f6..3a8a31f9dff 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/apps/chem/PNOParameters.h @@ -303,7 +303,7 @@ class PNOIntParameters: public PNOParameters { void initialize_pnoint_parameters() { - initialize("orthog", "symmetric", "orthogonalization method for PNO basis, also current default for a potential CABS. options: symmetric, canonical, cholesky, rr_cholesky, "); + initialize("orthog", "cholesky", "orthogonalization method for PNO basis, also current default for a potential CABS. options: symmetric, canonical, cholesky, rr_cholesky, "); initialize("orthog_cabs", "default", "orthogonalization method for CABS basis. options: symmetric, canonical, cholesky, rr_cholesky, uses same as orbitals basis if default."); initialize("n_pno", 10, "desired size of PNO-basis (orbital space)"); initialize("cabs_option", "none", "type of complementary auxiliary basis to be used. can be none ~ no CABS, gbs ~ Gaussian basis set as CABS, requires input via auxbas_file, pno ~ use superfluous PNOs as CABS, mixed ~ gbs&pno-option"); @@ -315,8 +315,8 @@ class PNOIntParameters: public PNOParameters { initialize("cabs_thresh",1.e-4, " thresh for cabs part "); initialize("auxbas", "none", "atom centered partial wave guess of format like 'h-2s1p-o-3s2p1d' "); initialize("auxbas_file", "none", "Use external comp. aux. basis in addition to the pnos as auxbasis. Give the filename as parameter. Give the auxbas in turbomole format. Don't use contractions. If a file is specified the auxbas parameter has no effect"); - initialize("print_pno_overlap", false, "Print overlap matrix at certain steps in computation, for debugging purposes."); - initialize("n_virt", 0, "Compute this number of virtuals and include them in the integral construction."); + initialize("print_pno_overlap", true, "Print overlap matrix at certain steps in computation, for debugging purposes."); + initialize("n_virt", 0, "Compute this number of virtuals and include them in the integral construction, experimental and not robust!."); initialize("hardcore_boson", false, "compute only integrals for hardcore boson hamiltonian (restricted to double occupations)"); } diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index a44b384df52..d6bad67b0cb 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -14,7 +14,6 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES -#include #include #include #include @@ -98,6 +97,7 @@ int main(int argc, char** argv) { startup(world,argc,argv,true); print_meminfo(world.rank(), "startup"); + FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap< Key<3> >(world))); // Get the name of the input file (if given) const std::string input = (argc > 1) ? argv[1] : "input"; @@ -114,16 +114,8 @@ int main(int argc, char** argv) { std::cout << "\n\n"; std::cout << "This script will run PNO-MP2 and print out tensors in binary\n"; - //std::cout << "Call as: pno_integrals inputfile orthogonalization basis_size"; std::cout << "Call as: pno_integrals inputfile"; std::cout << "input is " << input << "\n"; - //std::cout << "orthogonalization is " << orthogonalization << "\n"; - //std::cout << "basis size is " << basis_size << "\n"; - //std::cout << "using CABS-option: " << cabs_option << "\n"; - //std::cout << "with pno-OBS-size: " << pno_obs_size << "\n"; - - //std::cout << "only diag is " << only_diag << "\n"; - //std::cout << "cherry_pick is " << cherry_pick << "\n"; } // Compute the SCF Reference @@ -135,6 +127,10 @@ int main(int argc, char** argv) { if (world.rank() == 0) print("nemo energy: ", scf_energy); if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); const double time_scf_end = wall_time(); + // assert that no nemo corrfactor is actually used (not yet supported in PNO-MP2) + if(nemo.ncf->type() != madness::NuclearCorrelationFactor::None){ + MADNESS_EXCEPTION("Nuclear Correlation Factors not yet supported in MRA-PNOs. Add ncf (none,1.0) to your dft input",1); + } // Compute MRA-PNO-MP2-F12 const double time_pno_start = wall_time(); @@ -200,8 +196,8 @@ int main(int argc, char** argv) { const std::string orthogonalization = paramsint.orthogonalization(); if (world.rank()==0) std::cout << "Orthonormalization technique used: " << orthogonalization << std::endl; const bool orthogonalize = orthogonalization != "none"; - const double h_thresh = 1.e-4; - const double thresh = parameters.thresh(); + const double h_thresh = 1.e-7; // neglect integrals + double thresh = parameters.thresh(); const std::string cabs_option = paramsint.cabs_option(); bool cabs_switch = false; @@ -215,8 +211,9 @@ int main(int argc, char** argv) { const int basis_size = paramsint.n_pno(); int pno_cabs_size = paramsint.pno_cabs_size(); - if(world.rank()==0) std::cout << "Tightening thresholds to 1.e-6 for post-processing\n"; - FunctionDefaults<3>::set_thresh(1.e-6); + thresh = std::min(thresh, 1.e-4); + if(world.rank()==0) std::cout << "Tightening thresholds to " << thresh << " for post-processing\n"; + FunctionDefaults<3>::set_thresh(thresh); vecfuncT reference = nemo.get_calc()->amo; vecfuncT obs_pnos; @@ -234,9 +231,9 @@ int main(int argc, char** argv) { if (not is_gs){ const auto& x = pairs.cis.x; reference.insert(reference.end(), x.begin(), x.end()); - name = "ex" + std::to_string(pairs.cis.number); + name = "molecule_ex_" + std::to_string(pairs.cis.number); }else{ - name = "gs"; + name = "molecule"; } std::vector all_current_pnos; @@ -358,9 +355,10 @@ int main(int argc, char** argv) { } // will include CIS orbitals for excited states - if(world.rank()==0) std::cout << "Adding " << reference.size() << " Reference orbitals\n"; + if(world.rank()==0) std::cout << "Adding " << reference.size() << " HF orbitals\n"; basis.insert(basis.begin(), reference.begin(), reference.end()); + // include virtual orbitals if demanded // not the most elegant solution ... but lets see if we need this first vecfuncT virtuals; @@ -712,6 +710,11 @@ int main(int argc, char** argv) { if(paramsint.print_pno_overlap()) { if(world.rank()==0) std::cout << "Overlap over whole basis\n" << S << "\n"; } + for (auto x=0;x gg(S.ptr(), S.size(), 1); @@ -719,15 +722,15 @@ int main(int argc, char** argv) { } } - auto Fop = madness::Fock(world, &nemo); - auto F = Fop(basis, basis); - if(world.rank()==0) std::cout << "F\n" << F << "\n"; world.gop.fence(); if (world.rank() == 0) printf("finished at time %.1f\n", wall_time()); - print_stats(world); - } + // Nearly all memory will be freed at this point + world.gop.fence(); + world.gop.fence(); + print_stats(world); + } // world is dead -- ready to finalize finalize(); return 0; diff --git a/src/apps/tequila/CMakeLists.txt b/src/apps/tequila/CMakeLists.txt deleted file mode 100644 index 5162a0b347b..00000000000 --- a/src/apps/tequila/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# src/apps/moldft - -add_executable(tequila_test tequila_test.cpp) -target_link_libraries(tequila_test MADchem ${DISABLEPIE_LINKER_FLAG}) - -find_library(CNPY_LOCATION cnpy HINTS /home/jsk/install/cnpy/lib/) - -add_executable(tequila tequila.cpp) -target_link_libraries(tequila MADchem ${DISABLEPIE_LINKER_FLAG}) -target_link_libraries(tequila ${CNPY_LOCATION}) - -add_executable(two_electron_example two_electron_example.cpp) -target_link_libraries(two_electron_example MADchem ${DISABLEPIE_LINKER_FLAG}) -target_link_libraries(two_electron_example ${CNPY_LOCATION}) - -add_executable(compute_two_electron_density_matrix compute_two_electron_density_matrix.cpp) -target_link_libraries(compute_two_electron_density_matrix MADchem ${DISABLEPIE_LINKER_FLAG}) -target_link_libraries(compute_two_electron_density_matrix ${CNPY_LOCATION}) diff --git a/src/apps/tequila/tequila.cpp b/src/apps/tequila/tequila.cpp deleted file mode 100644 index 254247a9e9d..00000000000 --- a/src/apps/tequila/tequila.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/* - * tequila.cpp - * - * Created on: Mar. 9, 2020 - * Author: jsk - */ - -//#include -#include "/home/jsk/install/cnpy/include/cnpy.h" // integrate into cmake! -#include "NumCpp.hpp" // integrate into cmake (include only just pass cxx flag -I/home/jsk/install/numcpp/include/ -#include -#include -#include -#include -#include -#include - -using namespace madness; - - -//template -//struct allocator { -// World& world; -// const int n; -// -// /// @param[in] world the world -// /// @param[in] nn the number of functions in a given vector -// allocator(World& world, const int nn) : -// world(world), n(nn) { -// } -// -// /// allocate a vector of n empty functions -// std::vector > operator()() { -// return zero_functions(world, n); -// } -//}; - -Tensor load_tensor(const std::string& name){ - cnpy::NpyArray data = cnpy::npy_load(name+".npy"); - Tensor result(data.num_vals); - auto data_ptr = data.data(); - UNARYITERATOR(double, result, *_p0 = data_ptr[_i]); - std::vector shape; - for(const auto& i:data.shape){ - shape.push_back(long(i)); - } - - result = result.reshape(shape); - return result; -} - -template -Tensor compute_one_electron_tensor(const vecfuncT& basis, const opT& op){ - return op(basis,basis); -} - -template -Tensor compute_two_electron_tensor(World& world, const vecfuncT& basis, const opT& op){ - // = = = - Tensor g(basis.size(), basis.size(),basis.size(),basis.size()); - double energy1 = 0.0; - double energy2 = 0.0; - const auto& f = basis; - for (auto i=0; i& hij, const Tensor& gijkl, const Tensor& dij, const Tensor& dijkl){ - std::cout << "dij.ndim()=" << dij.flat().ndim() << "\ndijkl.ndim()" << dijkl.flat().ndim() << "\n"; - std::cout << "hij.ndim()=" << hij.flat().ndim() << "\ngijkl.ndim()" << gijkl.flat().ndim() << "\n"; - - const auto one_particle_energy = hij.flat().trace(dij.flat()); - std::cout << "one particle energy = " << one_particle_energy << "\n"; - const auto two_particle_energy = gijkl.flat().trace(dijkl.flat()); - std::cout << "two particle energy = " << two_particle_energy << "\n"; - - return one_particle_energy + 0.5*two_particle_energy; -} - -Nemo compute_scf(World& world, const std::string& input="input"){ - const double time_scf_start = wall_time(); - std::shared_ptr calc(new SCF(world, input)); - Nemo nemo(world, calc, input); - nemo.get_calc()->param.print(); - const double scf_energy = nemo.value(); - if (world.rank() == 0) print("nemo energy: ", scf_energy); - if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); - const double time_scf_end = wall_time(); - return nemo; -} - -vecfuncT compute_initial_guess(const Nemo& nemo){ - // replace this with guess factory of pno or cis - - // extract what we need from nemo - const auto amo = nemo.get_calc()->amo; - MADNESS_ASSERT(amo.size()==1); - const auto atomic_guess = nemo.get_calc() -> ao; - std::cout << atomic_guess.size() << " atomic guess orbitals\n"; - - QProjector Q(nemo.world, amo); - - auto atomic_mo = atomic_guess[0] + atomic_guess[1]; - auto atomic_vi = atomic_guess[0] - atomic_guess[1]; - atomic_mo.scale(1.0/atomic_mo.norm2()); - atomic_vi.scale(1.0/atomic_vi.norm2()); - - auto vi = Q(atomic_vi); - vi.scale(1.0/vi.norm2()); - - auto tmp = amo[0].inner(vi); - std::cout << "overlap of guess = " << tmp << "\n"; - vecfuncT basis = {amo[0], vi}; - return basis; -} - -void print_orbital_information(World& world, const MolecularOrbitals& orbitals){ - if (world.rank()==0){ - std::cout << orbitals.get_mos().size() << " Molecular orbitals\n"; - std::cout << "irreps: " << orbitals.get_irreps() << "\n"; - std::cout << "occ : " << orbitals.get_occ() << "\n"; - std::cout << "set : " << orbitals.get_localize_sets() << "\n"; - } -} - -int main(int argc, char** argv) { - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); - if (world.rank() == 0) printf("starting at time %.1f\n", wall_time()); - const double time_start = wall_time(); - std::cout.precision(6); - - startup(world,argc,argv,true); - //print_meminfo(world.rank(), "startup"); - - const std::string input = "input"; - - // read in the spin integrated density matrices - auto dij = load_tensor("dij"); - auto dijkl = load_tensor("dijkl"); - - std::cout << "dij\n" << dij << '\n'; - std::cout << "dijkl " << dijkl.dims() << " " << dijkl.ndim()<< "\n" << dijkl << '\n'; - - std::shared_ptr scf_ptr(new SCF(world, input)); - Nemo nemo(world, scf_ptr, input); - try{ - nemo.get_calc() -> load_mos(world); - nemo.get_calc() -> ao = nemo.get_calc() -> project_ao_basis(world, nemo.get_calc() -> aobasis); - nemo.get_calc() -> make_nuclear_potential(world); - }catch(MadnessException& e){ - nemo.value(); - } - - std::vector irreps; - auto symmetry_projector = nemo.get_symmetry_projector(); - symmetry_projector(nemo.get_calc() -> amo, irreps); - auto alphas = MolecularOrbitals(nemo.get_calc()->amo, nemo.get_calc()->aeps, irreps, nemo.get_calc()->aocc, nemo.get_calc()->aset); - auto betas = MolecularOrbitals(nemo.get_calc()->amo, nemo.get_calc()->aeps, irreps, nemo.get_calc()->aocc, nemo.get_calc()->aset); - const double nuc_rep = nemo.get_calc() -> molecule.nuclear_repulsion_energy(); - auto T = Kinetic(world); - auto Vnuc = Nuclear(world, nemo.get_calc().get()); - auto gop = CoulombOperator(world, 1.e-6,1.e-6); - QProjector Q(nemo.world, nemo.get_calc()->amo); - - // currently only closed shell - MADNESS_ASSERT(betas.get_mos().size()==0); - print_orbital_information(world, alphas); - - std::cout << "compute initial guess\n"; - auto basis = compute_initial_guess(nemo); - std::cout << "done\n"; - -// std::vector virreps; -// vecfuncT guessvirt = {basis.back()}; -// std::cout << "guessvirt.size() = " << guessvirt.size() << "\n"; -// guessvirt = symmetry_projector(guessvirt, virreps); -// guessvirt = vecfuncT({guessvirt.back()}); -// virreps = std::vector({"b1u"}); -// guessvirt = symmetry_projector(guessvirt, virreps); -// auto virtuals = MolecularOrbitals(guessvirt, Tensor(1), virreps, Tensor(1), std::vector(1,0)); -// print_orbital_information(world, virtuals); - - std::vector airreps; - //basis = symmetry_projector(basis, airreps); - auto bas = MolecularOrbitals(basis, Tensor(basis.size()), airreps, Tensor(basis.size()), std::vector(basis.size(),0)); - print_orbital_information(world, bas); - - // will only optimize the virtuals here - const double thresh = 1.e-4; - auto size = bas.get_mos().size(); - typedef allocator allocT; - typedef XNonlinearSolver >, double, allocT> solverT; - allocT alloc(world, size); - solverT solver(allocT(world, size)); - bool canonicalize = true; - for(auto i=0; i<10; i++){ - // hardcoded for 2e example -// auto mo = alphas.get_mos().front(); -// auto vi = virtuals.get_mos().front(); -// auto h = Vnuc(basis,basis) + T(basis,basis); -// auto g11 = gop(vi*vi); -// auto g01 = gop(mo*vi); -// auto Vx = Vnuc(vi)*dij(1,1) + Q(dijkl(1,1,1,1)*g11*vi + dijkl(1,1,0,0)*g01*mo) - dij(1,1)*h(0,1)*mo; -// const double lambdax = dij(1,1)*T(vi,vi) + vi.inner(Vx) ; -// auto BSH = BSHOperator3D(world, sqrt(-2.0 * lambdax/dij(1,1)), 1.e-6, 1.e-6); -// auto vi2 = BSH(-2.0/dij(1,1)*Vx); -// auto resx = vi - vi2; -// auto err = resx.norm2(); -// std::cout << "err=" << err << " lambda=" << lambdax << "\n"; -// //vi = vi2; -// //vi = solver.update(vi, res); -// vi = Q(vi); -// const auto norm = vi.norm2(); -// std::cout << "norm of updated function " << norm << "\n"; -// vi.scale(1.0/norm); -// Tensor tmp(1); -// tmp[0] = lambdax; -// vecfuncT tmpvi(1,vi); -// virtuals.update_mos_and_eps(tmpvi, tmp); -// if(std::fabs(err) < 1.e-3) break; -// basis = {mo, vi}; - - //vecfuncT hop = T(bas.get_mos()) + Vnuc(bas.get_mos()); // not supported currently; would need for non-diagonal dij - - auto S = matrix_inner(world, bas.get_mos(), bas.get_mos()); - std::cout << "Overlap\n" << S << "\n"; - - std::vector glm; - - for (auto l=0;l kinetic_part(size,size); // diagonal matrix - for (auto a=0; a(world, moa); - kinetic_part(a,a) = dij(a,a)*T(bas.get_mos()[a], bas.get_mos()[a]); - for(auto k=0;k eps(size); - if (canonicalize){ - Tensor U, lambda; - syev(Lambda, U, lambda); - std::cout << "lambdas : " << lambda << "\n"; - bas.update_mos(transform(world, bas.get_mos(), U)); - V = transform(world, V, U); - for (int i = 0;i < size;++i) { - eps[i] = lambda(i)/dij(i,i); - } - }else{ - for (auto a=0; a ops(size); - for (int i = 0;i < size;++i) { - if (eps[i] > 0) { - MADNESS_EXCEPTION("Positive Eigenvalue for BSH Operator?????", 1); - } - ops[i] = poperatorT(BSHOperatorPtr3D(world, sqrt(-2.0 * eps[i]), 1.e-6, 1.e-6)); - } - -// auto res = bas.get_mos() - apply(world, ops, V); -// auto updated = solver.update(bas.get_mos(), res); - auto updated = apply(world,ops,V); - for (auto& u: updated){ - u.scale(1.0/u.norm2()); - } - auto res = bas.get_mos() - updated; - - auto errv = norm2s(world, res); - auto maxerr = std::max_element(std::begin(errv), std::end(errv)); - std::cout << "errv : " << errv << " | max " << *maxerr << "\n"; - if (*maxerr < 1.e-3) break; - - bas.update_mos(updated); - - - } - - auto hij = compute_one_electron_tensor(basis, T); - hij += compute_one_electron_tensor(basis, Vnuc); - const auto gijkl = compute_two_electron_tensor(world, basis, gop); - const auto energy = compute_energy(hij, gijkl, dij, dijkl); - std::cout << "final energy = " << 2.0* energy + nuc_rep << "\n"; // factor 2 currently missing in density matrices (or because its only AB) - -// { -// auto h = hij.flat(); -// nc::NdArray hh(h.ptr(), h.size(), 1); -// hh.tofile("hij.bin", ""); -// }{ -// auto h = dij.flat(); -// nc::NdArray hh(h.ptr(), h.size(), 1); -// hh.tofile("dij.bin", ""); -// }{ -// auto g = gijkl.flat(); -// nc::NdArray gg(g.ptr(), g.size(), 1); -// gg.tofile("gijkl.bin", ""); -// }{ -// auto g = dijkl.flat(); -// nc::NdArray gg(g.ptr(), g.size(), 1); -// gg.tofile("dijkl.bin", ""); -// } - - - - print_stats(world); - finalize(); -} diff --git a/src/apps/tequila/tequila_test.cpp b/src/apps/tequila/tequila_test.cpp deleted file mode 100644 index efc644457f7..00000000000 --- a/src/apps/tequila/tequila_test.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* - * tequila.cpp - * - * Madness tequila interface and - * an empirical proove that I suck at naming things - * - * Created on: Mar. 5, 2020 - * Author: jsk - */ - -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES -#include -#include -#include -#include - -#include "NumCpp.hpp" - -using namespace madness; - -// DEFINE PARAMETER TAGS FOR THE INPUT FILE -const std::string TAG_TQ = "tequila"; - -std::vector > solve_two_electron_cid(const vecfuncT& occ, const vecfuncT& virt, madness::Nemo& nemo){ - /// Primitive CI doubles solver for a closed shell two electron system - /// returns the one and two electron density matrices in determinantal basis - const double thresh=1.e-5; - //madness::MADNESS_ASSERT(occ.size() ==1); - //madness::MADNESS_ASSERT(virt.size() ==1); - - const auto mo = occ[0]; - const auto vi = virt[0]; - World& world=mo.world(); - - madness::Nuclear V(world, &nemo); - madness::Kinetic T(world); - auto gop = std::shared_ptr < real_convolution_3d > (madness::CoulombOperatorPtr(world, 1.e-6,1.e-6)); - - Tensor detmat(2,2); - detmat(0,0) = 2.0*(V(mo,mo) + T(mo,mo)) + (mo*mo).inner((*gop)(mo*mo)); - detmat(1,1) = 2.0*(V(vi,vi) + T(vi,vi)) + (vi*vi).inner((*gop)(vi*vi)); - detmat(0,1) = (mo*vi).inner((*gop)(vi*mo)); - detmat(1,0) = detmat(0,1); - - Tensor U, evals; - syev(detmat, U, evals); - if(world.rank()==0) std::cout << "CI Matrix:\n" << detmat << "\n"; - if(world.rank()==0) std::cout << "CI Results:\n" << evals << "\n" << U << "\n"; - - // compute the reduced one particle density matrix of the ground state - // no single exictations in this example so it is diagonal - Tensor Dij(2,2); - Dij(0,0) = U(0,0)*U(0,0); - Dij(1,1) = U(1,0)*U(1,0); - - if(world.rank()==0) std::cout << "One RDM:\n" << Dij.flat() << "\n"; - - // two particle density matrix - Tensor Dijkl(2,2,2,2); - Dijkl(0,0,0,0) = U(0,0)*U(0,0) ; - Dijkl(1,1,1,1) = U(1,0)*U(1,0) ; - Dijkl(1,1,0,0) = U(0,0)*U(1,0) ; - Dijkl(0,0,1,1) = U(1,0)*U(0,0) ; - - if(world.rank()==0) std::cout << "Two RDM:\n" << Dijkl.flat() << "\n"; - - - return {Dij, Dijkl}; - -} - -int main(int argc, char** argv) { - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); - if (world.rank() == 0) printf("starting at time %.1f\n", wall_time()); - const double time_start = wall_time(); - std::cout.precision(6); - - startup(world,argc,argv,true); - //print_meminfo(world.rank(), "startup"); - - // Get the name of the input file (if given) - const std::string input = (argc > 1) ? argv[1] : "input"; - - // Compute the SCF Reference - const double time_scf_start = wall_time(); - std::shared_ptr calc(new SCF(world, input)); - Nemo nemo(world, calc, input); - nemo.get_calc()->param.print(); - const double scf_energy = nemo.value(); - if (world.rank() == 0) print("nemo energy: ", scf_energy); - if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); - const double time_scf_end = wall_time(); - - // extract what we need from nemo - const auto amo = nemo.get_calc()->amo; - const auto bmo = nemo.get_calc()->bmo; - const auto atomic_guess = nemo.get_calc() -> ao; - const double nuc_rep = nemo.get_calc() -> molecule.nuclear_repulsion_energy(); - madness::Nuclear V(world, &nemo); - madness::Kinetic T(world); - auto gop = std::shared_ptr < real_convolution_3d > (madness::CoulombOperatorPtr(world, 1.e-6,1.e-6)); - QProjector Q(world, amo); - - auto atomic_mo = atomic_guess[0] + atomic_guess[1]; - auto atomic_vi = atomic_guess[0] - atomic_guess[1]; - atomic_mo.scale(1.0/atomic_mo.norm2()); - atomic_vi.scale(1.0/atomic_vi.norm2()); - auto mo = amo[0]; - const double hf_energy_atomic = 2.0*(V(atomic_mo,atomic_mo) + T(atomic_mo,atomic_mo)) + (atomic_mo*atomic_mo).inner((*gop)(atomic_mo*atomic_mo)) + nuc_rep; - std::cout << "Atomic HF Energy = " << hf_energy_atomic << "\n"; - std::cout << "Atomic HF Energy = " << hf_energy_atomic - nuc_rep << " (no nuclear repulsion added)\n"; - - const double hf_energy = 2.0*(V(mo,mo) + T(mo,mo)) + (mo*mo).inner((*gop)(mo*mo)) + nuc_rep; - std::cout << "HF Energy = " << hf_energy << "\n"; - - auto vi = Q(atomic_vi); - atomic_vi.scale(1.0/atomic_vi.norm2()); - - Tensor hij,gijkl,dij,dijkl; - for (auto iter=0; iter<20; iter++){ - std::cout << "Iteration " << iter << "\n"; - -// std::cout << "DOING ATOMIC TEST\n"; -// vecfuncT all_basis_functions = {atomic_mo, atomic_vi}; - vecfuncT all_basis_functions = {mo, vi}; - //vecfuncT all_basis_functions = {atomic_mo, atomic_vi}; - const auto S = madness::matrix_inner(world, all_basis_functions, all_basis_functions, true); - - if(world.rank() ==0 ){ - std::cout << "S:\n"; - std::cout << S << "\n"; - } - - const auto rdms = solve_two_electron_cid(vecfuncT(1,mo), vecfuncT(1,vi), nemo); - dij = rdms[0]; - dijkl = rdms[1]; - - const Tensor h = V(all_basis_functions, all_basis_functions) + T(all_basis_functions, all_basis_functions); - std::cout << "hcore\n" << h << "\n"; - Tensor g(all_basis_functions.size(), all_basis_functions.size(),all_basis_functions.size(),all_basis_functions.size()); - double energy1 = 0.0; - double energy2 = 0.0; - const auto& f = all_basis_functions; - for (auto i=0; i hh(h.ptr(), h.size(), 1); - hh.tofile("hij.bin", ""); - }{ - auto h = dij.flat(); - nc::NdArray hh(h.ptr(), h.size(), 1); - hh.tofile("dij.bin", ""); - }{ - auto g = gijkl.flat(); - nc::NdArray gg(g.ptr(), g.size(), 1); - gg.tofile("gijkl.bin", ""); - }{ - auto g = dijkl.flat(); - nc::NdArray gg(g.ptr(), g.size(), 1); - gg.tofile("dijkl.bin", ""); - } - - - print_stats(world); - finalize(); - return 0; -} - - - - - - - From 107db8bda77b0e481ca51ad5ebe35ff3119cbfca Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Fri, 13 Nov 2020 18:14:46 -0500 Subject: [PATCH 0139/1312] Update README.md --- README.md | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/README.md b/README.md index 795f1328f1e..663d9ca498f 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,86 @@ madness Multiresolution Adaptive Numerical Environment for Scientific Simulation +# Tequila Support + +This fork of madness holds the necessary structures to interface with [tequila](https://github.com/aspuru-guzik-group/tequila). +Those part of the code are currently not merged into the main madness repository (but will be at some point). +Follow the next section to install madness. + +`tequila` needs to find the executable `$MAD_ROOT_DIR/src/apps/pno/pno_integrals`. +It can detect it automatically if you add the directory to your current `PATH` or if you export the `MAD_ROOT_DIR` variable: +`export MAD_ROOT_DIR=$MAD_ROOT_DIR` +`$MAD_ROOT_DIR` is the directory where madness was compiled. + +# Install on Ubuntu or similar + +In order to get the most out of madness you should install intel-mkl and configure madness with it. +You can download and install it from the intel website, it is free. +Later down is a small recipe on how to install it on ubuntu or similar operating systems. +You furhtermore need a working MPI compiler (MPICH should do the job) and cmake. +To compile the pno_integrals executable that `tequila` needs, you furthermore need boost and numcpp. + +## MKL +```bash + wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB + sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB + echo "trying to install mkl ..." + sudo sh -c 'echo deb https://apt.repos.intel.com/mkl all main > /etc/apt/sources.list.d/intel-mkl.list' + sudo apt-get update + sudo apt-get install -y intel-mkl-64bit-2020.1-102 +``` +This will install mkl into the directory: +`/opt/intel/compilers_and_libraries_2020.1.102/linux/mkl` +You can export that as MKLROOT, and cmake will be able to detect it later: +`export MKLROOT=/opt/intel/compilers_and_libraries_2020.1.102/linux/mkl` +Alternatively you can pass the following to the cmake command: +`-D MKL_ROOT_DIR=/opt/intel/compilers_and_libraries_2020.1.102/linux/mkl` + +## MPICH +install with +`sudo apt-get install -y mpich` +and cmake will detect it automatically. + +## cmake +`pip install cmake` or `sudo apt-get install -y cmake` + +## NumCPP +It is header only, you only need to get the code from github and remember where it is. +The path where the code is located will be refered to as `NUMCPPROOT` and `$NUMCPPROOT` will mean that this path has to be inserted in the command. +So when we write `$NUMCPPROOT` you will need to insert `/path/to/numcpp/sources/`. +The only thing left to do is get the sources: +`cd $NUMCPPROOT` +`git clone https://github.com/dpilger26/NumCpp.git` + +## Boost +Similar procedure as for NumCPP: You only need the headers here. +If you have boost installed madness might detect it if you add `-D ENABLE_BOOST=ON` to the cmake command. +Note that boost versions installed with `apt-get` are too old (need 1.68 or higher). +`cd $BOOSTROOT` +`wget https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.bz2` +`tar --bzip2 -xf boost_1_73_0.tar.bz2` + +## Install Madness +We use the following directories: +`$MADSOURCE`: The directory with the madness source code +`$MAD_ROOT_DIR`: The directory with the compiled madness code + +Get the sources (note that the `tequila` branch should be checked out, it is the default in this fork): +`git clone https://github.com/kottmanj/madness.git $MADSOURCE` + +Configure +`cd $MAD_ROOT_DIR` +`cmake -D ENABLE_MKL=ON -D CMAKE_CXX_FLAGS='-O3 -DNDEBUG -march=native -I/$NUMCPPROOT/include -I/$BOOSTROOT/include' $MADSOURCE/` + +Compile +`cd $MAD_ROOT_DIR` +`make` + + + + +## + # Summary MADNESS provides a high-level environment for the solution of integral and differential equations in many dimensions using adaptive, fast methods with guaranteed precision based on multi-resolution analysis and novel separated representations. There are three main components to MADNESS. At the lowest level is a new petascale parallel programming environment that increases programmer productivity and code performance/scalability while maintaining backward compatibility with current programming tools such as MPI and Global Arrays. The numerical capabilities built upon the parallel tools provide a high-level environment for composing and solving numerical problems in many (1-6+) dimensions. Finally, built upon the numerical tools are new applications with initial focus upon chemistry, atomic and molecular physics, material science, and nuclear structure. From bca68a50eb91b9710bcfe555dc77d4118d8c1c61 Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Fri, 13 Nov 2020 18:27:35 -0500 Subject: [PATCH 0140/1312] Update README.md --- README.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 663d9ca498f..0bb6e85b640 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,10 @@ Follow the next section to install madness. `tequila` needs to find the executable `$MAD_ROOT_DIR/src/apps/pno/pno_integrals`. It can detect it automatically if you add the directory to your current `PATH` or if you export the `MAD_ROOT_DIR` variable: -`export MAD_ROOT_DIR=$MAD_ROOT_DIR` +```bash +export MAD_ROOT_DIR=$MAD_ROOT_DIR +``` + `$MAD_ROOT_DIR` is the directory where madness was compiled. # Install on Ubuntu or similar @@ -34,17 +37,27 @@ To compile the pno_integrals executable that `tequila` needs, you furthermore ne This will install mkl into the directory: `/opt/intel/compilers_and_libraries_2020.1.102/linux/mkl` You can export that as MKLROOT, and cmake will be able to detect it later: -`export MKLROOT=/opt/intel/compilers_and_libraries_2020.1.102/linux/mkl` +```bash +export MKLROOT=/opt/intel/compilers_and_libraries_2020.1.102/linux/mkl +``` Alternatively you can pass the following to the cmake command: `-D MKL_ROOT_DIR=/opt/intel/compilers_and_libraries_2020.1.102/linux/mkl` ## MPICH install with -`sudo apt-get install -y mpich` +```bash +sudo apt-get install -y mpich +``` and cmake will detect it automatically. ## cmake -`pip install cmake` or `sudo apt-get install -y cmake` +```bash +pip install cmake +``` +or +```bash +sudo apt-get install -y cmake +``` ## NumCPP It is header only, you only need to get the code from github and remember where it is. From b0221b9992935eb2b78f7ead5130d48c7514b7a6 Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Fri, 13 Nov 2020 18:31:23 -0500 Subject: [PATCH 0141/1312] Update README.md --- README.md | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 0bb6e85b640..009c625f7b8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,14 @@ madness Multiresolution Adaptive Numerical Environment for Scientific Simulation +# Summary + +MADNESS provides a high-level environment for the solution of integral and differential equations in many dimensions using adaptive, fast methods with guaranteed precision based on multi-resolution analysis and novel separated representations. There are three main components to MADNESS. At the lowest level is a new petascale parallel programming environment that increases programmer productivity and code performance/scalability while maintaining backward compatibility with current programming tools such as MPI and Global Arrays. The numerical capabilities built upon the parallel tools provide a high-level environment for composing and solving numerical problems in many (1-6+) dimensions. Finally, built upon the numerical tools are new applications with initial focus upon chemistry, atomic and molecular physics, material science, and nuclear structure. + +Please look in the [wiki](https://github.com/m-a-d-n-e-s-s/madness/wiki) for more information and project activity. + +Here's a [video](http://www.youtube.com/watch?v=dBwWjmf5Tic) about MADNESS. + # Tequila Support This fork of madness holds the necessary structures to interface with [tequila](https://github.com/aspuru-guzik-group/tequila). @@ -81,28 +89,21 @@ We use the following directories: `$MAD_ROOT_DIR`: The directory with the compiled madness code Get the sources (note that the `tequila` branch should be checked out, it is the default in this fork): -`git clone https://github.com/kottmanj/madness.git $MADSOURCE` +```bash +git clone https://github.com/kottmanj/madness.git $MADSOURCE +``` Configure -`cd $MAD_ROOT_DIR` -`cmake -D ENABLE_MKL=ON -D CMAKE_CXX_FLAGS='-O3 -DNDEBUG -march=native -I/$NUMCPPROOT/include -I/$BOOSTROOT/include' $MADSOURCE/` +```bash +cd $MAD_ROOT_DIR +cmake -D ENABLE_MKL=ON -D CMAKE_CXX_FLAGS='-O3 -DNDEBUG -march=native -I/$NUMCPPROOT/include -I/$BOOSTROOT/include' $MADSOURCE/ +``` Compile -`cd $MAD_ROOT_DIR` -`make` - - - - -## - -# Summary - -MADNESS provides a high-level environment for the solution of integral and differential equations in many dimensions using adaptive, fast methods with guaranteed precision based on multi-resolution analysis and novel separated representations. There are three main components to MADNESS. At the lowest level is a new petascale parallel programming environment that increases programmer productivity and code performance/scalability while maintaining backward compatibility with current programming tools such as MPI and Global Arrays. The numerical capabilities built upon the parallel tools provide a high-level environment for composing and solving numerical problems in many (1-6+) dimensions. Finally, built upon the numerical tools are new applications with initial focus upon chemistry, atomic and molecular physics, material science, and nuclear structure. - -Please look in the [wiki](https://github.com/m-a-d-n-e-s-s/madness/wiki) for more information and project activity. - -Here's a [video](http://www.youtube.com/watch?v=dBwWjmf5Tic) about MADNESS. +```bash +cd $MAD_ROOT_DIR +make +``` # Funding The developers gratefully acknowledge the support of the Department of Energy, Office of Science, Office of Basic Energy Sciences and Office of Advanced Scientific Computing Research, under contract DE-AC05-00OR22725 with Oak Ridge National Laboratory. From 1d5822e104e63708cef8f6def1d0a7c067456d19 Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Tue, 17 Nov 2020 11:38:54 -0500 Subject: [PATCH 0142/1312] Update README.md --- README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/README.md b/README.md index 009c625f7b8..2b18e13fbf3 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,39 @@ sudo apt-get install -y mpich ``` and cmake will detect it automatically. +## MPICH on Clusters +Check if you can load an mpich module. +Alternative OpenMPI or IntelMPI might work. It depends on compiler version and which c++ compiler is used in the end. + +You can compile MPICH yourself with the following steps: +1. Get the sources and unpack them +```bash +cd $MPICHSOURCE +wget http://www.mpich.org/static/downloads/3.3.2/mpich-3.3.2.tar.gz +tar -xzf mpich-3.3.2.tar.gz +``` +2. Make sure you have gcc and g++ >= 7 (check if you can load modules) +3. Configure and install mpich, the `CC` and `CXX` statements ensure that the right compilers are used. $MPICH_ROOT_DIR is the directory where you want mpich to be installed (chose one, where you have write permissions!) +```bash +cd $MPICHSOURCE/mpich-3.3.2 +mkdir build +cd build +../configure CC=gcc CXX=g++ --prefix=$MPICH_ROOT_DIR +make +make install +``` +4. Make sure your OS finds mpich (you need to do this again, after every login; or add it to your .bashrc). `$PATH` is literally `$PATH` here (this adds the old content of PATH that they don't get lost). +```bash +export PATH=$MPICH_ROOT_DIR/bin/:$PATH +``` +5. Test if it worked. +```bash +# should result in $MPICH_ROOT_DIR/bin/mpicxx +which mpicxx +# should return the same as g++ --version +mpicxx --version +``` + ## cmake ```bash pip install cmake @@ -98,6 +131,8 @@ Configure cd $MAD_ROOT_DIR cmake -D ENABLE_MKL=ON -D CMAKE_CXX_FLAGS='-O3 -DNDEBUG -march=native -I/$NUMCPPROOT/include -I/$BOOSTROOT/include' $MADSOURCE/ ``` +If you wish to specifiy which compilers are used: Do so with `-D MPI_CXX_COMPILER=...` and `-D MPI_C_COMPILER=...`. +If you have not exported MKLROOT you can add the MKL paths over `-D MKL_ROOT_DIR=...` (directory that contains `include` and `lib`). Compile ```bash From ce23fd3d369fdf1726e0cda65ce148f733320c69 Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Wed, 18 Nov 2020 11:12:46 -0500 Subject: [PATCH 0143/1312] Update README.md --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index 2b18e13fbf3..4bf78661dba 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,35 @@ cd $MAD_ROOT_DIR make ``` +# Use with Docker +If you are getting frustrated with the madness compilation you can resort to a Docker image. +In the following there will be a short description how to make it work with tequila. +Hereby it is assumed that you have installed Docker and are familiar with the basics. +Note that docker requires administrator priviliges, so everything has to be executed in su mode, so you might want to consider using docker in rootless mode ([see here](https://docs.docker.com/engine/security/rootless/), not tested by me). + +1. Pull the docker image: +```bash +docker pull kottmanj/mra-pno +``` +2. Create a small script that will replace the madness executable in tequila. Let's also name it `pno_integrals`. This is what goes into the file: +```bash +#!/bin/bash" > pno_integrals +name=$(docker run -t -d kottmanj/mra-pno) +docker cp input $name:/ +docker exec $name pno_integrals +docker cp $name:molecule_htensor.bin . +docker cp $name:molecule_gtensor.bin . +docker cp $name:pnoinfo.txt . +docker stop $name +docker rm $name +``` +3. Initialize the tequila molecule like this: +```bash +molecule = tq.Molecule(geometry=geomfile.xyz, n_pno=1, executable="/wherever/it/is/pno_integrals") +``` + + + # Funding The developers gratefully acknowledge the support of the Department of Energy, Office of Science, Office of Basic Energy Sciences and Office of Advanced Scientific Computing Research, under contract DE-AC05-00OR22725 with Oak Ridge National Laboratory. From 5d401ec5e6e06539fb615cad87b09271456668db Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Wed, 10 Feb 2021 17:51:01 -0500 Subject: [PATCH 0144/1312] deleted redundant files --- src/apps/dirac/CMakeLists.txt | 2 +- src/apps/{moldft => dirac}/DFinput_sample | 0 src/apps/dirac/ESInterface.h | 153 --- src/apps/dirac/InitParameters.h | 2 +- src/apps/dirac/NWChem.cc | 973 -------------- src/apps/dirac/NWChem.h | 102 -- src/apps/dirac/basis.h | 70 - src/apps/dirac/gaussian.cc | 1457 --------------------- src/apps/dirac/gaussian.h | 393 ------ src/apps/dirac/polynomial.cc | 148 --- src/apps/dirac/polynomial.h | 235 ---- 11 files changed, 2 insertions(+), 3533 deletions(-) rename src/apps/{moldft => dirac}/DFinput_sample (100%) delete mode 100644 src/apps/dirac/ESInterface.h delete mode 100644 src/apps/dirac/NWChem.cc delete mode 100644 src/apps/dirac/NWChem.h delete mode 100644 src/apps/dirac/basis.h delete mode 100644 src/apps/dirac/gaussian.cc delete mode 100644 src/apps/dirac/gaussian.h delete mode 100644 src/apps/dirac/polynomial.cc delete mode 100644 src/apps/dirac/polynomial.h diff --git a/src/apps/dirac/CMakeLists.txt b/src/apps/dirac/CMakeLists.txt index 2b1dcd454c4..dacbe4425ca 100644 --- a/src/apps/dirac/CMakeLists.txt +++ b/src/apps/dirac/CMakeLists.txt @@ -1,6 +1,6 @@ # src/apps/moldft -add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc gaussian.cc NWChem.cc polynomial.cc) +add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc ../chem/gaussian.cc ../chem/NWChem.cc ../chem/polynomial.cc) target_link_libraries(DFdriver MADchem MADmra) add_executable(rk rk.cc) diff --git a/src/apps/moldft/DFinput_sample b/src/apps/dirac/DFinput_sample similarity index 100% rename from src/apps/moldft/DFinput_sample rename to src/apps/dirac/DFinput_sample diff --git a/src/apps/dirac/ESInterface.h b/src/apps/dirac/ESInterface.h deleted file mode 100644 index 1f47f4a75e9..00000000000 --- a/src/apps/dirac/ESInterface.h +++ /dev/null @@ -1,153 +0,0 @@ -/* This file is a part of Slymer, which is distributed under the Creative - Commons Attribution-NonCommercial 4.0 International Public License. - - (c) 2017 Stony Brook University. */ - -/** - * \file ESInterface/ESInterface.h - * \brief API and helper routines for interfacing with electronic structure codes. - * - * Provides a common (abstract) framework for extracting information from - * external electronic structure calculations. - */ - -#ifndef __ESInterface_ESInterface_h__ -#define __ESInterface_ESInterface_h__ - -#include -#include -#include -#include -#include -#include -#include "basis.h" - -namespace slymer { - -/// An atom (symbol and position). -struct Atom { - std::string symbol; ///< The atom's symbol. - std::array position; ///< The atom's location, in angstroms. -}; - -/// A set of atoms. -using Atoms = std::vector; - -namespace Properties { - /** - * \brief Different properties that can be read from electronic structure codes. - * - * C-style bitflags via (\c std::bitset) are used for specifying the properties. - * - * Some properties might require reading others, and this framework is designed - * to facilitate reading multiple properties in one go through the output file(s). - */ - using Properties = std::bitset<5>; - - constexpr Properties None = 0; ///< No properties. - constexpr Properties Basis = 1 << 0; ///< The basis set. - constexpr Properties Atoms = 1 << 1; ///< The atoms & positions. - constexpr Properties Energies = 1 << 2; ///< The MO energies. - constexpr Properties MOs = 1 << 3; ///< The MO vector coefficients. - constexpr Properties Occupancies = 1 << 4; ///< MO occupancies. -} // namespace Properties - -/// Abstract base class for interfacing with electronic structure codes. -class ES_Interface { -protected: - Properties::Properties my_properties; ///< The properties that have been read. - BasisSet my_basis_set; ///< The basis set. - Atoms my_atoms; ///< The atoms (symbols and positions, in angstroms). - madness::Tensor my_energies; ///< Alpha molecular orbital energies - madness::Tensor my_MOs; ///< Alpha molecular orbital expansions coefficients. Column is the MO, row is the basis function. - madness::Tensor my_occupancies; ///< Alpha molecular orbital occupancies. - madness::Tensor my_beta_energies; ///< Beta molecular orbital energies - madness::Tensor my_beta_MOs; ///< Beta molecular orbital expansions coefficients. Column is the MO, row is the basis function. - madness::Tensor my_beta_occupancies; ///< Beta molecular orbital occupancies. - -public: - std::reference_wrapper err; ///< Output stream for messages. - const Properties::Properties &properties; ///< Publically accessible list of read properties. - const BasisSet &basis_set; ///< Publicly accessible basis set. - const Atoms &atoms; ///< Publically accessible list of atoms. - const madness::Tensor &energies; ///< Publically accessible list of alpha MO energies. - const madness::Tensor &MOs; ///< Publically accessible alpha MO expansions coefficients. Column is the MO, row is the basis function. - const madness::Tensor &occupancies; ///< Publically accessible list of alpha MO occupancies (in eV). - const madness::Tensor &beta_energies; ///< Publically accessible list of beta MO energies (in eV). - const madness::Tensor &beta_MOs; ///< Publically accessible beta MO expansions coefficients. Column is the MO, row is the basis function. - const madness::Tensor &beta_occupancies; ///< Publically accessible list of beta MO occupancies (in eV). - - - /// No default constructor. - ES_Interface() = delete; - - /** - * \brief Move constructor. - * - * \param[in] es The existing interface to move. - */ - ES_Interface(ES_Interface &&es) - : my_properties{std::move(es.my_properties)}, my_energies{std::move(es.my_energies)}, - my_MOs{std::move(es.my_MOs)}, my_occupancies{std::move(es.my_occupancies)}, - my_beta_energies{std::move(es.my_beta_energies)}, my_beta_MOs{std::move(es.my_beta_MOs)}, - my_beta_occupancies{std::move(es.my_beta_occupancies)}, err(es.err), properties(my_properties), - basis_set(my_basis_set), atoms(my_atoms), energies(my_energies), MOs(my_MOs), occupancies(my_occupancies), - beta_energies(my_beta_energies), beta_MOs(my_beta_MOs), beta_occupancies(my_beta_occupancies) - {} - - /** - * \brief Copy constructor. - * - * \param[in] es The existing interface to copy. - */ - ES_Interface(const ES_Interface &es) - : my_properties{es.my_properties}, my_energies{es.my_energies}, - my_MOs{es.my_MOs}, my_occupancies{es.my_occupancies}, my_beta_energies{es.my_beta_energies}, - my_beta_MOs{es.my_beta_MOs}, my_beta_occupancies{es.my_occupancies}, - err(es.err), properties(my_properties), basis_set(my_basis_set), atoms(my_atoms), - energies(my_energies), MOs(my_MOs), occupancies(my_occupancies), beta_energies(my_beta_energies), - beta_MOs(my_beta_MOs), beta_occupancies(my_beta_occupancies) - {} - - /** - * \brief Constructor that sets the error/warning stream and the references. - * - * \param[in,out] err_ Output stream for messages. This can be updated later. - */ - ES_Interface(std::ostream &err_) - : my_properties{Properties::None}, my_energies(1), my_MOs(1, 1), - my_occupancies(1), my_beta_energies(1), my_beta_MOs(1,1), my_beta_occupancies(1), - err(err_), properties(my_properties), basis_set(my_basis_set), - atoms(my_atoms), energies(my_energies), MOs(my_MOs), occupancies(my_occupancies), - beta_energies(my_beta_energies), beta_MOs(my_beta_MOs), beta_occupancies(my_beta_occupancies) - {} - - virtual ~ES_Interface() = default; - -protected: - /// Reset the interface. - void reset() { - my_properties = Properties::None; - my_basis_set.clear(); - my_atoms.clear(); - my_energies.reshape(1); - my_MOs.reshape(1, 1); - my_occupancies.reshape(1); - my_beta_energies.reshape(1); - my_beta_MOs.reshape(1, 1); - my_beta_occupancies.reshape(1); - } - -public: - /** - * \brief Read the specified properties and store them in the member variables. - * - * \param[in] props The properties to be read, using a bit flag combination. - */ - virtual void read(Properties::Properties props) = 0; - -}; - -} // namespace slymer - -#endif diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index 74893a18ab2..9cf8640a51b 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -7,7 +7,7 @@ #define MADNESS_APPS_DFGUESSPARAMS_H_INCLUDED #include "fcwf.h" -#include "NWChem.h" +#include "../chem/NWChem.h" Function,3> function_real2complex(const Function& r); double myxfunc(const madness::coord_3d& r); diff --git a/src/apps/dirac/NWChem.cc b/src/apps/dirac/NWChem.cc deleted file mode 100644 index f789435c6ae..00000000000 --- a/src/apps/dirac/NWChem.cc +++ /dev/null @@ -1,973 +0,0 @@ -/* This file is a part of Slymer, which is distributed under the Creative - Commons Attribution-NonCommercial 4.0 International Public License. - - (c) 2017 Stony Brook University. */ - -/** - * \file ESInterface/NWChem.cc - * \brief Implementation of the interface for NWChem. - */ - -#include -#include "NWChem.h" -#include -#include -#include -#include -#include -#include -#include -#include "gaussian.h" - -namespace slymer { - -// helper functions - -void NWChem_Interface::read(Properties::Properties props) { - // figure out which properties we need to read: - // 1) Work out dependencies (for instance, basis needs atoms). - // 2) Omit ones that are already read. That is, we need properties that are - // specified in props (post step 1), but not already read (in my_properties). - // ... bitwise and props with (not my_properties) -- has to be requested and - // not read. - - // basis requires atoms - if((props & Properties::Basis).any()) - props |= Properties::Atoms; - - // if we're doing the MO expansion coefficients, we might as well do the - // energies - if((props & Properties::MOs).any()) - props |= Properties::Energies; - - // skip things we've already read - props &= ~my_properties; - - // do we need to open and read fname.out? - if((props & Properties::Atoms).any() || - (props & Properties::Basis).any()) { - - // open the NWChem log file: fname.out - std::ifstream in(fname + ".out"); - if(!in) - throw std::invalid_argument("Cannot open " + fname + ".out for reading."); - - if((props & Properties::Atoms).any()) - read_atoms(in); - if((props & Properties::Basis).any()) - read_basis_set(in); - - in.close(); - } - - // do we need to open and read fname.movecs? - if((props & Properties::Energies).any() || - (props & Properties::MOs).any() || - (props & Properties::Occupancies).any()) { - - // open the NWChem movecs file: fname.movecs - // this file is binary - std::ifstream in(fname + ".movecs", std::ios::binary); - if(!in) - throw std::invalid_argument("Cannot open " + fname + ".movecs for reading."); - in.unsetf(std::ios::skipws); - - read_movecs(props, in); - - in.close(); - } -} - -void NWChem_Interface::read_atoms(std::istream &in) { - my_atoms.clear(); - - // state variables - std::string line; // current line of the NWChem output - bool reading = false; // are we in the block of text where we can read basis functions? - double unitcf = 1.; // Conversion factor to go from units in the NWChem file to angstroms - - // regex search strings - std::regex startline{R"(Geometry)"}, - unitline{R"(Output coordinates in (a.u.|angstroms|nanometer|picometer|.+) \(scale)"}, - atomline{R"([[:digit:]]+[[:space:]]+([[:alpha:]]+)[[:space:]]+[^[:space:]]+[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+))"}, - doneline{R"(Atomic Mass)"}; - std::smatch matches; - - // note that NWChem outputs the orbitals by atom type, listing ang. momentum, exponents, and coefficients - while(std::getline(in, line)) { - // is this the start of the basis function output? - if(!reading && std::regex_search(line, startline)) { - reading = true; - } - - // in what units are the atomic positions? - else if(reading && std::regex_search(line, matches, unitline)) { - bool doprint = true; - if(matches[1] == "angstroms") - unitcf = 1./0.529177; - else if(matches[1] == "a.u.") - unitcf = 1.0; - else if(matches[1] == "nanometer") - unitcf = 10./0.529177; - else if(matches[1] == "picometer") - unitcf = 0.01/0.529177; - else { - err.get() << "Unknown units: " << matches[1] << ". Assuming angstroms." << std::endl; - unitcf = 1.; - doprint = false; - } - if(doprint) - err.get() << "NWChem uses " << matches[1] << ". Conversion to a.u. is " - << unitcf << '.' << std::endl; - } - - // does this line have an atomic position? - else if(reading && std::regex_search(line, matches, atomline)) { - err.get() << matches[1] << " at (" << matches[2] << ", " << matches[3] << ", " << matches[4] << ")." << std::endl; - Atom addme; - addme.symbol = matches[1]; - addme.position = {{std::stod(matches[2]) * unitcf, std::stod(matches[3]) * unitcf, std::stod(matches[4]) * unitcf}}; - my_atoms.emplace_back(std::move(addme)); - } - - // are we done? - else if(reading && std::regex_search(line, doneline)) { - break; - } - } - - my_properties = my_properties | Properties::Atoms; -} - - - -// helper functions and data types for reading the basis set - -/** - * \brief Store information on a shell of basis functions as it's being read. - * - * Used when reading the basis functions. - */ -struct BasisShell { - char type; ///< Type of basis function. - std::vector coeffs, ///< Expansion coefficient for each primitive. - exps; ///< Exponent for each primitive. -}; - -static std::ostream &operator<< (std::ostream &out, const BasisShell &bs) { - out << "Type " << bs.type << ", exps = [ "; - for(auto ex : bs.exps) - out << ex << ' '; - out << "], coeffs = [ "; - for(auto coeff : bs.coeffs) - out << coeff << ' '; - out << "]"; - return out; -} - -void NWChem_Interface::read_basis_set(std::istream &in) { - my_basis_set.clear(); - // First we have to read the basis functions (and types) that are on each atom - - // state variables - std::string line; // current line of the NWChem output - bool reading = false; // are we in the block of text where we can read basis functions? - bool spherical = true; // are we using spherical orbitals (true) or Cartesian (false)? - std::string curatom; // Symbol of the current atom being read. - unsigned curnum = 1; // The current basis function number (for the symbol) being read. - BasisShell curfunc; // The current basis function being read. - std::map> basisperatom; // List of basis functions for the given symbol (map key). - std::list basiscuratom; // List of basis functions for the current atom. - - // regex search strings - std::regex startline{R"(Basis.*(cartesian|spherical))"}, - newatomline{R"(([[:alpha:]]+)[[:space:]]+\(([[:alpha:]]+)\))"}, - orbitalline{R"(([[:digit:]]+)[[:space:]]+([[:alpha:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+))"}, - doneline{R"(Summary)"}; - std::smatch matches; - - // note that NWChem outputs the orbitals by atom type, listing ang. momentum, exponents, and coefficients - while(std::getline(in, line)) { - // is this the start of the basis function output? - if(!reading && std::regex_search(line, matches, startline)) { - reading = true; // we're now in the basis function block - - // determine the type of basis function being used - if(matches[1] == "cartesian") - spherical = false; - else if(matches[1] == "spherical") - spherical = true; - - err.get() << "Using " << (spherical ? "spherical" : "Cartesian") << " orbitals." << std::endl; - } - - // Are we done reading orbitals? - else if(reading && std::regex_search(line, doneline)) { - if(curatom.length() > 0) { - err.get() << " Function " << curnum << ": " << curfunc << std::endl; - basiscuratom.emplace_back(std::move(curfunc)); - basisperatom.emplace(std::move(curatom), std::move(basiscuratom)); - } - break; // nothing more to read - } - - // Is this the start of a new atom? - else if(reading && std::regex_search(line, matches, newatomline)) { - // if this isn't the first symbol, store the previous symbol's basis and reset - if(curatom.length() > 0) { - err.get() << " Function " << curnum << ": " << curfunc << std::endl; - - basiscuratom.emplace_back(std::move(curfunc)); - basisperatom.emplace(std::move(curatom), std::move(basiscuratom)); - } - - curatom = matches[1]; - curnum = 1; - err.get() << "Reading basis for " << curatom << " (" << matches[2] << ")." << std::endl; - } - - else if(reading && std::regex_search(line, matches, orbitalline)) { - // this line is an uncontracted orbital shell - const unsigned func = std::stoul(matches[1]); - if(func == curnum + 1) { - // store the old basis function and prepare to start reading a new one - err.get() << " Function " << curnum << ": " << curfunc << std::endl; - basiscuratom.emplace_back(std::move(curfunc)); - ++curnum; - } - - if(func == curnum) { - // add a new primitive (uncontracted Gaussian) to this overall shell - const std::string type = matches[2]; - if(curfunc.exps.size() == 0) - // first one. set the type - curfunc.type = type[0]; - else if(curfunc.type != type[0]) - throw std::runtime_error("Inconsistent orbital types while reading NWChem basis set."); - - curfunc.exps.push_back(std::stod(matches[3])); - curfunc.coeffs.push_back(std::stod(matches[4])); - } - else - throw std::runtime_error("Inconsistent basis function counting while reading NWChem basis set."); - } - } - - // now we need to go through the atoms in the calculation and create the basis - // functions centered on each. - err.get() << "Processing basis functions for each atom." << std::endl; - - for(const Atom &atom : atoms) { - unsigned nfunc = 0; - - err.get() << "Atom: " << atom.symbol << " at (" << atom.position[0] << - ", " << atom.position[1] << ", " << atom.position[2] << "): "; - - // add the basis functions for this atom type, centered at this location - for(const BasisShell &bs : basisperatom[atom.symbol]) { - if(bs.type == 'S') { - gaussians.emplace_back( - new GaussianFunction(GaussianType::s, atom.position, bs.exps, - bs.coeffs)); - ++nfunc; - } - else if(bs.type == 'P') { - gaussians.emplace_back( - new GaussianFunction(GaussianType::px, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::py, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::pz, atom.position, bs.exps, - bs.coeffs)); - nfunc += 3; - } - else if(bs.type == 'D' && !spherical) { - throw std::runtime_error("Cartesian D shell requested: These are not tested or verified."); - - // THESE ROUTINES HAVE NOT BEEN TESTED - gaussians.emplace_back( - new GaussianFunction(GaussianType::dxx, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::dxy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::dxz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::dyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::dyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::dzz, atom.position, bs.exps, - bs.coeffs)); - nfunc += 6; - } - else if(bs.type == 'D' && spherical) { - gaussians.emplace_back( - new GaussianFunction(GaussianType::dxy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::dyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::dzzmrr, atom.position, bs.exps, - bs.coeffs)); - - std::unique_ptr dxz( - new GaussianFunction(GaussianType::dxz, atom.position, bs.exps, - bs.coeffs)); - dxz->operator*=(-1.); - gaussians.emplace_back(std::move(dxz)); - - gaussians.emplace_back( - new GaussianFunction(GaussianType::dxxmyy, atom.position, bs.exps, - bs.coeffs)); - nfunc += 5; - } - else if(bs.type == 'F' && !spherical) { - throw std::runtime_error("Cartesian F shell requested: These are not tested or verified."); - - // THESE ROUTINES HAVE NOT BEEN TESTED - gaussians.emplace_back( - new GaussianFunction(GaussianType::fxxx, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fxxy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fxxz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fxyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fxyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fxzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fyyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fyyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fyzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fzzz, atom.position, bs.exps, - bs.coeffs)); - nfunc += 10; - } - else if(bs.type == 'F' && spherical) { - gaussians.emplace_back( - new GaussianFunction(GaussianType::fxxymyyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fxyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fyzzmrry, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fzzzmrrz, atom.position, bs.exps, - bs.coeffs)); - - std::unique_ptr fxzzmrrx( - new GaussianFunction(GaussianType::fxzzmrrx, atom.position, bs.exps, - bs.coeffs)); - fxzzmrrx->operator*=(-1.); - gaussians.emplace_back(std::move(fxzzmrrx)); - - gaussians.emplace_back( - new GaussianFunction(GaussianType::fxxzmyyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::fxyymxxx, atom.position, bs.exps, - bs.coeffs)); - nfunc += 7; - } - else if(bs.type == 'G' && !spherical) { - throw std::runtime_error("Cartesian G shell requested: These are not tested or verified."); - - // THESE FUNCTIONS HAVE NOT BEEN TESTED OR VERIFIED!!! - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxxxx, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxxxy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxxxz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxxyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxxyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxxzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxyyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxyyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxyzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxzzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gyyyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gyyyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gyyzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gyzzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gzzzz, atom.position, bs.exps, - bs.coeffs)); - nfunc += 15; - } - else if(bs.type == 'G' && spherical) { - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxydx2my2, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gyzdx2my2, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxydz2mr2, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gyzdz2mr2, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gzero, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxzdz2mr2, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gx2my2dz2mr2, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gxzdx2my2, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::gx4mx2y2py4, atom.position, bs.exps, - bs.coeffs)); - nfunc += 9; - } - else if(bs.type == 'H' && !spherical) { - throw std::runtime_error("Cartesian H shell requested: These are not tested or verified."); - - // THESE FUNCTIONS HAVE NOT BEEN TESTED OR VERIFIED!!! - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxxxxx, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxxxxy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxxxxz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxxxyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxxxyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxxxzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxxyyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxxyyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxxyzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxxzzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxyyyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxyyyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxyyzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxyzzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hxzzzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hyyyyy, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hyyyyz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hyyyzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hyyzzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hyzzzz, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hzzzzz, atom.position, bs.exps, - bs.coeffs)); - nfunc += 21; - } - else if(bs.type == 'H' && spherical) { - gaussians.emplace_back( - new GaussianFunction(GaussianType::hm5, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hm4, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hm3, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hm2, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hm1, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hzero, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hp1, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hp2, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hp3, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hp4, atom.position, bs.exps, - bs.coeffs)); - gaussians.emplace_back( - new GaussianFunction(GaussianType::hp5, atom.position, bs.exps, - bs.coeffs)); - nfunc += 11; - } - else - throw std::runtime_error(std::string("Unknown or unimplemented shell type: ") + bs.type); - } - - err.get() << nfunc << " basis functions." << std::endl; - } - - unsigned size = gaussians.size(); - for(unsigned j = 0; j < size; ++j) { - // add a {reference to the basis function} to the basis set vector - my_basis_set.emplace_back(std::ref(*gaussians[j].get())); - } - - my_properties = my_properties | Properties::Basis; -} - - - -// helper routine for read_movecs - -/** - * \brief Read bytes from a binary file into the specified type. - * - * Attempts to account for the endian-ness of the binary data. This should - * hopefully make the routine more robust to running NWChem jobs on one - * machine and processing the files on another. - * - * \tparam T Type of data to be read (only really need the size). - * \param [in,out] in The input stream. - * \param [in] swap Change the endian-ness of the read data? - * \return The read data, in the requested type. - */ -template -static T read_endian(std::istream &in, const bool swap) { - T ret; - char * const ptr = reinterpret_cast(&ret); - const unsigned bytes = sizeof(T); - - if(swap) { - // need to swap the endian-ness of the data - // read byte-by-byte, in reverse order - for(unsigned j = 0; j < bytes; ++j) - in.read(ptr + (bytes - j - 1), 1); - } - else - // use the data as-is - in.read(ptr, bytes); - - return ret; -} - -void NWChem_Interface::read_movecs(const Properties::Properties props, - std::istream &in) -{ - int32_t num[2]; - bool swap_endian = false; - unsigned nsets, nbasis; - const std::runtime_error errmess("Error reading NWChem movecs file."); - - // what properties are we storing? (all will be read from the movecs file) - const bool do_occupancies = (props & Properties::Occupancies).any(); - const bool do_energies = (props & Properties::Energies).any(); - const bool do_MOs = (props & Properties::MOs).any(); - - // temporary storage places (in case errors pop up while/after reading) - madness::Tensor temp_occupancies, temp_energies; - madness::Tensor temp_MOs; - - // this function is based on the mov2asc program - // https://github.com/jeffhammond/nwchem/blob/master/contrib/mov2asc/mov2asc.F - - // every write statement in fortran puts a 4-byte integer before and after - // the data. this integer contains the size of the data. the num array here - // is used to read these values. - - // read the header information - // first up is a FORTRAN integer (4 bytes) telling the number of characters - // this should be 142 = 3*32 + 20 + 26 or 110 = 2*32 + 20 + 26 - num[0] = read_endian(in, false); - if(num[0] != 142 && num[0] != 110) { - // try the other endian-ness - err.get() << "Unable to read header. Trying opposite endian-ness." << std::endl; - char * const ptr = reinterpret_cast(num); - std::swap(ptr[0], ptr[3]); - std::swap(ptr[1], ptr[2]); // all four of these chars make up num[0] - swap_endian = true; - if(num[0] != 142 && num[0] != 110) { - err.get() << "Still unable to read header. Abort." << std::endl; - throw errmess; - } - else - err.get() << "Using opposite endian-ness for the remainder of this read." << std::endl; - } - // basissum, geomsum, bqsum, scftype20, and date. bqsum may be skipped - in.seekg(num[0], std::ios_base::cur); - // bookend for the length of the above strings combined - num[1] = read_endian(in, swap_endian); - if(num[1] != num[0]) { - err.get() << "Error reading header (basissum, ..., date)." << std::endl; - throw errmess; - } - - // for whatever reason the scftype20 is repeated, with bookends (now = 20) - num[0] = read_endian(in, swap_endian); - if(num[0] != 20) { - err.get() << "Error reading header (scftype20)." << std::endl; - throw errmess; - } - // scftype20 - in.seekg(20, std::ios_base::cur); - num[0] = read_endian(in, swap_endian); - if(num[0] != 20) { - err.get() << "Error reading header (scftype20)." << std::endl; - throw errmess; - } - - // size of the title (lentit) - num[0] = read_endian(in, swap_endian); - // lentit. don't check size explicitly, it's probably either 4 or 8 - // depending on the fortran compiler/environment - in.seekg(num[0], std::ios_base::cur); - num[1] = read_endian(in, swap_endian); - if(num[0] != num[1]) { - err.get() << "Error reading header (lentit)." << std::endl; - throw errmess; - } - - // read the title itself - num[0] = read_endian(in, swap_endian); - // the title. varying length - in.seekg(num[0], std::ios_base::cur); - num[1] = read_endian(in, swap_endian); - if(num[0] != num[1]) { - err.get() << "Error reading title of NWChem job in header." << std::endl; - throw errmess; - } - - // length of the basis set name (lenbas) - num[0] = read_endian(in, swap_endian); - // lentit. don't check size explicitly, it's probably either 4 or 8 - // depending on the fortran compiler/environment - in.seekg(num[0], std::ios_base::cur); - num[1] = read_endian(in, swap_endian); - if(num[0] != num[1]) { - err.get() << "Error reading header (lenbas)." << std::endl; - throw errmess; - } - - // read the basis name itself - num[0] = read_endian(in, swap_endian); - // the title. varying length - in.seekg(num[0], std::ios_base::cur); - num[1] = read_endian(in, swap_endian); - if(num[0] != num[1]) { - err.get() << "Error reading basis set name in header." << std::endl; - throw errmess; - } - - // the number of MO sets (nsets) - num[0] = read_endian(in, swap_endian); - if(num[0] == 4) { - int32_t temp; - temp = read_endian(in, swap_endian); - nsets = static_cast(temp); - } - else if(num[0] == 8) { - int64_t temp; - temp = read_endian(in, swap_endian); - nsets = static_cast(temp); - } - else { - err.get() << "Unknown or unimplemented integer type for the number of sets in header." << std::endl; - throw errmess; - } - num[1] = read_endian(in, swap_endian); - if(num[0] != num[1]) { - err.get() << "Error reading number of sets in header." << std::endl; - throw errmess; - } - if(nsets > 2) { - err.get() << "The read_MOs basis has only been tested for movecs files that have a one or two sets.\n" << - "The results from this function need to be verified before use (" << nsets << " sets).\n" - "Only the last two sets will be kept." << std::endl; - } - - // size of the basis set (NBF in the mov2asc script) - num[0] = read_endian(in, swap_endian); - if(num[0] == 4) { - int32_t temp; - temp = read_endian(in, swap_endian); - nbasis = static_cast(temp); - } - else if(num[0] == 8) { - int64_t temp; - temp = read_endian(in, swap_endian); - nbasis = static_cast(temp); - } - else { - err.get() << "Unknown or unimplemented integer type for basis set size in header." << std::endl; - throw errmess; - } - num[1] = read_endian(in, swap_endian); - if(num[0] != num[1]) { - err.get() << "Error reading basis set size in header." << std::endl; - throw errmess; - } - // make sure this agrees with any information we've already read - if((properties & Properties::Basis) != Properties::None && nbasis != basis_set.size()) { - err.get() << "The number of basis functions in read_MOs does not match the number of " << - "basis functions read\nfrom the NWChem log file. Use the following results with caution." - << std::endl; - } - - // read the number of vectors in each set (nmo) - //std::vector nmo(nsets); - //for(unsigned j = 0; j < nsets; ++j) { - // num[0] = read_endian(in, swap_endian); - // if(num[0] == 4) { - // int32_t temp; - // temp = read_endian(in, swap_endian); - // nmo[j] = static_cast(temp); - // } - // else if(num[0] == 8) { - // int64_t temp; - // temp = read_endian(in, swap_endian); - // nmo[j] = static_cast(temp); - // } - // else { - // err.get() << "Unknown or unimplemented integer type for nmo[" << j << "] in header." << std::endl; - // throw errmess; - // } - // num[1] = read_endian(in, swap_endian); - // if(num[0] != num[1]) { - // err.get() << "Error reading nmo[" << j << "] in header." << std::endl; - // throw errmess; - // } - //} - - // Fix ? - std::vector nmo(nsets); - num[0] = read_endian(in, swap_endian); - if(num[0] == 4) { - int32_t temp; - temp = read_endian(in, swap_endian); - nmo[0] = static_cast(temp); - } - if(num[0] == 8) { - int64_t temp; - temp = read_endian(in, swap_endian); - nmo[0] = static_cast(temp); - } - else if(num[0] > 8) { - int64_t temp; - for(unsigned j = 0; j < nsets; ++j) { - temp = read_endian(in, swap_endian); - nmo[j] = static_cast(temp); - } - } - num[1] = read_endian(in, swap_endian); - if(num[0] != num[1]) { - err.get() << "Error reading nmo sizes in header." << std::endl; - throw errmess; - } - - // go through the sets - for(unsigned set = 0; set < nsets; ++set) { - // Doing this inside so that temp variables get reset correctly - // allocate space to store the occupation numbers, the eigenvalues, and the - // eigenvectors (MO vectors), as desired by the request - if(do_occupancies) { - madness::Tensor one(nmo[nsets-1]); - temp_occupancies = copy(one); - } - if(do_energies) { - madness::Tensor two(nmo[nsets - 1]); - temp_energies = copy(two); - } - if(do_MOs) { - madness::Tensor three(nmo[nsets - 1], nmo[nsets - 1]); - temp_MOs = copy(three); - } - - // first read the occupancies - // number of bits bookend (8 for double * nmo[set]); - num[0] = read_endian(in, swap_endian); - if(num[0] != static_cast(8*nmo[set])) { - err.get() << "Unexpected number of occupancies for set " << set << '.' - << std::endl; - throw errmess; - } - if(do_occupancies) - for(unsigned j = 0; j < nmo[set]; ++j) - temp_occupancies[j] = read_endian(in, swap_endian); - else - in.seekg(num[0], std::ios_base::cur); // just buzz past them. - num[1] = read_endian(in, swap_endian); - if(num[0] != num[1]) { - err.get() << "Error reading occupancies for set " << set << '.' << std::endl; - throw errmess; - } - - // next up are the eigenvalues (energies) - // number of bits bookend (8 for double * nmo[set]); - num[0] = read_endian(in, swap_endian); - if(num[0] != static_cast(8*nmo[set])) { - err.get() << "Unexpected number of energies for set " << set << '.' - << std::endl; - throw errmess; - } - if(do_energies) - for(unsigned j = 0; j < nmo[set]; ++j) - // NWChem reports energies in Hartrees - temp_energies[j] = read_endian(in, swap_endian); - else - in.seekg(num[0], std::ios_base::cur); // just buzz past them. - num[1] = read_endian(in, swap_endian); - if(num[0] != num[1]) { - err.get() << "Error reading energies for set " << set << '.' << std::endl; - throw errmess; - } - - // finally, read the MO vectors, which were written vector-by-vector - for(unsigned mo = 0; mo < nmo[set]; ++mo) { - // bookend size of the vector - num[0] = read_endian(in, swap_endian); - if(num[0] != static_cast(8*nbasis)) { - err.get() << "Unexpected number of coefficients in MO " << mo << " of set " - << set << '.' << std::endl; - throw errmess; - } - if(do_MOs) - for(unsigned coeff = 0; coeff < nbasis; ++coeff) - temp_MOs(coeff, mo) = read_endian(in, swap_endian); - else - in.seekg(num[0], std::ios_base::cur); // just buzz past the MO - // bookend size of the vector - num[1] = read_endian(in, swap_endian); - if(num[0] != num[1]) { - err.get() << "Error reading coefficients of MO " << mo << " of set " - << set << '.' << std::endl; - throw errmess; - } - } - - // move/swap the placeholders into the class's storage space - // ALPHA - if(do_occupancies && set == 0) { - my_occupancies = std::move(temp_occupancies); - my_properties = my_properties | Properties::Occupancies; - } - if(do_energies && set == 0) { - my_energies = std::move(temp_energies); - my_properties = my_properties | Properties::Energies; - } - if(do_MOs && set == 0) { - my_MOs = std::move(temp_MOs); - my_properties = my_properties | Properties::MOs; - } - - // move/swap the placeholders into the class's storage space - // BETA - if(do_occupancies && set == 1) { - my_beta_occupancies = std::move(temp_occupancies); - my_properties = my_properties | Properties::Occupancies; - } - if(do_energies && set == 1) { - my_beta_energies = std::move(temp_energies); - my_properties = my_properties | Properties::Energies; - } - if(do_MOs && set == 1) { - my_beta_MOs = std::move(temp_MOs); - my_properties = my_properties | Properties::MOs; - } - } - - // at the very end of the movecs file is the total energy and nuclear repulsion - // energy of the system - num[0] = read_endian(in, swap_endian); - if(num[0] != 16) { - err.get() << "Unexpected size reading the footer." << std::endl; - throw errmess; - } - read_endian(in, swap_endian); // total energy - read_endian(in, swap_endian); // nuclear repulsion - num[1] = read_endian(in, swap_endian); - if(num[1] != 16) { - err.get() << "Error reading the footer." << std::endl; - throw errmess; - } -} - -} // namespace slymer diff --git a/src/apps/dirac/NWChem.h b/src/apps/dirac/NWChem.h deleted file mode 100644 index b9981f6baf3..00000000000 --- a/src/apps/dirac/NWChem.h +++ /dev/null @@ -1,102 +0,0 @@ -/* This file is a part of Slymer, which is distributed under the Creative - Commons Attribution-NonCommercial 4.0 International Public License. - - (c) 2017 Stony Brook University. */ - -/** - * \file ESInterface/NWChem.h - * \brief API and helper routines for interfacing with NWChem. - */ - -#ifndef __ESInterface_NWChem_h__ -#define __ESInterface_NWChem_h__ - -#include -#include -#include "ESInterface.h" -#include "gaussian.h" - -namespace slymer { - -/// Class for interfacing with NWChem (tested on version 6.6). -class NWChem_Interface : public ES_Interface { -protected: - /// The base file name of the NWChem output. - std::string my_fname; - - /// Storage for the actual basis functions. - std::vector> gaussians; - -public: - NWChem_Interface() = delete; - - /// Publically-accessible version of the file name. - const std::string &fname; - - /** - * \brief Wrap the output of a NWChem computation. - * - * The parameter is the base file name (potentially including path) for the - * NWChem output files. For example, the NWChem log file will be fname.out, - * the molecular orbitals file will be fname.movecs, etc. - * - * \param[in] fname_ Base file name for the NWChem computation. - * \param[in,out] err_ Output stream for error or warning messages. - */ - NWChem_Interface(const std::string &fname_, std::ostream &err_) - : ES_Interface(err_), my_fname(fname_), gaussians(0), fname(my_fname) {} - - /** - * \brief Changes the base file name. - * - * \param[in] fname_ The new base file name for the NWChem computation. - */ - void reset(const std::string &fname_) { - ES_Interface::reset(); - my_fname = fname_; - gaussians.clear(); - } - - /** - * \brief Read the specified properties and store them in the member variables. - * - * \throw std::invalid_argument if the NWChem logfile (fname.out) cannot be - * opened. - * \throw std::runtime_error if there is an error reading the NWChem output - * file. - * - * \param[in] props The properties to be read, using a bit flag combination. - */ - virtual void read(Properties::Properties props) override; - -protected: - /** - * \brief Extract and store the atom types and positions. - * - * \param[in,out] in The stream containing the NWChem output file. - */ - void read_atoms(std::istream &in); - - /** - * \brief Extract and store the basis set. - * - * \todo Reading Cartesian-type d and f shells has not been tested. - * \note Only shells of type s, p, d, and f are implemented. - * - * \param[in,out] in The stream containing the NWChem output file. - */ - void read_basis_set(std::istream &in); - - /** - * \brief Read the NWChem movecs file containing occupation numbers, - * MO energies, and MO coefficients. - * - * \param[in] props Properties to store from the read (from the list above). - * \param[in,out] in The stream for the NWChem output movecs file. - */ - void read_movecs(const Properties::Properties props, std::istream &in); -}; - -} // namespace slymer - -#endif diff --git a/src/apps/dirac/basis.h b/src/apps/dirac/basis.h deleted file mode 100644 index 96071927a04..00000000000 --- a/src/apps/dirac/basis.h +++ /dev/null @@ -1,70 +0,0 @@ -/* This file is a part of Slymer, which is distributed under the Creative - Commons Attribution-NonCommercial 4.0 International Public License. - - (c) 2017 Stony Brook University. */ - -/** - * \file Basis/basis.h - * \brief Basis function API and routines. - * - * Sets up the interface for general basis functions and related calculations. - */ - -#ifndef __Basis_basis_h__ -#define __Basis_basis_h__ - -#include -#include -#include -#include -#include - -namespace slymer { - -/// Abstract base class for generic basis functions. -class BasisFunction { -public: - virtual ~BasisFunction() = default; - - /** - * \brief Evaluate the basis function at the specified point. - * - * \param[in] x The point. - * \return The basis function evaluated at the point x. - */ - virtual double operator() (const std::array &x) const = 0; - -}; - -/// Type for a basis set (collection of basis functions). -using BasisSet = std::vector>; - -/** - * \brief Convert a generic basis set to basis functions with the specific - * type. - * - * \throw std::runtime_error if a basis function in the basis set is not - * of the specified type. - * - * \tparam T The intended type of each basis function. - * \param[in] bset The basis set. - * \return A vector with cast references to the basis functions. - */ -template -std::vector> cast_basis(const BasisSet &bset) { - const unsigned size = bset.size(); - std::vector> casts; - - for(unsigned j = 0; j < size; ++j) { - const T *ptr = dynamic_cast(&bset[j].get()); - if(ptr == nullptr) - throw std::runtime_error("A basis function is not of the specified type."); - casts.emplace_back(std::cref(*ptr)); - } - - return casts; -} - -} // namespace slymer - -#endif diff --git a/src/apps/dirac/gaussian.cc b/src/apps/dirac/gaussian.cc deleted file mode 100644 index 94ced60a3cf..00000000000 --- a/src/apps/dirac/gaussian.cc +++ /dev/null @@ -1,1457 +0,0 @@ -/* This file is a part of Slymer, which is distributed under the Creative - Commons Attribution-NonCommercial 4.0 International Public License. - - (c) 2017 Stony Brook University. */ - -/** - * \file Basis/gaussian.cc - * \brief Implementation of Gaussian basis function API and routines. - */ - -#include "../../madness.h" -#include "gaussian.h" -#include -#include -#include - -const static double pi = 4.*atan(1.); - -namespace slymer { - -/////////////////////////////////////////////////////////////////////////// -// CartesianPrimitive implementations -/////////////////////////////////////////////////////////////////////////// -PrimitiveGaussian::PrimitiveGaussian(const GaussianType &type, - const std::array ¢er, const double ec) - : prefactor(0), exppoly(2) { - - // make sure the decay constant is positive - if(ec <= 0.) - throw std::invalid_argument("Gaussian decay constant must be positive."); - - // set the exponent array; expand out (x-x0)^2 and similarly for y, z - exppoly[{{2,0,0}}] = -ec; - exppoly[{{1,0,0}}] = 2.*ec*center[0]; - exppoly[{{0,0,0}}] = -ec*center[0]*center[0]; - exppoly[{{0,2,0}}] = -ec; - exppoly[{{0,1,0}}] = 2.*ec*center[1]; - exppoly[{{0,0,0}}] += -ec*center[1]*center[1]; - exppoly[{{0,0,2}}] = -ec; - exppoly[{{0,0,1}}] = 2.*ec*center[2]; - exppoly[{{0,0,0}}] += -ec*center[2]*center[2]; - - if(type == GaussianType::s) { - prefactor[{{0,0,0}}] = pow(2.*ec/pi, 0.75); - } - else if(type == GaussianType::px) { - prefactor = PolynomialCoeffs(1); - prefactor[{{1,0,0}}] = 1.; - prefactor[{{0,0,0}}] = -center[0]; - prefactor *= pow(2.*ec/pi, 0.5) * 2.*pow(2.*ec*ec*ec/pi, 0.25); - } - else if(type == GaussianType::py) { - prefactor = PolynomialCoeffs(1); - prefactor[{{0,1,0}}] = 1.; - prefactor[{{0,0,0}}] = -center[1]; - prefactor *= pow(2.*ec/pi, 0.5) * 2.*pow(2.*ec*ec*ec/pi, 0.25); - } - else if(type == GaussianType::pz) { - prefactor = PolynomialCoeffs(1); - prefactor[{{0,0,1}}] = 1.; - prefactor[{{0,0,0}}] = -center[2]; - prefactor *= pow(2.*ec/pi, 0.5) * 2.*pow(2.*ec*ec*ec/pi, 0.25); - } - - // Cartesian and shared d-types - else if(type == GaussianType::dxx) { - prefactor = PolynomialCoeffs(2); - prefactor[{{2,0,0}}] = 1.; - prefactor[{{1,0,0}}] = -2. * center[0]; - prefactor[{{0,0,0}}] = center[0] * center[0]; - prefactor *= pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - } - else if(type == GaussianType::dxy) { - prefactor = PolynomialCoeffs(2); - prefactor[{{1,1,0}}] = 1.; - prefactor[{{1,0,0}}] = -center[1]; - prefactor[{{0,1,0}}] = -center[0]; - prefactor[{{0,0,0}}] = center[0] * center[1]; - prefactor *= pow(2.*ec/pi, 0.25) * 4.*pow(2.*ec*ec*ec/pi, 0.5); - } - else if(type == GaussianType::dxz) { - prefactor = PolynomialCoeffs(2); - prefactor[{{1,0,1}}] = 1.; - prefactor[{{1,0,0}}] = -center[2]; - prefactor[{{0,0,1}}] = -center[0]; - prefactor[{{0,0,0}}] = center[0] * center[2]; - prefactor *= pow(2.*ec/pi, 0.25) * 4.*pow(2.*ec*ec*ec/pi, 0.5); - } - else if(type == GaussianType::dyy) { - prefactor = PolynomialCoeffs(2); - prefactor[{{0,2,0}}] = 1.; - prefactor[{{0,1,0}}] = -2. * center[1]; - prefactor[{{0,0,0}}] = center[1] * center[1]; - prefactor *= pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - } - else if(type == GaussianType::dyz) { - prefactor = PolynomialCoeffs(2); - prefactor[{{0,1,1}}] = 1.; - prefactor[{{0,1,0}}] = -center[2]; - prefactor[{{0,0,1}}] = -center[1]; - prefactor[{{0,0,0}}] = center[1] * center[2]; - prefactor *= pow(2.*ec/pi, 0.25) * 4.*pow(2.*ec*ec*ec/pi, 0.5); - } - else if(type == GaussianType::dzz) { - prefactor = PolynomialCoeffs(2); - prefactor[{{0,0,2}}] = 1.; - prefactor[{{0,0,1}}] = -2. * center[2]; - prefactor[{{0,0,0}}] = center[2] * center[2]; - prefactor *= pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - } - - else if(type == GaussianType::fxxx) { - prefactor = PolynomialCoeffs(3); - prefactor[{{3,0,0}}] = 1.; - prefactor[{{2,0,0}}] = -3. * center[0]; - prefactor[{{1,0,0}}] = 3. * center[0] * center[0]; - prefactor[{{0,0,0}}] = -center[0] * center[0] * center[0]; - prefactor *= pow(2.*ec/pi, 0.5) * 8.*ec*pow(2.*ec*ec*ec/pi, 0.25)/sqrt(15.); - } - else if(type == GaussianType::fxxy) { - prefactor = PolynomialCoeffs(3); - prefactor[{{2,1,0}}] = 1.; - prefactor[{{2,0,0}}] = -center[1]; - prefactor[{{1,1,0}}] = -2. * center[0]; - prefactor[{{1,0,0}}] = 2. * center[0] * center[1]; - prefactor[{{0,1,0}}] = center[0] * center[0]; - prefactor[{{0,0,0}}] = -center[0] * center[0] * center[1]; - prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - } - else if(type == GaussianType::fxxz) { - prefactor = PolynomialCoeffs(3); - prefactor[{{2,0,1}}] = 1.; - prefactor[{{2,0,0}}] = -center[2]; - prefactor[{{1,0,1}}] = -2. * center[0]; - prefactor[{{1,0,0}}] = 2. * center[0] * center[2]; - prefactor[{{0,0,1}}] = center[0] * center[0]; - prefactor[{{0,0,0}}] = -center[0] * center[0] * center[2]; - prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - } - else if(type == GaussianType::fxyy) { - prefactor = PolynomialCoeffs(3); - prefactor[{{1,2,0}}] = 1.; - prefactor[{{0,2,0}}] = -center[0]; - prefactor[{{1,1,0}}] = -2. * center[1]; - prefactor[{{0,1,0}}] = 2. * center[0] * center[1]; - prefactor[{{1,0,0}}] = center[1] * center[1]; - prefactor[{{0,0,0}}] = -center[0] * center[1] * center[1]; - prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - } - else if(type == GaussianType::fxyz) { - prefactor = PolynomialCoeffs(3); - prefactor[{{1,1,1}}] = 1.; - prefactor[{{1,1,0}}] = -center[2]; - prefactor[{{1,0,1}}] = -center[1]; - prefactor[{{0,1,1}}] = -center[0]; - prefactor[{{1,0,0}}] = center[1] * center[2]; - prefactor[{{0,1,0}}] = center[0] * center[2]; - prefactor[{{0,0,1}}] = center[0] * center[1]; - prefactor[{{0,0,0}}] = -center[0] * center[1] * center[2]; - prefactor *= 8.*pow(2.*ec*ec*ec/pi, 0.75); - } - else if(type == GaussianType::fxzz) { - prefactor = PolynomialCoeffs(3); - prefactor[{{1,0,2}}] = 1.; - prefactor[{{0,0,2}}] = -center[0]; - prefactor[{{1,0,1}}] = -2. * center[2]; - prefactor[{{0,0,1}}] = 2. * center[0] * center[2]; - prefactor[{{1,0,0}}] = center[2] * center[2]; - prefactor[{{0,0,0}}] = -center[0] * center[2] * center[2]; - prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - } - else if(type == GaussianType::fyyy) { - prefactor = PolynomialCoeffs(3); - prefactor[{{0,3,0}}] = 1.; - prefactor[{{0,2,0}}] = -3. * center[1]; - prefactor[{{0,1,0}}] = 3. * center[1] * center[1]; - prefactor[{{0,0,0}}] = -center[1] * center[1] * center[1]; - prefactor *= pow(2.*ec/pi, 0.5) * 8.*ec*pow(2.*ec*ec*ec/pi, 0.25)/sqrt(15.); - } - else if(type == GaussianType::fyyz) { - prefactor = PolynomialCoeffs(3); - prefactor[{{0,2,1}}] = 1.; - prefactor[{{0,2,0}}] = -center[2]; - prefactor[{{0,1,1}}] = -2. * center[1]; - prefactor[{{0,1,0}}] = 2. * center[1] * center[2]; - prefactor[{{0,0,1}}] = center[1] * center[1]; - prefactor[{{0,0,0}}] = -center[1] * center[1] * center[2]; - prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - } - else if(type == GaussianType::fyzz) { - prefactor = PolynomialCoeffs(3); - prefactor[{{0,1,2}}] = 1.; - prefactor[{{0,0,2}}] = -center[1]; - prefactor[{{0,1,1}}] = -2. * center[2]; - prefactor[{{0,0,1}}] = 2. * center[1] * center[2]; - prefactor[{{0,1,0}}] = center[2] * center[2]; - prefactor[{{0,0,0}}] = -center[1] * center[2] * center[2]; - prefactor *= pow(2.*ec/pi, 0.25) * 2.*pow(2.*ec*ec*ec/pi, 0.25) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - } - else if(type == GaussianType::fzzz) { - prefactor = PolynomialCoeffs(3); - prefactor[{{0,0,3}}] = 1.; - prefactor[{{0,0,2}}] = -3. * center[2]; - prefactor[{{0,0,1}}] = 3. * center[2] * center[2]; - prefactor[{{0,0,0}}] = -center[2] * center[2] * center[2]; - prefactor *= pow(2.*ec/pi, 0.5) * 8.*ec*pow(2.*ec*ec*ec/pi, 0.25)/sqrt(15.); - } - - // spherical d orbitals - else if(type == GaussianType::dzzmrr) { - // setup as dzz - dxx/2 - dyy/2 - PolynomialCoeffs predxx(2), predyy(2), predzz(2); - predxx[{{2,0,0}}] = 1.; - predxx[{{1,0,0}}] = -2. * center[0]; - predxx[{{0,0,0}}] = center[0] * center[0]; - predxx *= -pow(2.*ec/pi, 0.5) * 2.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - predyy[{{0,2,0}}] = 1.; - predyy[{{0,1,0}}] = -2. * center[1]; - predyy[{{0,0,0}}] = center[1] * center[1]; - predyy *= -pow(2.*ec/pi, 0.5) * 2.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - predzz[{{0,0,2}}] = 1.; - predzz[{{0,0,1}}] = -2. * center[2]; - predzz[{{0,0,0}}] = center[2] * center[2]; - predzz *= pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.); - prefactor = predxx + predyy + predzz; - } - else if(type == GaussianType::dxxmyy) { - // setup as sqrt(3)*dxx/2 - sqrt(3)*dyy/2 - PolynomialCoeffs predxx(2), predyy(2); - predxx[{{2,0,0}}] = 1.; - predxx[{{1,0,0}}] = -2. * center[0]; - predxx[{{0,0,0}}] = center[0] * center[0]; - predxx *= pow(2.*ec/pi, 0.5) * 2.*ec*pow(2.*ec/pi, 0.25); - predyy[{{0,2,0}}] = 1.; - predyy[{{0,1,0}}] = -2. * center[1]; - predyy[{{0,0,0}}] = center[1] * center[1]; - predyy *= -pow(2.*ec/pi, 0.5) * 2.*ec*pow(2.*ec/pi, 0.25); - prefactor = predxx + predyy; - } - - // spherical f orbitals - else if(type == GaussianType::fxyymxxx) { - // setup dxx and dyy, get (3dyy - dxx), normalize, and multiply by x - PolynomialCoeffs xfact(1), predxx(2), predyy(2); - xfact[{{1,0,0}}] = 1.; - xfact[{{0,0,0}}] = -center[0]; - predxx[{{2,0,0}}] = 1.; - predxx[{{1,0,0}}] = -2. * center[0]; - predxx[{{0,0,0}}] = center[0] * center[0]; - predxx *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)/sqrt(3.) * sqrt(0.5*ec); - predyy[{{0,2,0}}] = 1.; - predyy[{{0,1,0}}] = -2. * center[1]; - predyy[{{0,0,0}}] = center[1] * center[1]; - predyy *= sqrt(3.) * pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25) * sqrt(0.5*ec); - prefactor = xfact * (predxx + predyy); - } - else if(type == GaussianType::fxxzmyyz) { - // setup dxx and dyy, get (dxx - dyy), normalize, and multiply by z - PolynomialCoeffs zfact(1), predxx(2), predyy(2); - zfact[{{0,0,1}}] = 1.; - zfact[{{0,0,0}}] = -center[2]; - predxx[{{2,0,0}}] = 1.; - predxx[{{1,0,0}}] = -2. * center[0]; - predxx[{{0,0,0}}] = center[0] * center[0]; - predxx *= pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec); - predyy[{{0,2,0}}] = 1.; - predyy[{{0,1,0}}] = -2. * center[1]; - predyy[{{0,0,0}}] = center[1] * center[1]; - predyy *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec); - prefactor = zfact * (predxx + predyy); - } - else if(type == GaussianType::fxzzmrrx) { - // setup dxx, dyy, and dzz; get (4dzz-dxx-dyy); normalize; and multiply by x - PolynomialCoeffs xfact(1), predxx(2), predyy(2), predzz(2); - xfact[{{1,0,0}}] = 1.; - xfact[{{0,0,0}}] = -center[0]; - predxx[{{2,0,0}}] = 1.; - predxx[{{1,0,0}}] = -2. * center[0]; - predxx[{{0,0,0}}] = center[0] * center[0]; - predxx *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); - predyy[{{0,2,0}}] = 1.; - predyy[{{0,1,0}}] = -2. * center[1]; - predyy[{{0,0,0}}] = center[1] * center[1]; - predyy *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); - predzz[{{0,0,2}}] = 1.; - predzz[{{0,0,1}}] = -2. * center[2]; - predzz[{{0,0,0}}] = center[2] * center[2]; - predzz *= 4.*pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); - prefactor = xfact * (predxx + predyy + predzz); - } - else if(type == GaussianType::fzzzmrrz) { - // setup dxx, dyy, and dzz; get (2dzz-3dxx-3dyy); normalize; and multiply by z - PolynomialCoeffs zfact(1), predxx(2), predyy(2), predzz(2); - zfact[{{0,0,1}}] = 1.; - zfact[{{0,0,0}}] = -center[2]; - predxx[{{2,0,0}}] = 1.; - predxx[{{1,0,0}}] = -2. * center[0]; - predxx[{{0,0,0}}] = center[0] * center[0]; - predxx *= -pow(2.*ec/pi, 0.5) * 12.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec/15.); - predyy[{{0,2,0}}] = 1.; - predyy[{{0,1,0}}] = -2. * center[1]; - predyy[{{0,0,0}}] = center[1] * center[1]; - predyy *= -pow(2.*ec/pi, 0.5) * 12.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec/15.); - predzz[{{0,0,2}}] = 1.; - predzz[{{0,0,1}}] = -2. * center[2]; - predzz[{{0,0,0}}] = center[2] * center[2]; - predzz *= pow(2.*ec/pi, 0.5) * 8.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec/15.); - prefactor = zfact * (predxx + predyy + predzz); - } - else if(type == GaussianType::fyzzmrry) { - // setup dxx, dyy, and dzz; get (4dzz-dxx-dyy); normalize; and multiply by y - PolynomialCoeffs yfact(1), predxx(2), predyy(2), predzz(2); - yfact[{{0,1,0}}] = 1.; - yfact[{{0,0,0}}] = -center[1]; - predxx[{{2,0,0}}] = 1.; - predxx[{{1,0,0}}] = -2. * center[0]; - predxx[{{0,0,0}}] = center[0] * center[0]; - predxx *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); - predyy[{{0,2,0}}] = 1.; - predyy[{{0,1,0}}] = -2. * center[1]; - predyy[{{0,0,0}}] = center[1] * center[1]; - predyy *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); - predzz[{{0,0,2}}] = 1.; - predzz[{{0,0,1}}] = -2. * center[2]; - predzz[{{0,0,0}}] = center[2] * center[2]; - predzz *= pow(2.*ec/pi, 0.5) * 16.*ec*pow(2.*ec/pi, 0.25)*sqrt(0.1*ec); - prefactor = yfact * (predxx + predyy + predzz); - } - else if(type == GaussianType::fxxymyyy) { - // setup dxx and dyy, get (3dxx-dyy), normalize, and multiply by y - PolynomialCoeffs yfact(1), predxx(2), predyy(2); - yfact[{{0,1,0}}] = 1.; - yfact[{{0,0,0}}] = -center[1]; - predxx[{{2,0,0}}] = 1.; - predxx[{{1,0,0}}] = -2. * center[0]; - predxx[{{0,0,0}}] = center[0] * center[0]; - predxx *= pow(2.*ec/pi, 0.5) * 12.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec/6.); - predyy[{{0,2,0}}] = 1.; - predyy[{{0,1,0}}] = -2. * center[1]; - predyy[{{0,0,0}}] = center[1] * center[1]; - predyy *= -pow(2.*ec/pi, 0.5) * 4.*ec*pow(2.*ec/pi, 0.25)*sqrt(ec/6); - prefactor = yfact * (predxx + predyy); - } - - // Cartesian g orbitals - else if(type == GaussianType::gxxxx) { - prefactor = PolynomialCoeffs(4); - prefactor[{{4,0,0}}] = 1.; - prefactor[{{3,0,0}}] = -4. * center[0]; - prefactor[{{2,0,0}}] = 6. * center[0] * center[0]; - prefactor[{{1,0,0}}] = -4. * pow(center[0], 3); - prefactor[{{0,0,0}}] = pow(center[0], 4); - prefactor *= 16./sqrt(105.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gxxxy) { - prefactor = PolynomialCoeffs(4); - prefactor[{{3,1,0}}] = 1.; - prefactor[{{2,1,0}}] = -3. * center[0]; - prefactor[{{1,1,0}}] = 3. * center[0] * center[0]; - prefactor[{{0,1,0}}] = -pow(center[0], 3); - prefactor[{{3,0,0}}] = -center[1]; - prefactor[{{2,0,0}}] = 3. * center[0] * center[1]; - prefactor[{{1,0,0}}] = -3. * center[0] * center[0] * center[1]; - prefactor[{{0,0,0}}] = pow(center[0], 3) * center[1]; - prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gxxxz) { - prefactor = PolynomialCoeffs(4); - prefactor[{{3,0,1}}] = 1.; - prefactor[{{2,0,1}}] = -3. * center[0]; - prefactor[{{1,0,1}}] = 3. * center[0] * center[0]; - prefactor[{{0,0,1}}] = -pow(center[0], 3); - prefactor[{{3,0,0}}] = -center[2]; - prefactor[{{2,0,0}}] = 3. * center[0] * center[2]; - prefactor[{{1,0,0}}] = -3. * center[0] * center[0] * center[2]; - prefactor[{{0,0,0}}] = pow(center[0], 3) * center[2]; - prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gxxyy) { - prefactor = PolynomialCoeffs(4); - prefactor[{{2,2,0}}] = 1.; - prefactor[{{1,2,0}}] = -2. * center[0]; - prefactor[{{0,2,0}}] = center[0] * center[0]; - prefactor[{{2,1,0}}] = -2. * center[1]; - prefactor[{{1,1,0}}] = 4. * center[0] * center[1]; - prefactor[{{0,1,0}}] = -2. * center[0] * center[0] * center[1]; - prefactor[{{2,0,0}}] = center[1] * center[1]; - prefactor[{{1,0,0}}] = -2. * center[0] * center[1] * center[1]; - prefactor[{{0,0,0}}] = center[0] * center[0] * center[1] * center[1]; - prefactor *= 16./3. * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gxxyz) { - prefactor = PolynomialCoeffs(4); - prefactor[{{2,1,1}}] = 1.; - prefactor[{{1,1,1}}] = -2. * center[0]; - prefactor[{{0,1,1}}] = center[0] * center[0]; - prefactor[{{2,0,1}}] = -center[1]; - prefactor[{{1,0,1}}] = 2. * center[0] * center[1]; - prefactor[{{0,0,1}}] = -center[0] * center[0] * center[1]; - prefactor[{{2,1,0}}] = -center[2]; - prefactor[{{1,1,0}}] = 2. * center[0] * center[2]; - prefactor[{{0,1,0}}] = -center[0] * center[0] * center[2]; - prefactor[{{2,0,0}}] = center[1] * center[2]; - prefactor[{{1,0,0}}] = -2. * center[0] * center[1] * center[2]; - prefactor[{{0,0,0}}] = center[0] * center[0] * center[1] * center[2]; - prefactor *= 16./sqrt(3.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gxxzz) { - prefactor = PolynomialCoeffs(4); - prefactor[{{2,0,2}}] = 1.; - prefactor[{{1,0,2}}] = -2. * center[0]; - prefactor[{{0,0,2}}] = center[0] * center[0]; - prefactor[{{2,0,1}}] = -2. * center[2]; - prefactor[{{1,0,1}}] = 4. * center[0] * center[2]; - prefactor[{{0,0,1}}] = -2. * center[0] * center[0] * center[2]; - prefactor[{{2,0,0}}] = center[2] * center[2]; - prefactor[{{1,0,0}}] = -2. * center[0] * center[2] * center[2]; - prefactor[{{0,0,0}}] = center[0] * center[0] * center[2] * center[2]; - prefactor *= 16./3. * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gxyyy) { - prefactor = PolynomialCoeffs(4); - prefactor[{{1,3,0}}] = 1.; - prefactor[{{0,3,0}}] = -center[0]; - prefactor[{{1,2,0}}] = -3. * center[1]; - prefactor[{{0,2,0}}] = 3. * center[0] * center[1]; - prefactor[{{1,1,0}}] = 3. * center[1] * center[1]; - prefactor[{{0,1,0}}] = -3. * center[0] * center[1] * center[1]; - prefactor[{{1,0,0}}] = -pow(center[1], 3); - prefactor[{{0,0,0}}] = center[0] * pow(center[1], 3); - prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gxyyz) { - prefactor = PolynomialCoeffs(4); - prefactor[{{1,2,1}}] = 1.; - prefactor[{{0,2,1}}] = -center[0]; - prefactor[{{1,1,1}}] = -2. * center[1]; - prefactor[{{0,1,1}}] = 2. * center[0] * center[1]; - prefactor[{{1,0,1}}] = center[1] * center[1]; - prefactor[{{0,0,1}}] = -center[0] * center[1] * center[1]; - prefactor[{{1,2,0}}] = -center[2]; - prefactor[{{0,2,0}}] = center[0] * center[2]; - prefactor[{{1,1,0}}] = 2. * center[1] * center[2]; - prefactor[{{0,1,0}}] = -2. * center[0] * center[1] * center[2]; - prefactor[{{1,0,0}}] = -center[1] * center[1] * center[2]; - prefactor[{{0,0,0}}] = center[0] * center[1] * center[1] * center[2]; - prefactor *= 16./sqrt(3.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gxyzz) { - prefactor = PolynomialCoeffs(4); - prefactor[{{1,1,2}}] = 1.; - prefactor[{{0,1,2}}] = -center[0]; - prefactor[{{1,0,2}}] = -center[1]; - prefactor[{{0,0,2}}] = center[0] * center[1]; - prefactor[{{1,1,1}}] = -2. * center[2]; - prefactor[{{0,1,1}}] = 2. * center[0] * center[2]; - prefactor[{{1,0,1}}] = 2. * center[1] * center[2]; - prefactor[{{0,0,1}}] = -2. * center[0] * center[1] * center[2]; - prefactor[{{1,1,0}}] = center[2] * center[2]; - prefactor[{{0,1,0}}] = -center[0] * center[2] * center[2]; - prefactor[{{1,0,0}}] = -center[1] * center[2] * center[2]; - prefactor[{{0,0,0}}] = center[0] * center[1] * center[2] * center[2]; - prefactor *= 16./sqrt(3.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gxzzz) { - prefactor = PolynomialCoeffs(4); - prefactor[{{1,0,3}}] = 1.; - prefactor[{{0,0,3}}] = -center[0]; - prefactor[{{1,0,2}}] = -3. * center[2]; - prefactor[{{0,0,2}}] = 3. * center[0] * center[2]; - prefactor[{{1,0,1}}] = 3. * center[2] * center[2]; - prefactor[{{0,0,1}}] = -3. * center[0] * center[2] * center[2]; - prefactor[{{1,0,0}}] = -pow(center[2], 3); - prefactor[{{0,0,0}}] = center[0] * pow(center[2], 3); - prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gyyyy) { - prefactor = PolynomialCoeffs(4); - prefactor[{{0,4,0}}] = 1.; - prefactor[{{0,3,0}}] = -4. * center[1]; - prefactor[{{0,2,0}}] = 6. * center[1] * center[1]; - prefactor[{{0,1,0}}] = -4. * pow(center[1], 3); - prefactor[{{0,0,0}}] = + pow(center[1], 4); - prefactor *= 16./sqrt(105.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gyyyz) { - prefactor = PolynomialCoeffs(4); - prefactor[{{0,3,1}}] = 1.; - prefactor[{{0,2,1}}] = -3. * center[1]; - prefactor[{{0,1,1}}] = 3. * center[1] * center[1]; - prefactor[{{0,0,1}}] = -pow(center[1], 3); - prefactor[{{0,3,0}}] = -center[2]; - prefactor[{{0,2,0}}] = 3. * center[1] * center[2]; - prefactor[{{0,1,0}}] = -3. * center[1] * center[1] * center[2]; - prefactor[{{0,0,0}}] = pow(center[1], 3) * center[2]; - prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gyyzz) { - prefactor = PolynomialCoeffs(4); - prefactor[{{0,2,2}}] = 1.; - prefactor[{{0,1,2}}] = -2. * center[1]; - prefactor[{{0,0,2}}] = center[1] * center[1]; - prefactor[{{0,2,1}}] = -2. * center[2]; - prefactor[{{0,1,1}}] = 4. * center[1] * center[2]; - prefactor[{{0,0,1}}] = -2. * center[1] * center[1] * center[2]; - prefactor[{{0,2,0}}] = center[2] * center[2]; - prefactor[{{0,1,0}}] = -2. * center[1] * center[2] * center[2]; - prefactor[{{0,0,0}}] = center[1] * center[1] * center[2] * center[2]; - prefactor *= 16./3. * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gyzzz) { - prefactor = PolynomialCoeffs(4); - prefactor[{{0,1,3}}] = 1.; - prefactor[{{0,0,3}}] = -center[1]; - prefactor[{{0,1,2}}] = -3. * center[2]; - prefactor[{{0,0,2}}] = 3. * center[1] * center[2]; - prefactor[{{0,1,1}}] = 3. * center[2] * center[2]; - prefactor[{{0,0,1}}] = -3. * center[1] * center[2] * center[2]; - prefactor[{{0,1,0}}] = -pow(center[2], 3); - prefactor[{{0,0,0}}] = center[1] * pow(center[2], 3); - prefactor *= 16./sqrt(15.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - else if(type == GaussianType::gzzzz) { - prefactor = PolynomialCoeffs(4); - prefactor[{{0,0,4}}] = 1.; - prefactor[{{0,0,3}}] = -4. * center[2]; - prefactor[{{0,0,2}}] = 6. * center[2] * center[2]; - prefactor[{{0,0,1}}] = -4. * pow(center[2], 3); - prefactor[{{0,0,0}}] = pow(center[2], 4); - prefactor *= 16./sqrt(105.) * pow(ec, 2.75) * pow(2./pi, 0.75); - } - - // spherical g orbitals - // (l,m) = (4,-4) - else if(type == GaussianType::gxydx2my2 ) { - // get (xx-yy), multiply by xy, normalize - PolynomialCoeffs xx(2), yy(2), x(1), y(1); - x[{{1,0,0}}] = 1.; - x[{{0,0,0}}] = -center[0]; - y[{{0,1,0}}] = 1.; - y[{{0,0,0}}] = -center[1]; - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - double norm = 8./sqrt(3.) * pow(ec, 2.75) * pow(2./pi, 0.75); - prefactor = norm * x * y * (xx + (-1. * yy)); - } - // (l,m) = (4,-3) - else if(type == GaussianType::gyzdx2my2) { - // get (3xx - yy), multiply by y*z, normalize - PolynomialCoeffs xx(2), yy(2), y(1), z(1); - y[{{0,1,0}}] = 1.; - y[{{0,0,0}}] = -center[1]; - z[{{0,0,1}}] = 1.; - z[{{0,0,0}}] = -center[2]; - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - double norm = 8./sqrt(3.) * pow(ec, 2.75) * pow(2., 0.25) * pow(1./pi, 0.75); - prefactor = norm * y * z * (3. * xx + (-1. * yy)); - } - // (l,m) = (4,-2) - else if(type == GaussianType::gxydz2mr2) { - // get (7zz - rr), multiply by x*y, normalize - PolynomialCoeffs zz(2), rr(2), x(1), y(1); - x[{{1,0,0}}] = 1.; - x[{{0,0,0}}] = -center[0]; - y[{{0,1,0}}] = 1.; - y[{{0,0,0}}] = -center[1]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - rr[{{2,0,0}}] = 1.; - rr[{{1,0,0}}] = -2. * center[0]; - rr[{{0,2,0}}] = 1.; - rr[{{0,1,0}}] = -2. * center[1]; - rr[{{0,0,2}}] = 1.; - rr[{{0,0,1}}] = -2. * center[2]; - rr[{{0,0,0}}] = center[0] * center[0] + center[1] * center[1] + center[2] * center[2]; - double norm = 8./sqrt(21.) * pow(ec, 2.75) * pow(2./pi, 0.75); - prefactor = norm * x * y * (7. * zz + (-1. * rr)); - } - // (l,m) = (4,-1) - else if(type == GaussianType::gyzdz2mr2) { - // get (7zz - 3rr), multiply by y*z, normalize - PolynomialCoeffs zz(2), rr(2), y(1), z(1); - y[{{0,1,0}}] = 1.; - y[{{0,0,0}}] = -center[1]; - z[{{0,0,1}}] = 1.; - z[{{0,0,0}}] = -center[2]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - rr[{{2,0,0}}] = 1.; - rr[{{1,0,0}}] = -2. * center[0]; - rr[{{0,2,0}}] = 1.; - rr[{{0,1,0}}] = -2. * center[1]; - rr[{{0,0,2}}] = 1.; - rr[{{0,0,1}}] = -2. * center[2]; - rr[{{0,0,0}}] = center[0] * center[0] + center[1] * center[1] + center[2] * center[2]; - double norm = 8./sqrt(21.) * pow(2., 0.25) * pow(ec, 2.75) * pow(1./pi, 0.75); - prefactor = norm * y * z * (7. * zz + (-3. * rr)); - } - // (l,m) = (4,0) - else if(type == GaussianType::gzero) { - // we want: 3x^4 + 6x^2y^2 + 3y^4 - 24x^2z^2 - 24y^2z^2 + 8z^4 - PolynomialCoeffs x4(4), y4(4), z4(4), xx(2), yy(2), zz(2); - x4[{{4,0,0}}] = 1.; - x4[{{3,0,0}}] = -4. * center[0]; - x4[{{2,0,0}}] = 6. * pow(center[0], 2); - x4[{{1,0,0}}] = -4. * pow(center[0], 3); - x4[{{0,0,0}}] = pow(center[0], 4); - y4[{{0,4,0}}] = 1.; - y4[{{0,3,0}}] = -4. * center[1]; - y4[{{0,2,0}}] = 6. * pow(center[1], 2); - y4[{{0,1,0}}] = -4. * pow(center[1], 3); - y4[{{0,0,0}}] = pow(center[1], 4); - z4[{{0,0,4}}] = 1.; - z4[{{0,0,3}}] = -4. * center[2]; - z4[{{0,0,2}}] = 6. * pow(center[2], 2); - z4[{{0,0,1}}] = -4. * pow(center[2], 3); - z4[{{0,0,0}}] = pow(center[2], 4); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = pow(center[0], 2); - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = pow(center[1], 2); - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = pow(center[2], 2); - double norm = 2./sqrt(105.) * pow(ec, 2.75) * pow(2./pi, 0.75); - prefactor = norm * (3.*x4 + 3.*y4 + 8.*z4 + 6.*xx*yy + (-24.*xx*zz) + (-24.*yy*zz)); - } - // (l,m) = (4,1) - else if(type == GaussianType::gxzdz2mr2) { - // get (7zz - 3rr), multiply by x*z, normalize - PolynomialCoeffs zz(2), rr(2), x(1), z(1); - x[{{1,0,0}}] = 1.; - x[{{0,0,0}}] = -center[0]; - z[{{0,0,1}}] = 1.; - z[{{0,0,0}}] = -center[2]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - rr[{{2,0,0}}] = 1.; - rr[{{1,0,0}}] = -2. * center[0]; - rr[{{0,2,0}}] = 1.; - rr[{{0,1,0}}] = -2. * center[1]; - rr[{{0,0,2}}] = 1.; - rr[{{0,0,1}}] = -2. * center[2]; - rr[{{0,0,0}}] = center[0] * center[0] + center[1] * center[1] + center[2] * center[2]; - double norm = 8./sqrt(21.) * pow(2, 0.25) * pow(ec, 2.75) * pow(1./pi, 0.75); - // Testing shows nwchem uses the negative - prefactor = (-1.) * norm * x * z * (7.*zz + (-3.*rr)); - } - // (l,m) = (4,2) - else if(type == GaussianType::gx2my2dz2mr2) { - // get (7zz - rr) and (xx - yy), multiply together, normalize - PolynomialCoeffs xx(2), yy(2), zz(2), rr(2); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - rr[{{2,0,0}}] = 1.; - rr[{{1,0,0}}] = -2. * center[0]; - rr[{{0,2,0}}] = 1.; - rr[{{0,1,0}}] = -2. * center[1]; - rr[{{0,0,2}}] = 1.; - rr[{{0,0,1}}] = -2. * center[2]; - rr[{{0,0,0}}] = center[0] * center[0] + center[1] * center[1] + center[2] * center[2]; - double norm = 4./sqrt(21.) * pow(ec, 2.75) * pow(2./pi, 0.75); - prefactor = norm * (xx + (-1*yy)) * (7.*zz + (-1.*rr)); - } - // (l,m) = (4,3) - else if(type == GaussianType::gxzdx2my2) { - // get (xx - 3yy), multiply by xz, normalize - PolynomialCoeffs xx(2), yy(2), x(1), z(1); - x[{{1,0,0}}] = 1.; - x[{{0,0,0}}] = -center[0]; - z[{{0,0,1}}] = 1.; - z[{{0,0,0}}] = -center[2]; - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - double norm = 8./sqrt(3.) * pow(2., 0.25) * pow(ec, 2.75) * pow(1./pi, 0.75); - // Testing shows nwchem uses the negative - prefactor = norm * x * z * (3.*yy + -1.*xx); - } - // (l,m) = (4,4) - else if(type == GaussianType::gx4mx2y2py4) { - // we want: x^4 - 6x^2y^2 + y^4, then normalize - PolynomialCoeffs x4(4), y4(4), xx(2), yy(2); - x4[{{4,0,0}}] = 1.; - x4[{{3,0,0}}] = -4. * center[0]; - x4[{{2,0,0}}] = 6. * center[0] * center[0]; - x4[{{1,0,0}}] = -4. * pow(center[0], 3); - x4[{{0,0,0}}] = pow(center[0], 4); - y4[{{0,4,0}}] = 1.; - y4[{{0,3,0}}] = -4 * center[1]; - y4[{{0,2,0}}] = 6. * center[1] * center[1]; - y4[{{0,1,0}}] = -4. * pow(center[1], 3); - y4[{{0,0,0}}] = pow(center[1], 4); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - double norm = 2./sqrt(3.) * pow(ec, 2.75) * pow(2./pi, 0.75); - prefactor = norm * (x4 + (-6.*xx*yy) + y4); - } - - // Cartesian h orbitals - else if(type == GaussianType::hxxxxx) { - prefactor = PolynomialCoeffs(5); - prefactor[{{5,0,0}}] = 1.; - prefactor[{{4,0,0}}] = -5. * center[0]; - prefactor[{{3,0,0}}] = 10. * center[0] * center[0]; - prefactor[{{2,0,0}}] = -10. * pow(center[0], 3); - prefactor[{{1,0,0}}] = 5. * pow(center[0], 4); - prefactor[{{0,0,0}}] = -pow(center[0], 5); - prefactor *= 32./(3.*sqrt(105.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxxxxy) { - prefactor = PolynomialCoeffs(5); - prefactor[{{4,1,0}}] = 1.; - prefactor[{{3,1,0}}] = -4. * center[0]; - prefactor[{{2,1,0}}] = 6. * center[0] * center[0]; - prefactor[{{1,1,0}}] = -4. * pow(center[0], 3); - prefactor[{{0,1,0}}] = pow(center[0], 4); - prefactor[{{4,0,0}}] = -1. * center[1]; - prefactor[{{3,0,0}}] = 4. * center[0] * center[1]; - prefactor[{{2,0,0}}] = -6. * center[0] * center[0] * center[1]; - prefactor[{{1,0,0}}] = 4. * pow(center[0], 3) * center[1]; - prefactor[{{0,0,0}}] = -pow(center[0], 4) * center[1]; - prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxxxxz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{4,0,1}}] = 1.; - prefactor[{{3,0,1}}] = -4. * center[0]; - prefactor[{{2,0,1}}] = 6. * center[0] * center[0]; - prefactor[{{1,0,1}}] = -4. * pow(center[0], 3); - prefactor[{{0,0,1}}] = pow(center[0], 4); - prefactor[{{4,0,0}}] = -center[2]; - prefactor[{{3,0,0}}] = 4. * center[0] * center[2]; - prefactor[{{2,0,0}}] = -6. * center[0] * center[0] * center[2]; - prefactor[{{1,0,0}}] = 4. * pow(center[0], 3) * center[2]; - prefactor[{{0,0,0}}] = -pow(center[0], 4) * center[2]; - prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxxxyy) { - prefactor = PolynomialCoeffs(5); - prefactor[{{3,2,0}}] = 1.; - prefactor[{{2,2,0}}] = -3. * center[0]; - prefactor[{{1,2,0}}] = 3. * center[0] * center[0]; - prefactor[{{0,2,0}}] = -pow(center[0], 3); - prefactor[{{3,1,0}}] = -2. * center[1]; - prefactor[{{2,1,0}}] = 6. * center[0] * center[1]; - prefactor[{{1,1,0}}] = -6. * center[0] * center[0] * center[1]; - prefactor[{{0,1,0}}] = 2. * pow(center[0], 3) * center[1]; - prefactor[{{3,0,0}}] = center[1] * center[1]; - prefactor[{{2,0,0}}] = -3. * center[0] * center[1] * center[1]; - prefactor[{{1,0,0}}] = 3. * center[0] * center[0] * center[1] * center[1]; - prefactor[{{0,0,0}}] = -pow(center[0], 3) * center[1] * center[1]; - prefactor *= 32./(3.*sqrt(5.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxxxyz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{3,1,1}}] = 1.; - prefactor[{{2,1,1}}] = -3. * center[0]; - prefactor[{{1,1,1}}] = 3. * center[0] * center[0]; - prefactor[{{0,1,1}}] = -pow(center[0], 3); - prefactor[{{3,0,1}}] = -center[1]; - prefactor[{{2,0,1}}] = 3. * center[0] * center[1]; - prefactor[{{1,0,1}}] = -3. * center[0] * center[0] * center[1]; - prefactor[{{0,0,1}}] = pow(center[0], 3) * center[1]; - prefactor[{{3,1,0}}] = -center[2]; - prefactor[{{2,1,0}}] = 3. * center[0] * center[2]; - prefactor[{{1,1,0}}] = -3. * center[0] * center[0] * center[2]; - prefactor[{{0,1,0}}] = pow(center[0], 3) * center[2]; - prefactor[{{3,0,0}}] = center[1] * center[2]; - prefactor[{{2,0,0}}] = -3. * center[0] * center[1] * center[2]; - prefactor[{{1,0,0}}] = 3. * center[0] * center[0] * center[1] * center[2]; - prefactor[{{0,0,0}}] = -pow(center[0], 3) * center[1] * center[2]; - prefactor *= 32./sqrt(15.) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxxxzz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{3,0,2}}] = 1.; - prefactor[{{2,0,2}}] = -3. * center[0]; - prefactor[{{1,0,2}}] = 3. * center[0] * center[0]; - prefactor[{{0,0,2}}] = -pow(center[0], 3); - prefactor[{{3,0,1}}] = -2. * center[2]; - prefactor[{{2,0,1}}] = 6. * center[0] * center[2]; - prefactor[{{1,0,1}}] = -6. * center[0] * center[0] * center[2]; - prefactor[{{0,0,1}}] = 2. * pow(center[0], 3) * center[2]; - prefactor[{{3,0,0}}] = center[2] * center[2]; - prefactor[{{2,0,0}}] = -3. * center[0] * center[2] * center[2]; - prefactor[{{1,0,0}}] = 3. * center[0] * center[0] * center[2] * center[2]; - prefactor[{{0,0,0}}] = -pow(center[0], 3) * center[2] * center[2]; - prefactor *= 32./(3.*sqrt(5.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxxyyy) { - prefactor = PolynomialCoeffs(5); - prefactor[{{2,3,0}}] = 1.; - prefactor[{{1,3,0}}] = -2. * center[0]; - prefactor[{{0,3,0}}] = center[0] * center[0]; - prefactor[{{2,2,0}}] = -3. * center[1]; - prefactor[{{1,2,0}}] = 6. * center[0] * center[1]; - prefactor[{{0,2,0}}] = -3. * center[0] * center[0] * center[1]; - prefactor[{{2,1,0}}] = 3. * center[1] * center[1]; - prefactor[{{1,1,0}}] = -6. * center[0] * center[1] * center[1]; - prefactor[{{0,1,0}}] = 3. * center[0] * center[0] * center[1] * center[1]; - prefactor[{{2,0,0}}] = -pow(center[1], 3); - prefactor[{{1,0,0}}] = 2. * center[0] * pow(center[1], 3); - prefactor[{{0,0,0}}] = -center[0] * center[0] * pow(center[1], 3); - prefactor *= 32./(3.*sqrt(5)) * pow(ec, 13./4) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxxyyz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{2,2,1}}] = 1.; - prefactor[{{1,2,1}}] = -2. * center[0]; - prefactor[{{0,2,1}}] = center[0] * center[0]; - prefactor[{{2,1,1}}] = -2. * center[1]; - prefactor[{{1,1,1}}] = 4. * center[0] * center[1]; - prefactor[{{0,1,1}}] = -2. * center[0] * center[0] * center[1]; - prefactor[{{2,0,1}}] = center[1] * center[1]; - prefactor[{{1,0,1}}] = -2. * center[0] * center[1] * center[1]; - prefactor[{{0,0,1}}] = center[0] * center[0] * center[1] * center[1]; - prefactor[{{2,2,0}}] = -center[2]; - prefactor[{{1,2,0}}] = 2. * center[0] * center[2]; - prefactor[{{0,2,0}}] = -center[0] * center[0] * center[2]; - prefactor[{{2,1,0}}] = 2. * center[1] * center[2]; - prefactor[{{1,1,0}}] = -4. * center[0] * center[1] * center[2]; - prefactor[{{0,1,0}}] = 2. * center[0] * center[0] * center[1] * center[2]; - prefactor[{{2,0,0}}] = -center[1] * center[1] * center[2]; - prefactor[{{1,0,0}}] = 2. * center[0] * center[1] * center[1] * center[2]; - prefactor[{{0,0,0}}] = -center[0] * center[0] * center[1] * center[1] * center[2]; - prefactor *= 32./3. * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxxyzz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{2,1,2}}] = 1.; - prefactor[{{1,1,2}}] = -2. * center[0]; - prefactor[{{0,1,2}}] = center[0] * center[0]; - prefactor[{{2,0,2}}] = -center[1]; - prefactor[{{1,0,2}}] = 2. * center[0] * center[1]; - prefactor[{{0,0,2}}] = -center[0] * center[0] * center[1]; - prefactor[{{2,1,1}}] = -2. * center[2]; - prefactor[{{1,1,1}}] = 4. * center[0] * center[2]; - prefactor[{{0,1,1}}] = -2. * center[0] * center[0] * center[2]; - prefactor[{{2,0,1}}] = 2. * center[1] * center[2]; - prefactor[{{1,0,1}}] = -4. * center[0] * center[1] * center[2]; - prefactor[{{0,0,1}}] = 2. * center[0] * center[0] * center[1] * center[2]; - prefactor[{{2,1,0}}] = center[2] * center[2]; - prefactor[{{1,1,0}}] = -2. * center[0] * pow(center[2], 2); - prefactor[{{0,1,0}}] = center[0] * center[0] * center[2] * center[2]; - prefactor[{{2,0,0}}] = -center[1] * center[2] * center[2]; - prefactor[{{1,0,0}}] = 2. * center[0] * center[1] * center[2] * center[2]; - prefactor[{{0,0,0}}] = -center[0] * center[0] * center[1] * center[2] * center[2]; - prefactor *= 32./3. * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxxzzz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{2,0,3}}] = 1.; - prefactor[{{1,0,3}}] = -2. * center[0]; - prefactor[{{0,0,3}}] = center[0] * center[0]; - prefactor[{{2,0,2}}] = -3. * center[2]; - prefactor[{{1,0,2}}] = 6. * center[0] * center[2]; - prefactor[{{0,0,2}}] = -3. * center[0] * center[0] * center[2]; - prefactor[{{2,0,1}}] = 3. * center[2] * center[2]; - prefactor[{{1,0,1}}] = -6. * center[0] * center[2] * center[2]; - prefactor[{{0,0,1}}] = 3. * center[0] * center[0] * center[2] * center[2]; - prefactor[{{2,0,0}}] = -pow(center[2], 3); - prefactor[{{1,0,0}}] = 2. * center[0] * pow(center[2], 3); - prefactor[{{0,0,0}}] = -center[0] * center[0] * pow(center[2], 3); - prefactor *= 32./(3.*sqrt(5.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxyyyy) { - prefactor = PolynomialCoeffs(5); - prefactor[{{1,4,0}}] = 1.; - prefactor[{{0,4,0}}] = -center[0]; - prefactor[{{1,3,0}}] = -4. * center[1]; - prefactor[{{0,3,0}}] = 4. * center[0] * center[1]; - prefactor[{{1,2,0}}] = 6. * center[1] * center[1]; - prefactor[{{0,2,0}}] = -6. * center[0] * center[1] * center[1]; - prefactor[{{1,1,0}}] = -4. * pow(center[1], 3); - prefactor[{{0,1,0}}] = 4. * center[0] * pow(center[1], 3); - prefactor[{{1,0,0}}] = pow(center[1], 4); - prefactor[{{0,0,0}}] = -center[0] * pow(center[1], 4); - prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxyyyz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{1,3,1}}] = 1.; - prefactor[{{0,3,1}}] = -center[0]; - prefactor[{{1,2,1}}] = -3. * center[1]; - prefactor[{{0,2,1}}] = 3. * center[0] * center[1]; - prefactor[{{1,1,1}}] = 3. * center[1] * center[1]; - prefactor[{{0,1,1}}] = -3. * center[0] * center[1] * center[1]; - prefactor[{{1,0,1}}] = -pow(center[1], 3); - prefactor[{{0,0,1}}] = center[0] * pow(center[1], 3); - prefactor[{{1,3,0}}] = -center[2]; - prefactor[{{0,3,0}}] = center[0] * center[2]; - prefactor[{{1,2,0}}] = 3. * center[1] * center[2]; - prefactor[{{0,2,0}}] = -3. * center[0] * center[1] * center[2]; - prefactor[{{1,1,0}}] = -3. * center[1] * center[1] * center[2]; - prefactor[{{0,1,0}}] = 3. * center[0] * center[1] * center[1] * center[2]; - prefactor[{{1,0,0}}] = pow(center[1], 3) * center[2]; - prefactor[{{0,0,0}}] = -center[0] * pow(center[1], 3) * center[2]; - prefactor *= 32./sqrt(15.) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxyyzz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{1,2,2}}] = 1.; - prefactor[{{0,2,2}}] = -center[0]; - prefactor[{{1,1,2}}] = -2. * center[1]; - prefactor[{{0,1,2}}] = 2. * center[0] * center[1]; - prefactor[{{1,0,2}}] = center[1] * center[1]; - prefactor[{{0,0,2}}] = -center[0] * pow(center[1], 2); - prefactor[{{1,2,1}}] = -2. * center[2]; - prefactor[{{0,2,1}}] = 2. * center[0] * center[2]; - prefactor[{{1,1,1}}] = 4. * center[1] * center[2]; - prefactor[{{0,1,1}}] = -4. * center[0] * center[1] * center[2]; - prefactor[{{1,0,1}}] = -2. * center[1] * center[1] * center[2]; - prefactor[{{0,0,1}}] = 2. * center[0] * center[1] * center[1] * center[2]; - prefactor[{{1,2,0}}] = center[2] * center[2]; - prefactor[{{0,2,0}}] = -center[0] * center[2] * center[2]; - prefactor[{{1,1,0}}] = -2. * center[1] * center[2] * center[2]; - prefactor[{{0,1,0}}] = 2. * center[0] * center[1] * center[2] * center[2]; - prefactor[{{1,0,0}}] = center[1] * center[1] * center[2] * center[2]; - prefactor[{{0,0,0}}] = -center[0] * center[1] * center[1] * center[2] * center[2]; - prefactor *= 32./3. * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxyzzz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{1,1,3}}] = 1.; - prefactor[{{0,1,3}}] = -center[0]; - prefactor[{{1,0,3}}] = -center[1]; - prefactor[{{0,0,3}}] = center[0] * center[1]; - prefactor[{{1,1,2}}] = -3. * center[2]; - prefactor[{{0,1,2}}] = 3. * center[0] * center[2]; - prefactor[{{1,0,2}}] = 3. * center[1] * center[2]; - prefactor[{{0,0,2}}] = -3. * center[0] * center[1] * center[2]; - prefactor[{{1,1,1}}] = 3. * center[2] * center[2]; - prefactor[{{0,1,1}}] = -3. * center[0] * center[2] * center[2]; - prefactor[{{1,0,1}}] = -3. * center[1] * center[2] * center[2]; - prefactor[{{0,0,1}}] = 3. * center[0] * center[1] * center[2] * center[2]; - prefactor[{{1,1,0}}] = -pow(center[2], 3); - prefactor[{{0,1,0}}] = center[0] * pow(center[2], 3); - prefactor[{{1,0,0}}] = center[1] * pow(center[2], 3); - prefactor[{{0,0,0}}] = -center[0] * center[1] * pow(center[2], 3); - prefactor *= 32./sqrt(15.) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hxzzzz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{1,0,4}}] = 1.; - prefactor[{{0,0,4}}] = -center[0]; - prefactor[{{1,0,3}}] = -4. * center[2]; - prefactor[{{0,0,3}}] = 4. * center[0] * center[2]; - prefactor[{{1,0,2}}] = 6. * center[2] * center[2]; - prefactor[{{0,0,2}}] = -6. * center[0] * center[2] * center[2]; - prefactor[{{1,0,1}}] = -4. * pow(center[2], 3); - prefactor[{{0,0,1}}] = 4. * center[0] * pow(center[2], 3); - prefactor[{{1,0,0}}] = pow(center[2], 4); - prefactor[{{0,0,0}}] = -center[0] * pow(center[2], 4); - prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hyyyyy) { - prefactor = PolynomialCoeffs(5); - prefactor[{{0,5,0}}] = 1.; - prefactor[{{0,4,0}}] = -5. * center[1]; - prefactor[{{0,3,0}}] = 10. * center[1] * center[1]; - prefactor[{{0,2,0}}] = -10. * pow(center[1], 3); - prefactor[{{0,1,0}}] = 5. * pow(center[1], 4); - prefactor[{{0,0,0}}] = -pow(center[1], 5); - prefactor *= 32./(3.*sqrt(105.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hyyyyz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{0,4,1}}] = 1.; - prefactor[{{0,3,1}}] = -4. * center[1]; - prefactor[{{0,2,1}}] = 6. * center[1] * center[1]; - prefactor[{{0,1,1}}] = -4. * pow(center[1], 3); - prefactor[{{0,0,1}}] = pow(center[1], 4); - prefactor[{{0,4,0}}] = -center[2]; - prefactor[{{0,3,0}}] = 4. * center[1] * center[2]; - prefactor[{{0,2,0}}] = -6. * center[1] * center[1] * center[2]; - prefactor[{{0,1,0}}] = 4. * pow(center[1], 3) * center[2]; - prefactor[{{0,0,0}}] = -pow(center[1], 4) * center[2]; - prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hyyyzz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{0,3,2}}] = 1.; - prefactor[{{0,2,2}}] = -3. * center[1]; - prefactor[{{0,1,2}}] = 3. * center[1] * center[1]; - prefactor[{{0,0,2}}] = -pow(center[1], 3); - prefactor[{{0,3,1}}] = -2. * center[2]; - prefactor[{{0,2,1}}] = 6. * center[1] * center[2]; - prefactor[{{0,1,1}}] = -6. * center[1] * center[1] * center[2]; - prefactor[{{0,0,1}}] = 2. * pow(center[1], 3) * center[2]; - prefactor[{{0,3,0}}] = center[2] * center[2]; - prefactor[{{0,2,0}}] = -3. * center[1] * center[2] * center[2]; - prefactor[{{0,1,0}}] = 3. * center[1] * center[1] * center[2] * center[2]; - prefactor[{{0,0,0}}] = -pow(center[1], 3) * center[2] * center[2]; - prefactor *= 32./(3.*sqrt(5.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hyyzzz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{0,2,3}}] = 1.; - prefactor[{{0,1,3}}] = -2. * center[1]; - prefactor[{{0,0,3}}] = center[1] * center[1]; - prefactor[{{0,2,2}}] = -3. * center[2]; - prefactor[{{0,1,2}}] = 6. * center[1] * center[2]; - prefactor[{{0,0,2}}] = -3. * center[1] * center[1] * center[2]; - prefactor[{{0,2,1}}] = 3. * center[2] * center[2]; - prefactor[{{0,1,1}}] = -6. * center[1] * pow(center[2], 2); - prefactor[{{0,0,1}}] = 3. * center[1] * center[1] * center[2] * center[2]; - prefactor[{{0,2,0}}] = -pow(center[2], 3); - prefactor[{{0,1,0}}] = 2. * center[1] * pow(center[2], 3); - prefactor[{{0,0,0}}] = -center[1] * center[1] * pow(center[2], 3); - prefactor *= 32./(3.*sqrt(5.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hyzzzz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{0,1,4}}] = 1.; - prefactor[{{0,0,4}}] = -center[1]; - prefactor[{{0,1,3}}] = -4. * center[2]; - prefactor[{{0,0,3}}] = 4. * center[1] * center[2]; - prefactor[{{0,1,2}}] = 6. * center[2] * center[2]; - prefactor[{{0,0,2}}] = -6. * center[1] * center[2] * center[2]; - prefactor[{{0,1,1}}] = -4. * pow(center[2], 3); - prefactor[{{0,0,1}}] = 4. * center[1] * pow(center[2], 3); - prefactor[{{0,1,0}}] = pow(center[2], 4); - prefactor[{{0,0,0}}] = -center[1] * pow(center[2], 4); - prefactor *= 32./sqrt(105.) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - else if(type == GaussianType::hzzzzz) { - prefactor = PolynomialCoeffs(5); - prefactor[{{0,0,5}}] = 1.; - prefactor[{{0,0,4}}] = -5. * center[2]; - prefactor[{{0,0,3}}] = 10. * center[2] * center[2]; - prefactor[{{0,0,2}}] = -10. * pow(center[2], 3); - prefactor[{{0,0,1}}] = 5. * pow(center[2], 4); - prefactor[{{0,0,0}}] = -pow(center[2], 5); - prefactor *= 32./(3.*sqrt(105.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - } - - // h sphericals - // (l,m) = (5,-5) - else if(type == GaussianType::hm5) { - // (5x^4-10x^2y^2+y^4), multiply by y, normalize - PolynomialCoeffs y(1), x4(4), xx(2), yy(2), y4(4); - y[{{0,1,0}}] = 1.; - y[{{0,0,0}}] = -center[1]; - x4[{{4,0,0}}] = 1.; - x4[{{3,0,0}}] = -4. * center[0]; - x4[{{2,0,0}}] = 6. * center[0] * center[0]; - x4[{{1,0,0}}] = -4. * pow(center[0], 3); - x4[{{0,0,0}}] = pow(center[0], 4); - y4[{{0,4,0}}] = 1.; - y4[{{0,3,0}}] = -4. * center[1]; - y4[{{0,2,0}}] = 6. * center[1] * center[1]; - y4[{{0,1,0}}] = -4. * pow(center[1], 3); - y4[{{0,0,0}}] = pow(center[1], 4); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - double norm = 4./sqrt(15.) * pow(2., 0.25) * pow(ec, 3.25) * pow(1./pi, 0.75); - prefactor = norm * y * (5.*x4 + (-10.*xx*yy) + y4); - } - // (l,m) = (5,-4) - else if(type == GaussianType::hm4) { - // get (x^2-y^2), multiply by xyz, normalize - PolynomialCoeffs xx(2), yy(2), x(1), y(1), z(1); - x[{{1,0,0}}] = 1.; - x[{{0,0,0}}] = -center[0]; - y[{{0,1,0}}] = 1.; - y[{{0,0,0}}] = -center[1]; - z[{{0,0,1}}] = 1.; - z[{{0,0,0}}] = -center[2]; - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - double norm = 16./sqrt(3.) * pow(ec, 3.25) * pow(2./pi, 0.75); - prefactor = norm * x * y * z * (xx + (-1.*yy)); - } - // (l,m) = (5,-3) - else if(type == GaussianType::hm3) { - // get y, (3x^2-y^2) and (8z^2-x^2-y^2), multiply together, normalize - PolynomialCoeffs xx(2), yy(2), zz(2), y(1); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - y[{{0,1,0}}] = 1.; - y[{{0,0,0}}] = -center[1]; - double norm = 4./(3.*sqrt(3.)) * pow(2., 0.25) * pow(ec, 3.25) * pow(1./pi, 0.75); - prefactor = norm * y * (3.*xx + (-1.*yy)) * (8.*zz + (-1.*xx) + (-1.*yy)); - } - // (l,m) = (5,-2) - else if(type == GaussianType::hm2) { - // get (2z^2-x^2-y^2), multiply by xyz, normalize - PolynomialCoeffs xx(2), yy(2), zz(2), x(1), y(1), z(1); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - x[{{1,0,0}}] = 1.; - x[{{0,0,0}}] = -center[0]; - y[{{0,1,0}}] = 1.; - y[{{0,0,0}}] = -center[1]; - z[{{0,0,1}}] = 1.; - z[{{0,0,0}}] = -center[2]; - double norm = 16./3. * pow(ec, 3.25) * pow(2./pi, 0.75); - prefactor = norm * x * y * z * (2.*zz + (-1.*xx) + (-1.*yy)); - } - // (l,m) = (5,-1) - else if(type == GaussianType::hm1) { - // get x^4+2x^2y^2-12x^2z^2+y^4-12y^2z^2+8z^4 - // multiply by y, normalize - PolynomialCoeffs x4(4), xx(2), yy(2), y4(4), zz(2), z4(4), y(1); - x4[{{4,0,0}}] = 1.; - x4[{{3,0,0}}] = -4. * center[0]; - x4[{{2,0,0}}] = 6. * center[0] * center[0]; - x4[{{1,0,0}}] = -4. * pow(center[0], 3); - x4[{{0,0,0}}] = 1. * pow(center[0], 4); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - y4[{{0,4,0}}] = 1.; - y4[{{0,3,0}}] = -4. * center[1]; - y4[{{0,2,0}}] = 6. * center[1] * center[1]; - y4[{{0,1,0}}] = -4. * pow(center[1], 3); - y4[{{0,0,0}}] = 1. * pow(center[1], 4); - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - z4[{{0,0,4}}] = 1.; - z4[{{0,0,3}}] = -4. * center[2]; - z4[{{0,0,2}}] = 6. * center[2] * center[2]; - z4[{{0,0,1}}] = -4. * pow(center[2], 3); - z4[{{0,0,0}}] = 1. * pow(center[2], 4); - y[{{0,1,0}}] = 1.; - y[{{0,0,0}}] = -center[1]; - double norm = 4./(3.*sqrt(7.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - prefactor = norm * y * (x4 + 2.*xx*yy + (-12.*xx*zz) + y4 + (-12.*yy*zz) + 8.*z4); - } - // (l,m) = (5,0) - else if(type == GaussianType::hzero) { - // get 15x^4+30x^2y^2-40x^2z^2+15y^4-40y^2z^2+8z^4 - // multiply by z, normalize - PolynomialCoeffs x4(4), xx(2), zz(2), y4(4), yy(2), z4(4), z(1); - x4[{{4,0,0}}] = 1.; - x4[{{3,0,0}}] = -4. * center[0]; - x4[{{2,0,0}}] = 6. * center[0] * center[0]; - x4[{{1,0,0}}] = -4. * pow(center[0], 3); - x4[{{0,0,0}}] = 1. * pow(center[0], 4); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - y4[{{0,4,0}}] = 1.; - y4[{{0,3,0}}] = -4. * center[1]; - y4[{{0,2,0}}] = 6. * center[1] * center[1]; - y4[{{0,1,0}}] = -4. * pow(center[1], 3); - y4[{{0,0,0}}] = 1. * pow(center[1], 4); - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = pow(center[1], 2); - z4[{{0,0,4}}] = 1.; - z4[{{0,0,3}}] = -4. * center[2]; - z4[{{0,0,2}}] = 6. * center[2] * center[2]; - z4[{{0,0,1}}] = -4. * pow(center[2], 3); - z4[{{0,0,0}}] = 1. * pow(center[2], 4); - z[{{0,0,1}}] = 1.; - z[{{0,0,0}}] = -center[2]; - double norm = 4./(3.*sqrt(105.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - prefactor = norm * z * (15.*x4 + 30.*xx*yy + (-40.*xx*zz) + 15.*y4 + (-40.*yy*zz) + 8.*z4); - } - // (l,m) = (5,1) - else if(type == GaussianType::hp1) { - // get x^4+2x^2y^2-12x^2z^2+y^4-12y^2z^2+8z^4 - // multiply by x, normalize - PolynomialCoeffs x4(4), xx(2), zz(2), y4(4), yy(2), z4(4), x(1); - x4[{{4,0,0}}] = 1.; - x4[{{3,0,0}}] = -4. * center[0]; - x4[{{2,0,0}}] = 6. * center[0] * center[0]; - x4[{{1,0,0}}] = -4. * pow(center[0], 3); - x4[{{0,0,0}}] = 1. * pow(center[0], 4); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - y4[{{0,4,0}}] = 1.; - y4[{{0,3,0}}] = -4. * center[1]; - y4[{{0,2,0}}] = 6. * center[1] * center[1]; - y4[{{0,1,0}}] = -4. * pow(center[1], 3); - y4[{{0,0,0}}] = 1. * pow(center[1], 4); - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - z4[{{0,0,4}}] = 1.; - z4[{{0,0,3}}] = -4. * center[2]; - z4[{{0,0,2}}] = 6. * center[2] * center[2]; - z4[{{0,0,1}}] = -4. * pow(center[2], 3); - z4[{{0,0,0}}] = 1. * pow(center[2], 4); - x[{{1,0,0}}] = 1.; - x[{{0,0,0}}] = -center[0]; - double norm = 4./(3.*sqrt(7.)) * pow(ec, 3.25) * pow(2./pi, 0.75); - // Testing shows nwchem uses the negative of this - prefactor = (-1.) * norm * x * (x4 + 2.*xx*yy + (-12.*xx*zz) + y4 + (-12.*yy*zz) + 8.*z4); - } - // (l,m) = (5,2) - else if(type == GaussianType::hp2) { - // get z * (x^2-y^2) * (2z^2 - x^2 - y^2), and normalize - PolynomialCoeffs xx(2), yy(2), zz(2), z(1); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - z[{{0,0,1}}] = 1.; - z[{{0,0,0}}] = -center[2]; - double norm = 8./3. * pow(ec, 3.25) * pow(2./pi, 0.75); - prefactor = norm * z * (xx + (-1.*yy)) * (2.*zz + (-1.*xx) + (-1.*yy)); - } - // (l,m) = (5,3) - else if(type == GaussianType::hp3) { - // get x, (x^2-3y^2) and (8z^2-x^2-y^2), - // multiply and normalize - PolynomialCoeffs xx(2), yy(2), zz(2), x(1); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - zz[{{0,0,2}}] = 1.; - zz[{{0,0,1}}] = -2. * center[2]; - zz[{{0,0,0}}] = center[2] * center[2]; - x[{{1,0,0}}] = 1.; - x[{{0,0,0}}] = -center[0]; - double norm = 4./(3.*sqrt(3.)) * pow(2., 0.25) * pow(ec, 3.25) * pow(1./pi, 0.75); - // Testing shows nwchem uses the negative of this - prefactor = (-1.) * norm * x * (xx + (-3.*yy)) * (8.*zz + (-1.*xx) + (-1.*yy)); - } - // (l,m) = (5,4) - else if(type == GaussianType::hp4) { - // setup x^4, x^2y^2, y^4, get (x^4-6x^2y^2+y^4), normalize, multiply by z - PolynomialCoeffs z(1), x4(4), xx(2), yy(2), y4(4); - z[{{0,0,1}}] = 1.; - z[{{0,0,0}}] = -center[2]; - x4[{{4,0,0}}] = 1.; - x4[{{3,0,0}}] = -4. * center[0]; - x4[{{2,0,0}}] = 6. * center[0] * center[0]; - x4[{{1,0,0}}] = -4. * pow(center[0], 3); - x4[{{0,0,0}}] = pow(center[0], 4); - y4[{{0,4,0}}] = 1.; - y4[{{0,3,0}}] = -4. * center[1]; - y4[{{0,2,0}}] = 6. * center[1] * center[1]; - y4[{{0,1,0}}] = -4. * pow(center[1], 3); - y4[{{0,0,0}}] = pow(center[1], 4); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. *center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - double norm = 4./sqrt(3.) * pow(ec, 3.25) * pow(2./pi, 0.75); - prefactor = norm * z * (x4 + (-6.*xx*yy) + y4); - } - // (l,m) = (5,5) - else if(type == GaussianType::hp5) { - // get x, (x^4-10x^2y^2+5y^4), multiply, normalize - PolynomialCoeffs x(1), x4(4), xx(2), yy(2), y4(4); - x[{{1,0,0}}] = 1.; - x[{{0,0,0}}] = -center[0]; - x4[{{4,0,0}}] = 1.; - x4[{{3,0,0}}] = -4. * center[0]; - x4[{{2,0,0}}] = 6. * center[0] * center[0]; - x4[{{1,0,0}}] = -4. * pow(center[0], 3); - x4[{{0,0,0}}] = pow(center[0], 4); - y4[{{0,4,0}}] = 1.; - y4[{{0,3,0}}] = -4. * center[1]; - y4[{{0,2,0}}] = 6. * center[1] * center[1]; - y4[{{0,1,0}}] = -4. * pow(center[1], 3); - y4[{{0,0,0}}] = pow(center[1], 4); - xx[{{2,0,0}}] = 1.; - xx[{{1,0,0}}] = -2. * center[0]; - xx[{{0,0,0}}] = center[0] * center[0]; - yy[{{0,2,0}}] = 1.; - yy[{{0,1,0}}] = -2. * center[1]; - yy[{{0,0,0}}] = center[1] * center[1]; - double norm = 4./sqrt(15.) * pow(2., 0.25) * pow(ec, 3.25) * pow(1./pi, 0.75); - // Testing shows nwchem uses the negative of this - prefactor = (-1.) * norm * x * (x4 + (-10.*xx*yy) + 5.*y4); - } -} - -PrimitiveGaussian::PrimitiveGaussian(const PolynomialCoeffs &exppoly_, - const PolynomialCoeffs &prefactor_) - : prefactor(prefactor_), exppoly(exppoly_) { - - const unsigned degree = exppoly_.get_degree(); - if(degree > 2) - throw std::invalid_argument("Exponential in a Gaussian must have degree at most 2."); - else if(degree < 2) { - // it will be assumed in other functions that exppoly's degree is 2 - exppoly = PolynomialCoeffs(2); - exppoly[{{0,0,0}}] = exppoly_[{{0,0,0}}]; - if(degree == 1) { - exppoly[{{1,0,0}}] = exppoly_[{{1,0,0}}]; - exppoly[{{0,1,0}}] = exppoly_[{{0,1,0}}]; - exppoly[{{0,0,1}}] = exppoly_[{{0,0,1}}]; - } - } -} - -double PrimitiveGaussian::operator() (const std::array &x) const { - return exp(exppoly(x)) * prefactor(x); -} - -PrimitiveGaussian PrimitiveGaussian::operator*(const PrimitiveGaussian &rhs) const { - PrimitiveGaussian ret; - ret.prefactor = prefactor * rhs.prefactor; - ret.exppoly = exppoly + rhs.exppoly; - - return ret; -} - -/////////////////////////////////////////////////////////////////////////// -// Implementation of the GaussianFunction class. -/////////////////////////////////////////////////////////////////////////// -GaussianFunction::GaussianFunction(const GaussianType type, - const std::array ¢er, const std::vector &expcoeff, - const std::vector &coeff) { - - if(expcoeff.size() != coeff.size()) - throw std::invalid_argument("A Gaussian function must have the same number of linear expansion and exponential coefficients."); - - // go through each of the primitives and construct the Gaussian function - for(auto iterexpcoeff = expcoeff.cbegin(), - itercoeff = coeff.cbegin(), - end = expcoeff.cend(); - iterexpcoeff != end; - iterexpcoeff++, itercoeff++) { - - terms.emplace_front(*itercoeff, PrimitiveGaussian(type, center, *iterexpcoeff)); - } - - // prune any small terms in the expansion - removeSmallTerms(); - - // store the center - this->center = center; -} - -double GaussianFunction::operator() (const std::array &x) const { - double ret = 0.; - for(const TermT &term : terms) - ret += term.first * term.second(x); - return ret; -} - -GaussianFunction GaussianFunction::operator- () const { - GaussianFunction ret(*this); - - for(TermT &term : ret.terms) - term.first *= -1.; - - return ret; -} - -GaussianFunction GaussianFunction::operator+(const GaussianFunction &rhs) const { - GaussianFunction ret; - ret.terms = terms; // deep copy - for(const TermT &term : rhs.terms) - ret.terms.push_front(term); - return ret; -} - -GaussianFunction &GaussianFunction::operator+=(const GaussianFunction &rhs) { - if(this == &rhs) - for(TermT &term : terms) - term.first *= 2.; - else - for(const TermT &term : rhs.terms) - terms.push_front(term); - return *this; -} - -GaussianFunction &GaussianFunction::operator*=(const double rhs) { - for(TermT &term : terms) - term.first *= rhs; - removeSmallTerms(); - return *this; -} - -GaussianFunction GaussianFunction::operator*(const GaussianFunction &rhs) const { - GaussianFunction ret; - for(const TermT &term : terms) - for(const TermT &rterm : rhs.terms) { - ret.terms.emplace_front( - term.first * rterm.first, - term.second * rterm.second - ); - } - ret.removeSmallTerms(); - return ret; -} - -} // namespace slymer diff --git a/src/apps/dirac/gaussian.h b/src/apps/dirac/gaussian.h deleted file mode 100644 index 700a34363ff..00000000000 --- a/src/apps/dirac/gaussian.h +++ /dev/null @@ -1,393 +0,0 @@ -/* This file is a part of Slymer, which is distributed under the Creative - Commons Attribution-NonCommercial 4.0 International Public License. - - (c) 2017 Stony Brook University. */ - -/** - * \file Basis/gaussian.h - * \brief Gaussian basis function API and routines. - * - * Handles Gaussian basis functions as special cases (class inheritance). Both - * primitive and contracted Gaussians from electronic structure codes are - * implemented, but not using those labels. - */ - -#ifndef __Basis_gaussian_h__ -#define __Basis_gaussian_h__ - -#include -#include -#include "basis.h" -#include "polynomial.h" -#include "ESInterface.h" -#include - -namespace slymer { - -/// Implemented types of Gaussian orbitals (from quantum chemistry codes). -enum class GaussianType { - // both Cartesian and spherical - s, px, py, pz, - - // Cartesian (and possibly spherical) - dxx, dxy, dxz, dyy, dyz, dzz, - fxxx, fxxy, fxxz, fxyy, fxyz, fxzz, fyyy, fyyz, fyzz, fzzz, - - // spherical only ('m' denotes "minus") - dzzmrr, dxxmyy, - fxyymxxx, fxxzmyyz, fxzzmrrx, fzzzmrrz, fyzzmrry, fxxymyyy, - - // g - // cartesian - gxxxx, gxxxy, gxxxz, gxxyy, gxxyz, gxxzz, gxyyy, gxyyz, gxyzz, - gxzzz, gyyyy, gyyyz, gyyzz, gyzzz, gzzzz, - // spherical - // ('d' denotes "dot" for multiplication) - // (numbers in names indicate powers of preceding variable) - gxydx2my2, gyzdx2my2, gxydz2mr2, gyzdz2mr2, gzero, - gxzdz2mr2, gx2my2dz2mr2, gxzdx2my2, gx4mx2y2py4, - - // h - // cartesian - hxxxxx, hxxxxy, hxxxxz, hxxxyy, hxxxyz, hxxxzz, hxxyyy, hxxyyz, - hxxyzz, hxxzzz, hxyyyy, hxyyyz, hxyyzz, hxyzzz, hxzzzz, hyyyyy, - hyyyyz, hyyyzz, hyyzzz, hyzzzz, hzzzzz, - // spherical - // at this point, just giving names corresponding to value - // quantum number m - hm5, hm4, hm3, hm2, hm1, hzero, hp1, hp2, hp3, hp4, hp5 - -}; - -// forward declaration -class GaussianFunction; - -/** - * \brief A primitive Gaussian function. - * - * This basis function has the form \f[ - * f(x,y,z) = p(x,y,z) \exp[(x-x_0)^T \Sigma (x-x_0)], - * \f] - * where \f$p\f$ is a polynomial and \f$x_0\f$ is the ``center'' of the - * Gaussian and \f$\Sigma\f$ is the variance/covariance matrix. - * - * This class is designed to work with Gaussian basis functions in quantum - * chemistry codes, but is made to be a bit more general for other - * applications. - * - * The wikipedia page on multivariable normal distributions may be helpful - * (https://en.wikipedia.org/wiki/Multivariate_normal_distribution). - */ -class PrimitiveGaussian { - -protected: - /// Polynomial prefactor (\f$p\f$ in the class description). - PolynomialCoeffs prefactor; - - /// Coefficients in the exponent's quadratic function. - PolynomialCoeffs exppoly; - - /** - * \brief Return type for the function's canonical form. - * - * The first element is the polynomial prefactor, converted to use the principal coordinates. - * The second element is the array of decay values (eigenvalues of the covariance matrix). - * The third element is the \f$\nu\f$ vector (essentially the center of the Gaussian). - * The fourth element are the canonical axes in the original coordinates (for debugging purposes). - */ - using CF = std::tuple, std::array, std::array, 3>>; - -public: - /// Default constructor: Make the function 1 (\f$p=1\f$, \f$f(\vec{x})=0\f$). - PrimitiveGaussian() - : prefactor(0), exppoly(2) - { - prefactor[{{0,0,0}}] = 1.; - } - - /** - * \brief Create a primitive Gaussian function centered on the specific point, - * with the specified decay constant and type. - * - * \throw std::invalid_argument if the decay constant is non-positive. - * - * \param[in] type The orbital type of the Gaussian. - * \param[in] center The center of the Gaussian. - * \param[in] ec The decay constant in the exponential. - */ - PrimitiveGaussian(const GaussianType &type, - const std::array ¢er, const double ec); - - /** - * \brief Create a primitive Gaussian function with the specified exponential - * polynomial (quadratic) and polynomial prefactor. - * - * \throw std::invalid_argument if the exponential polynomial is not - * quadratic (or constant or linear as subsets). - * - * \param[in] exppoly_ The exponential polynomial. - * \param[in] prefactor_ The degree of the prefactor. - */ - PrimitiveGaussian(const PolynomialCoeffs &exppoly_, - const PolynomialCoeffs &prefactor_); - - /** - * \brief Evaluate the Gaussian primitive at the specified point. - * - * \param[in] x The point. - * \return The Gaussian primitive evaluated at the point x. - */ - double operator() (const std::array &x) const; - - /** - * \brief Multiply two primitive Gaussians. The result is another. - * - * \param[in] rhs The right-hand object. - * \result The product. - */ - PrimitiveGaussian operator*(const PrimitiveGaussian &rhs) const; -}; - - -/** - * \brief A Gaussian basis function used by chemistry electronic structure - * codes. - * - * This basis function has the form \f[ - * \sum_j c_j x^{l_j} y^{m_j} z^{n_j} \exp[f_j(\vec{x})], - * \f] - * where \f$f_j(\vec{x})\f$ is a quadratic function. Note that this functional - * form is a bit more general than that used by standard electronic structure - * codes; we do not require the prinicpal axes of the Gaussian function to be - * coincident with the x-, y-, and z-axes. This class can also hold/handle any - * linear combination of primitive Gaussian functions (the exponents and - * centers do not have to be the same). - */ -class GaussianFunction : public BasisFunction { - -protected: - /// Helper class for storing terms in the sum of Gaussian primitives. - using TermT = std::pair; - - /// The list of terms in the sum of Gaussian primitives. - std::forward_list terms; - - /** - * \brief Removes terms with very small linear expansion coefficients. - * - * \param[in] eps The threshold for "small". Defaults to 1.e-6. - */ - void removeSmallTerms(const double eps = 1.e-6) { - terms.remove_if( - [eps](const TermT &t) { - return std::abs(t.first) < eps; - } - ); - } - -public: - - /// The center of the gaussian - std::array center; - - /// Default constructor: Make the function 0. - GaussianFunction() : terms(0), center({{0,0,0}}) {} - - /** - * \brief Create a Gaussian orbital (uncontracted or contracted) from - * quantum chemistry codes. - * - * Both Cartesian and spherical orbitals are supported. The expcoeff and - * coeff parameters must be arrays. If the orbital is uncontracted, the - * arrays will be length 1. - * - * All uncontracted primitive Gaussian orbitals used underneath the - * GaussianFunction are normalized. - * - * \throw invalid_argument If a non-positive exponential coefficient is - * passed or if the lengths of expcoeff and coeff are not equal. - * - * \param[in] type The orbital type (from enum OrbitalType). - * \param[in] center The center of the Gaussian orbital. - * \param[in] expcoeff Array of coefficients in the exponents of the - * primitive Gaussians. - * \param[in] coeff Array of linear expansion coefficients of the primitive - * Gaussians. - */ - GaussianFunction(const GaussianType type, const std::array ¢er, - const std::vector &expcoeff, const std::vector &coeff); - - /** - * \brief Create an uncontracted Gaussian orbital (shortcut to the more - * general constructor for Gaussian orbitals). - * - * \param[in] type The orbital type (from enum OrbitalType). - * \param[in] center The center of the Gaussian orbital. - * \param[in] expcoeff The coefficient in the exponent of the primitive - * Gaussian. - */ - GaussianFunction(const GaussianType type, const std::array ¢er, - const double expcoeff) - : GaussianFunction(type, center, {expcoeff}, {1.}) {} - - /** - * \brief Evaluate the Gaussian function at the specified point. - * - * \param[in] x The point. - * \return The Gaussian function evaluated at the point x. - */ - virtual double operator() (const std::array &x) const override; - - /** - * \brief Evaluate the Gaussian function at the specified point. - * - * \param[in] x The point. - * \return The Gaussian function evaluated at the point x. - */ - double operator() (const madness::coord_3d& r) const { - return operator()(std::array{{r[0], r[1], r[2]}}); - }; - - /** - * \brief Additive inverse of the GaussianFunction (deep copy). - * - * \return The negated function. - */ - GaussianFunction operator- () const; - - /** - * \brief Add two GaussianFunction objects, resulting in a new one. - * - * \param[in] rhs The right-hand GaussianFunction. - * \return The sum of this GaussianFunction and rhs. - */ - GaussianFunction operator+(const GaussianFunction &rhs) const; - - /** - * \brief Add a GaussianFunction to this GaussianFunction. - * - * \param[in] rhs The right-hand GaussianFunction. - * \return The sum of this GaussianFunction and rhs, stored in *this. - */ - GaussianFunction &operator+=(const GaussianFunction &rhs); - - /** - * \brief Subtract a GaussianFunction from this one, returning the difference. - * - * \param[in] rhs The GaussianFunction to be subtracted. - * \return The difference of the two GaussianFunction objects. - */ - GaussianFunction operator-(const GaussianFunction &rhs) const { - return *this + (-rhs); - } - - /** - * \brief Subtract a GaussianFunction from this one. - * - * \param[in] rhs The GaussianFunction to be subtracted. - * \return This GaussianFunction (the difference). - */ - GaussianFunction &operator-=(const GaussianFunction &rhs) { - return operator+=(-rhs); - } - - /** - * \brief Multiply the GaussianFunction by a scalar. - * - * \param[in] rhs The scalar multiplicative factor. - * \return This GaussianFunction, which has been scaled. - */ - GaussianFunction &operator*=(const double rhs); - - /** - * \brief Multiply the GaussianFunction by another. - * - * \param[in] rhs The right-hand GaussianFunction object. - * \return This GaussianFunction, which is now the product. - */ - GaussianFunction &operator*=(const GaussianFunction &rhs) { - GaussianFunction ret = (*this) * rhs; - terms.swap(ret.terms); - return *this; - } - - /** - * \brief Multiply the GaussianFunction by a scalar. - * - * \param[in] rhs The scalar multiplicative factor. - * \return The scaled GaussianFunction. - */ - GaussianFunction operator*(const double rhs) const { - GaussianFunction ret(*this); - ret *= rhs; - return ret; - } - - /** - * \brief Multiply two GaussianFunctions. - * - * \param[in] rhs The right-hand GaussianFunction object. - * \return The product. - */ - GaussianFunction operator*(const GaussianFunction &rhs) const; - - /** - * \brief Divide the GaussianFunction by a scalar. - * - * Does not check that the scalar is nonzero. - * - * \param[in] rhs The scalar factor. - * \return This GaussianFunction, which has been scaled. - */ - GaussianFunction &operator/=(const double rhs) { - operator*=(1./rhs); - return *this; - } - - /** - * \brief Divide the GaussianFunction by a scalar. - * - * \param[in] rhs The scalar factor. - * \return The scaled GaussianFunction. - */ - GaussianFunction operator/(const double rhs) const { - return (*this) * (1./rhs); - } -}; - - -// helper functions - -/** - * \brief Multiply a GaussianFunction by a scalar. - * - * \param[in] lhs The scalar multiplicative factor. - * \param[in] rhs The GaussianFunction. - * \return The scaled GaussianFunction. - */ -inline GaussianFunction operator*(const double lhs, const GaussianFunction &rhs) { - return rhs * lhs; -} - -class Gaussian_Functor : public madness::FunctionFunctorInterface { -private: - GaussianFunction func; - std::vector centers; -public: - Gaussian_Functor(GaussianFunction func, std::vector centers) : func(func), centers(centers) {} - - double operator()(const madness::coord_3d& r) const { - return func(r); - } - - std::vector special_points() const { - return centers; - } - - madness::Level special_level() { - return 14; - } -}; - -} // namespace slymer -#endif diff --git a/src/apps/dirac/polynomial.cc b/src/apps/dirac/polynomial.cc deleted file mode 100644 index 07c9427ab0d..00000000000 --- a/src/apps/dirac/polynomial.cc +++ /dev/null @@ -1,148 +0,0 @@ -/* This file is a part of Slymer, which is distributed under the Creative - Commons Attribution-NonCommercial 4.0 International Public License. - - (c) 2017 Stony Brook University. */ - -/** - * \file Basis/polynomial.cc - * \brief Implementation of polynomial API and routines. - */ - -#include -#include -#include "polynomial.h" - -namespace slymer { - -double PolynomialCoeffs::operator() (const std::array &pt) const { - double ret = 0.; - - for(unsigned j = 0; j <= degree; ++j) - for(unsigned k = 0; k <= degree - j; ++k) - for(unsigned l = 0; l <= degree - j - k; ++l) - ret += coeffs[polyIndex({{j,k,l}})] - * ::pow(pt[0], j) * ::pow(pt[1], k) * ::pow(pt[2], l); - - return ret; -} - -PolynomialCoeffs PolynomialCoeffs::operator+ (const PolynomialCoeffs &rhs) const -{ - if(degree >= rhs.degree) { - PolynomialCoeffs ret(degree); - - unsigned size = rhs.coeffs.size(); - for(unsigned j = 0; j < size; ++j) - ret.coeffs[j] = coeffs[j] + rhs.coeffs[j]; - size = coeffs.size(); - for(unsigned j = rhs.coeffs.size(); j < size; ++j) - ret.coeffs[j] = coeffs[j]; - - return ret; - } - else { - PolynomialCoeffs ret(rhs.degree); - - unsigned size = coeffs.size(); - for(unsigned j = 0; j < size; ++j) - ret.coeffs[j] = coeffs[j] + rhs.coeffs[j]; - size = rhs.coeffs.size(); - for(unsigned j = coeffs.size(); j < size; ++j) - ret.coeffs[j] = rhs.coeffs[j]; - - return ret; - } -} - -PolynomialCoeffs &PolynomialCoeffs::operator+= (const PolynomialCoeffs &rhs) { - if(degree >= rhs.degree) { - const unsigned size = rhs.coeffs.size(); - for(unsigned j = 0; j < size; ++j) - coeffs[j] += rhs.coeffs[j]; - } - else { - PolynomialCoeffs newpoly(rhs.degree); - - unsigned size = coeffs.size(); - for(unsigned j = 0; j < size; ++j) - newpoly.coeffs[j] = coeffs[j] + rhs.coeffs[j]; - size = rhs.coeffs.size(); - for(unsigned j = coeffs.size(); j < size; ++j) - newpoly.coeffs[j] = rhs.coeffs[j]; - - std::swap(coeffs, newpoly.coeffs); - degree = rhs.degree; - } - - return *this; -} - -PolynomialCoeffs PolynomialCoeffs::operator* (const double c) const { - PolynomialCoeffs ret(*this); - - for(double &coeff : ret.coeffs) - coeff *= c; - - return ret; -} - -PolynomialCoeffs &PolynomialCoeffs::operator*= (const double c) { - for(double &coeff : coeffs) - coeff *= c; - - return *this; -} - -PolynomialCoeffs PolynomialCoeffs::operator* (const PolynomialCoeffs &rhs) const -{ - // make an output vector with the appropriate size for a multinomial of degree j - const unsigned deg = degree + rhs.degree; - PolynomialCoeffs ret(deg); - - // go through all combinations for the product - for(unsigned x1 = 0; x1 <= degree; ++x1) - for(unsigned y1 = 0; y1 <= degree - x1; ++y1) - for(unsigned z1 = 0; z1 <= degree - x1 - y1; ++z1) { - - for(unsigned x2 = 0; x2 <= rhs.degree; ++x2) - for(unsigned y2 = 0; y2 <= rhs.degree - x2; ++y2) - for(unsigned z2 = 0; z2 <= rhs.degree - x2 - y2; ++z2) { - ret[{{x1+x2, y1+y2, z1+z2}}] += - operator[]({{x1, y1, z1}}) * rhs[{{x2, y2, z2}}]; - } - } - - return ret; -} - -PolynomialCoeffs PolynomialCoeffs::pow(const unsigned j) const { - // this function is only intended to work with polynomials of degree 1 - if(degree != 1) - throw std::runtime_error("PolynomialCoeffs::pow can only be applied to polynomials with degree 1."); - - // array with factorials - const std::array fact{{1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800}}; - - if(j >= fact.size()) - throw std::invalid_argument("Degree is too big in PolynomialCoeffs::pow."); - - // setup a PolynomialCoeffs for the return values - PolynomialCoeffs ret(j); - - // cycle through all exponent orders that add up to j - for(unsigned ex1 = 0; ex1 <= j; ++ex1) - for(unsigned ex2 = 0; ex2 <= j - ex1; ++ex2) - for(unsigned ex3 = 0; ex3 <= j - ex1 - ex2; ++ex3) { - unsigned ex4 = j - ex1 - ex2 - ex3; // the ex coefficients add up to j - - // calculate the coefficient on x^ex1 y^ex2 z^ex3, per the multinomial theorem - ret[{{ex1, ex2, ex3}}] = - (fact[j] / fact[ex1] / fact[ex2] / fact[ex3] / fact[ex4]) - * ::pow(operator[]({{1,0,0}}), ex1) * ::pow(operator[]({{0,1,0}}), ex2) - * ::pow(operator[]({{0,0,1}}), ex3) * ::pow(operator[]({{0,0,0}}), ex4); - } - - return ret; -} - -} // namespace slymer diff --git a/src/apps/dirac/polynomial.h b/src/apps/dirac/polynomial.h deleted file mode 100644 index 0e9651cd8a9..00000000000 --- a/src/apps/dirac/polynomial.h +++ /dev/null @@ -1,235 +0,0 @@ -/* This file is a part of Slymer, which is distributed under the Creative - Commons Attribution-NonCommercial 4.0 International Public License. - - (c) 2017 Stony Brook University. */ - -/** - * \file Basis/polynomial.h - * \brief API and helper functions for describing polynomial functions of - * three variables. - * - * The array is indexed by the polyIndex function. Each element of the array - * is a coefficient on the polynomial. - */ - -#ifndef __Basis_polynomial_h__ -#define __Basis_polynomial_h__ - -#include -#include - -namespace slymer { - -/** - * \brief Array for storing coefficients of a polynomial of three variables - * with specified degree. - * - * The general polynomial of three variables is written as - * \f[ \sum_{i,j,k} c_{i,j,k} x^i y^j z^k, \f] - * where \f$0\le i+j+k\le N\f$. This data structure stores the coefficients - * in a vector and provides access routines in terms of the exponents \f$i\f$, - * \f$j\f$, and \f$k\f$. - * - * \note This class is not designed for polynomials with a large degree. - */ -class PolynomialCoeffs { - -protected: - /// The degree of the polynomial. - unsigned degree; - - /** - * \brief Array storing the coefficients. - * - * For a given degree n, there are \f$(n+1)(n+2)/2\f$ monomials. The total - * array thus has \f$(n+1)*(n+2)*(n+3)/6\f$ terms. The array stores all terms - * with degree 0, then degree 1, then degree 2, etc. - */ - std::vector coeffs; - - /** - * \brief Gets the array index for the coefficient of a particular term. - * - * Terms of degree 0 are stored before those of degree 1, etc. - * - * Within a particular degree, think of the problem in the combinatorial "stars - * and bars" idea: there are n stars and two bars dividing them into three - * parts. (Each part corresponds to the number of x, y, or z factors.) The first - * array element will be bars in the 0 and 1 positions, then 0 and 2, ..., 0 and - * n+1, then 1 and 2, etc. - * - * \param[in] pows The powers of x, y, and z for this term. - * \return The array offset, as described above. - */ - static inline unsigned polyIndex(const std::array &pows) { - const unsigned n = pows[0] + pows[1] + pows[2]; - - // calculate the offset within the level of the degree... - // x-y offset. All terms with pows[0] == 0 are first; there are n+1 of them. - // Then pows[0] == 1; there are n, etc. - unsigned ret = (n+1)*pows[0] - (pows[0]-1)*pows[0] / 2; - // y-z offset. how many y factors are there? pows[1]. This value being 0 - // comes first, then 1, then 2, etc. - ret += pows[1]; - - // calculate the offset for smaller degrees. There are (n+1)(n+2)/2 elements - // for degree n; add up all the smaller degrees. - ret += n*(n+1)*(n+2)/6; - - return ret; - } - -public: - /** - * \brief Get the degree of the polynomial. - * - * \return The degree of the polynomial. - */ - unsigned get_degree() const { - return degree; - } - - PolynomialCoeffs() = delete; - - /** - * \brief Create a linear function with the specified coefficients. - * - * \param[in] constant The constant term. - * \param[in] x The coefficient on x. - * \param[in] y The coefficient on y. - * \param[in] z The coefficient on z. - */ - PolynomialCoeffs(const double constant, const double x, const double y, - const double z) : degree(1), coeffs(4) { - - coeffs[polyIndex({{0,0,0}})] = constant; - coeffs[polyIndex({{1,0,0}})] = x; - coeffs[polyIndex({{0,1,0}})] = y; - coeffs[polyIndex({{0,0,1}})] = z; - } - - /** - * \brief Create a polynomial of degree N. - * - * \param[in] N The degree of the polynomial. - */ - PolynomialCoeffs(const unsigned N) - : degree(N), coeffs((N+1)*(N+2)*(N+3)/6) { - - for(double &coeff : coeffs) - coeff = 0.; - } - - /** - * \brief Access the coefficient for the specified term. - * - * \param[in] pows The powers of x, y, and z for this term. - * \return Reference to the array term. - */ - double &operator[] (const std::array &pows) { - return coeffs[polyIndex(pows)]; - } - - /** - * \brief Access the coefficient for the specified term. - * - * \param[in] pows The powers of x, y, and z for this term. - * \return The array term. - */ - double operator[] (const std::array &pows) const { - return coeffs[polyIndex(pows)]; - } - - /** - * \brief Evaluate the polynomial at the specified point. - * - * \note This implemention is a bit naive; it is not intended for - * polynomials with a large degree. - * - * \param[in] pt The point at which the polynomial is evaluated. - * \return The value of the polynomial at the point. - */ - double operator() (const std::array &pt) const; - - /** - * \brief Add two polynomials together. - * - * *this is one of the polynomials. - * - * \param[in] rhs The other polynomial. - * \return The sum of *this and rhs. - */ - PolynomialCoeffs operator+ (const PolynomialCoeffs &rhs) const; - - /** - * \brief Adds another polynomial to this one. - * - * \param[in] rhs The other polynomial. - * \return The sum of *this and rhs, in *this. - */ - PolynomialCoeffs &operator+= (const PolynomialCoeffs &rhs); - - /** - * \brief Multiply a polynomial by a constant value. - * - * *this is one of the polynomials. - * - * \param[in] c The constant value. - * \return The product of c and the polynomial. - */ - PolynomialCoeffs operator* (const double c) const; - - /** - * \brief Scale the polynomial by a constant. - * - * \param[in] c The scale factor. - * \return The scaled polynomial (*this). - */ - PolynomialCoeffs &operator*= (const double c); - - /** - * \brief Multiply two polynomials together. - * - * *this is one of the polynomials. - * - * \param[in] rhs The other polynomial. - * \return The product of *this and rhs. - */ - PolynomialCoeffs operator* (const PolynomialCoeffs &rhs) const; - - /** - * \brief Expands a linear polynomial raised to a power. - * - * Essentially expands the polynomial - * \f[ (coeffs[0] + coeffs[1]*x + coeffs[2]*y + coeffs[3]*z)^j \f] - * into a new PolynomialCoeffs object. That is, output[{{p,q,r}}] is the - * coefficient on the \f$x^p y^q z^r\f$ term. - * - * This function requires multinomial coefficients, which involve - * factorials. We assume that the arguments to the factorials will not - * be large and hard-code small values. An error will be thrown if - * the maximum value is exceeded. - * - * \throw std::runtime_error if the polynomial does not have degree 1. - * - * \param[in] j The exponent of the expansion. - * \return The polynomial, ordered using the polyIndex scheme. - */ - PolynomialCoeffs pow(const unsigned j) const; - -}; // class PolynomialCoeffs - -/** - * \brief Multiply a polynomial by a constant value. - * - * \param[in] c The constant value. - * \param[in] poly The polynomial. - * \return The product of c and the polynomial. - */ -inline PolynomialCoeffs operator* (const double c, const PolynomialCoeffs &poly) { - return poly * c; -} - -} // namespace slymer - -#endif From 3cfe9fac0e557bcbcf018e64410c868b174318af Mon Sep 17 00:00:00 2001 From: Jakob S Kottmann Date: Tue, 23 Feb 2021 13:37:22 -0500 Subject: [PATCH 0145/1312] avoid too many iterations if pairs are frozen and ranks are fixed --- src/apps/chem/PNO.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/chem/PNO.cpp b/src/apps/chem/PNO.cpp index 6708290433c..7b3cedac416 100644 --- a/src/apps/chem/PNO.cpp +++ b/src/apps/chem/PNO.cpp @@ -1045,10 +1045,11 @@ PNOPairs PNO::adaptive_solver(PNOPairs& pairs)const{ bool maxrank_reached=true; PAIRLOOP(it) { - if (pairs.pno_ij[it.ij()].size() < size_t(param.maxrank())) maxrank_reached = false; + const bool frozen = pairs.frozen_ij[it.ij()]; + if (not frozen and pairs.pno_ij[it.ij()].size() < size_t(param.maxrank())) maxrank_reached = false; } if (maxrank_reached){ - msg << "Maximum Rank of" << param.maxrank() << " reached, no need to iterate further"; + msg << "Maximum Rank of" << param.maxrank() << " reached for all non-frozen pairs, no need to iterate further"; break; } } From d75cdf3e59b2b34037d8b9f4d8a0c57187f93e78 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Fri, 5 Mar 2021 14:54:34 -0500 Subject: [PATCH 0146/1312] bugfix --- src/apps/dirac/InitParameters.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index 9cf8640a51b..702cd00864e 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -53,7 +53,7 @@ namespace madness{ //Code breaks if spinrestricted (state of archive) and Krestricted (requested by user) don't match //This functionality could probably be added at some point, but it's a bit of work - MADNESS_CHECK(spinrestricted != Krestricted); + MADNESS_CHECK(spinrestricted == Krestricted); // Set this so we can read in whats // written in the archive From 763fca2f70e36eccb849a146a577e734aa31a675 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Sun, 7 Mar 2021 18:56:47 -0500 Subject: [PATCH 0147/1312] expanded step restriction to all iterations with or without kain --- src/apps/dirac/DF.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/apps/dirac/DF.cc b/src/apps/dirac/DF.cc index 1df0cb6761b..f9db310abc5 100644 --- a/src/apps/dirac/DF.cc +++ b/src/apps/dirac/DF.cc @@ -1497,7 +1497,16 @@ bool DF::iterate(World& world, real_function_3d& V, real_convolution_3d& op, rea Residuals.push_back(occupieds[j] - temp_function); } else{ - occupieds[j] = temp_function; //if not using KAIN, then the result is the new orbital + //if not using KAIN, then the result is the new orbital, with some step restriction + residualnorm = (occupieds[j] - temp_function).norm2(); + if(residualnorm > DFparams.maxrotn){ + double s = DFparams.maxrotn / residualnorm; + if(world.rank()==0) print(" restricting step for orbital: ", j+1); + occupieds[j] = temp_function*s + occupieds[j]*(1.0-s); + } + else{ + occupieds[j] = temp_function; + } } } From 66ddbbd2412412d74f0ecd71d3f7e60414425027 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Mon, 29 Mar 2021 19:01:42 -0400 Subject: [PATCH 0148/1312] fixed save mos so dirac jobs can start from restartdata --- src/apps/chem/SCF.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/chem/SCF.cc b/src/apps/chem/SCF.cc index 49cb5b771c4..e9423022171 100644 --- a/src/apps/chem/SCF.cc +++ b/src/apps/chem/SCF.cc @@ -192,7 +192,7 @@ void SCF::save_mos(World& world) { archive::ParallelOutputArchive ar(world, "restartdata", param.get("nio")); ar & current_energy & param.spin_restricted(); ar & (unsigned int) (amo.size()); - ar & aeps & aocc & aset; + ar & aeps & aocc & aset & param.L() & param.k() & molecule; for (unsigned int i = 0; i < amo.size(); ++i) ar & amo[i]; if (!param.spin_restricted()) { From 787ea49c3f43c3712c79f7e885b20fd8fc921716 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 30 Mar 2021 12:13:03 -0400 Subject: [PATCH 0149/1312] better include directives --- src/apps/dirac/DF.cc | 2 +- src/apps/dirac/DF.h | 2 +- src/apps/dirac/InitParameters.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/dirac/DF.cc b/src/apps/dirac/DF.cc index f9db310abc5..5725df7b76d 100644 --- a/src/apps/dirac/DF.cc +++ b/src/apps/dirac/DF.cc @@ -13,7 +13,7 @@ #include "DF.h" //#include "Plot_VTK.h" #include "fcwf.h" -#include "../chem/potentialmanager.h" +#include using namespace madness; diff --git a/src/apps/dirac/DF.h b/src/apps/dirac/DF.h index f3fce031d71..cd7338f775b 100644 --- a/src/apps/dirac/DF.h +++ b/src/apps/dirac/DF.h @@ -13,7 +13,7 @@ #include #include #include -#include "../chem/molecule.h" +#include #include "DFParameters.h" #include "InitParameters.h" diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index 702cd00864e..767f6b82654 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -7,7 +7,7 @@ #define MADNESS_APPS_DFGUESSPARAMS_H_INCLUDED #include "fcwf.h" -#include "../chem/NWChem.h" +#include Function,3> function_real2complex(const Function& r); double myxfunc(const madness::coord_3d& r); From 7446d7ad75e883d8de501c18191b8b4e95a88207 Mon Sep 17 00:00:00 2001 From: Joel S Anderson Date: Tue, 30 Mar 2021 13:04:47 -0400 Subject: [PATCH 0150/1312] updated to reflect nwchem interface now part of MADchem --- src/apps/dirac/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/dirac/CMakeLists.txt b/src/apps/dirac/CMakeLists.txt index dacbe4425ca..a6685762aaa 100644 --- a/src/apps/dirac/CMakeLists.txt +++ b/src/apps/dirac/CMakeLists.txt @@ -1,6 +1,6 @@ # src/apps/moldft -add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc ../chem/gaussian.cc ../chem/NWChem.cc ../chem/polynomial.cc) +add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc) target_link_libraries(DFdriver MADchem MADmra) add_executable(rk rk.cc) From 7dc82f8f9bfdb961cc8303b36eccf886c5aca6e5 Mon Sep 17 00:00:00 2001 From: "Jakob S. Kottmann" Date: Wed, 7 Apr 2021 16:24:43 -0400 Subject: [PATCH 0151/1312] added ignore_pair option to pnoint --- src/apps/chem/PNOParameters.h | 10 +++++--- src/apps/chem/SCF.h | 3 +-- src/apps/pno/pno_integrals.cpp | 44 ++++++++++++++++++++++++++++++---- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/apps/chem/PNOParameters.h b/src/apps/chem/PNOParameters.h index 3a8a31f9dff..274fef17095 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/apps/chem/PNOParameters.h @@ -116,8 +116,8 @@ class PNOParameters: public QCCalculationParametersBase { } set_derived_value("freeze", freeze); - set_derived_value("no_guess", get("no_opt")); - set_derived_value("restart", get("no_guess")); + set_derived_value("no_guess", get("no_compute")); + set_derived_value("restart", get("no_compute")); set_derived_value("tpno_tight", 0.01*tpno()); // set default values for adaptive solver @@ -310,7 +310,7 @@ class PNOIntParameters: public PNOParameters { initialize("pno_cabs_size", -1, "size of a potential pno-cabs. defaults to -1 ~ all remaining PNOs, if pno-cabs or mixed-cabs"); initialize("only_diag", false, "use only diagonal elements PNOs"); initialize >("cherry_pick", std::vector(), "cherry pick option to choose particular set of PNOs, not just blindly by occupation number. can be useful, if only a restricted number of PNOs can be used, to avoid separating degenerate pairs. can be envoked by passing a vector via [ elem1, elem2, ... ]"); - + initialize >("ignore_pair", std::vector(), "ignore certain pairs in the selection of pnos numbering is 00-0, 01-1, 02-2 ... "); initialize("gamma",1.4, "The f12 length scale, here to be used to compute f12-integrals"); initialize("cabs_thresh",1.e-4, " thresh for cabs part "); initialize("auxbas", "none", "atom centered partial wave guess of format like 'h-2s1p-o-3s2p1d' "); @@ -337,6 +337,9 @@ class PNOIntParameters: public PNOParameters { std::vector cherry_pick()const { return get >("cherry_pick"); } + std::vector ignore_pair()const { + return get >("ignore_pair"); + } double cabs_thresh()const { return get("cabs_thresh");} std::string auxbas_file()const { return get("auxbas_file"); @@ -352,6 +355,7 @@ class PNOIntParameters: public PNOParameters { void set_derived_values(const PNOParameters& param) { set_derived_value("cabs_thresh", thresh()); set_derived_value("n_pno", std::min(10, param.maxrank())); + set_derived_value("only_diag", diagonal()); } }; diff --git a/src/apps/chem/SCF.h b/src/apps/chem/SCF.h index 11dceea64d7..ab33d6c431f 100644 --- a/src/apps/chem/SCF.h +++ b/src/apps/chem/SCF.h @@ -763,8 +763,7 @@ class MolecularEnergy : public OptimizationTargetInterface { if (calc.param.pcm_data() != "none") { calc.pcm=PCM(world,calc.molecule,calc.param.pcm_data(),true); } - - bool have_initial_guess=false; + bool have_initial_guess = (calc.amo.size() > 0); // get initial orbitals if (calc.param.restart()) { calc.load_mos(world); diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index d6bad67b0cb..30f0e858700 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -223,7 +223,16 @@ int main(int argc, char** argv) { std::vector> pno_ids; std::vector> rest_ids; std::string name; + + for(auto& pairs: all_pairs){ + // list of pairs to ignore: + std::vector ignore_pair(pairs.npairs, false); + for(auto x : paramsint.ignore_pair()){ + ignore_pair[x] = true; + if(world.rank()==0) std::cout << "will ignore pair " << x << "\n"; + } + const auto& pno_ij = pairs.pno_ij; const auto& rdm_evals = pairs.rdm_evals_ij; const bool is_gs = pairs.type == MP2_PAIRTYPE; @@ -240,9 +249,13 @@ int main(int argc, char** argv) { // collect PNOs from all pairs and sort by occupation number, keeping pair information via name for(ElectronPairIterator it=pno.pit();it;++it){ if (only_diag and not it.diagonal()){ - if(world.rank()==0) std::cout << "skipping pair " << it.name() << "\n"; + if(world.rank()==0) std::cout << "skipping pair (not diagonal) " << it.name() << "\n"; + continue; + }else if(ignore_pair[it.ij()]){ + if(world.rank()==0) std::cout << "skipping pair (demanded by input) " << it.name() << "\n"; continue; }else{ + if(world.rank()==0) std::cout << "adding " << it.name() << "\n"; const auto& pair = pno_ij[it.ij()]; all_current_pnos.insert(all_current_pnos.end(), pair.begin(), pair.end()); for (auto ii=0; iiparam.nalpha() + paramsint.n_virt()); - calcx.param.set_user_defined_value("nmo_beta",calc->param.nbeta() + paramsint.n_virt()); - calcx.initial_guess(world); + calcx.param.set_user_defined_value("nmo_alpha",calc->param.nalpha() + paramsint.n_virt()); + calcx.param.set_user_defined_value("nmo_beta",calc->param.nbeta() + paramsint.n_virt()); + calcx.set_protocol<3>(world,pno.param.thresh()); + calcx.reset_aobasis(calcx.param.aobasis()); + calcx.ao=calcx.project_ao_basis(world,calcx.aobasis); + calcx.make_nuclear_potential(world); + calcx.initial_guess(world); calcx.param.print(); calcx.amo = calc->amo; auto F = Fock(world, calc.get()); auto Fmat = F(calc->ao, calc->ao); Tensor U, evals; syev(Fmat, U, evals); - auto vguess = madness::transform(world, calc->ao, U); + auto vguess = vecfuncT(); + + if (false){ // standard guess, but pnos usually better + auto F = Fock(world, calc.get()); + auto Fmat = F(calc->ao, calc->ao); + Tensor U, evals; + syev(Fmat, U, evals); + vguess = madness::transform(world, calc->ao, U); + }else{ + auto pnos = vecfuncT(basis.begin()+reference.size(), basis.end()); + auto F = Fock(world, calc.get()); + auto Fmat = F(pnos, pnos); + Tensor U, evals; + syev(Fmat, U, evals); + if(world.rank()==0){ std::cout << " evals = " << evals << "\n";} + vguess = madness::transform(world, pnos, U); + } + for (auto i=0;i Date: Wed, 3 Feb 2021 16:11:57 +0300 Subject: [PATCH 0152/1312] Reducing usage of deprecated tbb::task API --- src/madness/world/taskfn.h | 12 +----------- src/madness/world/world_task_queue.h | 3 +-- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/madness/world/taskfn.h b/src/madness/world/taskfn.h index f276bca832f..f3fd0d95203 100644 --- a/src/madness/world/taskfn.h +++ b/src/madness/world/taskfn.h @@ -853,21 +853,11 @@ namespace madness { const futureT& result() const { return result_; } - -#ifdef HAVE_INTEL_TBB - virtual tbb::task* execute() { - detail::run_function(result_, func_, arg1_, arg2_, arg3_, arg4_, - arg5_, arg6_, arg7_, arg8_, arg9_); - return nullptr; - } -#else protected: - virtual void run(const TaskThreadEnv& env) { + virtual void run(World&, const TaskThreadEnv&) /*override*/{ detail::run_function(result_, func_, arg1_, arg2_, arg3_, arg4_, arg5_, arg6_, arg7_, arg8_, arg9_); } -#endif // HAVE_INTEL_TBB - }; // class TaskFn } // namespace madness diff --git a/src/madness/world/world_task_queue.h b/src/madness/world/world_task_queue.h index 9d3f5fbf15d..76795ec621c 100644 --- a/src/madness/world/world_task_queue.h +++ b/src/madness/world/world_task_queue.h @@ -1427,7 +1427,7 @@ namespace madness { /// Task run work. /// Sets the result future based on the status of all iterations. - virtual tbb::task* execute() { + virtual void run(World&, const TaskThreadEnv& ) /*override*/ { // Note: We use parallel_reduce instead of parallel_foreach to // accumulate result flags. Otherwise, this logically functions @@ -1444,7 +1444,6 @@ namespace madness { } ); completion_status_.set(result); - return nullptr; } private: From ec2a8c82a8ef734e608090b5ccebbd77ee474809 Mon Sep 17 00:00:00 2001 From: Anton Potapov Date: Fri, 23 Jul 2021 14:39:21 +0300 Subject: [PATCH 0153/1312] Reducing usage of deprecated tbb::task API - replacing deprecated tbb::task API in the TaskPoolInterface --- src/madness/world/thread.cc | 4 ++- src/madness/world/thread.h | 63 ++++++++----------------------------- 2 files changed, 16 insertions(+), 51 deletions(-) diff --git a/src/madness/world/thread.cc b/src/madness/world/thread.cc index 59a33fb284e..2c594313d17 100644 --- a/src/madness/world/thread.cc +++ b/src/madness/world/thread.cc @@ -75,7 +75,8 @@ namespace madness { ThreadPool* ThreadPool::instance_ptr = 0; double ThreadPool::await_timeout = 900.0; #if HAVE_INTEL_TBB - std::unique_ptr ThreadPool::tbb_control = nullptr; + std::unique_ptr ThreadPool::tbb_control = nullptr; + std::unique_ptr ThreadPool::tbb_arena = nullptr; #endif #ifdef MADNESS_TASK_PROFILING Mutex profiling::TaskProfiler::output_mutex_; @@ -389,6 +390,7 @@ namespace madness { // is counted as part of tbb. const int num_tbb_threads = (SafeMPI::COMM_WORLD.Get_size() > 1) ? nthreads + 2 : nthreads + 1; tbb_control = std::make_unique(tbb::global_control::max_allowed_parallelism, num_tbb_threads); + tbb_arena = std::make_unique(num_tbb_threads); #else try { diff --git a/src/madness/world/thread.h b/src/madness/world/thread.h index 75d500f06d0..b48effb6853 100644 --- a/src/madness/world/thread.h +++ b/src/madness/world/thread.h @@ -70,7 +70,7 @@ extern "C" { #endif // MADNESS_TASK_PROFILING #ifdef HAVE_INTEL_TBB -#include +#include #ifndef TBB_PREVIEW_GLOBAL_CONTROL # define TBB_PREVIEW_GLOBAL_CONTROL 1 #endif @@ -820,11 +820,7 @@ namespace madness { /// The pool invokes \c run_multi_threaded(), which does any necessary /// setup for multiple threads, and then invokes the user's \c run() method. - class PoolTaskInterface : -#ifdef HAVE_INTEL_TBB - public tbb::task, -#endif // HAVE_INTEL_TBB - public TaskAttributes + class PoolTaskInterface : public TaskAttributes { friend class ThreadPool; @@ -1053,31 +1049,9 @@ namespace madness { /// \todo Descriptions needed. /// \return Description needed. - tbb::task* execute() { + void execute() { const int nthread = get_nthread(); run( TaskThreadEnv(nthread, 0) ); - return nullptr; - } - - /// \todo Brief description needed. - - /// \todo Descriptions needed. - /// \throw std::bad_alloc Description needed. - /// \param[in] size Description needed. - /// \return Description needed. - static inline void * operator new(std::size_t size) { - return ::operator new(size, tbb::task::allocate_root()); - } - - /// Destroy a task object. - - /// \param[in,out] p Pointer to the task object (or array of task - /// objects) to be destroyed. - /// \param[in] size The size of the array. - static inline void operator delete(void* p, std::size_t size) noexcept { - if(p != nullptr) { - tbb::task::destroy(*reinterpret_cast(p)); - } } #endif // HAVE_INTEL_TBB @@ -1298,6 +1272,7 @@ namespace madness { #if HAVE_INTEL_TBB static std::unique_ptr tbb_control; ///< \todo Description needed. + static std::unique_ptr tbb_arena; #endif /// Please invoke while in a single-threaded environment. @@ -1314,7 +1289,6 @@ namespace madness { /// \todo Description needed. /// \param[in,out] task Description needed. static void add(PoolTaskInterface* task) { - #ifdef MADNESS_TASK_PROFILING task->submit(); #endif // MADNESS_TASK_PROFILING @@ -1328,12 +1302,15 @@ namespace madness { __parsec_schedule(parsec->virtual_processes[0]->execution_streams[0], parsec_task, 0); //////////// Parsec Related End //////////////////// #elif HAVE_INTEL_TBB -#ifdef MADNESS_CAN_USE_TBB_PRIORITY - if(task->is_high_priority()) - tbb::task::enqueue(*task, tbb::priority_high); - else -#endif // MADNESS_CAN_USE_TBB_PRIORITY - tbb::task::enqueue(*task); +//#ifdef MADNESS_CAN_USE_TBB_PRIORITY +// if(task->is_high_priority()) +// tbb::task::enqueue(*task, tbb::priority_high); +// else +//#endif // MADNESS_CAN_USE_TBB_PRIORITY + tbb_arena->enqueue( + [task_p = std::unique_ptr(task)](){ + task_p->execute(); + }); #else if (!task) MADNESS_EXCEPTION("ThreadPool: inserting a NULL task pointer", 1); int task_threads = task->get_nthread(); @@ -1377,20 +1354,6 @@ namespace madness { /// \return True if a task was run. static bool run_task() { #ifdef HAVE_INTEL_TBB - - // Construct a the parent task - tbb::task& waiter = *new( tbb::task::allocate_root() ) tbb::empty_task; - waiter.set_ref_count(2); - - // Create a dummy task that we send throught the queue. - tbb::task& dummy = *new( waiter.allocate_child() ) tbb::empty_task; - tbb::task::enqueue(dummy); - - // Run tasks while we wait for the dummy task. - waiter.wait_for_all(); - - // destroy the waiter - tbb::task::destroy(waiter); return false; #else From 8e424841ccab3bd0fe05721b8e90b372e56b8c77 Mon Sep 17 00:00:00 2001 From: Anton Potapov Date: Mon, 26 Jul 2021 14:42:15 +0300 Subject: [PATCH 0154/1312] Reducing usage of deprecated tbb::task API - replacing deprecated tbb::task API in the RMI --- src/madness/world/worldrmi.cc | 55 ++++++----------------------------- src/madness/world/worldrmi.h | 21 +++++-------- 2 files changed, 16 insertions(+), 60 deletions(-) diff --git a/src/madness/world/worldrmi.cc b/src/madness/world/worldrmi.cc index 2f3d9c09164..4d9d4bf5a55 100644 --- a/src/madness/world/worldrmi.cc +++ b/src/madness/world/worldrmi.cc @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -52,9 +53,6 @@ namespace madness { thread_local bool RMI::is_server_thread = false; -#if HAVE_INTEL_TBB - tbb::task* RMI::tbb_rmi_parent_task = nullptr; -#endif void RMI::RmiTask::process_some() { @@ -220,7 +218,7 @@ namespace madness { //for (int i=0; i rmi_task_is_running = false; RMI::RmiTask::RmiTask(const SafeMPI::Intracomm& _comm) : comm(_comm.Clone()) @@ -401,56 +399,21 @@ namespace madness { } MADNESS_ASSERT(task_ptr == nullptr); -#if HAVE_INTEL_TBB - - // Force the RMI task to be picked up by someone other than main thread - // by keeping main thread occupied AND enqueing enough dummy tasks to make - // TBB create threads and pick up RmiTask eventually + task_ptr = new RmiTask(comm); - tbb_rmi_parent_task = - new (tbb::task::allocate_root()) tbb::empty_task; - tbb_rmi_parent_task->set_ref_count(2); - task_ptr = new (tbb_rmi_parent_task->allocate_child()) RmiTask(comm); -#ifdef MADNESS_CAN_USE_TBB_PRIORITY - tbb::task::enqueue(*task_ptr, tbb::priority_high); -#else - tbb::task::enqueue(*task_ptr); -#endif // MADNESS_CAN_USE_TBB_PRIORITY +#if HAVE_INTEL_TBB + //TODO: fix MADNESS_CAN_USE_TBB_PRIORITY case + ThreadPool::tbb_arena->enqueue([]{ + task_ptr->run(); + }); + //TODO: is it needed ? task_ptr->comm.Barrier(); - // repeatedly hit TBB with binges of empty tasks to force it create threads - // and pick up RmiTask; - // paranoidal sanity-check against too many attempts - tbb::task* empty_root = - new (tbb::task::allocate_root()) tbb::empty_task; - empty_root->set_ref_count(1); - int binge_counter = 0; - const int max_binges = 10; while (!rmi_task_is_running) { - if (binge_counter == max_binges) - throw madness::MadnessException("MADWorld failed to launch RMI task", - "ntries > 10", - 10,__LINE__,__FUNCTION__,__FILE__); - const int NEMPTY = 1000000; - empty_root->add_ref_count(NEMPTY); - for (int i = 0; i < NEMPTY; i++) { - tbb::task* empty = - new (empty_root->allocate_child()) tbb::empty_task; -#ifdef MADNESS_CAN_USE_TBB_PRIORITY - tbb::task::enqueue(*empty, tbb::priority_high); -#else - tbb::task::enqueue(*empty); -#endif // MADNESS_CAN_USE_TBB_PRIORITY - ++binge_counter; - } myusleep(100000); } - empty_root->wait_for_all(); - tbb::task::destroy(*empty_root); - task_ptr->comm.Barrier(); #else - task_ptr = new RmiTask(comm); task_ptr->start(); #endif // HAVE_INTEL_TBB } diff --git a/src/madness/world/worldrmi.h b/src/madness/world/worldrmi.h index 9970ce3b5d7..098adbd55c5 100644 --- a/src/madness/world/worldrmi.h +++ b/src/madness/world/worldrmi.h @@ -186,7 +186,7 @@ namespace madness { class RmiTask #if HAVE_INTEL_TBB - : public tbb::task, private madness::Mutex + : private madness::Mutex #else : public madness::ThreadBase, private madness::Mutex #endif // HAVE_INTEL_TBB @@ -205,7 +205,7 @@ namespace madness { SafeMPI::Intracomm comm; const int nproc; // No. of processes in comm world const ProcessID rank; // Rank of this process - volatile bool finished; // True if finished + std::atomic finished; // True if finished std::unique_ptr send_counters; std::unique_ptr recv_counters; @@ -231,17 +231,17 @@ namespace madness { static void set_rmi_task_is_running(bool flag = true); #if HAVE_INTEL_TBB - tbb::task* execute() { + void run() { set_rmi_task_is_running(true); RMI::set_this_thread_is_server(true); while (! finished) process_some(); - finished = false; // to ensure that RmiTask::exit() that - // triggered the exit proceeds to completion RMI::set_this_thread_is_server(false); set_rmi_task_is_running(false); - return nullptr; + + finished = false; // to ensure that RmiTask::exit() that + // triggered the exit proceeds to completion } #else void run() { @@ -287,9 +287,6 @@ namespace madness { }; // class RmiTask -#if HAVE_INTEL_TBB - static tbb::task* tbb_rmi_parent_task; -#endif // HAVE_INTEL_TBB static RmiTask* task_ptr; // Pointer to the singleton instance static RMIStats stats; @@ -357,12 +354,8 @@ namespace madness { static void end() { if(task_ptr) { task_ptr->exit(); -#if HAVE_INTEL_TBB - tbb_rmi_parent_task->wait_for_all(); - tbb::task::destroy(*tbb_rmi_parent_task); -#else + //exit insures that RMI task is completed, therefore it is OK to delete it delete task_ptr; -#endif // HAVE_INTEL_TBB task_ptr = nullptr; } } From 4de8e10931941fe15858563973144e6d76cc35b7 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 27 Jul 2021 13:10:42 -0400 Subject: [PATCH 0155/1312] added missing #include tbb::split needs --- src/madness/world/range.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/madness/world/range.h b/src/madness/world/range.h index 752a9aa5f75..ebe9b8d86e0 100644 --- a/src/madness/world/range.h +++ b/src/madness/world/range.h @@ -34,6 +34,9 @@ #include #include +#ifdef HAVE_INTEL_TBB +# include +#endif /** \file range.h From c766d1c97bc0d86d16fac8d0c19f65a09152276a Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 27 Jul 2021 13:18:23 -0400 Subject: [PATCH 0156/1312] [ci] try using oneapi tbb on macos runners --- .github/workflows/cmake.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 0ed4cea8551..20122abcf58 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -49,11 +49,11 @@ jobs: - name: Install prerequisite MacOS packages if: ${{ matrix.os == 'macos-latest' }} run: | - brew install ninja gcc@10 boost eigen open-mpi bison tbb@2020 ccache + brew install ninja gcc@10 boost eigen open-mpi bison tbb ccache if [ "X${{ matrix.build_type }}" = "XDebug" ]; then brew install cereal fi - echo "TBBROOT=/usr/local/opt/tbb@2020" >> $GITHUB_ENV + echo "TBBROOT=/usr/local/opt/tbb" >> $GITHUB_ENV - name: Install prerequisites Ubuntu packages if: ${{ matrix.os == 'ubuntu-20.04' }} From 42ea3b5200f4064e4263d17695e57741adf30b47 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 27 Jul 2021 14:41:09 -0400 Subject: [PATCH 0157/1312] [ci] test with legacy and oneapi tbb --- .github/workflows/cmake.yml | 45 +++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 20122abcf58..adb64cbe522 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -11,7 +11,7 @@ jobs: matrix: build_type : [ Release, Debug ] os : [ macos-latest, ubuntu-20.04 ] - task_backend : [Pthreads, TBB, PaRSEC] + task_backend : [Threads, OneTBB, LegacyTBB, PaRSEC] # OneTBB and LegacyTBB control which version of TBB to install include: - os: ubuntu-20.04 cxx: /usr/bin/g++-9 @@ -35,8 +35,7 @@ jobs: -DMPIEXEC_PREFLAGS='--bind-to;none;--allow-run-as-root' -DENABLE_UNITTESTS=ON -DMADNESS_ENABLE_CEREAL=ON - -DMADNESS_TASK_BACKEND=${{ matrix.task_backend }} - -DMADNESS_BUILD_MADWORLD_ONLY=${{ matrix.task_backend != 'Pthreads' }} + -DMADNESS_BUILD_MADWORLD_ONLY=${{ matrix.task_backend != 'Threads' }} steps: - uses: actions/checkout@v2 @@ -46,20 +45,48 @@ jobs: # We'll use this as our working directory for all subsequent commands run: cmake -E make_directory ${{github.workspace}}/build + - name: Process task_backend + run: | + if [ "X${{ matrix.task_backend }}" = "XLegacyTBB" ]; then + echo "TASK_BACKEND=TBB" >> $GITHUB_ENV + fi + if [ "X${{ matrix.task_backend }}" = "XOneTBB" ]; then + echo "TASK_BACKEND=TBB" >> $GITHUB_ENV + fi + if [ "X${{ matrix.task_backend }}" = "XThreads" ]; then + echo "TASK_BACKEND=Pthreads" >> $GITHUB_ENV + fi + if [ "X${{ matrix.task_backend }}" = "XPaRSEC" ]; then + echo "TASK_BACKEND=PaRSEC" >> $GITHUB_ENV + fi + - name: Install prerequisite MacOS packages if: ${{ matrix.os == 'macos-latest' }} run: | - brew install ninja gcc@10 boost eigen open-mpi bison tbb ccache - if [ "X${{ matrix.build_type }}" = "XDebug" ]; then - brew install cereal + brew install ninja gcc@10 boost eigen open-mpi bison ccache + if [ "X${{ matrix.task_backend }}" = "XLegacyTBB" ]; then + brew install tbb@2020 + echo "TBBROOT=/usr/local/opt/tbb@2020" >> $GITHUB_ENV + fi + if [ "X${{ matrix.task_backend }}" = "XOneTBB" ]; then + brew install tbb + echo "TBBROOT=/usr/local/opt/tbb" >> $GITHUB_ENV fi - echo "TBBROOT=/usr/local/opt/tbb" >> $GITHUB_ENV - name: Install prerequisites Ubuntu packages if: ${{ matrix.os == 'ubuntu-20.04' }} run: | sudo apt-get update - sudo apt-get install ninja-build g++-9 liblapack-dev libboost-dev libboost-serialization-dev libeigen3-dev openmpi-bin libopenmpi-dev libtbb-dev ccache + sudo apt-get install ninja-build g++-9 liblapack-dev libboost-dev libboost-serialization-dev libeigen3-dev openmpi-bin libopenmpi-dev ccache + if [ "X${{ matrix.task_backend }}" = "XOneTBB" ]; then + wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB -O - | sudo apt-key add - + sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main" + sudo apt-get install intel-oneapi-tbb-devel + echo "TBBROOT=/opt/intel/oneapi/tbb/latest" >> $GITHUB_ENV + fi + if [ "X${{ matrix.task_backend }}" = "XLegacyTBB" ]; then + sudo apt-get install libtbb-dev + fi if [ "X${{ matrix.build_type }}" = "XDebug" ]; then sudo apt-get install libcereal-dev fi @@ -87,7 +114,7 @@ jobs: # Note the current convention is to use the -S and -B options here to specify source # and build directories, but this is only available with CMake 3.13 and higher. # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 - run: cmake $GITHUB_WORKSPACE $BUILD_CONFIG + run: cmake $GITHUB_WORKSPACE $BUILD_CONFIG -DMADNESS_TASK_BACKEND=$TASK_BACKEND - name: Build working-directory: ${{github.workspace}}/build From d1b09fa20b8c6e3901b45dcb06e7b1c8c0036a84 Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Thu, 5 Aug 2021 11:46:50 -0400 Subject: [PATCH 0158/1312] Update README.md --- README.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/README.md b/README.md index 4bf78661dba..f222595a060 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,51 @@ export MAD_ROOT_DIR=$MAD_ROOT_DIR `$MAD_ROOT_DIR` is the directory where madness was compiled. +# Install dependcies with conda +If you have `conda` available you can install madness like this. +In the following $MAD_SRC_DIR will denote the directory where you have the madness code and $MAD_ROOT_DIR will denote the directory where you will compile the code. +Optional you can install the `pno_integrals` executable and change the install dir with $MAD_INSTALL_DIR. +If you will install the `pno_integrals` executable will be in `$MAD_INSTALL_DIR/bin/pno_integrals`. +In the following code replace those placeholders: e.g. +$MAD_ROOT_DIR --> /whereever/you/want/to/have/it +or set the variables like +`MAD_ROOT_DIR=/wherever/you/want/to/have/it` + +```bash +# define your target directories +export MAD_SRC_DIR=... # add path to directory where you want the source code +export MAD_ROOT_DIR=...# add path to directory where you want the compiled code +export NUMCPP_SRC_DIR=...# add path to directory where you want the numcpp dependency +export MAD_INSTALL_DIR=...# add path to directory where you want the pno_integrals executable to be installed + +# get the sources +git clone https://github.com/kottmanj/madness.git $MAD_SRC_DIR +git clone https://github.com/dpilger26/numcpp $NUMCPP_SRC_DIR + +# install dependencies +conda install cmake mkl mpich boost + +# export paths to dependencies +export CPLUS_INCLUDE_PATH=$(realpath $NUMCPP_SRC_DIR/include):$CPLUS_INCLUDE_PATH + +# use this if you are having trouble with boost (there might be an older boost on your system, with this you make sure you are using the one installed above) +# export CPLUS_INCLUDE_PATH=$(realpath ~/anaconda3/envs/$ENVNAME/include/):$CPLUS_INCLUDE_PATH # replace $ENVNAME with the name of your environment + +# configure +cd $MAD_ROOT_DIR +cmake -D ENABLE_MKL=ON -D CMAKE_CXX_FLAGS='-O3 -DNDEBUG -march=native' $MAD_SRC_DIR + +# compile +make -j4 + +# install (optional) +make install +``` + +If you used `make_install` and the $MAD_INSTALL_DIR/bin directory is in your PATH tequila can detect the executable automatically. +If not, just make sure you export the MAD_ROOT_DIR variable. + + # Install on Ubuntu or similar In order to get the most out of madness you should install intel-mkl and configure madness with it. From 897ddf394c56c5a64c518bf4ac622afb7c41a818 Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Thu, 5 Aug 2021 11:49:42 -0400 Subject: [PATCH 0159/1312] Conda test (#2) * only install pno and pno_integrals --- src/CMakeLists.txt | 2 +- src/apps/CMakeLists.txt | 6 +++--- src/apps/cis/CMakeLists.txt | 2 +- src/apps/moldft/CMakeLists.txt | 2 +- src/apps/pno/CMakeLists.txt | 1 + src/apps/tdse/CMakeLists.txt | 2 +- src/examples/tiny.cc | 3 ++- src/madness/mra/CMakeLists.txt | 6 +++--- 8 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 01d35979068..611163dab86 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,7 +3,7 @@ add_subdirectory(madness) if(NOT MADNESS_BUILD_MADWORLD_ONLY AND LAPACK_FOUND) add_subdirectory(apps) - add_subdirectory(examples) + #add_subdirectory(examples) endif() install(FILES madness.h DESTINATION "${MADNESS_INSTALL_INCLUDEDIR}" diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt index b3da7ff9f67..09bda59e3eb 100644 --- a/src/apps/CMakeLists.txt +++ b/src/apps/CMakeLists.txt @@ -3,10 +3,10 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory(chem) -add_subdirectory(tdse) -add_subdirectory(moldft) +#add_subdirectory(tdse) +#add_subdirectory(moldft) add_subdirectory(pno) -add_subdirectory(cis) +#add_subdirectory(cis) #add_subdirectory(exciting) #add_subdirectory(hf) #add_subdirectory(ii) diff --git a/src/apps/cis/CMakeLists.txt b/src/apps/cis/CMakeLists.txt index 485aa53382c..d2b33f271d9 100644 --- a/src/apps/cis/CMakeLists.txt +++ b/src/apps/cis/CMakeLists.txt @@ -2,4 +2,4 @@ add_mad_executable(cis cis.cpp MADchem) -install(TARGETS cis DESTINATION "${MADNESS_INSTALL_BINDIR}") +#install(TARGETS cis DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index 78b4139e044..9d8e1e1a464 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -11,4 +11,4 @@ add_mad_executable(testpg testpg.cc MADchem) add_mad_executable(testperiodicdft testperiodicdft.cc MADchem) # removed mcpfit since it is likely only of historic interest -install(TARGETS moldft DESTINATION "${MADNESS_INSTALL_BINDIR}") +#install(TARGETS moldft DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/pno/CMakeLists.txt b/src/apps/pno/CMakeLists.txt index e79487c090e..a2cf60911e2 100644 --- a/src/apps/pno/CMakeLists.txt +++ b/src/apps/pno/CMakeLists.txt @@ -6,3 +6,4 @@ add_executable(pno_integrals pno_integrals.cpp) target_link_libraries(pno_integrals MADchem ${DISABLEPIE_LINKER_FLAG}) install(TARGETS pno DESTINATION "${MADNESS_INSTALL_BINDIR}") +install(TARGETS pno_integrals DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/tdse/CMakeLists.txt b/src/apps/tdse/CMakeLists.txt index 2bb187102ee..782093ab690 100644 --- a/src/apps/tdse/CMakeLists.txt +++ b/src/apps/tdse/CMakeLists.txt @@ -4,4 +4,4 @@ add_mad_executable(tdse tdse.cc MADmra) add_mad_executable(tdse4 tdse4.cc MADmra) -install(TARGETS tdse tdse4 DESTINATION "${MADNESS_INSTALL_BINDIR}") +#install(TARGETS tdse tdse4 DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/examples/tiny.cc b/src/examples/tiny.cc index 06f25934592..0707285d9f1 100644 --- a/src/examples/tiny.cc +++ b/src/examples/tiny.cc @@ -59,7 +59,7 @@ extern std::vector cubefile_header(std::string filename="input", co template void load_function(World& world, Function& pair, const std::string name) { if (world.rank()==0) print("loading function ", name); - + archive::ParallelInputArchive ar(world, name.c_str()); ar & pair; @@ -70,6 +70,7 @@ void load_function(World& world, Function& pair, const std::string FunctionDefaults<6>::set_thresh(pair.thresh()); std::string line="loaded function "+name; + pair.truncate(1.e-3); pair.print_size(line); } diff --git a/src/madness/mra/CMakeLists.txt b/src/madness/mra/CMakeLists.txt index efed5686128..901ff6cc542 100644 --- a/src/madness/mra/CMakeLists.txt +++ b/src/madness/mra/CMakeLists.txt @@ -18,10 +18,10 @@ set(MADMRA_SOURCES add_mad_library(mra MADMRA_SOURCES MADMRA_HEADERS "linalg;tinyxml;muparser" "madness/mra") # Create executables -add_mad_executable(mraplot "mraplot.cc" "MADmra") +#add_mad_executable(mraplot "mraplot.cc" "MADmra") # Install the MADmra library -install(TARGETS mraplot DESTINATION "${MADNESS_INSTALL_BINDIR}") +#install(TARGETS mraplot DESTINATION "${MADNESS_INSTALL_BINDIR}") install(FILES autocorr coeffs gaussleg DESTINATION "${MADNESS_INSTALL_DATADIR}" COMPONENT mra) @@ -49,4 +49,4 @@ if(ENABLE_UNITTESTS) add_mad_executable(${_test} "${_test}.cc" "MADmra") endforeach() -endif() \ No newline at end of file +endif() From bf5b1a749910a8322a5ed8831c9fd4d75535c6ad Mon Sep 17 00:00:00 2001 From: Anton Potapov Date: Mon, 9 Aug 2021 15:42:06 +0300 Subject: [PATCH 0160/1312] Reducing usage of deprecated tbb::task API - review comments adressed --- src/madness/world/thread.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/madness/world/thread.h b/src/madness/world/thread.h index b48effb6853..a92efc77eba 100644 --- a/src/madness/world/thread.h +++ b/src/madness/world/thread.h @@ -1308,7 +1308,9 @@ namespace madness { // else //#endif // MADNESS_CAN_USE_TBB_PRIORITY tbb_arena->enqueue( - [task_p = std::unique_ptr(task)](){ + //use unique_ptr to automatically delete task ptr + [task_p = std::unique_ptr(task)] () noexcept { + //exceptions are not expected here, as nobody will catch them for enqueued tasks task_p->execute(); }); #else From 2f649b77db306558db890ab5b5ddc6d75ab105a7 Mon Sep 17 00:00:00 2001 From: Anton Potapov Date: Mon, 9 Aug 2021 16:29:46 +0300 Subject: [PATCH 0161/1312] Reducing usage of deprecated tbb::task API - made RMI::task_ptr unique_ptr --- src/madness/world/worldrmi.cc | 5 ++--- src/madness/world/worldrmi.h | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/madness/world/worldrmi.cc b/src/madness/world/worldrmi.cc index 4d9d4bf5a55..c5692880563 100644 --- a/src/madness/world/worldrmi.cc +++ b/src/madness/world/worldrmi.cc @@ -46,7 +46,7 @@ namespace madness { - RMI::RmiTask* RMI::task_ptr = nullptr; + std::unique_ptr RMI::task_ptr = nullptr; RMIStats RMI::stats; volatile bool RMI::debugging = false; std::list< std::unique_ptr > RMI::send_req; @@ -399,10 +399,9 @@ namespace madness { } MADNESS_ASSERT(task_ptr == nullptr); - task_ptr = new RmiTask(comm); + task_ptr.reset(new RmiTask(comm)); #if HAVE_INTEL_TBB - //TODO: fix MADNESS_CAN_USE_TBB_PRIORITY case ThreadPool::tbb_arena->enqueue([]{ task_ptr->run(); }); diff --git a/src/madness/world/worldrmi.h b/src/madness/world/worldrmi.h index 098adbd55c5..ebfe66a3f23 100644 --- a/src/madness/world/worldrmi.h +++ b/src/madness/world/worldrmi.h @@ -288,7 +288,7 @@ namespace madness { }; // class RmiTask - static RmiTask* task_ptr; // Pointer to the singleton instance + static std::unique_ptr task_ptr; // Pointer to the singleton instance static RMIStats stats; static volatile bool debugging; // True if debugging @@ -355,7 +355,6 @@ namespace madness { if(task_ptr) { task_ptr->exit(); //exit insures that RMI task is completed, therefore it is OK to delete it - delete task_ptr; task_ptr = nullptr; } } From c91a4b36e7a2579b4ba4b4956ae6449a773943a8 Mon Sep 17 00:00:00 2001 From: Nicolas Poirier <32681309+npoirie1@users.noreply.github.com> Date: Wed, 3 Nov 2021 11:05:10 -0400 Subject: [PATCH 0162/1312] Fixed tofile function calls and input files (#7) --- src/apps/pno/input | 4 ++++ src/apps/pno/input_hylleraas_file | 4 ++++ src/apps/pno/input_hylleraas_internal | 4 ++++ src/apps/pno/pno_integrals.cpp | 10 +++++----- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/apps/pno/input b/src/apps/pno/input index ee8ca70b766..64b3c9e84ce 100644 --- a/src/apps/pno/input +++ b/src/apps/pno/input @@ -7,6 +7,7 @@ xc hf econv 1.e-4 dconv 3.e-4 k 7 +ncf (none,1.0) end pno @@ -18,6 +19,9 @@ f12 gamma 1.4 end +pnoint +end + geometry he 0.0 0.0 0.0 end diff --git a/src/apps/pno/input_hylleraas_file b/src/apps/pno/input_hylleraas_file index bc7dfdd374c..ff0d9850d24 100644 --- a/src/apps/pno/input_hylleraas_file +++ b/src/apps/pno/input_hylleraas_file @@ -12,6 +12,7 @@ xc hf econv 1.e-4 dconv 3.e-4 k 7 +ncf (none,1.0) end pno @@ -24,6 +25,9 @@ auxbas auxbas_example energytype hylleraas end +pnoint +end + geometry eprec 1.e-6 he 0.0 0.0 0.0 diff --git a/src/apps/pno/input_hylleraas_internal b/src/apps/pno/input_hylleraas_internal index 2affb3c2f87..3a9fcf8aeeb 100644 --- a/src/apps/pno/input_hylleraas_internal +++ b/src/apps/pno/input_hylleraas_internal @@ -11,6 +11,7 @@ xc hf econv 1.e-4 dconv 3.e-4 k 7 +ncf (none,1.0) end pno @@ -23,6 +24,9 @@ energytype hylleraas auxbas he-4s3p2d1f end +pnoint +end + geometry eprec 1.e-6 he 0.0 0.0 0.0 diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index 30f0e858700..ebffd152925 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -114,7 +114,7 @@ int main(int argc, char** argv) { std::cout << "\n\n"; std::cout << "This script will run PNO-MP2 and print out tensors in binary\n"; - std::cout << "Call as: pno_integrals inputfile"; + std::cout << "Call as: pno_integrals inputfile\n"; std::cout << "input is " << input << "\n"; } @@ -726,17 +726,17 @@ int main(int argc, char** argv) { // save integrals to binary files h = h.flat(); nc::NdArray hh(h.ptr(), h.size(), 1); - hh.tofile(name+"_htensor.bin", ""); + hh.tofile(name+"_htensor.bin"); g = g.flat(); nc::NdArray gg(g.ptr(), g.size(), 1); - gg.tofile(name+"_gtensor.bin", ""); + gg.tofile(name+"_gtensor.bin"); if (cabs_switch) { f = f.flat(); nc::NdArray ff(f.ptr(), f.size(), 1); - ff.tofile(name+"_f12tensor.bin", ""); + ff.tofile(name+"_f12tensor.bin"); } if (not orthogonalize || paramsint.print_pno_overlap()){ @@ -752,7 +752,7 @@ int main(int argc, char** argv) { if (not orthogonalize) { S = S.flat(); nc::NdArray gg(S.ptr(), S.size(), 1); - gg.tofile(name+"_overlap.bin", ""); + gg.tofile(name+"_overlap.bin"); } } From d5be23f51d3652b51168bd0a889386adab326e44 Mon Sep 17 00:00:00 2001 From: Jakob Kottmann Date: Sat, 27 Nov 2021 11:32:21 -0500 Subject: [PATCH 0163/1312] added build script --- build.sh | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 build.sh diff --git a/build.sh b/build.sh new file mode 100644 index 00000000000..79e6bcf1de3 --- /dev/null +++ b/build.sh @@ -0,0 +1,60 @@ +# check if conda is there +if ! command -v conda &> /dev/null +then + echo "conda is not installed" + exit 1 +fi + +set -e + +# install compilers (linux only: others need to install manually) +echo building on $(uname -a) +os=$(uname -a | cut -d ' ' -f 1) +if [ "$os" = "Linux" ]; then + echo "This is a Linux system, we can install compilers with conda" + conda install gxx_linux-64 -y +else + echo "please check and install compilers g++ >8 and mpich manually" +fi + + +# define your target directories +# to override: just call the script like e.g. "CC=whatever bash build.sh" +CC=${CC-mpicc} +MPI_CC=${MPI_CC-mpicc} +CXX=${CXX-mpicxx} +MPI_CXX=${MPI_CXX-mpicxx} +MAD_SRC_DIR=${MAD_SRC_DIR-madness_src} +MAD_ROOT_DIR=${MAD_ROOT_DIR-madness} +NUMCPP_SRC_DIR=${NUMCPP_SRC_DIR-numcpp} + +mkdir ${MAD_ROOT_DIR} + +export MAD_SRC_DIR=${MAD_SRC_DIR} # add path to directory where you want the source code +export MAD_ROOT_DIR=${MAD_ROOT_DIR} # add path to directory where you want the compiled code +export NUMCPP_SRC_DIR=${NUMCPP_SRC_DIR} # add path to directory where you want the numcpp dependency + +# make sure that tequila will find it later +echo "added by madness install script" >> ~/.bashrc +echo "export MAD_ROOT_DIR=${MAD_ROOT_DIR}" >> ~/.bashrc + +# get the sources +git clone https://github.com/kottmanj/madness.git $MAD_SRC_DIR +git clone https://github.com/dpilger26/numcpp $NUMCPP_SRC_DIR + +# install dependencies +conda install cmake mkl mpich boost -y + +# export paths to dependencies +export CPLUS_INCLUDE_PATH=$(realpath $NUMCPP_SRC_DIR/include):$CPLUS_INCLUDE_PATH +# make sure that the right boost and mkl are found and used +export CPLUS_INCLUDE_PATH=$(realpath $CONDA_PREFIX/include):$CPLUS_INCLUDE_PATH + +cmake -D ENABLE_MKL=ON -D CMAKE_CXX_FLAGS='-O3 -DNDEBUG -march=native' -S $MAD_SRC_DIR -B $MAD_ROOT_DIR + +# compile +make -j -C $MAD_ROOT_DIR + +# add MAD_ROOT_DIR to conda env +conda env config vars set MAD_ROOT_DIR=$(realpath ${MAD_ROOT_DIR}) +~ From 74d6b3effd8b62a33f6b7af55faf61c66fe35b85 Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Sat, 27 Nov 2021 11:46:37 -0500 Subject: [PATCH 0164/1312] Update README.md --- README.md | 78 +++++++++++++++++++++++++------------------------------ 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index f222595a060..bbe12ddf66e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +Fork Info +======= +This is a seaparate fork of madness. If you want to use madness as backend for [tequila](https://github/tequilahub) you are in the right place. +Just follow the installation instructions below. + madness ======= @@ -13,7 +18,7 @@ Here's a [video](http://www.youtube.com/watch?v=dBwWjmf5Tic) about MADNESS. # Tequila Support -This fork of madness holds the necessary structures to interface with [tequila](https://github.com/aspuru-guzik-group/tequila). +This fork of madness holds the necessary structures to interface with [tequila](https://github.com/tequilahub). Those part of the code are currently not merged into the main madness repository (but will be at some point). Follow the next section to install madness. @@ -25,52 +30,27 @@ export MAD_ROOT_DIR=$MAD_ROOT_DIR `$MAD_ROOT_DIR` is the directory where madness was compiled. +If you are using conda environments and follow the instructions below, the `MAD_ROOT_DIR` variable will automatically be exported in the environment you are using. + # Install dependcies with conda -If you have `conda` available you can install madness like this. -In the following $MAD_SRC_DIR will denote the directory where you have the madness code and $MAD_ROOT_DIR will denote the directory where you will compile the code. -Optional you can install the `pno_integrals` executable and change the install dir with $MAD_INSTALL_DIR. -If you will install the `pno_integrals` executable will be in `$MAD_INSTALL_DIR/bin/pno_integrals`. -In the following code replace those placeholders: e.g. -$MAD_ROOT_DIR --> /whereever/you/want/to/have/it -or set the variables like -`MAD_ROOT_DIR=/wherever/you/want/to/have/it` +If you have `conda` available you can install this version of madness by executing the [`build.sh`](build.sh) script. +If you are on a Linux system this will also install the necessary compilers. +Fot Mac or Win you will need to install them yourself (you need at least GNU c++ compilers >7 and a suitable MPI compiler like MPICH). +Some notes on manual installation are listed below. ```bash -# define your target directories -export MAD_SRC_DIR=... # add path to directory where you want the source code -export MAD_ROOT_DIR=...# add path to directory where you want the compiled code -export NUMCPP_SRC_DIR=...# add path to directory where you want the numcpp dependency -export MAD_INSTALL_DIR=...# add path to directory where you want the pno_integrals executable to be installed - -# get the sources -git clone https://github.com/kottmanj/madness.git $MAD_SRC_DIR -git clone https://github.com/dpilger26/numcpp $NUMCPP_SRC_DIR - -# install dependencies -conda install cmake mkl mpich boost - -# export paths to dependencies -export CPLUS_INCLUDE_PATH=$(realpath $NUMCPP_SRC_DIR/include):$CPLUS_INCLUDE_PATH - -# use this if you are having trouble with boost (there might be an older boost on your system, with this you make sure you are using the one installed above) -# export CPLUS_INCLUDE_PATH=$(realpath ~/anaconda3/envs/$ENVNAME/include/):$CPLUS_INCLUDE_PATH # replace $ENVNAME with the name of your environment - -# configure -cd $MAD_ROOT_DIR -cmake -D ENABLE_MKL=ON -D CMAKE_CXX_FLAGS='-O3 -DNDEBUG -march=native' $MAD_SRC_DIR - -# compile -make -j4 - -# install (optional) -make install +# download or copy the build.sh script +bash build.sh ``` +You can modify where you want the compiled madness code to be placed with the variable `MADNESS_BUILD`, e.g. +```bash +MADNESS_BUILD=~/mystuff/ bash build.sh +``` +In the same manner you can set different other variables (just check the content of [`build.sh`](build.sh)) -If you used `make_install` and the $MAD_INSTALL_DIR/bin directory is in your PATH tequila can detect the executable automatically. -If not, just make sure you export the MAD_ROOT_DIR variable. - +# Install dependencies without conda -# Install on Ubuntu or similar +In case you are not using conda environments, here is how you can install dependencies manually (might be necessary on some compute clusters). In order to get the most out of madness you should install intel-mkl and configure madness with it. You can download and install it from the intel website, it is free. @@ -103,7 +83,7 @@ sudo apt-get install -y mpich ``` and cmake will detect it automatically. -## MPICH on Clusters +## MPICH on Clusters (no root rights) Check if you can load an mpich module. Alternative OpenMPI or IntelMPI might work. It depends on compiler version and which c++ compiler is used in the end. @@ -164,7 +144,8 @@ Note that boost versions installed with `apt-get` are too old (need 1.68 or high ## Install Madness We use the following directories: `$MADSOURCE`: The directory with the madness source code -`$MAD_ROOT_DIR`: The directory with the compiled madness code +`$MAD_ROOT_DIR`: The directory with the compiled madness code +either export both variables, or replace them by the corresponding paths in the following. Get the sources (note that the `tequila` branch should be checked out, it is the default in this fork): ```bash @@ -185,6 +166,17 @@ cd $MAD_ROOT_DIR make ``` +## Let tequila know where madness was compiled +tequila will look for the `MAD_ROOT_DIR` variable in your system. This should contain the path to the directory where madness was compiled above (the directory where the `cmake` and `make` commands where executed. +Export like +```bash +export MAD_ROOT_DIR=/path/to/where/it/was/compiled/ +``` +in order to test if you have the right path, make sure that the following executable exists +```bash +$MAD_ROOT_DIR/src/apps/pno/pno_integrals +``` + # Use with Docker If you are getting frustrated with the madness compilation you can resort to a Docker image. In the following there will be a short description how to make it work with tequila. From bc140a024b8ca70b91c18acb318aa17866c8e310 Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Sat, 27 Nov 2021 11:47:54 -0500 Subject: [PATCH 0165/1312] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bbe12ddf66e..8e31dcc6afb 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ Some notes on manual installation are listed below. ```bash # download or copy the build.sh script +# then run the following command to install bash build.sh ``` You can modify where you want the compiled madness code to be placed with the variable `MADNESS_BUILD`, e.g. From 827b714aa8cd737e33a7cac6de0ad403dcbb5b0b Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Sat, 27 Nov 2021 11:49:32 -0500 Subject: [PATCH 0166/1312] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8e31dcc6afb..f179433425e 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ export MAD_ROOT_DIR=$MAD_ROOT_DIR If you are using conda environments and follow the instructions below, the `MAD_ROOT_DIR` variable will automatically be exported in the environment you are using. -# Install dependcies with conda +# Install with conda If you have `conda` available you can install this version of madness by executing the [`build.sh`](build.sh) script. If you are on a Linux system this will also install the necessary compilers. Fot Mac or Win you will need to install them yourself (you need at least GNU c++ compilers >7 and a suitable MPI compiler like MPICH). @@ -49,7 +49,7 @@ MADNESS_BUILD=~/mystuff/ bash build.sh ``` In the same manner you can set different other variables (just check the content of [`build.sh`](build.sh)) -# Install dependencies without conda +# Install without conda In case you are not using conda environments, here is how you can install dependencies manually (might be necessary on some compute clusters). From e65424b91f7bf3894dd43dde84029be20a5ad3c4 Mon Sep 17 00:00:00 2001 From: jscanderson Date: Sun, 19 Dec 2021 15:53:34 -0500 Subject: [PATCH 0167/1312] cleanup in prep for merge --- README_JOEL => src/apps/dirac/README | 0 src/apps/moldft/CMakeLists.txt | 3 - src/apps/moldft/DFdriver.pbs | 71 ----- src/apps/moldft/DKhydrogen3.cc | 244 --------------- src/apps/moldft/Plot_VTK.h | 77 ----- src/apps/moldft/input | 52 +--- src/apps/moldft/rk-2.cc | 435 --------------------------- src/madness/mra/derivative.h | 2 +- src/madness/mra/funcimpl.h | 29 +- src/madness/mra/gfit.h | 2 +- src/madness/mra/mra.h | 1 - src/madness/tensor/mxm.h | 7 +- src/madness/world/worlddc.h | 6 +- 13 files changed, 20 insertions(+), 909 deletions(-) rename README_JOEL => src/apps/dirac/README (100%) delete mode 100644 src/apps/moldft/DFdriver.pbs delete mode 100644 src/apps/moldft/DKhydrogen3.cc delete mode 100644 src/apps/moldft/Plot_VTK.h delete mode 100644 src/apps/moldft/rk-2.cc diff --git a/README_JOEL b/src/apps/dirac/README similarity index 100% rename from README_JOEL rename to src/apps/dirac/README diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index b51df71927c..78b4139e044 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -10,8 +10,5 @@ add_mad_executable(testpg testpg.cc MADchem) add_mad_executable(testperiodicdft testperiodicdft.cc MADchem) -add_executable(dk DKhydrogen3.cc) -target_link_libraries(dk MADchem MADmra -lgmp -lmpfr) - # removed mcpfit since it is likely only of historic interest install(TARGETS moldft DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/moldft/DFdriver.pbs b/src/apps/moldft/DFdriver.pbs deleted file mode 100644 index 5da9c4b118d..00000000000 --- a/src/apps/moldft/DFdriver.pbs +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -#PBS -l nodes=8:ppn=28,walltime=24:00:00 -#PBS -q long -#PBS -N DFdriver -#PBS -j oe - - -#14 cores per socket = OS+MPI+unknown+madness -export I_MPI_FABRICS=shm:ofa -export MAD_NUM_THREADS=11 -export I_MPI_PIN_DOMAIN=socket -#export I_MPI_HYDRA_BOOTSTRAP=rsh -#export MAD_SEND_BUFFERS=512 -#export MAD_RECV_BUFFERS=512 -#export REMORA_MODE=FULL - -MY_EXE=/gpfs/home/jscanderson/src/madness/src/apps/moldft/DFdriver -MY_OUTPUT=/gpfs/home/jscanderson/src/madness/src/apps/moldft/OutputFiles/DFdriver -MY_JOB_MESSAGE='Debugging contant hung queues. Got it to hang again. Running 5 times with lineplots turned on' - -cd $PBS_O_WORKDIR - -#Checks to see if output file already exists, if so changes filename -if [[ -e $MY_OUTPUT.out ]] ; then - i=2 - while [[ -e $MY_OUTPUT-$i.out ]] ; do - let i++ - done - MY_OUTPUT=$MY_OUTPUT-$i -fi -MY_OUTPUT=$MY_OUTPUT.out - - -#gets hosts, writes those to output -sort < $PBS_NODEFILE | uniq > $$.hosts -let NPROC=$PBS_NUM_NODES*2 -cat $$.hosts &> $MY_OUTPUT - -#write job message to output -echo &>> $MY_OUTPUT -echo 'Job message:' &>> $MY_OUTPUT -echo $MY_JOB_MESSAGE &>> $MY_OUTPUT -echo &>> $MY_OUTPUT - -# Now run the job -#mpirun -npernode 2 $MY_EXE DFinput_He &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_Be &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_Ne &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_Mg &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_Ar &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_Ca &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_Zn &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_Kr &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_Xe &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_HF &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_N2 &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_BH3 &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_H2O &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_H2S &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput_H2Se &>> $MY_OUTPUT -#mpirun -npernode 2 $MY_EXE DFinput &>> $MY_OUTPUT -#remora mpirun -npernode 2 $MY_EXE DFinput &>> $MY_OUTPUT - -#Use with -mpirun -f $$.hosts -ppn 2 -n $NPROC $MY_EXE DFinput &>> $MY_OUTPUT -mpirun -f $$.hosts -ppn 2 -n $NPROC $MY_EXE DFinput &>> $MY_OUTPUT -mpirun -f $$.hosts -ppn 2 -n $NPROC $MY_EXE DFinput &>> $MY_OUTPUT -mpirun -f $$.hosts -ppn 2 -n $NPROC $MY_EXE DFinput &>> $MY_OUTPUT -mpirun -f $$.hosts -ppn 2 -n $NPROC $MY_EXE DFinput &>> $MY_OUTPUT - diff --git a/src/apps/moldft/DKhydrogen3.cc b/src/apps/moldft/DKhydrogen3.cc deleted file mode 100644 index 5b5c01dfda5..00000000000 --- a/src/apps/moldft/DKhydrogen3.cc +++ /dev/null @@ -1,244 +0,0 @@ -//Solves for the ground state energy of the hydrogenic atom -//Using first-order Douglas Kroll -// -//TODO: -//1. Update operators. Current ones are only accurate to ~1e-10 (fixed, I think) -//2. Update rele, calculating the expectation value of the Hamiltonian: Using the straight potential is wrong. - -#include -#include -#include -#include //for atoi -#include -#include "DKops.h" - -using namespace madness; - -static const long k = 8; //wavelet order in madness -static const double thresh = 1e-6; //desired precision when refining -static const double speedoflight = 137.0359895; //speed of light -static const double PI = constants::pi; //mmm, pie -static const double small = 1e-8; // shortest length scale we want to resolve - -static double ttt; -static void START_TIMER(World& world){ - world.gop.fence(); - ttt=wall_time(); -} - -static void END_TIMER(World& world, char* message){ - world.gop.fence(); - ttt = wall_time() - ttt; - if(world.rank()==0) print(message, ttt); -} - -//Functor to make the nuclear potential, slightly perturbed to remove singularity -class PotentialFunctor : public FunctionFunctorInterface { - private: - int m_Z; - public: - PotentialFunctor(int Z){ - m_Z = Z; - } - double operator() (const coord_3d&r) const { - return -m_Z/(sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]+small*small)); - } -}; - -//norelativistic ground state functor -class NRGFunctor : public FunctionFunctorInterface { - private: - int m_Z; - - public: - NRGFunctor(int Z){ - m_Z = Z; - } - - double operator() (const coord_3d& r) const { - return std::exp(-m_Z*std::sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]+small*small)); - } - -}; - -double exact_energy(double Z) { - double c = speedoflight; - double d = sqrt(1 - Z*Z/(c*c)); - return c*c / sqrt(1.0 + Z*Z/(c*c*d*d)) - c*c; // may lose a few digits -} - - -double rele(World& world, const real_function_3d& psi, const real_function_3d Vpsi, real_convolution_3d& Pbarop, real_function_3d& Vnuc){ - if(world.rank() == 0) print("Now in rele"); - real_function_3d result = real_factory_3d(world); - double answer(0.0); - for(int axis = 0; axis < 3; axis++){ - real_derivative_3d D = free_space_derivative(world,axis); - real_function_3d dpsi = D(psi); - dpsi = D(dpsi); - result -= 0.5*dpsi; - } - - answer = inner(psi,result)/inner(psi,psi); - if(world.rank()==0) print(" Nonrelativistic KE: ", answer); - - result = apply(Pbarop, result); - result.scale(2.0*speedoflight); - answer = inner(psi,result)/inner(psi,psi); - - answer = answer/pow(2.0*PI,1.5); //I can't find this factor in my notes but I know it's here..... - - if(world.rank()==0) print(" Relativistic KE: ", answer); - - double PE = inner(psi, Vnuc*psi)/inner(psi,psi); - - if(world.rank()==0) print("Non-adjusted potential energy: ", PE); - - //double PE = inner(psi,Vpsi)/inner(psi,psi); //not really the potential energy - - //if(world.rank()==0) print(" Adjusted potential energy: ", PE); - - return answer + PE; -} - -real_function_3d makerightside(World& world, real_function_3d& V, real_function_3d& psi, real_convolution_3d& PbarAop, real_convolution_3d& Aop){ - - if(world.rank()==0) print("now in makerightside"); - real_function_3d Vpsi = V*psi; - Vpsi.truncate(); - real_function_3d AVpsi = apply(Aop,Vpsi); - real_function_3d VApsi = V*apply(Aop,psi); - real_function_3d AVApsi = apply(Aop,VApsi); - - real_function_3d result = 4.0*pow(PI,3.0)*Vpsi + 2.0*pow(PI,1.5)*(AVpsi + VApsi) + AVApsi; - //result = pow(2.0*PI,-1.5)*result; - //real_function_3d result = 0.5*Vpsi + (1.0/sqrt(2.0))*(AVpsi + VApsi) + AVApsi; - - - //double ttemp = inner(psi,result)/inner(psi,psi); - //if(world.rank()==0) print("AVApsi expectation value:", ttemp); - if(world.rank()==0) print(" made functions"); - - result = pow(2*PI,-3.0)*result; //I can't find this factor in my notes either, but it has to be in here.... - result.truncate(); - - real_function_3d temporary(world); - for(int axis=0; axis<3; axis++){ - real_derivative_3d D = free_space_derivative(world,axis); - real_function_3d t = D(psi); - t = apply(PbarAop,t); - t = V*t; - t = D(t); - t = apply(PbarAop,t); - temporary += t; - } - temporary = pow(2.0*PI,-1.5)*temporary; - - //ttemp = inner(temporary,psi)/inner(psi,psi); - //if(world.rank()==0) print("APVPApsi expectation value: ", ttemp); - if(world.rank()==0) print("made result"); - - result = result + temporary; - - //ttemp = result.norm2(); - //if(world.rank()==0) print("Made a rightside! Norm is: ", ttemp); - - return result; -} - -double iterate(World& world, real_function_3d Vpsi, real_function_3d& psi, real_convolution_3d& Ebarop){ - - Vpsi.truncate(); //Vpsi should already contain the result of makerightside - Vpsi.scale(-1.0); //move Vpsi to the right hand side of the equation - - real_function_3d tmp = apply(Ebarop, Vpsi); - double norm = tmp.norm2(); - tmp.scale(1.0/norm); - real_function_3d residual = psi-tmp; - double resid = residual.norm2(); - if(world.rank()==0) print("Residual: ", resid); - psi = tmp; - - return resid; - - -} - -int main(int argc, char** argv){ - //set up parallel environment (this is boiler-plate) - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); - startup(world,argc,argv); - std::cout.precision(10); - int Z = atoi(argv[1]); - - //some of our madness parameters depend on Z: - const double L = 46.0/Z; - const double initialguessenergy = -Z*Z/2.0; - - - //Set necessary madness parameters - FunctionDefaults<3>::set_k(k); - FunctionDefaults<3>::set_thresh(thresh); - FunctionDefaults<3>::set_truncate_mode(1); - FunctionDefaults<3>::set_cubic_cell(-L/2,L/2); - //FunctionDefaults<3>::set_initial_level(5); - - - //Starting guess is the nonrelativistic exact solution - NRGFunctor nonrelguess(Z); - real_function_3d psi = real_factory_3d(world).functor(nonrelguess); - double normconst = psi.norm2(); - psi.scale(1.0/normconst); - - //make potential - PotentialFunctor myV(Z); - real_function_3d Vnuc = real_factory_3d(world).functor(myV).truncate_mode(0); - - - //make operators - real_convolution_3d Pbarop = Pbar(world); - real_convolution_3d Aop = A(world); - real_convolution_3d PbarAop = PbarA(world); - real_function_3d rightside = makerightside(world, Vnuc, psi, PbarAop, Aop); - - - double energy = initialguessenergy; - const double exact = exact_energy(Z); - double residual = 1.0/thresh; - int iter = 1; - if(world.rank()==0) { - print("\n Box Width: ", L); - print(" Wavelet Order: ", k); - print(" Refinement Threshold: ", thresh); - print(" Z: ", Z); - print(" Exact Dirac Energy: ", exact); - print(" Starting Energy: ", energy, "\n"); - } - - - //iterate solution - //while(residual > sqrt(thresh)){ - while(residual > sqrt(thresh)/10.0 or iter < 4){ - psi.truncate(); - if(world.rank()==0) print("Iteration: ", iter++); - real_convolution_3d Ebarop = Ebar(world,energy); - residual = iterate(world, rightside, psi, Ebarop); - rightside = makerightside(world, Vnuc, psi, PbarAop, Aop); - energy = rele(world, psi, rightside, Pbarop, Vnuc); - if(world.rank()==0) print("Energy: ", energy); - //energy = exact; - } - - if(world.rank()==0) { - print("\nFinal Energy: ", energy); - print("Calculated Relativistic Correction: ", initialguessenergy - energy); - print("Scaled Energy (-eps/Z^2): ", -energy/(Z*Z), "\n"); - } - - world.gop.fence(); - finalize(); - return 0; -} - -//kthxbye diff --git a/src/apps/moldft/Plot_VTK.h b/src/apps/moldft/Plot_VTK.h deleted file mode 100644 index 972c170d63d..00000000000 --- a/src/apps/moldft/Plot_VTK.h +++ /dev/null @@ -1,77 +0,0 @@ -/* My function to save a vtk file that visit can use - * - * Input params: - * - * npt_plot - number of points in each direction for plot - * L - box size - * plotlo - lowest orbital number to plot - * plothi - highest orbital number to plot - * molecule - molecule object, for creating the .xyz file - * densities - vector of densities to be ploted - * name - name you would like for orbital plots - */ -void do_vtk_plots(World& world, - int npt_plot, - double L, - int plotlo, - int plothi, - Molecule molecule, - std::vector densities, - std::string name) -{ - // Stuff needed to plot - std::string b; - const char* filename; - Vector points{npt_plot, npt_plot, npt_plot}; - - // Plot the whole box? - Vector box_lo{-L, -L,-L}; - Vector box_hi{ L, L, L}; - - // Write an .xyz file with current geometry (to deal with molecular reorientations that might occur) - FILE *f = 0; - b = "geometry.xyz"; - f = fopen(b.c_str(), "w"); - - // Write the header - fprintf(f,"%d", molecule.natom()); - fprintf(f,"\n\n"); - - // Get the data - std::vector< Vector > coords = molecule.get_all_coords_vec(); - - // Write the data - for(int i = 0; i < molecule.natom(); i++) - { - std::fprintf(f, "%5s %16.12f %16.12f %16.12f\n", atomic_number_to_symbol(molecule.get_atom_number(i)).c_str(), coords[i][0], coords[i][1], coords[i][2]); - } - - // Clean up - fclose(f); - - // Needed to plot the full electron density - real_function_3d rho = real_factory_3d(world); - - // Plot each orbital requested - for (int i = plotlo; i < plothi; i++) - { - // Add to total - rho += densities[i]; - - // Create filename in such a way that visit associates them together - b = name + "_" +std::to_string(i) + ".vts"; - filename = b.c_str(); - - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(densities[i], "electrondensity", world, filename, box_lo, box_hi, points, true, false); - plotvtk_end<3>(world, filename, true); - } - - // Plot the full density - b = "total-electrondensity.vts"; - filename= b.c_str(); - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(rho, "total-electrondensity", world, filename, box_lo, box_hi, points, true, false); - plotvtk_end<3>(world, filename, true); -} diff --git a/src/apps/moldft/input b/src/apps/moldft/input index 14853ca4fbd..220b508d99d 100644 --- a/src/apps/moldft/input +++ b/src/apps/moldft/input @@ -1,30 +1,9 @@ dft - xc Hf + xc LDA maxsub 5 - protocol 1e-4 1e-6 - k 12 - canon - save true end #xc GGA_X_PBE .75 GGA_C_PBE 1. HF_X .25 -geometry - S 0.0 -0.144329 -0.526855 - H 0.0 -1.880889 1.281475 - H 0.0 1.778267 1.080687 -end - -geometry - He 0.0 0.0 0.0 -end - -geometry - Se -1.4905006099 0.7338066337 -0.0885972121 - H 0.0251541168 0.8917228966 0.1076319820 - H -1.7582384563 1.6823418413 1.0900673282 -end - - # water*1 geometry O 0.0 0.0 0.0 @@ -32,35 +11,6 @@ geometry H -1.4375 0.0 1.15 end -geometry - B 0.16963984 0.12447403 -0.06316061 - H -0.03706239 0.02808500 2.16758150 - H 0.26127104 -1.76716998 -1.26350202 - H 0.28937654 2.11297478 -1.09371745 -end - -geometry - N 0.0 0.0 -1.00661983 - N 0.0 0.0 1.00661983 -end - -geometry - H 0.0 0.0 -2.048537 - F 0.0 0.0 -0.351463 -end - -geometry - Zn 0.0 0.0 0.0 -end - -geometry - units angstrom - Hg 0.0 0.0 0.0 - Hg 1.0174310209 2.0491370411 0.0 -end - - - # water dimer geometry units angstrom diff --git a/src/apps/moldft/rk-2.cc b/src/apps/moldft/rk-2.cc deleted file mode 100644 index e0505d72f9d..00000000000 --- a/src/apps/moldft/rk-2.cc +++ /dev/null @@ -1,435 +0,0 @@ -#include -#include -#include -#include -#include - -void apbar_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); -void pbar_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); -void a_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); -void tbar_fit(double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); -void bshrel_fit(double epsilon, double dx, double thresh, double quadacc, std::vector& coeffs, std::vector& expnts, double& Cdelta); - -using namespace madness; - -static double Z = -1; - -// Nuclear half-charge radius of H (proton) is 1.3e-5 and the exponent -// of its finite-size Gaussian approximation is 2.12e9. So this -// choice for dx resolves one-two orders of magnitude finer scale. -static const double op_dx=1e-16; //TRY CHANGING THIS 1e-16 -static const double op_quadacc=1e-8; //FIND ALL INSTANCES OF THIS AND DEAL WITH IT -static const double op_thresh=1e-8; - -static const long k = 10; // wavelet order -static const double thresh = 1e-8; // precision -static const double L = 50.0; // box size - -static const bool FINITENUC = false; - -// Pick ONE of the following three -static const bool NONREL = false; -static const bool RK = false; -static const bool DK1 = true; - -class FiniteNucleusPotential : public FunctionFunctorInterface { - const double xi; - - static double expnt(int Z) { - const Vector xi - {2.1248239171e+09,1.1671538870e+09,8.9266848806e+08,7.8788802914e+08,7.1178709563e+08,6.8077502929e+08,6.2865615725e+08,5.8631436655e+08,5.3546911034e+08,5.2105715255e+08,4.8349721509e+08,4.7254270882e+08,4.4335984491e+08,4.3467748823e+08,4.1117553148e+08,4.0407992047e+08,3.8463852873e+08,3.5722217300e+08,3.6228128110e+08,3.5722217300e+08,3.3451324570e+08,3.2263108827e+08,3.1181925878e+08,3.0842641793e+08,2.9881373610e+08,2.9578406371e+08,2.8716667270e+08,2.8996391416e+08,2.7665979354e+08,2.7419021043e+08,2.6267002737e+08,2.5235613399e+08,2.5042024280e+08,2.4130163719e+08,2.4305454351e+08,2.3461213272e+08,2.3301551109e+08,2.2839354730e+08,2.2690621893e+08,2.2544431039e+08,2.2120420724e+08,2.1458511597e+08,2.1458511597e+08,2.0965270287e+08,2.0846586999e+08,2.0500935221e+08,2.0389047621e+08,1.9648639618e+08,1.9548577691e+08,1.9067718154e+08,1.8975246242e+08,1.8193056289e+08,1.8444240538e+08,1.8030529331e+08,1.7950688281e+08,1.7565009043e+08,1.7490463170e+08,1.7416744147e+08,1.7343837120e+08,1.7129844956e+08,1.7060044589e+08,1.6591550422e+08,1.6527352089e+08,1.6215880671e+08,1.6155419421e+08,1.5977529080e+08,1.5977529080e+08,1.5636673634e+08,1.5581702004e+08,1.5314257850e+08,1.5262201512e+08,1.5008710340e+08,1.4959325643e+08,1.4813689532e+08,1.4671710337e+08,1.4442808782e+08,1.4398142103e+08,1.4309883584e+08,1.4223027307e+08,1.4011788914e+08,1.3888925203e+08,1.3768840081e+08,1.3729411599e+08,1.3729411599e+08,1.3690277000e+08,1.3242350205e+08,1.3206733609e+08,1.3101367628e+08,1.3066730974e+08,1.2897067480e+08,1.2930539512e+08,1.2700881714e+08,1.2733038109e+08,1.2512299012e+08,1.2543221826e+08,1.2420711085e+08,1.2420711085e+08,1.2301273547e+08,1.2271879740e+08,1.2127611477e+08,1.2099285491e+08,1.2071131346e+08,1.1987683191e+08,1.2015331850e+08,1.1987683191e+08,1.1960199758e+08,1.1987683191e+08,1.1905722195e+08,1.1878724932e+08}; - - if (Z < 1) return 1.0/(op_dx*op_dx); // Use point charge if Z<1 - else return xi[Z]; - } - -public: - FiniteNucleusPotential(int Z) : xi(expnt(Z)) {} - - double operator()(const coord_3d& r) const { - const double x=r[0], y=r[1], z=r[2]; - const double R=sqrt(x*x+y*y+z*z); - const double arg=R*sqrt(xi); - double q = -Z; - if (arg<6) q *= std::erf(arg); - return q/R; - } -}; - -/// Given coefficients and exponents make the 3D operator adding delta part to last Gaussian -real_convolution_3d make_operator(World& world, - const std::vector& C, - const std::vector& T, - double Cdelta) { - Tensor c(C.size()), t(T.size()); - - for (unsigned int i=0; i -make_grad_operator(World& world, - std::vector C, // TAKES A COPY SINCE WE MODIFY TI - const std::vector T, - const double Cdelta, - int k=FunctionDefaults<3>::get_k()) -{ - //typedef SeparatedConvolution real_convolution_3d; - //typedef std::shared_ptr real_convolution_3d_ptr; - const double pi = constants::pi; - const Tensor width = FunctionDefaults<3>::get_cell_width(); - double hi = width.normf(); // Diagonal width of cell - - const int rank = C.size(); - - C[rank-1] += Cdelta * pow(T[rank-1]/constants::pi,1.5); - - std::vector gradG(3); - - for (int dir=0; dir<3; dir++) { - std::vector< ConvolutionND > ops(rank); - for (int mu=0; mu::get(k, T[mu]*width[d]*width[d], 0, false)); - } - ops[mu].setop(dir,GaussianConvolution1DCache::get(k, T[mu]*width[dir]*width[dir], 1, false)); - } - gradG[dir] = real_convolution_3d_ptr(new SeparatedConvolution(world, ops)); - } - - return gradG; -} - - -/// Makes the relativistic equivalent of the BSH operator -real_convolution_3d BSHrel(World& world, double epsilon) { - std::vector C, T; - double Cdelta; - bshrel_fit(epsilon, op_dx, op_thresh, op_quadacc, C, T, Cdelta); - return make_operator(world, C, T, Cdelta); -} - -/// Makes the Tbar operator (T_rel = E0-mc2 = Tbar T_nonrel = -1/2 Tbar del**2) -real_convolution_3d Tbar(World& world) { - std::vector C, T; - double Cdelta; - tbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); - return make_operator(world, C, T, Cdelta); -} - -/// Makes the Pbar operator -real_convolution_3d Pbar(World& world) { - std::vector C, T; - double Cdelta; - pbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); - return make_operator(world, C, T, Cdelta); -} - -/// Makes the APbar operator -real_convolution_3d APbar(World& world) { - std::vector C, T; - double Cdelta; - apbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); - return make_operator(world, C, T, Cdelta); -} - -/// Makes the gradient of the APbar operator -std::vector gradAPbar(World& world) { - std::vector C, T; - double Cdelta; - apbar_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); - return make_grad_operator(world, C, T, Cdelta); -} - - -/// Makes the A operator (including the 1/sqrt(2) piece) -real_convolution_3d A(World& world) { - std::vector C, T; - double Cdelta; - a_fit(op_dx, op_thresh, op_quadacc, C, T, Cdelta); - return make_operator(world, C, T, Cdelta); -} - -/// Returns the exponent of the wavefunction cusp at the origin for RK -double rk_v(double Z) { - if (NONREL) return 0.0; - if (DK1) Z *= 0.5; - - static const double c = 137.0359895; - double v = -2.0*Z/(constants::pi*c); - while (true) { - double vnew = -2.0*std::atan(Z/(c*(v+1.0)))/constants::pi; - if (std::abs(v-vnew) < 1e-8) break; - v = vnew; - } - return v; -} - -class Guess : public FunctionFunctorInterface { - const double Z; - const double fac; - const double v; - std::vector specialpt; - -public: - Guess(double Z) - : Z (Z) - , fac(sqrt(Z*Z*Z/(8.0*constants::pi))) - , v(rk_v(Z)) - , specialpt(1,coord_3d{0.0,0.0,0.0}) - {} - - double operator()(const coord_3d& r) const { - const double x=r[0], y=r[1], z=r[2]; - const double R=sqrt(x*x+y*y+z*z+op_dx*op_dx); - return fac*exp(-Z*R)*pow(R,-v); - //return fac*exp(-Z*R); - } - - std::vector special_points() const {return specialpt;} - - Level special_level() const {return 5;} -}; - -// static double V(const coord_3d& r) { -// const double x=r[0], y=r[1], z=r[2]; -// return -Z/(sqrt(x*x+y*y+z*z+1e-10)); -// } - -real_function_3d apply_potential(const real_function_3d& Vnuc, const real_function_3d& psi) { - World& world = Vnuc.world(); - - if (NONREL || RK) { - return Vnuc*psi; - } - else if (DK1) { - // A (V + Pp . V pP ) A psi = A V A psi + AP p . V p AP psi - - real_convolution_3d Aop = A(world); - real_convolution_3d APbarop = APbar(world); - - real_function_3d Vpsi = Aop((Vnuc*Aop(psi)).truncate()); - - // // This works - // real_function_3d APbarpsi = APbarop(psi); - // for (int axis=0; axis<3; axis++) { - // real_derivative_3d D = free_space_derivative(world, axis); - // Vpsi -= APbarop((D(Vnuc*D(APbarpsi))).truncate()); - // } - - // This combines derivative and integral operators and seems both faster and more accurate?? - std::vector gradAPbarop = gradAPbar(world); - for (int axis=0; axis<3; axis++) { - real_convolution_3d& op = *(gradAPbarop[axis]); - Vpsi -= op((Vnuc*op(psi)).truncate()); - } - - return Vpsi.truncate(); - } - else { - throw "confusion"; - } -} - -double compute_energy(World& world, const real_function_3d& psi, const real_function_3d& V, bool doprint=false) { - real_convolution_3d Tbarop = Tbar(world); - - double kinetic_energy = 0.0; - for (int axis=0; axis<3; axis++) { - real_derivative_3d D = free_space_derivative(world, axis); - real_function_3d dpsi = D(psi); - - if (NONREL) { - kinetic_energy += 0.5*inner(dpsi,dpsi); - } - else { - kinetic_energy += 0.5*inner(dpsi,apply(Tbarop,dpsi)); - } - } - - double nuclear_attraction_energy = inner(psi, apply_potential(V,psi)); - double total_energy = kinetic_energy + nuclear_attraction_energy; - - if (world.rank() == 0 && doprint) { - if (NONREL) print("Non-relativistic"); - else if (RK) print("RK"); - else if (DK1) print("DK1"); - else throw "confused"; - - print(" Kinetic energy ", kinetic_energy); - print(" Nuclear attraction energy ", nuclear_attraction_energy); - print(" Total energy ", total_energy); - print(" Virial ", nuclear_attraction_energy / kinetic_energy); - } - - return total_energy; -} - -real_function_3d apply_laplacian(World& world, const real_function_3d& psi) { - real_function_3d delsqpsi(world); - - for (int axis=0; axis<3; axis++) { - real_derivative_3d D = free_space_derivative(world, axis); - delsqpsi += D(D(psi)); - } - - return delsqpsi; -} - -real_convolution_3d make_bsh_operator(World& world, double eps, double& fac) { - if (NONREL) { - fac = -2.0; - return BSHOperator3D(world, sqrt(-2*eps), 0.001, 1e-6); - } - else { - fac = -1.0; - return BSHrel(world, eps); - } -} - -real_function_3d iterate(World& world, const real_function_3d& V, const real_function_3d& psi, double& eps) { - /* - - (Tbar T + V) psi = E psi - - (T + Tbar T - T + V) psi = E psi - - (T - E) psi = - (Tbar T - T + V) psi --> but this suffers from numerical noise - - instead - - psi = - (TbarT - E)^-1 V psi - - */ - - eps = compute_energy(world, psi, V, false); - - double fac; - real_convolution_3d op = make_bsh_operator(world, eps, fac); - - real_function_3d Vpsi = apply_potential(V,psi); - - Vpsi.scale(fac).truncate(); - - real_function_3d tmp = apply(op,Vpsi).truncate(); - double norm = tmp.norm2(); - real_function_3d r = psi-tmp; - // double eps_new = eps - 0.5*inner(Vpsi,r)/(norm*norm); - // eps = eps_new; - - return r; -} - -void logplot(double Z, const real_function_3d& psi, double lo=1e-7, double hi=L*0.5) { - char fname[256]; - - if (NONREL) sprintf(fname, "nonrel-%3.3d.dat", int(Z)); - else if (RK) sprintf(fname, "rk-%3.3d.dat", int(Z)); - else if (DK1) sprintf(fname, "dk1-%3.3d.dat", int(Z)); - else throw "jdsalkfjalks"; - - std::ofstream file; - file.open (fname); - file.precision(12); - psi.reconstruct(); - const double fac = pow(10.0,1.0/16.0); - double rr = lo; - while (rr::set_k(k); - FunctionDefaults<3>::set_thresh(thresh); - FunctionDefaults<3>::set_truncate_mode(0); - FunctionDefaults<3>::set_truncate_on_project(true); - FunctionDefaults<3>::set_cubic_cell(-L/2,L/2); - - //double Zlist[] = {1.0,2.0,3.0,4.0,6.0,8.0,10.0,12.0,16.0,20.0,30.0,40.0,60.0,80.0}; - double Zlist[] = {1.0,2.0,4.0,8.0,16.0,20.0,32.0,40.0,48.0,56.0,60.0,64.0,72.0,76.0,80.0,100.0}; - //double Zlist[] = {20.0,40.0,56.0,60.0,64.0,72.0,76.0,80.0}; - //double Zlist[] = {100.0}; - const int NumZs = sizeof(Zlist)/sizeof(Z); - - for (unsigned int i=0; i::id] << " " << tensor_type_names[TensorTypeData::id] << " " << tensor_type_names[TensorTypeData::id] << "\n"; @@ -352,7 +347,7 @@ namespace madness { } #else - #error 'mxm Intel MKL else error' + // Fall back to reference implementations template diff --git a/src/madness/world/worlddc.h b/src/madness/world/worlddc.h index 0a17da8ffb8..2e09a3f1958 100644 --- a/src/madness/world/worlddc.h +++ b/src/madness/world/worlddc.h @@ -113,8 +113,8 @@ namespace madness { /// new map and no objects will be registered in the current map. /// @param[in] world The associated world /// @param[in] newpmap The new process map - void redistribute(World& world, const std::shared_ptr< WorldDCPmapInterface >& newpmap, bool doprint=true) { - if(doprint) print_data_sizes(world, "before redistributing"); + void redistribute(World& world, const std::shared_ptr< WorldDCPmapInterface >& newpmap) { + print_data_sizes(world, "before redistributing"); world.gop.fence(); for (typename std::set::iterator iter = ptrs.begin(); iter != ptrs.end(); @@ -136,7 +136,7 @@ namespace madness { } world.gop.fence(); ptrs.clear(); - if(doprint) newpmap->print_data_sizes(world, "after redistributing"); + newpmap->print_data_sizes(world, "after redistributing"); } /// Counts global number of entries in all containers associated with this process map From e3735fe71b076e7dba16fc58be72f32188f1011d Mon Sep 17 00:00:00 2001 From: jscanderson Date: Sun, 19 Dec 2021 18:09:06 -0500 Subject: [PATCH 0168/1312] compilation fixes --- cmakecmd | 9 --------- src/apps/dirac/DF.cc | 2 +- src/apps/dirac/fcwf.h | 2 +- 3 files changed, 2 insertions(+), 11 deletions(-) delete mode 100644 cmakecmd diff --git a/cmakecmd b/cmakecmd deleted file mode 100644 index f619377f18d..00000000000 --- a/cmakecmd +++ /dev/null @@ -1,9 +0,0 @@ -cmake -D ENABLE_TBB=ON \ - -D ENABLE_MKL=1 \ - -D CMAKE_BUILD_TYPE=Debug \ - -D BUILD_SHARED_LIBS=OFF \ - -D CMAKE_CXX_COMPILER=mpicxx \ - -D CMAKE_C_COMPILER=mpicc \ - -D CMAKE_CXX_STANDARD=17 \ - .. -# -DBLA_STATIC=TRUE diff --git a/src/apps/dirac/DF.cc b/src/apps/dirac/DF.cc index 5725df7b76d..2306f7df2a7 100644 --- a/src/apps/dirac/DF.cc +++ b/src/apps/dirac/DF.cc @@ -1244,7 +1244,7 @@ void DF::DF_load_balance(World& world, real_function_3d& Vnuc){ } //Redistribute - FunctionDefaults<3>::redistribute(world, lb.load_balance(2), true); + FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); //End timers Tensor times = end_timer(world); diff --git a/src/apps/dirac/fcwf.h b/src/apps/dirac/fcwf.h index f0773caeac2..1df51607521 100644 --- a/src/apps/dirac/fcwf.h +++ b/src/apps/dirac/fcwf.h @@ -28,7 +28,7 @@ class Fcwf{ const complex_function_3d& operator[](const int i) const ; - Fcwf(std::vector& phi); + explicit Fcwf(std::vector& phi); bool getinitialize(); From 21d988ac0991b5a2aa0ad26b79f6ed918d7dc81b Mon Sep 17 00:00:00 2001 From: fbischoff Date: Thu, 14 Jul 2022 21:37:36 +0200 Subject: [PATCH 0169/1312] Testing documentation --- .readthedocs.yaml | 30 +++ doc/Makefile | 20 ++ doc/conf.py | 54 ++++ doc/index.log | 0 doc/index.rst | 28 ++ doc/make.bat | 35 +++ doc/numerical_library.md | 5 + doc/quantum.md | 78 ++++++ doc/requirements.txt | 7 + doc/runtime.md | 4 + src/apps/chem/ccpairfunction.cc | 246 +++++++++++++++++ src/apps/chem/ccpairfunction.h | 382 +++++++++++++++++++++++++++ src/apps/chem/test_ccpairfunction.cc | 226 ++++++++++++++++ 13 files changed, 1115 insertions(+) create mode 100644 .readthedocs.yaml create mode 100644 doc/Makefile create mode 100644 doc/conf.py create mode 100644 doc/index.log create mode 100644 doc/index.rst create mode 100644 doc/make.bat create mode 100644 doc/numerical_library.md create mode 100644 doc/quantum.md create mode 100644 doc/requirements.txt create mode 100644 doc/runtime.md create mode 100644 src/apps/chem/ccpairfunction.cc create mode 100644 src/apps/chem/ccpairfunction.h create mode 100644 src/apps/chem/test_ccpairfunction.cc diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 00000000000..d913b8a085c --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,30 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the version of Python and other tools you might need +build: + os: ubuntu-20.04 + tools: + python: "3.9" + # You can also specify other tool versions: + # nodejs: "16" + # rust: "1.55" + # golang: "1.17" + +# Build documentation in the docs/ directory with Sphinx +sphinx: + configuration: doc/conf.py + +# If using Sphinx, optionally build your docs in additional formats such as PDF +# formats: +# - pdf + +# Optionally declare the Python requirements required to build your docs +python: + install: + - requirements: doc/requirements.txt + diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 00000000000..d0c3cbf1020 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 00000000000..9e2a39c8f9e --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,54 @@ +# Configuration file for the Sphinx documentation builder. +# +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + +# import myst_parser + +# -- Project information ----------------------------------------------------- + +project = 'madness' +copyright = '2022, Robert Harrison' +author = 'Robert Harrison' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ["myst_parser"] + + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] diff --git a/doc/index.log b/doc/index.log new file mode 100644 index 00000000000..e69de29bb2d diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 00000000000..21e01298d87 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,28 @@ +.. madness documentation master file, created by + sphinx-quickstart on Tue Jul 12 21:54:04 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to madness's documentation! +=================================== + +.. toctree:: + :maxdepth: 2 + + runtime + numerical_library + quantum + use MADNESS + +.. + - :doc:`runtime` + - :doc:`numerical_library` + - :doc:`quantum` + - :doc:`use_madness` + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 00000000000..dc1312ab09c --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/doc/numerical_library.md b/doc/numerical_library.md new file mode 100644 index 00000000000..25455fb8f80 --- /dev/null +++ b/doc/numerical_library.md @@ -0,0 +1,5 @@ +# MADNESS numerical library + +MADNESS provides a high-level environment for the solution of integral and differential equations +in many dimensions using adaptive, fast methods with guaranteed precision based on multi-resolution +analysis and novel separated representations. \ No newline at end of file diff --git a/doc/quantum.md b/doc/quantum.md new file mode 100644 index 00000000000..ddb885470e5 --- /dev/null +++ b/doc/quantum.md @@ -0,0 +1,78 @@ +# MADNESS quantum chemistry + + +## What you can do +Quantum chemical capabilities are: + * SCF: Hartree-Fock and DFT, also in strong magnetic fields + * analytical gradients for SCF + * second nuclear derivatives for SCF (field-free case only) + * CIS + * response properties + * MP2 + * ADC(2), CIS(D) + * CC2 ground and excited states + * PNO-MP2 + +## Quickstart +A quick help and an overview over all available codes can be +obtained by +> madqc --help + +All programs can read commandline options or an input file (by default this is named "input"). +A full list of all available calculation parameters can be obtained by writing +> qccode --help + +where qccode stands for any of the qc codes (e.g. moldft, cc2, nemo, ..) + + +## Calculation parameters +All calculations require parameters, specifying the molecule, the quantum chemical model, charge etc. +If no parameters are given, default parameters will be used. Only the molecule itself must be specified by the user. +Paramters can be specified through an input file and/or command line options + +Some parameters depend on each other and are set automatically, e.g. certain numerical parameters, or the use of +point group symmetry. + +In the output files of the calculations the complete set of input parameters are printed out, +together with a short description and further information. + +## Input file +The input file consists of data groups, starting with the relevant keyword, e.g. "dft" and ending with "end". +All parameters in a data group are given as key/value pairs, where the value can be an integer, a double, a string +even a vector or pair +>dft\ +>  charge 1   # comment\ +>  ncf (slater,2.0) # value is a pair of string and double\ +>end + +Blank lines are ignored, as is everything after a hashtag. +The input file is case-insensitive. +The key/value pairs can be separated by blanks or by the equal sign. +Pairs and vectors must be encased in parantheses or brackets, their entries must be separated by commas. + +## Command line options +The data groups in the input file can also be set or augmented through the command line, e.g. the following +line will pass the same calculation parameters as the input file above. +> nemo --dft="charge=1; ncf=(slater,2.0)" + +Different key/value pairs are separated by a semicolon to indicate a newline. +If a given parameter is specified both in the input file and the command line, the command line parameters have +priority over input file parameters. + + +## Numerical parameters +Numerical parameters are specified in the dft block, the most important ones that will +also be used is subsequent calculations (e.g. mp2) are +> dft\ +>   k 5\ +>   L 20\ +> end + +The polynomial order k can be chosed between 2 and 30, for SCF calculations a value of 7 to 9 is advised, for correlated +calculations it should be chosen 5 or 6. + +The calculation box size L should be large enough to hold all relevant phyics. All wavefunctions should have decayed +to practically zero at the box boundary. Note that excited states or anions can be quite large. +The box size is given in atomic units (1 a.u. = 52 pm). + +Generally it is advisable to use as few numerical parameters as possible, as they are usually dependent on each other diff --git a/doc/requirements.txt b/doc/requirements.txt new file mode 100644 index 00000000000..b78440a548e --- /dev/null +++ b/doc/requirements.txt @@ -0,0 +1,7 @@ +sphinx==4.4.0 +typing-extensions==4.2.0 +docutils==0.17.1 +markupsafe==2.1.1 +pyparsing==3.0.8 +alabaster==0.7.12 +myst_parser==0.18.0 diff --git a/doc/runtime.md b/doc/runtime.md new file mode 100644 index 00000000000..82da33d1474 --- /dev/null +++ b/doc/runtime.md @@ -0,0 +1,4 @@ +# MADNESS runtime + +The MADNESS runtime allows for massively parallel, hybrid parallel computation of +complex algorithms. The runtime can be used by external codes. \ No newline at end of file diff --git a/src/apps/chem/ccpairfunction.cc b/src/apps/chem/ccpairfunction.cc new file mode 100644 index 00000000000..f45d4609069 --- /dev/null +++ b/src/apps/chem/ccpairfunction.cc @@ -0,0 +1,246 @@ +// +// Created by Florian Bischoff on 6/27/22. +// + +#include +#include + +using namespace madness; + +namespace madness { + + +madness::CCPairFunction +CCPairFunction::invert_sign() { + (*this)*=(-1.0); + return *this; +} + +double +CCPairFunction::make_xy_u(const CCFunction& xx, const CCFunction& yy) const { + double result = 0.0; + if (is_pure()) { + World& world=xx.function.world(); + real_function_6d ij = CompositeFactory(world).particle1(madness::copy(xx.function)) + .particle2( madness::copy(yy.function)); + result = inner(pure().get_function(), ij); + } else if (is_decomposed_no_op()) { + for (size_t i = 0; i < get_a().size(); i++) + result += (xx.function.inner(get_a()[i])) * (yy.function.inner(get_b()[i])); + } else if (is_op_decomposed()) { + const CCConvolutionOperator& op=*decomposed().get_operator_ptr(); + result = yy.function.inner(op(xx, get_a()[0]) * get_b()[0]); + } + return result; +} + +real_function_3d CCPairFunction::project_out(const CCFunction& f, const size_t particle) const { + MADNESS_ASSERT(particle == 1 or particle == 2); + real_function_3d result; + if (is_pure()) { + result = pure().get_function().project_out(f.function, particle - 1); // this needs 0 or 1 for particle but we give 1 or 2 + } else if (is_decomposed_no_op()) { + result = project_out_decomposed(f.function, particle); + } else if (is_op_decomposed()) { + result = project_out_op_decomposed(f, particle); + } + if (not result.is_initialized()) MADNESS_EXCEPTION("Result of project out on CCPairFunction was not initialized", + 1); + return result; +} + +// result is: _particle +real_function_3d +CCPairFunction::dirac_convolution(const CCFunction& x, const CCConvolutionOperator& op, const size_t particle) const { + real_function_3d result; + if (is_pure()) { + result = op(x, pure().get_function(), particle); + } else if (is_decomposed_no_op()) { + result = dirac_convolution_decomposed(x, op, particle); + } else { + MADNESS_EXCEPTION("op_decomposed dirac convolution not yet implemented", 1); + } + return result; +} + +// CCPairFunction CCPairFunction::swap_particles() const { +// switch (type) { +// default: MADNESS_EXCEPTION("Undefined enum", 1); +// case PT_FULL: +// return swap_particles_pure(); +// break; +// case PT_DECOMPOSED: +// return swap_particles_decomposed(); +// break; +// case PT_OP_DECOMPOSED: +// return swap_particles_op_decomposed(); +// break; +// } +// MADNESS_EXCEPTION("swap_particles in CCPairFunction: we should not end up here", 1); +// } + +real_function_3d CCPairFunction::project_out_decomposed(const real_function_3d& f, const size_t particle) const { + World& world=f.world(); + real_function_3d result = real_factory_3d(world); + const std::pair decompf = assign_particles(particle); + Tensor c = inner(world, f, decompf.first); + for (size_t i = 0; i < get_a().size(); i++) result += c(i) * decompf.second[i]; + return result; +} + +real_function_3d CCPairFunction::project_out_op_decomposed(const CCFunction& f, const size_t particle) const { + World& world=f.get().world(); + const CCConvolutionOperator& op=*decomposed().get_operator_ptr(); + if (particle == 1) { + return op(f, get_a()[0]) * get_b()[0]; + } else if (particle == 2) { + return op(f, get_b()[0]) * get_a()[0]; + } else { + MADNESS_EXCEPTION("project_out_op_decomposed: particle must be 1 or 2", 1); + return real_factory_3d(world); + } +} + +real_function_3d CCPairFunction::dirac_convolution_decomposed(const CCFunction& bra, const CCConvolutionOperator& op, + const size_t particle) const { + World& world=bra.function.world(); + const std::pair f = assign_particles(particle); + const vector_real_function_3d braa = mul(world, bra.function, f.first); + const vector_real_function_3d braga = op(braa); + real_function_3d result = real_factory_3d(world); + for (size_t i = 0; i < braga.size(); i++) result += braga[i] * f.second[i]; + return result; +} + + +const std::pair +CCPairFunction::assign_particles(const size_t particle) const { + if (particle == 1) { + return std::make_pair(get_a(), get_b()); + } else if (particle == 2) { + return std::make_pair(get_b(), get_a()); + } else { + MADNESS_EXCEPTION("project_out_decomposed: Particle is neither 1 nor 2", 1); + return std::make_pair(get_a(), get_b()); + } +} + + +double CCPairFunction::inner_internal(const CCPairFunction& other, const real_function_3d& R2) const { + const CCPairFunction& f1=*this; + const CCPairFunction& f2=other; + + double thresh=FunctionDefaults<6>::get_thresh(); + + double result = 0.0; + if (f1.is_pure() and f2.is_pure()) { + CCTimer tmp(world(), "making R1R2|u>"); + real_function_6d R1u = multiply(::copy(f1.pure().get_function()), copy(R2), 1); + real_function_6d R1R2u = multiply(R1u, copy(R2), 2); // R1u function now broken + tmp.info(); + result = f2.pure().get_function().inner(R1R2u); + } else if (f1.is_pure() and f2.is_decomposed_no_op()) { + MADNESS_ASSERT(f2.get_a().size() == f2.get_b().size()); + vector_real_function_3d a = R2* f2.get_a(); + vector_real_function_3d b = R2* f2.get_b(); + for (size_t i = 0; i < a.size(); i++) { + real_function_6d ab = CompositeFactory(world()).particle1(copy(a[i])).particle2(copy(b[i])); + result += f1.pure().get_function().inner(ab); + } + } else if (f1.is_pure() and f2.is_op_decomposed()) { + real_function_3d x = R2 * f2.get_a()[0]; + real_function_3d y = R2 * f2.get_b()[0]; + real_function_6d op; + if (f2.decomposed().get_operator_ptr()->type() == OT_F12) + op = TwoElectronFactory(world()).dcut(f2.get_operator().parameters.lo).gamma(f2.get_operator().parameters.gamma).f12() + .thresh(thresh); + else if (f2.get_operator().type() == OT_G12) + op = TwoElectronFactory(world()).dcut(f2.get_operator().parameters.lo).thresh(thresh); + else MADNESS_EXCEPTION( + ("6D Overlap with operatortype " + assign_name(f2.get_operator().type()) + " not supported").c_str(), 1); + real_function_6d opxy = CompositeFactory(world()).g12(op).particle1(copy(x)).particle2(copy(y)); + return f1.pure().get_function().inner(opxy); + } else if (f1.is_decomposed_no_op() and f2.is_pure()) { + MADNESS_ASSERT(f1.get_a().size() == f1.get_b().size()); + vector_real_function_3d a = R2* f1.get_a(); + vector_real_function_3d b = R2* f1.get_b(); + for (size_t i = 0; i < a.size(); i++) { + real_function_6d ab = CompositeFactory(world()).particle1(copy(a[i])).particle2(copy(b[i])); + result += f2.pure().get_function().inner(ab); + } + } else if (f1.is_decomposed_no_op() and f2.is_decomposed_no_op()) { + MADNESS_ASSERT(f1.get_a().size() == f1.get_b().size()); + MADNESS_ASSERT(f2.get_a().size() == f2.get_b().size()); + vector_real_function_3d a = R2* f1.get_a(); + vector_real_function_3d b = R2* f1.get_b(); + for (size_t i1 = 0; i1 < f1.get_a().size(); i1++) { + for (size_t i2 = 0; i2 < f2.get_a().size(); i2++) { + const double aa = a[i1].inner(f2.get_a()[i2]); + const double bb = b[i1].inner(f2.get_b()[i2]); + result += aa * bb; + } + } + } else if (f1.is_decomposed_no_op() and f2.is_op_decomposed()) { + MADNESS_ASSERT(f1.get_a().size() == f1.get_b().size()); + vector_real_function_3d a = f1.get_a(); + vector_real_function_3d b = f1.get_b(); + real_function_3d x = (R2 * f2.get_a()[0]).truncate(); + real_function_3d y = (R2 * f2.get_b()[0]).truncate(); + for (size_t i = 0; i < a.size(); i++) { + real_function_3d ax = (a[i] * x).truncate(); + real_function_3d aopx = f2.get_operator()(ax); + result += b[i].inner(aopx * y); + } + } else if (f1.is_op_decomposed() and f2.is_pure()) { + real_function_3d x = R2 * f1.get_a()[0]; + real_function_3d y = R2 * f1.get_b()[0]; + real_function_6d op; + if (f1.get_operator().type() == OT_F12) + op = TwoElectronFactory(world()).dcut(f1.get_operator().parameters.lo).gamma(f1.get_operator().parameters.gamma).f12() + .thresh(thresh); + else if (f1.get_operator().type() == OT_G12) + op = TwoElectronFactory(world()).dcut(f1.get_operator().parameters.lo).thresh(thresh); + else MADNESS_EXCEPTION( + ("6D Overlap with operatortype " + assign_name(f1.get_operator().type()) + " not supported").c_str(), 1); + real_function_6d opxy = CompositeFactory(world()).g12(op).particle1(copy(x)).particle2(copy(y)); + return f2.pure().get_function().inner(opxy); + } else if (f1.is_op_decomposed() and f2.is_decomposed_no_op()) { + MADNESS_ASSERT(f2.get_a().size() == f2.get_b().size()); + vector_real_function_3d a = f2.get_a(); + vector_real_function_3d b = f2.get_b(); + real_function_3d x = (R2 * f1.get_a()[0]).truncate(); + real_function_3d y = (R2 * f1.get_b()[0]).truncate(); + for (size_t i = 0; i < a.size(); i++) { + real_function_3d ax = (a[i] * x).truncate(); + real_function_3d aopx = f1.get_operator()(ax); + result += b[i].inner(aopx * y); + } + } else if (f1.is_op_decomposed() and f2.is_op_decomposed()) { + MADNESS_ASSERT(f1.get_operator().type() == OT_F12 and f2.get_operator().type() == OT_F12); // in principle we have everything for f12g12 but we will not need it + // we use the slater operator which is S = e^(-y*r12), y=gamma + // the f12 operator is: 1/2y*(1-e^(-y*r12)) = 1/2y*(1-S) + // so the squared f12 operator is: f*f = 1/(4*y*y)(1-2S+S*S), S*S = S(2y) = e(-2y*r12) + // we have then: = 1/(4*y*y)*( - 2* + ) + const double gamma =f1.get_operator().parameters.gamma; + const double prefactor = 1.0 / (4.0 * gamma * gamma); + SeparatedConvolution S = SlaterOperator(world(), gamma, f1.get_operator().parameters.lo, f1.get_operator().parameters.thresh_op); + SeparatedConvolution S2 = SlaterOperator(world(), 2.0 * gamma, f1.get_operator().parameters.lo, + f1.get_operator().parameters.thresh_op); + real_function_3d x1 = f1.get_a()[0] * R2; + real_function_3d y1 = f1.get_b()[0] * R2; + real_function_3d xx = f2.get_a()[0] * x1; + real_function_3d yy = f2.get_b()[0] * y1; + real_function_3d xSx = S(xx); + real_function_3d xSSx = S2(xx); + result = prefactor * (x1.inner(f2.get_a()[0]) * y1.inner(f2.get_b()[0]) - 2.0 * yy.inner(xSx) + yy.inner(xSSx)); + } else MADNESS_EXCEPTION( + ("CCPairFunction Overlap not supported for combination " + f1.name() + " and " + f2.name()).c_str(), 1) + + ; + return result; + + +} + + +} // namespace madness \ No newline at end of file diff --git a/src/apps/chem/ccpairfunction.h b/src/apps/chem/ccpairfunction.h new file mode 100644 index 00000000000..b276137d0cf --- /dev/null +++ b/src/apps/chem/ccpairfunction.h @@ -0,0 +1,382 @@ +// +// Created by Florian Bischoff on 6/27/22. +// + +#ifndef MADNESS_CCPAIRFUNCTION_H +#define MADNESS_CCPAIRFUNCTION_H + + + +#include +#include +#include +#include +#include +#include + +namespace madness { + +class CCConvolutionOperator; + +/// FuncTypes used by the CC_function_6d structure +/// Types of Functions used by CC_function class +enum FuncType { UNDEFINED, HOLE, PARTICLE, MIXED, RESPONSE }; + +/// FuncTypes used by the CC_function_6d structure +enum PairFormat { PT_UNDEFINED, PT_FULL, PT_DECOMPOSED, PT_OP_DECOMPOSED }; + + + +/// structure for a CC Function 3D which holds an index and a type +// the type is defined by the enum FuncType (definition at the start of this file) +struct CCFunction { + CCFunction() : current_error(99), i(99), type(UNDEFINED) {}; + + CCFunction(const real_function_3d& f) : current_error(99), function(f), i(99), type(UNDEFINED) {}; + + CCFunction(const real_function_3d& f, const size_t& ii) : current_error(99), function(f), i(ii), type(UNDEFINED) {}; + + CCFunction(const real_function_3d& f, const size_t& ii, const FuncType& type_) : current_error(99), function(f), + i(ii), type(type_) {}; + + CCFunction(const CCFunction& other) : current_error(other.current_error), function(other.function), i(other.i), + type(other.type) {}; + double current_error; + real_function_3d function; + + real_function_3d get() const { return function; } + + real_function_3d f() const { return function; } + + void set(const real_function_3d& other) { function = other; } + + size_t i; + FuncType type; + + void info(World& world, const std::string& msg = " ") const; + + std::string name() const; + + double inner(const CCFunction& f) const { + return inner(f.function); + } + + double inner(const real_function_3d& f) const { + return function.inner(f); + } + + /// scalar multiplication + CCFunction operator*(const double& fac) const { + real_function_3d fnew = fac * function; + return CCFunction(fnew, i, type); + } + + // for convenience + bool operator==(const CCFunction& other) const { + if (i == other.i and type == other.type) return true; + else return false; + } + + /// plotting + void plot(const std::string& msg = "") const { + plot_plane(function.world(), function, msg + name()); + } +}; + + +class TwoBodyFunctionComponentBase { +public: + virtual void swap_particles_inplace() = 0; + virtual bool is_pure() const {return false;} + virtual bool is_decomposed() const {return false;} + virtual bool has_operator() const {return false;} + virtual void print_size() const = 0; + virtual std::string name() const = 0; + virtual World& world() const =0; +}; + +/// a two-body, explicitly 6-dimensional function +template +class TwoBodyFunctionPureComponent : public TwoBodyFunctionComponentBase { + +public: + + explicit TwoBodyFunctionPureComponent(const Function& f) : u(f) {} + + template + TwoBodyFunctionPureComponent& operator*=(const Q fac) { + u.scale(fac); + return *this; + } + + bool is_pure() const override {return true;} + + World& world() const override {return u.world();}; + + void serialize() {} + + void print_size() const override { + u.print_size(name()); + } + + std::string name() const override { + return "|u>"; + } + + +// template +// TwoBodyFunctionPureComponent operator*()(const Function& g, const int particle=0) {} +// + template + TwoBodyFunctionPureComponent apply(const SeparatedConvolution* op, const int particle=0) {} + + /// return f(2,1) + void swap_particles_inplace() override { + u=swap_particles(u); + } + + real_function_6d& get_function() { + return u; + } + +private: + /// pure 6D function + real_function_6d u; + +}; + +template +class TwoBodyFunctionSeparatedComponent : public TwoBodyFunctionComponentBase { + +public: + TwoBodyFunctionSeparatedComponent(const std::vector>& a, + const std::vector>& b) : a(a), b(b), op(nullptr) {}; + + TwoBodyFunctionSeparatedComponent(const std::vector>& a, + const std::vector>& b, + const CCConvolutionOperator* op) : a(a), b(b), op(op) {}; + + template + TwoBodyFunctionSeparatedComponent& operator*=(const Q fac) { + if (a.size()>0 and a.front().is_initialized()) scale(a.front().world(),a,fac); + return *this; + } + + bool is_decomposed() const override {return true;} + bool has_operator() const override {return op!=nullptr;} + + World& world() const override { + MADNESS_ASSERT(a.size()>0 and a.front().is_initialized()); + return a.front().world(); + }; + + void print_size() const override { + if (a.size() > 0) { + World& world = a.front().world(); + madness::print_size(world, a, "a from " + name()); + madness::print_size(world, b, "b from " + name()); + } + } + + std::string name() const override { + if (has_operator()) return get_operator_ptr()->name() + "|xy>"; + return "|ab>"; + }; + + void serialize() {} + + template + TwoBodyFunctionPureComponent apply(const SeparatedConvolution* op, const int particle=0) {} + + /// return f(2,1) + void swap_particles_inplace() override { + std::swap(a,b); + } + + vector_real_function_3d get_a() const {return a;} + vector_real_function_3d get_b() const {return b;} + const CCConvolutionOperator* get_operator_ptr() const {return op;}; + +private: + + vector_real_function_3d a; + vector_real_function_3d b; + const CCConvolutionOperator* op; + +}; + + + + +/// Helper structure for the coupling potential of CC Singles and Doubles +/// because of the regularization of the CC-Wavefunction (for CC2: |tauij> = |uij> + Qt12*f12*|titj>) +/// we have 6D-functions in std format |u> : type==pure_ +/// we have 6D-functions in sepparated format: type==decomposed_ (e.g O1*f12*|titj> = |xy> with x=|k> and y=*|tj>) +/// we have 6D-function like f12|xy> which are not needed to be represented on the 6D MRA-Grid, type==op_decomposed_ +struct CCPairFunction { + +using T=double; +public: + CCPairFunction(World& world, const real_function_6d& ket) { + component.reset(new TwoBodyFunctionPureComponent(ket)); + } + + CCPairFunction(World& world, const vector_real_function_3d& f1, const vector_real_function_3d& f2) { + component.reset(new TwoBodyFunctionSeparatedComponent(f1,f2)); + } + + CCPairFunction(World& world, const std::pair& f) { + component.reset(new TwoBodyFunctionSeparatedComponent(f.first,f.second)); + } + + CCPairFunction(World& world, const CCConvolutionOperator *op_, const CCFunction& f1, const CCFunction& f2) { + component.reset(new TwoBodyFunctionSeparatedComponent({f1.function},{f2.function},op_)); + } + + CCPairFunction(const CCPairFunction& other) = default; + + void info() const { print_size(); } + + World& world() const { + MADNESS_CHECK(component); + return component->world(); + } + + Function& get_function() { + MADNESS_CHECK(component and (component->is_pure())); + return pure().get_function(); + } + + Function& get_function() const { + MADNESS_CHECK(component and (component->is_pure())); + return pure().get_function(); + } + + /// make a deep copy and invert the sign + /// deep copy necessary otherwise: shallow copy errors + CCPairFunction invert_sign(); + + CCPairFunction operator*(const double fac) const { + CCPairFunction result(*this); + result*=fac; + return result; + } + + bool is_pure() const {return component->is_pure();} + bool is_decomposed() const {return component->is_decomposed();} + bool is_decomposed_no_op() const {return component->is_decomposed() and (not component->has_operator());} + bool is_op_decomposed() const {return component->is_decomposed() and component->has_operator();} + + TwoBodyFunctionPureComponent& pure() const { + if (auto ptr=dynamic_cast*>(component.get())) return *ptr; + MADNESS_EXCEPTION("bad cast in TwoBodyFunction",1); + } + + TwoBodyFunctionSeparatedComponent& decomposed() const { + if (auto ptr=dynamic_cast*>(component.get())) return *ptr; + MADNESS_EXCEPTION("bad cast in TwoBodyFunction",1); + } + + vector_real_function_3d get_a() const { + MADNESS_CHECK(component->is_decomposed()); + return decomposed().get_a(); + } + vector_real_function_3d get_b() const { + MADNESS_CHECK(component->is_decomposed()); + return decomposed().get_b(); + } + + const CCConvolutionOperator& get_operator() const { + MADNESS_CHECK(is_op_decomposed()); + return *decomposed().get_operator_ptr(); + } + + CCPairFunction& operator*=(const double fac) { + if (component->is_pure()) pure()*=fac; + if (component->is_decomposed()) decomposed()*=fac; + return *this; + } + + /// print the size of the functions + void print_size() const { + if (component) component->print_size(); + }; + + std::string name() const { + if (not component) return "empty"; + return component->name(); + } + + /// @param[in] f: a 3D-CC_function + /// @param[in] particle: the particle on which the operation acts + /// @param[out] _particle (projection from 6D to 3D) + real_function_3d project_out(const CCFunction& f, const size_t particle) const; + + // result is: _particle + /// @param[in] x: a 3D-CC_function + /// @param[in] op: a CC_convoltion_operator which is currently either f12 or g12 + /// @param[in] particle: the particle on which the operation acts (can be 1 or 2) + /// @param[out] the operator is applied and afterwards a convolution with the delta function makes a 3D-function: _particle + real_function_3d + dirac_convolution(const CCFunction& x, const CCConvolutionOperator& op, const size_t particle) const; + + /// @param[out] particles are interchanged, if the function was u(1,2) the result is u(2,1) + CCPairFunction swap_particles() const { + CCPairFunction result(*this); + result.component->swap_particles_inplace(); + return result; + }; + + double + make_xy_u(const CCFunction& xx, const CCFunction& yy) const; + + double inner_internal(const CCPairFunction& other, const real_function_3d& R2) const; + + friend double inner(const CCPairFunction& a, const CCPairFunction& b, const real_function_3d& R2) { + return a.inner_internal(b,R2); + } + +public: + /// the 3 types of 6D-function that occur in the CC potential which coupled doubles to singles + std::shared_ptr component; + +// World& world; +// /// the type of the given 6D-function +// const PairFormat type; +// /// if type==decomposed this is the first particle +// vector_real_function_3d a; +// /// if type==decomposed this is the second particle +// vector_real_function_3d b; +// /// if type==op_decomposed_ this is the symmetric 6D-operator (g12 or f12) in u=op12|xy> +// const CCConvolutionOperator *op; +// /// if type==op_decomposed_ this is the first particle in u=op12|xy> +// CCFunction x; +// /// if type==op_decomposed_ this is the second particle in u=op12|xy> +// CCFunction y; +// /// if type=pure_ this is just the MRA 6D-function +// real_function_6d u; + + /// @param[in] f: a 3D-CC_function + /// @param[in] particle: the particle on which the operation acts + /// @param[out] _particle (projection from 6D to 3D) for the case that u=|ab> so _particle = *|b> if particle==1 + real_function_3d project_out_decomposed(const real_function_3d& f, const size_t particle) const; + + /// @param[in] f: a 3D-CC_function + /// @param[in] particle: the particle on which the operation acts + /// @param[out] _particle (projection from 6D to 3D) for the case that u=op|xy> so _particle = *|y> if particle==1 + real_function_3d project_out_op_decomposed(const CCFunction& f, const size_t particle) const; + + /// @param[in] x: a 3D-CC_function + /// @param[in] op: a CC_convoltion_operator which is currently either f12 or g12 + /// @param[in] particle: the particle on which the operation acts (can be 1 or 2) + /// @param[out] the operator is applied and afterwards a convolution with the delta function makes a 3D-function: _particle + /// in this case u=|ab> and the result is _1 = *|b> for particle==1 + real_function_3d + dirac_convolution_decomposed(const CCFunction& x, const CCConvolutionOperator& op, const size_t particle) const; + + /// small helper function that gives back (a,b) or (b,a) depending on the value of particle + const std::pair assign_particles(const size_t particle) const; +}; +} // namespace madness + +#endif //MADNESS_CCPAIRFUNCTION_H diff --git a/src/apps/chem/test_ccpairfunction.cc b/src/apps/chem/test_ccpairfunction.cc new file mode 100644 index 00000000000..27ace464f8b --- /dev/null +++ b/src/apps/chem/test_ccpairfunction.cc @@ -0,0 +1,226 @@ +// +// Created by Florian Bischoff on 6/27/22. +// + + +#include +#include +#include +#include +#include + +#include + +using namespace madness; + + +int test_overlap(World& world, std::shared_ptr ncf, const Molecule& molecule, + const CCParameters& parameters) { + CCTimer timer(world, "testing"); + auto R2 = ncf->square(); + + CCConvolutionOperator g12(world, OT_G12, parameters); + CCConvolutionOperator f12(world, OT_F12, parameters); + + CorrelationFactor corrfac(world, 1.0, 1.e-7, molecule); + + auto g = [](const coord_3d& r) { return exp(-1.0 * r.normf()); }; + real_function_3d f1 = real_factory_3d(world).f(g); + real_function_3d R2f = R2 * f1; + double norm = inner(f1, R2f); + f1.scale(1.0 / sqrt(norm)); + R2f.scale(1.0 / sqrt(norm)); + CC_vecfunction mo_ket_(std::vector(1, f1), HOLE); + CC_vecfunction mo_bra_(std::vector(1, R2f), HOLE); + + bool passed_lo = true; + bool passed_hi = true; + bool success=true; + int isuccess=0; + const double lo = parameters.thresh_6D(); + const double hi = parameters.thresh_3D(); + const double hi_loose = parameters.thresh_3D()*5.0; + + print("threshold 3D / 6D", hi,lo); + test_output t1("CCPairFunction::inner"); + + // f^2 = 1/(4y^2)(1 - 2*f2(y) + f2(2y)) , f2(2y) =f2(y)^2 + const double y = parameters.gamma(); + SeparatedConvolution f = SlaterF12Operator(world, y, parameters.lo(), parameters.thresh_bsh_3D()); + SeparatedConvolution f2 = SlaterOperator(world, y, parameters.lo(), parameters.thresh_bsh_3D()); + SeparatedConvolution ff = SlaterOperator(world, 2.0 * y, parameters.lo(), parameters.thresh_bsh_3D()); + + real_function_3d a = mo_ket_(0).function; + real_function_3d b = mo_ket_(0).function; + real_function_6d fab_6d = CompositeFactory(world).g12(corrfac.f()).particle1(copy(a)).particle2( + copy(b)); + fab_6d.fill_tree().truncate().reduce_rank(); + fab_6d.print_size("fab_6d"); + + real_function_3d aR = mo_bra_(0).function; + real_function_3d bR = mo_bra_(0).function; + + const real_function_3d aa = (aR * a).truncate(); + const real_function_3d bb = (bR * b).truncate(); + const real_function_3d af2a = f2(aa); + const real_function_3d affa = ff(aa); + const real_function_3d afa = f(aa); + + const double prefactor = 1.0 / (4 * y * y); + const double ab_f2_ab = prefactor * (aR.inner(a) * bR.inner(b) - 2.0 * bb.inner(af2a) + bb.inner(affa)); + const double ab_f_ab = inner(f(aa), bb); + + const long rank = world.rank(); + auto printer = [&rank](std::string msg, const double result, const double reference, const double time) { + if (rank == 0) { + long len = std::max(0l, long(40 - msg.size())); + msg += std::string(len, ' '); + std: + cout << msg << std::fixed << std::setprecision(8) << "result, ref, diff " + << result << " " << reference << " " << std::setw(9) << std::setprecision(2) << std::scientific + << result - reference + << ", elapsed time " << std::fixed << std::setw(5) << std::setprecision(2) << time << std::endl; + } + }; + t1.checkpoint(true, "initialization"); + + double time_init = timer.reset(); + if (world.rank() == 0) print("time spent in initializing ", time_init); + { + CCPairFunction fab(world, &f12, a, b); + const double test1 = inner(fab, fab, R2); + const double diff = test1 - ab_f2_ab; + if (fabs(diff) > lo) passed_lo = false; + if (fabs(diff) > hi) passed_hi = false; + + printer(" op_dec/op_dec : ", test1, ab_f2_ab, timer.reset()); + success=(fabs(diff) < hi); + } + if (not success) isuccess++; + t1.checkpoint(success, "op_dec/op_dec"); + { + CCPairFunction ab(world, mo_ket_.get_vecfunction(), mo_ket_.get_vecfunction()); + const double test1 = inner(ab, ab, R2); + const double test2 = double(mo_ket_.size()); // mos are normed + const double diff = test1 - test2; + printer(" dec/dec : ", test1, double(mo_ket_.size()), timer.reset()); + if (fabs(diff) > lo) passed_lo = false; + if (fabs(diff) > hi) passed_hi = false; + success=(fabs(diff) < hi); + } + if (not success) isuccess++; + t1.checkpoint(success, "dec/dec"); + { + CCPairFunction fab(world, fab_6d); + const double test1 = inner(fab, fab, R2); + const double diff = test1 - ab_f2_ab; + printer(" pure/pure : ", test1, ab_f2_ab, timer.reset()); + if (fabs(diff) > lo) passed_lo = false; + if (fabs(diff) > hi) passed_hi = false; + success=(fabs(diff) < hi_loose); + } + if (not success) isuccess++; + t1.checkpoint(success, "pure/pure"); + + { + CCPairFunction ab1(world, mo_ket_.get_vecfunction(), mo_ket_.get_vecfunction()); + CCPairFunction fab(world, &f12, a, b); + timer.reset(); + const double test1 = inner(ab1, fab, R2); + const double test2 = ab_f_ab; + const double diff = test1 - test2; + printer(" dec/op_dec : ", test1, ab_f_ab, timer.reset()); + if (fabs(diff) > lo) passed_lo = false; + if (fabs(diff) > hi) passed_hi = false; + success=(fabs(diff) < hi); + } + if (not success) isuccess++; + t1.checkpoint(success, "dec/op_dec"); + + { + // the next tests evaulate in different ways + CCPairFunction fab(world, fab_6d); + CCPairFunction ab2(world, mo_ket_.get_vecfunction(), mo_ket_.get_vecfunction()); + const double test1 = inner(fab, ab2, R2); + const double test2 = bb.inner(afa); + const double diff = test1 - test2; + printer(" dec/pure", test1, test2, timer.reset()); + if (fabs(diff) > lo) passed_lo = false; + if (fabs(diff) > hi) passed_hi = false; + + success=(fabs(diff) < hi_loose); + } + if (not success) isuccess++; + t1.checkpoint(success, "dec/pure"); +// { +// CCPairFunction fab(world, fab_6d); +// CCPairFunction ab2(world, ab_6d); +// const double test1 = overlap(fab, ab2); +// const double test2 = bb.inner(afa); +// const double diff = test1 - test2; +// if (world.rank() == 0) +// std::cout << "Overlap Test 6 : " << std::fixed << std::setprecision(10) << "result=" << test1 +// << ", test=" << test2 << ", diff=" << diff << "\n"; +// if (fabs(diff) > lo) passed_lo = false; +// if (fabs(diff) > hi) passed_hi = false; +// } + { + CCPairFunction fab(world, &f12, a, b); + CCPairFunction ab2(world, fab_6d); + const double test1 = inner(fab, ab2, R2); + const double test2 = ab_f2_ab; + const double diff = test1 - test2; + printer(" op_dec/pure : ", test1, test2, timer.reset()); + if (fabs(diff) > lo) passed_lo = false; + if (fabs(diff) > hi) passed_hi = false; + success=(fabs(diff) < hi_loose); // be a bit loose here .. + } + if (not success) isuccess++; + t1.checkpoint(success, "op_dec/pure"); + + { + CCPairFunction fab(world, &f12, a, b); + CCPairFunction ab2(world, mo_ket_.get_vecfunction(), mo_ket_.get_vecfunction()); + timer.reset(); + const double test1 = inner(fab, ab2, R2); +// const double test2 = bb.inner(afa); + const double test2 = ab_f_ab; + const double diff = test1 - test2; + printer(" op_dec/dec : ", test1, test2, timer.reset()); + if (fabs(diff) > lo) passed_lo = false; + if (fabs(diff) > hi) passed_hi = false; + success=(fabs(diff) < hi); + } + if (not success) isuccess++; + t1.checkpoint(success, "op_dec/dec"); + + return isuccess; +} + +int main(int argc, char **argv) { + + + madness::World& world = madness::initialize(argc, argv); + startup(world, argc, argv); + commandlineparser parser(argc, argv); + int isuccess=0; +#ifdef USE_GENTENSOR + { + parser.set_keyval("geometry", "source=library,he"); + parser.print_map(); + Molecule mol(world, parser); + mol.print(); + CCParameters ccparam(world, parser); + + std::shared_ptr ncf = create_nuclear_correlation_factor(world, + mol, nullptr, std::make_pair("slater", 2.0)); + + isuccess+=test_overlap(world, ncf, mol, ccparam); + } +#else + print("could not run test_ccpairfunction: U need to compile with ENABLE_GENTENSOR=1"); +#endif + finalize(); + + return isuccess; +} \ No newline at end of file From 5524c98082ca8d2a0fc4d8484d8f980151090c0c Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 15 Jul 2022 09:56:54 +0200 Subject: [PATCH 0170/1312] fixed reading from a xyz file --- src/apps/chem/molecule.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/apps/chem/molecule.cc b/src/apps/chem/molecule.cc index db99ec68032..4331691ed44 100644 --- a/src/apps/chem/molecule.cc +++ b/src/apps/chem/molecule.cc @@ -278,7 +278,9 @@ void Molecule::read_xyz(const std::string filename) { } if (current_line==2) continue; // ignore comment line double xx, yy, zz; - ss >> tag >> xx >> yy >> zz; + if (not (ss >> tag >> xx >> yy >> zz)) { + MADNESS_EXCEPTION(std::string("error reading the xyz input file"+filename).c_str(),1); + }; xx *= scale; yy *= scale; zz *= scale; @@ -288,6 +290,7 @@ void Molecule::read_xyz(const std::string filename) { //check if pseudo-atom or not bool psat = check_if_pseudo_atom(tag); add_atom(xx,yy,zz,qq,atn,psat); + if (current_line==natom_expected+2) break; } MADNESS_CHECK(natom_expected==natom()); update_rcut_with_eprec(parameters.eprec()); From 6c3ebad8e95ffc27a0650740f2c575defe3232fb Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 15 Jul 2022 10:17:40 +0200 Subject: [PATCH 0171/1312] more on documentation --- doc/Makefile | 4 ++-- doc/conf.py | 6 +++--- doc/index.rst | 9 +++++++-- doc/quantum.md | 29 +++++++++++++++++++++++++++-- doc/runtime.md | 2 +- 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index d0c3cbf1020..18fd53ecd53 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -4,8 +4,8 @@ # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = source +SPHINXBUILD ?= sphinx-build-3.9 +SOURCEDIR = . BUILDDIR = build # Put it first so that "make" without argument is like "make help". diff --git a/doc/conf.py b/doc/conf.py index 9e2a39c8f9e..99f4f93eabd 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -19,9 +19,9 @@ # -- Project information ----------------------------------------------------- -project = 'madness' -copyright = '2022, Robert Harrison' -author = 'Robert Harrison' +project = 'MADNESS' +copyright = '2022, Florian Bischoff' +author = 'Florian Bischoff' # -- General configuration --------------------------------------------------- diff --git a/doc/index.rst b/doc/index.rst index 21e01298d87..a097b245981 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -3,8 +3,13 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to madness's documentation! -=================================== +Welcome to MADNESS +================== +Multiresolution Adaptive Numerical Environment for Scientific Simulation + +MADNESS provides a high-level environment for the solution of integral and differential equations in many dimensions using adaptive, fast methods with guaranteed precision based on multi-resolution analysis and novel separated representations. There are three main components to MADNESS. At the lowest level is a new petascale parallel programming environment that increases programmer productivity and code performance/scalability while maintaining backward compatibility with current programming tools such as MPI and Global Arrays. The numerical capabilities built upon the parallel tools provide a high-level environment for composing and solving numerical problems in many (1-6+) dimensions. Finally, built upon the numerical tools are new applications with initial focus upon chemistry, atomic and molecular physics, material science, and nuclear structure. + + .. toctree:: :maxdepth: 2 diff --git a/doc/quantum.md b/doc/quantum.md index ddb885470e5..5dc080fb87c 100644 --- a/doc/quantum.md +++ b/doc/quantum.md @@ -39,11 +39,19 @@ together with a short description and further information. ## Input file The input file consists of data groups, starting with the relevant keyword, e.g. "dft" and ending with "end". All parameters in a data group are given as key/value pairs, where the value can be an integer, a double, a string -even a vector or pair +even a vector or pair. + +A sample input file looks like >dft\ >  charge 1   # comment\ >  ncf (slater,2.0) # value is a pair of string and double\ >end +> +> geometry\ +> O 0 0 0\ +> H 0 1 1\ +> H 0 1 -1\ +> end Blank lines are ignored, as is everything after a hashtag. The input file is case-insensitive. @@ -53,7 +61,7 @@ Pairs and vectors must be encased in parantheses or brackets, their entries must ## Command line options The data groups in the input file can also be set or augmented through the command line, e.g. the following line will pass the same calculation parameters as the input file above. -> nemo --dft="charge=1; ncf=(slater,2.0)" +> `nemo --dft="charge=1; ncf=(slater,2.0)"` Different key/value pairs are separated by a semicolon to indicate a newline. If a given parameter is specified both in the input file and the command line, the command line parameters have @@ -76,3 +84,20 @@ to practically zero at the box boundary. Note that excited states or anions can The box size is given in atomic units (1 a.u. = 52 pm). Generally it is advisable to use as few numerical parameters as possible, as they are usually dependent on each other + +## Geometry input +The geometry of the molecule is given in the geometry data group. +By default atomic units are used, but angstrom can be switched on by adding the line +> geometry\ +> units angs\ +> ..\ +> end + +The following example will read an external xyz file, using angstrom by default +>geometry\ +> source h2o.xyz\ +> end + +or you can use the command line options (short and long version) +> `nemo --geometry="source=h2o.xyz"`\ +> `nemo --geometry="source=[xyz,h2o.xyz]"` diff --git a/doc/runtime.md b/doc/runtime.md index 82da33d1474..13db81a6cc3 100644 --- a/doc/runtime.md +++ b/doc/runtime.md @@ -1,4 +1,4 @@ -# MADNESS runtime +# Runtime The MADNESS runtime allows for massively parallel, hybrid parallel computation of complex algorithms. The runtime can be used by external codes. \ No newline at end of file From 5ac708a33b0c59864f9950baac4694f25b11724b Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 15 Jul 2022 10:22:18 +0200 Subject: [PATCH 0172/1312] more on documentation --- doc/quantum.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/quantum.md b/doc/quantum.md index 5dc080fb87c..103eac39843 100644 --- a/doc/quantum.md +++ b/doc/quantum.md @@ -61,7 +61,8 @@ Pairs and vectors must be encased in parantheses or brackets, their entries must ## Command line options The data groups in the input file can also be set or augmented through the command line, e.g. the following line will pass the same calculation parameters as the input file above. -> `nemo --dft="charge=1; ncf=(slater,2.0)"` + +`nemo --dft="charge=1; ncf=(slater,2.0)"` Different key/value pairs are separated by a semicolon to indicate a newline. If a given parameter is specified both in the input file and the command line, the command line parameters have From fe625eb2cb704b42d161a49c14f8848ade23317f Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 15 Jul 2022 10:37:57 +0200 Subject: [PATCH 0173/1312] more on documentation --- README.md | 6 ++++-- doc/quantum.md | 28 +++++++++++++++------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 795f1328f1e..f28e2c19874 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -madness +MADNESS ======= Multiresolution Adaptive Numerical Environment for Scientific Simulation @@ -7,7 +7,9 @@ Multiresolution Adaptive Numerical Environment for Scientific Simulation MADNESS provides a high-level environment for the solution of integral and differential equations in many dimensions using adaptive, fast methods with guaranteed precision based on multi-resolution analysis and novel separated representations. There are three main components to MADNESS. At the lowest level is a new petascale parallel programming environment that increases programmer productivity and code performance/scalability while maintaining backward compatibility with current programming tools such as MPI and Global Arrays. The numerical capabilities built upon the parallel tools provide a high-level environment for composing and solving numerical problems in many (1-6+) dimensions. Finally, built upon the numerical tools are new applications with initial focus upon chemistry, atomic and molecular physics, material science, and nuclear structure. -Please look in the [wiki](https://github.com/m-a-d-n-e-s-s/madness/wiki) for more information and project activity. +A still incomplete documentation can be found on [readthedocs](https://madness.readthedocs.io/en/latest/). + + Here's a [video](http://www.youtube.com/watch?v=dBwWjmf5Tic) about MADNESS. diff --git a/doc/quantum.md b/doc/quantum.md index 103eac39843..af04a254fa6 100644 --- a/doc/quantum.md +++ b/doc/quantum.md @@ -3,24 +3,26 @@ ## What you can do Quantum chemical capabilities are: - * SCF: Hartree-Fock and DFT, also in strong magnetic fields - * analytical gradients for SCF - * second nuclear derivatives for SCF (field-free case only) - * CIS - * response properties - * MP2 - * ADC(2), CIS(D) - * CC2 ground and excited states - * PNO-MP2 + * SCF: Hartree-Fock and DFT, also in strong magnetic fields: `moldft, nemo, znemo` + * analytical gradients for SCF: `moldft, nemo, znemo` + * second nuclear derivatives for SCF (field-free case only), `nemo` + * CIS, `cis, zcis` + * response properties, `molresponse` + * MP2, `cc2` + * ADC(2), CIS(D), `cc2` + * CC2 ground and excited states, `cc2` + * PNO-MP2, `pno` ## Quickstart A quick help and an overview over all available codes can be obtained by -> madqc --help + +`madqc --help` All programs can read commandline options or an input file (by default this is named "input"). A full list of all available calculation parameters can be obtained by writing -> qccode --help + +`qccode --help` where qccode stands for any of the qc codes (e.g. moldft, cc2, nemo, ..) @@ -28,10 +30,10 @@ where qccode stands for any of the qc codes (e.g. moldft, cc2, nemo, ..) ## Calculation parameters All calculations require parameters, specifying the molecule, the quantum chemical model, charge etc. If no parameters are given, default parameters will be used. Only the molecule itself must be specified by the user. -Paramters can be specified through an input file and/or command line options +Parameters can be specified through an input file and/or command line options. Some parameters depend on each other and are set automatically, e.g. certain numerical parameters, or the use of -point group symmetry. +point group symmetry. Paremters set by the user are always respected. In the output files of the calculations the complete set of input parameters are printed out, together with a short description and further information. From f813117c33801723fd77d8d69f6319b57ab8b345 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 22 Jul 2022 21:09:18 +0200 Subject: [PATCH 0174/1312] more documentation --- doc/quantum.md | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/doc/quantum.md b/doc/quantum.md index af04a254fa6..dfae324a515 100644 --- a/doc/quantum.md +++ b/doc/quantum.md @@ -12,6 +12,7 @@ Quantum chemical capabilities are: * ADC(2), CIS(D), `cc2` * CC2 ground and excited states, `cc2` * PNO-MP2, `pno` + * OEP/RKS, `oep` ## Quickstart A quick help and an overview over all available codes can be @@ -24,7 +25,7 @@ A full list of all available calculation parameters can be obtained by writing `qccode --help` -where qccode stands for any of the qc codes (e.g. moldft, cc2, nemo, ..) +where `qccode` stands for any of the qc codes (e.g. moldft, cc2, nemo, ..) ## Calculation parameters @@ -60,6 +61,12 @@ The input file is case-insensitive. The key/value pairs can be separated by blanks or by the equal sign. Pairs and vectors must be encased in parantheses or brackets, their entries must be separated by commas. +All programs will output the complete list of input options. You can always run +> `qccode --help` + +which will output the input parameters and the copy/paste the options verbatim. +Note the once an option appears in the input file it will be considered user-defined and will override all default or derived values. + ## Command line options The data groups in the input file can also be set or augmented through the command line, e.g. the following line will pass the same calculation parameters as the input file above. @@ -70,6 +77,9 @@ Different key/value pairs are separated by a semicolon to indicate a newline. If a given parameter is specified both in the input file and the command line, the command line parameters have priority over input file parameters. +The name of the input file can be changed by +> `nemo --input=customfile` + ## Numerical parameters Numerical parameters are specified in the dft block, the most important ones that will @@ -97,10 +107,27 @@ By default atomic units are used, but angstrom can be switched on by adding the > end The following example will read an external xyz file, using angstrom by default +Note that key is `source`, and value is the pair `xyz`,`h2o.xyz` to indicate that an +xyz file is to be used >geometry\ -> source h2o.xyz\ +> source [xyz,h2o.xyz]\ > end or you can use the command line options (short and long version) > `nemo --geometry="source=h2o.xyz"`\ > `nemo --geometry="source=[xyz,h2o.xyz]"` + +A small number of geometries are stored in a library, accessible through +> `nemo --geometry="source=library, h2o"` + +## Geometry optimization +For the following codes/methods there are gradients implemented: +> `nemo`, `moldft`, `znemo` + +The optimization is started with the `gopt` flag in the `dft` block, geometry optimization +parameters are set in the `geoopt` block. +> `nemo --dft="k=8; econv=1.e-5; gopt=1" --geoopt="maxiter=10" --geometry="source=library, h2o"` + +## Convenience short options (Wish list) +`--optimize` optimize the geometry\ +`--geometry=file.xyz` find the geometry in the xyz file (note Angstrom units!) From 9b77a4b03f90c0a2fbf12216285b466859d2b0ad Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 28 Jul 2022 08:40:52 -0400 Subject: [PATCH 0175/1312] added accessor for the parsec context initialized by madness --- src/madness/world/parsec.cc | 36 +++++++++++++++++++----------------- src/madness/world/parsec.h | 5 +++-- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/madness/world/parsec.cc b/src/madness/world/parsec.cc index ce4af834b7b..f867d8b9639 100644 --- a/src/madness/world/parsec.cc +++ b/src/madness/world/parsec.cc @@ -91,7 +91,7 @@ namespace madness { }; const parsec_task_class_t* madness_parsec_tc_array[]= {&(madness::madness_parsec_tc), NULL}; - parsec_taskpool_t ParsecRuntime::taskpool = { + parsec_taskpool_t ParsecRuntime::tp = { .super = { 0x0, }, .taskpool_id = 0, .taskpool_name = (char*)"MADNESS taskpool", @@ -117,42 +117,44 @@ namespace madness { .dependencies_array = NULL, .repo_array = NULL }; - parsec_context_t *ParsecRuntime::context = nullptr; + parsec_context_t *ParsecRuntime::ctx = nullptr; #ifdef PARSEC_PROF_TRACE int ParsecRuntime::taskpool_profiling_array[2]; #endif ParsecRuntime::ParsecRuntime(int nb_threads) { - assert(context == nullptr); + assert(ctx == nullptr); /* Scheduler init*/ int argc = 1; char *argv[2] = { (char *)"madness-app", nullptr }; char **pargv = (char **)argv; - context = parsec_init(nb_threads, &argc, &pargv); + ctx = parsec_init(nb_threads, &argc, &pargv); MPI_Comm parsec_comm = MPI_COMM_SELF; - parsec_remote_dep_set_ctx(context, (intptr_t)parsec_comm); + parsec_remote_dep_set_ctx(ctx, (intptr_t)parsec_comm); #ifdef PARSEC_PROF_TRACE taskpool.profiling_array = ParsecRuntime::taskpool_profiling_array; parsec_profiling_add_dictionary_keyword("MADNESS TASK", "fill:CC2828", 0, "", (int *)&taskpool.profiling_array[0], (int *)&taskpool.profiling_array[1]); #endif - if( 0 != parsec_context_add_taskpool(context, &taskpool) ) { + if( 0 != parsec_context_add_taskpool(ctx, &tp) ) { std::cerr << "ERROR: parsec_context_add_taskpool failed!!" << std::endl; } - parsec_taskpool_update_runtime_nbtask(&taskpool, 1); - if( 0 != parsec_context_start(context) ) { + parsec_taskpool_update_runtime_nbtask(&tp, 1); + if( 0 != parsec_context_start(ctx) ) { std::cerr << "ERROR: context_context_start failed!!" << std::endl; } } ParsecRuntime::~ParsecRuntime() { - parsec_fini(&context); - context = nullptr; + parsec_fini(&ctx); + ctx = nullptr; } + parsec_context_t *ParsecRuntime::context() { return ctx; } + parsec_task_t ParsecRuntime::task(bool is_high_priority, void *ptr) { parsec_task_t parsec_task{}; - parsec_task.taskpool = &taskpool; + parsec_task.taskpool = &tp; parsec_task.task_class = &madness_parsec_tc; parsec_task.chore_id = 0; parsec_task.status = PARSEC_TASK_STATUS_NONE; @@ -164,22 +166,22 @@ namespace madness { void ParsecRuntime::schedule(PoolTaskInterface *task) { parsec_task_t *parsec_task = &(task->parsec_task); PARSEC_LIST_ITEM_SINGLETON(parsec_task); - taskpool.tdm.module->taskpool_addto_nb_tasks(&taskpool, 1); - __parsec_schedule(context->virtual_processes[0]->execution_streams[0], parsec_task, 0); + tp.tdm.module->taskpool_addto_nb_tasks(&tp, 1); + __parsec_schedule(ctx->virtual_processes[0]->execution_streams[0], parsec_task, 0); } void ParsecRuntime::wait() { - parsec_taskpool_update_runtime_nbtask(&taskpool, -1); - parsec_context_wait(context); + parsec_taskpool_update_runtime_nbtask(&tp, -1); + parsec_context_wait(ctx); } int ParsecRuntime::test() { - int rc = parsec_taskpool_test(&taskpool); + int rc = parsec_taskpool_test(&tp); assert(rc >= 0); return rc; } - extern "C"{ + extern "C"{ #include diff --git a/src/madness/world/parsec.h b/src/madness/world/parsec.h index 0b4cb80590d..d2ecb9c0c36 100644 --- a/src/madness/world/parsec.h +++ b/src/madness/world/parsec.h @@ -19,8 +19,8 @@ namespace madness{ class ParsecRuntime { private: - static parsec_context_t *context; - static parsec_taskpool_t taskpool; + static parsec_context_t *ctx; + static parsec_taskpool_t tp; #ifdef PARSEC_PROF_TRACE static int taskpool_profiling_array[2]; #endif /* PARSEC_PROF_TRACE */ @@ -29,6 +29,7 @@ namespace madness{ ParsecRuntime(int nb_threads); ~ParsecRuntime(); + static parsec_context_t* context(); static void schedule(PoolTaskInterface* task); static int test(); static void wait(); From d930b4f802a38fbd5dd691691e9b7c51fa33ec53 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Thu, 28 Jul 2022 23:48:55 +0200 Subject: [PATCH 0176/1312] simplified geometry input --- src/apps/chem/QCCalculationParametersBase.h | 10 ++- src/apps/chem/molecule.cc | 76 +++++++++++++------- src/apps/chem/molecule.h | 79 ++++++++++++++++----- src/apps/chem/nemo.h | 21 ++++++ src/apps/nemo/nemo.cc | 69 +++++++++--------- 5 files changed, 177 insertions(+), 78 deletions(-) diff --git a/src/apps/chem/QCCalculationParametersBase.h b/src/apps/chem/QCCalculationParametersBase.h index 3b986d15893..eb5b87bf727 100644 --- a/src/apps/chem/QCCalculationParametersBase.h +++ b/src/apps/chem/QCCalculationParametersBase.h @@ -143,6 +143,10 @@ struct QCParameter { set_all(); } + bool is_user_defined() const { + return (precedence==defined); + } + std::string get_value() const {return value;} std::string get_type() const {return type;} std::string get_comment() const {return comment;} @@ -222,7 +226,7 @@ struct QCParameter { } - std::string value=""; + std::string value; std::string default_value=""; std::string derived_value=""; std::string user_defined_value=""; @@ -267,6 +271,10 @@ class QCCalculationParametersBase { return fromstring(parameter.get_value()); } + bool is_user_defined(std::string key) const { + return get_parameter(key).is_user_defined(); + } + template void serialize (Archive& ar) { ar & parameters & print_debug; } diff --git a/src/apps/chem/molecule.cc b/src/apps/chem/molecule.cc index 4331691ed44..a6551c0c0aa 100644 --- a/src/apps/chem/molecule.cc +++ b/src/apps/chem/molecule.cc @@ -88,24 +88,33 @@ Molecule::Molecule(World& world, const commandlineparser& parser) :parameters(wo MADNESS_CHECK(parameters.field().size()==3); for (int i=0; i<3; ++i) field(i)=parameters.field()[i]; } catch (...) { - std::cout << "something went wrong in the geometry input" << std::endl; + std::cout << "\n\nsomething went wrong in the geometry input" << std::endl; std::cout << "geometry parameters " << std::endl << std::endl; parameters.print("geometry","end"); - MADNESS_EXCEPTION("faulty geometry input",1); + throw madness::MadnessException("faulty geometry input",0,1,__LINE__,__FUNCTION__,__FILE__); } } +void Molecule::print_parameters() { + GeometryParameters param; + madness::print("default parameters for the geometry input"); + madness::print("You need to add the molecular geometry in the format"); + madness::print(" symbol x y z"); + madness::print(" symbol x y z"); + madness::print(" symbol x y z"); + param.print("geometry","end"); +} + void Molecule::get_structure() { // read input parameters from the input file - std::vector src=parameters.source(); - MADNESS_CHECK(src.size()==2); - std::string source=src[0]; + std::string sourcetype=parameters.source_type(); + std::string sourcename=parameters.source_name(); - if (source == "inputfile") { + if (sourcetype == "inputfile") { try { - std::ifstream ifile(src[1]); + std::ifstream ifile(sourcename); read(ifile); } catch (const std::exception& err) { std::cout << "caught runtime error: " << err.what() << std::endl; @@ -114,20 +123,21 @@ void Molecule::get_structure() { } - } else if (source == "library") { - read_structure_from_library(src[1]); - } else if (source == "xyz") { + } else if (sourcetype == "library") { + read_structure_from_library(sourcename); + } else if (sourcetype == "xyz") { try { - read_xyz(src[1]); + read_xyz(sourcename); } catch (std::exception& err) { - std::cout << "could not read from xyz-file " << src[1] << std::endl; - std::cout << "source " << src[0] << " " << src[1] << std::endl; + std::cout << "could not read from xyz-file " << sourcename << std::endl; + std::cout << "source " << sourcetype << " " << sourcename << std::endl; MADNESS_EXCEPTION("failed to get geometry",1); } } else { std::cout << "could not determine molecule" << std::endl; - std::cout << "source " << src[0] << " " << src[1] << std::endl; + std::cout << " source_type " << sourcetype << std::endl; + std::cout << " source_name " << sourcename << std::endl; MADNESS_EXCEPTION("failed to get geometry",1); } @@ -163,27 +173,41 @@ void Molecule::get_structure() { }; -void Molecule::read_structure_from_library(const std::string& name) { - - // get the location of the structure library - std::string chemdata_dir(MRA_CHEMDATA_DIR); +std::istream& Molecule::position_stream_in_library(std::ifstream& f, const std::string& name) { + // get the location of the structure library + std::string chemdata_dir(MRA_CHEMDATA_DIR); if (getenv("MRA_CHEMDATA_DIR")) chemdata_dir=std::string(getenv("MRA_CHEMDATA_DIR")); - std::string library=chemdata_dir+"/structure_library"; + std::string library=chemdata_dir+"/structure_library"; + + f.open(library); + std::string errmsg; - std::ifstream f(library); if(f.fail()) { - std::string errmsg = std::string("Failed to open structure library: ") + library; - MADNESS_EXCEPTION(errmsg.c_str(), 0); + std::string("Failed to open structure library: ") + library; + } else { + try { + std::string full_line="structure="+name; + madness::position_stream_to_word(f, full_line,'#',true,true); + } catch (...) { + errmsg = "could not find structure " + name + " in the library\n\n"; + } } + if (not errmsg.empty()) { + throw MadnessException(errmsg.c_str(),0,0,__LINE__,__FUNCTION__,__FILE__); + } + return f; +} + +void Molecule::read_structure_from_library(const std::string& name) { + try { - madness::position_stream(f, name); + std::ifstream f; + position_stream_in_library(f,name); + this->read(f); } catch (...) { std::string errmsg = "could not find structure " + name + " in the library\n\n"; MADNESS_EXCEPTION(errmsg.c_str(), 0); } - - this->read(f); - } diff --git a/src/apps/chem/molecule.h b/src/apps/chem/molecule.h index f00b70b5dd3..bbfd4677a2d 100644 --- a/src/apps/chem/molecule.h +++ b/src/apps/chem/molecule.h @@ -121,6 +121,8 @@ class Molecule { read_input_and_commandline_options(world, parser, "geometry"); set_derived_values(parser); } catch (...) { + print("geometry","end"); + MADNESS_EXCEPTION("faulty geometry input",1); } } @@ -129,7 +131,9 @@ class Molecule { ignore_unknown_keys_silently=true; throw_if_datagroup_not_found=true; - initialize>("source",{"inputfile"},"where to get the coordinates from: ({inputfile}, {library,xxx}, {xyz,xxx.xyz})"); +// initialize>("source",{"inputfile"},"where to get the coordinates from: ({inputfile}, {library,xxx}, {xyz,xxx.xyz})"); + initialize("source_type","inputfile","where to get the coordinates from",{"inputfile","xyz","library"}); + initialize("source_name","","name of the geometry from the library or the input file"); initialize("eprec",1.e-4,"smoothing for the nuclear potential"); initialize("units","atomic","coordinate units",{"atomic","angstrom"}); initialize>("field",{0.0,0.0,0.0},"external electric field"); @@ -141,27 +145,55 @@ class Molecule { } void set_derived_values(const commandlineparser& parser) { - std::vector src=source(); - - // some convenience for the user - - // if source is the input file provide the name of the input file - if (src.size()==1 and src[0]=="inputfile") - set_derived_value("source",std::vector({src[0],parser.value("input")})); - // if source is not "inputfile" or "library" assume an xyz file - if (src.size()==1 and src[0]!="inputfile") { - std::size_t found=src[0].find("xyz"); - if (found==src[0].size()-3) { // check input file ends with xyz - set_user_defined_value("source", std::vector({"xyz", src[0]})); - } else { - throw std::runtime_error("error in deriving geometry parameters"); + // check if we use an xyz file, the structure library or the input file + std::string src_type= derive_source_type_from_name(source_name()); + set_derived_value("source_type",src_type); + + // check for ambiguities in the derived source type + if (not is_user_defined("source_type")) { + bool found_geometry_file=std::filesystem::exists(source_name()); + + bool geometry_found_in_library=true; + try { // check for existence of file and structure in the library + std::ifstream f; + position_stream_in_library(f,source_name()); + } catch(...){ + geometry_found_in_library=false; + } + + if (found_geometry_file and geometry_found_in_library) { + madness::print("\n\n"); + madness::print("geometry specification ambiguous: found geometry in the structure library and in a file\n"); + madness::print(" ",source_name()); + madness::print("\nPlease specify the location of your geometry input by one of the two lines:\n"); + madness::print(" source_type xyx"); + madness::print(" source_type library\n\n"); + MADNESS_EXCEPTION("faulty input\n\n",1); } } - if (source()[0]=="xyz") set_derived_value("units",std::string("angstrom")); +// std::vector src=source(); +// +// // some convenience for the user +// +// // if source is the input file provide the name of the input file +// if (src.size()==1 and src[0]=="inputfile") +// set_derived_value("source",std::vector({src[0],parser.value("input")})); +// // if source is not "inputfile" or "library" assume an xyz file +// if (src.size()==1 and src[0]!="inputfile") { +// std::size_t found=src[0].find("xyz"); +// if (found==src[0].size()-3) { // check input file ends with xyz +// set_user_defined_value("source", std::vector({"xyz", src[0]})); +// } else { +// throw std::runtime_error("error in deriving geometry parameters"); +// } +// } + + if (source_type()=="xyz") set_derived_value("units",std::string("angstrom")); } - std::vector source() const {return get>("source");} + std::string source_type() const {return get("source_type");} + std::string source_name() const {return get("source_name");} std::vector field() const {return get>("field");} double eprec() const {return get("eprec");} std::string units() const {return get("units");} @@ -170,6 +202,13 @@ class Molecule { bool pure_ae() const {return get("pure_ae");} bool no_orient() const {return get("no_orient");} + static std::string derive_source_type_from_name(const std::string name) { + if (name.empty()) return "input"; + std::size_t pos = name.find(".xyz"); + if (pos!=std::string::npos) return "xyz"; + return "library"; + } + }; private: @@ -186,6 +225,8 @@ class Molecule { public: GeometryParameters parameters; + static void print_parameters(); + std::string get_pointgroup() const {return pointgroup_;} private: @@ -212,6 +253,10 @@ class Molecule { void read_structure_from_library(const std::string& name); + static std::istream& position_stream_in_library(std::ifstream& f, const std::string& name); + + + /// print out a Gaussian cubefile header std::vector cubefile_header() const; diff --git a/src/apps/chem/nemo.h b/src/apps/chem/nemo.h index a214d9f4d03..f1fb9322349 100644 --- a/src/apps/chem/nemo.h +++ b/src/apps/chem/nemo.h @@ -375,6 +375,27 @@ class Nemo: public NemoBase, public QCPropertyInterface { std::string name() const {return "nemo";} bool selftest() {return false;} + static void help() { + print("\nNEMO \n"); + print("The nemo code computes Hartree-Fock and DFT energies, gradients and hessians using a nuclear correlation factor"); + print("that regularizes the singular nuclear potential. SCF orbitals for the basis for post-SCF calculations like"); + print("excitation energies (cis), correlation energies (cc2), local potentials (oep), etc\n\n"); + print("You can print all available calculation parameters by running\n"); + print("nemo --print_parameters\n"); + print("You can perform a simple calculation by running\n"); + print("nemo --geometry=h2o.xyz\n"); + print("provided you have an xyz file in your directory."); + + } + + static void print_parameters() { + NemoCalculationParameters param; + print("default parameters for the nemo program are"); + param.print("dft","end"); + print("\n\nthe molecular geometry must be specified in a separate block:"); + Molecule::print_parameters(); + } + virtual double value() {return value(calc->molecule.get_all_coords());} virtual double value(const Tensor& x); diff --git a/src/apps/nemo/nemo.cc b/src/apps/nemo/nemo.cc index e30a8ba9ea2..2f966f23841 100644 --- a/src/apps/nemo/nemo.cc +++ b/src/apps/nemo/nemo.cc @@ -70,49 +70,50 @@ int main(int argc, char** argv) { try { commandlineparser parser(argc,argv); - std::shared_ptr nemo(new Nemo(world,parser)); + if (parser.key_exists("help")) { + Nemo::help(); - if (world.rank()==0) nemo->get_param().print("dft","end"); -// if (world.rank()==0) nemo->get_calc()->param.print("dft","end"); + } else if (parser.key_exists("print_parameters")) { + Nemo::print_parameters(); - // optimize the geometry if requested - if (nemo->get_param().gopt()) { - print("\n\n Geometry Optimization "); - print(" ----------------------------------------------------------\n"); + } else { + + std::shared_ptr nemo(new Nemo(world,parser)); + + if (world.rank()==0) nemo->get_param().print("dft","end"); + + // optimize the geometry if requested + if (nemo->get_param().gopt()) { + print("\n\n Geometry Optimization "); + print(" ----------------------------------------------------------\n"); // calc->param.gprint(world); - Tensor geomcoord =nemo->get_calc()->molecule.get_all_coords().flat(); -// MolecularOptimizer geom(std::shared_ptr(new Nemo(world, calc)), - MolecularOptimizer geom(world,parser,nemo); -// MolecularOptimizer geom(nemo, -// calc->param.gmaxiter(), -// calc->param.gtol(), //tol -// calc->param.gval(), //value prec -// calc->param.gprec()); // grad prec -// geom.set_update(calc->param.algopt); -// geom.set_test(calc->param.gtest); - - // compute initial hessian - if (nemo->get_param().ginitial_hessian()) { - nemo->value(); - Tensor hess=nemo->hessian(nemo->get_calc()->molecule.get_all_coords()); - geom.set_hessian(hess); - } - geom.optimize(geomcoord); - } else { + Tensor geomcoord =nemo->get_calc()->molecule.get_all_coords().flat(); + MolecularOptimizer geom(world,parser,nemo); + + // compute initial hessian + if (nemo->get_param().ginitial_hessian()) { + nemo->value(); + Tensor hess=nemo->hessian(nemo->get_calc()->molecule.get_all_coords()); + geom.set_hessian(hess); + } + geom.optimize(geomcoord); + } else { - // compute the energy to get converged orbitals + // compute the energy to get converged orbitals // Nemo nemo(world,calc); - const double energy=nemo->value(); - if (world.rank()==0) { - printf("final energy %12.8f\n", energy); - printf("finished at time %.1f\n", wall_time()); + const double energy=nemo->value(); + if (world.rank()==0) { + printf("final energy %12.8f\n", energy); + printf("finished at time %.1f\n", wall_time()); + } + } - } + // compute the hessian + if (nemo->param.hessian()) nemo->hessian(nemo->get_calc()->molecule.get_all_coords()); - // compute the hessian - if (nemo->param.hessian()) nemo->hessian(nemo->get_calc()->molecule.get_all_coords()); + } } catch (const SafeMPI::Exception& e) { From c09047bb2b9c0cbcee00786c58729afefc8e67f4 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 29 Jul 2022 21:45:09 +0200 Subject: [PATCH 0177/1312] added convenience options --geometry=xxx and --optimize, works so far only for nemo --- src/apps/chem/CalculationParameters.h | 2 ++ src/apps/chem/molecule.cc | 16 +++++++++------- src/apps/chem/molecule.h | 16 ++++++++++++++-- src/apps/nemo/nemo.cc | 1 + src/madness/world/madness_exception.h | 18 ++++++++++++++++++ 5 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/apps/chem/CalculationParameters.h b/src/apps/chem/CalculationParameters.h index f98be70ae20..d4e441b2b35 100644 --- a/src/apps/chem/CalculationParameters.h +++ b/src/apps/chem/CalculationParameters.h @@ -54,6 +54,8 @@ struct CalculationParameters : public QCCalculationParametersBase { CalculationParameters(World& world, const commandlineparser& parser) : CalculationParameters() { read_input_and_commandline_options(world, parser, "dft"); + // convenience option -- needs to be moved to the MolecularOptimizer class + if (parser.key_exists("optimize")) set_user_defined_value("gopt",true); } /// ctor reading out the input file diff --git a/src/apps/chem/molecule.cc b/src/apps/chem/molecule.cc index a6551c0c0aa..3c8238b88ad 100644 --- a/src/apps/chem/molecule.cc +++ b/src/apps/chem/molecule.cc @@ -173,17 +173,21 @@ void Molecule::get_structure() { }; -std::istream& Molecule::position_stream_in_library(std::ifstream& f, const std::string& name) { - // get the location of the structure library +std::string Molecule::get_structure_library_path() { std::string chemdata_dir(MRA_CHEMDATA_DIR); if (getenv("MRA_CHEMDATA_DIR")) chemdata_dir=std::string(getenv("MRA_CHEMDATA_DIR")); - std::string library=chemdata_dir+"/structure_library"; + return chemdata_dir+"/structure_library"; +} + +std::istream& Molecule::position_stream_in_library(std::ifstream& f, const std::string& name) { + // get the location of the structure library + std::string library=get_structure_library_path(); f.open(library); std::string errmsg; if(f.fail()) { - std::string("Failed to open structure library: ") + library; + errmsg=std::string("Failed to open structure library: ") + library; } else { try { std::string full_line="structure="+name; @@ -192,9 +196,7 @@ std::istream& Molecule::position_stream_in_library(std::ifstream& f, const std:: errmsg = "could not find structure " + name + " in the library\n\n"; } } - if (not errmsg.empty()) { - throw MadnessException(errmsg.c_str(),0,0,__LINE__,__FUNCTION__,__FILE__); - } + MADNESS_CHECK_THROW(errmsg.empty(),errmsg.c_str()); return f; } diff --git a/src/apps/chem/molecule.h b/src/apps/chem/molecule.h index bbfd4677a2d..52409562b74 100644 --- a/src/apps/chem/molecule.h +++ b/src/apps/chem/molecule.h @@ -118,8 +118,10 @@ class Molecule { GeometryParameters(World& world, const commandlineparser& parser) : GeometryParameters() { try { + set_global_convenience_options(parser); read_input_and_commandline_options(world, parser, "geometry"); set_derived_values(parser); + } catch (...) { print("geometry","end"); MADNESS_EXCEPTION("faulty geometry input",1); @@ -144,6 +146,15 @@ class Molecule { initialize ("pure_ae",true,"pure all electron calculation with no pseudo-atoms"); } + + void set_global_convenience_options(const commandlineparser& parser) { + + if (parser.key_exists("geometry")) { + set_user_defined_value("source_name",parser.value("geometry")); + } + + } + void set_derived_values(const commandlineparser& parser) { // check if we use an xyz file, the structure library or the input file std::string src_type= derive_source_type_from_name(source_name()); @@ -164,9 +175,10 @@ class Molecule { if (found_geometry_file and geometry_found_in_library) { madness::print("\n\n"); madness::print("geometry specification ambiguous: found geometry in the structure library and in a file\n"); + madness::print(" ",get_structure_library_path()); madness::print(" ",source_name()); madness::print("\nPlease specify the location of your geometry input by one of the two lines:\n"); - madness::print(" source_type xyx"); + madness::print(" source_type xyz"); madness::print(" source_type library\n\n"); MADNESS_EXCEPTION("faulty input\n\n",1); } @@ -255,7 +267,7 @@ class Molecule { static std::istream& position_stream_in_library(std::ifstream& f, const std::string& name); - + static std::string get_structure_library_path(); /// print out a Gaussian cubefile header std::vector cubefile_header() const; diff --git a/src/apps/nemo/nemo.cc b/src/apps/nemo/nemo.cc index 2f966f23841..697096653d3 100644 --- a/src/apps/nemo/nemo.cc +++ b/src/apps/nemo/nemo.cc @@ -90,6 +90,7 @@ int main(int argc, char** argv) { Tensor geomcoord =nemo->get_calc()->molecule.get_all_coords().flat(); MolecularOptimizer geom(world,parser,nemo); + geom.parameters.print("geoopt","end"); // compute initial hessian if (nemo->get_param().ginitial_hessian()) { diff --git a/src/madness/world/madness_exception.h b/src/madness/world/madness_exception.h index 0732a5e6276..8709fca56ba 100644 --- a/src/madness/world/madness_exception.h +++ b/src/madness/world/madness_exception.h @@ -197,6 +197,24 @@ namespace madness { } while (0) #endif + +// the following define/undef are for documentation purposes only. +/// Check a condition --- even in a release build the condition is always evaluated so it can have side effects + +/// will always throw a madness::MadnessException, but will not print to stderr +/// \param[in] condition The condition to be checked. +/// \param[in] msg The message to be printed +#define MADNESS_CHECK_THROW(condition,msg) +#undef MADNESS_CHECK_THROW + +#define MADNESS_CHECK_THROW(condition,msg) \ + do { \ + if (!(condition)) { \ + throw madness::MadnessException(msg, (#condition),0,__LINE__,__FUNCTION__,__FILE__); \ + } \ + } while (0) + + } // namespace madness #endif // MADNESS_WORLD_MADNESS_EXCEPTION_H__INCLUDED From 4368c918ce759dd7cd7eb3e32265578ec464ddac Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 29 Jul 2022 22:42:28 +0200 Subject: [PATCH 0178/1312] some more cleanup, respecting --help and --print_parameters in more codes --- doc/quantum.md | 28 +-- src/apps/cc2/cc2.cc | 54 +++--- src/apps/chem/CC2.h | 27 +++ src/apps/chem/CCPotentials.cc | 10 +- src/apps/chem/CCPotentials.h | 2 + src/apps/chem/CCStructures.cc | 2 +- src/apps/chem/CCStructures.h | 8 +- src/apps/chem/QCCalculationParametersBase.cc | 3 +- src/apps/chem/SCF.h | 22 +++ src/apps/moldft/moldft.cc | 191 ++++++++++--------- src/apps/nemo/nemo.cc | 3 +- 11 files changed, 214 insertions(+), 136 deletions(-) diff --git a/doc/quantum.md b/doc/quantum.md index dfae324a515..93e52e95d5e 100644 --- a/doc/quantum.md +++ b/doc/quantum.md @@ -34,11 +34,16 @@ If no parameters are given, default parameters will be used. Only the molecule i Parameters can be specified through an input file and/or command line options. Some parameters depend on each other and are set automatically, e.g. certain numerical parameters, or the use of -point group symmetry. Paremters set by the user are always respected. +point group symmetry. Parameters set by the user are always respected. In the output files of the calculations the complete set of input parameters are printed out, together with a short description and further information. +You can see the full list of parameters by typing +> `qccode --print_parameters` + +where, again, `qccode` stands for any of the qc codes + ## Input file The input file consists of data groups, starting with the relevant keyword, e.g. "dft" and ending with "end". All parameters in a data group are given as key/value pairs, where the value can be an integer, a double, a string @@ -107,18 +112,19 @@ By default atomic units are used, but angstrom can be switched on by adding the > end The following example will read an external xyz file, using angstrom by default -Note that key is `source`, and value is the pair `xyz`,`h2o.xyz` to indicate that an -xyz file is to be used ->geometry\ -> source [xyz,h2o.xyz]\ -> end +>`geometry`\ +> `  source_type xyz # optional `\ +> `  source_name h2o.xyz`\ +> `end` -or you can use the command line options (short and long version) -> `nemo --geometry="source=h2o.xyz"`\ -> `nemo --geometry="source=[xyz,h2o.xyz]"` +or you can use the command line options using the convenience short option +> `nemo --geometry=h2o.xyz` A small number of geometries are stored in a library, accessible through -> `nemo --geometry="source=library, h2o"` +> `nemo --geometry="source_type=library; source_name=h2o"` + +If no source type is given it will be deduced from the file name, if the source is ambiguous, +e.g. a structure in the library has the same same as an input file, the code will stop. ## Geometry optimization For the following codes/methods there are gradients implemented: @@ -128,6 +134,6 @@ The optimization is started with the `gopt` flag in the `dft` block, geometry op parameters are set in the `geoopt` block. > `nemo --dft="k=8; econv=1.e-5; gopt=1" --geoopt="maxiter=10" --geometry="source=library, h2o"` -## Convenience short options (Wish list) +## Convenience short options `--optimize` optimize the geometry\ `--geometry=file.xyz` find the geometry in the xyz file (note Angstrom units!) diff --git a/src/apps/cc2/cc2.cc b/src/apps/cc2/cc2.cc index 69df950458b..45bdb1680fe 100644 --- a/src/apps/cc2/cc2.cc +++ b/src/apps/cc2/cc2.cc @@ -58,8 +58,7 @@ using namespace madness; int main(int argc, char **argv) { - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); + World& world=initialize(argc, argv); if (world.rank() == 0) { print("\n CC2: Coupled Cluster approximate Doubles \n"); @@ -74,30 +73,39 @@ int main(int argc, char **argv) { // set the tensor type TensorType tt = TT_2D; FunctionDefaults<6>::set_tensor_type(tt); - FunctionDefaults<6>::set_apply_randomize(true); +// FunctionDefaults<6>::set_apply_randomize(true); commandlineparser parser(argc, argv); - std::shared_ptr nemo(new Nemo(world, parser)); - nemo->param.set_derived_value("print_level",2); - std::shared_ptr calc = nemo->get_calc(); - if (world.rank() == 0) { - print("\n"); - calc->param.print("reference"); + if (parser.key_exists("help")) { + CC2::help(); + + } else if (parser.key_exists("print_parameters")) { + CC2::print_parameters(); + + } else { + + std::shared_ptr nemo(new Nemo(world, parser)); + nemo->param.set_derived_value("print_level", 2); + CC2 cc2(world, parser, nemo); + + std::shared_ptr calc = nemo->get_calc(); + if (world.rank() == 0) { + print("\n"); + cc2.parameters.print("cc2","end"); + print("\n"); + calc->param.print("dft","end"); + } + double hf_energy = nemo->value(); + if (world.rank() == 0) + std::cout << "\n\n\n\n\n\n Reference Calclation Ended\n SCF Energy is: " << hf_energy + << "\n current wall-time: " << wall_time() + << "\n current cpu-time: " << cpu_time() << "\n\n\n"; + + cc2.solve(); + + if (world.rank() == 0) printf("\nfinished at time %.1fs\n\n", wall_time()); + world.gop.fence(); } - double hf_energy = nemo->value(); - if (world.rank() == 0) - std::cout << "\n\n\n\n\n\n Reference Calclation Ended\n SCF Energy is: " << hf_energy - << "\n current wall-time: " << wall_time() - << "\n current cpu-time: " << cpu_time() << "\n\n\n"; - - -// Make CC2 - CC2 cc2(world, parser, nemo); - - cc2.solve(); - - if (world.rank() == 0) printf("\nfinished at time %.1fs\n\n", wall_time()); - world.gop.fence(); finalize(); return 0; diff --git a/src/apps/chem/CC2.h b/src/apps/chem/CC2.h index 6bd9ba62156..d8057bf7d5e 100644 --- a/src/apps/chem/CC2.h +++ b/src/apps/chem/CC2.h @@ -84,6 +84,33 @@ class CC2 : public OptimizationTargetInterface, public QCPropertyInterface { std::string name() const {return "CC2";}; + static void help() { + print("\nCC2 -- help \n"); + print("The CC2 code computes correlated ground and excited state energies:\n"); + print(" - MP2 ground state"); + print(" - CC2 ground and excited states"); + print(" - ADC(2) and CIS(D) excited states\n"); + print("You need a SCF reference calculation from the nemo program. If there no such calculation can"); + print("be found CC2 will perform its own. If excited states are requested also a CIS calculation is "); + print("necessary.\n"); + print("Note that for correlated calculations the k parameter must be chosen small, typically k=5 or k=6 "); + print("because the curse of dimensions make higher k extremely expensive\n"); + print("You can print all available calculation parameters by running\n"); + print("cc2 --print_parameters\n"); + print("You can perform a simple MP2 calculation by running\n"); + print("cc2 --geometry=h2o.xyz\n"); + print("provided you have an xyz file in your directory.\n"); + + } + + static void print_parameters() { + CCParameters param; + print("\ndefault parameters for the cc2 program are\n"); + param.print("cc2","end"); + print("\n\nthe molecular geometry must be specified in a separate block:"); + Molecule::print_parameters(); + } + virtual bool selftest() { return true; }; diff --git a/src/apps/chem/CCPotentials.cc b/src/apps/chem/CCPotentials.cc index afff7170405..9d9c9b8f8f0 100644 --- a/src/apps/chem/CCPotentials.cc +++ b/src/apps/chem/CCPotentials.cc @@ -29,11 +29,11 @@ CCPotentials::CCPotentials(World& world_, std::shared_ptr nemo, const CCP get_potentials(world, param), output(world) { output.debug = parameters.debug(); - reset_nemo(nemo); - g12.update_elements(mo_bra_, mo_ket_); - g12.sanity(); - f12.update_elements(mo_bra_, mo_ket_); - f12.sanity(); +// reset_nemo(nemo); +// g12.update_elements(mo_bra_, mo_ket_); +// g12.sanity(); +// f12.update_elements(mo_bra_, mo_ket_); +// f12.sanity(); } madness::CC_vecfunction diff --git a/src/apps/chem/CCPotentials.h b/src/apps/chem/CCPotentials.h index b21d3ea642b..d6d14f5bd59 100644 --- a/src/apps/chem/CCPotentials.h +++ b/src/apps/chem/CCPotentials.h @@ -792,7 +792,9 @@ class CCPotentials { // update the intermediates void update_intermediates(const CC_vecfunction& t) { g12.update_elements(mo_bra_, t); + g12.sanity(); f12.update_elements(mo_bra_, t); + f12.sanity(); } /// clear stored potentials diff --git a/src/apps/chem/CCStructures.cc b/src/apps/chem/CCStructures.cc index 877702ea93d..81570a13e4f 100644 --- a/src/apps/chem/CCStructures.cc +++ b/src/apps/chem/CCStructures.cc @@ -322,7 +322,7 @@ void CCParameters::set_derived_values() { void CCParameters::information(World& world) const { if (world.rank()==0) { - print("cc2","end"); +// print("cc2","end"); if (calc_type() != CT_LRCCS and calc_type() != CT_TDHF) { std::cout << "The Ansatz for the Pair functions |tau_ij> is: "; if (QtAnsatz()) std::cout << "(Qt)f12|titj> and response: (Qt)f12(|tixj> + |xitj>) - (OxQt + QtOx)f12|titj>"; diff --git a/src/apps/chem/CCStructures.h b/src/apps/chem/CCStructures.h index b904aa0a041..0ace7a24f5c 100644 --- a/src/apps/chem/CCStructures.h +++ b/src/apps/chem/CCStructures.h @@ -205,7 +205,9 @@ struct CCTimer { /// Maybe merge this with calculation_parameters of SCF at some point, or split into TDA and CC struct CCParameters : public QCCalculationParametersBase { - CCParameters() {}; + CCParameters() { + initialize_parameters(); + }; /// copy constructor CCParameters(const CCParameters& other) =default; @@ -220,7 +222,7 @@ struct CCParameters : public QCCalculationParametersBase { void initialize_parameters() { double thresh=1.e-3; double thresh_operators=1.e-6; - initialize < std::string > ("calc_type", "lrcc2", "the calculation type", {"mp2", "cc2", "cis", "lrcc2", "cispd", "adc2", "test"}); + initialize < std::string > ("calc_type", "mp2", "the calculation type", {"mp2", "cc2", "cis", "lrcc2", "cispd", "adc2", "test"}); initialize < double > ("lo", 1.e-7, "the finest length scale to be resolved by 6D operators"); initialize < double > ("dmin", 1.0, "defines the depth of the special level"); initialize < double > ("thresh_6d", thresh, "threshold for the 6D wave function"); @@ -258,7 +260,7 @@ struct CCParameters : public QCCalculationParametersBase { initialize < std::size_t > ("freeze", 0, ""); initialize < bool > ("test", false, ""); // choose if Q for the constant part of MP2 and related calculations should be decomposed: GQV or GV - GO12V - initialize < bool > ("decompose_Q", false, ""); + initialize < bool > ("decompose_Q", true, ""); // if true the ansatz for the CC2 ground state pairs is |tau_ij> = |u_ij> + Qtf12|titj>, with Qt = Q - |tau>(first) < std::get<0>(second);}); std::stringstream ss; + int counter=0; for (auto& p : list) { const QCParameter& param=std::get<2>(p); if (non_defaults_only and (param.precedence==QCParameter::def)) continue; ss << param.print_line(std::get<1>(p)); - ss << std::endl; + if (++counter void set_protocol(World& world, double thresh) { int k; diff --git a/src/apps/moldft/moldft.cc b/src/apps/moldft/moldft.cc index 0b8bc7f3287..85ffa8a5ddd 100644 --- a/src/apps/moldft/moldft.cc +++ b/src/apps/moldft/moldft.cc @@ -83,103 +83,114 @@ int main(int argc, char **argv) { // Load info for MADNESS numerical routines startup(world, argc, argv, true); commandlineparser parser(argc, argv); - print_meminfo(world.rank(), "startup"); - FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); - std::cout.precision(6); + if (parser.key_exists("help")) { + SCF::help(); - // Process 0 reads input information and broadcasts - const char *inpname = "input"; - for (int i = 1; i < argc; i++) { - if (argv[i][0] != '-') { - inpname = argv[i]; - break; + } else if (parser.key_exists("print_parameters")) { + SCF::print_parameters(); + + } else { + + + print_meminfo(world.rank(), "startup"); + FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); + + std::cout.precision(6); + + // Process 0 reads input information and broadcasts + const char *inpname = "input"; + for (int i = 1; i < argc; i++) { + if (argv[i][0] != '-') { + inpname = argv[i]; + break; + } + } + std::string sinpname(inpname); + parser.set_keyval("input", sinpname); + if (world.rank() == 0) print("input filename: ", inpname); + if (!file_exists(inpname)) { + throw "input file not found!"; + } + SCF calc(world, parser); + + // Warm and fuzzy for the user + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Hartree-Fock and Density Functional Theory Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc.molecule.print(); + print("\n"); + calc.param.print("dft"); + } + END_TIMER(world, "initialize"); + // Come up with an initial OK data map + if (world.size() > 1) { + calc.set_protocol<3>(world, 1e-4); + calc.make_nuclear_potential(world); + calc.initial_load_bal(world); } - } - std::string sinpname(inpname); - parser.set_keyval("input",sinpname); - if (world.rank() == 0) print("input filename: ", inpname); - if (!file_exists(inpname)) { - throw "input file not found!"; - } - SCF calc(world, parser); - - // Warm and fuzzy for the user - if (world.rank() == 0) { - print("\n\n"); - print(" MADNESS Hartree-Fock and Density Functional Theory Program"); - print(" ----------------------------------------------------------\n"); - print("\n"); - calc.molecule.print(); - print("\n"); - calc.param.print("dft"); - } - END_TIMER(world, "initialize"); - // Come up with an initial OK data map - if (world.size() > 1) { - calc.set_protocol<3>(world, 1e-4); - calc.make_nuclear_potential(world); - calc.initial_load_bal(world); - } //vama - calc.set_protocol<3>(world, calc.param.protocol()[0]); - - - if (calc.param.gopt()) { - // print("\n\n Geometry Optimization "); - // print(" ----------------------------------------------------------\n"); - // calc.param.gprint(world); - - // Tensor geomcoord = calc.molecule.get_all_coords().flat(); - // QuasiNewton geom(std::shared_ptr(new MolecularEnergy(world, calc)), - // calc.param.gmaxiter, - // calc.param.gtol, //tol - // calc.param.gval, //value prec - // calc.param.gprec); // grad prec - // geom.set_update(calc.param.algopt); - // geom.set_test(calc.param.gtest); - // long ncoord = calc.molecule.natom()*3; - // Tensor h(ncoord,ncoord); - // for (int i=0; i 0)) - printf("final energy=%16.8f ", energy); - E.output_calc_info_schema(); - - functionT rho = calc.make_density(world, calc.aocc, calc.amo); - functionT brho = rho; - if (calc.param.nbeta() != 0 && !calc.param.spin_restricted()) - brho = calc.make_density(world, calc.bocc, calc.bmo); - rho.gaxpy(1.0, brho, 1.0); - - if (calc.param.derivatives()) calc.derivatives(world, rho); - if (calc.param.dipole()) calc.dipole(world, rho); - } + calc.set_protocol<3>(world, calc.param.protocol()[0]); + + + if (calc.param.gopt()) { + // print("\n\n Geometry Optimization "); + // print(" ----------------------------------------------------------\n"); + // calc.param.gprint(world); + + // Tensor geomcoord = calc.molecule.get_all_coords().flat(); + // QuasiNewton geom(std::shared_ptr(new MolecularEnergy(world, calc)), + // calc.param.gmaxiter, + // calc.param.gtol, //tol + // calc.param.gval, //value prec + // calc.param.gprec); // grad prec + // geom.set_update(calc.param.algopt); + // geom.set_test(calc.param.gtest); + // long ncoord = calc.molecule.natom()*3; + // Tensor h(ncoord,ncoord); + // for (int i=0; i 0)) + printf("final energy=%16.8f ", energy); + E.output_calc_info_schema(); + + functionT rho = calc.make_density(world, calc.aocc, calc.amo); + functionT brho = rho; + if (calc.param.nbeta() != 0 && !calc.param.spin_restricted()) + brho = calc.make_density(world, calc.bocc, calc.bmo); + rho.gaxpy(1.0, brho, 1.0); + + if (calc.param.derivatives()) calc.derivatives(world, rho); + if (calc.param.dipole()) calc.dipole(world, rho); + } - // if (calc.param.twoint) { - //Tensor g = calc.twoint(world,calc.amo); - //cout << g; - // } + // if (calc.param.twoint) { + //Tensor g = calc.twoint(world,calc.amo); + //cout << g; + // } - calc.do_plots(world); + calc.do_plots(world); + } } catch (const SafeMPI::Exception& e) { print(e); diff --git a/src/apps/nemo/nemo.cc b/src/apps/nemo/nemo.cc index 697096653d3..07eb22cabe9 100644 --- a/src/apps/nemo/nemo.cc +++ b/src/apps/nemo/nemo.cc @@ -55,8 +55,7 @@ using namespace madness; int main(int argc, char** argv) { - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); + World& world=initialize(argc, argv); if (world.rank() == 0) { print("\n NEMO -- Hartree-Fock using numerical exponential molecular orbitals \n"); printf("starting at time %.1f\n", wall_time()); From c60723b2eb96090b0f30db47fb851b589d7aeb55 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Mon, 1 Aug 2022 14:00:41 -0400 Subject: [PATCH 0179/1312] fixed testing errors --- src/apps/chem/commandlineparser.h | 2 +- src/apps/chem/molecule.h | 14 +++++++++----- src/apps/chem/test_localizer.cc | 6 ++++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/apps/chem/commandlineparser.h b/src/apps/chem/commandlineparser.h index bf9b65a31a0..4aef62a550e 100644 --- a/src/apps/chem/commandlineparser.h +++ b/src/apps/chem/commandlineparser.h @@ -39,7 +39,7 @@ struct commandlineparser { /// set default values from the command line void set_defaults() { keyval["input"]="input"; - keyval["geometry"]="input_file"; +// keyval["geometry"]="input_file"; } void print_map() const { diff --git a/src/apps/chem/molecule.h b/src/apps/chem/molecule.h index 52409562b74..1b60e3e9dd7 100644 --- a/src/apps/chem/molecule.h +++ b/src/apps/chem/molecule.h @@ -135,7 +135,7 @@ class Molecule { // initialize>("source",{"inputfile"},"where to get the coordinates from: ({inputfile}, {library,xxx}, {xyz,xxx.xyz})"); initialize("source_type","inputfile","where to get the coordinates from",{"inputfile","xyz","library"}); - initialize("source_name","","name of the geometry from the library or the input file"); + initialize("source_name","TBD","name of the geometry from the library or the input file"); initialize("eprec",1.e-4,"smoothing for the nuclear potential"); initialize("units","atomic","coordinate units",{"atomic","angstrom"}); initialize>("field",{0.0,0.0,0.0},"external electric field"); @@ -157,12 +157,15 @@ class Molecule { void set_derived_values(const commandlineparser& parser) { // check if we use an xyz file, the structure library or the input file - std::string src_type= derive_source_type_from_name(source_name()); + set_derived_value("source_name",parser.value("input")); // will not override user input + std::string src_type= derive_source_type_from_name(source_name(), parser); set_derived_value("source_type",src_type); // check for ambiguities in the derived source type if (not is_user_defined("source_type")) { - bool found_geometry_file=std::filesystem::exists(source_name()); + std::ifstream f(source_name().c_str()); + bool found_geometry_file=f.good(); +// bool found_geometry_file=std::filesystem::exists(source_name()); bool geometry_found_in_library=true; try { // check for existence of file and structure in the library @@ -214,8 +217,9 @@ class Molecule { bool pure_ae() const {return get("pure_ae");} bool no_orient() const {return get("no_orient");} - static std::string derive_source_type_from_name(const std::string name) { - if (name.empty()) return "input"; + static std::string derive_source_type_from_name(const std::string name, + const commandlineparser& parser) { + if (name==parser.value("input")) return "inputfile"; std::size_t pos = name.find(".xyz"); if (pos!=std::string::npos) return "xyz"; return "library"; diff --git a/src/apps/chem/test_localizer.cc b/src/apps/chem/test_localizer.cc index f176efe001e..b5fdf6e6e8a 100644 --- a/src/apps/chem/test_localizer.cc +++ b/src/apps/chem/test_localizer.cc @@ -282,7 +282,8 @@ int main(int argc, char **argv) { // param.set_user_defined_value("ncf",std::pair("none",0.0)); write_test_input test_input(param); parser.set_keyval("input",test_input.filename()); - parser.set_keyval("geometry","source=library,"+geometry); + parser.set_keyval("geometry","source_type=library"); + parser.set_keyval("geometry","source_name="+geometry); Nemo nemo(world,parser); nemo.param.print("dft","end"); @@ -294,7 +295,8 @@ int main(int argc, char **argv) { if (not success) result++; // parser.set_keyval("structure","ne"); - parser.set_keyval("geometry","source = [library,ne]"); + parser.set_keyval("geometry","source_type = library"); + parser.set_keyval("geometry","source_name = ne"); Nemo nemo1(world,parser); test_output tout("ne prep calculation"); nemo1.value(); From 34dc6cafeb4a6ef4820c020a20324aed9752cfbd Mon Sep 17 00:00:00 2001 From: Thomas Herault Date: Tue, 2 Aug 2022 14:55:13 -0400 Subject: [PATCH 0180/1312] Use new name of parsec taskpool when profiling is enabled --- src/madness/world/parsec.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/madness/world/parsec.cc b/src/madness/world/parsec.cc index f867d8b9639..7f162a91e73 100644 --- a/src/madness/world/parsec.cc +++ b/src/madness/world/parsec.cc @@ -131,10 +131,10 @@ namespace madness { MPI_Comm parsec_comm = MPI_COMM_SELF; parsec_remote_dep_set_ctx(ctx, (intptr_t)parsec_comm); #ifdef PARSEC_PROF_TRACE - taskpool.profiling_array = ParsecRuntime::taskpool_profiling_array; + ParsecRuntime::tp.profiling_array = ParsecRuntime::taskpool_profiling_array; parsec_profiling_add_dictionary_keyword("MADNESS TASK", "fill:CC2828", 0, "", - (int *)&taskpool.profiling_array[0], - (int *)&taskpool.profiling_array[1]); + (int *)&ParsecRuntime::tp.profiling_array[0], + (int *)&ParsecRuntime::tp.profiling_array[1]); #endif if( 0 != parsec_context_add_taskpool(ctx, &tp) ) { std::cerr << "ERROR: parsec_context_add_taskpool failed!!" << std::endl; From a22b10215c396f682694378a9c625f46c5caf003 Mon Sep 17 00:00:00 2001 From: Thomas Herault Date: Tue, 2 Aug 2022 14:55:56 -0400 Subject: [PATCH 0181/1312] Removing spurious files that should not have been added in the first place --- src/madness/world/parsec.cc.orig | 177 ------------------------------- src/madness/world/parsec.cc.rej | 13 --- 2 files changed, 190 deletions(-) delete mode 100644 src/madness/world/parsec.cc.orig delete mode 100644 src/madness/world/parsec.cc.rej diff --git a/src/madness/world/parsec.cc.orig b/src/madness/world/parsec.cc.orig deleted file mode 100644 index ad12b1c0606..00000000000 --- a/src/madness/world/parsec.cc.orig +++ /dev/null @@ -1,177 +0,0 @@ -#include - -#ifdef HAVE_PARSEC -#include "parsec.h" -#include -#include "thread.h" -#include - -// Here we initialize with the right child class -namespace madness { - parsec_hook_return_t complete_madness_task_execution (parsec_execution_stream_t *es, - parsec_task_t *task) { - (void)es; - task->taskpool->tdm.module->taskpool_addto_nb_tasks(task->taskpool, -1); - return PARSEC_HOOK_RETURN_DONE; - } - - parsec_hook_return_t release_madness_task (parsec_execution_stream_t *es, - parsec_task_t *task) { - PoolTaskInterface *c = ((PoolTaskInterface **)task->locals)[0]; - (void)es; - delete(c); - return PARSEC_HOOK_RETURN_DONE; - } - - parsec_hook_return_t run_madness_task(parsec_execution_stream_t *eu, - parsec_task_t *task) { - PoolTaskInterface *c = ((PoolTaskInterface **)task->locals)[0]; - c->run(TaskThreadEnv(1, 0, 0)); - return PARSEC_HOOK_RETURN_DONE; - } - - static uint64_t RUN_hash(const parsec_taskpool_t *tp, const parsec_assignment_t *a) { - (void)a; (void)tp; - return 0; - } - - static parsec_hook_return_t empty_hook (parsec_execution_stream_t *es, - parsec_task_t *task) { - (void)es; (void)task; - return PARSEC_HOOK_RETURN_DONE; - } - - static const __parsec_chore_t __RUN_chores[] = { - {.type = PARSEC_DEV_CPU, .evaluate = NULL, .hook = run_madness_task}, - {.type = PARSEC_DEV_NONE, .evaluate = NULL, .hook = (parsec_hook_t *) NULL}, - }; - - const parsec_task_class_t madness_parsec_tc = { - .name = "RUN", - .flags = PARSEC_HAS_IN_IN_DEPENDENCIES | PARSEC_USE_DEPS_MASK, - .task_class_id = 0, - .nb_flows = 0, - .nb_parameters = 0, - .nb_locals = 0, - .dependencies_goal = 0, - .params = {NULL,NULL,NULL, NULL}, - .locals = {NULL,NULL,NULL, NULL}, - .in = {NULL, NULL, NULL, NULL}, - .out = {NULL, NULL, NULL, NULL}, - .priority = NULL, - .properties = NULL, - .initial_data = NULL, - .final_data = NULL, - .data_affinity = NULL, - .key_generator = (parsec_functionkey_fn_t *) RUN_hash, - .key_functions = NULL, - .make_key = NULL, -#if defined(PARSEC_SIM) - .sim_cost_fct = (parsec_sim_cost_fct_t*) NULL, -#endif - .get_datatype = (parsec_datatype_lookup_t *) NULL, - .prepare_input = empty_hook, - .incarnations = __RUN_chores, - .prepare_output = (parsec_hook_t *) NULL, - - .find_deps = (parsec_find_dependency_fn_t*)NULL, - .update_deps = NULL, - - .iterate_successors = (parsec_traverse_function_t *) NULL, - .iterate_predecessors = (parsec_traverse_function_t *) NULL, - .release_deps = (parsec_release_deps_t *) NULL, - .complete_execution = complete_madness_task_execution, - .new_task = (parsec_new_task_function_t*) NULL, - .release_task = release_madness_task, //object delete, - .fini = (parsec_hook_t *) NULL, - }; - - const parsec_task_class_t* madness_parsec_tc_array[]= {&(madness::madness_parsec_tc), NULL}; - parsec_taskpool_t ParsecRuntime::taskpool = { - .super = { 0x0, }, - .taskpool_id = 0, - .taskpool_name = "MADNESS taskpool", - .nb_tasks = 0, - .taskpool_type = 0, - .devices_index_mask = PARSEC_DEVICES_ALL, - .nb_task_classes = 1, - .priority = 0, - .nb_pending_actions = 0, - .context = NULL, - .tdm = {0x0, }, - .startup_hook = NULL, - .task_classes_array = madness_parsec_tc_array, -#if defined(PARSEC_PROF_TRACE) - .profiling_array = NULL, -#endif - .on_enqueue = NULL, - .on_enqueue_data = NULL, - .on_complete = NULL, - .on_complete_data = NULL, - .update_nb_runtime_task = NULL, - .destructor = NULL, - .dependencies_array = NULL, - .repo_array = NULL - }; - parsec_context_t *ParsecRuntime::context = nullptr; - - ParsecRuntime::ParsecRuntime(int nb_threads) { - assert(context == nullptr); - /* Scheduler init*/ - int argc = 1; - char ** argv = (char**)malloc(2*sizeof(char*)); - argv[0] = strdup("madness-app"); - argv[1] = NULL; - context = parsec_init(nb_threads, &argc, &argv); - MPI_Comm parsec_comm = MPI_COMM_SELF; - parsec_remote_dep_set_ctx(context, (intptr_t)parsec_comm); -#ifdef PARSEC_PROF_TRACE - taskpool.profiling_array = (int*)malloc(2*sizeof(int)); - parsec_profiling_add_dictionary_keyword("MADNESS TASK", "fill:CC2828", 0, "", - (int *)&taskpool.profiling_array[0], - (int *)&taskpool.profiling_array[1]); -#endif - if( 0 != parsec_context_add_taskpool(context, &taskpool) ) { - std::cerr << "ERROR: parsec_context_add_taskpool failed!!" << std::endl; - } - parsec_taskpool_update_runtime_nbtask(&taskpool, 1); - if( 0 != parsec_context_start(context) ) { - std::cerr << "ERROR: context_context_start failed!!" << std::endl; - } - } - - ParsecRuntime::~ParsecRuntime() { - parsec_fini(&context); - context = nullptr; - } - - parsec_task_t ParsecRuntime::task(bool is_high_priority, void *ptr) { - parsec_task_t parsec_task{}; - parsec_task.taskpool = &taskpool; - parsec_task.task_class = &madness_parsec_tc; - parsec_task.chore_id = 0; - parsec_task.status = PARSEC_TASK_STATUS_NONE; - parsec_task.priority = is_high_priority ? 1000 : 0; // 1 & 0 would work as good - ((void **)parsec_task.locals)[0] = ptr; - return parsec_task; - } - - void ParsecRuntime::schedule(PoolTaskInterface *task) { - parsec_task_t *parsec_task = &(task->parsec_task); - PARSEC_LIST_ITEM_SINGLETON(parsec_task); - taskpool.tdm.module->taskpool_addto_nb_tasks(&taskpool, 1); - __parsec_schedule(context->virtual_processes[0]->execution_streams[0], parsec_task, 0); - } - - void ParsecRuntime::wait() { - parsec_taskpool_update_runtime_nbtask(&taskpool, -1); - parsec_context_wait(context); - } - - extern "C"{ - -#include - - } -} -#endif diff --git a/src/madness/world/parsec.cc.rej b/src/madness/world/parsec.cc.rej deleted file mode 100644 index 274911b8455..00000000000 --- a/src/madness/world/parsec.cc.rej +++ /dev/null @@ -1,13 +0,0 @@ ---- src/madness/world/parsec.cc -+++ src/madness/world/parsec.cc -@@ -105,6 +105,10 @@ namespace madness { - - const parsec_task_class_t* madness_parsec_tc_array[]= {&(madness::madness_parsec_tc), NULL}; - -+ static int madness_parsec_update_runtime_nb_tasks(parsec_taskpool_t *tp, int32_t nb_tasks) { -+ return tp->tdm.module->taskpool_addto_nb_tasks(tp, nb_tasks); -+ } -+ - parsec_taskpool_t madness_parsec_tp = { - .super = { 0x0, }, - .taskpool_id = 0, From 31a97aac0fb48d584fd472908433e785b8873ad0 Mon Sep 17 00:00:00 2001 From: Thomas Herault Date: Tue, 2 Aug 2022 14:57:34 -0400 Subject: [PATCH 0182/1312] Update to latest version of parsec --- external/versions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/versions.cmake b/external/versions.cmake index ed32a4a399b..e7c1e3adcc6 100644 --- a/external/versions.cmake +++ b/external/versions.cmake @@ -1 +1 @@ -set(MADNESS_TRACKED_PARSEC_TAG 5cc0207b0d1f070220a2833f128b9cb3fd18d1af) +set(MADNESS_TRACKED_PARSEC_TAG 89fdb88c6bdfcee3904c013a0856403762a5479f) From 20d4d7cffbbc98dd7b7d6a5feb7d68f1df067cd6 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Wed, 3 Aug 2022 06:42:18 -0400 Subject: [PATCH 0183/1312] by default prevent find_* commands from looking in INSTALL/STAGING areas to avoid key pain point + minor cleanup of top/CMakeLists.txt --- CMakeLists.txt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ff91685b299..61c526666d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,9 @@ cmake_minimum_required (VERSION 3.11.0) -project(MADNESS CXX C ASM) + +# safety net for dev workflow: accidental install will not affect FindOrFetch* +if (NOT DEFINED CACHE{CMAKE_FIND_NO_INSTALL_PREFIX}) + set(CMAKE_FIND_NO_INSTALL_PREFIX ON CACHE BOOL "Whether find_* commands will search CMAKE_INSTALL_PREFIX and CMAKE_STAGING_PREFIX; see https://cmake.org/cmake/help/latest/variable/CMAKE_FIND_NO_INSTALL_PREFIX.html#variable:CMAKE_FIND_NO_INSTALL_PREFIX") +endif() # Set MADNESS version set(MADNESS_MAJOR_VERSION 0) @@ -7,6 +11,14 @@ set(MADNESS_MINOR_VERSION 10) set(MADNESS_MICRO_VERSION 1) set(MADNESS_VERSION "${MADNESS_MAJOR_VERSION}.${MADNESS_MINOR_VERSION}.${MADNESS_MICRO_VERSION}") +# Declare ourselves ============================================================ + +project(MADNESS + VERSION ${MADNESS_VERSION} + DESCRIPTION "MADNESS: fast, adaptive multiresolution integrodifferential calculus in 1..6 dimensions" + LANGUAGES CXX C ASM + HOMEPAGE_URL "https://madness.readthedocs.io/") + # Add source directory ========================================================= add_definitions(-DMAD_ROOT_DIR="${PROJECT_SOURCE_DIR}") From 6db3afa42a7cc394193a6a8228d6cca944a22f65 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 3 Aug 2022 13:08:05 -0400 Subject: [PATCH 0184/1312] working on the documentation --- INSTALL => INSTALL.md | 32 +++++------ doc/INSTALL.md | 3 ++ doc/conf.py | 21 +++++++- doc/index.rst | 4 +- doc/numerical_library.md | 14 ++++- doc/quantum.md | 56 ++++++++++++++++---- doc/requirements.txt | 2 +- src/apps/chem/QCCalculationParametersBase.cc | 15 +++--- src/apps/chem/QCCalculationParametersBase.h | 4 +- src/apps/chem/molecule.h | 5 +- src/madness/world/madness_exception.cc | 4 +- 11 files changed, 118 insertions(+), 42 deletions(-) rename INSTALL => INSTALL.md (95%) create mode 100644 doc/INSTALL.md diff --git a/INSTALL b/INSTALL.md similarity index 95% rename from INSTALL rename to INSTALL.md index e123fcf2dfa..3119611bedb 100644 --- a/INSTALL +++ b/INSTALL.md @@ -1,4 +1,4 @@ -# Introduction +## Introduction When configuring MADNESS with CMake, you must specify cache variables and the path to the MADNESS source directory. To specify a cache variable prefix it with @@ -14,7 +14,7 @@ MADNESS outside the source tree. Boolean values for cache variables are considered true if the constant is 1, ON, YES, TRUE, Y, or a non-zero number; or false if the constant is 0, OFF, NO, FALSE, N, or IGNORE. -# Toolchain files +## Toolchain files MADNESS provides toolchain files for select systems. It is recommended that you use these files if provided as they contain the platform specific settings @@ -31,7 +31,7 @@ For example, to specify the toolchain file for Mira: Additional cache variables may be specified. -# Compiler variables +## Compiler variables The following CMake cache variables are used to specify the compilers, compiler flags, and linker flags. @@ -56,7 +56,7 @@ are optional, and it is typically not necessary to specify these variables. * CMAKE_SHARED_LINKER_FLAGS --- Linker flags to be used to create shared libraries. -# Build options +## Build options The following CMake cache variables turn MADNESS features on and off. @@ -88,7 +88,7 @@ The following CMake cache variables turn MADNESS features on and off. * MADNESS_BUILD_MADWORLD_ONLY --- whether to build the MADNESS runtime only; if `ON`, discovery of BLAS/LAPACK and building of numerical components and applications will be disabled [default=`OFF`] -# MADNESS Runtime and the Address Space Layout Randomization (ASLR) +## MADNESS Runtime and the Address Space Layout Randomization (ASLR) ASLR is a standard technique for increasing platform security implemented by the OS kernel and/or the dynamic linker. By randomizing both where the shared libraries are loaded as well as (when enabled) the absolute @@ -121,7 +121,7 @@ To make things more concrete, consider the following 2 scenarios: (with CMAKE_POSITION_INDEPENDENT_CODE=ON) and link them all together into a single module (same logic applies to shared libraries using MADNESS). -# External libraries +## External libraries The following CMake cache variables enable the use of external libraries with MADNESS. If the WITH_* variable is set to "ON" by default, failure to find the @@ -153,7 +153,7 @@ search for specific dependencies. If the external library is not found in these given paths, or if the paths are not given, CMake will search the paths in CMAKE_PREFIX_PATH as well as other system paths. -# Intel Threading Building Blocks (TBB): +## Intel Threading Building Blocks (TBB): * ENABLE_TBB --- Enables use of Intel TBB as the task scheduler [default=OFF] * TBB_ROOT_DIR --- The install prefix for TBB @@ -166,7 +166,7 @@ CMAKE_PREFIX_PATH as well as other system paths. If TBB_ROOT_DIR is not given, it will be set to the value of the TBBROOT environment variable if it is set. -# Intel Math Kernel Library (MKL): +## Intel Math Kernel Library (MKL): * ENABLE_MKL --- Search for Intel MKL for BLAS and LAPACK support [default=ON] * MKL_ROOT_DIR --- The install prefix for MKL. @@ -174,14 +174,14 @@ If TBB_ROOT_DIR is not given, it will be set to the value of the TBBROOT environ If MKL_ROOT_DIR is not given, it will be set to the value of the MKLROOT environment variable if it is set. -# AMD Core Math Library (ACML): +## AMD Core Math Library (ACML): * ENABLE_ACML --- Search for AMD math library for BLAS and LAPACK support [default=ON] * ACML_ROOT_DIR --- The install prefix for ACML. * ACML_LIBRARY --- The path to the ACML library directory. -# Google Performance Tools (Gperftools): +## Google Performance Tools (Gperftools): * ENABLE_GPERFTOOLS --- Enable use of gperftools, including tcmalloc. [default=OFF] @@ -193,14 +193,14 @@ If MKL_ROOT_DIR is not given, it will be set to the value of the MKLROOT environ If GPERFTOOLS_ROOT_DIR is not given, it will be set to the value of the GPERFTOOLS_DIR environment variable if it is set. -# Libunwind: +## Libunwind: * ENABLE_LIBUNWIND --- Force detection of gperftools [default=OFF, i.e. Libunwind will be searched for when needed] * LIBUNWIND_DIR --- The install prefix for Libunwind. If LIBUNWIND_DIR is not given, it will be set to the value of the LIBUNWIND_DIR environment variable if it is set. -# Library of Exchange-Correlation DFT functionals (LIBXC): +## Library of Exchange-Correlation DFT functionals (LIBXC): * ENABLE_LIBXC --- Enables use of the libxc library of density functionals. [default=ON] @@ -208,7 +208,7 @@ If LIBUNWIND_DIR is not given, it will be set to the value of the LIBUNWIND_DIR * LIBXC_INCLUDE_DIR --- The path to the LIBXC include directory. * LIBXC_LIBRARY --- The path to the LIBXC library directory. -# Polarizable Conitinuum Solver (PCM): +## Polarizable Conitinuum Solver (PCM): * ENABLE_PCM --- Enables use of PCM * PCM_ROOT_DIR --- The install prefix for PCM @@ -221,14 +221,14 @@ madness/external/pcm.cmake madness/modules/FindPCM.cmake madness/src/apps/chem/CMakeLists.txt -# Performance Application Programming Interface (PAPI): +## Performance Application Programming Interface (PAPI): * ENABLE_PAPI --- Enables use of PAPI [default=OFF] * PAPI_ROOT_DIR --- The install prefix for PAPI. * PAPI_INCLUDE_DIR --- The path to the PAPI include directory. * PAPI_LIBRARY --- The path to the PAPI library directory. -# Elemental parallel linear algebra library: +## Elemental parallel linear algebra library: Elemental provides optional distributed-memory linear algebra for some MADNESS application codes. MADNESS source includes (modified) Elemental v0.84, which has been validated to work with @@ -242,7 +242,7 @@ madness::initialize will call El::initialize() . MADNESS (numerical codes of MADNESS will not use Elemental). If not set, will use the included Elemental source. -# Parallel Runtime Scheduling and Execution Controller (PaRSEC): +## Parallel Runtime Scheduling and Execution Controller (PaRSEC): * ENABLE_PARSEC --- Enables use of PaRSEC as the task scheduler [default=OFF]. The use of Intel TBB should be disabled to use PaRSEC. diff --git a/doc/INSTALL.md b/doc/INSTALL.md new file mode 100644 index 00000000000..c03c6f1cc51 --- /dev/null +++ b/doc/INSTALL.md @@ -0,0 +1,3 @@ +# Installation + +```{include} ../INSTALL.md \ No newline at end of file diff --git a/doc/conf.py b/doc/conf.py index 99f4f93eabd..f567413bba4 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -29,7 +29,26 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ["myst_parser"] +extensions = ["myst_parser", + + ] + +source_suffix = [".rst", ".md"] +myst_enable_extensions = [ + "amsmath", + "colon_fence", + "deflist", + "dollarmath", + "fieldlist", + "html_admonition", + "html_image", + "replacements", + "smartquotes", + "strikethrough", + "substitution", + "tasklist", +] + # Add any paths that contain templates here, relative to this directory. diff --git a/doc/index.rst b/doc/index.rst index a097b245981..6727f6c64b7 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -14,16 +14,16 @@ MADNESS provides a high-level environment for the solution of integral and diffe .. toctree:: :maxdepth: 2 + INSTALL runtime numerical_library quantum - use MADNESS .. + - :doc:`INSTALL` - :doc:`runtime` - :doc:`numerical_library` - :doc:`quantum` - - :doc:`use_madness` Indices and tables ================== diff --git a/doc/numerical_library.md b/doc/numerical_library.md index 25455fb8f80..ebea7a6c585 100644 --- a/doc/numerical_library.md +++ b/doc/numerical_library.md @@ -1,5 +1,15 @@ -# MADNESS numerical library +# Numerical library MADNESS provides a high-level environment for the solution of integral and differential equations in many dimensions using adaptive, fast methods with guaranteed precision based on multi-resolution -analysis and novel separated representations. \ No newline at end of file +analysis and novel separated representations. + +Useful examples can be found in the `src/examples` directory, where the use of the numerical library can be +practiced by example. + * `sininteg.cc`: Create a function and integrate + * `hatom_energy.cc`: Compute the energy of the hydrogen atom + * `heat.cc`: apply the Greens function to the heat equation + * `3dharmonic.cc`: solve the 3D harmonic oscillator + * `h2.cc`: solve the Hartree-Fock equations for the H2 molecule + * `nonlinschro.cc`: use the KAIN solver for accelerating the solution of a system of non-linear equations + * `hedft.cc`: use density functional theory \ No newline at end of file diff --git a/doc/quantum.md b/doc/quantum.md index 93e52e95d5e..bbfd13357bb 100644 --- a/doc/quantum.md +++ b/doc/quantum.md @@ -1,4 +1,4 @@ -# MADNESS quantum chemistry +# Quantum chemistry ## What you can do @@ -15,10 +15,6 @@ Quantum chemical capabilities are: * OEP/RKS, `oep` ## Quickstart -A quick help and an overview over all available codes can be -obtained by - -`madqc --help` All programs can read commandline options or an input file (by default this is named "input"). A full list of all available calculation parameters can be obtained by writing @@ -107,7 +103,7 @@ Generally it is advisable to use as few numerical parameters as possible, as the The geometry of the molecule is given in the geometry data group. By default atomic units are used, but angstrom can be switched on by adding the line > geometry\ -> units angs\ +> units angstrom\ > ..\ > end @@ -130,10 +126,52 @@ e.g. a structure in the library has the same same as an input file, the code wil For the following codes/methods there are gradients implemented: > `nemo`, `moldft`, `znemo` -The optimization is started with the `gopt` flag in the `dft` block, geometry optimization -parameters are set in the `geoopt` block. -> `nemo --dft="k=8; econv=1.e-5; gopt=1" --geoopt="maxiter=10" --geometry="source=library, h2o"` +### Native optimizer +Codes with gradients can use the built-in geometry optimizer by adding the `gopt` flag +in the `dft` block, geometry optimization parameters are set in the `geoopt` block. +> `nemo --dft="k=8; econv=1.e-5; gopt=1" --geoopt="maxiter=10" --geometry="source_type=library; source_name=h2o"` + +### External optimizers +External optimizers (e.g. [pyberny](https://jan.hermann.name/pyberny/), [geometric](https://geometric.readthedocs.io/) ) +can be used through Madness's python wrapper. Details to follow. + +> `from madness import madness`\ +> `m=madcalc("/Users/fbischoff/devel/install/madness")`\ +> `m.get_result()`\ +> `print(m.data[0]["scf_energy"])`\ +> `print(m.get_scf_energy())`\ +> `print(m.data[0]["scf_k"])` + + + +## Other electronic structure options +### DFT functionals + +Madness uses [libxc](https://tddft.org/programs/libxc/) for exchange-correlation functionals. +The input parameters are located in the `dft` block +> `xc func` + +where `func` is a string defining the DFT XC functional. Predefined options are available as +> `func = hf, bp86, lda, pbe, b3lyp, pbe0` + +Other XC functionals can be created individually as in +> `xc "LDA_X 1.0 LDA_C_VWN 1.0"`\ +> `xc "GGA_X_PBE 0.75 GGA_C_PBE 1.0 HF_X 0.25"` + +where the number after the functional determines its weight. The two lines define +LDA and PBE0 functionals, respectively. + +For more details see the [libxc](https://tddft.org/programs/libxc/) webpage. + +### PCM solvation model + +Madness uses the Polarizable Continuum Model from [PCMSolver](https://pcmsolver.readthedocs.io) +for solvation effects. Details to come. + +### ## Convenience short options `--optimize` optimize the geometry\ `--geometry=file.xyz` find the geometry in the xyz file (note Angstrom units!) + +$ a=\frac{aa}{c}$ \ No newline at end of file diff --git a/doc/requirements.txt b/doc/requirements.txt index b78440a548e..cc86e4381ef 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -4,4 +4,4 @@ docutils==0.17.1 markupsafe==2.1.1 pyparsing==3.0.8 alabaster==0.7.12 -myst_parser==0.18.0 +myst_parser==0.18.0 \ No newline at end of file diff --git a/src/apps/chem/QCCalculationParametersBase.cc b/src/apps/chem/QCCalculationParametersBase.cc index e5f340009f8..0fdffb45711 100644 --- a/src/apps/chem/QCCalculationParametersBase.cc +++ b/src/apps/chem/QCCalculationParametersBase.cc @@ -56,8 +56,11 @@ void QCCalculationParametersBase::read_input(World& world, const std::string fil std::ifstream f(filename.c_str()); while (std::getline(f, line)) filecontents += line + "\n"; read_internal(world, filecontents, tag); - } catch (madness::MadnessException& e) { - std::cout << "could not find " << tag << " in file " << filename << std::endl; + } catch (std::exception& e) { + std::cout << "error while reading " << tag << " in file " << filename << std::endl; +// std::string errmsg=std::string(e.what()); + throw; + } } world.gop.broadcast_serializable(*this, 0); @@ -122,7 +125,7 @@ void QCCalculationParametersBase::read_internal(World& world, std::string& filec ::madness::print("found unknown key: ",key); ::madness::print("in datagroup: ",tag); } - MADNESS_EXCEPTION("input error",1); + throw std::runtime_error("input error"); } if ((not ignore_unknown_keys_silently) and (world.rank()==0)) madness::print("ignoring unknown parameter in input file: ",key); @@ -153,16 +156,16 @@ void QCCalculationParametersBase::read_internal(World& world, std::string& filec success=try_setting_user_defined_value >(key,line1) or success; success=try_setting_user_defined_value >(key,line1) or success; - } catch (std::runtime_error& e) { + } catch (std::exception& e) { std::string errmsg="found an error for key >> "+key+" << \n" +e.what(); - throw std::runtime_error(errmsg); + throw std::runtime_error(errmsg); } if (not success) { madness::print("\n\ncould not assign the input parameter for key ",key); std::string requested_type=get_parameter(key).get_type(); madness::print("\trequested type: ",requested_type,"\n"); madness::print("add the corresponding type to QCCalculationsParametersBase.h\n\n"); - MADNESS_EXCEPTION("add the corresponding type to QCCalculationsParametersBase.h",1); + throw std::invalid_argument("add the corresponding type to QCCalculationsParametersBase.h"); } } }; diff --git a/src/apps/chem/QCCalculationParametersBase.h b/src/apps/chem/QCCalculationParametersBase.h index eb5b87bf727..898f77193b6 100644 --- a/src/apps/chem/QCCalculationParametersBase.h +++ b/src/apps/chem/QCCalculationParametersBase.h @@ -69,7 +69,7 @@ std::istream& operator>>(std::istream& is, std::vector& v) { if (sline.bad()) { madness::print("error while reading vector from istream: "); madness::print(line,"\n"); - MADNESS_EXCEPTION("IO error",1); + throw std::runtime_error("IO error"); } return is; @@ -103,7 +103,7 @@ std::istream& operator>>(std::istream& is, std::pair& p) { if (sline.bad() or sline.fail()) { madness::print("error while reading vector from istream: "); madness::print(line,"\n"); - MADNESS_EXCEPTION("IO error",1); + throw std::runtime_error("IO error"); } p=std::pair(tmp1,tmp2); diff --git a/src/apps/chem/molecule.h b/src/apps/chem/molecule.h index 1b60e3e9dd7..d84abb3f8d7 100644 --- a/src/apps/chem/molecule.h +++ b/src/apps/chem/molecule.h @@ -122,9 +122,10 @@ class Molecule { read_input_and_commandline_options(world, parser, "geometry"); set_derived_values(parser); - } catch (...) { + } catch (std::exception& e) { print("geometry","end"); - MADNESS_EXCEPTION("faulty geometry input",1); + throw; +// MADNESS_EXCEPTION("faulty geometry input",1); } } diff --git a/src/madness/world/madness_exception.cc b/src/madness/world/madness_exception.cc index 3afa6d5c446..c00bc0e79a8 100644 --- a/src/madness/world/madness_exception.cc +++ b/src/madness/world/madness_exception.cc @@ -43,9 +43,11 @@ namespace madness { std::ostream& operator<<(std::ostream& out, const MadnessException& e) { + out << "--------------------------------------------------------------------------" << std::endl; out << "\nMadnessException : \n\n"; if (e.msg) out << "msg=" << e.msg << " :\n "; - if (e.assertion) out << "assertion=" << e.assertion << " :\n "; + if (e.assertion) out << "assertion=" << e.assertion << " \n "; + out << "--------------------------------------------------------------------------" << std::endl; out << "value=" << e.value << " : "; if (e.line) out << "line=" << e.line << " : "; if (e.function) out << "function=" << e.function << " : "; From 8f6b321c6d78eb6210b8552071997b2549341fa1 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 3 Aug 2022 13:14:26 -0400 Subject: [PATCH 0185/1312] Set theme jekyll-theme-slate --- _config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 _config.yml diff --git a/_config.yml b/_config.yml new file mode 100644 index 00000000000..c7418817439 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-slate \ No newline at end of file From c664b4fdab8fe4f5ae4f0702ba635c3e3d79407e Mon Sep 17 00:00:00 2001 From: fbischoff Date: Thu, 4 Aug 2022 10:05:35 -0400 Subject: [PATCH 0186/1312] working on the documentation --- .github/workflows/make_doxygen.yml | 60 ++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .github/workflows/make_doxygen.yml diff --git a/.github/workflows/make_doxygen.yml b/.github/workflows/make_doxygen.yml new file mode 100644 index 00000000000..a24e4b0cb4f --- /dev/null +++ b/.github/workflows/make_doxygen.yml @@ -0,0 +1,60 @@ +name: publish-doxygen + +# Trigger this when a pull request is merged (which implies pushing to master). +on: + push: + branches: + - experimental + +jobs: + doxygen: + runs-on: ubuntu-latest + + steps: + + - name: Git Checkout + uses: actions/checkout@v2 + + - name: Create clean gh-pages branch + run: git checkout -b gh-pages + + - name: Install prerequisites Ubuntu packages + run: | + sudo apt-get update + sudo apt-get install ninja-build g++-9 liblapack-dev openmpi-bin libopenmpi-dev libtbb-dev doxygen + + - name: configure + shell: bash + working-directory: ${{github.workspace}} + run: | + cmake -E make_directory ${{github.workspace}}/build + cd build && cmake $GITHUB_WORKSPACE + + - name: build + shell: bash + working-directory: ${{github.workspace}}/build + run: + cd ${{github.workspace}}/build && make docs + + - name: Move generated autodocs to target directory + working-directory: ${{github.workspace}}/build + run: mv doc/html ../api-doc + + - name: Add generated autodocs to Git repo in the gh-pages branch + working-directory: ${{github.workspace}} + run: | + git config --global user.email "florian.bischoff@hu-berlin.de" + git config --global user.name "$GITHUB_WORKFLOW GitHub action" + git add api-doc + git commit -am "Generated API doc" + + - name: Publish autodocs as GitHub pages + run: git push -f origin gh-pages:gh-pages + + - name: Result URLs + run: | + REPO_OWNER=$(echo $GITHUB_REPOSITORY | cut -d '/' -f 1) + REPO_NAME=$(echo $GITHUB_REPOSITORY | cut -d '/' -f 2) + echo "Formatted API docs: https://$REPO_OWNER.github.io/$REPO_NAME/api-doc" + echo "" + echo "GitHub pages branch: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/tree/gh-pages" From 28177ecc8e743e25b394abf924447b70fac00c14 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Thu, 4 Aug 2022 10:09:55 -0400 Subject: [PATCH 0187/1312] working on the documentation --- .github/workflows/make_doxygen.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/make_doxygen.yml b/.github/workflows/make_doxygen.yml index a24e4b0cb4f..09c68179de3 100644 --- a/.github/workflows/make_doxygen.yml +++ b/.github/workflows/make_doxygen.yml @@ -4,7 +4,7 @@ name: publish-doxygen on: push: branches: - - experimental + - master jobs: doxygen: From 07b3298fb2010a2f75c74d8618f6d74f216679fe Mon Sep 17 00:00:00 2001 From: fbischoff Date: Thu, 4 Aug 2022 10:27:03 -0400 Subject: [PATCH 0188/1312] Set theme jekyll-theme-slate From ddebdfbd0becc8cdf23e8189c5bf660ad5a73300 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Thu, 4 Aug 2022 11:52:07 -0400 Subject: [PATCH 0189/1312] working on the documentation --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f28e2c19874..1b1ff0ccfc0 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,15 @@ Multiresolution Adaptive Numerical Environment for Scientific Simulation # Summary -MADNESS provides a high-level environment for the solution of integral and differential equations in many dimensions using adaptive, fast methods with guaranteed precision based on multi-resolution analysis and novel separated representations. There are three main components to MADNESS. At the lowest level is a new petascale parallel programming environment that increases programmer productivity and code performance/scalability while maintaining backward compatibility with current programming tools such as MPI and Global Arrays. The numerical capabilities built upon the parallel tools provide a high-level environment for composing and solving numerical problems in many (1-6+) dimensions. Finally, built upon the numerical tools are new applications with initial focus upon chemistry, atomic and molecular physics, material science, and nuclear structure. +MADNESS provides a high-level environment for the solution of integral and differential equations in many dimensions using adaptive, fast methods with guaranteed precision based on multi-resolution analysis and novel separated representations. -A still incomplete documentation can be found on [readthedocs](https://madness.readthedocs.io/en/latest/). +There are three main components to MADNESS. At the lowest level is a new petascale parallel programming environment that increases programmer productivity and code performance/scalability while maintaining backward compatibility with current programming tools such as MPI and Global Arrays. The numerical capabilities built upon the parallel tools provide a high-level environment for composing and solving numerical problems in many (1-6+) dimensions. + +Finally, built upon the numerical tools are new applications with initial focus upon chemistry, atomic and molecular physics, material science, and nuclear structure. + +A user documentation can be found on [readthedocs](https://madness.readthedocs.io/en/latest/). + +A developer's documentation through doxygen can be found [here](https://m-a-d-n-e-s-s.github.io/madness/api-doc/). From 1848b50eef367b4d3d6de3e9f673b0f3efbc5d58 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Thu, 4 Aug 2022 16:22:22 -0400 Subject: [PATCH 0190/1312] symmetrizing the molecule if not quite but almost symmetric --- src/apps/chem/molecule.cc | 132 +++++++++++++++++++++----------------- src/apps/chem/molecule.h | 63 ++++++++++++++++-- 2 files changed, 128 insertions(+), 67 deletions(-) diff --git a/src/apps/chem/molecule.cc b/src/apps/chem/molecule.cc index 3c8238b88ad..217f2339c97 100644 --- a/src/apps/chem/molecule.cc +++ b/src/apps/chem/molecule.cc @@ -430,7 +430,7 @@ void Molecule::print() const { std::cout.flush(); std::stringstream sstream; sstream << " geometry" << std::endl; - sstream << p ; + sstream << p << std::endl; // sstream << " eprec " << std::scientific << std::setw(1) << parameters.eprec() << std::endl << std::fixed; // sstream << " units atomic" << std::endl; for (size_t i=0; i +bool Molecule::test_for_op(opT op, const double symtol) const { + for (unsigned int i=0; i-1) return true; + } + return false; } -/// Apply to (x,y,z) a reflection through a plane containing the origin with normal (xaxis,yaxis,zaxis) -static void apply_sigma(double xaxis, double yaxis, double zaxis, double& x, double& y, double& z) { - double raxissq = xaxis*xaxis + yaxis*yaxis + zaxis*zaxis; - double dx = x*xaxis*xaxis/raxissq; - double dy = y*yaxis*yaxis/raxissq; - double dz = z*zaxis*zaxis/raxissq; - x = x - 2.0*dx; - y = y - 2.0*dy; - z = z - 2.0*dz; -} - -static void apply_inverse(double xjunk, double yjunk, double zjunk, double& x, double& y, double& z) { - x = -x; - y = -y; - z = -z; +template +int Molecule::find_symmetry_equivalent_atom(int iatom, opT op, const double symtol) const { + double x=atoms[iatom].x, y=atoms[iatom].y, z=atoms[iatom].z; + op(x, y, z); + bool found = false; + for (unsigned int j=0; j -bool Molecule::test_for_op(double xaxis, double yaxis, double zaxis, opT op) const { - const double symtol = 1e-2; - for (unsigned int i=0; i field; - /// The molecular point group - /// is automatically assigned in the identify_pointgroup function + /// tolerance for determining the symmetry of a molecule + double symmetrytol = 1e-2; + + /// The molecular point group is automatically assigned in the identify_pointgroup function std::string pointgroup_="c1"; public: @@ -250,13 +252,60 @@ class Molecule { void swapaxes(int ix, int iy); template - bool test_for_op(double xaxis, double yaxis, double zaxis, opT op) const; + bool test_for_op(opT op, const double symtol) const; + + template + void symmetrize_for_op(opT op, const double symtol); - bool test_for_c2(double xaxis, double yaxis, double zaxis) const; + template + int find_symmetry_equivalent_atom(int iatom, opT op, const double symtol) const; + + bool test_for_c2(double xaxis, double yaxis, double zaxis, const double symtol) const; + + bool test_for_sigma(double xaxis, double yaxis, double zaxis, const double symtol) const; + + bool test_for_inverse(const double symtol) const; + + /// Apply to (x,y,z) a C2 rotation about an axis thru the origin and (xaxis,yaxis,zaxis) + struct apply_c2{ + double xaxis, yaxis, zaxis; + apply_c2(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} + void operator()(double& x, double& y, double& z) const { + double raxissq = xaxis*xaxis + yaxis*yaxis + zaxis*zaxis; + double dx = x*xaxis*xaxis/raxissq; + double dy = y*yaxis*yaxis/raxissq; + double dz = z*zaxis*zaxis/raxissq; + x = 2.0*dx - x; + y = 2.0*dy - y; + z = 2.0*dz - z; + } + }; - bool test_for_sigma(double xaxis, double yaxis, double zaxis) const; + /// Apply to (x,y,z) a reflection through a plane containing the origin with normal (xaxis,yaxis,zaxis) + struct apply_sigma{ + double xaxis, yaxis, zaxis; + apply_sigma(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} + void operator()(double& x, double& y, double& z) const { + double raxissq = xaxis * xaxis + yaxis * yaxis + zaxis * zaxis; + double dx = x * xaxis * xaxis / raxissq; + double dy = y * yaxis * yaxis / raxissq; + double dz = z * zaxis * zaxis / raxissq; + + x = x - 2.0 * dx; + y = y - 2.0 * dy; + z = z - 2.0 * dz; + } + }; - bool test_for_inverse() const; + struct apply_inverse{ + double xaxis, yaxis, zaxis; + apply_inverse(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} + void operator()(double& x, double& y, double& z) const { + x = -x; + y = -y; + z = -z; + } + }; public: @@ -407,7 +456,7 @@ class Molecule { double smallest_length_scale() const; - void identify_point_group(); + std::string symmetrize_and_identify_point_group(const double symtol); /// Moves the center of nuclear charge to the origin void center(); From a3338e4ee36e1a2bb4fcee8dd64d76173ade6117 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 5 Aug 2022 10:44:06 -0400 Subject: [PATCH 0191/1312] reset default to old behavior for backwards compatibility --- src/apps/chem/molecule.cc | 44 ++++++++++++++++++++++----------------- src/apps/chem/molecule.h | 7 +++---- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/apps/chem/molecule.cc b/src/apps/chem/molecule.cc index 217f2339c97..c1dbc12e7ff 100644 --- a/src/apps/chem/molecule.cc +++ b/src/apps/chem/molecule.cc @@ -714,21 +714,25 @@ std::string Molecule::symmetrize_and_identify_point_group(const double symtol) { // C2 axes must be along the Cartesian axes and // mirror planes must be orthogonal to them - bool x_is_c2 = test_for_c2(1.0,0.0,0.0,symtol); - bool y_is_c2 = test_for_c2(0.0,1.0,0.0,symtol); - bool z_is_c2 = test_for_c2(0.0,0.0,1.0,symtol); - bool xy_is_sigma = test_for_sigma(0.0,0.0,1.0,symtol); - bool xz_is_sigma = test_for_sigma(0.0,1.0,0.0,symtol); - bool yz_is_sigma = test_for_sigma(1.0,0.0,0.0,symtol); - bool inverse = test_for_inverse(symtol); - - if (x_is_c2) symmetrize_for_op(apply_c2(1.0,0.0,0.0), symtol); - if (y_is_c2) symmetrize_for_op(apply_c2(0.0,1.0,0.0), symtol); - if (z_is_c2) symmetrize_for_op(apply_c2(0.0,0.0,1.0), symtol); - if (xy_is_sigma) symmetrize_for_op(apply_sigma(0.0,0.0,1.0),symtol); - if (xz_is_sigma) symmetrize_for_op(apply_sigma(0.0,1.0,0.0),symtol); - if (yz_is_sigma) symmetrize_for_op(apply_sigma(1.0,0.0,0.0),symtol); - if (inverse) symmetrize_for_op(apply_inverse(0.0,0.0,0.0),symtol); + bool x_is_c2 = test_for_c2(1.0,0.0,0.0,fabs(symtol)); + bool y_is_c2 = test_for_c2(0.0,1.0,0.0,fabs(symtol)); + bool z_is_c2 = test_for_c2(0.0,0.0,1.0,fabs(symtol)); + bool xy_is_sigma = test_for_sigma(0.0,0.0,1.0,fabs(symtol)); + bool xz_is_sigma = test_for_sigma(0.0,1.0,0.0,fabs(symtol)); + bool yz_is_sigma = test_for_sigma(1.0,0.0,0.0,fabs(symtol)); + bool inverse = test_for_inverse(fabs(symtol)); + + // this is stupid, but necessary for backwards compatibility + // FIXME SYMTOL + if (symtol>0.0) { + if (x_is_c2) symmetrize_for_op(apply_c2(1.0,0.0,0.0), symtol); + if (y_is_c2) symmetrize_for_op(apply_c2(0.0,1.0,0.0), symtol); + if (z_is_c2) symmetrize_for_op(apply_c2(0.0,0.0,1.0), symtol); + if (xy_is_sigma) symmetrize_for_op(apply_sigma(0.0,0.0,1.0),symtol); + if (xz_is_sigma) symmetrize_for_op(apply_sigma(0.0,1.0,0.0),symtol); + if (yz_is_sigma) symmetrize_for_op(apply_sigma(1.0,0.0,0.0),symtol); + if (inverse) symmetrize_for_op(apply_inverse(0.0,0.0,0.0),symtol); + } /* . (i,c,s) @@ -843,7 +847,7 @@ void Molecule::orient(bool verbose) { if (verbose) { // Try to resolve degenerate rotations - double symtol = symmetrytol; + double symtol = fabs(parameters.symtol()); if (fabs(e[0]-e[1])0.0) { + std::string pointgroup_tight= symmetrize_and_identify_point_group(1.e-12); + MADNESS_CHECK(pointgroup_tight==pointgroup_); + } } /// rotates the molecule and the external field diff --git a/src/apps/chem/molecule.h b/src/apps/chem/molecule.h index 1465dc2a9c5..cb2010d3c05 100644 --- a/src/apps/chem/molecule.h +++ b/src/apps/chem/molecule.h @@ -139,7 +139,8 @@ class Molecule { initialize("eprec",1.e-4,"smoothing for the nuclear potential"); initialize("units","atomic","coordinate units",{"atomic","angstrom"}); initialize>("field",{0.0,0.0,0.0},"external electric field"); - initialize ("no_orient",false,"if true the molecule coordinates will not be reoriented"); + initialize ("no_orient",false,"if true the molecule coordinates will not be reoriented and/or symmetrized"); + initialize ("symtol",-1.e-2,"distance threshold for determining the symmetry-equivalent atoms; negative: old algorithm"); initialize ("core_type","none","core potential type",{"none","mpc"}); initialize ("psp_calc",false,"pseudopotential calculation for all atoms"); @@ -216,6 +217,7 @@ class Molecule { bool psp_calc() const {return get("psp_calc");} bool pure_ae() const {return get("pure_ae");} bool no_orient() const {return get("no_orient");} + double symtol() const {return get("symtol");} static std::string derive_source_type_from_name(const std::string name, const commandlineparser& parser) { @@ -234,9 +236,6 @@ class Molecule { CorePotentialManager core_pot; madness::Tensor field; - /// tolerance for determining the symmetry of a molecule - double symmetrytol = 1e-2; - /// The molecular point group is automatically assigned in the identify_pointgroup function std::string pointgroup_="c1"; From 4d503ddfd954b46da2b95a0700eacef6e05b2c42 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 5 Aug 2022 11:34:11 -0400 Subject: [PATCH 0192/1312] fixed bug in symmetrizing the molecule --- src/apps/chem/SCF.cc | 2 +- src/apps/chem/molecule.cc | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/chem/SCF.cc b/src/apps/chem/SCF.cc index b063c49f8d3..40385f0de35 100644 --- a/src/apps/chem/SCF.cc +++ b/src/apps/chem/SCF.cc @@ -189,7 +189,7 @@ SCF::SCF(World& world, const commandlineparser& parser) : param(CalculationParam molecule.read_core_file(molecule.parameters.core_type()); } - if (not molecule.parameters.no_orient()) molecule.orient(); +// if (not molecule.parameters.no_orient()) molecule.orient(); //account for nwchem aobasis generation if (param.nwfile() == "none") reset_aobasis(param.aobasis()); diff --git a/src/apps/chem/molecule.cc b/src/apps/chem/molecule.cc index c1dbc12e7ff..db3c8b5bb92 100644 --- a/src/apps/chem/molecule.cc +++ b/src/apps/chem/molecule.cc @@ -634,10 +634,11 @@ void Molecule::center() { template bool Molecule::test_for_op(opT op, const double symtol) const { + // all atoms must have a symmetry-equivalent partner for (unsigned int i=0; i-1) return true; + if (find_symmetry_equivalent_atom(i,op,symtol)==-1) return false; } - return false; + return true; } From 4b5ec882cd7193327a55ce00430a3590caa04cbe Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 5 Aug 2022 14:36:00 -0400 Subject: [PATCH 0193/1312] accepting au and bohr as units for the geometry input, more on documentation --- doc/numerical_library.md | 107 ++++++++++++++++++++++++++++++++++++++- src/apps/chem/molecule.h | 3 +- 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/doc/numerical_library.md b/doc/numerical_library.md index 25455fb8f80..a5d12765bc1 100644 --- a/doc/numerical_library.md +++ b/doc/numerical_library.md @@ -2,4 +2,109 @@ MADNESS provides a high-level environment for the solution of integral and differential equations in many dimensions using adaptive, fast methods with guaranteed precision based on multi-resolution -analysis and novel separated representations. \ No newline at end of file +analysis and novel separated representations. + +## Example for MADNESS as an external library +To use MADNESS as an external library in a code we recommend cmake. Build and install MADNESS to +an install directory. Set + +`export MADNESS_DIR=/path/to/madness/install/directory/` + + +In file `CMakeLists.txt`: +> `cmake_minimum_required(VERSION 3.22)`\ +> `project(yourbinary)`\ +> `set(CMAKE_CXX_STANDARD 17)`\ +> `find_package(MADNESS CONFIG REQUIRED)`\ +> `add_executable(yourbinary main.cpp)`\ +> `target_link_libraries(yourbinary madness)` + +In file `main.cpp`: +>`#define USE_GENTENSOR 1` // only needed if madness was configured with `-D ENABLE_GENTENSOR=1`\ +>`#include `\ +>`using namespace madness;`\ +>`int main(int argc, char* argv[]) {`\ +>`  World& world=initialize(argc,argv);`\ +>`  startup(world,argc,argv,true);`\ +>`  FunctionDefaults<1>::set_cubic_cell(-10,10);`\ +>`  FunctionDefaults<1>::set_k(8);`\ +>`  try {`\ +>`    auto functor=[](const Vector& r){return exp(-r[0]*r[0]);};`\ +>`    Function f=FunctionFactory(world).f(functor);`\ +>`    double I=f.trace();`\ +>`    std::cout << "trace(exp(-r^2) " << I << std::endl;`\ +>`  } catch (...) {`\ +>`     std::cout << "caught an error " << std::endl;`\ +>`  } `\ +>`  finalize();`\ +>`  return 0;`\ +>`}` + +Going through the code line by line: +>`#define USE_GENTENSOR 1` // only needed if madness was configured with `-D ENABLE_GENTENSOR=1`\ + +If MADNESS is to be used for high-dimensional problems (d>3) you will probably use low-rank tensor +approximations, which must be set at MADNESS configure time with the `-D ENABLE_GENTENSOR=1` flag, +and then again in your code. GenTensor and complex Functions are currently exlusive. + +>`#include ` + +Includes the MADNESS library. + +>`using namespace madness;`\ +>`int main(int argc, char* argv[]) {`\ +>`  World& world=initialize(argc,argv);` + +World contains the MPI communicator and must always be set, even if the code will run only +on one node. + +>`  startup(world,argc,argv,true);` + +Reads all necessary numerical data (e.g. the wavelet twoscale coefficients) and prints out +compiler flags. + +>`  FunctionDefaults<1>::set_cubic_cell(-10,10);` + +Defines the computation cell/intervall, here in 1 dimension. MADNESS is templated with respect +to the dimensions. + +>`  FunctionDefaults<1>::set_k(8);` + +Sets the wavelet order to 8. Anything between 2 and 30 will work, the optimal choice depends +on the specific problem, 8 is usually a good guess. + + +>`  try {`\ +>`    auto functor=[](const Vector& r){return exp(-r[0]*r[0]);};` + +Defines the function to be represented in MRA. `Vector` is a MADNESS class defining coordinates. + +>`    Function f=FunctionFactory(world).f(functor);` + +Projects the function $e^{-r^2}$ onto the MRA representation. A `FunctionFactory` is used to +define various properties of the `Function`, it requires `world` as input, optionally a function/lambda +defining the mathematical function. + +>`    double I=f.trace();` + +Integrate the function $\int_{-10}^{-10} e^{-r^2}\mathrm dx$.. + +>`    if (world.rank()==0) std::cout << "trace(exp(-r^2) " << I << std::endl;` + +Prints out the value of the integral. Be sure to add the `if` block to avoid verbose output if +run on many MPI ranks. Also make sure that the `trace` operation is not called inside this +`if` block, because it is a collective operation of all MPI ranks and having it executed only +by one rank will cause the program to hang. This is a common error. + +>`  } catch (...) {`\ +>`     std::cout << "caught an error " << std::endl;`\ +>`  } `\ +>`  finalize();`\ + +Finalizes the communicator. +It is important that all MRA objects (e.g. Function) are destructed before +`finalize()` is called, otherwise segmentation faults will occur, +so best enclose all MRA code after `startup` inside a `try/catch` block. + +>`  return 0;`\ +>`}` diff --git a/src/apps/chem/molecule.h b/src/apps/chem/molecule.h index cb2010d3c05..e2abab91f69 100644 --- a/src/apps/chem/molecule.h +++ b/src/apps/chem/molecule.h @@ -137,7 +137,7 @@ class Molecule { initialize("source_type","inputfile","where to get the coordinates from",{"inputfile","xyz","library"}); initialize("source_name","TBD","name of the geometry from the library or the input file"); initialize("eprec",1.e-4,"smoothing for the nuclear potential"); - initialize("units","atomic","coordinate units",{"atomic","angstrom"}); + initialize("units","atomic","coordinate units",{"atomic","angstrom","bohr","au"}); initialize>("field",{0.0,0.0,0.0},"external electric field"); initialize ("no_orient",false,"if true the molecule coordinates will not be reoriented and/or symmetrized"); initialize ("symtol",-1.e-2,"distance threshold for determining the symmetry-equivalent atoms; negative: old algorithm"); @@ -206,6 +206,7 @@ class Molecule { // } if (source_type()=="xyz") set_derived_value("units",std::string("angstrom")); + if (units()=="bohr" or units()=="au") set_derived_value("units","atomic"); } std::string source_type() const {return get("source_type");} From e73bc2b504971ad947884cfdd574e3f6431c9164 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 5 Aug 2022 14:41:39 -0400 Subject: [PATCH 0194/1312] merging pr-docs --- doc/numerical_library.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/numerical_library.md b/doc/numerical_library.md index 5808a537268..421fcae4135 100644 --- a/doc/numerical_library.md +++ b/doc/numerical_library.md @@ -14,6 +14,16 @@ practiced by example. * `nonlinschro.cc`: use the KAIN solver for accelerating the solution of a system of non-linear equations * `hedft.cc`: use density functional theory +Useful examples can be found in the src/examples directory, where the use of the numerical library can be practiced by example. +- sininteg.cc: Create a function and integrate +- hatom_energy.cc: Compute the energy of the hydrogen atom +- heat.cc: apply the Greens function to the heat equation +- 3dharmonic.cc: solve the 3D harmonic oscillator +- h2.cc: solve the Hartree-Fock equations for the H2 molecule +- nonlinschro.cc: use the KAIN solver for accelerating the solution of a system of non-linear equations +- hedft.cc: use density functional theory + + ## Example for MADNESS as an external library To use MADNESS as an external library in a code we recommend cmake. Build and install MADNESS to an install directory. Set From 88a1ccc88203f0976b7901185f4a850c99ac3d8b Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 5 Aug 2022 15:00:54 -0400 Subject: [PATCH 0195/1312] nicer formatting --- doc/numerical_library.md | 136 ++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 58 deletions(-) diff --git a/doc/numerical_library.md b/doc/numerical_library.md index 421fcae4135..d4046bb9187 100644 --- a/doc/numerical_library.md +++ b/doc/numerical_library.md @@ -14,15 +14,6 @@ practiced by example. * `nonlinschro.cc`: use the KAIN solver for accelerating the solution of a system of non-linear equations * `hedft.cc`: use density functional theory -Useful examples can be found in the src/examples directory, where the use of the numerical library can be practiced by example. -- sininteg.cc: Create a function and integrate -- hatom_energy.cc: Compute the energy of the hydrogen atom -- heat.cc: apply the Greens function to the heat equation -- 3dharmonic.cc: solve the 3D harmonic oscillator -- h2.cc: solve the Hartree-Fock equations for the H2 molecule -- nonlinschro.cc: use the KAIN solver for accelerating the solution of a system of non-linear equations -- hedft.cc: use density functional theory - ## Example for MADNESS as an external library To use MADNESS as an external library in a code we recommend cmake. Build and install MADNESS to @@ -32,99 +23,128 @@ an install directory. Set In file `CMakeLists.txt`: -> `cmake_minimum_required(VERSION 3.22)`\ -> `project(yourbinary)`\ -> `set(CMAKE_CXX_STANDARD 17)`\ -> `find_package(MADNESS CONFIG REQUIRED)`\ -> `add_executable(yourbinary main.cpp)`\ -> `target_link_libraries(yourbinary madness)` + +```` +cmake_minimum_required(VERSION 3.22) +project(yourbinary) +set(CMAKE_CXX_STANDARD 17) +find_package(MADNESS CONFIG REQUIRED) +add_executable(yourbinary main.cpp) +target_link_libraries(yourbinary madness) +```` In file `main.cpp`: ->`#define USE_GENTENSOR 1` // only needed if madness was configured with `-D ENABLE_GENTENSOR=1`\ ->`#include `\ ->`using namespace madness;`\ ->`int main(int argc, char* argv[]) {`\ ->`  World& world=initialize(argc,argv);`\ ->`  startup(world,argc,argv,true);`\ ->`  FunctionDefaults<1>::set_cubic_cell(-10,10);`\ ->`  FunctionDefaults<1>::set_k(8);`\ ->`  try {`\ ->`    auto functor=[](const Vector& r){return exp(-r[0]*r[0]);};`\ ->`    Function f=FunctionFactory(world).f(functor);`\ ->`    double I=f.trace();`\ ->`    std::cout << "trace(exp(-r^2) " << I << std::endl;`\ ->`  } catch (...) {`\ ->`     std::cout << "caught an error " << std::endl;`\ ->`  } `\ ->`  finalize();`\ ->`  return 0;`\ ->`}` +````c +#define USE_GENTENSOR 1` // only needed if madness was configured with `-D ENABLE_GENTENSOR=1 +#include +using namespace madness; +int main(int argc, char* argv[]) { + World& world=initialize(argc,argv); + startup(world,argc,argv,true); + FunctionDefaults<1>::set_cubic_cell(-10,10); + FunctionDefaults<1>::set_k(8); + try { + auto functor=[](const Vector& r){return exp(-r[0]*r[0]);}; + Function f=FunctionFactory(world).f(functor); + double I=f.trace(); + std::cout << "trace(exp(-r^2) " << I << std::endl; + } catch (...) { + std::cout << "caught an error " << std::endl; + } + finalize(); + return 0; +} +```` Going through the code line by line: ->`#define USE_GENTENSOR 1` // only needed if madness was configured with `-D ENABLE_GENTENSOR=1`\ +````c +#define USE_GENTENSOR 1` // only needed if madness was configured with `-D ENABLE_GENTENSOR=1 +```` If MADNESS is to be used for high-dimensional problems (d>3) you will probably use low-rank tensor approximations, which must be set at MADNESS configure time with the `-D ENABLE_GENTENSOR=1` flag, -and then again in your code. GenTensor and complex Functions are currently exlusive. +and then again in your code. GenTensor and complex Functions are currently mutually exlusive. ->`#include ` +````c +#include +```` Includes the MADNESS library. ->`using namespace madness;`\ ->`int main(int argc, char* argv[]) {`\ ->`  World& world=initialize(argc,argv);` +````c +using namespace madness; +int main(int argc, char* argv[]) { + World& world=initialize(argc,argv) +```` World contains the MPI communicator and must always be set, even if the code will run only on one node. - ->`  startup(world,argc,argv,true);` + +````c + startup(world,argc,argv,true) +```` Reads all necessary numerical data (e.g. the wavelet twoscale coefficients) and prints out compiler flags. ->`  FunctionDefaults<1>::set_cubic_cell(-10,10);` +````c + FunctionDefaults<1>::set_cubic_cell(-10,10) +```` Defines the computation cell/intervall, here in 1 dimension. MADNESS is templated with respect to the dimensions. - ->`  FunctionDefaults<1>::set_k(8);` + +```` + FunctionDefaults<1>::set_k(8); +```` Sets the wavelet order to 8. Anything between 2 and 30 will work, the optimal choice depends on the specific problem, 8 is usually a good guess. ->`  try {`\ ->`    auto functor=[](const Vector& r){return exp(-r[0]*r[0]);};` +```` + try { + auto functor=[](const Vector& r){return exp(-r[0]*r[0]);} +```` Defines the function to be represented in MRA. `Vector` is a MADNESS class defining coordinates. ->`    Function f=FunctionFactory(world).f(functor);` +````c + Function f=FunctionFactory(world).f(functor); +```` Projects the function $e^{-r^2}$ onto the MRA representation. A `FunctionFactory` is used to define various properties of the `Function`, it requires `world` as input, optionally a function/lambda defining the mathematical function. ->`    double I=f.trace();` +````c + double I=f.trace(); +```` -Integrate the function $\int_{-10}^{-10} e^{-r^2}\mathrm dx$.. +Integrates the function $\int_{-10}^{-10} e^{-r^2}\mathrm dx$. ->`    if (world.rank()==0) std::cout << "trace(exp(-r^2) " << I << std::endl;` +````c + if (world.rank()==0) std::cout << "trace(exp(-r^2) " << I << std::endl; +```` Prints out the value of the integral. Be sure to add the `if` block to avoid verbose output if run on many MPI ranks. Also make sure that the `trace` operation is not called inside this `if` block, because it is a collective operation of all MPI ranks and having it executed only by one rank will cause the program to hang. This is a common error. ->`  } catch (...) {`\ ->`     std::cout << "caught an error " << std::endl;`\ ->`  } `\ ->`  finalize();`\ +````c + } catch (...) { + std::cout << "caught an error " << std::endl; + } + finalize(); +```` Finalizes the communicator. -It is important that all MRA objects (e.g. Function) are destructed before +It is important that all MRA objects (e.g. `Function`) are destructed before `finalize()` is called, otherwise segmentation faults will occur, so best enclose all MRA code after `startup` inside a `try/catch` block. ->`  return 0;`\ ->`}` +````c + return 0; +} +```` \ No newline at end of file From 8c25fae3b3cf1e54bd522576a176ed74e3fb1785 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 5 Aug 2022 15:13:03 -0400 Subject: [PATCH 0196/1312] adding the threshold to the example --- doc/numerical_library.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/doc/numerical_library.md b/doc/numerical_library.md index d4046bb9187..a104037963a 100644 --- a/doc/numerical_library.md +++ b/doc/numerical_library.md @@ -35,7 +35,7 @@ target_link_libraries(yourbinary madness) In file `main.cpp`: ````c -#define USE_GENTENSOR 1` // only needed if madness was configured with `-D ENABLE_GENTENSOR=1 +#define USE_GENTENSOR 1 // only needed if madness was configured with `-D ENABLE_GENTENSOR=1 #include using namespace madness; int main(int argc, char* argv[]) { @@ -43,9 +43,10 @@ int main(int argc, char* argv[]) { startup(world,argc,argv,true); FunctionDefaults<1>::set_cubic_cell(-10,10); FunctionDefaults<1>::set_k(8); + FunctionDefaults<1>::set_thresh(1.e-5); try { - auto functor=[](const Vector& r){return exp(-r[0]*r[0]);}; - Function f=FunctionFactory(world).f(functor); + auto gaussian=[](const Vector& r){return exp(-r[0]*r[0]);}; + Function f=FunctionFactory(world).f(gaussian); double I=f.trace(); std::cout << "trace(exp(-r^2) " << I << std::endl; } catch (...) { @@ -101,6 +102,13 @@ to the dimensions. Sets the wavelet order to 8. Anything between 2 and 30 will work, the optimal choice depends on the specific problem, 8 is usually a good guess. +```` + FunctionDefaults<1>::set_thresh(1.e-5); +```` + +Sets the precision threshold to $\epsilon=10^{-5}$ in the $L^2$ norm. +Unless the function is singular or has other pathological features the threshold will be met. It is always +possible to tighten the threshold to secure more digits. ```` try { From 97e5d9232540112de6f661f6c07ed5e07e5c011b Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 10 Aug 2022 14:41:23 -0400 Subject: [PATCH 0197/1312] adding a prefix to output files --- src/apps/chem/CalculationParameters.h | 2 ++ src/apps/chem/SCF.cc | 11 ++++++----- src/madness/world/binary_fstream_archive.h | 16 ++++++++++++++++ src/madness/world/parallel_archive.h | 18 ++++++++++++++++++ 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/apps/chem/CalculationParameters.h b/src/apps/chem/CalculationParameters.h index d4e441b2b35..1ff0c4902e4 100644 --- a/src/apps/chem/CalculationParameters.h +++ b/src/apps/chem/CalculationParameters.h @@ -61,6 +61,7 @@ struct CalculationParameters : public QCCalculationParametersBase { /// ctor reading out the input file CalculationParameters() { + initialize("prefix","mad","prefixes your output/restart/json/plot/etc files"); initialize("charge",0.0,"total molecular charge"); initialize ("xc","hf","XC input line"); initialize("smear",0.0,"smearing parameter"); @@ -134,6 +135,7 @@ struct CalculationParameters : public QCCalculationParametersBase { public: using QCCalculationParametersBase::read_input_and_commandline_options; + std::string prefix() const {return get("prefix");} double econv() const {return get("econv");} double dconv() const {return get("dconv");} diff --git a/src/apps/chem/SCF.cc b/src/apps/chem/SCF.cc index 40385f0de35..bbe2b5f0e62 100644 --- a/src/apps/chem/SCF.cc +++ b/src/apps/chem/SCF.cc @@ -229,7 +229,8 @@ void SCF::copy_data(World& world, const SCF& other) { void SCF::save_mos(World& world) { PROFILE_MEMBER_FUNC(SCF); - archive::ParallelOutputArchive ar(world, "restartdata", param.get("nio")); + auto archivename=param.prefix()+".restartdata"; + archive::ParallelOutputArchive ar(world, archivename.c_str(), param.get("nio")); // IF YOU CHANGE ANYTHING HERE MAKE SURE TO UPDATE THIS VERSION NUMBER /* * After spin restricted @@ -259,7 +260,7 @@ void SCF::save_mos(World& world) { tensorT Saoamo = matrix_inner(world, ao, amo); tensorT Saobmo = (!param.spin_restricted()) ? matrix_inner(world, ao, bmo) : tensorT(); if (world.rank() == 0) { - archive::BinaryFstreamOutputArchive arao("restartaodata"); + archive::BinaryFstreamOutputArchive arao(param.prefix()+".restartaodata"); arao << Saoamo << aeps << aocc << aset; if (!param.spin_restricted()) arao << Saobmo << beps << bocc << bset; } @@ -277,7 +278,7 @@ void SCF::load_mos(World& world) { amo.clear(); bmo.clear(); - archive::ParallelInputArchive ar(world, "restartdata"); + archive::ParallelInputArchive ar(world, param.prefix()+".restartdata"); /* File format: @@ -590,7 +591,7 @@ bool SCF::restart_aos(World& world) { bool OK = true; if (world.rank() == 0) { try { - archive::BinaryFstreamInputArchive arao("restartaodata"); + archive::BinaryFstreamInputArchive arao(param.prefix()+".restartaodata"); arao >> Saoamo >> aeps >> aocc >> aset; if (Saoamo.dim(0) != int(ao.size()) || Saoamo.dim(1) != param.nmo_alpha()) { print(" AO alpha restart data size mismatch --- starting from atomic guess instead", Saoamo.dim(0), @@ -2261,7 +2262,7 @@ void SCF::output_scf_info_schema(const int& iter, const std::map Date: Wed, 10 Aug 2022 14:59:17 -0400 Subject: [PATCH 0198/1312] prefix to output files derived from input file name --- src/apps/chem/CalculationParameters.h | 5 ++++- src/apps/chem/SCF.cc | 2 +- src/apps/chem/commandlineparser.h | 13 ++++++++++++- src/apps/chem/znemo.cc | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/apps/chem/CalculationParameters.h b/src/apps/chem/CalculationParameters.h index 1ff0c4902e4..3ad8218abe6 100644 --- a/src/apps/chem/CalculationParameters.h +++ b/src/apps/chem/CalculationParameters.h @@ -238,7 +238,10 @@ struct CalculationParameters : public QCCalculationParametersBase { } - void set_derived_values(const Molecule& molecule, const AtomicBasisSet& aobasis) { + void set_derived_values(const Molecule& molecule, const AtomicBasisSet& aobasis, const commandlineparser& parser) { + std::string inputfile=parser.value("input"); + std::string prefix=commandlineparser::remove_extension(commandlineparser::base_name(inputfile)); + if (prefix!="input") set_derived_value("prefix",prefix); for (size_t iatom = 0; iatom < molecule.natom(); iatom++) { if (molecule.get_pseudo_atom(iatom)){ diff --git a/src/apps/chem/SCF.cc b/src/apps/chem/SCF.cc index bbe2b5f0e62..8e87338d799 100644 --- a/src/apps/chem/SCF.cc +++ b/src/apps/chem/SCF.cc @@ -194,7 +194,7 @@ SCF::SCF(World& world, const commandlineparser& parser) : param(CalculationParam //account for nwchem aobasis generation if (param.nwfile() == "none") reset_aobasis(param.aobasis()); else aobasis.read_nw_file(param.nwfile()); - param.set_derived_values(molecule, aobasis); + param.set_derived_values(molecule, aobasis, parser); } world.gop.broadcast_serializable(molecule, 0); diff --git a/src/apps/chem/commandlineparser.h b/src/apps/chem/commandlineparser.h index 4aef62a550e..a147f40916c 100644 --- a/src/apps/chem/commandlineparser.h +++ b/src/apps/chem/commandlineparser.h @@ -61,7 +61,7 @@ struct commandlineparser { keyval[tolower(key)]=tolower(value); } -private: +public: /// make lower case static std::string tolower(std::string s) { std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c){ return std::tolower(c); }); @@ -104,6 +104,17 @@ struct commandlineparser { return str2; } + static std::string base_name(std::string const & path, std::string const & delims = "/") + { + return path.substr(path.find_last_of(delims) + 1); + } + + static std::string remove_extension(std::string const & filename) + { + std::size_t p=filename.find_last_of('.'); + return p > 0 && p != std::string::npos ? filename.substr(0, p) : filename; + } + }; } #endif //MADNESS_COMMANDLINEPARSER_H diff --git a/src/apps/chem/znemo.cc b/src/apps/chem/znemo.cc index ab2e9422838..4beb9b83106 100644 --- a/src/apps/chem/znemo.cc +++ b/src/apps/chem/znemo.cc @@ -28,7 +28,7 @@ Znemo::Znemo(World& world, const commandlineparser& parser) : NemoBase(world), m aobasis.read_file(cparam.aobasis()); // cparam.set_molecular_info(mol, aobasis, 0); - cparam.set_derived_values(mol,aobasis); + cparam.set_derived_values(mol,aobasis,parser); cparam.set_derived_value("spin_restricted",false); param.set_derived_values(); From 2cbf8d6f536641bb6a1fba74d2b52db539aaa284 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 10 Aug 2022 15:21:02 -0400 Subject: [PATCH 0199/1312] more consistent output file naming --- src/apps/chem/SCF.cc | 9 ++++++--- src/apps/chem/SCF.h | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/apps/chem/SCF.cc b/src/apps/chem/SCF.cc index 8e87338d799..a7b2e4fbb65 100644 --- a/src/apps/chem/SCF.cc +++ b/src/apps/chem/SCF.cc @@ -2169,9 +2169,11 @@ void SCF::solve(World& world) { // write eigenvalues etc to a file at the same time for plotting DOS etc. FILE *f = 0; if (param.nbeta() != 0 && !param.spin_restricted()) { - f = fopen("energies_alpha.dat", "w"); + std::string name=std::string(param.prefix()+".energies_alpha.dat"); + f = fopen(name.c_str(), "w"); } else { - f = fopen("energies.dat", "w"); + std::string name=param.prefix()+".energies.dat"; + f = fopen(name.c_str(), "w"); } long nmo = amo.size(); @@ -2184,7 +2186,8 @@ void SCF::solve(World& world) { if (param.nbeta() != 0 && !param.spin_restricted()) { long nmo = bmo.size(); FILE *f = 0; - f = fopen("energies_beta.dat", "w"); + std::string name=param.prefix()+".energies_beta.dat"; + f = fopen(name.c_str(), "w"); fprintf(f, "# %8li\n", nmo); for (long i = 0; i < nmo; ++i) { diff --git a/src/apps/chem/SCF.h b/src/apps/chem/SCF.h index 49cc819e04a..4289cbfd203 100644 --- a/src/apps/chem/SCF.h +++ b/src/apps/chem/SCF.h @@ -673,7 +673,7 @@ class MolecularEnergy : public OptimizationTargetInterface, public QCPropertyInt to_json(j, int_vals); double_vals.push_back({"return_energy", value(calc.molecule.get_all_coords().flat())}); to_json(j, double_vals); - output_schema("calc_info", j); + output_schema(param.prefix()+".calc_info", j); } }; } From b8d10e3d5b3761774dedba7f283d489440d1dbde Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Wed, 10 Aug 2022 16:02:51 -0400 Subject: [PATCH 0200/1312] redefaultableoption was breaking automatic detection of MKL (default was supposed to be ON but it only actually worked if -DENABLE_MKL=ON was manually set) so changed it back to option --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61c526666d0..6f1f268f03c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,7 +91,8 @@ include(external/versions.cmake) # failure to find the library is an error. option(ENABLE_MPI "Enable Message Passing Interface (MPI) Library" ON) -redefaultable_option(ENABLE_MKL "Search for Intel Math Kernel Library (MKL) for BLAS and LAPACK support" ON) +#redefaultable_option(ENABLE_MKL "Search for Intel Math Kernel Library (MKL) for BLAS and LAPACK support" ON) +option(ENABLE_MKL "Search for Intel Math Kernel Library (MKL) for BLAS and LAPACK support" ON) option(ENABLE_ACML "Search for AMD Core Math Library (ACML) for BLAS and LAPACK support" ON) option(ENABLE_TCMALLOC_MINIMAL "Enable use of tcmalloc_minimal library from Google Performance Tools (gperftools)" OFF) option(ENABLE_GPERFTOOLS "Enable use of full Google Performance Tools (gperftools)" OFF) From a5da665f6cb9678981172d6801f75cbc6b5d83bf Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Wed, 10 Aug 2022 16:47:55 -0400 Subject: [PATCH 0201/1312] Update INSTALL.md Started to update the installation instructions --- INSTALL.md | 74 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 3119611bedb..5ee505067c5 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,35 +1,27 @@ ## Introduction -When configuring MADNESS with CMake, you must specify cache variables and the -path to the MADNESS source directory. To specify a cache variable prefix it with -the -D command line flag and set it equal to the desired value (see below for a -valid cache variables). For example, to specify the C/C++ compilers - - $ cmake -D CMAKE_C_COMPILER=gcc -D CMAKE_CXX_COMPILER=g++ \ - /path/to/madness/source - -The resulting build directory will be the current working directory specified -where the CMake command it run. It is recommended that you configure and build -MADNESS outside the source tree. Boolean values for cache variables are +MADNESS uses CMake to configure the build. Assuming that necessary prerequisites (below) are installed on your system in default locations and the source has been downloaded into the directory `/path/to/madness/source`, you can make a directory (outside the source tree) to build in and configure the build as follows +``` +mkdir build +cd build +cmake /path/to/madness/source +make +``` +The default make target builds only the numerical library and underlying runtime. To build applications (e.g., `moldft`, `nemo`) specify this on the make command. The target `everything` does what you expect. You can run executables and use libraries from the build directory, but to install into the default location (`/usr`) just use `make install`. + +If prerequiste libraries are not in default locations or you wish to override defaults, you may have to set CMAke cache variables as described below. For instance, to build a debug version, without MPI, and with installation in `/home/me/madinstall` +``` +cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_MPI=OFF -DCMAKE_INSTALL_PREFIX=/home/me/madinstall /path/to/madness/source +make +make install +``` +Boolean values for cache variables are considered true if the constant is 1, ON, YES, TRUE, Y, or a non-zero number; or false if the constant is 0, OFF, NO, FALSE, N, or IGNORE. -## Toolchain files - -MADNESS provides toolchain files for select systems. It is recommended that you -use these files if provided as they contain the platform specific settings -neccessary to build on the given platform. The toolchain files are included wiht -the MADNESS source in the cmake/toolchains directory. - -* CMAKE_TOOLCHAIN_FILE --- Specifies the path (including the file name) to the - toolchain file. - -For example, to specify the toolchain file for Mira: - - $ cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/madness/source/cmake/toolchains/mira-gcc-essl.cmake \ - /path/to/madness/source +The below summarizes some of the most useful CMake variables.\ -Additional cache variables may be specified. +**RJH stopped editing here** ## Compiler variables @@ -38,12 +30,9 @@ flags, and linker flags. * CMAKE_C_COMPILER --- C compiler [default=search] * CMAKE_CXX_COMPILER --- C++ compiler [default=search] -* CMAKE_ASM_COMPILER --- Assembly compiler (set only if required) - [default=search] -* MPI_CXX_COMPILER --- MPI C++ compiler wrapper (required if ENABLE_MPI=ON) - [default=search] -* MPI_C_COMPILER --- MPI C compiler wrapper (required if ENABLE_MPI=ON) - [default=search] +* CMAKE_ASM_COMPILER --- Assembly compiler [default=search] +* MPI_CXX_COMPILER --- MPI C++ compiler wrapper [default=search] +* MPI_C_COMPILER --- MPI C compiler wrapper [default=search] You can specify compile flags with the following variables. These cache variables are optional, and it is typically not necessary to specify these variables. @@ -58,8 +47,9 @@ are optional, and it is typically not necessary to specify these variables. ## Build options -The following CMake cache variables turn MADNESS features on and off. +The following CMake cache variables turn features on and off. +* CMAKE_BUILD_TYPE --- Debug or Release * ENABLE_GENTENSOR --- Enable generic tensors; only useful if need compressed 6-d tensors, e.g. in MP2 [default=OFF] * ENABLE_TASK_PROFILER - Enable task profiler that collects per-task start and @@ -248,3 +238,21 @@ madness::initialize will call El::initialize() . to use PaRSEC. If ENABLE_PARSEC is set but PaRSEC is not found, it will be built from source. + +## Toolchain files + +**Use of these files is now deprecated --- it should work without.** However, they can be useful if all else fails. + +MADNESS provides toolchain files for select systems. It is recommended that you +use these files if provided as they contain the platform specific settings +neccessary to build on the given platform. The toolchain files are included wiht +the MADNESS source in the cmake/toolchains directory. + +* CMAKE_TOOLCHAIN_FILE --- Specifies the path (including the file name) to the + toolchain file. + +For example, to specify the toolchain file for Mira: + + $ cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/madness/source/cmake/toolchains/mira-gcc-essl.cmake \ + /path/to/madness/source + From 4dfab111985e3a833a26ceccf228787b6a52dc50 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 10 Aug 2022 16:48:09 -0400 Subject: [PATCH 0202/1312] input parsing, fixed failing test --- src/apps/chem/QCCalculationParametersBase.cc | 14 +++++++---- src/apps/chem/QCCalculationParametersBase.h | 12 +++++++--- src/apps/chem/commandlineparser.h | 24 +++++++++++++++++-- src/apps/chem/test_MolecularOrbitals.cc | 6 ++--- .../chem/test_QCCalculationParametersBase.cc | 3 +++ src/apps/moldft/moldft.cc | 16 +------------ 6 files changed, 48 insertions(+), 27 deletions(-) diff --git a/src/apps/chem/QCCalculationParametersBase.cc b/src/apps/chem/QCCalculationParametersBase.cc index 0fdffb45711..b606336937a 100644 --- a/src/apps/chem/QCCalculationParametersBase.cc +++ b/src/apps/chem/QCCalculationParametersBase.cc @@ -51,19 +51,23 @@ std::string QCCalculationParametersBase::print_to_string(bool non_defaults_only) void QCCalculationParametersBase::read_input(World& world, const std::string filename, const std::string tag) { std::string filecontents, line; + std::string errmsg; if (world.rank()==0) { try { std::ifstream f(filename.c_str()); while (std::getline(f, line)) filecontents += line + "\n"; read_internal(world, filecontents, tag); - } catch (std::exception& e) { - std::cout << "error while reading " << tag << " in file " << filename << std::endl; -// std::string errmsg=std::string(e.what()); + } catch (std::invalid_argument& e) { + errmsg=e.what(); throw; - + } catch (std::exception& e) { + std::stringstream ss; + ss << "could not read data group >>" << tag << "<< in file " << filename << std::endl; + errmsg=ss.str(); } } world.gop.broadcast_serializable(*this, 0); + if (errmsg.size()>0) throw std::runtime_error(errmsg); } /// read the parameters from the command line and broadcast @@ -156,6 +160,8 @@ void QCCalculationParametersBase::read_internal(World& world, std::string& filec success=try_setting_user_defined_value >(key,line1) or success; success=try_setting_user_defined_value >(key,line1) or success; + } catch (std::invalid_argument& e) { + throw; } catch (std::exception& e) { std::string errmsg="found an error for key >> "+key+" << \n" +e.what(); throw std::runtime_error(errmsg); diff --git a/src/apps/chem/QCCalculationParametersBase.h b/src/apps/chem/QCCalculationParametersBase.h index 898f77193b6..e1492952b59 100644 --- a/src/apps/chem/QCCalculationParametersBase.h +++ b/src/apps/chem/QCCalculationParametersBase.h @@ -206,8 +206,8 @@ struct QCParameter { value=default_value; if (derived_value!=null) value=derived_value; if (user_defined_value!=null) value=user_defined_value; - if (not check_allowed()) throw std::runtime_error(not_allowed_errmsg()); - } + if (not check_allowed()) throw std::invalid_argument(not_allowed_errmsg()); + } bool check_allowed() { if (allowed_values.size()==0) return true; @@ -291,7 +291,13 @@ class QCCalculationParametersBase { virtual void read_input_and_commandline_options(World& world, const commandlineparser& parser, const std::string tag) { - read_input(world,parser.value("input"),tag); + try { + read_input(world,parser.value("input"),tag); + } catch (std::invalid_argument& e) { + throw; + } catch (std::exception& e) { + print(e.what()); + } read_commandline_options(world,parser,tag); } diff --git a/src/apps/chem/commandlineparser.h b/src/apps/chem/commandlineparser.h index a147f40916c..e9f32836671 100644 --- a/src/apps/chem/commandlineparser.h +++ b/src/apps/chem/commandlineparser.h @@ -26,13 +26,15 @@ struct commandlineparser { set_defaults(); std::vector allArgs_raw(argv, argv + argc); for (auto &a : allArgs_raw) { + // special treatment for the input file: no hyphens + a=check_for_input_file(a); a= remove_first_equal(remove_front_hyphens(a)); std::replace_copy(a.begin(), a.end(), a.begin(), '=', ' '); std::string key, val; std::stringstream sa(a); sa >> key; val=a.substr(key.size()); - keyval[tolower(key)] = tolower(val); + set_keyval(key,val); } } @@ -58,10 +60,18 @@ struct commandlineparser { } void set_keyval(const std::string key, const std::string value) { - keyval[tolower(key)]=tolower(value); + keyval[tolower(key)]= trim_blanks(tolower(value)); } public: + + /// special option: the input file has no hyphens in front + std::string check_for_input_file(std::string line) { + if (line[0]=='-') return line; + auto words=split(line,"="); + if (words.size()==1) line="input="+line; + return line; + } /// make lower case static std::string tolower(std::string s) { std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c){ return std::tolower(c); }); @@ -97,6 +107,8 @@ struct commandlineparser { std::replace(it,it+1,item.front(),blank.front()); return result; } + + /// remove all blanks static std::string remove_blanks(const std::string arg) { std::string str2 = arg; str2.erase(std::remove_if(str2.begin(), str2.end(), @@ -104,6 +116,14 @@ struct commandlineparser { return str2; } + /// remove blanks at the beginning and the end only + static std::string trim_blanks(const std::string arg) { + if (arg.size()==0) return arg; + std::size_t first=arg.find_first_not_of(' '); + std::size_t last=arg.find_last_not_of(' '); + return arg.substr(first,last-first+1); + } + static std::string base_name(std::string const & path, std::string const & delims = "/") { return path.substr(path.find_last_of(delims) + 1); diff --git a/src/apps/chem/test_MolecularOrbitals.cc b/src/apps/chem/test_MolecularOrbitals.cc index 1cc4659ad62..fc9ca26e614 100644 --- a/src/apps/chem/test_MolecularOrbitals.cc +++ b/src/apps/chem/test_MolecularOrbitals.cc @@ -48,7 +48,7 @@ int test_read_restartdata(World& world) { // read restart file (shorthand notation) { auto [amo, bmo]=MolecularOrbitals::read_restartdata(world, - "restartdata",calc.molecule, param.nmo_alpha(), param.nmo_beta()); + param.prefix()+".restartdata",calc.molecule, param.nmo_alpha(), param.nmo_beta()); } // read restart file (less shorthand notation, but with autocomplete enabled) { @@ -59,7 +59,7 @@ int test_read_restartdata(World& world) { // read restart file (long notation) std::pair, MolecularOrbitals > mos; mos=MolecularOrbitals::read_restartdata(world, - "restartdata",calc.molecule, param.nmo_alpha(), param.nmo_beta()); + param.prefix()+".restartdata",calc.molecule, param.nmo_alpha(), param.nmo_beta()); MolecularOrbitals amo,bmo; amo=mos.first; bmo=mos.second; @@ -88,7 +88,7 @@ int test_read_restartaodata(World& world) { // read MOs from file and save them as AO projection std::vector > aos=SCF::project_ao_basis_only(world, calc.aobasis, calc.molecule); auto mos=MolecularOrbitals::read_restartdata(world, - "restartdata",calc.molecule, param.nmo_alpha(), param.nmo_beta()); + param.prefix()+".restartdata",calc.molecule, param.nmo_alpha(), param.nmo_beta()); MolecularOrbitals amo=mos.first,bmo=mos.second; MolecularOrbitals::save_restartaodata(world,calc.molecule,amo,bmo,calc.aobasis); diff --git a/src/apps/chem/test_QCCalculationParametersBase.cc b/src/apps/chem/test_QCCalculationParametersBase.cc index fe2dda66689..619d498aeee 100644 --- a/src/apps/chem/test_QCCalculationParametersBase.cc +++ b/src/apps/chem/test_QCCalculationParametersBase.cc @@ -357,6 +357,9 @@ bool test_not_allowed(World& world) { found_exception=false; + } catch (std::invalid_argument& err) { + std::string errmsg=std::string(err.what()).substr(0,30); + test_same(errmsg,std::string("\ntrying to assign a value that")); } catch (std::runtime_error& err) { std::string errmsg=std::string(err.what()).substr(0,30); test_same(errmsg,std::string("found an error for key >> loca")); diff --git a/src/apps/moldft/moldft.cc b/src/apps/moldft/moldft.cc index 85ffa8a5ddd..2e897bf95b0 100644 --- a/src/apps/moldft/moldft.cc +++ b/src/apps/moldft/moldft.cc @@ -91,27 +91,13 @@ int main(int argc, char **argv) { SCF::print_parameters(); } else { + if (world.rank() == 0) print("input filename: ", parser.value("input")); print_meminfo(world.rank(), "startup"); FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); std::cout.precision(6); - - // Process 0 reads input information and broadcasts - const char *inpname = "input"; - for (int i = 1; i < argc; i++) { - if (argv[i][0] != '-') { - inpname = argv[i]; - break; - } - } - std::string sinpname(inpname); - parser.set_keyval("input", sinpname); - if (world.rank() == 0) print("input filename: ", inpname); - if (!file_exists(inpname)) { - throw "input file not found!"; - } SCF calc(world, parser); // Warm and fuzzy for the user From ef4fdc471dc1b0ff8ae810dc29f06de2a4597f76 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Thu, 11 Aug 2022 11:56:05 -0400 Subject: [PATCH 0203/1312] Update INSTALL.md --- INSTALL.md | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 5ee505067c5..6439385e341 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,5 +1,7 @@ ## Introduction +Linux and MacOS are supported with x86, Arm64, and IBM power cpus. GPUs are not yet utilized. + MADNESS uses CMake to configure the build. Assuming that necessary prerequisites (below) are installed on your system in default locations and the source has been downloaded into the directory `/path/to/madness/source`, you can make a directory (outside the source tree) to build in and configure the build as follows ``` mkdir build @@ -7,21 +9,24 @@ cd build cmake /path/to/madness/source make ``` -The default make target builds only the numerical library and underlying runtime. To build applications (e.g., `moldft`, `nemo`) specify this on the make command. The target `everything` does what you expect. You can run executables and use libraries from the build directory, but to install into the default location (`/usr`) just use `make install`. +The default make target builds only the numerical library and underlying runtime. To build applications (e.g., `moldft`, `nemo`) specify this on the make command. The target `everything` does what you expect. You can run executables and use libraries from the build directory, but to install into the default location (`/usr`) use `make install`. -If prerequiste libraries are not in default locations or you wish to override defaults, you may have to set CMAke cache variables as described below. For instance, to build a debug version, without MPI, and with installation in `/home/me/madinstall` +If required libraries are not in default locations or if you wish to override defaults, you may have to set CMake cache variables as described below. For instance, to build a debug version, without MPI, and with installation in `/home/me/madinstall` ``` cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_MPI=OFF -DCMAKE_INSTALL_PREFIX=/home/me/madinstall /path/to/madness/source -make make install ``` -Boolean values for cache variables are -considered true if the constant is 1, ON, YES, TRUE, Y, or a non-zero number; or -false if the constant is 0, OFF, NO, FALSE, N, or IGNORE. -The below summarizes some of the most useful CMake variables.\ +Boolean values for cache variables (specified to CMake using the `-DVARIABLE_NAME` notation in the example above) are +considered true if the constant is 1, ON, YES, TRUE, Y, or a non-zero number; or false if the constant is 0, OFF, NO, FALSE, N, or IGNORE. + +## Prerequisites + +Fast BLAS and linear algebra libraries are essential. These must be sequential (single thread) implementations since MADNESS uses tasks/threads for parallelism and invokes the BLAS within a single-threaded task. On X86, we recommend the free [Intel MKL library](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html#gs.8bsxug), which is auto detected on all platforms if the environment variable `MKLROOT` is set. On MacOS, the Apple **?X?X?** library (installed from where **??**) is also autodetected. AMD ACML has not been tested in a while but can be enabled with the CMake variables below. Other libraries need to have their link (and possibly also header) paths and flags provided in the CMake variables. On ARM, we recommend the ARM performance library available with their optimized LLVM compiler and enabled with the `--armpl`` compiler flag. The OpenBLAS libary for ARM had a major peformance problem when we last tested it in circa 2020 due to a mutex around a memory block shared by all threads (this issue was reported and could be fixed by now). + +MADNESS will autodetect the [Intel TBB library](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.html#gs.8byhgg), which is available for free from Intel or via standard Linux package managers (even on ARM). TBB provides a fast task pool. If this is not detected, MADNESS will employ its own task pool. [PaRSEC](https://icl.utk.edu/parsec/) can also be used (see variables below) but is not recommended unless you are using MADNESS with the [Template Task Graph](https://github.com/TESSEorg/ttg). -**RJH stopped editing here** +The below summarizes some of the most useful CMake variables. ## Compiler variables @@ -241,11 +246,10 @@ If ENABLE_PARSEC is set but PaRSEC is not found, it will be built from source. ## Toolchain files -**Use of these files is now deprecated --- it should work without.** However, they can be useful if all else fails. +**Use of these files is now deprecated --- configuration should usually work without this.** However, they can be useful if all else fails or on "bleeding-edge" supercomputers with non-standard software environments. -MADNESS provides toolchain files for select systems. It is recommended that you -use these files if provided as they contain the platform specific settings -neccessary to build on the given platform. The toolchain files are included wiht +MADNESS provides toolchain files for select systems. They contain the platform specific settings +neccessary to build on the given platform. The toolchain files are included with the MADNESS source in the cmake/toolchains directory. * CMAKE_TOOLCHAIN_FILE --- Specifies the path (including the file name) to the From 1574df652fe941e4ed1456957645ddd18d6c1046 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Thu, 11 Aug 2022 14:12:26 -0400 Subject: [PATCH 0204/1312] Update INSTALL.md --- INSTALL.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 6439385e341..57106afc806 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,6 +1,6 @@ ## Introduction -Linux and MacOS are supported with x86, Arm64, and IBM power cpus. GPUs are not yet utilized. +Linux and MacOS are supported with x86, Arm64, and IBM Power processors. GPUs are not yet utilized. MADNESS uses CMake to configure the build. Assuming that necessary prerequisites (below) are installed on your system in default locations and the source has been downloaded into the directory `/path/to/madness/source`, you can make a directory (outside the source tree) to build in and configure the build as follows ``` @@ -22,7 +22,7 @@ considered true if the constant is 1, ON, YES, TRUE, Y, or a non-zero number; or ## Prerequisites -Fast BLAS and linear algebra libraries are essential. These must be sequential (single thread) implementations since MADNESS uses tasks/threads for parallelism and invokes the BLAS within a single-threaded task. On X86, we recommend the free [Intel MKL library](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html#gs.8bsxug), which is auto detected on all platforms if the environment variable `MKLROOT` is set. On MacOS, the Apple **?X?X?** library (installed from where **??**) is also autodetected. AMD ACML has not been tested in a while but can be enabled with the CMake variables below. Other libraries need to have their link (and possibly also header) paths and flags provided in the CMake variables. On ARM, we recommend the ARM performance library available with their optimized LLVM compiler and enabled with the `--armpl`` compiler flag. The OpenBLAS libary for ARM had a major peformance problem when we last tested it in circa 2020 due to a mutex around a memory block shared by all threads (this issue was reported and could be fixed by now). +Fast BLAS and linear algebra libraries are essential. These must be sequential (single thread) implementations since MADNESS uses tasks/threads for parallelism and invokes the BLAS within a single-threaded task. On X86, we recommend the free [Intel MKL library](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html#gs.8bsxug), which is auto detected on all platforms if the environment variable `MKLROOT` is set. On MacOS, the Apple [Accelerate](https://developer.apple.com/documentation/accelerate) framework (installed as part of [Xcode](https://developer.apple.com/xcode/)) is also autodetected. AMD ACML has not been tested in a while but can be enabled with the CMake variables below. Other libraries need to have their link (and possibly also header) paths and flags provided in the CMake variables for the compiler and linker. On ARM, we recommend the ARM performance library available with their optimized LLVM compiler and enabled with the `-armpl`` compiler+linker flag. The OpenBLAS libary for ARM (not on x86) had a major peformance problem when we last tested it in circa 2020 due to a mutex around a memory block shared by all threads (this issue was reported and might be fixed by now). MADNESS will autodetect the [Intel TBB library](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.html#gs.8byhgg), which is available for free from Intel or via standard Linux package managers (even on ARM). TBB provides a fast task pool. If this is not detected, MADNESS will employ its own task pool. [PaRSEC](https://icl.utk.edu/parsec/) can also be used (see variables below) but is not recommended unless you are using MADNESS with the [Template Task Graph](https://github.com/TESSEorg/ttg). @@ -85,12 +85,13 @@ The following CMake cache variables turn features on and off. ## MADNESS Runtime and the Address Space Layout Randomization (ASLR) -ASLR is a standard technique for increasing platform security implemented by the OS kernel and/or +ASLR (Linux relevant documentation [here](https://linux-audit.com/linux-aslr-and-kernelrandomize_va_space-setting/)) +is a standard technique for increasing platform security implemented by the OS kernel and/or the dynamic linker. By randomizing both where the shared libraries are loaded as well as (when enabled) the absolute position of the executable in memory (such executables are known as position-independent executables). Until recently -MADNESS could not be used on platforms with ASLR if ran with more than 1 MPI rank; -if properly configured and built it can now be used on ASLR platforms. Use the following -variables to control the ASLR-related aspects of MADNESS runtime. +MADNESS could only be used with MPI on platforms with ASLR if built with static libraries (for MADNESS code; system and other libraries could still be shared). However, static libraries make it hard to integrate with Python and other frameworks that demand shared libraries. + +If properly configured and built, MADNESS can now be used on ASLR platforms using either static (the default and easiest) or shared libraries. Use the following variables to control the ASLR-related aspects of MADNESS runtime. * MADNESS_ASSUMES_ASLR_DISABLED --- MADNESS runtime will assume that the Address Space Layout Randomization (ASLR) is off. By default MADNESS_ASSUMES_ASLR_DISABLED is set to OFF (i.e. MADNESS will assume that ASLR is enabled); @@ -111,10 +112,9 @@ To make things more concrete, consider the following 2 scenarios: executables that can only be safely used with 1 MPI rank, thus BUILD_SHARED_LIBS will be defaulted to OFF (i.e. MADNESS libraries will be build as static libraries). CMAKE_POSITION_INDEPENDENT_CODE is by default set to ON, thus MADNESS libraries can be linked into position-independent executables safely. MADNESS libraries can also be - linked into a shared library, provided that *ALL* code using MADNESS is part of the *SAME* shared library. - E.g. to link MADNESS into a Python module compile MADNESS and all libraries using MADNESS as static libraries - (with CMAKE_POSITION_INDEPENDENT_CODE=ON) and link them all together into a single module - (same logic applies to shared libraries using MADNESS). + linked into a shared library and used with more than 1 MPI rank, provided that *ALL* code using MADNESS is part of the *SAME* shared library. + E.g. to link MADNESS into a Python module compile MADNESS and all libraries using MADNESS as shared libraries + (with CMAKE_POSITION_INDEPENDENT_CODE=ON) and link them all together into a single module. ## External libraries @@ -225,6 +225,8 @@ madness/src/apps/chem/CMakeLists.txt ## Elemental parallel linear algebra library: +**This has not been tested in some time.** + Elemental provides optional distributed-memory linear algebra for some MADNESS application codes. MADNESS source includes (modified) Elemental v0.84, which has been validated to work with the few MADNESS apps that can use Elemental. You can instruct MADNESS to download and compile From 455a2383c693e96f1f581d687c24f13f2895ea3f Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Thu, 11 Aug 2022 14:57:19 -0400 Subject: [PATCH 0205/1312] enable succcessful splitting of a communicator even if MPI is stubbed out --- src/madness/world/stubmpi.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/madness/world/stubmpi.h b/src/madness/world/stubmpi.h index 8dfec236a73..fe7c189cd51 100644 --- a/src/madness/world/stubmpi.h +++ b/src/madness/world/stubmpi.h @@ -185,7 +185,8 @@ inline int MPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype, inline int MPI_Comm_get_attr(MPI_Comm, int, void*, int*) { return MPI_ERR_COMM; } inline int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm) { - *newcomm = MPI_COMM_NULL; + //*newcomm = MPI_COMM_NULL; + *newcomm = MPI_COMM_WORLD; // So that can successfully split a 1 process communicator return MPI_SUCCESS; } @@ -199,7 +200,8 @@ inline int MPI_Abort(MPI_Comm, int code) { exit(code); return MPI_SUCCESS; } inline int MPI_Barrier(MPI_Comm) { return MPI_SUCCESS; } inline int MPI_Comm_create(MPI_Comm, MPI_Group, MPI_Comm *newcomm) { - *newcomm = MPI_COMM_NULL; + //*newcomm = MPI_COMM_NULL; + *newcomm = MPI_COMM_WORLD; // So that can successfully split a 1 process communicator return MPI_SUCCESS; } From 04b9b642c0d84a77c6bc644f3c1d376a0da80207 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Thu, 11 Aug 2022 15:26:20 -0400 Subject: [PATCH 0206/1312] fixed failing test --- src/apps/chem/test_MolecularOrbitals.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/chem/test_MolecularOrbitals.cc b/src/apps/chem/test_MolecularOrbitals.cc index fc9ca26e614..f72d470aa5e 100644 --- a/src/apps/chem/test_MolecularOrbitals.cc +++ b/src/apps/chem/test_MolecularOrbitals.cc @@ -53,7 +53,7 @@ int test_read_restartdata(World& world) { // read restart file (less shorthand notation, but with autocomplete enabled) { auto mos=MolecularOrbitals::read_restartdata(world, - "restartdata",calc.molecule, param.nmo_alpha(), param.nmo_beta()); + param.prefix()+".restartdata",calc.molecule, param.nmo_alpha(), param.nmo_beta()); MolecularOrbitals amo=mos.first,bmo=mos.second; } // read restart file (long notation) From 2254e20c50a2c2774ebacce5d5ae2ebecbcf0d29 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 12 Aug 2022 15:35:25 -0400 Subject: [PATCH 0207/1312] moved chem directory to madness directory --- src/apps/CMakeLists.txt | 1 - src/apps/cc2/cc2.cc | 2 +- src/apps/cis/cis.cpp | 4 +- src/apps/moldft/mcpfit.cc | 2 +- src/apps/moldft/moldft.cc | 6 +- src/apps/moldft/preal.cc | 8 +- src/apps/moldft/testperiodicdft.cc | 6 +- src/apps/moldft/wst_functional.h | 2 +- src/apps/molresponse/TDDFT.cc | 4 +- src/apps/molresponse/TDDFT.h | 10 +- src/apps/molresponse/calc_runner.cc | 12 +- src/apps/molresponse/ground_parameters.h | 12 +- src/apps/molresponse/iter_freq2.cc | 4 +- src/apps/molresponse/iterate_excited.cc | 2 +- src/apps/molresponse/iterate_freq.cc | 4 +- src/apps/molresponse/iterate_gamma.cc | 2 +- src/apps/molresponse/molresponse.cc | 2 +- src/apps/molresponse/property.cc | 2 +- src/apps/molresponse/property.h | 2 +- src/apps/molresponse/response_parameters.h | 6 +- .../molresponse/testing/madness_catch_main.cc | 2 +- src/apps/mp2/mp2.cc | 2 +- src/apps/nemo/nemo.cc | 8 +- src/apps/oep/oep.cc | 4 +- src/apps/pno/pno.cpp | 6 +- src/apps/zcis/zcis.cc | 2 +- src/apps/znemo/znemo.cc | 2 +- src/chem.h | 70 +- src/examples/ac_corr.cc | 4 +- src/examples/density_smoothing.cc | 2 +- src/examples/h2dft.cc | 4 +- src/examples/hedft.cc | 4 +- src/examples/hefxc.cc | 4 +- src/examples/helium_exact.cc | 10 +- src/examples/newsolver_lda.cc | 4 +- src/examples/smooth.h | 4 +- src/madness/CMakeLists.txt | 4 +- src/{apps => madness}/chem/3-21g | 0 src/{apps => madness}/chem/6-31g | 0 src/{apps => madness}/chem/6-31gss | 0 src/{apps => madness}/chem/AC.cc | 0 src/{apps => madness}/chem/AC.h | 2 +- src/{apps => madness}/chem/BSHApply.h | 2 +- src/{apps => madness}/chem/CC2.cc | 4 +- src/{apps => madness}/chem/CC2.h | 10 +- src/{apps => madness}/chem/CCPotentials.cc | 0 src/{apps => madness}/chem/CCPotentials.h | 12 +- src/{apps => madness}/chem/CCStructures.cc | 2 +- src/{apps => madness}/chem/CCStructures.h | 6 +- src/{apps => madness}/chem/CMakeLists.txt | 0 .../chem/CalculationParameters.h | 8 +- src/{apps => madness}/chem/ESInterface.h | 2 +- src/{apps => madness}/chem/GuessFactory.cc | 0 src/{apps => madness}/chem/GuessFactory.h | 0 .../chem/MolecularOrbitals.cc | 10 +- .../chem/MolecularOrbitals.h | 2 +- src/{apps => madness}/chem/NWChem.cc | 0 src/{apps => madness}/chem/NWChem.h | 4 +- src/{apps => madness}/chem/PNO.cpp | 2 +- src/{apps => madness}/chem/PNO.h | 10 +- .../chem/PNOF12Potentials.cpp | 2 +- src/{apps => madness}/chem/PNOF12Potentials.h | 6 +- .../chem/PNOGuessFunctions.cpp | 0 .../chem/PNOGuessFunctions.h | 8 +- src/{apps => madness}/chem/PNOParameters.cpp | 0 src/{apps => madness}/chem/PNOParameters.h | 2 +- src/{apps => madness}/chem/PNOStructures.cpp | 0 src/{apps => madness}/chem/PNOStructures.h | 6 +- src/{apps => madness}/chem/PNOTensors.h | 0 .../chem/QCCalculationParametersBase.cc | 2 +- .../chem/QCCalculationParametersBase.h | 2 +- .../chem/QCPropertyInterface.h | 2 +- src/{apps => madness}/chem/SCF.cc | 2 +- src/{apps => madness}/chem/SCF.h | 24 +- src/{apps => madness}/chem/SCFOperators.cc | 14 +- src/{apps => madness}/chem/SCFOperators.h | 0 src/{apps => madness}/chem/SCFProtocol.h | 2 +- src/{apps => madness}/chem/TDHF.cc | 8 +- src/{apps => madness}/chem/TDHF.h | 12 +- src/{apps => madness}/chem/atomutil.cc | 2 +- src/{apps => madness}/chem/atomutil.h | 0 src/{apps => madness}/chem/aug-cc-pvdz | 0 src/{apps => madness}/chem/basis.h | 0 .../chem/benchmark_exchange_operator.cc | 8 +- src/{apps => madness}/chem/ccpairfunction.cc | 6 +- src/{apps => madness}/chem/ccpairfunction.h | 4 +- src/{apps => madness}/chem/cis_example_input | 0 .../chem/commandlineparser.h | 0 src/{apps => madness}/chem/coredata/mcp | 5018 ++++++++-------- src/{apps => madness}/chem/coredata/mcp2 | 5136 ++++++++--------- .../chem/coredata/mcp2_guess | 0 src/{apps => madness}/chem/coredata/mcp_guess | 0 src/{apps => madness}/chem/corepotential.cc | 2 +- src/{apps => madness}/chem/corepotential.h | 2 +- .../chem/correlationfactor.cc | 2 +- .../chem/correlationfactor.h | 6 +- src/{apps => madness}/chem/def2-SVP | 0 .../chem/diamagneticpotentialfactor.cc | 4 +- .../chem/diamagneticpotentialfactor.h | 2 +- src/{apps => madness}/chem/distpm.cc | 2 +- src/{apps => madness}/chem/distpm.h | 6 +- .../chem/electronic_correlation_factor.h | 2 +- .../chem/exchangeoperator.cc | 6 +- src/{apps => madness}/chem/exchangeoperator.h | 2 +- src/{apps => madness}/chem/gaussian.cc | 0 src/{apps => madness}/chem/gaussian.h | 6 +- .../chem/gth_pseudopotential.cc | 2 +- .../chem/gth_pseudopotential.h | 6 +- src/{apps => madness}/chem/lda.cc | 0 src/{apps => madness}/chem/localizer.cc | 2 +- src/{apps => madness}/chem/localizer.h | 8 +- src/{apps => madness}/chem/masks_and_boxes.h | 0 .../chem/molecular_functors.h | 4 +- .../chem/molecular_optimizer.h | 4 +- src/{apps => madness}/chem/molecularbasis.cc | 600 +- src/{apps => madness}/chem/molecularbasis.h | 4 +- src/{apps => madness}/chem/molecule.cc | 6 +- src/{apps => madness}/chem/molecule.h | 8 +- src/{apps => madness}/chem/molopt.h | 0 src/{apps => madness}/chem/mp2.cc | 10 +- src/{apps => madness}/chem/mp2.h | 14 +- src/{apps => madness}/chem/nemo.cc | 18 +- src/{apps => madness}/chem/nemo.h | 20 +- src/{apps => madness}/chem/oep.cc | 4 +- src/{apps => madness}/chem/oep.h | 8 +- src/{apps => madness}/chem/pcm.cc | 6 +- src/{apps => madness}/chem/pcm.h | 2 +- src/{apps => madness}/chem/plotxc.cc | 0 .../chem/pointgroupoperator.h | 0 .../chem/pointgroupsymmetry.cc | 2 +- .../chem/pointgroupsymmetry.h | 2 +- src/{apps => madness}/chem/polynomial.cc | 0 src/{apps => madness}/chem/polynomial.h | 0 src/{apps => madness}/chem/potentialmanager.h | 4 +- src/{apps => madness}/chem/projector.h | 0 src/{apps => madness}/chem/sto-3g | 0 src/{apps => madness}/chem/sto-6g | 0 src/{apps => madness}/chem/structure_library | 0 src/{apps => madness}/chem/test_BSHApply.cc | 2 +- .../chem/test_MolecularOrbitals.cc | 6 +- .../chem/test_QCCalculationParametersBase.cc | 2 +- .../chem/test_SCFOperators.cc | 10 +- .../chem/test_ccpairfunction.cc | 10 +- .../chem/test_correlation_factor.h | 2 +- src/{apps => madness}/chem/test_dft.cc | 2 +- .../chem/test_exchangeoperator.cc | 8 +- src/{apps => madness}/chem/test_localizer.cc | 14 +- .../chem/test_masks_and_boxes.cc | 2 +- .../chem/test_pointgroupsymmetry.cc | 4 +- src/{apps => madness}/chem/test_qc.cc | 4 +- src/{apps => madness}/chem/testlda.cc | 0 src/{apps => madness}/chem/testxc.cc | 0 src/{apps => madness}/chem/vibanal.cc | 2 +- src/{apps => madness}/chem/vibanal.h | 2 +- src/{apps => madness}/chem/write_test_input.h | 2 +- src/{apps => madness}/chem/xcfunctional.h | 0 .../chem/xcfunctional_ldaonly.cc | 2 +- .../chem/xcfunctional_libxc.cc | 2 +- src/{apps => madness}/chem/zcis.cc | 4 +- src/{apps => madness}/chem/zcis.h | 4 +- src/{apps => madness}/chem/znemo.cc | 6 +- src/{apps => madness}/chem/znemo.h | 16 +- 162 files changed, 5727 insertions(+), 5726 deletions(-) rename src/{apps => madness}/chem/3-21g (100%) rename src/{apps => madness}/chem/6-31g (100%) rename src/{apps => madness}/chem/6-31gss (100%) rename src/{apps => madness}/chem/AC.cc (100%) rename src/{apps => madness}/chem/AC.h (99%) rename src/{apps => madness}/chem/BSHApply.h (99%) rename src/{apps => madness}/chem/CC2.cc (99%) rename src/{apps => madness}/chem/CC2.h (99%) rename src/{apps => madness}/chem/CCPotentials.cc (100%) rename src/{apps => madness}/chem/CCPotentials.h (99%) rename src/{apps => madness}/chem/CCStructures.cc (99%) rename src/{apps => madness}/chem/CCStructures.h (99%) rename src/{apps => madness}/chem/CMakeLists.txt (100%) rename src/{apps => madness}/chem/CalculationParameters.h (98%) rename src/{apps => madness}/chem/ESInterface.h (99%) rename src/{apps => madness}/chem/GuessFactory.cc (100%) rename src/{apps => madness}/chem/GuessFactory.h (100%) rename src/{apps => madness}/chem/MolecularOrbitals.cc (96%) rename src/{apps => madness}/chem/MolecularOrbitals.h (99%) rename src/{apps => madness}/chem/NWChem.cc (100%) rename src/{apps => madness}/chem/NWChem.h (97%) rename src/{apps => madness}/chem/PNO.cpp (99%) rename src/{apps => madness}/chem/PNO.h (98%) rename src/{apps => madness}/chem/PNOF12Potentials.cpp (99%) rename src/{apps => madness}/chem/PNOF12Potentials.h (99%) rename src/{apps => madness}/chem/PNOGuessFunctions.cpp (100%) rename src/{apps => madness}/chem/PNOGuessFunctions.h (98%) rename src/{apps => madness}/chem/PNOParameters.cpp (100%) rename src/{apps => madness}/chem/PNOParameters.h (99%) rename src/{apps => madness}/chem/PNOStructures.cpp (100%) rename src/{apps => madness}/chem/PNOStructures.h (98%) rename src/{apps => madness}/chem/PNOTensors.h (100%) rename src/{apps => madness}/chem/QCCalculationParametersBase.cc (99%) rename src/{apps => madness}/chem/QCCalculationParametersBase.h (99%) rename src/{apps => madness}/chem/QCPropertyInterface.h (98%) rename src/{apps => madness}/chem/SCF.cc (99%) rename src/{apps => madness}/chem/SCF.h (98%) rename src/{apps => madness}/chem/SCFOperators.cc (99%) rename src/{apps => madness}/chem/SCFOperators.h (100%) rename src/{apps => madness}/chem/SCFProtocol.h (99%) rename src/{apps => madness}/chem/TDHF.cc (99%) rename src/{apps => madness}/chem/TDHF.h (99%) rename src/{apps => madness}/chem/atomutil.cc (99%) rename src/{apps => madness}/chem/atomutil.h (100%) rename src/{apps => madness}/chem/aug-cc-pvdz (100%) rename src/{apps => madness}/chem/basis.h (100%) rename src/{apps => madness}/chem/benchmark_exchange_operator.cc (97%) rename src/{apps => madness}/chem/ccpairfunction.cc (99%) rename src/{apps => madness}/chem/ccpairfunction.h (99%) rename src/{apps => madness}/chem/cis_example_input (100%) rename src/{apps => madness}/chem/commandlineparser.h (100%) rename src/{apps => madness}/chem/coredata/mcp (97%) rename src/{apps => madness}/chem/coredata/mcp2 (97%) rename src/{apps => madness}/chem/coredata/mcp2_guess (100%) rename src/{apps => madness}/chem/coredata/mcp_guess (100%) rename src/{apps => madness}/chem/corepotential.cc (99%) rename src/{apps => madness}/chem/corepotential.h (99%) rename src/{apps => madness}/chem/correlationfactor.cc (98%) rename src/{apps => madness}/chem/correlationfactor.h (99%) rename src/{apps => madness}/chem/def2-SVP (100%) rename src/{apps => madness}/chem/diamagneticpotentialfactor.cc (99%) rename src/{apps => madness}/chem/diamagneticpotentialfactor.h (99%) rename src/{apps => madness}/chem/distpm.cc (99%) rename src/{apps => madness}/chem/distpm.h (89%) rename src/{apps => madness}/chem/electronic_correlation_factor.h (99%) rename src/{apps => madness}/chem/exchangeoperator.cc (99%) rename src/{apps => madness}/chem/exchangeoperator.h (99%) rename src/{apps => madness}/chem/gaussian.cc (100%) rename src/{apps => madness}/chem/gaussian.h (99%) rename src/{apps => madness}/chem/gth_pseudopotential.cc (97%) rename src/{apps => madness}/chem/gth_pseudopotential.h (99%) rename src/{apps => madness}/chem/lda.cc (100%) rename src/{apps => madness}/chem/localizer.cc (99%) rename src/{apps => madness}/chem/localizer.h (97%) rename src/{apps => madness}/chem/masks_and_boxes.h (100%) rename src/{apps => madness}/chem/molecular_functors.h (98%) rename src/{apps => madness}/chem/molecular_optimizer.h (99%) rename src/{apps => madness}/chem/molecularbasis.cc (97%) rename src/{apps => madness}/chem/molecularbasis.h (99%) rename src/{apps => madness}/chem/molecule.cc (99%) rename src/{apps => madness}/chem/molecule.h (99%) rename src/{apps => madness}/chem/molopt.h (100%) rename src/{apps => madness}/chem/mp2.cc (99%) rename src/{apps => madness}/chem/mp2.h (98%) rename src/{apps => madness}/chem/nemo.cc (99%) rename src/{apps => madness}/chem/nemo.h (98%) rename src/{apps => madness}/chem/oep.cc (99%) rename src/{apps => madness}/chem/oep.h (99%) rename src/{apps => madness}/chem/pcm.cc (99%) rename src/{apps => madness}/chem/pcm.h (99%) rename src/{apps => madness}/chem/plotxc.cc (100%) rename src/{apps => madness}/chem/pointgroupoperator.h (100%) rename src/{apps => madness}/chem/pointgroupsymmetry.cc (99%) rename src/{apps => madness}/chem/pointgroupsymmetry.h (99%) rename src/{apps => madness}/chem/polynomial.cc (100%) rename src/{apps => madness}/chem/polynomial.h (100%) rename src/{apps => madness}/chem/potentialmanager.h (99%) rename src/{apps => madness}/chem/projector.h (100%) rename src/{apps => madness}/chem/sto-3g (100%) rename src/{apps => madness}/chem/sto-6g (100%) rename src/{apps => madness}/chem/structure_library (100%) rename src/{apps => madness}/chem/test_BSHApply.cc (99%) rename src/{apps => madness}/chem/test_MolecularOrbitals.cc (97%) rename src/{apps => madness}/chem/test_QCCalculationParametersBase.cc (99%) rename src/{apps => madness}/chem/test_SCFOperators.cc (99%) rename src/{apps => madness}/chem/test_ccpairfunction.cc (99%) rename src/{apps => madness}/chem/test_correlation_factor.h (94%) rename src/{apps => madness}/chem/test_dft.cc (99%) rename src/{apps => madness}/chem/test_exchangeoperator.cc (97%) rename src/{apps => madness}/chem/test_localizer.cc (97%) rename src/{apps => madness}/chem/test_masks_and_boxes.cc (98%) rename src/{apps => madness}/chem/test_pointgroupsymmetry.cc (99%) rename src/{apps => madness}/chem/test_qc.cc (99%) rename src/{apps => madness}/chem/testlda.cc (100%) rename src/{apps => madness}/chem/testxc.cc (100%) rename src/{apps => madness}/chem/vibanal.cc (99%) rename src/{apps => madness}/chem/vibanal.h (95%) rename src/{apps => madness}/chem/write_test_input.h (97%) rename src/{apps => madness}/chem/xcfunctional.h (100%) rename src/{apps => madness}/chem/xcfunctional_ldaonly.cc (99%) rename src/{apps => madness}/chem/xcfunctional_libxc.cc (99%) rename src/{apps => madness}/chem/zcis.cc (99%) rename src/{apps => madness}/chem/zcis.h (99%) rename src/{apps => madness}/chem/znemo.cc (99%) rename src/{apps => madness}/chem/znemo.h (98%) diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt index bf97f2da523..fa2c9b4d392 100644 --- a/src/apps/CMakeLists.txt +++ b/src/apps/CMakeLists.txt @@ -2,7 +2,6 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -add_subdirectory(chem) add_subdirectory(tdse) add_subdirectory(moldft) add_subdirectory(molresponse) diff --git a/src/apps/cc2/cc2.cc b/src/apps/cc2/cc2.cc index 7dce4e991e6..021ed951b34 100644 --- a/src/apps/cc2/cc2.cc +++ b/src/apps/cc2/cc2.cc @@ -40,7 +40,7 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES -#include "apps/chem/CC2.h" +#include "madness/chem/CC2.h" #include "madness/misc/gitinfo.h" using namespace madness; diff --git a/src/apps/cis/cis.cpp b/src/apps/cis/cis.cpp index 32df6ec899b..d7d979e3685 100644 --- a/src/apps/cis/cis.cpp +++ b/src/apps/cis/cis.cpp @@ -6,8 +6,8 @@ */ #include -#include -#include +#include +#include #include diff --git a/src/apps/moldft/mcpfit.cc b/src/apps/moldft/mcpfit.cc index fec9348524a..81ca5faae47 100644 --- a/src/apps/moldft/mcpfit.cc +++ b/src/apps/moldft/mcpfit.cc @@ -37,7 +37,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/apps/moldft/moldft.cc b/src/apps/moldft/moldft.cc index 2e897bf95b0..7c951da3a99 100644 --- a/src/apps/moldft/moldft.cc +++ b/src/apps/moldft/moldft.cc @@ -36,9 +36,9 @@ /// \brief Molecular HF and DFT code /// \defgroup moldft The molecular density functional and Hartree-Fock code -#include -#include -#include +#include +#include +#include #include #if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) diff --git a/src/apps/moldft/preal.cc b/src/apps/moldft/preal.cc index 98c927e7afe..4773676a7d5 100644 --- a/src/apps/moldft/preal.cc +++ b/src/apps/moldft/preal.cc @@ -6,11 +6,11 @@ using namespace madness; -#include -#include -#include +#include +#include +#include -#include +#include #include "wst_functional.h" static const double twopi = 2.0*constants::pi; diff --git a/src/apps/moldft/testperiodicdft.cc b/src/apps/moldft/testperiodicdft.cc index 34a179bba30..4e29a7e8e00 100644 --- a/src/apps/moldft/testperiodicdft.cc +++ b/src/apps/moldft/testperiodicdft.cc @@ -11,9 +11,9 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include -#include -#include -#include +#include +#include +#include using namespace madness; diff --git a/src/apps/moldft/wst_functional.h b/src/apps/moldft/wst_functional.h index 2e3bbd530a7..9e0d3b45d6a 100644 --- a/src/apps/moldft/wst_functional.h +++ b/src/apps/moldft/wst_functional.h @@ -1,7 +1,7 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include -#include +#include class WSTFunctional { diff --git a/src/apps/molresponse/TDDFT.cc b/src/apps/molresponse/TDDFT.cc index 80a7706a2fb..b7c73d7e713 100644 --- a/src/apps/molresponse/TDDFT.cc +++ b/src/apps/molresponse/TDDFT.cc @@ -11,8 +11,8 @@ #include "TDDFT.h" -#include -#include // For easy calculation of (1 - \hat{\rho}^0) +#include +#include // For easy calculation of (1 - \hat{\rho}^0) #include #include #include diff --git a/src/apps/molresponse/TDDFT.h b/src/apps/molresponse/TDDFT.h index 2d7fba6b31a..94338e054cd 100644 --- a/src/apps/molresponse/TDDFT.h +++ b/src/apps/molresponse/TDDFT.h @@ -3,11 +3,11 @@ #ifndef SRC_APPS_MOLRESPONSE_TDDFT_H_ #define SRC_APPS_MOLRESPONSE_TDDFT_H_ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include // The kain solver diff --git a/src/apps/molresponse/calc_runner.cc b/src/apps/molresponse/calc_runner.cc index b111ec00330..15689505f5f 100644 --- a/src/apps/molresponse/calc_runner.cc +++ b/src/apps/molresponse/calc_runner.cc @@ -9,13 +9,13 @@ #include #include "Plot_VTK.h" -#include +#include #include "TDDFT.h" -#include "chem/NWChem.h" // For nwchem interface -#include "chem/SCFOperators.h" -#include "chem/molecule.h" -#include "chem/potentialmanager.h" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "madness/chem/NWChem.h" // For nwchem interface +#include "madness/chem/SCFOperators.h" +#include "madness/chem/molecule.h" +#include "madness/chem/potentialmanager.h" +#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "molresponse/basic_operators.h" #include "molresponse/density.h" diff --git a/src/apps/molresponse/ground_parameters.h b/src/apps/molresponse/ground_parameters.h index 096d0c4ac7d..a58302024bd 100644 --- a/src/apps/molresponse/ground_parameters.h +++ b/src/apps/molresponse/ground_parameters.h @@ -13,12 +13,12 @@ #include "../chem/molecule.h" #include "Plot_VTK.h" #include "basic_operators.h" -#include "chem/pointgroupsymmetry.h" -#include "chem/potentialmanager.h" -#include "chem/projector.h"// For easy calculation of (1 - \hat{\rho}^0) -#include "madness/mra/funcdefaults.h" -#include "madness/mra/functypedefs.h" -#include "madness/tensor/tensor.h" +#include +#include +#include // For easy calculation of (1 - \hat{\rho}^0) +#include +#include +#include using namespace madness; diff --git a/src/apps/molresponse/iter_freq2.cc b/src/apps/molresponse/iter_freq2.cc index 28bbca2b984..1bfc90818d3 100644 --- a/src/apps/molresponse/iter_freq2.cc +++ b/src/apps/molresponse/iter_freq2.cc @@ -14,8 +14,8 @@ #include "Plot_VTK.h" #include "TDDFT.h" #include "madness/tensor/tensor_json.hpp" -#include "chem/potentialmanager.h" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "madness/chem/potentialmanager.h" +#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "molresponse/basic_operators.h" #include "molresponse/density.h" diff --git a/src/apps/molresponse/iterate_excited.cc b/src/apps/molresponse/iterate_excited.cc index 63cd9d5bdc3..157affb59d6 100644 --- a/src/apps/molresponse/iterate_excited.cc +++ b/src/apps/molresponse/iterate_excited.cc @@ -10,7 +10,7 @@ #include "Plot_VTK.h" #include "TDDFT.h" #include "madness/tensor/tensor_json.hpp" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "molresponse/response_functions.h" #include "molresponse/timer.h" diff --git a/src/apps/molresponse/iterate_freq.cc b/src/apps/molresponse/iterate_freq.cc index f375a31a063..b75e7fd725e 100644 --- a/src/apps/molresponse/iterate_freq.cc +++ b/src/apps/molresponse/iterate_freq.cc @@ -14,8 +14,8 @@ #include "../chem/molecule.h" #include "Plot_VTK.h" #include "TDDFT.h" -#include "chem/potentialmanager.h" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "madness/chem/potentialmanager.h" +#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "molresponse/basic_operators.h" #include "molresponse/density.h" diff --git a/src/apps/molresponse/iterate_gamma.cc b/src/apps/molresponse/iterate_gamma.cc index 9a021d2e572..6459bf53f8a 100644 --- a/src/apps/molresponse/iterate_gamma.cc +++ b/src/apps/molresponse/iterate_gamma.cc @@ -7,7 +7,7 @@ #include "../chem/molecule.h" #include "TDDFT.h" #include "basic_operators.h" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "madness/mra/vmra.h" #include "molresponse/global_functions.h" diff --git a/src/apps/molresponse/molresponse.cc b/src/apps/molresponse/molresponse.cc index fb6fc4955ce..f3f5a668dcc 100644 --- a/src/apps/molresponse/molresponse.cc +++ b/src/apps/molresponse/molresponse.cc @@ -35,7 +35,7 @@ /// \file molresponse.cc /// \brief Molecular Response DFT code /// \defgroup molresponse The molecular density funcitonal response code -#include +#include #include #include "ResponseExceptions.hpp" diff --git a/src/apps/molresponse/property.cc b/src/apps/molresponse/property.cc index a22e0942760..3722ef0029e 100644 --- a/src/apps/molresponse/property.cc +++ b/src/apps/molresponse/property.cc @@ -1,5 +1,5 @@ #include "molresponse/property.h" -#include +#include #include #include diff --git a/src/apps/molresponse/property.h b/src/apps/molresponse/property.h index 119bef6dc40..f43ee71e8e1 100644 --- a/src/apps/molresponse/property.h +++ b/src/apps/molresponse/property.h @@ -11,7 +11,7 @@ #include "../../madness/mra/funcplot.h" #include "../chem/SCFOperators.h" #include "../chem/molecule.h" -#include +#include #include #include diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index efd63e81d9a..56cfcc2292a 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -6,9 +6,9 @@ #ifndef SRC_APPS_MOLRESPONSE_RESPONSE_PARAMETERS_H_ #define SRC_APPS_MOLRESPONSE_RESPONSE_PARAMETERS_H_ -#include -#include -#include +#include +#include +#include #include #include #include diff --git a/src/apps/molresponse/testing/madness_catch_main.cc b/src/apps/molresponse/testing/madness_catch_main.cc index 68e2b2ad5f8..ebc3b47d09d 100644 --- a/src/apps/molresponse/testing/madness_catch_main.cc +++ b/src/apps/molresponse/testing/madness_catch_main.cc @@ -1,6 +1,6 @@ #define CATCH_CONFIG_RUNNER #include "madness/external/catch/catch.hpp" -#include "apps/chem/SCF.h" +#include "madness/chem/SCF.h" #include "madness/world/worldmem.h" diff --git a/src/apps/mp2/mp2.cc b/src/apps/mp2/mp2.cc index 9fbd470fd4c..56bacd37e87 100644 --- a/src/apps/mp2/mp2.cc +++ b/src/apps/mp2/mp2.cc @@ -40,7 +40,7 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include "madness/world/info.h" -#include "apps/chem/mp2.h" +#include "madness/chem/mp2.h" #include "madness/misc/gitinfo.h" using namespace madness; diff --git a/src/apps/nemo/nemo.cc b/src/apps/nemo/nemo.cc index 574b2c68eb2..341a220fb38 100644 --- a/src/apps/nemo/nemo.cc +++ b/src/apps/nemo/nemo.cc @@ -44,10 +44,10 @@ */ -#include -#include -#include -#include +#include +#include +#include +#include #include using namespace madness; diff --git a/src/apps/oep/oep.cc b/src/apps/oep/oep.cc index c895fb62a2e..f925733e186 100644 --- a/src/apps/oep/oep.cc +++ b/src/apps/oep/oep.cc @@ -37,8 +37,8 @@ */ -#include "apps/chem/oep.h" -#include "madness/misc/gitinfo.h" +#include +#include using namespace madness; diff --git a/src/apps/pno/pno.cpp b/src/apps/pno/pno.cpp index 3f04ee03f26..873f3cd5b0b 100644 --- a/src/apps/pno/pno.cpp +++ b/src/apps/pno/pno.cpp @@ -1,8 +1,8 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include -#include -#include -#include +#include +#include +#include using namespace madness; diff --git a/src/apps/zcis/zcis.cc b/src/apps/zcis/zcis.cc index b24b49dfbf9..1f158859474 100644 --- a/src/apps/zcis/zcis.cc +++ b/src/apps/zcis/zcis.cc @@ -44,7 +44,7 @@ */ -#include "apps/chem/zcis.h" +#include using namespace madness; diff --git a/src/apps/znemo/znemo.cc b/src/apps/znemo/znemo.cc index 11977eb8fb4..ca40239d58b 100644 --- a/src/apps/znemo/znemo.cc +++ b/src/apps/znemo/znemo.cc @@ -46,7 +46,7 @@ #if !defined USE_GENTENSOR -#include "apps/chem/znemo.h" +#include "madness/chem/znemo.h" using namespace madness; diff --git a/src/chem.h b/src/chem.h index 456059739eb..6be6bea3ecc 100644 --- a/src/chem.h +++ b/src/chem.h @@ -2,41 +2,41 @@ #ifndef MADNESS_CHEM_H #define MADNESS_CHEM_H -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #endif //MADNESS_CHEM_H diff --git a/src/examples/ac_corr.cc b/src/examples/ac_corr.cc index ddfe1e7de6f..f88dd9cb68c 100644 --- a/src/examples/ac_corr.cc +++ b/src/examples/ac_corr.cc @@ -11,9 +11,9 @@ #include #include #include -//#include +//#include #include -#include +#include diff --git a/src/examples/density_smoothing.cc b/src/examples/density_smoothing.cc index 7e7ae41610e..8b424e51036 100644 --- a/src/examples/density_smoothing.cc +++ b/src/examples/density_smoothing.cc @@ -44,7 +44,7 @@ */ #include "smooth.h" -#include +#include using namespace madness; diff --git a/src/examples/h2dft.cc b/src/examples/h2dft.cc index dd535d93c34..8c201661644 100644 --- a/src/examples/h2dft.cc +++ b/src/examples/h2dft.cc @@ -21,8 +21,8 @@ #include -#include -#include +#include +#include using namespace madness; diff --git a/src/examples/hedft.cc b/src/examples/hedft.cc index fdbf2e9eb6c..bd207d2780a 100644 --- a/src/examples/hedft.cc +++ b/src/examples/hedft.cc @@ -21,8 +21,8 @@ #include -#include -#include +#include +#include #include diff --git a/src/examples/hefxc.cc b/src/examples/hefxc.cc index df905ddd613..1cbe741e39d 100644 --- a/src/examples/hefxc.cc +++ b/src/examples/hefxc.cc @@ -20,8 +20,8 @@ #include -#include -#include +#include +#include #include diff --git a/src/examples/helium_exact.cc b/src/examples/helium_exact.cc index 07ae650f8a0..44f23fdfdca 100644 --- a/src/examples/helium_exact.cc +++ b/src/examples/helium_exact.cc @@ -48,11 +48,11 @@ #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include // switch the electronic interaction on or off diff --git a/src/examples/newsolver_lda.cc b/src/examples/newsolver_lda.cc index b4c727b1d92..1f6fb6d3a05 100644 --- a/src/examples/newsolver_lda.cc +++ b/src/examples/newsolver_lda.cc @@ -16,11 +16,11 @@ #include -#include +#include #include -#include +#include using namespace madness; diff --git a/src/examples/smooth.h b/src/examples/smooth.h index 2f4ef0e7fe4..74342bce25d 100644 --- a/src/examples/smooth.h +++ b/src/examples/smooth.h @@ -10,10 +10,10 @@ #include #include -#include +#include #include #include -#include +#include #include static double RHOMIN = 1.e-20; diff --git a/src/madness/CMakeLists.txt b/src/madness/CMakeLists.txt index 73fb5ca6875..8fbd38511b7 100644 --- a/src/madness/CMakeLists.txt +++ b/src/madness/CMakeLists.txt @@ -38,12 +38,14 @@ if (NOT MADNESS_BUILD_MADWORLD_ONLY) add_subdirectory(misc) add_subdirectory(tensor) add_subdirectory(mra) + add_subdirectory(chem) # Create the super library that contains all MADNESS libraries add_library(madness $ $ $ ${MADTENSOR_MTXMQ_OBJ} $ $ - $ $) + $ $ + $) endif(NOT MADNESS_BUILD_MADWORLD_ONLY) # Set the dependencies for the super-library diff --git a/src/apps/chem/3-21g b/src/madness/chem/3-21g similarity index 100% rename from src/apps/chem/3-21g rename to src/madness/chem/3-21g diff --git a/src/apps/chem/6-31g b/src/madness/chem/6-31g similarity index 100% rename from src/apps/chem/6-31g rename to src/madness/chem/6-31g diff --git a/src/apps/chem/6-31gss b/src/madness/chem/6-31gss similarity index 100% rename from src/apps/chem/6-31gss rename to src/madness/chem/6-31gss diff --git a/src/apps/chem/AC.cc b/src/madness/chem/AC.cc similarity index 100% rename from src/apps/chem/AC.cc rename to src/madness/chem/AC.cc diff --git a/src/apps/chem/AC.h b/src/madness/chem/AC.h similarity index 99% rename from src/apps/chem/AC.h rename to src/madness/chem/AC.h index 5048cff794e..faa40f314e8 100644 --- a/src/apps/chem/AC.h +++ b/src/madness/chem/AC.h @@ -14,7 +14,7 @@ #include #include #include -#include +#include namespace madness { diff --git a/src/apps/chem/BSHApply.h b/src/madness/chem/BSHApply.h similarity index 99% rename from src/apps/chem/BSHApply.h rename to src/madness/chem/BSHApply.h index 0c36f38aa7a..36e2ee27c69 100644 --- a/src/apps/chem/BSHApply.h +++ b/src/madness/chem/BSHApply.h @@ -8,7 +8,7 @@ #ifndef SRC_APPS_CHEM_BSHAPPLY_H_ #define SRC_APPS_CHEM_BSHAPPLY_H_ -#include +#include #include namespace madness { diff --git a/src/apps/chem/CC2.cc b/src/madness/chem/CC2.cc similarity index 99% rename from src/apps/chem/CC2.cc rename to src/madness/chem/CC2.cc index ae780184447..14bd7d8fd82 100644 --- a/src/apps/chem/CC2.cc +++ b/src/madness/chem/CC2.cc @@ -6,8 +6,8 @@ */ -#include -#include +#include +#include #include "MolecularOrbitals.h" #include "localizer.h" diff --git a/src/apps/chem/CC2.h b/src/madness/chem/CC2.h similarity index 99% rename from src/apps/chem/CC2.h rename to src/madness/chem/CC2.h index d8057bf7d5e..a979262cc74 100644 --- a/src/apps/chem/CC2.h +++ b/src/madness/chem/CC2.h @@ -8,16 +8,16 @@ #ifndef CC2_H_ #define CC2_H_ -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include #include #include -#include +#include #include namespace madness { diff --git a/src/apps/chem/CCPotentials.cc b/src/madness/chem/CCPotentials.cc similarity index 100% rename from src/apps/chem/CCPotentials.cc rename to src/madness/chem/CCPotentials.cc diff --git a/src/apps/chem/CCPotentials.h b/src/madness/chem/CCPotentials.h similarity index 99% rename from src/apps/chem/CCPotentials.h rename to src/madness/chem/CCPotentials.h index ee1929cd83b..a70efcc0f43 100644 --- a/src/apps/chem/CCPotentials.h +++ b/src/madness/chem/CCPotentials.h @@ -8,12 +8,12 @@ #ifndef SRC_APPS_CHEM_CCPOTENTIALS_H_ #define SRC_APPS_CHEM_CCPOTENTIALS_H_ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include namespace madness { diff --git a/src/apps/chem/CCStructures.cc b/src/madness/chem/CCStructures.cc similarity index 99% rename from src/apps/chem/CCStructures.cc rename to src/madness/chem/CCStructures.cc index bceb6f3d37e..09002270164 100644 --- a/src/apps/chem/CCStructures.cc +++ b/src/madness/chem/CCStructures.cc @@ -6,7 +6,7 @@ */ #include"CCStructures.h" -#include +#include namespace madness { diff --git a/src/apps/chem/CCStructures.h b/src/madness/chem/CCStructures.h similarity index 99% rename from src/apps/chem/CCStructures.h rename to src/madness/chem/CCStructures.h index 1e33ae8a114..2f7e0a2f2d4 100644 --- a/src/apps/chem/CCStructures.h +++ b/src/madness/chem/CCStructures.h @@ -11,9 +11,9 @@ #define CCSTRUCTURES_H_ #include -#include -#include -#include +#include +#include +#include #include #include #include diff --git a/src/apps/chem/CMakeLists.txt b/src/madness/chem/CMakeLists.txt similarity index 100% rename from src/apps/chem/CMakeLists.txt rename to src/madness/chem/CMakeLists.txt diff --git a/src/apps/chem/CalculationParameters.h b/src/madness/chem/CalculationParameters.h similarity index 98% rename from src/apps/chem/CalculationParameters.h rename to src/madness/chem/CalculationParameters.h index 3ad8218abe6..6467f87caee 100644 --- a/src/apps/chem/CalculationParameters.h +++ b/src/madness/chem/CalculationParameters.h @@ -40,10 +40,10 @@ #ifndef MADNESS_CHEM_CALCULATIONPARAMETERS_H__INCLUDED #define MADNESS_CHEM_CALCULATIONPARAMETERS_H__INCLUDED -#include -#include -#include -#include +#include +#include +#include +#include namespace madness { diff --git a/src/apps/chem/ESInterface.h b/src/madness/chem/ESInterface.h similarity index 99% rename from src/apps/chem/ESInterface.h rename to src/madness/chem/ESInterface.h index 5f294192afd..c2692da160b 100644 --- a/src/apps/chem/ESInterface.h +++ b/src/madness/chem/ESInterface.h @@ -20,7 +20,7 @@ #include #include #include -#include +#include namespace slymer { diff --git a/src/apps/chem/GuessFactory.cc b/src/madness/chem/GuessFactory.cc similarity index 100% rename from src/apps/chem/GuessFactory.cc rename to src/madness/chem/GuessFactory.cc diff --git a/src/apps/chem/GuessFactory.h b/src/madness/chem/GuessFactory.h similarity index 100% rename from src/apps/chem/GuessFactory.h rename to src/madness/chem/GuessFactory.h diff --git a/src/apps/chem/MolecularOrbitals.cc b/src/madness/chem/MolecularOrbitals.cc similarity index 96% rename from src/apps/chem/MolecularOrbitals.cc rename to src/madness/chem/MolecularOrbitals.cc index bc4af14c714..04c1148039a 100644 --- a/src/apps/chem/MolecularOrbitals.cc +++ b/src/madness/chem/MolecularOrbitals.cc @@ -5,13 +5,13 @@ * Author: fbischoff */ -#include -#include +#include +#include #include #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/apps/chem/MolecularOrbitals.h b/src/madness/chem/MolecularOrbitals.h similarity index 99% rename from src/apps/chem/MolecularOrbitals.h rename to src/madness/chem/MolecularOrbitals.h index e3ff89af0ab..d39d845222c 100644 --- a/src/apps/chem/MolecularOrbitals.h +++ b/src/madness/chem/MolecularOrbitals.h @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include namespace madness { diff --git a/src/apps/chem/NWChem.cc b/src/madness/chem/NWChem.cc similarity index 100% rename from src/apps/chem/NWChem.cc rename to src/madness/chem/NWChem.cc diff --git a/src/apps/chem/NWChem.h b/src/madness/chem/NWChem.h similarity index 97% rename from src/apps/chem/NWChem.h rename to src/madness/chem/NWChem.h index ccb7aad8618..6c4a98896e6 100644 --- a/src/apps/chem/NWChem.h +++ b/src/madness/chem/NWChem.h @@ -13,8 +13,8 @@ #include #include -#include -#include +#include +#include namespace slymer { diff --git a/src/apps/chem/PNO.cpp b/src/madness/chem/PNO.cpp similarity index 99% rename from src/apps/chem/PNO.cpp rename to src/madness/chem/PNO.cpp index 62ba1e6e71a..0b3d964d7bd 100644 --- a/src/apps/chem/PNO.cpp +++ b/src/madness/chem/PNO.cpp @@ -5,7 +5,7 @@ * Author: kottmanj */ -#include +#include namespace madness { diff --git a/src/apps/chem/PNO.h b/src/madness/chem/PNO.h similarity index 98% rename from src/apps/chem/PNO.h rename to src/madness/chem/PNO.h index aa3a30eea94..0e548fd6d44 100644 --- a/src/apps/chem/PNO.h +++ b/src/madness/chem/PNO.h @@ -12,13 +12,13 @@ #define PAIRLOOP(it) for(ElectronPairIterator it=pit();it;++it) #define TIMER(timer) MyTimer timer=MyTimer(world).start(); -#include +#include #include -#include -#include -#include -#include +#include +#include +#include +#include namespace madness { // needed to plot cubefiles with madness diff --git a/src/apps/chem/PNOF12Potentials.cpp b/src/madness/chem/PNOF12Potentials.cpp similarity index 99% rename from src/apps/chem/PNOF12Potentials.cpp rename to src/madness/chem/PNOF12Potentials.cpp index 6b75920364d..ce3b5659386 100644 --- a/src/apps/chem/PNOF12Potentials.cpp +++ b/src/madness/chem/PNOF12Potentials.cpp @@ -5,7 +5,7 @@ * Author: kottmanj */ -#include +#include namespace madness { diff --git a/src/apps/chem/PNOF12Potentials.h b/src/madness/chem/PNOF12Potentials.h similarity index 99% rename from src/apps/chem/PNOF12Potentials.h rename to src/madness/chem/PNOF12Potentials.h index 41631ecb0b8..d4ca54ca856 100644 --- a/src/apps/chem/PNOF12Potentials.h +++ b/src/madness/chem/PNOF12Potentials.h @@ -8,9 +8,9 @@ #ifndef F12POTENTIALS_H_ #define F12POTENTIALS_H_ -#include -#include -#include +#include +#include +#include namespace madness { diff --git a/src/apps/chem/PNOGuessFunctions.cpp b/src/madness/chem/PNOGuessFunctions.cpp similarity index 100% rename from src/apps/chem/PNOGuessFunctions.cpp rename to src/madness/chem/PNOGuessFunctions.cpp diff --git a/src/apps/chem/PNOGuessFunctions.h b/src/madness/chem/PNOGuessFunctions.h similarity index 98% rename from src/apps/chem/PNOGuessFunctions.h rename to src/madness/chem/PNOGuessFunctions.h index 8004770ce72..13fd158b9a2 100644 --- a/src/apps/chem/PNOGuessFunctions.h +++ b/src/madness/chem/PNOGuessFunctions.h @@ -17,10 +17,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include diff --git a/src/apps/chem/PNOParameters.cpp b/src/madness/chem/PNOParameters.cpp similarity index 100% rename from src/apps/chem/PNOParameters.cpp rename to src/madness/chem/PNOParameters.cpp diff --git a/src/apps/chem/PNOParameters.h b/src/madness/chem/PNOParameters.h similarity index 99% rename from src/apps/chem/PNOParameters.h rename to src/madness/chem/PNOParameters.h index f62be8cf405..c41c987fdb8 100644 --- a/src/apps/chem/PNOParameters.h +++ b/src/madness/chem/PNOParameters.h @@ -10,7 +10,7 @@ #include #include -#include +#include namespace madness { diff --git a/src/apps/chem/PNOStructures.cpp b/src/madness/chem/PNOStructures.cpp similarity index 100% rename from src/apps/chem/PNOStructures.cpp rename to src/madness/chem/PNOStructures.cpp diff --git a/src/apps/chem/PNOStructures.h b/src/madness/chem/PNOStructures.h similarity index 98% rename from src/apps/chem/PNOStructures.h rename to src/madness/chem/PNOStructures.h index 10c25518842..e6c115354c4 100644 --- a/src/apps/chem/PNOStructures.h +++ b/src/madness/chem/PNOStructures.h @@ -11,8 +11,8 @@ #include #include -#include -#include +#include +#include #include #include @@ -39,7 +39,7 @@ struct valarray_allocator{ } -#include +#include namespace madness { class ParametrizedExchange { diff --git a/src/apps/chem/PNOTensors.h b/src/madness/chem/PNOTensors.h similarity index 100% rename from src/apps/chem/PNOTensors.h rename to src/madness/chem/PNOTensors.h diff --git a/src/apps/chem/QCCalculationParametersBase.cc b/src/madness/chem/QCCalculationParametersBase.cc similarity index 99% rename from src/apps/chem/QCCalculationParametersBase.cc rename to src/madness/chem/QCCalculationParametersBase.cc index b606336937a..bc3b27d4596 100644 --- a/src/apps/chem/QCCalculationParametersBase.cc +++ b/src/madness/chem/QCCalculationParametersBase.cc @@ -5,7 +5,7 @@ * Author: fbischoff */ -#include +#include #include #include #include diff --git a/src/apps/chem/QCCalculationParametersBase.h b/src/madness/chem/QCCalculationParametersBase.h similarity index 99% rename from src/apps/chem/QCCalculationParametersBase.h rename to src/madness/chem/QCCalculationParametersBase.h index e1492952b59..5f8fdd070b0 100644 --- a/src/apps/chem/QCCalculationParametersBase.h +++ b/src/madness/chem/QCCalculationParametersBase.h @@ -17,7 +17,7 @@ #include #include #include -#include +#include namespace madness { diff --git a/src/apps/chem/QCPropertyInterface.h b/src/madness/chem/QCPropertyInterface.h similarity index 98% rename from src/apps/chem/QCPropertyInterface.h rename to src/madness/chem/QCPropertyInterface.h index 7bb5937d8bb..50604810084 100644 --- a/src/apps/chem/QCPropertyInterface.h +++ b/src/madness/chem/QCPropertyInterface.h @@ -2,7 +2,7 @@ #define MADNESS_QCPROPERTYINTERFACE_H #include -#include +#include using namespace madness; //class NuclearCorrelationFactor; diff --git a/src/apps/chem/SCF.cc b/src/madness/chem/SCF.cc similarity index 99% rename from src/apps/chem/SCF.cc rename to src/madness/chem/SCF.cc index a7b2e4fbb65..9963627cee0 100644 --- a/src/apps/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -39,7 +39,7 @@ #include #include -#include +#include #include #if defined(__has_include) diff --git a/src/apps/chem/SCF.h b/src/madness/chem/SCF.h similarity index 98% rename from src/apps/chem/SCF.h rename to src/madness/chem/SCF.h index 4289cbfd203..7dc570b8cfb 100644 --- a/src/apps/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -44,22 +44,22 @@ #include -#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include +#include +#include #include "madness/tensor/tensor_json.hpp" #include diff --git a/src/apps/chem/SCFOperators.cc b/src/madness/chem/SCFOperators.cc similarity index 99% rename from src/apps/chem/SCFOperators.cc rename to src/madness/chem/SCFOperators.cc index ba9d74cd093..8cfd61cfd31 100644 --- a/src/apps/chem/SCFOperators.cc +++ b/src/madness/chem/SCFOperators.cc @@ -34,13 +34,13 @@ /// \defgroup chem The molecular density functional and Hartree-Fock code -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include using namespace madness; diff --git a/src/apps/chem/SCFOperators.h b/src/madness/chem/SCFOperators.h similarity index 100% rename from src/apps/chem/SCFOperators.h rename to src/madness/chem/SCFOperators.h diff --git a/src/apps/chem/SCFProtocol.h b/src/madness/chem/SCFProtocol.h similarity index 99% rename from src/apps/chem/SCFProtocol.h rename to src/madness/chem/SCFProtocol.h index 1037edb1161..3db8db4cd85 100644 --- a/src/apps/chem/SCFProtocol.h +++ b/src/madness/chem/SCFProtocol.h @@ -41,7 +41,7 @@ namespace madness { -#include +#include /// struct for running a protocol of subsequently tightening precision class SCFProtocol { diff --git a/src/apps/chem/TDHF.cc b/src/madness/chem/TDHF.cc similarity index 99% rename from src/apps/chem/TDHF.cc rename to src/madness/chem/TDHF.cc index 3f60ff33ec4..98924b418bb 100644 --- a/src/apps/chem/TDHF.cc +++ b/src/madness/chem/TDHF.cc @@ -5,11 +5,11 @@ * Author: kottmanj */ -#include -#include +#include +#include #include -#include -#include +#include +#include namespace madness { diff --git a/src/apps/chem/TDHF.h b/src/madness/chem/TDHF.h similarity index 99% rename from src/apps/chem/TDHF.h rename to src/madness/chem/TDHF.h index a0362e98518..d66b4be8aea 100644 --- a/src/apps/chem/TDHF.h +++ b/src/madness/chem/TDHF.h @@ -8,13 +8,13 @@ #ifndef SRC_APPS_CHEM_TDHF_H_ #define SRC_APPS_CHEM_TDHF_H_ -#include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include +#include +#include namespace madness { diff --git a/src/apps/chem/atomutil.cc b/src/madness/chem/atomutil.cc similarity index 99% rename from src/apps/chem/atomutil.cc rename to src/madness/chem/atomutil.cc index d28f3a946bc..a112d2bf6ae 100644 --- a/src/apps/chem/atomutil.cc +++ b/src/madness/chem/atomutil.cc @@ -33,7 +33,7 @@ */ #include -#include +#include #include #include #include diff --git a/src/apps/chem/atomutil.h b/src/madness/chem/atomutil.h similarity index 100% rename from src/apps/chem/atomutil.h rename to src/madness/chem/atomutil.h diff --git a/src/apps/chem/aug-cc-pvdz b/src/madness/chem/aug-cc-pvdz similarity index 100% rename from src/apps/chem/aug-cc-pvdz rename to src/madness/chem/aug-cc-pvdz diff --git a/src/apps/chem/basis.h b/src/madness/chem/basis.h similarity index 100% rename from src/apps/chem/basis.h rename to src/madness/chem/basis.h diff --git a/src/apps/chem/benchmark_exchange_operator.cc b/src/madness/chem/benchmark_exchange_operator.cc similarity index 97% rename from src/apps/chem/benchmark_exchange_operator.cc rename to src/madness/chem/benchmark_exchange_operator.cc index 9828d064c0b..56cd6aee6e5 100644 --- a/src/apps/chem/benchmark_exchange_operator.cc +++ b/src/madness/chem/benchmark_exchange_operator.cc @@ -1,11 +1,11 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include -#include -#include -#include +#include +#include +#include #include -#include +#include #include using namespace madness; diff --git a/src/apps/chem/ccpairfunction.cc b/src/madness/chem/ccpairfunction.cc similarity index 99% rename from src/apps/chem/ccpairfunction.cc rename to src/madness/chem/ccpairfunction.cc index a85c4d4e22b..46bcd016907 100644 --- a/src/apps/chem/ccpairfunction.cc +++ b/src/madness/chem/ccpairfunction.cc @@ -2,9 +2,9 @@ // Created by Florian Bischoff on 6/27/22. // -#include -#include -#include +#include +#include +#include using namespace madness; diff --git a/src/apps/chem/ccpairfunction.h b/src/madness/chem/ccpairfunction.h similarity index 99% rename from src/apps/chem/ccpairfunction.h rename to src/madness/chem/ccpairfunction.h index 5dd1abb9c79..81678347040 100644 --- a/src/apps/chem/ccpairfunction.h +++ b/src/madness/chem/ccpairfunction.h @@ -8,8 +8,8 @@ #include -#include -#include +#include +#include #include #include #include diff --git a/src/apps/chem/cis_example_input b/src/madness/chem/cis_example_input similarity index 100% rename from src/apps/chem/cis_example_input rename to src/madness/chem/cis_example_input diff --git a/src/apps/chem/commandlineparser.h b/src/madness/chem/commandlineparser.h similarity index 100% rename from src/apps/chem/commandlineparser.h rename to src/madness/chem/commandlineparser.h diff --git a/src/apps/chem/coredata/mcp b/src/madness/chem/coredata/mcp similarity index 97% rename from src/apps/chem/coredata/mcp rename to src/madness/chem/coredata/mcp index 692c4c85354..fe77b945b9d 100644 --- a/src/apps/chem/coredata/mcp +++ b/src/madness/chem/coredata/mcp @@ -1,2509 +1,2509 @@ - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 2.718422000000e+00 -1.717586728164e+00 - 0 1 1.061906000000e+00 1.418564696154e-01 - - - - 7.105793e+02 2.009533e-03 - 1.034368e+02 1.482329e-02 - 2.443300e+01 6.640480e-02 - 7.308967e+00 1.990801e-01 - 2.506894e+00 3.819108e-01 - 9.438003e-01 3.884663e-01 - 3.709710e-01 1.099967e-01 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 5.188992000000e+00 -1.881929662069e+00 - 0 1 2.023980000000e+00 2.498997301900e-01 - - - - 1.311616e+03 1.969894e-03 - 1.913861e+02 1.451971e-02 - 4.527883e+01 6.534285e-02 - 1.359732e+01 1.982694e-01 - 4.719701e+00 3.835307e-01 - 1.817344e+00 3.845043e-01 - 7.340121e-01 1.096769e-01 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 1.603560000000e+01 -1.732294880810e+00 - 0 1 2.322329000000e+00 -1.596306790339e-01 - - - - 2.787867e+02 2.477011e-02 - 3.826330e+01 1.678633e-01 - 8.576375e+00 4.977570e-01 - 2.360978e+00 4.542732e-01 - 2.929847e-01 8.554471e-03 - 9.375142e-02 6.986010e-03 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 1.864605000000e+01 -1.461263274320e+00 - 0 1 3.512100000000e+00 -1.797988128353e-01 - - - - 4.090699e+02 2.446620e-02 - 5.616343e+01 1.667309e-01 - 1.263216e+01 4.985016e-01 - 3.495336e+00 4.533167e-01 - 4.607115e-01 9.069870e-03 - 1.436420e-01 7.456826e-03 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 2.763930000000e+01 -1.439667183297e+00 - 0 1 5.022100000000e+00 -2.157238444933e-01 - - - - 5.635094e+02 2.422667e-02 - 7.738753e+01 1.657101e-01 - 1.744855e+01 4.979887e-01 - 4.843508e+00 4.511053e-01 - 7.820957e+00 1.334650e-03 - 6.633018e-01 9.410938e-03 - 2.029459e-01 7.779541e-03 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 4.064864000000e+01 -1.652819174505e+00 - 0 1 5.175230000000e+00 -1.645265426926e-01 - - - - 7.432411e+02 2.413306e-02 - 1.020870e+02 1.655533e-01 - 2.305897e+01 4.996164e-01 - 6.416186e+00 4.517950e-01 - 9.065320e-01 9.761350e-03 - 2.740610e-01 7.992775e-03 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 5.202781000000e+01 -1.665079199433e+00 - 0 1 6.206354000000e+00 -1.570985856967e-01 - - - - 9.476157e+02 2.401760e-02 - 1.301841e+02 1.651131e-01 - 2.944885e+01 4.998040e-01 - 8.208941e+00 4.514980e-01 - 1.184390e+00 1.005990e-02 - 3.545967e-01 8.202500e-03 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 5.407668000000e+01 -1.431831248614e+00 - 0 1 7.612973000000e+00 -1.535941722588e-01 - - - - 99920 8.531738E-005 - 14960 0.00066368499 - 3399 0.0034900643 - 958.9 0.01455040251 - 311.2 0.05055672553 - 111.7 0.14259582815 - 43.32 0.30211383473 - 17.8 0.39679786984 - 7.503 0.21678101044 - 2.337 0.01994 - 0.9001 0.00011 - 0.3301 4E-005 - - - - - - 0 1 0.000000e+00 4.0000e+00 - 0 1 3.050656000000e+02 -2.897619271036e+00 - 0 1 1.464675000000e+01 -1.319215823237e+00 - 0 1 2.136867000000e+00 -9.287752652095e-01 - 0 2 4.718427000000e+02 7.960024651340e+01 - 0 2 2.052377000000e+02 -2.125749865373e+01 - 0 2 6.894609000000e-01 -3.994723288019e-01 - - 0 1 3.050656000000e+02 -2.897619271036e+00 - 0 1 1.464675000000e+01 -1.319215823237e+00 - 0 1 2.136867000000e+00 -9.287752652095e-01 - 0 2 4.718427000000e+02 7.960024651340e+01 - 0 2 2.052377000000e+02 -2.125749865373e+01 - 0 2 6.894609000000e-01 -3.994723288019e-01 - - - 1224000 5.0002E-006 - 183200 3.700149E-005 - 41700 0.00019600719 - 11810 0.00082702996 - 3853 0.00300310857 - 1391 0.00970335331 - 542.5 0.02823505071 - 224.9 0.07320884299 - 97.93 0.16290394607 - 44.31 0.28872274348 - 20.65 0.34685447335 - 9.729 0.20688894473 - 4.228 0.03277823685 - 1.969 -0.00073674573 - 0.889 0.00136977939 - 0.3964 -0.00016158574 - 0.06993 -0.00115 - 0.03289 0.00091 - 0.01612 -5E-005 - - - 1224000 -9.9987E-007 - 183200 -8.99764E-006 - 41700 -4.798447E-005 - 11810 -0.00020193348 - 3853 -0.00073575535 - 1391 -0.00238621128 - 542.5 -0.00704769949 - 224.9 -0.01878004233 - 97.93 -0.04460163068 - 44.31 -0.0897501665 - 20.65 -0.14291007325 - 9.729 -0.12429614602 - 4.228 0.0999639237 - 1.969 0.41705096717 - 0.889 0.4750436931 - 0.3964 0.16305746022 - 0.06993 0.01154 - 0.03289 -0.0112 - 0.01612 0.00067 - - - - - - 0 1 0.000000e+00 4.000000e+00 - 0 1 3.371815000000e+02 1.582036297230e+00 - 0 1 1.582292000000e+01 -1.120404892641e+00 - 0 1 2.309331000000e+00 -9.460018733114e-01 - 0 2 5.552475000000e+02 4.017354059378e+01 - 0 2 2.797939000000e+02 -7.998745241906e+01 - 0 2 7.681323000000e-01 -2.960128956124e-01 - - - - 327600 3.099666E-005 - 49050 0.00024096804 - 11150 0.00126682924 - 3152 0.0053332808 - 1025 0.0190743581 - 368.8 0.0587976508 - 143.2 0.15142998214 - 58.96 0.30065940292 - 25.4 0.38103803064 - 11.15 0.21349325238 - 4.004 0.02332448202 - 1.701 -0.00187005168 - 0.706 0.00129608952 - 0.141 0.00419 - 0.06808 -0.00269 - 0.03063 0.00015 - - - 327600 -7.96378E-006 - 49050 -6.073309E-005 - 11150 -0.00031959877 - 3152 -0.00134410902 - 1025 -0.0048845946 - 368.8 -0.01528900392 - 143.2 -0.04215638843 - 58.96 -0.09365015564 - 25.4 -0.16271372369 - 11.15 -0.12421029062 - 4.004 0.23459040783 - 1.701 0.57495678625 - 0.706 0.3333864325 - 0.141 0.03409 - 0.06808 -0.03002 - 0.03063 0.0017 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.316953e+02 -3.386013e+00 - 0 1 5.217324e+00 -6.046747e+00 - 0 1 2.331459e+00 -3.647381e-01 - 0 2 9.142273e+02 -1.140686e+02 - 0 2 2.077560e+02 -4.208050e+01 - 0 2 1.251080e+00 -3.349915e-01 - - - - 2.043808e+03 2.330614e-02 - 2.809367e+02 1.613919e-01 - 6.378912e+01 4.958434e-01 - 1.788862e+01 4.569062e-01 - 2.886838e+00 1.142757e-02 - 9.993500e-01 8.659862e-03 - - - 2.043808e+03 6.603905e-03 - 2.809367e+02 4.573118e-02 - 6.378912e+01 1.404996e-01 - 1.788862e+01 1.294666e-01 - 3.061927e+01 9.566236e-02 - - - 1.089621e+02 1.824312e-02 - 2.363035e+01 1.212105e-01 - 7.107732e+00 3.571781e-01 - 2.366064e+00 4.993906e-01 - 8.025018e-01 2.309303e-01 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.349863e+02 -3.320043e+00 - 0 1 4.335714e+00 -5.901880e+00 - 0 1 4.547902e+00 3.453667e-01 - 0 2 8.540638e+02 -1.218275e+02 - 0 2 2.119761e+02 -3.822756e+01 - 0 2 9.980917e-01 -3.460521e-01 - - - - 2.387957e+03 2.313729e-02 - 3.282802e+02 1.604502e-01 - 7.458612e+01 4.946216e-01 - 2.094412e+01 4.585802e-01 - 3.444621e+00 1.181110e-02 - 1.222284e+00 8.622046e-03 - - - 1.348228e+02 1.731180e-02 - 2.936148e+01 1.169748e-01 - 8.890635e+00 3.531863e-01 - 3.000349e+00 5.034634e-01 - 1.037602e+00 2.287471e-01 - - - 2.387957e+03 6.719179e-03 - 3.282802e+02 4.659548e-02 - 7.458612e+01 1.436404e-01 - 2.094412e+01 1.331738e-01 - 3.582222e+01 9.806896e-02 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.269965e+02 -2.738258e+00 - 0 1 5.125039e+00 -5.713482e+00 - 0 1 2.849041e+00 3.351582e-01 - 0 2 1.169129e+03 -7.823903e+01 - 0 2 1.843911e+02 -2.594858e+01 - 0 2 1.326776e+00 -2.364182e-01 - - - - 2.759337e+03 2.298844e-02 - 3.793730e+02 1.596162e-01 - 8.624196e+01 4.935288e-01 - 2.424595e+01 4.600765e-01 - 4.049327e+00 1.216849e-02 - 1.462091e+00 8.553915e-03 - - - 1.635738e+02 1.653283e-02 - 3.574204e+01 1.133241e-01 - 1.088147e+01 3.493311e-01 - 3.713289e+00 5.065666e-01 - 1.304009e+00 2.282030e-01 - - - 2.759337e+03 6.815474e-03 - 3.793730e+02 4.732204e-02 - 8.624196e+01 1.463184e-01 - 2.424595e+01 1.364007e-01 - 4.146794e+01 1.001408e-01 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.155917e+02 -3.620214e+00 - 0 1 5.971141e+00 -5.737309e+00 - 0 1 2.859090e+00 4.704707e-01 - 0 2 2.062680e+03 -3.776082e+01 - 0 2 1.487138e+02 -3.431947e+01 - 0 2 1.644010e+00 -2.288331e-01 - - - - 3.158033e+03 2.285572e-02 - 4.342273e+02 1.588694e-01 - 9.875946e+01 4.925416e-01 - 2.779522e+01 4.614278e-01 - 4.703444e+00 1.248984e-02 - 1.720138e+00 8.475957e-03 - - - 1.931031e+02 1.615636e-02 - 4.229557e+01 1.118467e-01 - 1.292618e+01 3.491943e-01 - 4.446308e+00 5.094185e-01 - 1.575364e+00 2.231922e-01 - - - 3.158033e+03 6.897386e-03 - 4.342273e+02 4.794350e-02 - 9.875946e+01 1.486389e-01 - 2.779522e+01 1.392494e-01 - 4.754841e+01 1.019635e-01 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.120543e+02 -2.654674e+00 - 0 1 6.860978e+00 -5.707226e+00 - 0 1 2.789429e+00 6.518503e-01 - 0 2 1.667526e+03 -3.516025e+01 - 0 2 1.070677e+02 -3.284686e+01 - 0 2 3.574553e+00 -9.898434e-01 - - - - 3.584292e+03 2.273479e-02 - 4.928774e+02 1.581851e-01 - 1.121465e+02 4.916240e-01 - 3.159387e+01 4.626829e-01 - 5.405644e+00 1.279159e-02 - 1.995106e+00 8.399245e-03 - - - 2.239078e+02 1.596166e-02 - 4.916041e+01 1.112272e-01 - 1.507759e+01 3.501497e-01 - 5.222262e+00 5.115647e-01 - 1.862470e+00 2.176059e-01 - - - 3.584292e+03 6.966199e-03 - 4.928774e+02 4.846974e-02 - 1.121465e+02 1.506392e-01 - 3.159387e+01 1.417713e-01 - 5.406610e+01 1.035544e-01 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.316953e+02 -9.029367e+00 - 0 1 5.217324e+00 -1.612466e+01 - 0 1 2.331459e+00 -9.726350e-01 - 0 2 9.142273e+02 -3.041829e+02 - 0 2 2.077560e+02 -1.122147e+02 - 0 2 1.251080e+00 -8.933106e-01 - - - - 2.043808e+03 2.330614e-02 - 2.809367e+02 1.613919e-01 - 6.378912e+01 4.958434e-01 - 1.788862e+01 4.569062e-01 - 2.886838e+00 1.142757e-02 - 9.993500e-01 8.659862e-03 - - - 1.089621e+02 1.824312e-02 - 2.363035e+01 1.212105e-01 - 7.107732e+00 3.571781e-01 - 2.366064e+00 4.993906e-01 - 8.025018e-01 2.309303e-01 - - - 2.043808e+03 6.603905e-03 - 2.809367e+02 4.573118e-02 - 6.378912e+01 1.404996e-01 - 1.788862e+01 1.294666e-01 - 3.061927e+01 9.566236e-02 - - - - - - 0 1 0.000000e+00 1.200000e+01 - 0 1 1.165002e+02 -6.815450e+00 - 0 1 8.900975e+00 -5.215410e+00 - 0 1 3.035128e-01 -1.866213e-01 - 0 2 1.887663e+03 -1.595243e+02 - 0 2 1.854639e+02 -5.261246e+01 - 0 2 1.596409e+00 -3.662524e+00 - - - - 4.734263e+03 2.216103e-03 - 6.514608e+02 1.553145e-02 - 1.484022e+02 4.954343e-02 - 4.196838e+01 5.035876e-02 - 6.816142e+01 4.017761e-02 - 6.770286e-01 7.829351e-01 - 2.602544e-01 4.122532e-01 - - - 4.734263e+03 2.126296e-02 - 6.514608e+02 1.490203e-01 - 1.484022e+02 4.753568e-01 - 4.196838e+01 4.831797e-01 - 7.097100e+00 1.941763e-02 - 2.791745e+00 1.356118e-02 - 4.663554e+00 4.197652e-03 - - - 1.735091e+02 3.641247e-02 - 3.760621e+01 2.230816e-01 - 1.115757e+01 5.296130e-01 - 3.680917e+00 3.941468e-01 - 1.439472e+00 6.592606e-03 - 5.215131e-01 1.100807e-02 - 1.902026e-01 4.409938e-03 - - - 4.734263e+03 6.686011e-03 - 6.514608e+02 4.685857e-02 - 1.484022e+02 1.494731e-01 - 4.196838e+01 1.519330e-01 - 6.816142e+01 1.061468e-01 - 4.663554e+00 2.218768e-03 - - - - - - 0 1 0.000000e+00 1.200000e+01 - 0 1 1.267215e+02 -6.552351e+00 - 0 1 9.963899e+00 -4.778063e+00 - 0 1 3.241862e-01 -1.760750e-01 - 0 2 1.502502e+03 -1.925403e+02 - 0 2 2.020013e+02 -5.803146e+01 - 0 2 1.617474e+00 -3.299848e+00 - - - - 5.269373e+03 2.335822e-03 - 7.251419e+02 1.638271e-02 - 1.652354e+02 5.236452e-02 - 4.676625e+01 5.344078e-02 - 7.592187e+01 4.269463e-02 - 8.076661e-01 8.100857e-01 - 3.256016e-01 3.956857e-01 - - - 5.269373e+03 2.116644e-02 - 7.251419e+02 1.484547e-01 - 1.652354e+02 4.745100e-01 - 4.676625e+01 4.842626e-01 - 7.983490e+00 1.968437e-02 - 3.169474e+00 1.355669e-02 - 5.360188e+00 4.184384e-03 - - - 1.986128e+02 3.537530e-02 - 4.314738e+01 2.190453e-01 - 1.286298e+01 5.275969e-01 - 4.278264e+00 3.976240e-01 - 1.712917e+00 7.288671e-03 - 6.380574e-01 1.177173e-02 - 2.397383e-01 4.039566e-03 - - - 5.269373e+03 6.728304e-03 - 7.251419e+02 4.719017e-02 - 1.652354e+02 1.508353e-01 - 4.676625e+01 1.539355e-01 - 7.592187e+01 1.073839e-01 - 5.360188e+00 2.391065e-03 - - - - - - 0 1 0.000000e+00 1.800000e+01 - 0 1 1.419617e+02 -1.011094e+01 - 0 1 6.981494e+00 -4.972984e+00 - 0 1 1.459222e+00 -1.658636e+00 - 0 2 9.030206e+02 -9.733987e+01 - 0 2 6.042702e+01 -6.438824e+01 - 0 2 1.538846e+00 -7.874682e-01 - - - - 1.753258e+04 2.552036e-03 - 2.141321e+03 1.798133e-02 - 4.590901e+02 6.105938e-02 - 1.256613e+02 6.916771e-02 - 2.041631e+02 4.757103e-02 - 2.668048e+00 8.122274e-01 - 1.067967e+00 4.208331e-01 - 1.586098e-01 3.207152e-03 - 5.313909e-02 1.093893e-03 - - - 1.753258e+04 1.905672e-02 - 2.141321e+03 1.342713e-01 - 4.590901e+02 4.559463e-01 - 1.256613e+02 5.164933e-01 - 2.211365e+01 2.596770e-02 - 9.055300e+00 1.693821e-02 - 1.691566e+01 5.533978e-03 - - - 5.897572e+02 1.315674e-02 - 1.274100e+02 8.568570e-02 - 3.858081e+01 2.194940e-01 - 1.319410e+01 1.678596e-01 - - - 5.897572e+02 3.154579e-02 - 1.274100e+02 2.054478e-01 - 3.858081e+01 5.262790e-01 - 1.319410e+01 4.024755e-01 - 6.040503e+00 9.503667e-03 - 2.285194e+00 1.448962e-02 - 8.785018e-01 5.294503e-03 - - - 1.753258e+04 6.598478e-03 - 2.141321e+03 4.649206e-02 - 4.590901e+02 1.578735e-01 - 1.256613e+02 1.788382e-01 - 2.041631e+02 1.059212e-01 - 1.691566e+01 2.972671e-03 - 1.586098e-01 1.394275e-03 - 5.313909e-02 4.755583e-04 - - - - - - 0 1 0.000000e+00 1.800000e+01 - 0 1 1.274682e+02 -9.018011e+00 - 0 1 7.957019e+00 -5.122292e+00 - 0 1 1.637895e+00 -1.644804e+00 - 0 2 7.395817e+02 -1.629970e+02 - 0 2 5.924678e+01 -5.269001e+01 - 0 2 1.505617e+00 -7.954904e-01 - - - - 1.906556e+04 2.579178e-03 - 2.310581e+03 1.816386e-02 - 4.933572e+02 6.187404e-02 - 1.347287e+02 7.045750e-02 - 2.190805e+02 4.804061e-02 - 2.899252e+00 8.178377e-01 - 1.182388e+00 4.172929e-01 - 1.997604e-01 3.366036e-03 - 6.722313e-02 1.047392e-03 - - - 1.906556e+04 1.896751e-02 - 2.310581e+03 1.335787e-01 - 4.933572e+02 4.550274e-01 - 1.347287e+02 5.181510e-01 - 2.379342e+01 2.617004e-02 - 9.774380e+00 1.714604e-02 - 1.826867e+01 5.545111e-03 - - - 6.387863e+02 1.319476e-02 - 1.379239e+02 8.625880e-02 - 4.179844e+01 2.223490e-01 - 1.432062e+01 1.715137e-01 - - - 6.387863e+02 3.114216e-02 - 1.379239e+02 2.035873e-01 - 4.179844e+01 5.247863e-01 - 1.432062e+01 4.048052e-01 - 6.585455e+00 9.959601e-03 - 2.517464e+00 1.516615e-02 - 9.912460e-01 5.431750e-03 - - - 1.906556e+04 6.599092e-03 - 2.310581e+03 4.647411e-02 - 4.933572e+02 1.583111e-01 - 1.347287e+02 1.802728e-01 - 2.190805e+02 1.057224e-01 - 1.826867e+01 3.142525e-03 - 1.997604e-01 1.717543e-03 - 6.722313e-02 5.344390e-04 - - - - - - 0 1 0.000000e+00 1.800000e+01 - 0 1 1.422958e+02 -9.817787e+00 - 0 1 8.204055e+00 -4.993532e+00 - 0 1 1.705258e+00 -1.603169e+00 - 0 2 8.792100e+02 -1.396404e+02 - 0 2 7.059450e+01 -5.968996e+01 - 0 2 1.732241e+00 -7.626109e-01 - - - - 2.070120e+04 2.606574e-03 - 2.488959e+03 1.834574e-02 - 5.292053e+02 6.269014e-02 - 1.441692e+02 7.176311e-02 - 2.346329e+02 4.849273e-02 - 3.140549e+00 8.261152e-01 - 1.301168e+00 4.113889e-01 - 2.435996e-01 3.496967e-03 - 8.270040e-02 1.047075e-03 - - - 2.070120e+04 1.888091e-02 - 2.488959e+03 1.328887e-01 - 5.292053e+02 4.541005e-01 - 1.441692e+02 5.198212e-01 - 2.554504e+01 2.637489e-02 - 1.052815e+01 1.736753e-02 - 1.968156e+01 5.563399e-03 - - - 6.904302e+02 1.322952e-02 - 1.489766e+02 8.680121e-02 - 4.517937e+01 2.251550e-01 - 1.550622e+01 1.752475e-01 - - - 6.904302e+02 3.074253e-02 - 1.489766e+02 2.017072e-01 - 4.517937e+01 5.232115e-01 - 1.550622e+01 4.072372e-01 - 7.151327e+00 1.045325e-02 - 2.758110e+00 1.587569e-02 - 1.106490e+00 5.514443e-03 - - - 2.070120e+04 6.599282e-03 - 2.488959e+03 4.644744e-02 - 5.292053e+02 1.587178e-01 - 1.441692e+02 1.816887e-01 - 2.346329e+02 1.054775e-01 - 1.968156e+01 3.317968e-03 - 2.435996e-01 2.022820e-03 - 8.270040e-02 6.056805e-04 - - - - - - 0 1 0.000000e+00 1.800000e+01 - 0 1 1.511515e+02 -1.041981e+01 - 0 1 1.236041e+01 -3.887438e+00 - 0 1 3.657611e+00 -1.109334e+00 - 0 2 6.454874e+02 -2.138912e+02 - 0 2 7.442747e+01 -7.995303e+01 - 0 2 2.997280e+00 -5.685900e+00 - - - - 2.244564e+04 2.633691e-03 - 2.676845e+03 1.852303e-02 - 5.666818e+02 6.349405e-02 - 1.539899e+02 7.306893e-02 - 2.508583e+02 4.891412e-02 - 3.393299e+00 8.359122e-01 - 1.424691e+00 4.042380e-01 - 2.916912e-01 3.638659e-03 - 9.918827e-02 1.057776e-03 - - - 2.244564e+04 8.593214e-02 - 2.676845e+03 1.291239e-01 - 5.666818e+02 4.426165e-01 - 1.539899e+02 5.093629e-01 - 2.508583e+02 4.061329e-03 - 2.736320e+01 2.597834e-02 - 1.130876e+01 1.717920e-02 - 2.115399e+01 5.459317e-03 - - - 7.448706e+02 1.325438e-02 - 1.606041e+02 8.727282e-02 - 4.873444e+01 2.278224e-01 - 1.675489e+01 1.790212e-01 - - - 7.448706e+02 3.034145e-02 - 1.606041e+02 1.997817e-01 - 4.873444e+01 5.215226e-01 - 1.675489e+01 4.098088e-01 - 7.738321e+00 1.099823e-02 - 3.006211e+00 1.664546e-02 - 1.222484e+00 5.560003e-03 - - - 2.244564e+04 6.599227e-03 - 2.676845e+03 4.641307e-02 - 5.666818e+02 1.590967e-01 - 1.539899e+02 1.830885e-01 - 2.508583e+02 1.051835e-01 - 2.115399e+01 3.457553e-03 - 2.916912e-01 2.190586e-03 - 9.918827e-02 6.368142e-04 - - - - - - 0 1 0.000000e+00 1.800000e+01 - 0 1 1.511924e+02 -1.004655e+01 - 0 1 1.225936e+01 -3.340956e+00 - 0 1 4.073227e+00 -1.041641e+00 - 0 2 7.615376e+02 -3.027725e+02 - 0 2 7.283256e+01 -8.638852e+01 - 0 2 3.266225e+00 -6.059629e+00 - - - - 2.430549e+04 2.660251e-03 - 2.874653e+03 1.869363e-02 - 6.058359e+02 6.427818e-02 - 1.641984e+02 7.436621e-02 - 2.677039e+02 4.930923e-02 - 3.656819e+00 8.465978e-01 - 1.552117e+00 3.961412e-01 - 3.427024e-01 3.774496e-03 - 1.172107e-01 1.090944e-03 - - - 2.430549e+04 1.871595e-02 - 2.874653e+03 1.315173e-01 - 6.058359e+02 4.522232e-01 - 1.641984e+02 5.231966e-01 - 2.927411e+01 2.678198e-02 - 1.214839e+01 1.785403e-02 - 2.269055e+01 5.615537e-03 - - - 8.014974e+02 1.328687e-02 - 1.726692e+02 8.776625e-02 - 5.241922e+01 2.304487e-01 - 1.804917e+01 1.826273e-01 - - - 8.014974e+02 2.998247e-02 - 1.726692e+02 1.980489e-01 - 5.241922e+01 5.200189e-01 - 1.804917e+01 4.121075e-01 - 8.347950e+00 1.149155e-02 - 3.264892e+00 1.730968e-02 - 1.342376e+00 5.552376e-03 - - - 2.430549e+04 6.599246e-03 - 2.874653e+03 4.637304e-02 - 6.058359e+02 1.594540e-01 - 1.641984e+02 1.844792e-01 - 2.677039e+02 1.048642e-01 - 2.269055e+01 3.709187e-03 - 3.427024e-01 2.695420e-03 - 1.172107e-01 7.790586e-04 - - - - - - 0 1 0.000000e+00 1.800000e+01 - 0 1 1.611333e+02 -9.582092e+00 - 0 1 1.256127e+01 -3.218382e+00 - 0 1 4.278209e+00 -1.037790e+00 - 0 2 8.592716e+02 -3.576688e+02 - 0 2 8.503966e+01 -1.004948e+02 - 0 2 3.463696e+00 -6.125106e+00 - - - - 2.628775e+04 2.685969e-03 - 3.082822e+03 1.885541e-02 - 6.467196e+02 6.503482e-02 - 1.748027e+02 7.564584e-02 - 2.852744e+02 4.965926e-02 - 3.932341e+00 8.579122e-01 - 1.683396e+00 3.876149e-01 - 3.967245e-01 3.906953e-03 - 1.367040e-01 1.135803e-03 - - - 2.628775e+04 1.863775e-02 - 3.082822e+03 1.308363e-01 - 6.467196e+02 4.512721e-01 - 1.748027e+02 5.249012e-01 - 3.124910e+01 2.699639e-02 - 1.300959e+01 1.810864e-02 - 2.428824e+01 5.648936e-03 - - - 8.608589e+02 1.331180e-02 - 1.852878e+02 8.819928e-02 - 5.626984e+01 2.329222e-01 - 1.940291e+01 1.861763e-01 - - - 8.608589e+02 2.963214e-02 - 1.852878e+02 1.963321e-01 - 5.626984e+01 5.184860e-01 - 1.940291e+01 4.144294e-01 - 8.981600e+00 1.200026e-02 - 3.534366e+00 1.798026e-02 - 1.465887e+00 5.536325e-03 - - - 2.628775e+04 6.599258e-03 - 3.082822e+03 4.632655e-02 - 6.467196e+02 1.597865e-01 - 1.748027e+02 1.858571e-01 - 2.852744e+02 1.044940e-01 - 2.428824e+01 3.893449e-03 - 3.967245e-01 2.973505e-03 - 1.367040e-01 8.644372e-04 - - - - - - 0 1 0.000000e+00 3.000000e+01 - 0 1 1.717237e+02 -1.587122e+01 - 0 1 8.795873e+00 -8.401075e+00 - 0 1 1.678889e+00 -2.468170e+00 - 0 2 3.285551e+03 -1.559101e+03 - 0 2 4.334126e+01 -1.055606e+02 - 0 2 1.370595e+00 -3.327627e+00 - - - - 2.832869e+04 1.861324e-02 - 3.293308e+03 1.305182e-01 - 6.874975e+02 4.512925e-01 - 1.852792e+02 5.255960e-01 - 3.331788e+01 2.681546e-02 - 1.388857e+01 1.810175e-02 - 2.594265e+01 5.565386e-03 - - - 9.224700e+02 2.931989e-02 - 1.983383e+02 1.948162e-01 - 6.024212e+01 5.172275e-01 - 2.079577e+01 4.163505e-01 - 9.638792e+00 1.251893e-02 - 3.818761e+00 1.861915e-02 - 1.600081e+00 5.548744e-03 - - - 2.832869e+04 6.618279e-03 - 3.293308e+03 4.640816e-02 - 6.874975e+02 1.604653e-01 - 1.852792e+02 1.868853e-01 - 3.032982e+02 1.041683e-01 - 2.594265e+01 3.793006e-03 - 5.321561e-01 2.442360e-03 - 2.133496e-01 1.216528e-03 - - - 2.832869e+04 2.719032e-03 - 3.293308e+03 1.906618e-02 - 6.874975e+02 6.592506e-02 - 1.852792e+02 7.677937e-02 - 3.032982e+02 5.001043e-02 - 4.223752e+00 8.691871e-01 - 1.823778e+00 3.803838e-01 - 5.321561e-01 3.528156e-03 - 2.133496e-01 1.757358e-03 - - - 9.224700e+02 1.334197e-02 - 1.983383e+02 8.865078e-02 - 6.024212e+01 2.353635e-01 - 2.079577e+01 1.894595e-01 - - - 2.832869e+04 9.277854e-04 - 3.293308e+03 6.505742e-03 - 6.874975e+02 2.249488e-02 - 1.852792e+02 2.619858e-02 - 3.032982e+02 1.676234e-02 - 4.223752e+00 3.861552e-01 - 1.823778e+00 1.689937e-01 - 2.975875e+00 2.580162e-01 - - - 6.893612e+01 7.038264e-02 - 1.806695e+01 3.297978e-01 - 5.745926e+00 5.563627e-01 - 1.824534e+00 3.148138e-01 - - - - - - 0 1 0.000000e+00 3.000000e+01 - 0 1 1.816301e+02 -1.509172e+01 - 0 1 8.787134e+00 -7.884786e+00 - 0 1 1.717769e+00 -2.313954e+00 - 0 2 3.261270e+03 -1.660114e+03 - 0 2 4.336450e+01 -1.063372e+02 - 0 2 1.370653e+00 -3.327384e+00 - - - - 3.057188e+04 1.854130e-02 - 3.522884e+03 1.298469e-01 - 7.318539e+02 4.503413e-01 - 1.966604e+02 5.273101e-01 - 3.546029e+01 2.701428e-02 - 1.483342e+01 1.837944e-02 - 2.766961e+01 5.602087e-03 - - - 9.882035e+02 2.895395e-02 - 2.122455e+02 1.929608e-01 - 6.447958e+01 5.154228e-01 - 2.228907e+01 4.189878e-01 - 1.032476e+01 1.313962e-02 - 4.114168e+00 1.942212e-02 - 1.737704e+00 5.596171e-03 - - - 3.057188e+04 6.619310e-03 - 3.522884e+03 4.635583e-02 - 7.318539e+02 1.607735e-01 - 1.966604e+02 1.882516e-01 - 3.222729e+02 1.037361e-01 - 2.766961e+01 3.981177e-03 - 6.107345e-01 2.769145e-03 - 2.567184e-01 1.255844e-03 - - - 3.057188e+04 2.744006e-03 - 3.522884e+03 1.921661e-02 - 7.318539e+02 6.664796e-02 - 1.966604e+02 7.803889e-02 - 3.222729e+02 5.029882e-02 - 4.527839e+00 8.796345e-01 - 1.968793e+00 3.728859e-01 - 6.107345e-01 3.640638e-03 - 2.567184e-01 1.651077e-03 - - - 9.882035e+02 1.333696e-02 - 2.122455e+02 8.888286e-02 - 6.447958e+01 2.374174e-01 - 2.228907e+01 1.929969e-01 - - - 3.057188e+04 9.836503e-04 - 3.522884e+03 6.888622e-03 - 7.318539e+02 2.389145e-02 - 1.966604e+02 2.797478e-02 - 3.222729e+02 1.782949e-02 - 4.527839e+00 4.115402e-01 - 1.968793e+00 1.744560e-01 - 3.273140e+00 2.807261e-01 - - - 7.581164e+01 6.821491e-02 - 1.996358e+01 3.250123e-01 - 6.405919e+00 5.573717e-01 - 2.065585e+00 3.151559e-01 - - - - - - 0 1 0.000000e+00 3.600000e+01 - 0 1 2.145475e+02 -2.826330e+01 - 0 1 6.235092e+00 -9.041888e+00 - 0 1 1.188715e+00 -2.324406e+00 - 0 2 1.651103e+03 -1.240581e+02 - 0 2 3.756033e+01 -8.501762e+01 - 0 2 1.109095e+00 -1.197530e+00 - - - - 6.790279e+04 1.776520e-02 - 7.040326e+03 1.213420e-01 - 1.375403e+03 4.355878e-01 - 3.558255e+02 5.502616e-01 - 6.425357e+01 3.199124e-02 - 2.748527e+01 2.311087e-02 - 5.134544e+01 7.307106e-03 - - - 1.947782e+03 2.528844e-02 - 4.116454e+02 1.730932e-01 - 1.247747e+02 4.930022e-01 - 4.365494e+01 4.465301e-01 - 1.960851e+01 2.358726e-02 - 8.108029e+00 3.359207e-02 - 3.481304e+00 6.952704e-03 - - - 6.790279e+04 6.598182e-03 - 7.040326e+03 4.506770e-02 - 1.375403e+03 1.617819e-01 - 3.558255e+02 2.043730e-01 - 5.903032e+02 9.628463e-02 - 5.134544e+01 4.984940e-03 - 1.653841e+00 3.480653e-03 - 7.005751e-01 1.419582e-03 - - - 6.790279e+04 2.934135e-03 - 7.040326e+03 2.004108e-02 - 1.375403e+03 7.194251e-02 - 3.558255e+02 9.088226e-02 - 5.903032e+02 5.042911e-02 - 8.699199e+00 9.757823e-01 - 3.848173e+00 3.049227e-01 - 1.653841e+00 2.811371e-03 - 7.005751e-01 1.146616e-03 - - - 1.947782e+03 1.278307e-02 - 4.116454e+02 8.749703e-02 - 1.247747e+02 2.492081e-01 - 4.365494e+01 2.257169e-01 - - - 6.790279e+04 1.262043e-03 - 7.040326e+03 8.620157e-03 - 1.375403e+03 3.094423e-02 - 3.558255e+02 3.909067e-02 - 5.903032e+02 2.245986e-02 - 8.699199e+00 5.597291e-01 - 3.848173e+00 1.749100e-01 - 7.641793e+00 3.797049e-01 - - - 1.947782e+03 5.343462e-03 - 4.116454e+02 3.657470e-02 - 1.247747e+02 1.041717e-01 - 4.365494e+01 9.435208e-02 - 2.669398e+00 5.428550e-01 - 1.153922e+00 5.887788e-01 - 4.695989e-01 1.298705e-01 - - - 1.811900e+02 4.897803e-02 - 4.931153e+01 2.695238e-01 - 1.686080e+01 5.470622e-01 - 6.106148e+00 3.504625e-01 - 4.088039e+00 6.580949e-03 - 1.359836e+00 1.290444e-02 - 4.219564e-01 7.129024e-03 - - - - - - 0 1 0.000000e+00 3.600000e+01 - 0 1 2.399380e+02 -2.926862e+01 - 0 1 6.880170e+00 -8.988872e+00 - 0 1 1.333055e+00 -2.497620e+00 - 0 2 3.158649e+03 -8.867078e+01 - 0 2 4.206145e+01 -9.076272e+01 - 0 2 1.235161e+00 -1.257930e+00 - - - - 7.266615e+04 1.773963e-02 - 7.458577e+03 1.207515e-01 - 1.448048e+03 4.345224e-01 - 3.731342e+02 5.520353e-01 - 6.745249e+01 3.228038e-02 - 2.888902e+01 2.349413e-02 - 5.396235e+01 7.371557e-03 - - - 2.041792e+03 2.532196e-02 - 4.307275e+02 1.732810e-01 - 1.304436e+02 4.936558e-01 - 4.558117e+01 4.470731e-01 - 2.063008e+01 2.258027e-02 - 8.539518e+00 3.189178e-02 - 3.661291e+00 6.454050e-03 - - - 7.266615e+04 6.610922e-03 - 7.458577e+03 4.499975e-02 - 1.448048e+03 1.619309e-01 - 3.731342e+02 2.057237e-01 - 6.206207e+02 9.546550e-02 - 5.396235e+01 5.048381e-03 - 1.777042e+00 3.480766e-03 - 7.657393e-01 1.397729e-03 - - - 7.266615e+04 2.953586e-03 - 7.458577e+03 2.010470e-02 - 1.448048e+03 7.234645e-02 - 3.731342e+02 9.191194e-02 - 6.206207e+02 5.025423e-02 - 9.164452e+00 9.818402e-01 - 4.048987e+00 3.010621e-01 - 1.777042e+00 2.619555e-03 - 7.657393e-01 1.051903e-03 - - - 2.041792e+03 1.288245e-02 - 4.307275e+02 8.815608e-02 - 1.304436e+02 2.511456e-01 - 4.558117e+01 2.274468e-01 - - - 7.266615e+04 1.287268e-03 - 7.458577e+03 8.762279e-03 - 1.448048e+03 3.153092e-02 - 3.731342e+02 4.005820e-02 - 6.206207e+02 2.268724e-02 - 9.164452e+00 5.728315e-01 - 4.048987e+00 1.756476e-01 - 8.116065e+00 3.870636e-01 - - - 2.041792e+03 5.483335e-03 - 4.307275e+02 3.752308e-02 - 1.304436e+02 1.068985e-01 - 4.558117e+01 9.681130e-02 - 2.865541e+00 5.502444e-01 - 1.251380e+00 5.916674e-01 - 5.173573e-01 1.234323e-01 - - - 1.930010e+02 4.796829e-02 - 5.260605e+01 2.662139e-01 - 1.804452e+01 5.459717e-01 - 6.570293e+00 3.529913e-01 - 4.538816e+00 6.742746e-03 - 1.550296e+00 1.352712e-02 - 5.002391e-01 7.274215e-03 - - - - - - 0 1 0.000000e+00 3.600000e+01 - 0 1 2.668636e+02 -2.992093e+01 - 0 1 7.495168e+00 -8.938023e+00 - 0 1 1.055974e+00 -2.029444e+00 - 0 2 3.415451e+03 -1.350729e+02 - 0 2 4.547132e+01 -1.172562e+02 - 0 2 1.922978e+00 -1.335315e+00 - - - - 7.772952e+04 1.771776e-02 - 7.897737e+03 1.201668e-01 - 1.523595e+03 4.334453e-01 - 3.910089e+02 5.538159e-01 - 7.085474e+01 3.246281e-02 - 3.046331e+01 2.397554e-02 - 5.667781e+01 7.422703e-03 - - - 2.140155e+03 2.533108e-02 - 4.506338e+02 1.733219e-01 - 1.363488e+02 4.940944e-01 - 4.758959e+01 4.477572e-01 - 2.168046e+01 2.173861e-02 - 8.984165e+00 3.046358e-02 - 3.846385e+00 6.039136e-03 - - - 7.772952e+04 6.625106e-03 - 7.897737e+03 4.493334e-02 - 1.523595e+03 1.620758e-01 - 3.910089e+02 2.070854e-01 - 6.518766e+02 9.464965e-02 - 5.667781e+01 5.357000e-03 - 1.904156e+00 4.035483e-03 - 8.320664e-01 1.581948e-03 - - - 7.772952e+04 2.973234e-03 - 7.897737e+03 2.016531e-02 - 1.523595e+03 7.273685e-02 - 3.910089e+02 9.293637e-02 - 6.518766e+02 5.007031e-02 - 9.642199e+00 9.870342e-01 - 4.255994e+00 2.974771e-01 - 1.904156e+00 2.407143e-03 - 8.320664e-01 9.436232e-04 - - - 2.140155e+03 1.296613e-02 - 4.506338e+02 8.871763e-02 - 1.363488e+02 2.529102e-01 - 4.758959e+01 2.291918e-01 - - - 7.772952e+04 1.312356e-03 - 7.897737e+03 8.900766e-03 - 1.523595e+03 3.210532e-02 - 3.910089e+02 4.102118e-02 - 6.518766e+02 2.290314e-02 - 9.642199e+00 5.853485e-01 - 4.255994e+00 1.764151e-01 - 8.607677e+00 3.944439e-01 - - - 2.140155e+03 5.615018e-03 - 4.506338e+02 3.841943e-02 - 1.363488e+02 1.095235e-01 - 4.758959e+01 9.925217e-02 - 3.067791e+00 5.586107e-01 - 1.352145e+00 5.942375e-01 - 5.650612e-01 1.167132e-01 - - - 1.880339e+02 5.516419e-02 - 5.103533e+01 2.954908e-01 - 1.734697e+01 5.665716e-01 - 6.166323e+00 3.105956e-01 - 5.027724e+00 7.767543e-04 - 1.779129e+00 1.617500e-03 - 5.881318e-01 8.672809e-04 - - - - - - 0 1 0.000000e+00 3.600000e+01 - 0 1 2.429654e+02 -3.430523e+01 - 0 1 2.063113e+00 -4.148315e+00 - 0 1 9.080743e-01 -8.581169e-01 - 0 2 3.268975e+03 -4.428144e+02 - 0 2 4.255696e+01 -1.754604e+02 - 0 2 3.750702e+00 -5.647906e-01 - - - - 8.310434e+04 1.770100e-02 - 8.358395e+03 1.195938e-01 - 1.602101e+03 4.323621e-01 - 4.094573e+02 5.555928e-01 - 7.427984e+01 3.275256e-02 - 3.197229e+01 2.438902e-02 - 5.947033e+01 7.489354e-03 - - - 2.242920e+03 2.531963e-02 - 4.713680e+02 1.732369e-01 - 1.424906e+02 4.943444e-01 - 4.968056e+01 4.485601e-01 - 2.275951e+01 2.104678e-02 - 9.440646e+00 2.927810e-02 - 4.034581e+00 5.689717e-03 - - - 8.310434e+04 6.640886e-03 - 8.358395e+03 4.486803e-02 - 1.602101e+03 1.622093e-01 - 4.094573e+02 2.084418e-01 - 6.845819e+02 9.378192e-02 - 5.947033e+01 5.426753e-03 - 2.035795e+00 4.059384e-03 - 8.998324e-01 1.545840e-03 - - - 8.310434e+04 2.993153e-03 - 8.358395e+03 2.022274e-02 - 1.602101e+03 7.311033e-02 - 4.094573e+02 9.394805e-02 - 6.845819e+02 4.984210e-02 - 1.013791e+01 9.923610e-01 - 4.468113e+00 2.942143e-01 - 2.035795e+00 2.144044e-03 - 8.998324e-01 8.164662e-04 - - - 2.242920e+03 1.303596e-02 - 4.713680e+02 8.919199e-02 - 1.424906e+02 2.545160e-01 - 4.968056e+01 2.309437e-01 - - - 8.310434e+04 1.337247e-03 - 8.358395e+03 9.034881e-03 - 1.602101e+03 3.266339e-02 - 4.094573e+02 4.197303e-02 - 6.845819e+02 2.308636e-02 - 1.013791e+01 5.977351e-01 - 4.468113e+00 1.772160e-01 - 9.115573e+00 4.017739e-01 - - - 2.242920e+03 5.738007e-03 - 4.713680e+02 3.925944e-02 - 1.424906e+02 1.120297e-01 - 4.968056e+01 1.016540e-01 - 3.276480e+00 5.675947e-01 - 1.456225e+00 5.963576e-01 - 6.129979e-01 1.101295e-01 - - - 2.177113e+02 4.618225e-02 - 5.949579e+01 2.602803e-01 - 2.052317e+01 5.439398e-01 - 7.545045e+00 3.575382e-01 - 5.459859e+00 7.069627e-03 - 1.942199e+00 1.465446e-02 - 6.617277e-01 7.520586e-03 - - - - - - 0 1 0.000000e+00 3.600000e+01 - 0 1 2.720190e+02 -3.676569e+01 - 0 1 2.263086e+00 -3.842603e+00 - 0 1 1.053259e+00 -8.066965e-01 - 0 2 5.104624e+03 -3.495153e+02 - 0 2 4.031470e+01 -1.837709e+02 - 0 2 2.647569e+00 -3.277054e-01 - - - - 8.881194e+04 1.768881e-02 - 8.841808e+03 1.190303e-01 - 1.683700e+03 4.312702e-01 - 4.284975e+02 5.573705e-01 - 7.782165e+01 3.304250e-02 - 3.353386e+01 2.481793e-02 - 6.235374e+01 7.557020e-03 - - - 2.349964e+03 2.529389e-02 - 4.928960e+02 1.730624e-01 - 1.488570e+02 4.944575e-01 - 5.184959e+01 4.494301e-01 - 2.386824e+01 2.047717e-02 - 9.909558e+00 2.829034e-02 - 4.226890e+00 5.394690e-03 - - - 8.881194e+04 6.658291e-03 - 8.841808e+03 4.480449e-02 - 1.683700e+03 1.623355e-01 - 4.284975e+02 2.098013e-01 - 7.185638e+02 9.289105e-02 - 6.235374e+01 5.499755e-03 - 2.171925e+00 4.096793e-03 - 9.685845e-01 1.509237e-03 - - - 8.881194e+04 3.013393e-03 - 8.841808e+03 2.027751e-02 - 1.683700e+03 7.346942e-02 - 4.284975e+02 9.495135e-02 - 7.185638e+02 4.958847e-02 - 1.064916e+01 9.973573e-01 - 4.685949e+00 2.912147e-01 - 2.171925e+00 1.842732e-03 - 9.685845e-01 6.788531e-04 - - - 2.349964e+03 1.309519e-02 - 4.928960e+02 8.959812e-02 - 1.488570e+02 2.559913e-01 - 5.184959e+01 2.326796e-01 - - - 8.881194e+04 1.361861e-03 - 8.841808e+03 9.164141e-03 - 1.683700e+03 3.320349e-02 - 4.284975e+02 4.291195e-02 - 7.185638e+02 2.324459e-02 - 1.064916e+01 6.097033e-01 - 4.685949e+00 1.780250e-01 - 9.640530e+00 4.089963e-01 - - - 2.349964e+03 5.853232e-03 - 4.928960e+02 4.004817e-02 - 1.488570e+02 1.144219e-01 - 5.184959e+01 1.040021e-01 - 3.491920e+00 5.769315e-01 - 1.563864e+00 5.979902e-01 - 6.612446e-01 1.039140e-01 - - - 2.096282e+02 5.407733e-02 - 5.701584e+01 2.928344e-01 - 1.947108e+01 5.672906e-01 - 6.972525e+00 3.107734e-01 - 6.042350e+00 6.770240e-04 - 2.215766e+00 1.489093e-03 - 7.632974e-01 7.759726e-04 - - - - - - 0 1 0.000000e+00 3.600000e+01 - 0 1 2.576660e+02 -3.538898e+01 - 0 1 2.189311e+00 -3.358263e+00 - 0 1 9.959189e-01 -6.816075e-01 - 0 2 3.971828e+03 -6.373092e+02 - 0 2 4.114562e+01 -1.951533e+02 - 0 2 3.698646e+00 -3.377956e-01 - - - - 9.487214e+04 1.768122e-02 - 9.349124e+03 1.184763e-01 - 1.768512e+03 4.301696e-01 - 4.481476e+02 5.591477e-01 - 8.148399e+01 3.333339e-02 - 3.514965e+01 2.526344e-02 - 6.533041e+01 7.625927e-03 - - - 2.501286e+03 2.463870e-02 - 5.235308e+02 1.692299e-01 - 1.580152e+02 4.890454e-01 - 5.507622e+01 4.561658e-01 - 2.510059e+01 2.225373e-02 - 1.043497e+01 3.103876e-02 - 4.447579e+00 5.880920e-03 - - - 9.487214e+04 6.677363e-03 - 9.349124e+03 4.474291e-02 - 1.768512e+03 1.624548e-01 - 4.481476e+02 2.111638e-01 - 7.538748e+02 9.197723e-02 - 6.533041e+01 5.576147e-03 - 2.312876e+00 4.145291e-03 - 1.038420e+00 1.473910e-03 - - - 9.487214e+04 3.033999e-03 - 9.349124e+03 2.032987e-02 - 1.768512e+03 7.381473e-02 - 4.481476e+02 9.594665e-02 - 7.538748e+02 4.931003e-02 - 1.117613e+01 1.002040e+00 - 4.909653e+00 2.884592e-01 - 2.312876e+00 1.504520e-03 - 1.038420e+00 5.349510e-04 - - - 2.501286e+03 1.282336e-02 - 5.235308e+02 8.807674e-02 - 1.580152e+02 2.545266e-01 - 5.507622e+01 2.374142e-01 - - - 9.487214e+04 1.386184e-03 - 9.349124e+03 9.288381e-03 - 1.768512e+03 3.372472e-02 - 4.481476e+02 4.383643e-02 - 7.538748e+02 2.337702e-02 - 1.117613e+01 6.212373e-01 - 4.909653e+00 1.788368e-01 - 1.018270e+01 4.160800e-01 - - - 2.501286e+03 5.815405e-03 - 5.235308e+02 3.994288e-02 - 1.580152e+02 1.154280e-01 - 5.507622e+01 1.076676e-01 - 3.723646e+00 5.840232e-01 - 1.680574e+00 6.006810e-01 - 7.131027e-01 9.949652e-02 - - - 2.438967e+02 4.465139e-02 - 6.679120e+01 2.551094e-01 - 2.315135e+01 5.420927e-01 - 8.582120e+00 3.615153e-01 - 6.419499e+00 7.378972e-03 - 2.354200e+00 1.564342e-02 - 8.317158e-01 7.720316e-03 - - - - - - 0 1 0.000000e+00 4.800000e+01 - 0 1 4.418373e+02 -7.390764e+00 - 0 1 1.035219e+01 -1.743794e+01 - 0 1 1.692241e+00 -9.019157e+00 - 0 2 8.654932e+02 -7.842653e+02 - 0 2 9.280596e+01 -9.552911e+01 - 0 2 5.295508e-01 -1.352907e+00 - - - - 1.009176e+05 1.774244e-02 - 9.844100e+03 1.183708e-01 - 1.849438e+03 4.304124e-01 - 4.666344e+02 5.595855e-01 - 8.548912e+01 3.283032e-02 - 3.686122e+01 2.531609e-02 - 7.183215e+01 7.341386e-03 - - - 2.622068e+03 2.454877e-02 - 5.476712e+02 1.686664e-01 - 1.651321e+02 4.885798e-01 - 5.749730e+01 4.577832e-01 - 2.488532e+01 2.535362e-02 - 9.566524e+00 3.045200e-02 - - - 1.009176e+05 6.723811e-03 - 9.844100e+03 4.485869e-02 - 1.849438e+03 1.631124e-01 - 4.666344e+02 2.120648e-01 - 7.886446e+02 9.121970e-02 - 7.183215e+01 5.335173e-03 - 1.950479e+00 3.551284e-03 - - - 1.009176e+05 3.089298e-03 - 9.844100e+03 2.061061e-02 - 1.849438e+03 7.494302e-02 - 4.666344e+02 9.743451e-02 - 7.886446e+02 4.798006e-02 - 1.039584e+01 1.222086e+00 - 1.950479e+00 8.737503e-02 - 2.172664e+00 9.018310e-03 - - - 2.622068e+03 1.281975e-02 - 5.476712e+02 8.808026e-02 - 1.651321e+02 2.551440e-01 - 5.749730e+01 2.390616e-01 - 4.809538e-01 7.494866e-03 - 1.633000e-01 6.217486e-03 - - - 1.009176e+05 1.391221e-03 - 9.844100e+03 9.281691e-03 - 1.849438e+03 3.374950e-02 - 4.666344e+02 4.387822e-02 - 7.886446e+02 2.627042e-02 - 1.039584e+01 6.546047e-01 - 1.233037e+01 4.443163e-01 - 2.172664e+00 1.660082e-02 - - - 1.009176e+05 5.351154e-04 - 9.844100e+03 3.570085e-03 - 1.849438e+03 1.298132e-02 - 4.666344e+02 1.687720e-02 - 7.886446e+02 9.131888e-03 - 1.039584e+01 2.997215e-01 - 1.233037e+01 1.887165e-01 - 3.439283e-01 9.534798e-01 - 1.443567e-01 3.059850e-01 - - - 2.622068e+03 5.884360e-03 - 5.476712e+02 4.042948e-02 - 1.651321e+02 1.171130e-01 - 5.749730e+01 1.097310e-01 - 3.756752e+00 6.734913e-01 - 1.502927e+00 5.673248e-01 - 4.809538e-01 1.149766e-02 - 1.633000e-01 9.538066e-03 - - - 2.575297e+02 1.919204e-02 - 7.058664e+01 1.103332e-01 - 2.451981e+01 2.362293e-01 - 9.123165e+00 1.585533e-01 - - - 2.575297e+02 4.397336e-02 - 7.058664e+01 2.527986e-01 - 2.451981e+01 5.412554e-01 - 9.123165e+00 3.632818e-01 - 6.952956e+00 7.426077e-03 - 2.591209e+00 1.600456e-02 - 9.343775e-01 7.907209e-03 - - - - - - 0 1 0.000000e+00 4.800000e+01 - 0 1 4.239742e+02 -6.958587e+00 - 0 1 1.033137e+01 -1.610109e+01 - 0 1 1.704769e+00 -8.650936e+00 - 0 2 8.479779e+02 -8.000354e+02 - 0 2 9.325344e+01 -9.308317e+01 - 0 2 5.295500e-01 -1.376229e+00 - - - - 1.077089e+05 1.774558e-02 - 1.039961e+04 1.178455e-01 - 1.940478e+03 4.293305e-01 - 4.874210e+02 5.613372e-01 - 8.943074e+01 3.309324e-02 - 3.860205e+01 2.578581e-02 - 7.505492e+01 7.418349e-03 - - - 2.753935e+03 2.438246e-02 - 5.739820e+02 1.676586e-01 - 1.729309e+02 4.872197e-01 - 6.034045e+01 4.577277e-01 - 2.613393e+01 2.714764e-02 - 1.011833e+01 3.325257e-02 - - - 1.077089e+05 6.747071e-03 - 1.039961e+04 4.480620e-02 - 1.940478e+03 1.632363e-01 - 4.874210e+02 2.134268e-01 - 8.266035e+02 9.027008e-02 - 7.505492e+01 5.438905e-03 - 2.091223e+00 3.565554e-03 - - - 1.077089e+05 3.110860e-03 - 1.039961e+04 2.065872e-02 - 1.940478e+03 7.526308e-02 - 4.874210e+02 9.840430e-02 - 8.266035e+02 4.768257e-02 - 1.092449e+01 1.223205e+00 - 2.091223e+00 8.853101e-02 - 2.328715e+00 9.139834e-03 - - - 2.753935e+03 1.278409e-02 - 5.739820e+02 8.790595e-02 - 1.729309e+02 2.554566e-01 - 6.034045e+01 2.399935e-01 - 5.478717e-01 7.140049e-03 - 1.958695e-01 5.442036e-03 - - - 1.077089e+05 1.417181e-03 - 1.039961e+04 9.411271e-03 - 1.940478e+03 3.428680e-02 - 4.874210e+02 4.482900e-02 - 8.266035e+02 2.622452e-02 - 1.092449e+01 6.696110e-01 - 1.293764e+01 4.472684e-01 - 2.328715e+00 1.806428e-02 - - - 1.077089e+05 5.707487e-04 - 1.039961e+04 3.790250e-03 - 1.940478e+03 1.380850e-02 - 4.874210e+02 1.805421e-02 - 8.266035e+02 9.541499e-03 - 1.092449e+01 3.214358e-01 - 1.293764e+01 2.015345e-01 - 3.911176e-01 1.003898e+00 - 1.703696e-01 2.809982e-01 - - - 2.753935e+03 5.944570e-03 - 5.739820e+02 4.087604e-02 - 1.729309e+02 1.187867e-01 - 6.034045e+01 1.115964e-01 - 4.032446e+00 6.693907e-01 - 1.633220e+00 5.750905e-01 - 5.478717e-01 1.248044e-02 - 1.958695e-01 9.512402e-03 - - - 2.712525e+02 1.942862e-02 - 7.440013e+01 1.122994e-01 - 2.589187e+01 2.419585e-01 - 9.665031e+00 1.629869e-01 - - - 2.712525e+02 4.342654e-02 - 7.440013e+01 2.510098e-01 - 2.589187e+01 5.408217e-01 - 9.665031e+00 3.643056e-01 - 7.510341e+00 7.387887e-03 - 2.841690e+00 1.619778e-02 - 1.044140e+00 8.039416e-03 - - - - - - 0 1 0.000000e+00 6.800000e+01 - 0 1 3.298244e+02 -3.663140e+01 - 0 1 6.214575e+00 -1.698065e+01 - 0 1 3.181997e+00 -7.160325e+00 - 0 2 6.562251e+03 -6.620930e+03 - 0 2 6.903256e+01 -2.486635e+02 - 0 2 1.052477e+00 -2.860910e+00 - - - - 5.036713e+05 1.957831e-02 - 3.856487e+04 1.086627e-01 - 5.904381e+03 3.991082e-01 - 1.289249e+03 6.032374e-01 - 2.558320e+02 3.865044e-02 - 1.104903e+02 4.758163e-02 - 1.942904e+02 1.004381e-02 - - - 7.731113e+03 2.267175e-02 - 1.507506e+03 1.542949e-01 - 4.376697e+02 4.720559e-01 - 1.502123e+02 4.816205e-01 - 6.840685e+01 3.163158e-02 - 2.719751e+01 3.959489e-02 - - - 5.036713e+05 8.076128e-03 - 3.856487e+04 4.482377e-02 - 5.904381e+03 1.646337e-01 - 1.289249e+03 2.488377e-01 - 2.536357e+03 6.161120e-02 - 1.942904e+02 1.078298e-02 - 7.867014e+00 1.012349e-02 - 3.410552e+00 2.460003e-03 - - - 5.036713e+05 3.902105e-03 - 3.856487e+04 2.165729e-02 - 5.904381e+03 7.954527e-02 - 1.289249e+03 1.202297e-01 - 2.536357e+03 3.545812e-02 - 3.244588e+01 1.057109e+00 - 1.327227e+01 2.663563e-01 - 1.489370e+00 3.366259e-03 - 5.994629e-01 8.000617e-04 - - - 7.731113e+03 1.276944e-02 - 1.507506e+03 8.690371e-02 - 4.376697e+02 2.658766e-01 - 1.502123e+02 2.712637e-01 - 1.959124e+00 8.004960e-03 - 7.158242e-01 5.260924e-03 - - - 5.036713e+05 2.085825e-03 - 3.856487e+04 1.157666e-02 - 5.904381e+03 4.252001e-02 - 1.289249e+03 6.426743e-02 - 2.536357e+03 1.071725e-02 - 3.244588e+01 1.162042e+00 - 1.327227e+01 2.927960e-01 - 1.489370e+00 1.834061e-03 - 5.994629e-01 4.359030e-04 - - - 5.036713e+05 9.521953e-04 - 3.856487e+04 5.284833e-03 - 5.904381e+03 1.941071e-02 - 1.289249e+03 2.933858e-02 - 2.536357e+03 3.102355e-03 - 3.244588e+01 6.349639e-01 - 1.327227e+01 1.599898e-01 - 1.489370e+00 1.187720e+00 - 5.994629e-01 2.822865e-01 - - - 7.731113e+03 2.697149e-03 - 1.507506e+03 1.835573e-02 - 4.376697e+02 5.615823e-02 - 1.502123e+02 5.729608e-02 - 1.221030e+01 4.499210e-01 - 5.095106e+00 3.981692e-01 - - - 7.731113e+03 6.519048e-03 - 1.507506e+03 4.436605e-02 - 4.376697e+02 1.357352e-01 - 1.502123e+02 1.384854e-01 - 1.221030e+01 6.862869e-01 - 5.095106e+00 6.073474e-01 - 1.959124e+00 1.472472e-02 - 7.158242e-01 9.677202e-03 - - - 1.272994e+02 4.211776e-02 - 3.999141e+01 2.173766e-01 - 1.511232e+01 4.527266e-01 - 5.860638e+00 4.453532e-01 - 2.106195e+00 1.668768e-01 - - - 7.481043e+02 1.921276e-02 - 2.053677e+02 1.200997e-01 - 7.305338e+01 2.841247e-01 - 2.829822e+01 2.049424e-01 - - - 7.481043e+02 3.587156e-02 - 2.053677e+02 2.242345e-01 - 7.305338e+01 5.304805e-01 - 2.829822e+01 3.826418e-01 - 2.498019e+01 9.835162e-03 - 1.029172e+01 2.417978e-02 - 4.169595e+00 1.411766e-02 - - - - - - 0 1 0.000000e+00 6.800000e+01 - 0 1 3.345942e+02 -3.245518e+01 - 0 1 7.554156e+00 -1.764896e+01 - 0 1 3.201153e+00 -7.542026e+00 - 0 2 5.117577e+03 -6.901676e+03 - 0 2 6.583186e+01 -2.426514e+02 - 0 2 1.119148e+00 -2.686847e+00 - - - - 5.341441e+05 1.974472e-02 - 4.059137e+04 1.085520e-01 - 6.160331e+03 3.979800e-01 - 1.335977e+03 6.046208e-01 - 2.670142e+02 3.861109e-02 - 1.149689e+02 4.891774e-02 - 2.014949e+02 1.008361e-02 - - - 8.021998e+03 2.264351e-02 - 1.559323e+03 1.539134e-01 - 4.518366e+02 4.715735e-01 - 1.549029e+02 4.824037e-01 - 7.081715e+01 3.163589e-02 - 2.821050e+01 3.994888e-02 - - - 5.341441e+05 8.171424e-03 - 4.059137e+04 4.492462e-02 - 6.160331e+03 1.647054e-01 - 1.335977e+03 2.502245e-01 - 2.652756e+03 6.037324e-02 - 2.014949e+02 1.101182e-02 - 8.177380e+00 1.042723e-02 - 3.550598e+00 2.516978e-03 - - - 5.341441e+05 3.952489e-03 - 4.059137e+04 2.172988e-02 - 6.160331e+03 7.966743e-02 - 1.335977e+03 1.210327e-01 - 2.652756e+03 3.482429e-02 - 3.356452e+01 1.056428e+00 - 1.374057e+01 2.668860e-01 - 1.578173e+00 3.339576e-03 - 6.446766e-01 7.705908e-04 - - - 8.021998e+03 1.277572e-02 - 1.559323e+03 8.683968e-02 - 4.518366e+02 2.660671e-01 - 1.549029e+02 2.721776e-01 - 2.078785e+00 9.057867e-03 - 7.755449e-01 5.898782e-03 - - - 5.341441e+05 2.116369e-03 - 4.059137e+04 1.163531e-02 - 6.160331e+03 4.265810e-02 - 1.335977e+03 6.480722e-02 - 2.652756e+03 1.057343e-02 - 3.356452e+01 1.167056e+00 - 1.374057e+01 2.948342e-01 - 1.578173e+00 2.073523e-03 - 6.446766e-01 4.784553e-04 - - - 5.341441e+05 9.778673e-04 - 4.059137e+04 5.376090e-03 - 6.160331e+03 1.971016e-02 - 1.335977e+03 2.994415e-02 - 2.652756e+03 3.086386e-03 - 3.356452e+01 6.470368e-01 - 1.374057e+01 1.634613e-01 - 1.578173e+00 1.205839e+00 - 6.446766e-01 2.782415e-01 - - - 8.021998e+03 2.758740e-03 - 1.559323e+03 1.875182e-02 - 4.518366e+02 5.745350e-02 - 1.549029e+02 5.877298e-02 - 1.267788e+01 4.597806e-01 - 5.316224e+00 4.099928e-01 - - - 8.021998e+03 6.548585e-03 - 1.559323e+03 4.451232e-02 - 4.518366e+02 1.363808e-01 - 1.549029e+02 1.395129e-01 - 1.267788e+01 6.839064e-01 - 5.316224e+00 6.098490e-01 - 2.078785e+00 1.506723e-02 - 7.755449e-01 9.812276e-03 - - - 1.323809e+02 4.201447e-02 - 4.178515e+01 2.167005e-01 - 1.588522e+01 4.522038e-01 - 6.216465e+00 4.444109e-01 - 2.265790e+00 1.641702e-01 - - - 7.739088e+02 1.921431e-02 - 2.123687e+02 1.203716e-01 - 7.556823e+01 2.857639e-01 - 2.929984e+01 2.070114e-01 - - - 7.739088e+02 3.562056e-02 - 2.123687e+02 2.231517e-01 - 7.556823e+01 5.297651e-01 - 2.929984e+01 3.837692e-01 - 2.606878e+01 9.817937e-03 - 1.079897e+01 2.450247e-02 - 4.401687e+00 1.452283e-02 - - - - - - 0 1 0.000000e+00 6.800000e+01 - 0 1 3.532523e+02 -3.087336e+01 - 0 1 8.788539e+00 -1.862866e+01 - 0 1 3.130933e+00 -7.519923e+00 - 0 2 4.770345e+03 -7.110319e+03 - 0 2 6.002969e+01 -2.238539e+02 - 0 2 1.156867e+00 -2.405820e+00 - - - - 5.664029e+05 1.991978e-02 - 4.272825e+04 1.084627e-01 - 6.427628e+03 3.968563e-01 - 1.384302e+03 6.059809e-01 - 2.787654e+02 3.855249e-02 - 1.196200e+02 5.030315e-02 - 2.089484e+02 1.012059e-02 - - - 8.323227e+03 2.261280e-02 - 1.612743e+03 1.535115e-01 - 4.663912e+02 4.710569e-01 - 1.597001e+02 4.832781e-01 - 7.316488e+01 3.175420e-02 - 2.914382e+01 4.022383e-02 - - - 5.664029e+05 8.270370e-03 - 4.272825e+04 4.503196e-02 - 6.427628e+03 1.647683e-01 - 1.384302e+03 2.515934e-01 - 2.774629e+03 5.914958e-02 - 2.089484e+02 1.124416e-02 - 8.497441e+00 1.074335e-02 - 3.694375e+00 2.576774e-03 - - - 5.664029e+05 4.004475e-03 - 4.272825e+04 2.180427e-02 - 6.427628e+03 7.978004e-02 - 1.384302e+03 1.218204e-01 - 2.774629e+03 3.419788e-02 - 3.471407e+01 1.055621e+00 - 1.422432e+01 2.674770e-01 - 1.670083e+00 3.318727e-03 - 6.905768e-01 7.393068e-04 - - - 8.323227e+03 1.277915e-02 - 1.612743e+03 8.675373e-02 - 4.663912e+02 2.662078e-01 - 1.597001e+02 2.731143e-01 - 2.199622e+00 8.933002e-03 - 8.363468e-01 5.729860e-03 - - - 5.664029e+05 2.147802e-03 - 4.272825e+04 1.169473e-02 - 6.427628e+03 4.279006e-02 - 1.384302e+03 6.533842e-02 - 2.774629e+03 1.043350e-02 - 3.471407e+01 1.171893e+00 - 1.422432e+01 2.969383e-01 - 1.670083e+00 2.354879e-03 - 6.905768e-01 5.245921e-04 - - - 5.664029e+05 1.004063e-03 - 4.272825e+04 5.467098e-03 - 6.427628e+03 2.000367e-02 - 1.384302e+03 3.054466e-02 - 2.774629e+03 3.071493e-03 - 3.471407e+01 6.589934e-01 - 1.422432e+01 1.669781e-01 - 1.670083e+00 1.225433e+00 - 6.905768e-01 2.729875e-01 - - - 8.323227e+03 2.818922e-03 - 1.612743e+03 1.913680e-02 - 4.663912e+02 5.872215e-02 - 1.597001e+02 6.024565e-02 - 1.314259e+01 4.713673e-01 - 5.534688e+00 4.203565e-01 - - - 8.323227e+03 6.576158e-03 - 1.612743e+03 4.464354e-02 - 4.663912e+02 1.369907e-01 - 1.597001e+02 1.405448e-01 - 1.314259e+01 6.846582e-01 - 5.534688e+00 6.105653e-01 - 2.199622e+00 1.531727e-02 - 8.363468e-01 9.824892e-03 - - - 1.364453e+02 4.254383e-02 - 4.328779e+01 2.178868e-01 - 1.656258e+01 4.525507e-01 - 6.542936e+00 4.418362e-01 - 2.418853e+00 1.601334e-01 - - - 8.016838e+02 1.915052e-02 - 2.199102e+02 1.203145e-01 - 7.828421e+01 2.870394e-01 - 3.039040e+01 2.094645e-01 - - - 8.016838e+02 3.525897e-02 - 2.199102e+02 2.215170e-01 - 7.828421e+01 5.284824e-01 - 3.039040e+01 3.856553e-01 - 2.715512e+01 9.975382e-03 - 1.130529e+01 2.519320e-02 - 4.636159e+00 1.512790e-02 - - - - - - 0 1 0.000000e+00 6.800000e+01 - 0 1 3.761923e+02 -2.793928e+01 - 0 1 1.039236e+01 -1.934910e+01 - 0 1 3.111308e+00 -7.996979e+00 - 0 2 4.612183e+03 -7.631720e+03 - 0 2 5.543823e+01 -2.219538e+02 - 0 2 1.099238e+00 -1.550290e+00 - - - - 6.005359e+05 2.010310e-02 - 4.498041e+04 1.083926e-01 - 6.706596e+03 3.957331e-01 - 1.434233e+03 6.073169e-01 - 2.911599e+02 3.846977e-02 - 1.244600e+02 5.174752e-02 - 2.166603e+02 1.015525e-02 - - - 8.633443e+03 2.258652e-02 - 1.667493e+03 1.531295e-01 - 4.812575e+02 4.705597e-01 - 1.645937e+02 4.841025e-01 - 7.557288e+01 3.187815e-02 - 3.010295e+01 4.052008e-02 - - - 6.005359e+05 8.373678e-03 - 4.498041e+04 4.514948e-02 - 6.706596e+03 1.648373e-01 - 1.434233e+03 2.529697e-01 - 2.902707e+03 5.792081e-02 - 2.166603e+02 1.148299e-02 - 8.827412e+00 1.107537e-02 - 3.842130e+00 2.640433e-03 - - - 6.005359e+05 4.058625e-03 - 4.498041e+04 2.188343e-02 - 6.706596e+03 7.989475e-02 - 1.434233e+03 1.226115e-01 - 2.902707e+03 3.356623e-02 - 3.589477e+01 1.054692e+00 - 1.472367e+01 2.681120e-01 - 1.765559e+00 3.301523e-03 - 7.374273e-01 7.085223e-04 - - - 8.633443e+03 1.278445e-02 - 1.667493e+03 8.667454e-02 - 4.812575e+02 2.663467e-01 - 1.645937e+02 2.740123e-01 - 2.323357e+00 8.859667e-03 - 8.985772e-01 5.584725e-03 - - - 6.005359e+05 2.180211e-03 - 4.498041e+04 1.175534e-02 - 6.706596e+03 4.291784e-02 - 1.434233e+03 6.586441e-02 - 2.902707e+03 1.029230e-02 - 3.589477e+01 1.176550e+00 - 1.472367e+01 2.990894e-01 - 1.765559e+00 2.673176e-03 - 7.374273e-01 5.736761e-04 - - - 6.005359e+05 1.030740e-03 - 4.498041e+04 5.557579e-03 - 6.706596e+03 2.029030e-02 - 1.434233e+03 3.113876e-02 - 2.902707e+03 3.055656e-03 - 3.589477e+01 6.707732e-01 - 1.472367e+01 1.705165e-01 - 1.765559e+00 1.245654e+00 - 7.374273e-01 2.673232e-01 - - - 8.633443e+03 2.878185e-03 - 1.667493e+03 1.951319e-02 - 4.812575e+02 5.996310e-02 - 1.645937e+02 6.168886e-02 - 1.361899e+01 4.826986e-01 - 5.759339e+00 4.305844e-01 - - - 8.633443e+03 6.604338e-03 - 1.667493e+03 4.477534e-02 - 4.812575e+02 1.375925e-01 - 1.645937e+02 1.415524e-01 - 1.361899e+01 6.853055e-01 - 5.759339e+00 6.113170e-01 - 2.323357e+00 1.559451e-02 - 8.985772e-01 9.830062e-03 - - - 1.389815e+02 4.405980e-02 - 4.427568e+01 2.224518e-01 - 1.704614e+01 4.547399e-01 - 6.803365e+00 4.360428e-01 - 2.554046e+00 1.534935e-01 - - - 8.286368e+02 1.915156e-02 - 2.272032e+02 1.205647e-01 - 8.090108e+01 2.885980e-01 - 3.143327e+01 2.114702e-01 - - - 8.286368e+02 3.502436e-02 - 2.272032e+02 2.204886e-01 - 8.090108e+01 5.277877e-01 - 3.143327e+01 3.867364e-01 - 2.828874e+01 9.957523e-03 - 1.183466e+01 2.550149e-02 - 4.878431e+00 1.551388e-02 - - - - - - 0 1 0.000000e+00 6.800000e+01 - 0 1 3.926122e+02 -3.070002e+01 - 0 1 1.125226e+01 -1.855302e+01 - 0 1 3.700868e+00 -8.080579e+00 - 0 2 4.701506e+03 -7.515548e+03 - 0 2 4.529843e+01 -2.089813e+02 - 0 2 1.324535e+00 -2.208494e+00 - - - - 6.366627e+05 2.029520e-02 - 4.735586e+04 1.083430e-01 - 6.998004e+03 3.946125e-01 - 1.485869e+03 6.086274e-01 - 3.042431e+02 3.836574e-02 - 1.294960e+02 5.325298e-02 - 2.246464e+02 1.018374e-02 - - - 8.953691e+03 2.256167e-02 - 1.723751e+03 1.527500e-01 - 4.964799e+02 4.700584e-01 - 1.695920e+02 4.849299e-01 - 7.804048e+01 3.200251e-02 - 3.108457e+01 4.082515e-02 - - - 6.366627e+05 8.481292e-03 - 4.735586e+04 4.527617e-02 - 6.998004e+03 1.649072e-01 - 1.485869e+03 2.543433e-01 - 3.037215e+03 5.669577e-02 - 2.246464e+02 1.172300e-02 - 9.167218e+00 1.142172e-02 - 3.993346e+00 2.706977e-03 - - - 6.366627e+05 4.114772e-03 - 4.735586e+04 2.196613e-02 - 6.998004e+03 8.000616e-02 - 1.485869e+03 1.233969e-01 - 3.037215e+03 3.294287e-02 - 3.711120e+01 1.053523e+00 - 1.524462e+01 2.688838e-01 - 1.864578e+00 3.281989e-03 - 7.850906e-01 6.774653e-04 - - - 8.953691e+03 1.278998e-02 - 1.723751e+03 8.659245e-02 - 4.964799e+02 2.664713e-01 - 1.695920e+02 2.749018e-01 - 2.449806e+00 8.811177e-03 - 9.619672e-01 5.445738e-03 - - - 6.366627e+05 2.213493e-03 - 4.735586e+04 1.181641e-02 - 6.998004e+03 4.303836e-02 - 1.485869e+03 6.637987e-02 - 3.037215e+03 1.016001e-02 - 3.711120e+01 1.180870e+00 - 1.524462e+01 3.013857e-01 - 1.864578e+00 3.037380e-03 - 7.850906e-01 6.269733e-04 - - - 6.366627e+05 1.057776e-03 - 4.735586e+04 5.646788e-03 - 6.998004e+03 2.056702e-02 - 1.485869e+03 3.172138e-02 - 3.037215e+03 3.044346e-03 - 3.711120e+01 6.822283e-01 - 1.524462e+01 1.741207e-01 - 1.864578e+00 1.266285e+00 - 7.850906e-01 2.613856e-01 - - - 8.953691e+03 2.936096e-03 - 1.723751e+03 1.987835e-02 - 4.964799e+02 6.117174e-02 - 1.695920e+02 6.310706e-02 - 1.410623e+01 4.938638e-01 - 5.989433e+00 4.405756e-01 - - - 8.953691e+03 6.632285e-03 - 1.723751e+03 4.490279e-02 - 4.964799e+02 1.381795e-01 - 1.695920e+02 1.425512e-01 - 1.410623e+01 6.860229e-01 - 5.989433e+00 6.120006e-01 - 2.449806e+00 1.587999e-02 - 9.619672e-01 9.814612e-03 - - - 1.444920e+02 4.378587e-02 - 4.619546e+01 2.214108e-01 - 1.787265e+01 4.540671e-01 - 7.186670e+00 4.356253e-01 - 2.729331e+00 1.518893e-01 - - - 8.561902e+02 1.915068e-02 - 2.346489e+02 1.207967e-01 - 8.357131e+01 2.901104e-01 - 3.249777e+01 2.134552e-01 - - - 8.561902e+02 3.479403e-02 - 2.346489e+02 2.194702e-01 - 8.357131e+01 5.270888e-01 - 3.249777e+01 3.878173e-01 - 2.944780e+01 9.942086e-03 - 1.237653e+01 2.581128e-02 - 5.126437e+00 1.589788e-02 - - - - - - 0 1 0.000000e+00 6.800000e+01 - 0 1 5.599171e+02 -3.051871e+01 - 0 1 2.250929e+01 -2.337127e+01 - 0 1 3.456274e+00 -1.056940e+01 - 0 2 5.099139e+03 -6.572529e+03 - 0 2 4.497361e+01 -1.656966e+02 - 0 2 1.240549e+00 -1.181296e+00 - - - - 6.748933e+05 2.049634e-02 - 4.986148e+04 1.083145e-01 - 7.302420e+03 3.934954e-01 - 1.539262e+03 6.099120e-01 - 3.180612e+02 3.823758e-02 - 1.347343e+02 5.481627e-02 - 2.328756e+02 1.021127e-02 - - - 9.284304e+03 2.253826e-02 - 1.781558e+03 1.523732e-01 - 5.120667e+02 4.695532e-01 - 1.746969e+02 4.857599e-01 - 8.056918e+01 3.212732e-02 - 3.208910e+01 4.113894e-02 - - - 6.748933e+05 8.593323e-03 - 4.986148e+04 4.541206e-02 - 7.302420e+03 1.649774e-01 - 1.539262e+03 2.557125e-01 - 3.178288e+03 5.547729e-02 - 2.328756e+02 1.197033e-02 - 9.519502e+00 1.177833e-02 - 4.151486e+00 2.780972e-03 - - - 6.748933e+05 4.172600e-03 - 4.986148e+04 2.205042e-02 - 7.302420e+03 8.010691e-02 - 1.539262e+03 1.241645e-01 - 3.178288e+03 3.231804e-02 - 3.836433e+01 1.052108e+00 - 1.578896e+01 2.697879e-01 - 1.967190e+00 3.257334e-03 - 8.335464e-01 6.462859e-04 - - - 9.284304e+03 1.279577e-02 - 1.781558e+03 8.650765e-02 - 5.120667e+02 2.665820e-01 - 1.746969e+02 2.757831e-01 - 2.579154e+00 8.783177e-03 - 1.026515e+00 5.314652e-03 - - - 6.748933e+05 2.247749e-03 - 4.986148e+04 1.187840e-02 - 7.302420e+03 4.315301e-02 - 1.539262e+03 6.688651e-02 - 3.178288e+03 1.002687e-02 - 3.836433e+01 1.184923e+00 - 1.578896e+01 3.038451e-01 - 1.967190e+00 3.401957e-03 - 8.335464e-01 6.749805e-04 - - - 6.748933e+05 1.085198e-03 - 4.986148e+04 5.734809e-03 - 7.302420e+03 2.083398e-02 - 1.539262e+03 3.229235e-02 - 3.178288e+03 3.031745e-03 - 3.836433e+01 6.933854e-01 - 1.578896e+01 1.778021e-01 - 1.967190e+00 1.287010e+00 - 8.335464e-01 2.553550e-01 - - - 9.284304e+03 2.992507e-03 - 1.781558e+03 2.023127e-02 - 5.120667e+02 6.234469e-02 - 1.746969e+02 6.449653e-02 - 1.460451e+01 5.048266e-01 - 6.225015e+00 4.503100e-01 - - - 9.284304e+03 6.659986e-03 - 1.781558e+03 4.502579e-02 - 5.120667e+02 1.387515e-01 - 1.746969e+02 1.435405e-01 - 1.460451e+01 6.867955e-01 - 6.225015e+00 6.126280e-01 - 2.579154e+00 1.616953e-02 - 1.026515e+00 9.784097e-03 - - - 1.459621e+02 4.613231e-02 - 4.672784e+01 2.295318e-01 - 1.814779e+01 4.588101e-01 - 7.365236e+00 4.261785e-01 - 2.841600e+00 1.425553e-01 - - - 8.860628e+02 1.907747e-02 - 2.427296e+02 1.206621e-01 - 8.647772e+01 2.912118e-01 - 3.366670e+01 2.158706e-01 - - - 8.860628e+02 3.444229e-02 - 2.427296e+02 2.178422e-01 - 8.647772e+01 5.257511e-01 - 3.366670e+01 3.897307e-01 - 3.059515e+01 1.012055e-02 - 1.291376e+01 2.653624e-02 - 5.376237e+00 1.651825e-02 - - - - + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 2.718422000000e+00 -1.717586728164e+00 + 0 1 1.061906000000e+00 1.418564696154e-01 + + + + 7.105793e+02 2.009533e-03 + 1.034368e+02 1.482329e-02 + 2.443300e+01 6.640480e-02 + 7.308967e+00 1.990801e-01 + 2.506894e+00 3.819108e-01 + 9.438003e-01 3.884663e-01 + 3.709710e-01 1.099967e-01 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 5.188992000000e+00 -1.881929662069e+00 + 0 1 2.023980000000e+00 2.498997301900e-01 + + + + 1.311616e+03 1.969894e-03 + 1.913861e+02 1.451971e-02 + 4.527883e+01 6.534285e-02 + 1.359732e+01 1.982694e-01 + 4.719701e+00 3.835307e-01 + 1.817344e+00 3.845043e-01 + 7.340121e-01 1.096769e-01 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 1.603560000000e+01 -1.732294880810e+00 + 0 1 2.322329000000e+00 -1.596306790339e-01 + + + + 2.787867e+02 2.477011e-02 + 3.826330e+01 1.678633e-01 + 8.576375e+00 4.977570e-01 + 2.360978e+00 4.542732e-01 + 2.929847e-01 8.554471e-03 + 9.375142e-02 6.986010e-03 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 1.864605000000e+01 -1.461263274320e+00 + 0 1 3.512100000000e+00 -1.797988128353e-01 + + + + 4.090699e+02 2.446620e-02 + 5.616343e+01 1.667309e-01 + 1.263216e+01 4.985016e-01 + 3.495336e+00 4.533167e-01 + 4.607115e-01 9.069870e-03 + 1.436420e-01 7.456826e-03 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 2.763930000000e+01 -1.439667183297e+00 + 0 1 5.022100000000e+00 -2.157238444933e-01 + + + + 5.635094e+02 2.422667e-02 + 7.738753e+01 1.657101e-01 + 1.744855e+01 4.979887e-01 + 4.843508e+00 4.511053e-01 + 7.820957e+00 1.334650e-03 + 6.633018e-01 9.410938e-03 + 2.029459e-01 7.779541e-03 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 4.064864000000e+01 -1.652819174505e+00 + 0 1 5.175230000000e+00 -1.645265426926e-01 + + + + 7.432411e+02 2.413306e-02 + 1.020870e+02 1.655533e-01 + 2.305897e+01 4.996164e-01 + 6.416186e+00 4.517950e-01 + 9.065320e-01 9.761350e-03 + 2.740610e-01 7.992775e-03 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 5.202781000000e+01 -1.665079199433e+00 + 0 1 6.206354000000e+00 -1.570985856967e-01 + + + + 9.476157e+02 2.401760e-02 + 1.301841e+02 1.651131e-01 + 2.944885e+01 4.998040e-01 + 8.208941e+00 4.514980e-01 + 1.184390e+00 1.005990e-02 + 3.545967e-01 8.202500e-03 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 5.407668000000e+01 -1.431831248614e+00 + 0 1 7.612973000000e+00 -1.535941722588e-01 + + + + 99920 8.531738E-005 + 14960 0.00066368499 + 3399 0.0034900643 + 958.9 0.01455040251 + 311.2 0.05055672553 + 111.7 0.14259582815 + 43.32 0.30211383473 + 17.8 0.39679786984 + 7.503 0.21678101044 + 2.337 0.01994 + 0.9001 0.00011 + 0.3301 4E-005 + + + + + + 0 1 0.000000e+00 4.0000e+00 + 0 1 3.050656000000e+02 -2.897619271036e+00 + 0 1 1.464675000000e+01 -1.319215823237e+00 + 0 1 2.136867000000e+00 -9.287752652095e-01 + 0 2 4.718427000000e+02 7.960024651340e+01 + 0 2 2.052377000000e+02 -2.125749865373e+01 + 0 2 6.894609000000e-01 -3.994723288019e-01 + + 0 1 3.050656000000e+02 -2.897619271036e+00 + 0 1 1.464675000000e+01 -1.319215823237e+00 + 0 1 2.136867000000e+00 -9.287752652095e-01 + 0 2 4.718427000000e+02 7.960024651340e+01 + 0 2 2.052377000000e+02 -2.125749865373e+01 + 0 2 6.894609000000e-01 -3.994723288019e-01 + + + 1224000 5.0002E-006 + 183200 3.700149E-005 + 41700 0.00019600719 + 11810 0.00082702996 + 3853 0.00300310857 + 1391 0.00970335331 + 542.5 0.02823505071 + 224.9 0.07320884299 + 97.93 0.16290394607 + 44.31 0.28872274348 + 20.65 0.34685447335 + 9.729 0.20688894473 + 4.228 0.03277823685 + 1.969 -0.00073674573 + 0.889 0.00136977939 + 0.3964 -0.00016158574 + 0.06993 -0.00115 + 0.03289 0.00091 + 0.01612 -5E-005 + + + 1224000 -9.9987E-007 + 183200 -8.99764E-006 + 41700 -4.798447E-005 + 11810 -0.00020193348 + 3853 -0.00073575535 + 1391 -0.00238621128 + 542.5 -0.00704769949 + 224.9 -0.01878004233 + 97.93 -0.04460163068 + 44.31 -0.0897501665 + 20.65 -0.14291007325 + 9.729 -0.12429614602 + 4.228 0.0999639237 + 1.969 0.41705096717 + 0.889 0.4750436931 + 0.3964 0.16305746022 + 0.06993 0.01154 + 0.03289 -0.0112 + 0.01612 0.00067 + + + + + + 0 1 0.000000e+00 4.000000e+00 + 0 1 3.371815000000e+02 1.582036297230e+00 + 0 1 1.582292000000e+01 -1.120404892641e+00 + 0 1 2.309331000000e+00 -9.460018733114e-01 + 0 2 5.552475000000e+02 4.017354059378e+01 + 0 2 2.797939000000e+02 -7.998745241906e+01 + 0 2 7.681323000000e-01 -2.960128956124e-01 + + + + 327600 3.099666E-005 + 49050 0.00024096804 + 11150 0.00126682924 + 3152 0.0053332808 + 1025 0.0190743581 + 368.8 0.0587976508 + 143.2 0.15142998214 + 58.96 0.30065940292 + 25.4 0.38103803064 + 11.15 0.21349325238 + 4.004 0.02332448202 + 1.701 -0.00187005168 + 0.706 0.00129608952 + 0.141 0.00419 + 0.06808 -0.00269 + 0.03063 0.00015 + + + 327600 -7.96378E-006 + 49050 -6.073309E-005 + 11150 -0.00031959877 + 3152 -0.00134410902 + 1025 -0.0048845946 + 368.8 -0.01528900392 + 143.2 -0.04215638843 + 58.96 -0.09365015564 + 25.4 -0.16271372369 + 11.15 -0.12421029062 + 4.004 0.23459040783 + 1.701 0.57495678625 + 0.706 0.3333864325 + 0.141 0.03409 + 0.06808 -0.03002 + 0.03063 0.0017 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.316953e+02 -3.386013e+00 + 0 1 5.217324e+00 -6.046747e+00 + 0 1 2.331459e+00 -3.647381e-01 + 0 2 9.142273e+02 -1.140686e+02 + 0 2 2.077560e+02 -4.208050e+01 + 0 2 1.251080e+00 -3.349915e-01 + + + + 2.043808e+03 2.330614e-02 + 2.809367e+02 1.613919e-01 + 6.378912e+01 4.958434e-01 + 1.788862e+01 4.569062e-01 + 2.886838e+00 1.142757e-02 + 9.993500e-01 8.659862e-03 + + + 2.043808e+03 6.603905e-03 + 2.809367e+02 4.573118e-02 + 6.378912e+01 1.404996e-01 + 1.788862e+01 1.294666e-01 + 3.061927e+01 9.566236e-02 + + + 1.089621e+02 1.824312e-02 + 2.363035e+01 1.212105e-01 + 7.107732e+00 3.571781e-01 + 2.366064e+00 4.993906e-01 + 8.025018e-01 2.309303e-01 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.349863e+02 -3.320043e+00 + 0 1 4.335714e+00 -5.901880e+00 + 0 1 4.547902e+00 3.453667e-01 + 0 2 8.540638e+02 -1.218275e+02 + 0 2 2.119761e+02 -3.822756e+01 + 0 2 9.980917e-01 -3.460521e-01 + + + + 2.387957e+03 2.313729e-02 + 3.282802e+02 1.604502e-01 + 7.458612e+01 4.946216e-01 + 2.094412e+01 4.585802e-01 + 3.444621e+00 1.181110e-02 + 1.222284e+00 8.622046e-03 + + + 1.348228e+02 1.731180e-02 + 2.936148e+01 1.169748e-01 + 8.890635e+00 3.531863e-01 + 3.000349e+00 5.034634e-01 + 1.037602e+00 2.287471e-01 + + + 2.387957e+03 6.719179e-03 + 3.282802e+02 4.659548e-02 + 7.458612e+01 1.436404e-01 + 2.094412e+01 1.331738e-01 + 3.582222e+01 9.806896e-02 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.269965e+02 -2.738258e+00 + 0 1 5.125039e+00 -5.713482e+00 + 0 1 2.849041e+00 3.351582e-01 + 0 2 1.169129e+03 -7.823903e+01 + 0 2 1.843911e+02 -2.594858e+01 + 0 2 1.326776e+00 -2.364182e-01 + + + + 2.759337e+03 2.298844e-02 + 3.793730e+02 1.596162e-01 + 8.624196e+01 4.935288e-01 + 2.424595e+01 4.600765e-01 + 4.049327e+00 1.216849e-02 + 1.462091e+00 8.553915e-03 + + + 1.635738e+02 1.653283e-02 + 3.574204e+01 1.133241e-01 + 1.088147e+01 3.493311e-01 + 3.713289e+00 5.065666e-01 + 1.304009e+00 2.282030e-01 + + + 2.759337e+03 6.815474e-03 + 3.793730e+02 4.732204e-02 + 8.624196e+01 1.463184e-01 + 2.424595e+01 1.364007e-01 + 4.146794e+01 1.001408e-01 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.155917e+02 -3.620214e+00 + 0 1 5.971141e+00 -5.737309e+00 + 0 1 2.859090e+00 4.704707e-01 + 0 2 2.062680e+03 -3.776082e+01 + 0 2 1.487138e+02 -3.431947e+01 + 0 2 1.644010e+00 -2.288331e-01 + + + + 3.158033e+03 2.285572e-02 + 4.342273e+02 1.588694e-01 + 9.875946e+01 4.925416e-01 + 2.779522e+01 4.614278e-01 + 4.703444e+00 1.248984e-02 + 1.720138e+00 8.475957e-03 + + + 1.931031e+02 1.615636e-02 + 4.229557e+01 1.118467e-01 + 1.292618e+01 3.491943e-01 + 4.446308e+00 5.094185e-01 + 1.575364e+00 2.231922e-01 + + + 3.158033e+03 6.897386e-03 + 4.342273e+02 4.794350e-02 + 9.875946e+01 1.486389e-01 + 2.779522e+01 1.392494e-01 + 4.754841e+01 1.019635e-01 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.120543e+02 -2.654674e+00 + 0 1 6.860978e+00 -5.707226e+00 + 0 1 2.789429e+00 6.518503e-01 + 0 2 1.667526e+03 -3.516025e+01 + 0 2 1.070677e+02 -3.284686e+01 + 0 2 3.574553e+00 -9.898434e-01 + + + + 3.584292e+03 2.273479e-02 + 4.928774e+02 1.581851e-01 + 1.121465e+02 4.916240e-01 + 3.159387e+01 4.626829e-01 + 5.405644e+00 1.279159e-02 + 1.995106e+00 8.399245e-03 + + + 2.239078e+02 1.596166e-02 + 4.916041e+01 1.112272e-01 + 1.507759e+01 3.501497e-01 + 5.222262e+00 5.115647e-01 + 1.862470e+00 2.176059e-01 + + + 3.584292e+03 6.966199e-03 + 4.928774e+02 4.846974e-02 + 1.121465e+02 1.506392e-01 + 3.159387e+01 1.417713e-01 + 5.406610e+01 1.035544e-01 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.316953e+02 -9.029367e+00 + 0 1 5.217324e+00 -1.612466e+01 + 0 1 2.331459e+00 -9.726350e-01 + 0 2 9.142273e+02 -3.041829e+02 + 0 2 2.077560e+02 -1.122147e+02 + 0 2 1.251080e+00 -8.933106e-01 + + + + 2.043808e+03 2.330614e-02 + 2.809367e+02 1.613919e-01 + 6.378912e+01 4.958434e-01 + 1.788862e+01 4.569062e-01 + 2.886838e+00 1.142757e-02 + 9.993500e-01 8.659862e-03 + + + 1.089621e+02 1.824312e-02 + 2.363035e+01 1.212105e-01 + 7.107732e+00 3.571781e-01 + 2.366064e+00 4.993906e-01 + 8.025018e-01 2.309303e-01 + + + 2.043808e+03 6.603905e-03 + 2.809367e+02 4.573118e-02 + 6.378912e+01 1.404996e-01 + 1.788862e+01 1.294666e-01 + 3.061927e+01 9.566236e-02 + + + + + + 0 1 0.000000e+00 1.200000e+01 + 0 1 1.165002e+02 -6.815450e+00 + 0 1 8.900975e+00 -5.215410e+00 + 0 1 3.035128e-01 -1.866213e-01 + 0 2 1.887663e+03 -1.595243e+02 + 0 2 1.854639e+02 -5.261246e+01 + 0 2 1.596409e+00 -3.662524e+00 + + + + 4.734263e+03 2.216103e-03 + 6.514608e+02 1.553145e-02 + 1.484022e+02 4.954343e-02 + 4.196838e+01 5.035876e-02 + 6.816142e+01 4.017761e-02 + 6.770286e-01 7.829351e-01 + 2.602544e-01 4.122532e-01 + + + 4.734263e+03 2.126296e-02 + 6.514608e+02 1.490203e-01 + 1.484022e+02 4.753568e-01 + 4.196838e+01 4.831797e-01 + 7.097100e+00 1.941763e-02 + 2.791745e+00 1.356118e-02 + 4.663554e+00 4.197652e-03 + + + 1.735091e+02 3.641247e-02 + 3.760621e+01 2.230816e-01 + 1.115757e+01 5.296130e-01 + 3.680917e+00 3.941468e-01 + 1.439472e+00 6.592606e-03 + 5.215131e-01 1.100807e-02 + 1.902026e-01 4.409938e-03 + + + 4.734263e+03 6.686011e-03 + 6.514608e+02 4.685857e-02 + 1.484022e+02 1.494731e-01 + 4.196838e+01 1.519330e-01 + 6.816142e+01 1.061468e-01 + 4.663554e+00 2.218768e-03 + + + + + + 0 1 0.000000e+00 1.200000e+01 + 0 1 1.267215e+02 -6.552351e+00 + 0 1 9.963899e+00 -4.778063e+00 + 0 1 3.241862e-01 -1.760750e-01 + 0 2 1.502502e+03 -1.925403e+02 + 0 2 2.020013e+02 -5.803146e+01 + 0 2 1.617474e+00 -3.299848e+00 + + + + 5.269373e+03 2.335822e-03 + 7.251419e+02 1.638271e-02 + 1.652354e+02 5.236452e-02 + 4.676625e+01 5.344078e-02 + 7.592187e+01 4.269463e-02 + 8.076661e-01 8.100857e-01 + 3.256016e-01 3.956857e-01 + + + 5.269373e+03 2.116644e-02 + 7.251419e+02 1.484547e-01 + 1.652354e+02 4.745100e-01 + 4.676625e+01 4.842626e-01 + 7.983490e+00 1.968437e-02 + 3.169474e+00 1.355669e-02 + 5.360188e+00 4.184384e-03 + + + 1.986128e+02 3.537530e-02 + 4.314738e+01 2.190453e-01 + 1.286298e+01 5.275969e-01 + 4.278264e+00 3.976240e-01 + 1.712917e+00 7.288671e-03 + 6.380574e-01 1.177173e-02 + 2.397383e-01 4.039566e-03 + + + 5.269373e+03 6.728304e-03 + 7.251419e+02 4.719017e-02 + 1.652354e+02 1.508353e-01 + 4.676625e+01 1.539355e-01 + 7.592187e+01 1.073839e-01 + 5.360188e+00 2.391065e-03 + + + + + + 0 1 0.000000e+00 1.800000e+01 + 0 1 1.419617e+02 -1.011094e+01 + 0 1 6.981494e+00 -4.972984e+00 + 0 1 1.459222e+00 -1.658636e+00 + 0 2 9.030206e+02 -9.733987e+01 + 0 2 6.042702e+01 -6.438824e+01 + 0 2 1.538846e+00 -7.874682e-01 + + + + 1.753258e+04 2.552036e-03 + 2.141321e+03 1.798133e-02 + 4.590901e+02 6.105938e-02 + 1.256613e+02 6.916771e-02 + 2.041631e+02 4.757103e-02 + 2.668048e+00 8.122274e-01 + 1.067967e+00 4.208331e-01 + 1.586098e-01 3.207152e-03 + 5.313909e-02 1.093893e-03 + + + 1.753258e+04 1.905672e-02 + 2.141321e+03 1.342713e-01 + 4.590901e+02 4.559463e-01 + 1.256613e+02 5.164933e-01 + 2.211365e+01 2.596770e-02 + 9.055300e+00 1.693821e-02 + 1.691566e+01 5.533978e-03 + + + 5.897572e+02 1.315674e-02 + 1.274100e+02 8.568570e-02 + 3.858081e+01 2.194940e-01 + 1.319410e+01 1.678596e-01 + + + 5.897572e+02 3.154579e-02 + 1.274100e+02 2.054478e-01 + 3.858081e+01 5.262790e-01 + 1.319410e+01 4.024755e-01 + 6.040503e+00 9.503667e-03 + 2.285194e+00 1.448962e-02 + 8.785018e-01 5.294503e-03 + + + 1.753258e+04 6.598478e-03 + 2.141321e+03 4.649206e-02 + 4.590901e+02 1.578735e-01 + 1.256613e+02 1.788382e-01 + 2.041631e+02 1.059212e-01 + 1.691566e+01 2.972671e-03 + 1.586098e-01 1.394275e-03 + 5.313909e-02 4.755583e-04 + + + + + + 0 1 0.000000e+00 1.800000e+01 + 0 1 1.274682e+02 -9.018011e+00 + 0 1 7.957019e+00 -5.122292e+00 + 0 1 1.637895e+00 -1.644804e+00 + 0 2 7.395817e+02 -1.629970e+02 + 0 2 5.924678e+01 -5.269001e+01 + 0 2 1.505617e+00 -7.954904e-01 + + + + 1.906556e+04 2.579178e-03 + 2.310581e+03 1.816386e-02 + 4.933572e+02 6.187404e-02 + 1.347287e+02 7.045750e-02 + 2.190805e+02 4.804061e-02 + 2.899252e+00 8.178377e-01 + 1.182388e+00 4.172929e-01 + 1.997604e-01 3.366036e-03 + 6.722313e-02 1.047392e-03 + + + 1.906556e+04 1.896751e-02 + 2.310581e+03 1.335787e-01 + 4.933572e+02 4.550274e-01 + 1.347287e+02 5.181510e-01 + 2.379342e+01 2.617004e-02 + 9.774380e+00 1.714604e-02 + 1.826867e+01 5.545111e-03 + + + 6.387863e+02 1.319476e-02 + 1.379239e+02 8.625880e-02 + 4.179844e+01 2.223490e-01 + 1.432062e+01 1.715137e-01 + + + 6.387863e+02 3.114216e-02 + 1.379239e+02 2.035873e-01 + 4.179844e+01 5.247863e-01 + 1.432062e+01 4.048052e-01 + 6.585455e+00 9.959601e-03 + 2.517464e+00 1.516615e-02 + 9.912460e-01 5.431750e-03 + + + 1.906556e+04 6.599092e-03 + 2.310581e+03 4.647411e-02 + 4.933572e+02 1.583111e-01 + 1.347287e+02 1.802728e-01 + 2.190805e+02 1.057224e-01 + 1.826867e+01 3.142525e-03 + 1.997604e-01 1.717543e-03 + 6.722313e-02 5.344390e-04 + + + + + + 0 1 0.000000e+00 1.800000e+01 + 0 1 1.422958e+02 -9.817787e+00 + 0 1 8.204055e+00 -4.993532e+00 + 0 1 1.705258e+00 -1.603169e+00 + 0 2 8.792100e+02 -1.396404e+02 + 0 2 7.059450e+01 -5.968996e+01 + 0 2 1.732241e+00 -7.626109e-01 + + + + 2.070120e+04 2.606574e-03 + 2.488959e+03 1.834574e-02 + 5.292053e+02 6.269014e-02 + 1.441692e+02 7.176311e-02 + 2.346329e+02 4.849273e-02 + 3.140549e+00 8.261152e-01 + 1.301168e+00 4.113889e-01 + 2.435996e-01 3.496967e-03 + 8.270040e-02 1.047075e-03 + + + 2.070120e+04 1.888091e-02 + 2.488959e+03 1.328887e-01 + 5.292053e+02 4.541005e-01 + 1.441692e+02 5.198212e-01 + 2.554504e+01 2.637489e-02 + 1.052815e+01 1.736753e-02 + 1.968156e+01 5.563399e-03 + + + 6.904302e+02 1.322952e-02 + 1.489766e+02 8.680121e-02 + 4.517937e+01 2.251550e-01 + 1.550622e+01 1.752475e-01 + + + 6.904302e+02 3.074253e-02 + 1.489766e+02 2.017072e-01 + 4.517937e+01 5.232115e-01 + 1.550622e+01 4.072372e-01 + 7.151327e+00 1.045325e-02 + 2.758110e+00 1.587569e-02 + 1.106490e+00 5.514443e-03 + + + 2.070120e+04 6.599282e-03 + 2.488959e+03 4.644744e-02 + 5.292053e+02 1.587178e-01 + 1.441692e+02 1.816887e-01 + 2.346329e+02 1.054775e-01 + 1.968156e+01 3.317968e-03 + 2.435996e-01 2.022820e-03 + 8.270040e-02 6.056805e-04 + + + + + + 0 1 0.000000e+00 1.800000e+01 + 0 1 1.511515e+02 -1.041981e+01 + 0 1 1.236041e+01 -3.887438e+00 + 0 1 3.657611e+00 -1.109334e+00 + 0 2 6.454874e+02 -2.138912e+02 + 0 2 7.442747e+01 -7.995303e+01 + 0 2 2.997280e+00 -5.685900e+00 + + + + 2.244564e+04 2.633691e-03 + 2.676845e+03 1.852303e-02 + 5.666818e+02 6.349405e-02 + 1.539899e+02 7.306893e-02 + 2.508583e+02 4.891412e-02 + 3.393299e+00 8.359122e-01 + 1.424691e+00 4.042380e-01 + 2.916912e-01 3.638659e-03 + 9.918827e-02 1.057776e-03 + + + 2.244564e+04 8.593214e-02 + 2.676845e+03 1.291239e-01 + 5.666818e+02 4.426165e-01 + 1.539899e+02 5.093629e-01 + 2.508583e+02 4.061329e-03 + 2.736320e+01 2.597834e-02 + 1.130876e+01 1.717920e-02 + 2.115399e+01 5.459317e-03 + + + 7.448706e+02 1.325438e-02 + 1.606041e+02 8.727282e-02 + 4.873444e+01 2.278224e-01 + 1.675489e+01 1.790212e-01 + + + 7.448706e+02 3.034145e-02 + 1.606041e+02 1.997817e-01 + 4.873444e+01 5.215226e-01 + 1.675489e+01 4.098088e-01 + 7.738321e+00 1.099823e-02 + 3.006211e+00 1.664546e-02 + 1.222484e+00 5.560003e-03 + + + 2.244564e+04 6.599227e-03 + 2.676845e+03 4.641307e-02 + 5.666818e+02 1.590967e-01 + 1.539899e+02 1.830885e-01 + 2.508583e+02 1.051835e-01 + 2.115399e+01 3.457553e-03 + 2.916912e-01 2.190586e-03 + 9.918827e-02 6.368142e-04 + + + + + + 0 1 0.000000e+00 1.800000e+01 + 0 1 1.511924e+02 -1.004655e+01 + 0 1 1.225936e+01 -3.340956e+00 + 0 1 4.073227e+00 -1.041641e+00 + 0 2 7.615376e+02 -3.027725e+02 + 0 2 7.283256e+01 -8.638852e+01 + 0 2 3.266225e+00 -6.059629e+00 + + + + 2.430549e+04 2.660251e-03 + 2.874653e+03 1.869363e-02 + 6.058359e+02 6.427818e-02 + 1.641984e+02 7.436621e-02 + 2.677039e+02 4.930923e-02 + 3.656819e+00 8.465978e-01 + 1.552117e+00 3.961412e-01 + 3.427024e-01 3.774496e-03 + 1.172107e-01 1.090944e-03 + + + 2.430549e+04 1.871595e-02 + 2.874653e+03 1.315173e-01 + 6.058359e+02 4.522232e-01 + 1.641984e+02 5.231966e-01 + 2.927411e+01 2.678198e-02 + 1.214839e+01 1.785403e-02 + 2.269055e+01 5.615537e-03 + + + 8.014974e+02 1.328687e-02 + 1.726692e+02 8.776625e-02 + 5.241922e+01 2.304487e-01 + 1.804917e+01 1.826273e-01 + + + 8.014974e+02 2.998247e-02 + 1.726692e+02 1.980489e-01 + 5.241922e+01 5.200189e-01 + 1.804917e+01 4.121075e-01 + 8.347950e+00 1.149155e-02 + 3.264892e+00 1.730968e-02 + 1.342376e+00 5.552376e-03 + + + 2.430549e+04 6.599246e-03 + 2.874653e+03 4.637304e-02 + 6.058359e+02 1.594540e-01 + 1.641984e+02 1.844792e-01 + 2.677039e+02 1.048642e-01 + 2.269055e+01 3.709187e-03 + 3.427024e-01 2.695420e-03 + 1.172107e-01 7.790586e-04 + + + + + + 0 1 0.000000e+00 1.800000e+01 + 0 1 1.611333e+02 -9.582092e+00 + 0 1 1.256127e+01 -3.218382e+00 + 0 1 4.278209e+00 -1.037790e+00 + 0 2 8.592716e+02 -3.576688e+02 + 0 2 8.503966e+01 -1.004948e+02 + 0 2 3.463696e+00 -6.125106e+00 + + + + 2.628775e+04 2.685969e-03 + 3.082822e+03 1.885541e-02 + 6.467196e+02 6.503482e-02 + 1.748027e+02 7.564584e-02 + 2.852744e+02 4.965926e-02 + 3.932341e+00 8.579122e-01 + 1.683396e+00 3.876149e-01 + 3.967245e-01 3.906953e-03 + 1.367040e-01 1.135803e-03 + + + 2.628775e+04 1.863775e-02 + 3.082822e+03 1.308363e-01 + 6.467196e+02 4.512721e-01 + 1.748027e+02 5.249012e-01 + 3.124910e+01 2.699639e-02 + 1.300959e+01 1.810864e-02 + 2.428824e+01 5.648936e-03 + + + 8.608589e+02 1.331180e-02 + 1.852878e+02 8.819928e-02 + 5.626984e+01 2.329222e-01 + 1.940291e+01 1.861763e-01 + + + 8.608589e+02 2.963214e-02 + 1.852878e+02 1.963321e-01 + 5.626984e+01 5.184860e-01 + 1.940291e+01 4.144294e-01 + 8.981600e+00 1.200026e-02 + 3.534366e+00 1.798026e-02 + 1.465887e+00 5.536325e-03 + + + 2.628775e+04 6.599258e-03 + 3.082822e+03 4.632655e-02 + 6.467196e+02 1.597865e-01 + 1.748027e+02 1.858571e-01 + 2.852744e+02 1.044940e-01 + 2.428824e+01 3.893449e-03 + 3.967245e-01 2.973505e-03 + 1.367040e-01 8.644372e-04 + + + + + + 0 1 0.000000e+00 3.000000e+01 + 0 1 1.717237e+02 -1.587122e+01 + 0 1 8.795873e+00 -8.401075e+00 + 0 1 1.678889e+00 -2.468170e+00 + 0 2 3.285551e+03 -1.559101e+03 + 0 2 4.334126e+01 -1.055606e+02 + 0 2 1.370595e+00 -3.327627e+00 + + + + 2.832869e+04 1.861324e-02 + 3.293308e+03 1.305182e-01 + 6.874975e+02 4.512925e-01 + 1.852792e+02 5.255960e-01 + 3.331788e+01 2.681546e-02 + 1.388857e+01 1.810175e-02 + 2.594265e+01 5.565386e-03 + + + 9.224700e+02 2.931989e-02 + 1.983383e+02 1.948162e-01 + 6.024212e+01 5.172275e-01 + 2.079577e+01 4.163505e-01 + 9.638792e+00 1.251893e-02 + 3.818761e+00 1.861915e-02 + 1.600081e+00 5.548744e-03 + + + 2.832869e+04 6.618279e-03 + 3.293308e+03 4.640816e-02 + 6.874975e+02 1.604653e-01 + 1.852792e+02 1.868853e-01 + 3.032982e+02 1.041683e-01 + 2.594265e+01 3.793006e-03 + 5.321561e-01 2.442360e-03 + 2.133496e-01 1.216528e-03 + + + 2.832869e+04 2.719032e-03 + 3.293308e+03 1.906618e-02 + 6.874975e+02 6.592506e-02 + 1.852792e+02 7.677937e-02 + 3.032982e+02 5.001043e-02 + 4.223752e+00 8.691871e-01 + 1.823778e+00 3.803838e-01 + 5.321561e-01 3.528156e-03 + 2.133496e-01 1.757358e-03 + + + 9.224700e+02 1.334197e-02 + 1.983383e+02 8.865078e-02 + 6.024212e+01 2.353635e-01 + 2.079577e+01 1.894595e-01 + + + 2.832869e+04 9.277854e-04 + 3.293308e+03 6.505742e-03 + 6.874975e+02 2.249488e-02 + 1.852792e+02 2.619858e-02 + 3.032982e+02 1.676234e-02 + 4.223752e+00 3.861552e-01 + 1.823778e+00 1.689937e-01 + 2.975875e+00 2.580162e-01 + + + 6.893612e+01 7.038264e-02 + 1.806695e+01 3.297978e-01 + 5.745926e+00 5.563627e-01 + 1.824534e+00 3.148138e-01 + + + + + + 0 1 0.000000e+00 3.000000e+01 + 0 1 1.816301e+02 -1.509172e+01 + 0 1 8.787134e+00 -7.884786e+00 + 0 1 1.717769e+00 -2.313954e+00 + 0 2 3.261270e+03 -1.660114e+03 + 0 2 4.336450e+01 -1.063372e+02 + 0 2 1.370653e+00 -3.327384e+00 + + + + 3.057188e+04 1.854130e-02 + 3.522884e+03 1.298469e-01 + 7.318539e+02 4.503413e-01 + 1.966604e+02 5.273101e-01 + 3.546029e+01 2.701428e-02 + 1.483342e+01 1.837944e-02 + 2.766961e+01 5.602087e-03 + + + 9.882035e+02 2.895395e-02 + 2.122455e+02 1.929608e-01 + 6.447958e+01 5.154228e-01 + 2.228907e+01 4.189878e-01 + 1.032476e+01 1.313962e-02 + 4.114168e+00 1.942212e-02 + 1.737704e+00 5.596171e-03 + + + 3.057188e+04 6.619310e-03 + 3.522884e+03 4.635583e-02 + 7.318539e+02 1.607735e-01 + 1.966604e+02 1.882516e-01 + 3.222729e+02 1.037361e-01 + 2.766961e+01 3.981177e-03 + 6.107345e-01 2.769145e-03 + 2.567184e-01 1.255844e-03 + + + 3.057188e+04 2.744006e-03 + 3.522884e+03 1.921661e-02 + 7.318539e+02 6.664796e-02 + 1.966604e+02 7.803889e-02 + 3.222729e+02 5.029882e-02 + 4.527839e+00 8.796345e-01 + 1.968793e+00 3.728859e-01 + 6.107345e-01 3.640638e-03 + 2.567184e-01 1.651077e-03 + + + 9.882035e+02 1.333696e-02 + 2.122455e+02 8.888286e-02 + 6.447958e+01 2.374174e-01 + 2.228907e+01 1.929969e-01 + + + 3.057188e+04 9.836503e-04 + 3.522884e+03 6.888622e-03 + 7.318539e+02 2.389145e-02 + 1.966604e+02 2.797478e-02 + 3.222729e+02 1.782949e-02 + 4.527839e+00 4.115402e-01 + 1.968793e+00 1.744560e-01 + 3.273140e+00 2.807261e-01 + + + 7.581164e+01 6.821491e-02 + 1.996358e+01 3.250123e-01 + 6.405919e+00 5.573717e-01 + 2.065585e+00 3.151559e-01 + + + + + + 0 1 0.000000e+00 3.600000e+01 + 0 1 2.145475e+02 -2.826330e+01 + 0 1 6.235092e+00 -9.041888e+00 + 0 1 1.188715e+00 -2.324406e+00 + 0 2 1.651103e+03 -1.240581e+02 + 0 2 3.756033e+01 -8.501762e+01 + 0 2 1.109095e+00 -1.197530e+00 + + + + 6.790279e+04 1.776520e-02 + 7.040326e+03 1.213420e-01 + 1.375403e+03 4.355878e-01 + 3.558255e+02 5.502616e-01 + 6.425357e+01 3.199124e-02 + 2.748527e+01 2.311087e-02 + 5.134544e+01 7.307106e-03 + + + 1.947782e+03 2.528844e-02 + 4.116454e+02 1.730932e-01 + 1.247747e+02 4.930022e-01 + 4.365494e+01 4.465301e-01 + 1.960851e+01 2.358726e-02 + 8.108029e+00 3.359207e-02 + 3.481304e+00 6.952704e-03 + + + 6.790279e+04 6.598182e-03 + 7.040326e+03 4.506770e-02 + 1.375403e+03 1.617819e-01 + 3.558255e+02 2.043730e-01 + 5.903032e+02 9.628463e-02 + 5.134544e+01 4.984940e-03 + 1.653841e+00 3.480653e-03 + 7.005751e-01 1.419582e-03 + + + 6.790279e+04 2.934135e-03 + 7.040326e+03 2.004108e-02 + 1.375403e+03 7.194251e-02 + 3.558255e+02 9.088226e-02 + 5.903032e+02 5.042911e-02 + 8.699199e+00 9.757823e-01 + 3.848173e+00 3.049227e-01 + 1.653841e+00 2.811371e-03 + 7.005751e-01 1.146616e-03 + + + 1.947782e+03 1.278307e-02 + 4.116454e+02 8.749703e-02 + 1.247747e+02 2.492081e-01 + 4.365494e+01 2.257169e-01 + + + 6.790279e+04 1.262043e-03 + 7.040326e+03 8.620157e-03 + 1.375403e+03 3.094423e-02 + 3.558255e+02 3.909067e-02 + 5.903032e+02 2.245986e-02 + 8.699199e+00 5.597291e-01 + 3.848173e+00 1.749100e-01 + 7.641793e+00 3.797049e-01 + + + 1.947782e+03 5.343462e-03 + 4.116454e+02 3.657470e-02 + 1.247747e+02 1.041717e-01 + 4.365494e+01 9.435208e-02 + 2.669398e+00 5.428550e-01 + 1.153922e+00 5.887788e-01 + 4.695989e-01 1.298705e-01 + + + 1.811900e+02 4.897803e-02 + 4.931153e+01 2.695238e-01 + 1.686080e+01 5.470622e-01 + 6.106148e+00 3.504625e-01 + 4.088039e+00 6.580949e-03 + 1.359836e+00 1.290444e-02 + 4.219564e-01 7.129024e-03 + + + + + + 0 1 0.000000e+00 3.600000e+01 + 0 1 2.399380e+02 -2.926862e+01 + 0 1 6.880170e+00 -8.988872e+00 + 0 1 1.333055e+00 -2.497620e+00 + 0 2 3.158649e+03 -8.867078e+01 + 0 2 4.206145e+01 -9.076272e+01 + 0 2 1.235161e+00 -1.257930e+00 + + + + 7.266615e+04 1.773963e-02 + 7.458577e+03 1.207515e-01 + 1.448048e+03 4.345224e-01 + 3.731342e+02 5.520353e-01 + 6.745249e+01 3.228038e-02 + 2.888902e+01 2.349413e-02 + 5.396235e+01 7.371557e-03 + + + 2.041792e+03 2.532196e-02 + 4.307275e+02 1.732810e-01 + 1.304436e+02 4.936558e-01 + 4.558117e+01 4.470731e-01 + 2.063008e+01 2.258027e-02 + 8.539518e+00 3.189178e-02 + 3.661291e+00 6.454050e-03 + + + 7.266615e+04 6.610922e-03 + 7.458577e+03 4.499975e-02 + 1.448048e+03 1.619309e-01 + 3.731342e+02 2.057237e-01 + 6.206207e+02 9.546550e-02 + 5.396235e+01 5.048381e-03 + 1.777042e+00 3.480766e-03 + 7.657393e-01 1.397729e-03 + + + 7.266615e+04 2.953586e-03 + 7.458577e+03 2.010470e-02 + 1.448048e+03 7.234645e-02 + 3.731342e+02 9.191194e-02 + 6.206207e+02 5.025423e-02 + 9.164452e+00 9.818402e-01 + 4.048987e+00 3.010621e-01 + 1.777042e+00 2.619555e-03 + 7.657393e-01 1.051903e-03 + + + 2.041792e+03 1.288245e-02 + 4.307275e+02 8.815608e-02 + 1.304436e+02 2.511456e-01 + 4.558117e+01 2.274468e-01 + + + 7.266615e+04 1.287268e-03 + 7.458577e+03 8.762279e-03 + 1.448048e+03 3.153092e-02 + 3.731342e+02 4.005820e-02 + 6.206207e+02 2.268724e-02 + 9.164452e+00 5.728315e-01 + 4.048987e+00 1.756476e-01 + 8.116065e+00 3.870636e-01 + + + 2.041792e+03 5.483335e-03 + 4.307275e+02 3.752308e-02 + 1.304436e+02 1.068985e-01 + 4.558117e+01 9.681130e-02 + 2.865541e+00 5.502444e-01 + 1.251380e+00 5.916674e-01 + 5.173573e-01 1.234323e-01 + + + 1.930010e+02 4.796829e-02 + 5.260605e+01 2.662139e-01 + 1.804452e+01 5.459717e-01 + 6.570293e+00 3.529913e-01 + 4.538816e+00 6.742746e-03 + 1.550296e+00 1.352712e-02 + 5.002391e-01 7.274215e-03 + + + + + + 0 1 0.000000e+00 3.600000e+01 + 0 1 2.668636e+02 -2.992093e+01 + 0 1 7.495168e+00 -8.938023e+00 + 0 1 1.055974e+00 -2.029444e+00 + 0 2 3.415451e+03 -1.350729e+02 + 0 2 4.547132e+01 -1.172562e+02 + 0 2 1.922978e+00 -1.335315e+00 + + + + 7.772952e+04 1.771776e-02 + 7.897737e+03 1.201668e-01 + 1.523595e+03 4.334453e-01 + 3.910089e+02 5.538159e-01 + 7.085474e+01 3.246281e-02 + 3.046331e+01 2.397554e-02 + 5.667781e+01 7.422703e-03 + + + 2.140155e+03 2.533108e-02 + 4.506338e+02 1.733219e-01 + 1.363488e+02 4.940944e-01 + 4.758959e+01 4.477572e-01 + 2.168046e+01 2.173861e-02 + 8.984165e+00 3.046358e-02 + 3.846385e+00 6.039136e-03 + + + 7.772952e+04 6.625106e-03 + 7.897737e+03 4.493334e-02 + 1.523595e+03 1.620758e-01 + 3.910089e+02 2.070854e-01 + 6.518766e+02 9.464965e-02 + 5.667781e+01 5.357000e-03 + 1.904156e+00 4.035483e-03 + 8.320664e-01 1.581948e-03 + + + 7.772952e+04 2.973234e-03 + 7.897737e+03 2.016531e-02 + 1.523595e+03 7.273685e-02 + 3.910089e+02 9.293637e-02 + 6.518766e+02 5.007031e-02 + 9.642199e+00 9.870342e-01 + 4.255994e+00 2.974771e-01 + 1.904156e+00 2.407143e-03 + 8.320664e-01 9.436232e-04 + + + 2.140155e+03 1.296613e-02 + 4.506338e+02 8.871763e-02 + 1.363488e+02 2.529102e-01 + 4.758959e+01 2.291918e-01 + + + 7.772952e+04 1.312356e-03 + 7.897737e+03 8.900766e-03 + 1.523595e+03 3.210532e-02 + 3.910089e+02 4.102118e-02 + 6.518766e+02 2.290314e-02 + 9.642199e+00 5.853485e-01 + 4.255994e+00 1.764151e-01 + 8.607677e+00 3.944439e-01 + + + 2.140155e+03 5.615018e-03 + 4.506338e+02 3.841943e-02 + 1.363488e+02 1.095235e-01 + 4.758959e+01 9.925217e-02 + 3.067791e+00 5.586107e-01 + 1.352145e+00 5.942375e-01 + 5.650612e-01 1.167132e-01 + + + 1.880339e+02 5.516419e-02 + 5.103533e+01 2.954908e-01 + 1.734697e+01 5.665716e-01 + 6.166323e+00 3.105956e-01 + 5.027724e+00 7.767543e-04 + 1.779129e+00 1.617500e-03 + 5.881318e-01 8.672809e-04 + + + + + + 0 1 0.000000e+00 3.600000e+01 + 0 1 2.429654e+02 -3.430523e+01 + 0 1 2.063113e+00 -4.148315e+00 + 0 1 9.080743e-01 -8.581169e-01 + 0 2 3.268975e+03 -4.428144e+02 + 0 2 4.255696e+01 -1.754604e+02 + 0 2 3.750702e+00 -5.647906e-01 + + + + 8.310434e+04 1.770100e-02 + 8.358395e+03 1.195938e-01 + 1.602101e+03 4.323621e-01 + 4.094573e+02 5.555928e-01 + 7.427984e+01 3.275256e-02 + 3.197229e+01 2.438902e-02 + 5.947033e+01 7.489354e-03 + + + 2.242920e+03 2.531963e-02 + 4.713680e+02 1.732369e-01 + 1.424906e+02 4.943444e-01 + 4.968056e+01 4.485601e-01 + 2.275951e+01 2.104678e-02 + 9.440646e+00 2.927810e-02 + 4.034581e+00 5.689717e-03 + + + 8.310434e+04 6.640886e-03 + 8.358395e+03 4.486803e-02 + 1.602101e+03 1.622093e-01 + 4.094573e+02 2.084418e-01 + 6.845819e+02 9.378192e-02 + 5.947033e+01 5.426753e-03 + 2.035795e+00 4.059384e-03 + 8.998324e-01 1.545840e-03 + + + 8.310434e+04 2.993153e-03 + 8.358395e+03 2.022274e-02 + 1.602101e+03 7.311033e-02 + 4.094573e+02 9.394805e-02 + 6.845819e+02 4.984210e-02 + 1.013791e+01 9.923610e-01 + 4.468113e+00 2.942143e-01 + 2.035795e+00 2.144044e-03 + 8.998324e-01 8.164662e-04 + + + 2.242920e+03 1.303596e-02 + 4.713680e+02 8.919199e-02 + 1.424906e+02 2.545160e-01 + 4.968056e+01 2.309437e-01 + + + 8.310434e+04 1.337247e-03 + 8.358395e+03 9.034881e-03 + 1.602101e+03 3.266339e-02 + 4.094573e+02 4.197303e-02 + 6.845819e+02 2.308636e-02 + 1.013791e+01 5.977351e-01 + 4.468113e+00 1.772160e-01 + 9.115573e+00 4.017739e-01 + + + 2.242920e+03 5.738007e-03 + 4.713680e+02 3.925944e-02 + 1.424906e+02 1.120297e-01 + 4.968056e+01 1.016540e-01 + 3.276480e+00 5.675947e-01 + 1.456225e+00 5.963576e-01 + 6.129979e-01 1.101295e-01 + + + 2.177113e+02 4.618225e-02 + 5.949579e+01 2.602803e-01 + 2.052317e+01 5.439398e-01 + 7.545045e+00 3.575382e-01 + 5.459859e+00 7.069627e-03 + 1.942199e+00 1.465446e-02 + 6.617277e-01 7.520586e-03 + + + + + + 0 1 0.000000e+00 3.600000e+01 + 0 1 2.720190e+02 -3.676569e+01 + 0 1 2.263086e+00 -3.842603e+00 + 0 1 1.053259e+00 -8.066965e-01 + 0 2 5.104624e+03 -3.495153e+02 + 0 2 4.031470e+01 -1.837709e+02 + 0 2 2.647569e+00 -3.277054e-01 + + + + 8.881194e+04 1.768881e-02 + 8.841808e+03 1.190303e-01 + 1.683700e+03 4.312702e-01 + 4.284975e+02 5.573705e-01 + 7.782165e+01 3.304250e-02 + 3.353386e+01 2.481793e-02 + 6.235374e+01 7.557020e-03 + + + 2.349964e+03 2.529389e-02 + 4.928960e+02 1.730624e-01 + 1.488570e+02 4.944575e-01 + 5.184959e+01 4.494301e-01 + 2.386824e+01 2.047717e-02 + 9.909558e+00 2.829034e-02 + 4.226890e+00 5.394690e-03 + + + 8.881194e+04 6.658291e-03 + 8.841808e+03 4.480449e-02 + 1.683700e+03 1.623355e-01 + 4.284975e+02 2.098013e-01 + 7.185638e+02 9.289105e-02 + 6.235374e+01 5.499755e-03 + 2.171925e+00 4.096793e-03 + 9.685845e-01 1.509237e-03 + + + 8.881194e+04 3.013393e-03 + 8.841808e+03 2.027751e-02 + 1.683700e+03 7.346942e-02 + 4.284975e+02 9.495135e-02 + 7.185638e+02 4.958847e-02 + 1.064916e+01 9.973573e-01 + 4.685949e+00 2.912147e-01 + 2.171925e+00 1.842732e-03 + 9.685845e-01 6.788531e-04 + + + 2.349964e+03 1.309519e-02 + 4.928960e+02 8.959812e-02 + 1.488570e+02 2.559913e-01 + 5.184959e+01 2.326796e-01 + + + 8.881194e+04 1.361861e-03 + 8.841808e+03 9.164141e-03 + 1.683700e+03 3.320349e-02 + 4.284975e+02 4.291195e-02 + 7.185638e+02 2.324459e-02 + 1.064916e+01 6.097033e-01 + 4.685949e+00 1.780250e-01 + 9.640530e+00 4.089963e-01 + + + 2.349964e+03 5.853232e-03 + 4.928960e+02 4.004817e-02 + 1.488570e+02 1.144219e-01 + 5.184959e+01 1.040021e-01 + 3.491920e+00 5.769315e-01 + 1.563864e+00 5.979902e-01 + 6.612446e-01 1.039140e-01 + + + 2.096282e+02 5.407733e-02 + 5.701584e+01 2.928344e-01 + 1.947108e+01 5.672906e-01 + 6.972525e+00 3.107734e-01 + 6.042350e+00 6.770240e-04 + 2.215766e+00 1.489093e-03 + 7.632974e-01 7.759726e-04 + + + + + + 0 1 0.000000e+00 3.600000e+01 + 0 1 2.576660e+02 -3.538898e+01 + 0 1 2.189311e+00 -3.358263e+00 + 0 1 9.959189e-01 -6.816075e-01 + 0 2 3.971828e+03 -6.373092e+02 + 0 2 4.114562e+01 -1.951533e+02 + 0 2 3.698646e+00 -3.377956e-01 + + + + 9.487214e+04 1.768122e-02 + 9.349124e+03 1.184763e-01 + 1.768512e+03 4.301696e-01 + 4.481476e+02 5.591477e-01 + 8.148399e+01 3.333339e-02 + 3.514965e+01 2.526344e-02 + 6.533041e+01 7.625927e-03 + + + 2.501286e+03 2.463870e-02 + 5.235308e+02 1.692299e-01 + 1.580152e+02 4.890454e-01 + 5.507622e+01 4.561658e-01 + 2.510059e+01 2.225373e-02 + 1.043497e+01 3.103876e-02 + 4.447579e+00 5.880920e-03 + + + 9.487214e+04 6.677363e-03 + 9.349124e+03 4.474291e-02 + 1.768512e+03 1.624548e-01 + 4.481476e+02 2.111638e-01 + 7.538748e+02 9.197723e-02 + 6.533041e+01 5.576147e-03 + 2.312876e+00 4.145291e-03 + 1.038420e+00 1.473910e-03 + + + 9.487214e+04 3.033999e-03 + 9.349124e+03 2.032987e-02 + 1.768512e+03 7.381473e-02 + 4.481476e+02 9.594665e-02 + 7.538748e+02 4.931003e-02 + 1.117613e+01 1.002040e+00 + 4.909653e+00 2.884592e-01 + 2.312876e+00 1.504520e-03 + 1.038420e+00 5.349510e-04 + + + 2.501286e+03 1.282336e-02 + 5.235308e+02 8.807674e-02 + 1.580152e+02 2.545266e-01 + 5.507622e+01 2.374142e-01 + + + 9.487214e+04 1.386184e-03 + 9.349124e+03 9.288381e-03 + 1.768512e+03 3.372472e-02 + 4.481476e+02 4.383643e-02 + 7.538748e+02 2.337702e-02 + 1.117613e+01 6.212373e-01 + 4.909653e+00 1.788368e-01 + 1.018270e+01 4.160800e-01 + + + 2.501286e+03 5.815405e-03 + 5.235308e+02 3.994288e-02 + 1.580152e+02 1.154280e-01 + 5.507622e+01 1.076676e-01 + 3.723646e+00 5.840232e-01 + 1.680574e+00 6.006810e-01 + 7.131027e-01 9.949652e-02 + + + 2.438967e+02 4.465139e-02 + 6.679120e+01 2.551094e-01 + 2.315135e+01 5.420927e-01 + 8.582120e+00 3.615153e-01 + 6.419499e+00 7.378972e-03 + 2.354200e+00 1.564342e-02 + 8.317158e-01 7.720316e-03 + + + + + + 0 1 0.000000e+00 4.800000e+01 + 0 1 4.418373e+02 -7.390764e+00 + 0 1 1.035219e+01 -1.743794e+01 + 0 1 1.692241e+00 -9.019157e+00 + 0 2 8.654932e+02 -7.842653e+02 + 0 2 9.280596e+01 -9.552911e+01 + 0 2 5.295508e-01 -1.352907e+00 + + + + 1.009176e+05 1.774244e-02 + 9.844100e+03 1.183708e-01 + 1.849438e+03 4.304124e-01 + 4.666344e+02 5.595855e-01 + 8.548912e+01 3.283032e-02 + 3.686122e+01 2.531609e-02 + 7.183215e+01 7.341386e-03 + + + 2.622068e+03 2.454877e-02 + 5.476712e+02 1.686664e-01 + 1.651321e+02 4.885798e-01 + 5.749730e+01 4.577832e-01 + 2.488532e+01 2.535362e-02 + 9.566524e+00 3.045200e-02 + + + 1.009176e+05 6.723811e-03 + 9.844100e+03 4.485869e-02 + 1.849438e+03 1.631124e-01 + 4.666344e+02 2.120648e-01 + 7.886446e+02 9.121970e-02 + 7.183215e+01 5.335173e-03 + 1.950479e+00 3.551284e-03 + + + 1.009176e+05 3.089298e-03 + 9.844100e+03 2.061061e-02 + 1.849438e+03 7.494302e-02 + 4.666344e+02 9.743451e-02 + 7.886446e+02 4.798006e-02 + 1.039584e+01 1.222086e+00 + 1.950479e+00 8.737503e-02 + 2.172664e+00 9.018310e-03 + + + 2.622068e+03 1.281975e-02 + 5.476712e+02 8.808026e-02 + 1.651321e+02 2.551440e-01 + 5.749730e+01 2.390616e-01 + 4.809538e-01 7.494866e-03 + 1.633000e-01 6.217486e-03 + + + 1.009176e+05 1.391221e-03 + 9.844100e+03 9.281691e-03 + 1.849438e+03 3.374950e-02 + 4.666344e+02 4.387822e-02 + 7.886446e+02 2.627042e-02 + 1.039584e+01 6.546047e-01 + 1.233037e+01 4.443163e-01 + 2.172664e+00 1.660082e-02 + + + 1.009176e+05 5.351154e-04 + 9.844100e+03 3.570085e-03 + 1.849438e+03 1.298132e-02 + 4.666344e+02 1.687720e-02 + 7.886446e+02 9.131888e-03 + 1.039584e+01 2.997215e-01 + 1.233037e+01 1.887165e-01 + 3.439283e-01 9.534798e-01 + 1.443567e-01 3.059850e-01 + + + 2.622068e+03 5.884360e-03 + 5.476712e+02 4.042948e-02 + 1.651321e+02 1.171130e-01 + 5.749730e+01 1.097310e-01 + 3.756752e+00 6.734913e-01 + 1.502927e+00 5.673248e-01 + 4.809538e-01 1.149766e-02 + 1.633000e-01 9.538066e-03 + + + 2.575297e+02 1.919204e-02 + 7.058664e+01 1.103332e-01 + 2.451981e+01 2.362293e-01 + 9.123165e+00 1.585533e-01 + + + 2.575297e+02 4.397336e-02 + 7.058664e+01 2.527986e-01 + 2.451981e+01 5.412554e-01 + 9.123165e+00 3.632818e-01 + 6.952956e+00 7.426077e-03 + 2.591209e+00 1.600456e-02 + 9.343775e-01 7.907209e-03 + + + + + + 0 1 0.000000e+00 4.800000e+01 + 0 1 4.239742e+02 -6.958587e+00 + 0 1 1.033137e+01 -1.610109e+01 + 0 1 1.704769e+00 -8.650936e+00 + 0 2 8.479779e+02 -8.000354e+02 + 0 2 9.325344e+01 -9.308317e+01 + 0 2 5.295500e-01 -1.376229e+00 + + + + 1.077089e+05 1.774558e-02 + 1.039961e+04 1.178455e-01 + 1.940478e+03 4.293305e-01 + 4.874210e+02 5.613372e-01 + 8.943074e+01 3.309324e-02 + 3.860205e+01 2.578581e-02 + 7.505492e+01 7.418349e-03 + + + 2.753935e+03 2.438246e-02 + 5.739820e+02 1.676586e-01 + 1.729309e+02 4.872197e-01 + 6.034045e+01 4.577277e-01 + 2.613393e+01 2.714764e-02 + 1.011833e+01 3.325257e-02 + + + 1.077089e+05 6.747071e-03 + 1.039961e+04 4.480620e-02 + 1.940478e+03 1.632363e-01 + 4.874210e+02 2.134268e-01 + 8.266035e+02 9.027008e-02 + 7.505492e+01 5.438905e-03 + 2.091223e+00 3.565554e-03 + + + 1.077089e+05 3.110860e-03 + 1.039961e+04 2.065872e-02 + 1.940478e+03 7.526308e-02 + 4.874210e+02 9.840430e-02 + 8.266035e+02 4.768257e-02 + 1.092449e+01 1.223205e+00 + 2.091223e+00 8.853101e-02 + 2.328715e+00 9.139834e-03 + + + 2.753935e+03 1.278409e-02 + 5.739820e+02 8.790595e-02 + 1.729309e+02 2.554566e-01 + 6.034045e+01 2.399935e-01 + 5.478717e-01 7.140049e-03 + 1.958695e-01 5.442036e-03 + + + 1.077089e+05 1.417181e-03 + 1.039961e+04 9.411271e-03 + 1.940478e+03 3.428680e-02 + 4.874210e+02 4.482900e-02 + 8.266035e+02 2.622452e-02 + 1.092449e+01 6.696110e-01 + 1.293764e+01 4.472684e-01 + 2.328715e+00 1.806428e-02 + + + 1.077089e+05 5.707487e-04 + 1.039961e+04 3.790250e-03 + 1.940478e+03 1.380850e-02 + 4.874210e+02 1.805421e-02 + 8.266035e+02 9.541499e-03 + 1.092449e+01 3.214358e-01 + 1.293764e+01 2.015345e-01 + 3.911176e-01 1.003898e+00 + 1.703696e-01 2.809982e-01 + + + 2.753935e+03 5.944570e-03 + 5.739820e+02 4.087604e-02 + 1.729309e+02 1.187867e-01 + 6.034045e+01 1.115964e-01 + 4.032446e+00 6.693907e-01 + 1.633220e+00 5.750905e-01 + 5.478717e-01 1.248044e-02 + 1.958695e-01 9.512402e-03 + + + 2.712525e+02 1.942862e-02 + 7.440013e+01 1.122994e-01 + 2.589187e+01 2.419585e-01 + 9.665031e+00 1.629869e-01 + + + 2.712525e+02 4.342654e-02 + 7.440013e+01 2.510098e-01 + 2.589187e+01 5.408217e-01 + 9.665031e+00 3.643056e-01 + 7.510341e+00 7.387887e-03 + 2.841690e+00 1.619778e-02 + 1.044140e+00 8.039416e-03 + + + + + + 0 1 0.000000e+00 6.800000e+01 + 0 1 3.298244e+02 -3.663140e+01 + 0 1 6.214575e+00 -1.698065e+01 + 0 1 3.181997e+00 -7.160325e+00 + 0 2 6.562251e+03 -6.620930e+03 + 0 2 6.903256e+01 -2.486635e+02 + 0 2 1.052477e+00 -2.860910e+00 + + + + 5.036713e+05 1.957831e-02 + 3.856487e+04 1.086627e-01 + 5.904381e+03 3.991082e-01 + 1.289249e+03 6.032374e-01 + 2.558320e+02 3.865044e-02 + 1.104903e+02 4.758163e-02 + 1.942904e+02 1.004381e-02 + + + 7.731113e+03 2.267175e-02 + 1.507506e+03 1.542949e-01 + 4.376697e+02 4.720559e-01 + 1.502123e+02 4.816205e-01 + 6.840685e+01 3.163158e-02 + 2.719751e+01 3.959489e-02 + + + 5.036713e+05 8.076128e-03 + 3.856487e+04 4.482377e-02 + 5.904381e+03 1.646337e-01 + 1.289249e+03 2.488377e-01 + 2.536357e+03 6.161120e-02 + 1.942904e+02 1.078298e-02 + 7.867014e+00 1.012349e-02 + 3.410552e+00 2.460003e-03 + + + 5.036713e+05 3.902105e-03 + 3.856487e+04 2.165729e-02 + 5.904381e+03 7.954527e-02 + 1.289249e+03 1.202297e-01 + 2.536357e+03 3.545812e-02 + 3.244588e+01 1.057109e+00 + 1.327227e+01 2.663563e-01 + 1.489370e+00 3.366259e-03 + 5.994629e-01 8.000617e-04 + + + 7.731113e+03 1.276944e-02 + 1.507506e+03 8.690371e-02 + 4.376697e+02 2.658766e-01 + 1.502123e+02 2.712637e-01 + 1.959124e+00 8.004960e-03 + 7.158242e-01 5.260924e-03 + + + 5.036713e+05 2.085825e-03 + 3.856487e+04 1.157666e-02 + 5.904381e+03 4.252001e-02 + 1.289249e+03 6.426743e-02 + 2.536357e+03 1.071725e-02 + 3.244588e+01 1.162042e+00 + 1.327227e+01 2.927960e-01 + 1.489370e+00 1.834061e-03 + 5.994629e-01 4.359030e-04 + + + 5.036713e+05 9.521953e-04 + 3.856487e+04 5.284833e-03 + 5.904381e+03 1.941071e-02 + 1.289249e+03 2.933858e-02 + 2.536357e+03 3.102355e-03 + 3.244588e+01 6.349639e-01 + 1.327227e+01 1.599898e-01 + 1.489370e+00 1.187720e+00 + 5.994629e-01 2.822865e-01 + + + 7.731113e+03 2.697149e-03 + 1.507506e+03 1.835573e-02 + 4.376697e+02 5.615823e-02 + 1.502123e+02 5.729608e-02 + 1.221030e+01 4.499210e-01 + 5.095106e+00 3.981692e-01 + + + 7.731113e+03 6.519048e-03 + 1.507506e+03 4.436605e-02 + 4.376697e+02 1.357352e-01 + 1.502123e+02 1.384854e-01 + 1.221030e+01 6.862869e-01 + 5.095106e+00 6.073474e-01 + 1.959124e+00 1.472472e-02 + 7.158242e-01 9.677202e-03 + + + 1.272994e+02 4.211776e-02 + 3.999141e+01 2.173766e-01 + 1.511232e+01 4.527266e-01 + 5.860638e+00 4.453532e-01 + 2.106195e+00 1.668768e-01 + + + 7.481043e+02 1.921276e-02 + 2.053677e+02 1.200997e-01 + 7.305338e+01 2.841247e-01 + 2.829822e+01 2.049424e-01 + + + 7.481043e+02 3.587156e-02 + 2.053677e+02 2.242345e-01 + 7.305338e+01 5.304805e-01 + 2.829822e+01 3.826418e-01 + 2.498019e+01 9.835162e-03 + 1.029172e+01 2.417978e-02 + 4.169595e+00 1.411766e-02 + + + + + + 0 1 0.000000e+00 6.800000e+01 + 0 1 3.345942e+02 -3.245518e+01 + 0 1 7.554156e+00 -1.764896e+01 + 0 1 3.201153e+00 -7.542026e+00 + 0 2 5.117577e+03 -6.901676e+03 + 0 2 6.583186e+01 -2.426514e+02 + 0 2 1.119148e+00 -2.686847e+00 + + + + 5.341441e+05 1.974472e-02 + 4.059137e+04 1.085520e-01 + 6.160331e+03 3.979800e-01 + 1.335977e+03 6.046208e-01 + 2.670142e+02 3.861109e-02 + 1.149689e+02 4.891774e-02 + 2.014949e+02 1.008361e-02 + + + 8.021998e+03 2.264351e-02 + 1.559323e+03 1.539134e-01 + 4.518366e+02 4.715735e-01 + 1.549029e+02 4.824037e-01 + 7.081715e+01 3.163589e-02 + 2.821050e+01 3.994888e-02 + + + 5.341441e+05 8.171424e-03 + 4.059137e+04 4.492462e-02 + 6.160331e+03 1.647054e-01 + 1.335977e+03 2.502245e-01 + 2.652756e+03 6.037324e-02 + 2.014949e+02 1.101182e-02 + 8.177380e+00 1.042723e-02 + 3.550598e+00 2.516978e-03 + + + 5.341441e+05 3.952489e-03 + 4.059137e+04 2.172988e-02 + 6.160331e+03 7.966743e-02 + 1.335977e+03 1.210327e-01 + 2.652756e+03 3.482429e-02 + 3.356452e+01 1.056428e+00 + 1.374057e+01 2.668860e-01 + 1.578173e+00 3.339576e-03 + 6.446766e-01 7.705908e-04 + + + 8.021998e+03 1.277572e-02 + 1.559323e+03 8.683968e-02 + 4.518366e+02 2.660671e-01 + 1.549029e+02 2.721776e-01 + 2.078785e+00 9.057867e-03 + 7.755449e-01 5.898782e-03 + + + 5.341441e+05 2.116369e-03 + 4.059137e+04 1.163531e-02 + 6.160331e+03 4.265810e-02 + 1.335977e+03 6.480722e-02 + 2.652756e+03 1.057343e-02 + 3.356452e+01 1.167056e+00 + 1.374057e+01 2.948342e-01 + 1.578173e+00 2.073523e-03 + 6.446766e-01 4.784553e-04 + + + 5.341441e+05 9.778673e-04 + 4.059137e+04 5.376090e-03 + 6.160331e+03 1.971016e-02 + 1.335977e+03 2.994415e-02 + 2.652756e+03 3.086386e-03 + 3.356452e+01 6.470368e-01 + 1.374057e+01 1.634613e-01 + 1.578173e+00 1.205839e+00 + 6.446766e-01 2.782415e-01 + + + 8.021998e+03 2.758740e-03 + 1.559323e+03 1.875182e-02 + 4.518366e+02 5.745350e-02 + 1.549029e+02 5.877298e-02 + 1.267788e+01 4.597806e-01 + 5.316224e+00 4.099928e-01 + + + 8.021998e+03 6.548585e-03 + 1.559323e+03 4.451232e-02 + 4.518366e+02 1.363808e-01 + 1.549029e+02 1.395129e-01 + 1.267788e+01 6.839064e-01 + 5.316224e+00 6.098490e-01 + 2.078785e+00 1.506723e-02 + 7.755449e-01 9.812276e-03 + + + 1.323809e+02 4.201447e-02 + 4.178515e+01 2.167005e-01 + 1.588522e+01 4.522038e-01 + 6.216465e+00 4.444109e-01 + 2.265790e+00 1.641702e-01 + + + 7.739088e+02 1.921431e-02 + 2.123687e+02 1.203716e-01 + 7.556823e+01 2.857639e-01 + 2.929984e+01 2.070114e-01 + + + 7.739088e+02 3.562056e-02 + 2.123687e+02 2.231517e-01 + 7.556823e+01 5.297651e-01 + 2.929984e+01 3.837692e-01 + 2.606878e+01 9.817937e-03 + 1.079897e+01 2.450247e-02 + 4.401687e+00 1.452283e-02 + + + + + + 0 1 0.000000e+00 6.800000e+01 + 0 1 3.532523e+02 -3.087336e+01 + 0 1 8.788539e+00 -1.862866e+01 + 0 1 3.130933e+00 -7.519923e+00 + 0 2 4.770345e+03 -7.110319e+03 + 0 2 6.002969e+01 -2.238539e+02 + 0 2 1.156867e+00 -2.405820e+00 + + + + 5.664029e+05 1.991978e-02 + 4.272825e+04 1.084627e-01 + 6.427628e+03 3.968563e-01 + 1.384302e+03 6.059809e-01 + 2.787654e+02 3.855249e-02 + 1.196200e+02 5.030315e-02 + 2.089484e+02 1.012059e-02 + + + 8.323227e+03 2.261280e-02 + 1.612743e+03 1.535115e-01 + 4.663912e+02 4.710569e-01 + 1.597001e+02 4.832781e-01 + 7.316488e+01 3.175420e-02 + 2.914382e+01 4.022383e-02 + + + 5.664029e+05 8.270370e-03 + 4.272825e+04 4.503196e-02 + 6.427628e+03 1.647683e-01 + 1.384302e+03 2.515934e-01 + 2.774629e+03 5.914958e-02 + 2.089484e+02 1.124416e-02 + 8.497441e+00 1.074335e-02 + 3.694375e+00 2.576774e-03 + + + 5.664029e+05 4.004475e-03 + 4.272825e+04 2.180427e-02 + 6.427628e+03 7.978004e-02 + 1.384302e+03 1.218204e-01 + 2.774629e+03 3.419788e-02 + 3.471407e+01 1.055621e+00 + 1.422432e+01 2.674770e-01 + 1.670083e+00 3.318727e-03 + 6.905768e-01 7.393068e-04 + + + 8.323227e+03 1.277915e-02 + 1.612743e+03 8.675373e-02 + 4.663912e+02 2.662078e-01 + 1.597001e+02 2.731143e-01 + 2.199622e+00 8.933002e-03 + 8.363468e-01 5.729860e-03 + + + 5.664029e+05 2.147802e-03 + 4.272825e+04 1.169473e-02 + 6.427628e+03 4.279006e-02 + 1.384302e+03 6.533842e-02 + 2.774629e+03 1.043350e-02 + 3.471407e+01 1.171893e+00 + 1.422432e+01 2.969383e-01 + 1.670083e+00 2.354879e-03 + 6.905768e-01 5.245921e-04 + + + 5.664029e+05 1.004063e-03 + 4.272825e+04 5.467098e-03 + 6.427628e+03 2.000367e-02 + 1.384302e+03 3.054466e-02 + 2.774629e+03 3.071493e-03 + 3.471407e+01 6.589934e-01 + 1.422432e+01 1.669781e-01 + 1.670083e+00 1.225433e+00 + 6.905768e-01 2.729875e-01 + + + 8.323227e+03 2.818922e-03 + 1.612743e+03 1.913680e-02 + 4.663912e+02 5.872215e-02 + 1.597001e+02 6.024565e-02 + 1.314259e+01 4.713673e-01 + 5.534688e+00 4.203565e-01 + + + 8.323227e+03 6.576158e-03 + 1.612743e+03 4.464354e-02 + 4.663912e+02 1.369907e-01 + 1.597001e+02 1.405448e-01 + 1.314259e+01 6.846582e-01 + 5.534688e+00 6.105653e-01 + 2.199622e+00 1.531727e-02 + 8.363468e-01 9.824892e-03 + + + 1.364453e+02 4.254383e-02 + 4.328779e+01 2.178868e-01 + 1.656258e+01 4.525507e-01 + 6.542936e+00 4.418362e-01 + 2.418853e+00 1.601334e-01 + + + 8.016838e+02 1.915052e-02 + 2.199102e+02 1.203145e-01 + 7.828421e+01 2.870394e-01 + 3.039040e+01 2.094645e-01 + + + 8.016838e+02 3.525897e-02 + 2.199102e+02 2.215170e-01 + 7.828421e+01 5.284824e-01 + 3.039040e+01 3.856553e-01 + 2.715512e+01 9.975382e-03 + 1.130529e+01 2.519320e-02 + 4.636159e+00 1.512790e-02 + + + + + + 0 1 0.000000e+00 6.800000e+01 + 0 1 3.761923e+02 -2.793928e+01 + 0 1 1.039236e+01 -1.934910e+01 + 0 1 3.111308e+00 -7.996979e+00 + 0 2 4.612183e+03 -7.631720e+03 + 0 2 5.543823e+01 -2.219538e+02 + 0 2 1.099238e+00 -1.550290e+00 + + + + 6.005359e+05 2.010310e-02 + 4.498041e+04 1.083926e-01 + 6.706596e+03 3.957331e-01 + 1.434233e+03 6.073169e-01 + 2.911599e+02 3.846977e-02 + 1.244600e+02 5.174752e-02 + 2.166603e+02 1.015525e-02 + + + 8.633443e+03 2.258652e-02 + 1.667493e+03 1.531295e-01 + 4.812575e+02 4.705597e-01 + 1.645937e+02 4.841025e-01 + 7.557288e+01 3.187815e-02 + 3.010295e+01 4.052008e-02 + + + 6.005359e+05 8.373678e-03 + 4.498041e+04 4.514948e-02 + 6.706596e+03 1.648373e-01 + 1.434233e+03 2.529697e-01 + 2.902707e+03 5.792081e-02 + 2.166603e+02 1.148299e-02 + 8.827412e+00 1.107537e-02 + 3.842130e+00 2.640433e-03 + + + 6.005359e+05 4.058625e-03 + 4.498041e+04 2.188343e-02 + 6.706596e+03 7.989475e-02 + 1.434233e+03 1.226115e-01 + 2.902707e+03 3.356623e-02 + 3.589477e+01 1.054692e+00 + 1.472367e+01 2.681120e-01 + 1.765559e+00 3.301523e-03 + 7.374273e-01 7.085223e-04 + + + 8.633443e+03 1.278445e-02 + 1.667493e+03 8.667454e-02 + 4.812575e+02 2.663467e-01 + 1.645937e+02 2.740123e-01 + 2.323357e+00 8.859667e-03 + 8.985772e-01 5.584725e-03 + + + 6.005359e+05 2.180211e-03 + 4.498041e+04 1.175534e-02 + 6.706596e+03 4.291784e-02 + 1.434233e+03 6.586441e-02 + 2.902707e+03 1.029230e-02 + 3.589477e+01 1.176550e+00 + 1.472367e+01 2.990894e-01 + 1.765559e+00 2.673176e-03 + 7.374273e-01 5.736761e-04 + + + 6.005359e+05 1.030740e-03 + 4.498041e+04 5.557579e-03 + 6.706596e+03 2.029030e-02 + 1.434233e+03 3.113876e-02 + 2.902707e+03 3.055656e-03 + 3.589477e+01 6.707732e-01 + 1.472367e+01 1.705165e-01 + 1.765559e+00 1.245654e+00 + 7.374273e-01 2.673232e-01 + + + 8.633443e+03 2.878185e-03 + 1.667493e+03 1.951319e-02 + 4.812575e+02 5.996310e-02 + 1.645937e+02 6.168886e-02 + 1.361899e+01 4.826986e-01 + 5.759339e+00 4.305844e-01 + + + 8.633443e+03 6.604338e-03 + 1.667493e+03 4.477534e-02 + 4.812575e+02 1.375925e-01 + 1.645937e+02 1.415524e-01 + 1.361899e+01 6.853055e-01 + 5.759339e+00 6.113170e-01 + 2.323357e+00 1.559451e-02 + 8.985772e-01 9.830062e-03 + + + 1.389815e+02 4.405980e-02 + 4.427568e+01 2.224518e-01 + 1.704614e+01 4.547399e-01 + 6.803365e+00 4.360428e-01 + 2.554046e+00 1.534935e-01 + + + 8.286368e+02 1.915156e-02 + 2.272032e+02 1.205647e-01 + 8.090108e+01 2.885980e-01 + 3.143327e+01 2.114702e-01 + + + 8.286368e+02 3.502436e-02 + 2.272032e+02 2.204886e-01 + 8.090108e+01 5.277877e-01 + 3.143327e+01 3.867364e-01 + 2.828874e+01 9.957523e-03 + 1.183466e+01 2.550149e-02 + 4.878431e+00 1.551388e-02 + + + + + + 0 1 0.000000e+00 6.800000e+01 + 0 1 3.926122e+02 -3.070002e+01 + 0 1 1.125226e+01 -1.855302e+01 + 0 1 3.700868e+00 -8.080579e+00 + 0 2 4.701506e+03 -7.515548e+03 + 0 2 4.529843e+01 -2.089813e+02 + 0 2 1.324535e+00 -2.208494e+00 + + + + 6.366627e+05 2.029520e-02 + 4.735586e+04 1.083430e-01 + 6.998004e+03 3.946125e-01 + 1.485869e+03 6.086274e-01 + 3.042431e+02 3.836574e-02 + 1.294960e+02 5.325298e-02 + 2.246464e+02 1.018374e-02 + + + 8.953691e+03 2.256167e-02 + 1.723751e+03 1.527500e-01 + 4.964799e+02 4.700584e-01 + 1.695920e+02 4.849299e-01 + 7.804048e+01 3.200251e-02 + 3.108457e+01 4.082515e-02 + + + 6.366627e+05 8.481292e-03 + 4.735586e+04 4.527617e-02 + 6.998004e+03 1.649072e-01 + 1.485869e+03 2.543433e-01 + 3.037215e+03 5.669577e-02 + 2.246464e+02 1.172300e-02 + 9.167218e+00 1.142172e-02 + 3.993346e+00 2.706977e-03 + + + 6.366627e+05 4.114772e-03 + 4.735586e+04 2.196613e-02 + 6.998004e+03 8.000616e-02 + 1.485869e+03 1.233969e-01 + 3.037215e+03 3.294287e-02 + 3.711120e+01 1.053523e+00 + 1.524462e+01 2.688838e-01 + 1.864578e+00 3.281989e-03 + 7.850906e-01 6.774653e-04 + + + 8.953691e+03 1.278998e-02 + 1.723751e+03 8.659245e-02 + 4.964799e+02 2.664713e-01 + 1.695920e+02 2.749018e-01 + 2.449806e+00 8.811177e-03 + 9.619672e-01 5.445738e-03 + + + 6.366627e+05 2.213493e-03 + 4.735586e+04 1.181641e-02 + 6.998004e+03 4.303836e-02 + 1.485869e+03 6.637987e-02 + 3.037215e+03 1.016001e-02 + 3.711120e+01 1.180870e+00 + 1.524462e+01 3.013857e-01 + 1.864578e+00 3.037380e-03 + 7.850906e-01 6.269733e-04 + + + 6.366627e+05 1.057776e-03 + 4.735586e+04 5.646788e-03 + 6.998004e+03 2.056702e-02 + 1.485869e+03 3.172138e-02 + 3.037215e+03 3.044346e-03 + 3.711120e+01 6.822283e-01 + 1.524462e+01 1.741207e-01 + 1.864578e+00 1.266285e+00 + 7.850906e-01 2.613856e-01 + + + 8.953691e+03 2.936096e-03 + 1.723751e+03 1.987835e-02 + 4.964799e+02 6.117174e-02 + 1.695920e+02 6.310706e-02 + 1.410623e+01 4.938638e-01 + 5.989433e+00 4.405756e-01 + + + 8.953691e+03 6.632285e-03 + 1.723751e+03 4.490279e-02 + 4.964799e+02 1.381795e-01 + 1.695920e+02 1.425512e-01 + 1.410623e+01 6.860229e-01 + 5.989433e+00 6.120006e-01 + 2.449806e+00 1.587999e-02 + 9.619672e-01 9.814612e-03 + + + 1.444920e+02 4.378587e-02 + 4.619546e+01 2.214108e-01 + 1.787265e+01 4.540671e-01 + 7.186670e+00 4.356253e-01 + 2.729331e+00 1.518893e-01 + + + 8.561902e+02 1.915068e-02 + 2.346489e+02 1.207967e-01 + 8.357131e+01 2.901104e-01 + 3.249777e+01 2.134552e-01 + + + 8.561902e+02 3.479403e-02 + 2.346489e+02 2.194702e-01 + 8.357131e+01 5.270888e-01 + 3.249777e+01 3.878173e-01 + 2.944780e+01 9.942086e-03 + 1.237653e+01 2.581128e-02 + 5.126437e+00 1.589788e-02 + + + + + + 0 1 0.000000e+00 6.800000e+01 + 0 1 5.599171e+02 -3.051871e+01 + 0 1 2.250929e+01 -2.337127e+01 + 0 1 3.456274e+00 -1.056940e+01 + 0 2 5.099139e+03 -6.572529e+03 + 0 2 4.497361e+01 -1.656966e+02 + 0 2 1.240549e+00 -1.181296e+00 + + + + 6.748933e+05 2.049634e-02 + 4.986148e+04 1.083145e-01 + 7.302420e+03 3.934954e-01 + 1.539262e+03 6.099120e-01 + 3.180612e+02 3.823758e-02 + 1.347343e+02 5.481627e-02 + 2.328756e+02 1.021127e-02 + + + 9.284304e+03 2.253826e-02 + 1.781558e+03 1.523732e-01 + 5.120667e+02 4.695532e-01 + 1.746969e+02 4.857599e-01 + 8.056918e+01 3.212732e-02 + 3.208910e+01 4.113894e-02 + + + 6.748933e+05 8.593323e-03 + 4.986148e+04 4.541206e-02 + 7.302420e+03 1.649774e-01 + 1.539262e+03 2.557125e-01 + 3.178288e+03 5.547729e-02 + 2.328756e+02 1.197033e-02 + 9.519502e+00 1.177833e-02 + 4.151486e+00 2.780972e-03 + + + 6.748933e+05 4.172600e-03 + 4.986148e+04 2.205042e-02 + 7.302420e+03 8.010691e-02 + 1.539262e+03 1.241645e-01 + 3.178288e+03 3.231804e-02 + 3.836433e+01 1.052108e+00 + 1.578896e+01 2.697879e-01 + 1.967190e+00 3.257334e-03 + 8.335464e-01 6.462859e-04 + + + 9.284304e+03 1.279577e-02 + 1.781558e+03 8.650765e-02 + 5.120667e+02 2.665820e-01 + 1.746969e+02 2.757831e-01 + 2.579154e+00 8.783177e-03 + 1.026515e+00 5.314652e-03 + + + 6.748933e+05 2.247749e-03 + 4.986148e+04 1.187840e-02 + 7.302420e+03 4.315301e-02 + 1.539262e+03 6.688651e-02 + 3.178288e+03 1.002687e-02 + 3.836433e+01 1.184923e+00 + 1.578896e+01 3.038451e-01 + 1.967190e+00 3.401957e-03 + 8.335464e-01 6.749805e-04 + + + 6.748933e+05 1.085198e-03 + 4.986148e+04 5.734809e-03 + 7.302420e+03 2.083398e-02 + 1.539262e+03 3.229235e-02 + 3.178288e+03 3.031745e-03 + 3.836433e+01 6.933854e-01 + 1.578896e+01 1.778021e-01 + 1.967190e+00 1.287010e+00 + 8.335464e-01 2.553550e-01 + + + 9.284304e+03 2.992507e-03 + 1.781558e+03 2.023127e-02 + 5.120667e+02 6.234469e-02 + 1.746969e+02 6.449653e-02 + 1.460451e+01 5.048266e-01 + 6.225015e+00 4.503100e-01 + + + 9.284304e+03 6.659986e-03 + 1.781558e+03 4.502579e-02 + 5.120667e+02 1.387515e-01 + 1.746969e+02 1.435405e-01 + 1.460451e+01 6.867955e-01 + 6.225015e+00 6.126280e-01 + 2.579154e+00 1.616953e-02 + 1.026515e+00 9.784097e-03 + + + 1.459621e+02 4.613231e-02 + 4.672784e+01 2.295318e-01 + 1.814779e+01 4.588101e-01 + 7.365236e+00 4.261785e-01 + 2.841600e+00 1.425553e-01 + + + 8.860628e+02 1.907747e-02 + 2.427296e+02 1.206621e-01 + 8.647772e+01 2.912118e-01 + 3.366670e+01 2.158706e-01 + + + 8.860628e+02 3.444229e-02 + 2.427296e+02 2.178422e-01 + 8.647772e+01 5.257511e-01 + 3.366670e+01 3.897307e-01 + 3.059515e+01 1.012055e-02 + 1.291376e+01 2.653624e-02 + 5.376237e+00 1.651825e-02 + + + + diff --git a/src/apps/chem/coredata/mcp2 b/src/madness/chem/coredata/mcp2 similarity index 97% rename from src/apps/chem/coredata/mcp2 rename to src/madness/chem/coredata/mcp2 index 6c981447ed2..378e329a03e 100644 --- a/src/apps/chem/coredata/mcp2 +++ b/src/madness/chem/coredata/mcp2 @@ -1,2568 +1,2568 @@ - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 2.718422e+00 -1.404070e+00 - 0 1 1.061906e+00 -2.040843e-01 - - - - 7.105793e+02 2.009533e-03 - 1.034368e+02 1.482329e-02 - 2.443300e+01 6.640480e-02 - 7.308967e+00 1.990801e-01 - 2.506894e+00 3.819108e-01 - 9.438003e-01 3.884663e-01 - 3.709710e-01 1.099967e-01 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 5.188992e+00 -1.397212e+00 - 0 1 2.023980e+00 -2.122203e-01 - - - - 1.311616e+03 1.969894e-03 - 1.913861e+02 1.451971e-02 - 4.527883e+01 6.534285e-02 - 1.359732e+01 1.982694e-01 - 4.719701e+00 3.835307e-01 - 1.817344e+00 3.845043e-01 - 7.340121e-01 1.096769e-01 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 1.603560e+01 -1.518700e+00 - 0 1 2.322329e+00 -2.808786e-01 - - - - 2.787867e+02 2.477011e-02 - 3.826330e+01 1.678633e-01 - 8.576375e+00 4.977570e-01 - 2.360978e+00 4.542732e-01 - 2.929847e-01 8.554471e-03 - 9.375142e-02 6.986010e-03 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 1.864605e+01 -1.582358e+00 - 0 1 3.512100e+00 -2.257663e-01 - - - - 4.090699e+02 2.446620e-02 - 5.616343e+01 1.667309e-01 - 1.263216e+01 4.985016e-01 - 3.495336e+00 4.533167e-01 - 4.607115e-01 9.069870e-03 - 1.436420e-01 7.456826e-03 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 2.763930e+01 -1.595784e+00 - 0 1 5.022100e+00 -2.624201e-01 - - - - 5.635094e+02 2.422667e-02 - 7.738753e+01 1.657101e-01 - 1.744855e+01 4.979887e-01 - 4.843508e+00 4.511053e-01 - 7.820957e+00 1.334650e-03 - 6.633018e-01 9.410938e-03 - 2.029459e-01 7.779541e-03 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 4.064864e+01 -1.695591e+00 - 0 1 5.175230e+00 -2.183506e-01 - - - - 7.432411e+02 2.413306e-02 - 1.020870e+02 1.655533e-01 - 2.305897e+01 4.996164e-01 - 6.416186e+00 4.517950e-01 - 9.065320e-01 9.761350e-03 - 2.740610e-01 7.992775e-03 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 5.202781e+01 -1.715359e+00 - 0 1 6.206354e+00 -2.299835e-01 - - - - 9.476157e+02 2.401760e-02 - 1.301841e+02 1.651131e-01 - 2.944885e+01 4.998040e-01 - 8.208941e+00 4.514980e-01 - 1.184390e+00 1.005990e-02 - 3.545967e-01 8.202500e-03 - - - - - - 0 1 0.000000e+00 2.000000e+00 - 0 1 5.407668e+01 -1.635342e+00 - 0 1 7.612973e+00 -2.108811e-01 - - - - 1.175870e+03 2.394744e-02 - 1.615680e+02 1.648909e-01 - 3.659069e+01 5.001582e-01 - 1.021284e+01 4.509687e-01 - 1.497330e+00 1.025659e-02 - 4.446700e-01 8.352764e-03 - - - - - - 0 1 0.000000e+00 4.000000e+00 - 0 1 3.050656e+02 -1.743249e+00 - 0 1 1.464675e+01 -1.513124e+00 - 0 1 2.136867e+00 -8.039920e-01 - 0 2 4.718427e+02 -1.590759e+02 - 0 2 2.052377e+02 -4.548875e+00 - 0 2 6.894609e-01 -4.851126e-01 - - - - 1.437387e+03 2.371636e-02 - 1.975242e+02 1.636571e-01 - 4.477766e+01 4.987114e-01 - 1.251831e+01 4.529699e-01 - 1.910040e+00 1.062412e-02 - 6.071710e-01 8.547746e-03 - - - 1.437387e+03 6.294799e-03 - 1.975242e+02 4.343787e-02 - 4.477766e+01 1.323680e-01 - 1.251831e+01 1.202273e-01 - 2.156724e+01 8.952974e-02 - - - - - - 0 1 0.000000e+00 4.000000e+00 - 0 1 3.371815e+02 -1.693663e+00 - 0 1 1.582292e+01 -1.422796e+00 - 0 1 2.309331e+00 -7.518502e-01 - 0 2 5.552475e+02 -1.581608e+02 - 0 2 2.797939e+02 -4.956377e+00 - 0 2 7.681323e-01 -4.550130e-01 - - - - 1.726576e+03 2.350363e-02 - 2.373122e+02 1.624787e-01 - 5.384661e+01 4.972212e-01 - 1.507884e+01 4.549977e-01 - 2.375296e+00 1.102567e-02 - 7.937981e-01 8.641283e-03 - - - 1.726576e+03 6.466155e-03 - 2.373122e+02 4.470000e-02 - 5.384661e+01 1.367920e-01 - 1.507884e+01 1.251758e-01 - 2.586516e+01 9.284621e-02 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.316953e+02 -3.386013e+00 - 0 1 5.217324e+00 -6.046747e+00 - 0 1 2.331459e+00 -3.647381e-01 - 0 2 9.142273e+02 -1.140686e+02 - 0 2 2.077560e+02 -4.208050e+01 - 0 2 1.251080e+00 -3.349915e-01 - - - - 2.043808e+03 2.330614e-02 - 2.809367e+02 1.613919e-01 - 6.378912e+01 4.958434e-01 - 1.788862e+01 4.569062e-01 - 2.886838e+00 1.142757e-02 - 9.993500e-01 8.659862e-03 - - - 2.043808e+03 6.603905e-03 - 2.809367e+02 4.573118e-02 - 6.378912e+01 1.404996e-01 - 1.788862e+01 1.294666e-01 - 3.061927e+01 9.566236e-02 - - - 1.089621e+02 1.824312e-02 - 2.363035e+01 1.212105e-01 - 7.107732e+00 3.571781e-01 - 2.366064e+00 4.993906e-01 - 8.025018e-01 2.309303e-01 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.349863e+02 -3.320043e+00 - 0 1 4.335714e+00 -5.901880e+00 - 0 1 4.547902e+00 3.453667e-01 - 0 2 8.540638e+02 -1.218275e+02 - 0 2 2.119761e+02 -3.822756e+01 - 0 2 9.980917e-01 -3.460521e-01 - - - - 2.387957e+03 2.313729e-02 - 3.282802e+02 1.604502e-01 - 7.458612e+01 4.946216e-01 - 2.094412e+01 4.585802e-01 - 3.444621e+00 1.181110e-02 - 1.222284e+00 8.622046e-03 - - - 1.348228e+02 1.731180e-02 - 2.936148e+01 1.169748e-01 - 8.890635e+00 3.531863e-01 - 3.000349e+00 5.034634e-01 - 1.037602e+00 2.287471e-01 - - - 2.387957e+03 6.719179e-03 - 3.282802e+02 4.659548e-02 - 7.458612e+01 1.436404e-01 - 2.094412e+01 1.331738e-01 - 3.582222e+01 9.806896e-02 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.269965e+02 -2.738258e+00 - 0 1 5.125039e+00 -5.713482e+00 - 0 1 2.849041e+00 3.351582e-01 - 0 2 1.169129e+03 -7.823903e+01 - 0 2 1.843911e+02 -2.594858e+01 - 0 2 1.326776e+00 -2.364182e-01 - - - - 2.759337e+03 2.298844e-02 - 3.793730e+02 1.596162e-01 - 8.624196e+01 4.935288e-01 - 2.424595e+01 4.600765e-01 - 4.049327e+00 1.216849e-02 - 1.462091e+00 8.553915e-03 - - - 1.635738e+02 1.653283e-02 - 3.574204e+01 1.133241e-01 - 1.088147e+01 3.493311e-01 - 3.713289e+00 5.065666e-01 - 1.304009e+00 2.282030e-01 - - - 2.759337e+03 6.815474e-03 - 3.793730e+02 4.732204e-02 - 8.624196e+01 1.463184e-01 - 2.424595e+01 1.364007e-01 - 4.146794e+01 1.001408e-01 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.155917e+02 -3.620214e+00 - 0 1 5.971141e+00 -5.737309e+00 - 0 1 2.859090e+00 4.704707e-01 - 0 2 2.062680e+03 -3.776082e+01 - 0 2 1.487138e+02 -3.431947e+01 - 0 2 1.644010e+00 -2.288331e-01 - - - - 3.158033e+03 2.285572e-02 - 4.342273e+02 1.588694e-01 - 9.875946e+01 4.925416e-01 - 2.779522e+01 4.614278e-01 - 4.703444e+00 1.248984e-02 - 1.720138e+00 8.475957e-03 - - - 1.931031e+02 1.615636e-02 - 4.229557e+01 1.118467e-01 - 1.292618e+01 3.491943e-01 - 4.446308e+00 5.094185e-01 - 1.575364e+00 2.231922e-01 - - - 3.158033e+03 6.897386e-03 - 4.342273e+02 4.794350e-02 - 9.875946e+01 1.486389e-01 - 2.779522e+01 1.392494e-01 - 4.754841e+01 1.019635e-01 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.120543e+02 -2.654674e+00 - 0 1 6.860978e+00 -5.707226e+00 - 0 1 2.789429e+00 6.518503e-01 - 0 2 1.667526e+03 -3.516025e+01 - 0 2 1.070677e+02 -3.284686e+01 - 0 2 3.574553e+00 -9.898434e-01 - - - - 3.584292e+03 2.273479e-02 - 4.928774e+02 1.581851e-01 - 1.121465e+02 4.916240e-01 - 3.159387e+01 4.626829e-01 - 5.405644e+00 1.279159e-02 - 1.995106e+00 8.399245e-03 - - - 2.239078e+02 1.596166e-02 - 4.916041e+01 1.112272e-01 - 1.507759e+01 3.501497e-01 - 5.222262e+00 5.115647e-01 - 1.862470e+00 2.176059e-01 - - - 3.584292e+03 6.966199e-03 - 4.928774e+02 4.846974e-02 - 1.121465e+02 1.506392e-01 - 3.159387e+01 1.417713e-01 - 5.406610e+01 1.035544e-01 - - - - - - 0 1 0.000000e+00 1.000000e+01 - 0 1 1.316953e+02 -9.029367e+00 - 0 1 5.217324e+00 -1.612466e+01 - 0 1 2.331459e+00 -9.726350e-01 - 0 2 9.142273e+02 -3.041829e+02 - 0 2 2.077560e+02 -1.122147e+02 - 0 2 1.251080e+00 -8.933106e-01 - - - - 2.043808e+03 2.330614e-02 - 2.809367e+02 1.613919e-01 - 6.378912e+01 4.958434e-01 - 1.788862e+01 4.569062e-01 - 2.886838e+00 1.142757e-02 - 9.993500e-01 8.659862e-03 - - - 1.089621e+02 1.824312e-02 - 2.363035e+01 1.212105e-01 - 7.107732e+00 3.571781e-01 - 2.366064e+00 4.993906e-01 - 8.025018e-01 2.309303e-01 - - - 2.043808e+03 6.603905e-03 - 2.809367e+02 4.573118e-02 - 6.378912e+01 1.404996e-01 - 1.788862e+01 1.294666e-01 - 3.061927e+01 9.566236e-02 - - - - - - 0 1 0.000000e+00 1.200000e+01 - 0 1 1.165002e+02 -6.815450e+00 - 0 1 8.900975e+00 -5.215410e+00 - 0 1 3.035128e-01 -1.866213e-01 - 0 2 1.887663e+03 -1.595243e+02 - 0 2 1.854639e+02 -5.261246e+01 - 0 2 1.596409e+00 -3.662524e+00 - - - - 4.734263e+03 2.216103e-03 - 6.514608e+02 1.553145e-02 - 1.484022e+02 4.954343e-02 - 4.196838e+01 5.035876e-02 - 6.816142e+01 4.017761e-02 - 6.770286e-01 7.829351e-01 - 2.602544e-01 4.122532e-01 - - - 4.734263e+03 2.126296e-02 - 6.514608e+02 1.490203e-01 - 1.484022e+02 4.753568e-01 - 4.196838e+01 4.831797e-01 - 7.097100e+00 1.941763e-02 - 2.791745e+00 1.356118e-02 - 4.663554e+00 4.197652e-03 - - - 1.735091e+02 3.641247e-02 - 3.760621e+01 2.230816e-01 - 1.115757e+01 5.296130e-01 - 3.680917e+00 3.941468e-01 - 1.439472e+00 6.592606e-03 - 5.215131e-01 1.100807e-02 - 1.902026e-01 4.409938e-03 - - - 4.734263e+03 6.686011e-03 - 6.514608e+02 4.685857e-02 - 1.484022e+02 1.494731e-01 - 4.196838e+01 1.519330e-01 - 6.816142e+01 1.061468e-01 - 4.663554e+00 2.218768e-03 - - - - - - 0 1 0.000000e+00 1.200000e+01 - 0 1 1.267215e+02 -6.552351e+00 - 0 1 9.963899e+00 -4.778063e+00 - 0 1 3.241862e-01 -1.760750e-01 - 0 2 1.502502e+03 -1.925403e+02 - 0 2 2.020013e+02 -5.803146e+01 - 0 2 1.617474e+00 -3.299848e+00 - - - - 5.269373e+03 2.335822e-03 - 7.251419e+02 1.638271e-02 - 1.652354e+02 5.236452e-02 - 4.676625e+01 5.344078e-02 - 7.592187e+01 4.269463e-02 - 8.076661e-01 8.100857e-01 - 3.256016e-01 3.956857e-01 - - - 5.269373e+03 2.116644e-02 - 7.251419e+02 1.484547e-01 - 1.652354e+02 4.745100e-01 - 4.676625e+01 4.842626e-01 - 7.983490e+00 1.968437e-02 - 3.169474e+00 1.355669e-02 - 5.360188e+00 4.184384e-03 - - - 1.986128e+02 3.537530e-02 - 4.314738e+01 2.190453e-01 - 1.286298e+01 5.275969e-01 - 4.278264e+00 3.976240e-01 - 1.712917e+00 7.288671e-03 - 6.380574e-01 1.177173e-02 - 2.397383e-01 4.039566e-03 - - - 5.269373e+03 6.728304e-03 - 7.251419e+02 4.719017e-02 - 1.652354e+02 1.508353e-01 - 4.676625e+01 1.539355e-01 - 7.592187e+01 1.073839e-01 - 5.360188e+00 2.391065e-03 - - - - - - 0 1 0.000000e+00 2.800000e+01 - 0 1 1.770724e+02 -1.170695e+01 - 0 1 4.230505e+00 -1.488350e+01 - 0 1 9.892221e-01 -5.178489e-01 - 0 2 1.077689e+03 -3.556251e+02 - 0 2 1.792821e+02 -5.882823e+01 - 0 2 8.663673e-01 -1.691885e+00 - - - - 1.313743e+04 2.037141e-02 - 1.808839e+03 1.437043e-01 - 4.130223e+02 4.670565e-01 - 1.176649e+02 4.935966e-01 - 2.120531e+01 2.218001e-02 - 8.686230e+00 1.380392e-02 - 1.626113e+01 4.226503e-03 - - - 5.594101e+02 3.178940e-02 - 1.230426e+02 2.075653e-01 - 3.768391e+01 5.272335e-01 - 1.297468e+01 3.991191e-01 - 4.693424e+00 1.375409e-02 - 1.453593e+00 1.375376e-02 - - - 1.313743e+04 6.927090e-03 - 1.808839e+03 4.886519e-02 - 4.130223e+02 1.588178e-01 - 1.176649e+02 1.678425e-01 - 1.907904e+02 1.151553e-01 - 1.626113e+01 2.799764e-03 - 1.518955e-01 1.211912e-03 - 5.076494e-02 3.942917e-04 - - - 1.313743e+04 2.671470e-03 - 1.808839e+03 1.884513e-02 - 4.130223e+02 6.124896e-02 - 1.176649e+02 6.472939e-02 - 1.907904e+02 5.170179e-02 - 2.597655e+00 8.106145e-01 - 1.041160e+00 4.241170e-01 - 1.518955e-01 3.263973e-03 - 5.076494e-02 1.061923e-03 - - - 5.594101e+02 1.188250e-02 - 1.230426e+02 7.758545e-02 - 3.768391e+01 1.970736e-01 - 1.297468e+01 1.491860e-01 - 5.870788e+01 2.823686e-02 - - - 3.393704e+01 9.107488e-02 - 8.526278e+00 3.687624e-01 - 2.490394e+00 5.407529e-01 - 6.801859e-01 3.269504e-01 - - - - - - 0 1 0.000000e+00 2.800000e+01 - 0 1 1.475185e+02 -1.160870e+01 - 0 1 4.276358e+00 -1.489067e+01 - 0 1 3.200115e+00 4.446479e-01 - 0 2 9.634012e+02 -2.667329e+02 - 0 2 1.608157e+02 -7.570730e+01 - 0 2 8.915900e-01 -1.494415e+00 - - - - 1.412554e+04 2.015314e-02 - 1.945092e+03 1.423197e-01 - 4.441943e+02 4.644349e-01 - 1.266081e+02 4.966870e-01 - 2.269153e+01 2.350805e-02 - 9.321496e+00 1.452473e-02 - 1.751443e+01 4.954463e-03 - - - 6.034712e+02 3.140655e-02 - 1.328293e+02 2.058783e-01 - 4.074483e+01 5.258956e-01 - 1.406095e+01 4.010603e-01 - 5.183914e+00 1.413023e-02 - 1.643302e+00 1.447252e-02 - - - 1.412554e+04 6.876497e-03 - 1.945092e+03 4.856122e-02 - 4.441943e+02 1.584708e-01 - 1.266081e+02 1.694757e-01 - 2.040504e+02 1.154084e-01 - 1.751443e+01 2.900941e-03 - 1.916898e-01 1.423946e-03 - 6.432966e-02 4.240571e-04 - - - 1.412554e+04 2.680038e-03 - 1.945092e+03 1.892619e-02 - 4.441943e+02 6.176224e-02 - 1.266081e+02 6.605125e-02 - 2.040504e+02 5.244679e-02 - 2.817345e+00 8.169395e-01 - 1.151078e+00 4.201687e-01 - 1.916898e-01 3.436330e-03 - 6.432966e-02 1.023354e-03 - - - 6.034712e+02 1.200499e-02 - 1.328293e+02 7.869587e-02 - 4.074483e+01 2.010208e-01 - 1.406095e+01 1.533032e-01 - 6.233043e+01 2.729073e-02 - - - 3.926423e+01 8.537630e-02 - 9.980528e+00 3.585446e-01 - 2.983177e+00 5.445484e-01 - 8.497422e-01 3.238528e-01 - - - - - - 0 1 0.000000e+00 2.800000e+01 - 0 1 1.333456e+02 -1.306261e+01 - 0 1 4.666478e+00 -1.494674e+01 - 0 1 1.981306e+00 4.730957e-01 - 0 2 7.345525e+02 -2.051308e+02 - 0 2 1.341873e+02 -8.344618e+01 - 0 2 1.289440e+00 -9.240559e-01 - - - - 1.504748e+04 2.011970e-02 - 2.072094e+03 1.421216e-01 - 4.732470e+02 4.641367e-01 - 1.349364e+02 4.970613e-01 - 2.428569e+01 2.352967e-02 - 1.001257e+01 1.455887e-02 - 1.881352e+01 4.934949e-03 - - - 6.496252e+02 3.102053e-02 - 1.430851e+02 2.041373e-01 - 4.395584e+01 5.244461e-01 - 1.520359e+01 4.031635e-01 - 5.693779e+00 1.456793e-02 - 1.843026e+00 1.517755e-02 - - - 1.504748e+04 6.888015e-03 - 2.072094e+03 4.865559e-02 - 4.732470e+02 1.588980e-01 - 1.349364e+02 1.701698e-01 - 2.174671e+02 1.158352e-01 - 1.881352e+01 3.079572e-03 - 2.339273e-01 1.804417e-03 - 7.920690e-02 5.183852e-04 - - - 1.504748e+04 2.713164e-03 - 2.072094e+03 1.916526e-02 - 4.732470e+02 6.258935e-02 - 1.349364e+02 6.702927e-02 - 2.174671e+02 5.327741e-02 - 3.046407e+00 8.256403e-01 - 1.265088e+00 4.140791e-01 - 2.339273e-01 3.595445e-03 - 7.920690e-02 1.032924e-03 - - - 6.496252e+02 1.210706e-02 - 1.430851e+02 7.967311e-02 - 4.395584e+01 2.046870e-01 - 1.520359e+01 1.573514e-01 - 6.605645e+01 2.663506e-02 - - - 4.469596e+01 8.114536e-02 - 1.146926e+01 3.508263e-01 - 3.490297e+00 5.477342e-01 - 1.026268e+00 3.208275e-01 - - - - - - 0 1 0.000000e+00 2.800000e+01 - 0 1 1.291200e+02 -1.357738e+01 - 0 1 4.545595e+00 -1.394526e+01 - 0 1 2.718347e+00 6.294496e-01 - 0 2 8.206665e+02 -1.526266e+02 - 0 2 1.371375e+02 -8.887129e+01 - 0 2 1.224833e+00 -9.593809e-01 - - - - 1.599893e+04 2.008699e-02 - 2.203162e+03 1.419266e-01 - 5.032314e+02 4.638310e-01 - 1.435335e+02 4.974016e-01 - 2.601334e+01 2.446434e-02 - 9.998426e+00 1.391188e-02 - 2.004753e+01 4.991765e-03 - - - 6.970816e+02 3.069640e-02 - 1.536332e+02 2.026811e-01 - 4.724871e+01 5.234171e-01 - 1.637668e+01 4.045998e-01 - 6.214285e+00 1.506550e-02 - 2.047987e+00 1.582766e-02 - - - 1.599893e+04 6.931590e-03 - 2.203162e+03 4.897583e-02 - 5.032314e+02 1.600582e-01 - 1.435335e+02 1.716427e-01 - 2.248841e+02 1.167850e-01 - 2.004753e+01 3.236878e-03 - 2.799631e-01 1.975754e-03 - 9.459739e-02 5.461451e-04 - - - 1.599893e+04 2.760583e-03 - 2.203162e+03 1.950517e-02 - 5.032314e+02 6.374494e-02 - 1.435335e+02 6.835859e-02 - 2.248841e+02 5.438287e-02 - 3.252662e+00 8.404582e-01 - 1.323473e+00 4.089132e-01 - 2.799631e-01 3.797495e-03 - 9.459739e-02 1.049717e-03 - - - 6.970816e+02 1.220527e-02 - 1.536332e+02 8.058854e-02 - 4.724871e+01 2.081171e-01 - 1.637668e+01 1.608739e-01 - 6.999482e+01 2.627999e-02 - - - 5.034890e+01 7.764744e-02 - 1.302382e+01 3.442077e-01 - 4.022727e+00 5.502592e-01 - 1.213824e+00 3.184576e-01 - - - - - - 0 1 0.000000e+00 2.800000e+01 - 0 1 1.281268e+02 -1.748732e+01 - 0 1 4.400488e+00 -1.327358e+01 - 0 1 3.896848e+00 1.341067e+00 - 0 2 6.906283e+02 -2.098522e+02 - 0 2 1.261179e+02 -6.434127e+01 - 0 2 1.364496e+00 -6.104418e-01 - - - - 1.697980e+04 2.005735e-02 - 2.338286e+03 1.417513e-01 - 5.341455e+02 4.635731e-01 - 1.523987e+02 4.977655e-01 - 2.763213e+01 2.358636e-02 - 1.146758e+01 1.461994e-02 - 2.155440e+01 4.910386e-03 - - - 7.491496e+02 3.019398e-02 - 1.652152e+02 2.002629e-01 - 5.089802e+01 5.209223e-01 - 1.768499e+01 4.082495e-01 - 6.764060e+00 1.578081e-02 - 2.266909e+00 1.673066e-02 - - - 1.697980e+04 6.908701e-03 - 2.338286e+03 4.882585e-02 - 5.341455e+02 1.596765e-01 - 1.523987e+02 1.714540e-01 - 2.455999e+02 1.166172e-01 - 2.155440e+01 3.392594e-03 - 3.290939e-01 2.360322e-03 - 1.123625e-01 6.587084e-04 - - - 1.697980e+04 2.777742e-03 - 2.338286e+03 1.963113e-02 - 5.341455e+02 6.420024e-02 - 1.523987e+02 6.893554e-02 - 2.455999e+02 5.489770e-02 - 3.534757e+00 8.472252e-01 - 1.504633e+00 3.984469e-01 - 3.290939e-01 3.937988e-03 - 1.123625e-01 1.098997e-03 - - - 7.491496e+02 1.221855e-02 - 1.652152e+02 8.104005e-02 - 5.089802e+01 2.108008e-01 - 1.768499e+01 1.652057e-01 - 7.395352e+01 2.597316e-02 - - - 5.612475e+01 7.495665e-02 - 1.461849e+01 3.391826e-01 - 4.571645e+00 5.526696e-01 - 1.408837e+00 3.160503e-01 - - - - - - 0 1 0.000000e+00 2.800000e+01 - 0 1 1.482671e+02 -1.761660e+01 - 0 1 4.832748e+00 -1.278472e+01 - 0 1 4.851261e+00 7.989919e-01 - 0 2 6.193299e+02 -2.353824e+02 - 0 2 1.158974e+02 -5.669794e+01 - 0 2 1.219641e+00 -6.358529e-01 - - - - 1.799018e+04 2.002825e-02 - 2.477476e+03 1.415780e-01 - 5.659913e+02 4.633068e-01 - 1.615326e+02 4.980968e-01 - 2.938435e+01 2.361991e-02 - 1.223152e+01 1.464727e-02 - 2.299656e+01 4.903402e-03 - - - 7.977488e+02 3.006397e-02 - 1.760371e+02 1.997281e-01 - 5.423058e+01 5.205994e-01 - 1.887913e+01 4.073038e-01 - 8.458913e+00 1.223907e-02 - 3.353909e+00 1.669992e-02 - 1.364064e+00 4.689426e-03 - - - 1.799018e+04 6.918022e-03 - 2.477476e+03 4.890291e-02 - 5.659913e+02 1.600323e-01 - 1.615326e+02 1.720492e-01 - 2.603157e+02 1.169764e-01 - 2.299656e+01 3.530117e-03 - 3.807262e-01 2.571777e-03 - 1.310393e-01 7.234866e-04 - - - 1.799018e+04 2.808530e-03 - 2.477476e+03 1.985326e-02 - 5.659913e+02 6.496878e-02 - 1.615326e+02 6.984733e-02 - 2.603157e+02 5.567440e-02 - 3.794300e+00 8.591255e-01 - 1.629212e+00 3.897450e-01 - 3.807262e-01 4.108277e-03 - 1.310393e-01 1.155731e-03 - - - 7.977488e+02 1.348108e-02 - 1.760371e+02 8.956078e-02 - 5.423058e+01 2.334438e-01 - 1.887913e+01 1.826405e-01 - - - 6.210049e+01 7.268341e-02 - 1.627163e+01 3.348934e-01 - 5.142520e+00 5.547344e-01 - 1.612760e+00 3.138046e-01 - - - - - - 0 1 0.000000e+00 3.000000e+01 - 0 1 1.717237e+02 -1.587122e+01 - 0 1 8.795873e+00 -8.401075e+00 - 0 1 1.678889e+00 -2.468170e+00 - 0 2 3.285551e+03 -1.559101e+03 - 0 2 4.334126e+01 -1.055606e+02 - 0 2 1.370595e+00 -3.327627e+00 - - - - 2.832869e+04 1.861324e-02 - 3.293308e+03 1.305182e-01 - 6.874975e+02 4.512925e-01 - 1.852792e+02 5.255960e-01 - 3.331788e+01 2.681546e-02 - 1.388857e+01 1.810175e-02 - 2.594265e+01 5.565386e-03 - - - 9.224700e+02 2.931989e-02 - 1.983383e+02 1.948162e-01 - 6.024212e+01 5.172275e-01 - 2.079577e+01 4.163505e-01 - 9.638792e+00 1.251893e-02 - 3.818761e+00 1.861915e-02 - 1.600081e+00 5.548744e-03 - - - 2.832869e+04 6.618279e-03 - 3.293308e+03 4.640816e-02 - 6.874975e+02 1.604653e-01 - 1.852792e+02 1.868853e-01 - 3.032982e+02 1.041683e-01 - 2.594265e+01 3.793006e-03 - 5.321561e-01 2.442360e-03 - 2.133496e-01 1.216528e-03 - - - 2.832869e+04 2.719032e-03 - 3.293308e+03 1.906618e-02 - 6.874975e+02 6.592506e-02 - 1.852792e+02 7.677937e-02 - 3.032982e+02 5.001043e-02 - 4.223752e+00 8.691871e-01 - 1.823778e+00 3.803838e-01 - 5.321561e-01 3.528156e-03 - 2.133496e-01 1.757358e-03 - - - 9.224700e+02 1.334197e-02 - 1.983383e+02 8.865078e-02 - 6.024212e+01 2.353635e-01 - 2.079577e+01 1.894595e-01 - - - 2.832869e+04 9.277854e-04 - 3.293308e+03 6.505742e-03 - 6.874975e+02 2.249488e-02 - 1.852792e+02 2.619858e-02 - 3.032982e+02 1.676234e-02 - 4.223752e+00 3.861552e-01 - 1.823778e+00 1.689937e-01 - 2.975875e+00 2.580162e-01 - - - 6.893612e+01 7.038264e-02 - 1.806695e+01 3.297978e-01 - 5.745926e+00 5.563627e-01 - 1.824534e+00 3.148138e-01 - - - - - - 0 1 0.000000e+00 3.000000e+01 - 0 1 1.816301e+02 -1.509172e+01 - 0 1 8.787134e+00 -7.884786e+00 - 0 1 1.717769e+00 -2.313954e+00 - 0 2 3.261270e+03 -1.660114e+03 - 0 2 4.336450e+01 -1.063372e+02 - 0 2 1.370653e+00 -3.327384e+00 - - - - 3.057188e+04 1.854130e-02 - 3.522884e+03 1.298469e-01 - 7.318539e+02 4.503413e-01 - 1.966604e+02 5.273101e-01 - 3.546029e+01 2.701428e-02 - 1.483342e+01 1.837944e-02 - 2.766961e+01 5.602087e-03 - - - 9.882035e+02 2.895395e-02 - 2.122455e+02 1.929608e-01 - 6.447958e+01 5.154228e-01 - 2.228907e+01 4.189878e-01 - 1.032476e+01 1.313962e-02 - 4.114168e+00 1.942212e-02 - 1.737704e+00 5.596171e-03 - - - 3.057188e+04 6.619310e-03 - 3.522884e+03 4.635583e-02 - 7.318539e+02 1.607735e-01 - 1.966604e+02 1.882516e-01 - 3.222729e+02 1.037361e-01 - 2.766961e+01 3.981177e-03 - 6.107345e-01 2.769145e-03 - 2.567184e-01 1.255844e-03 - - - 3.057188e+04 2.744006e-03 - 3.522884e+03 1.921661e-02 - 7.318539e+02 6.664796e-02 - 1.966604e+02 7.803889e-02 - 3.222729e+02 5.029882e-02 - 4.527839e+00 8.796345e-01 - 1.968793e+00 3.728859e-01 - 6.107345e-01 3.640638e-03 - 2.567184e-01 1.651077e-03 - - - 9.882035e+02 1.333696e-02 - 2.122455e+02 8.888286e-02 - 6.447958e+01 2.374174e-01 - 2.228907e+01 1.929969e-01 - - - 3.057188e+04 9.836503e-04 - 3.522884e+03 6.888622e-03 - 7.318539e+02 2.389145e-02 - 1.966604e+02 2.797478e-02 - 3.222729e+02 1.782949e-02 - 4.527839e+00 4.115402e-01 - 1.968793e+00 1.744560e-01 - 3.273140e+00 2.807261e-01 - - - 7.581164e+01 6.821491e-02 - 1.996358e+01 3.250123e-01 - 6.405919e+00 5.573717e-01 - 2.065585e+00 3.151559e-01 - - - - - - 0 1 0.000000e+00 4.600000e+01 - 0 1 9.382104e+02 -1.034282e+01 - 0 1 8.103365e+00 -2.198754e+01 - 0 1 8.099241e-01 -7.450007e+00 - 0 2 5.088125e+03 -4.018677e+02 - 0 2 1.160014e+02 -1.689906e+02 - 0 2 3.936118e+02 1.201405e+02 - - - - 6.790279e+04 1.776520e-02 - 7.040326e+03 1.213420e-01 - 1.375403e+03 4.355878e-01 - 3.558255e+02 5.502616e-01 - 6.425357e+01 3.199124e-02 - 2.748527e+01 2.311087e-02 - 5.134544e+01 7.307106e-03 - - - 1.947782e+03 2.528844e-02 - 4.116454e+02 1.730932e-01 - 1.247747e+02 4.930022e-01 - 4.365494e+01 4.465301e-01 - 1.960851e+01 2.358726e-02 - 8.108029e+00 3.359207e-02 - 3.481304e+00 6.952704e-03 - - - 6.790279e+04 6.598182e-03 - 7.040326e+03 4.506770e-02 - 1.375403e+03 1.617819e-01 - 3.558255e+02 2.043730e-01 - 5.903032e+02 9.628463e-02 - 5.134544e+01 4.984940e-03 - 1.653841e+00 3.480653e-03 - 7.005751e-01 1.419582e-03 - - - 6.790279e+04 2.934135e-03 - 7.040326e+03 2.004108e-02 - 1.375403e+03 7.194251e-02 - 3.558255e+02 9.088226e-02 - 5.903032e+02 5.042911e-02 - 8.699199e+00 9.757823e-01 - 3.848173e+00 3.049227e-01 - 1.653841e+00 2.811371e-03 - 7.005751e-01 1.146616e-03 - - - 1.947782e+03 1.278307e-02 - 4.116454e+02 8.749703e-02 - 1.247747e+02 2.492081e-01 - 4.365494e+01 2.257169e-01 - - - 6.790279e+04 1.262043e-03 - 7.040326e+03 8.620157e-03 - 1.375403e+03 3.094423e-02 - 3.558255e+02 3.909067e-02 - 5.903032e+02 2.245986e-02 - 8.699199e+00 5.597291e-01 - 3.848173e+00 1.749100e-01 - 7.641793e+00 3.797049e-01 - - - 1.947782e+03 5.343462e-03 - 4.116454e+02 3.657470e-02 - 1.247747e+02 1.041717e-01 - 4.365494e+01 9.435207e-02 - 2.669398e+00 5.428550e-01 - 1.153922e+00 5.887788e-01 - 4.695989e-01 1.298705e-01 - - - 1.811900e+02 1.730684e-02 - 4.931153e+01 9.523877e-02 - 1.686080e+01 1.933096e-01 - 6.106148e+00 1.238392e-01 - - - 1.811900e+02 4.897803e-02 - 4.931153e+01 2.695238e-01 - 1.686080e+01 5.470622e-01 - 6.106148e+00 3.504625e-01 - 4.088039e+00 6.580949e-03 - 1.359836e+00 1.290444e-02 - 4.219564e-01 7.129024e-03 - - - - - - 0 1 0.000000e+00 4.600000e+01 - 0 1 8.659419e+02 -1.231535e+01 - 0 1 8.976930e+00 -2.083742e+01 - 0 1 8.940789e-01 -7.318656e+00 - 0 2 3.787441e+03 -4.217628e+02 - 0 2 1.499106e+02 -1.618228e+02 - 0 2 3.479049e+02 1.419028e+02 - - - - 7.266615e+04 1.773963e-02 - 7.458577e+03 1.207515e-01 - 1.448048e+03 4.345224e-01 - 3.731342e+02 5.520353e-01 - 6.745249e+01 3.228038e-02 - 2.888902e+01 2.349413e-02 - 5.396235e+01 7.371557e-03 - - - 2.041792e+03 2.532196e-02 - 4.307275e+02 1.732810e-01 - 1.304436e+02 4.936558e-01 - 4.558117e+01 4.470731e-01 - 2.063008e+01 2.258027e-02 - 8.539518e+00 3.189178e-02 - 3.661291e+00 6.454050e-03 - - - 7.266615e+04 6.610922e-03 - 7.458577e+03 4.499975e-02 - 1.448048e+03 1.619309e-01 - 3.731342e+02 2.057237e-01 - 6.206207e+02 9.546550e-02 - 5.396235e+01 5.048381e-03 - 1.777042e+00 3.480766e-03 - 7.657393e-01 1.397729e-03 - - - 7.266615e+04 2.953586e-03 - 7.458577e+03 2.010470e-02 - 1.448048e+03 7.234645e-02 - 3.731342e+02 9.191194e-02 - 6.206207e+02 5.025423e-02 - 9.164452e+00 9.818402e-01 - 4.048987e+00 3.010621e-01 - 1.777042e+00 2.619555e-03 - 7.657393e-01 1.051903e-03 - - - 2.041792e+03 1.288245e-02 - 4.307275e+02 8.815608e-02 - 1.304436e+02 2.511456e-01 - 4.558117e+01 2.274468e-01 - - - 7.266615e+04 1.287268e-03 - 7.458577e+03 8.762279e-03 - 1.448048e+03 3.153092e-02 - 3.731342e+02 4.005820e-02 - 6.206207e+02 2.268724e-02 - 9.164452e+00 5.728315e-01 - 4.048987e+00 1.756476e-01 - 8.116065e+00 3.870636e-01 - - - 2.041792e+03 5.483335e-03 - 4.307275e+02 3.752308e-02 - 1.304436e+02 1.068985e-01 - 4.558117e+01 9.681130e-02 - 2.865541e+00 5.502444e-01 - 1.251380e+00 5.916674e-01 - 5.173573e-01 1.234323e-01 - - - 1.930010e+02 1.776738e-02 - 5.260605e+01 9.860524e-02 - 1.804452e+01 2.022271e-01 - 6.570293e+00 1.307474e-01 - - - 1.930010e+02 4.796829e-02 - 5.260605e+01 2.662139e-01 - 1.804452e+01 5.459717e-01 - 6.570293e+00 3.529913e-01 - 4.538816e+00 6.742746e-03 - 1.550296e+00 1.352712e-02 - 5.002391e-01 7.274215e-03 - - - - - - 0 1 0.000000e+00 4.600000e+01 - 0 1 4.705092e+02 -1.619975e+01 - 0 1 9.105112e+00 -1.693194e+01 - 0 1 1.306836e+00 -9.361014e+00 - 0 2 2.467258e+03 -5.267092e+02 - 0 2 2.605360e+02 -1.302272e+02 - 0 2 1.837901e+02 9.020596e+01 - - - - 7.772952e+04 1.771776e-02 - 7.897737e+03 1.201668e-01 - 1.523595e+03 4.334453e-01 - 3.910089e+02 5.538159e-01 - 7.085474e+01 3.246281e-02 - 3.046331e+01 2.397554e-02 - 5.667781e+01 7.422703e-03 - - - 2.140155e+03 2.533108e-02 - 4.506338e+02 1.733219e-01 - 1.363488e+02 4.940944e-01 - 4.758959e+01 4.477572e-01 - 2.168046e+01 2.173861e-02 - 8.984165e+00 3.046358e-02 - 3.846385e+00 6.039136e-03 - - - 7.772952e+04 6.625106e-03 - 7.897737e+03 4.493334e-02 - 1.523595e+03 1.620758e-01 - 3.910089e+02 2.070854e-01 - 6.518766e+02 9.464965e-02 - 5.667781e+01 5.357000e-03 - 1.904156e+00 4.035483e-03 - 8.320664e-01 1.581948e-03 - - - 7.772952e+04 2.973234e-03 - 7.897737e+03 2.016531e-02 - 1.523595e+03 7.273685e-02 - 3.910089e+02 9.293637e-02 - 6.518766e+02 5.007031e-02 - 9.642199e+00 9.870342e-01 - 4.255994e+00 2.974771e-01 - 1.904156e+00 2.407143e-03 - 8.320664e-01 9.436232e-04 - - - 2.140155e+03 1.296613e-02 - 4.506338e+02 8.871763e-02 - 1.363488e+02 2.529102e-01 - 4.758959e+01 2.291918e-01 - - - 7.772952e+04 1.312356e-03 - 7.897737e+03 8.900766e-03 - 1.523595e+03 3.210532e-02 - 3.910089e+02 4.102118e-02 - 6.518766e+02 2.290314e-02 - 9.642199e+00 5.853485e-01 - 4.255994e+00 1.764151e-01 - 8.607677e+00 3.944439e-01 - - - 2.140155e+03 5.615018e-03 - 4.506338e+02 3.841943e-02 - 1.363488e+02 1.095235e-01 - 4.758959e+01 9.925217e-02 - 3.067791e+00 5.586107e-01 - 1.352145e+00 5.942375e-01 - 5.650612e-01 1.167132e-01 - - - 1.880339e+02 2.129477e-02 - 5.103533e+01 1.140669e-01 - 1.734697e+01 2.187109e-01 - 6.166323e+00 1.198977e-01 - - - 1.880339e+02 5.516419e-02 - 5.103533e+01 2.954908e-01 - 1.734697e+01 5.665716e-01 - 6.166323e+00 3.105956e-01 - 5.027724e+00 7.767543e-04 - 1.779129e+00 1.617500e-03 - 5.881318e-01 8.672809e-04 - - - - - - 0 1 0.000000e+00 4.600000e+01 - 0 1 9.831894e+02 -1.826324e+01 - 0 1 9.581656e+00 -1.663640e+01 - 0 1 1.531146e+00 -9.697847e+00 - 0 2 2.008619e+03 -1.147411e+03 - 0 2 2.867595e+02 -1.701795e+02 - 0 2 2.181314e+02 1.345126e+02 - - - - 8.310434e+04 1.770100e-02 - 8.358395e+03 1.195938e-01 - 1.602101e+03 4.323621e-01 - 4.094573e+02 5.555928e-01 - 7.427984e+01 3.275256e-02 - 3.197229e+01 2.438902e-02 - 5.947033e+01 7.489354e-03 - - - 2.242920e+03 2.531963e-02 - 4.713680e+02 1.732369e-01 - 1.424906e+02 4.943444e-01 - 4.968056e+01 4.485601e-01 - 2.275951e+01 2.104678e-02 - 9.440646e+00 2.927810e-02 - 4.034581e+00 5.689717e-03 - - - 8.310434e+04 6.640886e-03 - 8.358395e+03 4.486803e-02 - 1.602101e+03 1.622093e-01 - 4.094573e+02 2.084418e-01 - 6.845819e+02 9.378192e-02 - 5.947033e+01 5.426753e-03 - 2.035795e+00 4.059384e-03 - 8.998324e-01 1.545840e-03 - - - 8.310434e+04 2.993153e-03 - 8.358395e+03 2.022274e-02 - 1.602101e+03 7.311033e-02 - 4.094573e+02 9.394805e-02 - 6.845819e+02 4.984210e-02 - 1.013791e+01 9.923610e-01 - 4.468113e+00 2.942143e-01 - 2.035795e+00 2.144044e-03 - 8.998324e-01 8.164662e-04 - - - 2.242920e+03 1.303596e-02 - 4.713680e+02 8.919199e-02 - 1.424906e+02 2.545160e-01 - 4.968056e+01 2.309437e-01 - - - 8.310434e+04 1.337247e-03 - 8.358395e+03 9.034881e-03 - 1.602101e+03 3.266339e-02 - 4.094573e+02 4.197303e-02 - 6.845819e+02 2.308636e-02 - 1.013791e+01 5.977351e-01 - 4.468113e+00 1.772160e-01 - 9.115573e+00 4.017739e-01 - - - 2.242920e+03 5.738007e-03 - 4.713680e+02 3.925944e-02 - 1.424906e+02 1.120297e-01 - 4.968056e+01 1.016540e-01 - 3.276480e+00 5.675947e-01 - 1.456225e+00 5.963576e-01 - 6.129979e-01 1.101295e-01 - - - 2.177113e+02 1.846960e-02 - 5.949579e+01 1.040935e-01 - 2.052317e+01 2.175371e-01 - 7.545045e+00 1.429898e-01 - - - 2.177113e+02 4.618225e-02 - 5.949579e+01 2.602803e-01 - 2.052317e+01 5.439398e-01 - 7.545045e+00 3.575382e-01 - 5.459859e+00 7.069627e-03 - 1.942199e+00 1.465446e-02 - 6.617277e-01 7.520586e-03 - - - - - - 0 1 0.000000e+00 4.600000e+01 - 0 1 9.418354e+02 -1.435322e+01 - 0 1 9.301749e+00 -1.674032e+01 - 0 1 1.554262e+00 -8.765613e+00 - 0 2 3.792865e+03 -4.214712e+02 - 0 2 2.151862e+02 -1.628815e+02 - 0 2 2.366327e+02 1.197458e+02 - - - - 8.881194e+04 1.768881e-02 - 8.841808e+03 1.190303e-01 - 1.683700e+03 4.312702e-01 - 4.284975e+02 5.573705e-01 - 7.782165e+01 3.304250e-02 - 3.353386e+01 2.481793e-02 - 6.235374e+01 7.557020e-03 - - - 2.349964e+03 2.529389e-02 - 4.928960e+02 1.730624e-01 - 1.488570e+02 4.944575e-01 - 5.184959e+01 4.494301e-01 - 2.386824e+01 2.047717e-02 - 9.909558e+00 2.829034e-02 - 4.226890e+00 5.394690e-03 - - - 8.881194e+04 6.658291e-03 - 8.841808e+03 4.480449e-02 - 1.683700e+03 1.623355e-01 - 4.284975e+02 2.098013e-01 - 7.185638e+02 9.289105e-02 - 6.235374e+01 5.499755e-03 - 2.171925e+00 4.096793e-03 - 9.685845e-01 1.509237e-03 - - - 8.881194e+04 3.013393e-03 - 8.841808e+03 2.027751e-02 - 1.683700e+03 7.346942e-02 - 4.284975e+02 9.495135e-02 - 7.185638e+02 4.958847e-02 - 1.064916e+01 9.973573e-01 - 4.685949e+00 2.912147e-01 - 2.171925e+00 1.842732e-03 - 9.685845e-01 6.788531e-04 - - - 2.349964e+03 1.309519e-02 - 4.928960e+02 8.959812e-02 - 1.488570e+02 2.559913e-01 - 5.184959e+01 2.326796e-01 - - - 8.881194e+04 1.361861e-03 - 8.841808e+03 9.164140e-03 - 1.683700e+03 3.320349e-02 - 4.284975e+02 4.291195e-02 - 7.185638e+02 2.324458e-02 - 1.064916e+01 6.097032e-01 - 4.685949e+00 1.780250e-01 - 9.640530e+00 4.089963e-01 - - - 2.349964e+03 5.853232e-03 - 4.928960e+02 4.004817e-02 - 1.488570e+02 1.144219e-01 - 5.184959e+01 1.040021e-01 - 3.491920e+00 5.769315e-01 - 1.563864e+00 5.979902e-01 - 6.612446e-01 1.039140e-01 - - - 2.096282e+02 2.235868e-02 - 5.701584e+01 1.210746e-01 - 1.947108e+01 2.345506e-01 - 6.972525e+00 1.284916e-01 - - - 2.096282e+02 5.407733e-02 - 5.701584e+01 2.928344e-01 - 1.947108e+01 5.672906e-01 - 6.972525e+00 3.107734e-01 - 6.042350e+00 6.770240e-04 - 2.215766e+00 1.489093e-03 - 7.632974e-01 7.759726e-04 - - - - - - 0 1 0.000000e+00 4.600000e+01 - 0 1 1.146362e+03 -1.450911e+01 - 0 1 9.704362e+00 -1.595966e+01 - 0 1 1.616917e+00 -8.374774e+00 - 0 2 4.356249e+03 -2.980129e+02 - 0 2 1.938917e+02 -2.640253e+02 - 0 2 2.420282e+02 1.604077e+02 - - - - 9.487214e+04 1.768122e-02 - 9.349124e+03 1.184763e-01 - 1.768512e+03 4.301696e-01 - 4.481476e+02 5.591477e-01 - 8.148399e+01 3.333339e-02 - 3.514965e+01 2.526344e-02 - 6.533041e+01 7.625927e-03 - - - 2.501286e+03 2.463870e-02 - 5.235308e+02 1.692299e-01 - 1.580152e+02 4.890454e-01 - 5.507622e+01 4.561658e-01 - 2.510059e+01 2.225373e-02 - 1.043497e+01 3.103876e-02 - 4.447579e+00 5.880920e-03 - - - 9.487214e+04 6.677363e-03 - 9.349124e+03 4.474291e-02 - 1.768512e+03 1.624548e-01 - 4.481476e+02 2.111638e-01 - 7.538748e+02 9.197723e-02 - 6.533041e+01 5.576147e-03 - 2.312876e+00 4.145291e-03 - 1.038420e+00 1.473910e-03 - - - 9.487214e+04 3.033999e-03 - 9.349124e+03 2.032987e-02 - 1.768512e+03 7.381472e-02 - 4.481476e+02 9.594665e-02 - 7.538748e+02 4.931002e-02 - 1.117613e+01 1.002040e+00 - 4.909653e+00 2.884592e-01 - 2.312876e+00 1.504520e-03 - 1.038420e+00 5.349510e-04 - - - 2.501286e+03 1.282336e-02 - 5.235308e+02 8.807674e-02 - 1.580152e+02 2.545266e-01 - 5.507622e+01 2.374142e-01 - - - 9.487214e+04 1.386184e-03 - 9.349124e+03 9.288381e-03 - 1.768512e+03 3.372472e-02 - 4.481476e+02 4.383643e-02 - 7.538748e+02 2.337702e-02 - 1.117613e+01 6.212373e-01 - 4.909653e+00 1.788368e-01 - 1.018270e+01 4.160800e-01 - - - 2.501286e+03 5.815405e-03 - 5.235308e+02 3.994288e-02 - 1.580152e+02 1.154280e-01 - 5.507622e+01 1.076676e-01 - 3.723646e+00 5.840232e-01 - 1.680574e+00 6.006810e-01 - 7.131027e-01 9.949652e-02 - - - 2.438967e+02 1.897128e-02 - 6.679120e+01 1.083897e-01 - 2.315135e+01 2.303218e-01 - 8.582120e+00 1.535990e-01 - - - 2.438967e+02 4.465139e-02 - 6.679120e+01 2.551094e-01 - 2.315135e+01 5.420927e-01 - 8.582120e+00 3.615153e-01 - 6.419499e+00 7.378972e-03 - 2.354200e+00 1.564342e-02 - 8.317158e-01 7.720316e-03 - - - - - - 0 1 0.000000e+00 4.800000e+01 - 0 1 4.418373e+02 -7.390764e+00 - 0 1 1.035219e+01 -1.743794e+01 - 0 1 1.692241e+00 -9.019157e+00 - 0 2 8.654932e+02 -7.842653e+02 - 0 2 9.280596e+01 -9.552911e+01 - 0 2 5.295508e-01 -1.352907e+00 - - - - 1.009176e+05 1.774244e-02 - 9.844100e+03 1.183708e-01 - 1.849438e+03 4.304124e-01 - 4.666344e+02 5.595855e-01 - 8.548912e+01 3.283032e-02 - 3.686122e+01 2.531609e-02 - 7.183215e+01 7.341386e-03 - - - 2.622068e+03 2.454877e-02 - 5.476712e+02 1.686664e-01 - 1.651321e+02 4.885798e-01 - 5.749730e+01 4.577832e-01 - 2.488532e+01 2.535362e-02 - 9.566524e+00 3.045200e-02 - - - 1.009176e+05 6.723811e-03 - 9.844100e+03 4.485869e-02 - 1.849438e+03 1.631124e-01 - 4.666344e+02 2.120648e-01 - 7.886446e+02 9.121970e-02 - 7.183215e+01 5.335173e-03 - 1.950479e+00 3.551284e-03 - - - 1.009176e+05 3.089298e-03 - 9.844100e+03 2.061061e-02 - 1.849438e+03 7.494302e-02 - 4.666344e+02 9.743451e-02 - 7.886446e+02 4.798006e-02 - 1.039584e+01 1.222086e+00 - 1.950479e+00 8.737503e-02 - 2.172664e+00 9.018310e-03 - - - 2.622068e+03 1.281975e-02 - 5.476712e+02 8.808026e-02 - 1.651321e+02 2.551440e-01 - 5.749730e+01 2.390616e-01 - 4.809538e-01 7.494866e-03 - 1.633000e-01 6.217486e-03 - - - 1.009176e+05 1.391221e-03 - 9.844100e+03 9.281691e-03 - 1.849438e+03 3.374950e-02 - 4.666344e+02 4.387822e-02 - 7.886446e+02 2.627042e-02 - 1.039584e+01 6.546047e-01 - 1.233037e+01 4.443163e-01 - 2.172664e+00 1.660082e-02 - - - 1.009176e+05 5.351154e-04 - 9.844100e+03 3.570085e-03 - 1.849438e+03 1.298132e-02 - 4.666344e+02 1.687720e-02 - 7.886446e+02 9.131888e-03 - 1.039584e+01 2.997215e-01 - 1.233037e+01 1.887165e-01 - 3.439283e-01 9.534798e-01 - 1.443567e-01 3.059850e-01 - - - 2.622068e+03 5.884360e-03 - 5.476712e+02 4.042948e-02 - 1.651321e+02 1.171130e-01 - 5.749730e+01 1.097310e-01 - 3.756752e+00 6.734913e-01 - 1.502927e+00 5.673248e-01 - 4.809538e-01 1.149766e-02 - 1.633000e-01 9.538066e-03 - - - 2.575297e+02 1.919204e-02 - 7.058664e+01 1.103332e-01 - 2.451981e+01 2.362293e-01 - 9.123165e+00 1.585533e-01 - - - 2.575297e+02 4.397336e-02 - 7.058664e+01 2.527986e-01 - 2.451981e+01 5.412554e-01 - 9.123165e+00 3.632818e-01 - 6.952956e+00 7.426077e-03 - 2.591209e+00 1.600456e-02 - 9.343775e-01 7.907209e-03 - - - - - - 0 1 0.000000e+00 4.800000e+01 - 0 1 4.239742e+02 -6.958587e+00 - 0 1 1.033137e+01 -1.610109e+01 - 0 1 1.704769e+00 -8.650936e+00 - 0 2 8.479779e+02 -8.000354e+02 - 0 2 9.325344e+01 -9.308317e+01 - 0 2 5.295500e-01 -1.376229e+00 - - - - 1.077089e+05 1.774558e-02 - 1.039961e+04 1.178455e-01 - 1.940478e+03 4.293305e-01 - 4.874210e+02 5.613372e-01 - 8.943074e+01 3.309324e-02 - 3.860205e+01 2.578581e-02 - 7.505492e+01 7.418349e-03 - - - 2.753935e+03 2.438246e-02 - 5.739820e+02 1.676586e-01 - 1.729309e+02 4.872197e-01 - 6.034045e+01 4.577277e-01 - 2.613393e+01 2.714764e-02 - 1.011833e+01 3.325257e-02 - - - 1.077089e+05 6.747071e-03 - 1.039961e+04 4.480620e-02 - 1.940478e+03 1.632363e-01 - 4.874210e+02 2.134268e-01 - 8.266035e+02 9.027008e-02 - 7.505492e+01 5.438905e-03 - 2.091223e+00 3.565554e-03 - - - 1.077089e+05 3.110860e-03 - 1.039961e+04 2.065872e-02 - 1.940478e+03 7.526308e-02 - 4.874210e+02 9.840430e-02 - 8.266035e+02 4.768257e-02 - 1.092449e+01 1.223205e+00 - 2.091223e+00 8.853101e-02 - 2.328715e+00 9.139834e-03 - - - 2.753935e+03 1.278409e-02 - 5.739820e+02 8.790595e-02 - 1.729309e+02 2.554566e-01 - 6.034045e+01 2.399935e-01 - 5.478717e-01 7.140049e-03 - 1.958695e-01 5.442036e-03 - - - 1.077089e+05 1.417181e-03 - 1.039961e+04 9.411271e-03 - 1.940478e+03 3.428680e-02 - 4.874210e+02 4.482900e-02 - 8.266035e+02 2.622452e-02 - 1.092449e+01 6.696110e-01 - 1.293764e+01 4.472684e-01 - 2.328715e+00 1.806428e-02 - - - 1.077089e+05 5.707487e-04 - 1.039961e+04 3.790250e-03 - 1.940478e+03 1.380850e-02 - 4.874210e+02 1.805421e-02 - 8.266035e+02 9.541499e-03 - 1.092449e+01 3.214358e-01 - 1.293764e+01 2.015345e-01 - 3.911176e-01 1.003898e+00 - 1.703696e-01 2.809982e-01 - - - 2.753935e+03 5.944570e-03 - 5.739820e+02 4.087604e-02 - 1.729309e+02 1.187867e-01 - 6.034045e+01 1.115964e-01 - 4.032446e+00 6.693907e-01 - 1.633220e+00 5.750905e-01 - 5.478717e-01 1.248044e-02 - 1.958695e-01 9.512402e-03 - - - 2.712525e+02 1.942862e-02 - 7.440013e+01 1.122994e-01 - 2.589187e+01 2.419585e-01 - 9.665031e+00 1.629869e-01 - - - 2.712525e+02 4.342654e-02 - 7.440013e+01 2.510098e-01 - 2.589187e+01 5.408217e-01 - 9.665031e+00 3.643056e-01 - 7.510341e+00 7.387887e-03 - 2.841690e+00 1.619778e-02 - 1.044140e+00 8.039416e-03 - - - - - - 0 1 0.000000e+00 7.800000e+01 - 0 1 4.957230e+02 -2.227257e+01 - 0 1 5.940970e+00 -2.119242e+01 - 0 1 1.901390e+00 -1.042548e+01 - 0 2 4.261830e+04 -3.320892e+03 - 0 2 1.359940e+02 -3.509820e+02 - 0 2 6.530800e-01 -5.255910e+00 - - - - 5.036713e+05 1.957831e-02 - 3.856487e+04 1.086627e-01 - 5.904381e+03 3.991082e-01 - 1.289249e+03 6.032374e-01 - 2.558320e+02 3.865044e-02 - 1.104903e+02 4.758163e-02 - 1.942904e+02 1.004381e-02 - - - 7.731113e+03 2.267175e-02 - 1.507506e+03 1.542949e-01 - 4.376697e+02 4.720559e-01 - 1.502123e+02 4.816205e-01 - 6.840685e+01 3.163158e-02 - 2.719751e+01 3.959489e-02 - - - 5.036713e+05 8.076128e-03 - 3.856487e+04 4.482377e-02 - 5.904381e+03 1.646337e-01 - 1.289249e+03 2.488377e-01 - 2.536357e+03 6.161120e-02 - 1.942904e+02 1.078298e-02 - 7.867014e+00 1.012349e-02 - 3.410552e+00 2.460003e-03 - - - 5.036713e+05 3.902105e-03 - 3.856487e+04 2.165729e-02 - 5.904381e+03 7.954527e-02 - 1.289249e+03 1.202297e-01 - 2.536357e+03 3.545812e-02 - 3.244588e+01 1.057109e+00 - 1.327227e+01 2.663563e-01 - 1.489370e+00 3.366259e-03 - 5.994629e-01 8.000617e-04 - - - 7.731113e+03 1.276944e-02 - 1.507506e+03 8.690371e-02 - 4.376697e+02 2.658766e-01 - 1.502123e+02 2.712637e-01 - 1.959124e+00 8.004960e-03 - 7.158242e-01 5.260924e-03 - - - 5.036713e+05 2.085825e-03 - 3.856487e+04 1.157666e-02 - 5.904381e+03 4.252001e-02 - 1.289249e+03 6.426743e-02 - 2.536357e+03 1.071725e-02 - 3.244588e+01 1.162042e+00 - 1.327227e+01 2.927960e-01 - 1.489370e+00 1.834061e-03 - 5.994629e-01 4.359030e-04 - - - 5.036713e+05 9.521954e-04 - 3.856487e+04 5.284833e-03 - 5.904381e+03 1.941071e-02 - 1.289249e+03 2.933858e-02 - 2.536357e+03 3.102355e-03 - 3.244588e+01 6.349639e-01 - 1.327227e+01 1.599898e-01 - 1.489370e+00 1.187720e+00 - 5.994629e-01 2.822865e-01 - - - 7.731113e+03 2.697149e-03 - 1.507506e+03 1.835573e-02 - 4.376697e+02 5.615823e-02 - 1.502123e+02 5.729608e-02 - 1.221030e+01 4.499210e-01 - 5.095106e+00 3.981692e-01 - - - 7.731113e+03 6.519048e-03 - 1.507506e+03 4.436605e-02 - 4.376697e+02 1.357352e-01 - 1.502123e+02 1.384854e-01 - 1.221030e+01 6.862869e-01 - 5.095106e+00 6.073474e-01 - 1.959124e+00 1.472472e-02 - 7.158242e-01 9.677202e-03 - - - 8.591652e+01 9.091024e-02 - 2.563866e+01 3.752020e-01 - 8.801142e+00 5.550099e-01 - 2.890798e+00 2.934681e-01 - - - 7.481043e+02 6.263403e-03 - 2.053677e+02 3.915277e-02 - 7.305338e+01 9.262526e-02 - 2.829822e+01 6.681168e-02 - 2.528211e+00 3.702531e-01 - 9.097497e-01 6.154945e-01 - 2.982332e-01 2.926222e-01 - - - 7.481043e+02 1.921276e-02 - 2.053677e+02 1.200997e-01 - 7.305338e+01 2.841247e-01 - 2.829822e+01 2.049424e-01 - - - 7.481043e+02 3.587156e-02 - 2.053677e+02 2.242345e-01 - 7.305338e+01 5.304805e-01 - 2.829822e+01 3.826418e-01 - 2.498019e+01 9.835162e-03 - 1.029172e+01 2.417978e-02 - 4.169595e+00 1.411766e-02 - - - - - - 0 1 0.000000e+00 7.800000e+01 - 0 1 4.869652e+02 -2.313377e+01 - 0 1 6.787635e+00 -2.483263e+01 - 0 1 1.835036e+00 -1.017391e+01 - 0 2 4.518024e+04 -4.899832e+03 - 0 2 1.141396e+02 -2.195219e+02 - 0 2 7.745997e-01 -5.452892e+00 - - - - 5.341441e+05 1.974472e-02 - 4.059137e+04 1.085520e-01 - 6.160331e+03 3.979800e-01 - 1.335977e+03 6.046208e-01 - 2.670142e+02 3.861109e-02 - 1.149689e+02 4.891774e-02 - 2.014949e+02 1.008361e-02 - - - 8.021998e+03 2.264351e-02 - 1.559323e+03 1.539134e-01 - 4.518366e+02 4.715735e-01 - 1.549029e+02 4.824037e-01 - 7.081715e+01 3.163589e-02 - 2.821050e+01 3.994888e-02 - - - 5.341441e+05 8.171424e-03 - 4.059137e+04 4.492462e-02 - 6.160331e+03 1.647054e-01 - 1.335977e+03 2.502245e-01 - 2.652756e+03 6.037324e-02 - 2.014949e+02 1.101182e-02 - 8.177380e+00 1.042723e-02 - 3.550598e+00 2.516978e-03 - - - 5.341441e+05 3.952489e-03 - 4.059137e+04 2.172988e-02 - 6.160331e+03 7.966743e-02 - 1.335977e+03 1.210327e-01 - 2.652756e+03 3.482429e-02 - 3.356452e+01 1.056428e+00 - 1.374057e+01 2.668860e-01 - 1.578173e+00 3.339576e-03 - 6.446766e-01 7.705908e-04 - - - 8.021998e+03 1.277572e-02 - 1.559323e+03 8.683968e-02 - 4.518366e+02 2.660671e-01 - 1.549029e+02 2.721776e-01 - 2.078785e+00 9.057867e-03 - 7.755449e-01 5.898782e-03 - - - 5.341441e+05 2.116369e-03 - 4.059137e+04 1.163531e-02 - 6.160331e+03 4.265810e-02 - 1.335977e+03 6.480722e-02 - 2.652756e+03 1.057343e-02 - 3.356452e+01 1.167056e+00 - 1.374057e+01 2.948342e-01 - 1.578173e+00 2.073523e-03 - 6.446766e-01 4.784553e-04 - - - 5.341441e+05 9.778673e-04 - 4.059137e+04 5.376090e-03 - 6.160331e+03 1.971016e-02 - 1.335977e+03 2.994415e-02 - 2.652756e+03 3.086386e-03 - 3.356452e+01 6.470368e-01 - 1.374057e+01 1.634613e-01 - 1.578173e+00 1.205839e+00 - 6.446766e-01 2.782415e-01 - - - 8.021998e+03 2.758740e-03 - 1.559323e+03 1.875182e-02 - 4.518366e+02 5.745350e-02 - 1.549029e+02 5.877298e-02 - 1.267788e+01 4.597806e-01 - 5.316224e+00 4.099928e-01 - - - 8.021998e+03 6.548585e-03 - 1.559323e+03 4.451232e-02 - 4.518366e+02 1.363808e-01 - 1.549029e+02 1.395129e-01 - 1.267788e+01 6.839064e-01 - 5.316224e+00 6.098490e-01 - 2.078785e+00 1.506723e-02 - 7.755449e-01 9.812276e-03 - - - 9.056942e+01 8.891606e-02 - 2.712435e+01 3.716817e-01 - 9.372578e+00 5.560401e-01 - 3.113754e+00 2.936912e-01 - - - 7.739088e+02 6.560546e-03 - 2.123687e+02 4.109977e-02 - 7.556823e+01 9.757141e-02 - 2.929984e+01 7.068209e-02 - 2.735608e+00 3.709272e-01 - 1.014563e+00 6.219666e-01 - 3.459034e-01 2.814543e-01 - - - 7.739088e+02 1.921431e-02 - 2.123687e+02 1.203716e-01 - 7.556823e+01 2.857639e-01 - 2.929984e+01 2.070114e-01 - - - 7.739088e+02 3.562056e-02 - 2.123687e+02 2.231517e-01 - 7.556823e+01 5.297651e-01 - 2.929984e+01 3.837692e-01 - 2.606878e+01 9.817937e-03 - 1.079897e+01 2.450247e-02 - 4.401687e+00 1.452283e-02 - - - - - - 0 1 0.000000e+00 7.800000e+01 - 0 1 2.690351e+02 -3.253767e+01 - 0 1 7.166323e+00 -2.260474e+01 - 0 1 1.849351e+00 -9.178123e+00 - 0 2 1.613278e+04 -8.969041e+03 - 0 2 9.110662e+01 -2.673083e+02 - 0 2 8.409393e-01 -5.326061e+00 - - - - 5.664029e+05 1.991978e-02 - 4.272825e+04 1.084627e-01 - 6.427628e+03 3.968563e-01 - 1.384302e+03 6.059809e-01 - 2.787654e+02 3.855249e-02 - 1.196200e+02 5.030315e-02 - 2.089484e+02 1.012059e-02 - - - 8.323227e+03 2.261280e-02 - 1.612743e+03 1.535115e-01 - 4.663912e+02 4.710569e-01 - 1.597001e+02 4.832781e-01 - 7.316488e+01 3.175420e-02 - 2.914382e+01 4.022383e-02 - - - 5.664029e+05 8.270370e-03 - 4.272825e+04 4.503196e-02 - 6.427628e+03 1.647683e-01 - 1.384302e+03 2.515934e-01 - 2.774629e+03 5.914958e-02 - 2.089484e+02 1.124416e-02 - 8.497441e+00 1.074335e-02 - 3.694375e+00 2.576774e-03 - - - 5.664029e+05 4.004475e-03 - 4.272825e+04 2.180427e-02 - 6.427628e+03 7.978004e-02 - 1.384302e+03 1.218204e-01 - 2.774629e+03 3.419788e-02 - 3.471407e+01 1.055621e+00 - 1.422432e+01 2.674770e-01 - 1.670083e+00 3.318727e-03 - 6.905768e-01 7.393068e-04 - - - 8.323227e+03 1.277915e-02 - 1.612743e+03 8.675373e-02 - 4.663912e+02 2.662078e-01 - 1.597001e+02 2.731143e-01 - 2.199622e+00 8.933002e-03 - 8.363468e-01 5.729860e-03 - - - 5.664029e+05 2.147802e-03 - 4.272825e+04 1.169473e-02 - 6.427628e+03 4.279006e-02 - 1.384302e+03 6.533842e-02 - 2.774629e+03 1.043350e-02 - 3.471407e+01 1.171893e+00 - 1.422432e+01 2.969383e-01 - 1.670083e+00 2.354879e-03 - 6.905768e-01 5.245921e-04 - - - 5.664029e+05 1.004063e-03 - 4.272825e+04 5.467098e-03 - 6.427628e+03 2.000367e-02 - 1.384302e+03 3.054466e-02 - 2.774629e+03 3.071493e-03 - 3.471407e+01 6.589934e-01 - 1.422432e+01 1.669781e-01 - 1.670083e+00 1.225433e+00 - 6.905768e-01 2.729875e-01 - - - 8.323227e+03 2.818922e-03 - 1.612743e+03 1.913680e-02 - 4.663912e+02 5.872215e-02 - 1.597001e+02 6.024565e-02 - 1.314259e+01 4.713673e-01 - 5.534688e+00 4.203565e-01 - - - 8.323227e+03 6.576158e-03 - 1.612743e+03 4.464354e-02 - 4.663912e+02 1.369907e-01 - 1.597001e+02 1.405448e-01 - 1.314259e+01 6.846582e-01 - 5.534688e+00 6.105653e-01 - 2.199622e+00 1.531727e-02 - 8.363468e-01 9.824892e-03 - - - 9.531382e+01 8.702363e-02 - 2.864076e+01 3.681724e-01 - 9.957159e+00 5.567165e-01 - 3.343175e+00 2.938595e-01 - - - 8.016838e+02 6.805233e-03 - 2.199102e+02 4.275435e-02 - 7.828421e+01 1.020009e-01 - 3.039040e+01 7.443423e-02 - 2.938973e+00 3.732035e-01 - 1.117393e+00 6.279238e-01 - 3.920597e-01 2.716109e-01 - - - 8.016838e+02 1.915052e-02 - 2.199102e+02 1.203145e-01 - 7.828421e+01 2.870394e-01 - 3.039040e+01 2.094645e-01 - - - 8.016838e+02 3.525897e-02 - 2.199102e+02 2.215170e-01 - 7.828421e+01 5.284824e-01 - 3.039040e+01 3.856553e-01 - 2.715512e+01 9.975382e-03 - 1.130529e+01 2.519320e-02 - 4.636159e+00 1.512790e-02 - - - - - - 0 1 0.000000e+00 7.800000e+01 - 0 1 3.942586e+02 -2.773872e+01 - 0 1 8.002691e+00 -2.548371e+01 - 0 1 1.687569e+00 -1.106726e+01 - 0 2 1.228252e+04 -1.573989e+04 - 0 2 7.531426e+01 -1.783193e+02 - 0 2 5.604055e-01 -1.354229e+00 - - - - 6.005359e+05 2.010310e-02 - 4.498041e+04 1.083926e-01 - 6.706596e+03 3.957331e-01 - 1.434233e+03 6.073169e-01 - 2.911599e+02 3.846977e-02 - 1.244600e+02 5.174752e-02 - 2.166603e+02 1.015525e-02 - - - 8.633443e+03 2.258652e-02 - 1.667493e+03 1.531295e-01 - 4.812575e+02 4.705597e-01 - 1.645937e+02 4.841025e-01 - 7.557288e+01 3.187815e-02 - 3.010295e+01 4.052008e-02 - - - 6.005359e+05 8.373678e-03 - 4.498041e+04 4.514948e-02 - 6.706596e+03 1.648373e-01 - 1.434233e+03 2.529697e-01 - 2.902707e+03 5.792081e-02 - 2.166603e+02 1.148299e-02 - 8.827412e+00 1.107537e-02 - 3.842130e+00 2.640433e-03 - - - 6.005359e+05 4.058625e-03 - 4.498041e+04 2.188343e-02 - 6.706596e+03 7.989475e-02 - 1.434233e+03 1.226115e-01 - 2.902707e+03 3.356623e-02 - 3.589477e+01 1.054692e+00 - 1.472367e+01 2.681120e-01 - 1.765559e+00 3.301523e-03 - 7.374273e-01 7.085223e-04 - - - 8.633443e+03 1.278445e-02 - 1.667493e+03 8.667454e-02 - 4.812575e+02 2.663467e-01 - 1.645937e+02 2.740123e-01 - 2.323357e+00 8.859667e-03 - 8.985772e-01 5.584725e-03 - - - 6.005359e+05 2.180211e-03 - 4.498041e+04 1.175534e-02 - 6.706596e+03 4.291785e-02 - 1.434233e+03 6.586441e-02 - 2.902707e+03 1.029230e-02 - 3.589477e+01 1.176550e+00 - 1.472367e+01 2.990894e-01 - 1.765559e+00 2.673176e-03 - 7.374273e-01 5.736761e-04 - - - 6.005359e+05 1.030740e-03 - 4.498041e+04 5.557580e-03 - 6.706596e+03 2.029030e-02 - 1.434233e+03 3.113876e-02 - 2.902707e+03 3.055656e-03 - 3.589477e+01 6.707732e-01 - 1.472367e+01 1.705165e-01 - 1.765559e+00 1.245654e+00 - 7.374273e-01 2.673232e-01 - - - 8.633443e+03 2.878185e-03 - 1.667493e+03 1.951319e-02 - 4.812575e+02 5.996310e-02 - 1.645937e+02 6.168886e-02 - 1.361899e+01 4.826986e-01 - 5.759339e+00 4.305844e-01 - - - 8.633443e+03 6.604338e-03 - 1.667493e+03 4.477534e-02 - 4.812575e+02 1.375925e-01 - 1.645937e+02 1.415524e-01 - 1.361899e+01 6.853055e-01 - 5.759339e+00 6.113170e-01 - 2.323357e+00 1.559451e-02 - 8.985772e-01 9.830062e-03 - - - 1.001471e+02 8.530397e-02 - 3.018689e+01 3.650135e-01 - 1.055441e+01 5.575616e-01 - 3.578778e+00 2.941948e-01 - - - 8.286368e+02 7.051211e-03 - 2.272032e+02 4.438944e-02 - 8.090108e+01 1.062558e-01 - 3.143327e+01 7.785896e-02 - 3.142810e+00 3.760460e-01 - 1.221199e+00 6.332214e-01 - 4.390344e-01 2.630759e-01 - - - 8.286368e+02 1.915156e-02 - 2.272032e+02 1.205647e-01 - 8.090108e+01 2.885980e-01 - 3.143327e+01 2.114702e-01 - - - 8.286368e+02 3.502436e-02 - 2.272032e+02 2.204886e-01 - 8.090108e+01 5.277877e-01 - 3.143327e+01 3.867364e-01 - 2.828874e+01 9.957523e-03 - 1.183466e+01 2.550149e-02 - 4.878431e+00 1.551388e-02 - - - - - - 0 1 0.000000e+00 7.800000e+01 - 0 1 5.190520e+02 -2.697507e+01 - 0 1 7.767834e+00 -2.599058e+01 - 0 1 1.688595e+00 -1.123702e+01 - 0 2 2.491467e+04 -9.487801e+03 - 0 2 8.702394e+01 -1.511301e+02 - 0 2 6.501742e-01 -1.203176e+00 - - - - 6.366627e+05 2.029520e-02 - 4.735586e+04 1.083430e-01 - 6.998004e+03 3.946125e-01 - 1.485869e+03 6.086274e-01 - 3.042431e+02 3.836574e-02 - 1.294960e+02 5.325298e-02 - 2.246464e+02 1.018374e-02 - - - 8.953691e+03 2.256167e-02 - 1.723751e+03 1.527500e-01 - 4.964799e+02 4.700584e-01 - 1.695920e+02 4.849299e-01 - 7.804048e+01 3.200251e-02 - 3.108457e+01 4.082515e-02 - - - 6.366627e+05 8.481292e-03 - 4.735586e+04 4.527617e-02 - 6.998004e+03 1.649072e-01 - 1.485869e+03 2.543433e-01 - 3.037215e+03 5.669577e-02 - 2.246464e+02 1.172300e-02 - 9.167218e+00 1.142172e-02 - 3.993346e+00 2.706977e-03 - - - 6.366627e+05 4.114772e-03 - 4.735586e+04 2.196613e-02 - 6.998004e+03 8.000616e-02 - 1.485869e+03 1.233969e-01 - 3.037215e+03 3.294287e-02 - 3.711120e+01 1.053523e+00 - 1.524462e+01 2.688838e-01 - 1.864578e+00 3.281989e-03 - 7.850906e-01 6.774653e-04 - - - 8.953691e+03 1.278998e-02 - 1.723751e+03 8.659245e-02 - 4.964799e+02 2.664713e-01 - 1.695920e+02 2.749018e-01 - 2.449806e+00 8.811177e-03 - 9.619672e-01 5.445738e-03 - - - 6.366627e+05 2.213493e-03 - 4.735586e+04 1.181641e-02 - 6.998004e+03 4.303835e-02 - 1.485869e+03 6.637986e-02 - 3.037215e+03 1.016001e-02 - 3.711120e+01 1.180870e+00 - 1.524462e+01 3.013857e-01 - 1.864578e+00 3.037380e-03 - 7.850906e-01 6.269733e-04 - - - 6.366627e+05 1.057776e-03 - 4.735586e+04 5.646788e-03 - 6.998004e+03 2.056702e-02 - 1.485869e+03 3.172138e-02 - 3.037215e+03 3.044346e-03 - 3.711120e+01 6.822282e-01 - 1.524462e+01 1.741207e-01 - 1.864578e+00 1.266285e+00 - 7.850906e-01 2.613855e-01 - - - 8.953691e+03 2.936096e-03 - 1.723751e+03 1.987835e-02 - 4.964799e+02 6.117174e-02 - 1.695920e+02 6.310706e-02 - 1.410623e+01 4.938638e-01 - 5.989433e+00 4.405756e-01 - - - 8.953691e+03 6.632285e-03 - 1.723751e+03 4.490279e-02 - 4.964799e+02 1.381795e-01 - 1.695920e+02 1.425512e-01 - 1.410623e+01 6.860229e-01 - 5.989433e+00 6.120006e-01 - 2.449806e+00 1.587999e-02 - 9.619672e-01 9.814612e-03 - - - 1.050668e+02 8.369065e-02 - 3.176179e+01 3.619621e-01 - 1.116388e+01 5.582237e-01 - 3.820267e+00 2.944914e-01 - - - 8.561902e+02 7.275862e-03 - 2.346489e+02 4.589393e-02 - 8.357131e+01 1.102208e-01 - 3.249777e+01 8.109739e-02 - 3.346024e+00 3.796779e-01 - 1.324721e+00 6.380389e-01 - 4.853186e-01 2.553913e-01 - - - 8.561902e+02 1.915068e-02 - 2.346489e+02 1.207967e-01 - 8.357131e+01 2.901104e-01 - 3.249777e+01 2.134552e-01 - - - 8.561902e+02 3.479403e-02 - 2.346489e+02 2.194702e-01 - 8.357131e+01 5.270888e-01 - 3.249777e+01 3.878173e-01 - 2.944780e+01 9.942086e-03 - 1.237653e+01 2.581128e-02 - 5.126437e+00 1.589788e-02 - - - - - - 0 1 0.000000e+00 7.800000e+01 - 0 1 4.988177e+02 -2.688251e+01 - 0 1 8.811453e+00 -2.585124e+01 - 0 1 1.822679e+00 -1.125073e+01 - 0 2 1.610514e+04 -1.565476e+04 - 0 2 8.251972e+01 -1.606397e+02 - 0 2 6.709391e-01 -1.222878e+00 - - - - 6.748933e+05 2.049634e-02 - 4.986148e+04 1.083145e-01 - 7.302420e+03 3.934954e-01 - 1.539262e+03 6.099120e-01 - 3.180612e+02 3.823758e-02 - 1.347343e+02 5.481627e-02 - 2.328756e+02 1.021127e-02 - - - 9.284304e+03 2.253826e-02 - 1.781558e+03 1.523732e-01 - 5.120667e+02 4.695532e-01 - 1.746969e+02 4.857599e-01 - 8.056918e+01 3.212732e-02 - 3.208910e+01 4.113894e-02 - - - 6.748933e+05 8.593323e-03 - 4.986148e+04 4.541206e-02 - 7.302420e+03 1.649774e-01 - 1.539262e+03 2.557125e-01 - 3.178288e+03 5.547729e-02 - 2.328756e+02 1.197033e-02 - 9.519502e+00 1.177833e-02 - 4.151486e+00 2.780972e-03 - - - 6.748933e+05 4.172600e-03 - 4.986148e+04 2.205042e-02 - 7.302420e+03 8.010691e-02 - 1.539262e+03 1.241645e-01 - 3.178288e+03 3.231804e-02 - 3.836433e+01 1.052108e+00 - 1.578896e+01 2.697879e-01 - 1.967190e+00 3.257334e-03 - 8.335464e-01 6.462859e-04 - - - 9.284304e+03 1.279577e-02 - 1.781558e+03 8.650765e-02 - 5.120667e+02 2.665820e-01 - 1.746969e+02 2.757831e-01 - 2.579154e+00 8.783177e-03 - 1.026515e+00 5.314652e-03 - - - 6.748933e+05 2.247749e-03 - 4.986148e+04 1.187840e-02 - 7.302420e+03 4.315300e-02 - 1.539262e+03 6.688651e-02 - 3.178288e+03 1.002687e-02 - 3.836433e+01 1.184923e+00 - 1.578896e+01 3.038451e-01 - 1.967190e+00 3.401957e-03 - 8.335464e-01 6.749805e-04 - - - 6.748933e+05 1.085198e-03 - 4.986148e+04 5.734809e-03 - 7.302420e+03 2.083398e-02 - 1.539262e+03 3.229235e-02 - 3.178288e+03 3.031746e-03 - 3.836433e+01 6.933854e-01 - 1.578896e+01 1.778021e-01 - 1.967190e+00 1.287010e+00 - 8.335464e-01 2.553550e-01 - - - 9.284304e+03 2.992507e-03 - 1.781558e+03 2.023127e-02 - 5.120667e+02 6.234469e-02 - 1.746969e+02 6.449653e-02 - 1.460451e+01 5.048266e-01 - 6.225015e+00 4.503100e-01 - - - 9.284304e+03 6.659986e-03 - 1.781558e+03 4.502579e-02 - 5.120667e+02 1.387515e-01 - 1.746969e+02 1.435405e-01 - 1.460451e+01 6.867955e-01 - 6.225015e+00 6.126280e-01 - 2.579154e+00 1.616953e-02 - 1.026515e+00 9.784097e-03 - - - 1.100730e+02 8.219039e-02 - 3.336531e+01 3.590862e-01 - 1.178540e+01 5.588329e-01 - 4.067488e+00 2.948007e-01 - - - 8.860628e+02 7.454725e-03 - 2.427296e+02 4.714999e-02 - 8.647772e+01 1.137941e-01 - 3.366670e+01 8.435373e-02 - 3.550752e+00 3.836569e-01 - 1.429080e+00 6.424463e-01 - 5.314869e-01 2.486080e-01 - - - 8.860628e+02 1.907747e-02 - 2.427296e+02 1.206621e-01 - 8.647772e+01 2.912118e-01 - 3.366670e+01 2.158706e-01 - - - 8.860628e+02 3.444229e-02 - 2.427296e+02 2.178422e-01 - 8.647772e+01 5.257511e-01 - 3.366670e+01 3.897307e-01 - 3.059515e+01 1.012055e-02 - 1.291376e+01 2.653624e-02 - 5.376237e+00 1.651825e-02 - - - - + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 2.718422e+00 -1.404070e+00 + 0 1 1.061906e+00 -2.040843e-01 + + + + 7.105793e+02 2.009533e-03 + 1.034368e+02 1.482329e-02 + 2.443300e+01 6.640480e-02 + 7.308967e+00 1.990801e-01 + 2.506894e+00 3.819108e-01 + 9.438003e-01 3.884663e-01 + 3.709710e-01 1.099967e-01 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 5.188992e+00 -1.397212e+00 + 0 1 2.023980e+00 -2.122203e-01 + + + + 1.311616e+03 1.969894e-03 + 1.913861e+02 1.451971e-02 + 4.527883e+01 6.534285e-02 + 1.359732e+01 1.982694e-01 + 4.719701e+00 3.835307e-01 + 1.817344e+00 3.845043e-01 + 7.340121e-01 1.096769e-01 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 1.603560e+01 -1.518700e+00 + 0 1 2.322329e+00 -2.808786e-01 + + + + 2.787867e+02 2.477011e-02 + 3.826330e+01 1.678633e-01 + 8.576375e+00 4.977570e-01 + 2.360978e+00 4.542732e-01 + 2.929847e-01 8.554471e-03 + 9.375142e-02 6.986010e-03 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 1.864605e+01 -1.582358e+00 + 0 1 3.512100e+00 -2.257663e-01 + + + + 4.090699e+02 2.446620e-02 + 5.616343e+01 1.667309e-01 + 1.263216e+01 4.985016e-01 + 3.495336e+00 4.533167e-01 + 4.607115e-01 9.069870e-03 + 1.436420e-01 7.456826e-03 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 2.763930e+01 -1.595784e+00 + 0 1 5.022100e+00 -2.624201e-01 + + + + 5.635094e+02 2.422667e-02 + 7.738753e+01 1.657101e-01 + 1.744855e+01 4.979887e-01 + 4.843508e+00 4.511053e-01 + 7.820957e+00 1.334650e-03 + 6.633018e-01 9.410938e-03 + 2.029459e-01 7.779541e-03 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 4.064864e+01 -1.695591e+00 + 0 1 5.175230e+00 -2.183506e-01 + + + + 7.432411e+02 2.413306e-02 + 1.020870e+02 1.655533e-01 + 2.305897e+01 4.996164e-01 + 6.416186e+00 4.517950e-01 + 9.065320e-01 9.761350e-03 + 2.740610e-01 7.992775e-03 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 5.202781e+01 -1.715359e+00 + 0 1 6.206354e+00 -2.299835e-01 + + + + 9.476157e+02 2.401760e-02 + 1.301841e+02 1.651131e-01 + 2.944885e+01 4.998040e-01 + 8.208941e+00 4.514980e-01 + 1.184390e+00 1.005990e-02 + 3.545967e-01 8.202500e-03 + + + + + + 0 1 0.000000e+00 2.000000e+00 + 0 1 5.407668e+01 -1.635342e+00 + 0 1 7.612973e+00 -2.108811e-01 + + + + 1.175870e+03 2.394744e-02 + 1.615680e+02 1.648909e-01 + 3.659069e+01 5.001582e-01 + 1.021284e+01 4.509687e-01 + 1.497330e+00 1.025659e-02 + 4.446700e-01 8.352764e-03 + + + + + + 0 1 0.000000e+00 4.000000e+00 + 0 1 3.050656e+02 -1.743249e+00 + 0 1 1.464675e+01 -1.513124e+00 + 0 1 2.136867e+00 -8.039920e-01 + 0 2 4.718427e+02 -1.590759e+02 + 0 2 2.052377e+02 -4.548875e+00 + 0 2 6.894609e-01 -4.851126e-01 + + + + 1.437387e+03 2.371636e-02 + 1.975242e+02 1.636571e-01 + 4.477766e+01 4.987114e-01 + 1.251831e+01 4.529699e-01 + 1.910040e+00 1.062412e-02 + 6.071710e-01 8.547746e-03 + + + 1.437387e+03 6.294799e-03 + 1.975242e+02 4.343787e-02 + 4.477766e+01 1.323680e-01 + 1.251831e+01 1.202273e-01 + 2.156724e+01 8.952974e-02 + + + + + + 0 1 0.000000e+00 4.000000e+00 + 0 1 3.371815e+02 -1.693663e+00 + 0 1 1.582292e+01 -1.422796e+00 + 0 1 2.309331e+00 -7.518502e-01 + 0 2 5.552475e+02 -1.581608e+02 + 0 2 2.797939e+02 -4.956377e+00 + 0 2 7.681323e-01 -4.550130e-01 + + + + 1.726576e+03 2.350363e-02 + 2.373122e+02 1.624787e-01 + 5.384661e+01 4.972212e-01 + 1.507884e+01 4.549977e-01 + 2.375296e+00 1.102567e-02 + 7.937981e-01 8.641283e-03 + + + 1.726576e+03 6.466155e-03 + 2.373122e+02 4.470000e-02 + 5.384661e+01 1.367920e-01 + 1.507884e+01 1.251758e-01 + 2.586516e+01 9.284621e-02 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.316953e+02 -3.386013e+00 + 0 1 5.217324e+00 -6.046747e+00 + 0 1 2.331459e+00 -3.647381e-01 + 0 2 9.142273e+02 -1.140686e+02 + 0 2 2.077560e+02 -4.208050e+01 + 0 2 1.251080e+00 -3.349915e-01 + + + + 2.043808e+03 2.330614e-02 + 2.809367e+02 1.613919e-01 + 6.378912e+01 4.958434e-01 + 1.788862e+01 4.569062e-01 + 2.886838e+00 1.142757e-02 + 9.993500e-01 8.659862e-03 + + + 2.043808e+03 6.603905e-03 + 2.809367e+02 4.573118e-02 + 6.378912e+01 1.404996e-01 + 1.788862e+01 1.294666e-01 + 3.061927e+01 9.566236e-02 + + + 1.089621e+02 1.824312e-02 + 2.363035e+01 1.212105e-01 + 7.107732e+00 3.571781e-01 + 2.366064e+00 4.993906e-01 + 8.025018e-01 2.309303e-01 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.349863e+02 -3.320043e+00 + 0 1 4.335714e+00 -5.901880e+00 + 0 1 4.547902e+00 3.453667e-01 + 0 2 8.540638e+02 -1.218275e+02 + 0 2 2.119761e+02 -3.822756e+01 + 0 2 9.980917e-01 -3.460521e-01 + + + + 2.387957e+03 2.313729e-02 + 3.282802e+02 1.604502e-01 + 7.458612e+01 4.946216e-01 + 2.094412e+01 4.585802e-01 + 3.444621e+00 1.181110e-02 + 1.222284e+00 8.622046e-03 + + + 1.348228e+02 1.731180e-02 + 2.936148e+01 1.169748e-01 + 8.890635e+00 3.531863e-01 + 3.000349e+00 5.034634e-01 + 1.037602e+00 2.287471e-01 + + + 2.387957e+03 6.719179e-03 + 3.282802e+02 4.659548e-02 + 7.458612e+01 1.436404e-01 + 2.094412e+01 1.331738e-01 + 3.582222e+01 9.806896e-02 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.269965e+02 -2.738258e+00 + 0 1 5.125039e+00 -5.713482e+00 + 0 1 2.849041e+00 3.351582e-01 + 0 2 1.169129e+03 -7.823903e+01 + 0 2 1.843911e+02 -2.594858e+01 + 0 2 1.326776e+00 -2.364182e-01 + + + + 2.759337e+03 2.298844e-02 + 3.793730e+02 1.596162e-01 + 8.624196e+01 4.935288e-01 + 2.424595e+01 4.600765e-01 + 4.049327e+00 1.216849e-02 + 1.462091e+00 8.553915e-03 + + + 1.635738e+02 1.653283e-02 + 3.574204e+01 1.133241e-01 + 1.088147e+01 3.493311e-01 + 3.713289e+00 5.065666e-01 + 1.304009e+00 2.282030e-01 + + + 2.759337e+03 6.815474e-03 + 3.793730e+02 4.732204e-02 + 8.624196e+01 1.463184e-01 + 2.424595e+01 1.364007e-01 + 4.146794e+01 1.001408e-01 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.155917e+02 -3.620214e+00 + 0 1 5.971141e+00 -5.737309e+00 + 0 1 2.859090e+00 4.704707e-01 + 0 2 2.062680e+03 -3.776082e+01 + 0 2 1.487138e+02 -3.431947e+01 + 0 2 1.644010e+00 -2.288331e-01 + + + + 3.158033e+03 2.285572e-02 + 4.342273e+02 1.588694e-01 + 9.875946e+01 4.925416e-01 + 2.779522e+01 4.614278e-01 + 4.703444e+00 1.248984e-02 + 1.720138e+00 8.475957e-03 + + + 1.931031e+02 1.615636e-02 + 4.229557e+01 1.118467e-01 + 1.292618e+01 3.491943e-01 + 4.446308e+00 5.094185e-01 + 1.575364e+00 2.231922e-01 + + + 3.158033e+03 6.897386e-03 + 4.342273e+02 4.794350e-02 + 9.875946e+01 1.486389e-01 + 2.779522e+01 1.392494e-01 + 4.754841e+01 1.019635e-01 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.120543e+02 -2.654674e+00 + 0 1 6.860978e+00 -5.707226e+00 + 0 1 2.789429e+00 6.518503e-01 + 0 2 1.667526e+03 -3.516025e+01 + 0 2 1.070677e+02 -3.284686e+01 + 0 2 3.574553e+00 -9.898434e-01 + + + + 3.584292e+03 2.273479e-02 + 4.928774e+02 1.581851e-01 + 1.121465e+02 4.916240e-01 + 3.159387e+01 4.626829e-01 + 5.405644e+00 1.279159e-02 + 1.995106e+00 8.399245e-03 + + + 2.239078e+02 1.596166e-02 + 4.916041e+01 1.112272e-01 + 1.507759e+01 3.501497e-01 + 5.222262e+00 5.115647e-01 + 1.862470e+00 2.176059e-01 + + + 3.584292e+03 6.966199e-03 + 4.928774e+02 4.846974e-02 + 1.121465e+02 1.506392e-01 + 3.159387e+01 1.417713e-01 + 5.406610e+01 1.035544e-01 + + + + + + 0 1 0.000000e+00 1.000000e+01 + 0 1 1.316953e+02 -9.029367e+00 + 0 1 5.217324e+00 -1.612466e+01 + 0 1 2.331459e+00 -9.726350e-01 + 0 2 9.142273e+02 -3.041829e+02 + 0 2 2.077560e+02 -1.122147e+02 + 0 2 1.251080e+00 -8.933106e-01 + + + + 2.043808e+03 2.330614e-02 + 2.809367e+02 1.613919e-01 + 6.378912e+01 4.958434e-01 + 1.788862e+01 4.569062e-01 + 2.886838e+00 1.142757e-02 + 9.993500e-01 8.659862e-03 + + + 1.089621e+02 1.824312e-02 + 2.363035e+01 1.212105e-01 + 7.107732e+00 3.571781e-01 + 2.366064e+00 4.993906e-01 + 8.025018e-01 2.309303e-01 + + + 2.043808e+03 6.603905e-03 + 2.809367e+02 4.573118e-02 + 6.378912e+01 1.404996e-01 + 1.788862e+01 1.294666e-01 + 3.061927e+01 9.566236e-02 + + + + + + 0 1 0.000000e+00 1.200000e+01 + 0 1 1.165002e+02 -6.815450e+00 + 0 1 8.900975e+00 -5.215410e+00 + 0 1 3.035128e-01 -1.866213e-01 + 0 2 1.887663e+03 -1.595243e+02 + 0 2 1.854639e+02 -5.261246e+01 + 0 2 1.596409e+00 -3.662524e+00 + + + + 4.734263e+03 2.216103e-03 + 6.514608e+02 1.553145e-02 + 1.484022e+02 4.954343e-02 + 4.196838e+01 5.035876e-02 + 6.816142e+01 4.017761e-02 + 6.770286e-01 7.829351e-01 + 2.602544e-01 4.122532e-01 + + + 4.734263e+03 2.126296e-02 + 6.514608e+02 1.490203e-01 + 1.484022e+02 4.753568e-01 + 4.196838e+01 4.831797e-01 + 7.097100e+00 1.941763e-02 + 2.791745e+00 1.356118e-02 + 4.663554e+00 4.197652e-03 + + + 1.735091e+02 3.641247e-02 + 3.760621e+01 2.230816e-01 + 1.115757e+01 5.296130e-01 + 3.680917e+00 3.941468e-01 + 1.439472e+00 6.592606e-03 + 5.215131e-01 1.100807e-02 + 1.902026e-01 4.409938e-03 + + + 4.734263e+03 6.686011e-03 + 6.514608e+02 4.685857e-02 + 1.484022e+02 1.494731e-01 + 4.196838e+01 1.519330e-01 + 6.816142e+01 1.061468e-01 + 4.663554e+00 2.218768e-03 + + + + + + 0 1 0.000000e+00 1.200000e+01 + 0 1 1.267215e+02 -6.552351e+00 + 0 1 9.963899e+00 -4.778063e+00 + 0 1 3.241862e-01 -1.760750e-01 + 0 2 1.502502e+03 -1.925403e+02 + 0 2 2.020013e+02 -5.803146e+01 + 0 2 1.617474e+00 -3.299848e+00 + + + + 5.269373e+03 2.335822e-03 + 7.251419e+02 1.638271e-02 + 1.652354e+02 5.236452e-02 + 4.676625e+01 5.344078e-02 + 7.592187e+01 4.269463e-02 + 8.076661e-01 8.100857e-01 + 3.256016e-01 3.956857e-01 + + + 5.269373e+03 2.116644e-02 + 7.251419e+02 1.484547e-01 + 1.652354e+02 4.745100e-01 + 4.676625e+01 4.842626e-01 + 7.983490e+00 1.968437e-02 + 3.169474e+00 1.355669e-02 + 5.360188e+00 4.184384e-03 + + + 1.986128e+02 3.537530e-02 + 4.314738e+01 2.190453e-01 + 1.286298e+01 5.275969e-01 + 4.278264e+00 3.976240e-01 + 1.712917e+00 7.288671e-03 + 6.380574e-01 1.177173e-02 + 2.397383e-01 4.039566e-03 + + + 5.269373e+03 6.728304e-03 + 7.251419e+02 4.719017e-02 + 1.652354e+02 1.508353e-01 + 4.676625e+01 1.539355e-01 + 7.592187e+01 1.073839e-01 + 5.360188e+00 2.391065e-03 + + + + + + 0 1 0.000000e+00 2.800000e+01 + 0 1 1.770724e+02 -1.170695e+01 + 0 1 4.230505e+00 -1.488350e+01 + 0 1 9.892221e-01 -5.178489e-01 + 0 2 1.077689e+03 -3.556251e+02 + 0 2 1.792821e+02 -5.882823e+01 + 0 2 8.663673e-01 -1.691885e+00 + + + + 1.313743e+04 2.037141e-02 + 1.808839e+03 1.437043e-01 + 4.130223e+02 4.670565e-01 + 1.176649e+02 4.935966e-01 + 2.120531e+01 2.218001e-02 + 8.686230e+00 1.380392e-02 + 1.626113e+01 4.226503e-03 + + + 5.594101e+02 3.178940e-02 + 1.230426e+02 2.075653e-01 + 3.768391e+01 5.272335e-01 + 1.297468e+01 3.991191e-01 + 4.693424e+00 1.375409e-02 + 1.453593e+00 1.375376e-02 + + + 1.313743e+04 6.927090e-03 + 1.808839e+03 4.886519e-02 + 4.130223e+02 1.588178e-01 + 1.176649e+02 1.678425e-01 + 1.907904e+02 1.151553e-01 + 1.626113e+01 2.799764e-03 + 1.518955e-01 1.211912e-03 + 5.076494e-02 3.942917e-04 + + + 1.313743e+04 2.671470e-03 + 1.808839e+03 1.884513e-02 + 4.130223e+02 6.124896e-02 + 1.176649e+02 6.472939e-02 + 1.907904e+02 5.170179e-02 + 2.597655e+00 8.106145e-01 + 1.041160e+00 4.241170e-01 + 1.518955e-01 3.263973e-03 + 5.076494e-02 1.061923e-03 + + + 5.594101e+02 1.188250e-02 + 1.230426e+02 7.758545e-02 + 3.768391e+01 1.970736e-01 + 1.297468e+01 1.491860e-01 + 5.870788e+01 2.823686e-02 + + + 3.393704e+01 9.107488e-02 + 8.526278e+00 3.687624e-01 + 2.490394e+00 5.407529e-01 + 6.801859e-01 3.269504e-01 + + + + + + 0 1 0.000000e+00 2.800000e+01 + 0 1 1.475185e+02 -1.160870e+01 + 0 1 4.276358e+00 -1.489067e+01 + 0 1 3.200115e+00 4.446479e-01 + 0 2 9.634012e+02 -2.667329e+02 + 0 2 1.608157e+02 -7.570730e+01 + 0 2 8.915900e-01 -1.494415e+00 + + + + 1.412554e+04 2.015314e-02 + 1.945092e+03 1.423197e-01 + 4.441943e+02 4.644349e-01 + 1.266081e+02 4.966870e-01 + 2.269153e+01 2.350805e-02 + 9.321496e+00 1.452473e-02 + 1.751443e+01 4.954463e-03 + + + 6.034712e+02 3.140655e-02 + 1.328293e+02 2.058783e-01 + 4.074483e+01 5.258956e-01 + 1.406095e+01 4.010603e-01 + 5.183914e+00 1.413023e-02 + 1.643302e+00 1.447252e-02 + + + 1.412554e+04 6.876497e-03 + 1.945092e+03 4.856122e-02 + 4.441943e+02 1.584708e-01 + 1.266081e+02 1.694757e-01 + 2.040504e+02 1.154084e-01 + 1.751443e+01 2.900941e-03 + 1.916898e-01 1.423946e-03 + 6.432966e-02 4.240571e-04 + + + 1.412554e+04 2.680038e-03 + 1.945092e+03 1.892619e-02 + 4.441943e+02 6.176224e-02 + 1.266081e+02 6.605125e-02 + 2.040504e+02 5.244679e-02 + 2.817345e+00 8.169395e-01 + 1.151078e+00 4.201687e-01 + 1.916898e-01 3.436330e-03 + 6.432966e-02 1.023354e-03 + + + 6.034712e+02 1.200499e-02 + 1.328293e+02 7.869587e-02 + 4.074483e+01 2.010208e-01 + 1.406095e+01 1.533032e-01 + 6.233043e+01 2.729073e-02 + + + 3.926423e+01 8.537630e-02 + 9.980528e+00 3.585446e-01 + 2.983177e+00 5.445484e-01 + 8.497422e-01 3.238528e-01 + + + + + + 0 1 0.000000e+00 2.800000e+01 + 0 1 1.333456e+02 -1.306261e+01 + 0 1 4.666478e+00 -1.494674e+01 + 0 1 1.981306e+00 4.730957e-01 + 0 2 7.345525e+02 -2.051308e+02 + 0 2 1.341873e+02 -8.344618e+01 + 0 2 1.289440e+00 -9.240559e-01 + + + + 1.504748e+04 2.011970e-02 + 2.072094e+03 1.421216e-01 + 4.732470e+02 4.641367e-01 + 1.349364e+02 4.970613e-01 + 2.428569e+01 2.352967e-02 + 1.001257e+01 1.455887e-02 + 1.881352e+01 4.934949e-03 + + + 6.496252e+02 3.102053e-02 + 1.430851e+02 2.041373e-01 + 4.395584e+01 5.244461e-01 + 1.520359e+01 4.031635e-01 + 5.693779e+00 1.456793e-02 + 1.843026e+00 1.517755e-02 + + + 1.504748e+04 6.888015e-03 + 2.072094e+03 4.865559e-02 + 4.732470e+02 1.588980e-01 + 1.349364e+02 1.701698e-01 + 2.174671e+02 1.158352e-01 + 1.881352e+01 3.079572e-03 + 2.339273e-01 1.804417e-03 + 7.920690e-02 5.183852e-04 + + + 1.504748e+04 2.713164e-03 + 2.072094e+03 1.916526e-02 + 4.732470e+02 6.258935e-02 + 1.349364e+02 6.702927e-02 + 2.174671e+02 5.327741e-02 + 3.046407e+00 8.256403e-01 + 1.265088e+00 4.140791e-01 + 2.339273e-01 3.595445e-03 + 7.920690e-02 1.032924e-03 + + + 6.496252e+02 1.210706e-02 + 1.430851e+02 7.967311e-02 + 4.395584e+01 2.046870e-01 + 1.520359e+01 1.573514e-01 + 6.605645e+01 2.663506e-02 + + + 4.469596e+01 8.114536e-02 + 1.146926e+01 3.508263e-01 + 3.490297e+00 5.477342e-01 + 1.026268e+00 3.208275e-01 + + + + + + 0 1 0.000000e+00 2.800000e+01 + 0 1 1.291200e+02 -1.357738e+01 + 0 1 4.545595e+00 -1.394526e+01 + 0 1 2.718347e+00 6.294496e-01 + 0 2 8.206665e+02 -1.526266e+02 + 0 2 1.371375e+02 -8.887129e+01 + 0 2 1.224833e+00 -9.593809e-01 + + + + 1.599893e+04 2.008699e-02 + 2.203162e+03 1.419266e-01 + 5.032314e+02 4.638310e-01 + 1.435335e+02 4.974016e-01 + 2.601334e+01 2.446434e-02 + 9.998426e+00 1.391188e-02 + 2.004753e+01 4.991765e-03 + + + 6.970816e+02 3.069640e-02 + 1.536332e+02 2.026811e-01 + 4.724871e+01 5.234171e-01 + 1.637668e+01 4.045998e-01 + 6.214285e+00 1.506550e-02 + 2.047987e+00 1.582766e-02 + + + 1.599893e+04 6.931590e-03 + 2.203162e+03 4.897583e-02 + 5.032314e+02 1.600582e-01 + 1.435335e+02 1.716427e-01 + 2.248841e+02 1.167850e-01 + 2.004753e+01 3.236878e-03 + 2.799631e-01 1.975754e-03 + 9.459739e-02 5.461451e-04 + + + 1.599893e+04 2.760583e-03 + 2.203162e+03 1.950517e-02 + 5.032314e+02 6.374494e-02 + 1.435335e+02 6.835859e-02 + 2.248841e+02 5.438287e-02 + 3.252662e+00 8.404582e-01 + 1.323473e+00 4.089132e-01 + 2.799631e-01 3.797495e-03 + 9.459739e-02 1.049717e-03 + + + 6.970816e+02 1.220527e-02 + 1.536332e+02 8.058854e-02 + 4.724871e+01 2.081171e-01 + 1.637668e+01 1.608739e-01 + 6.999482e+01 2.627999e-02 + + + 5.034890e+01 7.764744e-02 + 1.302382e+01 3.442077e-01 + 4.022727e+00 5.502592e-01 + 1.213824e+00 3.184576e-01 + + + + + + 0 1 0.000000e+00 2.800000e+01 + 0 1 1.281268e+02 -1.748732e+01 + 0 1 4.400488e+00 -1.327358e+01 + 0 1 3.896848e+00 1.341067e+00 + 0 2 6.906283e+02 -2.098522e+02 + 0 2 1.261179e+02 -6.434127e+01 + 0 2 1.364496e+00 -6.104418e-01 + + + + 1.697980e+04 2.005735e-02 + 2.338286e+03 1.417513e-01 + 5.341455e+02 4.635731e-01 + 1.523987e+02 4.977655e-01 + 2.763213e+01 2.358636e-02 + 1.146758e+01 1.461994e-02 + 2.155440e+01 4.910386e-03 + + + 7.491496e+02 3.019398e-02 + 1.652152e+02 2.002629e-01 + 5.089802e+01 5.209223e-01 + 1.768499e+01 4.082495e-01 + 6.764060e+00 1.578081e-02 + 2.266909e+00 1.673066e-02 + + + 1.697980e+04 6.908701e-03 + 2.338286e+03 4.882585e-02 + 5.341455e+02 1.596765e-01 + 1.523987e+02 1.714540e-01 + 2.455999e+02 1.166172e-01 + 2.155440e+01 3.392594e-03 + 3.290939e-01 2.360322e-03 + 1.123625e-01 6.587084e-04 + + + 1.697980e+04 2.777742e-03 + 2.338286e+03 1.963113e-02 + 5.341455e+02 6.420024e-02 + 1.523987e+02 6.893554e-02 + 2.455999e+02 5.489770e-02 + 3.534757e+00 8.472252e-01 + 1.504633e+00 3.984469e-01 + 3.290939e-01 3.937988e-03 + 1.123625e-01 1.098997e-03 + + + 7.491496e+02 1.221855e-02 + 1.652152e+02 8.104005e-02 + 5.089802e+01 2.108008e-01 + 1.768499e+01 1.652057e-01 + 7.395352e+01 2.597316e-02 + + + 5.612475e+01 7.495665e-02 + 1.461849e+01 3.391826e-01 + 4.571645e+00 5.526696e-01 + 1.408837e+00 3.160503e-01 + + + + + + 0 1 0.000000e+00 2.800000e+01 + 0 1 1.482671e+02 -1.761660e+01 + 0 1 4.832748e+00 -1.278472e+01 + 0 1 4.851261e+00 7.989919e-01 + 0 2 6.193299e+02 -2.353824e+02 + 0 2 1.158974e+02 -5.669794e+01 + 0 2 1.219641e+00 -6.358529e-01 + + + + 1.799018e+04 2.002825e-02 + 2.477476e+03 1.415780e-01 + 5.659913e+02 4.633068e-01 + 1.615326e+02 4.980968e-01 + 2.938435e+01 2.361991e-02 + 1.223152e+01 1.464727e-02 + 2.299656e+01 4.903402e-03 + + + 7.977488e+02 3.006397e-02 + 1.760371e+02 1.997281e-01 + 5.423058e+01 5.205994e-01 + 1.887913e+01 4.073038e-01 + 8.458913e+00 1.223907e-02 + 3.353909e+00 1.669992e-02 + 1.364064e+00 4.689426e-03 + + + 1.799018e+04 6.918022e-03 + 2.477476e+03 4.890291e-02 + 5.659913e+02 1.600323e-01 + 1.615326e+02 1.720492e-01 + 2.603157e+02 1.169764e-01 + 2.299656e+01 3.530117e-03 + 3.807262e-01 2.571777e-03 + 1.310393e-01 7.234866e-04 + + + 1.799018e+04 2.808530e-03 + 2.477476e+03 1.985326e-02 + 5.659913e+02 6.496878e-02 + 1.615326e+02 6.984733e-02 + 2.603157e+02 5.567440e-02 + 3.794300e+00 8.591255e-01 + 1.629212e+00 3.897450e-01 + 3.807262e-01 4.108277e-03 + 1.310393e-01 1.155731e-03 + + + 7.977488e+02 1.348108e-02 + 1.760371e+02 8.956078e-02 + 5.423058e+01 2.334438e-01 + 1.887913e+01 1.826405e-01 + + + 6.210049e+01 7.268341e-02 + 1.627163e+01 3.348934e-01 + 5.142520e+00 5.547344e-01 + 1.612760e+00 3.138046e-01 + + + + + + 0 1 0.000000e+00 3.000000e+01 + 0 1 1.717237e+02 -1.587122e+01 + 0 1 8.795873e+00 -8.401075e+00 + 0 1 1.678889e+00 -2.468170e+00 + 0 2 3.285551e+03 -1.559101e+03 + 0 2 4.334126e+01 -1.055606e+02 + 0 2 1.370595e+00 -3.327627e+00 + + + + 2.832869e+04 1.861324e-02 + 3.293308e+03 1.305182e-01 + 6.874975e+02 4.512925e-01 + 1.852792e+02 5.255960e-01 + 3.331788e+01 2.681546e-02 + 1.388857e+01 1.810175e-02 + 2.594265e+01 5.565386e-03 + + + 9.224700e+02 2.931989e-02 + 1.983383e+02 1.948162e-01 + 6.024212e+01 5.172275e-01 + 2.079577e+01 4.163505e-01 + 9.638792e+00 1.251893e-02 + 3.818761e+00 1.861915e-02 + 1.600081e+00 5.548744e-03 + + + 2.832869e+04 6.618279e-03 + 3.293308e+03 4.640816e-02 + 6.874975e+02 1.604653e-01 + 1.852792e+02 1.868853e-01 + 3.032982e+02 1.041683e-01 + 2.594265e+01 3.793006e-03 + 5.321561e-01 2.442360e-03 + 2.133496e-01 1.216528e-03 + + + 2.832869e+04 2.719032e-03 + 3.293308e+03 1.906618e-02 + 6.874975e+02 6.592506e-02 + 1.852792e+02 7.677937e-02 + 3.032982e+02 5.001043e-02 + 4.223752e+00 8.691871e-01 + 1.823778e+00 3.803838e-01 + 5.321561e-01 3.528156e-03 + 2.133496e-01 1.757358e-03 + + + 9.224700e+02 1.334197e-02 + 1.983383e+02 8.865078e-02 + 6.024212e+01 2.353635e-01 + 2.079577e+01 1.894595e-01 + + + 2.832869e+04 9.277854e-04 + 3.293308e+03 6.505742e-03 + 6.874975e+02 2.249488e-02 + 1.852792e+02 2.619858e-02 + 3.032982e+02 1.676234e-02 + 4.223752e+00 3.861552e-01 + 1.823778e+00 1.689937e-01 + 2.975875e+00 2.580162e-01 + + + 6.893612e+01 7.038264e-02 + 1.806695e+01 3.297978e-01 + 5.745926e+00 5.563627e-01 + 1.824534e+00 3.148138e-01 + + + + + + 0 1 0.000000e+00 3.000000e+01 + 0 1 1.816301e+02 -1.509172e+01 + 0 1 8.787134e+00 -7.884786e+00 + 0 1 1.717769e+00 -2.313954e+00 + 0 2 3.261270e+03 -1.660114e+03 + 0 2 4.336450e+01 -1.063372e+02 + 0 2 1.370653e+00 -3.327384e+00 + + + + 3.057188e+04 1.854130e-02 + 3.522884e+03 1.298469e-01 + 7.318539e+02 4.503413e-01 + 1.966604e+02 5.273101e-01 + 3.546029e+01 2.701428e-02 + 1.483342e+01 1.837944e-02 + 2.766961e+01 5.602087e-03 + + + 9.882035e+02 2.895395e-02 + 2.122455e+02 1.929608e-01 + 6.447958e+01 5.154228e-01 + 2.228907e+01 4.189878e-01 + 1.032476e+01 1.313962e-02 + 4.114168e+00 1.942212e-02 + 1.737704e+00 5.596171e-03 + + + 3.057188e+04 6.619310e-03 + 3.522884e+03 4.635583e-02 + 7.318539e+02 1.607735e-01 + 1.966604e+02 1.882516e-01 + 3.222729e+02 1.037361e-01 + 2.766961e+01 3.981177e-03 + 6.107345e-01 2.769145e-03 + 2.567184e-01 1.255844e-03 + + + 3.057188e+04 2.744006e-03 + 3.522884e+03 1.921661e-02 + 7.318539e+02 6.664796e-02 + 1.966604e+02 7.803889e-02 + 3.222729e+02 5.029882e-02 + 4.527839e+00 8.796345e-01 + 1.968793e+00 3.728859e-01 + 6.107345e-01 3.640638e-03 + 2.567184e-01 1.651077e-03 + + + 9.882035e+02 1.333696e-02 + 2.122455e+02 8.888286e-02 + 6.447958e+01 2.374174e-01 + 2.228907e+01 1.929969e-01 + + + 3.057188e+04 9.836503e-04 + 3.522884e+03 6.888622e-03 + 7.318539e+02 2.389145e-02 + 1.966604e+02 2.797478e-02 + 3.222729e+02 1.782949e-02 + 4.527839e+00 4.115402e-01 + 1.968793e+00 1.744560e-01 + 3.273140e+00 2.807261e-01 + + + 7.581164e+01 6.821491e-02 + 1.996358e+01 3.250123e-01 + 6.405919e+00 5.573717e-01 + 2.065585e+00 3.151559e-01 + + + + + + 0 1 0.000000e+00 4.600000e+01 + 0 1 9.382104e+02 -1.034282e+01 + 0 1 8.103365e+00 -2.198754e+01 + 0 1 8.099241e-01 -7.450007e+00 + 0 2 5.088125e+03 -4.018677e+02 + 0 2 1.160014e+02 -1.689906e+02 + 0 2 3.936118e+02 1.201405e+02 + + + + 6.790279e+04 1.776520e-02 + 7.040326e+03 1.213420e-01 + 1.375403e+03 4.355878e-01 + 3.558255e+02 5.502616e-01 + 6.425357e+01 3.199124e-02 + 2.748527e+01 2.311087e-02 + 5.134544e+01 7.307106e-03 + + + 1.947782e+03 2.528844e-02 + 4.116454e+02 1.730932e-01 + 1.247747e+02 4.930022e-01 + 4.365494e+01 4.465301e-01 + 1.960851e+01 2.358726e-02 + 8.108029e+00 3.359207e-02 + 3.481304e+00 6.952704e-03 + + + 6.790279e+04 6.598182e-03 + 7.040326e+03 4.506770e-02 + 1.375403e+03 1.617819e-01 + 3.558255e+02 2.043730e-01 + 5.903032e+02 9.628463e-02 + 5.134544e+01 4.984940e-03 + 1.653841e+00 3.480653e-03 + 7.005751e-01 1.419582e-03 + + + 6.790279e+04 2.934135e-03 + 7.040326e+03 2.004108e-02 + 1.375403e+03 7.194251e-02 + 3.558255e+02 9.088226e-02 + 5.903032e+02 5.042911e-02 + 8.699199e+00 9.757823e-01 + 3.848173e+00 3.049227e-01 + 1.653841e+00 2.811371e-03 + 7.005751e-01 1.146616e-03 + + + 1.947782e+03 1.278307e-02 + 4.116454e+02 8.749703e-02 + 1.247747e+02 2.492081e-01 + 4.365494e+01 2.257169e-01 + + + 6.790279e+04 1.262043e-03 + 7.040326e+03 8.620157e-03 + 1.375403e+03 3.094423e-02 + 3.558255e+02 3.909067e-02 + 5.903032e+02 2.245986e-02 + 8.699199e+00 5.597291e-01 + 3.848173e+00 1.749100e-01 + 7.641793e+00 3.797049e-01 + + + 1.947782e+03 5.343462e-03 + 4.116454e+02 3.657470e-02 + 1.247747e+02 1.041717e-01 + 4.365494e+01 9.435207e-02 + 2.669398e+00 5.428550e-01 + 1.153922e+00 5.887788e-01 + 4.695989e-01 1.298705e-01 + + + 1.811900e+02 1.730684e-02 + 4.931153e+01 9.523877e-02 + 1.686080e+01 1.933096e-01 + 6.106148e+00 1.238392e-01 + + + 1.811900e+02 4.897803e-02 + 4.931153e+01 2.695238e-01 + 1.686080e+01 5.470622e-01 + 6.106148e+00 3.504625e-01 + 4.088039e+00 6.580949e-03 + 1.359836e+00 1.290444e-02 + 4.219564e-01 7.129024e-03 + + + + + + 0 1 0.000000e+00 4.600000e+01 + 0 1 8.659419e+02 -1.231535e+01 + 0 1 8.976930e+00 -2.083742e+01 + 0 1 8.940789e-01 -7.318656e+00 + 0 2 3.787441e+03 -4.217628e+02 + 0 2 1.499106e+02 -1.618228e+02 + 0 2 3.479049e+02 1.419028e+02 + + + + 7.266615e+04 1.773963e-02 + 7.458577e+03 1.207515e-01 + 1.448048e+03 4.345224e-01 + 3.731342e+02 5.520353e-01 + 6.745249e+01 3.228038e-02 + 2.888902e+01 2.349413e-02 + 5.396235e+01 7.371557e-03 + + + 2.041792e+03 2.532196e-02 + 4.307275e+02 1.732810e-01 + 1.304436e+02 4.936558e-01 + 4.558117e+01 4.470731e-01 + 2.063008e+01 2.258027e-02 + 8.539518e+00 3.189178e-02 + 3.661291e+00 6.454050e-03 + + + 7.266615e+04 6.610922e-03 + 7.458577e+03 4.499975e-02 + 1.448048e+03 1.619309e-01 + 3.731342e+02 2.057237e-01 + 6.206207e+02 9.546550e-02 + 5.396235e+01 5.048381e-03 + 1.777042e+00 3.480766e-03 + 7.657393e-01 1.397729e-03 + + + 7.266615e+04 2.953586e-03 + 7.458577e+03 2.010470e-02 + 1.448048e+03 7.234645e-02 + 3.731342e+02 9.191194e-02 + 6.206207e+02 5.025423e-02 + 9.164452e+00 9.818402e-01 + 4.048987e+00 3.010621e-01 + 1.777042e+00 2.619555e-03 + 7.657393e-01 1.051903e-03 + + + 2.041792e+03 1.288245e-02 + 4.307275e+02 8.815608e-02 + 1.304436e+02 2.511456e-01 + 4.558117e+01 2.274468e-01 + + + 7.266615e+04 1.287268e-03 + 7.458577e+03 8.762279e-03 + 1.448048e+03 3.153092e-02 + 3.731342e+02 4.005820e-02 + 6.206207e+02 2.268724e-02 + 9.164452e+00 5.728315e-01 + 4.048987e+00 1.756476e-01 + 8.116065e+00 3.870636e-01 + + + 2.041792e+03 5.483335e-03 + 4.307275e+02 3.752308e-02 + 1.304436e+02 1.068985e-01 + 4.558117e+01 9.681130e-02 + 2.865541e+00 5.502444e-01 + 1.251380e+00 5.916674e-01 + 5.173573e-01 1.234323e-01 + + + 1.930010e+02 1.776738e-02 + 5.260605e+01 9.860524e-02 + 1.804452e+01 2.022271e-01 + 6.570293e+00 1.307474e-01 + + + 1.930010e+02 4.796829e-02 + 5.260605e+01 2.662139e-01 + 1.804452e+01 5.459717e-01 + 6.570293e+00 3.529913e-01 + 4.538816e+00 6.742746e-03 + 1.550296e+00 1.352712e-02 + 5.002391e-01 7.274215e-03 + + + + + + 0 1 0.000000e+00 4.600000e+01 + 0 1 4.705092e+02 -1.619975e+01 + 0 1 9.105112e+00 -1.693194e+01 + 0 1 1.306836e+00 -9.361014e+00 + 0 2 2.467258e+03 -5.267092e+02 + 0 2 2.605360e+02 -1.302272e+02 + 0 2 1.837901e+02 9.020596e+01 + + + + 7.772952e+04 1.771776e-02 + 7.897737e+03 1.201668e-01 + 1.523595e+03 4.334453e-01 + 3.910089e+02 5.538159e-01 + 7.085474e+01 3.246281e-02 + 3.046331e+01 2.397554e-02 + 5.667781e+01 7.422703e-03 + + + 2.140155e+03 2.533108e-02 + 4.506338e+02 1.733219e-01 + 1.363488e+02 4.940944e-01 + 4.758959e+01 4.477572e-01 + 2.168046e+01 2.173861e-02 + 8.984165e+00 3.046358e-02 + 3.846385e+00 6.039136e-03 + + + 7.772952e+04 6.625106e-03 + 7.897737e+03 4.493334e-02 + 1.523595e+03 1.620758e-01 + 3.910089e+02 2.070854e-01 + 6.518766e+02 9.464965e-02 + 5.667781e+01 5.357000e-03 + 1.904156e+00 4.035483e-03 + 8.320664e-01 1.581948e-03 + + + 7.772952e+04 2.973234e-03 + 7.897737e+03 2.016531e-02 + 1.523595e+03 7.273685e-02 + 3.910089e+02 9.293637e-02 + 6.518766e+02 5.007031e-02 + 9.642199e+00 9.870342e-01 + 4.255994e+00 2.974771e-01 + 1.904156e+00 2.407143e-03 + 8.320664e-01 9.436232e-04 + + + 2.140155e+03 1.296613e-02 + 4.506338e+02 8.871763e-02 + 1.363488e+02 2.529102e-01 + 4.758959e+01 2.291918e-01 + + + 7.772952e+04 1.312356e-03 + 7.897737e+03 8.900766e-03 + 1.523595e+03 3.210532e-02 + 3.910089e+02 4.102118e-02 + 6.518766e+02 2.290314e-02 + 9.642199e+00 5.853485e-01 + 4.255994e+00 1.764151e-01 + 8.607677e+00 3.944439e-01 + + + 2.140155e+03 5.615018e-03 + 4.506338e+02 3.841943e-02 + 1.363488e+02 1.095235e-01 + 4.758959e+01 9.925217e-02 + 3.067791e+00 5.586107e-01 + 1.352145e+00 5.942375e-01 + 5.650612e-01 1.167132e-01 + + + 1.880339e+02 2.129477e-02 + 5.103533e+01 1.140669e-01 + 1.734697e+01 2.187109e-01 + 6.166323e+00 1.198977e-01 + + + 1.880339e+02 5.516419e-02 + 5.103533e+01 2.954908e-01 + 1.734697e+01 5.665716e-01 + 6.166323e+00 3.105956e-01 + 5.027724e+00 7.767543e-04 + 1.779129e+00 1.617500e-03 + 5.881318e-01 8.672809e-04 + + + + + + 0 1 0.000000e+00 4.600000e+01 + 0 1 9.831894e+02 -1.826324e+01 + 0 1 9.581656e+00 -1.663640e+01 + 0 1 1.531146e+00 -9.697847e+00 + 0 2 2.008619e+03 -1.147411e+03 + 0 2 2.867595e+02 -1.701795e+02 + 0 2 2.181314e+02 1.345126e+02 + + + + 8.310434e+04 1.770100e-02 + 8.358395e+03 1.195938e-01 + 1.602101e+03 4.323621e-01 + 4.094573e+02 5.555928e-01 + 7.427984e+01 3.275256e-02 + 3.197229e+01 2.438902e-02 + 5.947033e+01 7.489354e-03 + + + 2.242920e+03 2.531963e-02 + 4.713680e+02 1.732369e-01 + 1.424906e+02 4.943444e-01 + 4.968056e+01 4.485601e-01 + 2.275951e+01 2.104678e-02 + 9.440646e+00 2.927810e-02 + 4.034581e+00 5.689717e-03 + + + 8.310434e+04 6.640886e-03 + 8.358395e+03 4.486803e-02 + 1.602101e+03 1.622093e-01 + 4.094573e+02 2.084418e-01 + 6.845819e+02 9.378192e-02 + 5.947033e+01 5.426753e-03 + 2.035795e+00 4.059384e-03 + 8.998324e-01 1.545840e-03 + + + 8.310434e+04 2.993153e-03 + 8.358395e+03 2.022274e-02 + 1.602101e+03 7.311033e-02 + 4.094573e+02 9.394805e-02 + 6.845819e+02 4.984210e-02 + 1.013791e+01 9.923610e-01 + 4.468113e+00 2.942143e-01 + 2.035795e+00 2.144044e-03 + 8.998324e-01 8.164662e-04 + + + 2.242920e+03 1.303596e-02 + 4.713680e+02 8.919199e-02 + 1.424906e+02 2.545160e-01 + 4.968056e+01 2.309437e-01 + + + 8.310434e+04 1.337247e-03 + 8.358395e+03 9.034881e-03 + 1.602101e+03 3.266339e-02 + 4.094573e+02 4.197303e-02 + 6.845819e+02 2.308636e-02 + 1.013791e+01 5.977351e-01 + 4.468113e+00 1.772160e-01 + 9.115573e+00 4.017739e-01 + + + 2.242920e+03 5.738007e-03 + 4.713680e+02 3.925944e-02 + 1.424906e+02 1.120297e-01 + 4.968056e+01 1.016540e-01 + 3.276480e+00 5.675947e-01 + 1.456225e+00 5.963576e-01 + 6.129979e-01 1.101295e-01 + + + 2.177113e+02 1.846960e-02 + 5.949579e+01 1.040935e-01 + 2.052317e+01 2.175371e-01 + 7.545045e+00 1.429898e-01 + + + 2.177113e+02 4.618225e-02 + 5.949579e+01 2.602803e-01 + 2.052317e+01 5.439398e-01 + 7.545045e+00 3.575382e-01 + 5.459859e+00 7.069627e-03 + 1.942199e+00 1.465446e-02 + 6.617277e-01 7.520586e-03 + + + + + + 0 1 0.000000e+00 4.600000e+01 + 0 1 9.418354e+02 -1.435322e+01 + 0 1 9.301749e+00 -1.674032e+01 + 0 1 1.554262e+00 -8.765613e+00 + 0 2 3.792865e+03 -4.214712e+02 + 0 2 2.151862e+02 -1.628815e+02 + 0 2 2.366327e+02 1.197458e+02 + + + + 8.881194e+04 1.768881e-02 + 8.841808e+03 1.190303e-01 + 1.683700e+03 4.312702e-01 + 4.284975e+02 5.573705e-01 + 7.782165e+01 3.304250e-02 + 3.353386e+01 2.481793e-02 + 6.235374e+01 7.557020e-03 + + + 2.349964e+03 2.529389e-02 + 4.928960e+02 1.730624e-01 + 1.488570e+02 4.944575e-01 + 5.184959e+01 4.494301e-01 + 2.386824e+01 2.047717e-02 + 9.909558e+00 2.829034e-02 + 4.226890e+00 5.394690e-03 + + + 8.881194e+04 6.658291e-03 + 8.841808e+03 4.480449e-02 + 1.683700e+03 1.623355e-01 + 4.284975e+02 2.098013e-01 + 7.185638e+02 9.289105e-02 + 6.235374e+01 5.499755e-03 + 2.171925e+00 4.096793e-03 + 9.685845e-01 1.509237e-03 + + + 8.881194e+04 3.013393e-03 + 8.841808e+03 2.027751e-02 + 1.683700e+03 7.346942e-02 + 4.284975e+02 9.495135e-02 + 7.185638e+02 4.958847e-02 + 1.064916e+01 9.973573e-01 + 4.685949e+00 2.912147e-01 + 2.171925e+00 1.842732e-03 + 9.685845e-01 6.788531e-04 + + + 2.349964e+03 1.309519e-02 + 4.928960e+02 8.959812e-02 + 1.488570e+02 2.559913e-01 + 5.184959e+01 2.326796e-01 + + + 8.881194e+04 1.361861e-03 + 8.841808e+03 9.164140e-03 + 1.683700e+03 3.320349e-02 + 4.284975e+02 4.291195e-02 + 7.185638e+02 2.324458e-02 + 1.064916e+01 6.097032e-01 + 4.685949e+00 1.780250e-01 + 9.640530e+00 4.089963e-01 + + + 2.349964e+03 5.853232e-03 + 4.928960e+02 4.004817e-02 + 1.488570e+02 1.144219e-01 + 5.184959e+01 1.040021e-01 + 3.491920e+00 5.769315e-01 + 1.563864e+00 5.979902e-01 + 6.612446e-01 1.039140e-01 + + + 2.096282e+02 2.235868e-02 + 5.701584e+01 1.210746e-01 + 1.947108e+01 2.345506e-01 + 6.972525e+00 1.284916e-01 + + + 2.096282e+02 5.407733e-02 + 5.701584e+01 2.928344e-01 + 1.947108e+01 5.672906e-01 + 6.972525e+00 3.107734e-01 + 6.042350e+00 6.770240e-04 + 2.215766e+00 1.489093e-03 + 7.632974e-01 7.759726e-04 + + + + + + 0 1 0.000000e+00 4.600000e+01 + 0 1 1.146362e+03 -1.450911e+01 + 0 1 9.704362e+00 -1.595966e+01 + 0 1 1.616917e+00 -8.374774e+00 + 0 2 4.356249e+03 -2.980129e+02 + 0 2 1.938917e+02 -2.640253e+02 + 0 2 2.420282e+02 1.604077e+02 + + + + 9.487214e+04 1.768122e-02 + 9.349124e+03 1.184763e-01 + 1.768512e+03 4.301696e-01 + 4.481476e+02 5.591477e-01 + 8.148399e+01 3.333339e-02 + 3.514965e+01 2.526344e-02 + 6.533041e+01 7.625927e-03 + + + 2.501286e+03 2.463870e-02 + 5.235308e+02 1.692299e-01 + 1.580152e+02 4.890454e-01 + 5.507622e+01 4.561658e-01 + 2.510059e+01 2.225373e-02 + 1.043497e+01 3.103876e-02 + 4.447579e+00 5.880920e-03 + + + 9.487214e+04 6.677363e-03 + 9.349124e+03 4.474291e-02 + 1.768512e+03 1.624548e-01 + 4.481476e+02 2.111638e-01 + 7.538748e+02 9.197723e-02 + 6.533041e+01 5.576147e-03 + 2.312876e+00 4.145291e-03 + 1.038420e+00 1.473910e-03 + + + 9.487214e+04 3.033999e-03 + 9.349124e+03 2.032987e-02 + 1.768512e+03 7.381472e-02 + 4.481476e+02 9.594665e-02 + 7.538748e+02 4.931002e-02 + 1.117613e+01 1.002040e+00 + 4.909653e+00 2.884592e-01 + 2.312876e+00 1.504520e-03 + 1.038420e+00 5.349510e-04 + + + 2.501286e+03 1.282336e-02 + 5.235308e+02 8.807674e-02 + 1.580152e+02 2.545266e-01 + 5.507622e+01 2.374142e-01 + + + 9.487214e+04 1.386184e-03 + 9.349124e+03 9.288381e-03 + 1.768512e+03 3.372472e-02 + 4.481476e+02 4.383643e-02 + 7.538748e+02 2.337702e-02 + 1.117613e+01 6.212373e-01 + 4.909653e+00 1.788368e-01 + 1.018270e+01 4.160800e-01 + + + 2.501286e+03 5.815405e-03 + 5.235308e+02 3.994288e-02 + 1.580152e+02 1.154280e-01 + 5.507622e+01 1.076676e-01 + 3.723646e+00 5.840232e-01 + 1.680574e+00 6.006810e-01 + 7.131027e-01 9.949652e-02 + + + 2.438967e+02 1.897128e-02 + 6.679120e+01 1.083897e-01 + 2.315135e+01 2.303218e-01 + 8.582120e+00 1.535990e-01 + + + 2.438967e+02 4.465139e-02 + 6.679120e+01 2.551094e-01 + 2.315135e+01 5.420927e-01 + 8.582120e+00 3.615153e-01 + 6.419499e+00 7.378972e-03 + 2.354200e+00 1.564342e-02 + 8.317158e-01 7.720316e-03 + + + + + + 0 1 0.000000e+00 4.800000e+01 + 0 1 4.418373e+02 -7.390764e+00 + 0 1 1.035219e+01 -1.743794e+01 + 0 1 1.692241e+00 -9.019157e+00 + 0 2 8.654932e+02 -7.842653e+02 + 0 2 9.280596e+01 -9.552911e+01 + 0 2 5.295508e-01 -1.352907e+00 + + + + 1.009176e+05 1.774244e-02 + 9.844100e+03 1.183708e-01 + 1.849438e+03 4.304124e-01 + 4.666344e+02 5.595855e-01 + 8.548912e+01 3.283032e-02 + 3.686122e+01 2.531609e-02 + 7.183215e+01 7.341386e-03 + + + 2.622068e+03 2.454877e-02 + 5.476712e+02 1.686664e-01 + 1.651321e+02 4.885798e-01 + 5.749730e+01 4.577832e-01 + 2.488532e+01 2.535362e-02 + 9.566524e+00 3.045200e-02 + + + 1.009176e+05 6.723811e-03 + 9.844100e+03 4.485869e-02 + 1.849438e+03 1.631124e-01 + 4.666344e+02 2.120648e-01 + 7.886446e+02 9.121970e-02 + 7.183215e+01 5.335173e-03 + 1.950479e+00 3.551284e-03 + + + 1.009176e+05 3.089298e-03 + 9.844100e+03 2.061061e-02 + 1.849438e+03 7.494302e-02 + 4.666344e+02 9.743451e-02 + 7.886446e+02 4.798006e-02 + 1.039584e+01 1.222086e+00 + 1.950479e+00 8.737503e-02 + 2.172664e+00 9.018310e-03 + + + 2.622068e+03 1.281975e-02 + 5.476712e+02 8.808026e-02 + 1.651321e+02 2.551440e-01 + 5.749730e+01 2.390616e-01 + 4.809538e-01 7.494866e-03 + 1.633000e-01 6.217486e-03 + + + 1.009176e+05 1.391221e-03 + 9.844100e+03 9.281691e-03 + 1.849438e+03 3.374950e-02 + 4.666344e+02 4.387822e-02 + 7.886446e+02 2.627042e-02 + 1.039584e+01 6.546047e-01 + 1.233037e+01 4.443163e-01 + 2.172664e+00 1.660082e-02 + + + 1.009176e+05 5.351154e-04 + 9.844100e+03 3.570085e-03 + 1.849438e+03 1.298132e-02 + 4.666344e+02 1.687720e-02 + 7.886446e+02 9.131888e-03 + 1.039584e+01 2.997215e-01 + 1.233037e+01 1.887165e-01 + 3.439283e-01 9.534798e-01 + 1.443567e-01 3.059850e-01 + + + 2.622068e+03 5.884360e-03 + 5.476712e+02 4.042948e-02 + 1.651321e+02 1.171130e-01 + 5.749730e+01 1.097310e-01 + 3.756752e+00 6.734913e-01 + 1.502927e+00 5.673248e-01 + 4.809538e-01 1.149766e-02 + 1.633000e-01 9.538066e-03 + + + 2.575297e+02 1.919204e-02 + 7.058664e+01 1.103332e-01 + 2.451981e+01 2.362293e-01 + 9.123165e+00 1.585533e-01 + + + 2.575297e+02 4.397336e-02 + 7.058664e+01 2.527986e-01 + 2.451981e+01 5.412554e-01 + 9.123165e+00 3.632818e-01 + 6.952956e+00 7.426077e-03 + 2.591209e+00 1.600456e-02 + 9.343775e-01 7.907209e-03 + + + + + + 0 1 0.000000e+00 4.800000e+01 + 0 1 4.239742e+02 -6.958587e+00 + 0 1 1.033137e+01 -1.610109e+01 + 0 1 1.704769e+00 -8.650936e+00 + 0 2 8.479779e+02 -8.000354e+02 + 0 2 9.325344e+01 -9.308317e+01 + 0 2 5.295500e-01 -1.376229e+00 + + + + 1.077089e+05 1.774558e-02 + 1.039961e+04 1.178455e-01 + 1.940478e+03 4.293305e-01 + 4.874210e+02 5.613372e-01 + 8.943074e+01 3.309324e-02 + 3.860205e+01 2.578581e-02 + 7.505492e+01 7.418349e-03 + + + 2.753935e+03 2.438246e-02 + 5.739820e+02 1.676586e-01 + 1.729309e+02 4.872197e-01 + 6.034045e+01 4.577277e-01 + 2.613393e+01 2.714764e-02 + 1.011833e+01 3.325257e-02 + + + 1.077089e+05 6.747071e-03 + 1.039961e+04 4.480620e-02 + 1.940478e+03 1.632363e-01 + 4.874210e+02 2.134268e-01 + 8.266035e+02 9.027008e-02 + 7.505492e+01 5.438905e-03 + 2.091223e+00 3.565554e-03 + + + 1.077089e+05 3.110860e-03 + 1.039961e+04 2.065872e-02 + 1.940478e+03 7.526308e-02 + 4.874210e+02 9.840430e-02 + 8.266035e+02 4.768257e-02 + 1.092449e+01 1.223205e+00 + 2.091223e+00 8.853101e-02 + 2.328715e+00 9.139834e-03 + + + 2.753935e+03 1.278409e-02 + 5.739820e+02 8.790595e-02 + 1.729309e+02 2.554566e-01 + 6.034045e+01 2.399935e-01 + 5.478717e-01 7.140049e-03 + 1.958695e-01 5.442036e-03 + + + 1.077089e+05 1.417181e-03 + 1.039961e+04 9.411271e-03 + 1.940478e+03 3.428680e-02 + 4.874210e+02 4.482900e-02 + 8.266035e+02 2.622452e-02 + 1.092449e+01 6.696110e-01 + 1.293764e+01 4.472684e-01 + 2.328715e+00 1.806428e-02 + + + 1.077089e+05 5.707487e-04 + 1.039961e+04 3.790250e-03 + 1.940478e+03 1.380850e-02 + 4.874210e+02 1.805421e-02 + 8.266035e+02 9.541499e-03 + 1.092449e+01 3.214358e-01 + 1.293764e+01 2.015345e-01 + 3.911176e-01 1.003898e+00 + 1.703696e-01 2.809982e-01 + + + 2.753935e+03 5.944570e-03 + 5.739820e+02 4.087604e-02 + 1.729309e+02 1.187867e-01 + 6.034045e+01 1.115964e-01 + 4.032446e+00 6.693907e-01 + 1.633220e+00 5.750905e-01 + 5.478717e-01 1.248044e-02 + 1.958695e-01 9.512402e-03 + + + 2.712525e+02 1.942862e-02 + 7.440013e+01 1.122994e-01 + 2.589187e+01 2.419585e-01 + 9.665031e+00 1.629869e-01 + + + 2.712525e+02 4.342654e-02 + 7.440013e+01 2.510098e-01 + 2.589187e+01 5.408217e-01 + 9.665031e+00 3.643056e-01 + 7.510341e+00 7.387887e-03 + 2.841690e+00 1.619778e-02 + 1.044140e+00 8.039416e-03 + + + + + + 0 1 0.000000e+00 7.800000e+01 + 0 1 4.957230e+02 -2.227257e+01 + 0 1 5.940970e+00 -2.119242e+01 + 0 1 1.901390e+00 -1.042548e+01 + 0 2 4.261830e+04 -3.320892e+03 + 0 2 1.359940e+02 -3.509820e+02 + 0 2 6.530800e-01 -5.255910e+00 + + + + 5.036713e+05 1.957831e-02 + 3.856487e+04 1.086627e-01 + 5.904381e+03 3.991082e-01 + 1.289249e+03 6.032374e-01 + 2.558320e+02 3.865044e-02 + 1.104903e+02 4.758163e-02 + 1.942904e+02 1.004381e-02 + + + 7.731113e+03 2.267175e-02 + 1.507506e+03 1.542949e-01 + 4.376697e+02 4.720559e-01 + 1.502123e+02 4.816205e-01 + 6.840685e+01 3.163158e-02 + 2.719751e+01 3.959489e-02 + + + 5.036713e+05 8.076128e-03 + 3.856487e+04 4.482377e-02 + 5.904381e+03 1.646337e-01 + 1.289249e+03 2.488377e-01 + 2.536357e+03 6.161120e-02 + 1.942904e+02 1.078298e-02 + 7.867014e+00 1.012349e-02 + 3.410552e+00 2.460003e-03 + + + 5.036713e+05 3.902105e-03 + 3.856487e+04 2.165729e-02 + 5.904381e+03 7.954527e-02 + 1.289249e+03 1.202297e-01 + 2.536357e+03 3.545812e-02 + 3.244588e+01 1.057109e+00 + 1.327227e+01 2.663563e-01 + 1.489370e+00 3.366259e-03 + 5.994629e-01 8.000617e-04 + + + 7.731113e+03 1.276944e-02 + 1.507506e+03 8.690371e-02 + 4.376697e+02 2.658766e-01 + 1.502123e+02 2.712637e-01 + 1.959124e+00 8.004960e-03 + 7.158242e-01 5.260924e-03 + + + 5.036713e+05 2.085825e-03 + 3.856487e+04 1.157666e-02 + 5.904381e+03 4.252001e-02 + 1.289249e+03 6.426743e-02 + 2.536357e+03 1.071725e-02 + 3.244588e+01 1.162042e+00 + 1.327227e+01 2.927960e-01 + 1.489370e+00 1.834061e-03 + 5.994629e-01 4.359030e-04 + + + 5.036713e+05 9.521954e-04 + 3.856487e+04 5.284833e-03 + 5.904381e+03 1.941071e-02 + 1.289249e+03 2.933858e-02 + 2.536357e+03 3.102355e-03 + 3.244588e+01 6.349639e-01 + 1.327227e+01 1.599898e-01 + 1.489370e+00 1.187720e+00 + 5.994629e-01 2.822865e-01 + + + 7.731113e+03 2.697149e-03 + 1.507506e+03 1.835573e-02 + 4.376697e+02 5.615823e-02 + 1.502123e+02 5.729608e-02 + 1.221030e+01 4.499210e-01 + 5.095106e+00 3.981692e-01 + + + 7.731113e+03 6.519048e-03 + 1.507506e+03 4.436605e-02 + 4.376697e+02 1.357352e-01 + 1.502123e+02 1.384854e-01 + 1.221030e+01 6.862869e-01 + 5.095106e+00 6.073474e-01 + 1.959124e+00 1.472472e-02 + 7.158242e-01 9.677202e-03 + + + 8.591652e+01 9.091024e-02 + 2.563866e+01 3.752020e-01 + 8.801142e+00 5.550099e-01 + 2.890798e+00 2.934681e-01 + + + 7.481043e+02 6.263403e-03 + 2.053677e+02 3.915277e-02 + 7.305338e+01 9.262526e-02 + 2.829822e+01 6.681168e-02 + 2.528211e+00 3.702531e-01 + 9.097497e-01 6.154945e-01 + 2.982332e-01 2.926222e-01 + + + 7.481043e+02 1.921276e-02 + 2.053677e+02 1.200997e-01 + 7.305338e+01 2.841247e-01 + 2.829822e+01 2.049424e-01 + + + 7.481043e+02 3.587156e-02 + 2.053677e+02 2.242345e-01 + 7.305338e+01 5.304805e-01 + 2.829822e+01 3.826418e-01 + 2.498019e+01 9.835162e-03 + 1.029172e+01 2.417978e-02 + 4.169595e+00 1.411766e-02 + + + + + + 0 1 0.000000e+00 7.800000e+01 + 0 1 4.869652e+02 -2.313377e+01 + 0 1 6.787635e+00 -2.483263e+01 + 0 1 1.835036e+00 -1.017391e+01 + 0 2 4.518024e+04 -4.899832e+03 + 0 2 1.141396e+02 -2.195219e+02 + 0 2 7.745997e-01 -5.452892e+00 + + + + 5.341441e+05 1.974472e-02 + 4.059137e+04 1.085520e-01 + 6.160331e+03 3.979800e-01 + 1.335977e+03 6.046208e-01 + 2.670142e+02 3.861109e-02 + 1.149689e+02 4.891774e-02 + 2.014949e+02 1.008361e-02 + + + 8.021998e+03 2.264351e-02 + 1.559323e+03 1.539134e-01 + 4.518366e+02 4.715735e-01 + 1.549029e+02 4.824037e-01 + 7.081715e+01 3.163589e-02 + 2.821050e+01 3.994888e-02 + + + 5.341441e+05 8.171424e-03 + 4.059137e+04 4.492462e-02 + 6.160331e+03 1.647054e-01 + 1.335977e+03 2.502245e-01 + 2.652756e+03 6.037324e-02 + 2.014949e+02 1.101182e-02 + 8.177380e+00 1.042723e-02 + 3.550598e+00 2.516978e-03 + + + 5.341441e+05 3.952489e-03 + 4.059137e+04 2.172988e-02 + 6.160331e+03 7.966743e-02 + 1.335977e+03 1.210327e-01 + 2.652756e+03 3.482429e-02 + 3.356452e+01 1.056428e+00 + 1.374057e+01 2.668860e-01 + 1.578173e+00 3.339576e-03 + 6.446766e-01 7.705908e-04 + + + 8.021998e+03 1.277572e-02 + 1.559323e+03 8.683968e-02 + 4.518366e+02 2.660671e-01 + 1.549029e+02 2.721776e-01 + 2.078785e+00 9.057867e-03 + 7.755449e-01 5.898782e-03 + + + 5.341441e+05 2.116369e-03 + 4.059137e+04 1.163531e-02 + 6.160331e+03 4.265810e-02 + 1.335977e+03 6.480722e-02 + 2.652756e+03 1.057343e-02 + 3.356452e+01 1.167056e+00 + 1.374057e+01 2.948342e-01 + 1.578173e+00 2.073523e-03 + 6.446766e-01 4.784553e-04 + + + 5.341441e+05 9.778673e-04 + 4.059137e+04 5.376090e-03 + 6.160331e+03 1.971016e-02 + 1.335977e+03 2.994415e-02 + 2.652756e+03 3.086386e-03 + 3.356452e+01 6.470368e-01 + 1.374057e+01 1.634613e-01 + 1.578173e+00 1.205839e+00 + 6.446766e-01 2.782415e-01 + + + 8.021998e+03 2.758740e-03 + 1.559323e+03 1.875182e-02 + 4.518366e+02 5.745350e-02 + 1.549029e+02 5.877298e-02 + 1.267788e+01 4.597806e-01 + 5.316224e+00 4.099928e-01 + + + 8.021998e+03 6.548585e-03 + 1.559323e+03 4.451232e-02 + 4.518366e+02 1.363808e-01 + 1.549029e+02 1.395129e-01 + 1.267788e+01 6.839064e-01 + 5.316224e+00 6.098490e-01 + 2.078785e+00 1.506723e-02 + 7.755449e-01 9.812276e-03 + + + 9.056942e+01 8.891606e-02 + 2.712435e+01 3.716817e-01 + 9.372578e+00 5.560401e-01 + 3.113754e+00 2.936912e-01 + + + 7.739088e+02 6.560546e-03 + 2.123687e+02 4.109977e-02 + 7.556823e+01 9.757141e-02 + 2.929984e+01 7.068209e-02 + 2.735608e+00 3.709272e-01 + 1.014563e+00 6.219666e-01 + 3.459034e-01 2.814543e-01 + + + 7.739088e+02 1.921431e-02 + 2.123687e+02 1.203716e-01 + 7.556823e+01 2.857639e-01 + 2.929984e+01 2.070114e-01 + + + 7.739088e+02 3.562056e-02 + 2.123687e+02 2.231517e-01 + 7.556823e+01 5.297651e-01 + 2.929984e+01 3.837692e-01 + 2.606878e+01 9.817937e-03 + 1.079897e+01 2.450247e-02 + 4.401687e+00 1.452283e-02 + + + + + + 0 1 0.000000e+00 7.800000e+01 + 0 1 2.690351e+02 -3.253767e+01 + 0 1 7.166323e+00 -2.260474e+01 + 0 1 1.849351e+00 -9.178123e+00 + 0 2 1.613278e+04 -8.969041e+03 + 0 2 9.110662e+01 -2.673083e+02 + 0 2 8.409393e-01 -5.326061e+00 + + + + 5.664029e+05 1.991978e-02 + 4.272825e+04 1.084627e-01 + 6.427628e+03 3.968563e-01 + 1.384302e+03 6.059809e-01 + 2.787654e+02 3.855249e-02 + 1.196200e+02 5.030315e-02 + 2.089484e+02 1.012059e-02 + + + 8.323227e+03 2.261280e-02 + 1.612743e+03 1.535115e-01 + 4.663912e+02 4.710569e-01 + 1.597001e+02 4.832781e-01 + 7.316488e+01 3.175420e-02 + 2.914382e+01 4.022383e-02 + + + 5.664029e+05 8.270370e-03 + 4.272825e+04 4.503196e-02 + 6.427628e+03 1.647683e-01 + 1.384302e+03 2.515934e-01 + 2.774629e+03 5.914958e-02 + 2.089484e+02 1.124416e-02 + 8.497441e+00 1.074335e-02 + 3.694375e+00 2.576774e-03 + + + 5.664029e+05 4.004475e-03 + 4.272825e+04 2.180427e-02 + 6.427628e+03 7.978004e-02 + 1.384302e+03 1.218204e-01 + 2.774629e+03 3.419788e-02 + 3.471407e+01 1.055621e+00 + 1.422432e+01 2.674770e-01 + 1.670083e+00 3.318727e-03 + 6.905768e-01 7.393068e-04 + + + 8.323227e+03 1.277915e-02 + 1.612743e+03 8.675373e-02 + 4.663912e+02 2.662078e-01 + 1.597001e+02 2.731143e-01 + 2.199622e+00 8.933002e-03 + 8.363468e-01 5.729860e-03 + + + 5.664029e+05 2.147802e-03 + 4.272825e+04 1.169473e-02 + 6.427628e+03 4.279006e-02 + 1.384302e+03 6.533842e-02 + 2.774629e+03 1.043350e-02 + 3.471407e+01 1.171893e+00 + 1.422432e+01 2.969383e-01 + 1.670083e+00 2.354879e-03 + 6.905768e-01 5.245921e-04 + + + 5.664029e+05 1.004063e-03 + 4.272825e+04 5.467098e-03 + 6.427628e+03 2.000367e-02 + 1.384302e+03 3.054466e-02 + 2.774629e+03 3.071493e-03 + 3.471407e+01 6.589934e-01 + 1.422432e+01 1.669781e-01 + 1.670083e+00 1.225433e+00 + 6.905768e-01 2.729875e-01 + + + 8.323227e+03 2.818922e-03 + 1.612743e+03 1.913680e-02 + 4.663912e+02 5.872215e-02 + 1.597001e+02 6.024565e-02 + 1.314259e+01 4.713673e-01 + 5.534688e+00 4.203565e-01 + + + 8.323227e+03 6.576158e-03 + 1.612743e+03 4.464354e-02 + 4.663912e+02 1.369907e-01 + 1.597001e+02 1.405448e-01 + 1.314259e+01 6.846582e-01 + 5.534688e+00 6.105653e-01 + 2.199622e+00 1.531727e-02 + 8.363468e-01 9.824892e-03 + + + 9.531382e+01 8.702363e-02 + 2.864076e+01 3.681724e-01 + 9.957159e+00 5.567165e-01 + 3.343175e+00 2.938595e-01 + + + 8.016838e+02 6.805233e-03 + 2.199102e+02 4.275435e-02 + 7.828421e+01 1.020009e-01 + 3.039040e+01 7.443423e-02 + 2.938973e+00 3.732035e-01 + 1.117393e+00 6.279238e-01 + 3.920597e-01 2.716109e-01 + + + 8.016838e+02 1.915052e-02 + 2.199102e+02 1.203145e-01 + 7.828421e+01 2.870394e-01 + 3.039040e+01 2.094645e-01 + + + 8.016838e+02 3.525897e-02 + 2.199102e+02 2.215170e-01 + 7.828421e+01 5.284824e-01 + 3.039040e+01 3.856553e-01 + 2.715512e+01 9.975382e-03 + 1.130529e+01 2.519320e-02 + 4.636159e+00 1.512790e-02 + + + + + + 0 1 0.000000e+00 7.800000e+01 + 0 1 3.942586e+02 -2.773872e+01 + 0 1 8.002691e+00 -2.548371e+01 + 0 1 1.687569e+00 -1.106726e+01 + 0 2 1.228252e+04 -1.573989e+04 + 0 2 7.531426e+01 -1.783193e+02 + 0 2 5.604055e-01 -1.354229e+00 + + + + 6.005359e+05 2.010310e-02 + 4.498041e+04 1.083926e-01 + 6.706596e+03 3.957331e-01 + 1.434233e+03 6.073169e-01 + 2.911599e+02 3.846977e-02 + 1.244600e+02 5.174752e-02 + 2.166603e+02 1.015525e-02 + + + 8.633443e+03 2.258652e-02 + 1.667493e+03 1.531295e-01 + 4.812575e+02 4.705597e-01 + 1.645937e+02 4.841025e-01 + 7.557288e+01 3.187815e-02 + 3.010295e+01 4.052008e-02 + + + 6.005359e+05 8.373678e-03 + 4.498041e+04 4.514948e-02 + 6.706596e+03 1.648373e-01 + 1.434233e+03 2.529697e-01 + 2.902707e+03 5.792081e-02 + 2.166603e+02 1.148299e-02 + 8.827412e+00 1.107537e-02 + 3.842130e+00 2.640433e-03 + + + 6.005359e+05 4.058625e-03 + 4.498041e+04 2.188343e-02 + 6.706596e+03 7.989475e-02 + 1.434233e+03 1.226115e-01 + 2.902707e+03 3.356623e-02 + 3.589477e+01 1.054692e+00 + 1.472367e+01 2.681120e-01 + 1.765559e+00 3.301523e-03 + 7.374273e-01 7.085223e-04 + + + 8.633443e+03 1.278445e-02 + 1.667493e+03 8.667454e-02 + 4.812575e+02 2.663467e-01 + 1.645937e+02 2.740123e-01 + 2.323357e+00 8.859667e-03 + 8.985772e-01 5.584725e-03 + + + 6.005359e+05 2.180211e-03 + 4.498041e+04 1.175534e-02 + 6.706596e+03 4.291785e-02 + 1.434233e+03 6.586441e-02 + 2.902707e+03 1.029230e-02 + 3.589477e+01 1.176550e+00 + 1.472367e+01 2.990894e-01 + 1.765559e+00 2.673176e-03 + 7.374273e-01 5.736761e-04 + + + 6.005359e+05 1.030740e-03 + 4.498041e+04 5.557580e-03 + 6.706596e+03 2.029030e-02 + 1.434233e+03 3.113876e-02 + 2.902707e+03 3.055656e-03 + 3.589477e+01 6.707732e-01 + 1.472367e+01 1.705165e-01 + 1.765559e+00 1.245654e+00 + 7.374273e-01 2.673232e-01 + + + 8.633443e+03 2.878185e-03 + 1.667493e+03 1.951319e-02 + 4.812575e+02 5.996310e-02 + 1.645937e+02 6.168886e-02 + 1.361899e+01 4.826986e-01 + 5.759339e+00 4.305844e-01 + + + 8.633443e+03 6.604338e-03 + 1.667493e+03 4.477534e-02 + 4.812575e+02 1.375925e-01 + 1.645937e+02 1.415524e-01 + 1.361899e+01 6.853055e-01 + 5.759339e+00 6.113170e-01 + 2.323357e+00 1.559451e-02 + 8.985772e-01 9.830062e-03 + + + 1.001471e+02 8.530397e-02 + 3.018689e+01 3.650135e-01 + 1.055441e+01 5.575616e-01 + 3.578778e+00 2.941948e-01 + + + 8.286368e+02 7.051211e-03 + 2.272032e+02 4.438944e-02 + 8.090108e+01 1.062558e-01 + 3.143327e+01 7.785896e-02 + 3.142810e+00 3.760460e-01 + 1.221199e+00 6.332214e-01 + 4.390344e-01 2.630759e-01 + + + 8.286368e+02 1.915156e-02 + 2.272032e+02 1.205647e-01 + 8.090108e+01 2.885980e-01 + 3.143327e+01 2.114702e-01 + + + 8.286368e+02 3.502436e-02 + 2.272032e+02 2.204886e-01 + 8.090108e+01 5.277877e-01 + 3.143327e+01 3.867364e-01 + 2.828874e+01 9.957523e-03 + 1.183466e+01 2.550149e-02 + 4.878431e+00 1.551388e-02 + + + + + + 0 1 0.000000e+00 7.800000e+01 + 0 1 5.190520e+02 -2.697507e+01 + 0 1 7.767834e+00 -2.599058e+01 + 0 1 1.688595e+00 -1.123702e+01 + 0 2 2.491467e+04 -9.487801e+03 + 0 2 8.702394e+01 -1.511301e+02 + 0 2 6.501742e-01 -1.203176e+00 + + + + 6.366627e+05 2.029520e-02 + 4.735586e+04 1.083430e-01 + 6.998004e+03 3.946125e-01 + 1.485869e+03 6.086274e-01 + 3.042431e+02 3.836574e-02 + 1.294960e+02 5.325298e-02 + 2.246464e+02 1.018374e-02 + + + 8.953691e+03 2.256167e-02 + 1.723751e+03 1.527500e-01 + 4.964799e+02 4.700584e-01 + 1.695920e+02 4.849299e-01 + 7.804048e+01 3.200251e-02 + 3.108457e+01 4.082515e-02 + + + 6.366627e+05 8.481292e-03 + 4.735586e+04 4.527617e-02 + 6.998004e+03 1.649072e-01 + 1.485869e+03 2.543433e-01 + 3.037215e+03 5.669577e-02 + 2.246464e+02 1.172300e-02 + 9.167218e+00 1.142172e-02 + 3.993346e+00 2.706977e-03 + + + 6.366627e+05 4.114772e-03 + 4.735586e+04 2.196613e-02 + 6.998004e+03 8.000616e-02 + 1.485869e+03 1.233969e-01 + 3.037215e+03 3.294287e-02 + 3.711120e+01 1.053523e+00 + 1.524462e+01 2.688838e-01 + 1.864578e+00 3.281989e-03 + 7.850906e-01 6.774653e-04 + + + 8.953691e+03 1.278998e-02 + 1.723751e+03 8.659245e-02 + 4.964799e+02 2.664713e-01 + 1.695920e+02 2.749018e-01 + 2.449806e+00 8.811177e-03 + 9.619672e-01 5.445738e-03 + + + 6.366627e+05 2.213493e-03 + 4.735586e+04 1.181641e-02 + 6.998004e+03 4.303835e-02 + 1.485869e+03 6.637986e-02 + 3.037215e+03 1.016001e-02 + 3.711120e+01 1.180870e+00 + 1.524462e+01 3.013857e-01 + 1.864578e+00 3.037380e-03 + 7.850906e-01 6.269733e-04 + + + 6.366627e+05 1.057776e-03 + 4.735586e+04 5.646788e-03 + 6.998004e+03 2.056702e-02 + 1.485869e+03 3.172138e-02 + 3.037215e+03 3.044346e-03 + 3.711120e+01 6.822282e-01 + 1.524462e+01 1.741207e-01 + 1.864578e+00 1.266285e+00 + 7.850906e-01 2.613855e-01 + + + 8.953691e+03 2.936096e-03 + 1.723751e+03 1.987835e-02 + 4.964799e+02 6.117174e-02 + 1.695920e+02 6.310706e-02 + 1.410623e+01 4.938638e-01 + 5.989433e+00 4.405756e-01 + + + 8.953691e+03 6.632285e-03 + 1.723751e+03 4.490279e-02 + 4.964799e+02 1.381795e-01 + 1.695920e+02 1.425512e-01 + 1.410623e+01 6.860229e-01 + 5.989433e+00 6.120006e-01 + 2.449806e+00 1.587999e-02 + 9.619672e-01 9.814612e-03 + + + 1.050668e+02 8.369065e-02 + 3.176179e+01 3.619621e-01 + 1.116388e+01 5.582237e-01 + 3.820267e+00 2.944914e-01 + + + 8.561902e+02 7.275862e-03 + 2.346489e+02 4.589393e-02 + 8.357131e+01 1.102208e-01 + 3.249777e+01 8.109739e-02 + 3.346024e+00 3.796779e-01 + 1.324721e+00 6.380389e-01 + 4.853186e-01 2.553913e-01 + + + 8.561902e+02 1.915068e-02 + 2.346489e+02 1.207967e-01 + 8.357131e+01 2.901104e-01 + 3.249777e+01 2.134552e-01 + + + 8.561902e+02 3.479403e-02 + 2.346489e+02 2.194702e-01 + 8.357131e+01 5.270888e-01 + 3.249777e+01 3.878173e-01 + 2.944780e+01 9.942086e-03 + 1.237653e+01 2.581128e-02 + 5.126437e+00 1.589788e-02 + + + + + + 0 1 0.000000e+00 7.800000e+01 + 0 1 4.988177e+02 -2.688251e+01 + 0 1 8.811453e+00 -2.585124e+01 + 0 1 1.822679e+00 -1.125073e+01 + 0 2 1.610514e+04 -1.565476e+04 + 0 2 8.251972e+01 -1.606397e+02 + 0 2 6.709391e-01 -1.222878e+00 + + + + 6.748933e+05 2.049634e-02 + 4.986148e+04 1.083145e-01 + 7.302420e+03 3.934954e-01 + 1.539262e+03 6.099120e-01 + 3.180612e+02 3.823758e-02 + 1.347343e+02 5.481627e-02 + 2.328756e+02 1.021127e-02 + + + 9.284304e+03 2.253826e-02 + 1.781558e+03 1.523732e-01 + 5.120667e+02 4.695532e-01 + 1.746969e+02 4.857599e-01 + 8.056918e+01 3.212732e-02 + 3.208910e+01 4.113894e-02 + + + 6.748933e+05 8.593323e-03 + 4.986148e+04 4.541206e-02 + 7.302420e+03 1.649774e-01 + 1.539262e+03 2.557125e-01 + 3.178288e+03 5.547729e-02 + 2.328756e+02 1.197033e-02 + 9.519502e+00 1.177833e-02 + 4.151486e+00 2.780972e-03 + + + 6.748933e+05 4.172600e-03 + 4.986148e+04 2.205042e-02 + 7.302420e+03 8.010691e-02 + 1.539262e+03 1.241645e-01 + 3.178288e+03 3.231804e-02 + 3.836433e+01 1.052108e+00 + 1.578896e+01 2.697879e-01 + 1.967190e+00 3.257334e-03 + 8.335464e-01 6.462859e-04 + + + 9.284304e+03 1.279577e-02 + 1.781558e+03 8.650765e-02 + 5.120667e+02 2.665820e-01 + 1.746969e+02 2.757831e-01 + 2.579154e+00 8.783177e-03 + 1.026515e+00 5.314652e-03 + + + 6.748933e+05 2.247749e-03 + 4.986148e+04 1.187840e-02 + 7.302420e+03 4.315300e-02 + 1.539262e+03 6.688651e-02 + 3.178288e+03 1.002687e-02 + 3.836433e+01 1.184923e+00 + 1.578896e+01 3.038451e-01 + 1.967190e+00 3.401957e-03 + 8.335464e-01 6.749805e-04 + + + 6.748933e+05 1.085198e-03 + 4.986148e+04 5.734809e-03 + 7.302420e+03 2.083398e-02 + 1.539262e+03 3.229235e-02 + 3.178288e+03 3.031746e-03 + 3.836433e+01 6.933854e-01 + 1.578896e+01 1.778021e-01 + 1.967190e+00 1.287010e+00 + 8.335464e-01 2.553550e-01 + + + 9.284304e+03 2.992507e-03 + 1.781558e+03 2.023127e-02 + 5.120667e+02 6.234469e-02 + 1.746969e+02 6.449653e-02 + 1.460451e+01 5.048266e-01 + 6.225015e+00 4.503100e-01 + + + 9.284304e+03 6.659986e-03 + 1.781558e+03 4.502579e-02 + 5.120667e+02 1.387515e-01 + 1.746969e+02 1.435405e-01 + 1.460451e+01 6.867955e-01 + 6.225015e+00 6.126280e-01 + 2.579154e+00 1.616953e-02 + 1.026515e+00 9.784097e-03 + + + 1.100730e+02 8.219039e-02 + 3.336531e+01 3.590862e-01 + 1.178540e+01 5.588329e-01 + 4.067488e+00 2.948007e-01 + + + 8.860628e+02 7.454725e-03 + 2.427296e+02 4.714999e-02 + 8.647772e+01 1.137941e-01 + 3.366670e+01 8.435373e-02 + 3.550752e+00 3.836569e-01 + 1.429080e+00 6.424463e-01 + 5.314869e-01 2.486080e-01 + + + 8.860628e+02 1.907747e-02 + 2.427296e+02 1.206621e-01 + 8.647772e+01 2.912118e-01 + 3.366670e+01 2.158706e-01 + + + 8.860628e+02 3.444229e-02 + 2.427296e+02 2.178422e-01 + 8.647772e+01 5.257511e-01 + 3.366670e+01 3.897307e-01 + 3.059515e+01 1.012055e-02 + 1.291376e+01 2.653624e-02 + 5.376237e+00 1.651825e-02 + + + + diff --git a/src/apps/chem/coredata/mcp2_guess b/src/madness/chem/coredata/mcp2_guess similarity index 100% rename from src/apps/chem/coredata/mcp2_guess rename to src/madness/chem/coredata/mcp2_guess diff --git a/src/apps/chem/coredata/mcp_guess b/src/madness/chem/coredata/mcp_guess similarity index 100% rename from src/apps/chem/coredata/mcp_guess rename to src/madness/chem/coredata/mcp_guess diff --git a/src/apps/chem/corepotential.cc b/src/madness/chem/corepotential.cc similarity index 99% rename from src/apps/chem/corepotential.cc rename to src/madness/chem/corepotential.cc index 8a0789215e3..22f0007270b 100644 --- a/src/apps/chem/corepotential.cc +++ b/src/madness/chem/corepotential.cc @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/apps/chem/corepotential.h b/src/madness/chem/corepotential.h similarity index 99% rename from src/apps/chem/corepotential.h rename to src/madness/chem/corepotential.h index 52e85683829..8202165f607 100644 --- a/src/apps/chem/corepotential.h +++ b/src/madness/chem/corepotential.h @@ -40,7 +40,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/apps/chem/correlationfactor.cc b/src/madness/chem/correlationfactor.cc similarity index 98% rename from src/apps/chem/correlationfactor.cc rename to src/madness/chem/correlationfactor.cc index a5bf33ffed3..b541e36cb56 100644 --- a/src/apps/chem/correlationfactor.cc +++ b/src/madness/chem/correlationfactor.cc @@ -34,7 +34,7 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES -#include +#include namespace madness{ diff --git a/src/apps/chem/correlationfactor.h b/src/madness/chem/correlationfactor.h similarity index 99% rename from src/apps/chem/correlationfactor.h rename to src/madness/chem/correlationfactor.h index bd73e8df43a..176c3e33e2d 100644 --- a/src/apps/chem/correlationfactor.h +++ b/src/madness/chem/correlationfactor.h @@ -75,9 +75,9 @@ #define MADNESS_CHEM_NUCLEARCORRELATIONFACTOR_H_ #include -#include -#include -#include +#include +#include +#include namespace madness { diff --git a/src/apps/chem/def2-SVP b/src/madness/chem/def2-SVP similarity index 100% rename from src/apps/chem/def2-SVP rename to src/madness/chem/def2-SVP diff --git a/src/apps/chem/diamagneticpotentialfactor.cc b/src/madness/chem/diamagneticpotentialfactor.cc similarity index 99% rename from src/apps/chem/diamagneticpotentialfactor.cc rename to src/madness/chem/diamagneticpotentialfactor.cc index 555ae693c09..e3ef281b751 100644 --- a/src/apps/chem/diamagneticpotentialfactor.cc +++ b/src/madness/chem/diamagneticpotentialfactor.cc @@ -5,9 +5,9 @@ * Author: fbischoff */ -#include +#include #include -#include +#include namespace madness { diff --git a/src/apps/chem/diamagneticpotentialfactor.h b/src/madness/chem/diamagneticpotentialfactor.h similarity index 99% rename from src/apps/chem/diamagneticpotentialfactor.h rename to src/madness/chem/diamagneticpotentialfactor.h index b5f4c414607..9c8d172810a 100644 --- a/src/apps/chem/diamagneticpotentialfactor.h +++ b/src/madness/chem/diamagneticpotentialfactor.h @@ -10,7 +10,7 @@ #include -#include +#include namespace madness { diff --git a/src/apps/chem/distpm.cc b/src/madness/chem/distpm.cc similarity index 99% rename from src/apps/chem/distpm.cc rename to src/madness/chem/distpm.cc index 4a16e610736..2d85e68031a 100644 --- a/src/apps/chem/distpm.cc +++ b/src/madness/chem/distpm.cc @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/apps/chem/distpm.h b/src/madness/chem/distpm.h similarity index 89% rename from src/apps/chem/distpm.h rename to src/madness/chem/distpm.h index ec287d0fd61..875eacddde8 100644 --- a/src/apps/chem/distpm.h +++ b/src/madness/chem/distpm.h @@ -1,9 +1,9 @@ #ifndef MADNESS_DISTPM_H #define MADNESS_DISTPM_H -#include -#include -#include +#include +#include +#include #include diff --git a/src/apps/chem/electronic_correlation_factor.h b/src/madness/chem/electronic_correlation_factor.h similarity index 99% rename from src/apps/chem/electronic_correlation_factor.h rename to src/madness/chem/electronic_correlation_factor.h index 39b915dd9fb..a1fab4d12c1 100644 --- a/src/apps/chem/electronic_correlation_factor.h +++ b/src/madness/chem/electronic_correlation_factor.h @@ -12,7 +12,7 @@ #include #include -#include +#include #include namespace madness { diff --git a/src/apps/chem/exchangeoperator.cc b/src/madness/chem/exchangeoperator.cc similarity index 99% rename from src/apps/chem/exchangeoperator.cc rename to src/madness/chem/exchangeoperator.cc index 5dc4393991f..f50b17acb0c 100644 --- a/src/apps/chem/exchangeoperator.cc +++ b/src/madness/chem/exchangeoperator.cc @@ -1,8 +1,8 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES -#include +#include -#include -#include +#include +#include #include using namespace madness; diff --git a/src/apps/chem/exchangeoperator.h b/src/madness/chem/exchangeoperator.h similarity index 99% rename from src/apps/chem/exchangeoperator.h rename to src/madness/chem/exchangeoperator.h index fb17bc7908f..0bf8534a506 100644 --- a/src/apps/chem/exchangeoperator.h +++ b/src/madness/chem/exchangeoperator.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include namespace madness { diff --git a/src/apps/chem/gaussian.cc b/src/madness/chem/gaussian.cc similarity index 100% rename from src/apps/chem/gaussian.cc rename to src/madness/chem/gaussian.cc diff --git a/src/apps/chem/gaussian.h b/src/madness/chem/gaussian.h similarity index 99% rename from src/apps/chem/gaussian.h rename to src/madness/chem/gaussian.h index 4290f3d8225..150ab5d72d5 100644 --- a/src/apps/chem/gaussian.h +++ b/src/madness/chem/gaussian.h @@ -17,9 +17,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/apps/chem/gth_pseudopotential.cc b/src/madness/chem/gth_pseudopotential.cc similarity index 97% rename from src/apps/chem/gth_pseudopotential.cc rename to src/madness/chem/gth_pseudopotential.cc index 9db077e5ae3..5c3660779b9 100644 --- a/src/apps/chem/gth_pseudopotential.cc +++ b/src/madness/chem/gth_pseudopotential.cc @@ -1,5 +1,5 @@ -#include +#include namespace madness { diff --git a/src/apps/chem/gth_pseudopotential.h b/src/madness/chem/gth_pseudopotential.h similarity index 99% rename from src/apps/chem/gth_pseudopotential.h rename to src/madness/chem/gth_pseudopotential.h index 0a230602b0a..5acea4811a3 100644 --- a/src/apps/chem/gth_pseudopotential.h +++ b/src/madness/chem/gth_pseudopotential.h @@ -10,9 +10,9 @@ #include #include -#include -#include -#include +#include +#include +#include namespace madness { diff --git a/src/apps/chem/lda.cc b/src/madness/chem/lda.cc similarity index 100% rename from src/apps/chem/lda.cc rename to src/madness/chem/lda.cc diff --git a/src/apps/chem/localizer.cc b/src/madness/chem/localizer.cc similarity index 99% rename from src/apps/chem/localizer.cc rename to src/madness/chem/localizer.cc index 353c1bd4220..b004e7a71c1 100644 --- a/src/apps/chem/localizer.cc +++ b/src/madness/chem/localizer.cc @@ -2,7 +2,7 @@ // Created by Florian Bischoff on 11/1/21. // -#include +#include #include #include #include diff --git a/src/apps/chem/localizer.h b/src/madness/chem/localizer.h similarity index 97% rename from src/apps/chem/localizer.h rename to src/madness/chem/localizer.h index d6c4d1f75d6..5430f3a1de7 100644 --- a/src/apps/chem/localizer.h +++ b/src/madness/chem/localizer.h @@ -5,12 +5,12 @@ #ifndef MADNESS_LOCALIZER_H #define MADNESS_LOCALIZER_H -#include -#include -#include +#include +#include +#include #include #include -#include +#include namespace madness { diff --git a/src/apps/chem/masks_and_boxes.h b/src/madness/chem/masks_and_boxes.h similarity index 100% rename from src/apps/chem/masks_and_boxes.h rename to src/madness/chem/masks_and_boxes.h diff --git a/src/apps/chem/molecular_functors.h b/src/madness/chem/molecular_functors.h similarity index 98% rename from src/apps/chem/molecular_functors.h rename to src/madness/chem/molecular_functors.h index 2ff601e8d15..8d2e7af0572 100644 --- a/src/apps/chem/molecular_functors.h +++ b/src/madness/chem/molecular_functors.h @@ -4,8 +4,8 @@ #ifndef MADNESS_MOLECULAR_FUNCTORS_H #define MADNESS_MOLECULAR_FUNCTORS_H -#include -#include +#include +#include #include #include namespace madchem { diff --git a/src/apps/chem/molecular_optimizer.h b/src/madness/chem/molecular_optimizer.h similarity index 99% rename from src/apps/chem/molecular_optimizer.h rename to src/madness/chem/molecular_optimizer.h index c0a950b0ee8..d4ba7e36e7d 100644 --- a/src/apps/chem/molecular_optimizer.h +++ b/src/madness/chem/molecular_optimizer.h @@ -37,8 +37,8 @@ #define MADNESS_CHEM_MOLECULAR_OPTIMIZER_H__INCLUDED #include -#include -#include +#include +#include namespace madness { diff --git a/src/apps/chem/molecularbasis.cc b/src/madness/chem/molecularbasis.cc similarity index 97% rename from src/apps/chem/molecularbasis.cc rename to src/madness/chem/molecularbasis.cc index 88221cc4379..d18df1a3b19 100644 --- a/src/apps/chem/molecularbasis.cc +++ b/src/madness/chem/molecularbasis.cc @@ -1,300 +1,300 @@ -/* - This file is part of MADNESS. - - Copyright (C) 2007,2010 Oak Ridge National Laboratory - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For more information please contact: - - Robert J. Harrison - Oak Ridge National Laboratory - One Bethel Valley Road - P.O. Box 2008, MS-6367 - - email: harrisonrj@ornl.gov - tel: 865-241-3937 - fax: 865-572-0680 - - $Id$ -*/ - -#include -#include "NWChem.h" - -namespace madness { - -std::ostream& operator<<(std::ostream& s, const ContractedGaussianShell& c) { - static const char* tag[] = {"s","p","d","f","g"}; - char buf[32768]; - char* p = buf; - const std::vector& coeff = c.get_coeff(); - const std::vector& expnt = c.get_expnt(); - - p += sprintf(p,"%s [",tag[c.angular_momentum()]); - for (int i=0; i& shells = c.get_shells(); - for (int i=0; i 0) { - std::cout << " " << get_atomic_data(i).symbol << std::endl; - std::cout << ag[i]; - } - } -} - -void AtomicBasisSet::read_file(std::string filename) { - static const bool debug = false; - const char* data_dir = MRA_CHEMDATA_DIR; - - std::string full_filename(data_dir); - full_filename+="/"+filename; - - // override default location for the basis set - if (getenv("MRA_CHEMDATA_DIR")) { - char* chemdata_dir=getenv("MRA_CHEMDATA_DIR"); - full_filename=std::string(chemdata_dir)+"/"+filename; - } - - - TiXmlDocument doc(full_filename); - - // try to read the AO basis from current directory, otherwise from - // the environment variable MRA_DATA_DIR - if (!doc.LoadFile()) { - - std::cout << "AtomicBasisSet: Failed loading from file " << filename - << " : ErrorDesc " << doc.ErrorDesc() - << " : Row " << doc.ErrorRow() - << " : Col " << doc.ErrorCol() << std::endl; - MADNESS_EXCEPTION("AtomicBasisSet: Failed loading basis set",0); - } - for (TiXmlElement* node=doc.FirstChildElement(); node; node=node->NextSiblingElement()) { - if (strcmp(node->Value(),"name") == 0) { - name = node->GetText(); - if (debug) std::cout << "Loading basis set " << name << std::endl; - } - else if (strcmp(node->Value(), "basis") == 0) { - const char* symbol = node->Attribute("symbol"); - if (debug) std::cout << " found basis set for " << symbol << std::endl; - int atn = symbol_to_atomic_number(symbol); - std::vector g; - for (TiXmlElement* shell=node->FirstChildElement(); shell; shell=shell->NextSiblingElement()) { - const char* type = shell->Attribute("type"); - int nprim=-1; - shell->Attribute("nprim",&nprim); - if (debug) std::cout << " found shell " << type << " " << nprim << std::endl; - std::vector expnt = load_tixml_vector(shell, nprim, "exponents"); - if (strcmp(type,"L") == 0) { - std::vector scoeff = load_tixml_vector(shell, nprim, "scoefficients"); - std::vector pcoeff = load_tixml_vector(shell, nprim, "pcoefficients"); - g.push_back(ContractedGaussianShell(0,scoeff,expnt)); - g.push_back(ContractedGaussianShell(1,pcoeff,expnt)); - } - else { - static const char* tag[] = {"S","P","D","F","G"}; - int i; - for (i=0; i<5; ++i) { - if (strcmp(type,tag[i]) == 0) goto foundit; - } - MADNESS_EXCEPTION("Loading atomic basis set: bad shell type?",0); -foundit: - std::vector coeff = load_tixml_vector(shell, nprim, "coefficients"); - g.push_back(ContractedGaussianShell(i, coeff, expnt)); - } - } - ag[atn] = AtomicBasis(g); - } - else if (strcmp(node->Value(), "atomicguess") == 0) { - const char* symbol = node->Attribute("symbol"); - if (debug) std::cout << " atomic guess info for " << symbol << std::endl; - int atn = symbol_to_atomic_number(symbol); - MADNESS_ASSERT(is_supported(atn)); - int nbf = ag[atn].nbf(); - Tensor dmat = load_tixml_matrix(node, nbf, nbf, "guessdensitymatrix"); - Tensor dmatpsp = dmat; - Tensor aocc = load_tixml_matrix(node, nbf, 1, "alphaocc"); - Tensor bocc = load_tixml_matrix(node, nbf, 1, "betaocc"); - Tensor aeps = load_tixml_matrix(node, nbf, 1, "alphaeps"); - Tensor beps = load_tixml_matrix(node, nbf, 1, "betaeps"); - Tensor aoccpsp = aocc; - Tensor boccpsp = bocc; - Tensor avec = load_tixml_matrix(node, nbf, nbf, "alphavectors"); - Tensor bvec = load_tixml_matrix(node, nbf, nbf, "betavectors"); - ag[atn].set_guess_info(dmat, dmatpsp, avec, bvec, aocc, bocc, aeps, beps, aoccpsp, boccpsp); - } - else { - MADNESS_EXCEPTION("Loading atomic basis set: unexpected XML element", 0); - } - } - -} - -void AtomicBasisSet::read_nw_file(std::string filename) { - - // Construct the slymer object that contains interface - std::ostream bad(nullptr); - slymer::NWChem_Interface nwchem(filename, bad); - - // Read in the molecule info - nwchem.read(slymer::Properties::Atoms); - - // Let madness know a basis exists on each atom... - for(const slymer::Atom &atom : nwchem.atoms) { - int atn = symbol_to_atomic_number(atom.symbol); - - // We need to add to ag[atn] so madness doesn't baulk - // These functions will not be used in anyway. Need - // to add at least the number of orbitals to work. - // Adding in 2 basis functions per electron, just to - // be safe. - if (ag[atn].nbf() == 0) { - std::vector g; - for(int i = 0; i < atn; i++) { - g.push_back(ContractedGaussianShell(0,{1},{1})); - g.push_back(ContractedGaussianShell(1,{2},{2})); - } - ag[atn] = AtomicBasis(g); - } - } -} - - - -void AtomicBasisSet::modify_dmat_psp(int atn, double zeff){ - static const bool debug = false; - - // number of core states to be eliminated - int zcore = atn - round(zeff); - - Tensor aocc = ag[atn].get_aoccpsp(); - Tensor bocc = ag[atn].get_boccpsp(); - - double occ_sum = aocc.sum() + bocc.sum(); - - if (debug) std::cout << "before: atn, zeff, occ_sum " << atn << " " << zeff << " " << occ_sum << std::endl; - if (debug) std::cout << "aocc:" << std::endl; - if (debug) std::cout << aocc << std::endl; - if (debug) std::cout << "bocc:" << std::endl; - if (debug) std::cout << bocc << std::endl; - - // return immediately if we already modified this atom type or if there are no core states - // allow for noise in occupancy sum - double tol=1e-4; - if (zcore==0 || (occ_sum < zeff+tol && occ_sum > zeff-tol)) return; - - // otherwise check that total occupancy matches atomic number within tolerance - if (occ_sum > atn+tol || occ_sum < atn-tol){ - MADNESS_EXCEPTION("Problem with occupancy of initial guess", 0); - } - - // set occupancies for relevant core states to zero - // assuming that there is an even number of core states with occupancy 1 - for (int i=0;i avec = ag[atn].get_avec(); - Tensor bvec = ag[atn].get_bvec(); - - Tensor aovec = transpose(avec); - Tensor bovec = transpose(bvec); - - // multiply vectors by occupancies - for (int i=0;i dmata = inner(avec, aovec); - Tensor dmatb = inner(bvec, bovec); - Tensor dmat = dmata + dmatb; - - if (debug) std::cout << "dmat:" << std::endl; - if (debug) std::cout << dmat << std::endl; - - ag[atn].set_dmatpsp(dmat); - -} - - -} +/* + This file is part of MADNESS. + + Copyright (C) 2007,2010 Oak Ridge National Laboratory + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + For more information please contact: + + Robert J. Harrison + Oak Ridge National Laboratory + One Bethel Valley Road + P.O. Box 2008, MS-6367 + + email: harrisonrj@ornl.gov + tel: 865-241-3937 + fax: 865-572-0680 + + $Id$ +*/ + +#include +#include "NWChem.h" + +namespace madness { + +std::ostream& operator<<(std::ostream& s, const ContractedGaussianShell& c) { + static const char* tag[] = {"s","p","d","f","g"}; + char buf[32768]; + char* p = buf; + const std::vector& coeff = c.get_coeff(); + const std::vector& expnt = c.get_expnt(); + + p += sprintf(p,"%s [",tag[c.angular_momentum()]); + for (int i=0; i& shells = c.get_shells(); + for (int i=0; i 0) { + std::cout << " " << get_atomic_data(i).symbol << std::endl; + std::cout << ag[i]; + } + } +} + +void AtomicBasisSet::read_file(std::string filename) { + static const bool debug = false; + const char* data_dir = MRA_CHEMDATA_DIR; + + std::string full_filename(data_dir); + full_filename+="/"+filename; + + // override default location for the basis set + if (getenv("MRA_CHEMDATA_DIR")) { + char* chemdata_dir=getenv("MRA_CHEMDATA_DIR"); + full_filename=std::string(chemdata_dir)+"/"+filename; + } + + + TiXmlDocument doc(full_filename); + + // try to read the AO basis from current directory, otherwise from + // the environment variable MRA_DATA_DIR + if (!doc.LoadFile()) { + + std::cout << "AtomicBasisSet: Failed loading from file " << filename + << " : ErrorDesc " << doc.ErrorDesc() + << " : Row " << doc.ErrorRow() + << " : Col " << doc.ErrorCol() << std::endl; + MADNESS_EXCEPTION("AtomicBasisSet: Failed loading basis set",0); + } + for (TiXmlElement* node=doc.FirstChildElement(); node; node=node->NextSiblingElement()) { + if (strcmp(node->Value(),"name") == 0) { + name = node->GetText(); + if (debug) std::cout << "Loading basis set " << name << std::endl; + } + else if (strcmp(node->Value(), "basis") == 0) { + const char* symbol = node->Attribute("symbol"); + if (debug) std::cout << " found basis set for " << symbol << std::endl; + int atn = symbol_to_atomic_number(symbol); + std::vector g; + for (TiXmlElement* shell=node->FirstChildElement(); shell; shell=shell->NextSiblingElement()) { + const char* type = shell->Attribute("type"); + int nprim=-1; + shell->Attribute("nprim",&nprim); + if (debug) std::cout << " found shell " << type << " " << nprim << std::endl; + std::vector expnt = load_tixml_vector(shell, nprim, "exponents"); + if (strcmp(type,"L") == 0) { + std::vector scoeff = load_tixml_vector(shell, nprim, "scoefficients"); + std::vector pcoeff = load_tixml_vector(shell, nprim, "pcoefficients"); + g.push_back(ContractedGaussianShell(0,scoeff,expnt)); + g.push_back(ContractedGaussianShell(1,pcoeff,expnt)); + } + else { + static const char* tag[] = {"S","P","D","F","G"}; + int i; + for (i=0; i<5; ++i) { + if (strcmp(type,tag[i]) == 0) goto foundit; + } + MADNESS_EXCEPTION("Loading atomic basis set: bad shell type?",0); +foundit: + std::vector coeff = load_tixml_vector(shell, nprim, "coefficients"); + g.push_back(ContractedGaussianShell(i, coeff, expnt)); + } + } + ag[atn] = AtomicBasis(g); + } + else if (strcmp(node->Value(), "atomicguess") == 0) { + const char* symbol = node->Attribute("symbol"); + if (debug) std::cout << " atomic guess info for " << symbol << std::endl; + int atn = symbol_to_atomic_number(symbol); + MADNESS_ASSERT(is_supported(atn)); + int nbf = ag[atn].nbf(); + Tensor dmat = load_tixml_matrix(node, nbf, nbf, "guessdensitymatrix"); + Tensor dmatpsp = dmat; + Tensor aocc = load_tixml_matrix(node, nbf, 1, "alphaocc"); + Tensor bocc = load_tixml_matrix(node, nbf, 1, "betaocc"); + Tensor aeps = load_tixml_matrix(node, nbf, 1, "alphaeps"); + Tensor beps = load_tixml_matrix(node, nbf, 1, "betaeps"); + Tensor aoccpsp = aocc; + Tensor boccpsp = bocc; + Tensor avec = load_tixml_matrix(node, nbf, nbf, "alphavectors"); + Tensor bvec = load_tixml_matrix(node, nbf, nbf, "betavectors"); + ag[atn].set_guess_info(dmat, dmatpsp, avec, bvec, aocc, bocc, aeps, beps, aoccpsp, boccpsp); + } + else { + MADNESS_EXCEPTION("Loading atomic basis set: unexpected XML element", 0); + } + } + +} + +void AtomicBasisSet::read_nw_file(std::string filename) { + + // Construct the slymer object that contains interface + std::ostream bad(nullptr); + slymer::NWChem_Interface nwchem(filename, bad); + + // Read in the molecule info + nwchem.read(slymer::Properties::Atoms); + + // Let madness know a basis exists on each atom... + for(const slymer::Atom &atom : nwchem.atoms) { + int atn = symbol_to_atomic_number(atom.symbol); + + // We need to add to ag[atn] so madness doesn't baulk + // These functions will not be used in anyway. Need + // to add at least the number of orbitals to work. + // Adding in 2 basis functions per electron, just to + // be safe. + if (ag[atn].nbf() == 0) { + std::vector g; + for(int i = 0; i < atn; i++) { + g.push_back(ContractedGaussianShell(0,{1},{1})); + g.push_back(ContractedGaussianShell(1,{2},{2})); + } + ag[atn] = AtomicBasis(g); + } + } +} + + + +void AtomicBasisSet::modify_dmat_psp(int atn, double zeff){ + static const bool debug = false; + + // number of core states to be eliminated + int zcore = atn - round(zeff); + + Tensor aocc = ag[atn].get_aoccpsp(); + Tensor bocc = ag[atn].get_boccpsp(); + + double occ_sum = aocc.sum() + bocc.sum(); + + if (debug) std::cout << "before: atn, zeff, occ_sum " << atn << " " << zeff << " " << occ_sum << std::endl; + if (debug) std::cout << "aocc:" << std::endl; + if (debug) std::cout << aocc << std::endl; + if (debug) std::cout << "bocc:" << std::endl; + if (debug) std::cout << bocc << std::endl; + + // return immediately if we already modified this atom type or if there are no core states + // allow for noise in occupancy sum + double tol=1e-4; + if (zcore==0 || (occ_sum < zeff+tol && occ_sum > zeff-tol)) return; + + // otherwise check that total occupancy matches atomic number within tolerance + if (occ_sum > atn+tol || occ_sum < atn-tol){ + MADNESS_EXCEPTION("Problem with occupancy of initial guess", 0); + } + + // set occupancies for relevant core states to zero + // assuming that there is an even number of core states with occupancy 1 + for (int i=0;i avec = ag[atn].get_avec(); + Tensor bvec = ag[atn].get_bvec(); + + Tensor aovec = transpose(avec); + Tensor bovec = transpose(bvec); + + // multiply vectors by occupancies + for (int i=0;i dmata = inner(avec, aovec); + Tensor dmatb = inner(bvec, bovec); + Tensor dmat = dmata + dmatb; + + if (debug) std::cout << "dmat:" << std::endl; + if (debug) std::cout << dmat << std::endl; + + ag[atn].set_dmatpsp(dmat); + +} + + +} diff --git a/src/apps/chem/molecularbasis.h b/src/madness/chem/molecularbasis.h similarity index 99% rename from src/apps/chem/molecularbasis.h rename to src/madness/chem/molecularbasis.h index a7ca970c5bb..d201e519124 100644 --- a/src/apps/chem/molecularbasis.h +++ b/src/madness/chem/molecularbasis.h @@ -34,8 +34,8 @@ #include #include -#include -#include +#include +#include #include #include diff --git a/src/apps/chem/molecule.cc b/src/madness/chem/molecule.cc similarity index 99% rename from src/apps/chem/molecule.cc rename to src/madness/chem/molecule.cc index db3c8b5bb92..83296098deb 100644 --- a/src/apps/chem/molecule.cc +++ b/src/madness/chem/molecule.cc @@ -40,9 +40,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include #include #include diff --git a/src/apps/chem/molecule.h b/src/madness/chem/molecule.h similarity index 99% rename from src/apps/chem/molecule.h rename to src/madness/chem/molecule.h index 11d9f95c434..ddd1167fa5b 100644 --- a/src/apps/chem/molecule.h +++ b/src/madness/chem/molecule.h @@ -35,10 +35,10 @@ /// \file moldft/molecule.h /// \brief Declaration of molecule related classes and functions -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include diff --git a/src/apps/chem/molopt.h b/src/madness/chem/molopt.h similarity index 100% rename from src/apps/chem/molopt.h rename to src/madness/chem/molopt.h diff --git a/src/apps/chem/mp2.cc b/src/madness/chem/mp2.cc similarity index 99% rename from src/apps/chem/mp2.cc rename to src/madness/chem/mp2.cc index 46c725e642b..bf1cb96b4c1 100644 --- a/src/apps/chem/mp2.cc +++ b/src/madness/chem/mp2.cc @@ -42,14 +42,14 @@ */ -#include +#include #include #include -#include +#include #include -#include -#include -#include +#include +#include +#include #include diff --git a/src/apps/chem/mp2.h b/src/madness/chem/mp2.h similarity index 98% rename from src/apps/chem/mp2.h rename to src/madness/chem/mp2.h index ca0438c8640..162e5158803 100644 --- a/src/apps/chem/mp2.h +++ b/src/madness/chem/mp2.h @@ -42,14 +42,14 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include -#include -#include +#include +#include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include diff --git a/src/apps/chem/nemo.cc b/src/madness/chem/nemo.cc similarity index 99% rename from src/apps/chem/nemo.cc rename to src/madness/chem/nemo.cc index 8e6dde1624a..2d5bc2a2034 100644 --- a/src/apps/chem/nemo.cc +++ b/src/madness/chem/nemo.cc @@ -41,16 +41,16 @@ */ -#include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include diff --git a/src/apps/chem/nemo.h b/src/madness/chem/nemo.h similarity index 98% rename from src/apps/chem/nemo.h rename to src/madness/chem/nemo.h index 733e6720eaa..5f3b80798fa 100644 --- a/src/apps/chem/nemo.h +++ b/src/madness/chem/nemo.h @@ -48,18 +48,18 @@ #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include namespace madness { diff --git a/src/apps/chem/oep.cc b/src/madness/chem/oep.cc similarity index 99% rename from src/apps/chem/oep.cc rename to src/madness/chem/oep.cc index 8ea609337a4..bbb7b4599ed 100644 --- a/src/apps/chem/oep.cc +++ b/src/madness/chem/oep.cc @@ -5,8 +5,8 @@ * Author: fbischoff */ -#include -#include +#include +#include #include diff --git a/src/apps/chem/oep.h b/src/madness/chem/oep.h similarity index 99% rename from src/apps/chem/oep.h rename to src/madness/chem/oep.h index 7b232673b6a..6fed44e5d62 100644 --- a/src/apps/chem/oep.h +++ b/src/madness/chem/oep.h @@ -10,10 +10,10 @@ -#include -#include -#include -#include +#include +#include +#include +#include namespace madness { diff --git a/src/apps/chem/pcm.cc b/src/madness/chem/pcm.cc similarity index 99% rename from src/apps/chem/pcm.cc rename to src/madness/chem/pcm.cc index 8e436303ce7..cec461e0694 100644 --- a/src/apps/chem/pcm.cc +++ b/src/madness/chem/pcm.cc @@ -30,9 +30,9 @@ */ #include "madness.h" -#include -#include -#include +#include +#include +#include #ifdef MADNESS_HAS_PCM diff --git a/src/apps/chem/pcm.h b/src/madness/chem/pcm.h similarity index 99% rename from src/apps/chem/pcm.h rename to src/madness/chem/pcm.h index 7413beb5cd2..2d379510fb1 100644 --- a/src/apps/chem/pcm.h +++ b/src/madness/chem/pcm.h @@ -37,7 +37,7 @@ #include #include #include -#include +#include #ifdef MADNESS_HAS_PCM #include diff --git a/src/apps/chem/plotxc.cc b/src/madness/chem/plotxc.cc similarity index 100% rename from src/apps/chem/plotxc.cc rename to src/madness/chem/plotxc.cc diff --git a/src/apps/chem/pointgroupoperator.h b/src/madness/chem/pointgroupoperator.h similarity index 100% rename from src/apps/chem/pointgroupoperator.h rename to src/madness/chem/pointgroupoperator.h diff --git a/src/apps/chem/pointgroupsymmetry.cc b/src/madness/chem/pointgroupsymmetry.cc similarity index 99% rename from src/apps/chem/pointgroupsymmetry.cc rename to src/madness/chem/pointgroupsymmetry.cc index 87626ffaebd..24c3d4367eb 100644 --- a/src/apps/chem/pointgroupsymmetry.cc +++ b/src/madness/chem/pointgroupsymmetry.cc @@ -44,7 +44,7 @@ */ -#include +#include #include #include #include diff --git a/src/apps/chem/pointgroupsymmetry.h b/src/madness/chem/pointgroupsymmetry.h similarity index 99% rename from src/apps/chem/pointgroupsymmetry.h rename to src/madness/chem/pointgroupsymmetry.h index 5e79a9d11d2..5fc468102d8 100644 --- a/src/apps/chem/pointgroupsymmetry.h +++ b/src/madness/chem/pointgroupsymmetry.h @@ -64,7 +64,7 @@ #define SRC_APPS_CHEM_POINTGROUPSYMMETRY_H_ #include -#include +#include namespace madness { diff --git a/src/apps/chem/polynomial.cc b/src/madness/chem/polynomial.cc similarity index 100% rename from src/apps/chem/polynomial.cc rename to src/madness/chem/polynomial.cc diff --git a/src/apps/chem/polynomial.h b/src/madness/chem/polynomial.h similarity index 100% rename from src/apps/chem/polynomial.h rename to src/madness/chem/polynomial.h diff --git a/src/apps/chem/potentialmanager.h b/src/madness/chem/potentialmanager.h similarity index 99% rename from src/apps/chem/potentialmanager.h rename to src/madness/chem/potentialmanager.h index 8d4354e96fc..45cb066201c 100644 --- a/src/apps/chem/potentialmanager.h +++ b/src/madness/chem/potentialmanager.h @@ -36,8 +36,8 @@ /// \file moldft/potentialmanager.h /// \brief Declaration of molecule related classes and functions -#include -#include +#include +#include #include #include #include diff --git a/src/apps/chem/projector.h b/src/madness/chem/projector.h similarity index 100% rename from src/apps/chem/projector.h rename to src/madness/chem/projector.h diff --git a/src/apps/chem/sto-3g b/src/madness/chem/sto-3g similarity index 100% rename from src/apps/chem/sto-3g rename to src/madness/chem/sto-3g diff --git a/src/apps/chem/sto-6g b/src/madness/chem/sto-6g similarity index 100% rename from src/apps/chem/sto-6g rename to src/madness/chem/sto-6g diff --git a/src/apps/chem/structure_library b/src/madness/chem/structure_library similarity index 100% rename from src/apps/chem/structure_library rename to src/madness/chem/structure_library diff --git a/src/apps/chem/test_BSHApply.cc b/src/madness/chem/test_BSHApply.cc similarity index 99% rename from src/apps/chem/test_BSHApply.cc rename to src/madness/chem/test_BSHApply.cc index bf9c5219478..b33661823e9 100644 --- a/src/apps/chem/test_BSHApply.cc +++ b/src/madness/chem/test_BSHApply.cc @@ -6,7 +6,7 @@ */ #include -#include +#include #include using namespace madness; diff --git a/src/apps/chem/test_MolecularOrbitals.cc b/src/madness/chem/test_MolecularOrbitals.cc similarity index 97% rename from src/apps/chem/test_MolecularOrbitals.cc rename to src/madness/chem/test_MolecularOrbitals.cc index f72d470aa5e..d5da55dceb3 100644 --- a/src/apps/chem/test_MolecularOrbitals.cc +++ b/src/madness/chem/test_MolecularOrbitals.cc @@ -5,9 +5,9 @@ * Author: fbischoff */ -#include -#include -#include +#include +#include +#include using namespace madness; diff --git a/src/apps/chem/test_QCCalculationParametersBase.cc b/src/madness/chem/test_QCCalculationParametersBase.cc similarity index 99% rename from src/apps/chem/test_QCCalculationParametersBase.cc rename to src/madness/chem/test_QCCalculationParametersBase.cc index 619d498aeee..caaab0200a1 100644 --- a/src/apps/chem/test_QCCalculationParametersBase.cc +++ b/src/madness/chem/test_QCCalculationParametersBase.cc @@ -7,7 +7,7 @@ -#include +#include #include #include diff --git a/src/apps/chem/test_SCFOperators.cc b/src/madness/chem/test_SCFOperators.cc similarity index 99% rename from src/apps/chem/test_SCFOperators.cc rename to src/madness/chem/test_SCFOperators.cc index 63506075b66..87be4871d85 100644 --- a/src/apps/chem/test_SCFOperators.cc +++ b/src/madness/chem/test_SCFOperators.cc @@ -31,11 +31,11 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include using namespace madness; diff --git a/src/apps/chem/test_ccpairfunction.cc b/src/madness/chem/test_ccpairfunction.cc similarity index 99% rename from src/apps/chem/test_ccpairfunction.cc rename to src/madness/chem/test_ccpairfunction.cc index cef3d3f9ff3..505c0828c29 100644 --- a/src/apps/chem/test_ccpairfunction.cc +++ b/src/madness/chem/test_ccpairfunction.cc @@ -4,11 +4,11 @@ #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include diff --git a/src/apps/chem/test_correlation_factor.h b/src/madness/chem/test_correlation_factor.h similarity index 94% rename from src/apps/chem/test_correlation_factor.h rename to src/madness/chem/test_correlation_factor.h index 4b4381ab2af..05fd0beff69 100644 --- a/src/apps/chem/test_correlation_factor.h +++ b/src/madness/chem/test_correlation_factor.h @@ -7,7 +7,7 @@ #ifndef TEST_CORRELATION_FACTOR #define TEST_CORRELATION_FACTOR -#include +#include struct test_correlation_factor{ diff --git a/src/apps/chem/test_dft.cc b/src/madness/chem/test_dft.cc similarity index 99% rename from src/apps/chem/test_dft.cc rename to src/madness/chem/test_dft.cc index ec039dc02b4..d65485126f9 100644 --- a/src/apps/chem/test_dft.cc +++ b/src/madness/chem/test_dft.cc @@ -31,7 +31,7 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include -#include +#include using namespace madness; diff --git a/src/apps/chem/test_exchangeoperator.cc b/src/madness/chem/test_exchangeoperator.cc similarity index 97% rename from src/apps/chem/test_exchangeoperator.cc rename to src/madness/chem/test_exchangeoperator.cc index 5bafcacedbd..ef456c4d44d 100644 --- a/src/apps/chem/test_exchangeoperator.cc +++ b/src/madness/chem/test_exchangeoperator.cc @@ -6,10 +6,10 @@ */ #include -#include -#include -#include -#include +#include +#include +#include +#include #include using namespace madness; diff --git a/src/apps/chem/test_localizer.cc b/src/madness/chem/test_localizer.cc similarity index 97% rename from src/apps/chem/test_localizer.cc rename to src/madness/chem/test_localizer.cc index b5fdf6e6e8a..7dbe0bd9255 100644 --- a/src/apps/chem/test_localizer.cc +++ b/src/madness/chem/test_localizer.cc @@ -6,14 +6,14 @@ #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include -#include -#include +#include +#include #include #include #include diff --git a/src/apps/chem/test_masks_and_boxes.cc b/src/madness/chem/test_masks_and_boxes.cc similarity index 98% rename from src/apps/chem/test_masks_and_boxes.cc rename to src/madness/chem/test_masks_and_boxes.cc index 78cbc6f129d..fd5c772fd7e 100644 --- a/src/apps/chem/test_masks_and_boxes.cc +++ b/src/madness/chem/test_masks_and_boxes.cc @@ -6,7 +6,7 @@ */ -#include +#include #include using namespace madness; diff --git a/src/apps/chem/test_pointgroupsymmetry.cc b/src/madness/chem/test_pointgroupsymmetry.cc similarity index 99% rename from src/apps/chem/test_pointgroupsymmetry.cc rename to src/madness/chem/test_pointgroupsymmetry.cc index a2bf539ea88..debb86fd6d1 100644 --- a/src/apps/chem/test_pointgroupsymmetry.cc +++ b/src/madness/chem/test_pointgroupsymmetry.cc @@ -31,8 +31,8 @@ #include #include -#include -#include +#include +#include using namespace madness; diff --git a/src/apps/chem/test_qc.cc b/src/madness/chem/test_qc.cc similarity index 99% rename from src/apps/chem/test_qc.cc rename to src/madness/chem/test_qc.cc index 8bcbb8138ad..685e414dfa2 100644 --- a/src/apps/chem/test_qc.cc +++ b/src/madness/chem/test_qc.cc @@ -7,8 +7,8 @@ #include -#include -#include +#include +#include using namespace madness; diff --git a/src/apps/chem/testlda.cc b/src/madness/chem/testlda.cc similarity index 100% rename from src/apps/chem/testlda.cc rename to src/madness/chem/testlda.cc diff --git a/src/apps/chem/testxc.cc b/src/madness/chem/testxc.cc similarity index 100% rename from src/apps/chem/testxc.cc rename to src/madness/chem/testxc.cc diff --git a/src/apps/chem/vibanal.cc b/src/madness/chem/vibanal.cc similarity index 99% rename from src/apps/chem/vibanal.cc rename to src/madness/chem/vibanal.cc index ac06e867e60..6b49e386a38 100644 --- a/src/apps/chem/vibanal.cc +++ b/src/madness/chem/vibanal.cc @@ -1,4 +1,4 @@ -#include +#include #include using namespace madness; diff --git a/src/apps/chem/vibanal.h b/src/madness/chem/vibanal.h similarity index 95% rename from src/apps/chem/vibanal.h rename to src/madness/chem/vibanal.h index b18cb039058..a0667908408 100644 --- a/src/apps/chem/vibanal.h +++ b/src/madness/chem/vibanal.h @@ -2,7 +2,7 @@ #define MADNESS_VIBANAL_INCLUDED #include -#include +#include madness::Tensor compute_frequencies(const madness::Molecule& molecule, const madness::Tensor& hessian, madness::Tensor& normalmodes, diff --git a/src/apps/chem/write_test_input.h b/src/madness/chem/write_test_input.h similarity index 97% rename from src/apps/chem/write_test_input.h rename to src/madness/chem/write_test_input.h index d0b86e8176b..7f392733b39 100644 --- a/src/apps/chem/write_test_input.h +++ b/src/madness/chem/write_test_input.h @@ -5,7 +5,7 @@ #ifndef MADNESS_WRITE_TEST_INPUT_H #define MADNESS_WRITE_TEST_INPUT_H -#include +#include namespace madness { diff --git a/src/apps/chem/xcfunctional.h b/src/madness/chem/xcfunctional.h similarity index 100% rename from src/apps/chem/xcfunctional.h rename to src/madness/chem/xcfunctional.h diff --git a/src/apps/chem/xcfunctional_ldaonly.cc b/src/madness/chem/xcfunctional_ldaonly.cc similarity index 99% rename from src/apps/chem/xcfunctional_ldaonly.cc rename to src/madness/chem/xcfunctional_ldaonly.cc index 948c2553441..fe1f1ec2cb3 100644 --- a/src/apps/chem/xcfunctional_ldaonly.cc +++ b/src/madness/chem/xcfunctional_ldaonly.cc @@ -2,7 +2,7 @@ #ifndef MADNESS_HAS_LIBXC -#include +#include #include #include #include diff --git a/src/apps/chem/xcfunctional_libxc.cc b/src/madness/chem/xcfunctional_libxc.cc similarity index 99% rename from src/apps/chem/xcfunctional_libxc.cc rename to src/madness/chem/xcfunctional_libxc.cc index cefe08181a3..75d50199c23 100644 --- a/src/apps/chem/xcfunctional_libxc.cc +++ b/src/madness/chem/xcfunctional_libxc.cc @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/src/apps/chem/zcis.cc b/src/madness/chem/zcis.cc similarity index 99% rename from src/apps/chem/zcis.cc rename to src/madness/chem/zcis.cc index 63e8d72b532..332a0cf6e6f 100644 --- a/src/apps/chem/zcis.cc +++ b/src/madness/chem/zcis.cc @@ -5,8 +5,8 @@ * Author: fbischoff */ -#include -#include +#include +#include #include "zcis.h" namespace madness { diff --git a/src/apps/chem/zcis.h b/src/madness/chem/zcis.h similarity index 99% rename from src/apps/chem/zcis.h rename to src/madness/chem/zcis.h index f9a5838708a..3771cf8a2fa 100644 --- a/src/apps/chem/zcis.h +++ b/src/madness/chem/zcis.h @@ -8,10 +8,10 @@ #ifndef SRC_APPS_CHEM_ZCIS_H_ #define SRC_APPS_CHEM_ZCIS_H_ -#include +#include #include #include -#include +#include namespace madness { diff --git a/src/apps/chem/znemo.cc b/src/madness/chem/znemo.cc similarity index 99% rename from src/apps/chem/znemo.cc rename to src/madness/chem/znemo.cc index 4beb9b83106..15a8462242e 100644 --- a/src/apps/chem/znemo.cc +++ b/src/madness/chem/znemo.cc @@ -7,10 +7,10 @@ #include #include "znemo.h" -#include +#include #include -#include -#include +#include +#include diff --git a/src/apps/chem/znemo.h b/src/madness/chem/znemo.h similarity index 98% rename from src/apps/chem/znemo.h rename to src/madness/chem/znemo.h index 00a5086b0f9..879f154a728 100644 --- a/src/apps/chem/znemo.h +++ b/src/madness/chem/znemo.h @@ -11,17 +11,17 @@ #include #include -#include +#include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include -#include -#include +#include +#include #include From 9a2069f343496d933c7e8986ebe7b3be3ca900bc Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 12 Aug 2022 16:21:48 -0400 Subject: [PATCH 0208/1312] some cleanup --- config/MakeGlobal.am | 64 -- config/acx_check_compiler_flags.m4 | 22 - config/acx_check_tls.m4 | 63 -- config/acx_crayxe.m4 | 48 -- config/acx_crayxt.m4 | 48 -- config/acx_cxx_restrict.m4 | 36 -- config/acx_detect_cxx.m4 | 49 -- config/acx_enable_debugging.m4 | 36 -- config/acx_enable_gentensor.m4 | 34 - config/acx_enable_optimal.m4 | 121 ---- config/acx_enable_optimization.m4 | 73 --- config/acx_enable_task_profiler.m4 | 60 -- config/acx_enable_warn.m4 | 66 -- config/acx_fortran_symbols.m4 | 125 ---- config/acx_gnu_hashmap.m4 | 34 - config/acx_ibmbgp.m4 | 40 -- config/acx_ibmbgq.m4 | 34 - config/acx_mac.m4 | 19 - config/acx_mpi.m4 | 26 - config/acx_posix_memalign.m4 | 43 -- config/acx_std_abs.m4 | 27 - config/acx_unqal_stat_decl.m4 | 14 - config/acx_with_elemental.m4 | 37 -- config/acx_with_google_perf.m4 | 45 -- config/acx_with_google_test.m4 | 41 -- config/acx_with_libunwind.m4 | 30 - config/acx_with_libxc.m4 | 42 -- config/acx_with_mkl.m4 | 75 --- config/acx_with_pcm.m4 | 42 -- config/acx_with_stubmpi.m4 | 31 - config/acx_with_tbb.m4 | 128 ---- config/am_prog_ar.m4 | 1 - config/ax_cxx_compile_stdcxx.m4 | 982 ----------------------------- config/copyright_header | 32 - config/insert_headers | 20 - input | 22 - 36 files changed, 2610 deletions(-) delete mode 100644 config/MakeGlobal.am delete mode 100644 config/acx_check_compiler_flags.m4 delete mode 100644 config/acx_check_tls.m4 delete mode 100644 config/acx_crayxe.m4 delete mode 100644 config/acx_crayxt.m4 delete mode 100644 config/acx_cxx_restrict.m4 delete mode 100644 config/acx_detect_cxx.m4 delete mode 100644 config/acx_enable_debugging.m4 delete mode 100644 config/acx_enable_gentensor.m4 delete mode 100644 config/acx_enable_optimal.m4 delete mode 100644 config/acx_enable_optimization.m4 delete mode 100644 config/acx_enable_task_profiler.m4 delete mode 100644 config/acx_enable_warn.m4 delete mode 100644 config/acx_fortran_symbols.m4 delete mode 100644 config/acx_gnu_hashmap.m4 delete mode 100644 config/acx_ibmbgp.m4 delete mode 100644 config/acx_ibmbgq.m4 delete mode 100644 config/acx_mac.m4 delete mode 100644 config/acx_mpi.m4 delete mode 100644 config/acx_posix_memalign.m4 delete mode 100644 config/acx_std_abs.m4 delete mode 100644 config/acx_unqal_stat_decl.m4 delete mode 100644 config/acx_with_elemental.m4 delete mode 100644 config/acx_with_google_perf.m4 delete mode 100644 config/acx_with_google_test.m4 delete mode 100644 config/acx_with_libunwind.m4 delete mode 100644 config/acx_with_libxc.m4 delete mode 100644 config/acx_with_mkl.m4 delete mode 100644 config/acx_with_pcm.m4 delete mode 100644 config/acx_with_stubmpi.m4 delete mode 100644 config/acx_with_tbb.m4 delete mode 100644 config/am_prog_ar.m4 delete mode 100644 config/ax_cxx_compile_stdcxx.m4 delete mode 100644 config/copyright_header delete mode 100755 config/insert_headers delete mode 100644 input diff --git a/config/MakeGlobal.am b/config/MakeGlobal.am deleted file mode 100644 index 8ce113a2c70..00000000000 --- a/config/MakeGlobal.am +++ /dev/null @@ -1,64 +0,0 @@ -# Define paths for includes (note convention #include ) -AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/src/apps - -if LINK_ALL_STATIC -AM_LDFLAGS = -all-static -endif - -# Define directories holding libraries and variables for corresponding libraries -LIBGTESTDIR=$(top_builddir)/src/madness/external/gtest -LIBWORLDDIR=$(top_builddir)/src/madness/world -LIBTENSORDIR=$(top_builddir)/src/madness/tensor -LIBMISCDIR=$(top_builddir)/src/madness/misc -LIBMRADIR=$(top_builddir)/src/madness/mra -LIBCHEMDIR=$(top_builddir)/src/apps/chem -LIBTINYXMLDIR=$(top_builddir)/src/madness/external/tinyxml -LIBMUPARSERDIR=$(top_builddir)/src/madness/external/muParser - -LIBGTEST=$(LIBGTESTDIR)/libMADgtest.la -LIBWORLD=$(LIBWORLDDIR)/libMADworld.la -LIBTENSOR=$(LIBTENSORDIR)/libMADtensor.la -LIBLINALG=$(LIBTENSORDIR)/libMADlinalg.la -LIBMISC=$(LIBMISCDIR)/libMADmisc.la -LIBMRA=$(LIBMRADIR)/libMADmra.la -LIBCHEM=$(LIBCHEMDIR)/libMADchem.la -LIBTINYXML=$(LIBTINYXMLDIR)/libMADtinyxml.la -LIBMUPARSER=$(LIBMUPARSERDIR)/libMADmuparser.la - -# Most scientific/numeric applications will link against these libraries -MRALIBS=$(LIBMRA) $(LIBLINALG) $(LIBTENSOR) $(LIBMISC) $(LIBMUPARSER) $(LIBTINYXML) $(LIBWORLD) - -LIBGTEST_CPPFLAGS = $(GTEST_CPPFLAGS) -DGTEST_HAS_PTHREAD=1 -isystem $(top_srcdir)/src/madness/external/gtest/include $(AM_CPPFLAGS) -LIBGTEST_CXXFLAGS = $(GTEST_CXXFLAGS) $(AM_CXXFLAGS) -LIBGTEST_LIBS = $(GTEST_LDFLAGS) $(GTEST_LIBS) - -# External library targets -$(LIBGTEST): - $(MAKE) -C $(LIBGTESTDIR) libMADgtest.la - -$(LIBTINYXML): - $(MAKE) -C $(LIBTINYXMLDIR) libMADtinyxml.la - -$(LIBMUPARSER): - $(MAKE) -C $(LIBMUPARSERDIR) libMADmuparser.la - -# MADNESS library targets -$(LIBWORLD): - $(MAKE) -C $(LIBWORLDDIR) libMADworld.la - -$(LIBMISC): $(LIBWORLD) - $(MAKE) -C $(LIBMISCDIR) libMADmisc.la - -$(LIBTENSOR): $(LIBMISC) - $(MAKE) -C $(LIBTENSORDIR) libMADtensor.la - -$(LIBLINALG): $(LIBTENSOR) - $(MAKE) -C $(LIBTENSORDIR) libMADlinalg.la - - -$(LIBMRA): $(LIBLINALG) - $(MAKE) -C $(LIBMRADIR) libMADmra.la - -$(LIBCHEM): $(LIBMRA) - $(MAKE) -C $(LIBCHEMDIR) libMADchem.la - diff --git a/config/acx_check_compiler_flags.m4 b/config/acx_check_compiler_flags.m4 deleted file mode 100644 index 3ca11291480..00000000000 --- a/config/acx_check_compiler_flags.m4 +++ /dev/null @@ -1,22 +0,0 @@ -#ACX_CHECK_COMPILER_FLAGS(compiler, flag_var, flag, success, fail) -AC_DEFUN([ACX_CHECK_COMPILER_FLAG], [ - AC_LANG_SAVE - - AC_LANG([$1]) - acx_check_compiler_flags="no" - acx_check_compiler_flags_save=$[$2] - [$2]="$3" - AC_MSG_CHECKING([whether $1 compiler accepts $3]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])], - [ - acx_check_compiler_flags="yes" - AC_MSG_RESULT([yes]) - ], [ - AC_MSG_RESULT([no]) - ]) - - [$2]=$acx_check_compiler_flags_save - AC_LANG_RESTORE - - AS_IF([test $acx_check_compiler_flags != no], [$4], [$5]) -]) \ No newline at end of file diff --git a/config/acx_check_tls.m4 b/config/acx_check_tls.m4 deleted file mode 100644 index a2c8d431db8..00000000000 --- a/config/acx_check_tls.m4 +++ /dev/null @@ -1,63 +0,0 @@ -AC_DEFUN([ACX_CHECK_TLS],[ - # Check for thread local storage support. - # thread_local, __thread_local, __declspec(thread) - - AC_LANG_PUSH([C++]) - - # Check for shared_ptr in std namespace - AC_MSG_CHECKING([for C++ thread_local keyword]) - acx_check_tls=no - - # Check for the key word thread_local (C++11) - AC_COMPILE_IFELSE( - [ - AC_LANG_PROGRAM( - [[thread_local int i = 0;]], - [[i = 1;]] - ) - ], - [acx_check_tls="thread_local"] - ) - - # Check for the key word __thread - if test "$acx_check_tls" = no; then - AC_COMPILE_IFELSE( - [ - AC_LANG_PROGRAM( - [[__thread int i = 0;]], - [[i = 1;]] - ) - ], - [ - acx_check_tls="__thread" - AC_DEFINE([thread_local],[__thread],[Define the thread_local key word.]) - ] - ) - fi - - # Check for the key word __declspec(thread) -# if test "$acx_check_tls" = no; then -# AC_COMPILE_IFELSE( -# [ -# AC_LANG_PROGRAM( -# [[__declspec(thread) int i = 0;]], -# [[i = 1;]] -# ) -# ], -# [ -# acx_check_tls="__declspec(thread)" -# AC_DEFINE([thread_local],[__declspec(thread)],[Define the thread_local key word.]) -# ] -# ) -# fi - - if test "$acx_check_tls" = no; then - AC_MSG_ERROR([Unable to detect mandatory support for thread-local storage]) - fi - - - AC_MSG_RESULT([$acx_check_tls]) - - AC_LANG_POP -]) - diff --git a/config/acx_crayxe.m4 b/config/acx_crayxe.m4 deleted file mode 100644 index 56aa51fa22c..00000000000 --- a/config/acx_crayxe.m4 +++ /dev/null @@ -1,48 +0,0 @@ -AC_DEFUN([ACX_CRAYXE], [ - # If on a Cray XE - # - defines HAVE_CRAYXE=1 in headers - # - defines HAVE_CRAYXE=yes in the script - # - sets MPICXX=CC and MPICC=cc if the user has not already set them - # - sets thread binding to "1 0 2" TODO: this has to be wrong on AMD Magny Cours - # - enables spinlocks - echo "int main()" > __crayxe.cc - echo "{" >> __crayxe.cc - echo "#ifdef __CRAYXE" >> __crayxe.cc - echo "return 0;" >> __crayxe.cc - echo "#else" >> __crayxe.cc - echo "choke me" >> __crayxe.cc - echo "#endif" >> __crayxe.cc - echo "}" >> __crayxe.cc - CC __crayxe.cc >& /dev/null - if test $? = 0; then - AC_MSG_NOTICE([Cray XE detected]) - HAVE_CRAYXE=yes - AC_DEFINE(HAVE_CRAYXE,[1],[Defined if we are running on an Cray XE]) - fi - /bin/rm __crayxe.cc - if test "x$HAVE_CRAYXE" = xyes; then - AC_DEFINE(AMD_QUADCORE_TUNE,[1],[Target for tuning mtxmq kernels]) - if test "x$MPICC" = x; then - AC_MSG_NOTICE([Choosing MPICC=cc for Cray XE]) - MPICC=cc; - fi - if test "x$MPICXX" = x; then - AC_MSG_NOTICE([Choosing MPICXX=CC for Cray XE]) - MPICXX=CC; - fi - echo "int main(){return 0;}" > __acml.cc - CC __acml.cc -lacml >& /dev/null - if test $? = 0; then - AC_MSG_NOTICE([AMD ACML library detected]) - LIBS="$LIBS -lacml" - AC_DEFINE(HAVE_ACML,[1],[Define if AMD math library available - ACML]) - fi - /bin/rm __acml.cc - BIND="1 0 2" - AC_DEFINE(USE_SPINLOCKS, [1], [Define if should use spinlocks]) - fi -]) - - - - diff --git a/config/acx_crayxt.m4 b/config/acx_crayxt.m4 deleted file mode 100644 index fef104529b2..00000000000 --- a/config/acx_crayxt.m4 +++ /dev/null @@ -1,48 +0,0 @@ -AC_DEFUN([ACX_CRAYXT], [ - # If on a Cray XT - # - defines HAVE_CRAYXT=1 in headers - # - defines HAVE_CRAYXT=yes in the script - # - sets MPICXX=CC and MPICC=cc if the user has not already set them - # - sets thread binding to "1 0 2" - # - enables spinlocks - echo "int main()" > __crayxt.cc - echo "{" >> __crayxt.cc - echo "#ifdef __CRAYXT" >> __crayxt.cc - echo "return 0;" >> __crayxt.cc - echo "#else" >> __crayxt.cc - echo "choke me" >> __crayxt.cc - echo "#endif" >> __crayxt.cc - echo "}" >> __crayxt.cc - CC __crayxt.cc >& /dev/null - if test $? = 0; then - AC_MSG_NOTICE([Cray XT detected]) - HAVE_CRAYXT=yes - AC_DEFINE(HAVE_CRAYXT,[1],[Defined if we are running on an Cray XT]) - fi - /bin/rm __crayxt.cc - if test "x$HAVE_CRAYXT" = xyes; then - AC_DEFINE(AMD_QUADCORE_TUNE,[1],[Target for tuning mtxmq kernels]) - if test "x$MPICC" = x; then - AC_MSG_NOTICE([Choosing MPICC=cc for Cray XT]) - MPICC=cc; - fi - if test "x$MPICXX" = x; then - AC_MSG_NOTICE([Choosing MPICXX=CC for Cray XT]) - MPICXX=CC; - fi - echo "int main(){return 0;}" > __acml.cc - CC __acml.cc -lacml >& /dev/null - if test $? = 0; then - AC_MSG_NOTICE([AMD ACML library detected]) - LIBS="$LIBS -lacml" - AC_DEFINE(HAVE_ACML,[1],[Define if AMD math library available - ACML]) - fi - /bin/rm __acml.cc - BIND="1 0 2" - AC_DEFINE(USE_SPINLOCKS, [1], [Define if should use spinlocks]) - fi -]) - - - - diff --git a/config/acx_cxx_restrict.m4 b/config/acx_cxx_restrict.m4 deleted file mode 100644 index 70cf79705ae..00000000000 --- a/config/acx_cxx_restrict.m4 +++ /dev/null @@ -1,36 +0,0 @@ -dnl @synopsis ACX_CXX_RESTRICT -dnl -dnl This macro determines whether the C++ compiler supports the -dnl "restrict" keyword introduced in C99, or an equivalent. Does -dnl nothing if the compiler accepts the keyword. Otherwise, if the -dnl compiler supports an equivalent (like GCC's __restrict__) defines -dnl "restrict" to be that. Otherwise, defines "restrict" to be empty. -dnl -dnl @category Obsolete -dnl @author Steven G. Johnson -dnl @version 2005-05-31 -dnl @license GPLWithACException - -AC_DEFUN([ACX_CXX_RESTRICT], -[AC_CACHE_CHECK([for C++ restrict keyword], acx_cv_cxx_restrict, -[acx_cv_cxx_restrict=unsupported - AC_LANG_SAVE - AC_LANG_PUSH([C++]) - # Try the official restrict keyword, then gcc's __restrict__, then - # SGI's __restrict. __restrict has slightly different semantics than - # restrict (it's a bit stronger, in that __restrict pointers can't - # overlap even with non __restrict pointers), but I think it should be - # okay under the circumstances where restrict is normally used. - for acx_kw in restrict __restrict__ __restrict; do - AC_TRY_COMPILE([], [float * $acx_kw x;], [acx_cv_cxx_restrict=$acx_kw; break]) - done - AC_LANG_RESTORE -]) - if test "$acx_cv_cxx_restrict" != "restrict"; then - acx_kw="$acx_cv_cxx_restrict" - if test "$acx_kw" = unsupported; then acx_kw=""; fi - AC_DEFINE_UNQUOTED(MADNESS_RESTRICT, $acx_kw, [Define to equivalent of C99 restrict keyword, or to nothing if this is not supported. Do not define if restrict is supported directly.]) - fi - AC_MSG_RESULT([$acx_cv_cxx_restrict]) - AC_LANG_POP -]) diff --git a/config/acx_detect_cxx.m4 b/config/acx_detect_cxx.m4 deleted file mode 100644 index 93c838d35be..00000000000 --- a/config/acx_detect_cxx.m4 +++ /dev/null @@ -1,49 +0,0 @@ -AC_DEFUN([ACX_DETECT_CXX], [ - # Sets environment variable CXXVENDOR to one of - # [GNU,Intel,Portland,Pathscale,IBM,unknown] - AC_CACHE_CHECK([compiler vendor], [acx_cv_detect_cxx], [ - acx_cv_detect_cxx=unknown - if test $acx_cv_detect_cxx = unknown; then - $CXX --version 2>&1 | egrep -q "clang" - if test $? = 0; then - acx_cv_detect_cxx=clang - fi - fi - if test $acx_cv_detect_cxx = unknown; then - $CXX --version 2>&1 | egrep -q "GCC|GNU|gcc|gnu|g\+\+|Free S" - if test $? = 0; then - acx_cv_detect_cxx=GNU - fi - fi - if test $acx_cv_detect_cxx = unknown; then - $CXX --version 2>&1 | grep -q "Intel" - if test $? = 0; then - acx_cv_detect_cxx=Intel - fi - fi - if test $acx_cv_detect_cxx = unknown; then - $CXX --version 2>&1 | grep -q "Portland" - if test $? = 0; then - acx_cv_detect_cxx=Portland - fi - fi - if test $acx_cv_detect_cxx = unknown; then - $CXX -v 2>&1 | grep -q "Pathscale" - if test $? = 0; then - acx_cv_detect_cxx=Pathscale - fi - fi - if test $acx_cv_detect_cxx = unknown; then - $CXX -qversion 2>&1 | grep -q "IBM" - if test $? = 0; then - acx_cv_detect_cxx=IBM - fi - fi - ]) - - CXXVENDOR="$acx_cv_detect_cxx" -]) - - - - diff --git a/config/acx_enable_debugging.m4 b/config/acx_enable_debugging.m4 deleted file mode 100644 index 55c81628daf..00000000000 --- a/config/acx_enable_debugging.m4 +++ /dev/null @@ -1,36 +0,0 @@ -# This function is used to add debug flags (e.g. -g) to CFLAGS and CXXFLAGS -# environment variables. Users are expected to specify their own debug flags for -# special use cases by adding appropriate values to CFLAGS and CXXFLAGS. -AC_DEFUN([ACX_ENABLE_DEBUGGING], [ - acx_enable_debugging="no" - acx_enable_debugging_flags="" - - # Allow the user to enable or disable debugging flag - AC_ARG_ENABLE([debugging], - [AC_HELP_STRING([--enable-debugging@<:@=yes|no|LEVEL@:>@], - [Enable debugging C and C++ compilers. You can also specify debug level (e.g. 3). @<:@default=no@:>@]) ], - [ - case $enableval in - yes) - acx_enable_debugging="yes" - acx_enable_debugging_flags="-g" - ;; - no) - ;; - *) - acx_enable_debugging="yes" - acx_enable_debugging_flags="-g$enableval" - ;; - esac - ]) - - # Test the flags and add them to flag variables if successful. - if test $acx_enable_debugging != no; then - ACX_CHECK_COMPILER_FLAG([C], [CFLAGS], [$acx_enable_debugging_flags], - [CFLAGS="$CFLAGS $acx_enable_debugging_flags"], - [AC_MSG_WARN([$CC does not accept $acx_enable_debugging_flags, no debugging flags will be used.])]) - ACX_CHECK_COMPILER_FLAG([C++], [CXXFLAGS], [$acx_enable_debugging_flags], - [CXXFLAGS="$CXXFLAGS $acx_enable_debugging_flags"], - [AC_MSG_WARN([$CXX does not accept $acx_enable_debugging_flags, no debugging flags will be used.])]) - fi -]) \ No newline at end of file diff --git a/config/acx_enable_gentensor.m4 b/config/acx_enable_gentensor.m4 deleted file mode 100644 index dafe4827ca7..00000000000 --- a/config/acx_enable_gentensor.m4 +++ /dev/null @@ -1,34 +0,0 @@ -# This function is used to add the gentensor flags and CXXFLAGS. These flags are -# necessary for the correlated quantum chemistry (e.g. mp2), but gentensor -# can't handle complex tensors. In this case disable gentensor (default behavior) -AC_DEFUN([ACX_ENABLE_GENTENSOR], [ - acx_enable_gentensor="no" - acx_enable_gentensor_flags="" - - # Allow the user to enable or disable gentensor flag - AC_ARG_ENABLE([gentensor], - [AC_HELP_STRING([--enable-gentensor@<:@=yes|no], - [Enable gentensor C and C++ compilers.]) ], - [ - case $enableval in - yes) - acx_enable_gentensor="yes" - acx_enable_gentensor_flags="-DUSE_GENTENSOR" - ;; - no) - ;; - *) - ;; - esac - ]) - - # Test the flags and add them to flag variables if successful. - if test $acx_enable_gentensor != no; then - ACX_CHECK_COMPILER_FLAG([C], [CFLAGS], [$acx_enable_gentensor_flags], - [CFLAGS="$CFLAGS $acx_enable_gentensor_flags"], - [AC_MSG_WARN([$CC does not accept $acx_enable_gentensor_flags, no gentensor flags will be used.])]) - ACX_CHECK_COMPILER_FLAG([C++], [CXXFLAGS], [$acx_enable_gentensor_flags], - [CXXFLAGS="$CXXFLAGS $acx_enable_gentensor_flags"], - [AC_MSG_WARN([$CXX does not accept $acx_enable_gentensor_flags, no gentensor flags will be used.])]) - fi -]) diff --git a/config/acx_enable_optimal.m4 b/config/acx_enable_optimal.m4 deleted file mode 100644 index a91aa9d286e..00000000000 --- a/config/acx_enable_optimal.m4 +++ /dev/null @@ -1,121 +0,0 @@ -# This function is used to add performace or system specific compiler flags to -# to CFLAGS and CXXFLAGS environment variables. Users are expected to specify -# their own optimization flags for unknown compilers, unknown systems, or -# special use cases by adding appropriate values to CFLAGS and CXXFLAGS. It -# should not be used for warning (e.g. -Wall), optimization (e.g. -O3), or debug -# (e.g. -g) flags. Those handled in acx_enable_warn.m4, acx_enable_optimization.m4, -# and acx_enable_debugging.m4 respectively. -AC_DEFUN([ACX_ENABLE_OPTIMAL], [ - acx_enable_optimal="" - acx_enable_optimal_save_cxxflags="$CXXFLAGS" - acx_enable_optimal_flags="" - acx_enable_optimal_compiler="$CXXVENDOR" - - # Allow the user to enable or disable optimal flag - AC_ARG_ENABLE([optimal], - [AC_HELP_STRING([--enable-optimal@<:@=yes|no|GNU|clang|Pathscale|Portland|Intel|IBM@:>@], - [Auto detect optimal CXXFLAGS for compiler and known systems.@<:@default=yes@:>@])], - [ - case $enableval in - yes) - acx_enable_optimal="yes" - ;; - no) - acx_enable_optimal="no" - ;; - *) - acx_enable_optimal="yes" - acx_enable_optimal_compiler="$enableval" - esac - ], - [acx_enable_optimal="yes"] - ) - - # Set the flags for the specific compilers and systems - if test $acx_enable_optimal != "no"; then - AC_LANG_SAVE - AC_LANG([C++]) - case $acx_enable_optimal_compiler in - GNU) - # Delete trailing -stuff from X.X.X-stuff then parse - CXXVERSION=[`$CXX -dumpversion | sed -e 's/-.*//'`] - CXXMAJOR=[`echo $CXXVERSION | sed -e 's/\.[.0-9a-zA-Z\-_]*//'`] - CXXMINOR=[`echo $CXXVERSION | sed -e 's/[0-9]*\.//' -e 's/\.[0-9]*//'`] - CXXMICRO=[`echo $CXXVERSION | sed -e 's/[0-9]*\.[0-9]*\.//'`] - AC_MSG_NOTICE([Setting compiler flags for GNU C++ major=$CXXMAJOR minor=$CXXMINOR micro=$CXXMICRO]) - - # Flags for all GCC variants - acx_enable_optimal_flags="$acx_enable_optimal_flags -ffast-math" - if test $enable_cpp0x = "yes"; then - acx_enable_optimal_flags="$acx_enable_optimal_flags -std=c++0x" - fi - - # Add GCC system specific flags - if test "x$HAVE_CRAYXT" = xyes; then - ACX_CHECK_COMPILER_FLAG([C++], [CXXFLAGS], [-march=barcelona], - [acx_enable_optimal_flags="$acx_enable_optimal_flags -march=barcelona"]) - elif test "x$HAVE_IBMBGP" = xyes; then - acx_enable_optimal_flags="" - else - ACX_CHECK_COMPILER_FLAG([C++], [CXXFLAGS], [-march=native], - [acx_enable_optimal_flags="$acx_enable_optimal_flags -march=native"]) - fi - - # Add flags for Intel x86 architectures. - case $host_cpu in - ??86*) - acx_enable_optimal_flags="$acx_enable_optimal_flags -mfpmath=sse -msse -mpc64" - ;; - esac - ;; - - clang) - acx_enable_optimal_flags="$acx_enable_optimal_flags" - ;; - - Pathscale) - acx_enable_optimal_flags="$acx_enable_optimal_flags" - if test "x$HAVE_CRAYXT" = xyes; then - ACX_CHECK_COMPILER_FLAG([C++], [CXXFLAGS], [-march=barcelona], - [acx_enable_optimal_flags="$acx_enable_optimal_flags -march=barcelona"]) - fi - ;; - - Portland) - acx_enable_optimal_flags="$acx_enable_optimal_flags -fastsse -Mflushz -Mcache_align" - AC_MSG_NOTICE([Appending -pgf90libs to LIBS so can link against Fortran BLAS/linalg]) - LIBS="$LIBS -pgf90libs" - if test "x$HAVE_CRAYXT" = xyes; then - ACX_CHECK_COMPILER_FLAG([C++], [CXXFLAGS], [-tp barcelona-64], - [acx_enable_optimal_flags="$acx_enable_optimal_flags -tp barcelona-64"]) - fi - ;; - - Intel) - acx_enable_optimal_flags="$acx_enable_optimal_flags -ip -no-prec-div -mkl=sequential -xHOST" - if test $enable_cpp0x = "yes"; then - acx_enable_optimal_flags="$acx_enable_optimal_flags -std=c++0x" - fi -#-use-intel-optimized-headers -fp-model fast=2 -inline-level=2 - ;; - - IBM) - acx_enable_optimal_flags="$acx_enable_optimal_flags" - if test "x$HAVE_IBMBGP" = xyes; then - ACX_CHECK_COMPILER_FLAG([C++], [CXXFLAGS], [ -qtune=450 -qarch=450d -qlanglvl=extended], - [acx_enable_optimal_flags="$acx_enable_optimal_flags -qtune=450 -qarch=450d -qlanglvl=extended "]) - fi - ;; - - *) - AC_MSG_WARN([Optimal flags not set for $acx_enable_optimal_compile compiler]) - ;; - esac - - # Test the flags and add them to flag variables if successful. - ACX_CHECK_COMPILER_FLAG([C++], [CXXFLAGS], [$acx_enable_optimal_flags], - [CXXFLAGS="$CXXFLAGS $acx_enable_optimal_flags"], - [AC_MSG_WARN([$CXX does not accept $acx_enable_optimal_flags, no optimal flags will be used.])]) - fi - -]) diff --git a/config/acx_enable_optimization.m4 b/config/acx_enable_optimization.m4 deleted file mode 100644 index 49c8ea38b8a..00000000000 --- a/config/acx_enable_optimization.m4 +++ /dev/null @@ -1,73 +0,0 @@ -# This function is used to add compiler specific optimization flags (e.g. -O3) -# to CFLAGS and CXXFLAGS environment variables. Users are expected to specify -# their own optimization flags for unknown compilers or special use cases by -# adding appropriate values to CFLAGS and CXXFLAGS. -AC_DEFUN([ACX_ENABLE_OPTIMIZATION], [ - # Specify the default optimization level for a given compiler. This value is - # appended to "-O" in the flag variables. - default_optimization="" - case $CXXVENDOR in - GNU) - default_optimization="3" - ;; - clang) - default_optimization="3" - ;; - Pathscale) - default_optimization="fast" - ;; - Portland) - default_optimization="3" - ;; - Intel) - default_optimization="3" - ;; - IBM) - default_optimization="3" - ;; - *) - default_optimization="2" - ;; - esac - - acx_enable_optimization="yes" - acx_enable_optimization_flags="" - - # Allow the user to enable or disable optimization flag - AC_ARG_ENABLE([optimization], - [AC_HELP_STRING([--enable-optimization@<:@=yes|no|OPTION@:>@], - [Enable optimization for C and C++ (e.g. -O2) @<:@default=yes@:>@]) ], - [ - case $enableval in - yes) - acx_enable_optimization_flags="-O$default_optimization" - ;; - no) - acx_enable_optimization="no" - ;; - *) - acx_enable_optimization_flags="-O$enableval" - ;; - esac - ], - [ - if test "x$acx_enable_debugging" == xno; then - acx_enable_optimization_flags="-O$default_optimization" - else - acx_enable_optimization_flags="-O0" - AC_MSG_WARN([Optimizations is disabled, because debugging is enabled. Add --enable-optimization to overide this behavior.]) - fi - ] - ) - - # Test the flags and add them to flag variables if successful. - if test $acx_enable_optimization != no; then - ACX_CHECK_COMPILER_FLAG([C], [CFLAGS], [$acx_enable_optimization_flags], - [CFLAGS="$CFLAGS $acx_enable_optimization_flags"], - [AC_MSG_WARN([$CC does not accept $acx_enable_optimization_flags, no optimization flags will be used.])]) - ACX_CHECK_COMPILER_FLAG([C++], [CXXFLAGS], [$acx_enable_optimization_flags], - [CXXFLAGS="$CXXFLAGS $acx_enable_optimization_flags"], - [AC_MSG_WARN([$CXX does not accept $acx_enable_optimization_flags, no optimization flags will be used.])]) - fi - -]) \ No newline at end of file diff --git a/config/acx_enable_task_profiler.m4 b/config/acx_enable_task_profiler.m4 deleted file mode 100644 index 3745e57c9c7..00000000000 --- a/config/acx_enable_task_profiler.m4 +++ /dev/null @@ -1,60 +0,0 @@ -AC_DEFUN([ACX_ENABLE_TASK_PROFILER], [ - AC_LANG_SAVE - AC_LANG([C++]) - - acx_enable_task_profiler="" - - # Allow the user to enable or disable warnings - AC_ARG_ENABLE([task-profiler], - [AC_HELP_STRING([--enable-task-profiler], - [Enable task profiler that collects per-task start and stop times.])], - [ - case $enableval in - yes) - acx_enable_task_profiler="yes" - ;; - no) - acx_enable_task_profiler="no" - ;; - *) - acx_enable_task_profiler="yes" - esac - ], - [acx_enable_task_profiler="no"] - ) - - # Automatically specify the warning flags for known compilers. - if test $acx_enable_task_profiler != "no"; then - AC_CHECK_HEADER([execinfo.h], [], [AC_MSG_ERROR([execinfo.h is required by the task profiler.])]) - AC_CHECK_HEADER([cxxabi.h], [], [AC_MSG_ERROR([cxxabi.h is required by the task profiler.])]) - AC_DEFINE([MADNESS_TASK_PROFILING],[1],[Define to enable task profiler.]) - if test $ON_A_MAC = "no"; then - case $acx_enable_optimal_compiler in - GNU) - LDFLAGS="$LDFLAGS -rdynamic" - ;; - - clang) - LDFLAGS="$LDFLAGS -rdynamic" - ;; - - Pathscale) - ;; - - Portland) - ;; - - Intel) - ;; - - IBM) - ;; - - *) - ;; - esac - fi - fi - - AC_LANG_RESTORE -]) diff --git a/config/acx_enable_warn.m4 b/config/acx_enable_warn.m4 deleted file mode 100644 index 9ef0fb5782a..00000000000 --- a/config/acx_enable_warn.m4 +++ /dev/null @@ -1,66 +0,0 @@ -# This function is used to add compiler specific warning flags to CFLAGS and -# CXXFLAGS environment variables. Users are expected to specify their own warning -# flags for unknown compilers or special use cases by adding appropriate values -# to CFLAGS and CXXFLAGS. -AC_DEFUN([ACX_ENABLE_WARN], [ - acx_enable_warn="" - acx_enable_warn_flags="" - acx_enable_warn_compiler="$CXXVENDOR" - - # Allow the user to enable or disable warnings - AC_ARG_ENABLE([warning], - [AC_HELP_STRING([--enable-warning@<:@=yes|no|GNU|clang|Pathscale|Portland|Intel|IBM@:>@], - [Automatically set warnings for compiler.@<:@default=yes@:>@])], - [ - case $enableval in - yes) - acx_enable_warn="yes" - ;; - no) - acx_enable_warn="no" - ;; - *) - acx_enable_warn="yes" - acx_enable_warn_compiler="$enableval" - esac - ], - [acx_enable_warn="yes"] - ) - - # Automatically specify the warning flags for known compilers. - if test $acx_enable_warn != "no"; then - case $acx_enable_warn_compiler in - GNU) - acx_enable_warn_flags="-Wall -Wno-strict-aliasing -Wno-deprecated -Wno-unused-local-typedefs" - ;; - clang) - acx_enable_warn_flags="-Wall" - ;; - Pathscale) - acx_enable_warn_flags="-Wall" - ;; - Portland) - acx_enable_warn_flags="" - ;; - Intel) - acx_enable_warn_flags="-Wall -diag-disable remark,279,654,1125" - ;; - IBM) - acx_enable_warn_flags="-qflag=w:w" - ;; - *) - AC_MSG_WARN([Warning flags not set for $acx_enable_optimal_compile compiler]) - ;; - esac - - # Test the flags and add them to flag variables if successful. - ACX_CHECK_COMPILER_FLAG([C], [CFLAGS], [$acx_enable_warn_flags], - [CFLAGS="$CFLAGS $acx_enable_warn_flags"], - [AC_MSG_WARN([$CC does not accept $acx_enable_warn_flags, no warning flags will be used.])]) - ACX_CHECK_COMPILER_FLAG([C++], [CXXFLAGS], [$acx_enable_warn_flags], - [CXXFLAGS="$CXXFLAGS $acx_enable_warn_flags"], - [AC_MSG_WARN([$CXX does not accept $acx_enable_warn_flags, no warning flags will be used.])]) - fi - - -]) diff --git a/config/acx_fortran_symbols.m4 b/config/acx_fortran_symbols.m4 deleted file mode 100644 index bcdc89f4a1e..00000000000 --- a/config/acx_fortran_symbols.m4 +++ /dev/null @@ -1,125 +0,0 @@ -AC_DEFUN([ACX_FORTRAN_SYMBOLS], [ -# Dubiously checks for Fortran linking conventions and BLAS+LAPACK at the same time -# mostly to avoid the need for having a fortran compiler installed - -# Check for no underscore first since IBM BG ESSL seems to define dgemm with/without underscore -# but dsyev only without underscore ... but AMD ACML also defines both but with different -# interfaces (fortran and c) ... ugh. Hardwire linking for bgp and restore to original order. - - AC_MSG_NOTICE([Checking Fortran-C linking conventions (dgemm -> ?)]) - fsym=no - - if test $host = "powerpc-bgp-linux-gnu"; then - fsym="lc" - AC_MSG_NOTICE([Fortran linking convention is $fsym]) - AC_DEFINE([FORTRAN_LINKAGE_LC],[1],[Fortran-C linking convention lower case (no underscore)]) - fi - if test $host = "powerpc64-bgq-linux-gnu"; then - fsym="lc" - AC_MSG_NOTICE([Fortran linking convention is $fsym]) - AC_DEFINE([FORTRAN_LINKAGE_LC],[1],[Fortran-C linking convention lower case (no underscore)]) - fi - if test $fsym = no; then - AC_CHECK_FUNC([dgemm_],[fsym="lcu"]) - fi - if test $fsym = no; then - AC_CHECK_FUNC([dgemm],[fsym="lc"]) - fi - if test $fsym = no; then - AC_CHECK_FUNC([dgemm__],[fsym="lcuu"]) - fi - if test $fsym = no; then - AC_CHECK_FUNC([DGEMM],[fsym="uc"]) - fi - if test $fsym = no; then - AC_CHECK_FUNC([DGEMM_],[fsym="ucu"]) - fi - -# Well there is nothing in the existing path that gives us what we are -# looking for so try looking for some standard examples so that common -# Linux, Apple and configurations work automatically. We save the -# BLAS library name instead of adding it directly to LIBS since it -# will need to be appened after any LAPACK library that is yet to -# be found. - -# OS X - if test $fsym$ON_A_MAC = noyes; then - LDFLAGS="$LDFLAGS -framework Accelerate" - fsym="lcu" - AC_MSG_NOTICE([Using Accelerate framework for BLAS support]) - fi - -# Linux - BLASLIB="" - if test $fsym = no; then - AC_LANG_SAVE - AC_LANG([C++]) - for blaslib in openblas blas; do - AC_CHECK_LIB([$blaslib], - [dgemm_], - [fsym="lcu"; BLASLIB="-l$blaslib"; AC_MSG_NOTICE([Found dgemm_ in $blaslib]); break], - [AC_MSG_NOTICE([Unable to find dgemm_ in $blaslib])], - [-lpthread]) - done - AC_LANG_RESTORE - fi - -# others ... insert here or extend above for loop if correct symbol is dgemm_ - if test $fsym = no; then - AC_MSG_ERROR([Could not find dgemm with any known linking conventions]) - fi - - AC_MSG_NOTICE([Fortran linking convention is $fsym]) - -# Now verify that we have at least one of the required lapack routines and again attempt to search for candidate libraries if nothing is found - - if test $fsym = lc; then - AC_DEFINE([FORTRAN_LINKAGE_LC],[1],[Fortran-C linking convention lower case (no underscore)]) - lapacksym=dsyev - fi - if test $fsym = lcu; then - AC_DEFINE([FORTRAN_LINKAGE_LCU],[1],[Fortran-C linking convention lower case with single underscore]) - lapacksym=dsyev_ - fi - if test $fsym = lcuu; then - AC_DEFINE([FORTRAN_LINKAGE_LCUU],[1],[Fortran-C linking convention lower case with double underscore]) - lapacksym=dsyev__ - fi - if test $fsym = uc; then - AC_DEFINE([FORTRAN_LINKAGE_UC],[1],[Fortran-C linking convention upper case]) - lapacksym=DSYEV - fi - if test $fsym = ucu; then - AC_DEFINE([FORTRAN_LINKAGE_UCU],[1],[Fortran-C linking convention upper case with single underscore]) - lapacksym=DSYEV_ - fi - - LAPACKLIB="" - foundlapack=no - AC_CHECK_FUNC([$lapacksym],[foundlapack=yes],AC_MSG_NOTICE([Could not find dsyev with selected linking convention in default library path])) - - LAPACKLIB="" - if test $foundlapack = no; then - AC_LANG_SAVE - AC_LANG([C++]) - for lapacklib in lapack; do - AC_CHECK_LIB([$lapacklib], - [$lapacksym], - [foundlapack=yes; LAPACKLIB="-l$lapacklib"; AC_MSG_NOTICE([Found $lapacksym in $lapacklib]); break], - [AC_MSG_NOTICE([Unable to find $lapacksym in $lapackib])], - [$BLASLIB -lpthread]) - done - AC_LANG_RESTORE - fi - - if test $foundlapack = no; then - AC_MSG_NOTICE([Could not find $lapacksym in any known library ... specify LAPACK library via LIBS]) - fi - - LIBS="$LIBS $LAPACKLIB $BLASLIB" -]) - - - - - diff --git a/config/acx_gnu_hashmap.m4 b/config/acx_gnu_hashmap.m4 deleted file mode 100644 index ec8a9486621..00000000000 --- a/config/acx_gnu_hashmap.m4 +++ /dev/null @@ -1,34 +0,0 @@ -AC_DEFUN([ACX_GNU_HASHMAP], [ - AC_LANG_PUSH([C++]) - gotgnuhashmap=no - AC_MSG_CHECKING([for GNU hashmap in '' and namespace __gnu_cxx]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#include -using __gnu_cxx::hash_map; ]])], - [ AC_DEFINE(GNU_HASHMAP_NAMESPACE, __gnu_cxx, [GNU hashmap namespace]) - AC_DEFINE(INCLUDE_EXT_HASH_MAP,[1],[If defined header is in ext directory]) - AC_MSG_RESULT([yes]) - gotgnuhashmap=yes ], - [AC_MSG_RESULT([no])]) - - if test $gotgnuhashmap = no; then - AC_MSG_CHECKING([for GNU hashmap in '' and namespace _SLTP_STD]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#include -using _STLP_STD::hash_map; ]])], - [ AC_DEFINE(GNU_HASHMAP_NAMESPACE, _STLP_STD, [GNU hashmap namespace]) - AC_MSG_RESULT([yes]) - gotgnuhashmap=yes ], - [AC_MSG_RESULT([no])]) - fi - AC_LANG_POP([C++]) - if test $gotgnuhashmap = no; then - AC_MSG_ERROR([Could not find GNU hashmap with any known combination of header+namespace]) - fi - - AC_DEFINE(HAVE_GNU_HASHMAP,[1],[Enable if have GNU hashmap]) -]) - - - - diff --git a/config/acx_ibmbgp.m4 b/config/acx_ibmbgp.m4 deleted file mode 100644 index 556f1d26df8..00000000000 --- a/config/acx_ibmbgp.m4 +++ /dev/null @@ -1,40 +0,0 @@ -AC_DEFUN([ACX_IBMBGP],[ - # If on an IBMBGP - # - defines HAVE_IBMBGP=1 in headers - # - defines HAVE_IBMBGP=yes in the script - # - sets thread binding to "1 0 2" - # - enables spinlocks - # - sets the host architecture to powerpc-bgp-linux-gnu - # - #AC_CHECK_FILE([/bgsys], [HAVE_IBMBGP=yes AC_DEFINE([HAVE_IBMBGP],[1],[Defined if we are running on an IBM Blue Gene/P])],[]) - echo "int main()" > __bgp__.cc - echo "{" >> __bgp__.cc - echo "#ifdef __bgp__" >> __bgp__.cc - echo "return 0;" >> __bgp__.cc - echo "#else" >> __bgp__.cc - echo "choke me" >> __bgp__.cc - echo "#endif" >> __bgp__.cc - echo "}" >> __bgp__.cc - mpicxx __bgp__.cc >& /dev/null - if test $? = 0; then - HAVE_IBMBGP=yes - fi - /bin/rm __bgp__.cc - if test "x$HAVE_IBMBGP" = x; then - mpicxx --version -c | grep -q bgp - if test $? = 0; then - HAVE_IBMBGP=yes - fi - fi - if test "x$HAVE_IBMBGP" = xyes; then - AC_MSG_NOTICE([IBM Blue Gene/P detected]) - AC_DEFINE(HAVE_IBMBGP,[1],[Defined if we are running on an IBM Blue Gene/P]) - acx_default_enable_all_static=yes - host="powerpc-bgp-linux" - host_triplet="powerpc-bgp-linux" - - BIND="-1 -1 -1" - AC_DEFINE(USE_SPINLOCKS, [1], [Define if should use spinlocks]) - fi -]) - diff --git a/config/acx_ibmbgq.m4 b/config/acx_ibmbgq.m4 deleted file mode 100644 index 43f8796cf16..00000000000 --- a/config/acx_ibmbgq.m4 +++ /dev/null @@ -1,34 +0,0 @@ -AC_DEFUN([ACX_IBMBGQ],[ - # If on an IBMBGQ - # - defines HAVE_IBMBGQ=1 in headers - # - defines HAVE_IBMBGQ=yes in the script - # - sets thread binding to "1 0 2" - # - enables spinlocks - # - sets the host architecture to powerpc-bgq-linux-gnu - # - #AC_CHECK_FILE([/bgsys], [HAVE_IBMBGQ=yes AC_DEFINE([HAVE_IBMBGQ],[1],[Defined if we are running on an IBM Blue Gene/Q])],[]) - echo "int main()" > __bgq__.cc - echo "{" >> __bgq__.cc - echo "#ifdef __bgq__" >> __bgq__.cc - echo "return 0;" >> __bgq__.cc - echo "#else" >> __bgq__.cc - echo "choke me" >> __bgq__.cc - echo "#endif" >> __bgq__.cc - echo "}" >> __bgq__.cc - mpicxx __bgq__.cc >& /dev/null - if test $? = 0; then - AC_MSG_NOTICE([IBM Blue Gene/Q detected]) - HAVE_IBMBGQ=yes - AC_DEFINE(HAVE_IBMBGQ,[1],[Defined if we are running on an IBM Blue Gene/Q]) - acx_default_enable_all_static=yes - fi - /bin/rm __bgq__.cc - if test "x$HAVE_IBMBGQ" = xyes; then - host="powerpc64-bgq-linux" - host_triplet="powerpc64-bgq-linux" - - BIND="-1 -1 -1" - AC_DEFINE(USE_SPINLOCKS, [1], [Define if should use spinlocks]) - fi -]) - diff --git a/config/acx_mac.m4 b/config/acx_mac.m4 deleted file mode 100644 index 74e0d232bd8..00000000000 --- a/config/acx_mac.m4 +++ /dev/null @@ -1,19 +0,0 @@ -AC_DEFUN([ACX_MAC], [ - # If on a MAC - # - kiss steve jobs' ass - # - get an iphone - # - get another mac - ON_A_MAC="no" - uname -a | grep -iq Darwin - if test $? = 0; then - ITS_A_MAC="yes" - ON_A_MAC="yes" - LDFLAGS="-Wl,-no_pie $LDFLAGS" - AC_MSG_NOTICE([You are building on a mac ... now tell ten of your friends.]) - AC_DEFINE(ON_A_MAC,[1],[Set if building on a mac]) - fi -]) - - - - diff --git a/config/acx_mpi.m4 b/config/acx_mpi.m4 deleted file mode 100644 index ac07c0fa321..00000000000 --- a/config/acx_mpi.m4 +++ /dev/null @@ -1,26 +0,0 @@ -AC_DEFUN([ACX_MPI], [ - # We were using the full macro from ACX but this forced AC_PROG_C or AC_PROG_CXX to - # be run before we had overridden the compilers which meant that some confdef.h - # entries were incorrect (specifically std::exit problem with PGI) - - # Disable MPI C++ bindings. - CPPFLAGS="$CPPFLAGS -DMPICH_SKIP_MPICXX=1 -DOMPI_SKIP_MPICXX=1" - - AC_ARG_VAR(MPICC,[MPI C compiler command]) - AC_CHECK_PROGS(MPICC, mpicc hcc mpcc mpcc_r mpxlc cmpicc, $CC) - acx_mpi_save_CC="$CC" - CC="$MPICC" - AC_SUBST(MPICC) - - AC_ARG_VAR(MPICXX,[MPI C++ compiler command]) - AC_CHECK_PROGS(MPICXX, mpicxx mpic++ mpiCC mpCC hcp mpxlC mpxlC_r cmpic++, $CXX) - acx_mpi_save_CXX="$CXX" - CXX="$MPICXX" - AC_SUBST(MPICXX) - - #AC_ARG_VAR(MPIF77,[MPI Fortran compiler command]) - #AC_CHECK_PROGS(MPIF77, mpif77 hf77 mpxlf mpf77 mpif90 mpf90 mpxlf90 mpxlf95 mpxlf_r cmpifc cmpif90c, $F77) - #acx_mpi_save_F77="$F77" - #F77="$MPIF77" - #AC_SUBST(MPIF77) -]) diff --git a/config/acx_posix_memalign.m4 b/config/acx_posix_memalign.m4 deleted file mode 100644 index 11a113cd808..00000000000 --- a/config/acx_posix_memalign.m4 +++ /dev/null @@ -1,43 +0,0 @@ -AC_DEFUN([ACX_POSIX_MEMALIGN], [ - AC_CHECK_FUNC([posix_memalign],[gotpm=1], [gotpm=0]) - if test $gotpm = 1; then - AC_DEFINE([HAVE_POSIX_MEMALIGN], [1], [Set if have posix_memalign]) - elif test "$ON_A_MAC" = "yes"; then - AC_DEFINE([HAVE_POSIX_MEMALIGN], [0], [Set if have posix_memalign]) - else - AC_MSG_WARN([[ posix_memalign NOT FOUND ... enabling override of new/delete ... THIS WILL BE SLOW ]]) - AC_DEFINE([WORLD_GATHER_MEM_STATS], [1], [Set if MADNESS gathers memory statistics]) - fi - - # look for both version of posix_memalign, with and without throw() - gotpmh=0 - if test $gotpm = 1; then - AC_MSG_CHECKING([if missing declaration of posix_memalign in stdlib.h]) - AC_LANG_SAVE - AC_LANG([C++]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#include -#include -extern "C" int posix_memalign(void **memptr, size_t alignment, size_t size) throw();]], -[[void *m; posix_memalign(&m, 16, 1024);]])], - [AC_MSG_RESULT([no]) - gotpmh=1 - ] - ) - if test $gotpmh = 0; then - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#include -#include -extern "C" int posix_memalign(void **memptr, size_t alignment, size_t size);]], -[[void *m; posix_memalign(&m, 16, 1024);]])], - [AC_MSG_RESULT([no]) - gotpmh=1 - ], - [ AC_DEFINE(MISSING_POSIX_MEMALIGN_PROTO, [1], [Set if the posix_memalign prototype is missing]) - AC_MSG_RESULT([yes]) - ] - ) - fi - AC_LANG_RESTORE - fi -]) diff --git a/config/acx_std_abs.m4 b/config/acx_std_abs.m4 deleted file mode 100644 index ac5deef7884..00000000000 --- a/config/acx_std_abs.m4 +++ /dev/null @@ -1,27 +0,0 @@ -AC_DEFUN([ACX_STD_ABS], [ - AC_MSG_CHECKING([std::abs(long)]) - AC_LANG_PUSH([C++]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[ -#include -#include -long (*absptr)(long) = &std::abs; -long a = -1; -long b = std::abs(a); -]])], - [AC_DEFINE(HAVE_STD_ABS_LONG,[1],[Define if have std::abs(long)]) have_abs_long=yes], - [have_abs_long=no]) - AC_MSG_RESULT([$have_abs_long]) - if test X"$have_abs_long" = Xno; then - AC_MSG_CHECKING([std::labs(long)]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[ -#include -#include -long (*labsptr)(long) = &std::labs; -long a = -1l; -long b = labs(a); -]])], - [AC_DEFINE(HAVE_LABS,[1],[Define if have std::labs(long)]) have_std_labs=yes], - [have_std_labs=no]) - AC_MSG_RESULT([$have_std_labs]) - fi -]) diff --git a/config/acx_unqal_stat_decl.m4 b/config/acx_unqal_stat_decl.m4 deleted file mode 100644 index 95e25748255..00000000000 --- a/config/acx_unqal_stat_decl.m4 +++ /dev/null @@ -1,14 +0,0 @@ -AC_DEFUN([ACX_UNQUALIFIED_STATIC_DECL], [ - AC_LANG_PUSH([C++]) - AC_MSG_CHECKING([if unqualified static declarations are considered]) - AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM( - [[template - static inline void f(T* a) {}; - template void g(T* a) { f(a); } - template void g(int* a);]], - [[]])], - [AC_DEFINE(HAVE_UNQUALIFIED_STATIC_DECL, [1], [Set if compiler will instantiate static templates]) AC_MSG_RESULT([yes])], - [AC_MSG_RESULT([no])]) - AC_LANG_POP([C++]) -]) diff --git a/config/acx_with_elemental.m4 b/config/acx_with_elemental.m4 deleted file mode 100644 index 945faceb7d1..00000000000 --- a/config/acx_with_elemental.m4 +++ /dev/null @@ -1,37 +0,0 @@ -AC_DEFUN([ACX_WITH_ELEMENTAL], -[ - acx_with_elemental=no - AC_ARG_WITH([elemental], - [AS_HELP_STRING([--with-elemental@<:@=DIR@:>@], [Build with Elemental headers.])], - [ - case $withval in - yes) - acx_with_elemental=yes - ;; - no) - acx_with_elemental=no - ;; - *) - acx_with_elemental=yes - CPPFLAGS="-I$withval/include $CPPFLAGS" - #ELEMENTAL_LIBS="-L$withval/lib -lelemental -lpmrrr -lelem-dummy-lib" - #for 0.81 - ELEMENTAL_LIBS="-L$withval/lib -lelemental -lpmrrr " - if test -f "$withval/lib/liblapack-addons.a"; then - ELEMENTAL_LIBS="$ELEMENTAL_LIBS -llapack-addons" - fi - LIBS="$ELEMENTAL_LIBS $LIBS" - ;; - esac - ] - ) - - if test "$acx_with_elemental" != no; then - # Check for the pressence of Elemental header files. - AC_CHECK_HEADER([elemental.hpp], [], - [AC_MSG_ERROR([Unable to find the elemental.hpp header file.])]) - AC_DEFINE([MADNESS_HAS_ELEMENTAL], [1], - [Madness will use Elemental for parallel linear algebra operations]) - MADNESS_HAS_ELEMENTAL=1 - fi -]) diff --git a/config/acx_with_google_perf.m4 b/config/acx_with_google_perf.m4 deleted file mode 100644 index cedb1734978..00000000000 --- a/config/acx_with_google_perf.m4 +++ /dev/null @@ -1,45 +0,0 @@ -AC_DEFUN([ACX_WITH_GOOGLE_PERF], [ - acx_with_google_perf="" - AC_ARG_WITH([google-perf], - [AS_HELP_STRING([--without-google-perf], - [Disables use of Google fast malloc.profiler/heapchecker; --with-google-perf=directory overrides install path])], - [ - case $withval in - yes) - acx_with_google_perf="yes" - ;; - no) - acx_with_google_perf="no" - ;; - *) - LIBS="$LIBS -L$withval/lib" - CPPFLAGS="-I$withval/include $CPPFLAGS" - acx_with_google_perf="$withval" - esac - ], - [acx_with_google_perf="yes"] - ) - - if test $acx_with_google_perf != "no"; then - AC_LANG_SAVE - AC_LANG([C++]) - - AC_CHECK_LIB([tcmalloc_and_profiler], [ProfilerStart], - [LIBS="-lprofiler -ltcmalloc $LIBS" - have_profiler=yes - AC_MSG_NOTICE([Google profiler and fast malloc found]) - AC_DEFINE([MADNESS_HAS_GOOGLE_PERF], [1], [Define if using Google PerformanceTools])], - [have_profiler=no - AC_MSG_NOTICE(["Unable to link with libprofiler+libtcmalloc])]) - - if test $have_profiler = "no" ; then - AC_CHECK_LIB([tcmalloc_minimal], [malloc], - [LIBS="-ltcmalloc_minimal $LIBS" - AC_MSG_NOTICE([Google minimal fast malloc found]) - AC_DEFINE([MADNESS_HAS_GOOGLE_PERF_MINIMAL], [1], [Define if using Google PerformanceTools without libunwind])], - [AC_MSG_NOTICE(["Unable to link with libtcmalloc_minimal])]) - fi - - AC_LANG_RESTORE - fi -]) diff --git a/config/acx_with_google_test.m4 b/config/acx_with_google_test.m4 deleted file mode 100644 index 7d588850f02..00000000000 --- a/config/acx_with_google_test.m4 +++ /dev/null @@ -1,41 +0,0 @@ -AC_DEFUN([ACX_WITH_GOOGLE_TEST], [ - acx_with_google_test="" - AC_ARG_WITH([google-test], - [AS_HELP_STRING([--with-google-test@<:@=yes|no@:>@], - [Enables use of Google unit test @<:@default=no@:>@])], - [ - case $withval in - yes) - acx_with_google_test="yes" - ;; - *) - acx_with_google_test="no" - esac - ], - [ - acx_with_google_test="no" - ] - ) - - AC_ARG_VAR([GTEST_CPPFLAGS], [C-like preprocessor flags for Google Test.]) - AC_ARG_VAR([GTEST_CXXFLAGS], [C++ compile flags for Google Test.]) - AC_ARG_VAR([GTEST_LDFLAGS], [Linker path and option flags for Google Test.]) - AC_ARG_VAR([GTEST_LIBS], [Library linking flags for Google Test.]) - - - if test $acx_with_google_test == "no"; then - AC_MSG_NOTICE([Configuring with Google Unit Test --- no]) - else - AC_MSG_NOTICE([Configuring with Google Unit Test --- yes]) - - # Set preprocessor and build variables - AC_DEFINE([MADNESS_HAS_GOOGLE_TEST], [1], [Define if should use Google unit testing]) - AC_SUBST([GTEST_CPPFLAGS]) - AC_SUBST([GTEST_CXXFLAGS]) - AC_SUBST([GTEST_LDFLAGS]) - AC_SUBST([GTEST_LIBS]) - - fi - - AM_CONDITIONAL([MADNESS_HAS_GOOGLE_TEST], [test $acx_with_google_test != no]) -]) diff --git a/config/acx_with_libunwind.m4 b/config/acx_with_libunwind.m4 deleted file mode 100644 index 11d3b4a9c8c..00000000000 --- a/config/acx_with_libunwind.m4 +++ /dev/null @@ -1,30 +0,0 @@ -AC_DEFUN([ACX_WITH_LIBUNWIND], [ - acx_with_libunwind="" - AC_ARG_WITH([libunwind], - [AS_HELP_STRING([--with-libunwind@<:@=Install DIR@:>@], - [Enables use of libunwind, required for Google profiler and heap checker])], - [ - case $withval in - yes) - acx_with_libunwind="yes" - ;; - no) - acx_with_libunwind="no" - ;; - *) - CPPFLAGS="$CPPFLAGS -I$with_libunwind/include" - LIBS="$LIBS -L$with_libunwind/lib" - acx_with_libunwind="$withval" - esac - ], - [acx_with_libunwind="no"] - ) - if test $acx_with_libunwind != "no"; then - AC_LANG_SAVE - AC_LANG_C - AC_CHECK_HEADER([libunwind.h], [], [AC_MSG_ERROR([Unable to compile with the libunwind.])]) - AC_CHECK_LIB([unwind], [_Unwind_GetRegionStart], [LIBS="$LIBS -lunwind"], [AC_MSG_ERROR(["Unable to link with libunwind])]) - AC_DEFINE(MADNESS_HAS_LIBUNWIND, [1], [Define if should use libunwind for Google performance tools]) - AC_LANG_RESTORE - fi -]) diff --git a/config/acx_with_libxc.m4 b/config/acx_with_libxc.m4 deleted file mode 100644 index 22f4a902800..00000000000 --- a/config/acx_with_libxc.m4 +++ /dev/null @@ -1,42 +0,0 @@ -AC_DEFUN([ACX_WITH_LIBXC], [ - acx_with_libxc="" - AC_ARG_WITH([libxc], - [AS_HELP_STRING([--with-libxc@<:@=Install DIR@:>@], - [Enables use of the libxc library of density functionals])], - [ - case $withval in - yes) - acx_with_libxc="yes" - ;; - no) - acx_with_libxc="no" - ;; - *) - CPPFLAGS="-I$withval/include $CPPFLAGS" - LIBS="$LIBS -L$withval/lib" - acx_with_libxc="$withval" - esac - ], - [acx_with_libxc="yes"] - ) - - if test $acx_with_libxc != "no"; then - AC_LANG_SAVE - AC_LANG([C++]) - AC_CHECK_HEADERS([xc.h xc_funcs.h], [], - [acx_with_libxc=no - AC_MSG_NOTICE([Unable to include with xc.h or xc_func.h])]) - AC_CHECK_LIB([xc], [xc_func_end], [], - [acx_with_libxc=no - AC_MSG_NOTICE([Unable to link with libxc])]) - - - AC_LANG_RESTORE - fi - - if test $acx_with_libxc != "no"; then - AC_DEFINE([MADNESS_HAS_LIBXC], [1], [Define if using libxc]) - fi - - AM_CONDITIONAL([MADNESS_HAS_LIBXC], [test $acx_with_libxc != "no"]) -]) diff --git a/config/acx_with_mkl.m4 b/config/acx_with_mkl.m4 deleted file mode 100644 index 36e378ff4cd..00000000000 --- a/config/acx_with_mkl.m4 +++ /dev/null @@ -1,75 +0,0 @@ -AC_DEFUN([ACX_WITH_MKL], [ - - AC_ARG_VAR([MKLROOT], [Intel MKL install directory.]) - - AC_ARG_WITH([mkl], - [AS_HELP_STRING([--with-mkl@<:@=yes|no|check|DIR@:>@], - [Enables use of Intel MKL @<:@default=check@:>@])], - [ - case $withval in - yes) - acx_with_mkl="yes" - ;; - no) - acx_with_mkl="no" - ;; - *) - acx_with_mkl="$withval" - ;; - esac - ], - [ - acx_with_mkl="check" - ] - ) - - if test $acx_with_mkl != "no"; then - AC_MSG_CHECKING([Intel MKL]) - - case $acx_with_mkl in - yes|check) - if test -d "$MKLROOT"; then - acx_mkl_root="$MKLROOT" - elif test -d "/opt/intel/mkl"; then - acx_mkl_root="/opt/intel/mkl" - else - acx_mkl_root="no" - fi - ;; - *) - if test -d "$acx_with_mkl"; then - acx_mkl_root="$acx_with_mkl" - else - acx_mkl_root="no" - fi - ;; - esac - - # Show results - AC_MSG_RESULT([$acx_mkl_root]) - - if test $acx_mkl_root != "no"; then - # Set the MKL library name based on the integer type - if test $acx_fortran_int_size == "4"; then - acx_mkl_int_type="lp64" - else - acx_mkl_int_type="ilp64" - fi - - AC_DEFINE([HAVE_INTEL_MKL], [1], [Define if using Intel MKL math library]) - - # Add MKL libraries to the LIBS variable - if test $ON_A_MAC = "no"; then - LIBS="$LIBS -L$acx_mkl_root/lib/intel64 -Wl,--start-group -lmkl_intel_$acx_mkl_int_type -lmkl_core -lmkl_sequential -Wl,--end-group -lpthread -lm -ldl" - else - LIBS="$LIBS -L$acx_mkl_root/lib -lmkl_intel_$acx_mkl_int_type -lmkl_core -lmkl_sequential -lpthread -lm" - fi - else - # Return an error if not checking - if test $acx_with_mkl != "check"; then - AC_MSG_ERROR([Intel MKL install directory not found or invalid.]) - fi - fi - fi - -]) diff --git a/config/acx_with_pcm.m4 b/config/acx_with_pcm.m4 deleted file mode 100644 index 3dca7a6d555..00000000000 --- a/config/acx_with_pcm.m4 +++ /dev/null @@ -1,42 +0,0 @@ -AC_DEFUN([ACX_WITH_PCM], [ - acx_with_pcm="" - AC_ARG_WITH([pcm], - [AS_HELP_STRING([--with-pcm@<:@=Install DIR@:>@], - [Enables use of the polarizable contiuum model library PCM])], - [ - case $withval in - yes) - acx_with_pcm="yes" - ;; - no) - acx_with_pcm="no" - ;; - *) - CPPFLAGS="-I$withval/include $CPPFLAGS" - LIBS="$LIBS -L$withval/lib" - acx_with_pcm="$withval" - esac - ], - [acx_with_pcm="yes"] - ) - - if test $acx_with_pcm != "no"; then - AC_LANG_SAVE - AC_LANG([C++]) - AC_CHECK_HEADERS([PCMSolver/pcmsolver.h PCMSolver/PCMInput.h], [], - [acx_with_pcm=no - AC_MSG_NOTICE([Unable to include with pcmsolver.h or PCMInput.h])]) - AC_CHECK_LIB([pcm],[pcmsolver_is_compatible_library], [], - [acx_with_pcm=no - AC_MSG_NOTICE([Unable to link with pcm])]) - - - AC_LANG_RESTORE - fi - - if test $acx_with_pcm != "no"; then - AC_DEFINE([MADNESS_HAS_PCM], [1], [Define if using pcm]) - fi - - AM_CONDITIONAL([MADNESS_HAS_PCM], [test $acx_with_pcm != "no"]) -]) diff --git a/config/acx_with_stubmpi.m4 b/config/acx_with_stubmpi.m4 deleted file mode 100644 index 334947e0b2b..00000000000 --- a/config/acx_with_stubmpi.m4 +++ /dev/null @@ -1,31 +0,0 @@ -AC_DEFUN([ACX_WITH_STUBMPI], -[ - acx_with_stubmpi=no - AC_ARG_WITH([stubmpi], - [AS_HELP_STRING([--with-stubmpi], [Build without MPI ... i.e., stubbing it out.])], - [ - case $withval in - yes) - acx_with_stubmpi=yes - ;; - no) - acx_with_stubmpi=no - ;; - *) - acx_with_stubmpi=yes - ;; - esac - ]) - if test $acx_with_stubmpi = yes; then - AC_DEFINE(STUBOUTMPI,[1],[If defined header disable MPI by including stubmpi.h]) - MPICC="$CC" - MPICXX="$CXX" - if test "x$CC" = x; then - MPICC=gcc; - fi - if test "x$CXX" = x; then - MPICXX=g++; - fi - AC_MSG_NOTICE([Stubbing out MPI with MPICXX=$MPICXX MPICC=$MPICC]) - fi -]) diff --git a/config/acx_with_tbb.m4 b/config/acx_with_tbb.m4 deleted file mode 100644 index 136b6ff016b..00000000000 --- a/config/acx_with_tbb.m4 +++ /dev/null @@ -1,128 +0,0 @@ -AC_DEFUN([ACX_WITH_TBB], [ - acx_with_tbb_include="no" - acx_with_tbb_lib="no" - acx_with_tbb="no" - - # Configure madness to use Intel TBB and specify the include path. - AC_ARG_WITH([tbb-include], - [AS_HELP_STRING([--with-tbb-include@<:@=DIR@:>@], - [Enables use of Intel TBB as the task scheduler.])], - [ - case $withval in - yes) - AC_MSG_ERROR([You must specify a directory for --with-tbb-include.]) - ;; - no) - ;; - *) - CPPFLAGS="$CPPFLAGS -I$withval" - acx_with_tbb_include="yes" - acx_with_tbb="yes" - esac - ] - ) - - - # Configure madness to use Intel TBB and specify the library path. - AC_ARG_WITH([tbb-lib], - [AS_HELP_STRING([--with-tbb-lib@<:@=DIR@:>@], - [Enables use of Intel TBB as the task scheduler.])], - [ - case $withval in - yes) - AC_MSG_ERROR([You must specify a directory for --with-tbb-lib.]) - ;; - no) - ;; - *) - LIBS="$LIBS -L$withval" - acx_with_tbb_lib="yes" - acx_with_tbb="yes" - esac - ] - ) - - # Configure madness to use Intel TBB - AC_ARG_WITH([tbb], - [AS_HELP_STRING([--with-tbb@<:@=Install DIR@:>@], - [Enables use of Intel TBB as the task scheduler.])], - [ - case $withval in - yes) - acx_with_tbb="yes" - ;; - no) - ;; - *) - if test "$acx_with_tbb_include" == no; then - CPPFLAGS="$CPPFLAGS -I$withval/include" - fi - if test "$acx_with_tbb_lib" == no; then - LIBS="$LIBS -L$withval/lib/intel64/gcc4.4 -L$withval/lib" - fi - acx_with_tbb="yes" - esac - ], - [acx_with_tbb="yes"] - ) - - # Check that we can compile with Intel TBB - if test $acx_with_tbb != "no"; then - AC_LANG_SAVE - AC_LANG([C++]) - - # Check for Intel TBB header. - AC_CHECK_HEADER([tbb/tbb.h], [], - [acx_with_tbb=no - AC_MSG_NOTICE([Unable to compile with Intel TBB.])]) - AC_LANG_RESTORE - fi - - if test $acx_with_tbb != "no"; then - AC_LANG_SAVE - AC_LANG([C++]) - # Check for Intel TBB library. - if test "x$acx_enable_debugging" == xno; then - AC_CHECK_LIB([tbb], [TBB_runtime_interface_version], [LIBS="-ltbb $LIBS"], - [acx_with_tbb=no - AC_MSG_NOTICE(["Unable to link with Intel TBB])]) - else - AC_CHECK_LIB([tbb_debug], [TBB_runtime_interface_version], - [ - LIBS="-ltbb_debug $LIBS" - CPPFLAGS="$CPPFLAGS -DTBB_USE_DEBUG=1" - AC_MSG_WARN([Linking with the debug variant of Intel TBB.]) - ], [ - AC_CHECK_LIB([tbb], [TBB_runtime_interface_version], [LIBS="-ltbb $LIBS"], - [acx_with_tbb=no - AC_MSG_NOTICE(["Unable to link with Intel TBB])]) - ]) - - fi - AC_LANG_RESTORE - fi - - if test $acx_with_tbb != "no"; then - AC_MSG_CHECKING([if TBB is sufficiently recent (> 4.3.5)]) - AC_LANG_SAVE - AC_LANG([C++]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - ]], - [[tbb::task* empty_root; empty_root->add_ref_count(0);]])], - [AC_MSG_RESULT([yes])], - [AC_MSG_RESULT([no]) - acx_with_tbb=no - ] - ) - AC_LANG_RESTORE - fi - - if test $acx_with_tbb != "no"; then - AC_DEFINE(HAVE_INTEL_TBB, [1], [Define if Intel TBB is available.]) - - AC_CHECK_LIB([tbbmalloc_proxy], [__TBB_malloc_proxy], [LIBS="$LIBS -ltbbmalloc_proxy"], - [AC_MSG_NOTICE(["Unable to link with Intel TBB malloc proxy])]) - - fi -]) diff --git a/config/am_prog_ar.m4 b/config/am_prog_ar.m4 deleted file mode 100644 index feab150c702..00000000000 --- a/config/am_prog_ar.m4 +++ /dev/null @@ -1 +0,0 @@ -AC_DEFUN([AM_PROG_AR],[]) \ No newline at end of file diff --git a/config/ax_cxx_compile_stdcxx.m4 b/config/ax_cxx_compile_stdcxx.m4 deleted file mode 100644 index 036e8b42802..00000000000 --- a/config/ax_cxx_compile_stdcxx.m4 +++ /dev/null @@ -1,982 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) -# -# DESCRIPTION -# -# Check for baseline language coverage in the compiler for the specified -# version of the C++ standard. If necessary, add switches to CXX and -# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) -# or '14' (for the C++14 standard). -# -# The second argument, if specified, indicates whether you insist on an -# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. -# -std=c++11). If neither is specified, you get whatever works, with -# preference for an extended mode. -# -# The third argument, if specified 'mandatory' or if left unspecified, -# indicates that baseline support for the specified C++ standard is -# required and that the macro should error out if no mode with that -# support is found. If specified 'optional', then configuration proceeds -# regardless, after defining HAVE_CXX${VERSION} if and only if a -# supporting mode is found. -# -# LICENSE -# -# Copyright (c) 2008 Benjamin Kosnik -# Copyright (c) 2012 Zack Weinberg -# Copyright (c) 2013 Roy Stogner -# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov -# Copyright (c) 2015 Paul Norman -# Copyright (c) 2015 Moritz Klammler -# Copyright (c) 2016 Krzesimir Nowak -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 7 - -dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro -dnl (serial version number 13). - -AX_REQUIRE_DEFINED([AC_MSG_WARN]) -AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl - m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], - [$1], [14], [ax_cxx_compile_alternatives="14 1y"], - [$1], [17], [ax_cxx_compile_alternatives="17 1z"], - [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl - m4_if([$2], [], [], - [$2], [ext], [], - [$2], [noext], [], - [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl - m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], - [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], - [$3], [optional], [ax_cxx_compile_cxx$1_required=false], - [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) - AC_LANG_PUSH([C++])dnl - ac_success=no - AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, - ax_cv_cxx_compile_cxx$1, - [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [ax_cv_cxx_compile_cxx$1=yes], - [ax_cv_cxx_compile_cxx$1=no])]) - if test x$ax_cv_cxx_compile_cxx$1 = xyes; then - ac_success=yes - fi - - m4_if([$2], [noext], [], [dnl - if test x$ac_success = xno; then - for alternative in ${ax_cxx_compile_alternatives}; do - switch="-std=gnu++${alternative}" - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, - $cachevar, - [ac_save_CXX="$CXX" - CXX="$CXX $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXX="$ac_save_CXX"]) - if eval test x\$$cachevar = xyes; then - CXX="$CXX $switch" - if test -n "$CXXCPP" ; then - CXXCPP="$CXXCPP $switch" - fi - ac_success=yes - break - fi - done - fi]) - - m4_if([$2], [ext], [], [dnl - if test x$ac_success = xno; then - dnl HP's aCC needs +std=c++11 according to: - dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf - dnl Cray's crayCC needs "-h std=c++11" - for alternative in ${ax_cxx_compile_alternatives}; do - for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, - $cachevar, - [ac_save_CXX="$CXX" - CXX="$CXX $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXX="$ac_save_CXX"]) - if eval test x\$$cachevar = xyes; then - CXX="$CXX $switch" - if test -n "$CXXCPP" ; then - CXXCPP="$CXXCPP $switch" - fi - ac_success=yes - break - fi - done - if test x$ac_success = xyes; then - break - fi - done - fi]) - AC_LANG_POP([C++]) - if test x$ax_cxx_compile_cxx$1_required = xtrue; then - if test x$ac_success = xno; then - AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) - fi - fi - if test x$ac_success = xno; then - HAVE_CXX$1=0 - AC_MSG_NOTICE([No compiler with C++$1 support was found]) - else - HAVE_CXX$1=1 - AC_DEFINE(HAVE_CXX$1,1, - [define if the compiler supports basic C++$1 syntax]) - fi - AC_SUBST(HAVE_CXX$1) - m4_if([$1], [17], [AC_MSG_WARN([C++17 is not yet standardized, so the checks may change in incompatible ways anytime])]) -]) - - -dnl Test body for checking C++11 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 -) - - -dnl Test body for checking C++14 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 -) - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 -) - -dnl Tests for new features in C++11 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ - -// If the compiler admits that it is not ready for C++11, why torture it? -// Hopefully, this will speed up the test. - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -#elif __cplusplus < 201103L - -#error "This is not a C++11 compiler" - -#else - -namespace cxx11 -{ - - namespace test_static_assert - { - - template - struct check - { - static_assert(sizeof(int) <= sizeof(T), "not big enough"); - }; - - } - - namespace test_final_override - { - - struct Base - { - virtual void f() {} - }; - - struct Derived : public Base - { - virtual void f() override {} - }; - - } - - namespace test_double_right_angle_brackets - { - - template < typename T > - struct check {}; - - typedef check single_type; - typedef check> double_type; - typedef check>> triple_type; - typedef check>>> quadruple_type; - - } - - namespace test_decltype - { - - int - f() - { - int a = 1; - decltype(a) b = 2; - return a + b; - } - - } - - namespace test_type_deduction - { - - template < typename T1, typename T2 > - struct is_same - { - static const bool value = false; - }; - - template < typename T > - struct is_same - { - static const bool value = true; - }; - - template < typename T1, typename T2 > - auto - add(T1 a1, T2 a2) -> decltype(a1 + a2) - { - return a1 + a2; - } - - int - test(const int c, volatile int v) - { - static_assert(is_same::value == true, ""); - static_assert(is_same::value == false, ""); - static_assert(is_same::value == false, ""); - auto ac = c; - auto av = v; - auto sumi = ac + av + 'x'; - auto sumf = ac + av + 1.0; - static_assert(is_same::value == true, ""); - static_assert(is_same::value == true, ""); - static_assert(is_same::value == true, ""); - static_assert(is_same::value == false, ""); - static_assert(is_same::value == true, ""); - return (sumf > 0.0) ? sumi : add(c, v); - } - - } - - namespace test_noexcept - { - - int f() { return 0; } - int g() noexcept { return 0; } - - static_assert(noexcept(f()) == false, ""); - static_assert(noexcept(g()) == true, ""); - - } - - namespace test_constexpr - { - - template < typename CharT > - unsigned long constexpr - strlen_c_r(const CharT *const s, const unsigned long acc) noexcept - { - return *s ? strlen_c_r(s + 1, acc + 1) : acc; - } - - template < typename CharT > - unsigned long constexpr - strlen_c(const CharT *const s) noexcept - { - return strlen_c_r(s, 0UL); - } - - static_assert(strlen_c("") == 0UL, ""); - static_assert(strlen_c("1") == 1UL, ""); - static_assert(strlen_c("example") == 7UL, ""); - static_assert(strlen_c("another\0example") == 7UL, ""); - - } - - namespace test_rvalue_references - { - - template < int N > - struct answer - { - static constexpr int value = N; - }; - - answer<1> f(int&) { return answer<1>(); } - answer<2> f(const int&) { return answer<2>(); } - answer<3> f(int&&) { return answer<3>(); } - - void - test() - { - int i = 0; - const int c = 0; - static_assert(decltype(f(i))::value == 1, ""); - static_assert(decltype(f(c))::value == 2, ""); - static_assert(decltype(f(0))::value == 3, ""); - } - - } - - namespace test_uniform_initialization - { - - struct test - { - static const int zero {}; - static const int one {1}; - }; - - static_assert(test::zero == 0, ""); - static_assert(test::one == 1, ""); - - } - - namespace test_lambdas - { - - void - test1() - { - auto lambda1 = [](){}; - auto lambda2 = lambda1; - lambda1(); - lambda2(); - } - - int - test2() - { - auto a = [](int i, int j){ return i + j; }(1, 2); - auto b = []() -> int { return '0'; }(); - auto c = [=](){ return a + b; }(); - auto d = [&](){ return c; }(); - auto e = [a, &b](int x) mutable { - const auto identity = [](int y){ return y; }; - for (auto i = 0; i < a; ++i) - a += b--; - return x + identity(a + b); - }(0); - return a + b + c + d + e; - } - - int - test3() - { - const auto nullary = [](){ return 0; }; - const auto unary = [](int x){ return x; }; - using nullary_t = decltype(nullary); - using unary_t = decltype(unary); - const auto higher1st = [](nullary_t f){ return f(); }; - const auto higher2nd = [unary](nullary_t f1){ - return [unary, f1](unary_t f2){ return f2(unary(f1())); }; - }; - return higher1st(nullary) + higher2nd(nullary)(unary); - } - - } - - namespace test_variadic_templates - { - - template - struct sum; - - template - struct sum - { - static constexpr auto value = N0 + sum::value; - }; - - template <> - struct sum<> - { - static constexpr auto value = 0; - }; - - static_assert(sum<>::value == 0, ""); - static_assert(sum<1>::value == 1, ""); - static_assert(sum<23>::value == 23, ""); - static_assert(sum<1, 2>::value == 3, ""); - static_assert(sum<5, 5, 11>::value == 21, ""); - static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); - - } - - // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae - // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function - // because of this. - namespace test_template_alias_sfinae - { - - struct foo {}; - - template - using member = typename T::member_type; - - template - void func(...) {} - - template - void func(member*) {} - - void test(); - - void test() { func(0); } - - } - -} // namespace cxx11 - -#endif // __cplusplus >= 201103L - -]]) - - -dnl Tests for new features in C++14 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ - -// If the compiler admits that it is not ready for C++14, why torture it? -// Hopefully, this will speed up the test. - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -#elif __cplusplus < 201402L - -#error "This is not a C++14 compiler" - -#else - -namespace cxx14 -{ - - namespace test_polymorphic_lambdas - { - - int - test() - { - const auto lambda = [](auto&&... args){ - const auto istiny = [](auto x){ - return (sizeof(x) == 1UL) ? 1 : 0; - }; - const int aretiny[] = { istiny(args)... }; - return aretiny[0]; - }; - return lambda(1, 1L, 1.0f, '1'); - } - - } - - namespace test_binary_literals - { - - constexpr auto ivii = 0b0000000000101010; - static_assert(ivii == 42, "wrong value"); - - } - - namespace test_generalized_constexpr - { - - template < typename CharT > - constexpr unsigned long - strlen_c(const CharT *const s) noexcept - { - auto length = 0UL; - for (auto p = s; *p; ++p) - ++length; - return length; - } - - static_assert(strlen_c("") == 0UL, ""); - static_assert(strlen_c("x") == 1UL, ""); - static_assert(strlen_c("test") == 4UL, ""); - static_assert(strlen_c("another\0test") == 7UL, ""); - - } - - namespace test_lambda_init_capture - { - - int - test() - { - auto x = 0; - const auto lambda1 = [a = x](int b){ return a + b; }; - const auto lambda2 = [a = lambda1(x)](){ return a; }; - return lambda2(); - } - - } - - namespace test_digit_separators - { - - constexpr auto ten_million = 100'000'000; - static_assert(ten_million == 100000000, ""); - - } - - namespace test_return_type_deduction - { - - auto f(int& x) { return x; } - decltype(auto) g(int& x) { return x; } - - template < typename T1, typename T2 > - struct is_same - { - static constexpr auto value = false; - }; - - template < typename T > - struct is_same - { - static constexpr auto value = true; - }; - - int - test() - { - auto x = 0; - static_assert(is_same::value, ""); - static_assert(is_same::value, ""); - return x; - } - - } - -} // namespace cxx14 - -#endif // __cplusplus >= 201402L - -]]) - - -dnl Tests for new features in C++17 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ - -// If the compiler admits that it is not ready for C++17, why torture it? -// Hopefully, this will speed up the test. - -#ifndef __cplusplus - -#error "This is not a C++ compiler" - -#elif __cplusplus <= 201402L - -#error "This is not a C++17 compiler" - -#else - -#if defined(__clang__) - #define REALLY_CLANG -#else - #if defined(__GNUC__) - #define REALLY_GCC - #endif -#endif - -#include -#include -#include - -namespace cxx17 -{ - -#if !defined(REALLY_CLANG) - namespace test_constexpr_lambdas - { - - // TODO: test it with clang++ from git - - constexpr int foo = [](){return 42;}(); - - } -#endif // !defined(REALLY_CLANG) - - namespace test::nested_namespace::definitions - { - - } - - namespace test_fold_expression - { - - template - int multiply(Args... args) - { - return (args * ... * 1); - } - - template - bool all(Args... args) - { - return (args && ...); - } - - } - - namespace test_extended_static_assert - { - - static_assert (true); - - } - - namespace test_auto_brace_init_list - { - - auto foo = {5}; - auto bar {5}; - - static_assert(std::is_same, decltype(foo)>::value); - static_assert(std::is_same::value); - } - - namespace test_typename_in_template_template_parameter - { - - template typename X> struct D; - - } - - namespace test_fallthrough_nodiscard_maybe_unused_attributes - { - - int f1() - { - return 42; - } - - [[nodiscard]] int f2() - { - [[maybe_unused]] auto unused = f1(); - - switch (f1()) - { - case 17: - f1(); - [[fallthrough]]; - case 42: - f1(); - } - return f1(); - } - - } - - namespace test_extended_aggregate_initialization - { - - struct base1 - { - int b1, b2 = 42; - }; - - struct base2 - { - base2() { - b3 = 42; - } - int b3; - }; - - struct derived : base1, base2 - { - int d; - }; - - derived d1 {{1, 2}, {}, 4}; // full initialization - derived d2 {{}, {}, 4}; // value-initialized bases - - } - - namespace test_general_range_based_for_loop - { - - struct iter - { - int i; - - int& operator* () - { - return i; - } - - const int& operator* () const - { - return i; - } - - iter& operator++() - { - ++i; - return *this; - } - }; - - struct sentinel - { - int i; - }; - - bool operator== (const iter& i, const sentinel& s) - { - return i.i == s.i; - } - - bool operator!= (const iter& i, const sentinel& s) - { - return !(i == s); - } - - struct range - { - iter begin() const - { - return {0}; - } - - sentinel end() const - { - return {5}; - } - }; - - void f() - { - range r {}; - - for (auto i : r) - { - [[maybe_unused]] auto v = i; - } - } - - } - - namespace test_lambda_capture_asterisk_this_by_value - { - - struct t - { - int i; - int foo() - { - return [*this]() - { - return i; - }(); - } - }; - - } - - namespace test_enum_class_construction - { - - enum class byte : unsigned char - {}; - - byte foo {42}; - - } - - namespace test_constexpr_if - { - - template - int f () - { - if constexpr(cond) - { - return 13; - } - else - { - return 42; - } - } - - } - - namespace test_selection_statement_with_initializer - { - - int f() - { - return 13; - } - - int f2() - { - if (auto i = f(); i > 0) - { - return 3; - } - - switch (auto i = f(); i + 4) - { - case 17: - return 2; - - default: - return 1; - } - } - - } - -#if !defined(REALLY_CLANG) - namespace test_template_argument_deduction_for_class_templates - { - - // TODO: test it with clang++ from git - - template - struct pair - { - pair (T1 p1, T2 p2) - : m1 {p1}, - m2 {p2} - {} - - T1 m1; - T2 m2; - }; - - void f() - { - [[maybe_unused]] auto p = pair{13, 42u}; - } - - } -#endif // !defined(REALLY_CLANG) - - namespace test_non_type_auto_template_parameters - { - - template - struct B - {}; - - B<5> b1; - B<'a'> b2; - - } - -#if !defined(REALLY_CLANG) - namespace test_structured_bindings - { - - // TODO: test it with clang++ from git - - int arr[2] = { 1, 2 }; - std::pair pr = { 1, 2 }; - - auto f1() -> int(&)[2] - { - return arr; - } - - auto f2() -> std::pair& - { - return pr; - } - - struct S - { - int x1 : 2; - volatile double y1; - }; - - S f3() - { - return {}; - } - - auto [ x1, y1 ] = f1(); - auto& [ xr1, yr1 ] = f1(); - auto [ x2, y2 ] = f2(); - auto& [ xr2, yr2 ] = f2(); - const auto [ x3, y3 ] = f3(); - - } -#endif // !defined(REALLY_CLANG) - -#if !defined(REALLY_CLANG) - namespace test_exception_spec_type_system - { - - // TODO: test it with clang++ from git - - struct Good {}; - struct Bad {}; - - void g1() noexcept; - void g2(); - - template - Bad - f(T*, T*); - - template - Good - f(T1*, T2*); - - static_assert (std::is_same_v); - - } -#endif // !defined(REALLY_CLANG) - - namespace test_inline_variables - { - - template void f(T) - {} - - template inline T g(T) - { - return T{}; - } - - template<> inline void f<>(int) - {} - - template<> int g<>(int) - { - return 5; - } - - } - -} // namespace cxx17 - -#endif // __cplusplus <= 201402L - -]]) \ No newline at end of file diff --git a/config/copyright_header b/config/copyright_header deleted file mode 100644 index 5480f32f1af..00000000000 --- a/config/copyright_header +++ /dev/null @@ -1,32 +0,0 @@ -/* - This file is part of MADNESS. - - Copyright (C) 2007,2010 Oak Ridge National Laboratory - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For more information please contact: - - Robert J. Harrison - Oak Ridge National Laboratory - One Bethel Valley Road - P.O. Box 2008, MS-6367 - - email: harrisonrj@ornl.gov - tel: 865-241-3937 - fax: 865-572-0680 - - $Id$ -*/ diff --git a/config/insert_headers b/config/insert_headers deleted file mode 100755 index 1f13d40ce70..00000000000 --- a/config/insert_headers +++ /dev/null @@ -1,20 +0,0 @@ - - -# This script goes thru all source files (*.h and *.cc only) in the -# MADNESS tree nominally owned by the project and ensures that the -# copyright header is installed - -# It must be run from the top of the madness tree (trunk directory) - -for file in `find . \( -name "*.h" -o -name "*.cc" \) -exec grep -L "This file is part of MADNESS" {} ";" | grep -v muParser | grep -v tinyxml | grep -v cfft | grep -v madness_config.h | grep -v mainpage.h` -do - echo "Processing $file" - cp $file $file.bak - cat config/copyright_header > fredfred - cat $file >> fredfred - mv fredfred $file -done - - - - diff --git a/input b/input deleted file mode 100644 index e8f8b914d31..00000000000 --- a/input +++ /dev/null @@ -1,22 +0,0 @@ -dft - xc hf - econv 1.e-5 - dconv 1.e-4 -end - -cc2 - thresh 3D 1.e-4 - tda econv hard 1.e-4 - tda dconv hard 1.e-3 - tda guess dipole+ -end - -geometry - he 0.0 0.0 0.0 -end - -plot - plane x1 x2 - origin 0.0 0.0 0.0 - zoom 1.0 -end From 2125df46d4366ee71559375bc3abbe45c38f456d Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sat, 13 Aug 2022 16:41:08 -0400 Subject: [PATCH 0209/1312] fix detection of MKL for default Ubuntu install --- cmake/modules/FindMKL.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/FindMKL.cmake b/cmake/modules/FindMKL.cmake index eb66727ae78..5d9a597d125 100644 --- a/cmake/modules/FindMKL.cmake +++ b/cmake/modules/FindMKL.cmake @@ -53,7 +53,7 @@ if(NOT MKL_FOUND) # Search for MKL header files find_path(MKL_INCLUDE_DIRS mkl.h - HINTS ${MKL_INCLUDE_DIR}) + HINTS ${MKL_INCLUDE_DIR} /usr/include/mkl) # Get MKL version if(MKL_INCLUDE_DIRS) From 3adabb83daf8ec8babd2f310bc455e84c16fe461 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Mon, 15 Aug 2022 11:14:37 -0400 Subject: [PATCH 0210/1312] misc cleanup of world id handling - increased range of world ids allocated per rank to 2^32 + added id range checking - optimized World::{world_from_id,exists,find_instance} for the most common case of world==default_world - madness::initialize does not call srand() or cpu_frequency() --- src/madness/world/world.cc | 45 ++++++++++++++++++------------------ src/madness/world/world.h | 45 +++++++++++++++++++++++++----------- src/madness/world/worldam.h | 4 ++-- src/madness/world/worldmpi.h | 2 +- 4 files changed, 57 insertions(+), 39 deletions(-) diff --git a/src/madness/world/world.cc b/src/madness/world/world.cc index af60a4acf2b..0010613804b 100644 --- a/src/madness/world/world.cc +++ b/src/madness/world/world.cc @@ -67,9 +67,9 @@ namespace madness { } // namespace // World static member variables - std::list World::worlds; ///< List of \c World pointers in the parallel runtime. + std::list World::worlds; ///< List of \c World pointers in the parallel runtime EXCEPT the default World World* World::default_world = nullptr; ///< The default \c World. - unsigned long World::idbase = 0; ///< \todo Verify: Base unique ID for objects in the runtime. + std::pair World::world_id__next_last{}; bool initialized() { return madness_initialized_; @@ -87,32 +87,17 @@ namespace madness { , gop(* (new WorldGopInterface(*this))) , myrand_next(0) { - worlds.push_back(this); - srand(); // Initialize random number generator - cpu_frequency(); - - // Assign a globally (within COMM_WORLD) unique ID to this - // world by assigning to each processor a unique range of indices - // and broadcasting from node 0 of the current communicator. - // Each process in COMM_WORLD is given unique ids for 10K new worlds - if(idbase == 0 && rank()) { - idbase = rank()*10000; - } - // The id of a new world is taken from the unique range of ids - // assigned to the process with rank=0 in the sub-communicator if(rank() == 0) { - _id = idbase++; + _id = next_world_id(); } + // Use MPI for broadcast as incoming messages may try to access an // uninitialized world. mpi.Bcast(_id, 0); -// gop.broadcast(_id); -// gop.barrier(); am.worldid = _id; - //std::cout << "JUST MADE WORLD " << id() << " with " - // << comm.Get_size() << " members (I am # " - // << comm.Get_rank() << ")"<< std::endl; + if (_id != 0) + worlds.push_back(this); } @@ -129,13 +114,24 @@ namespace madness { // stray WorldObjects are allowed as long as they outlive madness::finalize() :( // MADNESS_ASSERT_NOEXCEPT(map_ptr_to_id.size() == 0); // MADNESS_ASSERT_NOEXCEPT(map_id_to_ptr.size() == 0); - worlds.remove(this); + if (this->_id != 0) worlds.remove(this); delete &taskq; delete &gop; delete &am; delete &mpi; } + void World::initialize_world_id_range(int global_rank) { + constexpr std::uint64_t range_size = 1ul<<32; + constexpr std::uint64_t range_size_minus_1 = 1ul<<32 - 1; + world_id__next_last = std::make_pair(global_rank * range_size, global_rank * range_size + range_size_minus_1); + } + + std::uint64_t World::next_world_id() { + MADNESS_ASSERT(world_id__next_last.first != world_id__next_last.second); + return world_id__next_last.first++; + } + void error(const char *msg) { std::cerr << "MADNESS: fatal error: " << msg << std::endl; SafeMPI::COMM_WORLD.Abort(1); @@ -206,6 +202,11 @@ namespace madness { #endif detail::WorldMpi::initialize(argc, argv, MADNESS_MPI_THREAD_LEVEL); + // Assign a range of globally (within COMM_WORLD) unique IDs to each + // rank, these will be used to assign globally unique ID to a new World + // requiring only communication within its (sub)communicator + World::initialize_world_id_range(comm.Get_rank()); + // Construct the default world before starting RMI so that incoming active messages can find this world World::default_world = new World(comm); diff --git a/src/madness/world/world.h b/src/madness/world/world.h index cfd1e9fec39..2a61e8edda2 100644 --- a/src/madness/world/world.h +++ b/src/madness/world/world.h @@ -56,9 +56,10 @@ // Standard C++ header files needed by MADworld.h #include -#include -#include +#include // std::list +#include // std::pair #include +#include // std::uint64_t #ifdef HAVE_RANDOM #include @@ -135,9 +136,9 @@ namespace madness { friend void finalize(); // Static member variables - static unsigned long idbase; ///< Base for unique world ID range for this process. + static std::pair world_id__next_last; ///< Unique {next, last} world IDs to be used by this rank. static World* default_world; ///< Default world. - static std::list worlds; ///< Maintains list of active worlds. + static std::list worlds; ///< Maintains list of active worlds, EXCLUDES default_world /// \todo Brief description needed. struct hashuniqueT { @@ -172,13 +173,19 @@ namespace madness { map_ptr_to_idT map_ptr_to_id; ///< \todo Verify: Map from a pointer to its unique hash ID. - unsigned long _id; ///< Universe wide unique ID of this world. + std::uint64_t _id; ///< Universe wide unique ID of this world. unsigned long obj_id; ///< Counter for generating unique IDs within this world. void* user_state; ///< Holds a user-defined and managed local state. // Default copy constructor and assignment won't compile // (which is good) due to reference members. + /// initializes the value of world_id__next_last to {global_rank*2^32, (global_rank+1)*2^32-1} + /// \param global_rank rank of this process in COMM_WORLD + static void initialize_world_id_range(int global_rank); + /// \return next unique World id + static std::uint64_t next_world_id(); + public: // !!! Order of declaration is important for correct order of initialization !!! WorldMpiInterface& mpi; ///< MPI interface. @@ -204,12 +211,16 @@ namespace madness { /// \return Pointer to the World that was constructed from \c comm; /// if such a World does not exist, return 0. static World* find_instance(const SafeMPI::Intracomm& comm) { - typedef std::list::const_iterator citer; - for(citer it = worlds.begin(); it != worlds.end(); ++it) { - if ((*it)->mpi.comm() == comm) - return *it; + if (default_world->mpi.comm() == comm) + return default_world; + else { + typedef std::list::const_iterator citer; + for (citer it = worlds.begin(); it != worlds.end(); ++it) { + if ((*it)->mpi.comm() == comm) + return *it; } - return 0; + return nullptr; + } } /// Check if the World exists in the registry. @@ -217,7 +228,7 @@ namespace madness { /// \param[in] world pointer to a World object /// \return true if \c world exists static bool exists(World* world) { - return std::find(worlds.begin(), worlds.end(), world) != worlds.end(); + return world->id() == 0 || std::find(worlds.begin(), worlds.end(), world) != worlds.end(); } /// Default World object accessor. @@ -427,11 +438,17 @@ namespace madness { /// not include the calling process. /// \param[in] id The ID of the \c World. /// \return A pointer to the world associated with \c id, or \c NULL. - static World* world_from_id(unsigned long id) { - for (std::list::iterator it=worlds.begin(); it != worlds.end(); ++it) { - if ((*it) && (*it)->_id == id) return *it; + static World* world_from_id(std::uint64_t id) { + if (id != 0) { + for (std::list::iterator it = worlds.begin(); + it != worlds.end(); ++it) { + if ((*it) && (*it)->_id == id) + return *it; } return nullptr; + } + else + return default_world; } private: diff --git a/src/madness/world/worldam.h b/src/madness/world/worldam.h index a6c6bce1be0..54938632345 100644 --- a/src/madness/world/worldam.h +++ b/src/madness/world/worldam.h @@ -86,7 +86,7 @@ namespace madness { unsigned char header[RMI::HEADER_LEN]; // !!!!!!!!! MUST BE FIRST !!!!!!!!!! std::size_t nbyte; // Size of user payload - unsigned long worldid; // Id of associated world + std::uint64_t worldid; // Id of associated world std::ptrdiff_t func; // User function to call, as a relative fn ptr (see archive::to_rel_fn_ptr) ProcessID src; // Rank of process sending the message unsigned int flags; // Misc. bit flags @@ -154,7 +154,7 @@ namespace madness { World* get_world() const { return World::world_from_id(worldid); } /// Return the world id - unsigned long get_worldid() const { return worldid; } + std::uint64_t get_worldid() const { return worldid; } }; diff --git a/src/madness/world/worldmpi.h b/src/madness/world/worldmpi.h index 271aef58893..71361d8868d 100644 --- a/src/madness/world/worldmpi.h +++ b/src/madness/world/worldmpi.h @@ -430,7 +430,7 @@ namespace madness { template typename std::enable_if::value, void>::type Bcast(T& buffer, int root) const { - SafeMPI::Intracomm::Bcast(&buffer, sizeof(T), MPI_BYTE,root); + SafeMPI::Intracomm::Bcast(&buffer, sizeof(T), MPI_BYTE, root); } /// Access the rank of this process. From c0df7338779d06df7eaff31644d508940a7cfd90 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 16 Aug 2022 15:09:37 -0400 Subject: [PATCH 0211/1312] World ctor calls MPI_Barrier, unless fence=false (this changes the current behavior), to prevent ranks exiting until new world is in the registry everywhere --- src/madness/world/world.cc | 6 +++++- src/madness/world/world.h | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/madness/world/world.cc b/src/madness/world/world.cc index 0010613804b..349cf22764e 100644 --- a/src/madness/world/world.cc +++ b/src/madness/world/world.cc @@ -78,7 +78,8 @@ namespace madness { return madness_quiet_; } - World::World(const SafeMPI::Intracomm& comm) + World::World(const SafeMPI::Intracomm& comm, + bool fence) : obj_id(1) ///< start from 1 so that 0 is an invalid id , user_state(0) , mpi(*(new WorldMpiInterface(comm))) @@ -98,6 +99,9 @@ namespace madness { if (_id != 0) worlds.push_back(this); + + if (fence) + mpi.Barrier(); } diff --git a/src/madness/world/world.h b/src/madness/world/world.h index 2a61e8edda2..f6a1e97bfbb 100644 --- a/src/madness/world/world.h +++ b/src/madness/world/world.h @@ -203,7 +203,13 @@ namespace madness { /// the same communicator. Use instance() to check this. /// /// \param[in] comm The communicator. - World(const SafeMPI::Intracomm& comm); + /// \param[in] fence if true, will synchronize ranks before exiting; + /// setting to false removes the extra synchronization + /// but may cause premature arrival of RMI messages + /// that refer to this world while it's being + /// registered + World(const SafeMPI::Intracomm& comm, + bool fence = true); /// Find the World (if it exists) corresponding to the given communicator. From 57326a82feeb150229884fc538ca27ee3b470025 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Wed, 17 Aug 2022 20:31:51 -0400 Subject: [PATCH 0212/1312] Update INSTALL.md --- INSTALL.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/INSTALL.md b/INSTALL.md index 57106afc806..5616d0352ad 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -20,10 +20,18 @@ make install Boolean values for cache variables (specified to CMake using the `-DVARIABLE_NAME` notation in the example above) are considered true if the constant is 1, ON, YES, TRUE, Y, or a non-zero number; or false if the constant is 0, OFF, NO, FALSE, N, or IGNORE. +## Warning about fast memory allocators + +Summary: Only use fast memory allocators if you are using just 1 MPI process or have configured without MPI. + +Depending on the calculation and the number of threads being used, MADNESS can receive about a 10% or even more speedup from fast memory allocators such as tcmalloc, jemalloc, tbbmalloc, etc. However, these **do not work with MPI over InfiniBand** and probably most other transport layers. It can appear to work, and then fail with either wrong numbers or MPI errors. The reason is that IB requires that memory be pinned and hence MPI introduces its own memory allocator(s) to manage this. By overriding the allocator, you will break the guarantee that memory is pinned. + ## Prerequisites Fast BLAS and linear algebra libraries are essential. These must be sequential (single thread) implementations since MADNESS uses tasks/threads for parallelism and invokes the BLAS within a single-threaded task. On X86, we recommend the free [Intel MKL library](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html#gs.8bsxug), which is auto detected on all platforms if the environment variable `MKLROOT` is set. On MacOS, the Apple [Accelerate](https://developer.apple.com/documentation/accelerate) framework (installed as part of [Xcode](https://developer.apple.com/xcode/)) is also autodetected. AMD ACML has not been tested in a while but can be enabled with the CMake variables below. Other libraries need to have their link (and possibly also header) paths and flags provided in the CMake variables for the compiler and linker. On ARM, we recommend the ARM performance library available with their optimized LLVM compiler and enabled with the `-armpl`` compiler+linker flag. The OpenBLAS libary for ARM (not on x86) had a major peformance problem when we last tested it in circa 2020 due to a mutex around a memory block shared by all threads (this issue was reported and might be fixed by now). +An MPI library is required by default, and should be autodected primarily by looking for the `mpicxx` command to compile C++ code with MPI. If you wish to overide this, use the appropriate cmake or environment variables (below). You can also disable use of MPI using `-DENABLE_MPI=OFF` --- in this case you can still use all cores within a shared memory computer. + MADNESS will autodetect the [Intel TBB library](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.html#gs.8byhgg), which is available for free from Intel or via standard Linux package managers (even on ARM). TBB provides a fast task pool. If this is not detected, MADNESS will employ its own task pool. [PaRSEC](https://icl.utk.edu/parsec/) can also be used (see variables below) but is not recommended unless you are using MADNESS with the [Template Task Graph](https://github.com/TESSEorg/ttg). The below summarizes some of the most useful CMake variables. From 432f158e2e32c8f9bbf9996d9758fd0676a6f515 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 18 Aug 2022 13:03:15 -0400 Subject: [PATCH 0213/1312] dox cleanup --- src/madness/world/future.h | 12 ++++++------ src/madness/world/worldref.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/madness/world/future.h b/src/madness/world/future.h index 1ff3bd616db..eabb6ca6199 100644 --- a/src/madness/world/future.h +++ b/src/madness/world/future.h @@ -650,19 +650,19 @@ namespace madness { } - /// \todo Brief description needed. + /// Checks the future remoteness trait - /// \todo Description needed. - /// \return Description needed. + /// \return true if the future refers to an already available or + /// to-be-locally-produced result inline bool is_local() const { return (f && f->is_local()) || value; } - /// \todo Brief description needed. + /// Checks the future remoteness trait - /// \todo Description needed. - /// \return Description needed. + /// \return true if the future refers to another future on a another rank, i.e. it will be set when the + /// referred-to future is set inline bool is_remote() const { return !is_local(); } diff --git a/src/madness/world/worldref.h b/src/madness/world/worldref.h index 4a31bf8c7d2..aa22ba9bd09 100644 --- a/src/madness/world/worldref.h +++ b/src/madness/world/worldref.h @@ -384,7 +384,7 @@ namespace madness { /// This class was intended only for internal use and is still rather /// poorly thought through, however, it seems to fill a wider need. /// \note Do not serialize via wrap_opaque(). - /// \note Ownership of a reference is transfered when serialized on a remote + /// \note Ownership of a reference is transferred when serialized on a remote /// node. You should not attempt to send a remote reference to more than one /// node except from the owning node. If you do serialize more than once, /// this will cause an invalid memory access on the owning node. From 66b199a08bf5f33b1565811fc202a051ec1b0fbb Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 18 Aug 2022 13:04:22 -0400 Subject: [PATCH 0214/1312] amended 3adabb83daf8ec8babd2f310bc455e84c16fe461 --- src/madness/world/world.cc | 2 +- src/madness/world/world.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/madness/world/world.cc b/src/madness/world/world.cc index 349cf22764e..5d0a9c038c3 100644 --- a/src/madness/world/world.cc +++ b/src/madness/world/world.cc @@ -127,7 +127,7 @@ namespace madness { void World::initialize_world_id_range(int global_rank) { constexpr std::uint64_t range_size = 1ul<<32; - constexpr std::uint64_t range_size_minus_1 = 1ul<<32 - 1; + constexpr std::uint64_t range_size_minus_1 = (1ul<<32) - 1; world_id__next_last = std::make_pair(global_rank * range_size, global_rank * range_size + range_size_minus_1); } diff --git a/src/madness/world/world.h b/src/madness/world/world.h index f6a1e97bfbb..3d380d2dacb 100644 --- a/src/madness/world/world.h +++ b/src/madness/world/world.h @@ -234,7 +234,7 @@ namespace madness { /// \param[in] world pointer to a World object /// \return true if \c world exists static bool exists(World* world) { - return world->id() == 0 || std::find(worlds.begin(), worlds.end(), world) != worlds.end(); + return world == default_world || std::find(worlds.begin(), worlds.end(), world) != worlds.end(); } /// Default World object accessor. From c4ace2ee835b06f0119e1b9ad0bf548e880d8762 Mon Sep 17 00:00:00 2001 From: hborchert <94846710+hborchert@users.noreply.github.com> Date: Mon, 29 Aug 2022 10:10:17 -0400 Subject: [PATCH 0215/1312] Fixed GGA bug in SCFOperators.cc and removed derivative choices --- src/madness/chem/CalculationParameters.h | 4 ---- src/madness/chem/SCF.cc | 2 +- src/madness/chem/SCF.h | 7 ------- src/madness/chem/SCFOperators.cc | 20 ++++++++------------ src/madness/chem/SCFOperators.h | 10 +++------- src/madness/chem/oep.h | 5 +---- 6 files changed, 13 insertions(+), 35 deletions(-) diff --git a/src/madness/chem/CalculationParameters.h b/src/madness/chem/CalculationParameters.h index 6467f87caee..3886a0728a1 100644 --- a/src/madness/chem/CalculationParameters.h +++ b/src/madness/chem/CalculationParameters.h @@ -70,8 +70,6 @@ struct CalculationParameters : public QCCalculationParametersBase { initialize >("convergence_criteria",{"bsh_residual","total_energy"},"possible values are: bsh_residual, total_energy, each_energy, density"); initialize ("k",-1,"polynomial order"); initialize("l",20,"user coordinates box size"); - initialize("deriv","abgv","derivative method",{"abgv","bspline","ble"}); - initialize("dft_deriv","abgv","derivative method for gga potentials",{"abgv","bspline","ble"}); initialize("maxrotn",0.25,"step restriction used in autoshift algorithm"); initialize ("nvalpha",0,"number of alpha virtuals to compute"); initialize ("nvbeta",0,"number of beta virtuals to compute"); @@ -190,8 +188,6 @@ struct CalculationParameters : public QCCalculationParametersBase { int maxiter() const {return get("maxiter");} double orbitalshift() const {return get("orbitalshift");} - std::string deriv() const {return get("deriv");} - std::string dft_deriv() const {return get("dft_deriv");} std::string pcm_data() const {return get("pcm_data");} std::string ac_data() const {return get("ac_data");} std::string xc() const {return get("xc");} diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 9963627cee0..77594063a18 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -1224,7 +1224,7 @@ vecfuncT SCF::apply_potential(World& world, const tensorT& occ, if (xc.is_dft() && !(xc.hf_exchange_coefficient() == 1.0)) { START_TIMER(world); - XCOperator xcoperator(world, this, ispin, param.dft_deriv()); + XCOperator xcoperator(world, this, ispin); if (ispin == 0) exc = xcoperator.compute_xc_energy(); vloc += xcoperator.make_xc_potential(); diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 7dc570b8cfb..487076c85ae 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -275,13 +275,6 @@ class SCF { coulop = poperatorT(CoulombOperatorPtr(world, param.lo(), thresh)); gradop = gradient_operator(world); - // Update coefficients if using a different derivative - if (param.deriv() == "bspline") { - for (int i = 0; i < 3; ++i) (*gradop[i]).set_bspline1(); - } else if (param.deriv() == "ble") { - for (int i = 0; i < 3; ++i) (*gradop[i]).set_ble1(); - } - mask = functionT(factoryT(world).f(mask3).initial_level(4).norefine()); if (world.rank() == 0 and param.print_level() > 1) { print("\nSolving NDIM=", NDIM, " with thresh", thresh, " k", diff --git a/src/madness/chem/SCFOperators.cc b/src/madness/chem/SCFOperators.cc index 8cfd61cfd31..a90d1a5e433 100644 --- a/src/madness/chem/SCFOperators.cc +++ b/src/madness/chem/SCFOperators.cc @@ -345,8 +345,8 @@ std::vector> DNuclear::operator()(const std::vector XCOperator::XCOperator(World &world, std::string xc_data, const bool spin_polarized, - const real_function_3d &arho, const real_function_3d &brho, std::string deriv) - : world(world), dft_deriv(deriv), nbeta(0), ispin(0), + const real_function_3d &arho, const real_function_3d &brho) + : world(world), nbeta(0), ispin(0), extra_truncation(FunctionDefaults<3>::get_thresh() * 0.01) { nbeta = (brho.norm2() > 0.0); // does this make sense @@ -358,8 +358,8 @@ XCOperator::XCOperator(World &world, std::string xc_data, const bool sp } template -XCOperator::XCOperator(World &world, const SCF *calc, int ispin, std::string deriv) - : world(world), dft_deriv(deriv), ispin(ispin), extra_truncation(FunctionDefaults<3>::get_thresh() * 0.01) { +XCOperator::XCOperator(World &world, const SCF *calc, int ispin) + : world(world), ispin(ispin), extra_truncation(FunctionDefaults<3>::get_thresh() * 0.01) { xc = std::shared_ptr(new XCfunctional()); xc->initialize(calc->param.xc(), !calc->param.spin_restricted(), world); nbeta = calc->param.nbeta(); @@ -405,8 +405,8 @@ XCOperator::XCOperator(World &world, const Nemo *nemo, int ispin) template XCOperator::XCOperator(World &world, const SCF *calc, const real_function_3d &arho, - const real_function_3d &brho, int ispin, std::string deriv) - : world(world), dft_deriv(deriv), nbeta(calc->param.nbeta()), ispin(ispin), + const real_function_3d &brho, int ispin) + : world(world), nbeta(calc->param.nbeta()), ispin(ispin), extra_truncation(FunctionDefaults<3>::get_thresh() * 0.01) { xc = std::shared_ptr(new XCfunctional()); xc->initialize(calc->param.xc(), !calc->param.spin_restricted(), world); @@ -580,9 +580,7 @@ vecfuncT XCOperator::prep_xc_args(const real_function_3d &arho, real_function_3d logdensa = unary_op(arho, logme()); vecfuncT grada; - if (dft_deriv == "bspline") grada = grad_bspline_one(logdensa); // b-spline - else if (dft_deriv == "ble") grada = grad_ble_one(logdensa); // BLE - else grada = grad(logdensa); // Default is abgv + grada = grad(logdensa); // Default is abgv real_function_3d chi = dot(world, grada, grada); xcargs[XCfunctional::enum_chi_aa] = chi; xcargs[XCfunctional::enum_zetaa_x] = grada[0]; @@ -593,9 +591,7 @@ vecfuncT XCOperator::prep_xc_args(const real_function_3d &arho, real_function_3d logdensb = unary_op(brho, logme()); // Bryan's edits for derivatives vecfuncT gradb; - if (dft_deriv == "bspline") gradb = grad_bspline_one(logdensa); // b-spline - else if (dft_deriv == "ble") gradb = grad_ble_one(logdensa); // BLE - else gradb = grad(logdensa); // Default is abgv + gradb = grad(logdensb); // Default is abgv real_function_3d chib = dot(world, gradb, gradb); real_function_3d chiab = dot(world, grada, gradb); xcargs[XCfunctional::enum_zetab_x] = gradb[0]; diff --git a/src/madness/chem/SCFOperators.h b/src/madness/chem/SCFOperators.h index 8d3d2fef1db..fbe1c544726 100644 --- a/src/madness/chem/SCFOperators.h +++ b/src/madness/chem/SCFOperators.h @@ -635,18 +635,17 @@ class XCOperator : public SCFOperatorBase { /// custom ctor with information about the XC functional XCOperator(World& world, std::string xc_data, const bool spin_polarized, - const real_function_3d& arho, const real_function_3d& brho, - std::string deriv="abgv"); + const real_function_3d& arho, const real_function_3d& brho); /// ctor with an SCF calculation, will initialize the necessary intermediates - XCOperator(World& world, const SCF* scf, int ispin=0, std::string deriv="abgv"); + XCOperator(World& world, const SCF* scf, int ispin=0); /// ctor with a Nemo calculation, will initialize the necessary intermediates XCOperator(World& world, const Nemo* nemo, int ispin=0); /// ctor with an SCF calculation, will initialize the necessary intermediates XCOperator(World& world, const SCF* scf, const real_function_3d& arho, - const real_function_3d& brho, int ispin=0, std::string deriv="abgv"); + const real_function_3d& brho, int ispin=0); /// ctor with an Nemo calculation, will initialize the necessary intermediates XCOperator(World& world, const Nemo* scf, const real_function_3d& arho, @@ -701,9 +700,6 @@ class XCOperator : public SCFOperatorBase { /// the world World& world; - /// which derivative operator to use - std::string dft_deriv; - public: /// interface to the actual XC functionals std::shared_ptr xc; diff --git a/src/madness/chem/oep.h b/src/madness/chem/oep.h index 6fed44e5d62..08087265fb7 100644 --- a/src/madness/chem/oep.h +++ b/src/madness/chem/oep.h @@ -333,7 +333,6 @@ class OEP : public Nemo { for (int idim=0; idim<3; ++idim) { real_derivative_3d D(world,idim); - if(param.dft_deriv() == "bspline") D.set_bspline1(); vecfuncT nemo_copy=copy(world,nemo); refine(world,nemo_copy); std::vector dnemo=apply(world,D,nemo_copy); @@ -358,9 +357,7 @@ class OEP : public Nemo { for (long i = 0; i < nemo.size(); i++) { vecfuncT nemo_copy=copy(world,nemo); refine(world,nemo_copy); - - if(param.dft_deriv() == "bspline") grad_nemo[i] = grad_bspline_one(nemo_copy[i]); // gradient using b-spline - else grad_nemo[i] = grad(nemo_copy[i]); // default gradient using abgv + grad_nemo[i] = grad(nemo_copy[i]); // default gradient using abgv } vecfuncT grad_nemo_term; From 98515a558ea1fe633934b83eb4d6c5b0a9ebaaed Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 30 Aug 2022 10:18:57 -0400 Subject: [PATCH 0216/1312] default build should be release; seems to respect cached value so rebuild of debug build does work correctly --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f1f268f03c..d31cb606f3c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,9 @@ cmake_minimum_required (VERSION 3.11.0) +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif() + # safety net for dev workflow: accidental install will not affect FindOrFetch* if (NOT DEFINED CACHE{CMAKE_FIND_NO_INSTALL_PREFIX}) set(CMAKE_FIND_NO_INSTALL_PREFIX ON CACHE BOOL "Whether find_* commands will search CMAKE_INSTALL_PREFIX and CMAKE_STAGING_PREFIX; see https://cmake.org/cmake/help/latest/variable/CMAKE_FIND_NO_INSTALL_PREFIX.html#variable:CMAKE_FIND_NO_INSTALL_PREFIX") From 21e9770a001f6d68dac8fc1434d8e2f65bdf6e2c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 31 Aug 2022 16:02:15 -0400 Subject: [PATCH 0217/1312] molresponse testing --- src/apps/molresponse/testing/CMakeLists.txt | 27 +- .../molresponse/testing/database_testing.cpp | 194 +++++ .../testing/excited_state_calc.cpp | 66 ++ .../molresponse/testing/frequency_calc.cpp | 61 ++ .../molresponse/testing/full_excited_test.cpp | 103 +++ .../testing/full_frequency_test.cpp | 82 ++ .../molresponse/testing/full_ground_test.cpp | 81 ++ .../testing/generate_excited_data.cpp | 69 ++ .../testing/generate_frequency_answers.cpp | 108 +++ .../testing/generate_frequency_data.cpp | 71 ++ .../testing/mad-excited-symmetry-adapted.cpp | 127 +++ src/apps/molresponse/testing/mad-excited.cpp | 90 ++ src/apps/molresponse/testing/mad-freq.cpp | 88 ++ .../molresponse/testing/madness_catch_main.cc | 4 +- .../testing/madness_catch_main_init.cc | 63 ++ .../testing/qcschema_json_testing.cpp | 2 +- .../testing/response_data_base.cpp | 5 + .../testing/response_data_base.hpp | 171 ++++ src/apps/molresponse/testing/runners.hpp | 809 ++++++++++++++++++ .../testing/test_density_vector.cpp | 49 -- .../molresponse/testing/test_development.cpp | 64 ++ .../testing/test_response_functions.cpp | 34 - .../testing/test_response_parameters.cpp | 34 - .../molresponse/testing/write_test_input.h | 101 +++ src/madness/tensor/tensor_json.hpp | 141 +-- 25 files changed, 2455 insertions(+), 189 deletions(-) create mode 100644 src/apps/molresponse/testing/database_testing.cpp create mode 100644 src/apps/molresponse/testing/excited_state_calc.cpp create mode 100644 src/apps/molresponse/testing/frequency_calc.cpp create mode 100644 src/apps/molresponse/testing/full_excited_test.cpp create mode 100644 src/apps/molresponse/testing/full_frequency_test.cpp create mode 100644 src/apps/molresponse/testing/full_ground_test.cpp create mode 100644 src/apps/molresponse/testing/generate_excited_data.cpp create mode 100644 src/apps/molresponse/testing/generate_frequency_answers.cpp create mode 100644 src/apps/molresponse/testing/generate_frequency_data.cpp create mode 100644 src/apps/molresponse/testing/mad-excited-symmetry-adapted.cpp create mode 100644 src/apps/molresponse/testing/mad-excited.cpp create mode 100644 src/apps/molresponse/testing/mad-freq.cpp create mode 100644 src/apps/molresponse/testing/madness_catch_main_init.cc create mode 100644 src/apps/molresponse/testing/response_data_base.cpp create mode 100644 src/apps/molresponse/testing/response_data_base.hpp create mode 100644 src/apps/molresponse/testing/runners.hpp delete mode 100644 src/apps/molresponse/testing/test_density_vector.cpp create mode 100644 src/apps/molresponse/testing/test_development.cpp delete mode 100644 src/apps/molresponse/testing/test_response_functions.cpp delete mode 100644 src/apps/molresponse/testing/test_response_parameters.cpp create mode 100644 src/apps/molresponse/testing/write_test_input.h diff --git a/src/apps/molresponse/testing/CMakeLists.txt b/src/apps/molresponse/testing/CMakeLists.txt index cc5c0ecd761..1e9f4cdd3f5 100644 --- a/src/apps/molresponse/testing/CMakeLists.txt +++ b/src/apps/molresponse/testing/CMakeLists.txt @@ -1,6 +1,27 @@ +# src/apps/molresponse/testing + add_mad_executable(test_schema_json "madness_catch_main.cc;qcschema_json_testing.cpp" "MADresponse;MADchem" ,) -add_mad_executable(test_response_parameters "madness_catch_main.cc;test_response_parameters.cpp" "MADresponse;MADchem") -add_mad_executable(test_response_functions "madness_catch_main.cc;test_response_functions.cpp" "MADresponse;MADchem") -add_mad_executable(test_density_vector "madness_catch_main.cc;test_density_vector.cpp;../ResponseBase.cpp;../densityVector.cpp;../global_functions.cc;../response_parameters.cpp;../timer.cc;../basic_operators.cc;../Plot_VTK.cc;../property.cc;" "MADchem") +# Uses [mol] [xc] [operator] as input +add_mad_executable(mad-freq "mad-freq.cpp" "MADall_response;MADchem") +add_mad_executable(mad-excited "mad-excited.cpp" "MADall_response;MADchem") +add_mad_executable(mad-excited-symmetry-adapted "mad-excited-symmetry-adapted.cpp" "MADall_response;MADchem") + + +# Uses "response.in" file as input +add_mad_executable(frequency_calc "frequency_calc.cpp" "MADall_response;MADchem") +add_mad_executable(excited_calc "excited_state_calc.cpp" "MADall_response;MADchem") + +# Uses [xc] [operator] to create the full test suite +add_mad_executable(full_frequency_tests "full_frequency_test.cpp" "MADall_response;MADchem") +add_mad_executable(full_excited_tests "full_excited_test.cpp" "MADchem;MADresponse_base") +add_mad_executable(full_ground_tests "full_ground_test.cpp" "MADchem;MADresponse_base") + + + +add_mad_executable(generate_excited "generate_excited_data.cpp" "MADall_response;MADchem") +add_mad_executable(generate_frequency "generate_frequency_data.cpp" "MADall_response;MADchem") +add_mad_executable(database-test "database_testing.cpp" "MADall_response;MADchem") +add_mad_executable(test-dev "test_development.cpp" "MADall_response;MADchem") +# Add dependencies for MADchem diff --git a/src/apps/molresponse/testing/database_testing.cpp b/src/apps/molresponse/testing/database_testing.cpp new file mode 100644 index 00000000000..ebf8119a2f4 --- /dev/null +++ b/src/apps/molresponse/testing/database_testing.cpp @@ -0,0 +1,194 @@ +// +// Created by adrianhurtado on 1/1/22. +// +#define CATCH_CONFIG_RUNNER + +#include "ExcitedResponse.hpp" +#include +#include "response_parameters.h" +#include "FrequencyResponse.hpp" +#include "ResponseExceptions.hpp" +#include "TDDFT.h" +#include "apps/chem/SCF.h" +#include "apps/external_headers/catch.hpp" +#include "apps/external_headers/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_functions.h" +#include "runners.hpp" +#include "string" +#include "timer.h" +#include "write_test_input.h" +#include "x_space.h" + + +using path = std::filesystem::path; + +int main(int argc, char *argv[]) { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + { result = Catch::Session().run(argc, argv); } + + return result; + + // print_meminfo(world.rank(), "startup"); + // std::cout.precision(6); + // print_stats(world); +} + +TEST_CASE("Run ground and excited-state") { + // Set up the run directories + using namespace madness; + + World &world = World::get_default(); + + std::cout.precision(6); + + auto root = std::filesystem::current_path();//="/"+molecule_name; + auto molecule_path = root; + molecule_path += "/molecules"; + + const std::string molecule_name = "Be"; + const std::string xc = "lda"; + const std::string op = "excited-state"; + // A calculation is defined by a molecule, functional, and operator + // xc include (hf/lda) + // operators include (excited-state) + json response_keyword = {{"molecule", molecule_name}, {"xc", xc}, {"operator", op}}; + + auto xc_path = create_xc_path_and_directory(root, xc); + addResponseKeyWord(response_keyword); +} + +TEST_CASE("Create Excited Json") { + // Set up the run directories + using namespace madness; + + World &world = World::get_default(); + + std::cout.precision(6); + + auto root = std::filesystem::current_path();//="/"+molecule_name; + auto molecule_path = root; + molecule_path += "/molecules"; + + const std::string xc = "hf"; + const auto ops = vector{"excited-state"}; + // A calculation is defined by a molecule, functional, and operator + // xc include (hf/lda) + // operators include (excited-state) + // A calculation is defined by a molecule, functional, and operator + // xc include (hf/lda) + for (const auto &op: ops) { + for (const std::filesystem::directory_entry &mol_path: + std::filesystem::directory_iterator(molecule_path)) { + auto molecule_name = mol_path.path().stem(); + json response_keyword = {{"molecule", molecule_name}, {"xc", xc}, {"operator", op}}; + addResponseKeyWord(response_keyword); + } + } +} + +TEST_CASE("Create Dipole Json") { + // Set up the run directories + using namespace madness; + + World &world = World::get_default(); + + std::cout.precision(6); + + auto root = std::filesystem::current_path();//="/"+molecule_name; + auto molecule_path = root; + molecule_path += "/molecules"; + + const std::string xc = "hf"; + const auto ops = vector{"dipole"}; + // A calculation is defined by a molecule, functional, and operator + // xc include (hf/lda) + // operators include (excited-state) + // A calculation is defined by a molecule, functional, and operator + // xc include (hf/lda) + for (const auto &op: ops) { + for (const std::filesystem::directory_entry &mol_path: + std::filesystem::directory_iterator(molecule_path)) { + auto molecule_name = mol_path.path().stem(); + json response_keyword = {{"molecule", molecule_name}, {"xc", xc}, {"operator", op}}; + addResponseKeyWord(response_keyword); + } + } +} + +TEST_CASE("response parameters json") { + // Set up the run directories + + World &world = World::get_default(); + int result = 0; + world.gop.fence(); + + std::cout.precision(6); + + const std::string molecule_name{"Be"}; + const std::string xc{"hf"}; + const std::string op = "excited-state"; + + auto schema = runSchema(xc); + auto m_schema = moldftSchema(molecule_name, xc, schema); + auto e_schema = excitedSchema(schema, m_schema); + + ResponseParameters original{}; + ResponseParameters params{}; + print("--------------------------default parameters----------------------\n", params.print_to_string()); + + std::ifstream ifs(e_schema.rb_json); + json rb; + ifs >> rb; + + from_json(rb["response_parameters"], params); + + CHECK(original!=params); + CHECK(original==original); + +} + + +TEST_CASE("Run if moldft json ==") { + // Set up the run directories + + World &world = World::get_default(); + int result = 0; + world.gop.fence(); + + std::cout.precision(6); + + const std::string molecule_name{"Be"}; + const std::string xc{"hf"}; + const std::string op = "excited-state"; + + auto schema = runSchema(xc); + auto m_schema = moldftSchema(molecule_name, xc, schema); + + moldft(world, m_schema, false, false, 0); + +} + + +TEST_CASE("Symmetry Tests") { + // Set up the run directories + + World &world = World::get_default(); + int result = 0; + world.gop.fence(); + + std::cout.precision(6); + + const std::string molecule_name{"Be"}; + const std::string xc{"hf"}; + const std::string op = "excited-state"; + + projector_irrep p{}; + + print(p.get_pointgroup()); + + +} diff --git a/src/apps/molresponse/testing/excited_state_calc.cpp b/src/apps/molresponse/testing/excited_state_calc.cpp new file mode 100644 index 00000000000..9cfd719ec2a --- /dev/null +++ b/src/apps/molresponse/testing/excited_state_calc.cpp @@ -0,0 +1,66 @@ +// +// Created by adrianhurtado on 1/1/22. +// +#include "ExcitedResponse.hpp" +#include "ResponseExceptions.hpp" +#include "madness/tensor/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_functions.h" +#include "timer.h" + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) + +#include +#include +#include + +static inline int file_exists(const char *input_name) { + struct stat buffer {}; + size_t rc = stat(input_name, &buffer); + return (rc == 0); +} + +#endif + +using path = std::filesystem::path; + +using namespace madness; + + +int main(int argc, char *argv[]) { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + std::cout.precision(6); + std::string filename = "response.in"; + + try { + auto calc_params = initialize_calc_params(world, filename); + ExcitedResponse calc(world, calc_params); + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Time-Dependent Density Functional Theory Excited-State " + "Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc_params.molecule.print(); + print("\n"); + calc_params.response_parameters.print("response"); + // put the response parameters in a j_molrespone json object + calc_params.response_parameters.to_json(calc.j_molresponse); + } + // set protocol to the first + calc.solve(world); + calc.output_json(); + + } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { + std::cout << e << std::endl; + } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { + print(s); + } catch (const std::string &s) { print(s); } catch (const std::exception &e) { + print(e.what()); + } catch (...) { error("caught unhandled exception"); } + + return result; +} diff --git a/src/apps/molresponse/testing/frequency_calc.cpp b/src/apps/molresponse/testing/frequency_calc.cpp new file mode 100644 index 00000000000..c1a81a9f21e --- /dev/null +++ b/src/apps/molresponse/testing/frequency_calc.cpp @@ -0,0 +1,61 @@ +// +// Created by adrianhurtado on 1/1/22. +// +#include "FrequencyResponse.hpp" +#include "ResponseExceptions.hpp" +#include "response_functions.h" +#include "timer.h" + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) + +#include +#include +#include + +static inline int file_exists(const char *input_name) { + struct stat buffer {}; + size_t rc = stat(input_name, &buffer); + return (rc == 0); +} + +#endif + +int main(int argc, char *argv[]) { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + std::cout.precision(6); + std::string filename = "response.in"; + + try { + auto calc_params = initialize_calc_params(world, filename); + auto omega = calc_params.response_parameters.omega(); + FrequencyResponse calc(world, calc_params, omega, dipole_generator); + // Warm and fuzzy for the user + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Time-Dependent Density Functional Theory Frequency Response " + "Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc_params.molecule.print(); + print("\n"); + calc_params.response_parameters.print("response"); + // put the response parameters in a j_molrespone json object + calc_params.response_parameters.to_json(calc.j_molresponse); + } + // Come up with an initial OK data map + // set protocol to the first + calc.solve(world); + calc.output_json(); + } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { + std::cout << e << std::endl; + } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { + print(s); + } catch (const std::string &s) { print(s); } catch (const std::exception &e) { + print(e.what()); + } catch (...) { error("caught unhandled exception"); } + + return result; +} diff --git a/src/apps/molresponse/testing/full_excited_test.cpp b/src/apps/molresponse/testing/full_excited_test.cpp new file mode 100644 index 00000000000..3e9c812868e --- /dev/null +++ b/src/apps/molresponse/testing/full_excited_test.cpp @@ -0,0 +1,103 @@ +// +// Created by adrianhurtado on 2/11/22. +// + +#include "ExcitedResponse.hpp" +#include "ResponseExceptions.hpp" +#include "TDDFT.h" +#include "apps/chem/SCF.h" +#include "madness/tensor/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_data_base.hpp" +#include "response_functions.h" +#include "runners.hpp" +#include "string" +#include "timer.h" +#include "write_test_input.h" +#include "x_space.h" + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) + +#include +#include +#include + +static inline int file_exists(const char *input_name) { + struct stat buffer {}; + size_t rc = stat(input_name, &buffer); + return (rc == 0); +} + +#endif + +int main(int argc, char *argv[]) { + if (argc != 3) { + + std::cout << "Wrong number of inputs" << std::endl; + return 1; + } + + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + std::cout.precision(6); + + const std::string xc{argv[1]}; + const std::string is_high_prec{argv[2]}; + + bool high_prec; + + if (is_high_prec == "high") { + high_prec = true; + } else { + high_prec = false; + } + + auto schema = runSchema(xc); + + try { + if (std::filesystem::is_directory(schema.molecule_path)) { + // for every molecule within the molecule path + for (const std::filesystem::directory_entry &mol_path: + std::filesystem::directory_iterator(schema.molecule_path)) { + + std::filesystem::current_path(schema.xc_path); + + if (mol_path.path().extension() == ".mol") { + auto molecule_name = mol_path.path().stem(); + std::cout << "\n\n----------------------------------------------------\n"; + std::cout << "Beginning Tests for Molecule: " << molecule_name << "\n"; + try { + + + auto m_schema = moldftSchema(molecule_name, xc, schema); + moldft(world, m_schema, true,false,high_prec); + + auto excited_schema = excitedSchema(schema, m_schema); + excited_schema.print(); + + bool success = runExcited(world, excited_schema, false,high_prec); + } catch (const SafeMPI::Exception &e) { + print(e); + } catch (const madness::MadnessException &e) { + std::cout << e << std::endl; + } catch (const madness::TensorException &e) { + print(e); + } catch (const char *s) { print(s); } catch (const std::string &s) { + print(s); + } catch (const std::exception &e) { print(e.what()); } catch (...) { + error("caught unhandled exception"); + } + // now check if the answers exist. if the answers do not exist run + // response else check the answers + } + } + std::cout << "Please check what happens when I get to this point of the loop" + << std::endl; + // Now check if restart file exists and if calc_info.json exists + } else { + std::cout << "did not find molecules" << std::endl; + } + } catch (const std::filesystem::filesystem_error &ex) { std::cerr << ex.what() << "\n"; } +} diff --git a/src/apps/molresponse/testing/full_frequency_test.cpp b/src/apps/molresponse/testing/full_frequency_test.cpp new file mode 100644 index 00000000000..4d11b7aec3a --- /dev/null +++ b/src/apps/molresponse/testing/full_frequency_test.cpp @@ -0,0 +1,82 @@ +// +// Created by adrianhurtado on 2/11/22. +// + +#include "ResponseExceptions.hpp" +#include "madness/external/nlohmann_json/json.hpp" +#include "madness/tensor/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_functions.h" +#include "runners.hpp" + + +using namespace madness; + +int main(int argc, char *argv[]) { + + if (argc != 4) { + + std::cout << "Wrong number of inputs" << std::endl; + return 1; + } + + World &world = madness::initialize(argc, argv); + world.gop.fence(); + startup(world, argc, argv); + + std::cout.precision(6); + + // set last keyword to high to set high prec + const std::string xc{argv[1]}; + const std::string op{argv[2]}; + const std::string is_high_prec{argv[3]}; + bool high_prec; + + if (is_high_prec == "high") { + high_prec = true; + } else { + high_prec = false; + } + + auto schema = runSchema(xc); + + try { + if (std::filesystem::is_directory(schema.molecule_path)) { + for (const std::filesystem::directory_entry &mol_path: + std::filesystem::directory_iterator(schema.molecule_path)) { + + std::filesystem::current_path(schema.xc_path); + if (mol_path.path().extension() == ".mol") { + print(mol_path.path()); + auto molecule_name = mol_path.path().stem(); + try { + + auto m_schema = moldftSchema(molecule_name, xc, schema); + moldft(world, m_schema, true, false, high_prec); + auto f_schema = frequencySchema(schema, m_schema, op); + runFrequencyTests(world, f_schema, high_prec); + + } catch (const SafeMPI::Exception &e) { + print(e); + } catch (const madness::MadnessException &e) { + std::cout << e << std::endl; + } catch (const madness::TensorException &e) { + print(e); + } catch (const char *s) { print(s); } catch (const std::string &s) { + print(s); + } catch (const std::exception &e) { print(e.what()); } catch (...) { + error("caught unhandled exception"); + } + // now check if the answers exist. if the answers do not exist run + // response else check the answers + } + } + std::cout << "Please check what happens when I get to this point of the loop" + << std::endl; + // Now check if restart file exists and if calc_info.json exists + } else { + std::cout << "did not find molecules" << std::endl; + } + } catch (const std::filesystem::filesystem_error &ex) { std::cerr << ex.what() << "\n"; } + return 0; +} diff --git a/src/apps/molresponse/testing/full_ground_test.cpp b/src/apps/molresponse/testing/full_ground_test.cpp new file mode 100644 index 00000000000..5d4f2ca2da9 --- /dev/null +++ b/src/apps/molresponse/testing/full_ground_test.cpp @@ -0,0 +1,81 @@ +// +// Created by adrianhurtado on 2/11/22. +// + +#include "ResponseExceptions.hpp" + +#include "madness/external/nlohmann_json/json.hpp" +#include "madness/world/worldmem.h" +#include "response_functions.h" +#include "runners.hpp" + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) + +#include +#include +#include + +static inline int file_exists(const char *input_name) { + struct stat buffer {}; + size_t rc = stat(input_name, &buffer); + return (rc == 0); +} + +#endif + +int main(int argc, char *argv[]) { + if (argc != 2) { + + std::cout << "Wrong number of inputs" << std::endl; + return 1; + } + + const std::string xc{argv[1]}; + + + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + std::cout.precision(6); + + auto schema = runSchema(xc); + + try { + if (std::filesystem::is_directory(schema.molecule_path)) { + // for every molecule within the molecule path + for (const std::filesystem::directory_entry &mol_path: + std::filesystem::directory_iterator(schema.molecule_path)) { + std::filesystem::current_path(schema.xc_path); + + if (mol_path.path().extension() == ".mol") { + auto molecule_name = mol_path.path().stem(); + std::cout << "\n\n----------------------------------------------------\n"; + std::cout << "Beginning Tests for Molecule: " << molecule_name << "\n"; + try { + auto m_schema = moldftSchema(molecule_name, xc, schema); + m_schema.print(); + moldft(world, m_schema, true, true, 0); + } catch (const SafeMPI::Exception &e) { + print(e); + } catch (const madness::MadnessException &e) { + std::cout << e << std::endl; + } catch (const madness::TensorException &e) { + print(e); + } catch (const char *s) { print(s); } catch (const std::string &s) { + print(s); + } catch (const std::exception &e) { print(e.what()); } catch (...) { + error("caught unhandled exception"); + } + // now check if the answers exist. if the answers do not exist run + // response else check the answers + } + } + std::cout << "Please check what happens when I get to this point of the loop" + << std::endl; + // Now check if restart file exists and if calc_info.json exists + } else { + std::cout << "did not find molecules" << std::endl; + } + } catch (const std::filesystem::filesystem_error &ex) { std::cerr << ex.what() << "\n"; } +} diff --git a/src/apps/molresponse/testing/generate_excited_data.cpp b/src/apps/molresponse/testing/generate_excited_data.cpp new file mode 100644 index 00000000000..82f09e39f1d --- /dev/null +++ b/src/apps/molresponse/testing/generate_excited_data.cpp @@ -0,0 +1,69 @@ +// +// Created by adrianhurtado on 2/17/22. +// + +#include "ResponseExceptions.hpp" +#include "apps/chem/SCF.h" +#include "madness/tensor/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_data_base.hpp" +#include "response_functions.h" +#include "string" + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) + +#include +#include + +static inline int file_exists(const char *input_name) { + struct stat buffer {}; + size_t rc = stat(input_name, &buffer); + return (rc == 0); +} + +#endif + + +int main(int argc, char *argv[]) { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + + auto root = std::filesystem::current_path();//="/"+molecule_name; + // first step is to read the molecule directory for molecules... check if it exists else throw error + + std::string op = "excited-state"; + auto molecule_path = root; + molecule_path += "/molecules"; + std::string xc = "hf"; + auto xc_path = root; + xc_path += "/"; + xc_path += std::filesystem::path(xc); + if (std::filesystem::is_directory(xc_path)) { + cout << "XC directory found " << xc << "\n"; + } else {// create the file + std::filesystem::create_directory(xc_path); + cout << "Creating XC directory for " << xc << ":\n"; + } + try { + if (std::filesystem::exists("molecules/frequency.json")) { + std::ifstream ifs("molecules/frequency.json"); + std::cout << "Trying to read frequency.json" << std::endl; + json j_read; + ifs >> j_read; + std::cout << "READ IT" << std::endl; + json excited_data = generate_excited_data(molecule_path, xc, 4); + std::ofstream ofs("molecules/frequency.json"); + j_read.merge_patch(excited_data); + ofs << std::setw(4) << j_read << std::endl; + + } else { + json data = generate_excited_data(molecule_path, xc, 4); + std::ofstream ofs("molecules/frequency.json"); + ofs << std::setw(4) << data << std::endl; + } + + + } catch (const std::exception &e) { cout << e.what() << std::endl; } +} \ No newline at end of file diff --git a/src/apps/molresponse/testing/generate_frequency_answers.cpp b/src/apps/molresponse/testing/generate_frequency_answers.cpp new file mode 100644 index 00000000000..4805098a154 --- /dev/null +++ b/src/apps/molresponse/testing/generate_frequency_answers.cpp @@ -0,0 +1,108 @@ +// +// Created by adrianhurtado on 2/17/22. +// +#define CATCH_CONFIG_RUNNER + +#include "ExcitedResponse.hpp" +#include "FrequencyResponse.hpp" +#include "ResponseExceptions.hpp" +#include "TDDFT.h" +#include "apps/chem/SCF.h" +#include "apps/external_headers/catch.hpp" +#include "apps/external_headers/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_functions.h" +#include "runners.hpp" +#include "string" +#include "timer.h" +#include "write_test_input.h" +#include "x_space.h" +#include "response_data_base.hpp" + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) + +#include +#include +#include + +static inline int file_exists(const char *input_name) { + struct stat buffer{}; + size_t rc = stat(input_name, &buffer); + return (rc == 0); +} + +#endif + + +int main(int argc, char *argv[]) { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + ResponseDataBase response_data_base = ResponseDataBase(); + + auto root = std::filesystem::current_path();//="/"+molecule_name; + // first step is to read the molecule directory for molecules... check if it exists else throw error + + std::string property = "dipole"; + auto molecule_path = root; + molecule_path += "/molecules"; + std::string xc = "hf"; + auto xc_path = root; + xc_path += "/"; + xc_path += std::filesystem::path(xc); + if (std::filesystem::is_directory(xc_path)) { + + cout << "XC directory found " << xc << "\n"; + + } else {// create the file + std::filesystem::create_directory(xc_path); + cout << "Creating XC directory for " << xc << ":\n"; + } + + try { + if (std::filesystem::is_directory(molecule_path)) { + for (const std::filesystem::directory_entry &mol_path: + std::filesystem::directory_iterator(molecule_path)) { + + std::filesystem::current_path(xc_path); + //for each molecule in molecules directory + bool moldft_results_exists = false; + json moldft_answers; + + if (mol_path.path().extension() == ".mol") { + auto molecule_name = mol_path.path().stem(); + std::cout << "\n\n----------------------------------------------------\n"; + std::cout << "Beginning Tests for Molecule: " << molecule_name << "\n"; + + // We would like to read the moldft results from corresponding json "molecule_name.json" + auto response_json_path = + generate_response_json_path(molecule_path, molecule_name, xc, property); + + json response_json; + if (std::filesystem::exists(response_json_path)) { + std::cout << "response_json exists:" << std::endl; + response_json = + response_data_base.retrieve_data(molecule_name, xc, property); + } else { + try { + response_data_base.output_data(response_json_path.string(), molecule_name, xc, property); + } catch (json::exception &e) { + std::cout << e.what() << std::endl; + } + } + std::cout << response_json << std::endl; + } + } + generate_response_data(molecule_path, xc, property, {0}); + + + // if the results exists then save them into answers + } + } catch (const std::filesystem::filesystem_error &ex) { std::cerr << ex.what() << "\n"; } + return result; + + // print_meminfo(world.rank(), "startup"); + // std::cout.precision(6); + // print_stats(world); +} \ No newline at end of file diff --git a/src/apps/molresponse/testing/generate_frequency_data.cpp b/src/apps/molresponse/testing/generate_frequency_data.cpp new file mode 100644 index 00000000000..04c1974494e --- /dev/null +++ b/src/apps/molresponse/testing/generate_frequency_data.cpp @@ -0,0 +1,71 @@ +// +// Created by adrianhurtado on 2/17/22. +// + +#include "ResponseExceptions.hpp" +#include "apps/chem/SCF.h" +#include "madness/tensor/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_data_base.hpp" +#include "response_functions.h" +#include "string" + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) + +#include +#include + +static inline int file_exists(const char *input_name) { + struct stat buffer {}; + size_t rc = stat(input_name, &buffer); + return (rc == 0); +} + +#endif + + +int main(int argc, char *argv[]) { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + + auto root = std::filesystem::current_path();//="/"+molecule_name; + // first step is to read the molecule directory for molecules... check if it exists else throw error + + std::string op = "dipole"; + auto molecule_path = root; + molecule_path += "/molecules"; + std::string xc = "hf"; + auto xc_path = root; + xc_path += "/"; + xc_path += std::filesystem::path(xc); + if (std::filesystem::is_directory(xc_path)) { + cout << "XC directory found " << xc << "\n"; + } else {// create the file + std::filesystem::create_directory(xc_path); + cout << "Creating XC directory for " << xc << ":\n"; + } + try { + if (std::filesystem::exists("molecules/frequency.json")) { + std::ifstream ifs("molecules/frequency.json"); + std::cout << "Trying to read frequency.json" << std::endl; + json j_read; + ifs >> j_read; + std::cout << "READ IT" << std::endl; + json data = generate_response_data(molecule_path, xc, op, {0}); + j_read.merge_patch(data); + // make the keyword and add the data + std::ofstream ofs("molecules/frequency.json"); + ofs << std::setw(4) << j_read << std::endl; + + } else { + json data; + json new_data = generate_response_data(molecule_path, xc, op, {0}); + std::ofstream ofs("molecules/frequency.json"); + ofs << std::setw(4) << data << std::endl; + } + + + } catch (const std::exception &e) { cout << e.what() << std::endl; } +} \ No newline at end of file diff --git a/src/apps/molresponse/testing/mad-excited-symmetry-adapted.cpp b/src/apps/molresponse/testing/mad-excited-symmetry-adapted.cpp new file mode 100644 index 00000000000..e3a67bdd7a1 --- /dev/null +++ b/src/apps/molresponse/testing/mad-excited-symmetry-adapted.cpp @@ -0,0 +1,127 @@ +// +// Created by adrianhurtado on 1/1/22. +// +#include "ExcitedResponse.hpp" +#include "FrequencyResponse.hpp" +#include "ResponseExceptions.hpp" +#include "apps/chem/SCF.h" +#include "apps/external_headers/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_functions.h" +#include "runners.hpp" +#include "string" +#include "timer.h" +#include "write_test_input.h" +#include "x_space.h" + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) + +#include +#include +#include + +static inline int file_exists(const char *input_name) { + struct stat buffer {}; + size_t rc = stat(input_name, &buffer); + return (rc == 0); +} + +#endif + +using path = std::filesystem::path; + +using namespace madness; + + +int main(int argc, char *argv[]) { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + + std::cout.precision(6); + + if (argc != 3) { + + std::cout << "Wrong number of inputs" << std::endl; + return 1; + } + + const std::string molecule_name{argv[1]}; + const std::string xc{argv[2]}; + const std::string op = "excited-state"; + + + auto schema = runSchema(xc); + auto mol_path = addPath(schema.molecule_path, molecule_name); + + auto m_schema = moldftSchema(molecule_name, xc, schema); + m_schema.print(); + //moldft(world, m_schema, false); + auto excited_schema = excitedSchema(schema, m_schema); + excited_schema.print(); + //bool success = runExcited(world, excited_schema, true); + + // Set the response parameters + ResponseParameters r_params{}; + + set_excited_parameters(r_params, excited_schema.xc, excited_schema.num_states); + create_excited_paths(r_params, excited_schema, true); + std::filesystem::current_path(excited_schema.excited_state_run_path); + set_and_write_restart_excited_parameters(r_params, excited_schema, true); + + auto calc_params = initialize_calc_params(world, "response.in"); + + auto molecule = calc_params.molecule; + std::string all_pg[] = {"c1", "cs", "c2", "ci", "c2v", "c2h", "d2", "d2h"}; + + auto g_orbitals = calc_params.ground_calculation.orbitals(); + + + double error = 0.0; + + auto pg = all_pg[4];//"c2v + + print("point group", pg); + projector_irrep proj(pg); + + for (const std::string &irrep: proj.get_all_irreps()) {// loop over all irreps + print(" irrep", irrep); + proj.set_irrep(irrep); + real_function_3d f1 = proj(g_orbitals[0])[0];// result is the first element of result vector + + charactertable table = proj.get_table(); + for (int i = 0; i < table.order_; ++i) {// loop over all symmetry operations + const pg_operator syop = table.operators_[i]; + const int character = table.irreps_[irrep][i]; + double n1 = (f1 - character * syop(f1)).norm2(); + print(" operator, character, norm ", syop.name(), character, n1); + error += n1; + } + } + + /* + ExcitedResponse calc(world, calc_params); + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Time-Dependent Density Functional Theory Response " + "Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc_params.molecule.print(); + print("\n"); + calc_params.response_parameters.print("response"); + // put the response parameters in a j_molrespone json object + calc_params.response_parameters.to_json(calc.j_molresponse); + // set protocol to the first + calc.solve(world); + calc.output_json(); + return true; + */ + + return result; + + // print_meminfo(world.rank(), "startup"); + // std::cout.precision(6); + // print_stats(world); +} \ No newline at end of file diff --git a/src/apps/molresponse/testing/mad-excited.cpp b/src/apps/molresponse/testing/mad-excited.cpp new file mode 100644 index 00000000000..ccc586ebab0 --- /dev/null +++ b/src/apps/molresponse/testing/mad-excited.cpp @@ -0,0 +1,90 @@ +// +// Created by adrianhurtado on 1/1/22. +// +#include "ResponseExceptions.hpp" +#include "madness/tensor/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_functions.h" +#include "runners.hpp" + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) + +#include +#include + +static inline auto file_exists(const char *input_name) -> int { + struct stat buffer {}; + size_t rc = stat(input_name, &buffer); + return (rc == 0); +} + +#endif + +using path = std::filesystem::path; + +using namespace madness; + + +auto main(int argc, char *argv[]) -> int { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + + std::cout.precision(6); + + if (argc != 4) { + + std::cout << "Wrong number of inputs" << std::endl; + return 1; + } + + const std::string molecule_name{argv[1]}; + const std::string xc{argv[2]}; + const std::string is_high_prec{argv[3]}; + + + bool high_prec; + + if (is_high_prec == "high") { + high_prec = true; + } else { + high_prec = false; + } + + auto schema = runSchema(xc); + auto mol_path = addPath(schema.molecule_path, molecule_name); + + try { + + auto m_schema = moldftSchema(molecule_name, xc, schema); + moldft(world, m_schema, false, true, high_prec); + auto excited_schema = excitedSchema(schema, m_schema); + excited_schema.print(); + + try { + + moldft(world, m_schema, false, false, high_prec); + runExcited(world, excited_schema, true, high_prec); + } catch (MadnessException &madnessException) { + print(madnessException); + moldft(world, m_schema, true, false, high_prec); + runExcited(world, excited_schema, true, high_prec); + } + + } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { + std::cout << e << std::endl; + } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { + print(s); + } catch (const std::string &s) { print(s); } catch (const std::exception &e) { + print(e.what()); + } catch (const std::filesystem::filesystem_error &ex) { + std::cerr << ex.what() << "\n"; + } catch (...) { error("caught unhandled exception"); } + + if (world.rank() == 0) { print("Finished Excited-State Calculation"); } + return result; + // print_meminfo(world.rank(), "startup"); + // std::cout.precision(6); + // print_stats(world); +} diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp new file mode 100644 index 00000000000..7daf425a48b --- /dev/null +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -0,0 +1,88 @@ +// +// Created by adrianhurtado on 1/1/22. +// +#include "ResponseExceptions.hpp" +#include "madness/tensor/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_functions.h" +#include "runners.hpp" + +#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) + +#include +#include +#include + +static inline int file_exists(const char *input_name) { + struct stat buffer {}; + size_t rc = stat(input_name, &buffer); + return (rc == 0); +} + +#endif + +using path = std::filesystem::path; + +using namespace madness; + + +auto main(int argc, char *argv[]) -> int { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + + std::cout.precision(6); + + if (argc != 5) { + + std::cout << "Wrong number of inputs" << std::endl; + return 1; + } + + const std::string molecule_name{argv[1]}; + const std::string xc{argv[2]}; + const std::string op{argv[3]}; + const std::string is_high_prec{argv[4]}; + + bool high_prec; + + if (is_high_prec == "high") { + high_prec = true; + } else { + high_prec = false; + } + try { + + auto schema = runSchema(xc); + auto m_schema = moldftSchema(molecule_name, xc, schema); + m_schema.print(); + auto f_schema = frequencySchema(schema, m_schema, op); + try { + + moldft(world, m_schema, false, false, high_prec); + runFrequencyTests(world, f_schema, high_prec); + } catch (MadnessException &madnessException) { + print(madnessException); + moldft(world, m_schema, true, false, high_prec); + runFrequencyTests(world, f_schema, high_prec); + } + + } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { + std::cout << e << std::endl; + } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { + print(s); + } catch (const std::string &s) { print(s); } catch (const std::exception &e) { + print(e.what()); + } catch (const std::filesystem::filesystem_error &ex) { + std::cerr << ex.what() << "\n"; + } catch (...) { error("caught unhandled exception"); } + + if (world.rank() == 0) { print("Finished All Frequencies"); } + + return result; + + // print_meminfo(world.rank(), "startup"); + // std::cout.precision(6); + // print_stats(world); +} diff --git a/src/apps/molresponse/testing/madness_catch_main.cc b/src/apps/molresponse/testing/madness_catch_main.cc index ebc3b47d09d..a52c6558eeb 100644 --- a/src/apps/molresponse/testing/madness_catch_main.cc +++ b/src/apps/molresponse/testing/madness_catch_main.cc @@ -1,12 +1,12 @@ #define CATCH_CONFIG_RUNNER #include "madness/external/catch/catch.hpp" -#include "madness/chem/SCF.h" +#include "apps/chem/SCF.h" #include "madness/world/worldmem.h" int main(int argc, char *argv[]) { - World& world=initialize(argc, argv);// initializes a world argument with argc and argv + //World& world=initialize(argc, argv);// initializes a world argument with argc and argv // World world(SafeMPI::COMM_WORLD); // startup(world, argc, argv, true); try { diff --git a/src/apps/molresponse/testing/madness_catch_main_init.cc b/src/apps/molresponse/testing/madness_catch_main_init.cc new file mode 100644 index 00000000000..31d14e22f30 --- /dev/null +++ b/src/apps/molresponse/testing/madness_catch_main_init.cc @@ -0,0 +1,63 @@ +#define CATCH_CONFIG_RUNNER +#include + +#include "apps/chem/SCF.h" +#include "apps/external_headers/catch.hpp" +#include "madness/world/worldmem.h" + + +int main(int argc, char *argv[]) { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + try { + + { + CalculationParameters param1; + param1.set_user_defined_value("maxiter", 2); + param1.set_user_defined_value("protocol", std::vector({1.e-3})); + // write restart file + // write restart file + write_test_input test_input(param1, "hf");// molecule HF + commandlineparser parser; + parser.set_keyval("input", test_input.filename()); + SCF calc(world, parser); + calc.set_protocol<3>(world, 1e-4); + MolecularEnergy ME(world, calc); + //double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! + ME.value(calc.molecule.get_all_coords().flat());// ugh! + ME.output_calc_info_schema(); + + world.gop.fence(); + } + + // Here we run all the tests + result = Catch::Session().run(argc, argv); + return result; + + + } catch (const SafeMPI::Exception &e) { + print(e); + error("caught an MPI exception"); + } catch (const madness::MadnessException &e) { + print(e); + error("caught a MADNESS exception"); + } catch (const madness::TensorException &e) { + print(e); + error("caught a Tensor exception"); + } catch (const char *s) { + print(s); + error("caught a string exception"); + } catch (const std::string &s) { + print(s); + error("caught a string (class) exception"); + } catch (const std::exception &e) { + print(e.what()); + error("caught an STL exception"); + } catch (...) { error("caught unhandled exception"); } + + // print_meminfo(world.rank(), "startup"); + // std::cout.precision(6); + // print_stats(world); +} diff --git a/src/apps/molresponse/testing/qcschema_json_testing.cpp b/src/apps/molresponse/testing/qcschema_json_testing.cpp index 7c991595c57..d4ef3f5a8ed 100644 --- a/src/apps/molresponse/testing/qcschema_json_testing.cpp +++ b/src/apps/molresponse/testing/qcschema_json_testing.cpp @@ -167,7 +167,7 @@ TEST_CASE("print_QCSchema Test ", "Json Tensor Indexing") { to_json(j,double_tensor_vals); - output_schema("test_schema",j); + output_schema(<#initializer #>, "test_schema", j); } TEST_CASE("Response Parameters Test ", "Testing parameters to_json") { diff --git a/src/apps/molresponse/testing/response_data_base.cpp b/src/apps/molresponse/testing/response_data_base.cpp new file mode 100644 index 00000000000..c2c89c943d2 --- /dev/null +++ b/src/apps/molresponse/testing/response_data_base.cpp @@ -0,0 +1,5 @@ +// +// Created by adrianhurtado on 3/25/22. +// + +#include "response_data_base.hpp" diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp new file mode 100644 index 00000000000..2d8ecacc6c7 --- /dev/null +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -0,0 +1,171 @@ +// +// Created by adrianhurtado on 3/25/22. +// + +#ifndef MADNESS_RESPONSE_DATA_BASE_HPP +#define MADNESS_RESPONSE_DATA_BASE_HPP + +#include +#include +#include + +#include "madness/tensor/tensor_json.hpp" + +using path = std::filesystem::path; + +class ResponseDataBase { +public: + json j; + + json retrieve_data(const std::string &molecule, const std::string &xc, + const std::string &property) const { + return j.at(molecule).at(xc).at(property); + } + + void output_data(const std::string &filename, const std::string &molecule, + const std::string &xc, const std::string &property) const { + + auto output_json = retrieve_data(molecule, xc, property); + std::ofstream ofs{filename}; + ofs << output_json; + } + + explicit ResponseDataBase(json j) : j(std::move(j)) {} + + explicit ResponseDataBase() = default; + + void set_data(const json &data) { j = json(data); } + + void print() { + for (const auto &[key, value]: j.items()) { + std::cout << key << " : " << value << "|n" << std::endl; + } + } + + + size_t get_num_states(const std::string &molecule, const std::string &xc, + const std::string &property) const { + return retrieve_data(molecule, xc, property).get(); + } + + std::vector get_frequencies(const std::string &molecule, const std::string &xc, + const std::string &property) const { + return retrieve_data(molecule, xc, property).get>(); + } + + void add_default_molecule(const json &response_keywords) { + + const std::string molecule_name = response_keywords["molecule"]; + const std::string xc = response_keywords["xc"]; + const std::string op = response_keywords["operator"]; + json j_add; + if (op == "excited-state") { + + j_add[molecule_name][xc][op] = 8; + + + } else if (op == "dipole") { + + if (std::filesystem::exists("molecules/dalton-excited.json")) { + std::ifstream ifs("molecules/dalton-excited.json"); + try { + + json dalton_excited; + ifs >> dalton_excited; + ::print("Read Dalton Excited"); + ::print(dalton_excited); + + + std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] + ["aug-cc-pVTZ"]["response"]["freq"]; + auto omega_max = freq.at(0); + omega_max = omega_max / 2.0; + ::print(omega_max); + + std::vector omegas = {0, omega_max / 8.0, omega_max / 4.0, + omega_max / 2.0, omega_max}; + j_add[molecule_name][xc][op] = omegas; + + + } catch (const json::out_of_range &e) { + std::cout << e.what() << std::endl; + // The molecule file exists in the database therefore it is okay to add to frequency.json + } + + } else { + std::cout << " did not find dipole-excited.json" << std::endl; + j_add[molecule_name][xc][op] = {0}; + } + } else if (op == "nuclear") { + j_add[molecule_name][xc][op] = {0}; + } + j.merge_patch(j_add); + std::ofstream ofs("molecules/frequency.json"); + ofs << std::setw(4) << j << std::endl; + std::cout << "Added " << j_add << " frequency.json" << std::endl; + } +}; + +auto generate_dipole_frequencies(std::string molecule_name, std::string xc, + std::string op) -> vector { + + if (std::filesystem::exists("molecules/dalton-excited.json")) { + std::ifstream ifs("molecules/dalton-excited.json"); + try { + + json dalton_excited; + ifs >> dalton_excited; + ::print("Read Dalton Excited"); + ::print(dalton_excited); + std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] + ["aug-cc-pVTZ"]["response"]["freq"]; + auto omega_max = freq.at(0); + omega_max = omega_max / 2.0; + ::print(omega_max); + + std::vector omegas = {}; + int Nsteps = 9; + for (int i = 0; i < Nsteps; i++) { omegas.push_back(omega_max * (double) i / 8.0); } + return omegas; + + } catch (const json::out_of_range &e) { + std::cout << e.what() << std::endl; + // The molecule file exists in the database therefore it is okay to add to frequency.json + } + + } else { + std::cout << " did not find dipole-excited.json" << std::endl; + return {0}; + } +} +json generate_response_data(const std::filesystem::path &molecule_path, const std::string &xc, + const std::string &property, const vector &freq) { + json data; + for (const std::filesystem::directory_entry &mol_path: + std::filesystem::directory_iterator(molecule_path)) { + if (mol_path.path().extension() == ".mol") { + auto molecule_name = mol_path.path().stem(); + data[molecule_name][xc][property] = + generate_dipole_frequencies(molecule_name, xc, property); + } + } + std::cout << data << endl; + return data; +} + +json generate_excited_data(const std::filesystem::path &molecule_path, const std::string &xc, + int num_states) { + json data; + for (const std::filesystem::directory_entry &mol_path: + std::filesystem::directory_iterator(molecule_path)) { + if (mol_path.path().extension() == ".mol") { + auto molecule_name = mol_path.path().stem(); + const std::string property = "excited-state"; + data[molecule_name][xc][property] = num_states; + } + } + return data; +}; + + +#endif//MADNESS_RESPONSE_DATA_BASE_HPP diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp new file mode 100644 index 00000000000..1d170205143 --- /dev/null +++ b/src/apps/molresponse/testing/runners.hpp @@ -0,0 +1,809 @@ +// +// Created by adrianhurtado on 2/11/22. +// + +#ifndef MADNESS_RUNNERS_HPP +#define MADNESS_RUNNERS_HPP + +#include "ExcitedResponse.hpp" +#include "FrequencyResponse.hpp" +#include "ResponseExceptions.hpp" +#include "TDDFT.h" +#include "apps/chem/SCF.h" +#include "madness/tensor/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_data_base.hpp" +#include "response_functions.h" +#include "sstream" +#include "string" +#include "timer.h" +#include "write_test_input.h" +#include "x_space.h" + +auto split(const std::string &s, char delim) -> vector { + vector result; + std::stringstream ss(s); + std::string item; + + while (getline(ss, item, delim)) { result.push_back(item); } + + return result; +} + +auto addPath(const path &root, const std::string &branch) -> path { + + path p_branch = root; + p_branch += branch; + return p_branch; +} + +struct runSchema { + path root; // root directory + path molecule_path; // molecule directory + path xc_path; // create xc path + path freq_json; // path to freq_json + path dalton_dipole_json; // path to dalton to dipole json + path dalton_excited_json;// path to dalton excited json + ResponseDataBase rdb; + + explicit runSchema(const std::string &xc) { + + root = std::filesystem::current_path();//="/"+molecule_name; + molecule_path = root; + molecule_path += "/molecules"; + + xc_path = addPath(root, "/" + xc); + if (std::filesystem::exists(xc_path)) { + std::cout << "XC Directory Exists" << std::endl; + } else { + std::cout << "Creating XC directory" << std::endl; + std::filesystem::create_directory(xc_path); + } + + // Get the database where the calculation will be run from + freq_json = addPath(molecule_path, "/frequency.json"); + dalton_excited_json = addPath(molecule_path, "/dalton-excited.json"); + dalton_dipole_json = addPath(molecule_path, "/dalton-dipole.json"); + + rdb = ResponseDataBase(); + + + if (std::filesystem::exists(freq_json)) { + std::ifstream ifs(freq_json); + std::cout << "Trying to read frequency.json" << std::endl; + json j_read; + ifs >> j_read; + std::cout << "READ IT" << std::endl; + rdb.set_data(j_read); + + } else { + std::cout << "did not find frequency.json" << std::endl; + } + print(); + } + + void print() const { + + ::print("------------Database Runner---------------"); + ::print("Root: ", root); + ::print("Molecule Directory: ", molecule_path); + ::print("XC Path: ", xc_path); + ::print("Freq Json Path: ", freq_json); + ::print("Dalton Dipole Json Path: ", dalton_dipole_json); + ::print("Dalton Excited Json Path: ", dalton_excited_json); + } +}; + +struct moldftSchema { + + path moldft_path; + path moldft_json_path; + json moldft_json; + + path moldft_restart; + path calc_info_json_path; + json calc_info_json; + path mol_path; + std::string mol_name; + std::string xc; + + moldftSchema(const std::string &molecule_name, const std::string &m_xc, const runSchema &schema) + : mol_name(molecule_name), + xc(m_xc) { + + moldft_path = addPath(schema.xc_path, '/' + mol_name); + moldft_restart = addPath(moldft_path, "/restartdata.00000"); + calc_info_json_path = addPath(moldft_path, "/calc_info.json"); + mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); + + moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); + + if (std::filesystem::exists(moldft_json_path)) { + std::ifstream ifs(moldft_json_path); + // read results into json + ifs >> moldft_json; + // Here are the current answers... check to see if th + std::cout << "Here are the current answers for" << molecule_name + << " check to see if they need to be updated please!" << std::endl; + cout << moldft_path; + } else { + std::cout << " We do not have moldft answers so please run and save the " + "results in the molecule directory" + << std::endl; + } + + if (std::filesystem::exists(moldft_restart) && + std::filesystem::exists(calc_info_json_path)) { + // if both exist, read the calc_info json + std::ifstream ifs(calc_info_json_path); + ifs >> calc_info_json; + std::cout << "time: " << calc_info_json["time"] << std::endl; + std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; + std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] + << std::endl; + } + print(); + } + + void print() const { + ::print("----------------- Moldft Paths --------------------"); + ::print("moldft path :", moldft_path); + ::print("moldft json path :", moldft_json_path); + ::print("moldft restart path :", moldft_restart); + ::print("molecule path path :", mol_path); + ::print("calc_info json path :", calc_info_json_path); + ::print("moldft json path :", moldft_json_path); + } +}; + +struct frequencySchema { + + const std::string mol_name; + const std::string xc; + const std::string op; + + const path moldft_path; + vector freq; + + frequencySchema(const runSchema run_schema, const moldftSchema m_schema, + const std::string r_operator) + : mol_name(m_schema.mol_name), + xc(m_schema.xc), + op(r_operator), + moldft_path(m_schema.moldft_path) { + freq = run_schema.rdb.get_frequencies(mol_name, xc, op); + print_schema(); + } + + void print_schema() { + print("Frequency Calculation"); + print("Molecule Name: ", mol_name); + print("Functional: ", xc); + print("Operator: ", op); + print("MOLDFT PATH: ", moldft_path); + print("Frequencies : ", freq); + } +}; + +/** + * Sets the excited state data found in the response_data_base class + * If the data is not found it will just return 4 + * @param response_data_base + * @param molecule_path + * @param molecule_name + * @param xc + * @param property + * @return + */ +size_t set_excited_states(const ResponseDataBase &response_data_base, + const std::filesystem::path &molecule_path, + const std::string &molecule_name, const std::string &xc) { + + const std::string property = "excited-state"; + + try { + return response_data_base.get_num_states(molecule_name, xc, property); + } catch (json::exception &e) { + std::cout << e.what() << std::endl; + std::cout << "did not find the frequency data for [" << molecule_name << "][" << xc << "][" + << property << "]\n"; + return 4; + } +} + +/** + * generates the frequency response path using the format + * [property]_[xc]_[1-100] + * + * where 1-100 corresponds a frequency of 1.100 + * + * @param moldft_path + * @param property + * @param frequency + * @param xc + * @return + */ +std::filesystem::path generate_excited_run_path(const std::filesystem::path &moldft_path, + const size_t &num_states, const std::string &xc) { + std::string s_num_states = std::to_string(num_states); + std::string run_name = "excited-" + s_num_states; + // set r_params to restart true if restart file exist + + auto run_path = moldft_path; + run_path += "/"; + run_path += std::filesystem::path(run_name); + std::cout << run_path << endl; + return run_path; +} +// sets the current path to the save path +/** + * Generates the frequency save path with format + * /excited_state/restart_[frequency_run_filename].00000 + * + * @param excited_state restart path + * @return + */ +std::pair generate_excited_save_path( + const std::filesystem::path &excited_run_path) { + + auto save_path = std::filesystem::path(excited_run_path); + std::string save_string = "restart_excited"; + save_path += "/"; + save_path += save_string; + + save_path += ".00000"; + return {save_path, save_string}; +} + +struct excitedSchema { + std::string xc; + size_t num_states; + path excited_state_run_path; + path save_path; + std::string save_string; + + path rb_json; + + + excitedSchema(const runSchema &run_schema, const moldftSchema &m_schema) : xc(m_schema.xc) { + num_states = + set_excited_states(run_schema.rdb, run_schema.molecule_path, m_schema.mol_name, xc); + excited_state_run_path = generate_excited_run_path(m_schema.moldft_path, num_states, xc); + auto [sp, s] = generate_excited_save_path(excited_state_run_path); + save_path = sp; + save_string = s; + rb_json = addPath(excited_state_run_path, "/response_base.json"); + } + + void print() { + + ::print("xc: ", xc); + ::print("num states: ", num_states); + ::print("excited_state run_path: ", excited_state_run_path); + ::print("save_path: ", save_path); + ::print("save_string: ", save_string); + } +}; + +/** + * Creates the xc directory in root directory of the + * + * Will create the xc directory if it does not already exist. Returns the path + * of xc directory + * + * + * @param root + * @param xc + * @return xc_path + */ +std::filesystem::path create_xc_path_and_directory(const std::filesystem::path &root, + const std::string &xc) { + + // copy construct the root path + auto xc_path = std::filesystem::path(root); + xc_path += "/"; + xc_path += std::filesystem::path(xc); + if (std::filesystem::is_directory(xc_path)) { + + cout << "XC directory found " << xc << "\n"; + + } else {// create the file + std::filesystem::create_directory(xc_path); + cout << "Creating XC directory for " << xc << ":\n"; + } + + return xc_path; +} + +// sets the current path to the save path +/** + * Generates the frequency save path with format + * /frequency_run_path/restart_[frequency_run_filename].00000 + * + * @param frequency_run_path + * @return + */ +auto generate_frequency_save_path(const std::filesystem::path &frequency_run_path) + -> std::pair { + + auto save_path = std::filesystem::path(frequency_run_path); + auto run_name = frequency_run_path.filename(); + std::string save_string = "restart_" + run_name.string(); + save_path += "/"; + save_path += save_string; + + save_path += ".00000"; + return {save_path, save_string}; +} + +/** + * generates the frequency response path using the format + * [property]_[xc]_[1-100] + * + * where 1-100 corresponds a frequency of 1.100 + * + * @param moldft_path + * @param property + * @param frequency + * @param xc + * @return + */ +auto generate_response_frequency_run_path(const std::filesystem::path &moldft_path, + const std::string &property, const double &frequency, + const std::string &xc) -> std::filesystem::path { + std::string s_frequency = std::to_string(frequency); + auto sp = s_frequency.find("."); + s_frequency = s_frequency.replace(sp, sp, "-"); + std::string run_name = property + "_" + xc + "_" + s_frequency; + // set r_params to restart true if restart file exist + + auto run_path = moldft_path; + run_path += "/"; + run_path += std::filesystem::path(run_name); + std::cout << run_path << endl; + return run_path; +} + +/** + * Reads in current parameters and found parameters from calc_info.json and determines whether we should restart the calculation + * @param p1 + * @param p2 + * @return + */ +auto tryMOLDFT(CalculationParameters &p1, CalculationParameters &p2) -> bool { + + // first get the last protocol + + auto proto1 = p1.get>("protocol"); + auto proto2 = p1.get>("protocol"); + + std::cout << *(proto2.end() - 1) << std::endl; + std::cout << *(proto1.end() - 1) << std::endl; + + return *(proto1.end() - 1) != *(proto2.end() - 1); +} + +/** + * Runs moldft in the path provided. Also generates the moldft input file_name + * in the directory provided. + * + * @param world + * @param moldft_path + * @param moldft_filename + * @param xc + */ +void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, bool restart, + bool high_prec) { + + CalculationParameters param1; + + param1.set_user_defined_value("maxiter", 20); + //param1.set_user_defined_value("Kain", true); + + param1.set_user_defined_value("xc", moldftSchema.xc); + param1.set_user_defined_value("l", 200); + + if (high_prec) { + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + param1.set_user_defined_value("dconv", 1e-6); + } else { + param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); + param1.set_user_defined_value("dconv", 1e-4); + } + + param1.set_user_defined_value("localize", "new"); + + CalculationParameters param_calc; + json calcInfo; + if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { + std::ifstream ifs(moldftSchema.calc_info_json_path); + ifs >> calcInfo; + param_calc.from_json(calcInfo["parameters"]); + print(param1.print_to_string()); + print(param_calc.print_to_string()); + } + //If the parameters are exactly equal do not run + // If calc info doesn't exist the param_calc will definitely be different + + // if parameters are different or if I want to run no matter what run + // if I want to restart and if I can. restart + print("param1 != param_calc = ", param1 != param_calc); + if (tryMOLDFT(param1, param_calc) || try_run) { + print("-------------Running moldft------------"); + // if params are different run and if restart exists and if im asking to restar + if (std::filesystem::exists(moldftSchema.moldft_restart) && restart) { + param1.set_user_defined_value("restart", true); + } + molresponse::write_test_input test_input(param1, "moldft.in", + moldftSchema.mol_path);// molecule HF + commandlineparser parser; + parser.set_keyval("input", test_input.filename()); + SCF calc(world, parser); + calc.set_protocol<3>(world, 1e-4); + MolecularEnergy ME(world, calc); + // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! + ME.value(calc.molecule.get_all_coords().flat());// ugh! + ME.output_calc_info_schema(); + } else { + print("Skipping Calculation and printing CALC INFO"); + std::cout << calcInfo; + } +} + +/** + * Sets the response parameters for a frequency response calculation and writes + * to file + * + * @param r_params + * @param property + * @param xc + * @param frequency + */ +void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, + const size_t &num_states, bool high_prec) { + + + if (high_prec) { + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value("dconv", 1e-6); + } else { + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); + r_params.set_user_defined_value("dconv", 1e-4); + } + r_params.set_user_defined_value("archive", std::string("../restartdata")); + r_params.set_user_defined_value("maxiter", size_t(15)); + r_params.set_user_defined_value("maxsub", size_t(10)); + // if its too large then bad guess is very strong + r_params.set_user_defined_value("kain", true); + r_params.set_user_defined_value("plot_all_orbitals", false); + r_params.set_user_defined_value("save", true); + r_params.set_user_defined_value("guess_xyz", false); + r_params.set_user_defined_value("print_level", 20); + // set xc, property, num_states,and restart + r_params.set_user_defined_value("xc", xc); + r_params.set_user_defined_value("excited_state", true); + r_params.set_user_defined_value("states", num_states); + // Here +} + +/** + * Sets the response parameters for a frequency response calculation and writes + * to file + * + * @param r_params + * @param property + * @param xc + * @param frequency + */ +void set_frequency_response_parameters(ResponseParameters &r_params, const std::string &property, + const std::string &xc, const double &frequency, + bool high_precision) { + if (high_precision) { + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value("dconv", 1e-6); + } else { + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-6}); + r_params.set_user_defined_value("dconv", 1e-4); + } + r_params.set_user_defined_value("archive", std::string("../restartdata")); + r_params.set_user_defined_value("maxiter", size_t(30)); + r_params.set_user_defined_value("maxsub", size_t(5)); + r_params.set_user_defined_value("kain", true); + r_params.set_user_defined_value("omega", frequency); + r_params.set_user_defined_value("first_order", true); + r_params.set_user_defined_value("plot_all_orbitals", false); + r_params.set_user_defined_value("print_level", 20); + r_params.set_user_defined_value("save", true); + // set xc, property, frequency,and restart + r_params.set_user_defined_value("xc", xc); + // Here + if (property == "dipole") { + r_params.set_user_defined_value("dipole", true); + } else if (property == "nuclear") { + r_params.set_user_defined_value("nuclear", true); + } +} + +/*** + * sets the run path based on the run type set by r_params + * creates the run directory and sets current directory to the run data + * returns the name of parameter file to run from + * + * @param parameters + * @param frequency + * @param moldft_path + */ +static auto set_frequency_path_and_restart(ResponseParameters ¶meters, + const std::string &property, const double &frequency, + const std::string &xc, + const std::filesystem::path &moldft_path, + std::filesystem::path &restart_path, bool restart) + -> std::filesystem::path { + + print("set_frequency_path_and_restart"); + print("restart path", restart_path); + + + // change the logic create save path + auto frequency_run_path = + generate_response_frequency_run_path(moldft_path, property, frequency, xc); + print("frequency run path", frequency_run_path); + // Crea + if (std::filesystem::is_directory(frequency_run_path)) { + cout << "Response directory found " << std::endl; + } else {// create the file + std::filesystem::create_directory(frequency_run_path); + cout << "Creating response_path directory" << std::endl; + } + + std::filesystem::current_path(frequency_run_path); + // Calling this function will make the current working directory the + // frequency save path + auto [save_path, save_string] = generate_frequency_save_path(frequency_run_path); + print("save string", save_string); + + parameters.set_user_defined_value("save", true); + parameters.set_user_defined_value("save_file", save_string); + // if restart and restartfile exists go ahead and set the restart file + if (restart) { + if (std::filesystem::exists(save_path)) { + + parameters.set_user_defined_value("restart", true); + parameters.set_user_defined_value("restart_file", save_string); + print("found save directory... restarting from save_string ", save_string); + } else if (std::filesystem::exists(restart_path)) { + + print(" restart path", restart_path); + parameters.set_user_defined_value("restart", true); + + auto split_restart_path = split(restart_path.replace_extension("").string(), '/'); + + std::string restart_file_short = + "../" + split_restart_path[split_restart_path.size() - 2] + "/" + + split_restart_path[split_restart_path.size() - 1]; + print("relative restart path", restart_file_short); + parameters.set_user_defined_value("restart_file", restart_file_short); + print("found restart directory... restarting from restart_path.string ", + restart_path.string()); + + } else { + parameters.set_user_defined_value("restart", false); + // neither file exists therefore you need to start from fresh + } + } else { + parameters.set_user_defined_value("restart", false); + } + return save_path; +} + +/** + * + * @param world + * @param filename + * @param frequency + * @param property + * @param xc + * @param moldft_path + * @param restart_path + * @return + */ +auto RunResponse(World &world, const std::string &filename, double frequency, + const std::string &property, const std::string &xc, + const std::filesystem::path &moldft_path, std::filesystem::path restart_path, + bool highPrecision) -> std::pair { + + // Set the response parameters + ResponseParameters r_params{}; + set_frequency_response_parameters(r_params, property, xc, frequency, highPrecision); + auto save_path = set_frequency_path_and_restart(r_params, property, frequency, xc, moldft_path, + restart_path, true); + + if (world.rank() == 0) { molresponse::write_response_input(r_params, filename); } + // if rbase exists and converged I just return save path and true + if (std::filesystem::exists("response_base.json")) { + std::ifstream ifs("response_base.json"); + json response_base; + ifs >> response_base; + if (response_base["converged"]) { return {save_path, true}; } + } + auto calc_params = initialize_calc_params(world, std::string(filename)); + RHS_Generator rhs_generator; + if (property == "dipole") { + rhs_generator = dipole_generator; + } else { + rhs_generator = nuclear_generator; + } + FrequencyResponse calc(world, calc_params, frequency, rhs_generator); + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Time-Dependent Density Functional Theory Response " + "Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc_params.molecule.print(); + print("\n"); + calc_params.response_parameters.print("response"); + // put the response parameters in a j_molrespone json object + calc_params.response_parameters.to_json(calc.j_molresponse); + } + // set protocol to the first + calc.solve(world); + calc.time_data.to_json(calc.j_molresponse); + calc.time_data.print_data(); + calc.output_json(); + return {save_path, calc.j_molresponse["converged"]}; +} + +/*** + * sets the run path based on the run type set by r_params + * creates the run directory and sets current directory to the run data + * returns the name of parameter file to run from + * + * @param parameters + * @param frequency + * @param moldft_path + */ +static void set_and_write_restart_excited_parameters(ResponseParameters ¶meters, + excitedSchema &schema, bool restart) { + + parameters.set_user_defined_value("save", true); + parameters.set_user_defined_value("save_file", schema.save_string); + // if restart and restartfile exists go ahead and set the restart file + if (restart && std::filesystem::exists(schema.save_path)) { + print("setting restart"); + parameters.set_user_defined_value("restart", true); + parameters.set_user_defined_value("restart_file", schema.save_string); + } else { + parameters.set_user_defined_value("restart", false); + } + std::string filename = "response.in"; + molresponse::write_response_input(parameters, filename); +} + +/*** + * sets the run path based on the run type set by r_params + * creates the run directory and sets current directory to the run data + * returns the name of parameter file to run from + * + * @param parameters + * @param frequency + * @param moldft_path + */ +static void create_excited_paths(ResponseParameters ¶meters, excitedSchema &schema, + bool restart) { + + if (std::filesystem::is_directory(schema.excited_state_run_path)) { + cout << "Response directory found " << std::endl; + } else {// create the file + std::filesystem::create_directory(schema.excited_state_run_path); + cout << "Creating response_path directory" << std::endl; + } +} + +/** + * + * @param world + * @param filename + * @param frequency + * @param property + * @param xc + * @param moldft_path + * @param restart_path + * @return + */ +auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec) -> bool { + + + // Set the response parameters + ResponseParameters r_params{}; + + set_excited_parameters(r_params, schema.xc, schema.num_states, high_prec); + create_excited_paths(r_params, schema, restart); + std::filesystem::current_path(schema.excited_state_run_path); + set_and_write_restart_excited_parameters(r_params, schema, restart); + + auto calc_params = initialize_calc_params(world, "response.in"); + ExcitedResponse calc(world, calc_params); + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Time-Dependent Density Functional Theory Response " + "Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc_params.molecule.print(); + print("\n"); + calc_params.response_parameters.print("response"); + // put the response parameters in a j_molrespone json object + calc_params.response_parameters.to_json(calc.j_molresponse); + } + // set protocol to the first + calc.solve(world); + calc.output_json(); + return true; +} + +/** + * Takes in the moldft path where moldft restart file exists + * runs a response calculations for given property at given frequencies. + * + * + * @param world + * @param moldft_path + * @param frequencies + * @param xc + * @param property + */ +void runFrequencyTests(World &world, const frequencySchema &schema, bool high_prec) { + + std::filesystem::current_path(schema.moldft_path); + // add a restart path + auto restart_path = addPath(schema.moldft_path, "/" + schema.op + "_0-000000.00000/restart_" + + schema.op + "_0-000000.00000"); + std::pair success{schema.moldft_path, false}; + bool first = true; + for (const auto &freq: schema.freq) { + print(success.second); + std::filesystem::current_path(schema.moldft_path); + if (first) { + first = false; + } else if (success.second) { + // if the previous run succeeded then set the restart path + print("restart_path", restart_path); + restart_path = success.first; + print("restart_path = success.first", restart_path); + } else { + throw Response_Convergence_Error{}; + } + + success = RunResponse(world, "response.in", freq, schema.op, schema.xc, schema.moldft_path, + restart_path, high_prec); + + print("Frequency ", freq, " completed"); + } +} + + +/** + * + * @param world + * @param m_schema + * @param try_moldft do we try moldft or not... if we try we still may restart + * @param restart do we force a restart or not + * @param high_prec high precision or no? + */ +void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, bool high_prec) { + + if (std::filesystem::is_directory(m_schema.moldft_path)) { + cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; + } else {// create the file + std::filesystem::create_directory(m_schema.moldft_path); + cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" + << m_schema.moldft_path << ":\n"; + } + std::filesystem::current_path(m_schema.moldft_path); + cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; + + runMOLDFT(world, m_schema, try_moldft, restart, high_prec); +} + +#endif// MADNESS_RUNNERS_HPP diff --git a/src/apps/molresponse/testing/test_density_vector.cpp b/src/apps/molresponse/testing/test_density_vector.cpp deleted file mode 100644 index 8d40f4b69a8..00000000000 --- a/src/apps/molresponse/testing/test_density_vector.cpp +++ /dev/null @@ -1,49 +0,0 @@ -// -// Created by adrianhurtado on 1/1/22. -// - -#include "molresponse/ResponseExceptions.hpp" -#include "molresponse/densityVector.hpp" -#include "molresponse/global_functions.h" -#include - -#if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) - -#include -#include -#include - -static inline int file_exists(const char *input_name) { - struct stat buffer {}; - size_t rc = stat(input_name, &buffer); - return (rc == 0); -} - -#endif - - -TEST_CASE("Test Density Vectors", "Testing Basic Functionality of Response Functions") { - - World &world = World::get_default(); - print_meminfo(world.rank(), "startup"); - FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); - std::cout.precision(6); - - const char *input_file = "response.in"; - if (world.rank() == 0) { print("input filename: ", input_file); } - if (!file_exists(input_file)) { throw Input_Error{}; } - - - auto calc_params = initialize_calc_params(world, std::string(input_file)); - auto &[ground_calculation, molecule, response_parameters] = calc_params; - vecfuncT ground_orbitals = ground_calculation.orbitals(); - - response_parameters.print("ResponseParameters", "Not sure footer"); - - ResponseBase calc(world, calc_params); - calc.solve(world); - - - - -} diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp new file mode 100644 index 00000000000..309a9f0b986 --- /dev/null +++ b/src/apps/molresponse/testing/test_development.cpp @@ -0,0 +1,64 @@ +// +// Created by adrianhurtado on 1/1/22. +// + +#include + +#include "ExcitedResponse.hpp" +#include "FrequencyResponse.hpp" +#include "ResponseExceptions.hpp" +#include "TDDFT.h" +#include "apps/chem/SCF.h" +#include "apps/external_headers/catch.hpp" +#include "apps/external_headers/tensor_json.hpp" +#include "madness/world/worldmem.h" +#include "response_functions.h" +#include "response_parameters.h" +#include "runners.hpp" +#include "string" +#include "timer.h" +#include "write_test_input.h" +#include "x_space.h" + + +using path = std::filesystem::path; + +int main(int argc, char *argv[]) { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + + auto root = std::filesystem::current_path();//="/"+molecule_name; + auto molecule_path = root; + molecule_path += "/molecules"; + + const std::string molecule_name = "Be"; + const std::string xc = "hf"; + const std::string op = "excited-state"; + // A calculation is defined by a molecule, functional, and operator + // xc include (hf/lda) + // operators include (excited-state) + auto schema = runSchema(xc); + auto mol_path = addPath(schema.molecule_path, molecule_name); + auto m_schema = moldftSchema(molecule_name, xc, schema); + auto excited_schema = excitedSchema(schema, m_schema); + excited_schema.print(); + ResponseParameters r_params{}; + set_excited_parameters(r_params, excited_schema.xc, excited_schema.num_states); + create_excited_paths(r_params, excited_schema, false); + std::filesystem::current_path(excited_schema.excited_state_run_path); + set_and_write_restart_excited_parameters(r_params, excited_schema, false); + auto xc_path = create_xc_path_and_directory(root, xc); + + auto calc_params = initialize_calc_params(world, "response.in"); + + ExcitedResponse calc(world, calc_params); + ExcitedTester tester{world, calc, 1e-4}; + auto guess = tester.test_ao_guess(world, calc); + + + // print_meminfo(world.rank(), "startup"); + // std::cout.precision(6); + // print_stats(world); +} diff --git a/src/apps/molresponse/testing/test_response_functions.cpp b/src/apps/molresponse/testing/test_response_functions.cpp deleted file mode 100644 index 17d2c187f54..00000000000 --- a/src/apps/molresponse/testing/test_response_functions.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// Created by adrianhurtado on 1/1/22. -// - -#include "madness/tensor/tensor_json.hpp" -#include "response_functions.h" -#include "timer.h" -#include "string" -#include "x_space.h" - -TEST_CASE("Test Response Functions", "Testing Basic Functionality of Response Functions") { - - int argc = 1; - char** argv = nullptr; - initialize(argc, argv); // initializes a world argument with argc and argv - { - World world(SafeMPI::COMM_WORLD); - startup(world, - 1, - nullptr, - true); // TODO: ask Robert about proper startup and implement - molresponse::start_timer(world); - // Everything goes in here - ResponseParameters r_params; - json j; - r_params.to_json(j); - world.gop.fence(); - std::cout< + +#include "response_parameters.h" + +namespace molresponse { + + /// will write a test input and remove it from disk upon destruction + struct write_test_input { + + double eprec = 1.e-4;// was 1e-4 ... trying to make test faster + + std::string filename_; + std::string molecule_path; + bool keepfile = true; + + write_test_input() : filename_("moldft.in") {} + + explicit write_test_input(const CalculationParameters& param, const std::string& filename, + std::string mol_path) + : filename_(filename),molecule_path(mol_path) { + std::ofstream of(filename_); + write_to_test_input("dft", ¶m, of); + write_molecule_to_test_input(molecule_path, of); + of.close(); + } + + ~write_test_input() { + if (not keepfile) std::remove(filename_.c_str()); + } + + std::string filename() const { return filename_; } + + static std::ostream& write_to_test_input(const std::string& groupname, + const QCCalculationParametersBase* param, + std::ostream& of) { + of << groupname << endl; + of << param->print_to_string(true); + of << "end\n"; + return of; + } + + static std::ostream& write_molecule_to_test_input(std::string mol_path, std::ostream& of) { + + + std::cout<print_to_string(true); + of << "end\n"; + return of; + } + }; + + +}// namespace madness + + +#endif//MADNESS_WRITE_RESPONSE_INPUT_H diff --git a/src/madness/tensor/tensor_json.hpp b/src/madness/tensor/tensor_json.hpp index db268a67f91..db567d1507c 100644 --- a/src/madness/tensor/tensor_json.hpp +++ b/src/madness/tensor/tensor_json.hpp @@ -10,80 +10,89 @@ // #include "catch.hpp" #include + +#include "mra.h" #include "tensor.h" //using namespace madness; //using json = nlohmann::json; namespace madness { -template -nlohmann::json tensor_to_json(const Tensor& m) { - nlohmann::json j = nlohmann::json{}; - // auto dimensions = m.dims(); - long size = m.size(); ///< Number of elements in the tensor - long n_dims = m.ndim(); ///< Number of dimensions (-1=invalid; 0=no - ///< supported; >0=tensor) - auto dims = m.dims(); // the size of each dimension - // long id = m.id(); ///< Id from TensorTypeData in type_data.h - // auto strides = m.strides(); - auto fm = m.flat(); - auto m_vals_vector = std::vector(size); - auto m_dims_vector = std::vector(n_dims); - std::copy(&fm[0], &fm[0] + size, m_vals_vector.begin()); - std::copy(dims, dims + n_dims, m_dims_vector.begin()); - - // This is everything we need to translate to a numpy vector... - j["size"] = size; - j["vals"] = m_vals_vector; - j["dims"] = m_dims_vector; - - print(j); - return j; -} - -template -Tensor tensor_from_json(const nlohmann::json& j) { - // need to be explicit here about types so we find the proper Tensor - // constructors - long size = j["size"]; - std::vector m_vals_vector = j["vals"]; - std::vector m_dims_vector = j["dims"]; - - Tensor flat_m(size); - // copy the values from the vector to the flat tensor - std::copy(m_vals_vector.begin(), m_vals_vector.end(), &flat_m[0]); - // reshape the tensor using dimension vector - Tensor m = flat_m.reshape(m_dims_vector); - return m; -} - -using vec_pair_ints = std::vector>; - -template -using vec_pair_T = std::vector>; - -template -using vec_pair_tensor_T = std::vector>>; - -template -void to_json(nlohmann::json& j, std::vector>> tensors) { - for (const auto& val: tensors) { - j[val.first] = tensor_to_json(val.second); + template + nlohmann::json tensor_to_json(const Tensor& m) { + nlohmann::json j = nlohmann::json{}; + // auto dimensions = m.dims(); + long size = m.size(); ///< Number of elements in the tensor + long n_dims = m.ndim();///< Number of dimensions (-1=invalid; 0=no + ///< supported; >0=tensor) + auto dims = m.dims();// the size of each dimension + // long id = m.id(); ///< Id from TensorTypeData in type_data.h + // auto strides = m.strides(); + auto fm = m.flat(); + auto m_vals_vector = std::vector(size); + auto m_dims_vector = std::vector(n_dims); + std::copy(&fm[0], &fm[0] + size, m_vals_vector.begin()); + std::copy(dims, dims + n_dims, m_dims_vector.begin()); + + // This is everything we need to translate to a numpy vector... + j["size"] = size; + j["vals"] = m_vals_vector; + j["dims"] = m_dims_vector; + + //print(j); + return j; + } + + template + Tensor tensor_from_json(const nlohmann::json& j) { + // need to be explicit here about types so we find the proper Tensor + // constructors + long size = j["size"]; + std::vector m_vals_vector = j["vals"]; + std::vector m_dims_vector = j["dims"]; + + Tensor flat_m(size); + // copy the values from the vector to the flat tensor + std::copy(m_vals_vector.begin(), m_vals_vector.end(), &flat_m[0]); + // reshape the tensor using dimension vector + Tensor m = flat_m.reshape(m_dims_vector); + return m; + } + + using vec_pair_ints = std::vector>; + + template + using vec_pair_T = std::vector>; + + template + using vec_pair_tensor_T = std::vector>>; + + template + void to_json(nlohmann::json& j, std::vector>> tensors) { + for (const auto& val: tensors) { j[val.first] = tensor_to_json(val.second); } } -} -template -void to_json(nlohmann::json& j, const vec_pair_T& num_vals) { - for (const auto& val: num_vals) { - j[val.first] = val.second; + template + void to_json(nlohmann::json& j, const vec_pair_T& num_vals) { + for (const auto& val: num_vals) { j[val.first] = val.second; } } -} -template -void output_schema(std::string schema_name, const nlohmann::json& j) { - std::ofstream ofs(schema_name + ".json"); - ofs << j; -} -} + template + void output_schema(std::string schema_name, nlohmann::json& j) { + std::ofstream ofs(schema_name + ".json"); + auto print_time = std::chrono::system_clock::now(); + auto in_time_t = std::chrono::system_clock::to_time_t(print_time); + std::stringstream ss; + ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); + + print(ss.str()); + print("printing j", j); + + j["time"] = ss.str(); + j["wall_time"] = wall_time(); + + ofs << std::setw(4) << j; + } +}// namespace madness -#endif // MADNESS_TENSOR_JSON_H +#endif// MADNESS_TENSOR_JSON_H From ab71e0d57a9b833263b3d1807e417904b4c53a44 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 31 Aug 2022 16:03:51 -0400 Subject: [PATCH 0218/1312] moresponse --- src/apps/molresponse/CMakeLists.txt | 83 +- src/apps/molresponse/ExcitedResponse.cpp | 3069 +++++++++ src/apps/molresponse/ExcitedResponse.hpp | 155 + src/apps/molresponse/FrequencyResponse.cpp | 487 ++ src/apps/molresponse/FrequencyResponse.hpp | 58 + src/apps/molresponse/ResponseBase.cpp | 2050 +++--- src/apps/molresponse/ResponseBase.hpp | 296 +- src/apps/molresponse/ResponseExceptions.hpp | 22 +- src/apps/molresponse/TDDFT.cc | 5962 ++++++++---------- src/apps/molresponse/TDDFT.h | 12 +- src/apps/molresponse/calc_runner.cc | 1324 ++-- src/apps/molresponse/density.cc | 8 +- src/apps/molresponse/density.h | 6 +- src/apps/molresponse/global_functions.cc | 113 +- src/apps/molresponse/global_functions.h | 62 +- src/apps/molresponse/ground_parameters.h | 72 +- src/apps/molresponse/iter_freq2.cc | 4 +- src/apps/molresponse/iterate_excited.cc | 2 +- src/apps/molresponse/iterate_freq.cc | 4 +- src/apps/molresponse/iterate_gamma.cc | 2 +- src/apps/molresponse/molresponse.cc | 173 +- src/apps/molresponse/property.cc | 2 +- src/apps/molresponse/property.h | 2 +- src/apps/molresponse/response_functions.h | 89 +- src/apps/molresponse/response_parameters.cpp | 40 +- src/apps/molresponse/response_parameters.h | 466 +- src/apps/molresponse/timer.cc | 57 +- src/apps/molresponse/timer.h | 4 + src/apps/molresponse/x_space.cc | 127 + src/apps/molresponse/x_space.h | 643 +- 30 files changed, 9862 insertions(+), 5532 deletions(-) create mode 100644 src/apps/molresponse/ExcitedResponse.cpp create mode 100644 src/apps/molresponse/ExcitedResponse.hpp create mode 100644 src/apps/molresponse/FrequencyResponse.cpp create mode 100644 src/apps/molresponse/FrequencyResponse.hpp create mode 100644 src/apps/molresponse/x_space.cc diff --git a/src/apps/molresponse/CMakeLists.txt b/src/apps/molresponse/CMakeLists.txt index 9421a389d89..c58ab0a5ea6 100644 --- a/src/apps/molresponse/CMakeLists.txt +++ b/src/apps/molresponse/CMakeLists.txt @@ -1,28 +1,26 @@ # src/apps/molresponse add_subdirectory(testing) - # Set the CHEM sources and header files set(MOLRESPONSE_SOURCES - density.cc + ResponseBase.cpp + ExcitedResponse.cpp + FrequencyResponse.cpp property.cc - TDDFT.cc global_functions.cc - calc_runner.cc timer.cc basic_operators.cc Plot_VTK.cc - iter_freq2.cc - iterate_excited.cc - Lambda_X.cc - Theta_X.cc response_parameters.cpp - iterate_gamma.cc + x_space.cc ) set(MOLRESPONSE_HEADERS + ResponseBase.hpp + ExcitedResponse.hpp + FrequencyResponse.hpp density.h property.h - TDDFT.h + x_space.h global_functions.h timer.h basic_operators.h @@ -33,9 +31,68 @@ set(MOLRESPONSE_HEADERS add_mad_library(response MOLRESPONSE_SOURCES MOLRESPONSE_HEADERS "chem" "madness/chem/molresponse/") set(targetname MADresponse) +add_mad_executable(molresponse "molresponse.cc" "MADresponse;MADchem") + + +set(R_BASE_SOURCES + ResponseBase.cpp + ExcitedResponse.cpp + FrequencyResponse.cpp + property.cc + global_functions.cc + timer.cc + basic_operators.cc + Plot_VTK.cc + response_parameters.cpp + x_space.cc + ) + +set(R_BASE_HEADERS + ResponseBase.hpp + ExcitedResponse.hpp + FrequencyResponse.hpp + density.h + property.h + global_functions.h + x_space.h + timer.h + basic_operators.h + Plot_VTK.h + response_parameters.h + ) +# Create the MADchem library +add_mad_library(response_base R_BASE_SOURCES R_BASE_HEADERS "chem" "molresponse/") -add_dependencies(applications-madness MADresponse) -install(TARGETS MADresponse DESTINATION "${MADNESS_INSTALL_BINDIR}") -# +set(targetname MADresponse_base) +set(RALL_SOURCES + ResponseBase.cpp + ExcitedResponse.cpp + FrequencyResponse.cpp + property.cc + global_functions.cc + timer.cc + basic_operators.cc + Plot_VTK.cc + response_parameters.cpp + calc_runner.cc + iterate_excited.cc + Lambda_X.cc + Theta_X.cc + x_space.cc + ) +set(RALL_HEADERS + ResponseBase.hpp + ExcitedResponse.hpp + FrequencyResponse.hpp + property.h + global_functions.h + timer.h + basic_operators.h + Plot_VTK.h + response_parameters.h + x_space.h + ) +add_mad_library(all_response RALL_SOURCES RALL_HEADERS "chem" "molresponse/") +set(targetname MADall_response) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp new file mode 100644 index 00000000000..ca6c08e2723 --- /dev/null +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -0,0 +1,3069 @@ +// +// Created by adrianhurtado on 1/28/22. +// + +#include "ExcitedResponse.hpp" + +void ExcitedResponse::initialize(World &world) { + + X_space trial(world, 2 * r_params.num_states(), r_params.num_orbitals()); + // make the trial functions + if (world.rank() == 0) print("\n Creating trial functions.\n"); + if (r_params.random()) { + trial = make_random_trial(world, 2 * r_params.num_states()); + } else if (r_params.nwchem()) { + // Virtual orbitals from NWChem + trial = make_nwchem_trial(world, 2 * r_params.num_states()); + } else if (r_params.guess_xyz()) { + trial = create_trial_functions2(world); + // Use a symmetry adapted operator on ground state functions + } else { + auto temp_trial = create_virtual_ao_guess(world); + if (temp_trial.num_states() >= 2 * r_params.num_states()) { + std::copy(temp_trial.X.begin(), temp_trial.X.begin() + 2 * r_params.num_states(), + trial.X.begin()); + + } else if (temp_trial.num_states() >= r_params.num_states()) { + trial = X_space(world, temp_trial.num_states(), r_params.num_orbitals()); + std::copy(temp_trial.X.begin(), temp_trial.X.begin() + temp_trial.num_states(), + trial.X.begin()); + + } else { + MADNESS_EXCEPTION("guess virtual ao did not produce enough states for calculation", 1); + } + } + + + if (world.size() > 1) { + // Start a timer + if (r_params.num_orbitals() >= 1) molresponse::start_timer(world); + if (world.rank() == 0) print("");// Makes it more legible + + LoadBalanceDeux<3> lb(world); + for (size_t j = 0; j < r_params.num_states(); j++) { + for (size_t k = 0; k < r_params.num_orbitals(); k++) { + lb.add_tree(trial.X[j][k], lbcost(1.0, 8.0), true); + } + } + for (size_t j = 0; j < r_params.num_orbitals(); j++) { + lb.add_tree(ground_orbitals[j], lbcost(1.0, 8.0), true); + } + FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); + + if (r_params.num_orbitals() >= 1) molresponse::end_timer(world, "Load balancing:"); + } + + // Project out ground state from guesses + QProjector projector(world, ground_orbitals); + for (unsigned int i = 0; i < trial.X.size(); i++) trial.X[i] = projector(trial.X[i]); + + // Ensure orthogonal guesses + for (size_t i = 0; i < 2; i++) { + molresponse::start_timer(world); + // Orthog + trial.X = gram_schmidt(world, trial.X); + molresponse::end_timer(world, "orthog"); + + molresponse::start_timer(world); + // Normalize + normalize(world, trial.X); + molresponse::end_timer(world, "normalize"); + } + + // Diagonalize guess + if (world.rank() == 0) + print("\n Iterating trial functions for an improved initial " + "guess.\n"); + iterate_trial(world, trial); + // Sort + sort(world, omega, trial.X); + // Basic output + if (r_params.num_orbitals() >= 1 and world.rank() == 0) { + print("\n Final initial guess excitation energies:"); + print(omega); + } + // Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); + // Select lowest energy functions from guess + Chi.X = select_functions(world, trial.X, omega, r_params.num_states(), r_params.num_orbitals()); + Chi.Y = response_space(world, r_params.num_states(), r_params.num_orbitals()); + // save the guesses at the very least + world.gop.fence(); + save(world, "guess_restart"); + + trial.clear(); + // Initial guess for y are zero functions +} +// Creates random guess functions semi-intelligently(?) +/// & creates random guesses for nu +/// \param world +/// \param num_states +/// \return +X_space ExcitedResponse::make_random_trial(World &world, size_t m) const { + // Basic output + if (world.rank() == 0) print(" Using a random guess for initial response functions.\n"); + size_t n = r_params.num_orbitals(); + // Create empty container and add in randomness + X_space f(world, m, n); + f.X = add_randomness(world, f.X, 1e3);// noise all over the world + f.X = mask * f.X; // make sure you mask after you add noise to the world + + // Create and apply a centered gaussian on each atom so that the + // randomness is localized around the atoms + real_function_3d gaus = real_factory_3d(world); + for (auto atom: molecule.get_atoms()) { + real_function_3d x = real_factory_3d(world).functor(real_functor_3d( + new GaussianGuess<3>(atom.get_coords(), 0.01, std::vector{0, 0, 0}))); + gaus = gaus + x; + } + f = f * gaus; + + // Project out groundstate from guesses + QProjector projector(world, ground_orbitals); + for (unsigned int i = 0; i < f.num_states(); i++) f.X[i] = projector(f.X[i]); + + // Normalize + normalize(world, f.X); + + return f; +} + +// Creates an initial guess function from nwchem output files +X_space ExcitedResponse::make_nwchem_trial(World &world, size_t m) const { + // Basic output + if (world.rank() == 0) + print(" Creating an initial guess from NWChem file", r_params.nwchem_dir()); + + // Create empty containers + response_space f; + + // Create the nwchem reader + slymer::NWChem_Interface nwchem(r_params.nwchem_dir(), std::cout); + + // For parallel runs, silencing all but 1 slymer instance + if (world.rank() != 0) { + std::ostream dev_null(nullptr); + nwchem.err = dev_null; + } + + // Read in basis set + nwchem.read(slymer::Properties::Basis); + + // Read in the molecular orbital coefficients, energies, + // and occupancies + nwchem.read(slymer::Properties::MOs | slymer::Properties::Energies | + slymer::Properties::Occupancies); + + // Create the nwchem orbitals as madness functions + std::vector temp1; + for (auto basis: slymer::cast_basis(nwchem.basis_set)) { + // Get the center of gaussian as its special point + std::vector centers; + coord_3d r; + r[0] = basis.get().center[0]; + r[1] = basis.get().center[1]; + r[2] = basis.get().center[2]; + centers.push_back(r); + + // Now make the function + temp1.push_back(FunctionFactory(world).functor( + std::shared_ptr>( + new slymer::Gaussian_Functor(basis.get(), centers)))); + + // Let user know something is going on + if (temp1.size() % 10 == 0 and world.rank() == 0) + print("Created", temp1.size(), "functions."); + } + if (world.rank() == 0) print("Finished creating", temp1.size(), "functions."); + + // Normalize ao's + madness::normalize(world, temp1); + + // Transform ao's now + std::vector temp = + madness::transform(world, temp1, nwchem.MOs, FunctionDefaults<3>::get_thresh(), true); + + // Now save the unoccupied orbitals + std::vector temp2; + size_t num_virt = 0; + for (size_t i = 0; i < temp1.size(); i++) { + if (nwchem.occupancies[i] == 0) { + temp2.push_back(temp[i]); + num_virt++; + } + } + // Create as many vectors of functions as we can from these nwchem + // virtual orbitals putting 1 virtual orbital from nwchem per vector + for (size_t i = 0; i < std::max(m, num_virt); i++) { + // Create the vector to add the new function to + std::vector v1 = + zero_functions_compressed(world, ground_orbitals.size()); + + // Put the "new" function into the vector + v1[i % v1.size()] = temp2[i]; + + // Add vector to return container + f.push_back(v1); + + // See if we've made enough functions + if (f.size() >= m) break; + } + if (world.rank() == 0) print("Created", f.size(), "guess functions from provided NWChem data."); + + // If not enough functions have been made, start adding symmetry adapted + // functions + size_t n = f.size(); + + // If still not enough functions have been made, add in random guesses + if (n < m) { + // Tell user the bad news + if (world.rank() == 0) + print("\n Only", n, + "guess functions were provided by augmenting NWChem " + "functions.\n " + "Augmenting with random functions."); + + // Create the random guess + Molecule mol = molecule; + X_space rand = make_random_trial(world, m - n); + + // Add to vector of functions + for (unsigned int i = 0; i < rand.num_states(); i++) f.push_back(rand.X[i]); + } + + // Project out groundstate from guesses + QProjector projector(world, ground_orbitals); + for (unsigned int i = 0; i < f.size(); i++) f[i] = projector(f[i]); + + // Truncate and normalize + f.truncate_rf(); + normalize(world, f); + + X_space trial(world, f.size(), n); + trial.X = f; + + return trial; +} +// Returns initial guess functions as +// ground MO * solid harmonics +X_space ExcitedResponse::create_trial_functions(World &world, size_t k) const { + // Get size + print("In create trial functions"); + auto n = r_params.num_orbitals(); + + // Create solid harmonics such that num. solids * num. orbitals > k. + // The total number of solid harmonics that exist up to level n is + // (n+1)^2 (because we count from zero) + // Always do at least 8 (through the d orbital angular momentum functions, + // minus ) + std::map, real_function_3d> solids = + solid_harmonics(world, std::max(2.0, ceil(sqrt(k / n) - 1))); + + // Useful info. + if (world.rank() == 0) print(" Created", solids.size(), "solid harmonics.\n"); + + // Container to return + response_space trials_X; + + // Counter for number of trials created + size_t count = 0; + + // for every + + + // Multiply each solid harmonic onto a ground state orbital + for (size_t i = 0; i < n; i++) { + // For each solid harmonic + for (const auto &key: solids) { + // Temp zero functions + // // n temp zero functions + std::vector temp = + zero_functions_compressed(world, static_cast(n)); + + // Create one non-zero function and add to trials + print("index ", n - count % n - 1); + temp[count % n] = key.second * ground_orbitals[n - count % n - 1]; + trials_X.push_back(temp); + count++; + } + + // Stop when we first get beyond k components + if (count >= k) break; + } + + // Debugging output + if (r_params.print_level() >= 2) { + if (world.rank() == 0) print(" Norms of guess functions:"); + print_norms(world, trials_X); + } + + // Truncate + madness::truncate(world, trials_X, madness::FunctionDefaults<3>::get_thresh(), true); + + X_space trials(world, count, n); + trials.X = trials_X.copy(); + trials_X.clear(); + + // Done + return trials; +} + +// Returns initial guess functions as +// ground MO * +X_space ExcitedResponse::create_trial_functions2(World &world) const { + // Get size + size_t n = ground_orbitals.size(); + size_t directions = 3; + // (n+1)^2 (because we count from zero) + + // make a vector of xyz functions {x,y,z} + auto xyz = make_xyz_functions(world); + // create 3 x n orbital functions + std::vector> functions; + + // + + for (const auto &d: xyz) { + vector_real_function_3d temp; + for (const auto &orb: ground_orbitals) { temp.push_back(d * orb); } + functions.push_back(temp); + } + + // Container to return + size_t count = 0; + + X_space trials(world, 3 * n * n, n); + for (size_t i = 0; i < n; i++) { + for (size_t d = 0; d < directions; d++) { + for (size_t o = 0; o < n; o++) { + // trials[i + j + o][o] = functions[i][j]; + trials.X[count][o] = copy(functions.at(d).at(o)); + count++; + } + } + } + // The above generates response function as follows + // all functions start off as zeros + // 1 [x1 0 0 ] + // 2 [0 x1 0 ] + // 3 [0 0 x1 ] + // 4 [y1 0 0 ] + // 5 [0 y1 0 ] + // 6 [0 0 y1 ] + // 7 [z1 0 0 ] + // 8 [0 z1 0 ] + // 9 [0 0 z1 ] + // 10 [x2 0 0 ] + // 11 [0 x2 0 ] + // 12 [0 0 x2 ] + // 13 [y2 0 0 ] + // 14 [0 y2 0 ] + // 15 [0 0 y2 ] + // 16 [z2 0 0 ] + // 17 [0 z2 0 ] + // 18 [0 0 z2 ] + // 19 [x3 0 0 ] + // 20 [0 x3 0 ] + // 21 [0 0 x3 ] + // 22 [y3 0 0 ] + // 23 [0 y3 0 ] + // 24 [0 0 y3 ] + // 25 [z3 0 0 ] + // 26 [0 z3 0 ] + // 27 [0 0 z3 ] + // for each orbital for each direction + // Counter for number of trials created + // Multiply each solid harmonic onto a ground state orbital + // for each orbital we + + // For each solid harmonic + // Temp zero functions + + // Debugging output + if (r_params.print_level() >= 2) { + if (world.rank() == 0) print(" Norms of guess functions:"); + print_norms(world, trials.X); + } + + // Truncate + madness::truncate(world, trials.X); + + // Done + return trials; +} +// Simplified iterate scheme for guesses +void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { + // Variables needed to iterate + size_t iteration = 0;// Iteration counter + QProjector projector(world, + ground_orbitals);// Projector to project out ground state + size_t m = r_params.num_states(); // Number of excited states + size_t n = r_params.num_orbitals(); // Number of ground state orbitals + Tensor x_shifts; // Holds the shifted energy values + response_space bsh_resp(world, m, n); // Holds wave function corrections + response_space V; // Holds V^0 applied to response functions + response_space shifted_V;// Holds the shifted V^0 applied to response functions + Tensor S; // Overlap matrix of response components for x states + real_function_3d v_xc; // For TDDFT + + // Useful to have + response_space zeros(world, m, n); + + // Now to iterate + while (iteration < r_params.guess_max_iter()) { + // Start a timer for this iteration + molresponse::start_timer(world); + // + size_t N0 = guesses.X.size(); + size_t Ni = N0; + + // Basic output + if (r_params.print_level() >= 1) { + if (world.rank() == 0) + printf("\n Guess Iteration %d at time %.1fs\n", static_cast(iteration), + wall_time()); + if (world.rank() == 0) print(" -------------------------------------"); + } + + // Load balance + // Only balancing on x-components. Smart? + if (world.size() > 1 && ((iteration < 2) or (iteration % 5 == 0)) and + + iteration != 0) { + // Start a timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + if (world.rank() == 0) print("");// Makes it more legible + + LoadBalanceDeux<3> lb(world); + for (size_t j = 0; j < n; j++) { + for (size_t k = 0; k < r_params.num_states(); k++) { + lb.add_tree(guesses.X[k][j], lbcost(1.0, 8.0), true); + } + } + FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); + + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Load balancing:"); + } + + // compute rho_omega + auto rho_omega = transition_densityTDA(world, ground_orbitals, guesses.X); + // Project out ground state + for (size_t i = 0; i < Ni; i++) guesses.X[i] = projector(guesses.X[i]); + + // Truncate before doing expensive things + guesses.X.truncate_rf(); + + // Normalize after projection + if (r_params.tda()) normalize(world, guesses.X); + + // (TODO why not normalize if not tda) + // compute Y = false + auto xc = make_xc_operator(world); + auto [temp_Lambda_X, temp_V0X, temp_gamma] = + compute_response_potentials(world, guesses, xc, "tda"); + + // Debugging output + auto [new_omega, rotated_chi, rotated_lambda, rotated_v_x, rotated_gamma_x] = + rotate_excited_space(world, guesses, temp_Lambda_X, temp_V0X, temp_gamma); + + omega = copy(new_omega); + + // Ensure right number of omegas + if (size_t(omega.dim(0)) != Ni) { + if (world.rank() == 0) + print("\n Adding", Ni - omega.dim(0), + "eigenvalue(s) (counters subspace size " + "reduction in " + "diagonalizatoin)."); + Tensor temp(Ni); + temp(Slice(0, omega.dim(0) - 1)) = omega; + for (size_t i = omega.dim(0); i < Ni; i++) temp[i] = 2.5 * i; + omega = copy(temp); + } + + // Basic output + if (r_params.print_level() >= 1 and world.rank() == 0) { + print("\n Excitation Energies:"); + print("gi=", iteration, " roots: ", omega); + } + + // Only do BSH if not the last iteration + if (iteration + 1 < r_params.guess_max_iter()) { + // Calculates shifts needed for potential / energies + // If none needed, the zero tensor is returned + x_shifts = create_shift(world, ground_energies, omega, "x"); + + + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::start_timer(world); + } + X_space E0X(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); + if (r_params.localize() != "canon") { + E0X = rotated_chi.copy(); + E0X.X = E0X.X * ham_no_diag; + } + world.gop.fence(); + + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "E0mDX", "E0mDX", iter_timing); + } + X_space theta_X = X_space(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); + + theta_X = rotated_v_x - E0X + rotated_gamma_x; + + + theta_X.X = apply_shift(world, x_shifts, theta_X.X, guesses.X); + theta_X.X = theta_X.X * -2; + theta_X.X.truncate_rf(); + + // Construct BSH operators + auto bsh_x_operators = + create_bsh_operators(world, x_shifts, ground_energies, omega, r_params.lo(), + FunctionDefaults<3>::get_thresh()); + + // Apply BSH and get updated components + if (r_params.print_level() >= 1) molresponse::start_timer(world); + bsh_resp = apply(world, bsh_x_operators, theta_X.X); + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply BSH:"); + + // Project out ground state + for (size_t i = 0; i < Ni; i++) bsh_resp[i] = projector(bsh_resp[i]); + // Save new components + guesses.X = bsh_resp; + // Apply mask + for (size_t i = 0; i < Ni; i++) guesses.X[i] = mask * guesses.X[i]; + } + + // Ensure orthogonal guesses + for (size_t i = 0; i < 2; i++) { + molresponse::start_timer(world); + // Orthog + guesses.X = gram_schmidt(world, guesses.X); + molresponse::end_timer(world, "orthog"); + + molresponse::start_timer(world); + // Normalize + normalize(world, guesses.X); + molresponse::end_timer(world, "normalize"); + } + + // Update counter + iteration += 1; + // Done with the iteration.. truncate + guesses.X.truncate_rf(); + + // Basic output + if (r_params.print_level() >= 1) {// + molresponse::end_timer(world, " This iteration:"); + } + } +}// Done with iterate gues + // Simplified iterate scheme for guesses + +/** + * @brief Diagonalize AX=SX frequencies + * + * @param world + * @param S + * @param old_S + * @param old_A + * @param x_response + * @param old_x_response + * @param ElectronResponses + * @param OldElectronResponses + * @param frequencies + * @param iteration + * @param m + */ + +void ExcitedResponse::deflateGuesses(World &world, X_space &Chi, X_space &Lambda_X, + Tensor &S, Tensor &frequencies, + size_t &iteration, size_t &m) const { + // XX =Omega XAX + S = response_space_inner(Chi.X, Chi.X); + Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Guess Overlap matrix:"); + print(S); + print(" Guess XAX matrix:"); + print(XAX); + } + // Just to be sure dimensions work out, clear frequencies + frequencies.clear(); + diagonalizeFockMatrix(world, Chi, Lambda_X, frequencies, XAX, S, + FunctionDefaults<3>::get_thresh()); +} + +void ExcitedResponse::deflateTDA(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &old_Lambda_X, Tensor &S, Tensor old_S, + Tensor old_A, Tensor &omega, size_t &iteration, + size_t &m) { + S = response_space_inner(Chi.X, Chi.X); + Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Overlap matrix:"); + print(S); + } + + // Augment S_x, A_x, x_gamma, x_response, V_x_response and x_gamma + // if using a larger subspace and not iteration zero (TODO ---Gotta + // look at this and make sure it uses my new functions molresponse ) + // by default r_params.larger_subspace() = 0 therefore never uses this + if (iteration < r_params.larger_subspace() and iteration > 0) { + print("Using augmented subspace"); + augment(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, XAX, old_S, old_A, + r_params.print_level()); + } + + // Solve Ax = Sxw + // Just to be sure dimensions work out, clear omega + omega.clear(); + diagonalizeFockMatrix(world, Chi, Lambda_X, omega, XAX, S, FunctionDefaults<3>::get_thresh()); + + // If larger subspace, need to "un-augment" everything + if (iteration < r_params.larger_subspace()) { + print("Unaugmenting subspace"); + unaugment(world, Chi, old_Chi, Lambda_X, old_Lambda_X, omega, S, XAX, old_S, old_A, + r_params.num_states(), iteration, r_params.print_level()); + } +} + +void ExcitedResponse::deflateFull(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &old_Lambda_X, Tensor &S, Tensor old_S, + Tensor old_A, Tensor &omega, size_t &iteration, + size_t &m) { + // Debugging output + Tensor A; + + if (iteration < r_params.larger_subspace() and iteration > 0) { + print("Entering Augment Full"); + augment_full(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, A, old_S, old_A, + r_params.print_level()); + // computes Augments A and S + + } else { + S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); + if (world.rank() == 0 && (r_params.print_level() >= 10)) { + print("\n Overlap Matrix:"); + print(S); + X_space Chi_copy = Chi.copy(); + Chi_copy.truncate(); + Lambda_X.truncate(); + A = inner(Chi_copy, Lambda_X); + A = 0.5 * (A + transpose(A)); + } + + + if (world.rank() == 0 && (r_params.print_level() >= 10)) { + print("\n Lambda Matrix:"); + print(A); + } + } + + omega.clear(); + + Tensor U = diagonalizeFullResponseMatrix(world, Chi, Lambda_X, omega, S, A, + FunctionDefaults<3>::get_thresh(), + r_params.print_level()); + + if (iteration < r_params.larger_subspace() and iteration > 0) { + print("Entering Unaugment Full"); + unaugment_full(world, Chi, old_Chi, Lambda_X, old_Lambda_X, omega, S, A, old_S, old_A, + r_params.num_states(), iteration, r_params.print_level()); + } else { + old_Chi = Chi.copy(); + old_Lambda_X = Lambda_X.copy(); + } +} +std::tuple, X_space, X_space, X_space, X_space> +ExcitedResponse::rotate_excited_space(World &world, X_space &chi, X_space &lchi, X_space &v_chi, + X_space &gamma_chi) { + // Debugging output + Tensor A; + + X_space chi_copy = chi.copy(); + + X_space l_copy = lchi.copy(); + + Tensor S = response_space_inner(chi_copy.X, chi_copy.X) - + response_space_inner(chi_copy.Y, chi_copy.Y); + + if (world.rank() == 0) { + auto sm = S - transpose(S); + print(sm.max()); + } + S = 0.5 * (S + transpose(S)); + + + if (world.rank() == 0 && (r_params.print_level() >= 10)) { + print("\n Overlap Matrix:"); + print(S); + } + // + A = inner(chi_copy, l_copy); + if (world.rank() == 0) { + auto am = A - transpose(A); + print("largest non-symmetric :", am.max()); + } + A = 0.5 * (A + transpose(A)); + if (world.rank() == 0 && (r_params.print_level() >= 10)) { + print("\n Lambda Matrix:"); + print(A); + } + + auto [new_omega, U] = excited_eig(world, S, A, FunctionDefaults<3>::get_thresh()); + + if (world.rank() == 0 and r_params.print_level() >= 2) { + print(" Eigenvector coefficients from diagonalization:"); + print(U); + print(new_omega); + } + auto [rotated_chi, rotated_l_chi, rotated_v_chi, rotated_gamma_chi] = + rotate_excited_vectors(world, U, chi, lchi, v_chi, gamma_chi); + + return {new_omega, rotated_chi, rotated_l_chi, rotated_v_chi, rotated_gamma_chi}; +} + +std::tuple, Tensor, Tensor> ExcitedResponse::reduce_subspace( + World &world, Tensor &S, Tensor &A, const double thresh_degenerate) { + + + // Get size + size_t m = S.dim(0); + // Run an SVD on the overlap matrix and ignore values + // less than thresh_degenerate + Tensor r_vecs, s_vals, l_vecs; + Tensor S_copy = copy(S); + // Step 1 find the svd of S + svd(S_copy, l_vecs, s_vals, r_vecs); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print("\n Singular values of overlap matrix:"); + print(s_vals); + print(" Left singular vectors of overlap matrix:"); + print(l_vecs); + } + + // Step 2 find the number of singular values below threshold + size_t num_zero = 0; + for (int64_t i = 0; i < s_vals.dim(0); i++) { + if (s_vals(i) < 10 * thresh_degenerate) { + if (world.rank() == 0 and num_zero == 0) print(""); + if (world.rank() == 0) + printf(" Detected singular value (%.8f) below threshold (%.8f). " + "Reducing subspace size.\n", + s_vals(i), 10 * thresh_degenerate); + num_zero++; + } + if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_zero > 0) print(""); + } + + // in the overlap matrix + size_t size_l = s_vals.dim(0); // number of singular values + size_t size_s = size_l - num_zero;// smaller subspace size + + Tensor l_vecs_s(size_l, size_s); + + Tensor copyA = copy(A);// we copy xAx + // Transform into this smaller space if necessary + if (num_zero > 0) { + print("num_zero = ", num_zero); + // Cut out the singular values that are small + // (singular values come out in descending order) + // S(m-sl,m-sl) + S = Tensor(size_s, size_s);// create size of new size + + // copy the singular values into the diagonal of smaller space + for (size_t i = 0; i < size_s; i++) { S(i, i) = s_vals(i); } + + // Copy the active vectors to a smaller container + // left vectors [m,m-sl] + l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Reduced size left singular vectors of overlap matrix:"); + print(l_vecs_s); + } + + // Transform + // Work(m,m-sl) + Tensor work(size_l, size_s); + // dimi,dimj,dimk,c,a,b + mxm(size_l, size_s, size_l, work.ptr(), A.ptr(), l_vecs_s.ptr()); + // A*left + copyA = Tensor(size_s, size_s); + Tensor l_vecs_t = transpose(l_vecs); + // s s l, copyA=lvect_t*A*left + mxm(size_s, size_s, size_l, copyA.ptr(), l_vecs_t.ptr(), work.ptr()); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Reduced response matrix:"); + print(copyA); + print(" Reduced overlap matrix:"); + print(S); + } + } + + return {l_vecs, S, copyA}; +} + +std::pair, Tensor> ExcitedResponse::excited_eig( + World &world, Tensor &S, Tensor &A, const double thresh_degenerate) { + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + auto size_l = S.dim(0); + /* + auto [l_vecs, copyS, copyA] = reduce_subspace(world, S, A, thresh_degenerate); + */ + + auto copyA = copy(A); + auto copyS = copy(S); + + auto size_s = copyS.dim(0); + auto num_zero = size_l - size_s; + print("size_l: ", size_l); + print("size_s: ", size_s); + print("NUMZERO: ", num_zero); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "reduce subspace", "subspace_reduce", iter_timing); + } + if (r_params.print_level() >= 1) molresponse::start_timer(world); + // Diagonalize (NOT A SYMMETRIC DIAGONALIZATION!!!!) + // Potentially complex eigenvalues come out of this + Tensor omega(size_s); + Tensor U(size_s, size_s); + sygvp(world, copyA, copyS, 1, U, omega); + //sygvp(world, fock, overlap, 1, c, e); from SCF.cc + + // not zero enough + /* + double max_imag = abs(imag(omega)).max(); + if (world.rank() == 0 and r_params.print_level() >= 2) + print("\n Max imaginary component of eigenvalues:", max_imag, "\n"); + if (max_imag > r_params.dconv()) { + MADNESS_EXCEPTION("max imaginary component of eigenvalues > dconv", 0); + } + */ + Tensor new_omega = real(omega); + // Easier to just resize here + auto m = new_omega.dim(0); + bool switched = true; + while (switched) { + switched = false; + for (size_t i = 0; i < m; i++) { + for (size_t j = i + 1; j < m; j++) { + double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); + double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); + if (snew > sold) { + Tensor tmp = copy(U(_, i)); + U(_, i) = U(_, j); + U(_, j) = tmp; + std::swap(new_omega[i], new_omega[j]); + switched = true; + } + } + } + } + + // Fix phases. + for (size_t i = 0; i < m; ++i) + if (U(i, i) < 0.0) U(_, i).scale(-1.0); + + // Rotations between effectively degenerate components confound + // the non-linear equation solver ... undo these rotations + size_t ilo = 0;// first element of cluster + while (ilo < m - 1) { + size_t ihi = ilo; + while (fabs(new_omega[ilo] - new_omega[ihi + 1]) < + thresh_degenerate * 10.0 * std::max(fabs(new_omega[ilo]), 1.0)) { + ++ihi; + if (ihi == m - 1) break; + } + int64_t nclus = ihi - ilo + 1; + if (nclus > 1) { + Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); + + // Polar Decomposition + Tensor VH(nclus, nclus); + Tensor W(nclus, nclus); + Tensor sigma(nclus); + + svd(q, W, sigma, VH); + q = transpose(inner(W, VH));// Should be conj. tranpose if complex + U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + } + ilo = ihi + 1; + } + + // If we transformed into the smaller subspace, time to transform back + /* + if (num_zero > 0) { + // Temp. storage + Tensor temp_U(size_l, size_l); + Tensor temp_U2(size_l, size_l); + Tensor U2(size_l, size_l); + + // Copy U back to larger size + temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); + for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; + + + // Transform U back + mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); + Tensor l_vecs_t = transpose(l_vecs); + mxm(size_l, size_l, size_l, temp_U2.ptr(), U2.ptr(), l_vecs_t.ptr()); + + U = copy(temp_U2); + if (world.rank() == 0 && r_params.print_level() >= 1) { + print("Increasing subspace size and returning U"); + print(U); + } + } + */ + + // Sort into ascending order + Tensor selected = sort_eigenvalues(world, new_omega, U); + + // End timer + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "diagonalize response matrix", "diagonalize_response_matrix", + iter_timing); + } + + return {new_omega, U}; +} +void ExcitedResponse::augment(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &last_Lambda_X, Tensor &S, Tensor &A, + Tensor &old_S, Tensor &old_A, size_t print_level) { + // Basic output + if (print_level >= 1) molresponse::start_timer(world); + + // Get sizes + size_t m = Chi.X.size(); + // Create work space, will overwrite S and A in the end + Tensor temp_S(2 * m, 2 * m); + Tensor temp_A(2 * m, 2 * m); + /** + * @brief Need to create off diagonal blocks of A + * A= + * [xAx xAx_old ] + * [xoldAx xoldAxold] + * + */ + // Calculate correct inner products of upper off diagonal + + Tensor off = response_space_inner(Chi.X, last_Lambda_X.X); + temp_A(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off);// top right + // Now for lower off diagonal + off = response_space_inner(old_Chi.X, Lambda_X.X); + temp_A(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off); // bottom left + temp_A(Slice(0, m - 1), Slice(0, m - 1)) = copy(A); // xAx top left + temp_A(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_A);// xoldAxold bottom right + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print(" Before symmeterizing A:"); + print(temp_A); + } + // Save temp_A as A_x + // Need to symmeterize A as well (?) + A = 0.5 * (temp_A + transpose(temp_A)); + /** + * @brief Creating S + * S= [ ] + * [ ] + */ + // Now create upper off diagonal block of S + off = expectation(world, Chi.X, old_Chi.X); + // Use slicing to put in correct spot + temp_S(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off);// top right + // Now the lower off diagonal block + // (Go ahead and cheat and use the transpose...) + off = transpose(off);// just transpose + // Use slicing to put in correct spot + temp_S(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off);// bottom right + // Put together the rest of S + temp_S(Slice(0, m - 1), Slice(0, m - 1)) = copy(S); // top left + temp_S(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_S);// + // Save temp_S as S_x + S = copy(temp_S); + // Add in old vectors to current vectors for the appropriate ones + // Augment the vectors step + for (size_t i = 0; i < m; i++) { + Chi.X.push_back(old_Chi.X[i]); + Lambda_X.X.push_back(last_Lambda_X.X[i]); + } + + // End the timer + if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); + + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print("\n Augmented response matrix:"); + print(A); + } + + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print(" Augmented overlap matrix:"); + print(S); + } + + // SUPER debugging + if (print_level >= 3) { + if (world.rank() == 0) print(" Calculating condition number of aug. response matrix"); + } +} + +// If using a larger subspace to diagonalize in, this will put everything in +// the right spot +void ExcitedResponse::augment_full(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &last_Lambda_X, Tensor &S, Tensor &A, + Tensor &old_S, Tensor &old_A, + size_t print_level) { + // Basic output + if (print_level >= 1) molresponse::start_timer(world); + + size_t m = Chi.num_states(); + for (size_t i = 0; i < m; i++) { + Chi.push_back(copy(world, old_Chi.X[i]), copy(world, old_Chi.Y[i])); + Lambda_X.push_back(copy(world, last_Lambda_X.X[i]), copy(world, last_Lambda_X.Y[i])); + } + Tensor temp_A = inner(Chi, Lambda_X); + A = 0.5 * (temp_A + transpose(temp_A)); + S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); + + // End the timer + if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); + + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print("\n Augmented response matrix:"); + print(A); + } + + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print(" Augmented overlap matrix:"); + print(S); + } + + // SUPER debugging + if (print_level >= 3) { + if (world.rank() == 0) print(" Calculating condition number of aug. response matrix"); + } +} +// If using a larger subspace to diagonalize in, after diagonalization this +// will put everything in the right spot + +void ExcitedResponse::unaugment(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &last_Lambda_X, Tensor &omega, Tensor &S_x, + Tensor &A_x, Tensor &old_S, Tensor &old_A, + size_t num_states, size_t iter, size_t print_level) { + // Basic output + if (print_level >= 1) molresponse::start_timer(world); + + // Note: the eigenvalues and vectors were sorted after diagonalization + // and hence all the functions are sorted in ascending order of energy + + // Quick copy of m lowest eigenvalues + omega = omega(Slice(0, num_states - 1)); + // Pop off the "m" vectors off the back end of appropriate vectors + // (only after first iteration) + if (iter > 0) { + for (size_t i = 0; i < num_states; i++) { + Chi.X.pop_back(); + Lambda_X.X.pop_back(); + } + } + old_Chi.X = Chi.X.copy(); + last_Lambda_X.X = Lambda_X.X.copy(); + + old_S = response_space_inner(Chi.X, Chi.X); + old_A = Tensor(num_states, num_states); + for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); + // End the timer + if (print_level >= 1) molresponse::end_timer(world, "Unaug. resp. mat.:"); +} +// If using a larger subspace to diagonalize in, after diagonalization this +// will put everything in the right spot + +void ExcitedResponse::unaugment_full(World &world, X_space &Chi, X_space &old_Chi, + X_space &Lambda_X, X_space &last_Lambda_X, + Tensor &omega, Tensor &S_x, + Tensor &A_x, Tensor &old_S, + Tensor &old_A, size_t num_states, size_t iter, + size_t print_level) { + // Basic output + if (print_level >= 1) molresponse::start_timer(world); + + // Note: the eigenvalues and vectors were sorted after diagonalization + // and hence all the functions are sorted in ascending order of energy + + // Quick copy of m lowest eigenvalues + omega = omega(Slice(0, num_states - 1)); + + // Pop off the "m" vectors off the back end of appropriate vectors + // (only after first iteration) + print("Entering Loop to pop_back Chi and LambdaX"); + if (iter > 0) { + for (size_t i = 0; i < num_states; i++) { + print("pop back Chi and LambdaX"); + Chi.pop_back(); + Lambda_X.pop_back(); + } + } + + old_Chi = Chi.copy(); + last_Lambda_X = Lambda_X.copy(); + + old_S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); + old_A = Tensor(num_states, num_states); + for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); + // End the timer + if (print_level >= 1) molresponse::end_timer(world, "Unaug. resp. mat.:"); +} +// Diagonalize the full response matrix, taking care of degenerate +// components Why diagonalization and then transform the x_fe vectors + + +std::tuple ExcitedResponse::rotate_excited_vectors( + World &world, const Tensor &U, const X_space &chi, const X_space &l_chi, + const X_space &v0_chi, const X_space &gamma_chi) { + // compute the unitary transformation matrix U that diagonalizes + // the response matrix + + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + + + auto rotated_chi = transform(world, chi, U); + auto rotated_l_chi = transform(world, l_chi, U); + auto rotated_v_chi = transform(world, v0_chi, U); + auto rotated_gamma_chi = transform(world, gamma_chi, U); + + + if (world.rank() == 0 and r_params.print_level() >= 10) { + Tensor S; + S = response_space_inner(rotated_chi.X, rotated_chi.X) - + response_space_inner(rotated_chi.Y, rotated_chi.Y); + print("\n After apply transform Overlap Matrix:"); + print(S); + } + + + // Transform the vectors of functions + // Truncate happens in here + // we do transform here + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); + + return {rotated_chi, rotated_l_chi, rotated_v_chi, rotated_gamma_chi}; +} +Tensor ExcitedResponse::diagonalizeFullResponseMatrix( + World &world, X_space &Chi, X_space &Lambda_X, Tensor &omega, Tensor &S, + Tensor &A, const double thresh, size_t print_level) { + // compute the unitary transformation matrix U that diagonalizes + // the response matrix + Tensor U = GetFullResponseTransformation(world, S, A, omega, thresh); + + // Sort into ascending order + // Tensor selected = sort_eigenvalues(world, omega, U); + + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + + Chi.X = transform(world, Chi.X, U); + Chi.Y = transform(world, Chi.Y, U); + Tensor Sxa, Sya, Sa; + + Sxa = response_space_inner(Chi.X, Chi.X); + Sya = response_space_inner(Chi.Y, Chi.Y); + Sa = Sxa - Sya; + + if (world.rank() == 0 and r_params.print_level() >= 10) { + print("\n After apply transform Overlap Matrix:"); + print(Sxa); + print(Sya); + print(Sa); + } + + Lambda_X.X = transform(world, Lambda_X.X, U); + Lambda_X.Y = transform(world, Lambda_X.Y, U); + // Transform the vectors of functions + // Truncate happens in here + // we do transform here + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); + + // Normalize x and y + normalize(world, Chi); + + // Debugging output + if (world.rank() == 0 and print_level >= 2) { + print(" Eigenvector coefficients from diagonalization:"); + print(U); + } + + // Return the selected functions + return U; +} + +// Similar to what robert did above in "get_fock_transformation" +Tensor ExcitedResponse::GetFullResponseTransformation(World &world, Tensor &S, + Tensor &A, + Tensor &evals, + const double thresh_degenerate) { + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + + // Get size + size_t m = S.dim(0); + + // Run an SVD on the overlap matrix and ignore values + // less than thresh_degenerate + Tensor r_vecs, s_vals, l_vecs; + Tensor S_copy = copy(S); + /** + * @brief SVD on overlap matrix S + * S=UsVT + * S, U, s , VT + * + */ + svd(S_copy, l_vecs, s_vals, r_vecs); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print("\n Singular values of overlap matrix:"); + print(s_vals); + print(" Left singular vectors of overlap matrix:"); + print(l_vecs); + } + + // Check how many singular values are less than 10*thresh_degen + size_t num_zero = 0; + for (int64_t i = 0; i < s_vals.dim(0); i++) { + if (s_vals(i) < 10 * thresh_degenerate) { + if (world.rank() == 0 and num_zero == 0) print(""); + if (world.rank() == 0) + printf(" Detected singular value (%.8f) below threshold (%.8f). " + "Reducing subspace size.\n", + s_vals(i), 10 * thresh_degenerate); + num_zero++; + } + if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_zero > 0) print(""); + } + + // Going to use these a lot here, so just calculate them + size_t size_l = s_vals.dim(0); // number of singular values + size_t size_s = size_l - num_zero;// smaller subspace size + /** + * @brief l_vecs_s(m,1) + * + * @return Tensor + */ + Tensor l_vecs_s(size_l, + num_zero);// number of sv by number smaller than thress + Tensor copyA = copy(A); // we copy xAx + + // Transform into this smaller space if necessary + if (num_zero > 0) { + print("num_zero = ", num_zero); + // Cut out the singular values that are small + // (singular values come out in descending order) + + // S(m-sl,m-sl) + S = Tensor(size_s, size_s);// create size of new size + for (size_t i = 0; i < size_s; i++) S(i, i) = s_vals(i); + // Copy the active vectors to a smaller container + // left vectors [m,m-sl] + l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Reduced size left singular vectors of overlap matrix:"); + print(l_vecs_s); + } + + // Transform + // Work(m,m-sl) + Tensor work(size_l, size_s); + /* +c(i,j) = c(i,j) + sum(k) a(i,k)*b(k,j) + +where it is assumed that the last index in each array is has unit +stride and the dimensions are as provided. + +4-way unrolled k loop ... empirically fastest on PIII +compared to 2/3 way unrolling (though not by much). +*/ + // dimi,dimj,dimk,c,a,b + mxm(size_l, size_s, size_l, work.ptr(), A.ptr(), l_vecs_s.ptr()); + // A*left + copyA = Tensor(size_s, size_s); + Tensor l_vecs_t = transpose(l_vecs); + // s s l, copyA=lvect_t*A*left + mxm(size_s, size_s, size_l, copyA.ptr(), l_vecs_t.ptr(), work.ptr()); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Reduced response matrix:"); + print(copyA); + print(" Reduced overlap matrix:"); + print(S); + } + } + // Diagonalize (NOT A SYMMETRIC DIAGONALIZATION!!!!) + // Potentially complex eigenvalues come out of this + Tensor> omega(size_s); + Tensor U(size_s, size_s); + ggevp(world, copyA, S, U, omega); + + // Eigenvectors come out oddly packaged if there are + // complex eigenvalues. + // Currently only supporting real valued eigenvalues + // so throw an error if any imaginary components are + // not zero enough + double max_imag = abs(imag(omega)).max(); + if (world.rank() == 0 and r_params.print_level() >= 2) + print("\n Max imaginary component of eigenvalues:", max_imag, "\n"); + if (max_imag > r_params.dconv()) { + MADNESS_EXCEPTION("max imaginary component of eigenvalues > dconv", 0); + } + evals = real(omega); + + // Easier to just resize here + m = evals.dim(0); + + bool switched = true; + while (switched) { + switched = false; + for (size_t i = 0; i < m; i++) { + for (size_t j = i + 1; j < m; j++) { + double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); + double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); + if (snew > sold) { + Tensor tmp = copy(U(_, i)); + U(_, i) = U(_, j); + U(_, j) = tmp; + std::swap(evals[i], evals[j]); + switched = true; + } + } + } + } + + // Fix phases. + for (size_t i = 0; i < m; ++i) + if (U(i, i) < 0.0) U(_, i).scale(-1.0); + + // Rotations between effectively degenerate components confound + // the non-linear equation solver ... undo these rotations + size_t ilo = 0;// first element of cluster + while (ilo < m - 1) { + size_t ihi = ilo; + while (fabs(evals[ilo] - evals[ihi + 1]) < + thresh_degenerate * 10.0 * std::max(fabs(evals[ilo]), 1.0)) { + ++ihi; + if (ihi == m - 1) break; + } + int64_t nclus = ihi - ilo + 1; + if (nclus > 1) { + Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); + + // Polar Decomposition + Tensor VH(nclus, nclus); + Tensor W(nclus, nclus); + Tensor sigma(nclus); + + svd(q, W, sigma, VH); + q = transpose(inner(W, VH));// Should be conj. tranpose if complex + U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + } + ilo = ihi + 1; + } + + // If we transformed into the smaller subspace, time to transform back + if (num_zero > 0) { + // Temp. storage + Tensor temp_U(size_l, size_l); + Tensor U2(size_l, size_l); + + // Copy U back to larger size + temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); + for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; + + // Transform U back + mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); + U = copy(U2); + } + + // Sort into ascending order + Tensor selected = sort_eigenvalues(world, evals, U); + + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Diag. resp. mat."); + + return U; +} +Tensor ExcitedResponse::diagonalizeFockMatrix(World &world, X_space &Chi, X_space &Lambda_X, + Tensor &evals, Tensor &A, + Tensor &S, + const double thresh) const { + // compute the unitary transformation matrix U that diagonalizes + // the fock matrix + Tensor U = get_fock_transformation(world, S, A, evals, thresh); + + // Sort into ascending order + Tensor selected = sort_eigenvalues(world, evals, U); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" U:"); + print(U); + } + + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + + // transform the orbitals and the potential + // Truncate happens inside here + Chi.X = transform(world, Chi.X, U); + Lambda_X.X = transform(world, Lambda_X.X, U); + + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); + + // Normalize x + normalize(world, Chi.X); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Eigenvector coefficients from diagonalization:"); + print(U); + } + + return U; +} +Tensor ExcitedResponse::get_fock_transformation(World &world, Tensor &overlap, + Tensor &fock, Tensor &evals, + const double thresh_degenerate) const { + // Run an SVD on the overlap matrix and ignore values + // less than thresh_degenerate + Tensor r_vecs; + Tensor s_vals; + Tensor l_vecs; + Tensor overlap_copy = copy(overlap); + svd(overlap_copy, l_vecs, s_vals, r_vecs); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print("\n Singular values of overlap matrix:"); + print(s_vals); + print(" Left singular vectors of overlap matrix:"); + print(l_vecs); + } + + // Check how many singular values are less than 10*thresh_degen + size_t num_sv = 0; + for (int64_t i = 0; i < s_vals.dim(0); i++) { + if (s_vals(i) < 10 * thresh_degenerate) { + if (world.rank() == 0 and num_sv == 0) print(""); + if (world.rank() == 0) + printf(" Detected singular value (%.8f) below threshold (%.8f). " + "Reducing subspace size.\n", + s_vals(i), 10 * thresh_degenerate); + num_sv++; + } + if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_sv > 0) print(""); + } + + // Going to use these a lot here, so just calculate them + size_t size_l = s_vals.dim(0); + size_t size_s = size_l - num_sv; + Tensor l_vecs_s(size_l, num_sv); + + // Transform into this smaller space if necessary + if (num_sv > 0) { + // Cut out the singular values that are small + // (singular values come out in descending order) + overlap = Tensor(size_s, size_s); + for (size_t i = 0; i < size_s; i++) overlap(i, i) = s_vals(i); + + // Copy the active vectors to a smaller container + l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Reduced size left singular vectors of overlap matrix:"); + print(l_vecs_s); + } + + // Transform + Tensor work(size_l, size_s); + mxm(size_l, size_s, size_l, work.ptr(), fock.ptr(), l_vecs_s.ptr()); + fock = Tensor(size_s, size_s); + Tensor l_vecs_t = transpose(l_vecs); + mxm(size_s, size_s, size_l, fock.ptr(), l_vecs_t.ptr(), work.ptr()); + } + + // Diagonalize using lapack + Tensor U; + sygv(fock, overlap, 1, U, evals); + + int64_t nmo = fock.dim(0);// NOLINT + + bool switched = true; + while (switched) { + switched = false; + for (int64_t i = 0; i < nmo; i++) { + for (int64_t j = i + 1; j < nmo; j++) { + double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); + double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); + if (snew > sold) { + Tensor tmp = copy(U(_, i)); + U(_, i) = U(_, j); + U(_, j) = tmp; + std::swap(evals[i], evals[j]); + switched = true; + } + } + } + } + + // Fix phases. + for (int64_t i = 0; i < nmo; ++i)// NOLINT + if (U(i, i) < 0.0) U(_, i).scale(-1.0); + + // Rotations between effectively degenerate components confound + // the non-linear equation solver ... undo these rotations + int64_t ilo = 0;// first element of cluster NOLINT + while (ilo < nmo - 1) { + int64_t ihi = ilo;// NOLINT + while (fabs(evals[ilo] - evals[ihi + 1]) < + thresh_degenerate * 100.0 * std::max(fabs(evals[ilo]), 1.0)) { + ++ihi; + if (ihi == nmo - 1) break; + } + int64_t nclus = ihi - ilo + 1;// NOLINT + if (nclus > 1) { + Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); + + // Polar Decomposition + Tensor VH(nclus, nclus); + Tensor W(nclus, nclus); + Tensor sigma(nclus); + + svd(q, W, sigma, VH); + q = transpose(inner(W, VH));// Should be conj. tranpose if complex + U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + } + ilo = ihi + 1; + } + + fock = 0; + for (unsigned int i = 0; i < nmo; ++i) fock(i, i) = evals(i); + + // If we transformed into the smaller subspace, time to transform back + if (num_sv > 0) { + // Temp. storage + Tensor temp_U(size_l, size_l); + Tensor U2(size_l, size_l); + + // Copy U back to larger size + temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); + for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; + + // Transform back + mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); + + U = copy(U2); + } + + return U; +} +Tensor ExcitedResponse::sort_eigenvalues(World &world, Tensor &vals, + Tensor &vecs) const { + // Get relevant sizes + size_t k = vals.size(); + + // Tensor to hold selection order + Tensor selected(k); + + // Copy everything... + std::vector vals_copy; + for (size_t i = 0; i < k; i++) vals_copy.push_back(vals[i]); + Tensor vals_copy2 = copy(vals); + Tensor vecs_copy = copy(vecs); + + // Now sort vals_copy + std::sort(vals_copy.begin(), vals_copy.end()); + + // Now sort the rest of the things, using the sorted energy list + // to find the correct indices + for (size_t i = 0; i < k; i++) { + // Find matching index in sorted vals_copy + size_t j = 0; + while (fabs(vals_copy[i] - vals_copy2[j]) > 1e-8 && j < k) j++; + + // Add in to list which one we're taking + selected(i) = j; + + // Put corresponding things in the correct place + vals(i) = vals_copy[i]; + vecs(_, i) = vecs_copy(_, j); + + // Change the value of vals_copy2[j] to help deal with duplicates? + vals_copy2[j] = 10000.0; + } + + // Done + return selected; +} +Tensor ExcitedResponse::create_shift(World &world, const Tensor &ground, + const Tensor &omega, std::string xy) const { + // Start a timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + + // Get sizes + size_t m = omega.size(); + size_t n = ground.size(); + + // Container to hold shift + Tensor result(m, n); + + // Run over excited components + for (size_t k = 0; k < m; k++) { + // Run over ground components + for (size_t p = 0; p < n; p++) { + if (ground(p) + omega(k) > 0) { + // Calculate the shift needed to get energy to -0.05, + // which was arbitrary (same as moldft) + result(k, p) = -(ground(p) + omega(k) + 0.05); + + // Basic output + if (r_params.print_level() >= 3) { + if (world.rank() == 0) + printf(" Shift needed for transition from ground orbital %d to " + "response %s state %d\n", + static_cast(p), xy.c_str(), static_cast(k)); + if (world.rank() == 0) print(" Ground energy =", ground(p)); + if (world.rank() == 0) print(" Excited energy =", omega(k)); + if (world.rank() == 0) print(" Shifting by", result(k, p)); + if (world.rank() == 0) print(""); + } + } + } + } + + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Create shift:"); + + // Done + return result; +} +response_space ExcitedResponse::apply_shift(World &world, const Tensor &shifts, + const response_space &V, const response_space &f) { + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + + // Sizes inferred from V + size_t n = V[0].size(); + size_t m = V.size(); + + // Container to return + response_space shifted_V(world, m, n); + + // Run over occupied + for (size_t k = 0; k < m; k++) { + // Run over virtual + for (size_t p = 0; p < n; p++) { shifted_V[k][p] = V[k][p] + shifts(k, p) * f[k][p]; } + } + + shifted_V.truncate_rf(); + + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply shift:"); + + // Done + return shifted_V; +} +std::vector>> +ExcitedResponse::create_bsh_operators(World &world, const Tensor &shift, + const Tensor &ground, const Tensor &omega, + const double lo, const double thresh) const { + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + + // Sizes inferred from ground and omega + size_t n = ground.size(); + size_t m = omega.size(); + + // Make the vector + std::vector>> operators; + + // Make a BSH operator for each response function + // Run over excited components + for (size_t k = 0; k < m; k++) { + // Container for intermediary + std::vector> temp(n); + + // Run over occupied components + for (size_t p = 0; p < n; p++) { + double mu = sqrt(-2.0 * (ground(p) + omega(k) + shift(k, p))); + print("res state ", k, " orb ", p, " bsh exponent mu :", mu); + temp[p] = std::shared_ptr>( + BSHOperatorPtr3D(world, mu, lo, thresh)); + } + + // Add intermediary to return container + operators.push_back(temp); + } + + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); + + // Done + return operators; +} +void ExcitedResponse::excited_to_json(json &j_mol_in, size_t iter, const Tensor &omega) { + json j = {}; + + j["iter"] = iter; + + j["omega"] = tensor_to_json(omega); + + auto index = j_mol_in["protocol_data"].size() - 1; + j_mol_in["protocol_data"][index]["property_data"].push_back(j); +} +void ExcitedResponse::iterate(World &world) { + size_t iter; + QProjector projector(world, ground_orbitals); + size_t m = r_params.num_states(); // Number of excited states + size_t n = r_params.num_orbitals();// Number of ground state orbitals + + const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double relative_max_target = + std::max(50 * FunctionDefaults<3>::get_thresh(), .5 * r_params.dconv()); + + auto thresh = FunctionDefaults<3>::get_thresh(); + auto max_rotation = .5; + if (thresh >= 1e-2) { + max_rotation = 2; + } else if (thresh >= 1e-4) { + max_rotation = .25; + } else if (thresh >= 1e-6) { + max_rotation = .1; + } else if (thresh >= 1e-8) { + max_rotation = .05; + } + + // m residuals for x and y + Tensor bsh_residualsX(m); + Tensor density_residuals(m); + Tensor bsh_residualsY(m); + + Tensor xij_norms(m, 2 * n); + Tensor xij_res_norms(m, 2 * n); + // saved response densities + vecfuncT rho_omega_old(m); + // initialize DFT XC functional operator + XCOperator xc = make_xc_operator(world); + + // create X space residuals + X_space residuals(world, m, n); + X_space old_Chi(world, m, n); + X_space old_Lambda_X(world, m, n); + + // vector of Xvectors + std::vector Xvector; + std::vector Xresidual; + for (size_t b = 0; b < m; b++) { + Xvector.emplace_back(Chi, b); + Xresidual.emplace_back(residuals, b); + } + // If DFT, initialize the XCOperator + + NonLinearXsolver kain_x_space; + size_t nkain = m;// (r_params.omega() != 0.0) ? 2 * m : m; + for (size_t b = 0; b < nkain; b++) { + kain_x_space.push_back(XNonlinearSolver( + X_space_allocator(world, n), false)); + if (r_params.kain()) kain_x_space[b].set_maxsub(r_params.maxsub()); + } + + response_space bsh_x_resp(world, m, n);// Holds wave function corrections + response_space bsh_y_resp(world, m, n);// Holds wave function corrections + + Tensor old_energy(m); // Holds previous iteration's energy + Tensor energy_residuals(m);// Holds energy residuals + // Holds the norms of y function residuals (for convergence) + Tensor x_norms(m); + Tensor y_norms(m); + + response_space x_differences(world, m, n); + response_space y_differences(world, m, n); + + response_space x_residuals(world, m, n); + response_space y_residuals(world, m, n); + + Tensor x_shifts;// Holds the shifted energy values + Tensor y_shifts;// Holds the shifted energy values + + Tensor S; // Overlap matrix of response components for x states + real_function_3d v_xc;// For TDDFT + Tensor old_A; + Tensor A; + Tensor old_S; + + vector_real_function_3d rho_omega = make_density(world, Chi); + + // Create the X space + converged = false;// Converged flag + // Now to iterate + for (iter = 0; iter < r_params.maxiter(); ++iter) { + + iter_timing.clear(); + // Start a timer for this iteration + // Basic output + if (r_params.print_level() >= 1) { + molresponse::start_timer(world); + if (world.rank() == 0) + printf("\n Iteration %d at time %.1fs\n", static_cast(iter), wall_time()); + if (world.rank() == 0) print(" -------------------------------"); + } + + if (r_params.print_level() >= 1) { + if (world.rank() == 0) { + print("Chi.x norms at start of iteration: ", iter); + print(Chi.X.norm2()); + print("Chi.y norms at start of iteration ", iter); + print(Chi.Y.norm2()); + } + } + print("Excited State Frequencies "); + print(omega); + + + // Normalize after projection + + if (iter < 2 || (iter % 10) == 0) { load_balance_chi(world); } + + if (iter > 0) { + // Only checking on X components even for full as Y are so small + if (density_residuals.max() > 2) { break; } + + if (density_residuals.max() > 2) { break; } + double d_residual = density_residuals.max(); + // Test convergence and set to true + auto chi_norms = Chi.norm2s(); + auto rho_norms = norm2s_T(world, rho_omega); + auto relative_bsh = copy(bsh_residualsX); + + std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), + chi_norms.ptr(), relative_bsh.ptr(), + [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); + + auto max_bsh = bsh_residualsX.absmax(); + auto relative_max_bsh = relative_bsh.absmax(); + + + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, + xij_norms, xij_res_norms, rho_norms, density_residuals); + + excited_to_json(j_molresponse, iter, omega); + + if (r_params.print_level() >= 1) { + + if (world.rank() == 0) { + print("thresh: ", FunctionDefaults<3>::get_thresh()); + print("k: ", FunctionDefaults<3>::get_k()); + print("Chi Norms at start of iteration: ", iter); + print("xij norms\n: ", xij_norms); + print("xij residual norms\n: ", xij_res_norms); + print("Chi_X: ", chi_norms); + print("bsh_residuals : ", bsh_residualsX); + print("relative_bsh : ", relative_bsh); + print("r_params.dconv(): ", r_params.dconv()); + print("max rotation: ", max_rotation); + print("d_residual_max : ", d_residual); + print("d_residual_max target : ", conv_den); + print("bsh_residual_max : ", max_bsh); + print("relative_bsh_residual_max : ", relative_max_bsh); + print("relative_bsh_residual_max target : ", relative_max_target); + } + } + if ((d_residual < conv_den) and ((relative_max_bsh < relative_max_target) or + r_params.get("conv_only_dens"))) { + converged = true; + } + + + if (converged || iter == r_params.maxiter() - 1) { + // if converged print converged + if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { + print("\nConverged!\n"); + } + + if (r_params.save()) { + molresponse::start_timer(world); + save(world, r_params.save_file()); + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Save:"); + } + // Basic output + if (r_params.print_level() >= 1) molresponse::end_timer(world, " This iteration:"); + // plot orbitals + if (r_params.plot_all_orbitals()) { + plotResponseOrbitals(world, iter, Chi.X, Chi.Y, r_params, ground_calc); + } + auto rho0 = make_ground_density(world); + if (r_params.plot()) { + do_vtk_plots(world, 200, r_params.L(), molecule, rho0, rho_omega, + ground_orbitals, Chi); + } + break; + } + } + + + // We first rotate chi by diagonalizing AX=omegaBX + // This provides new omegas + // We then apply bsh on the rotated vector and compute the residual + // The residual is then used to update KAIN + // Followed by step restriction + // residual is computed as new_chi-old_chi where both have been previously rotated. + auto [new_omega, old_chi, new_chi, new_res] = update( + world, Chi, xc, projector, kain_x_space, Xvector, Xresidual, iter, max_rotation); + + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + rho_omega_old = make_density(world, old_chi); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "make_density_old", "make_density_old", iter_timing); + } + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + rho_omega = make_density(world, new_chi); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "make_density_new", "make_density_new", iter_timing); + } + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + bsh_residualsX = copy(new_res.residual_norms); + bsh_residualsY = copy(new_res.residual_norms); + omega = copy(new_omega); + Chi = new_chi.copy(); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); + } + + xij_res_norms = new_res.residual.component_norm2s(); + xij_norms=Chi.component_norm2s(); + + density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); + /* + for (size_t i = 0; i < Chi.num_states(); i++) { + if (maxrotn[i] < r_params.maxrotn()) { + maxrotn[i] = r_params.maxrotn(); + print("less than maxrotn....set to maxrotn"); + } + } + */ + + + if (world.rank() == 0 and (r_params.print_level() > 2)) { + print("Density residuals"); + print("dres", density_residuals); + print("BSH residuals"); + print("xres", bsh_residualsX); + print("yres", bsh_residualsY); + print("maxrotn", max_rotation); + } + + + // Basic output + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "Iteration Timing", "iter_total", iter_timing); + } + time_data.add_data(iter_timing); + } + + if (world.rank() == 0) print("\n"); + if (world.rank() == 0) print(" Finished Excited State Calculation "); + if (world.rank() == 0) print(" ------------------------"); + if (world.rank() == 0) print("\n"); + + // Did we converge? + if (iter == r_params.maxiter() && not converged) { + if (world.rank() == 0) print(" Failed to converge. Reason:"); + if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); + if (world.rank() == 0) print(" Running analysis on current values.\n"); + } + + /* + if (!r_params.tda()) { + sort(world, omega, Chi); + } else { + sort(world, omega, Chi.X); + } + */ + + // Print final things + if (world.rank() == 0) { + print(" Final excitation energies:"); + print(omega); + print(" Final energy residuals X:"); + print(bsh_residualsX); + print(" Final energy residuals Y:"); + print(bsh_residualsY); + print(" Final density residuals:"); + print(density_residuals); + + print(" Final X-state response function residuals:"); + print(Chi.X.norm2()); + if (not r_params.tda()) { + if (world.rank() == 0) print(" Final y-state response function residuals:"); + if (world.rank() == 0) print(Chi.Y.norm2()); + } + } + + /* + analysis(world, Chi); + print("--------------------------------------------------------"); + for (size_t i = 0; i < m; i++) { + std::string x_state = "x_" + std::to_string(i) + "_"; + analyze_vectors(world, Chi.X[i], x_state); + print("--------------------------------------------------------"); + } + if (not r_params.tda()) { + for (size_t i = 0; i < m; i++) { + std::string y_state = "y_" + std::to_string(i) + "_"; + analyze_vectors(world, Chi.Y[i], y_state); + print("--------------------------------------------------------"); + } + } + */ +} + +auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator &xc, + QProjector &projector, NonLinearXsolver &kain_x_space, + vector &Xvector, vector &Xresidual, size_t iter, + const double &maxrotn) + -> std::tuple, X_space, X_space, residuals> { + size_t m = Chi.num_states(); + bool compute_y = not r_params.tda(); + + Tensor x_shifts(m); + Tensor y_shifts(m); + print("Entering Compute Lambda"); + + /* + if (compute_y) { + gram_schmidt(world, Chi.X, Chi.Y); + normalize(world, Chi); + } else { + gram_schmidt(world, Chi.X); + normalize(world, Chi.X); + } + */ + // + // X_space Lambda_X = compute_lambda_X(world, Chi, xc, r_params.calc_type()); + + auto [temp_Lambda_X, temp_V0X, temp_gamma] = + compute_response_potentials(world, Chi, xc, r_params.calc_type()); + + auto [new_omega, rotated_chi, rotated_lambda, rotated_v_x, rotated_gamma_x] = + rotate_excited_space(world, Chi, temp_Lambda_X, temp_V0X, temp_gamma); + + print("omega_n before transform"); + print(omega); + print("omega_n after transform"); + print(new_omega); + // Analysis gets messed up if BSH is last thing applied + // so exit early if last iteration + + + //X_space theta_X = compute_theta_X(world, rotated_chi, xc, r_params.calc_type()); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space rotated_EOX(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); + if (r_params.localize() != "canon") { + rotated_EOX = rotated_chi.copy(); + rotated_EOX.X = rotated_EOX.X * ham_no_diag; + if (compute_y) { rotated_EOX.Y = rotated_EOX.Y * ham_no_diag; } + if (r_params.print_level() >= 10) { + print(""); + print(inner(rotated_chi, rotated_EOX)); + } + } + world.gop.fence(); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "E0mDX", "E0mDX", iter_timing); + } + + X_space theta_X = X_space(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + theta_X = rotated_v_x - rotated_EOX + rotated_gamma_x; + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); + } + print("BSH update iter = ", iter); + X_space new_chi = bsh_update_excited(world, new_omega, theta_X, projector); + //res = Chi - new_chi; + auto [new_res, bsh] = compute_residual(world, rotated_chi, new_chi, r_params.calc_type()); + // kain if iteration >0 or first run where there should not be a problem + // computed new_chi and res + if (r_params.kain() && (iter > 0) && true) { + new_chi = + kain_x_space_update(world, rotated_chi, new_res, kain_x_space, Xvector, Xresidual); + } + if (false) { x_space_step_restriction(world, rotated_chi, new_chi, compute_y, maxrotn); } + + + if (compute_y) normalize(world, new_chi); + else + normalize(world, new_chi.X); + + + new_chi.X.truncate_rf(); + if (compute_y) new_chi.Y.truncate_rf(); + + return {new_omega, rotated_chi, new_chi, {new_res, bsh}}; +} +auto ExcitedResponse::bsh_update_excited(World &world, const Tensor &omega, + X_space &theta_X, QProjector &projector) -> X_space { + size_t m = theta_X.num_states(); + size_t n = theta_X.num_orbitals(); + bool compute_y = !r_params.tda(); + Tensor x_shifts(m); + Tensor y_shifts(m); + print("omega before shifts"); + Tensor omega_plus = omega; + print(omega); + x_shifts = create_shift(world, ground_energies, omega_plus, "x"); + // Compute Theta X + // Apply the shifts + theta_X.X = apply_shift(world, x_shifts, theta_X.X, Chi.X); + theta_X.X = theta_X.X * -2; + theta_X.X.truncate_rf(); + + if (compute_y) { + // theta_X.Y = apply_shift(world, y_shifts, theta_X.Y, Chi.Y); + theta_X.Y = theta_X.Y * -2; + theta_X.Y.truncate_rf(); + } + // Construct BSH operators + std::vector>> bsh_x_ops = + create_bsh_operators(world, x_shifts, ground_energies, omega_plus, r_params.lo(), + FunctionDefaults<3>::get_thresh()); + + std::vector>> bsh_y_ops; + if (compute_y) { + Tensor omega_minus = -omega; + bsh_y_ops = create_bsh_operators(world, y_shifts, ground_energies, omega_minus, + r_params.lo(), FunctionDefaults<3>::get_thresh()); + } + X_space bsh_X(world, m, n); + // Apply BSH and get updated response components + bsh_X.X = apply(world, bsh_x_ops, theta_X.X); + if (compute_y) bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); + + // Project out ground state + for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); + if (compute_y) { + for (size_t i = 0; i < m; i++) bsh_X.Y[i] = projector(bsh_X.Y[i]); + } + + // Only update non-converged components + /* + for (size_t i = 0; i < m; i++) { + bsh_X.X[i] = bsh_X.X[i]; + bsh_X.X[i] = mask * bsh_X.X[i]; + if (compute_y) { + bsh_X.Y[i] = bsh_X.Y[i]; + bsh_X.Y[i] = mask * bsh_X.Y[i]; + } + } + */ + + if (compute_y) normalize(world, bsh_X); + else { normalize(world, bsh_X.X); } + // Ensure orthogonal rguesses + + //bsh_X.truncate(); + + return bsh_X; +} +void ExcitedResponse::analysis(World &world, const X_space &chi) { + // Sizes get used a lot here, so lets get a local copy + size_t n = chi.X[0].size(); + size_t m = chi.X.size(); + + // Per response function, want to print the contributions from each + // ground state So print the norm of each function? + Tensor x_norms(m, n); + Tensor y_norms(m, n); + + // Calculate the inner products + for (long i = 0; i < m; i++) { + for (long j = 0; j < n; j++) { + x_norms(i, j) = chi.X[i][j].norm2(); + + if (not r_params.tda()) y_norms(i, j) = chi.Y[i][j].norm2(); + } + } + + // 'sort' these inner products within in each row + Tensor cpy = copy(x_norms); + Tensor x_order(m, n); + Tensor y_order(m, n); + for (long i = 0; i < m; i++) { + for (long j = 0; j < n; j++) { + double x = cpy(i, _).max(); + size_t z = 0; + while (x != cpy(i, z)) z++; + cpy(i, z) = -100.0; + x_order(i, j) = z; + + // Also sort y if full response + if (not r_params.tda()) { y_order(i, j) = z; } + } + } + + // Need these to calculate dipole/quadrapole + real_function_3d x = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_function_3d y = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_function_3d z = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + + // Calculate transition dipole moments for each response function + Tensor dipoles(m, 3); + + // Run over each excited state + for (size_t i = 0; i < m; i++) { + // Add in contribution from each ground state + for (size_t j = 0; j < n; j++) { + dipoles(i, 0) += inner(ground_orbitals[j], x * chi.X[i][j]); + dipoles(i, 1) += inner(ground_orbitals[j], y * chi.X[i][j]); + dipoles(i, 2) += inner(ground_orbitals[j], z * chi.X[i][j]); + + if (not r_params.tda()) { + dipoles(i, 0) += inner(ground_orbitals[j], x * chi.Y[i][j]); + dipoles(i, 1) += inner(ground_orbitals[j], y * chi.Y[i][j]); + dipoles(i, 2) += inner(ground_orbitals[j], z * chi.Y[i][j]); + } + } + + // Normalization (negative?) + dipoles(i, 0) *= -sqrt(2.0); + dipoles(i, 1) *= -sqrt(2.0); + dipoles(i, 2) *= -sqrt(2.0); + } + + // Calculate oscillator strength + Tensor oscillator(m); + for (size_t i = 0; i < m; i++) { + oscillator(i) = 2.0 / 3.0 * + (dipoles(i, 0) * dipoles(i, 0) + dipoles(i, 1) * dipoles(i, 1) + + dipoles(i, 2) * dipoles(i, 2)) * + omega(i); + } + + // Calculate transition quadrapole moments + Tensor quadrupoles(m, 3, 3); + + // Run over each excited state + for (long i = 0; i < m; i++) { + // Add in contribution from each ground state + for (long j = 0; j < n; j++) { + quadrupoles(i, 0, 0) += inner(ground_orbitals[j], x * x * chi.X[i][j]); + quadrupoles(i, 0, 1) += inner(ground_orbitals[j], x * y * chi.X[i][j]); + quadrupoles(i, 0, 2) += inner(ground_orbitals[j], x * z * chi.X[i][j]); + quadrupoles(i, 1, 0) += inner(ground_orbitals[j], y * x * chi.X[i][j]); + quadrupoles(i, 1, 1) += inner(ground_orbitals[j], y * y * chi.X[i][j]); + quadrupoles(i, 1, 2) += inner(ground_orbitals[j], y * z * chi.X[i][j]); + quadrupoles(i, 2, 0) += inner(ground_orbitals[j], z * x * chi.X[i][j]); + quadrupoles(i, 2, 1) += inner(ground_orbitals[j], z * y * chi.X[i][j]); + quadrupoles(i, 2, 2) += inner(ground_orbitals[j], z * z * chi.X[i][j]); + + if (not r_params.tda()) { + quadrupoles(i, 0, 0) += inner(ground_orbitals[j], x * x * chi.Y[i][j]); + quadrupoles(i, 0, 1) += inner(ground_orbitals[j], x * y * chi.Y[i][j]); + quadrupoles(i, 0, 2) += inner(ground_orbitals[j], x * z * chi.Y[i][j]); + quadrupoles(i, 1, 0) += inner(ground_orbitals[j], y * x * chi.Y[i][j]); + quadrupoles(i, 1, 1) += inner(ground_orbitals[j], y * y * chi.Y[i][j]); + quadrupoles(i, 1, 2) += inner(ground_orbitals[j], y * z * chi.Y[i][j]); + quadrupoles(i, 2, 0) += inner(ground_orbitals[j], z * x * chi.Y[i][j]); + quadrupoles(i, 2, 1) += inner(ground_orbitals[j], z * y * chi.Y[i][j]); + quadrupoles(i, 2, 2) += inner(ground_orbitals[j], z * z * chi.Y[i][j]); + } + } + // Normalization + quadrupoles(i, 0, 0) *= sqrt(2.0); + quadrupoles(i, 0, 1) *= sqrt(2.0); + quadrupoles(i, 0, 2) *= sqrt(2.0); + quadrupoles(i, 1, 0) *= sqrt(2.0); + quadrupoles(i, 1, 1) *= sqrt(2.0); + quadrupoles(i, 1, 2) *= sqrt(2.0); + quadrupoles(i, 2, 0) *= sqrt(2.0); + quadrupoles(i, 2, 1) *= sqrt(2.0); + quadrupoles(i, 2, 2) *= sqrt(2.0); + } + + // Now print? + if (world.rank() == 0) { + for (long i = 0; i < m; i++) { + printf(" Response Function %d\t\t%7.8f a.u.", static_cast(i), omega(i)); + print("\n --------------------------------------------"); + printf(" Response Function %d\t\t%7.8f eV", static_cast(i), omega(i) * 27.2114); + print("\n --------------------------------------------"); + + print("\n Transition Dipole Moments"); + printf(" X: %7.8f Y: %7.8f Z: %7.8f\n", dipoles(i, 0), dipoles(i, 1), + dipoles(i, 2)); + + printf("\n Dipole Oscillator Strength: %7.8f\n", oscillator(i)); + + print("\n Transition Quadrupole Moments"); + printf(" %16s %16s %16s\n", "X", "Y", "Z"); + printf(" X %16.8f %16.8f %16.8f\n", quadrupoles(i, 0, 0), quadrupoles(i, 0, 1), + quadrupoles(i, 0, 2)); + printf(" Y %16.8f %16.8f %16.8f\n", quadrupoles(i, 1, 0), quadrupoles(i, 1, 1), + quadrupoles(i, 1, 2)); + printf(" Z %16.8f %16.8f %16.8f\n", quadrupoles(i, 2, 0), quadrupoles(i, 2, 1), + quadrupoles(i, 2, 2)); + + // Print contributions + // Only print the top 5? + if (r_params.tda()) { + print("\n Dominant Contributions:"); + for (long j = 0; j < std::min(size_t(5), n); j++) { + printf(" Occupied %d %7.8f\n", x_order(i, j), x_norms(i, x_order(i, j))); + } + + print("\n"); + } else { + print("\n Dominant Contributions:"); + print(" x y"); + for (long j = 0; j < std::min(size_t(5), n); j++) { + printf(" Occupied %d %7.8f %7.8f\n", x_order(i, j), + x_norms(i, x_order(i, j)), y_norms(i, y_order(i, j))); + } + + print("\n"); + } + } + } +} +// Save the current response calculation + +void ExcitedResponse::save(World &world, const std::string &name) { + + + // Archive to write everything to + archive::ParallelOutputArchive ar(world, name.c_str(), 1); + // Just going to enforce 1 io server + + // Saving, in this order; + // string ground-state archive name (garch_name) + // bool TDA flag + // size_t number of ground state orbitals (n) + // size_t number of excited state orbitals (m) + // Tensor energies of m x-components + // for i from 0 to m-1 + // for j from 0 to n-1 + // Function x_response[i][j] + // (If TDA flag == True) + // (Tensor energies of m y-components ) + // (for i from 0 to m-1 ) + // ( for j from 0 to n-1 ) + // ( Function y_response[i][j] ) + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); + ar ω + + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + if (not r_params.tda()) { + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + } +} + +// Load a response calculation +void ExcitedResponse::load(World &world, const std::string &name) { + // The archive to read from + archive::ParallelInputArchive ar(world, name.c_str()); + + // Reading in, in this order; + // string ground-state archive name (garch_name) + // bool TDA flag + // size_t number of ground state orbitals (n) + // size_t number of excited state orbitals (m) + // Tensor energies of m x-components + // for i from 0 to m-1 + // for j from 0 to n-1 + // Function x_response[i][j] + // (If TDA flag == True) + // (Tensor energies of m y-components ) + // (for i from 0 to m-1 ) + // ( for j from 0 to n-1 ) + // ( Function y_response[i][j] ) + + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); + ar ω + + Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); + + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + world.gop.fence(); + + if (not r_params.tda()) { + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + world.gop.fence(); + } +} +/** + * Create Virtual Space Excited State Guess from atomic orbitals + * @param world + * @return + */ +X_space ExcitedResponse::create_virtual_ao_guess(World &world) const { + + print("thresh : ", FunctionDefaults<3>::get_thresh()); + print("k : ", FunctionDefaults<3>::get_k()); + auto phi_0 = copy(world, ground_orbitals); + print("Ground Orbital norms: ", norm2s_T(world, phi_0)); + auto ao_basis_set = AtomicBasisSet{"aug-cc-pvdz"}; + ao_basis_set.print(molecule); + + vecfuncT ao_vec = vecfuncT(ao_basis_set.nbf(molecule)); + + for (int i = 0; i < ao_basis_set.nbf(molecule); ++i) { + functorT aofunc(new madchem::AtomicBasisFunctor( + ao_basis_set.get_atomic_basis_function(molecule, i))); + ao_vec[i] = factoryT(world).functor(aofunc); + } + world.gop.fence(); + print("number of ao_basis_functions: ", ao_vec.size()); + + madness::print("norm of ao basis functions: ", norm2s_T(world, ao_vec)); + + QProjector projector(world, phi_0); + + // project ground_state from each atomic orbital basis + std::transform(ao_vec.begin(), ao_vec.end(), ao_vec.begin(), + [&](auto &f) { return projector(f); }); + print("overlap between phi0: ", matrix_inner(world, phi_0, ao_vec)); + madness::print("norm of ao basis after projection: ", norm2s_T(world, ao_vec)); + print("number of ao_basis_functions: ", ao_vec.size()); + auto overlap_S = matrix_inner(world, ao_vec, ao_vec); + print("Overlap S : \n", overlap_S); + Tensor U, sigma, VT; + //S=U*sigma*VT + svd(overlap_S, U, sigma, VT); + print("singular values of overlap: \n", sigma); + print("left singular vectors of overlap:\n", U); + print("right singular vectors of overlap:\n", VT); + + auto first_small = std::find_if(sigma.ptr(), sigma.ptr() + sigma.size(), + [](auto num) { return num < .05; }); + + auto idx_small = std::distance(sigma.ptr(), first_small); + auto xao = transform(world, ao_vec, U); + xao.erase(xao.begin() + idx_small, xao.end()); + // remove small singular vectors here + + auto overlap_SU = matrix_inner(world, xao, xao); + print("Overlap S after transform : \n", overlap_SU); + + // copy pao to xao response space vector + + auto xc = make_xc_operator(world); + // now compute the fock potential + // kinetic energy + auto F = [&](vector_real_function_3d x) { + size_t num_orbs = x.size(); + real_derivative_3d Dx(world, 0); + real_derivative_3d Dy(world, 1); + real_derivative_3d Dz(world, 2); + vector_real_function_3d dvx = apply(world, Dx, x); + vector_real_function_3d dvy = apply(world, Dy, x); + vector_real_function_3d dvz = apply(world, Dz, x); + // Apply again for 2nd derivatives + vector_real_function_3d dvx2 = apply(world, Dx, dvx); + vector_real_function_3d dvy2 = apply(world, Dy, dvy); + vector_real_function_3d dvz2 = apply(world, Dz, dvz); + + auto T = (dvx2 + dvy2 + dvz2) * (-0.5); + real_function_3d v_nuc, v_j0, v_k0, v_xc; + v_nuc = copy(potential_manager->vnuclear()); + v_nuc.truncate(); + auto N_elec = phi_0.size(); + v_nuc.scale((N_elec + 0.25) / N_elec); + // J^0 x^alpha + v_j0 = apply(*shared_coulomb_operator, ground_density); + v_j0.scale(2.0); + + if (xcf.hf_exchange_coefficient() != 1.0) { + v_xc = xc.make_xc_potential(); + } else { + // make a zero function + v_xc = Function( + FunctionFactory(world).fence(false).initial_level(1)); + } + + auto hf_exchange_X = zero_functions(world, num_orbs); + // hf exchange + std::transform(x.begin(), x.end(), hf_exchange_X.begin(), [&](auto &xi) { + auto f = Function(FunctionFactory(world)); + std::accumulate(phi_0.begin(), phi_0.end(), f, [&](auto phi0, auto total) { + auto sum = apply(*shared_coulomb_operator, xi * phi0) * phi0; + return total + sum; + }); + return f; + }); + vector_real_function_3d V0 = zero_functions(world, num_orbs); + real_function_3d v0 = v_j0 + v_nuc + v_xc; + V0 = v0 * x; + V0 += (-1 * hf_exchange_X * xcf.hf_exchange_coefficient()); + + return T + V0; + }; + + auto phi_a = copy(world, xao); + Tensor e_a; + for (int i = 0; i < 1; i++) { + auto Fx = F(phi_a); + auto xFx = matrix_inner(world, phi_a, Fx); + auto [e, C] = syev(xFx); + print("eigs : \n", e); + phi_a = transform(world, phi_a, C); + projector(phi_a); + e_a = e; + } + + auto e_homo = ground_energies[phi_0.size() - 1]; + + if (world.rank() == 0) { + print("ground_orb energies : \n", ground_energies); + print("homo energy : \n", e_homo); + print("virtual orbital energies : \n", e_a); + print("norm of virtual ", norm2s_T(world, phi_a)); + } + + e_a = e_a.flat(); + auto is_positive = [&](auto num) { return num > e_homo; }; + // This seems dumb but i'm removing the negative vectors + auto first_positive = std::find_if(e_a.ptr(), e_a.ptr() + e_a.size(), is_positive); + auto num_negative = std::distance(e_a.ptr(), first_positive); + auto virtual_phi = vector_real_function_3d(phi_a.size() - num_negative); + Tensor virtual_e(e_a.size() - num_negative); + + std::copy(first_positive, e_a.ptr() + e_a.size(), virtual_e.ptr()); + std::copy(phi_a.begin() + num_negative, phi_a.end(), virtual_phi.begin()); + + phi_a = virtual_phi; + e_a = virtual_e; + print("virtual orbital energies after clean up : \n", e_a); + print("norm of virtual after clean up ", norm2s_T(world, phi_a)); + + + auto t = phi_a.size() * r_params.num_orbitals(); + auto no = r_params.num_orbitals(); + + X_space x_guess(world, t, no); + + int k = 0; + // for each orbital + // for each ground orbital j + // add the virtual orbital in location j + // therefore there should be a total of num_virt*num_ground_orbitals + std::for_each(phi_a.begin(), phi_a.end(), [&](const auto virt) { + for (int j = 0; j < no; j++) { x_guess.X[k++][j] = copy(virt); } + }); + world.gop.fence(); + return x_guess; +} +/** + * Create Virtual Space Excited State Guess from atomic orbitals + * @param world + * @return + */ +X_space ExcitedResponse::create_response_guess(World &world) const { + + print("thresh : ", FunctionDefaults<3>::get_thresh()); + print("k : ", FunctionDefaults<3>::get_k()); + auto phi_0 = copy(world, ground_orbitals); + print("Ground Orbital norms: ", norm2s_T(world, phi_0)); + auto ao_basis_set = AtomicBasisSet{"6-31g"}; + ao_basis_set.print(molecule); + + vecfuncT ao_vec = vecfuncT(ao_basis_set.nbf(molecule)); + + for (int i = 0; i < ao_basis_set.nbf(molecule); ++i) { + functorT aofunc(new madchem::AtomicBasisFunctor( + ao_basis_set.get_atomic_basis_function(molecule, i))); + ao_vec[i] = factoryT(world).functor(aofunc); + } + world.gop.fence(); + print("number of ao_basis_functions: ", ao_vec.size()); + + madness::print("norm of ao basis functions: ", norm2s_T(world, ao_vec)); + + QProjector projector(world, phi_0); + + // project ground_state from each atomic orbital basis + std::transform(ao_vec.begin(), ao_vec.end(), ao_vec.begin(), + [&](auto &f) { return projector(f); }); + print("overlap between phi0: ", matrix_inner(world, phi_0, ao_vec)); + madness::print("norm of ao basis after projection: ", norm2s_T(world, ao_vec)); + print("number of ao_basis_functions: ", ao_vec.size()); + auto overlap_S = matrix_inner(world, ao_vec, ao_vec); + print("Overlap S : \n", overlap_S); + Tensor U, sigma, VT; + //S=U*sigma*VT + svd(overlap_S, U, sigma, VT); + print("singular values of overlap: \n", sigma); + print("left singular vectors of overlap:\n", U); + print("right singular vectors of overlap:\n", VT); + auto xao = transform(world, ao_vec, U); + auto overlap_SU = matrix_inner(world, xao, xao); + print("Overlap S after transform : \n", overlap_SU); + + // copy pao to xao response space vector + + auto xc = make_xc_operator(world); + // now compute the fock potential + // kinetic energy + auto F = [&](vector_real_function_3d x) { + size_t num_orbs = x.size(); + real_derivative_3d Dx(world, 0); + real_derivative_3d Dy(world, 1); + real_derivative_3d Dz(world, 2); + vector_real_function_3d dvx = apply(world, Dx, x); + vector_real_function_3d dvy = apply(world, Dy, x); + vector_real_function_3d dvz = apply(world, Dz, x); + // Apply again for 2nd derivatives + vector_real_function_3d dvx2 = apply(world, Dx, dvx); + vector_real_function_3d dvy2 = apply(world, Dy, dvy); + vector_real_function_3d dvz2 = apply(world, Dz, dvz); + + auto T = (dvx2 + dvy2 + dvz2) * (-0.5); + real_function_3d v_nuc, v_j0, v_k0, v_xc; + v_nuc = potential_manager->vnuclear(); + v_nuc.truncate(); + // J^0 x^alpha + v_j0 = apply(*shared_coulomb_operator, ground_density); + v_j0.scale(2.0); + + if (xcf.hf_exchange_coefficient() != 1.0) { + v_xc = xc.make_xc_potential(); + } else { + // make a zero function + v_xc = Function( + FunctionFactory(world).fence(false).initial_level(1)); + } + + auto hf_exchange_X = zero_functions(world, num_orbs); + // hf exchange + std::transform(x.begin(), x.end(), hf_exchange_X.begin(), [&](auto &xi) { + auto f = Function(FunctionFactory(world)); + std::accumulate(phi_0.begin(), phi_0.end(), f, [&](auto phi0, auto total) { + auto sum = apply(*shared_coulomb_operator, xi * phi0) * phi0; + return total + sum; + }); + return f; + }); + vector_real_function_3d V0 = zero_functions(world, num_orbs); + real_function_3d v0 = v_j0 + v_nuc + v_xc; + V0 = v0 * x; + V0 += (-1 * hf_exchange_X * xcf.hf_exchange_coefficient()); + + return T + V0; + }; + + auto phi_a = copy(world, xao); + Tensor e_a; + for (int i = 0; i < 1; i++) { + auto Fx = F(phi_a); + auto xFx = matrix_inner(world, phi_a, Fx); + auto [e, C] = syev(xFx); + print("eigs : \n", e); + phi_a = transform(world, phi_a, C); + projector(phi_a); + e_a = e; + } + + print("ground_orb energies : \n", ground_energies); + print("virtual orbital energies : \n", e_a); + print("norm of virtual ", norm2s_T(world, phi_a)); + e_a = e_a.flat(); + auto homo_e = ground_energies[phi_0.size() - 1]; + print("homo_e :", homo_e); + auto is_positive = [&](auto num) { return num > homo_e; }; + // This seems dumb but i'm removing the negative vectors + auto first_positive = std::find_if(e_a.ptr(), e_a.ptr() + e_a.size(), is_positive); + auto num_negative = std::distance(e_a.ptr(), first_positive); + print("num_negative :", num_negative); + auto virtual_phi = vector_real_function_3d(phi_a.size() - num_negative); + Tensor virtual_e(e_a.size() - num_negative); + std::copy(first_positive, e_a.ptr() + e_a.size(), virtual_e.ptr()); + std::copy(phi_a.begin() + num_negative, phi_a.end(), virtual_phi.begin()); + phi_a = virtual_phi; + e_a = virtual_e; + auto SOA = matrix_inner(world, phi_0, phi_a); + print("Do I remove the vectors that are not completely 0 I hope it's zero\n", SOA); + print("Sanity CHECK I hope it's diagonal\n", matrix_inner(world, phi_a, F(phi_a))); + // create a vector of pairs + std::vector> ia_indicies; + print("forming response space pairs"); + print("( i , a )"); + for (int i = 0; i < phi_0.size(); i++) { + for (int a = 0; a < phi_a.size(); a++) { + ia_indicies.emplace_back(std::pair{i, a}); + } + } + int kk = 0; + Tensor A(ia_indicies.size(), ia_indicies.size()); + for (const auto ia: ia_indicies) { + std::cout << "( " << ia.first << " , " << ia.second << " )" << std::endl; + A(kk, kk) = (e_a[ia.second] - ground_energies[ia.first]); + kk++; + } + print("( ij , ab )"); + int ii = 0; + int jj = 0; + // create pairs ia, ii,ab + auto two_int = [&](World &world, const vector_real_function_3d &phi0, + const vector_real_function_3d &phia) { + // The easy case make n*m matrix + auto tol = FunctionDefaults<3>::get_thresh(); + reconstruct(world, phi0); + reconstruct(world, phia); + + vector_real_function_3d pairs_ij; + vector_real_function_3d pairs_ia; + vector_real_function_3d pairs_ab; + + for (auto &phi_ii: phi0) { + for (auto &phi_aa: phia) { pairs_ia.push_back(mul_sparse(phi_ii, phi_aa, tol, false)); } + } + world.gop.fence(); + truncate(world, pairs_ia); + vecfuncT Vpairs_ia = apply(world, *shared_coulomb_operator, pairs_ia); + auto A_ia_jb = matrix_inner(world, pairs_ia, Vpairs_ia); + for (auto &phi_ii: phi0) { + for (auto &phi_jj: phi0) { pairs_ij.push_back(mul_sparse(phi_ii, phi_ii, tol, false)); } + } + for (auto &phi_aa: phia) { + for (auto &phi_bb: phia) { pairs_ab.push_back(mul_sparse(phi_aa, phi_aa, tol, false)); } + } + world.gop.fence(); + truncate(world, pairs_ij); + truncate(world, pairs_ab); + vecfuncT Vpairs_ij = apply(world, *shared_coulomb_operator, pairs_ab); + auto A_ij_ab = matrix_inner(world, pairs_ia, Vpairs_ij); + // reshape A_ij_ab n^2 x m^2 + auto a_len = phi_a.size() * phi_0.size(); + Tensor A(a_len, a_len); + print(A); + int kk = 0; + //[i,j]= will have a phia by phia block. each row gets rearranged into ij + for (int ii = 0; ii < phi0.size(); ii++) { + for (int jj = 0; jj < phi0.size(); jj++) { + auto ii_ab = A_ij_ab(kk++, _); + print(ii_ab); + auto b_i = ii * phia.size(); + auto b_ip1 = (ii * phia.size() + phia.size()) - 1; + auto b_j = jj * phia.size(); + auto b_jp1 = (jj * phia.size() + phia.size()) - 1; + print("( ", b_i, " , ", b_ip1, " ) "); + print("( ", b_j, " , ", b_jp1, " ) "); + print(Slice(b_i, b_ip1)); + //ii_ab = ii_ab.reshape(phi_a.size(), phi_a.size()); + A(Slice(b_i, b_ip1, 1), Slice(b_j, b_jp1, 1)) = + ii_ab.reshape(phi_a.size(), phi_a.size()); + //ii_ab = ii_ab.reshape(phi_a.size(), phi_a.size()); + // I think there is a bug in tensor where reshape doesn't automatically change dim + // + print("after add\n", A); + } + } + return A_ia_jb - A; + }; + auto Atwo = two_int(world, phi_0, phi_a); + A = A + Atwo; + print(A); + auto [omega, X] = syev(A); + + + print(omega); + print(X); + + + auto t = xao.size() * r_params.num_orbitals(); + auto no = r_params.num_orbitals(); + + X_space x_guess(world, t, no); + + + for (int i = 0; i < t; i++) { + auto xt = copy(X(_, i)); + auto mt = xt.reshape(xao.size(), no); + x_guess.X[i] = transform(world, phi_a, mt); + // new size is xt column size + } + return x_guess; +} + + +X_space ExcitedTester::test_ao_guess(World &world, ExcitedResponse &calc) { + + print("thresh : ", FunctionDefaults<3>::get_thresh()); + print("k : ", FunctionDefaults<3>::get_k()); + + auto phi_0 = copy(world, calc.ground_orbitals); + print("Ground Orbital norms: ", norm2s_T(world, phi_0)); + auto ao_basis_set = AtomicBasisSet{"6-31g"}; + auto molecule = calc.molecule; + ao_basis_set.print(molecule); + + vecfuncT ao_vec = vecfuncT(ao_basis_set.nbf(molecule)); + + for (int i = 0; i < ao_basis_set.nbf(molecule); ++i) { + functorT aofunc(new madchem::AtomicBasisFunctor( + ao_basis_set.get_atomic_basis_function(calc.molecule, i))); + ao_vec[i] = factoryT(world).functor(aofunc); + } + world.gop.fence(); + print("number of ao_basis_functions: ", ao_vec.size()); + + madness::print("norm of ao basis functions: ", norm2s_T(world, ao_vec)); + + QProjector projector(world, phi_0); + + // project ground_state from each atomic orbital basis + std::transform(ao_vec.begin(), ao_vec.end(), ao_vec.begin(), + [&](auto &f) { return projector(f); }); + + + print("overlap between phi0: ", matrix_inner(world, phi_0, ao_vec)); + madness::print("norm of ao basis after projection: ", norm2s_T(world, ao_vec)); + print("number of ao_basis_functions: ", ao_vec.size()); + + + auto overlap_S = matrix_inner(world, ao_vec, ao_vec); + print("Overlap S : \n", overlap_S); + + Tensor U, sigma, VT; + //S=U*sigma*VT + svd(overlap_S, U, sigma, VT); + + print("singular values of overlap: \n", sigma); + print("left singular vectors of overlap:\n", U); + print("right singular vectors of overlap:\n", VT); + auto xao = transform(world, ao_vec, U); + auto overlap_SU = matrix_inner(world, xao, xao); + print("Overlap S after transform : \n", overlap_SU); + + // copy pao to xao response space vector + + auto xc = calc.make_xc_operator(world); + // now compute the fock potential + + // kinetic energy + auto F = [&](vector_real_function_3d x) { + size_t num_orbs = x.size(); + + real_derivative_3d Dx(world, 0); + real_derivative_3d Dy(world, 1); + real_derivative_3d Dz(world, 2); + + vector_real_function_3d dvx = apply(world, Dx, x); + vector_real_function_3d dvy = apply(world, Dy, x); + vector_real_function_3d dvz = apply(world, Dz, x); + // Apply again for 2nd derivatives + vector_real_function_3d dvx2 = apply(world, Dx, dvx); + vector_real_function_3d dvy2 = apply(world, Dy, dvy); + vector_real_function_3d dvz2 = apply(world, Dz, dvz); + + auto T = (dvx2 + dvy2 + dvz2) * (-0.5); + real_function_3d v_nuc, v_j0, v_k0, v_xc; + v_nuc = calc.potential_manager->vnuclear(); + v_nuc.truncate(); + // J^0 x^alpha + v_j0 = apply(*calc.shared_coulomb_operator, calc.ground_density); + v_j0.scale(2.0); + + if (calc.xcf.hf_exchange_coefficient() != 1.0) { + v_xc = xc.make_xc_potential(); + } else { + // make a zero function + v_xc = Function( + FunctionFactory(world).fence(false).initial_level(1)); + } + + auto hf_exchange_X = zero_functions(world, num_orbs); + // hf exchange + std::transform(x.begin(), x.end(), hf_exchange_X.begin(), [&](auto &xi) { + auto f = Function(FunctionFactory(world)); + std::accumulate(phi_0.begin(), phi_0.end(), f, [&](auto phi0, auto total) { + auto sum = apply(*calc.shared_coulomb_operator, xi * phi0) * phi0; + return total + sum; + }); + return f; + }); + vector_real_function_3d V0 = zero_functions(world, num_orbs); + real_function_3d v0 = v_j0 + v_nuc + v_xc; + V0 = v0 * x; + V0 += (-1 * hf_exchange_X * calc.xcf.hf_exchange_coefficient()); + + return T + V0; + }; + + auto phi_a = copy(world, xao); + Tensor e_a; + for (int i = 0; i < 1; i++) { + auto Fx = F(phi_a); + auto xFx = matrix_inner(world, phi_a, Fx); + auto [e, C] = syev(xFx); + print("eigs : \n", e); + phi_a = transform(world, phi_a, C); + projector(phi_a); + e_a = e; + } + + print("ground_orb energies : \n", calc.ground_energies); + print("virtual orbital energies : \n", e_a); + print("norm of virtual ", norm2s_T(world, phi_a)); + e_a = e_a.flat(); + auto is_positive = [](auto num) { return num > 0; }; + // This seems dumb but i'm removing the negative vectors + auto first_positive = std::find_if(e_a.ptr(), e_a.ptr() + e_a.size(), is_positive); + auto num_negative = std::distance(e_a.ptr(), first_positive); + auto virtual_phi = vector_real_function_3d(phi_a.size() - num_negative); + Tensor virtual_e(e_a.size() - num_negative); + std::copy(first_positive, e_a.ptr() + e_a.size(), virtual_e.ptr()); + std::copy(phi_a.begin() + num_negative, phi_a.end(), virtual_phi.begin()); + phi_a = virtual_phi; + e_a = virtual_e; + auto SOA = matrix_inner(world, phi_0, phi_a); + print("Do I remove the vectors that are not completely 0 I hope it's zero\n", SOA); + print("Sanity CHECK I hope it's diagonal\n", matrix_inner(world, phi_a, F(phi_a))); + // create a vector of pairs + std::vector> ia_indicies; + print("forming response space pairs"); + print("( i , a )"); + for (int i = 0; i < phi_0.size(); i++) { + for (int a = 0; a < phi_a.size(); a++) { + ia_indicies.emplace_back(std::pair{i, a}); + } + } + int kk = 0; + Tensor A(ia_indicies.size(), ia_indicies.size()); + for (const auto ia: ia_indicies) { + std::cout << "( " << ia.first << " , " << ia.second << " )" << std::endl; + A(kk, kk) = (e_a[ia.second] - calc.ground_energies[ia.first]); + kk++; + } + print("( ij , ab )"); + int ii = 0; + int jj = 0; + // create pairs ia, ii,ab + auto two_int = [&](World &world, const vector_real_function_3d &phi0, + const vector_real_function_3d &phia) { + // The easy case make n*m matrix + auto tol = FunctionDefaults<3>::get_thresh(); + reconstruct(world, phi0); + reconstruct(world, phia); + + vector_real_function_3d pairs_ij; + vector_real_function_3d pairs_ia; + vector_real_function_3d pairs_ab; + + for (auto &phi_ii: phi0) { + for (auto &phi_aa: phia) { pairs_ia.push_back(mul_sparse(phi_ii, phi_aa, tol, false)); } + } + world.gop.fence(); + truncate(world, pairs_ia); + vecfuncT Vpairs_ia = apply(world, *calc.shared_coulomb_operator, pairs_ia); + auto A_ia_jb = matrix_inner(world, pairs_ia, Vpairs_ia); + for (auto &phi_ii: phi0) { + for (auto &phi_jj: phi0) { pairs_ij.push_back(mul_sparse(phi_ii, phi_ii, tol, false)); } + } + for (auto &phi_aa: phia) { + for (auto &phi_bb: phia) { pairs_ab.push_back(mul_sparse(phi_aa, phi_aa, tol, false)); } + } + world.gop.fence(); + truncate(world, pairs_ij); + truncate(world, pairs_ab); + vecfuncT Vpairs_ij = apply(world, *calc.shared_coulomb_operator, pairs_ab); + auto A_ij_ab = matrix_inner(world, pairs_ia, Vpairs_ij); + // reshape A_ij_ab n^2 x m^2 + auto a_len = phi_a.size() * phi_0.size(); + Tensor A(a_len, a_len); + print(A); + int kk = 0; + //[i,j]= will have a phia by phia block. each row gets rearranged into ij + for (int ii = 0; ii < phi0.size(); ii++) { + for (int jj = 0; jj < phi0.size(); jj++) { + auto ii_ab = A_ij_ab(kk++, _); + print(ii_ab); + auto b_i = ii * phia.size(); + auto b_ip1 = (ii * phia.size() + phia.size()) - 1; + auto b_j = jj * phia.size(); + auto b_jp1 = (jj * phia.size() + phia.size()) - 1; + print("( ", b_i, " , ", b_ip1, " ) "); + print("( ", b_j, " , ", b_jp1, " ) "); + print(Slice(b_i, b_ip1)); + //ii_ab = ii_ab.reshape(phi_a.size(), phi_a.size()); + A(Slice(b_i, b_ip1, 1), Slice(b_j, b_jp1, 1)) = + ii_ab.reshape(phi_a.size(), phi_a.size()); + //ii_ab = ii_ab.reshape(phi_a.size(), phi_a.size()); + // I think there is a bug in tensor where reshape doesn't automatically change dim + // + print("after add\n", A); + } + } + return A_ia_jb - A; + }; + auto Atwo = two_int(world, phi_0, phi_a); + A = A + Atwo; + print(A); + auto [omega, X] = syev(A); + + + print(omega); + print(X); + + + auto t = xao.size() * calc.r_params.num_orbitals(); + auto no = calc.r_params.num_orbitals(); + + X_space x_guess(world, t, no); + + + for (int i = 0; i < t; i++) { + auto xt = copy(X(_, i)); + auto mt = xt.reshape(xao.size(), no); + x_guess.X[i] = transform(world, phi_a, mt); + // new size is xt column size + } + + + return x_guess; +} diff --git a/src/apps/molresponse/ExcitedResponse.hpp b/src/apps/molresponse/ExcitedResponse.hpp new file mode 100644 index 00000000000..769263eefd1 --- /dev/null +++ b/src/apps/molresponse/ExcitedResponse.hpp @@ -0,0 +1,155 @@ +// +// Created by adrianhurtado on 1/28/22. +// + +#ifndef MADNESS_EXCITEDRESPONSE_HPP +#define MADNESS_EXCITEDRESPONSE_HPP +#include "ResponseBase.hpp" + +struct ExcitedSpace { + + X_space chi; + X_space l_chi; +}; + + +class ExcitedResponse : public ResponseBase { + +public: + ExcitedResponse(World& world, const CalcParams& params) : ResponseBase(world, params) {} + void initialize(World& world) override; + void iterate_trial(World& world, X_space& trial); + friend class ExcitedTester; + +private: + Tensor omega; + void iterate(World& world) override; + + X_space make_random_trial(World& world, size_t m) const; + X_space make_nwchem_trial(World& world, size_t m) const; + + X_space create_trial_functions2(World& world) const; + X_space create_trial_functions(World& world, size_t k) const; + X_space create_virtual_ao_guess(World& world) const; + + + void deflateTDA(World& world, X_space& Chi, X_space& old_Chi, X_space& Lambda_X, + X_space& old_Lambda_X, Tensor& S, Tensor old_S, + Tensor old_A, Tensor& omega, size_t& iteration, size_t& m); + void deflateFull(World& world, X_space& Chi, X_space& old_Chi, X_space& Lambda_X, + X_space& old_Lambda_X, Tensor& S, Tensor old_S, + Tensor old_A, Tensor& omega, size_t& iteration, size_t& m); + void augment(World& world, X_space& Chi, X_space& old_Chi, X_space& Lambda_X, + X_space& last_Lambda_X, Tensor& S, Tensor& A, + Tensor& old_S, Tensor& old_A, size_t print_level); + void augment_full(World& world, X_space& Chi, X_space& old_Chi, X_space& Lambda_X, + X_space& last_Lambda_X, Tensor& S, Tensor& A, + Tensor& old_S, Tensor& old_A, size_t print_level); + void unaugment(World& world, X_space& Chi, X_space& old_Chi, X_space& Lambda_X, + X_space& last_Lambda_X, Tensor& omega, Tensor& S_x, + Tensor& A_x, Tensor& old_S, Tensor& old_A, + size_t num_states, size_t iter, size_t print_level); + void unaugment_full(World& world, X_space& Chi, X_space& old_Chi, X_space& Lambda_X, + X_space& last_Lambda_X, Tensor& omega, Tensor& S_x, + Tensor& A_x, Tensor& old_S, Tensor& old_A, + size_t num_states, size_t iter, size_t print_level); + Tensor diagonalizeFullResponseMatrix(World& world, X_space& Chi, X_space& Lambda_X, + Tensor& omega, Tensor& S, + Tensor& A, const double thresh, + size_t print_level); + Tensor GetFullResponseTransformation(World& world, Tensor& S, Tensor& A, + Tensor& evals, + const double thresh_degenerate); + void deflateGuesses(World& world, X_space& Chi, X_space& Lambda_X, Tensor& S, + Tensor& frequencies, size_t& iteration, size_t& m) const; + + Tensor diagonalizeFockMatrix(World& world, X_space& Chi, X_space& Lambda_X, + Tensor& evals, Tensor& A, + Tensor& S, const double thresh) const; + /// compute the unitary transformation that diagonalizes the fock matrix + + /// @param[in] world the world + /// @param[in] overlap the overlap matrix of the orbitals + /// @param[inout] fock the fock matrix; diagonal upon exit + /// @param[out] evals the orbital energies + /// @param[in] thresh_degenerate threshold for orbitals being + /// degenerate + /// @return the unitary matrix U: U^T F U = evals + Tensor get_fock_transformation(World& world, Tensor& overlap, + Tensor& fock, Tensor& evals, + const double thresh_degenerate) const; + + // Sorts the given Tensor of energies + Tensor sort_eigenvalues(World& world, Tensor& vals, Tensor& vecs) const; + // Construct the Hamiltonian + // Returns the shift needed to make sure that + // -2.0 * (ground_state_energy + excited_state_energy) + // is negative. Please note: The same shift needs to + // be applied to the potential. + Tensor create_shift(World& world, const Tensor& ground, + const Tensor& omega, std::string xy) const; + + + // Returns the given shift applied to the given potential + response_space apply_shift(World& world, const Tensor& shifts, const response_space& V, + const response_space& f); + + + // Function to make a vector of BSH operators using ground and excited + // state energies + std::vector>> create_bsh_operators( + World& world, const Tensor& shift, const Tensor& ground, + const Tensor& omega, const double lo, const double thresh) const; + + static void excited_to_json(json& j_mol_in, size_t iter, const Tensor& omega); + + /** + * @brief Computes the BSH Update for an excited state calculation. Passes in + * omega and computes the necessary shifts in the potential, computes BSH + * operators and applys BSH operator + * + * \f$ \chi^m=-2\hat{G} * \Theta\chi \f$ + * + * @param world + * @param theta_X + * @param projector + * @param converged + * @return X_space + */ + X_space bsh_update_excited(World& world, const Tensor& omega, X_space& theta_X, + QProjector& projector); + void analysis(World& world, const X_space& chi); + void save(World& world, const std::string& name) override; + void load(World& world, const std::string& name) override; + + std::pair, Tensor> excited_eig(World& world, Tensor& S, + Tensor& A, + const double thresh_degenerate); + + std::tuple rotate_excited_vectors( + World& world, const Tensor& U, const X_space& chi, const X_space& l_chi, + const X_space& v0_chi, const X_space& gamma_chi); + std::tuple, X_space, X_space, X_space, X_space> rotate_excited_space( + World& world, X_space& chi, X_space& lchi, X_space& v_chi, X_space& gamma_chi); + std::tuple, X_space, X_space, residuals> update( + World& world, X_space& Chi, XCOperator& xc, QProjector& projector, + NonLinearXsolver& kain_x_space, vector& Xvector, vector& Xresidual, + size_t iter, const double& maxrotn); + X_space create_response_guess(World& world) const; + std::tuple, Tensor, Tensor> reduce_subspace( + World& world, Tensor& S, Tensor& A, const double thresh_degenerate); +}; + +class ExcitedTester { +private: +public: + ExcitedTester(World& world, ExcitedResponse& calc, double thresh) { + print("Setting Function Defaults"); + calc.set_protocol(world, thresh); + calc.check_k(world, thresh, FunctionDefaults<3>::get_k()); + } + X_space test_ao_guess(World& world, ExcitedResponse& calc); +}; + + +#endif//MADNESS_EXCITEDRESPONSE_HPP diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp new file mode 100644 index 00000000000..df760106002 --- /dev/null +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -0,0 +1,487 @@ +// +// Created by adrianhurtado on 2/3/22. +// + +#include "FrequencyResponse.hpp" + +#include "property.h" + + +void FrequencyResponse::initialize(World &world) { Chi = PQ.copy(); } +void FrequencyResponse::iterate(World &world) { + size_t iter; + // Variables needed to iterate + QProjector projector(world, ground_orbitals); + size_t n = r_params.num_orbitals();// Number of ground state orbitals + size_t m = r_params.num_states(); // Number of excited states + + real_function_3d v_xc;// For TDDFT + // the Final protocol should be equal to dconv at the minimum + const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double relative_max_target = + std::max(5 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + // m residuals for x and y + Tensor bsh_residualsX((int(m))); + Tensor bsh_residualsY((int(m))); + Tensor density_residuals((int(m))); + + Tensor xij_norms(m, 2 * n); + Tensor xij_res_norms(m, 2 * n); + + vecfuncT rho_omega_old(m); + + // initialize DFT XC functional operator + XCOperator xc = make_xc_operator(world); + + // create X space residuals + X_space residuals(world, m, n); + + std::vector x_vectors; + std::vector x_residuals; + + for (size_t b = 0; b < m; b++) { + x_vectors.emplace_back(Chi, b); + x_residuals.emplace_back(residuals, b); + } + // create a std vector of XNONLinearsolvers + NonLinearXsolver kain_x_space; + for (size_t b = 0; b < m; b++) { + kain_x_space.push_back(XNonlinearSolver( + X_space_allocator(world, n), true)); + } + if (r_params.kain()) { + for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } + } + // + // We compute with positive frequencies + print("Warning input frequency is assumed to be positive"); + print("Computing at positive frequency omega = ", omega); + double x_shifts = 0.0; + double y_shifts = 0.0; + // if less negative orbital energy + frequency is positive or greater than 0 + if ((ground_energies[long(n) - 1] + omega) >= 0.0) { + // Calculate minimum shift needed such that \eps + \omega + shift < 0 + print("*** we are shifting just so you know!!!"); + x_shifts = -.05 - (omega + ground_energies[long(n) - 1]); + } + auto bsh_x_ops = make_bsh_operators_response(world, x_shifts, omega); + std::vector bsh_y_ops; + + bool static_res = (omega == 0.0); + bool compute_y = not static_res; + // Negate omega to make this next set of BSH operators \eps - omega + if (compute_y) { + omega = -omega; + bsh_y_ops = make_bsh_operators_response(world, y_shifts, omega); + omega = -omega; + } + + vector_real_function_3d rho_omega = make_density(world, Chi); + converged = false;// Converged flag + + auto thresh = FunctionDefaults<3>::get_thresh(); + auto max_rotation = .5; + if (thresh >= 1e-2) { + max_rotation = 2; + } else if (thresh >= 1e-4) { + max_rotation = .25; + } else if (thresh >= 1e-6) { + max_rotation = .1; + } else if (thresh >= 1e-8) { + max_rotation = .05; + } + + for (iter = 0; iter < r_params.maxiter(); ++iter) { + iter_timing.clear(); + // Basic output + if (r_params.print_level() >= 1) { + molresponse::start_timer(world); + if (world.rank() == 0) + printf("\n Iteration %d at time %.1fs\n", static_cast(iter), wall_time()); + if (world.rank() == 0) print("-------------------------------------------"); + } + + if (iter < 2 || (iter % 10) == 0) { load_balance_chi(world); } + + if (iter > 0) { + if (density_residuals.max() > 2) { break; } + double d_residual = density_residuals.max(); + // Test convergence and set to true + auto chi_norms = Chi.norm2s(); + auto relative_bsh = copy(bsh_residualsX); + auto rho_norms = norm2s_T(world, rho_omega); + + std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), + chi_norms.ptr(), relative_bsh.ptr(), + [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); + + auto max_bsh = bsh_residualsX.absmax(); + auto relative_max_bsh = relative_bsh.absmax(); + + Tensor polar = -2 * inner(Chi, PQ); + // Todo add chi norm and chi_x + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, + xij_norms, xij_res_norms, rho_norms, density_residuals); + frequency_to_json(j_molresponse, iter, polar); + + if (r_params.print_level() >= 1) { + + if (world.rank() == 0) { + print("thresh: ", FunctionDefaults<3>::get_thresh()); + print("k: ", FunctionDefaults<3>::get_k()); + print("Chi Norms at start of iteration: ", iter); + print("xij norms: \n", xij_norms); + print("xij residual norms: \n", xij_res_norms); + print("Chi_X: ", chi_norms); + print("bsh_residuals : ", bsh_residualsX); + print("relative_bsh : ", relative_bsh); + print("r_params.dconv(): ", r_params.dconv()); + print("max rotation: ", max_rotation); + print("d_residual_max : ", d_residual); + print("d_residual_max target : ", conv_den); + print("bsh_residual_max : ", max_bsh); + print("relative_bsh_residual_max : ", relative_max_bsh); + print("relative_bsh_residual_max target : ", relative_max_target); + } + } + if ((d_residual < conv_den) and ((relative_max_bsh < relative_max_target) or + r_params.get("conv_only_dens"))) { + converged = true; + } + + if (converged || iter == r_params.maxiter() - 1) { + // if converged print converged + if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { + print("\nConverged!\n"); + } + + if (r_params.save()) { + molresponse::start_timer(world); + save(world, r_params.save_file()); + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Save:"); + } + if (r_params.plot_all_orbitals()) { + plotResponseOrbitals(world, iter, Chi.X, Chi.Y, r_params, ground_calc); + } + if (r_params.plot()) { + auto rho0 = make_ground_density(world); + do_vtk_plots(world, 200, r_params.L(), molecule, rho0, rho_omega, + ground_orbitals, Chi); + } + break; + } + } + + auto [new_chi, new_res] = + update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, + kain_x_space, x_vectors, x_residuals, iter, max_rotation); + + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + rho_omega_old = make_density(world, Chi); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "make_density_old", "make_density_old", iter_timing); + } + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + rho_omega = make_density(world, new_chi); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "make_density_new", "make_density_new", iter_timing); + } + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + + bsh_residualsX = copy(new_res.residual_norms); + bsh_residualsY = copy(new_res.residual_norms); + Chi = new_chi.copy(); + + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); + } + + xij_res_norms = new_res.residual.component_norm2s(); + xij_norms = Chi.component_norm2s(); + + density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); + /* + max_rotation = (bsh_residualsX + bsh_residualsY) ; + for (size_t i = 0; i < Chi.num_states(); i++) { + if (max_rotation[i] < r_params.max_rotation()) { + max_rotation[i] = r_params.max_rotation(); + print("less than max_rotation....set to max_rotation"); + } + } + */ + + Tensor polar = -2 * inner(Chi, PQ); + + if (r_params.print_level() >= 20) { + auto [eval, evec] = syev(polar); + if (world.rank() == 0) { + printf("\n--------Response Properties after %d-------------\n", + static_cast(iter)); + print("polarizability"); + print(polar); + print("polarizability eigenvalues"); + print(eval); + print("polarizability eigenvectors"); + print(evec); + } + } + + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "Iteration Timing", "iter_total", iter_timing); + } + time_data.add_data(iter_timing); + } + + if (world.rank() == 0) print("\n"); + if (world.rank() == 0) print(" Finished Response Calculation "); + if (world.rank() == 0) print(" ------------------------"); + if (world.rank() == 0) print("\n"); + + // Did we converge? + if (iter == r_params.maxiter() && not converged) { + if (world.rank() == 0) print(" Failed to converge. Reason:"); + if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); + if (world.rank() == 0) print(" Running analysis on current values.\n"); + } + if (world.rank() == 0) { + print(" Final energy residuals X:"); + print(bsh_residualsX); + print(" Final energy residuals Y:"); + print(bsh_residualsY); + print(" Final density residuals:"); + print(density_residuals); + compute_and_print_polarizability(world, Chi, PQ, "Converged"); + } +} +auto FrequencyResponse::update(World &world, X_space &chi, XCOperator &xc, + std::vector &bsh_x_ops, + std::vector &bsh_y_ops, QProjector &projector, + double &x_shifts, double &omega_n, NonLinearXsolver &kain_x_space, + vector &Xvector, vector &Xresidual, + size_t iteration, const double &maxrotn) + -> std::tuple { + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + + size_t m = chi.num_states(); + bool compute_y = omega_n != 0.0; + // size_t n = Chi.num_orbitals(); + X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); + // compute residual X_space + print("BSH update iter = ", iteration); + + X_space new_chi = + bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); + + auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); + + // kain update with temp adjusts temp + if (r_params.kain() && (iteration > 0)) { + new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); + } + + if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + // truncate x + //new_chi.X.truncate_rf(); + // truncate y if compute y + //if (compute_y) new_chi.Y.truncate_rf(); + + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "update response", "update", iter_timing); + } + // if not compute y then copy x in to y + return {new_chi, {new_res, bsh}}; + + // print x norms +} +auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, + std::vector &bsh_x_ops, + std::vector &bsh_y_ops, + QProjector &projector, double &x_shifts) + -> X_space { + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::start_timer(world); + print("--------------- BSH UPDATE RESPONSE------------------"); + } + + size_t m = theta_X.X.size(); + size_t n = theta_X.X.size_orbitals(); + bool compute_y = omega != 0.0; + + theta_X.X += theta_X.X * x_shifts; + theta_X.X += PQ.X; + theta_X.X = theta_X.X * -2; + + if (compute_y) { + theta_X.Y += PQ.Y; + theta_X.Y = theta_X.Y * -2; + } + // apply bsh + X_space bsh_X(world, m, n); + + bsh_X.X = apply(world, bsh_x_ops, theta_X.X); + if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + + // Project out ground state + for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); + if (compute_y) { + for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } + } else { + bsh_X.Y = bsh_X.X.copy(); + } + + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); + } + + return bsh_X; +} +void FrequencyResponse::frequency_to_json(json &j_mol_in, size_t iter, + const Tensor &polar_ij) { + json j = {}; + + j["iter"] = iter; + j["polar"] = tensor_to_json(polar_ij); + auto index = j_mol_in["protocol_data"].size() - 1; + j_mol_in["protocol_data"][index]["property_data"].push_back(j); +} + +void FrequencyResponse::compute_and_print_polarizability(World &world, X_space &Chi, X_space &pq, + std::string message) { + Tensor G = -2 * inner(Chi, pq); + if (world.rank() == 0) { + print("Polarizability", message); + print(G); + } +} +void FrequencyResponse::save(World &world, const std::string &name) { + + + // Archive to write everything to + archive::ParallelOutputArchive ar(world, name.c_str(), 1); + // Just going to enforce 1 io server + + // Saving, in this order; + // string ground-state archive name (garch_name) + // bool TDA flag + // size_t number of ground state orbitals (n) + // size_t number of excited state orbitals (m) + // Tensor energies of m x-components + // for i from 0 to m-1 + // for j from 0 to n-1 + // Function x_response[i][j] + // (If TDA flag == True) + // (Tensor energies of m y-components ) + // (for i from 0 to m-1 ) + // ( for j from 0 to n-1 ) + // ( Function y_response[i][j] ) + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); + + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + if (not r_params.tda()) { + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + } +} + +// Load a response calculation +void FrequencyResponse::load(World &world, const std::string &name) { + // The archive to read from + archive::ParallelInputArchive ar(world, name.c_str()); + + // Reading in, in this order; + // string ground-state archive name (garch_name) + // bool TDA flag + // size_t number of ground state orbitals (n) + // size_t number of excited state orbitals (m) + // Tensor energies of m x-components + // for i from 0 to m-1 + // for j from 0 to n-1 + // Function x_response[i][j] + // (If TDA flag == True) + // (Tensor energies of m y-components ) + // (for i from 0 to m-1 ) + // ( for j from 0 to n-1 ) + // ( Function y_response[i][j] ) + + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); + + Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); + + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + world.gop.fence(); + + if (not r_params.tda()) { + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + world.gop.fence(); + } +} +auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { + auto [gc, molecule, r_params] = calc.get_parameter(); + X_space PQ(world, r_params.num_states(), r_params.num_orbitals()); + auto num_operators = size_t(molecule.natom() * 3); + auto nuclear_vector = vecfuncT(num_operators); + + for (size_t atom = 0; atom < molecule.natom(); ++atom) { + for (size_t axis = 0; axis < 3; ++axis) { + FunctorT func(new madchem::MolecularDerivativeFunctor(molecule, atom, axis)); + nuclear_vector.at(atom * 3 + axis) = FunctionT( + FactoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); + } + } + PQ.X = vector_to_PQ(world, nuclear_vector, calc.get_orbitals(), r_params.lo()); + PQ.Y = PQ.X; + return PQ; +} +auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { + auto [gc, molecule, r_params] = calc.get_parameter(); + X_space PQ(world, r_params.num_states(), r_params.num_orbitals()); + vector_real_function_3d dipole_vectors(3); + size_t i = 0; + for (auto &d: dipole_vectors) { + + std::vector f(3, 0); + f[i++] = 1; + d = real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(f))); + } + //truncate(world, dipole_vectors, true); + PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals(), r_params.lo()); + PQ.Y = PQ.X; + return PQ; +} +auto vector_to_PQ(World &world, const vector_real_function_3d &p, + const vector_real_function_3d &ground_orbitals, double lo) -> response_space { + + response_space rhs(world, p.size(), ground_orbitals.size()); + + reconstruct(world, ground_orbitals); + + QProjector Qhat(world, ground_orbitals); + + std::vector orbitals = copy(world, ground_orbitals); + truncate(world, orbitals); + + auto f = [&](auto property) { + auto phat_phi = mul(world, property, orbitals, lo); + // rhs[i].truncate_vec(); + // project rhs vectors for state + phat_phi = Qhat(phat_phi); + truncate(world, phat_phi); + world.gop.fence(); + return phat_phi; + }; + std::transform(p.begin(), p.end(), rhs.begin(), f); + return rhs; +} +// diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp new file mode 100644 index 00000000000..41a53fff310 --- /dev/null +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -0,0 +1,58 @@ +// +// Created by adrianhurtado on 2/3/22. +// + +#ifndef MADNESS_FREQUENCYRESPONSE_HPP +#define MADNESS_FREQUENCYRESPONSE_HPP +#include "ResponseBase.hpp" + + +class FrequencyResponse; + + +using RHS_Generator = std::function; + +response_space vector_to_PQ(World& world, const vector_real_function_3d& p, + const vector_real_function_3d& ground_orbitals, double lo); +X_space nuclear_generator(World& world, FrequencyResponse& calc); +X_space dipole_generator(World& world, FrequencyResponse& calc); +//using RHS_Generator = std::function; + +class FrequencyResponse : public ResponseBase { + +public: + FrequencyResponse(World& world, const CalcParams& params, double frequency, RHS_Generator rhs) + : ResponseBase(world, params), + omega{frequency}, + generator{std::move(rhs)}, + PQ{std::move(generator(world, *this))} {} + void initialize(World& world) override; + +private: + double omega; + RHS_Generator generator; + X_space PQ; + void iterate(World& world) override; + void check_k(World& world, double thresh, int k) override { + ResponseBase::check_k(world, thresh, k); + ::check_k(world, PQ, thresh, k); + } + X_space bsh_update_response(World& world, X_space& theta_X, vector& bsh_x_ops, + vector& bsh_y_ops, QProjector& projector, + double& x_shifts); + static void frequency_to_json(json& j_mol_in, size_t iter, const Tensor& polar_ij); + static void compute_and_print_polarizability(World& world, X_space& Chi, X_space& pq, + std::string message); + void save(World& world, const std::string& name) override; + void load(World& world, const std::string& name) override; + std::tuple update(World& world, X_space& chi, XCOperator& xc, + vector& bsh_x_ops, + vector& bsh_y_ops, + QProjector& projector, double& x_shifts, + double& omega_n, NonLinearXsolver& kain_x_space, + vector& Xvector, vector& Xresidual, + size_t iteration, const double& maxrotn); +}; + + +#endif//MADNESS_FREQUENCYRESPONSE_HPP diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2d3d71cb566..88cf14c789d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -19,6 +19,7 @@ ResponseBase::ResponseBase(World &world, const CalcParams ¶ms) // Broadcast to all the other nodes world.gop.broadcast_serializable(r_params, 0); + world.gop.broadcast_serializable(ground_energies, 0); world.gop.broadcast_serializable(molecule, 0); xcf.initialize(r_params.xc(), !r_params.spinrestricted(), world, r_params.print_level() >= 3); r_params.to_json(j_molresponse); @@ -28,7 +29,6 @@ ResponseBase::ResponseBase(World &world, const CalcParams ¶ms) FunctionDefaults<3>::set_truncate_mode(1); } - /// Checks the polynomial of each function in the ResponseBase /// First checks the ground state orbitals. If the orbitals /// have incorrect k we read from the archive project and truncate @@ -56,7 +56,8 @@ void ResponseBase::check_k(World &world, double thresh, int k) { world.gop.fence(); // Clean up a bit truncate(world, ground_orbitals); - // Now that ground orbitals have correct k lets make the ground density again + // Now that ground orbitals have correct k lets make the ground density + // again ground_density = make_ground_density(world); // Ground state orbitals changed, clear old hamiltonian redo = true; @@ -64,7 +65,7 @@ void ResponseBase::check_k(World &world, double thresh, int k) { // Recalculate ground state hamiltonian here if (redo or !hamiltonian.has_data()) { auto [HAM, HAM_NO_DIAG] = ComputeHamiltonianPair(world); - //TODO this doesn't seem right... + // TODO this doesn't seem right... hamiltonian = HAM; ham_no_diag = HAM_NO_DIAG; } @@ -73,10 +74,10 @@ void ResponseBase::check_k(World &world, double thresh, int k) { if (r_params.store_potential()) { if (FunctionDefaults<3>::get_k() != stored_potential[0][0].k()) { // Project the potential into correct k - for(auto & potential_vector:stored_potential){ + for (auto &potential_vector: stored_potential) { reconstruct(world, potential_vector); - for(auto & vi:potential_vector){ - vi=project(vi,FunctionDefaults<3>::get_k(),thresh,false); + for (auto &vi: potential_vector) { + vi = project(vi, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); } @@ -91,11 +92,11 @@ void ResponseBase::check_k(World &world, double thresh, int k) { mask = project(mask, FunctionDefaults<3>::get_k(), thresh, false); } ::check_k(world, Chi, thresh, k); + // Make sure everything is done before leaving world.gop.fence(); } - /// @brief Computes the Hamiltonian from the ground state orbitals /// A side effect of this function is that the stored potentials /// stored_v_coul and stored V nuc get modified @@ -104,7 +105,8 @@ void ResponseBase::check_k(World &world, double thresh, int k) { // /// \param world /// \return -std::pair,Tensor> ResponseBase::ComputeHamiltonianPair(World &world) const { +auto ResponseBase::ComputeHamiltonianPair(World &world) const + -> std::pair, Tensor> { // Basic output if (r_params.print_level() >= 1) molresponse::start_timer(world); auto phi = ground_orbitals; @@ -143,8 +145,10 @@ std::pair,Tensor> ResponseBase::ComputeHamiltonianPair(Wo // Construct phiVphi // v_nuc first - // TODO Here I am computing the potential using the potential manager. Should I do - // TODO earlier on in set_protocol since this maybe used in the response portion as well? + // TODO Here I am computing the potential using the potential manager. Should + // I do + // TODO earlier on in set_protocol since this maybe used in the response + // portion as well? real_function_3d v_nuc = potential_manager->vnuclear(); v_nuc.truncate(); @@ -167,21 +171,22 @@ std::pair,Tensor> ResponseBase::ComputeHamiltonianPair(Wo real_function_3d v = v_coul + v_nuc; // Apply phiVphi to f functions - std::vector vf = v * phi; + auto v_phi0 = v * phi; // Clear stored_potential stored_potential.clear(); // ALWAYS DO THIS FOR THE STORED POTENTIAL!! // exchange last // 'small memory' algorithm from SCF.cc - auto op = *coulop; + auto op = shared_coulomb_operator; - auto Kphi = zero_functions_compressed(world, num_orbitals); + auto Kphi = zero_functions_compressed(world, int(num_orbitals)); for (const auto &phi_i: phi) { - /// Multiplies a function against a vector of functions using sparsity of a and v[i] --- q[i] = a * v[i] + /// Multiplies a function against a vector of functions using sparsity of a + /// and v[i] --- q[i] = a * v[i] auto psif = mul_sparse(world, phi_i, phi, FunctionDefaults<3>::get_thresh()); truncate(world, psif); - psif = apply(world, op, psif); + psif = apply(world, *op, psif); truncate(world, psif); // Save the potential here if we are saving it if (r_params.store_potential()) { stored_potential.push_back(psif); } @@ -190,17 +195,16 @@ std::pair,Tensor> ResponseBase::ComputeHamiltonianPair(Wo } // Only use the exchange above if HF: Tensor phiVphi; - real_function_3d v_xc; if (r_params.xc() == "hf") { // Construct phiVphi - phiVphi = matrix_inner(world, phi, vf) - matrix_inner(world, phi, Kphi); + phiVphi = matrix_inner(world, phi, v_phi0) - matrix_inner(world, phi, Kphi); } else {// DFT XCOperator xcop = make_xc_operator(world); real_function_3d v_xc = xcop.make_xc_potential(); v = v + v_xc; - std::vector vf = v * phi; + auto vf = v * phi; if ((*xcop.xc).hf_exchange_coefficient() > 0.0) { // XCOperator has member variable xc, which is an // xcfunctional which has the hf_exchange_coeff we need here @@ -229,7 +233,7 @@ std::pair,Tensor> ResponseBase::ComputeHamiltonianPair(Wo // (T+phiVphi) - Lambda * eye // Copy new_hamiltonian and zero the diagonal auto new_hamiltonian_no_diag = copy(new_hamiltonian); - for (size_t i = 0; i < num_orbitals; i++) new_hamiltonian(i, i) = 0.0; + for (size_t i = 0; i < num_orbitals; i++) new_hamiltonian_no_diag(long(i), long(i)) = 0.0; // Debug output if (r_params.print_level() >= 2 and world.rank() == 0) { @@ -241,7 +245,7 @@ std::pair,Tensor> ResponseBase::ComputeHamiltonianPair(Wo return {new_hamiltonian, new_hamiltonian_no_diag}; } -functionT ResponseBase::make_ground_density(World &world) const { +auto ResponseBase::make_ground_density(World &world) const -> functionT { std::vector vsq = square(world, ground_orbitals); compress(world, vsq); @@ -252,6 +256,7 @@ functionT ResponseBase::make_ground_density(World &world) const { vsq.clear(); return rho; } + // @brief Calculates ground state coulomb potential function // // The coulomb potential of the ground state is @@ -259,304 +264,164 @@ functionT ResponseBase::make_ground_density(World &world) const { // /// \param world /// \return -real_function_3d ResponseBase::Coulomb(World &world) const { - return apply(*coulop, ground_density).truncate(); +auto ResponseBase::Coulomb(World &world) const -> real_function_3d { + return apply(*shared_coulomb_operator, ground_density).truncate(); } - // TODO Create apply_operator(f) generalized function in place of coulomb -XCOperator ResponseBase::make_xc_operator(World &world) const { - return XCOperator(world, r_params.xc(), false, ground_density, ground_density); -} - -// Save the current response calculation -void ResponseBase::save(World &world, const std::string &name) { - // Archive to write everything to - archive::ParallelOutputArchive ar(world, name.c_str(), 1); - // Just going to enforce 1 io server - - // Saving, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω - - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; - if (not r_params.tda()) { - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; - } +auto ResponseBase::make_xc_operator(World &world) const -> XCOperator { + return {world, r_params.xc(), false, ground_density, ground_density}; } -// Load a response calculation -void ResponseBase::load(World &world, const std::string &name) { - // The archive to read from - archive::ParallelInputArchive ar(world, name.c_str()); - - // Reading in, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) - - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω - - Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); - - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; - world.gop.fence(); - if (not r_params.tda()) { - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; - world.gop.fence(); - } -} -vecfuncT ResponseBase::make_density(World &world) { - molresponse::start_timer(world); +auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfuncT { vecfuncT density; auto calc_type = r_params.calc_type(); if (calc_type == "full") { - density = transition_density(world, ground_orbitals, Chi.X, Chi.Y); + density = transition_density(world, ground_orbitals, chi.X, chi.Y); } else if (calc_type == "static") { - density = transition_density(world, ground_orbitals, Chi.X, Chi.X); + density = transition_density(world, ground_orbitals, chi.X, chi.X); } else { - density = transition_densityTDA(world, ground_orbitals, Chi.X); + density = transition_densityTDA(world, ground_orbitals, chi.X); } - molresponse::end_timer(world, "Make density omega"); + truncate(world, density); world.gop.fence(); return density; } -// Creates the transition densities -std::vector ResponseBase::transition_density( - World &world, std::vector &orbitals, response_space &x, - response_space &y) { - // Get sizes - size_t m = x.size(); - - // Return container - std::vector densities = zero_functions(world, m); - x.truncate_rf(); - y.truncate_rf(); - truncate(world, orbitals); - for (size_t b = 0; b < m; b++) { - // Run over occupied... - // y functions are zero if TDA is active - densities[b] = dot(world, x[b], orbitals); - densities[b] += dot(world, orbitals, y[b]); - } - - truncate(world, densities); - world.gop.fence(); - // Done! - return densities; -} - -std::vector ResponseBase::transition_densityTDA( - World &world, std::vector const &orbitals, response_space &x) { - // Get sizes - size_t m = x.size(); - // Return container - std::vector densities = zero_functions(world, m); - x.truncate_rf(); - truncate(world, ground_orbitals); - for (size_t b = 0; b < m; b++) { - // y functions are zero if TDA is active - densities[b] = dot(world, x[b], ground_orbitals); - } - - truncate(world, densities); - world.gop.fence(); - // Done! - return densities; -} -void ResponseBase::load_balance(World &world) { +void ResponseBase::load_balance_chi(World &world) { molresponse::start_timer(world); if (world.size() == 1) return; LoadBalanceDeux<3> lb(world); real_function_3d v_nuclear; v_nuclear = potential_manager->vnuclear(); - lb.add_tree(v_nuclear, - lbcost(r_params.vnucextra() * 1.0, r_params.vnucextra() * 8.0), false); - for (size_t i = 0; i < Chi.X.size(); ++i) { - lb.add_tree(rho_omega[i], lbcost(1.0, 8.0), false); - } - for (size_t i = 0; i < Chi.X.size(); ++i) { - for (size_t j = 0; j < Chi.X.size_orbitals(); ++j) { - lb.add_tree(Chi.X[i][j], lbcost(1.0, 8.0), false); - } + for (auto &xi: Chi.X) { + for (auto &xij: xi) { lb.add_tree(xij, lbcost(1.0, 8.0), false); } } if (r_params.omega() != 0) { - for (size_t i = 0; i < Chi.X.size(); ++i) { - for (size_t j = 0; j < Chi.X.size_orbitals(); ++j) { - lb.add_tree(Chi.Y[i][j], lbcost(1.0, 8.0), false); - } + for (auto &yi: Chi.Y) { + for (auto &yij: yi) { lb.add_tree(yij, lbcost(1.0, 8.0), false); } } } - world.gop.fence(); - FunctionDefaults<3>::redistribute( world, lb.load_balance(r_params.loadbalparts()));// 6.0 needs retuning after - world.gop.fence(); molresponse::end_timer(world, "Load balancing"); } -std::vector ResponseBase::make_bsh_operators_response(World &world, double &shift, - double &omega) const { +auto ResponseBase::make_bsh_operators_response(World &world, double &shift, double &omega) const + -> std::vector { if (r_params.print_level() >= 1) molresponse::start_timer(world); + double tol = FunctionDefaults<3>::get_thresh(); // Sizes inferred from ground and omega size_t num_orbitals = ground_energies.size();// number of orbitals std::vector ops(num_orbitals); // Run over occupied components + + int p = 0; + std::for_each(ops.begin(), ops.end(), [&](auto &operator_p) { + double mu = sqrt(-2.0 * (ground_energies(p++) + omega + shift)); + operator_p = poperatorT(BSHOperatorPtr3D(world, mu, r_params.lo(), tol)); + }); + /* for (size_t p = 0; p < num_orbitals; p++) { double mu = sqrt(-2.0 * (ground_energies(p) + omega + shift)); ops[p] = poperatorT(BSHOperatorPtr3D(world, mu, r_params.lo(), tol)); } + */ if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make bsh operators response"); } return ops; // End timer } -X_space ResponseBase::Compute_Theta_X(World &world, X_space &Chi, XCOperator xc, - std::string calc_type) { - bool compute_Y = calc_type.compare("full") == 0; - X_space Theta_X = X_space(world, Chi.num_states(), Chi.num_orbitals()); - // compute - X_space V0X = compute_V0X(world, Chi, xc, compute_Y); - V0X.truncate(); - if (r_params.print_level() >= 20) { - print("---------------Theta ----------------"); - print(""); - print(inner(Chi, V0X)); +auto ResponseBase::compute_theta_X(World &world, const X_space &chi, + const XCOperator &xc, + const std::string &calc_type) const -> X_space { + + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::start_timer(world); + print("------------compute theta x_________"); + } + bool compute_Y = calc_type == "full"; + X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); + // compute + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space V0X = compute_V0X(world, chi, xc, compute_Y); + //V0X.truncate(); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); } - X_space E0X(world, Chi.num_states(), Chi.num_orbitals()); - if (r_params.localize().compare("canon") == 0) { - E0X = Chi.copy(); - E0X.truncate(); + if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space E0X(world, chi.num_states(), chi.num_orbitals()); + if (r_params.localize() != "canon") { + E0X = chi.copy(); E0X.X = E0X.X * ham_no_diag; if (compute_Y) { E0X.Y = E0X.Y * ham_no_diag; } - - E0X.truncate(); + if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } } - - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi, E0X)); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } X_space gamma; // compute - if (calc_type.compare("full") == 0) { - gamma = compute_gamma_full(world, Chi, xc); - } else if (calc_type.compare("static") == 0) { - gamma = compute_gamma_static(world, Chi, xc); + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (calc_type == "full") { + gamma = compute_gamma_full(world, {chi, ground_orbitals, ground_orbitals}, xc); + } else if (calc_type == "static") { + gamma = compute_gamma_static(world, {chi, ground_orbitals, ground_orbitals}, xc); } else { - gamma = compute_gamma_tda(world, Chi, xc); + gamma = compute_gamma_tda(world, {chi, ground_orbitals, ground_orbitals}, xc); + } + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); } + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } Theta_X = (V0X - E0X) + gamma; Theta_X.truncate(); - - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi, Theta_X)); + // Theta_X.truncate(); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); + } + if (r_params.print_level() >= 20) { print_inner(world, "xThetax", chi, Theta_X); } + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); } return Theta_X; } -// compute exchange |i> -vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf) { - World &world = ket[0].world(); - int n = bra.size(); - int nf = ket.size(); - double tol = FunctionDefaults<3>::get_thresh();/// Important this is - double mul_tol = 0.0; - const double lo = 1.e-4; - const double econv = FunctionDefaults<3>::get_thresh(); - - std::shared_ptr poisson; - poisson = std::shared_ptr(CoulombOperatorPtr(world, lo, econv)); - /// consistent with Coulomb - vecfuncT Kf = zero_functions_compressed(world, nf); - - reconstruct(world, bra); - reconstruct(world, ket); - reconstruct(world, vf); - - // i-j sym - for (int i = 0; i < n; ++i) { - // for each |i> - vecfuncT psif = mul_sparse(world, bra[i], vf, mul_tol);/// was vtol - truncate(world, psif); - // apply to vector of products .. ... - psif = apply(world, *poisson.get(), psif); - truncate(world, psif); - // multiply by ket i |i>: |i> |i> |i> - psif = mul_sparse(world, ket[i], psif, mul_tol);/// was vtol - /// Generalized A*X+Y for vectors of functions ---- a[i] = alpha*a[i] + - // 1*Kf+occ[i]*psif - gaxpy(world, double(1.0), Kf, double(1.0), psif); - } - truncate(world, Kf, tol); - return Kf; -} -// sum_i |i> for each p -X_space ResponseBase::compute_gamma_full(World &world, X_space &X, - const XCOperator &xc) { - size_t m = X.num_states(); - size_t n = X.num_orbitals(); - // copy old pmap - std::shared_ptr>> oldpmap = FunctionDefaults<3>::get_pmap(); +auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &density, + const XCOperator &xc) const -> X_space { + std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); - X_space Chi_copy = X; - vecfuncT phi0_copy = ground_orbitals; - truncate(world, phi0_copy); - Chi_copy.truncate(); + auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); - orbital_load_balance(world, ground_orbitals, phi0_copy, X, Chi_copy); + size_t num_states = d_alpha.num_states(); + size_t num_orbitals = d_alpha.num_orbitals(); - molresponse::start_timer(world); + size_t m = d_alpha.num_states(); + size_t n = d_alpha.num_orbitals(); + // copy old pmap + + truncate(world, phi0); + truncate(world, vf); + d_alpha.truncate(); + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space gamma(world, m, n); // x functions // Two ways single vector or vector vector style @@ -567,325 +432,510 @@ X_space ResponseBase::compute_gamma_full(World &world, X_space &X, functionT temp_J; X_space J(world, m, n); - X_space JX(world, m, n); - X_space JY(world, m, n); + response_space j_x(world, m, n); + response_space j_y(world, m, n); + X_space W(world, m, n); X_space KX(world, m, n); X_space KY(world, m, n); - molresponse::end_timer(world, "Create Zero functions for Gamma calc"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); + } // apply the exchange kernel to rho if necessary - molresponse::start_timer(world); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } // Create Coulomb potential on ground_orbitals functionT rho_x_b; functionT rho_y_b; - for (size_t b = 0; b < m; b++) { - rho_x_b = dot(world, Chi_copy.X[b], phi0_copy); - rho_y_b = dot(world, Chi_copy.Y[b], phi0_copy); - rho_x_b.truncate(); - rho_y_b.truncate(); - rho_x_b = apply(*coulop, rho_x_b); - rho_y_b = apply(*coulop, rho_y_b); + // note that x can refer to x or y + auto compute_j = [&, &phi0 = phi0](auto dx) { + // compute density with response function dx and orbitals phi0 + auto rho_x_b = dot(world, dx, phi0); rho_x_b.truncate(); - rho_y_b.truncate(); - JX.X[b] = JX.Y[b] = mul(world, rho_x_b, phi0_copy); - JY.X[b] = JY.Y[b] = mul(world, rho_y_b, phi0_copy); - } + // apply the coulomb operator to rho_b + rho_x_b = apply(*shared_coulomb_operator, rho_x_b); + return mul(world, rho_x_b, phi0); + }; + + // compute j_x = op(rho_x)*phi0 + std::transform(d_alpha.X.begin(), d_alpha.X.end(), j_x.begin(), compute_j); + // compute j_y = op(rho_y)*phi0 + std::transform(d_alpha.Y.begin(), d_alpha.Y.end(), j_y.begin(), compute_j); - J = JX + JY; - molresponse::end_timer(world, "J[omega] phi:"); + J.X = j_x + j_y; + // TODO is copy better than adding? probably? + // J.Y=j_x+j_y; + J.Y = J.X.copy(); + + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); + } // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { - molresponse::start_timer(world); - std::vector Wphi; - for (size_t b = 0; b < m; b++) { - Wphi.push_back(xc.apply_xc_kernel(rho_omega[b])); - W.X[b] = mul(world, Wphi[b], phi0_copy); - } + auto rho = transition_density(world, phi0, d_alpha.X, d_alpha.X); + auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { + auto xc_rho = xc.apply_xc_kernel(rho_alpha); + return mul(world, xc_rho, phi0); + }; + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); W.Y = W.X.copy(); - molresponse::end_timer(world, "XC[omega] phi:"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); + } } - molresponse::start_timer(world); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + for (size_t b = 0; b < m; b++) { vecfuncT x, y; - x = Chi_copy.X[b]; - y = Chi_copy.Y[b]; + x = d_alpha.X[b]; + y = d_alpha.Y[b]; // |x> - KX.X[b] = K(x, phi0_copy, phi0_copy); - KY.X[b] = K(phi0_copy, y, phi0_copy); + KX.X[b] = newK(x, phi0, vf); + KY.X[b] = newK(phi0, y, vf); // |y> - KY.Y[b] = K(y, phi0_copy, phi0_copy); - KX.Y[b] = K(phi0_copy, x, phi0_copy); + KY.Y[b] = newK(y, phi0, vf); + KX.Y[b] = newK(phi0, x, vf); // |i> } - molresponse::end_timer(world, "K[omega] phi:"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); + } + + // for each response state we compute the Gamma response functions + // trucate all response functions + + // update gamma functions + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + + /* J.truncate(); KX.truncate(); KY.truncate(); W.truncate(); - // for each response state we compute the Gamma response functions - // trucate all response functions + */ - // update gamma functions - molresponse::start_timer(world); gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; - molresponse::end_timer(world, "Add Gamma parts J-K+W :"); + //gamma.truncate(); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); + } // project out ground state - molresponse::start_timer(world); - QProjector projector(world, phi0_copy); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + QProjector projector(world, phi0); for (size_t i = 0; i < m; i++) { gamma.X[i] = projector(gamma.X[i]); gamma.Y[i] = projector(gamma.Y[i]); } - molresponse::end_timer(world, "Project Gamma:"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); + } - if (r_params.print_level() >= 10) { + if (r_params.print_level() >= 20) { molresponse::start_timer(world); - print("inner "); - print(inner(Chi_copy, JX)); - print("inner "); - print(inner(Chi_copy, JY)); - print("inner "); - print(inner(Chi_copy, J)); - print("inner "); - print(inner(Chi_copy, KX)); - print("inner "); - print(inner(Chi_copy, KY)); - print("inner "); + print_inner(world, "xJx", d_alpha, J); + print_inner(world, "xKXx", d_alpha, KX); + print_inner(world, "xKYx", d_alpha, KY); X_space K = KX + KY; - print(inner(Chi_copy, K)); - print("inner "); - print(inner(Chi_copy, W)); - print("inner "); - print(inner(Chi_copy, gamma)); - + print_inner(world, "xKx", d_alpha, KX); + print_inner(world, "xWx", d_alpha, W); + print_inner(world, "xGammax", d_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); } + // put // put it all together // no 2-electron // End timer molresponse::start_timer(world); J.clear(); + j_x.clear(); + j_y.clear(); KX.clear(); KY.clear(); W.clear(); - Chi_copy.clear(); + + d_alpha.clear(); + phi0.clear(); + vf.clear(); if (world.size() > 1) { - FunctionDefaults<3>::set_pmap(oldpmap);// ! DON'T FORGET ! + FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } molresponse::end_timer(world, "Clear functions and set old pmap"); // Done world.gop.fence(); + //gamma.truncate(); return gamma; // Get sizes } -X_space ResponseBase::compute_gamma_static(World &world, X_space &X, XCOperator xc) { - size_t m = r_params.num_states(); - size_t n = r_params.num_orbitals(); - // shallow copy - std::shared_ptr>> oldpmap = FunctionDefaults<3>::get_pmap(); +auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &density, + const XCOperator &xc) const -> X_space { - X_space Chi_copy = X; - vecfuncT phi0_copy = ground_orbitals; + // X contains the response vector that makes up the response density at a + // given order - orbital_load_balance(world, ground_orbitals, phi0_copy, X, Chi_copy); + std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); - molresponse::start_timer(world); - X_space gamma(world, m, n); + auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); + + size_t num_states = d_alpha.num_states(); + size_t num_orbitals = d_alpha.num_orbitals(); + // shallow copy + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space gamma(world, num_states, num_orbitals); // x functions // here I create the orbital products for elctron interaction terms vecfuncT phi_phi; vecfuncT x_phi; functionT temp_J; - X_space W(world, m, n); - X_space J(world, m, n); - X_space KX(world, m, n); - X_space KY(world, m, n); - molresponse::end_timer(world, "Create Zero functions for Gamma calc"); + X_space W(world, num_states, num_orbitals); + X_space J(world, num_states, num_orbitals); + X_space KX(world, num_states, num_orbitals); + X_space KY(world, num_states, num_orbitals); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); + } // apply the exchange kernel to rho if necessary - molresponse::start_timer(world); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + + auto rho = transition_density(world, phi0, d_alpha.X, d_alpha.X); // Create Coulomb potential on ground_orbitals - for (size_t b = 0; b < m; b++) { - temp_J = apply(*coulop, rho_omega[b]); + + auto compute_jx = [&, &phi0 = phi0](auto rho_alpha) { + auto temp_J = apply(*shared_coulomb_operator, rho_alpha); temp_J.truncate(); - J.X[b] = mul(world, temp_J, phi0_copy); - } + return mul(world, temp_J, phi0); + }; + + std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); - molresponse::end_timer(world, "J[omega] phi:"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); + } // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { - molresponse::start_timer(world); - std::vector Wphi; - for (size_t b = 0; b < m; b++) { - Wphi.push_back(xc.apply_xc_kernel(rho_omega[b])); - W.X[b] = mul(world, Wphi[b], phi0_copy); + auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { + auto xc_rho = xc.apply_xc_kernel(rho_alpha); + return mul(world, xc_rho, phi0); + }; + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + // for every transition density apply the exchange kernel and multiply the + // vector of orbitals + std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); + W.Y = W.X.copy(); + + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } - molresponse::end_timer(world, "XC[omega] phi:"); } - molresponse::start_timer(world); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } - for (size_t b = 0; b < m; b++) { + for (size_t b = 0; b < num_states; b++) { vecfuncT x, y; - x = Chi_copy.X[b]; - y = Chi_copy.Y[b]; + x = d_alpha.X[b]; + y = d_alpha.Y[b]; // |x> - KX.X[b] = K(x, phi0_copy, phi0_copy); + KX.X[b] = newK(x, phi0, vf); // |i> - KY.X[b] = K(phi0_copy, y, phi0_copy); + KY.X[b] = newK(phi0, y, vf); // |y> } - molresponse::end_timer(world, "K[omega] phi:"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); + } // for each response state we compute the Gamma response functions // trucate all response functions + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + /* J.truncate(); KX.truncate(); KY.truncate(); W.truncate(); + */ - molresponse::start_timer(world); // update gamma functions gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; - molresponse::end_timer(world, "Add Gamma parts J-K+W :"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); + } // project out ground state - molresponse::start_timer(world); - QProjector projector(world, phi0_copy); - for (size_t i = 0; i < m; i++) { gamma.X[i] = projector(gamma.X[i]); } - molresponse::end_timer(world, "Project Gamma:"); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + QProjector projector(world, phi0); + for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } + gamma.Y = gamma.X.copy(); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); + } - molresponse::start_timer(world); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } J.clear(); KX.clear(); KY.clear(); W.clear(); - Chi_copy.clear(); + d_alpha.clear(); + phi0.clear(); + vf.clear(); if (world.size() > 1) { - FunctionDefaults<3>::set_pmap(oldpmap);// ! DON'T FORGET ! + FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - molresponse::end_timer(world, "Clear functions and set old pmap"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_clear_functions", "gamma_clear_functions", + iter_timing); + } // Done + // gamma.truncate(); world.gop.fence(); return gamma; // Get sizes } -X_space ResponseBase::compute_gamma_tda(World &world, X_space &X, XCOperator xc) { - size_t m = X.num_states(); - size_t n = X.num_orbitals(); +auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density, + const XCOperator &xc) const -> X_space { + auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); std::shared_ptr>> oldpmap = FunctionDefaults<3>::get_pmap(); + size_t num_states = d_alpha.num_states(); + size_t num_orbitals = d_alpha.num_orbitals(); - X_space Chi_copy = X; - vecfuncT phi0_copy = ground_orbitals; - - orbital_load_balance(world, ground_orbitals, phi0_copy, X, Chi_copy); - - molresponse::start_timer(world); - X_space gamma(world, m, n); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space gamma(world, num_states, num_orbitals); // x functions - vector_real_function_3d phi_phi; real_function_3d temp_J; + response_space J(world, num_states, num_orbitals); + response_space k1_x(world, num_states, num_orbitals); + response_space W(world, num_states, num_orbitals); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); + } - response_space J(world, m, n); - response_space k1_x(world, m, n); - response_space W(world, m, n); - molresponse::end_timer(world, "Create Zero functions for Gamma calc"); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } - molresponse::start_timer(world); - // Create Coulomb potential on ground_orbitals - for (size_t b = 0; b < m; b++) { - temp_J = apply(*coulop, rho_omega[b]); + auto rho = transition_densityTDA(world, phi0, d_alpha.X); + + auto compute_jx = [&, &phi0 = phi0](auto rho_alpha) { + auto temp_J = apply(*shared_coulomb_operator, rho_alpha); temp_J.truncate(); - J[b] = mul(world, temp_J, phi0_copy); + return mul(world, temp_J, phi0); + }; + + std::transform(rho.begin(), rho.end(), J.begin(), compute_jx); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } - molresponse::end_timer(world, "J[omega] phi:"); // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { - molresponse::start_timer(world); - std::vector XC_phi; - for (size_t b = 0; b < m; b++) { - XC_phi.push_back(xc.apply_xc_kernel(rho_omega[b])); - W[b] = mul(world, XC_phi[b], phi0_copy); + auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { + auto xc_rho = xc.apply_xc_kernel(rho_alpha); + return mul(world, xc_rho, phi0); + }; + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + // for every transition density apply the exchange kernel and multiply the + // vector of orbitals + std::transform(rho.begin(), rho.end(), W.begin(), compute_wx); + W = W.copy(); + + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } - molresponse::end_timer(world, "XC[omega] phi:"); } - molresponse::start_timer(world); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } - for (size_t b = 0; b < m; b++) { + for (size_t b = 0; b < num_states; b++) { vecfuncT x; - x = Chi_copy.X[b]; - k1_x[b] = K(x, phi0_copy, phi0_copy); + x = d_alpha.X[b]; + k1_x[b] = newK(x, phi0, vf); } - molresponse::end_timer(world, "K[omega] phi:"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); + } + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } k1_x.truncate_rf(); J.truncate_rf(); W.truncate_rf(); - molresponse::start_timer(world); - QProjector projector(world, ground_orbitals); gamma.X = (J * 2) - k1_x * xcf.hf_exchange_coefficient() + W; - molresponse::end_timer(world, "Add Gamma parts J-K+W :"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); + } - molresponse::start_timer(world); - for (size_t i = 0; i < m; i++) { + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + QProjector projector(world, ground_orbitals); + for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); truncate(world, gamma.X[i]); } - molresponse::end_timer(world, "Project Gamma:"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); + } - if (r_params.print_level() >= 2) { + if (r_params.print_level() >= 20) { print("------------------------ Gamma Functions Norms ------------------"); print("Gamma X norms"); print(gamma.X.norm2()); } - molresponse::start_timer(world); + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } J.clear(); k1_x.clear(); W.clear(); - Chi_copy.clear(); + + d_alpha.clear(); + phi0.clear(); + vf.clear(); if (world.size() > 1) { FunctionDefaults<3>::set_pmap(oldpmap);// ! DON'T FORGET ! } - molresponse::end_timer(world, "Clear functions and set old pmap"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_clear_functions", "gamma_clear_functions", + iter_timing); + } // Done world.gop.fence(); return gamma; } +auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator &xc, + const std::string &calc_type) const -> X_space { + // compute + bool compute_Y = calc_type == "full"; + + X_space Lambda_X;// = X_space(world, chi.num_states(), chi.num_orbitals()); + + X_space F0X = compute_F0X(world, chi, xc, compute_Y); + X_space Chi_truncated = chi.copy(); + Chi_truncated.truncate(); + if (r_params.print_level() >= 5) { + print("---------------Lambda ----------------"); + print(""); + print(inner(Chi_truncated, F0X)); + } + // put it all together + + X_space E0X = Chi_truncated.copy(); + E0X.truncate(); + E0X.X = E0X.X * hamiltonian; + + if (compute_Y) { E0X.Y = E0X.Y * hamiltonian; } + if (r_params.print_level() >= 20) { + print(""); + print(inner(Chi_truncated, E0X)); + } + + // put it all together + X_space gamma; + + // compute + if (calc_type == "full") { + gamma = compute_gamma_full(world, {chi, ground_orbitals, ground_orbitals}, xc); + } else if (calc_type == "static") { + gamma = compute_gamma_static(world, {chi, ground_orbitals, ground_orbitals}, xc); + } else { + gamma = compute_gamma_tda(world, {chi, ground_orbitals, ground_orbitals}, xc); + } + if (r_params.print_level() >= 5) { + print(""); + print(inner(Chi_truncated, gamma)); + } + + Lambda_X = (F0X - E0X) + gamma; + Lambda_X.truncate(); + + if (r_params.print_level() >= 5) { + print(""); + print(inner(Chi_truncated, Lambda_X)); + } + + return Lambda_X; +} +auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, + XCOperator &xc, + const std::string &calc_type) const + -> std::tuple { + // compute + bool compute_Y = calc_type == "full"; + + // first compute kinetic energy piece + + size_t m = chi.num_states(); + size_t n = chi.num_orbitals(); + X_space chi_copy = chi.copy(); + + molresponse::start_timer(world); + X_space T0X = X_space(world, m, n); + T0X.X = T(world, chi_copy.X); + if (compute_Y) { T0X.Y = T(world, chi_copy.Y); } + if (r_params.print_level() >= 20) { + print("inner "); + print(inner(chi_copy, T0X)); + } + molresponse::end_timer(world, "TX", "TX", iter_timing); + + + molresponse::start_timer(world); + X_space E0X = chi_copy.copy(); + E0X.X = E0X.X * hamiltonian; + if (compute_Y) { E0X.Y = E0X.Y * hamiltonian; } + molresponse::end_timer(world, "E0X", "E0X", iter_timing); + + + X_space V0X = compute_V0X(world, chi_copy, xc, compute_Y); + + // put it all together + X_space gamma; + // compute + if (calc_type == "full") { + gamma = compute_gamma_full(world, {chi, ground_orbitals, ground_orbitals}, xc); + } else if (calc_type == "static") { + gamma = compute_gamma_static(world, {chi, ground_orbitals, ground_orbitals}, xc); + } else { + gamma = compute_gamma_tda(world, {chi, ground_orbitals, ground_orbitals}, xc); + } + + X_space Lambda_X(world, m, n);// = X_space(world, chi.num_states(), chi.num_orbitals()); + + Lambda_X = (T0X + V0X - E0X) + gamma; + + + return {Lambda_X, V0X, gamma}; +} + // Returns the ground state potential applied to functions f // (V0 f) V0=(Vnuc+J0-K0+W0) // J0=J[ground_density] // K0=K[ground_density]f // EXC0=W[ground_density] -X_space ResponseBase::compute_V0X(World &world, X_space &X, XCOperator xc, - bool compute_Y) { +auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator &xc, + bool compute_Y) const -> X_space { + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::start_timer(world); + print("------------compute VO[x]_________"); + } // Start a timer - size_t m = X.num_states(); size_t n = X.num_orbitals(); @@ -893,59 +943,88 @@ X_space ResponseBase::compute_V0X(World &world, X_space &X, XCOperatorvnuclear(); - v_nuc.truncate(); + //v_nuc.truncate(); } else {// Already pre-computed v_nuc = stored_v_nuc; } - molresponse::end_timer(world, "Nuclear energy"); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "V0_nuc", "V0_nuc", iter_timing); + } // Coulomb Potential J0*f - molresponse::start_timer(world); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (not r_params.store_potential()) { // "a" is the core type // scale rho by 2 TODO // J^0 x^alpha - v_j0 = apply(*coulop, ground_density); + v_j0 = apply(*shared_coulomb_operator, ground_density); v_j0.scale(2.0); } else {// Already pre-computed v_j0 = stored_v_coul; } - molresponse::end_timer(world, "Coulomb Potential J[ground_density]"); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[0]", "J[0]", iter_timing); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (xcf.hf_exchange_coefficient() != 1.0) { v_xc = xc.make_xc_potential(); } else { // make a zero function v_xc = Function(FunctionFactory(world).fence(false).initial_level(1)); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "XC[0]", "XC[0]", iter_timing); + } // Intermediaries + world.gop.fence(); - molresponse::start_timer(world); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + world.gop.fence(); + auto k = [&](const vector_real_function_3d &xi) { + world.gop.fence(); + return newK(phi0_copy, phi0_copy, xi); + }; + world.gop.fence(); // If including any exact HF exchange - if (xcf.hf_exchange_coefficient()) { - for (size_t b = 0; b < m; b++) { - K0.X[b] = K(phi0_copy, phi0_copy, Chi_copy.X[b]); - if (compute_Y) { K0.Y[b] = K(phi0_copy, phi0_copy, Chi_copy.Y[b]); } + /* + if (xcf.hf_exchange_coefficient() != 0.0) { + std::transform(Chi_copy.X.begin(), Chi_copy.X.end(), K0.X.begin(), k); + if (compute_Y) { + std::transform(Chi_copy.Y.begin(), Chi_copy.Y.end(), K0.Y.begin(), k); + } else { + K0.Y = K0.X.copy(); + world.gop.fence(); } } - if (r_params.print_level() >= 10) { - print("inner "); - print(inner(Chi_copy, K0)); - } - molresponse::end_timer(world, "K[ground_density]"); - // Vnuc+V0+VXC - molresponse::start_timer(world); - real_function_3d v0 = v_j0 + v_nuc + v_xc; + */ + + int b = 0; + for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_copy, Chi_copy.X[b++]); } + if (compute_Y) { + b = 0; + for (auto &k0y: K0.Y) { k0y = newK(phi0_copy, phi0_copy, Chi_copy.Y[b++]); } + } else { + K0.Y = K0.X.copy(); + } + + + if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + // Vnuc+V0+VXC + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + real_function_3d v0 = v_j0 + v_nuc + v_xc; + + //v0.truncate(FunctionDefaults<3>::get_thresh(), true); V0.X = v0 * X.X; V0.X += (-1 * K0.X * xcf.hf_exchange_coefficient()); @@ -953,39 +1032,24 @@ X_space ResponseBase::compute_V0X(World &world, X_space &X, XCOperator= 3) { - print("inner "); - print(inner(Chi_copy, V0)); + + + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } - molresponse::end_timer(world, "V0X"); // Basic output // Done return V0; } -// kinetic energy operator on response vector -response_space T(World &world, response_space &f) { - response_space T;// Fock = (T + V) * orbitals - real_derivative_3d Dx(world, 0); - real_derivative_3d Dy(world, 1); - real_derivative_3d Dz(world, 2); - // Apply derivatives to orbitals - f.reconstruct_rf(); - response_space dvx = apply(world, Dx, f); - response_space dvy = apply(world, Dy, f); - response_space dvz = apply(world, Dz, f); - // Apply again for 2nd derivatives - response_space dvx2 = apply(world, Dx, dvx); - response_space dvy2 = apply(world, Dy, dvy); - response_space dvz2 = apply(world, Dz, dvz); - T = (dvx2 + dvy2 + dvz2) * (-0.5); - return T; -} + // Returns the ground state fock operator applied to functions f -X_space ResponseBase::compute_F0X(World &world, X_space &X, XCOperator xc, - bool compute_Y) { +auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator &xc, + bool compute_Y) const -> X_space { // Debugging output molresponse::start_timer(world); @@ -1023,278 +1087,152 @@ X_space ResponseBase::compute_F0X(World &world, X_space &X, XCOperator 1) { - molresponse::start_timer(world); - LoadBalanceDeux<3> lb(world); - for (unsigned int i = 0; i < m; ++i) { - lb.add_tree(psi0[i], lbcost(1.0, 8.0), false); - for (unsigned int j = 0; j < n; ++j) { - // add a tree for orbitals - lb.add_tree(X.X[i][j], lbcost(1.0, 8.0), false); - lb.add_tree(X.Y[i][j], lbcost(1.0, 8.0), false); - } - } - - world.gop.fence(); - - // newpamap is the new pmap just based on the orbitals - std::shared_ptr>> new_process_map = - lb.load_balance(r_params.loadbalparts()); - molresponse::end_timer(world, "Gamma compute load_balance"); - // default process map - // We set the new_process_map - molresponse::start_timer(world); - FunctionDefaults<3>::set_pmap(new_process_map);// set default to be new - - world.gop.fence(); - // copy orbitals using new pmap - Chi_copy = X.copy(new_process_map, false); - world.gop.fence();// then fence - psi0_copy = copy(world, ground_orbitals, new_process_map, false); - world.gop.fence();// then fence - molresponse::end_timer(world, "Gamma redist"); - } -} -X_space ResponseBase::compute_residual(World &world, X_space &old_Chi, X_space &temp, - Tensor &bsh_residualsX, - Tensor &bsh_residualsY, std::string calc_type) { - size_t m = old_Chi.X.size(); - size_t n = old_Chi.X.size_orbitals(); - molresponse::start_timer(world); +auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_space &g_chi, + const std::string &calc_type) -> residuals { + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + size_t m = chi.X.size(); + size_t n = chi.X.size_orbitals(); // compute residual X_space res(world, m, n); - res.X = old_Chi.X - temp.X; - // - if (calc_type.compare("full") == 0) { - res.Y = old_Chi.Y - temp.Y; - } else if (calc_type.compare("static") == 0) { - res.Y = res.X.copy(); - } else { - } - //************************* - Tensor errX(m); - Tensor errY(m); - // rmsX and maxvalX for each m response states - std::vector rmsX(m), maxvalX(m); - std::vector> rnormsX; - std::vector> rnormsY; - // find the norms of each of the residual response vectors - for (size_t i = 0; i < m; i++) { - // the 2norms of each of the orbitals in response vector - rnormsX.push_back(norm2s(world, res.X[i])); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("residuals X: state ", i, " : ", rnormsX[i]); - // maxabsval = std::max(maxabsval, std::abs(v[i])); - // maxvalX= largest abs(v[i]) - vector_stats(rnormsX[i], rmsX[i], maxvalX[i]); - // errX[i] is the largest residual orbital value - errX[i] = maxvalX[i]; - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("BSH residual: rms", rmsX[i], " max", maxvalX[i]); - } - if (calc_type.compare("full") == 0) { - std::vector rmsY(m), maxvalY(m); - for (size_t i = 0; i < m; i++) { - rnormsY.push_back(norm2s(world, res.Y[i])); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("residuals Y: state ", i, " : ", rnormsY[i]); - vector_stats(rnormsY[i], rmsY[i], maxvalY[i]); - errY[i] = maxvalY[i]; - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("BSH residual: rms", rmsY[i], " max", maxvalY[i]); + //res.X = old_Chi.X - temp.X; + res = g_chi - chi; + + auto residual_norms = res.norm2s(); + if (world.rank() == 0 and (r_params.print_level() > 1)) { + print("||f(x)||_2 = : ", residual_norms); + } + + if (r_params.print_level() >= 5) { + int j = 0; + auto res_vec = to_response_matrix(res); + for (const auto &xi: res_vec) { + auto res_b_norms = std::vector{}; + for (const auto &xij: xi) res_b_norms.push_back(xij.norm2()); + world.gop.fence(); + if (world.rank() == 0) { print("||f(x)||_: ", j++, res_b_norms); } } - } else if (calc_type.compare("static") == 0) { - // copy by value? - errY = errX; - } else {// tda - errY.fill(0); } - molresponse::end_timer(world, "BSH residual"); - if (r_params.print_level() >= 1) { - print("res.X norms in iteration after compute_residual function: "); - print(res.X.norm2()); - print("res.Y norms in iteration after compute_residual function: "); - print(res.Y.norm2()); + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); } - // the max error in residual - bsh_residualsX = errX; - bsh_residualsY = errY; - // Apply shifts and rhs // Next calculate 2-norm of these vectors of differences - return res; + return {res, residual_norms}; } -X_space ResponseBase::kain_x_space_update(World &world, const X_space &temp, const X_space &res, - NonLinearXsolver &kain_x_space, - std::vector &Xvector, - std::vector &Xresidual) { - size_t m = temp.num_states(); - size_t n = temp.num_orbitals(); + +auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, + const X_space &residual_chi, NonLinearXsolver &kain_x_space, + std::vector &Xvector, + std::vector &Xresidual) -> X_space { + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + size_t m = chi.num_states(); + size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); - molresponse::start_timer(world); for (size_t b = 0; b < m; b++) { - Xvector[b].X[0] = copy(world, temp.X[b]); - Xvector[b].Y[0] = copy(world, temp.Y[b]); - Xresidual[b].X[0] = copy(world, res.X[b]); - Xresidual[b].Y[0] = copy(world, res.Y[b]); + + Xvector[b].X[0] = copy(world, chi.X[b]); + Xvector[b].Y[0] = copy(world, chi.Y[b]); + + Xresidual[b].X[0] = copy(world, residual_chi.X[b]); + Xresidual[b].Y[0] = copy(world, residual_chi.Y[b]); } + if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } + int b = 0; + std::for_each(kain_x_space.begin(), kain_x_space.end(), [&](auto &ki) { + auto kain_X = ki.update(Xvector[b], Xresidual[b]); + kain_update.X[b] = copy(world, kain_X.X[0]); + kain_update.Y[b] = copy(world, kain_X.Y[0]); + b++; + }); + + /* for (size_t b = 0; b < m; b++) { // passing xvectors - X_vector kain_X = kain_x_space[b].update(Xvector[b], Xresidual[b], - FunctionDefaults<3>::get_thresh(), 3.0); + X_vector kain_X = kain_x_space[b].update(Xvector[b], Xresidual[b]); // deep copy of vector of functions kain_update.X[b] = copy(world, kain_X.X[0]); kain_update.Y[b] = copy(world, kain_X.Y[0]); } - molresponse::end_timer(world, " KAIN update:"); + */ + if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); + } return kain_update; } -void ResponseBase::x_space_step_restriction(World &world, X_space &old_Chi, X_space &temp, - bool restrict_y, Tensor &maxrotn) { +void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, + bool restrict_y, const double &maxrotn) { size_t m = old_Chi.num_states(); - molresponse::start_timer(world); + size_t n = old_Chi.num_orbitals(); + + if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } print(maxrotn); + auto diff = temp - old_Chi; + diff.truncate(); + if (world.rank() == 0) { print("----------------Start Step Restriction -----------------"); } for (size_t b = 0; b < m; b++) { if (true) { - // do_step_restriction(world, old_Chi.X[b], temp.X[b], old_Chi.Y[b], - // temp.Y[b], "x and y_response"); if the norm(new-old) > max - do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn[b]); - do_step_restriction(world, old_Chi.Y[b], temp.Y[b], "y_response", maxrotn[b]); - // do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response"); - // do_step_restriction(world, old_Chi.Y[b], temp.Y[b], "y_response"); - } else { - do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn[b]); - } - } + auto x_copy = copy(world, old_Chi.X[b]); + auto y_copy = copy(world, old_Chi.Y[b]); - molresponse::end_timer(world, " Step Restriction:"); -} + auto x_diff = copy(world, diff.X[b]); + auto y_diff = copy(world, diff.Y[b]); -// compute rms and maxabsval of vector of doubles -void ResponseBase::vector_stats(const std::vector &v, double &rms, - double &maxabsval) const { - rms = 0.0; - maxabsval = v[0]; - for (size_t i = 0; i < v.size(); ++i) { - rms += v[i] * v[i]; - maxabsval = std::max(maxabsval, std::abs(v[i])); - } - rms = sqrt(rms / v.size()); -} -void ResponseBase::vector_stats_new(const Tensor v, double &rms, double &maxabsval) const { - rms = 0.0; - for (size_t i = 0; i < v.size(); ++i) { rms += v[i] * v[i]; } - rms = sqrt(rms / v.size()); - maxabsval = v.max(); -} - -double ResponseBase::do_step_restriction(World &world, const vecfuncT &x, vecfuncT &x_new, - std::string spin) const { - std::vector anorm = norm2s(world, sub(world, x, x_new)); - size_t nres = 0; - for (unsigned int i = 0; i < x.size(); ++i) { - print("anorm ", i, " : ", anorm[i]); - if (anorm[i] > r_params.maxrotn()) { - double s = r_params.maxrotn() / anorm[i]; - ++nres; - if (world.rank() == 0) { - if (nres == 1 and (r_params.print_level() > 1)) - printf(" restricting step for %s orbitals:", spin.c_str()); - printf(" %d", i); - } - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - x_new[i].truncate(); - } - } - if (nres > 0 && world.rank() == 0 and (r_params.print_level() > 1)) printf("\n"); + //auto sq_diff_x = square(world, diff.X[b], true); + //auto sq_diff_y = square(world, diff.Y[b], true); - world.gop.fence(); - double rms, maxval; - vector_stats(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; -} + for (auto &dy: y_diff) { x_diff.push_back(dy); } + for (auto &y: y_copy) { x_copy.push_back(y); } -double ResponseBase::do_step_restriction(World &world, const vecfuncT &x, vecfuncT &x_new, - std::string spin, double maxrotn) const { - Tensor anorm = norm2s_T(world, sub(world, x, x_new)); - print("ANORM", anorm); - print("maxrotn: ", maxrotn); - for (unsigned int i = 0; i < x_new.size(); ++i) { - print("anorm ", i, " : ", anorm[i]); - if (anorm[i] > maxrotn) { - double s = maxrotn / anorm[i]; - /* -if (world.rank() == 0) { -if (nres == 1 and (r_params.print_level() > 1)) printf(" restricting step for -%s orbitals:", spin.c_str()); printf(" %d", i); -} -*/ - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - // x_new[i].truncate(); - } - } - world.gop.fence(); - double rms, maxval; - vector_stats_new(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; -} + auto norm_X = sqrt(inner(x_copy, x_copy)); + auto norm_xb = sqrt(inner(x_diff, x_diff)); -double ResponseBase::do_step_restriction(World &world, const vecfuncT &x, const vecfuncT &y, - vecfuncT &x_new, vecfuncT &y_new, std::string spin) const { - // sub(world, x, x_new) - vecfuncT x_diff = sub(world, x, x_new); - vecfuncT y_diff = sub(world, y, y_new); + auto max_step = maxrotn * norm_X; - // sub(world, x, x_new) - Tensor anorm_x = norm2s_T(world, x_diff); - Tensor anorm_y = norm2s_T(world, y_diff); - Tensor anorm(x.size()); - for (unsigned int i = 0; i < x.size(); ++i) { - anorm[i] = std::sqrt(anorm_x[i] * anorm_x[i] + anorm_y[i] * anorm_y[i]); - } - for (unsigned int i = 0; i < x.size(); ++i) { - if (anorm[i] > r_params.maxrotn()) { - double s = r_params.maxrotn() / anorm[i]; - size_t nres = 0; if (world.rank() == 0) { - if (nres == 1 and (r_params.print_level() > 1)) - printf(" restricting step for %s orbitals:", spin.c_str()); - printf(" %d", i); + print("---------------- step restriction :", b, " ------------------"); } - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - y_new[i].gaxpy(s, y[i], 1.0 - s, false); + + if (norm_xb > max_step) { + if (world.rank() == 0) { print("X[b]: ", norm_X); } + if (world.rank() == 0) { print("deltaX[b]: ", norm_xb); } + if (world.rank() == 0) { print("max_rotation: ", maxrotn); } + if (world.rank() == 0) { + print("max_step = max_rotation*norm_X: ", maxrotn * norm_X); + } + double s = max_step / norm_xb; + if (world.rank() == 0) { + if (r_params.print_level() > 1) + print(" restricting step for response-state: ", b, " step size", s); + } + gaxpy(world, s, temp.X[b], (1.0 - s), old_Chi.X[b], true); + gaxpy(world, s, temp.Y[b], (1.0 - s), old_Chi.Y[b], true); + } + } else { + //do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn); } } + if (world.rank() == 0) { print("----------------End Step Restriction -----------------"); } - world.gop.fence(); - double rms, maxval; - vector_stats_new(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; + if (world.rank() == 0 && r_params.print_level() >= 1) { + molresponse::end_timer(world, "x_space_restriction", "x_space_restriction", iter_timing); + } } -void ResponseBase::PlotGroundandResponseOrbitals(World &world, size_t iteration, - response_space &x_response, - response_space &y_response, - ResponseParameters const &r_params, - GroundStateCalculation const &g_params) { + + +void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, + const response_space &x_response, + const response_space &y_response, + ResponseParameters const &responseParameters, + GroundStateCalculation const &g_params) { std::filesystem::create_directories("plots/densities"); std::filesystem::create_directory("plots/orbitals"); @@ -1308,44 +1246,44 @@ void ResponseBase::PlotGroundandResponseOrbitals(World &world, size_t iteration, std::vector rho1 = transition_density(world, ground_orbitals, x_response, y_response); std::string dir("xyz"); - // for plotname size + // for plot_name size size_t buffSize = 500; - char plotname[buffSize]; - double Lp = std::min(r_params.L(), 24.0); + char plot_name[buffSize]; + double Lp = std::min(responseParameters.L(), 24.0); // Doing line plots along each axis for (int d = 0; d < 3; d++) { // print ground_state plotCoords plt(d, Lp); // plot ground density if (iteration == 1) { - snprintf(plotname, buffSize, "plots/densities/rho0_%c_0.plt", dir[d]); - plot_line(plotname, 5001, plt.lo, plt.hi, rho0); + snprintf(plot_name, buffSize, "plots/densities/rho0_%c_0.plt", dir[d]); + plot_line(plot_name, 5001, plt.lo, plt.hi, rho0); } for (int i = 0; i < static_cast(n); i++) { // print ground_state // plot gound_orbitals - snprintf(plotname, buffSize, "plots/orbitals/phi0_%c_0_%d.plt", dir[d], + snprintf(plot_name, buffSize, "plots/orbitals/phi0_%c_0_%d.plt", dir[d], static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, ground_orbitals[i]); + plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals[i]); } for (int b = 0; b < static_cast(m); b++) { // plot rho1 direction d state b - snprintf(plotname, buffSize, "plots/densities/rho1_%c_%d.plt", dir[d], + snprintf(plot_name, buffSize, "plots/densities/rho1_%c_%d.plt", dir[d], static_cast(b)); - plot_line(plotname, 5001, plt.lo, plt.hi, rho1[b]); + plot_line(plot_name, 5001, plt.lo, plt.hi, rho1[b]); for (int i = 0; i < static_cast(n); i++) { // print ground_state // plot x function x_dir_b_i__k_iter - snprintf(plotname, buffSize, "plots/orbitals/phix_%c_%d_%d.plt", dir[d], + snprintf(plot_name, buffSize, "plots/orbitals/phix_%c_%d_%d.plt", dir[d], static_cast(b), static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, x_response[b][i]); + plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b][i]); // plot y functione y_dir_b_i__k_iter - snprintf(plotname, buffSize, "plots/orbitals/phiy_%c_%d_%d.plt", dir[d], + snprintf(plot_name, buffSize, "plots/orbitals/phiy_%c_%d_%d.plt", dir[d], static_cast(b), static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, y_response[b][i]); + plot_line(plot_name, 5001, plt.lo, plt.hi, y_response[b][i]); } } } @@ -1354,6 +1292,7 @@ void ResponseBase::PlotGroundandResponseOrbitals(World &world, size_t iteration, // END TESTING } + void PlotGroundDensityVTK(World &world, const ResponseBase &calc) { auto [ground_calc, molecule, r_params] = calc.get_parameter(); @@ -1362,42 +1301,63 @@ void PlotGroundDensityVTK(World &world, const ResponseBase &calc) { if (r_params.plot_initial()) { if (world.rank() == 0) print("\n Plotting ground state densities.\n"); if (r_params.plot_l() > 0.0) - do_vtk_plots(world, r_params.plot_pts(), r_params.plot_l(), 0, r_params.num_orbitals(), - molecule, square(world, ground_orbitals), "ground"); + do_vtk_plots(world, int(r_params.plot_pts()), r_params.plot_l(), 0, + int(r_params.num_orbitals()), molecule, square(world, ground_orbitals), + "ground"); else - do_vtk_plots(world, r_params.plot_pts(), r_params.L() / 2.0, 0, r_params.num_orbitals(), - molecule, square(world, ground_orbitals), "ground"); + do_vtk_plots(world, int(r_params.plot_pts()), r_params.L() / 2.0, 0, + int(r_params.num_orbitals()), molecule, square(world, ground_orbitals), + "ground"); } } /// Push back empty json onto "protocol_data" field /// Writes protocol to that new field /// Sets up the iteration data json with an empty {} -/// TODO This can work for any madness iteration therefore maybe I should move it -/// \param j -/// \param proto +/// TODO This can work for any madness iteration therefore maybe I should move +/// it \param j \param proto void protocol_to_json(json &j, const double proto) { j["protocol_data"].push_back({}); auto proto_index = j["protocol_data"].size() - 1; j["protocol_data"][proto_index]["proto"] = proto; + j["protocol_data"][proto_index]["k"] = FunctionDefaults<3>::get_k(); j["protocol_data"][proto_index]["iter_data"] = {}; } +void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, + const Tensor &x_abs_norms, + const Tensor &x_rel_norms, + const Tensor &xij_norms, + const Tensor &xij_abs_norms, + const Tensor &rho_norms, + const Tensor &rho_abs_norms) { + json j = {}; + + j["iter"] = iter; + + j["x_norms"] = tensor_to_json(x_norms); + j["x_abs_error"] = tensor_to_json(x_abs_norms); + j["x_rel_error"] = tensor_to_json(x_rel_norms); + + j["xij_norms"] = tensor_to_json(xij_norms); + j["xij_abs_error"] = tensor_to_json(xij_abs_norms); + + j["rho_norms"] = tensor_to_json(rho_norms); + j["rho_abs_error"] = tensor_to_json(rho_abs_norms); + + + auto index = j_mol_in["protocol_data"].size() - 1; + j_mol_in["protocol_data"][index]["iter_data"].push_back(j); +} + void ResponseBase::solve(World &world) { // Get start time molresponse::start_timer(world); // Plotting input orbitals if (r_params.plot_initial()) { PlotGroundDensityVTK(world, *this); } - // TODO Why would I plot the ground state density here if the protocol or k is not set yet? - // Warm and fuzzy - /* - //if (world.rank() == 0) { - print("\n\n Excited State Calculation"); - print(" ------------------------"); - } - */ - // Here print the relevant parameters + // TODO Why would I plot the ground state density here if the protocol or k is + // not set yet? Warm and fuzzy // Ready to iterate! const auto protocol = r_params.protocol(); if (world.rank() == 0) { @@ -1406,8 +1366,10 @@ void ResponseBase::solve(World &world) { } bool first_protocol = true; for (const auto &iter_thresh: protocol) { - // We set the protocol and function defaults here for the given threshold of protocol + // We set the protocol and function defaults here for the given threshold of + // protocol set_protocol(world, iter_thresh); + check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); protocol_to_json(j_molresponse, iter_thresh); if (first_protocol) { if (r_params.restart()) { @@ -1416,44 +1378,710 @@ void ResponseBase::solve(World &world) { } load(world, r_params.restart_file()); check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); + first_protocol = false; } else { - //Initialize the guess functions for the Excited State calculation - // Or initialize the zero functions - // Do I make this routine virtual? + this->initialize(world); } - // Now we need to ensure that all functions have the correct polynomial order k - // We do this in two stages... we call the static function check_k() - // We follow by then calling this->check_response_k() which is an virtual function - // for both excited and frequency response. + first_protocol = false; } - first_protocol = false; + // Now actually ready to iterate... + this->iterate(world); } + // At this point we should know if calc converged maybe add a flag to response.json which states if it has + converged_to_json(j_molresponse); - // Now actually ready to iterate... - // this->iterate(world, Chi); // Plot the response function if desired } -void check_k(World &world, X_space &Chi, double thresh, int k) { - if (-1 != Chi.X.size()) { - if (FunctionDefaults<2>::get_k() != Chi.X[0].at(0).k()) { +void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::get_thresh(), + int k = FunctionDefaults<3>::get_k()) { + if (0 != Chi.X.size()) { + if (FunctionDefaults<3>::get_k() != Chi.X[0].at(0).k()) { // Project all x components into correct k + for (auto &xi: Chi.X) { reconstruct(world, xi); for (auto &xij: xi) { - xij = project(xij, FunctionDefaults<2>::get_k(), thresh, false); + xij = project(xij, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); } for (auto &yi: Chi.Y) { reconstruct(world, yi); for (auto &yij: yi) { - yij = project(yij, FunctionDefaults<2>::get_k(), thresh, false); + yij = project(yij, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); } Chi.truncate(); } } -} \ No newline at end of file +} + +/// @brief Adds random noise to functions in response space +/// +/// +/// +/// \param world +/// \param f +/// \param magnitude +/// \return +auto add_randomness(World &world, const response_space &f, double magnitude) -> response_space { + // Copy input functions + response_space f_copy = f.copy(); + + // Lambda function to add in noise + auto noise = [](const Key<3> &key, Tensor &x) mutable { + Tensor y(x.size()); + y.fillrandom(); + // y.scale(magnitude); + y.scale(1e3); + x = x + y; + // x(0,0,0) += y(0,0,0)-0.5; + }; + // TODO + // Go through each function in f_copy and add in random noise + + for (auto &fi: f_copy) { + for (auto &fij: fi) { fij.unaryop(noise); } + } + // Done + return f_copy; +} + +/*** + * @brief normalize a single response space + * + * \note a single response space consists of only x or y states + * + * + * @param world + * @param f + */ +void normalize(World &world, response_space &f) { + // Run over rows + for (auto &fi: f) { + double norm = inner(fi, fi); + norm = sqrt(norm); + // Doing this to deal with zero functions. + // Maybe not smrt. + if (norm == 0) continue; + // And scale + fi = fi * (1.0 / norm); + } +} + +void normalize(World &world, X_space &Chi) { + // Run over rows + + for (size_t i = 0; i < Chi.num_states(); i++) { + // Get the normalization constant + // (Sum included inside inner) + double norm_x = inner(Chi.X[i], Chi.X[i]); + double norm_y = inner(Chi.Y[i], Chi.Y[i]); + double norm = sqrt(norm_x - norm_y); + // Doing this to deal with zero functions. + // Maybe not smrt. + if (norm == 0) continue; + Chi.X[i] = Chi.X[i] * (1.0 / norm); + Chi.Y[i] = Chi.Y[i] * (1.0 / norm); + } +} + +auto solid_harmonics(World &world, int n) -> std::map, real_function_3d> { + // Container to return + std::map, real_function_3d> result; + + // Create the basic x, y, z, constant and zero + real_function_3d x = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_function_3d y = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_function_3d z = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + real_function_3d c = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); + real_function_3d zero = real_factory_3d(world); + + // Add in first few, since they're simple + // Assuming n >= 1 + result[std::vector{0, 0}] = copy(c); + result[std::vector{0, -1}] = zero; + result[std::vector{0, 1}] = zero; + result[std::vector{-1, 0}] = zero; + + // Generate the solid harmonics recursively from here + for (int l = 0; l < n; l++) { + // Calculate ends of this row first + result[std::vector{l + 1, l + 1}] = + sqrt(pow(2, kronecker(l, 0) * (2 * l) / (2 * l + 1))) * + (x * result[std::vector{l, l}] - + (1 - kronecker(l, 0) * y * result[std::vector{l, -l}])); + result[std::vector{l + 1, -l - 1}] = + sqrt(pow(2, kronecker(l, 0) * (2 * l) / (2 * l + 1))) * + (y * result[std::vector{l, l}] + + (1 - kronecker(l, 0) * x * result[std::vector{l, -l}])); + + // Formula below calls for some functions that don't exist. + // Need zeroes where that would occur + result[std::vector{l + 1, l + 2}] = zero; + result[std::vector{l + 1, -l - 2}] = zero; + + // Run over quantum number m + for (int m = -l; m < l + 1; m++) { + // Calculate remaining terms + result[std::vector{l + 1, m}] = + 1.0 / std::sqrt((l + m + 1) * (l - m + 1)) * + ((2 * l + 1) * z * result[std::vector{l, m}] - + sqrt((l + m) * (l - m)) * (x * x + y * y + z * z) * + result[std::vector{l - 1, m}]); + } + } + + // Get rid of any zero functions we added + for (auto it = result.begin(); it != result.end();) { + if (it->second.norm2() == 0) it = result.erase(it); + else + ++it; + } + + // Also get rid of the constant + result.erase(std::vector{0, 0}); + + // Done + return result; +} + +vector_real_function_3d transition_density(World &world, const vector_real_function_3d &orbitals, + const response_space &x, const response_space &y) { + // Get sizes + // Check sizes and then run the algorithm + size_t m = x.size(); + auto xx = x.copy(); + auto yy = y.copy(); + auto phi0 = copy(world, orbitals); + + xx.truncate_rf(); + yy.truncate_rf(); + truncate(world, phi0); + + // Return container + std::vector densities = zero_functions(world, m); + + std::transform(x.begin(), x.end(), y.begin(), densities.begin(), + [&world, &phi0](auto x_alpha, auto y_alpha) { + auto dx = dot(world, x_alpha, phi0); + world.gop.fence(); + auto dy = dot(world, phi0, y_alpha); + return dx + dy; + }); + truncate(world, densities); + world.gop.fence(); + // Done! + return densities; +} + +/*** + * @brief returns orbitals and response functions with new p map + * + * @param world + * @param psi0 + * @param X + * @param load_balance + * @return + */ +auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &input, + const double load_balance) -> gamma_orbitals { + + auto X = std::get<0>(input); + auto psi0 = std::get<1>(input); + auto vf = std::get<2>(input); + + size_t m = X.num_states(); + size_t n = X.num_orbitals(); + + if (world.size() > 1) { + + molresponse::start_timer(world); + LoadBalanceDeux<3> lb(world); + + for (unsigned int i = 0; i < m; ++i) { + lb.add_tree(psi0[i], lbcost(1.0, 8.0), false); + lb.add_tree(vf[i], lbcost(1.0, 8.0), false); + for (unsigned int j = 0; j < n; ++j) { + // add a tree for orbitals + lb.add_tree(X.X[i][j], lbcost(1.0, 8.0), false); + lb.add_tree(X.Y[i][j], lbcost(1.0, 8.0), false); + } + } + world.gop.fence(); + // newpamap is the new pmap just based on the orbitals + std::shared_ptr>> new_process_map = + lb.load_balance(load_balance); + molresponse::end_timer(world, "Gamma compute load_balance_chi"); + // default process map + // We set the new_process_map + molresponse::start_timer(world); + FunctionDefaults<3>::set_pmap(new_process_map);// set default to be new + + world.gop.fence(); + // copy orbitals using new pmap + auto X_copy = X.copy(new_process_map, false); + world.gop.fence();// then fence + + auto psi0_copy = copy(world, psi0, new_process_map, false); + auto vf_copy = copy(world, vf, new_process_map, false); + world.gop.fence();// then fence + molresponse::end_timer(world, "Gamma redist"); + return {X_copy, psi0_copy, vf_copy}; + } else { + // return a copy with the same process map since we only have one world + return {X.copy(), copy(world, psi0), copy(world, vf)}; + } +} + +void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, + const std::string &response_state) { + molresponse::start_timer(world); + AtomicBasisSet sto3g("sto-3g"); + vecfuncT ao = project_ao_basis(world, sto3g); + + tensorT C = matrix_inner(world, ao, x); + int nmo1 = x.size(); + tensorT rsq, dip(3, nmo1); + { + functionT frsq = factoryT(world).f(rsquared).initial_level(4); + // + // + rsq = inner(world, x, mul_sparse(world, frsq, x, vtol)); + for (int axis = 0; axis < 3; ++axis) { + // x y z + functionT fdip = factoryT(world) + .functor(functorT(new madness::DipoleFunctor(axis))) + .initial_level(4); + dip(axis, _) = inner(world, x, mul_sparse(world, fdip, x, vtol)); + // - ^2-^2-^2 + for (int i = 0; i < nmo1; ++i) rsq(i) -= dip(axis, i) * dip(axis, i); + } + } + molresponse::end_timer(world, "Analyze vectors"); + + long nmo = x.size(); + size_t ncoeff = 0; + for (long i = 0; i < nmo; ++i) { + size_t ncoeffi = x[i].size(); + ncoeff += ncoeffi; + if (world.rank() == 0 and (r_params.print_level() > 1)) { + print(response_state + " orbital : ", i); + + printf("ncoeff=%.2e:", (double) ncoeffi); + + printf("center=(%.2f,%.2f,%.2f) : radius=%.2f\n", dip(0, i), dip(1, i), dip(2, i), + sqrt(rsq(i))); + sto3g.print_anal(molecule, C(i, _)); + printf("total number of coefficients = %.8e\n\n", double(ncoeff)); + } + } +} + +auto ResponseBase::project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, + const Molecule &mol) -> vecfuncT { + vecfuncT ao = vecfuncT(aobasis.nbf(mol)); + for (int i = 0; i < aobasis.nbf(mol); ++i) { + functorT aofunc(new madchem::AtomicBasisFunctor(aobasis.get_atomic_basis_function(mol, i))); + ao[i] = factoryT(world).functor(aofunc).truncate_on_project().nofence().truncate_mode(1); + } + world.gop.fence(); + truncate(world, ao); + madness::normalize(world, ao); + return ao; +} + +auto ResponseBase::project_ao_basis(World &world, const AtomicBasisSet &aobasis) -> vecfuncT { + // Make at_to_bf, at_nbf ... map from atom to first bf on atom, and nbf/atom + std::vector at_to_bf, at_nbf; + aobasis.atoms_to_bfn(molecule, at_to_bf, at_nbf); + + return project_ao_basis_only(world, aobasis, molecule); +} + +void ResponseBase::output_json() { + time_data.to_json(j_molresponse); + auto print_time = std::chrono::system_clock::now(); + auto in_time_t = std::chrono::system_clock::to_time_t(print_time); + std::stringstream ss; + ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); + print(ss.str()); + + j_molresponse["time"] = ss.str(); + j_molresponse["wall_time"] = wall_time(); + std::ofstream ofs("response_base.json"); + ofs << std::setw(4) << j_molresponse; +} + +void ResponseBase::converged_to_json(json &j) { j["converged"] = converged; } +void ResponseBase::print_inner(World &world, const std::string &name, const X_space &left, + const X_space &right) { + auto m_val = inner(left, right); + world.gop.fence(); + if (world.rank() == 0) { + print(name); + print(m_val); + } +} + + +auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals, + const response_space &x) -> vector_real_function_3d { + + // Get sizes + size_t m = x.size(); + + auto xx = x; + auto phi0 = copy(world, orbitals); + + xx.truncate_rf(); + truncate(world, phi0); + + std::vector densities = zero_functions(world, m); + + // dot xi with phi0 + auto f = [&world, &phi0](auto xi) { return dot(world, xi, phi0); }; + + // for each vector is response space x dot and + std::transform(x.begin(), x.end(), densities.begin(), f); + + truncate(world, densities); + world.gop.fence(); + return densities; +} + +// Transforms the given matrix of functions according to the give +// transformation matrix. Used to update orbitals / potential +response_space transform(World &world, const response_space &f, const Tensor &U) { + // Return container + response_space result; + + // Go element by element + for (unsigned int i = 0; i < f.size(); i++) { + // Temp for the result of one row + std::vector temp = + zero_functions_compressed(world, f[0].size()); + + for (unsigned int j = 0; j < f.size(); j++) { gaxpy(world, 1.0, temp, U(j, i), f[j]); } + + // Add to temp to result + result.push_back(temp); + } + + result.truncate_rf(); + + // Done + return result; +} +auto transform(World &world, const X_space &x, const Tensor &U) -> X_space { + // Return container + X_space result(world, x.num_states(), x.num_orbitals()); + + result.X = transform(world, x.X, U); + result.Y = transform(world, x.Y, U); + // Done + return result; +} + +auto expectation(World &world, const response_space &A, const response_space &B) -> Tensor { + // Get sizes + MADNESS_ASSERT(!A[0].empty()); + MADNESS_ASSERT(A[0].size() == B[0].size()); + + size_t dim_1 = A.size(); + size_t dim_2 = A[0].size(); + // Need to take transpose of each input ResponseFunction + response_space A_t(world, dim_2, dim_1); + response_space B_t(world, dim_2, dim_1); + for (size_t i = 0; i < dim_1; i++) { + for (size_t j = 0; j < dim_2; j++) { + A_t[j][i] = A[i][j]; + B_t[j][i] = B[i][j]; + } + } + // Container for result + Tensor result(dim_1, dim_1); + /** + * @brief + * [x1 x2 x3]T[x1 x2 x3] + * + */ + // Run over dimension two + // each vector in orbital has dim_1 response functoins associated + for (size_t p = 0; p < dim_2; p++) { result += matrix_inner(world, A_t[p], B_t[p]); } + + // Done + return result; +} + +void print_norms(World &world, const response_space &f) { + + print(f[0].size()); + Tensor norms(f.size() * f[0].size()); + // Calc the norms + long i = 0; + for (const auto &fi: f) { + + for (const auto &fij: fi) { norms(i++) = fij.norm2(); } + } + norms = norms.reshape(f.size(), f[0].size()); + // Print em in a smart way + if (world.rank() == 0) print(norms); +} + +response_space select_functions(World &world, response_space f, Tensor &energies, size_t k, + size_t print_level) { + // Container for result + response_space answer; + + // Debugging output + if (print_level >= 1) { + if (world.rank() == 0) + print("\n Selecting the", k, "lowest excitation energy components.\n"); + } + + // Get rid of extra functions and save + // the first k + while (f.size() > k) f.pop_back(); + answer = f; + answer.truncate_rf(); + + // Get rid of extra energies and save + // the first k + energies = energies(Slice(0, k - 1)); + + // Basic output + if (print_level >= 1) { + if (world.rank() == 0) print(" The selected components have excitation energies:"); + if (world.rank() == 0) print(energies); + } + + // Done + return answer; +} + +void sort(World &world, Tensor &vals, response_space &f) { + // Get relevant sizes + size_t k = vals.size(); + + // Copy everything... + response_space f_copy(f); + Tensor vals_copy = copy(vals); + Tensor vals_copy2 = copy(vals); + + // Now sort vals_copy + std::sort(vals_copy.ptr(), vals_copy.ptr() + vals_copy.size()); + + // Now sort the rest of the things, using the sorted energy list + // to find the correct indices + for (size_t i = 0; i < k; i++) { + // Find matching index in sorted vals_copy + size_t j = 0; + while (fabs(vals_copy(i) - vals_copy2(j)) > 1e-8 && j < k) j++; + + // Put corresponding function, difference function, value residual and + // value in the correct place + f[i] = f_copy[j]; + vals(i) = vals_copy(i); + + // Change the value of vals_copy2[j] to help deal with duplicates? + vals_copy2(j) = 10000.0; + } +} + +// Sorts the given tensor of eigenvalues and +// response functions +void sort(World &world, Tensor &vals, X_space &f) { + // Get relevant sizes + size_t k = vals.size(); + + // Copy everything... + X_space f_copy(f); + Tensor vals_copy = copy(vals); + Tensor vals_copy2 = copy(vals); + + // Now sort vals_copy + std::sort(vals_copy.ptr(), vals_copy.ptr() + vals_copy.size()); + + // Now sort the rest of the things, using the sorted energy list + // to find the correct indices + for (size_t i = 0; i < k; i++) { + // Find matching index in sorted vals_copy + size_t j = 0; + while (fabs(vals_copy(i) - vals_copy2(j)) > 1e-8 && j < k) j++; + + // Put corresponding function, difference function, value residual and + // value in the correct place + f.X[i] = f_copy.X[j]; + f.Y[i] = f_copy.Y[j]; + + vals(i) = vals_copy(i); + + // Change the value of vals_copy2[j] to help deal with duplicates? + vals_copy2(j) = 10000.0; + } +} + +auto gram_schmidt(World &world, const response_space &f) -> response_space { + // Sizes inferred + size_t m = f.size(); + + // Return container + response_space result = f.copy(); + + // Orthogonalize + for (size_t j = 0; j < m; j++) { + // Need to normalize the row + double norm = norm2(world, result[j]); + + // Now scale each entry + scale(world, result[j], 1.0 / norm); + + // Project out from the rest of the vectors + for (size_t k = j + 1; k < m; k++) { + // Temp function to hold the sum + // of inner products + // vmra.h function, line 627 + double temp = inner(result[j], result[k]); + + // Now subtract + gaxpy(world, 1.0, result[k], -temp, result[j]); + } + } + result.truncate_rf(); + + // Done + return result; +} + +auto make_xyz_functions(World &world) -> vector_real_function_3d { + // Container to return + + // Create the basic x, y, z, constant and zero + real_function_3d x = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_function_3d y = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_function_3d z = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + + std::vector funcs = {x, y, z}; + return funcs; +} + +// Here i should print some information about the calculation we are +// about to do +response_timing::response_timing() : iter(0) { + + wall_time_data.insert({"iter_total", std::vector(0)}); + wall_time_data.insert({"update", std::vector(0)}); + wall_time_data.insert({"compute_V0X", std::vector(0)}); + wall_time_data.insert({"compute_E0X", std::vector(0)}); + wall_time_data.insert({"compute_ThetaX_add", std::vector(0)}); + wall_time_data.insert({"compute_ThetaX", std::vector(0)}); + wall_time_data.insert({"gamma_compute", std::vector(0)}); + wall_time_data.insert({"gamma_zero_functions", std::vector(0)}); + wall_time_data.insert({"gamma_truncate_add", std::vector(0)}); + wall_time_data.insert({"gamma_project", std::vector(0)}); + wall_time_data.insert({"gamma_clear_functions", std::vector(0)}); + wall_time_data.insert({"J[omega]", std::vector(0)}); + wall_time_data.insert({"XC[omega]", std::vector(0)}); + wall_time_data.insert({"K[omega]", std::vector(0)}); + wall_time_data.insert({"bsh_update", std::vector(0)}); + wall_time_data.insert({"compute_bsh_residual", std::vector(0)}); + wall_time_data.insert({"kain_x_update", std::vector(0)}); + wall_time_data.insert({"x_space_restriction", std::vector(0)}); + wall_time_data.insert({"V0_nuc", std::vector(0)}); + wall_time_data.insert({"J[0]", std::vector(0)}); + wall_time_data.insert({"XC[0]", std::vector(0)}); + wall_time_data.insert({"K[0]", std::vector(0)}); + wall_time_data.insert({"V0_add", std::vector(0)}); + wall_time_data.insert({"make_density_old", std::vector(0)}); + wall_time_data.insert({"make_density_new", std::vector(0)}); + wall_time_data.insert({"copy_response_data", std::vector(0)}); + wall_time_data.insert({"TX", std::vector(0)}); + wall_time_data.insert({"E0X", std::vector(0)}); + wall_time_data.insert({"E0mDX", std::vector(0)}); + wall_time_data.insert({"subspace_reduce", std::vector(0)}); + wall_time_data.insert({"diagonalize_response_matrix", std::vector(0)}); + + cpu_time_data.insert({"iter_total", std::vector(0)}); + cpu_time_data.insert({"update", std::vector(0)}); + cpu_time_data.insert({"compute_V0X", std::vector(0)}); + cpu_time_data.insert({"compute_E0X", std::vector(0)}); + cpu_time_data.insert({"compute_ThetaX_add", std::vector(0)}); + cpu_time_data.insert({"compute_ThetaX", std::vector(0)}); + cpu_time_data.insert({"gamma_compute", std::vector(0)}); + cpu_time_data.insert({"gamma_zero_functions", std::vector(0)}); + cpu_time_data.insert({"gamma_truncate_add", std::vector(0)}); + cpu_time_data.insert({"gamma_project", std::vector(0)}); + cpu_time_data.insert({"gamma_clear_functions", std::vector(0)}); + cpu_time_data.insert({"J[omega]", std::vector(0)}); + cpu_time_data.insert({"XC[omega]", std::vector(0)}); + cpu_time_data.insert({"K[omega]", std::vector(0)}); + cpu_time_data.insert({"bsh_update", std::vector(0)}); + cpu_time_data.insert({"compute_bsh_residual", std::vector(0)}); + cpu_time_data.insert({"kain_x_update", std::vector(0)}); + cpu_time_data.insert({"x_space_restriction", std::vector(0)}); + cpu_time_data.insert({"V0_nuc", std::vector(0)}); + cpu_time_data.insert({"J[0]", std::vector(0)}); + cpu_time_data.insert({"XC[0]", std::vector(0)}); + cpu_time_data.insert({"K[0]", std::vector(0)}); + cpu_time_data.insert({"V0_add", std::vector(0)}); + cpu_time_data.insert({"make_density_old", std::vector(0)}); + cpu_time_data.insert({"make_density_new", std::vector(0)}); + cpu_time_data.insert({"copy_response_data", std::vector(0)}); + cpu_time_data.insert({"TX", std::vector(0)}); + cpu_time_data.insert({"E0X", std::vector(0)}); + cpu_time_data.insert({"E0mDX", std::vector(0)}); + cpu_time_data.insert({"subspace_reduce", std::vector(0)}); + cpu_time_data.insert({"diagonalize_response_matrix", std::vector(0)}); +} +void response_timing::print_data() { + + for (const auto &[key, value]: wall_time_data) { print(key, " : ", value); } + for (const auto &[key, value]: cpu_time_data) { print(key, " : ", value); } +} +/** + * add the pair of s wall_time and cpu_time to the time_data and wall_data maps + * + * values.first=wall_time + * values.second=cpu_time + * @param values + */ +void response_timing::add_data(std::map> values) { + // print("ADDING DATA"); + iter++; + std::for_each(wall_time_data.begin(), wall_time_data.end(), [&values](auto &v) { + // print(v.first, " : ", values[v.first]); + v.second.push_back(values[v.first].first);// .first to get first value of pair wall_time + }); + + std::for_each(cpu_time_data.begin(), cpu_time_data.end(), [&values](auto &v) { + //print(v.first, " : ", values[v.first]); + v.second.push_back(values[v.first].second);// .first to get first value of pair wall_time + }); +} +void response_timing::to_json(json &j) { + + ::print("FREQUENCY TIME DATA TO JSON"); + + j["time_data"] = json(); + j["time_data"]["iterations"] = iter; + + + j["time_data"]["wall_time"] = json(); + for (const auto &e: wall_time_data) { + j["time_data"]["wall_time"][e.first].push_back(e.second); + } + + j["time_data"]["cpu_time"] = json(); + for (const auto &e: cpu_time_data) { j["time_data"]["cpu_time"][e.first].push_back(e.second); } +} diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 6b1713b20d5..64a100b57bd 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -5,26 +5,68 @@ #ifndef MADNESS_RESPONSEBASE_HPP #define MADNESS_RESPONSEBASE_HPP -#include "x_space.h" +#include +#include +#include +#include + #include "global_functions.h" #include "load_balance.h" +#include "madness/mra/functypedefs.h" +#include "madness/mra/mra.h" +#include "madness/tensor/tensor.h" #include "timer.h" -#include +#include "x_space.h" + + +using namespace madness; + +class response_timing { + std::map> wall_time_data; + std::map> cpu_time_data; + int iter; + +public: + response_timing(); + + void to_json(json& j); + + void print_data(); + + void add_data(std::map> values); +}; +class ResponseTester; + +struct residuals { + X_space residual; + Tensor residual_norms; +}; + + +using gamma_orbitals = std::tuple; class ResponseBase { public: + friend ResponseTester; ResponseBase(World& world, const CalcParams& params); void solve(World& world); - //virtual void iterate(World& world); - CalcParams get_parameter() const { return {ground_calc, molecule, r_params}; } - vector_real_function_3d get_orbitals() const { return ground_orbitals; } + virtual void initialize(World& world) = 0; + virtual void iterate(World& world) = 0; + //virtual void iterate(); + auto get_parameter() const -> CalcParams { return {ground_calc, molecule, r_params}; } + auto get_orbitals() const -> vector_real_function_3d { return ground_orbitals; } + void output_json(); + + json j_molresponse{}; + response_timing time_data; + mutable std::map> iter_timing; protected: // Given molecule returns the nuclear potential of the molecule ResponseParameters r_params; Molecule molecule; GroundStateCalculation ground_calc; - + bool converged = false; XCfunctional xcf; @@ -32,8 +74,8 @@ class ResponseBase { std::shared_ptr potential_manager; // shared pointers to Operators - poperatorT coulop;// shared pointer to seperated convolution operator - std::vector> gradop{}; + poperatorT shared_coulomb_operator;// shared pointer to seperated convolution operator + std::vector> gradop; // Stored functions mutable real_function_3d stored_v_nuc; // Stored nuclear potential from ground state @@ -49,19 +91,17 @@ class ResponseBase { Tensor ham_no_diag; // Tensors for holding energies // residuals, and shifts - Tensor omega; // Energies of response functions + Tensor e_residuals;// Residuals of energies // Mask function to handle boundary conditions functionT ground_density;// ground state density - vecfuncT rho_omega{}; // response density mutable response_space stored_potential;// The ground state potential, stored only // if store_potential is true (default is double vtol{}; - json j_molresponse{}; X_space Chi; @@ -106,7 +146,7 @@ class ResponseBase { double safety = 0.1; vtol = FunctionDefaults<3>::get_thresh() * safety; - coulop = poperatorT(CoulombOperatorPtr(world, r_params.lo(), thresh)); + shared_coulomb_operator = poperatorT(CoulombOperatorPtr(world, r_params.lo(), thresh)); gradop = gradient_operator(world); potential_manager = std::make_shared(molecule, "a"); potential_manager->make_nuclear_potential(world); @@ -122,60 +162,198 @@ class ResponseBase { } } - void check_k(World& world, double thresh, int k); - functionT make_ground_density(World& world) const; - std::pair,Tensor> ComputeHamiltonianPair(World& world) const; - real_function_3d Coulomb(World& world) const; - XCOperator make_xc_operator(World& world) const; - void save(World& world, const std::string& name); - void load(World& world, const std::string& name); - vecfuncT make_density(World& world); - - vector transition_density(World& world, vector& orbitals, - response_space& x, response_space& y); - vector transition_densityTDA(World& world, - const vector& orbitals, - response_space& x); - void load_balance(World& world); - vector make_bsh_operators_response(World& world, double& shift, - double& omega) const; - X_space Compute_Theta_X(World& world, X_space& Chi, XCOperator xc, - std::string calc_type); - X_space compute_F0X(World& world, X_space& Chi, XCOperator xc, bool compute_Y); - X_space compute_V0X(World& world, X_space& X, XCOperator xc, bool compute_Y); - void orbital_load_balance(World& world, vecfuncT& psi0, vecfuncT& psi0_copy, X_space& X, - X_space& Chi_copy); - X_space compute_gamma_tda(World& world, X_space& X, XCOperator xc); - X_space compute_gamma_full(World& world, X_space& X, const XCOperator& xc); - X_space compute_gamma_static(World& world, X_space& X, XCOperator xc); - X_space compute_residual(World& world, X_space& old_Chi, X_space& temp, - Tensor& bsh_residualsX, Tensor& bsh_residualsY, - std::string calc_type); - X_space kain_x_space_update(World& world, const X_space& temp, const X_space& res, - NonLinearXsolver& kain_x_space, vector& Xvector, - vector& Xresidual); - void x_space_step_restriction(World& world, X_space& old_Chi, X_space& temp, bool restrict_y, - Tensor& maxrotn); - void vector_stats(const vector& v, double& rms, double& maxabsval) const; - double do_step_restriction(World& world, const vecfuncT& x, vecfuncT& x_new, - std::string spin) const; - double do_step_restriction(World& world, const vecfuncT& x, vecfuncT& x_new, std::string spin, - double maxrotn) const; - double do_step_restriction(World& world, const vecfuncT& x, const vecfuncT& y, vecfuncT& x_new, - vecfuncT& y_new, std::string spin) const; - void PlotGroundandResponseOrbitals(World& world, size_t iteration, response_space& x_response, - response_space& y_response, - const ResponseParameters& r_params, - const GroundStateCalculation& g_params); - void vector_stats_new(const Tensor v, double& rms, double& maxabsval) const; + virtual void check_k(World& world, double thresh, int k); + auto make_ground_density(World& world) const -> functionT; + auto ComputeHamiltonianPair(World& world) const -> std::pair, Tensor>; + auto Coulomb(World& world) const -> real_function_3d; + auto make_xc_operator(World& world) const -> XCOperator; + virtual void save(World& world, const std::string& name) = 0; + virtual void load(World& world, const std::string& name) = 0; + auto make_density(World& world, const X_space& chi) const -> vecfuncT; + + void load_balance_chi(World& world); + auto make_bsh_operators_response(World& world, double& shift, double& omega) const + -> vector; + + + auto kain_x_space_update(World& world, const X_space& chi, const X_space& residual_chi, + NonLinearXsolver& kain_x_space, vector& Xvector, + vector& Xresidual) -> X_space; + void x_space_step_restriction(World& world, const X_space& old_Chi, X_space& temp, + bool restrict_y, const double& maxrotn); + void plotResponseOrbitals(World& world, size_t iteration, const response_space& x_response, + const response_space& y_response, + const ResponseParameters& responseParameters, + const GroundStateCalculation& g_params); + + static auto orbital_load_balance(World& world, const gamma_orbitals&, double load_balance) + -> gamma_orbitals; + auto compute_gamma_tda(World& world, const gamma_orbitals& density, + const XCOperator& xc) const -> X_space; + auto compute_gamma_static(World& world, const gamma_orbitals&, + const XCOperator& xc) const -> X_space; + auto compute_gamma_full(World& world, const gamma_orbitals&, + const XCOperator& xc) const -> X_space; + auto compute_V0X(World& world, const X_space& X, const XCOperator& xc, + bool compute_Y) const -> X_space; + auto compute_lambda_X(World& world, const X_space& chi, XCOperator& xc, + const std::string& calc_type) const -> X_space; + auto compute_theta_X(World& world, const X_space& chi, const XCOperator& xc, + const std::string& calc_type) const -> X_space; + auto compute_F0X(World& world, const X_space& X, const XCOperator& xc, + bool compute_Y) const -> X_space; + void analyze_vectors(World& world, const vecfuncT& x, const std::string& response_state); + auto project_ao_basis(World& world, const AtomicBasisSet& aobasis) -> vecfuncT; + + + static auto project_ao_basis_only(World& world, const AtomicBasisSet& aobasis, + const Molecule& mol) -> vecfuncT; + void converged_to_json(json& j); + auto compute_residual(World& world, const X_space& chi, const X_space& g_chi, + const std::string& calc_type) -> residuals; + auto compute_response_potentials(World& world, const X_space& chi, XCOperator& xc, + const std::string& calc_type) const + -> std::tuple; + + // compute exchange |i> + auto exchangeHF(const vecfuncT& ket,const vecfuncT& bra, const vecfuncT& vf) const -> vecfuncT { + World& world = ket[0].world(); + auto n = bra.size(); + auto nf = ket.size(); + double tol = FunctionDefaults<3>::get_thresh();/// Important this is + double mul_tol = 0.0; + const double lo = r_params.lo(); + + + std::shared_ptr poisson; + /// consistent with Coulomb + vecfuncT Kf = zero_functions_compressed(world, nf, true); + + reconstruct(world, bra); + reconstruct(world, ket); + reconstruct(world, vf); + + // i-j sym + for (int i = 0; i < n; ++i) { + // for each |i> + vecfuncT psi_f = mul_sparse(world, bra[i], vf, mul_tol, true);/// was vtol + truncate(world, psi_f, tol, true); + // apply to vector of products .. ... + psi_f = apply(world, *shared_coulomb_operator, psi_f); + truncate(world, psi_f, tol, true); + // multiply by ket i |i>: |i> |i> |i> + psi_f = mul_sparse(world, ket[i], psi_f, mul_tol, true);/// was vtol + /// Generalized A*X+Y for vectors of functions ---- a[i] = alpha*a[i] + + // 1*Kf+occ[i]*psi_f + gaxpy(world, double(1.0), Kf, double(1.0), psi_f); + } + truncate(world, Kf, tol, true); + return Kf; + } + static void print_inner(World& world, const std::string& name, const X_space& left, + const X_space& right) ; + void function_data_to_json(json& j_mol_in, size_t iter, const Tensor& x_norms, + const Tensor& x_abs_norms, const Tensor& x_rel_norms, + const Tensor& xij_norms, const Tensor& xij_res_norms, + const Tensor& rho_norms, + const Tensor& rho_res_norms); }; + // Some helper functions +/////////////////////////////////////////////////////////////////////////////////////////////////// + /// Check k given response parameters /// \param world /// \param Chi /// \param thresh /// \param k -void check_k(World &world, X_space &Chi, double thresh, int k); +void check_k(World& world, X_space& Chi, double thresh, int k); + + +auto add_randomness(World& world, const response_space& f, double magnitude) -> response_space; +void normalize(World& world, response_space& f); +void normalize(World& world, X_space& Chi); + + +static auto kronecker(size_t l, size_t n) -> double { + if (l == n) return 1.0; + return 0.0; +} + +auto solid_harmonics(World& world, int n) -> std::map, real_function_3d>; + +/*** + * @brief Prints the norms of the functions of a response space + * + * + * + * @param world + * @param f + */ +void print_norms(World& world, const response_space& f); +// Returns a list of solid harmonics such that: +// solid_harm.size() * num_ground_orbs > 2 * num. resp. components +auto make_xyz_functions(World& world) -> vector_real_function_3d; +// Selects from a list of functions and energies the k functions with the +// lowest energy +auto select_functions(World& world, response_space f, Tensor& energies, size_t k, + size_t print_level) -> response_space; +// Sorts the given tensor of eigenvalues and +// response functions +void sort(World& world, Tensor& vals, response_space& f); +void sort(World& world, Tensor& vals, X_space& f); + +// Specialized for response calculations that returns orthonormalized +// functions +auto gram_schmidt(World& world, const response_space& f) -> response_space; +/// Computes the transition density between set of two response functions x and y. +/// Uses std::transform to iterate between x and y vectors +/// \param world +/// \param orbitals +/// \param x +/// \param y +/// \return +auto transition_density(World& world, const vector_real_function_3d& orbitals, + const response_space& x, const response_space& y) + -> vector_real_function_3d; + +auto transition_densityTDA(World& world, const vector_real_function_3d& orbitals, + const response_space& x) -> vector_real_function_3d; + +auto transform(World& world, const response_space& f, const Tensor& U) -> response_space; + +auto transform(World& world, const X_space& x, const Tensor& U) -> X_space; + +// result(i,j) = inner(a[i],b[j]).sum() +auto expectation(World& world, const response_space& A, const response_space& B) -> Tensor; + + +class ResponseTester { + +public: + static void load_calc(World& world, ResponseBase* p, double thresh) { + p->set_protocol(world, thresh); + p->load(world, p->r_params.restart_file()); + p->check_k(world, thresh, FunctionDefaults<3>::get_k()); + } + static X_space compute_gamma_full(World& world, ResponseBase* p, double thresh) { + XCOperator xc = p->make_xc_operator(world); + X_space gamma = + p->compute_gamma_full(world, {p->Chi, p->ground_orbitals, p->ground_orbitals}, xc); + return gamma; + } + X_space compute_lambda_X(World& world, ResponseBase* p, double thresh) { + XCOperator xc = p->make_xc_operator(world); + X_space gamma = p->compute_lambda_X(world, p->Chi, xc, p->r_params.calc_type()); + return gamma; + } + std::pair compute_VFOX(World& world, ResponseBase* p, bool compute_y) { + XCOperator xc = p->make_xc_operator(world); + X_space V = p->compute_V0X(world, p->Chi, xc, compute_y); + X_space F = p->compute_F0X(world, p->Chi, xc, compute_y); + return {V, F}; + } +}; #endif// MADNESS_RESPONSEBASE_HPP diff --git a/src/apps/molresponse/ResponseExceptions.hpp b/src/apps/molresponse/ResponseExceptions.hpp index bc5cd4fd517..635e57a8a46 100644 --- a/src/apps/molresponse/ResponseExceptions.hpp +++ b/src/apps/molresponse/ResponseExceptions.hpp @@ -16,14 +16,22 @@ using MadException = madness::MadnessException; class Input_Error : public MadException { - public: - explicit Input_Error() - : MadException("input file not found", nullptr, 25, __LINE__, __FUNCTION__, __FILE__) {} +public: + explicit Input_Error() + : MadException("input file not found", nullptr, 25, __LINE__, __FUNCTION__, __FILE__) {} }; class Response_Input_Error : public MadException { - public: - explicit Response_Input_Error() - : MadException("Response input not correct", nullptr, 25, __LINE__, __FUNCTION__, __FILE__) {} +public: + explicit Response_Input_Error() + : MadException("Response input not correct", nullptr, 25, __LINE__, __FUNCTION__, + __FILE__) {} }; -#endif // MADNESS_RESPONSEEXCEPTIONS_HPP +class Response_Convergence_Error : public MadException { +public: + explicit Response_Convergence_Error() + : MadException("Previous frequency response calculation did not converge ", nullptr, 25, + __LINE__, __FUNCTION__, __FILE__) {} +}; + +#endif// MADNESS_RESPONSEEXCEPTIONS_HPP diff --git a/src/apps/molresponse/TDDFT.cc b/src/apps/molresponse/TDDFT.cc index b7c73d7e713..4176af9840e 100644 --- a/src/apps/molresponse/TDDFT.cc +++ b/src/apps/molresponse/TDDFT.cc @@ -11,8 +11,8 @@ #include "TDDFT.h" -#include -#include // For easy calculation of (1 - \hat{\rho}^0) +#include +#include // For easy calculation of (1 - \hat{\rho}^0) #include #include #include @@ -42,581 +42,580 @@ TDDFT::TDDFT(World &world, density_vector &rho) g_params(rho.g_params), molecule(rho.molecule), omega(rho.omega), - xcf(rho.xcf), rho(rho) { - // Start the timer - Chi = rho.Chi; - PQ = rho.PQ; - // - r_params.to_json(j_molresponse); + // Start the timer + Chi = rho.Chi; + PQ = rho.PQ; + xcf.initialize(r_params.xc(), !r_params.spinrestricted(), world, r_params.print_level() >= 10); + // + r_params.to_json(j_molresponse); - ground_orbitals = g_params.orbitals(); - ground_energies = g_params.get_energies(); + ground_orbitals = g_params.orbitals(); + ground_energies = g_params.get_energies(); - molresponse::start_timer(world); + molresponse::start_timer(world); - // Broadcast to all other nodes - world.gop.broadcast_serializable(r_params, 0); - world.gop.broadcast_serializable(molecule, 0); + // Broadcast to all other nodes + world.gop.broadcast_serializable(r_params, 0); + world.gop.broadcast_serializable(molecule, 0); - // Read in archive - // Create the projector Qhat to be used in any calculation + // Read in archive + // Create the projector Qhat to be used in any calculation - // Set some function defaults - FunctionDefaults<3>::set_cubic_cell(-r_params.L(), r_params.L()); - FunctionDefaults<3>::set_truncate_mode(1); - FunctionDefaults<3>::set_truncate_on_project(true); + // Set some function defaults + FunctionDefaults<3>::set_cubic_cell(-r_params.L(), r_params.L()); + FunctionDefaults<3>::set_truncate_mode(1); + FunctionDefaults<3>::set_truncate_on_project(true); - // Create the masking function - mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); + // Create the masking function + mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); - if (world.size() > 1) { - // Start a timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - if (world.rank() == 0) print(""); // Makes it more legible + if (world.size() > 1) { + // Start a timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + if (world.rank() == 0) print("");// Makes it more legible - LoadBalanceDeux<3> lb(world); - for (unsigned int j = 0; j < r_params.num_orbitals(); j++) { - lb.add_tree(ground_orbitals[j], lbcost(1.0, 8.0), true); - } - FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); + LoadBalanceDeux<3> lb(world); + for (unsigned int j = 0; j < r_params.num_orbitals(); j++) { + lb.add_tree(ground_orbitals[j], lbcost(1.0, 8.0), true); + } + FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Load balancing:"); - } + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Load balancing:"); + } } // Save the current response calculation void TDDFT::save(World &world, const std::string &name) { - // Archive to write everything to - archive::ParallelOutputArchive ar(world, name.c_str(), 1); - // Just going to enforce 1 io server - - // Saving, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω - - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; - if (not r_params.tda()) { + // Archive to write everything to + archive::ParallelOutputArchive ar(world, name.c_str(), 1); + // Just going to enforce 1 io server + + // Saving, in this order; + // string ground-state archive name (garch_name) + // bool TDA flag + // size_t number of ground state orbitals (n) + // size_t number of excited state orbitals (m) + // Tensor energies of m x-components + // for i from 0 to m-1 + // for j from 0 to n-1 + // Function x_response[i][j] + // (If TDA flag == True) + // (Tensor energies of m y-components ) + // (for i from 0 to m-1 ) + // ( for j from 0 to n-1 ) + // ( Function y_response[i][j] ) + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); + ar ω + for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; - } + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + if (not r_params.tda()) { + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + } } // Load a response calculation -void TDDFT::load(World &world, const std::string & name) { - // The archive to read from - archive::ParallelInputArchive ar(world, name.c_str()); - - // Reading in, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) - - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω - - Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); - - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; - world.gop.fence(); - - if (not r_params.tda()) { +void TDDFT::load(World &world, const std::string &name) { + // The archive to read from + archive::ParallelInputArchive ar(world, name.c_str()); + + // Reading in, in this order; + // string ground-state archive name (garch_name) + // bool TDA flag + // size_t number of ground state orbitals (n) + // size_t number of excited state orbitals (m) + // Tensor energies of m x-components + // for i from 0 to m-1 + // for j from 0 to n-1 + // Function x_response[i][j] + // (If TDA flag == True) + // (Tensor energies of m y-components ) + // (for i from 0 to m-1 ) + // ( for j from 0 to n-1 ) + // ( Function y_response[i][j] ) + + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); + ar ω + + Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); + for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; world.gop.fence(); - } + + if (not r_params.tda()) { + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + world.gop.fence(); + } } void TDDFT::initial_load_bal(World &world) { - LoadBalanceDeux<3> lb(world); - real_function_3d vnuc; - vnuc = potential_manager->vnuclear(); - lb.add_tree(vnuc, lbcost(r_params.vnucextra() * 1.0, r_params.vnucextra() * 8.0)); - FunctionDefaults<3>::redistribute(world, lb.load_balance(r_params.loadbalparts())); -} - -void TDDFT::load_balance(World &world, vecfuncT rho_omega, X_space Chi, const X_space& Chi_old) { - molresponse::start_timer(world); - if (world.size() == 1) return; - - LoadBalanceDeux<3> lb(world); - real_function_3d v_nuclear; - v_nuclear = potential_manager->vnuclear(); - lb.add_tree(v_nuclear, lbcost(r_params.vnucextra() * 1.0, r_params.vnucextra() * 8.0), false); - for (size_t i = 0; i < Chi.X.size(); ++i) { - lb.add_tree(rho_omega[i], lbcost(1.0, 8.0), false); - } - for (size_t i = 0; i < Chi.X.size(); ++i) { - for (size_t j = 0; j < Chi.X.size_orbitals(); ++j) { - lb.add_tree(Chi.X[i][j], lbcost(1.0, 8.0), false); - } - } - if (r_params.omega() != 0) { + LoadBalanceDeux<3> lb(world); + real_function_3d vnuc; + vnuc = potential_manager->vnuclear(); + lb.add_tree(vnuc, lbcost(r_params.vnucextra() * 1.0, r_params.vnucextra() * 8.0)); + FunctionDefaults<3>::redistribute(world, lb.load_balance(r_params.loadbalparts())); +} + +void TDDFT::load_balance(World &world, vecfuncT rho_omega, X_space Chi, const X_space &Chi_old) { + molresponse::start_timer(world); + if (world.size() == 1) return; + + LoadBalanceDeux<3> lb(world); + real_function_3d v_nuclear; + v_nuclear = potential_manager->vnuclear(); + lb.add_tree(v_nuclear, + lbcost(r_params.vnucextra() * 1.0, r_params.vnucextra() * 8.0), false); + for (size_t i = 0; i < Chi.X.size(); ++i) { + lb.add_tree(rho_omega[i], lbcost(1.0, 8.0), false); + } for (size_t i = 0; i < Chi.X.size(); ++i) { - for (size_t j = 0; j < Chi.X.size_orbitals(); ++j) { - lb.add_tree(Chi.Y[i][j], lbcost(1.0, 8.0), false); - } + for (size_t j = 0; j < Chi.X.size_orbitals(); ++j) { + lb.add_tree(Chi.X[i][j], lbcost(1.0, 8.0), false); + } + } + if (r_params.omega() != 0) { + for (size_t i = 0; i < Chi.X.size(); ++i) { + for (size_t j = 0; j < Chi.X.size_orbitals(); ++j) { + lb.add_tree(Chi.Y[i][j], lbcost(1.0, 8.0), false); + } + } } - } - world.gop.fence(); + world.gop.fence(); - FunctionDefaults<3>::redistribute(world, - lb.load_balance(r_params.loadbalparts())); // 6.0 needs retuning after + FunctionDefaults<3>::redistribute( + world, + lb.load_balance(r_params.loadbalparts()));// 6.0 needs retuning after - world.gop.fence(); - molresponse::end_timer(world, "Load balancing"); - print_meminfo(world.rank(), "Load balancing"); + world.gop.fence(); + molresponse::end_timer(world, "Load balancing"); + print_meminfo(world.rank(), "Load balancing"); } // compute pmap based on ground and first order orbitals // set default pmap to new pmap // make orbital copies using new pmap -void TDDFT::orbital_load_balance(World &world, - vecfuncT &psi0, - vecfuncT &psi0_copy, - X_space &Chi, +void TDDFT::orbital_load_balance(World &world, vecfuncT &psi0, vecfuncT &psi0_copy, X_space &Chi, X_space &Chi_copy) { - size_t m = r_params.num_states(); - size_t n = r_params.num_orbitals(); - - if (world.size() > 1) { - molresponse::start_timer(world); - LoadBalanceDeux<3> lb(world); - for (unsigned int i = 0; i < m; ++i) { - lb.add_tree(psi0[i], lbcost(1.0, 8.0), false); - for (unsigned int j = 0; j < n; ++j) { - // add a tree for orbitals - lb.add_tree(Chi.X[i][j], lbcost(1.0, 8.0), false); - lb.add_tree(Chi.Y[i][j], lbcost(1.0, 8.0), false); - } - } + size_t m = r_params.num_states(); + size_t n = r_params.num_orbitals(); + + if (world.size() > 1) { + molresponse::start_timer(world); + LoadBalanceDeux<3> lb(world); + for (unsigned int i = 0; i < m; ++i) { + lb.add_tree(psi0[i], lbcost(1.0, 8.0), false); + for (unsigned int j = 0; j < n; ++j) { + // add a tree for orbitals + lb.add_tree(Chi.X[i][j], lbcost(1.0, 8.0), false); + lb.add_tree(Chi.Y[i][j], lbcost(1.0, 8.0), false); + } + } - world.gop.fence(); + world.gop.fence(); - // newpamap is the new pmap just based on the orbitals - std::shared_ptr>> new_process_map = lb.load_balance(r_params.loadbalparts()); - molresponse::end_timer(world, "Gamma compute load_balance"); - // default process map - // We set the new_process_map - molresponse::start_timer(world); - FunctionDefaults<3>::set_pmap(new_process_map); // set default to be new + // newpamap is the new pmap just based on the orbitals + std::shared_ptr>> new_process_map = + lb.load_balance(r_params.loadbalparts()); + molresponse::end_timer(world, "Gamma compute load_balance_chi"); + // default process map + // We set the new_process_map + molresponse::start_timer(world); + FunctionDefaults<3>::set_pmap(new_process_map);// set default to be new - world.gop.fence(); - // copy orbitals using new pmap - Chi_copy = Chi.copy(new_process_map, false); - world.gop.fence(); // then fence + world.gop.fence(); + // copy orbitals using new pmap + Chi_copy = Chi.copy(new_process_map, false); + world.gop.fence();// then fence - psi0_copy = copy(world, ground_orbitals, new_process_map, false); - world.gop.fence(); // then fence - molresponse::end_timer(world, "Gamma redist"); - } + psi0_copy = copy(world, ground_orbitals, new_process_map, false); + world.gop.fence();// then fence + molresponse::end_timer(world, "Gamma redist"); + } } // (Each state's norm should be 1, not the // individual functions norms) void TDDFT::normalize(World &world, response_space &f) { - // Run over rows - for (unsigned int i = 0; i < f.size(); i++) { - // Get the normalization constant - // (Sum included inside inner) - double norm = inner(f[i], f[i]); - norm = sqrt(norm); - // Doing this to deal with zero functions. - // Maybe not smrt. - if (norm == 0) continue; + // Run over rows + for (unsigned int i = 0; i < f.size(); i++) { + // Get the normalization constant + // (Sum included inside inner) + double norm = inner(f[i], f[i]); + norm = sqrt(norm); + // Doing this to deal with zero functions. + // Maybe not smrt. + if (norm == 0) continue; - // And scale - f[i] = f[i] * (1.0 / norm); - } + // And scale + f[i] = f[i] * (1.0 / norm); + } } // (Each state's norm should be 1, not the // individual functions norms) // non-standard normalization for eigen value problem void TDDFT::normalize(World &world, response_space &f, response_space &g) { - // Run over rows - for (size_t i = 0; i < f.size(); i++) { - // Get the normalization constant - // (Sum included inside inner) - double normf = inner(f[i], f[i]); - double normg = inner(g[i], g[i]); - double norm = sqrt(normf - normg); - - // Doing this to deal with zero functions. - // Maybe not smrt. - if (norm == 0) continue; - // And scale - scale(world, f[i], (1.0 / norm)); - scale(world, g[i], (1.0 / norm)); - } -} - -void TDDFT::normalize(World &world, X_space &Chi) { - // Run over rows - for (size_t i = 0; i < Chi.num_states(); i++) { - // Get the normalization constant - // (Sum included inside inner) - double normf = inner(Chi.X[i], Chi.X[i]); - double normg = inner(Chi.Y[i], Chi.Y[i]); - double norm = sqrt(normf - normg); - // Doing this to deal with zero functions. - // Maybe not smrt. - if (norm == 0) continue; - Chi.X[i] = Chi.X[i] * (1.0 / norm); - Chi.Y[i] = Chi.Y[i] * (1.0 / norm); - } + // Run over rows + for (size_t i = 0; i < f.size(); i++) { + // Get the normalization constant + // (Sum included inside inner) + double normf = inner(f[i], f[i]); + double normg = inner(g[i], g[i]); + double norm = sqrt(normf - normg); + + // Doing this to deal with zero functions. + // Maybe not smrt. + if (norm == 0) continue; + // And scale + scale(world, f[i], (1.0 / norm)); + scale(world, g[i], (1.0 / norm)); + } +} + +void TDDFT::normalize(World &world, X_space &chi) { + // Run over rows + for (size_t i = 0; i < chi.num_states(); i++) { + // Get the normalization constant + // (Sum included inside inner) + double normf = inner(chi.X[i], chi.X[i]); + double normg = inner(chi.Y[i], chi.Y[i]); + double norm = sqrt(normf - normg); + // Doing this to deal with zero functions. + // Maybe not smrt. + if (norm == 0) continue; + chi.X[i] = chi.X[i] * (1.0 / norm); + chi.Y[i] = chi.Y[i] * (1.0 / norm); + } } // Prints norms of the given vector of vector of functions void TDDFT::print_norms(World &world, response_space f) { - // Container - Tensor norms(f.size(), f[0].size()); + // Container + Tensor norms(f.size(), f[0].size()); - // Calc the norms - for (unsigned int i = 0; i < f.size(); i++) { - for (unsigned int j = 0; j < f[0].size(); j++) { - norms(i, j) = f[i][j].norm2(); + // Calc the norms + for (unsigned int i = 0; i < f.size(); i++) { + for (unsigned int j = 0; j < f[0].size(); j++) { norms(i, j) = f[i][j].norm2(); } } - } - // Print em in a smart way - if (world.rank() == 0) print(norms); + // Print em in a smart way + if (world.rank() == 0) print(norms); } // Small function to print geometry of a molecule nicely // Radial function static double kronecker(size_t l, size_t n) { - if (l == n) return 1.0; - return 0.0; + if (l == n) return 1.0; + return 0.0; } // Returns a list of solid harmonics such that: // solid_harm.size() * num_ground_orbs > 2 * num. resp. components std::map, real_function_3d> TDDFT::solid_harmonics(World &world, int n) { - // Container to return - std::map, real_function_3d> result; - - // Create the basic x, y, z, constant and zero - real_function_3d x = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - real_function_3d c = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); - real_function_3d zero = real_factory_3d(world); - - // Add in first few, since they're simple - // Assuming n >= 1 - result[std::vector{0, 0}] = copy(c); - result[std::vector{0, -1}] = zero; - result[std::vector{0, 1}] = zero; - result[std::vector{-1, 0}] = zero; - - // Generate the solid harmonics recursively from here - for (int l = 0; l < n; l++) { - // Calculate ends of this row first - result[std::vector{l + 1, l + 1}] = - sqrt(pow(2, kronecker(l, 0) * (2 * l) / (2 * l + 1))) * - (x * result[std::vector{l, l}] - (1 - kronecker(l, 0) * y * result[std::vector{l, -l}])); - result[std::vector{l + 1, -l - 1}] = - sqrt(pow(2, kronecker(l, 0) * (2 * l) / (2 * l + 1))) * - (y * result[std::vector{l, l}] + (1 - kronecker(l, 0) * x * result[std::vector{l, -l}])); - - // Formula below calls for some functions that don't exist. - // Need zeroes where that would occur - result[std::vector{l + 1, l + 2}] = zero; - result[std::vector{l + 1, -l - 2}] = zero; - - // Run over quantum number m - for (int m = -l; m < l + 1; m++) { - // Calculate remaining terms - result[std::vector{l + 1, m}] = - 1.0 / std::sqrt((l + m + 1) * (l - m + 1)) * - ((2 * l + 1) * z * result[std::vector{l, m}] - - sqrt((l + m) * (l - m)) * (x * x + y * y + z * z) * result[std::vector{l - 1, m}]); - } - } - - // Get rid of any zero functions we added - for (auto it = result.begin(); it != result.end();) { - if (it->second.norm2() == 0) - it = result.erase(it); - else - ++it; - } - - // Also get rid of the constant - result.erase(std::vector{0, 0}); - - // Done - return result; + // Container to return + std::map, real_function_3d> result; + + // Create the basic x, y, z, constant and zero + real_function_3d x = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_function_3d y = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_function_3d z = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + real_function_3d c = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); + real_function_3d zero = real_factory_3d(world); + + // Add in first few, since they're simple + // Assuming n >= 1 + result[std::vector{0, 0}] = copy(c); + result[std::vector{0, -1}] = zero; + result[std::vector{0, 1}] = zero; + result[std::vector{-1, 0}] = zero; + + // Generate the solid harmonics recursively from here + for (int l = 0; l < n; l++) { + // Calculate ends of this row first + result[std::vector{l + 1, l + 1}] = + sqrt(pow(2, kronecker(l, 0) * (2 * l) / (2 * l + 1))) * + (x * result[std::vector{l, l}] - + (1 - kronecker(l, 0) * y * result[std::vector{l, -l}])); + result[std::vector{l + 1, -l - 1}] = + sqrt(pow(2, kronecker(l, 0) * (2 * l) / (2 * l + 1))) * + (y * result[std::vector{l, l}] + + (1 - kronecker(l, 0) * x * result[std::vector{l, -l}])); + + // Formula below calls for some functions that don't exist. + // Need zeroes where that would occur + result[std::vector{l + 1, l + 2}] = zero; + result[std::vector{l + 1, -l - 2}] = zero; + + // Run over quantum number m + for (int m = -l; m < l + 1; m++) { + // Calculate remaining terms + result[std::vector{l + 1, m}] = + 1.0 / std::sqrt((l + m + 1) * (l - m + 1)) * + ((2 * l + 1) * z * result[std::vector{l, m}] - + sqrt((l + m) * (l - m)) * (x * x + y * y + z * z) * + result[std::vector{l - 1, m}]); + } + } + + // Get rid of any zero functions we added + for (auto it = result.begin(); it != result.end();) { + if (it->second.norm2() == 0) it = result.erase(it); + else + ++it; + } + + // Also get rid of the constant + result.erase(std::vector{0, 0}); + + // Done + return result; } // Returns a list of solid harmonics such that: // solid_harm.size() * num_ground_orbs > 2 * num. resp. components -std::map, real_function_3d> TDDFT::simple_spherical_harmonics(World &world, int n) { - // Container to return - std::map, real_function_3d> result; - - // Create the basic x, y, z, constant and zero - real_function_3d x = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - real_function_3d c = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); - real_function_3d zero = real_factory_3d(world); - - real_function_3d rfunc = (x * x + y * y + z * z); - double r = rfunc.norm2(); - - std::vector funcs; - funcs[0] = c; - - funcs[1] = y.scale(1 / r); - funcs[2] = z.scale(1 / r); - funcs[3] = x.scale(1 / r); - - funcs[4] = x * y; - funcs[5] = y * z; - funcs[6] = 2 * z * z - x * x - y * y; - funcs[7] = z * x; - funcs[8] = x * x - y * y; - - funcs[4] = funcs[4].scale(1 / (r * r)); - funcs[5] = funcs[5].scale(1 / (r * r)); - funcs[6] = funcs[6].scale(1 / (r * r)); - funcs[7] = funcs[7].scale(1 / (r * r)); - funcs[8] = funcs[8].scale(1 / (r * r)); - - size_t num = 0; - for (int l = 0; l < n; l++) { - for (int m = -l; m <= l; m++) { - result[vector{l, m}] = funcs[num]; - num += 1; - } - } - - // Done - return result; +std::map, real_function_3d> TDDFT::simple_spherical_harmonics(World &world, + int n) { + // Container to return + std::map, real_function_3d> result; + + // Create the basic x, y, z, constant and zero + real_function_3d x = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_function_3d y = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_function_3d z = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + real_function_3d c = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); + real_function_3d zero = real_factory_3d(world); + + real_function_3d rfunc = (x * x + y * y + z * z); + double r = rfunc.norm2(); + + std::vector funcs; + funcs[0] = c; + + funcs[1] = y.scale(1 / r); + funcs[2] = z.scale(1 / r); + funcs[3] = x.scale(1 / r); + + funcs[4] = x * y; + funcs[5] = y * z; + funcs[6] = 2 * z * z - x * x - y * y; + funcs[7] = z * x; + funcs[8] = x * x - y * y; + + funcs[4] = funcs[4].scale(1 / (r * r)); + funcs[5] = funcs[5].scale(1 / (r * r)); + funcs[6] = funcs[6].scale(1 / (r * r)); + funcs[7] = funcs[7].scale(1 / (r * r)); + funcs[8] = funcs[8].scale(1 / (r * r)); + + size_t num = 0; + for (int l = 0; l < n; l++) { + for (int m = -l; m <= l; m++) { + result[vector{l, m}] = funcs[num]; + num += 1; + } + } + + // Done + return result; } // Returns initial guess functions as // ground MO * solid harmonics -X_space TDDFT::create_trial_functions(World &world, - size_t k, - std::vector &orbitals, - size_t print_level) { - // Get size - print("In create trial functions"); - size_t n = orbitals.size(); - - // Create solid harmonics such that num. solids * num. orbitals > k. - // The total number of solid harmonics that exist up to level n is - // (n+1)^2 (because we count from zero) - // Always do at least 8 (through the d orbital angular momentum functions, - // minus ) - std::map, real_function_3d> solids = - solid_harmonics(world, std::max(2.0, ceil(sqrt(k / n) - 1))); - - // Useful info. - if (world.rank() == 0) print(" Created", solids.size(), "solid harmonics.\n"); - - // Container to return - response_space trials_X; - - // Counter for number of trials created - size_t count = 0; - - // Multiply each solid harmonic onto a ground state orbital - for (size_t i = 0; i < n; i++) { - // For each solid harmonic - for (const auto &key : solids) { - // Temp zero functions - std::vector temp = zero_functions_compressed(world, static_cast(n)); +X_space TDDFT::create_trial_functions(World &world, size_t k, + std::vector &orbitals, size_t print_level) { + // Get size + print("In create trial functions"); + size_t n = orbitals.size(); + + // Create solid harmonics such that num. solids * num. orbitals > k. + // The total number of solid harmonics that exist up to level n is + // (n+1)^2 (because we count from zero) + // Always do at least 8 (through the d orbital angular momentum functions, + // minus ) + std::map, real_function_3d> solids = + solid_harmonics(world, std::max(2.0, ceil(sqrt(k / n) - 1))); + + // Useful info. + if (world.rank() == 0) print(" Created", solids.size(), "solid harmonics.\n"); + + // Container to return + response_space trials_X; + + // Counter for number of trials created + size_t count = 0; + + // Multiply each solid harmonic onto a ground state orbital + for (size_t i = 0; i < n; i++) { + // For each solid harmonic + for (const auto &key: solids) { + // Temp zero functions + std::vector temp = + zero_functions_compressed(world, static_cast(n)); + + // Create one non-zero function and add to trials + temp[count % n] = key.second * orbitals[n - count % n - 1]; + trials_X.push_back(temp); + count++; + } - // Create one non-zero function and add to trials - temp[count % n] = key.second * orbitals[n - count % n - 1]; - trials_X.push_back(temp); - count++; + // Stop when we first get beyond k components + if (count >= k) break; } - // Stop when we first get beyond k components - if (count >= k) break; - } - - // Debugging output - if (print_level >= 2) { - if (world.rank() == 0) print(" Norms of guess functions:"); - print_norms(world, trials_X); - } + // Debugging output + if (print_level >= 2) { + if (world.rank() == 0) print(" Norms of guess functions:"); + print_norms(world, trials_X); + } - // Truncate - madness::truncate(world, trials_X, madness::FunctionDefaults<3>::get_thresh(), true); + // Truncate + madness::truncate(world, trials_X, madness::FunctionDefaults<3>::get_thresh(), true); - X_space trials(world, count, n); - trials.X = trials_X.copy(); - trials_X.clear(); + X_space trials(world, count, n); + trials.X = trials_X.copy(); + trials_X.clear(); - // Done - return trials; + // Done + return trials; } // Returns initial guess functions as // ground MO * -X_space TDDFT::create_trial_functions2(World &world, - std::vector &orbitals, +X_space TDDFT::create_trial_functions2(World &world, std::vector &orbitals, size_t print_level) { - // Get size - size_t n = orbitals.size(); - size_t directions = 3; - // (n+1)^2 (because we count from zero) - // adsf - // - std::vector xyz = createDipoleFunctionMap(world); - // create 3 x n orbital functions - std::vector> functions; - - print("Debug Norms", xyz[0].norm2()); - print("Debug Norms", xyz[1].norm2()); - print("Debug Norms", xyz[2].norm2()); - - for (size_t d = 0; d < directions; d++) { - vector temp; + // Get size + size_t n = orbitals.size(); + size_t directions = 3; + // (n+1)^2 (because we count from zero) + // adsf + // + std::vector xyz = createDipoleFunctionMap(world); + // create 3 x n orbital functions + std::vector> functions; + + print("Debug Norms", xyz[0].norm2()); + print("Debug Norms", xyz[1].norm2()); + print("Debug Norms", xyz[2].norm2()); + + for (size_t d = 0; d < directions; d++) { + vector temp; + for (size_t i = 0; i < n; i++) { + // create x functions then y.. then z .. + temp.push_back(orbitals[i] * xyz[d]); + print("Debug Norms of temp ", i, "=", temp[i].norm2()); + print("Debug Norms of orbitals ", i, "=", orbitals[i].norm2()); + } + // all the x then the y then the z + functions.push_back(temp); + } + print("number of orbitals: ", orbitals.size()); + + // Container to return + size_t count = 0; + + X_space trials(world, 3 * n * n, n); for (size_t i = 0; i < n; i++) { - // create x functions then y.. then z .. - temp.push_back(orbitals[i] * xyz[d]); - print("Debug Norms of temp ", i, "=", temp[i].norm2()); - print("Debug Norms of orbitals ", i, "=", orbitals[i].norm2()); + for (size_t d = 0; d < directions; d++) { + for (size_t o = 0; o < n; o++) { + // trials[i + j + o][o] = functions[i][j]; + trials.X[count][o] = copy(functions.at(d).at(o)); + count++; + } + } + } + // The above generates response function as follows + // all functions start off as zeros + // 1 [x1 0 0 ] + // 2 [0 x1 0 ] + // 3 [0 0 x1 ] + // 4 [y1 0 0 ] + // 5 [0 y1 0 ] + // 6 [0 0 y1 ] + // 7 [z1 0 0 ] + // 8 [0 z1 0 ] + // 9 [0 0 z1 ] + // 10 [x2 0 0 ] + // 11 [0 x2 0 ] + // 12 [0 0 x2 ] + // 13 [y2 0 0 ] + // 14 [0 y2 0 ] + // 15 [0 0 y2 ] + // 16 [z2 0 0 ] + // 17 [0 z2 0 ] + // 18 [0 0 z2 ] + // 19 [x3 0 0 ] + // 20 [0 x3 0 ] + // 21 [0 0 x3 ] + // 22 [y3 0 0 ] + // 23 [0 y3 0 ] + // 24 [0 0 y3 ] + // 25 [z3 0 0 ] + // 26 [0 z3 0 ] + // 27 [0 0 z3 ] + // for each orbital for each direction + // Counter for number of trials created + // Multiply each solid harmonic onto a ground state orbital + // for each orbital we + + // For each solid harmonic + // Temp zero functions + + // Debugging output + if (print_level >= 2) { + if (world.rank() == 0) print(" Norms of guess functions:"); + print_norms(world, trials.X); } - // all the x then the y then the z - functions.push_back(temp); - } - print("number of orbitals: ", orbitals.size()); - // Container to return - size_t count = 0; + // Truncate + madness::truncate(world, trials.X); - X_space trials(world, 3 * n * n, n); - for (size_t i = 0; i < n; i++) { - for (size_t d = 0; d < directions; d++) { - for (size_t o = 0; o < n; o++) { - // trials[i + j + o][o] = functions[i][j]; - trials.X[count][o] = copy(functions.at(d).at(o)); - count++; - } - } - } - // The above generates response function as follows - // all functions start off as zeros - // 1 [x1 0 0 ] - // 2 [0 x1 0 ] - // 3 [0 0 x1 ] - // 4 [y1 0 0 ] - // 5 [0 y1 0 ] - // 6 [0 0 y1 ] - // 7 [z1 0 0 ] - // 8 [0 z1 0 ] - // 9 [0 0 z1 ] - // 10 [x2 0 0 ] - // 11 [0 x2 0 ] - // 12 [0 0 x2 ] - // 13 [y2 0 0 ] - // 14 [0 y2 0 ] - // 15 [0 0 y2 ] - // 16 [z2 0 0 ] - // 17 [0 z2 0 ] - // 18 [0 0 z2 ] - // 19 [x3 0 0 ] - // 20 [0 x3 0 ] - // 21 [0 0 x3 ] - // 22 [y3 0 0 ] - // 23 [0 y3 0 ] - // 24 [0 0 y3 ] - // 25 [z3 0 0 ] - // 26 [0 z3 0 ] - // 27 [0 0 z3 ] - // for each orbital for each direction - // Counter for number of trials created - // Multiply each solid harmonic onto a ground state orbital - // for each orbital we - - // For each solid harmonic - // Temp zero functions - - // Debugging output - if (print_level >= 2) { - if (world.rank() == 0) print(" Norms of guess functions:"); - print_norms(world, trials.X); - } - - // Truncate - madness::truncate(world, trials.X); - - // Done - return trials; + // Done + return trials; } // Returns a list of solid harmonics such that: // solid_harm.size() * num_ground_orbs > 2 * num. resp. components std::vector TDDFT::createDipoleFunctionMap(World &world) { - // Container to return + // Container to return - // Create the basic x, y, z, constant and zero - real_function_3d x = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = - real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + // Create the basic x, y, z, constant and zero + real_function_3d x = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_function_3d y = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_function_3d z = real_factory_3d(world).functor( + real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - // real_function_3d rfunc = (x * x + y * y + z * z); - // double r = rfunc.norm2(); + // real_function_3d rfunc = (x * x + y * y + z * z); + // double r = rfunc.norm2(); - std::vector funcs; - funcs.push_back(x); - funcs.push_back(y); - funcs.push_back(z); - // Done - return funcs; + std::vector funcs; + funcs.push_back(x); + funcs.push_back(y); + funcs.push_back(z); + // Done + return funcs; } typedef Tensor tensorT; @@ -625,120 +624,119 @@ typedef std::shared_ptr> functorT; typedef FunctionFactory factoryT; response_space TDDFT::PropertyRHS(World &world, PropertyBase &p) const { - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - } - response_space rhs(world, p.num_operators, r_params.num_orbitals()); - - reconstruct(world, ground_orbitals); - QProjector Qhat(world, ground_orbitals); - // Set the dipoles (ground orbitals are probably - // more accurate now, so recalc the dipoles) - // why is it called dipole guess. - // This is just orbitals times dipole operator - std::vector orbitals = ground_orbitals; - - print("num operators ", p.num_operators); - for (size_t i = 0; i < p.num_operators; i++) { - // question here....MolecularDerivativeFunctor takes derivative with - // respect to axis atom and axis - // here we save - // need to project - - rhs[i] = mul(world, p.operator_vector.at(i), ground_orbitals, r_params.lo()); - - truncate(world, rhs[i]); - // rhs[i].truncate_vec(); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + response_space rhs(world, p.num_operators, r_params.num_orbitals()); + + reconstruct(world, ground_orbitals); + QProjector Qhat(world, ground_orbitals); + // Set the dipoles (ground orbitals are probably + // more accurate now, so recalc the dipoles) + // why is it called dipole guess. + // This is just orbitals times dipole operator + std::vector orbitals = ground_orbitals; + + print("num operators ", p.num_operators); + for (size_t i = 0; i < p.num_operators; i++) { + // question here....MolecularDerivativeFunctor takes derivative with + // respect to axis atom and axis + // here we save + // need to project + + rhs[i] = mul(world, p.operator_vector.at(i), ground_orbitals, r_params.lo()); + + truncate(world, rhs[i]); + // rhs[i].truncate_vec(); + + // project rhs vectors for state + rhs[i] = Qhat(rhs[i]); + // truncate(world, rhs[i], true); + for (size_t j = 0; j < orbitals.size(); j++) { + print("RHS norm for after orbital ", j, "Response state ", i, ": ", rhs[i][j].norm2()); + } - // project rhs vectors for state - rhs[i] = Qhat(rhs[i]); - // truncate(world, rhs[i], true); - for (size_t j = 0; j < orbitals.size(); j++) { - print("RHS norm for after orbital ", j, "Response state ", i, ": ", rhs[i][j].norm2()); + world.gop.fence(); + // core projector contribution } - world.gop.fence(); - // core projector contribution - } - - // if (world.rank() ==dipole 0) print("derivatives:\n", r, ru, rc, ra); - molresponse::end_timer(world, "rhs vectors"); - return rhs; + // if (world.rank() ==dipole 0) print("derivatives:\n", r, ru, rc, ra); + molresponse::end_timer(world, "rhs vectors"); + return rhs; } // Calculates ground state coulomb potential real_function_3d TDDFT::Coulomb(World &world) { - // Coulomb operator - real_convolution_3d op = CoulombOperator(world, r_params.lo(), FunctionDefaults<3>::get_thresh()); - - // Get density - std::vector vsq = square(world, ground_orbitals); - compress(world, vsq); - real_function_3d rho = real_factory_3d(world); - rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { - rho.gaxpy(1.0, vsq[i], 1.0, false); - } - world.gop.fence(); - vsq.clear(); + // Coulomb operator + real_convolution_3d op = + CoulombOperator(world, r_params.lo(), FunctionDefaults<3>::get_thresh()); + + // Get density + std::vector vsq = square(world, ground_orbitals); + compress(world, vsq); + real_function_3d rho = real_factory_3d(world); + rho.compress(); + for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], 1.0, false); } + world.gop.fence(); + vsq.clear(); - // Apply operator and truncate - rho = apply(op, rho); - rho.truncate(); + // Apply operator and truncate + rho = apply(op, rho); + rho.truncate(); - // Done - return rho; + // Done + return rho; } response_space TDDFT::exchange(World &world, response_space &f) { - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - - // Container for results and others - response_space result(world, m, n); - real_function_3d psif = real_function_3d(world); - - // Modified 'small memory' algorithm from SCF.cc - f.reconstruct_rf(); - // K[ground_density]xp=\sum_i |i> - // for each state - // for each occ orbital - // - create the vector of orbital products - // - gaxpy to collect into result - // compute product - - // Run over each excited state - for (size_t k = 0; k < m; k++) { - // And run over each occupied state - for (size_t j = 0; j < n; j++) { - // Get a vector of transition densities - // v[i]= phi[i]*f[k][:] - auto phix = mul_sparse(world, ground_orbitals[j], f[k], FunctionDefaults<3>::get_thresh()); - // Clean up - truncate(world, phix); - // Apply operator to each member of vector - phix = apply(world, *coulop, phix); - // Clean up - truncate(world, phix); - // Final multiplication of each member of vector by a single function - phix = mul_sparse(world, ground_orbitals[j], phix, FunctionDefaults<3>::get_thresh()); - // Add the vector to result - gaxpy(world, 1.0, result[k], 1.0, phix); - } - } - - // Truncate - madness::truncate(world, result); - - // Done! - return result; + // Get sizes + size_t m = f.size(); + size_t n = f[0].size(); + + // Container for results and others + response_space result(world, m, n); + real_function_3d psif = real_function_3d(world); + + // Modified 'small memory' algorithm from SCF.cc + f.reconstruct_rf(); + // K[ground_density]xp=\sum_i |i> + // for each state + // for each occ orbital + // - create the vector of orbital products + // - gaxpy to collect into result + // compute product + + // Run over each excited state + for (size_t k = 0; k < m; k++) { + // And run over each occupied state + for (size_t j = 0; j < n; j++) { + // Get a vector of transition densities + // v[i]= phi[i]*f[k][:] + auto phix = + mul_sparse(world, ground_orbitals[j], f[k], FunctionDefaults<3>::get_thresh()); + // Clean up + truncate(world, phix); + // Apply operator to each member of vector + phix = apply(world, *coulop, phix); + // Clean up + truncate(world, phix); + // Final multiplication of each member of vector by a single function + phix = mul_sparse(world, ground_orbitals[j], phix, FunctionDefaults<3>::get_thresh()); + // Add the vector to result + gaxpy(world, 1.0, result[k], 1.0, phix); + } + } + + // Truncate + madness::truncate(world, result); + + // Done! + return result; } void TDDFT::make_nuclear_potential(World &world) { - molresponse::start_timer(world); - potential_manager = std::shared_ptr(new PotentialManager(molecule, r_params.core_type())); - potential_manager->make_nuclear_potential(world); + molresponse::start_timer(world); + potential_manager = + std::shared_ptr(new PotentialManager(molecule, r_params.core_type())); + potential_manager->make_nuclear_potential(world); } // Returns the ground state potential applied to functions f @@ -749,177 +747,163 @@ void TDDFT::make_nuclear_potential(World &world) { // result(i,j) = inner(a[i],b[j]).sum() Tensor TDDFT::expectation(World &world, const response_space &A, const response_space &B) { - // Get sizes - MADNESS_ASSERT(A.size() > 0); - MADNESS_ASSERT(A.size() == B.size()); - MADNESS_ASSERT(A[0].size() > 0); - MADNESS_ASSERT(A[0].size() == B[0].size()); - - size_t dim_1 = A.size(); - size_t dim_2 = A[0].size(); - // Need to take transpose of each input ResponseFunction - response_space A_t(world, dim_2, dim_1); - response_space B_t(world, dim_2, dim_1); - for (size_t i = 0; i < dim_1; i++) { - for (size_t j = 0; j < dim_2; j++) { - A_t[j][i] = A[i][j]; - B_t[j][i] = B[i][j]; - } - } - // Container for result - Tensor result(dim_1, dim_1); - /** + // Get sizes + MADNESS_ASSERT(A.size() > 0); + MADNESS_ASSERT(A.size() == B.size()); + MADNESS_ASSERT(A[0].size() > 0); + MADNESS_ASSERT(A[0].size() == B[0].size()); + + size_t dim_1 = A.size(); + size_t dim_2 = A[0].size(); + // Need to take transpose of each input ResponseFunction + response_space A_t(world, dim_2, dim_1); + response_space B_t(world, dim_2, dim_1); + for (size_t i = 0; i < dim_1; i++) { + for (size_t j = 0; j < dim_2; j++) { + A_t[j][i] = A[i][j]; + B_t[j][i] = B[i][j]; + } + } + // Container for result + Tensor result(dim_1, dim_1); + /** * @brief * [x1 x2 x3]T[x1 x2 x3] * */ - // Run over dimension two - // each vector in orbital has dim_1 response functoins associated - for (size_t p = 0; p < dim_2; p++) { - result += matrix_inner(world, A_t[p], B_t[p]); - } + // Run over dimension two + // each vector in orbital has dim_1 response functoins associated + for (size_t p = 0; p < dim_2; p++) { result += matrix_inner(world, A_t[p], B_t[p]); } - // Done - return result; + // Done + return result; } - -void TDDFT::PrintRFExpectation(World &world, - response_space f, - response_space g, - std::string fname, +void TDDFT::PrintRFExpectation(World &world, response_space f, response_space g, std::string fname, std::string gname) { - Tensor t = response_space_inner(f, g); - if (world.rank() == 0) { - print(" Expectation between ", fname, " and ", gname); - print(t); - } + Tensor t = response_space_inner(f, g); + if (world.rank() == 0) { + print(" Expectation between ", fname, " and ", gname); + print(t); + } } void TDDFT::PrintResponseVectorNorms(World &world, response_space f, std::string fname) { - if (world.rank() == 0) { - print(" Norms of ResVector: ", fname); - print(f.norm2()); - } + if (world.rank() == 0) { + print(" Norms of ResVector: ", fname); + print(f.norm2()); + } } // compute rms and maxabsval of vector of doubles void TDDFT::vector_stats(const std::vector &v, double &rms, double &maxabsval) const { - rms = 0.0; - maxabsval = v[0]; - for (size_t i = 0; i < v.size(); ++i) { - rms += v[i] * v[i]; - maxabsval = std::max(maxabsval, std::abs(v[i])); - } - rms = sqrt(rms / v.size()); + rms = 0.0; + maxabsval = v[0]; + for (size_t i = 0; i < v.size(); ++i) { + rms += v[i] * v[i]; + maxabsval = std::max(maxabsval, std::abs(v[i])); + } + rms = sqrt(rms / v.size()); } void TDDFT::vector_stats_new(const Tensor v, double &rms, double &maxabsval) const { - rms = 0.0; - for (size_t i = 0; i < v.size(); ++i) { - rms += v[i] * v[i]; - } - rms = sqrt(rms / v.size()); - maxabsval = v.max(); -} - - -double TDDFT::do_step_restriction(World &world, const vecfuncT &x, vecfuncT &x_new, std::string spin) const { - std::vector anorm = norm2s(world, sub(world, x, x_new)); - size_t nres = 0; - for (unsigned int i = 0; i < x.size(); ++i) { - print("anorm ", i, " : ", anorm[i]); - if (anorm[i] > r_params.maxrotn()) { - double s = r_params.maxrotn() / anorm[i]; - ++nres; - if (world.rank() == 0) { - if (nres == 1 and (r_params.print_level() > 1)) - printf(" restricting step for %s orbitals:", spin.c_str()); - printf(" %d", i); - } - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - x_new[i].truncate(); - } - } - if (nres > 0 && world.rank() == 0 and (r_params.print_level() > 1)) printf("\n"); - - world.gop.fence(); - double rms, maxval; - vector_stats(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; -} - -double TDDFT::do_step_restriction(World &world, - const vecfuncT &x, - vecfuncT &x_new, - std::string spin, - double maxrotn) const { - Tensor anorm = norm2s_T(world, sub(world, x, x_new)); - print("ANORM", anorm); - print("maxrotn: ", maxrotn); - for (unsigned int i = 0; i < x_new.size(); ++i) { - print("anorm ", i, " : ", anorm[i]); - if (anorm[i] > maxrotn) { - double s = maxrotn / anorm[i]; - /* + rms = 0.0; + for (size_t i = 0; i < v.size(); ++i) { rms += v[i] * v[i]; } + rms = sqrt(rms / v.size()); + maxabsval = v.max(); +} + + +double TDDFT::do_step_restriction(World &world, const vecfuncT &x, vecfuncT &x_new, + std::string spin) const { + std::vector anorm = norm2s(world, sub(world, x, x_new)); + size_t nres = 0; + for (unsigned int i = 0; i < x.size(); ++i) { + print("anorm ", i, " : ", anorm[i]); + if (anorm[i] > r_params.maxrotn()) { + double s = r_params.maxrotn() / anorm[i]; + ++nres; + if (world.rank() == 0) { + if (nres == 1 and (r_params.print_level() > 1)) + printf(" restricting step for %s orbitals:", spin.c_str()); + printf(" %d", i); + } + x_new[i].gaxpy(s, x[i], 1.0 - s, false); + x_new[i].truncate(); + } + } + if (nres > 0 && world.rank() == 0 and (r_params.print_level() > 1)) printf("\n"); + + world.gop.fence(); + double rms, maxval; + vector_stats(anorm, rms, maxval); + if (world.rank() == 0 and (r_params.print_level() > 1)) + print("Norm of vector changes", spin, ": rms", rms, " max", maxval); + return maxval; +} + +double TDDFT::do_step_restriction(World &world, const vecfuncT &x, vecfuncT &x_new, + std::string spin, double maxrotn) const { + Tensor anorm = norm2s_T(world, sub(world, x, x_new)); + print("ANORM", anorm); + print("maxrotn: ", maxrotn); + for (unsigned int i = 0; i < x_new.size(); ++i) { + print("anorm ", i, " : ", anorm[i]); + if (anorm[i] > maxrotn) { + double s = maxrotn / anorm[i]; + /* if (world.rank() == 0) { if (nres == 1 and (r_params.print_level() > 1)) printf(" restricting step for %s orbitals:", spin.c_str()); printf(" %d", i); } */ - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - // x_new[i].truncate(); - } - } - world.gop.fence(); - double rms, maxval; - vector_stats_new(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; -} - -double TDDFT::do_step_restriction(World &world, - const vecfuncT &x, - const vecfuncT &y, - vecfuncT &x_new, - vecfuncT &y_new, - std::string spin) const { - // sub(world, x, x_new) - vecfuncT x_diff = sub(world, x, x_new); - vecfuncT y_diff = sub(world, y, y_new); - - // sub(world, x, x_new) - Tensor anorm_x = norm2s_T(world, x_diff); - Tensor anorm_y = norm2s_T(world, y_diff); - Tensor anorm(x.size()); - for (unsigned int i = 0; i < x.size(); ++i) { - anorm[i] = std::sqrt(anorm_x[i] * anorm_x[i] + anorm_y[i] * anorm_y[i]); - } - - for (unsigned int i = 0; i < x.size(); ++i) { - if (anorm[i] > r_params.maxrotn()) { - double s = r_params.maxrotn() / anorm[i]; - size_t nres = 0; - if (world.rank() == 0) { - if (nres == 1 and (r_params.print_level() > 1)) - printf(" restricting step for %s orbitals:", spin.c_str()); - printf(" %d", i); - } - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - y_new[i].gaxpy(s, y[i], 1.0 - s, false); - } - } - - world.gop.fence(); - double rms, maxval; - vector_stats_new(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; + x_new[i].gaxpy(s, x[i], 1.0 - s, false); + // x_new[i].truncate(); + } + } + world.gop.fence(); + double rms, maxval; + vector_stats_new(anorm, rms, maxval); + if (world.rank() == 0 and (r_params.print_level() > 1)) + print("Norm of vector changes", spin, ": rms", rms, " max", maxval); + return maxval; +} + +double TDDFT::do_step_restriction(World &world, const vecfuncT &x, const vecfuncT &y, + vecfuncT &x_new, vecfuncT &y_new, std::string spin) const { + // sub(world, x, x_new) + vecfuncT x_diff = sub(world, x, x_new); + vecfuncT y_diff = sub(world, y, y_new); + + // sub(world, x, x_new) + Tensor anorm_x = norm2s_T(world, x_diff); + Tensor anorm_y = norm2s_T(world, y_diff); + Tensor anorm(x.size()); + for (unsigned int i = 0; i < x.size(); ++i) { + anorm[i] = std::sqrt(anorm_x[i] * anorm_x[i] + anorm_y[i] * anorm_y[i]); + } + + for (unsigned int i = 0; i < x.size(); ++i) { + if (anorm[i] > r_params.maxrotn()) { + double s = r_params.maxrotn() / anorm[i]; + size_t nres = 0; + if (world.rank() == 0) { + if (nres == 1 and (r_params.print_level() > 1)) + printf(" restricting step for %s orbitals:", spin.c_str()); + printf(" %d", i); + } + x_new[i].gaxpy(s, x[i], 1.0 - s, false); + y_new[i].gaxpy(s, y[i], 1.0 - s, false); + } + } + + world.gop.fence(); + double rms, maxval; + vector_stats_new(anorm, rms, maxval); + if (world.rank() == 0 and (r_params.print_level() > 1)) + print("Norm of vector changes", spin, ": rms", rms, " max", maxval); + return maxval; } // Construct the Hamiltonian @@ -927,618 +911,418 @@ double TDDFT::do_step_restriction(World &world, // -2.0 * (ground_state_energy + excited_state_energy) // is negative. Please note: The same shift needs to // be applied to the potential. -Tensor TDDFT::create_shift(World &world, - Tensor &ground, - Tensor &omega, - size_t print_level, - std::string xy) { - // Start a timer - if (print_level >= 1) molresponse::start_timer(world); - - // Get sizes - size_t m = omega.size(); - size_t n = ground.size(); - - // Container to hold shift - Tensor result(m, n); - - // Run over excited components - for (size_t k = 0; k < m; k++) { - // Run over ground components - for (size_t p = 0; p < n; p++) { - if (ground(p) + omega(k) > 0) { - // Calculate the shift needed to get energy to -0.05, - // which was arbitrary (same as moldft) - result(k, p) = -(ground(p) + omega(k) + 0.05); - - // Basic output - if (print_level >= 2) { - if (world.rank() == 0) - printf( - " Shift needed for transition from ground orbital %d to " - "response %s state %d\n", - static_cast(p), - xy.c_str(), - static_cast(k)); - if (world.rank() == 0) print(" Ground energy =", ground(p)); - if (world.rank() == 0) print(" Excited energy =", omega(k)); - if (world.rank() == 0) print(" Shifting by", result(k, p)); - if (world.rank() == 0) print(""); +Tensor TDDFT::create_shift(World &world, Tensor &ground, Tensor &omega, + size_t print_level, std::string xy) { + // Start a timer + if (print_level >= 1) molresponse::start_timer(world); + + // Get sizes + size_t m = omega.size(); + size_t n = ground.size(); + + // Container to hold shift + Tensor result(m, n); + + // Run over excited components + for (size_t k = 0; k < m; k++) { + // Run over ground components + for (size_t p = 0; p < n; p++) { + if (ground(p) + omega(k) > 0) { + // Calculate the shift needed to get energy to -0.05, + // which was arbitrary (same as moldft) + result(k, p) = -(ground(p) + omega(k) + 0.05); + + // Basic output + if (print_level >= 2) { + if (world.rank() == 0) + printf(" Shift needed for transition from ground orbital %d to " + "response %s state %d\n", + static_cast(p), xy.c_str(), static_cast(k)); + if (world.rank() == 0) print(" Ground energy =", ground(p)); + if (world.rank() == 0) print(" Excited energy =", omega(k)); + if (world.rank() == 0) print(" Shifting by", result(k, p)); + if (world.rank() == 0) print(""); + } + } } - } } - } - // End timer - if (print_level >= 1) molresponse::end_timer(world, "Create shift:"); + // End timer + if (print_level >= 1) molresponse::end_timer(world, "Create shift:"); - // Done - return result; + // Done + return result; } // Returns the shift needed to make sure that // (ground_state_energy + excited_state_energy + shift) = target // Please note: The same shift needs to be applied to the potential. -Tensor TDDFT::create_shift_target(World &world, - Tensor &ground, - Tensor &omega, - double target, - size_t print_level, +Tensor TDDFT::create_shift_target(World &world, Tensor &ground, + Tensor &omega, double target, size_t print_level, std::string xy) { - // Start a timer - if (print_level >= 1) molresponse::start_timer(world); - - // Get sizes - size_t m = omega.size(); - size_t n = ground.size(); - - // Container to hold shift - Tensor result(m, n); - - // Run over excited components - for (size_t k = 0; k < m; k++) { - // Run over ground components - for (size_t p = 0; p < n; p++) { - // Calculate the shift needed to get energy to target - result(k, p) = -(ground(p) + omega(k) - target); - - // Basic output - if (print_level >= 2) { - if (world.rank() == 0) - printf( - " Shift needed for transition from ground orbital %d to " - "response %s state %d\n", - static_cast(p), - xy.c_str(), - static_cast(k)); - if (world.rank() == 0) print(" Ground energy =", ground(p)); - if (world.rank() == 0) print(" Excited energy =", omega(k)); - if (world.rank() == 0) print(" Shifting by", result(k, p)); - if (world.rank() == 0) print(""); - } + // Start a timer + if (print_level >= 1) molresponse::start_timer(world); + + // Get sizes + size_t m = omega.size(); + size_t n = ground.size(); + + // Container to hold shift + Tensor result(m, n); + + // Run over excited components + for (size_t k = 0; k < m; k++) { + // Run over ground components + for (size_t p = 0; p < n; p++) { + // Calculate the shift needed to get energy to target + result(k, p) = -(ground(p) + omega(k) - target); + + // Basic output + if (print_level >= 2) { + if (world.rank() == 0) + printf(" Shift needed for transition from ground orbital %d to " + "response %s state %d\n", + static_cast(p), xy.c_str(), static_cast(k)); + if (world.rank() == 0) print(" Ground energy =", ground(p)); + if (world.rank() == 0) print(" Excited energy =", omega(k)); + if (world.rank() == 0) print(" Shifting by", result(k, p)); + if (world.rank() == 0) print(""); + } + } } - } - // End timer - if (print_level >= 1) molresponse::end_timer(world, "Create shift:"); + // End timer + if (print_level >= 1) molresponse::end_timer(world, "Create shift:"); - // Done - return result; + // Done + return result; } // Returns the given shift applied to the given potential -response_space TDDFT::apply_shift(World &world, - Tensor &shifts, - response_space &V, +response_space TDDFT::apply_shift(World &world, Tensor &shifts, response_space &V, response_space &f) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); - // Sizes inferred from V - size_t n = V[0].size(); - size_t m = V.size(); + // Sizes inferred from V + size_t n = V[0].size(); + size_t m = V.size(); - // Container to return - response_space shifted_V(world, m, n); + // Container to return + response_space shifted_V(world, m, n); - // Run over occupied - for (size_t k = 0; k < m; k++) { - // Run over virtual - for (size_t p = 0; p < n; p++) { - shifted_V[k][p] = V[k][p] + shifts(k, p) * f[k][p]; + // Run over occupied + for (size_t k = 0; k < m; k++) { + // Run over virtual + for (size_t p = 0; p < n; p++) { shifted_V[k][p] = V[k][p] + shifts(k, p) * f[k][p]; } } - } - shifted_V.truncate_rf(); + shifted_V.truncate_rf(); - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply shift:"); + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply shift:"); - // Done - return shifted_V; + // Done + return shifted_V; } // Returns the given shift applied to the given potential -response_space TDDFT::apply_shift(World &world, double &shift, response_space &V, response_space &f) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); +response_space TDDFT::apply_shift(World &world, double &shift, response_space &V, + response_space &f) { + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); - // Sizes inferred from V - size_t n = V[0].size(); - size_t m = V.size(); + // Sizes inferred from V + size_t n = V[0].size(); + size_t m = V.size(); - // Container to return - response_space shifted_V(world, m, n); + // Container to return + response_space shifted_V(world, m, n); - // Run over occupied - for (size_t k = 0; k < m; k++) { - // Run over virtual - for (size_t p = 0; p < n; p++) { - shifted_V[k][p] = V[k][p] + shift * f[k][p]; + // Run over occupied + for (size_t k = 0; k < m; k++) { + // Run over virtual + for (size_t p = 0; p < n; p++) { shifted_V[k][p] = V[k][p] + shift * f[k][p]; } } - } - shifted_V.truncate_rf(); + shifted_V.truncate_rf(); - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply shift:"); + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply shift:"); - // Done - return shifted_V; + // Done + return shifted_V; } // Function to make a vector of BSH operators using ground and excited // state energies std::vector>> TDDFT::create_bsh_operators( - World &world, - Tensor &shift, - Tensor &ground, - Tensor &omega, - double lo, - double thresh) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from ground and omega - size_t n = ground.size(); - size_t m = omega.size(); - - // Make the vector - std::vector>> operators; - - // Make a BSH operator for each response function - // Run over excited components - for (size_t k = 0; k < m; k++) { - // Container for intermediary - std::vector> temp(n); + World &world, Tensor &shift, Tensor &ground, Tensor &omega, + double lo, double thresh) { + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); - // Run over occupied components - for (size_t p = 0; p < n; p++) { - double mu = sqrt(-2.0 * (ground(p) + omega(k) + shift(k, p))); - print("res state ", k, " orb ", p, " bsh exponent mu :", mu); - temp[p] = std::shared_ptr>(BSHOperatorPtr3D(world, mu, lo, thresh)); - } + // Sizes inferred from ground and omega + size_t n = ground.size(); + size_t m = omega.size(); + + // Make the vector + std::vector>> operators; + + // Make a BSH operator for each response function + // Run over excited components + for (size_t k = 0; k < m; k++) { + // Container for intermediary + std::vector> temp(n); + + // Run over occupied components + for (size_t p = 0; p < n; p++) { + double mu = sqrt(-2.0 * (ground(p) + omega(k) + shift(k, p))); + print("res state ", k, " orb ", p, " bsh exponent mu :", mu); + temp[p] = std::shared_ptr>( + BSHOperatorPtr3D(world, mu, lo, thresh)); + } - // Add intermediary to return container - operators.push_back(temp); - } + // Add intermediary to return container + operators.push_back(temp); + } - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); - // Done - return operators; + // Done + return operators; } // Function to make a vector of BSH operators using ground and excited // state energies -std::vector>> TDDFT::CreateBSHOperatorPropertyVector( - World &world, - Tensor &shift, - Tensor &ground, - Tensor &omega, - double lo, - double thresh) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from ground and omega - size_t n = ground.size(); // number of orbitals - size_t num_states = r_params.num_states(); - size_t num_freq = omega.size(); // number of frequency states - // print("num of freq", num_freq); - - // Make the vector - std::vector>> operators; - - // Make a BSH operator for each response function - // Run over excited components - // print("num of states bsh step", num_states); - for (size_t k = 0; k < num_freq; k++) { - // Container for intermediary - std::vector> temp(n); - for (size_t state = 0; state < num_states; state++) { - // Run over occupied components - for (size_t p = 0; p < n; p++) { - temp[p] = std::shared_ptr>( - BSHOperatorPtr3D(world, sqrt(-2.0 * (ground(p) + omega(k) + shift(k, p))), lo, thresh)); - } - operators.push_back(temp); - } +std::vector>> +TDDFT::CreateBSHOperatorPropertyVector(World &world, Tensor &shift, Tensor &ground, + Tensor &omega, double lo, double thresh) { + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); - // Add intermediary to return container - } + // Sizes inferred from ground and omega + size_t n = ground.size();// number of orbitals + size_t num_states = r_params.num_states(); + size_t num_freq = omega.size();// number of frequency states + // print("num of freq", num_freq); + + // Make the vector + std::vector>> operators; + + // Make a BSH operator for each response function + // Run over excited components + // print("num of states bsh step", num_states); + for (size_t k = 0; k < num_freq; k++) { + // Container for intermediary + std::vector> temp(n); + for (size_t state = 0; state < num_states; state++) { + // Run over occupied components + for (size_t p = 0; p < n; p++) { + temp[p] = std::shared_ptr>(BSHOperatorPtr3D( + world, sqrt(-2.0 * (ground(p) + omega(k) + shift(k, p))), lo, thresh)); + } + operators.push_back(temp); + } - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); + // Add intermediary to return container + } + + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); - // Done - return operators; + // Done + return operators; } -std::vector TDDFT::make_bsh_operators_response(World &world, double &shift, double &omega) const { - if (r_params.print_level() >= 1) molresponse::start_timer(world); - double tol = FunctionDefaults<3>::get_thresh(); - // Sizes inferred from ground and omega - size_t num_orbitals = ground_energies.size(); // number of orbitals - std::vector ops(num_orbitals); - // Run over occupied components - for (size_t p = 0; p < num_orbitals; p++) { - double mu = sqrt(-2.0 * (ground_energies(p) + omega + shift)); - ops[p] = poperatorT(BSHOperatorPtr3D(world, mu, r_params.lo(), tol)); - } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "make bsh operators response"); - } - return ops; - // End timer +std::vector TDDFT::make_bsh_operators_response(World &world, double &shift, + double &omega) const { + if (r_params.print_level() >= 1) molresponse::start_timer(world); + double tol = FunctionDefaults<3>::get_thresh(); + // Sizes inferred from ground and omega + size_t num_orbitals = ground_energies.size();// number of orbitals + std::vector ops(num_orbitals); + // Run over occupied components + for (size_t p = 0; p < num_orbitals; p++) { + double mu = sqrt(-2.0 * (ground_energies(p) + omega + shift)); + ops[p] = poperatorT(BSHOperatorPtr3D(world, mu, r_params.lo(), tol)); + } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "make bsh operators response"); + } + return ops; + // End timer } // shift std::vector> TDDFT::CreateBSHOperatorPropertyVector( - World &world, - double &shift, - Tensor &ground, - double &omega, - double lo, - double eps) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from ground and omega - size_t num_ground_states = ground.size(); // number of orbitals - // print("num of freq", num_freq); - - // Make the vector - std::vector> ghat_operators(num_ground_states); - - // Make a BSH operator for each response function - // Run over excited components - // print("num of states bsh step", num_states); - // Container for intermediary - // Run over occupied components - for (size_t p = 0; p < num_ground_states; p++) { - double mu = sqrt(-2.0 * (ground(p) + omega + shift)); - ghat_operators[p] = - std::shared_ptr>(BSHOperatorPtr3D(world, mu, lo, eps)); - } - // Add intermediary to return container - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); - - // Done - return ghat_operators; -} - -void TDDFT::update_x_space_response(World &world, - X_space &Chi, - X_space &res, - XCOperator &xc, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, - QProjector &projector, - double &x_shifts, - double &omega_n, - NonLinearXsolver &kain_x_space, - std::vector Xvector, - std::vector Xresidual, - Tensor &bsh_residualsX, - Tensor &bsh_residualsY, - size_t iteration, - Tensor &maxrotn) { - size_t m = Chi.num_states(); - bool compute_y = r_params.omega() != 0.0; - // size_t n = Chi.num_orbitals(); - - Tensor errX(m); - Tensor errY(m); - - X_space theta_X = Compute_Theta_X(world, Chi, xc, r_params.calc_type()); - // compute residual X_space - print("BSH update iter = ", iteration); - - X_space temp = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - - res = compute_residual(world, Chi, temp, bsh_residualsX, bsh_residualsY, r_params.calc_type()); - - // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 0)) { - temp = kain_x_space_update(world, Chi, res, kain_x_space, Xvector, Xresidual); - if (r_params.print_level() >= 1) { - compute_and_print_polarizability(world, temp, PQ, ""); + World &world, double &shift, Tensor &ground, double &omega, double lo, double eps) { + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + + // Sizes inferred from ground and omega + size_t num_ground_states = ground.size();// number of orbitals + // print("num of freq", num_freq); + + // Make the vector + std::vector> ghat_operators(num_ground_states); + + // Make a BSH operator for each response function + // Run over excited components + // print("num of states bsh step", num_states); + // Container for intermediary + // Run over occupied components + for (size_t p = 0; p < num_ground_states; p++) { + double mu = sqrt(-2.0 * (ground(p) + omega + shift)); + ghat_operators[p] = std::shared_ptr>( + BSHOperatorPtr3D(world, mu, lo, eps)); } - } + // Add intermediary to return container - if (iteration > 0) { - x_space_step_restriction(world, Chi, temp, compute_y, maxrotn); - if (r_params.print_level() >= 1) { - compute_and_print_polarizability(world, temp, PQ, ""); - } - } - - if (r_params.print_level() >= 1) { - compute_and_print_polarizability(world, temp, PQ, ""); - } - - // truncate x - temp.X.truncate_rf(); - // truncate y if compute y - if (compute_y) temp.Y.truncate_rf(); - // if not compute y then copy x in to y - if (!compute_y) temp.Y = temp.X.copy(); - - Chi = temp.copy(); - if (r_params.print_level() >= 1) { - compute_and_print_polarizability(world, Chi, PQ, ""); - } - // print x norms -} - -// computes res and bsh_residualsX -X_space TDDFT::compute_residual(World &world, - X_space &old_Chi, - X_space &temp, - Tensor &bsh_residualsX, - Tensor &bsh_residualsY, - std::string calc_type) { - size_t m = old_Chi.X.size(); - size_t n = old_Chi.X.size_orbitals(); - molresponse::start_timer(world); - // compute residual - X_space res(world, m, n); - res.X = old_Chi.X - temp.X; - // - if (calc_type.compare("full") == 0) { - res.Y = old_Chi.Y - temp.Y; - } else if (calc_type.compare("static") == 0) { - res.Y = res.X.copy(); - } else { - } - //************************* - Tensor errX(m); - Tensor errY(m); - // rmsX and maxvalX for each m response states - std::vector rmsX(m), maxvalX(m); - std::vector> rnormsX; - std::vector> rnormsY; - // find the norms of each of the residual response vectors - for (size_t i = 0; i < m; i++) { - // the 2norms of each of the orbitals in response vector - rnormsX.push_back(norm2s(world, res.X[i])); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("residuals X: state ", i, " : ", rnormsX[i]); - // maxabsval = std::max(maxabsval, std::abs(v[i])); - // maxvalX= largest abs(v[i]) - vector_stats(rnormsX[i], rmsX[i], maxvalX[i]); - // errX[i] is the largest residual orbital value - errX[i] = maxvalX[i]; - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("BSH residual: rms", rmsX[i], " max", maxvalX[i]); - } - if (calc_type.compare("full") == 0) { - std::vector rmsY(m), maxvalY(m); - for (size_t i = 0; i < m; i++) { - rnormsY.push_back(norm2s(world, res.Y[i])); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("residuals Y: state ", i, " : ", rnormsY[i]); - vector_stats(rnormsY[i], rmsY[i], maxvalY[i]); - errY[i] = maxvalY[i]; - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("BSH residual: rms", rmsY[i], " max", maxvalY[i]); - } - } else if (calc_type.compare("static") == 0) { - // copy by value? - errY = errX; - } else { // tda - errY.fill(0); - } - molresponse::end_timer(world, "BSH residual"); - - if (r_params.print_level() >= 1) { - print("res.X norms in iteration after compute_residual function: "); - print(res.X.norm2()); - - print("res.Y norms in iteration after compute_residual function: "); - print(res.Y.norm2()); - } - // the max error in residual - bsh_residualsX = errX; - bsh_residualsY = errY; - // Apply shifts and rhs - // Next calculate 2-norm of these vectors of differences - return res; + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); + + // Done + return ghat_operators; } + void TDDFT::print_residual_norms(World &world, X_space &res, bool compute_y, size_t iteration) { - long m = static_cast(res.num_states()); - - Tensor x_norms(m); - Tensor y_norms(m); - for (long i = 0; i < m; i++) x_norms(i) = norm2(world, res.X[i]); - if (compute_y) { - for (size_t i = 0; i < m; i++) y_norms(i) = norm2(world, res.Y[i]); - } - if (r_params.print_level() >= 0 and world.rank() == 0) { + long m = static_cast(res.num_states()); + + Tensor x_norms(m); + Tensor y_norms(m); + for (long i = 0; i < m; i++) x_norms(i) = norm2(world, res.X[i]); if (compute_y) { - std::cout << "res " << iteration << " X :"; - for (long i(0); i < m; i++) { - std::cout << x_norms[i] << " "; - } - std::cout << " Y :"; - for (long i(0); i < m; i++) { - std::cout << y_norms[i] << " "; - } - std::cout << endl; - } else { - print("resX ", iteration, " :", x_norms); + for (size_t i = 0; i < m; i++) y_norms(i) = norm2(world, res.Y[i]); + } + if (r_params.print_level() >= 0 and world.rank() == 0) { + if (compute_y) { + std::cout << "res " << iteration << " X :"; + for (long i(0); i < m; i++) { std::cout << x_norms[i] << " "; } + std::cout << " Y :"; + for (long i(0); i < m; i++) { std::cout << y_norms[i] << " "; } + std::cout << endl; + } else { + print("resX ", iteration, " :", x_norms); + } } - } } -X_space TDDFT::bsh_update_response(World &world, - X_space &theta_X, +X_space TDDFT::bsh_update_response(World &world, X_space &theta_X, std::vector &bsh_x_ops, std::vector &bsh_y_ops, - QProjector &projector, - double &x_shifts) { - size_t m = theta_X.X.size(); - size_t n = theta_X.X.size_orbitals(); - bool compute_y = r_params.omega() != 0.0; - - molresponse::start_timer(world); - - theta_X.X += Chi.X * x_shifts; - theta_X.X += PQ.X; - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - - if (compute_y) { - theta_X.Y += PQ.Y; - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); - } - molresponse::end_timer(world, "Compute residual stuff theta_X"); - - // apply bsh - molresponse::start_timer(world); - X_space bsh_X(world, m, n); - - bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) { - bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - } - molresponse::end_timer(world, "Apply BSH to theta_X"); - - molresponse::start_timer(world); - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); - - if (compute_y) { - for (size_t i = 0; i < m; i++) { - bsh_X.Y[i] = projector(bsh_X.Y[i]); + QProjector &projector, double &x_shifts) { + size_t m = theta_X.X.size(); + size_t n = theta_X.X.size_orbitals(); + bool compute_y = r_params.omega() != 0.0; + + molresponse::start_timer(world); + + theta_X.X += Chi.X * x_shifts; + theta_X.X += PQ.X; + theta_X.X = theta_X.X * -2; + theta_X.X.truncate_rf(); + + if (compute_y) { + theta_X.Y += PQ.Y; + theta_X.Y = theta_X.Y * -2; + theta_X.Y.truncate_rf(); } - bsh_X.truncate(); - } else { - bsh_X.X.truncate_rf(); - bsh_X.Y = bsh_X.X.copy(); - } - molresponse::end_timer(world, "Project and truncate BSH_X"); - - return bsh_X; -} - -void TDDFT::update_x_space_excited(World &world, - X_space &old_Chi, - X_space &Chi, - X_space &old_Lambda_X, - X_space &res, - XCOperator &xc, - QProjector &projector, - Tensor &omega, - NonLinearXsolver &kain_x_space, - std::vector &Xvector, - std::vector &Xresidual, - Tensor &energy_residuals, - Tensor &old_energy, - Tensor &bsh_residualsX, - Tensor &bsh_residualsY, - Tensor &S, - Tensor &old_S, - Tensor &A, - Tensor &old_A, - size_t iter, - Tensor &maxrotn) { - size_t m = Chi.num_states(); - bool compute_y = not r_params.tda(); - - Tensor x_shifts(m); - Tensor y_shifts(m); - print("Entering Compute Lambda"); - - if (compute_y) { - gram_schmidt(world, Chi.X, Chi.Y); - normalize(world, Chi); - } else { - gram_schmidt(world, Chi.X); - normalize(world, Chi.X); - } - // - X_space Lambda_X = Compute_Lambda_X(world, Chi, xc, r_params.calc_type()); - // This diagonalizes XAX and computes new omegas - // updates Chi - print("omega before transform"); - print(omega); - old_energy = omega; - compute_new_omegas_transform(world, - old_Chi, - Chi, - old_Lambda_X, - Lambda_X, - omega, - old_energy, - S, - old_S, - A, - old_A, - energy_residuals, - iter); - // now Chi is rotated to new position - // roatate Chi and old Chi saves this value - // old_Chi = Chi.copy(); - - print("omega before transform"); - print(old_energy); - print("omega after transform"); - print(omega); - // Analysis gets messed up if BSH is last thing applied - // so exit early if last iteration - if (iter == r_params.maxiter() - 1) { - print("Reached max iter"); - } else { - X_space theta_X = Compute_Theta_X(world, Chi, xc, r_params.calc_type()); - // Calculates shifts needed for potential / energies - print("BSH update iter = ", iter); - X_space temp = bsh_update_excited(world, omega, theta_X, projector); - - res = compute_residual(world, Chi, temp, bsh_residualsX, bsh_residualsY, r_params.calc_type()); - // kain if iteration >0 or first run where there should not be a problem - // computed temp and res - if (r_params.kain() && (iter > 0) && true) { - temp = kain_x_space_update(world, Chi, res, kain_x_space, Xvector, Xresidual); + molresponse::end_timer(world, "Compute residual stuff theta_X"); + + // apply bsh + molresponse::start_timer(world); + X_space bsh_X(world, m, n); + + bsh_X.X = apply(world, bsh_x_ops, theta_X.X); + if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + molresponse::end_timer(world, "Apply BSH to theta_X"); + + molresponse::start_timer(world); + // Project out ground state + for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); + + if (compute_y) { + for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } + bsh_X.truncate(); + } else { + bsh_X.X.truncate_rf(); + bsh_X.Y = bsh_X.X.copy(); } - if (iter > 0) { - x_space_step_restriction(world, Chi, temp, compute_y, maxrotn); + molresponse::end_timer(world, "Project and truncate BSH_X"); + + return bsh_X; +} + +void TDDFT::update_x_space_excited(World &world, X_space &old_Chi, X_space &Chi, + X_space &old_Lambda_X, X_space &res, XCOperator &xc, + QProjector &projector, Tensor &omega, + NonLinearXsolver &kain_x_space, std::vector &Xvector, + std::vector &Xresidual, + Tensor &energy_residuals, Tensor &old_energy, + Tensor &bsh_residualsX, Tensor &bsh_residualsY, + Tensor &S, Tensor &old_S, Tensor &A, + Tensor &old_A, size_t iter, Tensor &maxrotn) { + size_t m = Chi.num_states(); + bool compute_y = not r_params.tda(); + + Tensor x_shifts(m); + Tensor y_shifts(m); + print("Entering Compute Lambda"); + + if (compute_y) { + gram_schmidt(world, Chi.X, Chi.Y); + normalize(world, Chi); + } else { + gram_schmidt(world, Chi.X); + normalize(world, Chi.X); } + // + X_space Lambda_X = Compute_Lambda_X(world, Chi, xc, r_params.calc_type()); + // This diagonalizes XAX and computes new omegas + // updates Chi + print("omega before transform"); + print(omega); + old_energy = omega; + compute_new_omegas_transform(world, old_Chi, Chi, old_Lambda_X, Lambda_X, omega, old_energy, S, + old_S, A, old_A, energy_residuals, iter); + // now Chi is rotated to new position + // roatate Chi and old Chi saves this value + // old_Chi = Chi.copy(); + + print("omega before transform"); + print(old_energy); + print("omega after transform"); + print(omega); + // Analysis gets messed up if BSH is last thing applied + // so exit early if last iteration + if (iter == r_params.maxiter() - 1) { + print("Reached max iter"); + } else { + X_space theta_X = Compute_Theta_X(world, Chi, xc, r_params.calc_type()); + // Calculates shifts needed for potential / energies + print("BSH update iter = ", iter); + X_space temp = bsh_update_excited(world, omega, theta_X, projector); + + res = compute_residual(world, Chi, temp, bsh_residualsX, bsh_residualsY, + r_params.calc_type()); + // kain if iteration >0 or first run where there should not be a problem + // computed temp and res + if (r_params.kain() && (iter > 0) && true) { + temp = kain_x_space_update(world, Chi, res, kain_x_space, Xvector, Xresidual); + } + if (iter > 0) { x_space_step_restriction(world, Chi, temp, compute_y, maxrotn); } - temp.X.truncate_rf(); - if (compute_y) temp.Y.truncate_rf(); - Chi = temp.copy(); - // print x norms - } + temp.X.truncate_rf(); + if (compute_y) temp.Y.truncate_rf(); + Chi = temp.copy(); + // print x norms + } - // Apply mask - /* + // Apply mask + /* for (size_t i = 0; i < m; i++) Chi.X[i] = mask * Chi.X[i]; if (not r_params.tda()) { for (size_t i = 0; i < m; i++) Chi.Y[i] = mask * Chi.Y[i]; @@ -1547,44 +1331,37 @@ for (size_t i = 0; i < m; i++) Chi.Y[i] = mask * Chi.Y[i]; } // Load Balancing -void TDDFT::compute_new_omegas_transform(World &world, - X_space &old_Chi, - X_space &Chi, - X_space &old_Lambda_X, - X_space &Lambda_X, - Tensor &omega, - Tensor &old_energy, - Tensor &S, - Tensor &old_S, - Tensor &A, - Tensor &old_A, - Tensor &energy_residuals, - size_t iter) { - size_t m = Chi.X.size(); - bool compute_y = not r_params.tda(); - // Basic output - if (r_params.print_level() >= 1 and world.rank() == 0) { - print("Before Deflate"); - print("\n Excitation Energies:"); - print("i=", iter, " roots: ", iter, omega); - } - if (!compute_y) { - deflateTDA(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, old_S, old_A, omega, iter, m); - // Constructing S - // Full TDHF - } else { - deflateFull(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, old_S, old_A, omega, iter, m); - } - - // Basic output - if (r_params.print_level() >= 1 and world.rank() == 0) { - print("After Deflate"); - print("\n Excitation Energies:"); - print("i=", iter, " roots: ", iter, omega); - } - - // Calculate energy residual and update old_energy - energy_residuals = abs(omega - old_energy); +void TDDFT::compute_new_omegas_transform(World &world, X_space &old_Chi, X_space &Chi, + X_space &old_Lambda_X, X_space &Lambda_X, + Tensor &omega, Tensor &old_energy, + Tensor &S, Tensor &old_S, + Tensor &A, Tensor &old_A, + Tensor &energy_residuals, size_t iter) { + size_t m = Chi.X.size(); + bool compute_y = not r_params.tda(); + // Basic output + if (r_params.print_level() >= 1 and world.rank() == 0) { + print("Before Deflate"); + print("\n Excitation Energies:"); + print("i=", iter, " roots: ", iter, omega); + } + if (!compute_y) { + deflateTDA(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, old_S, old_A, omega, iter, m); + // Constructing S + // Full TDHF + } else { + deflateFull(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, old_S, old_A, omega, iter, m); + } + + // Basic output + if (r_params.print_level() >= 1 and world.rank() == 0) { + print("After Deflate"); + print("\n Excitation Energies:"); + print("i=", iter, " roots: ", iter, omega); + } + + // Calculate energy residual and update old_energy + energy_residuals = abs(omega - old_energy); } /** @@ -1601,64 +1378,63 @@ void TDDFT::compute_new_omegas_transform(World &world, * @param converged * @return X_space */ -X_space TDDFT::bsh_update_excited(World &world, - const Tensor &omega, - X_space &theta_X, +X_space TDDFT::bsh_update_excited(World &world, const Tensor &omega, X_space &theta_X, QProjector &projector) { - size_t m = theta_X.num_states(); - size_t n = theta_X.num_orbitals(); - bool compute_y = !r_params.tda(); - Tensor x_shifts(m); - Tensor y_shifts(m); - print("omega before shifts"); - Tensor omega_plus = omega; - Tensor omega_minus = -omega; - print(omega); - x_shifts = create_shift(world, ground_energies, omega_plus, r_params.print_level(), "x"); - // Compute Theta X - // Apply the shifts - theta_X.X = apply_shift(world, x_shifts, theta_X.X, Chi.X); - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - if (compute_y) { - // theta_X.Y = apply_shift(world, y_shifts, theta_X.Y, Chi.Y); - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); - } - // Construct BSH operators - std::vector>> bsh_x_ops = create_bsh_operators( - world, x_shifts, ground_energies, omega_plus, r_params.lo(), FunctionDefaults<3>::get_thresh()); - std::vector>> bsh_y_ops; - if (compute_y) { + size_t m = theta_X.num_states(); + size_t n = theta_X.num_orbitals(); + bool compute_y = !r_params.tda(); + Tensor x_shifts(m); + Tensor y_shifts(m); + print("omega before shifts"); + Tensor omega_plus = omega; Tensor omega_minus = -omega; - bsh_y_ops = create_bsh_operators( - world, y_shifts, ground_energies, omega_minus, r_params.lo(), FunctionDefaults<3>::get_thresh()); - } - X_space bsh_X(world, m, n); - // Apply BSH and get updated response components - bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); - if (compute_y) { - for (size_t i = 0; i < m; i++) bsh_X.Y[i] = projector(bsh_X.Y[i]); - } - - // Only update non-converged components - for (size_t i = 0; i < m; i++) { - bsh_X.X[i] = bsh_X.X[i]; - bsh_X.X[i] = mask * bsh_X.X[i]; + print(omega); + x_shifts = create_shift(world, ground_energies, omega_plus, r_params.print_level(), "x"); + // Compute Theta X + // Apply the shifts + theta_X.X = apply_shift(world, x_shifts, theta_X.X, Chi.X); + theta_X.X = theta_X.X * -2; + theta_X.X.truncate_rf(); if (compute_y) { - bsh_X.Y[i] = bsh_X.Y[i]; - bsh_X.Y[i] = mask * bsh_X.Y[i]; + // theta_X.Y = apply_shift(world, y_shifts, theta_X.Y, Chi.Y); + theta_X.Y = theta_X.Y * -2; + theta_X.Y.truncate_rf(); + } + // Construct BSH operators + std::vector>> bsh_x_ops = + create_bsh_operators(world, x_shifts, ground_energies, omega_plus, r_params.lo(), + FunctionDefaults<3>::get_thresh()); + std::vector>> bsh_y_ops; + if (compute_y) { + Tensor omega_minus = -omega; + bsh_y_ops = create_bsh_operators(world, y_shifts, ground_energies, omega_minus, + r_params.lo(), FunctionDefaults<3>::get_thresh()); } - } - // Ensure orthogonal guesses + X_space bsh_X(world, m, n); + // Apply BSH and get updated response components + bsh_X.X = apply(world, bsh_x_ops, theta_X.X); + if (compute_y) bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - bsh_X.truncate(); + // Project out ground state + for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); + if (compute_y) { + for (size_t i = 0; i < m; i++) bsh_X.Y[i] = projector(bsh_X.Y[i]); + } - return bsh_X; + // Only update non-converged components + for (size_t i = 0; i < m; i++) { + bsh_X.X[i] = bsh_X.X[i]; + bsh_X.X[i] = mask * bsh_X.X[i]; + if (compute_y) { + bsh_X.Y[i] = bsh_X.Y[i]; + bsh_X.Y[i] = mask * bsh_X.Y[i]; + } + } + // Ensure orthogonal guesses + + bsh_X.truncate(); + + return bsh_X; } /** @@ -1672,70 +1448,61 @@ X_space TDDFT::bsh_update_excited(World &world, * @param Xresidual * @return X_space */ -X_space TDDFT::kain_x_space_update(World &world, - const X_space &temp, - const X_space &res, - NonLinearXsolver &kain_x_space, - std::vector &Xvector, +X_space TDDFT::kain_x_space_update(World &world, const X_space &temp, const X_space &res, + NonLinearXsolver &kain_x_space, std::vector &Xvector, std::vector &Xresidual) { - size_t m = temp.num_states(); - size_t n = temp.num_orbitals(); - X_space kain_update(world, m, n); - molresponse::start_timer(world); - for (size_t b = 0; b < m; b++) { - Xvector[b].X[0] = copy(world, temp.X[b]); - Xvector[b].Y[0] = copy(world, temp.Y[b]); - Xresidual[b].X[0] = copy(world, res.X[b]); - Xresidual[b].Y[0] = copy(world, res.Y[b]); - } - - for (size_t b = 0; b < m; b++) { - // passing xvectors - X_vector kain_X = - kain_x_space[b].update(Xvector[b], Xresidual[b], FunctionDefaults<3>::get_thresh(), 3.0); - // deep copy of vector of functions - kain_update.X[b] = copy(world, kain_X.X[0]); - kain_update.Y[b] = copy(world, kain_X.Y[0]); - } - molresponse::end_timer(world, " KAIN update:"); - return kain_update; -} - -void TDDFT::x_space_step_restriction(World &world, - X_space &old_Chi, - X_space &temp, - bool restrict_y, + size_t m = temp.num_states(); + size_t n = temp.num_orbitals(); + X_space kain_update(world, m, n); + molresponse::start_timer(world); + for (size_t b = 0; b < m; b++) { + Xvector[b].X[0] = copy(world, temp.X[b]); + Xvector[b].Y[0] = copy(world, temp.Y[b]); + Xresidual[b].X[0] = copy(world, res.X[b]); + Xresidual[b].Y[0] = copy(world, res.Y[b]); + } + + for (size_t b = 0; b < m; b++) { + // passing xvectors + X_vector kain_X = kain_x_space[b].update(Xvector[b], Xresidual[b], + FunctionDefaults<3>::get_thresh(), 3.0); + // deep copy of vector of functions + kain_update.X[b] = copy(world, kain_X.X[0]); + kain_update.Y[b] = copy(world, kain_X.Y[0]); + } + molresponse::end_timer(world, " KAIN update:"); + return kain_update; +} + +void TDDFT::x_space_step_restriction(World &world, X_space &old_Chi, X_space &temp, bool restrict_y, Tensor &maxrotn) { - size_t m = old_Chi.num_states(); - molresponse::start_timer(world); - print(maxrotn); - - for (size_t b = 0; b < m; b++) { - if (true) { - // do_step_restriction(world, old_Chi.X[b], temp.X[b], old_Chi.Y[b], - // temp.Y[b], "x and y_response"); if the norm(new-old) > max - do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn[b]); - - do_step_restriction(world, old_Chi.Y[b], temp.Y[b], "y_response", maxrotn[b]); - // do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response"); - // do_step_restriction(world, old_Chi.Y[b], temp.Y[b], "y_response"); - } else { - do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn[b]); + size_t m = old_Chi.num_states(); + molresponse::start_timer(world); + print(maxrotn); + + for (size_t b = 0; b < m; b++) { + if (true) { + // do_step_restriction(world, old_Chi.X[b], temp.X[b], old_Chi.Y[b], + // temp.Y[b], "x and y_response"); if the norm(new-old) > max + do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn[b]); + + do_step_restriction(world, old_Chi.Y[b], temp.Y[b], "y_response", maxrotn[b]); + // do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response"); + // do_step_restriction(world, old_Chi.Y[b], temp.Y[b], "y_response"); + } else { + do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn[b]); + } } - } - molresponse::end_timer(world, " Step Restriction:"); + molresponse::end_timer(world, " Step Restriction:"); } // Returns the second order update to the energies of the excited components // Not currently used. -Tensor TDDFT::calculate_energy_update(World &world, - response_space &rhs, - response_space &f_residuals, - response_space &new_f, - size_t print_level, - std::string xy) { - /* +Tensor TDDFT::calculate_energy_update(World &world, response_space &rhs, + response_space &f_residuals, response_space &new_f, + size_t print_level, std::string xy) { + /* * The correction is: * \delta \omega^{(k)} = - \frac{ \sum_p\left< \hat{V}^0 x_p^{(k)}(r) * + (1 - \hat{\rho}^0) \Gamma_p^{(k)}(r)\right| \left. x_p^{(k)} - @@ -1743,147 +1510,146 @@ Tensor TDDFT::calculate_energy_update(World &world, * \right|^2 } */ - // Basic output - if (print_level >= 1) { - if (world.rank() == 0) printf(" Calculating energy residuals for %s components\n", xy.c_str()); - } + // Basic output + if (print_level >= 1) { + if (world.rank() == 0) + printf(" Calculating energy residuals for %s components\n", xy.c_str()); + } - // Size inferred - size_t m = rhs.size(); + // Size inferred + size_t m = rhs.size(); - // Container for updates - Tensor updates(m); + // Container for updates + Tensor updates(m); - // Need to run over all functions in rhs and calculate inner products. - // rhs contains the bra in the braket notation above, and f_residuals - // is the ket. + // Need to run over all functions in rhs and calculate inner products. + // rhs contains the bra in the braket notation above, and f_residuals + // is the ket. - // Run over excited components - for (size_t k = 0; k < m; k++) { - // vmra.h function, line 627 - // Sum is included inside function call - updates(k) = inner(f_residuals[k], rhs[k]); + // Run over excited components + for (size_t k = 0; k < m; k++) { + // vmra.h function, line 627 + // Sum is included inside function call + updates(k) = inner(f_residuals[k], rhs[k]); - // Normalize update function - // The -1.0 is the leading coefficient in the update formula - // the 1/2 is to undo the scaling of V - updates(k) = -1.0 / 2.0 * updates(k) / inner(new_f[k], new_f[k]); - } + // Normalize update function + // The -1.0 is the leading coefficient in the update formula + // the 1/2 is to undo the scaling of V + updates(k) = -1.0 / 2.0 * updates(k) / inner(new_f[k], new_f[k]); + } - if (print_level >= 1) { - // Print energy deltas - if (world.rank() == 0) printf(" Energy residuals for %s components:\n", xy.c_str()); - if (world.rank() == 0) print("Er: ", abs(updates)); - } + if (print_level >= 1) { + // Print energy deltas + if (world.rank() == 0) printf(" Energy residuals for %s components:\n", xy.c_str()); + if (world.rank() == 0) print("Er: ", abs(updates)); + } - // Done? - return updates; + // Done? + return updates; } vecfuncT TDDFT::make_density(World &world, X_space &Chi, std::string calc_type) { - molresponse::start_timer(world); - vecfuncT rho_omega; - if (calc_type.compare("full") == 0) { - rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.Y); - } else if (calc_type.compare("static") == 0) { - rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.X); - } else { - rho_omega = transition_densityTDA(world, ground_orbitals, Chi.X); - } - - molresponse::end_timer(world, "Make density omega"); - print_meminfo(world.rank(), "Make density omega"); - world.gop.fence(); - return rho_omega; + molresponse::start_timer(world); + vecfuncT rho_omega; + if (calc_type.compare("full") == 0) { + rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.Y); + } else if (calc_type.compare("static") == 0) { + rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.X); + } else { + rho_omega = transition_densityTDA(world, ground_orbitals, Chi.X); + } + + molresponse::end_timer(world, "Make density omega"); + print_meminfo(world.rank(), "Make density omega"); + world.gop.fence(); + return rho_omega; } // Specialized for response calculations that returns orthonormalized // functions response_space TDDFT::gram_schmidt(World &world, response_space &f) { - // Sizes inferred - size_t m = f.size(); + // Sizes inferred + size_t m = f.size(); - // Return container - response_space result = f.copy(); + // Return container + response_space result = f.copy(); - // Orthogonalize - for (size_t j = 0; j < m; j++) { - // Need to normalize the row - double norm = norm2(world, result[j]); + // Orthogonalize + for (size_t j = 0; j < m; j++) { + // Need to normalize the row + double norm = norm2(world, result[j]); - // Now scale each entry - scale(world, result[j], 1.0 / norm); + // Now scale each entry + scale(world, result[j], 1.0 / norm); - // Project out from the rest of the vectors - for (size_t k = j + 1; k < m; k++) { - // Temp function to hold the sum - // of inner products - // vmra.h function, line 627 - double temp = inner(result[j], result[k]); + // Project out from the rest of the vectors + for (size_t k = j + 1; k < m; k++) { + // Temp function to hold the sum + // of inner products + // vmra.h function, line 627 + double temp = inner(result[j], result[k]); - // Now subtract - gaxpy(world, 1.0, result[k], -temp, result[j]); + // Now subtract + gaxpy(world, 1.0, result[k], -temp, result[j]); + } } - } - result.truncate_rf(); + result.truncate_rf(); - // Done - return result; + // Done + return result; } // Specialized for response calculations that returns orthonormalized // functions void TDDFT::gram_schmidt(World &world, response_space &f, response_space &g) { - // Sizes inferred - size_t m = f.size(); - - // Orthogonalize - for (size_t j = 0; j < m; j++) { - // Need to normalize the row - double norm = inner(f[j], f[j]) - inner(g[j], g[j]); - - // Now scale each entry - scale(world, f[j], 1.0 / sqrt(norm)); - scale(world, g[j], 1.0 / sqrt(norm)); - - // Project out from the rest of the vectors - for (size_t k = j + 1; k < m; k++) { - // Temp function to hold the sum - // of inner products - // vmra.h function, line 627 - double temp = inner(f[j], f[k]) - inner(g[j], g[k]); - - // Now subtract - gaxpy(world, 1.0, f[k], -temp, f[j]); - gaxpy(world, 1.0, g[k], -temp, g[j]); + // Sizes inferred + size_t m = f.size(); + + // Orthogonalize + for (size_t j = 0; j < m; j++) { + // Need to normalize the row + double norm = inner(f[j], f[j]) - inner(g[j], g[j]); + + // Now scale each entry + scale(world, f[j], 1.0 / sqrt(norm)); + scale(world, g[j], 1.0 / sqrt(norm)); + + // Project out from the rest of the vectors + for (size_t k = j + 1; k < m; k++) { + // Temp function to hold the sum + // of inner products + // vmra.h function, line 627 + double temp = inner(f[j], f[k]) - inner(g[j], g[k]); + + // Now subtract + gaxpy(world, 1.0, f[k], -temp, f[j]); + gaxpy(world, 1.0, g[k], -temp, g[j]); + } } - } - f.truncate_rf(); - g.truncate_rf(); + f.truncate_rf(); + g.truncate_rf(); } // Returns the max norm of the given vector of functions double TDDFT::calculate_max_residual(World &world, response_space &f) { - // Container for max - double max = 0.0; + // Container for max + double max = 0.0; - // Run over all functions in f - for (unsigned int i = 0; i < f.size(); i++) { - double temp = 0.0; + // Run over all functions in f + for (unsigned int i = 0; i < f.size(); i++) { + double temp = 0.0; - for (unsigned int j = 0; j < f[0].size(); j++) { - temp += pow(f[i][j].norm2(), 2); - } + for (unsigned int j = 0; j < f[0].size(); j++) { temp += pow(f[i][j].norm2(), 2); } - temp = sqrt(temp); + temp = sqrt(temp); - if (temp > max) max = temp; - } + if (temp > max) max = temp; + } - // Done - return max; + // Done + return max; } // Selects the 'active' orbitals from ground state orbitals to be used in @@ -1891,122 +1657,118 @@ double TDDFT::calculate_max_residual(World &world, response_space &f) { // knowledge of ground_orbitals and g_params.energies. Function sets // act_orbitals and num_act_orbitals. void TDDFT::select_active_subspace(World &world) { - // Default output - if (r_params.print_level() >= 0) { - // Set print output to something reasonable - std::cout.precision(2); - std::cout << std::fixed; + // Default output + if (r_params.print_level() >= 0) { + // Set print output to something reasonable + std::cout.precision(2); + std::cout << std::fixed; - if (world.rank() == 0) - print( - " Selecting ground state subspace to excite from for " - "components."); - if (world.rank() == 0) - print(" This is all orbitals between", r_params.e_range_lo(), "and", r_params.e_range_hi(), "\n"); + if (world.rank() == 0) + print(" Selecting ground state subspace to excite from for " + "components."); + if (world.rank() == 0) + print(" This is all orbitals between", r_params.e_range_lo(), "and", + r_params.e_range_hi(), "\n"); - // Reset precision - std::cout.precision(10); - std::cout << std::scientific; - } + // Reset precision + std::cout.precision(10); + std::cout << std::scientific; + } - // Determine active orbitals based on energy differences - // from HOMO - for (unsigned int i = 0; i < r_params.num_orbitals(); i++) { - if (r_params.e_range_lo() < g_params.get_energies()(i) and - g_params.get_energies()(i) < r_params.e_range_hi()) { - // This orbital should be active, so add to list - active.push_back(i); + // Determine active orbitals based on energy differences + // from HOMO + for (unsigned int i = 0; i < r_params.num_orbitals(); i++) { + if (r_params.e_range_lo() < g_params.get_energies()(i) and + g_params.get_energies()(i) < r_params.e_range_hi()) { + // This orbital should be active, so add to list + active.push_back(i); + } } - } - // Make sure we have at least one ground state orbital to excite from - MADNESS_ASSERT(active.size() > 0); + // Make sure we have at least one ground state orbital to excite from + MADNESS_ASSERT(active.size() > 0); - // Now that we know size, allocate act_ground_energies - act_ground_energies = Tensor(active.size()); + // Now that we know size, allocate act_ground_energies + act_ground_energies = Tensor(active.size()); - // Now to pull the functions and energies and add to act_orbitals and - // act_ground_energies - for (unsigned int i = 0; i < active.size(); i++) { - act_orbitals.push_back(ground_orbitals[active[i]]); - act_ground_energies(i) = g_params.get_energies()(active[i]); // Put energies on diagonal - } + // Now to pull the functions and energies and add to act_orbitals and + // act_ground_energies + for (unsigned int i = 0; i < active.size(); i++) { + act_orbitals.push_back(ground_orbitals[active[i]]); + act_ground_energies(i) = g_params.get_energies()(active[i]);// Put energies on diagonal + } - // Also set the active size - act_num_orbitals = act_orbitals.size(); + // Also set the active size + act_num_orbitals = act_orbitals.size(); - print("Found", act_num_orbitals, "active orbitals."); + print("Found", act_num_orbitals, "active orbitals."); } // Selects from a list of functions and energies the k functions with the // lowest energy -response_space TDDFT::select_functions(World &world, - response_space &f, - Tensor &energies, - size_t k, - size_t print_level) { - // Container for result - response_space answer; +response_space TDDFT::select_functions(World &world, response_space &f, Tensor &energies, + size_t k, size_t print_level) { + // Container for result + response_space answer; - // Debugging output - if (print_level >= 1) { - if (world.rank() == 0) print("\n Selecting the", k, "lowest excitation energy components.\n"); - } + // Debugging output + if (print_level >= 1) { + if (world.rank() == 0) + print("\n Selecting the", k, "lowest excitation energy components.\n"); + } - // Get rid of extra functions and save - // the first k - while (f.size() > k) f.pop_back(); - answer = f; - answer.truncate_rf(); + // Get rid of extra functions and save + // the first k + while (f.size() > k) f.pop_back(); + answer = f; + answer.truncate_rf(); - // Get rid of extra energies and save - // the first k - energies = energies(Slice(0, k - 1)); + // Get rid of extra energies and save + // the first k + energies = energies(Slice(0, k - 1)); - // Basic output - if (print_level >= 1) { - if (world.rank() == 0) print(" The selected components have excitation energies:"); - if (world.rank() == 0) print(energies); - } + // Basic output + if (print_level >= 1) { + if (world.rank() == 0) print(" The selected components have excitation energies:"); + if (world.rank() == 0) print(energies); + } - // Done - return answer; + // Done + return answer; } // Calculate the exponentiation of a matrix through first order (I think) Tensor TDDFT::matrix_exponential(const Tensor &A) { - const double tol = 1e-13; - MADNESS_ASSERT(A.dim((0) == A.dim(1))); - - // Scale A by a power of 2 until it is "small" - double anorm = A.normf(); - size_t n = 0; - double scale = 1.0; - while (anorm * scale > 0.1) { - ++n; - scale *= 0.5; - } - Tensor B = scale * A; // B = A*2^-n - - // Compute exp(B) using Taylor series - Tensor expB = Tensor(2, B.dims()); - for (int64_t i = 0; i < expB.dim(0); ++i) expB(i, i) = 1.0; - - size_t k = 1; - Tensor term = B; - while (term.normf() > tol) { - expB += term; - term = inner(term, B); - ++k; - term.scale(1.0 / k); - } - - // Repeatedly square to recover exp(A) - while (n--) { - expB = inner(expB, expB); - } - - return expB; + const double tol = 1e-13; + MADNESS_ASSERT(A.dim((0) == A.dim(1))); + + // Scale A by a power of 2 until it is "small" + double anorm = A.normf(); + size_t n = 0; + double scale = 1.0; + while (anorm * scale > 0.1) { + ++n; + scale *= 0.5; + } + Tensor B = scale * A;// B = A*2^-n + + // Compute exp(B) using Taylor series + Tensor expB = Tensor(2, B.dims()); + for (int64_t i = 0; i < expB.dim(0); ++i) expB(i, i) = 1.0; + + size_t k = 1; + Tensor term = B; + while (term.normf() > tol) { + expB += term; + term = inner(term, B); + ++k; + term.scale(1.0 / k); + } + + // Repeatedly square to recover exp(A) + while (n--) { expB = inner(expB, expB); } + + return expB; } /// compute the unitary transformation that diagonalizes the fock matrix @@ -2018,184 +1780,181 @@ Tensor TDDFT::matrix_exponential(const Tensor &A) { /// @param[in] thresh_degenerate threshold for orbitals being /// degenerate /// @return the unitary matrix U: U^T F U = evals -Tensor TDDFT::get_fock_transformation(World &world, - Tensor &overlap, - Tensor &fock, - Tensor &evals, +Tensor TDDFT::get_fock_transformation(World &world, Tensor &overlap, + Tensor &fock, Tensor &evals, const double thresh_degenerate) { - // Run an SVD on the overlap matrix and ignore values - // less than thresh_degenerate - Tensor r_vecs; - Tensor s_vals; - Tensor l_vecs; - Tensor overlap_copy = copy(overlap); - svd(overlap_copy, l_vecs, s_vals, r_vecs); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print("\n Singular values of overlap matrix:"); - print(s_vals); - print(" Left singular vectors of overlap matrix:"); - print(l_vecs); - } - - // Check how many singular values are less than 10*thresh_degen - size_t num_sv = 0; - for (int64_t i = 0; i < s_vals.dim(0); i++) { - if (s_vals(i) < 10 * thresh_degenerate) { - if (world.rank() == 0 and num_sv == 0) print(""); - if (world.rank() == 0) - printf( - " Detected singular value (%.8f) below threshold (%.8f). " - "Reducing subspace size.\n", - s_vals(i), - 10 * thresh_degenerate); - num_sv++; - } - if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_sv > 0) print(""); - } - - // Going to use these a lot here, so just calculate them - size_t size_l = s_vals.dim(0); - size_t size_s = size_l - num_sv; - Tensor l_vecs_s(size_l, num_sv); - - // Transform into this smaller space if necessary - if (num_sv > 0) { - // Cut out the singular values that are small - // (singular values come out in descending order) - overlap = Tensor(size_s, size_s); - for (size_t i = 0; i < size_s; i++) overlap(i, i) = s_vals(i); - - // Copy the active vectors to a smaller container - l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); + // Run an SVD on the overlap matrix and ignore values + // less than thresh_degenerate + Tensor r_vecs; + Tensor s_vals; + Tensor l_vecs; + Tensor overlap_copy = copy(overlap); + svd(overlap_copy, l_vecs, s_vals, r_vecs); // Debugging output if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Reduced size left singular vectors of overlap matrix:"); - print(l_vecs_s); - } - - // Transform - Tensor work(size_l, size_s); - mxm(size_l, size_s, size_l, work.ptr(), fock.ptr(), l_vecs_s.ptr()); - fock = Tensor(size_s, size_s); - Tensor l_vecs_t = transpose(l_vecs); - mxm(size_s, size_s, size_l, fock.ptr(), l_vecs_t.ptr(), work.ptr()); - } - - // Diagonalize using lapack - Tensor U; - sygv(fock, overlap, 1, U, evals); - - int64_t nmo = fock.dim(0); // NOLINT - - bool switched = true; - while (switched) { - switched = false; - for (int64_t i = 0; i < nmo; i++) { - for (int64_t j = i + 1; j < nmo; j++) { - double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); - double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); - if (snew > sold) { - Tensor tmp = copy(U(_, i)); - U(_, i) = U(_, j); - U(_, j) = tmp; - std::swap(evals[i], evals[j]); - switched = true; + print("\n Singular values of overlap matrix:"); + print(s_vals); + print(" Left singular vectors of overlap matrix:"); + print(l_vecs); + } + + // Check how many singular values are less than 10*thresh_degen + size_t num_sv = 0; + for (int64_t i = 0; i < s_vals.dim(0); i++) { + if (s_vals(i) < 10 * thresh_degenerate) { + if (world.rank() == 0 and num_sv == 0) print(""); + if (world.rank() == 0) + printf(" Detected singular value (%.8f) below threshold (%.8f). " + "Reducing subspace size.\n", + s_vals(i), 10 * thresh_degenerate); + num_sv++; } - } + if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_sv > 0) print(""); } - } - // Fix phases. - for (int64_t i = 0; i < nmo; ++i) // NOLINT - if (U(i, i) < 0.0) U(_, i).scale(-1.0); + // Going to use these a lot here, so just calculate them + size_t size_l = s_vals.dim(0); + size_t size_s = size_l - num_sv; + Tensor l_vecs_s(size_l, num_sv); + + // Transform into this smaller space if necessary + if (num_sv > 0) { + // Cut out the singular values that are small + // (singular values come out in descending order) + overlap = Tensor(size_s, size_s); + for (size_t i = 0; i < size_s; i++) overlap(i, i) = s_vals(i); - // Rotations between effectively degenerate components confound - // the non-linear equation solver ... undo these rotations - int64_t ilo = 0; // first element of cluster NOLINT - while (ilo < nmo - 1) { - int64_t ihi = ilo; // NOLINT - while (fabs(evals[ilo] - evals[ihi + 1]) < thresh_degenerate * 100.0 * std::max(fabs(evals[ilo]), 1.0)) { - ++ihi; - if (ihi == nmo - 1) break; + // Copy the active vectors to a smaller container + l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Reduced size left singular vectors of overlap matrix:"); + print(l_vecs_s); + } + + // Transform + Tensor work(size_l, size_s); + mxm(size_l, size_s, size_l, work.ptr(), fock.ptr(), l_vecs_s.ptr()); + fock = Tensor(size_s, size_s); + Tensor l_vecs_t = transpose(l_vecs); + mxm(size_s, size_s, size_l, fock.ptr(), l_vecs_t.ptr(), work.ptr()); + } + + // Diagonalize using lapack + Tensor U; + sygv(fock, overlap, 1, U, evals); + + int64_t nmo = fock.dim(0);// NOLINT + + bool switched = true; + while (switched) { + switched = false; + for (int64_t i = 0; i < nmo; i++) { + for (int64_t j = i + 1; j < nmo; j++) { + double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); + double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); + if (snew > sold) { + Tensor tmp = copy(U(_, i)); + U(_, i) = U(_, j); + U(_, j) = tmp; + std::swap(evals[i], evals[j]); + switched = true; + } + } + } } - int64_t nclus = ihi - ilo + 1; // NOLINT - if (nclus > 1) { - Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); - // Polar Decomposition - Tensor VH(nclus, nclus); - Tensor W(nclus, nclus); - Tensor sigma(nclus); + // Fix phases. + for (int64_t i = 0; i < nmo; ++i)// NOLINT + if (U(i, i) < 0.0) U(_, i).scale(-1.0); - svd(q, W, sigma, VH); - q = transpose(inner(W, VH)); // Should be conj. tranpose if complex - U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + // Rotations between effectively degenerate components confound + // the non-linear equation solver ... undo these rotations + int64_t ilo = 0;// first element of cluster NOLINT + while (ilo < nmo - 1) { + int64_t ihi = ilo;// NOLINT + while (fabs(evals[ilo] - evals[ihi + 1]) < + thresh_degenerate * 100.0 * std::max(fabs(evals[ilo]), 1.0)) { + ++ihi; + if (ihi == nmo - 1) break; + } + int64_t nclus = ihi - ilo + 1;// NOLINT + if (nclus > 1) { + Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); + + // Polar Decomposition + Tensor VH(nclus, nclus); + Tensor W(nclus, nclus); + Tensor sigma(nclus); + + svd(q, W, sigma, VH); + q = transpose(inner(W, VH));// Should be conj. tranpose if complex + U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + } + ilo = ihi + 1; } - ilo = ihi + 1; - } - fock = 0; - for (unsigned int i = 0; i < nmo; ++i) fock(i, i) = evals(i); + fock = 0; + for (unsigned int i = 0; i < nmo; ++i) fock(i, i) = evals(i); - // If we transformed into the smaller subspace, time to transform back - if (num_sv > 0) { - // Temp. storage - Tensor temp_U(size_l, size_l); - Tensor U2(size_l, size_l); + // If we transformed into the smaller subspace, time to transform back + if (num_sv > 0) { + // Temp. storage + Tensor temp_U(size_l, size_l); + Tensor U2(size_l, size_l); - // Copy U back to larger size - temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); - for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; + // Copy U back to larger size + temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); + for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; - // Transform back - mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); + // Transform back + mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); - U = copy(U2); - } + U = copy(U2); + } - return U; + return U; } // Sorts the given Tensor of energies Tensor TDDFT::sort_eigenvalues(World &world, Tensor &vals, Tensor &vecs) { - // Get relevant sizes - size_t k = vals.size(); + // Get relevant sizes + size_t k = vals.size(); - // Tensor to hold selection order - Tensor selected(k); + // Tensor to hold selection order + Tensor selected(k); - // Copy everything... - std::vector vals_copy; - for (size_t i = 0; i < k; i++) vals_copy.push_back(vals[i]); - Tensor vals_copy2 = copy(vals); - Tensor vecs_copy = copy(vecs); + // Copy everything... + std::vector vals_copy; + for (size_t i = 0; i < k; i++) vals_copy.push_back(vals[i]); + Tensor vals_copy2 = copy(vals); + Tensor vecs_copy = copy(vecs); - // Now sort vals_copy - std::sort(vals_copy.begin(), vals_copy.end()); + // Now sort vals_copy + std::sort(vals_copy.begin(), vals_copy.end()); - // Now sort the rest of the things, using the sorted energy list - // to find the correct indices - for (size_t i = 0; i < k; i++) { - // Find matching index in sorted vals_copy - size_t j = 0; - while (fabs(vals_copy[i] - vals_copy2[j]) > 1e-8 && j < k) j++; + // Now sort the rest of the things, using the sorted energy list + // to find the correct indices + for (size_t i = 0; i < k; i++) { + // Find matching index in sorted vals_copy + size_t j = 0; + while (fabs(vals_copy[i] - vals_copy2[j]) > 1e-8 && j < k) j++; - // Add in to list which one we're taking - selected(i) = j; + // Add in to list which one we're taking + selected(i) = j; - // Put corresponding things in the correct place - vals(i) = vals_copy[i]; - vecs(_, i) = vecs_copy(_, j); + // Put corresponding things in the correct place + vals(i) = vals_copy[i]; + vecs(_, i) = vecs_copy(_, j); - // Change the value of vals_copy2[j] to help deal with duplicates? - vals_copy2[j] = 10000.0; - } + // Change the value of vals_copy2[j] to help deal with duplicates? + vals_copy2[j] = 10000.0; + } - // Done - return selected; + // Done + return selected; } /// diagonalize the fock matrix, taking care of degenerate components @@ -2209,72 +1968,67 @@ Tensor TDDFT::sort_eigenvalues(World &world, Tensor &vals, Tensor TDDFT::diagonalizeFockMatrix(World &world, - X_space &Chi, - X_space &Lambda_X, - Tensor &evals, - Tensor &A, - Tensor &S, - const double thresh) { - // compute the unitary transformation matrix U that diagonalizes - // the fock matrix - Tensor U = get_fock_transformation(world, S, A, evals, thresh); +Tensor TDDFT::diagonalizeFockMatrix(World &world, X_space &Chi, X_space &Lambda_X, + Tensor &evals, Tensor &A, + Tensor &S, const double thresh) { + // compute the unitary transformation matrix U that diagonalizes + // the fock matrix + Tensor U = get_fock_transformation(world, S, A, evals, thresh); - // Sort into ascending order - Tensor selected = sort_eigenvalues(world, evals, U); + // Sort into ascending order + Tensor selected = sort_eigenvalues(world, evals, U); - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" U:"); - print(U); - } + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" U:"); + print(U); + } - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); - // transform the orbitals and the potential - // Truncate happens inside here - Chi.X = transform(world, Chi.X, U); - Lambda_X.X = transform(world, Lambda_X.X, U); + // transform the orbitals and the potential + // Truncate happens inside here + Chi.X = transform(world, Chi.X, U); + Lambda_X.X = transform(world, Lambda_X.X, U); - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); - // Normalize x - normalize(world, Chi.X); + // Normalize x + normalize(world, Chi.X); - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Eigenvector coefficients from diagonalization:"); - print(U); - } + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Eigenvector coefficients from diagonalization:"); + print(U); + } - return U; + return U; } // Transforms the given matrix of functions according to the give // transformation matrix. Used to update orbitals / potential response_space TDDFT::transform(World &world, response_space &f, Tensor &U) { - // Return container - response_space result; + // Return container + response_space result; - // Go element by element - for (unsigned int i = 0; i < f.size(); i++) { - // Temp for the result of one row - std::vector temp = zero_functions_compressed(world, f[0].size()); + // Go element by element + for (unsigned int i = 0; i < f.size(); i++) { + // Temp for the result of one row + std::vector temp = + zero_functions_compressed(world, f[0].size()); - for (unsigned int j = 0; j < f.size(); j++) { - gaxpy(world, 1.0, temp, U(j, i), f[j]); - } + for (unsigned int j = 0; j < f.size(); j++) { gaxpy(world, 1.0, temp, U(j, i), f[j]); } - // Add to temp to result - result.push_back(temp); - } + // Add to temp to result + result.push_back(temp); + } - result.truncate_rf(); + result.truncate_rf(); - // Done - return result; + // Done + return result; } // If using a larger subspace to diagonalize in, this will put everything in @@ -2294,365 +2048,325 @@ response_space TDDFT::transform(World &world, response_space &f, Tensor * @param print_level */ -void TDDFT::augment(World &world, - X_space &Chi, - X_space &old_Chi, - X_space &Lambda_X, - X_space &last_Lambda_X, - Tensor &S, - Tensor &A, - Tensor &old_S, - Tensor &old_A, - size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - // Get sizes - size_t m = Chi.X.size(); - // Create work space, will overwrite S and A in the end - Tensor temp_S(2 * m, 2 * m); - Tensor temp_A(2 * m, 2 * m); - /** +void TDDFT::augment(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &last_Lambda_X, Tensor &S, Tensor &A, + Tensor &old_S, Tensor &old_A, size_t print_level) { + // Basic output + if (print_level >= 1) molresponse::start_timer(world); + + // Get sizes + size_t m = Chi.X.size(); + // Create work space, will overwrite S and A in the end + Tensor temp_S(2 * m, 2 * m); + Tensor temp_A(2 * m, 2 * m); + /** * @brief Need to create off diagonal blocks of A * A= * [xAx xAx_old ] * [xoldAx xoldAxold] * */ - // Calculate correct inner products of upper off diagonal - - Tensor off = response_space_inner(Chi.X, last_Lambda_X.X); - temp_A(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off); // top right - // Now for lower off diagonal - off = response_space_inner(old_Chi.X, Lambda_X.X); - temp_A(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off); // bottom left - temp_A(Slice(0, m - 1), Slice(0, m - 1)) = copy(A); // xAx top left - temp_A(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_A); // xoldAxold bottom right - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" Before symmeterizing A:"); - print(temp_A); - } - // Save temp_A as A_x - // Need to symmeterize A as well (?) - A = 0.5 * (temp_A + transpose(temp_A)); - /** + // Calculate correct inner products of upper off diagonal + + Tensor off = response_space_inner(Chi.X, last_Lambda_X.X); + temp_A(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off);// top right + // Now for lower off diagonal + off = response_space_inner(old_Chi.X, Lambda_X.X); + temp_A(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off); // bottom left + temp_A(Slice(0, m - 1), Slice(0, m - 1)) = copy(A); // xAx top left + temp_A(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_A);// xoldAxold bottom right + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print(" Before symmeterizing A:"); + print(temp_A); + } + // Save temp_A as A_x + // Need to symmeterize A as well (?) + A = 0.5 * (temp_A + transpose(temp_A)); + /** * @brief Creating S * S= [ ] * [ ] */ - // Now create upper off diagonal block of S - off = expectation(world, Chi.X, old_Chi.X); - // Use slicing to put in correct spot - temp_S(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off); // top right - // Now the lower off diagonal block - // (Go ahead and cheat and use the transpose...) - off = transpose(off); // just transpose - // Use slicing to put in correct spot - temp_S(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off); // bottom right - // Put together the rest of S - temp_S(Slice(0, m - 1), Slice(0, m - 1)) = copy(S); // top left - temp_S(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_S); // - // Save temp_S as S_x - S = copy(temp_S); - // Add in old vectors to current vectors for the appropriate ones - // Augment the vectors step - for (size_t i = 0; i < m; i++) { - Chi.X.push_back(old_Chi.X[i]); - Lambda_X.X.push_back(last_Lambda_X.X[i]); - } - - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print("\n Augmented response matrix:"); - print(A); - } - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" Augmented overlap matrix:"); - print(S); - } - - // SUPER debugging - if (print_level >= 3) { - if (world.rank() == 0) print(" Calculating condition number of aug. response matrix"); - } + // Now create upper off diagonal block of S + off = expectation(world, Chi.X, old_Chi.X); + // Use slicing to put in correct spot + temp_S(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off);// top right + // Now the lower off diagonal block + // (Go ahead and cheat and use the transpose...) + off = transpose(off);// just transpose + // Use slicing to put in correct spot + temp_S(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off);// bottom right + // Put together the rest of S + temp_S(Slice(0, m - 1), Slice(0, m - 1)) = copy(S); // top left + temp_S(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_S);// + // Save temp_S as S_x + S = copy(temp_S); + // Add in old vectors to current vectors for the appropriate ones + // Augment the vectors step + for (size_t i = 0; i < m; i++) { + Chi.X.push_back(old_Chi.X[i]); + Lambda_X.X.push_back(last_Lambda_X.X[i]); + } + + // End the timer + if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); + + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print("\n Augmented response matrix:"); + print(A); + } + + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print(" Augmented overlap matrix:"); + print(S); + } + + // SUPER debugging + if (print_level >= 3) { + if (world.rank() == 0) print(" Calculating condition number of aug. response matrix"); + } } // If using a larger subspace to diagonalize in, this will put everything in // the right spot -void TDDFT::augment_full(World &world, - X_space &Chi, - X_space &old_Chi, - X_space &Lambda_X, - X_space &last_Lambda_X, - Tensor &S, - Tensor &A, - Tensor &old_S, - Tensor &old_A, - size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - size_t m = Chi.num_states(); - for (size_t i = 0; i < m; i++) { - Chi.push_back(copy(world, old_Chi.X[i]), copy(world, old_Chi.Y[i])); - Lambda_X.push_back(copy(world, last_Lambda_X.X[i]), copy(world, last_Lambda_X.Y[i])); - } - Tensor temp_A = inner(Chi, Lambda_X); - A = 0.5 * (temp_A + transpose(temp_A)); - S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); - - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print("\n Augmented response matrix:"); - print(A); - } - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" Augmented overlap matrix:"); - print(S); - } - - // SUPER debugging - if (print_level >= 3) { - if (world.rank() == 0) print(" Calculating condition number of aug. response matrix"); - } +void TDDFT::augment_full(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &last_Lambda_X, Tensor &S, Tensor &A, + Tensor &old_S, Tensor &old_A, size_t print_level) { + // Basic output + if (print_level >= 1) molresponse::start_timer(world); + + size_t m = Chi.num_states(); + for (size_t i = 0; i < m; i++) { + Chi.push_back(copy(world, old_Chi.X[i]), copy(world, old_Chi.Y[i])); + Lambda_X.push_back(copy(world, last_Lambda_X.X[i]), copy(world, last_Lambda_X.Y[i])); + } + Tensor temp_A = inner(Chi, Lambda_X); + A = 0.5 * (temp_A + transpose(temp_A)); + S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); + + // End the timer + if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); + + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print("\n Augmented response matrix:"); + print(A); + } + + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print(" Augmented overlap matrix:"); + print(S); + } + + // SUPER debugging + if (print_level >= 3) { + if (world.rank() == 0) print(" Calculating condition number of aug. response matrix"); + } } // If using a larger subspace to diagonalize in, after diagonalization this // will put everything in the right spot -void TDDFT::unaugment(World &world, - X_space &Chi, - X_space &old_Chi, - X_space &Lambda_X, - X_space &last_Lambda_X, - Tensor &omega, - Tensor &S_x, - Tensor &A_x, - Tensor &old_S, - Tensor &old_A, - size_t num_states, - size_t iter, - size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - // Note: the eigenvalues and vectors were sorted after diagonalization - // and hence all the functions are sorted in ascending order of energy - - // Quick copy of m lowest eigenvalues - omega = omega(Slice(0, num_states - 1)); - // Pop off the "m" vectors off the back end of appropriate vectors - // (only after first iteration) - if (iter > 0) { - for (size_t i = 0; i < num_states; i++) { - Chi.X.pop_back(); - Lambda_X.X.pop_back(); - } - } - old_Chi.X = Chi.X.copy(); - last_Lambda_X.X = Lambda_X.X.copy(); - - old_S = response_space_inner(Chi.X, Chi.X); - old_A = Tensor(num_states, num_states); - for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Unaug. resp. mat.:"); +void TDDFT::unaugment(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &last_Lambda_X, Tensor &omega, Tensor &S_x, + Tensor &A_x, Tensor &old_S, Tensor &old_A, + size_t num_states, size_t iter, size_t print_level) { + // Basic output + if (print_level >= 1) molresponse::start_timer(world); + + // Note: the eigenvalues and vectors were sorted after diagonalization + // and hence all the functions are sorted in ascending order of energy + + // Quick copy of m lowest eigenvalues + omega = omega(Slice(0, num_states - 1)); + // Pop off the "m" vectors off the back end of appropriate vectors + // (only after first iteration) + if (iter > 0) { + for (size_t i = 0; i < num_states; i++) { + Chi.X.pop_back(); + Lambda_X.X.pop_back(); + } + } + old_Chi.X = Chi.X.copy(); + last_Lambda_X.X = Lambda_X.X.copy(); + + old_S = response_space_inner(Chi.X, Chi.X); + old_A = Tensor(num_states, num_states); + for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); + // End the timer + if (print_level >= 1) molresponse::end_timer(world, "Unaug. resp. mat.:"); } // If using a larger subspace to diagonalize in, after diagonalization this // will put everything in the right spot -void TDDFT::unaugment_full(World &world, - X_space &Chi, - X_space &old_Chi, - X_space &Lambda_X, - X_space &last_Lambda_X, - Tensor &omega, - Tensor &S_x, - Tensor &A_x, - Tensor &old_S, - Tensor &old_A, - size_t num_states, - size_t iter, - size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - // Note: the eigenvalues and vectors were sorted after diagonalization - // and hence all the functions are sorted in ascending order of energy - - // Quick copy of m lowest eigenvalues - omega = omega(Slice(0, num_states - 1)); - - // Pop off the "m" vectors off the back end of appropriate vectors - // (only after first iteration) - print("Entering Loop to pop_back Chi and LambdaX"); - if (iter > 0) { - for (size_t i = 0; i < num_states; i++) { - print("pop back Chi and LambdaX"); - Chi.pop_back(); - Lambda_X.pop_back(); - } - } - - old_Chi = Chi.copy(); - last_Lambda_X = Lambda_X.copy(); - - old_S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); - old_A = Tensor(num_states, num_states); - for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Unaug. resp. mat.:"); +void TDDFT::unaugment_full(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &last_Lambda_X, Tensor &omega, Tensor &S_x, + Tensor &A_x, Tensor &old_S, Tensor &old_A, + size_t num_states, size_t iter, size_t print_level) { + // Basic output + if (print_level >= 1) molresponse::start_timer(world); + + // Note: the eigenvalues and vectors were sorted after diagonalization + // and hence all the functions are sorted in ascending order of energy + + // Quick copy of m lowest eigenvalues + omega = omega(Slice(0, num_states - 1)); + + // Pop off the "m" vectors off the back end of appropriate vectors + // (only after first iteration) + print("Entering Loop to pop_back Chi and LambdaX"); + if (iter > 0) { + for (size_t i = 0; i < num_states; i++) { + print("pop back Chi and LambdaX"); + Chi.pop_back(); + Lambda_X.pop_back(); + } + } + + old_Chi = Chi.copy(); + last_Lambda_X = Lambda_X.copy(); + + old_S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); + old_A = Tensor(num_states, num_states); + for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); + // End the timer + if (print_level >= 1) molresponse::end_timer(world, "Unaug. resp. mat.:"); } // Diagonalize the full response matrix, taking care of degenerate // components Why diagonalization and then transform the x_fe vectors -Tensor TDDFT::diagonalizeFullResponseMatrix(World &world, - X_space &Chi, - X_space &Lambda_X, - Tensor &omega, - Tensor &S, - Tensor &A, - const double thresh, +Tensor TDDFT::diagonalizeFullResponseMatrix(World &world, X_space &Chi, X_space &Lambda_X, + Tensor &omega, Tensor &S, + Tensor &A, const double thresh, size_t print_level) { - // compute the unitary transformation matrix U that diagonalizes - // the response matrix - Tensor U = GetFullResponseTransformation(world, S, A, omega, thresh); + // compute the unitary transformation matrix U that diagonalizes + // the response matrix + Tensor U = GetFullResponseTransformation(world, S, A, omega, thresh); - // Sort into ascending order - // Tensor selected = sort_eigenvalues(world, omega, U); + // Sort into ascending order + // Tensor selected = sort_eigenvalues(world, omega, U); - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); - Chi.X = transform(world, Chi.X, U); - Chi.Y = transform(world, Chi.Y, U); - Tensor Sxa, Sya, Sa; + Chi.X = transform(world, Chi.X, U); + Chi.Y = transform(world, Chi.Y, U); + Tensor Sxa, Sya, Sa; - Sxa = response_space_inner(Chi.X, Chi.X); - Sya = response_space_inner(Chi.Y, Chi.Y); - Sa = Sxa - Sya; + Sxa = response_space_inner(Chi.X, Chi.X); + Sya = response_space_inner(Chi.Y, Chi.Y); + Sa = Sxa - Sya; - if (world.rank() == 0 and r_params.print_level() >= 10) { - print("\n After apply transform Overlap Matrix:"); - print(Sxa); - print(Sya); - print(Sa); - } + if (world.rank() == 0 and r_params.print_level() >= 10) { + print("\n After apply transform Overlap Matrix:"); + print(Sxa); + print(Sya); + print(Sa); + } - Lambda_X.X = transform(world, Lambda_X.X, U); - Lambda_X.Y = transform(world, Lambda_X.Y, U); - // Transform the vectors of functions - // Truncate happens in here - // we do transform here - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); + Lambda_X.X = transform(world, Lambda_X.X, U); + Lambda_X.Y = transform(world, Lambda_X.Y, U); + // Transform the vectors of functions + // Truncate happens in here + // we do transform here + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); - // Normalize x and y - normalize(world, Chi); + // Normalize x and y + normalize(world, Chi); - // Debugging output - if (world.rank() == 0 and print_level >= 2) { - print(" Eigenvector coefficients from diagonalization:"); - print(U); - } + // Debugging output + if (world.rank() == 0 and print_level >= 2) { + print(" Eigenvector coefficients from diagonalization:"); + print(U); + } - // Return the selected functions - return U; + // Return the selected functions + return U; } // Similar to what robert did above in "get_fock_transformation" -Tensor TDDFT::GetFullResponseTransformation(World &world, - Tensor &S, - Tensor &A, - Tensor &evals, +Tensor TDDFT::GetFullResponseTransformation(World &world, Tensor &S, + Tensor &A, Tensor &evals, const double thresh_degenerate) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); - // Get size - size_t m = S.dim(0); + // Get size + size_t m = S.dim(0); - // Run an SVD on the overlap matrix and ignore values - // less than thresh_degenerate - Tensor r_vecs, s_vals, l_vecs; - Tensor S_copy = copy(S); - /** + // Run an SVD on the overlap matrix and ignore values + // less than thresh_degenerate + Tensor r_vecs, s_vals, l_vecs; + Tensor S_copy = copy(S); + /** * @brief SVD on overlap matrix S * S=UsVT * S, U, s , VT * */ - svd(S_copy, l_vecs, s_vals, r_vecs); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print("\n Singular values of overlap matrix:"); - print(s_vals); - print(" Left singular vectors of overlap matrix:"); - print(l_vecs); - } - - // Check how many singular values are less than 10*thresh_degen - size_t num_zero = 0; - for (int64_t i = 0; i < s_vals.dim(0); i++) { - if (s_vals(i) < 10 * thresh_degenerate) { - if (world.rank() == 0 and num_zero == 0) print(""); - if (world.rank() == 0) - printf( - " Detected singular value (%.8f) below threshold (%.8f). " - "Reducing subspace size.\n", - s_vals(i), - 10 * thresh_degenerate); - num_zero++; - } - if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_zero > 0) print(""); - } - - // Going to use these a lot here, so just calculate them - size_t size_l = s_vals.dim(0); // number of singular values - size_t size_s = size_l - num_zero; // smaller subspace size - /** - * @brief l_vecs_s(m,1) - * - * @return Tensor - */ - Tensor l_vecs_s(size_l, - num_zero); // number of sv by number smaller than thress - Tensor copyA = copy(A); // we copy xAx - - // Transform into this smaller space if necessary - if (num_zero > 0) { - print("num_zero = ", num_zero); - // Cut out the singular values that are small - // (singular values come out in descending order) - - // S(m-sl,m-sl) - S = Tensor(size_s, size_s); // create size of new size - for (size_t i = 0; i < size_s; i++) S(i, i) = s_vals(i); - // Copy the active vectors to a smaller container - // left vectors [m,m-sl] - l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); + svd(S_copy, l_vecs, s_vals, r_vecs); // Debugging output if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Reduced size left singular vectors of overlap matrix:"); - print(l_vecs_s); + print("\n Singular values of overlap matrix:"); + print(s_vals); + print(" Left singular vectors of overlap matrix:"); + print(l_vecs); + } + + // Check how many singular values are less than 10*thresh_degen + size_t num_zero = 0; + for (int64_t i = 0; i < s_vals.dim(0); i++) { + if (s_vals(i) < 10 * thresh_degenerate) { + if (world.rank() == 0 and num_zero == 0) print(""); + if (world.rank() == 0) + printf(" Detected singular value (%.8f) below threshold (%.8f). " + "Reducing subspace size.\n", + s_vals(i), 10 * thresh_degenerate); + num_zero++; + } + if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_zero > 0) print(""); } - // Transform - // Work(m,m-sl) - Tensor work(size_l, size_s); - /* + // Going to use these a lot here, so just calculate them + size_t size_l = s_vals.dim(0); // number of singular values + size_t size_s = size_l - num_zero;// smaller subspace size + /** + * @brief l_vecs_s(m,1) + * + * @return Tensor + */ + Tensor l_vecs_s(size_l, + num_zero);// number of sv by number smaller than thress + Tensor copyA = copy(A); // we copy xAx + + // Transform into this smaller space if necessary + if (num_zero > 0) { + print("num_zero = ", num_zero); + // Cut out the singular values that are small + // (singular values come out in descending order) + + // S(m-sl,m-sl) + S = Tensor(size_s, size_s);// create size of new size + for (size_t i = 0; i < size_s; i++) S(i, i) = s_vals(i); + // Copy the active vectors to a smaller container + // left vectors [m,m-sl] + l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Reduced size left singular vectors of overlap matrix:"); + print(l_vecs_s); + } + + // Transform + // Work(m,m-sl) + Tensor work(size_l, size_s); + /* c(i,j) = c(i,j) + sum(k) a(i,k)*b(k,j) where it is assumed that the last index in each array is has unit @@ -2661,173 +2375,174 @@ Tensor TDDFT::GetFullResponseTransformation(World &world, 4-way unrolled k loop ... empirically fastest on PIII compared to 2/3 way unrolling (though not by much). */ - // dimi,dimj,dimk,c,a,b - mxm(size_l, size_s, size_l, work.ptr(), A.ptr(), l_vecs_s.ptr()); - // A*left - copyA = Tensor(size_s, size_s); - Tensor l_vecs_t = transpose(l_vecs); - // s s l, copyA=lvect_t*A*left - mxm(size_s, size_s, size_l, copyA.ptr(), l_vecs_t.ptr(), work.ptr()); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Reduced response matrix:"); - print(copyA); - print(" Reduced overlap matrix:"); - print(S); - } - } - // Diagonalize (NOT A SYMMETRIC DIAGONALIZATION!!!!) - // Potentially complex eigenvalues come out of this - Tensor> omega(size_s); - Tensor U(size_s, size_s); - ggevp(world, copyA, S, U, omega); - - // Eigenvectors come out oddly packaged if there are - // complex eigenvalues. - // Currently only supporting real valued eigenvalues - // so throw an error if any imaginary components are - // not zero enough - double max_imag = abs(imag(omega)).max(); - if (world.rank() == 0 and r_params.print_level() >= 2) - print("\n Max imaginary component of eigenvalues:", max_imag, "\n"); - MADNESS_ASSERT(max_imag <= r_params.dconv()); // MUST BE REAL! - evals = real(omega); - - // Easier to just resize here - m = evals.dim(0); - - bool switched = true; - while (switched) { - switched = false; - for (size_t i = 0; i < m; i++) { - for (size_t j = i + 1; j < m; j++) { - double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); - double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); - if (snew > sold) { - Tensor tmp = copy(U(_, i)); - U(_, i) = U(_, j); - U(_, j) = tmp; - std::swap(evals[i], evals[j]); - switched = true; + // dimi,dimj,dimk,c,a,b + mxm(size_l, size_s, size_l, work.ptr(), A.ptr(), l_vecs_s.ptr()); + // A*left + copyA = Tensor(size_s, size_s); + Tensor l_vecs_t = transpose(l_vecs); + // s s l, copyA=lvect_t*A*left + mxm(size_s, size_s, size_l, copyA.ptr(), l_vecs_t.ptr(), work.ptr()); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Reduced response matrix:"); + print(copyA); + print(" Reduced overlap matrix:"); + print(S); } - } } - } - - // Fix phases. - for (size_t i = 0; i < m; ++i) - if (U(i, i) < 0.0) U(_, i).scale(-1.0); - - // Rotations between effectively degenerate components confound - // the non-linear equation solver ... undo these rotations - size_t ilo = 0; // first element of cluster - while (ilo < m - 1) { - size_t ihi = ilo; - while (fabs(evals[ilo] - evals[ihi + 1]) < thresh_degenerate * 10.0 * std::max(fabs(evals[ilo]), 1.0)) { - ++ihi; - if (ihi == m - 1) break; + // Diagonalize (NOT A SYMMETRIC DIAGONALIZATION!!!!) + // Potentially complex eigenvalues come out of this + Tensor> omega(size_s); + Tensor U(size_s, size_s); + ggevp(world, copyA, S, U, omega); + + // Eigenvectors come out oddly packaged if there are + // complex eigenvalues. + // Currently only supporting real valued eigenvalues + // so throw an error if any imaginary components are + // not zero enough + double max_imag = abs(imag(omega)).max(); + if (world.rank() == 0 and r_params.print_level() >= 2) + print("\n Max imaginary component of eigenvalues:", max_imag, "\n"); + MADNESS_ASSERT(max_imag <= r_params.dconv());// MUST BE REAL! + evals = real(omega); + + // Easier to just resize here + m = evals.dim(0); + + bool switched = true; + while (switched) { + switched = false; + for (size_t i = 0; i < m; i++) { + for (size_t j = i + 1; j < m; j++) { + double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); + double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); + if (snew > sold) { + Tensor tmp = copy(U(_, i)); + U(_, i) = U(_, j); + U(_, j) = tmp; + std::swap(evals[i], evals[j]); + switched = true; + } + } + } } - int64_t nclus = ihi - ilo + 1; - if (nclus > 1) { - Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); - // Polar Decomposition - Tensor VH(nclus, nclus); - Tensor W(nclus, nclus); - Tensor sigma(nclus); + // Fix phases. + for (size_t i = 0; i < m; ++i) + if (U(i, i) < 0.0) U(_, i).scale(-1.0); - svd(q, W, sigma, VH); - q = transpose(inner(W, VH)); // Should be conj. tranpose if complex - U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + // Rotations between effectively degenerate components confound + // the non-linear equation solver ... undo these rotations + size_t ilo = 0;// first element of cluster + while (ilo < m - 1) { + size_t ihi = ilo; + while (fabs(evals[ilo] - evals[ihi + 1]) < + thresh_degenerate * 10.0 * std::max(fabs(evals[ilo]), 1.0)) { + ++ihi; + if (ihi == m - 1) break; + } + int64_t nclus = ihi - ilo + 1; + if (nclus > 1) { + Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); + + // Polar Decomposition + Tensor VH(nclus, nclus); + Tensor W(nclus, nclus); + Tensor sigma(nclus); + + svd(q, W, sigma, VH); + q = transpose(inner(W, VH));// Should be conj. tranpose if complex + U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); + } + ilo = ihi + 1; } - ilo = ihi + 1; - } - // If we transformed into the smaller subspace, time to transform back - if (num_zero > 0) { - // Temp. storage - Tensor temp_U(size_l, size_l); - Tensor U2(size_l, size_l); + // If we transformed into the smaller subspace, time to transform back + if (num_zero > 0) { + // Temp. storage + Tensor temp_U(size_l, size_l); + Tensor U2(size_l, size_l); - // Copy U back to larger size - temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); - for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; + // Copy U back to larger size + temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); + for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; - // Transform U back - mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); - U = copy(U2); - } + // Transform U back + mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); + U = copy(U2); + } - // Sort into ascending order - Tensor selected = sort_eigenvalues(world, evals, U); + // Sort into ascending order + Tensor selected = sort_eigenvalues(world, evals, U); - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Diag. resp. mat."); + // End timer + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Diag. resp. mat."); - return U; + return U; } // Sorts the given tensor of eigenvalues and // response functions void TDDFT::sort(World &world, Tensor &vals, response_space &f) { - // Get relevant sizes - size_t k = vals.size(); + // Get relevant sizes + size_t k = vals.size(); - // Copy everything... - response_space f_copy(f); - Tensor vals_copy = copy(vals); - Tensor vals_copy2 = copy(vals); + // Copy everything... + response_space f_copy(f); + Tensor vals_copy = copy(vals); + Tensor vals_copy2 = copy(vals); - // Now sort vals_copy - std::sort(vals_copy.ptr(), vals_copy.ptr() + vals_copy.size()); + // Now sort vals_copy + std::sort(vals_copy.ptr(), vals_copy.ptr() + vals_copy.size()); - // Now sort the rest of the things, using the sorted energy list - // to find the correct indices - for (size_t i = 0; i < k; i++) { - // Find matching index in sorted vals_copy - size_t j = 0; - while (fabs(vals_copy(i) - vals_copy2(j)) > 1e-8 && j < k) j++; + // Now sort the rest of the things, using the sorted energy list + // to find the correct indices + for (size_t i = 0; i < k; i++) { + // Find matching index in sorted vals_copy + size_t j = 0; + while (fabs(vals_copy(i) - vals_copy2(j)) > 1e-8 && j < k) j++; - // Put corresponding function, difference function, value residual and - // value in the correct place - f[i] = f_copy[j]; - vals(i) = vals_copy(i); + // Put corresponding function, difference function, value residual and + // value in the correct place + f[i] = f_copy[j]; + vals(i) = vals_copy(i); - // Change the value of vals_copy2[j] to help deal with duplicates? - vals_copy2(j) = 10000.0; - } + // Change the value of vals_copy2[j] to help deal with duplicates? + vals_copy2(j) = 10000.0; + } } void TDDFT::sort(World &world, Tensor &vals, X_space &f) { - // Get relevant sizes - size_t k = vals.size(); + // Get relevant sizes + size_t k = vals.size(); - // Copy everything... - X_space f_copy(f); - Tensor vals_copy = copy(vals); - Tensor vals_copy2 = copy(vals); + // Copy everything... + X_space f_copy(f); + Tensor vals_copy = copy(vals); + Tensor vals_copy2 = copy(vals); - // Now sort vals_copy - std::sort(vals_copy.ptr(), vals_copy.ptr() + vals_copy.size()); + // Now sort vals_copy + std::sort(vals_copy.ptr(), vals_copy.ptr() + vals_copy.size()); - // Now sort the rest of the things, using the sorted energy list - // to find the correct indices - for (size_t i = 0; i < k; i++) { - // Find matching index in sorted vals_copy - size_t j = 0; - while (fabs(vals_copy(i) - vals_copy2(j)) > 1e-8 && j < k) j++; + // Now sort the rest of the things, using the sorted energy list + // to find the correct indices + for (size_t i = 0; i < k; i++) { + // Find matching index in sorted vals_copy + size_t j = 0; + while (fabs(vals_copy(i) - vals_copy2(j)) > 1e-8 && j < k) j++; - // Put corresponding function, difference function, value residual and - // value in the correct place - f.X[i] = f_copy.X[j]; - f.Y[i] = f_copy.Y[j]; + // Put corresponding function, difference function, value residual and + // value in the correct place + f.X[i] = f_copy.X[j]; + f.Y[i] = f_copy.Y[j]; - vals(i) = vals_copy(i); + vals(i) = vals_copy(i); - // Change the value of vals_copy2[j] to help deal with duplicates? - vals_copy2(j) = 10000.0; - } + // Change the value of vals_copy2[j] to help deal with duplicates? + vals_copy2(j) = 10000.0; + } } /** @@ -2846,264 +2561,207 @@ void TDDFT::sort(World &world, Tensor &vals, X_space &f) { * @param m */ -void TDDFT::deflateGuesses(World &world, - X_space &Chi, - X_space &Lambda_X, - Tensor &S, - Tensor &omega, - size_t &iteration, - size_t &m) { - // XX =Omega XAX - S = response_space_inner(Chi.X, Chi.X); - Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Guess Overlap matrix:"); - print(S); - print(" Guess XAX matrix:"); - print(XAX); - } - // Just to be sure dimensions work out, clear omega - omega.clear(); - diagonalizeFockMatrix(world, Chi, Lambda_X, omega, XAX, S, FunctionDefaults<3>::get_thresh()); -} - -void TDDFT::deflateTDA(World &world, - X_space &Chi, - X_space &old_Chi, - X_space &Lambda_X, - X_space &old_Lambda_X, - Tensor &S, - Tensor old_S, - Tensor old_A, - Tensor &omega, - size_t &iteration, - size_t &m) { - S = response_space_inner(Chi.X, Chi.X); - Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Overlap matrix:"); - print(S); - } - - // Augment S_x, A_x, x_gamma, x_response, V_x_response and x_gamma - // if using a larger subspace and not iteration zero (TODO ---Gotta - // look at this and make sure it uses my new functions molresponse ) - // by default r_params.larger_subspace() = 0 therefore never uses this - if (iteration < r_params.larger_subspace() and iteration > 0) { - print("Using augmented subspace"); - augment(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, XAX, old_S, old_A, r_params.print_level()); - } - - // Solve Ax = Sxw - // Just to be sure dimensions work out, clear omega - omega.clear(); - diagonalizeFockMatrix(world, Chi, Lambda_X, omega, XAX, S, FunctionDefaults<3>::get_thresh()); - - // If larger subspace, need to "un-augment" everything - if (iteration < r_params.larger_subspace()) { - print("Unaugmenting subspace"); - unaugment(world, - Chi, - old_Chi, - Lambda_X, - old_Lambda_X, - omega, - S, - XAX, - old_S, - old_A, - r_params.num_states(), - iteration, - r_params.print_level()); - } -} - -void TDDFT::deflateFull(World &world, - X_space &Chi, - X_space &old_Chi, - X_space &Lambda_X, - X_space &old_Lambda_X, - Tensor &S, - Tensor old_S, - Tensor old_A, - Tensor &omega, - size_t &iteration, - size_t &m) { - // Debugging output - Tensor A; - - if (iteration < r_params.larger_subspace() and iteration > 0) { - print("Entering Augment Full"); - augment_full(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, A, old_S, old_A, r_params.print_level()); - // computes Augments A and S - - } else { - S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); - if (world.rank() == 0 && (r_params.print_level() >= 10)) { - print("\n Overlap Matrix:"); - print(S); - } - X_space Chi_copy = Chi.copy(); - Chi_copy.truncate(); - A = inner(Chi_copy, Lambda_X); - if (world.rank() == 0 && (r_params.print_level() >= 10)) { - print("\n Lambda Matrix:"); - print(A); - } - } - - omega.clear(); - - Tensor U = diagonalizeFullResponseMatrix( - world, Chi, Lambda_X, omega, S, A, FunctionDefaults<3>::get_thresh(), r_params.print_level()); - - if (iteration < r_params.larger_subspace() and iteration > 0) { - print("Entering Unaugment Full"); - unaugment_full(world, - Chi, - old_Chi, - Lambda_X, - old_Lambda_X, - omega, - S, - A, - old_S, - old_A, - r_params.num_states(), - iteration, - r_params.print_level()); - } else { - old_Chi = Chi.copy(); - old_Lambda_X = Lambda_X.copy(); - } +void TDDFT::deflateGuesses(World &world, X_space &Chi, X_space &Lambda_X, Tensor &S, + Tensor &omega, size_t &iteration, size_t &m) { + // XX =Omega XAX + S = response_space_inner(Chi.X, Chi.X); + Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Guess Overlap matrix:"); + print(S); + print(" Guess XAX matrix:"); + print(XAX); + } + // Just to be sure dimensions work out, clear omega + omega.clear(); + diagonalizeFockMatrix(world, Chi, Lambda_X, omega, XAX, S, FunctionDefaults<3>::get_thresh()); +} + +void TDDFT::deflateTDA(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &old_Lambda_X, Tensor &S, Tensor old_S, + Tensor old_A, Tensor &omega, size_t &iteration, size_t &m) { + S = response_space_inner(Chi.X, Chi.X); + Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); + + // Debugging output + if (r_params.print_level() >= 2 and world.rank() == 0) { + print(" Overlap matrix:"); + print(S); + } + + // Augment S_x, A_x, x_gamma, x_response, V_x_response and x_gamma + // if using a larger subspace and not iteration zero (TODO ---Gotta + // look at this and make sure it uses my new functions molresponse ) + // by default r_params.larger_subspace() = 0 therefore never uses this + if (iteration < r_params.larger_subspace() and iteration > 0) { + print("Using augmented subspace"); + augment(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, XAX, old_S, old_A, + r_params.print_level()); + } + + // Solve Ax = Sxw + // Just to be sure dimensions work out, clear omega + omega.clear(); + diagonalizeFockMatrix(world, Chi, Lambda_X, omega, XAX, S, FunctionDefaults<3>::get_thresh()); + + // If larger subspace, need to "un-augment" everything + if (iteration < r_params.larger_subspace()) { + print("Unaugmenting subspace"); + unaugment(world, Chi, old_Chi, Lambda_X, old_Lambda_X, omega, S, XAX, old_S, old_A, + r_params.num_states(), iteration, r_params.print_level()); + } +} + +void TDDFT::deflateFull(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, + X_space &old_Lambda_X, Tensor &S, Tensor old_S, + Tensor old_A, Tensor &omega, size_t &iteration, size_t &m) { + // Debugging output + Tensor A; + + if (iteration < r_params.larger_subspace() and iteration > 0) { + print("Entering Augment Full"); + augment_full(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, A, old_S, old_A, + r_params.print_level()); + // computes Augments A and S + + } else { + S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); + if (world.rank() == 0 && (r_params.print_level() >= 10)) { + print("\n Overlap Matrix:"); + print(S); + } + X_space Chi_copy = Chi.copy(); + Chi_copy.truncate(); + A = inner(Chi_copy, Lambda_X); + if (world.rank() == 0 && (r_params.print_level() >= 10)) { + print("\n Lambda Matrix:"); + print(A); + } + } + + omega.clear(); + + Tensor U = diagonalizeFullResponseMatrix(world, Chi, Lambda_X, omega, S, A, + FunctionDefaults<3>::get_thresh(), + r_params.print_level()); + + if (iteration < r_params.larger_subspace() and iteration > 0) { + print("Entering Unaugment Full"); + unaugment_full(world, Chi, old_Chi, Lambda_X, old_Lambda_X, omega, S, A, old_S, old_A, + r_params.num_states(), iteration, r_params.print_level()); + } else { + old_Chi = Chi.copy(); + old_Lambda_X = Lambda_X.copy(); + } } // const double thresh, int print_level) { // Creates the XCOperator object and initializes it with correct // parameters -XCOperator TDDFT::create_XCOperator(World &world, - std::vector orbitals, +XCOperator TDDFT::create_XCOperator(World &world, std::vector orbitals, std::string xc) { - // First calculate the ground state density - std::vector vsq = square(world, ground_orbitals); // we square each orbital - compress(world, vsq); // compress into multiwavelet representation - real_function_3d rho = real_factory_3d(world); // create function rho - rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { - rho.gaxpy(1.0, vsq[i], 1.0, false); - } - world.gop.fence(); - - // And create the object using r_params.xc() - XCOperator xcop(world, - xc, - false, - rho, - rho); // world,which xc, spin_polarized? ,spinup, spindown - - return xcop; + // First calculate the ground state density + std::vector vsq = square(world, ground_orbitals);// we square each orbital + compress(world, vsq); // compress into multiwavelet representation + real_function_3d rho = real_factory_3d(world);// create function rho + rho.compress(); + for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], 1.0, false); } + world.gop.fence(); + + // And create the object using r_params.xc() + XCOperator xcop(world, xc, false, rho, + rho);// world,which xc, spin_polarized? ,spinup, spindown + + return xcop; } // Uses an XCOperator to construct v_xc for the ground state // density Returns d^2/d rho^2 E_xc[rho] std::vector TDDFT::create_fxc(World &world, std::vector &orbitals, - response_space &f, - response_space &g) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); + response_space &f, response_space &g) { + // Create the xcop + XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - // Next need the perturbed density - std::vector drho = transition_density(world, orbitals, f, g); + // Next need the perturbed density + std::vector drho = transition_density(world, orbitals, f, g); - // Return container - std::vector vxc; + // Return container + std::vector vxc; - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { - vxc.push_back(xc.apply_xc_kernel(drho[i])); - } - // for each density apply xckernel + // Finally create the functions we want, one per response state + // (xc_args_prep_response happens inside this call) + for (unsigned int i = 0; i < f.size(); i++) { vxc.push_back(xc.apply_xc_kernel(drho[i])); } + // for each density apply xckernel - return vxc; + return vxc; } // Uses an XCOperator to construct v_xc for the ground state // density Returns d^2/d rho^2 E_xc[rho] -std::vector TDDFT::GetWxcOnFDensities(World &world, - const std::vector &orbitals, - const response_space &f) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - // Next need the perturbed density - std::vector drhoM = GetTransitionDensities(world, orbitals, f); - // Return container - std::vector Wfxc; - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { - Wfxc.push_back(xc.apply_xc_kernel(drhoM[i])); - } - // for each density apply xckernel - - return Wfxc; +std::vector TDDFT::GetWxcOnFDensities( + World &world, const std::vector &orbitals, const response_space &f) { + // Create the xcop + XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); + // Next need the perturbed density + std::vector drhoM = GetTransitionDensities(world, orbitals, f); + // Return container + std::vector Wfxc; + // Finally create the functions we want, one per response state + // (xc_args_prep_response happens inside this call) + for (unsigned int i = 0; i < f.size(); i++) { Wfxc.push_back(xc.apply_xc_kernel(drhoM[i])); } + // for each density apply xckernel + + return Wfxc; } std::vector TDDFT::GetConjugateWxcOnFDensities( - World &world, - const std::vector &orbitals, - const response_space &f) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - - // Next need the perturbed density - std::vector drhoM = GetConjugateTransitionDensities(world, orbitals, f); - // Return container - std::vector conjugateWfvxc; - - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { - conjugateWfvxc.push_back(xc.apply_xc_kernel(drhoM[i])); - } - // for each density apply xckernel - - return conjugateWfvxc; -} - -std::vector TDDFT::CreateXCDerivative(World &world, - const std::vector &orbitals, - const response_space &f) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - size_t m = f.size(); // get the number of response functions - size_t n = f[0].size(); // get the number of orbitals function - - std::vector drho = zero_functions(world, m); - // Run over virtual... - for (size_t i = 0; i < m; i++) { - // Run over occupied... - for (size_t j = 0; j < n; j++) { - // y functions are zero if TDA is active - drho[i] = drho[i] + orbitals[j] * f[i][j]; //+ orbitals[j] * y[i][j]; - } - } - // Return container - std::vector vxc; - - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { - vxc.push_back(xc.apply_xc_kernel(drho[i])); - } - // for each density apply xckernel - - return vxc; + World &world, const std::vector &orbitals, const response_space &f) { + // Create the xcop + XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); + + // Next need the perturbed density + std::vector drhoM = GetConjugateTransitionDensities(world, orbitals, f); + // Return container + std::vector conjugateWfvxc; + + // Finally create the functions we want, one per response state + // (xc_args_prep_response happens inside this call) + for (unsigned int i = 0; i < f.size(); i++) { + conjugateWfvxc.push_back(xc.apply_xc_kernel(drhoM[i])); + } + // for each density apply xckernel + + return conjugateWfvxc; +} + +std::vector TDDFT::CreateXCDerivative( + World &world, const std::vector &orbitals, const response_space &f) { + // Create the xcop + XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); + size_t m = f.size(); // get the number of response functions + size_t n = f[0].size();// get the number of orbitals function + + std::vector drho = zero_functions(world, m); + // Run over virtual... + for (size_t i = 0; i < m; i++) { + // Run over occupied... + for (size_t j = 0; j < n; j++) { + // y functions are zero if TDA is active + drho[i] = drho[i] + orbitals[j] * f[i][j];//+ orbitals[j] * y[i][j]; + } + } + // Return container + std::vector vxc; + + // Finally create the functions we want, one per response state + // (xc_args_prep_response happens inside this call) + for (unsigned int i = 0; i < f.size(); i++) { vxc.push_back(xc.apply_xc_kernel(drho[i])); } + // for each density apply xckernel + + return vxc; } // Iterates the response functions until converged or out of iterations @@ -3111,170 +2769,167 @@ std::vector TDDFT::CreateXCDerivative(World &world, // Simplified iterate scheme for guesses // Create and diagonalize the CIS matrix for improved initial guess -response_space TDDFT::diagonalize_CIS_guess(World &world, - std::vector &virtuals, +response_space TDDFT::diagonalize_CIS_guess(World &world, std::vector &virtuals, Tensor &omega, std::vector &orbitals, - Tensor &energies, - double lo, - double thresh, + Tensor &energies, double lo, double thresh, size_t print_level) { - // Projecter for removing ground state - QProjector Q(world, orbitals); + // Projecter for removing ground state + QProjector Q(world, orbitals); - // Diagonalize under ground state hamiltonian a few times - // Create overlap - compress(world, virtuals); - Tensor S = matrix_inner(world, virtuals, virtuals); + // Diagonalize under ground state hamiltonian a few times + // Create overlap + compress(world, virtuals); + Tensor S = matrix_inner(world, virtuals, virtuals); - // Create Fock matrix - // -1 suppresses output - Tensor Fmat = CreateGroundHamiltonian(world, virtuals, -1); + // Create Fock matrix + // -1 suppresses output + Tensor Fmat = CreateGroundHamiltonian(world, virtuals, -1); - // Diagonalize - Tensor U, evals, dummy(virtuals.size()); - U = get_fock_transformation(world, S, Fmat, evals, thresh); + // Diagonalize + Tensor U, evals, dummy(virtuals.size()); + U = get_fock_transformation(world, S, Fmat, evals, thresh); - // Transform and truncate functions - virtuals = madness::transform(world, virtuals, U); - truncate(world, virtuals, thresh, false); + // Transform and truncate functions + virtuals = madness::transform(world, virtuals, U); + truncate(world, virtuals, thresh, false); - // filter out any ground state functions that crept in - std::vector true_virtuals; - for (unsigned int a = 0; a < virtuals.size(); a++) { - if (evals(a) > 0.0) true_virtuals.push_back(virtuals[a]); - } + // filter out any ground state functions that crept in + std::vector true_virtuals; + for (unsigned int a = 0; a < virtuals.size(); a++) { + if (evals(a) > 0.0) true_virtuals.push_back(virtuals[a]); + } - // Make sure we still have functions - if (true_virtuals.empty()) - MADNESS_EXCEPTION("Virtuals are empty: Too much overlap with occupied orbitals", 1); + // Make sure we still have functions + if (true_virtuals.empty()) + MADNESS_EXCEPTION("Virtuals are empty: Too much overlap with occupied orbitals", 1); - // Saving new components - virtuals = Q(true_virtuals); + // Saving new components + virtuals = Q(true_virtuals); - // Debugging output - if (print_level >= 2 and world.rank() == 0) print(" Remaining virtuals:", virtuals.size()); + // Debugging output + if (print_level >= 2 and world.rank() == 0) print(" Remaining virtuals:", virtuals.size()); - // Now make the CIS matrix (copied from Jakob) - if (world.rank() == 0) print(" Forming CIS matrix for improved initial guess."); + // Now make the CIS matrix (copied from Jakob) + if (world.rank() == 0) print(" Forming CIS matrix for improved initial guess."); - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); + // Start timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); - size_t I = -1; // combined index from i and a, start is -1 so that - // initial value - // is 0 - size_t J = -1; // combined index from j and b, start is -1 so that - // initial value - // is 0 + size_t I = -1;// combined index from i and a, start is -1 so that + // initial value + // is 0 + size_t J = -1;// combined index from j and b, start is -1 so that + // initial value + // is 0 - const size_t m = virtuals.size(); - const size_t n = orbitals.size(); + const size_t m = virtuals.size(); + const size_t n = orbitals.size(); - Tensor MCIS(m * n, m * n); - real_convolution_3d op = CoulombOperator(world, lo, thresh); + Tensor MCIS(m * n, m * n); + real_convolution_3d op = CoulombOperator(world, lo, thresh); - for (size_t i = 0; i < n; i++) { - const real_function_3d brai = orbitals[i]; - const std::vector igv = apply(world, op, virtuals * brai); - const std::vector igm = apply(world, op, orbitals * brai); + for (size_t i = 0; i < n; i++) { + const real_function_3d brai = orbitals[i]; + const std::vector igv = apply(world, op, virtuals * brai); + const std::vector igm = apply(world, op, orbitals * brai); + + for (size_t a = 0; a < m; a++) { + I++; + J = -1; + for (size_t j = 0; j < n; j++) { + const real_function_3d braj = orbitals[j]; + + for (size_t b = 0; b < m; b++) { + J++; + double diag_element = 0.0; + + if (i == j and a == b) diag_element = Fmat(a, a) - energies(i); + + MCIS(I, J) = diag_element + 2.0 * inner(braj * virtuals[b], igv[a]) - + inner(virtuals[a] * virtuals[b], igm[j]); + } + } + } + } - for (size_t a = 0; a < m; a++) { - I++; - J = -1; - for (size_t j = 0; j < n; j++) { - const real_function_3d braj = orbitals[j]; + // End timer + if (print_level >= 1) molresponse::end_timer(world, "Form CIS matrix:"); - for (size_t b = 0; b < m; b++) { - J++; - double diag_element = 0.0; + // Debugging output + if (print_level >= 2 and world.rank() == 0) { + print(" CIS matrix:"); + print(MCIS); + } - if (i == j and a == b) diag_element = Fmat(a, a) - energies(i); + // Diagonalize CIS matrix + syev(MCIS, U, evals); - MCIS(I, J) = diag_element + 2.0 * inner(braj * virtuals[b], igv[a]) - - inner(virtuals[a] * virtuals[b], igm[j]); - } - } - } - } - - // End timer - if (print_level >= 1) molresponse::end_timer(world, "Form CIS matrix:"); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" CIS matrix:"); - print(MCIS); - } - - // Diagonalize CIS matrix - syev(MCIS, U, evals); - - // Always print this? - if (world.rank() == 0) { - print(" Initial CIS matrix eigenvalues:"); - print(evals); - } - - // Now construct the initial guess - response_space f(world, U.dim(0), n); - omega = Tensor(U.dim(0)); - - I = -1; - for (size_t i = 0; i < n; i++) { - for (size_t a = 0; a < m; a++) { - I++; - J = -1; - if (evals(I) < 0.0) { - if (world.rank() == 0) print(" Skipping negative root:", evals(I)); - continue; - } - for (size_t j = 0; j < n; j++) { - for (size_t b = 0; b < m; b++) { - J++; - f[I][j] += U(J, I) * virtuals[b]; - omega(I) = evals(I); + // Always print this? + if (world.rank() == 0) { + print(" Initial CIS matrix eigenvalues:"); + print(evals); + } + + // Now construct the initial guess + response_space f(world, U.dim(0), n); + omega = Tensor(U.dim(0)); + + I = -1; + for (size_t i = 0; i < n; i++) { + for (size_t a = 0; a < m; a++) { + I++; + J = -1; + if (evals(I) < 0.0) { + if (world.rank() == 0) print(" Skipping negative root:", evals(I)); + continue; + } + for (size_t j = 0; j < n; j++) { + for (size_t b = 0; b < m; b++) { + J++; + f[I][j] += U(J, I) * virtuals[b]; + omega(I) = evals(I); + } + } } - } } - } - f.truncate_rf(); + f.truncate_rf(); - // Done. Whew. - return f; + // Done. Whew. + return f; } // Simplified iterate scheme for guesses void TDDFT::iterate_guess(World &world, X_space &guesses) { - // Variables needed to iterate - size_t iteration = 0; // Iteration counter - QProjector projector(world, - ground_orbitals); // Projector to project out ground state - size_t m = r_params.num_states(); // Number of excited states - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - Tensor x_shifts; // Holds the shifted energy values - response_space bsh_resp(world, m, n); // Holds wave function corrections - response_space V; // Holds V^0 applied to response functions - response_space shifted_V; // Holds the shifted V^0 applied to response functions - Tensor S; // Overlap matrix of response components for x states - real_function_3d v_xc; // For TDDFT - - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - // Useful to have - response_space zeros(world, m, n); - - // Now to iterate - while (iteration < r_params.guess_max_iter()) { - // Start a timer for this iteration - molresponse::start_timer(world); - // - size_t N0 = guesses.X.size(); - size_t Ni = N0; - - // No*exp(log(Np/N0)/p*t) to exponential decay - // the number of states down to 2*r_params.states - /* + // Variables needed to iterate + size_t iteration = 0;// Iteration counter + QProjector projector(world, + ground_orbitals);// Projector to project out ground state + size_t m = r_params.num_states(); // Number of excited states + size_t n = r_params.num_orbitals(); // Number of ground state orbitals + Tensor x_shifts; // Holds the shifted energy values + response_space bsh_resp(world, m, n); // Holds wave function corrections + response_space V; // Holds V^0 applied to response functions + response_space shifted_V;// Holds the shifted V^0 applied to response functions + Tensor S; // Overlap matrix of response components for x states + real_function_3d v_xc; // For TDDFT + + XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); + // Useful to have + response_space zeros(world, m, n); + + // Now to iterate + while (iteration < r_params.guess_max_iter()) { + // Start a timer for this iteration + molresponse::start_timer(world); + // + size_t N0 = guesses.X.size(); + size_t Ni = N0; + + // No*exp(log(Np/N0)/p*t) to exponential decay + // the number of states down to 2*r_params.states + /* if (iteration > 1 && r_params.guess_xyz() && Ni > Np) { Ni = std::ceil(N0 * std::exp(std::log(static_cast(Np) / static_cast(N0)) / @@ -3293,671 +2948,572 @@ select_functions(world, guesses.X, omega, Ni, r_params.print_level()); } */ - // Basic output - if (r_params.print_level() >= 1) { - if (world.rank() == 0) - printf("\n Guess Iteration %d at time %.1fs\n", static_cast(iteration), wall_time()); - if (world.rank() == 0) print(" -------------------------------------"); - } + // Basic output + if (r_params.print_level() >= 1) { + if (world.rank() == 0) + printf("\n Guess Iteration %d at time %.1fs\n", static_cast(iteration), + wall_time()); + if (world.rank() == 0) print(" -------------------------------------"); + } - // Load balance - // Only balancing on x-components. Smart? - if (world.size() > 1 && ((iteration < 2) or (iteration % 5 == 0)) and + // Load balance + // Only balancing on x-components. Smart? + if (world.size() > 1 && ((iteration < 2) or (iteration % 5 == 0)) and - iteration != 0) { - // Start a timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - if (world.rank() == 0) print(""); // Makes it more legible + iteration != 0) { + // Start a timer + if (r_params.print_level() >= 1) molresponse::start_timer(world); + if (world.rank() == 0) print("");// Makes it more legible - LoadBalanceDeux<3> lb(world); - for (size_t j = 0; j < n; j++) { - for (size_t k = 0; k < r_params.num_states(); k++) { - lb.add_tree(guesses.X[k][j], lbcost(1.0, 8.0), true); - } - } - FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); + LoadBalanceDeux<3> lb(world); + for (size_t j = 0; j < n; j++) { + for (size_t k = 0; k < r_params.num_states(); k++) { + lb.add_tree(guesses.X[k][j], lbcost(1.0, 8.0), true); + } + } + FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Load balancing:"); - } + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Load balancing:"); + } - // compute rho_omega - rho_omega = transition_densityTDA(world, ground_orbitals, guesses.X); - // Project out ground state - for (size_t i = 0; i < Ni; i++) guesses.X[i] = projector(guesses.X[i]); + // compute rho_omega + rho_omega = transition_densityTDA(world, ground_orbitals, guesses.X); + // Project out ground state + for (size_t i = 0; i < Ni; i++) guesses.X[i] = projector(guesses.X[i]); + + // Truncate before doing expensive things + guesses.X.truncate_rf(); + + // Normalize after projection + if (r_params.tda()) normalize(world, guesses.X); + + // (TODO why not normalize if not tda) + // compute Y = false + X_space Lambda_X = Compute_Lambda_X(world, guesses, xc, "tda"); + + deflateGuesses(world, guesses, Lambda_X, S, omega, iteration, m); + // Debugging output + + // Ensure right number of omegas + if (size_t(omega.dim(0)) != Ni) { + if (world.rank() == 0) + print("\n Adding", Ni - omega.dim(0), + "eigenvalue(s) (counters subspace size " + "reduction in " + "diagonalizatoin)."); + Tensor temp(Ni); + temp(Slice(0, omega.dim(0) - 1)) = omega; + for (size_t i = omega.dim(0); i < Ni; i++) temp[i] = 2.5 * i; + omega = copy(temp); + } - // Truncate before doing expensive things - guesses.X.truncate_rf(); + // Basic output + if (r_params.print_level() >= 1 and world.rank() == 0) { + print("\n Excitation Energies:"); + print("gi=", iteration, " roots: ", omega); + } - // Normalize after projection - if (r_params.tda()) normalize(world, guesses.X); + // Only do BSH if not the last iteration + if (iteration + 1 < r_params.guess_max_iter()) { + // Calculates shifts needed for potential / energies + // If none needed, the zero tensor is returned + x_shifts = create_shift(world, ground_energies, omega, r_params.print_level(), "x"); + + X_space theta_X = Compute_Theta_X(world, guesses, xc, "tda"); + theta_X.X = apply_shift(world, x_shifts, theta_X.X, guesses.X); + theta_X.X = theta_X.X * -2; + theta_X.X.truncate_rf(); + + // Construct BSH operators + std::vector>> bsh_x_operators = + create_bsh_operators(world, x_shifts, ground_energies, omega, r_params.lo(), + FunctionDefaults<3>::get_thresh()); + + // Apply BSH and get updated components + if (r_params.print_level() >= 1) molresponse::start_timer(world); + bsh_resp = apply(world, bsh_x_operators, theta_X.X); + if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply BSH:"); + + // Project out ground state + for (size_t i = 0; i < Ni; i++) bsh_resp[i] = projector(bsh_resp[i]); + // Save new components + guesses.X = bsh_resp; + // Apply mask + for (size_t i = 0; i < Ni; i++) guesses.X[i] = mask * guesses.X[i]; + } - // (TODO why not normalize if not tda) - // compute Y = false - X_space Lambda_X = Compute_Lambda_X(world, guesses, xc, "tda"); + // Ensure orthogonal guesses + for (size_t i = 0; i < 2; i++) { + molresponse::start_timer(world); + // Orthog + guesses.X = gram_schmidt(world, guesses.X); + molresponse::end_timer(world, "orthog"); + + molresponse::start_timer(world); + // Normalize + normalize(world, guesses.X); + molresponse::end_timer(world, "normalize"); + } - deflateGuesses(world, guesses, Lambda_X, S, omega, iteration, m); - // Debugging output + // Update counter + iteration += 1; + // Done with the iteration.. truncate + guesses.X.truncate_rf(); - // Ensure right number of omegas - if (size_t(omega.dim(0)) != Ni) { - if (world.rank() == 0) - print("\n Adding", - Ni - omega.dim(0), - "eigenvalue(s) (counters subspace size " - "reduction in " - "diagonalizatoin)."); - Tensor temp(Ni); - temp(Slice(0, omega.dim(0) - 1)) = omega; - for (size_t i = omega.dim(0); i < Ni; i++) temp[i] = 2.5 * i; - omega = copy(temp); + // Basic output + if (r_params.print_level() >= 1) {// + molresponse::end_timer(world, " This iteration:"); + } } +}// Done with iterate gues +// Simplified iterate scheme for guesses - // Basic output - if (r_params.print_level() >= 1 and world.rank() == 0) { - print("\n Excitation Energies:"); - print("gi=", iteration, " roots: ", omega); +// Adds in random noise to a vector of vector of functions +response_space TDDFT::add_randomness(World &world, response_space &f, double magnitude) { + // Copy input functions + response_space f_copy = f.copy(); + + // Lambda function to add in noise + auto noise = [](const Key<3> &key, Tensor &x) mutable { + Tensor y(x.size()); + y.fillrandom(); + // y.scale(magnitude); + y.scale(1e3); + x = x + y; + // x(0,0,0) += y(0,0,0)-0.5; + }; + // TODO + // Go through each function in f_copy and add in random noise + for (unsigned int i = 0; i < f_copy.size(); i++) { + for (unsigned int j = 0; j < f_copy[0].size(); j++) { + // Add in random noise using rng and a the defined lambda function + f_copy[i][j].unaryop(noise);// not sure how this workes + // i see we pass lambda function noise + } + + // Apply mask to get boundary condition right + f_copy[i] = mask * f_copy[i];// apply mask } - // Only do BSH if not the last iteration - if (iteration + 1 < r_params.guess_max_iter()) { - // Calculates shifts needed for potential / energies - // If none needed, the zero tensor is returned - x_shifts = create_shift(world, ground_energies, omega, r_params.print_level(), "x"); + // Done + return f_copy; +} - X_space theta_X = Compute_Theta_X(world, guesses, xc, "tda"); - theta_X.X = apply_shift(world, x_shifts, theta_X.X, guesses.X); - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); +// Creates the ground state hamiltonian from given functions f +Tensor TDDFT::CreateGroundHamiltonian(World &world, std::vector f, + size_t print_level) { + // Basic output + if (print_level >= 1) molresponse::start_timer(world); + // Get sizes + size_t m = f.size(); + // Debugging + if (print_level > 2) { + Tensor S = matrix_inner(world, f, f); + if (world.rank() == 0) print(" Ground state overlap:"); + if (world.rank() == 0) print(S); + } + // Calculate T + // Make the derivative operators in each direction + real_derivative_3d Dx(world, 0); + real_derivative_3d Dy(world, 1); + real_derivative_3d Dz(world, 2); + + // Apply derivatives once, and take inner products + // according to this formula (faster / less noise): + // < f | \nabla^2 | f > = - < \nabla f | \nabla f > + reconstruct(world, f); + std::vector fx = apply(world, Dx, f); + std::vector fy = apply(world, Dy, f); + std::vector fz = apply(world, Dz, f); + compress(world, fx, false); + compress(world, fy, false); + compress(world, fz, false); + world.gop.fence(); - // Construct BSH operators - std::vector>> bsh_x_operators = create_bsh_operators( - world, x_shifts, ground_energies, omega, r_params.lo(), FunctionDefaults<3>::get_thresh()); + // Construct T according to above formula + // Note: No negative as the formula above + // has one as well, so they cancel + Tensor T = 1.0 / 2.0 * + (matrix_inner(world, fx, fx) + matrix_inner(world, fy, fy) + + matrix_inner(world, fz, fz)); - // Apply BSH and get updated components - if (r_params.print_level() >= 1) molresponse::start_timer(world); - bsh_resp = apply(world, bsh_x_operators, theta_X.X); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply BSH:"); + // Construct V + // v_nuc first + potential_manager->make_nuclear_potential(world); + real_function_3d v_nuc = potential_manager->vnuclear(); + v_nuc.truncate(); - // Project out ground state - for (size_t i = 0; i < Ni; i++) bsh_resp[i] = projector(bsh_resp[i]); - // Save new components - guesses.X = bsh_resp; - // Apply mask - for (size_t i = 0; i < Ni; i++) guesses.X[i] = mask * guesses.X[i]; - } + // V_coul next + // This does not include final multiplication of each orbital + // 2 is from integrating out spin + real_function_3d v_coul = 2.0 * Coulomb(world); - // Ensure orthogonal guesses - for (size_t i = 0; i < 2; i++) { - molresponse::start_timer(world); - // Orthog - guesses.X = gram_schmidt(world, guesses.X); - molresponse::end_timer(world, "orthog"); + // Clear old stored potentials + stored_v_coul.clear(); + stored_v_nuc.clear(); - molresponse::start_timer(world); - // Normalize - normalize(world, guesses.X); - molresponse::end_timer(world, "normalize"); + // If storing potentials, save them here + if (r_params.store_potential()) { + stored_v_nuc = copy(v_nuc); + stored_v_coul = copy(v_coul); } - // Update counter - iteration += 1; - // Done with the iteration.. truncate - guesses.X.truncate_rf(); - - // Basic output - if (r_params.print_level() >= 1) { // - molresponse::end_timer(world, " This iteration:"); - } - } -} // Done with iterate gues -// Simplified iterate scheme for guesses + // Sum coulomb (pre multiplied) and v_nuc + // v_nuc comes out negative from potential manager, so add it + real_function_3d v = v_coul + v_nuc; -// Adds in random noise to a vector of vector of functions -response_space TDDFT::add_randomness(World &world, response_space &f, double magnitude) { - // Copy input functions - response_space f_copy = f.copy(); - - // Lambda function to add in noise - auto noise = [](const Key<3> &key, Tensor &x) mutable { - Tensor y(x.size()); - y.fillrandom(); - // y.scale(magnitude); - y.scale(1e3); - x = x + y; - // x(0,0,0) += y(0,0,0)-0.5; - }; - // TODO - // Go through each function in f_copy and add in random noise - for (unsigned int i = 0; i < f_copy.size(); i++) { - for (unsigned int j = 0; j < f_copy[0].size(); j++) { - // Add in random noise using rng and a the defined lambda function - f_copy[i][j].unaryop(noise); // not sure how this workes - // i see we pass lambda function noise - } - - // Apply mask to get boundary condition right - f_copy[i] = mask * f_copy[i]; // apply mask - } - - // Done - return f_copy; -} + // Apply V to f functions + std::vector vf = v * f; -// Creates the ground state hamiltonian from given functions f -Tensor TDDFT::CreateGroundHamiltonian(World &world, - std::vector f, - size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - // Get sizes - size_t m = f.size(); - // Debugging - if (print_level > 2) { - Tensor S = matrix_inner(world, f, f); - if (world.rank() == 0) print(" Ground state overlap:"); - if (world.rank() == 0) print(S); - } - // Calculate T - // Make the derivative operators in each direction - real_derivative_3d Dx(world, 0); - real_derivative_3d Dy(world, 1); - real_derivative_3d Dz(world, 2); - - // Apply derivatives once, and take inner products - // according to this formula (faster / less noise): - // < f | \nabla^2 | f > = - < \nabla f | \nabla f > - reconstruct(world, f); - std::vector fx = apply(world, Dx, f); - std::vector fy = apply(world, Dy, f); - std::vector fz = apply(world, Dz, f); - compress(world, fx, false); - compress(world, fy, false); - compress(world, fz, false); - world.gop.fence(); - - // Construct T according to above formula - // Note: No negative as the formula above - // has one as well, so they cancel - Tensor T = - 1.0 / 2.0 * (matrix_inner(world, fx, fx) + matrix_inner(world, fy, fy) + matrix_inner(world, fz, fz)); - - // Construct V - // v_nuc first - PotentialManager manager(g_params.molecule(), "a"); - manager.make_nuclear_potential(world); - real_function_3d v_nuc = manager.vnuclear(); - v_nuc.truncate(); - - // V_coul next - // This does not include final multiplication of each orbital - // 2 is from integrating out spin - real_function_3d v_coul = 2.0 * Coulomb(world); - - // Clear old stored potentials - stored_v_coul.clear(); - stored_v_nuc.clear(); - - // If storing potentials, save them here - if (r_params.store_potential()) { - stored_v_nuc = copy(v_nuc); - stored_v_coul = copy(v_coul); - } - - // Sum coulomb (pre multiplied) and v_nuc - // v_nuc comes out negative from potential manager, so add it - real_function_3d v = v_coul + v_nuc; - - // Apply V to f functions - std::vector vf = v * f; - - // Clear stored_potential - stored_potential.clear(); - - // ALWAYS DO THIS FOR THE STORED POTENTIAL!! - // exchange last - // 'small memory' algorithm from SCF.cc - real_convolution_3d op = CoulombOperator(world, r_params.lo(), FunctionDefaults<3>::get_thresh()); - std::vector Kf = zero_functions_compressed(world, m); - for (size_t i = 0; i < m; ++i) { - std::vector psif = mul_sparse(world, f[i], f, FunctionDefaults<3>::get_thresh()); - truncate(world, psif); - psif = apply(world, op, psif); - truncate(world, psif); - - // Save the potential here if we are saving it - if (r_params.store_potential()) { - stored_potential.push_back(psif); + // Clear stored_potential + stored_potential.clear(); + + // ALWAYS DO THIS FOR THE STORED POTENTIAL!! + // exchange last + // 'small memory' algorithm from SCF.cc + real_convolution_3d op = + CoulombOperator(world, r_params.lo(), FunctionDefaults<3>::get_thresh()); + std::vector Kf = zero_functions_compressed(world, m); + for (size_t i = 0; i < m; ++i) { + std::vector psif = + mul_sparse(world, f[i], f, FunctionDefaults<3>::get_thresh()); + truncate(world, psif); + psif = apply(world, op, psif); + truncate(world, psif); + + // Save the potential here if we are saving it + if (r_params.store_potential()) { stored_potential.push_back(psif); } + + psif = mul_sparse(world, f[i], psif, FunctionDefaults<3>::get_thresh()); + gaxpy(world, 1.0, Kf, 1.0, psif); + } + + // Only use the exchange above if HF: + Tensor V; + real_function_3d v_xc; + + if (r_params.xc() == "hf") { + // Construct V + V = matrix_inner(world, f, vf) - matrix_inner(world, f, Kf); + } else {// DFT + + XCOperator xcop = create_XCOperator(world, f, r_params.xc()); + + real_function_3d v_xc = xcop.make_xc_potential(); + v = v + v_xc; + std::vector vf = v * f; + if ((*xcop.xc).hf_exchange_coefficient() > 0.0) { + // XCOperator has member variable xc, which is an + // xcfunctional which has the hf_exchange_coeff we need here + gaxpy(world, 1.0, vf, -(*xcop.xc).hf_exchange_coefficient(), Kf); + } + V = matrix_inner(world, f, vf); } - psif = mul_sparse(world, f[i], psif, FunctionDefaults<3>::get_thresh()); - gaxpy(world, 1.0, Kf, 1.0, psif); - } + // Now create the hamiltonian + hamiltonian = T + V; - // Only use the exchange above if HF: - Tensor V; - real_function_3d v_xc; + for (int64_t i = 0; i < hamiltonian.dim(0); i++) { + for (int64_t j = i + 1; j < hamiltonian.dim(1); j++) { + // print(i, j); + // print(xAx(i, j)); + // print(xAx(j, i)); + hamiltonian(j, i) = hamiltonian(i, j); + } + } + double traceOfHamiltonian(0); + for (int64_t i = 0; i < hamiltonian.dim(0); i++) { traceOfHamiltonian += hamiltonian(i, i); } + print("Trace of Hamiltonian"); + print(traceOfHamiltonian); + // Save a matrix that is + // (T+V) - Lambda * eye + // Copy hamiltonian and zero the diagonal + ham_no_diag = copy(hamiltonian); + for (size_t i = 0; i < m; i++) ham_no_diag(i, i) = 0.0; - if (r_params.xc() == "hf") { - // Construct V - V = matrix_inner(world, f, vf) - matrix_inner(world, f, Kf); - } else { // DFT + // Debug output + if (print_level >= 2 and world.rank() == 0) { + print(" Ground state hamiltonian:"); + print(hamiltonian); + } - XCOperator xcop = create_XCOperator(world, f, r_params.xc()); + // End timer + if (print_level >= 1) molresponse::end_timer(world, " Create grnd ham:"); - real_function_3d v_xc = xcop.make_xc_potential(); - v = v + v_xc; - std::vector vf = v * f; - if ((*xcop.xc).hf_exchange_coefficient() > 0.0) { - // XCOperator has member variable xc, which is an - // xcfunctional which has the hf_exchange_coeff we need here - gaxpy(world, 1.0, vf, -(*xcop.xc).hf_exchange_coefficient(), Kf); - } - V = matrix_inner(world, f, vf); - } - - // Now create the hamiltonian - hamiltonian = T + V; - - for (int64_t i = 0; i < hamiltonian.dim(0); i++) { - for (int64_t j = i + 1; j < hamiltonian.dim(1); j++) { - // print(i, j); - // print(xAx(i, j)); - // print(xAx(j, i)); - hamiltonian(j, i) = hamiltonian(i, j); - } - } - double traceOfHamiltonian(0); - for (int64_t i = 0; i < hamiltonian.dim(0); i++) { - traceOfHamiltonian += hamiltonian(i, i); - } - print("Trace of Hamiltonian"); - print(traceOfHamiltonian); - // Save a matrix that is - // (T+V) - Lambda * eye - // Copy hamiltonian and zero the diagonal - ham_no_diag = copy(hamiltonian); - for (size_t i = 0; i < m; i++) ham_no_diag(i, i) = 0.0; - - // Debug output - if (print_level >= 2 and world.rank() == 0) { - print(" Ground state hamiltonian:"); - print(hamiltonian); - } - - // End timer - if (print_level >= 1) molresponse::end_timer(world, " Create grnd ham:"); - - return hamiltonian; + return hamiltonian; } functionT TDDFT::make_ground_density(World &world, const vecfuncT &v) { - tensorT occ = g_params.get_occ(); - vecfuncT vsq = square(world, v); - compress(world, vsq); - functionT rho = factoryT(world); - rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { - rho.gaxpy(1.0, vsq[i], double(1.0), false); - } - world.gop.fence(); - vsq.clear(); - return rho; + tensorT occ = g_params.get_occ(); + vecfuncT vsq = square(world, v); + compress(world, vsq); + functionT rho = factoryT(world); + rho.compress(); + for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], double(1.0), false); } + world.gop.fence(); + vsq.clear(); + return rho; } // Creates the transition densities std::vector TDDFT::transition_density(World &world, std::vector &orbitals, - response_space &x, - response_space &y) { - // Get sizes - size_t m = x.size(); - - // Return container - std::vector densities = zero_functions(world, m); - x.truncate_rf(); - y.truncate_rf(); - truncate(world, orbitals); - for (size_t b = 0; b < m; b++) { - // Run over occupied... - // y functions are zero if TDA is active - densities[b] = dot(world, x[b], orbitals); - densities[b] += dot(world, orbitals, y[b]); - } - - truncate(world, densities); - world.gop.fence(); - // Done! - return densities; -} - -std::vector TDDFT::transition_densityTDA(World &world, - std::vector const &orbitals, - response_space &x) { - // Get sizes - size_t m = x.size(); - // Return container - std::vector densities = zero_functions(world, m); - x.truncate_rf(); - truncate(world, ground_orbitals); - for (size_t b = 0; b < m; b++) { - // y functions are zero if TDA is active - densities[b] = dot(world, x[b], ground_orbitals); - } - - truncate(world, densities); - world.gop.fence(); - // Done! - return densities; + response_space &x, response_space &y) { + // Get sizes + size_t m = x.size(); + + // Return container + std::vector densities = zero_functions(world, m); + x.truncate_rf(); + y.truncate_rf(); + truncate(world, orbitals); + for (size_t b = 0; b < m; b++) { + // Run over occupied... + // y functions are zero if TDA is active + densities[b] = dot(world, x[b], orbitals); + densities[b] += dot(world, orbitals, y[b]); + } + + truncate(world, densities); + world.gop.fence(); + // Done! + return densities; +} + +std::vector TDDFT::transition_densityTDA( + World &world, std::vector const &orbitals, response_space &x) { + // Get sizes + size_t m = x.size(); + // Return container + std::vector densities = zero_functions(world, m); + x.truncate_rf(); + truncate(world, ground_orbitals); + for (size_t b = 0; b < m; b++) { + // y functions are zero if TDA is active + densities[b] = dot(world, x[b], ground_orbitals); + } + + truncate(world, densities); + world.gop.fence(); + // Done! + return densities; } // Creates the transition density -std::vector TDDFT::GetTransitionDensities(World &world, - const std::vector &orbitals, - const response_space &f) { - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - // Return container - std::vector densities = zero_functions(world, m); - - // Run over virtual... - for (size_t i = 0; i < m; i++) { - // Run over occupied... - for (size_t j = 0; j < n; j++) { - // y functions are zero if TDA is active - densities[i] = densities[i] + orbitals[j] * f[i][j]; - // densities[i] =densities[i] + orbitals[j] * dagger(f[i][j]);TODO: - // DAGGER - } - } - - // Done! - return densities; +std::vector TDDFT::GetTransitionDensities( + World &world, const std::vector &orbitals, const response_space &f) { + // Get sizes + size_t m = f.size(); + size_t n = f[0].size(); + // Return container + std::vector densities = zero_functions(world, m); + + // Run over virtual... + for (size_t i = 0; i < m; i++) { + // Run over occupied... + for (size_t j = 0; j < n; j++) { + // y functions are zero if TDA is active + densities[i] = densities[i] + orbitals[j] * f[i][j]; + // densities[i] =densities[i] + orbitals[j] * dagger(f[i][j]);TODO: + // DAGGER + } + } + + // Done! + return densities; } std::vector TDDFT::GetConjugateTransitionDensities( - World &world, - const std::vector &orbitals, - const response_space &f) { - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - // Return container - std::vector densities = zero_functions(world, m); - // Run over virtual... - for (size_t i = 0; i < m; i++) { - // Run over occupied... - for (size_t j = 0; j < n; j++) { - // y functions are zero if TDA is active - densities[i] = densities[i] + orbitals[j] * f[i][j]; - // densities[i] + orbitals[j] * dagger(f[i][j]) TODO: DAGGER; - } - } - // Done! - return densities; + World &world, const std::vector &orbitals, const response_space &f) { + // Get sizes + size_t m = f.size(); + size_t n = f[0].size(); + // Return container + std::vector densities = zero_functions(world, m); + // Run over virtual... + for (size_t i = 0; i < m; i++) { + // Run over occupied... + for (size_t j = 0; j < n; j++) { + // y functions are zero if TDA is active + densities[i] = densities[i] + orbitals[j] * f[i][j]; + // densities[i] + orbitals[j] * dagger(f[i][j]) TODO: DAGGER; + } + } + // Done! + return densities; } Tensor TDDFT::polarizability() { return -2 * inner(Chi, PQ); } void TDDFT::PrintPolarizabilityAnalysis(World &world, const Tensor polar_tensor) { - // Final polarizability analysis - // diagonalize - Tensor V, epolar; - syev(polar_tensor, V, epolar); - double Dpolar_average = 0.0; - double Dpolar_iso = 0.0; - for (unsigned int i = 0; i < 3; ++i) Dpolar_average = Dpolar_average + epolar[i]; - Dpolar_average = Dpolar_average / 3.0; - Dpolar_iso = sqrt(.5) * sqrt(std::pow(polar_tensor(0, 0) - polar_tensor(1, 1), 2) + - std::pow(polar_tensor(1, 1) - polar_tensor(2, 2), 2) + - std::pow(polar_tensor(2, 2) - polar_tensor(0, 0), 2)); - - if (world.rank() == 0) { - print("\nTotal Dynamic Polarizability Tensor"); - printf("\nFrequency = %.6f a.u.\n\n", omega(0, 0)); - // printf("\nWavelength = %.6f a.u.\n\n", r_params.omega() * ???); - print("Polarizability", "Final"); - print(polar_tensor); - printf("\tEigenvalues = "); - printf("\t %.6f \t %.6f \t %.6f \n", epolar[0], epolar[1], epolar[2]); - printf("\tIsotropic = \t %.6f \n", Dpolar_average); - printf("\tAnisotropic = \t %.6f \n", Dpolar_iso); - printf("\n"); - } -} -// TODO It makes sense to align the plots with the direction of the -// perturbation -// ?? -// TODO In excited state calculations we are going to get various -// directions. We should plot the functions with respect to - -/* @brief plot tranistions and ground orbitals in x y z direction - * - * @param world - * @param iteration - * @param x_response - * @param y_response - * @param r_params - * @param g_params - */ -void TDDFT::PlotGroundandResponseOrbitals(World &world, - size_t iteration, - response_space &x_response, - response_space &y_response, - ResponseParameters const &r_params, - GroundStateCalculation const &g_params) { - std::filesystem::create_directories("plots/densities"); - std::filesystem::create_directory("plots/orbitals"); - - // TESTING - // get transition density - // num orbitals - size_t n = x_response[0].size(); - size_t m = x_response.size(); - - real_function_3d rho0 = dot(world, ground_orbitals, ground_orbitals); - std::vector rho1 = transition_density(world, ground_orbitals, x_response, y_response); - std::string dir("xyz"); - // for plotname size - size_t buffSize = 500; - char plotname[buffSize]; - double Lp = std::min(r_params.L(), 24.0); - // Doing line plots along each axis - for (int d = 0; d < 3; d++) { - // print ground_state - plotCoords plt(d, Lp); - // plot ground density - if (iteration == 1) { - snprintf(plotname, buffSize, "plots/densities/rho0_%c_0.plt", dir[d]); - plot_line(plotname, 5001, plt.lo, plt.hi, rho0); - } - for (int i = 0; i < static_cast(n); i++) { - // print ground_state - // plot gound_orbitals - snprintf(plotname, buffSize, "plots/orbitals/phi0_%c_0_%d.plt", dir[d], static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, ground_orbitals[i]); - } - - for (int b = 0; b < static_cast(m); b++) { - // plot rho1 direction d state b - snprintf(plotname, buffSize, "plots/densities/rho1_%c_%d.plt", dir[d], static_cast(b)); - plot_line(plotname, 5001, plt.lo, plt.hi, rho1[b]); - - for (int i = 0; i < static_cast(n); i++) { - // print ground_state - // plot x function x_dir_b_i__k_iter - snprintf(plotname, - buffSize, - "plots/orbitals/phix_%c_%d_%d.plt", - dir[d], - static_cast(b), - static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, x_response[b][i]); - - // plot y functione y_dir_b_i__k_iter - snprintf(plotname, - buffSize, - "plots/orbitals/phiy_%c_%d_%d.plt", - dir[d], - static_cast(b), - static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, y_response[b][i]); - } - } - } - world.gop.fence(); - - // END TESTING -} - -void TDDFT::compute_and_print_polarizability(World &world, X_space &Chi, X_space &PQ, std::string message) { - Tensor G = -2 * inner(Chi, PQ); - if (world.rank() == 0) { - print("Polarizability", message); - print(G); - } -} - -void TDDFT::plot_excited_states(World &world, - size_t iteration, - response_space &x_response, - response_space &y_response, - ResponseParameters const &r_params, + // Final polarizability analysis + // diagonalize + Tensor V, epolar; + syev(polar_tensor, V, epolar); + double Dpolar_average = 0.0; + double Dpolar_iso = 0.0; + for (unsigned int i = 0; i < 3; ++i) Dpolar_average = Dpolar_average + epolar[i]; + Dpolar_average = Dpolar_average / 3.0; + Dpolar_iso = sqrt(.5) * sqrt(std::pow(polar_tensor(0, 0) - polar_tensor(1, 1), 2) + + std::pow(polar_tensor(1, 1) - polar_tensor(2, 2), 2) + + std::pow(polar_tensor(2, 2) - polar_tensor(0, 0), 2)); + + if (world.rank() == 0) { + print("\nTotal Dynamic Polarizability Tensor"); + printf("\nFrequency = %.6f a.u.\n\n", omega(0, 0)); + // printf("\nWavelength = %.6f a.u.\n\n", r_params.omega() * ???); + print("Polarizability", "Final"); + print(polar_tensor); + printf("\tEigenvalues = "); + printf("\t %.6f \t %.6f \t %.6f \n", epolar[0], epolar[1], epolar[2]); + printf("\tIsotropic = \t %.6f \n", Dpolar_average); + printf("\tAnisotropic = \t %.6f \n", Dpolar_iso); + printf("\n"); + } +} + + +void TDDFT::compute_and_print_polarizability(World &world, X_space &Chi, X_space &PQ, + std::string message) { + Tensor G = -2 * inner(Chi, PQ); + if (world.rank() == 0) { + print("Polarizability", message); + print(G); + } +} + +void TDDFT::plot_excited_states(World &world, size_t iteration, response_space &x_response, + response_space &y_response, ResponseParameters const &r_params, GroundStateCalculation const &g_params) { - std::filesystem::create_directories("plots/virtual"); - // num orbitals - size_t n = x_response[0].size(); - size_t m = x_response.size(); - - std::string dir("xyz"); - // for plotname size - size_t buffSize = 500; - char plotname[buffSize]; - double Lp = std::min(r_params.L(), 24.0); - // Doing line plots along each axis - for (int d = 0; d < 3; d++) { - // print ground_state - plotCoords plt(0, Lp); - for (int b = 0; b < static_cast(m); b++) { - for (int i = 0; i < static_cast(n); i++) { + std::filesystem::create_directories("plots/virtual"); + // num orbitals + size_t n = x_response[0].size(); + size_t m = x_response.size(); + + std::string dir("xyz"); + // for plotname size + size_t buffSize = 500; + char plotname[buffSize]; + double Lp = std::min(r_params.L(), 24.0); + // Doing line plots along each axis + for (int d = 0; d < 3; d++) { // print ground_state - // plot x function x_dir_b_i__k_iter - snprintf(plotname, - buffSize, - "plots/virtual/x_direction_%c_res_%d_orb_%d", - dir[d], - static_cast(b), - static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, x_response[b][i]); - - // plot y functione y_dir_b_i__k_iter - snprintf(plotname, - buffSize, - "plots/xy/y_direction_%c_res_%d_orb_%d", - dir[d], - static_cast(b), - static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, y_response[b][i]); - } - } - } - world.gop.fence(); - - // END TESTING + plotCoords plt(0, Lp); + for (int b = 0; b < static_cast(m); b++) { + for (int i = 0; i < static_cast(n); i++) { + // print ground_state + // plot x function x_dir_b_i__k_iter + snprintf(plotname, buffSize, "plots/virtual/x_direction_%c_res_%d_orb_%d", dir[d], + static_cast(b), static_cast(i)); + plot_line(plotname, 5001, plt.lo, plt.hi, x_response[b][i]); + + // plot y functione y_dir_b_i__k_iter + snprintf(plotname, buffSize, "plots/xy/y_direction_%c_res_%d_orb_%d", dir[d], + static_cast(b), static_cast(i)); + plot_line(plotname, 5001, plt.lo, plt.hi, y_response[b][i]); + } + } + } + world.gop.fence(); + + // END TESTING } vecfuncT TDDFT::project_ao_basis(World &world, const AtomicBasisSet &aobasis) { - // Make at_to_bf, at_nbf ... map from atom to first bf on atom, and nbf/atom - std::vector at_to_bf, at_nbf; - aobasis.atoms_to_bfn(molecule, at_to_bf, at_nbf); + // Make at_to_bf, at_nbf ... map from atom to first bf on atom, and nbf/atom + std::vector at_to_bf, at_nbf; + aobasis.atoms_to_bfn(molecule, at_to_bf, at_nbf); - return project_ao_basis_only(world, aobasis, molecule); + return project_ao_basis_only(world, aobasis, molecule); } -vecfuncT TDDFT::project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, const Molecule &molecule) { - vecfuncT ao = vecfuncT(aobasis.nbf(molecule)); - for (int i = 0; i < aobasis.nbf(molecule); ++i) { - functorT aofunc(new AtomicBasisFunctor(aobasis.get_atomic_basis_function(molecule, i))); - ao[i] = factoryT(world).functor(aofunc).truncate_on_project().nofence().truncate_mode(1); - } - world.gop.fence(); - truncate(world, ao); - madness::normalize(world, ao); - return ao; +vecfuncT TDDFT::project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, + const Molecule &molecule) { + vecfuncT ao = vecfuncT(aobasis.nbf(molecule)); + for (int i = 0; i < aobasis.nbf(molecule); ++i) { + functorT aofunc(new AtomicBasisFunctor(aobasis.get_atomic_basis_function(molecule, i))); + ao[i] = factoryT(world).functor(aofunc).truncate_on_project().nofence().truncate_mode(1); + } + world.gop.fence(); + truncate(world, ao); + madness::normalize(world, ao); + return ao; } -static double rsquared(const coordT &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } /// A MADNESS functor to compute either x, y, or z class DipoleFunctor : public FunctionFunctorInterface { - private: - const int axis; +private: + const int axis; - public: - DipoleFunctor(int axis) : axis(axis) {} +public: + DipoleFunctor(int axis) : axis(axis) {} - double operator()(const coordT &x) const { return x[axis]; } + double operator()(const coordT &x) const { return x[axis]; } }; /// A MADNESS functor to compute the cartesian moment x^i * y^j * z^k (i, j, k /// integer and >= 0) class MomentFunctor : public FunctionFunctorInterface { - private: - const int i, j, k; +private: + const int i, j, k; - public: - MomentFunctor(int i, int j, int k) : i(i), j(j), k(k) {} +public: + MomentFunctor(int i, int j, int k) : i(i), j(j), k(k) {} - MomentFunctor(const std::vector &x) : i(x[0]), j(x[1]), k(x[2]) {} + MomentFunctor(const std::vector &x) : i(x[0]), j(x[1]), k(x[2]) {} - double operator()(const coordT &r) const { - double xi = 1.0, yj = 1.0, zk = 1.0; - for (int p = 0; p < i; ++p) xi *= r[0]; - for (int p = 0; p < j; ++p) yj *= r[1]; - for (int p = 0; p < k; ++p) zk *= r[2]; - return xi * yj * zk; - } + double operator()(const coordT &r) const { + double xi = 1.0, yj = 1.0, zk = 1.0; + for (int p = 0; p < i; ++p) xi *= r[0]; + for (int p = 0; p < j; ++p) yj *= r[1]; + for (int p = 0; p < k; ++p) zk *= r[2]; + return xi * yj * zk; + } }; void TDDFT::analyze_vectors(World &world, const vecfuncT &x, std::string response_state) { - molresponse::start_timer(world); - AtomicBasisSet sto3g("sto-3g"); - vecfuncT ao = project_ao_basis(world, sto3g); - - tensorT C = matrix_inner(world, ao, x); - int nmo1 = x.size(); - tensorT rsq, dip(3, nmo1); - { - functionT frsq = factoryT(world).f(rsquared).initial_level(4); - // - // - rsq = inner(world, x, mul_sparse(world, frsq, x, vtol)); - for (int axis = 0; axis < 3; ++axis) { - // x y z - functionT fdip = factoryT(world).functor(functorT(new madness::DipoleFunctor(axis))).initial_level(4); - dip(axis, _) = inner(world, x, mul_sparse(world, fdip, x, vtol)); - // - ^2-^2-^2 - for (int i = 0; i < nmo1; ++i) rsq(i) -= dip(axis, i) * dip(axis, i); - } - } - molresponse::end_timer(world, "Analyze vectors"); - - long nmo = x.size(); - size_t ncoeff = 0; - for (long i = 0; i < nmo; ++i) { - size_t ncoeffi = x[i].size(); - ncoeff += ncoeffi; - if (world.rank() == 0 and (r_params.print_level() > 1)) { - print(response_state + " orbital : ", i); - - printf("ncoeff=%.2e:", (double)ncoeffi); - - printf("center=(%.2f,%.2f,%.2f) : radius=%.2f\n", dip(0, i), dip(1, i), dip(2, i), sqrt(rsq(i))); - sto3g.print_anal(molecule, C(i, _)); - printf("total number of coefficients = %.8e\n\n", double(ncoeff)); - } - } + molresponse::start_timer(world); + AtomicBasisSet sto3g("sto-3g"); + vecfuncT ao = project_ao_basis(world, sto3g); + + tensorT C = matrix_inner(world, ao, x); + int nmo1 = x.size(); + tensorT rsq, dip(3, nmo1); + { + functionT frsq = factoryT(world).f(rsquared).initial_level(4); + // + // + rsq = inner(world, x, mul_sparse(world, frsq, x, vtol)); + for (int axis = 0; axis < 3; ++axis) { + // x y z + functionT fdip = factoryT(world) + .functor(functorT(new madness::DipoleFunctor(axis))) + .initial_level(4); + dip(axis, _) = inner(world, x, mul_sparse(world, fdip, x, vtol)); + // - ^2-^2-^2 + for (int i = 0; i < nmo1; ++i) rsq(i) -= dip(axis, i) * dip(axis, i); + } + } + molresponse::end_timer(world, "Analyze vectors"); + + long nmo = x.size(); + size_t ncoeff = 0; + for (long i = 0; i < nmo; ++i) { + size_t ncoeffi = x[i].size(); + ncoeff += ncoeffi; + if (world.rank() == 0 and (r_params.print_level() > 1)) { + print(response_state + " orbital : ", i); + + printf("ncoeff=%.2e:", (double) ncoeffi); + + printf("center=(%.2f,%.2f,%.2f) : radius=%.2f\n", dip(0, i), dip(1, i), dip(2, i), + sqrt(rsq(i))); + sto3g.print_anal(molecule, C(i, _)); + printf("total number of coefficients = %.8e\n\n", double(ncoeff)); + } + } } // Main function, makes sure everything happens in correct order // compute the frequency response, r_params sets the the calculation type. diff --git a/src/apps/molresponse/TDDFT.h b/src/apps/molresponse/TDDFT.h index 94338e054cd..815b4198298 100644 --- a/src/apps/molresponse/TDDFT.h +++ b/src/apps/molresponse/TDDFT.h @@ -3,11 +3,11 @@ #ifndef SRC_APPS_MOLRESPONSE_TDDFT_H_ #define SRC_APPS_MOLRESPONSE_TDDFT_H_ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include // The kain solver @@ -195,7 +195,7 @@ class TDDFT { // Normalizes in the response sense void normalize(World& world, response_space& f, response_space& g); // Normalize X_space xx-yy=1 - void normalize(World& world, X_space& Chi); + void normalize(World& world, X_space& chi); // Prints norms of the given vector void print_norms(World& world, response_space function); diff --git a/src/apps/molresponse/calc_runner.cc b/src/apps/molresponse/calc_runner.cc index 15689505f5f..70100f5670e 100644 --- a/src/apps/molresponse/calc_runner.cc +++ b/src/apps/molresponse/calc_runner.cc @@ -1,4 +1,5 @@ // Copyright 2021 Adrian Hurtado +#include #include #include @@ -9,13 +10,12 @@ #include #include "Plot_VTK.h" -#include #include "TDDFT.h" -#include "madness/chem/NWChem.h" // For nwchem interface -#include "madness/chem/SCFOperators.h" -#include "madness/chem/molecule.h" -#include "madness/chem/potentialmanager.h" -#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "chem/NWChem.h"// For nwchem interface +#include "chem/SCFOperators.h" +#include "chem/molecule.h" +#include "chem/potentialmanager.h" +#include "chem/projector.h"// For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "molresponse/basic_operators.h" #include "molresponse/density.h" @@ -27,758 +27,682 @@ #include "molresponse/x_space.h" - -template +template void TDDFT::set_protocol(World& world, double thresh) { - size_t k; - // Allow for imprecise conversion of threshold - if (thresh >= 0.9e-2) - k = 4; - else if (thresh >= 0.9e-4) - k = 6; - else if (thresh >= 0.9e-6) - k = 8; - else if (thresh >= 0.9e-8) - k = 10; - else - k = 12; - - // k defaults to make sense with thresh, override by providing k in - // input file - if (r_params.k() == -1) { - FunctionDefaults::set_k(k); - } else { - FunctionDefaults::set_k(r_params.k()); - } - - // MolDFT sets all these, so copying - FunctionDefaults::set_thresh(thresh); - FunctionDefaults::set_refine(true); - FunctionDefaults::set_initial_level(2); - - FunctionDefaults::set_autorefine(false); - FunctionDefaults::set_apply_randomize(false); - FunctionDefaults::set_project_randomize(false); - GaussianConvolution1DCache::map.clear(); - double safety = 0.1; - vtol = FunctionDefaults::get_thresh() * safety; - coulop = poperatorT(CoulombOperatorPtr(world, r_params.lo(), thresh)); - gradop = gradient_operator(world); - // GaussianConvolution1DCache::map.clear();//(TODO:molresponse-What - // is this? Do i need it?) - rho0 = make_ground_density(world, ground_orbitals); - - // Create the masking function - mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); - // dconv defaults to thresh*100, overrirde by providing dconv in input - // file - if (r_params.dconv_set() == false) { - r_params.set_derived_value("dconv", thresh * 100); - } - - // Basic print - if (world.rank() == 0) { - print("\nSolving NDIM=", - NDIM, - " with thresh", - thresh, - " k", - FunctionDefaults::get_k(), - " dconv", - std::max(thresh, r_params.dconv()), - "\n"); - } + size_t k; + // Allow for imprecise conversion of threshold + if (thresh >= 0.9e-2) k = 4; + else if (thresh >= 0.9e-4) + k = 6; + else if (thresh >= 0.9e-6) + k = 8; + else if (thresh >= 0.9e-8) + k = 10; + else + k = 12; + + // k defaults to make sense with thresh, override by providing k in + // input file + if (r_params.k() == -1) { + FunctionDefaults::set_k(k); + } else { + FunctionDefaults::set_k(r_params.k()); + } + + // MolDFT sets all these, so copying + FunctionDefaults::set_thresh(thresh); + FunctionDefaults::set_refine(true); + FunctionDefaults::set_initial_level(2); + + FunctionDefaults::set_autorefine(false); + FunctionDefaults::set_apply_randomize(false); + FunctionDefaults::set_project_randomize(false); + GaussianConvolution1DCache::map.clear(); + double safety = 0.1; + vtol = FunctionDefaults::get_thresh() * safety; + coulop = poperatorT(CoulombOperatorPtr(world, r_params.lo(), thresh)); + gradop = gradient_operator(world); + potential_manager = std::make_shared(molecule, "a"); + potential_manager->make_nuclear_potential(world); + // GaussianConvolution1DCache::map.clear();//(TODO:molresponse-What + // is this? Do i need it?) + rho0 = make_ground_density(world, ground_orbitals); + + // Create the masking function + mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); + // dconv defaults to thresh*100, overrirde by providing dconv in input + // file + if (r_params.dconv_set() == false) { + r_params.set_derived_value("dconv", thresh * 100); + } + + // Basic print + if (world.rank() == 0) { + print("\nSolving NDIM=", NDIM, " with thresh", thresh, " k", + FunctionDefaults::get_k(), " dconv", std::max(thresh, r_params.dconv()), "\n"); + } } void TDDFT::check_k(World& world, double thresh, size_t k) { - // Boolean to redo ground hamiltonian calculation if - // ground state orbitals change - bool redo = false; - - // Verify ground state orbitals have correct k - if (FunctionDefaults<3>::get_k() != ground_orbitals[0].k()) { - // Re-read orbitals from the archive (assuming - // the archive has orbitals stored at a higher - // k value than what was previously computed - // with) - g_params.read(world); - reconstruct(world, ground_orbitals); - - // Reset correct k (its set in g_params.read) - FunctionDefaults<3>::set_k(k); - - // Project each ground state to correct k - for (unsigned int i = 0; i < ground_orbitals.size(); i++) - ground_orbitals[i] = project(ground_orbitals[i], FunctionDefaults<3>::get_k(), thresh, false); - world.gop.fence(); - - // Clean up a bit - truncate(world, ground_orbitals); - - // Ground state orbitals changed, clear old hamiltonian - redo = true; - } - - // Recalculate ground state hamiltonian here - if (redo or !hamiltonian.has_data()) { - hamiltonian = CreateGroundHamiltonian(world, ground_orbitals, r_params.print_level()); - } - - // If we stored the potential, check that too - if (r_params.store_potential()) { - if (FunctionDefaults<3>::get_k() != stored_potential[0][0].k()) { - // Project the potential into correct k - for (unsigned int i = 0; i < stored_potential.size(); i++) { - reconstruct(world, stored_potential[i]); - for (unsigned int j = 0; j < stored_potential[0].size(); j++) - stored_potential[i][j] = - project(stored_potential[i][j], FunctionDefaults<3>::get_k(), thresh, false); + // Boolean to redo ground hamiltonian calculation if + // ground state orbitals change + bool redo = false; + + // Verify ground state orbitals have correct k + if (FunctionDefaults<3>::get_k() != ground_orbitals[0].k()) { + // Re-read orbitals from the archive (assuming + // the archive has orbitals stored at a higher + // k value than what was previously computed + // with) + g_params.read(world); + reconstruct(world, ground_orbitals); + + // Reset correct k (its set in g_params.read) + FunctionDefaults<3>::set_k(k); + + // Project each ground state to correct k + for (unsigned int i = 0; i < ground_orbitals.size(); i++) + ground_orbitals[i] = + project(ground_orbitals[i], FunctionDefaults<3>::get_k(), thresh, false); world.gop.fence(); - } + + // Clean up a bit + truncate(world, ground_orbitals); + rho0 = make_ground_density(world, ground_orbitals); + + // Ground state orbitals changed, clear old hamiltonian + redo = true; } - if (FunctionDefaults<3>::get_k() != stored_v_coul.k()) - stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, false); - if (FunctionDefaults<3>::get_k() != stored_v_nuc.k()) - stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, false); - } - - // Verify response functions have correct k - if (Chi.X.size() != 0) { - if (FunctionDefaults<3>::get_k() != Chi.X[0].at(0).k()) { - // Project all x components into correct k - for (unsigned int i = 0; i < Chi.X.size(); i++) { - reconstruct(world, Chi.X[i]); - for (unsigned int j = 0; j < Chi.X[0].size(); j++) - Chi.X[i][j] = project(Chi.X[i][j], FunctionDefaults<3>::get_k(), thresh, false); - world.gop.fence(); - } - Chi.X.truncate_rf(); - - // Do same for y components if applicable - // (Always do this, as y will be zero - // and still used in doing DFT and TDA) - // Project all y components into correct k - for (unsigned int i = 0; i < Chi.Y.size(); i++) { - reconstruct(world, Chi.Y[i]); - for (unsigned int j = 0; j < Chi.Y[0].size(); j++) - Chi.Y[i][j] = project(Chi.Y[i][j], FunctionDefaults<3>::get_k(), thresh, false); - world.gop.fence(); - } - Chi.Y.truncate_rf(); + + // Recalculate ground state hamiltonian here + if (redo or !hamiltonian.has_data()) { + hamiltonian = CreateGroundHamiltonian(world, ground_orbitals, r_params.print_level()); } - } - // Verify response functions have correct k - if (Chi.X.size() != 0) { - if (FunctionDefaults<3>::get_k() != Chi.X[0][0].k()) { - // Project all x components into correct k - for (unsigned int i = 0; i < Chi.X.size(); i++) { - reconstruct(world, Chi.X[i]); - for (unsigned int j = 0; j < Chi.X[0].size(); j++) - Chi.X[i][j] = project(Chi.X[i][j], FunctionDefaults<3>::get_k(), thresh, false); - world.gop.fence(); - } - Chi.X.truncate_rf(); - - // Do same for y components if applicable - // (Always do this, as y will be zero - // and still used in doing DFT and TDA) - // Project all y components into correct k - for (unsigned int i = 0; i < Chi.Y.size(); i++) { - reconstruct(world, Chi.Y[i]); - for (unsigned int j = 0; j < Chi.Y[0].size(); j++) - Chi.Y[i][j] = project(Chi.Y[i][j], FunctionDefaults<3>::get_k(), thresh, false); - world.gop.fence(); - } - Chi.Y.truncate_rf(); + + // If we stored the potential, check that too + if (r_params.store_potential()) { + if (FunctionDefaults<3>::get_k() != stored_potential[0][0].k()) { + // Project the potential into correct k + for (unsigned int i = 0; i < stored_potential.size(); i++) { + reconstruct(world, stored_potential[i]); + for (unsigned int j = 0; j < stored_potential[0].size(); j++) + stored_potential[i][j] = project(stored_potential[i][j], + FunctionDefaults<3>::get_k(), thresh, false); + world.gop.fence(); + } + } + if (FunctionDefaults<3>::get_k() != stored_v_coul.k()) + stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, false); + if (FunctionDefaults<3>::get_k() != stored_v_nuc.k()) + stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, false); } - } - - // Don't forget the mask function as well - if (FunctionDefaults<3>::get_k() != mask.k()) { - mask = project(mask, FunctionDefaults<3>::get_k(), thresh, false); - } - // Don't forget right hand side - - // Verify response functions have correct k - if (PQ.X.size() != 0) { - if (FunctionDefaults<3>::get_k() != PQ.X[0][0].k()) { - // Project all x components into correct k - for (unsigned int i = 0; i < Chi.X.size(); i++) { - reconstruct(world, PQ.X[i]); - for (unsigned int j = 0; j < PQ.X[0].size(); j++) - PQ.X[i][j] = project(PQ.X[i][j], FunctionDefaults<3>::get_k(), thresh, false); - world.gop.fence(); - } - Chi.X.truncate_rf(); - - // Do same for y components if applicable - // (Always do this, as y will be zero - // and still used in doing DFT and TDA) - // Project all y components into correct k - for (unsigned int i = 0; i < PQ.Y.size(); i++) { - reconstruct(world, PQ.Y[i]); - for (unsigned int j = 0; j < PQ.Y[0].size(); j++) - PQ.Y[i][j] = project(PQ.Y[i][j], FunctionDefaults<3>::get_k(), thresh, false); - world.gop.fence(); - } - Chi.Y.truncate_rf(); + + // Verify response functions have correct k + if (Chi.X.size() != 0) { + if (FunctionDefaults<3>::get_k() != Chi.X[0].at(0).k()) { + for (auto& xi: Chi.X) { + reconstruct(world, xi); + for (auto& xij: xi) { + xij = project(xij, FunctionDefaults<3>::get_k(), thresh, false); + } + world.gop.fence(); + } + } + } + if (Chi.Y.size() != 0) { + if (FunctionDefaults<3>::get_k() != Chi.Y[0].at(0).k()) { + for (auto& yi: Chi.Y) { + reconstruct(world, yi); + for (auto& yij: yi) { + yij = project(yij, FunctionDefaults<3>::get_k(), thresh, false); + } + world.gop.fence(); + } + Chi.truncate(); + } } - } - // Make sure everything is done before leaving - world.gop.fence(); + + // Don't forget the mask function as well + if (FunctionDefaults<3>::get_k() != mask.k()) { + mask = project(mask, FunctionDefaults<3>::get_k(), thresh, false); + } + // Don't forget right hand side + + // Verify response functions have correct k + if (PQ.X.size() != 0) { + if (FunctionDefaults<3>::get_k() != PQ.X[0][0].k()) { + // Project all x components into correct k + for (auto& pi: PQ.X) { + reconstruct(world, pi); + for (auto& pij: pi) { + pij = project(pij, FunctionDefaults<3>::get_k(), thresh, false); + } + world.gop.fence(); + } + PQ.X.truncate_rf(); + } + } + if (PQ.Y.size() != 0) { + if (FunctionDefaults<3>::get_k() != PQ.Y[0][0].k()) { + for (auto& qi: PQ.Y) { + reconstruct(world, qi); + for (auto& qij: qi) { + qij = project(qij, FunctionDefaults<3>::get_k(), thresh, false); + } + world.gop.fence(); + } + } + PQ.Y.truncate_rf(); + } + world.gop.fence(); } +// Make sure everything is done before leaving // Creates random guess functions semi-intelligently(?) -X_space TDDFT::create_random_guess(World& world, - size_t m, // m response states - size_t n, // n ground states - std::vector& grounds, // guess should have size n - Molecule& molecule) { - // Basic output - if (world.rank() == 0) print(" Using a random guess for initial response functions.\n"); - - // Create empty container and add in randomness - X_space f(world, m, n); - f.X = add_randomness(world, f.X, 1e3); // noise all over the world - - // Create and apply a centered gaussian on each atom so that the - // randomness is localized around the atoms - real_function_3d gaus = real_factory_3d(world); - for (auto atom : molecule.get_atoms()) { - real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new GaussianGuess<3>(atom.get_coords(), 0.01, std::vector{0, 0, 0}))); - gaus = gaus + x; - } - f = f * gaus; - - // Project out groundstate from guesses - QProjector projector(world, grounds); - for (unsigned int i = 0; i < f.num_states(); i++) f.X[i] = projector(f.X[i]); - - // Normalize - normalize(world, f.X); - - return f; +X_space TDDFT::create_random_guess( + World& world, + size_t m, // m response states + size_t n, // n ground states + std::vector& grounds,// guess should have size n + Molecule& molecule) { + // Basic output + if (world.rank() == 0) print(" Using a random guess for initial response functions.\n"); + + // Create empty container and add in randomness + X_space f(world, m, n); + f.X = add_randomness(world, f.X, 1e3);// noise all over the world + + // Create and apply a centered gaussian on each atom so that the + // randomness is localized around the atoms + real_function_3d gaus = real_factory_3d(world); + for (auto atom: molecule.get_atoms()) { + real_function_3d x = real_factory_3d(world).functor(real_functor_3d( + new GaussianGuess<3>(atom.get_coords(), 0.01, std::vector{0, 0, 0}))); + gaus = gaus + x; + } + f = f * gaus; + + // Project out groundstate from guesses + QProjector projector(world, grounds); + for (unsigned int i = 0; i < f.num_states(); i++) f.X[i] = projector(f.X[i]); + + // Normalize + normalize(world, f.X); + + return f; } // Creates random guess functions semi-intelligently(?) -std::vector TDDFT::create_random_guess(World& world, - size_t m, +std::vector TDDFT::create_random_guess(World& world, size_t m, std::vector& grounds, Molecule& molecule) { - // Basic output - if (world.rank() == 0) print(" Using a random guess for initial response functions."); - - // Create empty container and add in randomness - std::vector f = zero_functions_compressed(world, m); - // create vector of m functions:w - - // Create and apply a centered gaussian on each atom so that the - // randomness is localized around the atoms - real_function_3d gaus = real_factory_3d(world); - for (auto atom : molecule.get_atoms()) { - real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new GaussianGuess<3>(atom.get_coords(), 0.01, std::vector{0, 0, 0}))); - gaus = gaus + x; - } - - // Lambda function to add in noise - auto lambda = [](const Key<3>& key, Tensor& x) mutable { - Tensor y(x.size()); - y.fillrandom(); - y.scale(1e3); - x = x + y; - }; - - // Go through each function in f_copy and add in random noise - for (unsigned int i = 0; i < f.size(); i++) { - // Add in random noise using rng and a the defined lambda function - f[i].unaryop(lambda); - - // Apply mask to get boundary condition right - f[i] = mask * f[i] * gaus; - } - - // Project out groundstate from guesses - QProjector projector(world, grounds); - for (unsigned int i = 0; i < f.size(); i++) f[i] = projector(f[i]); - - // Normalize - for (unsigned int i = 0; i < f.size(); i++) { - double norm = f[i].norm2(); - f[i].scale(1.0 / norm); - } - - return f; + // Basic output + if (world.rank() == 0) print(" Using a random guess for initial response functions."); + + // Create empty container and add in randomness + std::vector f = zero_functions_compressed(world, m); + // create vector of m functions:w + + // Create and apply a centered gaussian on each atom so that the + // randomness is localized around the atoms + real_function_3d gaus = real_factory_3d(world); + for (auto atom: molecule.get_atoms()) { + real_function_3d x = real_factory_3d(world).functor(real_functor_3d( + new GaussianGuess<3>(atom.get_coords(), 0.01, std::vector{0, 0, 0}))); + gaus = gaus + x; + } + + // Lambda function to add in noise + auto lambda = [](const Key<3>& key, Tensor& x) mutable { + Tensor y(x.size()); + y.fillrandom(); + y.scale(1e3); + x = x + y; + }; + + // Go through each function in f_copy and add in random noise + for (unsigned int i = 0; i < f.size(); i++) { + // Add in random noise using rng and a the defined lambda function + f[i].unaryop(lambda); + + // Apply mask to get boundary condition right + f[i] = mask * f[i] * gaus; + } + + // Project out groundstate from guesses + QProjector projector(world, grounds); + for (unsigned int i = 0; i < f.size(); i++) f[i] = projector(f[i]); + + // Normalize + for (unsigned int i = 0; i < f.size(); i++) { + double norm = f[i].norm2(); + f[i].scale(1.0 / norm); + } + + return f; } // Creates an initial guess function from nwchem output files X_space TDDFT::create_nwchem_guess(World& world, size_t m) { - // Basic output - if (world.rank() == 0) print(" Creating an initial guess from NWChem file", r_params.nwchem_dir()); - - // Create empty containers - response_space f; - - // Create the nwchem reader - slymer::NWChem_Interface nwchem(r_params.nwchem_dir(), std::cout); - - // For parallel runs, silencing all but 1 slymer instance - if (world.rank() != 0) { - std::ostream dev_null(nullptr); - nwchem.err = dev_null; - } - - // Read in basis set - nwchem.read(slymer::Properties::Basis); - - // Read in the molecular orbital coefficients, energies, - // and occupancies - nwchem.read(slymer::Properties::MOs | slymer::Properties::Energies | slymer::Properties::Occupancies); - - // Create the nwchem orbitals as madness functions - std::vector temp1; - for (auto basis : slymer::cast_basis(nwchem.basis_set)) { - // Get the center of gaussian as its special point - std::vector centers; - coord_3d r; - r[0] = basis.get().center[0]; - r[1] = basis.get().center[1]; - r[2] = basis.get().center[2]; - centers.push_back(r); - - // Now make the function - temp1.push_back( - FunctionFactory(world).functor(std::shared_ptr>( - new slymer::Gaussian_Functor(basis.get(), centers)))); - - // Let user know something is going on - if (temp1.size() % 10 == 0 and world.rank() == 0) print("Created", temp1.size(), "functions."); - } - if (world.rank() == 0) print("Finished creating", temp1.size(), "functions."); - - // Normalize ao's - madness::normalize(world, temp1); - - // Transform ao's now - std::vector temp = - madness::transform(world, temp1, nwchem.MOs, FunctionDefaults<3>::get_thresh(), true); - - // Now save the unoccupied orbitals - std::vector temp2; - size_t num_virt = 0; - for (size_t i = 0; i < temp1.size(); i++) { - if (nwchem.occupancies[i] == 0) { - temp2.push_back(temp[i]); - num_virt++; + // Basic output + if (world.rank() == 0) + print(" Creating an initial guess from NWChem file", r_params.nwchem_dir()); + + // Create empty containers + response_space f; + + // Create the nwchem reader + slymer::NWChem_Interface nwchem(r_params.nwchem_dir(), std::cout); + + // For parallel runs, silencing all but 1 slymer instance + if (world.rank() != 0) { + std::ostream dev_null(nullptr); + nwchem.err = dev_null; + } + + // Read in basis set + nwchem.read(slymer::Properties::Basis); + + // Read in the molecular orbital coefficients, energies, + // and occupancies + nwchem.read(slymer::Properties::MOs | slymer::Properties::Energies | + slymer::Properties::Occupancies); + + // Create the nwchem orbitals as madness functions + std::vector temp1; + for (auto basis: slymer::cast_basis(nwchem.basis_set)) { + // Get the center of gaussian as its special point + std::vector centers; + coord_3d r; + r[0] = basis.get().center[0]; + r[1] = basis.get().center[1]; + r[2] = basis.get().center[2]; + centers.push_back(r); + + // Now make the function + temp1.push_back(FunctionFactory(world).functor( + std::shared_ptr>( + new slymer::Gaussian_Functor(basis.get(), centers)))); + + // Let user know something is going on + if (temp1.size() % 10 == 0 and world.rank() == 0) + print("Created", temp1.size(), "functions."); + } + if (world.rank() == 0) print("Finished creating", temp1.size(), "functions."); + + // Normalize ao's + madness::normalize(world, temp1); + + // Transform ao's now + std::vector temp = + madness::transform(world, temp1, nwchem.MOs, FunctionDefaults<3>::get_thresh(), true); + + // Now save the unoccupied orbitals + std::vector temp2; + size_t num_virt = 0; + for (size_t i = 0; i < temp1.size(); i++) { + if (nwchem.occupancies[i] == 0) { + temp2.push_back(temp[i]); + num_virt++; + } } - } - // Create as many vectors of functions as we can from these nwchem - // virtual orbitals putting 1 virtual orbital from nwchem per vector - for (size_t i = 0; i < std::max(m, num_virt); i++) { - // Create the vector to add the new function to - std::vector v1 = - zero_functions_compressed(world, g_params.orbitals().size()); + // Create as many vectors of functions as we can from these nwchem + // virtual orbitals putting 1 virtual orbital from nwchem per vector + for (size_t i = 0; i < std::max(m, num_virt); i++) { + // Create the vector to add the new function to + std::vector v1 = + zero_functions_compressed(world, g_params.orbitals().size()); - // Put the "new" function into the vector - v1[i % v1.size()] = temp2[i]; + // Put the "new" function into the vector + v1[i % v1.size()] = temp2[i]; - // Add vector to return container - f.push_back(v1); + // Add vector to return container + f.push_back(v1); - // See if we've made enough functions - if (f.size() >= m) break; - } - if (world.rank() == 0) print("Created", f.size(), "guess functions from provided NWChem data."); + // See if we've made enough functions + if (f.size() >= m) break; + } + if (world.rank() == 0) print("Created", f.size(), "guess functions from provided NWChem data."); - // If not enough functions have been made, start adding symmetry adapted - // functions - size_t n = f.size(); + // If not enough functions have been made, start adding symmetry adapted + // functions + size_t n = f.size(); - // If still not enough functions have been made, add in random guesses - if (n < m) { - // Tell user the bad news - if (world.rank() == 0) - print("\n Only", - n, - "guess functions were provided by augmenting NWChem " - "functions.\n " - "Augmenting with random functions."); + // If still not enough functions have been made, add in random guesses + if (n < m) { + // Tell user the bad news + if (world.rank() == 0) + print("\n Only", n, + "guess functions were provided by augmenting NWChem " + "functions.\n " + "Augmenting with random functions."); - // Create the random guess - Molecule mol = g_params.molecule(); - X_space rand = create_random_guess(world, m - n, n, ground_orbitals, mol); + // Create the random guess + Molecule mol = g_params.molecule(); + X_space rand = create_random_guess(world, m - n, n, ground_orbitals, mol); - // Add to vector of functions - for (unsigned int i = 0; i < rand.num_states(); i++) f.push_back(rand.X[i]); - } + // Add to vector of functions + for (unsigned int i = 0; i < rand.num_states(); i++) f.push_back(rand.X[i]); + } - // Project out groundstate from guesses - QProjector projector(world, ground_orbitals); - for (unsigned int i = 0; i < f.size(); i++) f[i] = projector(f[i]); + // Project out groundstate from guesses + QProjector projector(world, ground_orbitals); + for (unsigned int i = 0; i < f.size(); i++) f[i] = projector(f[i]); - // Truncate and normalize - f.truncate_rf(); - normalize(world, f); + // Truncate and normalize + f.truncate_rf(); + normalize(world, f); - X_space trial(world, f.size(), n); - trial.X = f; + X_space trial(world, f.size(), n); + trial.X = f; - return trial; + return trial; } // Main function, makes sure everything happens in correcct order // Solves for response components void TDDFT::solve_excited_states(World& world) { - // Get start time - molresponse::start_timer(world); - - // Plotting input orbitals - if (r_params.plot_initial()) { - if (world.rank() == 0) print("\n Plotting ground state densities.\n"); - if (r_params.plot_l() > 0.0) - do_vtk_plots(world, - r_params.plot_pts(), - r_params.plot_l(), - 0, - r_params.num_orbitals(), - molecule, - square(world, ground_orbitals), - "ground"); - else - do_vtk_plots(world, - r_params.plot_pts(), - r_params.L() / 2.0, - 0, - r_params.num_orbitals(), - molecule, - square(world, ground_orbitals), - "ground"); - } - // Warm and fuzzy - if (world.rank() == 0) { - print("\n\n Excited State Calculation"); - print(" ------------------------"); - } - // Here print the relevant parameters - // Ready to iterate! - for (unsigned int proto = 0; proto < r_params.protocol().size(); proto++) { - // Set defaults inside here - set_protocol<3>(world, r_params.protocol()[proto]); - j_molresponse["protocol_data"].push_back({}); - j_molresponse["protocol_data"][proto]["proto"] = r_params.protocol()[proto]; - j_molresponse["protocol_data"][proto]["iter_data"]={}; - - // Do something to ensure all functions have same k value - check_k(world, r_params.protocol()[proto], FunctionDefaults<3>::get_k()); - - if (proto == 0) { - if (r_params.restart()) { - if (world.rank() == 0) { - print(" Restarting from file:", r_params.restart_file()); - } - load(world, r_params.restart_file()); + // Get start time + molresponse::start_timer(world); + + // Plotting input orbitals + if (r_params.plot_initial()) { + if (world.rank() == 0) print("\n Plotting ground state densities.\n"); + if (r_params.plot_l() > 0.0) + do_vtk_plots(world, r_params.plot_pts(), r_params.plot_l(), 0, r_params.num_orbitals(), + molecule, square(world, ground_orbitals), "ground"); + else + do_vtk_plots(world, r_params.plot_pts(), r_params.L() / 2.0, 0, r_params.num_orbitals(), + molecule, square(world, ground_orbitals), "ground"); + } + // Warm and fuzzy + if (world.rank() == 0) { + print("\n\n Excited State Calculation"); + print(" ------------------------"); + } + // Here print the relevant parameters + // Ready to iterate! + for (unsigned int proto = 0; proto < r_params.protocol().size(); proto++) { + // Set defaults inside here + set_protocol<3>(world, r_params.protocol()[proto]); + j_molresponse["protocol_data"].push_back({}); + j_molresponse["protocol_data"][proto]["proto"] = r_params.protocol()[proto]; + j_molresponse["protocol_data"][proto]["iter_data"] = {}; + + // Do something to ensure all functions have same k value check_k(world, r_params.protocol()[proto], FunctionDefaults<3>::get_k()); - } else { - X_space trial(world, 2 * r_params.num_states(), r_params.num_orbitals()); - // Create trial functions by... - // (Always creating (at least) twice the amount requested for - // initial diagonalization) - if (world.rank() == 0) print("\n Creating trial functions.\n"); - if (r_params.random()) { - // Random guess - trial = create_random_guess( - world, 2 * r_params.num_states(), r_params.num_orbitals(), ground_orbitals, molecule); - } else if (r_params.nwchem()) { - // Virtual orbitals from NWChem - trial = create_nwchem_guess(world, 2 * r_params.num_states()); - } else if (r_params.guess_xyz()) { - // Use a symmetry adapted operator on ground state functions - trial = create_trial_functions2(world, ground_orbitals, r_params.num_orbitals()); - } else { - trial = create_trial_functions( - world, 2 * r_params.num_states(), ground_orbitals, r_params.num_orbitals()); - } - // Load balance - // Only balancing on x-components. Smart? - if (world.size() > 1) { - // Start a timer - if (r_params.num_orbitals() >= 1) molresponse::start_timer(world); - if (world.rank() == 0) print(""); // Makes it more legible - - LoadBalanceDeux<3> lb(world); - for (size_t j = 0; j < r_params.num_states(); j++) { - for (size_t k = 0; k < r_params.num_orbitals(); k++) { - lb.add_tree(trial.X[j][k], lbcost(1.0, 8.0), true); + if (proto == 0) { + if (r_params.restart()) { + if (world.rank() == 0) { + print(" Restarting from file:", r_params.restart_file()); + } + load(world, r_params.restart_file()); + check_k(world, r_params.protocol()[proto], FunctionDefaults<3>::get_k()); + } else { + X_space trial(world, 2 * r_params.num_states(), r_params.num_orbitals()); + // Create trial functions by... + // (Always creating (at least) twice the amount requested for + // initial diagonalization) + if (world.rank() == 0) print("\n Creating trial functions.\n"); + if (r_params.random()) { + // Random guess + trial = create_random_guess(world, 2 * r_params.num_states(), + r_params.num_orbitals(), ground_orbitals, molecule); + } else if (r_params.nwchem()) { + // Virtual orbitals from NWChem + trial = create_nwchem_guess(world, 2 * r_params.num_states()); + } else if (r_params.guess_xyz()) { + // Use a symmetry adapted operator on ground state functions + trial = create_trial_functions2(world, ground_orbitals, + r_params.num_orbitals()); + } else { + trial = create_trial_functions(world, 3 * r_params.num_states(), + ground_orbitals, r_params.num_orbitals()); + } + + // Load balance + // Only balancing on x-components. Smart? + if (world.size() > 1) { + // Start a timer + if (r_params.num_orbitals() >= 1) molresponse::start_timer(world); + if (world.rank() == 0) print("");// Makes it more legible + + LoadBalanceDeux<3> lb(world); + for (size_t j = 0; j < r_params.num_states(); j++) { + for (size_t k = 0; k < r_params.num_orbitals(); k++) { + lb.add_tree(trial.X[j][k], lbcost(1.0, 8.0), true); + } + } + for (size_t j = 0; j < r_params.num_orbitals(); j++) { + lb.add_tree(ground_orbitals[j], lbcost(1.0, 8.0), true); + } + FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); + + if (r_params.num_orbitals() >= 1) + molresponse::end_timer(world, "Load balancing:"); + } + + // Project out groundstate from guesses + QProjector projector(world, ground_orbitals); + for (unsigned int i = 0; i < trial.X.size(); i++) + trial.X[i] = projector(trial.X[i]); + + // Ensure orthogonal guesses + for (size_t i = 0; i < 2; i++) { + molresponse::start_timer(world); + // Orthog + trial.X = gram_schmidt(world, trial.X); + molresponse::end_timer(world, "orthog"); + + molresponse::start_timer(world); + // Normalize + normalize(world, trial.X); + molresponse::end_timer(world, "normalize"); + } + + // Diagonalize guess + if (world.rank() == 0) + print("\n Iterating trial functions for an improved initial " + "guess.\n"); + iterate_guess(world, trial); + // Sort + sort(world, omega, trial.X); + // Basic output + if (r_params.num_orbitals() >= 1 and world.rank() == 0) { + print("\n Final initial guess excitation energies:"); + print(omega); + } + // Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); + // Select lowest energy functions from guess + Chi.X = select_functions(world, trial.X, omega, r_params.num_states(), + r_params.num_orbitals()); + Chi.Y = response_space(world, r_params.num_states(), r_params.num_orbitals()); + save(world, r_params.restart_file()); + trial.clear(); + // Initial guess for y are zero functions } - } - for (size_t j = 0; j < r_params.num_orbitals(); j++) { - lb.add_tree(ground_orbitals[j], lbcost(1.0, 8.0), true); - } - FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); - - if (r_params.num_orbitals() >= 1) molresponse::end_timer(world, "Load balancing:"); } - // Project out groundstate from guesses - QProjector projector(world, ground_orbitals); - for (unsigned int i = 0; i < trial.X.size(); i++) trial.X[i] = projector(trial.X[i]); - - // Ensure orthogonal guesses - for (size_t i = 0; i < 2; i++) { - molresponse::start_timer(world); - // Orthog - trial.X = gram_schmidt(world, trial.X); - molresponse::end_timer(world, "orthog"); - - molresponse::start_timer(world); - // Normalize - normalize(world, trial.X); - molresponse::end_timer(world, "normalize"); - } - - // Diagonalize guess - if (world.rank() == 0) - print( - "\n Iterating trial functions for an improved initial " - "guess.\n"); - iterate_guess(world, trial); - // Sort - sort(world, omega, trial.X); - // Basic output - if (r_params.num_orbitals() >= 1 and world.rank() == 0) { - print("\n Final initial guess excitation energies:"); - print(omega); - } - // Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); - // Select lowest energy functions from guess - Chi.X = select_functions(world, trial.X, omega, r_params.num_states(), r_params.num_orbitals()); - Chi.Y = response_space(world, r_params.num_states(), r_params.num_orbitals()); - - trial.clear(); - // Initial guess for y are zero functions - } + // Now actually ready to iterate... + iterate_excited(world, Chi); + if (r_params.save()) save(world, r_params.save_file()); } - // Now actually ready to iterate... - iterate_excited(world, Chi); - if (r_params.save()) save(world, r_params.save_file()); - } - - // Plot the response function if desired - if (r_params.plot()) { - // Need to get densities first - std::vector densities = transition_density(world, ground_orbitals, Chi.X, Chi.Y); - - // For the instance where we don't plot all the orbitals - std::vector plot_densities; - for (size_t i : r_params.plot_data()) { - plot_densities.push_back(densities[i]); + // Plot the response function if desired + if (r_params.plot()) { + // Need to get densities first + std::vector densities = + transition_density(world, ground_orbitals, Chi.X, Chi.Y); + + // For the instance where we don't plot all the orbitals + std::vector plot_densities; + for (size_t i: r_params.plot_data()) { plot_densities.push_back(densities[i]); } + + // Now plot + if (world.rank() == 0) print("\n Plotting response state densities.\n"); + if (r_params.plot_l() > 0.0) + do_vtk_plots(world, r_params.plot_pts(), r_params.plot_l(), 0, + r_params.plot_data().size(), molecule, plot_densities, "response-state"); + else + do_vtk_plots(world, r_params.plot_pts(), r_params.L(), 0, r_params.plot_data().size(), + molecule, plot_densities, "response-state"); } - // Now plot - if (world.rank() == 0) print("\n Plotting response state densities.\n"); - if (r_params.plot_l() > 0.0) - do_vtk_plots(world, - r_params.plot_pts(), - r_params.plot_l(), - 0, - r_params.plot_data().size(), - molecule, - plot_densities, - "response-state"); - else - do_vtk_plots(world, - r_params.plot_pts(), - r_params.L(), - 0, - r_params.plot_data().size(), - molecule, - plot_densities, - "response-state"); - } - - // Print total time - // Precision is set to 10 coming in, drop it to 2 - std::cout.precision(2); - std::cout << std::fixed; - - // Get start time - molresponse::end_timer(world, "total:"); + // Print total time + // Precision is set to 10 coming in, drop it to 2 + std::cout.precision(2); + std::cout << std::fixed; + + // Get start time + molresponse::end_timer(world, "total:"); } void TDDFT::solve_response_states(World& world) { - molresponse::start_timer(world); - - if (r_params.plot_initial()) { - if (world.rank() == 0) print("\n Plotting ground state densities.\n"); - if (r_params.plot_l() > 0.0) - do_vtk_plots(world, - r_params.plot_pts(), - r_params.plot_l(), - 0, - r_params.num_orbitals(), - molecule, - square(world, ground_orbitals), - "ground"); - else - do_vtk_plots(world, - r_params.plot_pts(), - r_params.L() / 2.0, - 0, - r_params.num_orbitals(), - molecule, - square(world, ground_orbitals), - "ground"); - } - // Warm and fuzzy - if (world.rank() == 0) { - print("\n\n Response Calculation"); - print(" ------------------------"); - } - auto protocols=r_params.protocol(); - print(protocols); - for (unsigned int proto = 0; proto < protocols.size(); proto++) { - // Set defaults inside here - // default value of - auto thresh=protocols[proto]; - print(thresh); - set_protocol<3>(world,thresh); - - check_k(world, thresh, FunctionDefaults<3>::get_k()); - // Do something to ensure all functions have same k value - j_molresponse["protocol_data"].push_back({}); - j_molresponse["protocol_data"][proto]["proto"] = thresh;//r_params.protocol()[proto]; - j_molresponse["protocol_data"][proto]["iter_data"]={}; - - if (r_params.dipole()) { - if (world.rank() == 0) print("creating dipole property operator"); - p = DipoleVector(world); - } else if (r_params.nuclear()) { - Molecule molecule = g_params.molecule(); - if (world.rank() == 0) print("creating nuclear property operator"); - p = NuclearVector(world, molecule); + molresponse::start_timer(world); + + if (r_params.plot_initial()) { + if (world.rank() == 0) print("\n Plotting ground state densities.\n"); + if (r_params.plot_l() > 0.0) + do_vtk_plots(world, r_params.plot_pts(), r_params.plot_l(), 0, r_params.num_orbitals(), + molecule, square(world, ground_orbitals), "ground"); + else + do_vtk_plots(world, r_params.plot_pts(), r_params.L() / 2.0, 0, r_params.num_orbitals(), + molecule, square(world, ground_orbitals), "ground"); } - if (proto == 0) { - if (r_params.restart()) { - if (world.rank() == 0) print(" Initial guess from file:", r_params.restart_file()); - load(world, r_params.restart_file()); + // Warm and fuzzy + if (world.rank() == 0) { + print("\n\n Response Calculation"); + print(" ------------------------"); + } + auto protocols = r_params.protocol(); + print(protocols); + for (unsigned int proto = 0; proto < protocols.size(); proto++) { + // Set defaults inside here + // default value of + auto thresh = protocols[proto]; + print(thresh); + set_protocol<3>(world, thresh); + check_k(world, thresh, FunctionDefaults<3>::get_k()); + // Do something to ensure all functions have same k value + j_molresponse["protocol_data"].push_back({}); + j_molresponse["protocol_data"][proto]["proto"] = thresh;//r_params.protocol()[proto]; + j_molresponse["protocol_data"][proto]["iter_data"] = {}; if (r_params.dipole()) { - // set states - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - print("P: ", PQ.X.norm2()); - print("Q: ", PQ.Y.norm2()); - - // set RHS_Vector + if (world.rank() == 0) print("creating dipole property operator"); + p = DipoleVector(world); } else if (r_params.nuclear()) { - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - - } else if (r_params.order2()) { - // - } else if (r_params.order3()) { - // - } else { - MADNESS_EXCEPTION("not a valid response state ", 0); + Molecule molecule = g_params.molecule(); + if (world.rank() == 0) print("creating nuclear property operator"); + p = NuclearVector(world, molecule); } - } else { // Dipole guesses - - if (r_params.dipole()) { - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - // set states - // - print("okay this is not a good idea if it comes up more than once"); - // set RHS_Vector - } else if (r_params.nuclear()) { - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - } else if (r_params.order2()) { - // - } else if (r_params.order3()) { - // - } else { - MADNESS_EXCEPTION("not a valid response state ", 0); + if (proto == 0) { + if (r_params.restart()) { + if (world.rank() == 0) + print(" Initial guess from file:", r_params.restart_file()); + load(world, r_params.restart_file()); + check_k(world, thresh, FunctionDefaults<3>::get_k()); + + if (r_params.dipole()) { + // set states + PQ.X = PropertyRHS(world, p); + PQ.Y = PQ.X.copy(); + print("P: ", PQ.X.norm2()); + print("Q: ", PQ.Y.norm2()); + + // set RHS_Vector + } else if (r_params.nuclear()) { + PQ.X = PropertyRHS(world, p); + PQ.Y = PQ.X.copy(); + + } else if (r_params.order2()) { + // + } else if (r_params.order3()) { + // + } else { + MADNESS_EXCEPTION("not a valid response state ", 0); + } + } else {// Dipole guesses + + if (r_params.dipole()) { + PQ.X = PropertyRHS(world, p); + PQ.Y = PQ.X.copy(); + // set states + // + print("okay this is not a good idea if it comes up more than once"); + // set RHS_Vector + } else if (r_params.nuclear()) { + PQ.X = PropertyRHS(world, p); + PQ.Y = PQ.X.copy(); + } else if (r_params.order2()) { + // + } else if (r_params.order3()) { + // + } else { + MADNESS_EXCEPTION("not a valid response state ", 0); + } + } } - } - } - // - // Here i should print some information about the calculation we are - // about to do - print("Pre iteration Information"); - print("Number of Response States: ", r_params.num_states()); - print("Number of Ground States: ", r_params.num_orbitals()); - print("k = ", FunctionDefaults<3>::get_k()); - print("protocol threshold = ", FunctionDefaults<3>::get_k()); - - print("Property rhs func k = ", PQ.X[0][0].k()); - print("Property func k thresh= ", PQ.X[0][0].thresh()); - - print("Property rhs func Q k = ", PQ.Y[0][0].k()); - print("Property func Q k thresh = ", PQ.Y[0][0].thresh()); - - print("Property rhs func P norms", PQ.X.norm2()); - print("Property rhs func Q norms", PQ.Y.norm2()); - - if (proto > 0) { - r_params.set_derived_value("first_run", false); - } - // Now actually ready to iterate... - // iterate_freq(world); - iterate_freq2(world); - // IterateFrequencyResponse(world, P, Q); - } // end for --finished reponse density - - // Plot the response function if desired - if (r_params.plot()) { - // Need to get densities first - std::vector densities = transition_density(world, ground_orbitals, Chi.X, Chi.Y); - - // For the instance where we don't plot all the orbitals - std::vector plot_densities; - for (size_t i : r_params.plot_data()) { - plot_densities.push_back(densities[i]); + // + // Here i should print some information about the calculation we are + // about to do + print("Pre iteration Information"); + print("Number of Response States: ", r_params.num_states()); + print("Number of Ground States: ", r_params.num_orbitals()); + print("k = ", FunctionDefaults<3>::get_k()); + print("protocol threshold = ", FunctionDefaults<3>::get_k()); + + print("Property rhs func k = ", PQ.X[0][0].k()); + print("Property func k thresh= ", PQ.X[0][0].thresh()); + + print("Property rhs func Q k = ", PQ.Y[0][0].k()); + print("Property func Q k thresh = ", PQ.Y[0][0].thresh()); + + print("Property rhs func P norms", PQ.X.norm2()); + print("Property rhs func Q norms", PQ.Y.norm2()); + + if (proto > 0) { r_params.set_derived_value("first_run", false); } + // Now actually ready to iterate... + // iterate_freq(world); + iterate_freq2(world); + // IterateFrequencyResponse(world, P, Q); + }// end for --finished reponse density + + // Plot the response function if desired + if (r_params.plot()) { + // Need to get densities first + std::vector densities = + transition_density(world, ground_orbitals, Chi.X, Chi.Y); + + // For the instance where we don't plot all the orbitals + std::vector plot_densities; + for (size_t i: r_params.plot_data()) { plot_densities.push_back(densities[i]); } + + // Now plot + if (world.rank() == 0) print("\n Plotting response state densities.\n"); + if (r_params.plot_l() > 0.0) + do_vtk_plots(world, r_params.plot_pts(), r_params.plot_l(), 0, + r_params.plot_data().size(), molecule, plot_densities, "response-state"); + else + do_vtk_plots(world, r_params.plot_pts(), r_params.L(), 0, r_params.plot_data().size(), + molecule, plot_densities, "response-state"); } - // Now plot - if (world.rank() == 0) print("\n Plotting response state densities.\n"); - if (r_params.plot_l() > 0.0) - do_vtk_plots(world, - r_params.plot_pts(), - r_params.plot_l(), - 0, - r_params.plot_data().size(), - molecule, - plot_densities, - "response-state"); - else - do_vtk_plots(world, - r_params.plot_pts(), - r_params.L(), - 0, - r_params.plot_data().size(), - molecule, - plot_densities, - "response-state"); - } - - // Print total time - // Precision is set to 10 coming in, drop it to 2 - // Have response function, now calculate polarizability for this axis - // polarizability(world, polar_tensor); - // PrintPolarizabilityAnalysis(world, polar_tensor, omega); - - // Print total time - // Precision is set to 10 coming in, drop it to 2 - std::cout.precision(2); - std::cout << std::fixed; - - // Get start time - molresponse::end_timer(world, "total:"); -} // end compute frequency response + // Print total time + // Precision is set to 10 coming in, drop it to 2 + // Have response function, now calculate polarizability for this axis + // polarizability(world, polar_tensor); + // PrintPolarizabilityAnalysis(world, polar_tensor, omega); + + // Print total time + // Precision is set to 10 coming in, drop it to 2 + std::cout.precision(2); + std::cout << std::fixed; + + // Get start time + molresponse::end_timer(world, "total:"); +}// end compute frequency response diff --git a/src/apps/molresponse/density.cc b/src/apps/molresponse/density.cc index 8e3d31e3ade..6d636994831 100644 --- a/src/apps/molresponse/density.cc +++ b/src/apps/molresponse/density.cc @@ -20,8 +20,8 @@ typedef std::shared_ptr> FunctorT; typedef FunctionFactory FactoryT; typedef std::vector VectorFunction3DT; -density_vector::density_vector(World &world, ResponseParameters other_rparams, - GroundStateCalculation other_gparams) +density_vector::density_vector(World &world, ResponseParameters &other_rparams, + GroundStateCalculation &other_gparams) : num_states(other_rparams.num_states()), num_orbitals(other_rparams.num_orbitals()), property(), @@ -31,7 +31,7 @@ density_vector::density_vector(World &world, ResponseParameters other_rparams, PQ(world, num_states, num_orbitals), orbitals(copy(world, other_gparams.orbitals())), molecule(other_gparams.molecule()) { - xcf.initialize(r_params.xc(), !r_params.spinrestricted(), world, r_params.print_level() >= 10); + if (r_params.excited_state()) { this->omega = Tensor(r_params.num_states()); } else { @@ -44,7 +44,7 @@ density_vector::density_vector(World &world, ResponseParameters other_rparams, ResponseParameters density_vector::GetResponseParameters() { return r_params; } -density_vector set_density_type(World &world, ResponseParameters R, GroundStateCalculation G) { +density_vector set_density_type(World &world, ResponseParameters & R, GroundStateCalculation & G) { if (R.excited_state()) { return excited_state_density_vector(world, R, G); } else if (R.dipole()) diff --git a/src/apps/molresponse/density.h b/src/apps/molresponse/density.h index 13005ea1bf8..7a383aadc66 100644 --- a/src/apps/molresponse/density.h +++ b/src/apps/molresponse/density.h @@ -40,7 +40,6 @@ class density_vector { const ResponseParameters r_params; // Response Parameters const GroundStateCalculation g_params; - XCfunctional xcf; // xc functional PropertyBase property_operator; // dipole, nuclear, or none X_space Chi; X_space PQ; @@ -53,7 +52,8 @@ class density_vector { public: friend class TDDFT; // Collective constructor - density_vector(World& world, ResponseParameters r_params, GroundStateCalculation g_params); + density_vector(World& world, ResponseParameters& other_rparams, + GroundStateCalculation& other_gparams); density_vector(const density_vector& other) = default; ResponseParameters GetResponseParameters(); @@ -77,7 +77,7 @@ class excited_state_density_vector : public density_vector { : density_vector(world, R, G) {} }; -density_vector set_density_type(World& world, ResponseParameters R, GroundStateCalculation G); +density_vector set_density_type(World& world, ResponseParameters & R, GroundStateCalculation& G); // The TDDFT constructor initializes the preliminary calculation details including // the Chi vectors and the PQ vectors if they are required // ground orbitals diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index b0a300fdff8..e14e7791d92 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -1,51 +1,88 @@ #include "global_functions.h" +#include #include #include #include +#include "apps/chem/SCFOperators.h" #include "response_parameters.h" -void print_molecule(World &world, const GroundStateCalculation & g_params) { - if (world.rank() == 0) { - // Precision is set to 10 coming in, drop it to 5 - std::cout.precision(5); - std::cout << std::fixed; - - // First get atom - const std::vector atoms = g_params.molecule().get_atoms(); - size_t num_atoms = atoms.size(); - - // Now print - print("\n Geometry Information"); - print(" --------------------\n"); - print(" Units: a.u.\n"); - print(" Atom x y z"); - print("----------------------------------------------------------------"); - for (size_t j = 0; j < num_atoms; j++) { - Vector coords = atoms[j].get_coords(); - std::cout << std::setw(3) << atomic_number_to_symbol(atoms[j].get_atomic_number()); - std::cout << std::setw(18) << std::right << coords[0] << std::setw(18) << coords[1] << std::setw(18) << coords[2] - << endl; +void print_molecule(World &world, const GroundStateCalculation &g_params) { + if (world.rank() == 0) { + // Precision is set to 10 coming in, drop it to 5 + std::cout.precision(5); + std::cout << std::fixed; + + // First get atom + const std::vector atoms = g_params.molecule().get_atoms(); + size_t num_atoms = atoms.size(); + + // Now print + print("\n Geometry Information"); + print(" --------------------\n"); + print(" Units: a.u.\n"); + print(" Atom x y z"); + print("----------------------------------------------------------------"); + for (size_t j = 0; j < num_atoms; j++) { + Vector coords = atoms[j].get_coords(); + std::cout << std::setw(3) << atomic_number_to_symbol(atoms[j].get_atomic_number()); + std::cout << std::setw(18) << std::right << coords[0] << std::setw(18) << coords[1] + << std::setw(18) << coords[2] << endl; + } + print(""); + + // Reset precision + std::cout.precision(10); + std::cout << std::scientific; } - print(""); +} - // Reset precision - std::cout.precision(10); - std::cout << std::scientific; - } +auto initialize_calc_params(World &world, const std::string &input_file) -> CalcParams { + ResponseParameters r_params{}; + commandlineparser parser; + parser.set_keyval("input", input_file); + r_params.read_input_and_commandline_options(world, parser, "response"); + GroundStateCalculation ground_calculation{world, r_params.archive()}; + ground_calculation.print_params(); + Molecule molecule = ground_calculation.molecule(); + r_params.set_ground_state_calculation_data(ground_calculation); + r_params.set_derived_values(world, molecule); + r_params.print(); + return {ground_calculation, molecule, r_params}; } +// TODO some operator definitions that I will need to move to a separate file +auto T(World &world, response_space &f) -> response_space { + response_space T;// Fock = (T + V) * orbitals + real_derivative_3d Dx(world, 0); + real_derivative_3d Dy(world, 1); + real_derivative_3d Dz(world, 2); + // Apply derivatives to orbitals + f.reconstruct_rf(); + response_space dvx = apply(world, Dx, f); + response_space dvy = apply(world, Dy, f); + response_space dvz = apply(world, Dz, f); + // Apply again for 2nd derivatives + response_space dvx2 = apply(world, Dx, dvx); + response_space dvy2 = apply(world, Dy, dvy); + response_space dvz2 = apply(world, Dz, dvz); + T = (dvx2 + dvy2 + dvz2) * (-0.5); + return T; +} + +// compute exchange |i> +auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfuncT { + World &world = ket[0].world(); + int n = bra.size(); + int nf = ket.size(); + + double tol = FunctionDefaults<3>::get_thresh();/// Important this is + double mul_tol = 1e-7; + const double lo = 1.e-10; -CalcParams initialize_calc_params(World &world, std::string input_file) { - ResponseParameters r_params{}; - commandlineparser parser; - parser.set_keyval("input",input_file); - r_params.read_input_and_commandline_options(world, parser, "response"); - GroundStateCalculation ground_calculation{world}; - ground_calculation.print_params(); - Molecule molecule = ground_calculation.molecule(); - r_params.set_ground_state_calculation_data(ground_calculation); - r_params.set_derived_values(world, molecule); - r_params.print(); - return CalcParams{ground_calculation, molecule, r_params}; + Exchange op{}; + op.set_parameters(bra, ket, lo); + op.set_algorithm(op.small_memory); + return op(vf); } +// sum_i |i> for each p \ No newline at end of file diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index a2cefd63b54..1291a2b611d 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -9,38 +9,44 @@ #include "response_parameters.h" struct CalcParams { - GroundStateCalculation ground_calculation; - Molecule molecule; - ResponseParameters response_parameters; + GroundStateCalculation ground_calculation; + Molecule molecule; + ResponseParameters response_parameters; }; void print_molecule(World &world, const GroundStateCalculation &g_params); class plotCoords { - public: - coord_3d lo, hi; - - plotCoords() { - lo[0] = 0.0; - lo[1] = 0.0; - lo[2] = 0.0; - hi[0] = 0.0; - hi[1] = 0.0; - hi[2] = 0.0; - } - plotCoords(size_t direction, double Lp) { - lo[0] = 0.0; - lo[1] = 0.0; - lo[2] = 0.0; - - hi[0] = 0.0; - hi[1] = 0.0; - hi[2] = 0.0; - - lo[direction] = -Lp; - hi[direction] = Lp; - } +public: + coord_3d lo, hi; + + plotCoords() { + lo[0] = 0.0; + lo[1] = 0.0; + lo[2] = 0.0; + hi[0] = 0.0; + hi[1] = 0.0; + hi[2] = 0.0; + } + plotCoords(size_t direction, double Lp) { + lo[0] = 0.0; + lo[1] = 0.0; + lo[2] = 0.0; + + hi[0] = 0.0; + hi[1] = 0.0; + hi[2] = 0.0; + + lo[direction] = -Lp; + hi[direction] = Lp; + } }; plotCoords SetPlotCoord(size_t i, double Lp); -CalcParams initialize_calc_params(World &world, std::string input_file); +CalcParams initialize_calc_params(World &world, const std::string &input_file); +// kinetic energy operator on response vector +response_space T(World &world, response_space &f); + +vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); +vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); +static double rsquared(const coordT &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } /// Mask function to switch from 0 to 1 smoothly at boundary -#endif // SRC_APPS_molresponse_GLOBAL_FUNCTIONS_H_ +#endif// SRC_APPS_molresponse_GLOBAL_FUNCTIONS_H_ diff --git a/src/apps/molresponse/ground_parameters.h b/src/apps/molresponse/ground_parameters.h index a58302024bd..75ea5a2d89c 100644 --- a/src/apps/molresponse/ground_parameters.h +++ b/src/apps/molresponse/ground_parameters.h @@ -13,20 +13,20 @@ #include "../chem/molecule.h" #include "Plot_VTK.h" #include "basic_operators.h" -#include -#include -#include // For easy calculation of (1 - \hat{\rho}^0) -#include -#include -#include +#include "chem/pointgroupsymmetry.h" +#include "chem/potentialmanager.h" +#include "chem/projector.h"// For easy calculation of (1 - \hat{\rho}^0) +#include "madness/mra/funcdefaults.h" +#include "madness/mra/functypedefs.h" +#include "madness/tensor/tensor.h" using namespace madness; class GroundStateCalculation { // Ground state parameters that are read in from archive std::string inFile{"../restartdata"};///< Name of input archive to read in ground state - bool spinrestricted{false}; ///< Indicates if ground state calc. was open or closed - ///< shell + bool spinrestricted{true}; ///< Indicates if ground state calc. was open or closed + ///< shell unsigned int num_orbitals{}; ///< Number of orbitals in ground state Tensor energies{}; ///< Energy of ground state orbitals Tensor occ{}; ///< Occupancy of ground state orbitals @@ -35,30 +35,43 @@ class GroundStateCalculation { Molecule molecule_in{};///< The molecule used in ground state calculation std::vector g_orbitals{};///< The ground state orbitals std::string xc{}; ///< Name of xc functional used in ground state + std::string localize_method{}; ///< Name of xc functional used in ground state // Default constructor public: - explicit GroundStateCalculation(World& world) { read(world); } - explicit GroundStateCalculation(World& world, const std::string& input_file) - : inFile{input_file} { + explicit GroundStateCalculation(World &world) { read(world); } + + explicit GroundStateCalculation(World &world, const std::string &input_file) + : inFile{input_file} { read(world); } - GroundStateCalculation(const GroundStateCalculation& other) = default; + + GroundStateCalculation(const GroundStateCalculation &other) = default; + bool is_spinrestricted() const { return spinrestricted; } + unsigned int n_orbitals() const { return num_orbitals; } + Tensor get_energies() const { return energies; } + Tensor get_occ() const { return occ; } + Molecule molecule() const { return molecule_in; } double get_L() const { return L; } + int get_k() const { return k; } - vector_real_function_3d& orbitals() { return g_orbitals; } + + vector_real_function_3d &orbitals() { return g_orbitals; } + std::string get_xc() const { return xc; } + std::string get_localize_method() const { return localize_method; } + std::string get_archive() const { return xc; } // Initializes ResponseParameters using the contents of file \c filename - void read(World& world) { + void read(World &world) { // Save the filename unsigned int dummyversion; @@ -66,17 +79,18 @@ class GroundStateCalculation { std::vector dummy2; archive::ParallelInputArchive input(world, inFile.c_str()); - input& dummyversion; - input& dummy1; // double - input& spinrestricted;// bool - input& L; // double box size - input& k; // int wavelet order - input& molecule_in; // Molecule - input& xc; // std:string xc functional - input& num_orbitals; // int - input& energies; // Tensor orbital energies - input& occ; // Tensor orbital occupations - input& dummy2; // std::vector sets of orbitals(?) + input & dummyversion; + input & dummy1; // double + input & spinrestricted;// bool + input & L; // double box size + input & k; // int wavelet order + input & molecule_in; // Molecule + input & xc; // std:string xc functional + input & localize_method;// std:string localize method + input & num_orbitals; // int + input & energies; // Tensor orbital energies + input & occ; // Tensor orbital occupations + input & dummy2; // std::vector sets of orbitals(?) // Check that order is positive and less than 30 if (k < 1 or k > 30) { @@ -95,11 +109,11 @@ class GroundStateCalculation { // Read in ground state orbitals for (unsigned int i = 0; i < num_orbitals; i++) { real_function_3d reader; - input& reader; + input & reader; g_orbitals.push_back(reader); } - // projector_irrep c2v("c2v"); - // g_orbitals = c2v(g_orbitals); + //projector_irrep c2v("c2v"); + //g_orbitals = c2v(g_orbitals); // Clean up truncate(world, g_orbitals); } @@ -110,6 +124,7 @@ class GroundStateCalculation { madness::print(" -----------------------"); madness::print(" Ground State Archive:", inFile); madness::print(" Ground State Functional:", xc); + madness::print(" Localize Method Functional:", localize_method); madness::print(" Spin Restricted:", spinrestricted); madness::print(" Number of orbitals:", num_orbitals); madness::print(" L:", L); @@ -117,4 +132,5 @@ class GroundStateCalculation { madness::print(" Orbital Energies:", energies); } }; + #endif diff --git a/src/apps/molresponse/iter_freq2.cc b/src/apps/molresponse/iter_freq2.cc index 1bfc90818d3..28bbca2b984 100644 --- a/src/apps/molresponse/iter_freq2.cc +++ b/src/apps/molresponse/iter_freq2.cc @@ -14,8 +14,8 @@ #include "Plot_VTK.h" #include "TDDFT.h" #include "madness/tensor/tensor_json.hpp" -#include "madness/chem/potentialmanager.h" -#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "chem/potentialmanager.h" +#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "molresponse/basic_operators.h" #include "molresponse/density.h" diff --git a/src/apps/molresponse/iterate_excited.cc b/src/apps/molresponse/iterate_excited.cc index 157affb59d6..63cd9d5bdc3 100644 --- a/src/apps/molresponse/iterate_excited.cc +++ b/src/apps/molresponse/iterate_excited.cc @@ -10,7 +10,7 @@ #include "Plot_VTK.h" #include "TDDFT.h" #include "madness/tensor/tensor_json.hpp" -#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "molresponse/response_functions.h" #include "molresponse/timer.h" diff --git a/src/apps/molresponse/iterate_freq.cc b/src/apps/molresponse/iterate_freq.cc index b75e7fd725e..f375a31a063 100644 --- a/src/apps/molresponse/iterate_freq.cc +++ b/src/apps/molresponse/iterate_freq.cc @@ -14,8 +14,8 @@ #include "../chem/molecule.h" #include "Plot_VTK.h" #include "TDDFT.h" -#include "madness/chem/potentialmanager.h" -#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "chem/potentialmanager.h" +#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "molresponse/basic_operators.h" #include "molresponse/density.h" diff --git a/src/apps/molresponse/iterate_gamma.cc b/src/apps/molresponse/iterate_gamma.cc index 6459bf53f8a..9a021d2e572 100644 --- a/src/apps/molresponse/iterate_gamma.cc +++ b/src/apps/molresponse/iterate_gamma.cc @@ -7,7 +7,7 @@ #include "../chem/molecule.h" #include "TDDFT.h" #include "basic_operators.h" -#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "madness/mra/vmra.h" #include "molresponse/global_functions.h" diff --git a/src/apps/molresponse/molresponse.cc b/src/apps/molresponse/molresponse.cc index f3f5a668dcc..428082c9b12 100644 --- a/src/apps/molresponse/molresponse.cc +++ b/src/apps/molresponse/molresponse.cc @@ -35,12 +35,12 @@ /// \file molresponse.cc /// \brief Molecular Response DFT code /// \defgroup molresponse The molecular density funcitonal response code -#include +#include #include -#include "ResponseExceptions.hpp" -#include "TDDFT.h" // All response functions/objects enter through this -#include "molresponse/density.h" +#include "ExcitedResponse.hpp" +#include "FrequencyResponse.hpp" +#include "ResponseExceptions.hpp" #if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) @@ -48,116 +48,83 @@ #include static inline int file_exists(const char *inpname) { - struct stat buffer {}; - size_t rc = stat(inpname, &buffer); - return (rc == 0); + struct stat buffer {}; + size_t rc = stat(inpname, &buffer); + return (rc == 0); } #endif - using namespace madness; int main(int argc, char **argv) { - initialize(argc, argv); - { // limit lifetime of world so that finalize() can execute cleanly - World world(SafeMPI::COMM_WORLD); + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + std::cout.precision(6); + std::string filename = "response.in"; + + molresponse::start_timer(world); // try catch would start here try { - startup(world, argc, argv, true); - print_meminfo(world.rank(), "startup"); - FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap>(world))); - - std::cout.precision(6); - // This makes a default input file name of 'input' - const char *input_file = "response.in"; - // Process 0 reads input information and broadcasts - for (int i = 1; i < argc; i++) { - if (argv[i][0] != '-') { - input_file = argv[i]; - break; + auto calc_params = initialize_calc_params(world, filename); + if (calc_params.response_parameters.excited_state()) { + + ExcitedResponse calc(world, calc_params); + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Time-Dependent Density Functional Theory Excited-State " + "Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc_params.molecule.print(); + print("\n"); + calc_params.response_parameters.print("response"); + // put the response parameters in a j_molrespone json object + calc_params.response_parameters.to_json(calc.j_molresponse); + } + // set protocol to the first + calc.solve(world); + calc.output_json(); + } else if (calc_params.response_parameters.first_order()) { + RHS_Generator rhsGenerator; + if (calc_params.response_parameters.dipole()) { + rhsGenerator = dipole_generator; + } else if (calc_params.response_parameters.nuclear()) { + rhsGenerator = nuclear_generator; + } + auto omega = calc_params.response_parameters.omega(); + FrequencyResponse calc(world, calc_params, omega, rhsGenerator); + // Warm and fuzzy for the user + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Time-Dependent Density Functional Theory Frequency Response " + "Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc_params.molecule.print(); + print("\n"); + calc_params.response_parameters.print("response"); + calc_params.response_parameters.to_json(calc.j_molresponse); + } + // set protocol to the first + calc.solve(world); + calc.output_json(); + } else { + if (world.rank() == 0) { print("Response not implemented"); } } - } - - if (world.rank() == 0) print("input filename: ", input_file); - if (!file_exists(input_file)) throw Input_Error{}; - - auto [ground_calculation, molecule, response_parameters] = - initialize_calc_params(world, std::string(input_file)); - vecfuncT ground_orbitals = ground_calculation.orbitals(); - - density_vector rho = set_density_type(world, response_parameters, ground_calculation); - // first step is to read the input for r_params and g_params - // Create the TDDFT object - TDDFT calc = TDDFT(world, rho); - - // Warm and fuzzy for the user - if (world.rank() == 0) { - print("\n\n"); - print( - " MADNESS Time-Dependent Density Functional Theory Response " - "Program"); - print(" ----------------------------------------------------------\n"); - print("\n"); - calc.molecule.print(); - print("\n"); - calc.r_params.print("response"); - // put the response parameters in a j_molrespone json object - calc.r_params.to_json(calc.j_molresponse); - } - molresponse::end_timer(world, "initialize"); - // Come up with an initial OK data map - if (world.size() > 1) { - calc.set_protocol<3>(world, 1e-4); - calc.make_nuclear_potential(world); - calc.initial_load_bal(world); - } - // set protocol to the first - if (calc.r_params.excited_state()) { - calc.solve_excited_states(world); - } else if (calc.r_params.first_order()) { - calc.solve_response_states(world); - } else if (calc.r_params.second_order()) { - } else { - throw Response_Input_Error{}; - } - calc.output_json(); - if (calc.r_params.dipole()) { // - print("Computing Alpha"); - Tensor alpha = calc.polarizability(); - print("Second Order Analysis"); - calc.PrintPolarizabilityAnalysis(world, alpha); - } - } catch (const Input_Error &e) { - print(e); - error("Input File Error"); - } catch (const SafeMPI::Exception &e) { - print(e); - error("caught an MPI exception"); - } catch (const madness::MadnessException &e) { - print(e); - error("caught a MADNESS exception"); - } catch (const madness::TensorException &e) { - print(e); - error("caught a Tensor exception"); - } catch (const char *s) { - print(s); - error("caught a string exception"); - } catch (const std::string &s) { - print(s); - error("caught a string (class) exception"); - } catch (const std::exception &e) { - print(e.what()); - error("caught an STL exception"); - } catch (...) { - error("caught unhandled exception"); - } - world.gop.fence(); - print_stats(world); - finalize(); - } - return 0; + } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { + std::cout << e << std::endl; + } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { + print(s); + } catch (const std::string &s) { print(s); } catch (const std::exception &e) { + print(e.what()); + } catch (...) { error("caught unhandled exception"); } + + finalize(); + return result; } diff --git a/src/apps/molresponse/property.cc b/src/apps/molresponse/property.cc index 3722ef0029e..a22e0942760 100644 --- a/src/apps/molresponse/property.cc +++ b/src/apps/molresponse/property.cc @@ -1,5 +1,5 @@ #include "molresponse/property.h" -#include +#include #include #include diff --git a/src/apps/molresponse/property.h b/src/apps/molresponse/property.h index f43ee71e8e1..119bef6dc40 100644 --- a/src/apps/molresponse/property.h +++ b/src/apps/molresponse/property.h @@ -11,7 +11,7 @@ #include "../../madness/mra/funcplot.h" #include "../chem/SCFOperators.h" #include "../chem/molecule.h" -#include +#include #include #include diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 2bd763099b4..3193b3b4fcd 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -15,44 +15,9 @@ // real_function_3d == Function namespace madness { - /** - * @brief response vector class holds a single x or y - * - */ - struct response_vector { - private: - size_t num_orbitals; - vector_real_function_3d x;// n response_functions - public: - // default constructor - response_vector() : num_orbitals(size_t(0)), x() {} - // copy constructor - response_vector(const response_vector& other) : num_orbitals{other.num_orbitals} { - x = copy(other[0].world(), other.x); - } - response_vector& operator=(const response_vector& other) { - num_orbitals = other.num_orbitals; - x = copy(other[0].world(), other.x); - return *this; - } - // zero function constructor - explicit response_vector(World& world, size_t num_orbs) : num_orbitals(num_orbs) { - x = zero_functions(world, static_cast(num_orbitals)); - } - ~response_vector() = default; - friend size_t size(const response_vector& other) { return other.num_orbitals; } - real_function_3d& operator[](size_t n) { - assert(n < num_orbitals); - return x.at(n); - } - const real_function_3d& operator[](size_t n) const { - assert(n < num_orbitals); - return x[n]; - } - }; - - /** + typedef std::vector response_matrix; + /* * * @brief response matrix holds response vectors for response state * */ @@ -62,7 +27,6 @@ namespace madness { * @brief vector of vector of real 3d functions * */ - typedef std::vector response_matrix; public: size_t num_states; // Num. of resp. states @@ -100,6 +64,11 @@ namespace madness { this->num_states = y.size(); this->num_orbitals = y.size_orbitals(); this->x = y.x; + if (x.size() != num_states) { x.resize(num_states); } + World& world = y[0][0].world(); + // print("perhaps this is the problem"); + std::transform(y.x.begin(), y.x.end(), x.begin(), + [&](auto yi) { return madness::copy(world, yi); }); } return *this;// } @@ -197,8 +166,9 @@ namespace madness { response_space result(world, num_states, num_orbitals);// create zero_functions - for (size_t i = 0; i < num_states; i++) { result[i] = sub(world, x[i], rhs_y[i]); } - world.gop.fence(); + for (size_t i = 0; i < num_states; i++) { + result[i] = sub(world, x[i], rhs_y[i], false); + } return result; } @@ -288,10 +258,12 @@ namespace madness { // Returns a deep copy response_space copy() const { response_space result(x[0][0].world(), num_states, num_orbitals); + World& world = x[0][0].world(); + + + std::transform(x.begin(), x.end(), result.x.begin(), + [&world](auto xi) { return madness::copy(world, xi); }); - for (size_t i = 0; i < num_states; i++) { - result.x[i] = madness::copy(x[0][0].world(), x[i]); - } return result; } @@ -343,34 +315,54 @@ namespace madness { // Mimicing standard madness calls with these 3 void zero() { + auto& world = x[0][0].world(); + std::generate(x.begin(), x.end(), + [&]() { return zero_functions(world, num_orbitals, true); }); + + /* for (size_t k = 0; k < num_states; k++) { x[k] = zero_functions(x[0][0].world(), num_orbitals); } + */ } void compress_rf() { - for (size_t k = 0; k < num_states; k++) { compress(x[0][0].world(), x[k], true); } + //for (size_t k = 0; k < num_states; k++) { compress(x[0][0].world(), x[k], true); } + auto& world = x[0][0].world(); + std::for_each(x.begin(), x.end(), [&](auto xi) { compress(world, xi, true); }); } void reconstruct_rf() { - for (size_t k = 0; k < num_states; k++) { reconstruct(x[0][0].world(), x[k], true); } + //for (size_t k = 0; k < num_states; k++) { reconstruct(x[0][0].world(), x[k], true); } + auto& world = x[0][0].world(); + std::for_each(x.begin(), x.end(), [&](auto xi) { reconstruct(world, xi, true); }); } void truncate_rf() { + truncate_rf(FunctionDefaults<3>::get_thresh()); + /* for (size_t k = 0; k < num_states; k++) { truncate(x[0][0].world(), x[k], FunctionDefaults<3>::get_thresh(), true); } + */ } + void truncate_rf(double tol) { + auto& world = x[0][0].world(); + std::for_each(x.begin(), x.end(), [&](auto xi) { truncate(world, xi, tol, true); }); + /* for (size_t k = 0; k < num_states; k++) { truncate(x[0][0].world(), x[k], tol, true); } + */ } // Returns norms of each state Tensor norm2() { + auto& world = x[0][0].world(); Tensor answer(num_states); - for (size_t i = 0; i < num_states; i++) { - answer(i) = madness::norm2(x[0][0].world(), x[i]); - } + for (size_t i = 0; i < num_states; i++) { answer(i) = madness::norm2(world, x[i]); } + + world.gop.fence(); + return answer; } @@ -434,6 +426,7 @@ namespace madness { return value; } + auto transposeResponseMatrix(const response_matrix& x) -> response_matrix; // Final piece for KAIN }// End namespace madness diff --git a/src/apps/molresponse/response_parameters.cpp b/src/apps/molresponse/response_parameters.cpp index 456d6947d27..33a91f2bb66 100644 --- a/src/apps/molresponse/response_parameters.cpp +++ b/src/apps/molresponse/response_parameters.cpp @@ -2,35 +2,19 @@ // Created by adrianhurtado on 1/18/22. // #include "response_parameters.h" -using json = nlohmann::json; -void ResponseParameters::to_json(json& j) { - json j_params={}; - - // TODO Is there a way to the get member for every parameter even though get is a template function? - for (auto& p : parameters) { - auto param_type = p.second.get_type(); - if (param_type == "i") { - j_params[p.first] = get(p.first); - // if vector of double - } else if (param_type == "d") { - j_params[p.first] = get(p.first); +void madness::from_json(const json& j, ResponseParameters& p) { + p.from_json(j); + print("--------JSON-Parameters------------\n", p.print_to_string()); +} +bool madness::operator==(const ResponseParameters& p1, const ResponseParameters& p2) { - // if vector of bool - } else if (param_type == "b") { - j_params[p.first] = get(p.first); - // if vector of doubles? - } else if (param_type == "St6vectorIdSaIdEE") { - j_params[p.first] = get>(p.first); - } else if (param_type == "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE") { - auto sval = get(p.first); - if (!sval.empty()) continue; - j_params[p.first] = sval; - // size t - } else if (p.second.get_type() == "m") { - j_params[p.first] = get(p.first); - } - } - j["response_parameters"]=j_params; + return p1.to_json() == p2.to_json(); +} +bool madness::operator!=(const ResponseParameters& p1, const ResponseParameters& p2) { + return !(p1 == p2); } + + + diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index 56cfcc2292a..e3486da758a 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -6,9 +6,9 @@ #ifndef SRC_APPS_MOLRESPONSE_RESPONSE_PARAMETERS_H_ #define SRC_APPS_MOLRESPONSE_RESPONSE_PARAMETERS_H_ -#include -#include -#include +#include +#include +#include #include #include #include @@ -17,228 +17,248 @@ #include #include #include + #include "madness/tensor/tensor_json.hpp" namespace madness { -struct ResponseParameters : public QCCalculationParametersBase { - ResponseParameters(const ResponseParameters& other) = default; - - ResponseParameters() { - initialize("archive", "restartdata", "file to read ground parameters from"); - initialize("nwchem", false, "Using nwchem files for intelligent starting guess"); - initialize("nwchem_dir", "none", "Root name of nwchem files for intelligent starting guess"); - initialize("states", 1, "Number of excited states requested"); - initialize("print_level", 3, "0: no output; 1: final energy; 2: iterations; 3: timings; 10: debug"); - initialize("tda", false, "turn on Tam-Danchof approximation (excitations energy"); - initialize("first_run", true, "Are we on the default guess"); - initialize("plot", false, "turn on plotting of final orbitals. Output format is .vts"); - initialize("plot_range", false, "controls which orbitals will be plotted"); - initialize>("plot_data", std::vector{0}, "Orbitals to plot"); - initialize>("plot_cell", std::vector(), "lo-hi plot cell (default is all space)"); - initialize("core_type", "none", "core potential type", {"none", "mpc"}); - initialize("plot_l", -1.0, "Controls the plotting box size"); - initialize("plot_pts", 201, "Controls number of points in plots"); - initialize("plot_all_orbitals", false, "Turn on 2D plotting of response orbitals "); - initialize("maxiter", 25, "maximum number of iterations"); - initialize("dconv", 1.e-4, "recommended values: 1.e-4 < dconv < 1.e-8"); - initialize("conv_only_dens", false, "if true remove bsh_residual from convergence criteria (deprecated)"); - initialize("dconv_set", false, "Convergence flage for the orbtial density"); - initialize("guess_xyz", false, "TODO : check what this is for"); - initialize("lo", 1.e-10, "smallest length scale we need to resolve"); - initialize>("protocol", {1.e-4, 1.e-6}, "calculation protocol"); - initialize("larger_subspace", - 0, - "Number of iterations to diagonalize in a subspace " - "consisting of old and new vectors"); - initialize("k", -1, "polynomial order"); - initialize("random", false, "Use random guess for initial response functions"); - initialize("store_potential", true, "Store the potential instead of computing each iteration"); - initialize("e_range", false, "Use an energy range to excite from"); - initialize("e_range_lo", 0, "Energy range (lower end) for orbitals to excite from"); - initialize("e_range_hi", 1, "Energy range (upper end) for orbitals to excite from"); - initialize("plot_initial", false, "Flag to plot the ground state orbitals read in from archivie"); - // Restart Parameters - initialize("restart", false, "Flag to restart scf loop from file"); - initialize("restart_file", "none", "file to read ground parameters from"); - // kain - initialize("kain", false, "Turn on Krylov Accelarated Inexact Newton Solver"); - initialize("maxrotn", 1.0, "Max orbital rotation per iteration"); - initialize("maxbsh", 10, "Max bsh residual"); - initialize("maxsub", 10, "size of iterative subspace ... set to 0 or 1 to disable"); - initialize("xc", "hf", "XC input line"); - initialize("save", false, "if true save orbitals to disk"); - initialize("save_file", "none", "File name to save orbitals for restart"); - initialize("save_density", false, "Flag to save density at each iteration"); - initialize("vnucextra", 2, "load balance parameter for nuclear pot"); - initialize("loadbalparts", 2, "??"); - initialize("save_density_file", "none", "File name to save density for restart"); - initialize("load_density", false, "Flag to load density for restart"); - initialize("load_density_file", "none", "File name to load density for restart"); - initialize("guess_max_iter", 5, "maximum number of guess iterations"); - // properties - initialize("calc_type", "full", "full,static,tda"); - initialize("excited_state", false, "Flag to turn on excited state calc"); - initialize("first_order", false, "Flag to turn on first order response calc"); - initialize("second_order", false, "Flag to turn on second order response calc "); - initialize("third_order", false, "Flag to turn on second order response calc "); - initialize("dipole", false, "Flag to turn on frequency dependent property calc"); - initialize("nuclear", false, "Flag to turn on frequency dependent property calc"); - initialize("order2", false, "Flag to turn on frequency dependent property calc"); - initialize("order3", false, "Flag to turn on frequency dependent property calc"); - initialize("d2_types", "none", "possible values are: dd nd dn nn"); - initialize("omega", 0.0, "Incident energy for dynamic response"); - initialize("l", 20, "user coordinates box size"); - // ground-state stuff - initialize("num_orbitals", 0, "number of ground state orbtials"); - initialize("spinrestricted", true, "is spinrestricted calculation"); - initialize("localize", "canon", "localization method", {"pm", "boys", "new", "canon"}); - } - - public: - using QCCalculationParametersBase::read_input_and_commandline_options; - - std::string localize() const { return get("localize"); } - std::string archive() const { return get("archive"); } - std::string calc_type() const { return get("calc_type"); } - std::string nwchem_dir() const { return get("nwchem_dir"); } - bool nwchem() const { return get("nwchem"); } - size_t num_states() const { return get("states"); } - size_t num_orbitals() const { return get("num_orbitals"); } - int print_level() const { return get("print_level"); } - bool tda() const { return get("tda"); } - bool plot() const { return get("plot"); } - bool plot_range() const { return get("plot_range"); } - std::vector plot_data() const { return get>("plot_data"); } - std::vector plot_cell() const { return get>("plot_cell"); } - std::string core_type() const { return get("core_type"); } - - double plot_l() const { return get("plot_l"); } - size_t plot_pts() const { return get("plot_pts"); } - bool plot_all_orbitals() const { return get("plot_all_orbitals"); } - size_t maxiter() const { return get("maxiter"); } - double dconv() const { return get("dconv"); } - bool dconv_set() const { return get("dconv_set"); } - bool guess_xyz() const { return get("guess_xyz"); } - double lo() const { return get("lo"); } - std::vector protocol() const { return get>("protocol"); } - size_t larger_subspace() const { return get("larger_subspace"); } - int k() const { return get("k"); } - bool random() const { return get("random"); } - bool store_potential() const { return get("store_potential"); } - bool e_range() const { return get("e_range"); } - - double e_range_lo() const { return get("e_range_lo"); } - double e_range_hi() const { return get("e_range_hi"); } - - bool plot_initial() const { return get("plot_initial"); } - bool restart() const { return get("restart"); } - std::string restart_file() const { return get("restart_file"); } - bool kain() const { return get("kain"); } - double maxrotn() const { return get("maxrotn"); } - size_t maxsub() const { return get("maxsub"); } - std::string xc() const { return get("xc"); } - bool save() const { return get("save"); } - std::string save_file() const { return get("save_file"); } - bool save_density() const { return get("save_density"); } - std::string save_density_file() const { return get("save_density_file"); } - bool load_density() const { return get("load_density"); } - std::string load_density_file() const { return get("load_density_file"); } - size_t guess_max_iter() const { return get("guess_max_iter"); } - bool property() const { return get("property"); } - int vnucextra() const { return get("vnucextra"); } - int loadbalparts() const { return get("loadbalparts"); } - bool excited_state() const { return get("excited_state"); } - bool first_order() const { return get("first_order"); } - bool second_order() const { return get("second_order"); } - bool third_order() const { return get("third_order"); } - bool dipole() const { return get("dipole"); } - bool nuclear() const { return get("nuclear"); } - bool order2() const { return get("order2"); } - bool order3() const { return get("order3"); } - std::string d2_types() const { return get("d2_types"); } - double omega() const { return get("omega"); } - double L() const { return get("l"); } - - bool spinrestricted() const { return get("spinrestricted"); } - void set_ground_state_calculation_data(GroundStateCalculation g_params){ - set_derived_value("num_orbitals", g_params.n_orbitals()); - set_derived_value("spinrestricted", g_params.is_spinrestricted()); - set_derived_value("l", g_params.get_L()); - set_derived_value("lo", g_params.molecule().smallest_length_scale()); - set_derived_value("xc", g_params.get_xc()); - } - void set_derived_values(World& world, Molecule molecule) { - // read the parameters from file and brodcast - // tag - vector calculation_type; - vector calc_flags; - if (first_order()) { - if (omega() == 0) { - set_derived_value("calc_type", "static"); - } else { - set_derived_value("calc_type", "full"); - } - - if (dipole()) { - set_derived_value("states", 3); - } else if (nuclear()) { - set_derived_value("states", 3 * molecule.natom()); - } - } else if (second_order()) { - if (omega() == 0) { - set_derived_value("calc_type", "static"); - } else { - set_derived_value("calc_type", "full"); - } - vector nstates; // states 1 - for (size_t i = 0; i < 2; i++) { - if (d2_types().at(i) == 'd') { - nstates.push_back(3); - } else if (d2_types().at(i) == 'n') { - nstates.push_back(3 * molecule.natom()); - } else { - MADNESS_EXCEPTION("not a valid response state ", 0); + struct ResponseParameters : public QCCalculationParametersBase { + ResponseParameters(const ResponseParameters& other) = default; + + ResponseParameters() { + initialize("archive", "restartdata", + "file to read ground parameters from"); + initialize("nwchem", false, "Using nwchem files for intelligent starting guess"); + initialize("nwchem_dir", "none", + "Root name of nwchem files for intelligent starting guess"); + initialize("states", 1, "Number of excited states requested"); + initialize("print_level", 3, + "0: no output; 1: final energy; 2: iterations; 3: timings; 10: debug"); + initialize("tda", false, "turn on Tam-Danchof approximation (excitations energy"); + initialize("first_run", true, "Are we on the default guess"); + initialize("plot", false, + "turn on plotting of final orbitals. Output format is .vts"); + initialize("plot_range", false, "controls which orbitals will be plotted"); + initialize>("plot_data", std::vector{0}, "Orbitals to plot"); + initialize>("plot_cell", std::vector(), + "lo-hi plot cell (default is all space)"); + initialize("core_type", "none", "core potential type", {"none", "mpc"}); + initialize("plot_l", -1.0, "Controls the plotting box size"); + initialize("plot_pts", 201, "Controls number of points in plots"); + initialize("plot_all_orbitals", false, + "Turn on 2D plotting of response orbitals "); + initialize("maxiter", 25, "maximum number of iterations"); + initialize("dconv", 1.e-4, "recommended values: 1.e-4 < dconv < 1.e-8"); + initialize("conv_only_dens", false, + "if true remove bsh_residual from convergence criteria (deprecated)"); + initialize("dconv_set", false, "Convergence flage for the orbtial density"); + initialize("guess_xyz", false, "TODO : check what this is for"); + initialize("lo", 1.e-10, "smallest length scale we need to resolve"); + initialize>("protocol", {1.e-4, 1.e-6}, "calculation protocol"); + initialize("larger_subspace", 0, + "Number of iterations to diagonalize in a subspace " + "consisting of old and new vectors"); + initialize("k", -1, "polynomial order"); + initialize("random", false, "Use random guess for initial response functions"); + initialize("store_potential", true, + "Store the potential instead of computing each iteration"); + initialize("e_range", false, "Use an energy range to excite from"); + initialize("e_range_lo", 0, + "Energy range (lower end) for orbitals to excite from"); + initialize("e_range_hi", 1, + "Energy range (upper end) for orbitals to excite from"); + initialize("plot_initial", false, + "Flag to plot the ground state orbitals read in from archivie"); + // Restart Parameters + initialize("restart", false, "Flag to restart scf loop from file"); + initialize("restart_file", "none", "file to read ground parameters from"); + // kain + initialize("kain", false, "Turn on Krylov Accelarated Inexact Newton Solver"); + initialize("maxrotn", 100, "Max orbital rotation per iteration"); + initialize("maxbsh", 10, "Max bsh residual"); + initialize("maxsub", 10, + "size of iterative subspace ... set to 0 or 1 to disable"); + initialize("xc", "hf", "XC input line"); + initialize("save", false, "if true save orbitals to disk"); + initialize("save_file", "none", "File name to save orbitals for restart"); + initialize("save_density", false, "Flag to save density at each iteration"); + initialize("vnucextra", 2, "load balance parameter for nuclear pot"); + initialize("loadbalparts", 2, "??"); + initialize("save_density_file", "none", + "File name to save density for restart"); + initialize("load_density", false, "Flag to load density for restart"); + initialize("load_density_file", "none", + "File name to load density for restart"); + initialize("guess_max_iter", 5, "maximum number of guess iterations"); + // properties + initialize("calc_type", "full", "full,static,tda"); + initialize("excited_state", false, "Flag to turn on excited state calc"); + initialize("first_order", false, "Flag to turn on first order response calc"); + initialize("second_order", false, "Flag to turn on second order response calc "); + initialize("third_order", false, "Flag to turn on second order response calc "); + initialize("dipole", false, "Flag to turn on frequency dependent property calc"); + initialize("nuclear", false, "Flag to turn on frequency dependent property calc"); + initialize("order2", false, "Flag to turn on frequency dependent property calc"); + initialize("order3", false, "Flag to turn on frequency dependent property calc"); + initialize("d2_types", "none", "possible values are: dd nd dn nn"); + initialize("omega", 0.0, "Incident energy for dynamic response"); + initialize("l", 20, "user coordinates box size"); + // ground-state stuff + initialize("num_orbitals", 0, "number of ground state orbtials"); + initialize("spinrestricted", true, "is spinrestricted calculation"); + initialize("localize", "canon", "localization method", + {"pm", "boys", "new", "canon"}); } - } - size_t states; - states = std::accumulate(nstates.begin(), nstates.end(), 1, std::multiplies<>()); - set_derived_value("states", states); - } else if (third_order()) { - if (omega() == 0) { - set_derived_value("calc_type", "static"); - } else { - set_derived_value("calc_type", "full"); - } - vector nstates; // states 1 - for (size_t i = 0; i < 3; i++) { - if (d2_types()[i] == 'd') { - nstates.push_back(3); - } else if (d2_types()[i] == 'n') { - nstates.push_back(3 * molecule.natom()); - } else { - MADNESS_EXCEPTION("not a valid response state ", 0); + + public: + using QCCalculationParametersBase::read_input_and_commandline_options; + + std::string localize() const { return get("localize"); } + std::string archive() const { return get("archive"); } + std::string calc_type() const { return get("calc_type"); } + std::string nwchem_dir() const { return get("nwchem_dir"); } + bool nwchem() const { return get("nwchem"); } + size_t num_states() const { return get("states"); } + size_t num_orbitals() const { return get("num_orbitals"); } + int print_level() const { return get("print_level"); } + bool tda() const { return get("tda"); } + bool plot() const { return get("plot"); } + bool plot_range() const { return get("plot_range"); } + std::vector plot_data() const { return get>("plot_data"); } + std::vector plot_cell() const { return get>("plot_cell"); } + std::string core_type() const { return get("core_type"); } + + double plot_l() const { return get("plot_l"); } + size_t plot_pts() const { return get("plot_pts"); } + bool plot_all_orbitals() const { return get("plot_all_orbitals"); } + size_t maxiter() const { return get("maxiter"); } + double dconv() const { return get("dconv"); } + bool dconv_set() const { return get("dconv_set"); } + bool guess_xyz() const { return get("guess_xyz"); } + double lo() const { return get("lo"); } + std::vector protocol() const { return get>("protocol"); } + size_t larger_subspace() const { return get("larger_subspace"); } + int k() const { return get("k"); } + bool random() const { return get("random"); } + bool store_potential() const { return get("store_potential"); } + bool e_range() const { return get("e_range"); } + + double e_range_lo() const { return get("e_range_lo"); } + double e_range_hi() const { return get("e_range_hi"); } + + bool plot_initial() const { return get("plot_initial"); } + bool restart() const { return get("restart"); } + std::string restart_file() const { return get("restart_file"); } + bool kain() const { return get("kain"); } + double maxrotn() const { return get("maxrotn"); } + size_t maxsub() const { return get("maxsub"); } + std::string xc() const { return get("xc"); } + bool save() const { return get("save"); } + std::string save_file() const { return get("save_file"); } + bool save_density() const { return get("save_density"); } + std::string save_density_file() const { return get("save_density_file"); } + bool load_density() const { return get("load_density"); } + std::string load_density_file() const { return get("load_density_file"); } + size_t guess_max_iter() const { return get("guess_max_iter"); } + bool property() const { return get("property"); } + int vnucextra() const { return get("vnucextra"); } + int loadbalparts() const { return get("loadbalparts"); } + bool excited_state() const { return get("excited_state"); } + bool first_order() const { return get("first_order"); } + bool second_order() const { return get("second_order"); } + bool third_order() const { return get("third_order"); } + bool dipole() const { return get("dipole"); } + bool nuclear() const { return get("nuclear"); } + bool order2() const { return get("order2"); } + bool order3() const { return get("order3"); } + std::string d2_types() const { return get("d2_types"); } + double omega() const { return get("omega"); } + double L() const { return get("l"); } + + bool spinrestricted() const { return get("spinrestricted"); } + void set_ground_state_calculation_data(GroundStateCalculation g_params) { + set_derived_value("num_orbitals", g_params.n_orbitals()); + set_derived_value("spinrestricted", g_params.is_spinrestricted()); + set_derived_value("l", g_params.get_L()); + set_derived_value("lo", g_params.molecule().smallest_length_scale()); + set_derived_value("xc", g_params.get_xc()); + set_derived_value("localize", g_params.get_localize_method()); + } + void set_derived_values(World& world, Molecule molecule) { + // read the parameters from file and brodcast + // tag + vector calculation_type; + vector calc_flags; + if (first_order()) { + if (omega() == 0) { + set_derived_value("calc_type", "static"); + } else { + set_derived_value("calc_type", "full"); + } + + if (dipole()) { + set_derived_value("states", 3); + } else if (nuclear()) { + set_derived_value("states", 3 * molecule.natom()); + } + } else if (second_order()) { + if (omega() == 0) { + set_derived_value("calc_type", "static"); + } else { + set_derived_value("calc_type", "full"); + } + vector nstates;// states 1 + for (size_t i = 0; i < 2; i++) { + if (d2_types().at(i) == 'd') { + nstates.push_back(3); + } else if (d2_types().at(i) == 'n') { + nstates.push_back(3 * molecule.natom()); + } else { + MADNESS_EXCEPTION("not a valid response state ", 0); + } + } + size_t states; + states = std::accumulate(nstates.begin(), nstates.end(), 1, std::multiplies<>()); + set_derived_value("states", states); + } else if (third_order()) { + if (omega() == 0) { + set_derived_value("calc_type", "static"); + } else { + set_derived_value("calc_type", "full"); + } + vector nstates;// states 1 + for (size_t i = 0; i < 3; i++) { + if (d2_types()[i] == 'd') { + nstates.push_back(3); + } else if (d2_types()[i] == 'n') { + nstates.push_back(3 * molecule.natom()); + } else { + MADNESS_EXCEPTION("not a valid response state ", 0); + } + } + size_t states; + states = std::accumulate(nstates.begin(), nstates.end(), 1, std::multiplies<>()); + set_derived_value("states", states); + } else if (excited_state()) { + if (tda()) { + set_derived_value("calc_type", "tda"); + } else { + set_derived_value("calc_type", "full"); + } + } } - } - size_t states; - states = std::accumulate(nstates.begin(), nstates.end(), 1, std::multiplies<>()); - set_derived_value("states", states); - } else if (excited_state()) { - if (tda()) { - set_derived_value("calc_type", "tda"); - } else { - set_derived_value("calc_type", "full"); - } - } - } - - // convenience getters - double econv() const { return get("econv"); } - bool first_run() const { return get("first_run"); } - std::string local() const { return get("local"); } - void to_json( nlohmann::json& j); -}; - -// namespace madness -} // namespace madness - -#endif // SRC_APPS_MOLRESPONSE_RESPONSE_PARAMETERS_H_ + + // convenience getters + double econv() const { return get("econv"); } + bool first_run() const { return get("first_run"); } + std::string local() const { return get("local"); } + }; + void from_json(const nlohmann::json&, ResponseParameters& p); + bool operator==(const ResponseParameters& p1, const ResponseParameters& p2); + bool operator!=(const ResponseParameters& p1, const ResponseParameters& p2); + // convenience getters + void to_json(nlohmann::json& j); +};// namespace madness + + // namespace madness + +#endif// SRC_APPS_MOLRESPONSE_RESPONSE_PARAMETERS_H_ diff --git a/src/apps/molresponse/timer.cc b/src/apps/molresponse/timer.cc index b63b387b5b5..829c7b53a7e 100644 --- a/src/apps/molresponse/timer.cc +++ b/src/apps/molresponse/timer.cc @@ -9,22 +9,41 @@ #include "madness/mra/mra.h" // Needed for timers namespace molresponse { -double pop(std::vector& v) { - double x = v.back(); - v.pop_back(); - return x; -} -// Pulled from SCF.cc, starts a timer -void start_timer(World& world) { - world.gop.fence(); - ttt.push_back(wall_time()); - sss.push_back(cpu_time()); -} -// Stops a timer -void end_timer(World& world, const char* msg) { - MADNESS_CHECK(ttt.size() > 0); - double wall = wall_time() - pop(ttt); - double cpu = cpu_time() - pop(sss); - if (world.rank() == 0) printf(" timer: %20.20s %8.2fs %8.2fs\n", msg, cpu, wall); -} -} // namespace molresponse + double pop(std::vector& v) { + double x = v.back(); + v.pop_back(); + return x; + } + // Pulled from SCF.cc, starts a timer + void start_timer(World& world) { + world.gop.fence(); + ttt.push_back(wall_time()); + sss.push_back(cpu_time()); + } + // Stops a timer + void end_timer(World& world, const char* msg) { + world.gop.fence(); + MADNESS_CHECK(ttt.size() > 0); + + double wall = wall_time() - pop(ttt); + double cpu = cpu_time() - pop(sss); + + + if (world.rank() == 0) printf(" timer: %20.20s %8.2fs %8.2fs\n", msg, cpu, wall); + } + void end_timer(World& world, const char* msg, const std::string& key, + std::map>& time) { + double wall = wall_time() - pop(ttt); + double cpu = cpu_time() - pop(sss); + + std::pair timings; + // first is wall + // second is cpu + timings.first = wall; + timings.second = cpu; + + time[key] = timings; + + if (world.rank() == 0) printf(" timer: %20.20s %8.2fs %8.2fs\n", msg, cpu, wall); + } +}// namespace molresponse diff --git a/src/apps/molresponse/timer.h b/src/apps/molresponse/timer.h index f39720dccf4..1116aa99146 100644 --- a/src/apps/molresponse/timer.h +++ b/src/apps/molresponse/timer.h @@ -15,6 +15,10 @@ void start_timer(World& world); // Stops a timer void end_timer(World& world, const char* msg); + +void end_timer(World& world, const char* msg, const std::string& key, + std::map>& time); + } // namespace molresponse #endif // SRC_APPS_MOLRESPONSE_TIMER_H_ diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc new file mode 100644 index 00000000000..4707fa5101e --- /dev/null +++ b/src/apps/molresponse/x_space.cc @@ -0,0 +1,127 @@ +// Copyright 2021 Adrian Hurtado + + +#include "x_space.h" + +#include "response_functions.h" + +namespace madness { + auto to_response_matrix(const X_space& x) -> response_matrix { + World& world = x.X[0][0].world(); + auto mX = response_matrix(x.num_states()); + int b = 0; + for (auto& mi: mX) { + mi = copy(world, x.X[b]); + std::for_each(x.Y[b].begin(), x.Y[b].end(), + [&](const auto& yi) { mi.push_back(copy(yi)); }); + b++; + } + return mX; + } + + /** + * Flattens all response functions into a single vector of functions + * @param x + * @return + */ + auto to_flattened_vector(const X_space& x) -> vector_real_function_3d { + + World& world = x.X[0][0].world(); + auto num_orbitals = 2 * x.num_orbitals(); + auto vij = vector_real_function_3d(x.num_states()*num_orbitals); + auto mx = to_response_matrix(x); + + int b = 0; + for (auto& mi: mx) { + std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); + b++; + } + return vij; + } + + auto to_X_space(const response_matrix& x) -> X_space { + + World& world = x[0][0].world(); + + auto num_states = x.size(); + auto num_orbitals = size_t(x[0].size() / 2); + auto x_space = X_space(world, num_states, num_orbitals); + + int b = 0; + std::for_each(x.begin(), x.end(), [&](auto x_vec) { + //auto norm_vi = norm2(world, x_vec); + //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } + std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin()); + std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin()); + b++; + }); + + // auto norms = x_space.norm2s(); + // if (world.rank() == 0) { print("norms after copy ", norms); } + + + return x_space; + } + + auto transposeResponseMatrix(const response_matrix& x) -> response_matrix { + + auto XT = response_matrix(x[0].size()); + + auto b = 0; + for (auto& xi: XT) { + auto j = 0; + xi = vector_real_function_3d(x.size()); + for (auto& xji: xi) { xji = copy(x[j++][b]); } + b++; + } + return XT; + } + auto inner(const X_space& A, const X_space& B) -> Tensor { + MADNESS_ASSERT(size_states(A) > 0); + MADNESS_ASSERT(size_orbitals(A) > 0); + MADNESS_ASSERT(same_size(A, B)); + + long size = static_cast(A.n_states); + + auto a = to_response_matrix(A); + auto b = to_response_matrix(B); + + World& world = a[0][0].world(); + + auto a_transpose = transposeResponseMatrix(a); + auto b_transpose = transposeResponseMatrix(b); + /* + std::for_each(a_transpose.begin(), a_transpose.end(), + [&](const auto& ai) { print(norm2(world, ai)); }); + std::for_each(b_transpose.begin(), b_transpose.end(), + [&](const auto& ai) { print(norm2(world, ai)); }); + */ + // Container for result + Tensor result(a.size(), a.size()); + int p = 0; + std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto& ati) { + result += matrix_inner(world, ati, b_transpose[p++]); + }); + + /* + * TODO Figure out why this won't work + std::inner_product( + a_transpose.begin(), a_transpose.end(), b_transpose.begin(), result, + [](Tensor a, const Tensor& b) { + print("a", a); + print("b", b); + auto ab = a + b; + print("a + b = ", ab); + return ab; + }, + [&](const auto& ai, const auto& bi) { + auto m = matrix_inner(world, ai, bi); + print("m: ", m); + return m; + }); + */ + + //print("results: ", result); + return result; + } +}// namespace madness diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index df8a3123d35..ea0687cf155 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -3,315 +3,352 @@ #define SRC_APPS_MOLRESPONSE_X_SPACE_H_ #include -#include +#include #include #include #include +#include #include #include "molresponse/response_functions.h" namespace madness { -struct X_space { - private: - size_t n_states; // Num. of resp. states - size_t n_orbitals; // Num. of ground states - - public: - response_space X, Y; - - public: - size_t num_states() const { return n_states; } - size_t num_orbitals() const { return n_orbitals; } - // default constructor - X_space() : n_states(0), n_orbitals(0), X(), Y() {} - // Copy constructor - X_space(const X_space& A) : n_states(size_states(A)), n_orbitals(size_orbitals(A)), X(A.X), Y(A.Y) {} - X_space copy() const { - X_space copyX(X[0][0].world(), n_states, n_orbitals); - copyX.X = X.copy(); - copyX.Y = Y.copy(); - return copyX; - } - /// Create a new copy of the function with different distribution and optional - /// fence - - /// Works in either basis. Different distributions imply - /// asynchronous communication and the optional fence is - /// collective. - X_space copy(const std::shared_ptr > >& pmap, bool fence = false) const { - X_space copyX(X[0][0].world(), n_states, n_orbitals); - copyX.X = X.copy(pmap, fence); - copyX.Y = Y.copy(pmap, fence); - return copyX; - } - // assignment - X_space& operator=(const X_space& B) { - if (this != &B) { // is it the same object? - this->n_states = size_states(B); - this->n_orbitals = size_orbitals(B); - this->X = B.X; - this->Y = B.Y; - } - return *this; // shallow copy - } - // Zero Constructor - X_space(World& world, size_t n_states, size_t n_orbtials) - : n_states(n_states), n_orbitals(n_orbtials), X(world, n_states, n_orbtials), Y(world, n_states, n_orbtials) {} - // explicit constructor from 2 resonse_space - explicit X_space(response_space& X, response_space& Y) { - MADNESS_ASSERT(X.size() == Y.size()); - MADNESS_ASSERT(X[0].size() == Y[0].size()); - this->n_states = X.size(); - this->n_orbitals = X[0].size(); - this->X = X.copy(); - this->Y = Y.copy(); - } - void clear() { - X.clear(); - Y.clear(); - } - X_space operator+(const X_space B) { - MADNESS_ASSERT(same_size(*this, B)); - World& world = this->X[0][0].world(); - X_space result(world, n_states, n_orbitals); - result.X = X + B.X; - result.Y = Y + B.Y; - return result; - } - - X_space& operator+=(const X_space B) { - MADNESS_ASSERT(same_size(*this, B)); - this->X += B.X; - this->Y += B.Y; - return *this; - } - - void push_back(vector_real_function_3d x, vector_real_function_3d y) { - if (n_orbitals > 0) { - MADNESS_ASSERT(n_orbitals == x.size()); - MADNESS_ASSERT(n_orbitals == y.size()); - MADNESS_ASSERT(x.size() == y.size()); - } else { // g_states == 0 (empty vector) - n_orbitals = x.size(); - } - MADNESS_ASSERT(x.size() == num_orbitals()); - MADNESS_ASSERT(y.size() == num_orbitals()); - - n_states++; - X.push_back(x); - Y.push_back(y); - // Be smart with g_states - } - void pop_back() { - X.pop_back(); - Y.pop_back(); - n_states--; - if (n_states == 0) { - n_orbitals = 0; - } - } - - friend X_space operator+(const X_space& A, const X_space& B) { - MADNESS_ASSERT(same_size(A, B)); - - World& world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals); // create zero_functions - - result.X = A.X + B.X; - result.Y = A.Y + B.Y; - return result; - } - - X_space operator-(const X_space B) { - MADNESS_ASSERT(same_size(*this, B)); - World& world = this->X[0][0].world(); - X_space result(world, n_states, n_orbitals); - result.X = X - B.X; - result.Y = Y - B.Y; - return result; - } - - friend X_space operator-(const X_space& A, const X_space& B) { - MADNESS_ASSERT(same_size(A, B)); - - World& world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals); // create zero_functions - - result.X = A.X - B.X; - result.Y = A.Y - B.Y; - return result; - } - - friend X_space operator*(const X_space& A, const double& b) { - World& world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals); // create zero_functions - - result.X = A.X * b; - result.Y = A.Y * b; - return result; - } - friend X_space operator*(const double& b, const X_space& A) { - World& world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals); // create zero_functions - - result.X = A.X * b; - result.Y = A.Y * b; - return result; - } - X_space operator*(const double& b) { - this->X *= b; - this->Y *= b; - return *this; - } - - friend X_space operator*(const X_space& A, const Function& f) { - World& world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals); // create zero_functions - - result.X = A.X * f; - result.Y = A.Y * f; - return result; - } - friend X_space operator*(const Function& f, const X_space& A) { - World& world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals); // create zero_functions - - result.X = A.X * f; - result.Y = A.Y * f; - return result; - } - - friend X_space operator*(const X_space& A, const Tensor& b) { - MADNESS_ASSERT(size_states(A) > 0); - MADNESS_ASSERT(size_orbitals(A) > 0); - - World& world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals); - result.X = A.X * b; - result.Y = A.Y * b; - - return result; - } - inline friend Tensor inner(X_space& A, X_space& B) { - MADNESS_ASSERT(size_states(A) > 0); - MADNESS_ASSERT(size_orbitals(A) > 0); - MADNESS_ASSERT(same_size(A, B)); - Tensor G(A.n_states, A.n_states); - Tensor G1(A.n_states, A.n_states); - Tensor G2(A.n_states, A.n_states); - G1 = response_space_inner(A.X, B.X); - G2 = response_space_inner(A.Y, B.Y); - // TODO find a way to print seperate pieces based on a flag - // print("inner "); - // print(G1); - // print("inner "); - // print(G2); - - G = G1 + G2; - return G; - } - - void truncate() { - X.truncate_rf(); - Y.truncate_rf(); - } - - void print_norm2() { - for (size_t i = 0; i < num_states(); i++) { - std::cout << "state " << i; - std::cout << " X: "; - - for (size_t j = 0; j < num_orbitals(); j++) { - std::cout << " " << X[i][j].norm2() << " "; - } - std::cout << " Y: "; - for (size_t j = 0; j < num_orbitals(); j++) { - std::cout << " " << Y[i][j].norm2() << " "; - } - std::cout << std::endl; - } - } - - friend size_t size_states(const X_space& x) { return x.n_states; } - friend size_t size_orbitals(const X_space& x) { return x.n_orbitals; } - friend bool same_size(const X_space& A, const X_space& B) { - return ((size_states(A) == size_states(B) && size_orbitals(A) == size_orbitals(B))); - } -}; -// The default constructor for functions does not initialize them to nahy value, -// but the solver needs the functions initialized to zero for which we also need -// the world object. - -struct X_vector : public X_space { - X_vector(World& world, size_t n_orbtials) : X_space(world, size_t(1), n_orbtials) {} - - X_vector(X_space A, size_t b) : X_space(A.X[0][0].world(), size_t(1), A.num_orbitals()) { - X[0] = A.X[b]; - Y[0] = A.Y[b]; - } - friend X_vector operator-(const X_vector& A, const X_vector& B) { - MADNESS_ASSERT(same_size(A, B)); - - World& world = A.X[0][0].world(); - X_vector result(world, size_orbitals(A)); // create zero_functions - result.X = A.X - B.X; - result.Y = A.Y - B.Y; - return result; - } - friend X_vector operator*(const X_vector& A, const double& c) { - World& world = A.X[0][0].world(); - X_vector result(world, size_orbitals(A)); // create zero_functions - result.X = A.X * c; - result.Y = A.Y * c; - return result; - } - X_vector copy() const { - X_vector copyX(X[0][0].world(), X.num_orbitals); - copyX.X = X.copy(); - copyX.Y = Y.copy(); - return copyX; - } - X_vector& operator+=(const X_vector& B) { - MADNESS_ASSERT(same_size(*this, B)); - - this->X += B.X; - this->Y += B.Y; - - return *this; - } - inline friend double inner(X_vector& A, X_vector& B) { - MADNESS_ASSERT(size_states(A) == 1); - MADNESS_ASSERT(size_orbitals(A) > 0); - MADNESS_ASSERT(same_size(A, B)); - - Tensor G(1, 1); - Tensor G1(1, 1); - Tensor G2(1, 1); - G1 = response_space_inner(A.X, B.X); - G2 = response_space_inner(A.Y, B.Y); - G = G1 + G2; - return G(0, 0); - } -}; -// function object with allocator()() -struct X_space_allocator { - World& world; - const size_t n_states; - const size_t n_orbtials; - X_space_allocator(World& world, size_t n_orbtials) : world(world), n_states(size_t(1)), n_orbtials(n_orbtials) {} - // overloading the default constructor () operator - X_vector operator()() { - print("allocator called with ", int(n_orbtials), " orbitals"); - - // returning constructor of x_vector - return X_vector(world, n_orbtials); - } - // Copy constructor - - X_space_allocator operator=(const X_space_allocator& other) { return X_space_allocator(world, other.n_orbtials); } -}; -} // namespace madness - -#endif // SRC_APPS_MOLRESPONSE_X_SPACE_H_ + struct X_space; + auto to_response_matrix(const X_space& x) -> response_matrix; + auto to_flattened_vector(const X_space& x) -> vector_real_function_3d; + auto to_X_space(const response_matrix& x) -> X_space; + struct X_space { + private: + size_t n_states; // Num. of resp. states + size_t n_orbitals;// Num. of ground states + + public: + response_space X, Y; + + public: + size_t num_states() const { return n_states; } + size_t num_orbitals() const { return n_orbitals; } + // default constructor + X_space() : n_states(0), n_orbitals(0), X(), Y() {} + // Copy constructor + X_space(const X_space& A) + : n_states(size_states(A)), + n_orbitals(size_orbitals(A)), + X(A.X), + Y(A.Y) {} + X_space copy() const { + X_space copyX(X[0][0].world(), n_states, n_orbitals); + copyX.X = X.copy(); + copyX.Y = Y.copy(); + return copyX; + } + /// Create a new copy of the function with different distribution and optional + /// fence + + /// Works in either basis. Different distributions imply + /// asynchronous communication and the optional fence is + /// collective. + auto copy(const std::shared_ptr>>& pmap, + bool fence = false) const -> X_space { + X_space copyX(X[0][0].world(), n_states, n_orbitals); + copyX.X = X.copy(pmap, fence); + copyX.Y = Y.copy(pmap, fence); + return copyX; + } + // assignment + auto operator=(const X_space& B) -> X_space& { + if (this != &B) {// is it the same object? + this->n_states = B.num_states(); + this->n_orbitals = B.num_orbitals(); + this->X = B.X.copy(); + this->Y = B.Y.copy(); + } + return *this;// NO SHALLOW COPIES + } + // Zero Constructor + X_space(World& world, size_t n_states, size_t n_orbitals) + : n_states(n_states), + n_orbitals(n_orbitals), + X(world, n_states, n_orbitals), + Y(world, n_states, n_orbitals) {} + // explicit constructor from 2 resonse_space + explicit X_space(response_space& X, response_space& Y) { + MADNESS_ASSERT(X.size() == Y.size()); + MADNESS_ASSERT(X[0].size() == Y[0].size()); + this->n_states = X.size(); + this->n_orbitals = X[0].size(); + this->X = X.copy(); + this->Y = Y.copy(); + } + void clear() { + X.clear(); + Y.clear(); + } + auto operator+(const X_space& B) -> X_space { + MADNESS_ASSERT(same_size(*this, B)); + World& world = this->X[0][0].world(); + + auto ax = to_response_matrix(*this); + auto bx = to_response_matrix(B); + + response_matrix add_x(num_states()); + + std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), + [&](auto a, auto b) { return add(world, a, b); }); + + return to_X_space(add_x); + } + + auto operator+=(const X_space& B) -> X_space& { + MADNESS_ASSERT(same_size(*this, B)); + this->X += B.X; + this->Y += B.Y; + return *this; + } + + void push_back(vector_real_function_3d x, vector_real_function_3d y) { + if (n_orbitals > 0) { + MADNESS_ASSERT(n_orbitals == x.size()); + MADNESS_ASSERT(n_orbitals == y.size()); + MADNESS_ASSERT(x.size() == y.size()); + } else {// g_states == 0 (empty vector) + n_orbitals = x.size(); + } + MADNESS_ASSERT(x.size() == num_orbitals()); + MADNESS_ASSERT(y.size() == num_orbitals()); + + n_states++; + X.push_back(x); + Y.push_back(y); + // Be smart with g_states + } + void pop_back() { + X.pop_back(); + Y.pop_back(); + n_states--; + if (n_states == 0) { n_orbitals = 0; } + } + + friend auto operator+(const X_space& A, const X_space& B) -> X_space { + MADNESS_ASSERT(same_size(A, B)); + + World& world = A.X[0][0].world(); + X_space result(world, A.n_states, A.n_orbitals);// create zero_functions + + auto ax = to_response_matrix(A); + auto bx = to_response_matrix(B); + + response_matrix add_x(A.num_states()); + + std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), + [&](auto a, auto b) { return add(world, a, b); }); + + return to_X_space(add_x); + + result.X = A.X + B.X; + result.Y = A.Y + B.Y; + return result; + } + + X_space operator-(const X_space B) { + MADNESS_ASSERT(same_size(*this, B)); + World& world = this->X[0][0].world(); + X_space result(world, n_states, n_orbitals); + result.X = X - B.X; + result.Y = Y - B.Y; + return result; + } + + friend X_space operator-(const X_space& A, const X_space& B) { + MADNESS_ASSERT(same_size(A, B)); + + World& world = A.X[0][0].world(); + X_space result(world, A.n_states, A.n_orbitals);// create zero_functions + + result.X = A.X - B.X; + result.Y = A.Y - B.Y; + return result; + } + + friend X_space operator*(const X_space& A, const double& b) { + World& world = A.X[0][0].world(); + X_space result(world, A.n_states, A.n_orbitals);// create zero_functions + + result.X = A.X * b; + result.Y = A.Y * b; + return result; + } + friend X_space operator*(const double& b, const X_space& A) { + World& world = A.X[0][0].world(); + X_space result(world, A.n_states, A.n_orbitals);// create zero_functions + + result.X = A.X * b; + result.Y = A.Y * b; + return result; + } + X_space operator*(const double& b) { + this->X *= b; + this->Y *= b; + return *this; + } + + friend X_space operator*(const X_space& A, const Function& f) { + World& world = A.X[0][0].world(); + X_space result(world, A.n_states, A.n_orbitals);// create zero_functions + + result.X = A.X * f; + result.Y = A.Y * f; + return result; + } + friend auto operator*(const Function& f, const X_space& A) -> X_space { + World& world = A.X[0][0].world(); + X_space result(world, A.n_states, A.n_orbitals);// create zero_functions + + result.X = A.X * f; + result.Y = A.Y * f; + return result; + } + + friend auto operator*(const X_space& A, const Tensor& b) -> X_space { + MADNESS_ASSERT(size_states(A) > 0); + MADNESS_ASSERT(size_orbitals(A) > 0); + + World& world = A.X[0][0].world(); + X_space result(world, A.n_states, A.n_orbitals); + result.X = A.X * b; + result.Y = A.Y * b; + + return result; + } + /*** + * + * @param A + * @param B + * @return + */ + friend auto inner(const X_space& A, const X_space& B) -> Tensor; + + void truncate() { + X.truncate_rf(); + Y.truncate_rf(); + } + + auto norm2s() -> Tensor { + World& world = X[0][0].world(); + + Tensor norms(num_states()); + for (size_t b = 0; b < num_states(); b++) { + auto xb = madness::copy(world, X[b]); + for (auto& yb: Y[b]) { xb.push_back(madness::copy(yb, true)); } + norms[b] = sqrt(inner(xb, xb)); + } + return norms; + } + + auto component_norm2s() const -> Tensor { + World& world = X[0][0].world(); + + auto rx = to_flattened_vector(*this); + auto norms = norm2s_T(world, rx); + return norms.reshape(n_states, 2 * n_orbitals); + } + + friend auto size_states(const X_space& x) -> size_t { return x.n_states; } + friend auto size_orbitals(const X_space& x) -> size_t { return x.n_orbitals; } + friend auto same_size(const X_space& A, const X_space& B) -> bool { + return ((size_states(A) == size_states(B) && size_orbitals(A) == size_orbitals(B))); + } + }; + + // but the solver needs the functions initialized to zero for which we also need + // the world object. + + struct X_vector : public X_space { + X_vector(World& world, size_t n_orbtials) : X_space(world, size_t(1), n_orbtials) {} + + X_vector(X_space A, size_t b) : X_space(A.X[0][0].world(), size_t(1), A.num_orbitals()) { + X[0] = A.X[b]; + Y[0] = A.Y[b]; + } + friend X_vector operator-(const X_vector& A, const X_vector& B) { + MADNESS_ASSERT(same_size(A, B)); + + World& world = A.X[0][0].world(); + X_vector result(world, size_orbitals(A));// create zero_functions + result.X = A.X - B.X; + result.Y = A.Y - B.Y; + return result; + } + friend X_vector operator*(const X_vector& A, const double& c) { + World& world = A.X[0][0].world(); + X_vector result(world, size_orbitals(A));// create zero_functions + result.X = A.X * c; + result.Y = A.Y * c; + return result; + } + X_vector copy() const { + X_vector copyX(X[0][0].world(), X.num_orbitals); + copyX.X = X.copy(); + copyX.Y = Y.copy(); + return copyX; + } + auto operator+=(const X_vector& B) -> X_vector& { + MADNESS_ASSERT(same_size(*this, B)); + + + this->X += B.X; + this->Y += B.Y; + + return *this; + } + inline friend auto inner(X_vector& A, X_vector& B) -> double { + MADNESS_ASSERT(size_states(A) == 1); + MADNESS_ASSERT(size_orbitals(A) > 0); + MADNESS_ASSERT(same_size(A, B)); + + Tensor G(1, 1); + Tensor G1(1, 1); + Tensor G2(1, 1); + + World& world = A.X[0][0].world(); + + auto ax = madness::copy(world, A.X[0]); + auto ay = madness::copy(world, A.Y[0]); + + auto bx = madness::copy(world, B.X[0]); + auto by = madness::copy(world, B.Y[0]); + + for (auto& ayi: ay) { ax.push_back(madness::copy(ayi)); } + for (auto& byi: by) { bx.push_back(madness::copy(byi)); }; + + double result = inner(ax, bx); + + return result; + } + }; + // function object with allocator()() + struct X_space_allocator { + World& world; + const size_t n_states; + const size_t n_orbtials; + X_space_allocator(World& world, size_t n_orbtials) + : world(world), + n_states(size_t(1)), + n_orbtials(n_orbtials) {} + // overloading the default constructor () operator + X_vector operator()() { + print("allocator called with ", int(n_orbtials), " orbitals"); + + // returning constructor of x_vector + return X_vector(world, n_orbtials); + } + // Copy constructor + + X_space_allocator operator=(const X_space_allocator& other) { + return X_space_allocator(world, other.n_orbtials); + } + }; +}// namespace madness + +#endif// SRC_APPS_MOLRESPONSE_X_SPACE_H_ From c8876740c57ba14b49a7cea78268b6adb86e1186 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 31 Aug 2022 16:47:03 -0400 Subject: [PATCH 0219/1312] add cmake build to ignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 10988c085e8..e947318afde 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build* +cmake-build-debug* # Compiled Object files *.slo @@ -59,3 +60,4 @@ Makefile-prog.in compile_commands.json *.idx .clang-format +/cmake-build-debug/.ninja_deps From 576095805af62339b5ae6d9e16d30073ab0aa456 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 31 Aug 2022 17:03:47 -0400 Subject: [PATCH 0220/1312] changes related to chem move --- src/apps/molresponse/ResponseBase.hpp | 221 ++-- src/apps/molresponse/TDDFT.h | 10 +- src/apps/molresponse/calc_runner.cc | 12 +- src/apps/molresponse/global_functions.cc | 2 +- src/apps/molresponse/ground_parameters.h | 10 +- src/apps/molresponse/iterate_excited.cc | 2 +- src/apps/molresponse/property.cc | 2 +- src/apps/molresponse/property.h | 2 +- src/apps/molresponse/response_parameters.cpp | 2 + src/apps/molresponse/response_parameters.h | 6 +- src/apps/molresponse/testing/runners.hpp | 2 +- .../molresponse/testing/write_test_input.h | 2 +- .../chem/QCCalculationParametersBase.cc | 270 ++--- .../chem/QCCalculationParametersBase.h | 1063 +++++++++-------- 14 files changed, 862 insertions(+), 744 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 64a100b57bd..1cea35c9d66 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -14,13 +14,17 @@ #include "load_balance.h" #include "madness/mra/functypedefs.h" #include "madness/mra/mra.h" +#include #include "madness/tensor/tensor.h" +#include "madness/tensor/tensor_json.hpp" #include "timer.h" #include "x_space.h" using namespace madness; +using json=nlohmann::json; + class response_timing { std::map> wall_time_data; std::map> cpu_time_data; @@ -29,12 +33,13 @@ class response_timing { public: response_timing(); - void to_json(json& j); + void to_json(json &j); void print_data(); void add_data(std::map> values); }; + class ResponseTester; struct residuals { @@ -48,13 +53,20 @@ using gamma_orbitals = std::tuple CalcParams { return {ground_calc, molecule, r_params}; } + auto get_orbitals() const -> vector_real_function_3d { return ground_orbitals; } + void output_json(); json j_molresponse{}; @@ -99,7 +111,7 @@ class ResponseBase { functionT ground_density;// ground state density mutable response_space stored_potential;// The ground state potential, stored only - // if store_potential is true (default is + // if store_potential is true (default is double vtol{}; @@ -112,7 +124,7 @@ class ResponseBase { /// AS well as the ground state density /// \param world /// \param thresh - void set_protocol(World& world, double thresh) { + void set_protocol(World &world, double thresh) { int k; // Allow for imprecise conversion of threshold if (thresh >= 0.9e-2) k = 4; @@ -162,62 +174,84 @@ class ResponseBase { } } - virtual void check_k(World& world, double thresh, int k); - auto make_ground_density(World& world) const -> functionT; - auto ComputeHamiltonianPair(World& world) const -> std::pair, Tensor>; - auto Coulomb(World& world) const -> real_function_3d; - auto make_xc_operator(World& world) const -> XCOperator; - virtual void save(World& world, const std::string& name) = 0; - virtual void load(World& world, const std::string& name) = 0; - auto make_density(World& world, const X_space& chi) const -> vecfuncT; - - void load_balance_chi(World& world); - auto make_bsh_operators_response(World& world, double& shift, double& omega) const - -> vector; - - - auto kain_x_space_update(World& world, const X_space& chi, const X_space& residual_chi, - NonLinearXsolver& kain_x_space, vector& Xvector, - vector& Xresidual) -> X_space; - void x_space_step_restriction(World& world, const X_space& old_Chi, X_space& temp, - bool restrict_y, const double& maxrotn); - void plotResponseOrbitals(World& world, size_t iteration, const response_space& x_response, - const response_space& y_response, - const ResponseParameters& responseParameters, - const GroundStateCalculation& g_params); - - static auto orbital_load_balance(World& world, const gamma_orbitals&, double load_balance) - -> gamma_orbitals; - auto compute_gamma_tda(World& world, const gamma_orbitals& density, - const XCOperator& xc) const -> X_space; - auto compute_gamma_static(World& world, const gamma_orbitals&, - const XCOperator& xc) const -> X_space; - auto compute_gamma_full(World& world, const gamma_orbitals&, - const XCOperator& xc) const -> X_space; - auto compute_V0X(World& world, const X_space& X, const XCOperator& xc, + virtual void check_k(World &world, double thresh, int k); + + auto make_ground_density(World &world) const -> functionT; + + auto ComputeHamiltonianPair(World &world) const -> std::pair, Tensor>; + + auto Coulomb(World &world) const -> real_function_3d; + + auto make_xc_operator(World &world) const -> XCOperator; + + virtual void save(World &world, const std::string &name) = 0; + + virtual void load(World &world, const std::string &name) = 0; + + auto make_density(World &world, const X_space &chi) const -> vecfuncT; + + void load_balance_chi(World &world); + + auto make_bsh_operators_response(World &world, double &shift, double &omega) const + -> vector; + + + auto kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, + NonLinearXsolver &kain_x_space, vector &Xvector, + vector &Xresidual) -> X_space; + + void x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, + bool restrict_y, const double &maxrotn); + + void plotResponseOrbitals(World &world, size_t iteration, const response_space &x_response, + const response_space &y_response, + const ResponseParameters &responseParameters, + const GroundStateCalculation &g_params); + + static auto orbital_load_balance(World &world, const gamma_orbitals &, double load_balance) + -> gamma_orbitals; + + auto compute_gamma_tda(World &world, const gamma_orbitals &density, + const XCOperator &xc) const -> X_space; + + auto compute_gamma_static(World &world, const gamma_orbitals &, + const XCOperator &xc) const -> X_space; + + auto compute_gamma_full(World &world, const gamma_orbitals &, + const XCOperator &xc) const -> X_space; + + auto compute_V0X(World &world, const X_space &X, const XCOperator &xc, bool compute_Y) const -> X_space; - auto compute_lambda_X(World& world, const X_space& chi, XCOperator& xc, - const std::string& calc_type) const -> X_space; - auto compute_theta_X(World& world, const X_space& chi, const XCOperator& xc, - const std::string& calc_type) const -> X_space; - auto compute_F0X(World& world, const X_space& X, const XCOperator& xc, + + auto compute_lambda_X(World &world, const X_space &chi, XCOperator &xc, + const std::string &calc_type) const -> X_space; + + auto compute_theta_X(World &world, const X_space &chi, const XCOperator &xc, + const std::string &calc_type) const -> X_space; + + auto compute_F0X(World &world, const X_space &X, const XCOperator &xc, bool compute_Y) const -> X_space; - void analyze_vectors(World& world, const vecfuncT& x, const std::string& response_state); - auto project_ao_basis(World& world, const AtomicBasisSet& aobasis) -> vecfuncT; + void analyze_vectors(World &world, const vecfuncT &x, const std::string &response_state); - static auto project_ao_basis_only(World& world, const AtomicBasisSet& aobasis, - const Molecule& mol) -> vecfuncT; - void converged_to_json(json& j); - auto compute_residual(World& world, const X_space& chi, const X_space& g_chi, - const std::string& calc_type) -> residuals; - auto compute_response_potentials(World& world, const X_space& chi, XCOperator& xc, - const std::string& calc_type) const - -> std::tuple; + auto project_ao_basis(World &world, const AtomicBasisSet &aobasis) -> vecfuncT; + + + static auto project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, + const Molecule &mol) -> vecfuncT; + + void converged_to_json(json &j); + + auto compute_residual(World &world, const X_space &chi, const X_space &g_chi, + const std::string &calc_type) -> residuals; + + auto compute_response_potentials(World &world, const X_space &chi, XCOperator &xc, + const std::string &calc_type) const + -> std::tuple; // compute exchange |i> - auto exchangeHF(const vecfuncT& ket,const vecfuncT& bra, const vecfuncT& vf) const -> vecfuncT { - World& world = ket[0].world(); + auto exchangeHF(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) const -> vecfuncT { + World &world = ket[0].world(); auto n = bra.size(); auto nf = ket.size(); double tol = FunctionDefaults<3>::get_thresh();/// Important this is @@ -250,13 +284,15 @@ class ResponseBase { truncate(world, Kf, tol, true); return Kf; } - static void print_inner(World& world, const std::string& name, const X_space& left, - const X_space& right) ; - void function_data_to_json(json& j_mol_in, size_t iter, const Tensor& x_norms, - const Tensor& x_abs_norms, const Tensor& x_rel_norms, - const Tensor& xij_norms, const Tensor& xij_res_norms, - const Tensor& rho_norms, - const Tensor& rho_res_norms); + + static void print_inner(World &world, const std::string &name, const X_space &left, + const X_space &right); + + void function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, + const Tensor &x_abs_norms, const Tensor &x_rel_norms, + const Tensor &xij_norms, const Tensor &xij_res_norms, + const Tensor &rho_norms, + const Tensor &rho_res_norms); }; @@ -268,12 +304,14 @@ class ResponseBase { /// \param Chi /// \param thresh /// \param k -void check_k(World& world, X_space& Chi, double thresh, int k); +void check_k(World &world, X_space &Chi, double thresh, int k); + + +auto add_randomness(World &world, const response_space &f, double magnitude) -> response_space; +void normalize(World &world, response_space &f); -auto add_randomness(World& world, const response_space& f, double magnitude) -> response_space; -void normalize(World& world, response_space& f); -void normalize(World& world, X_space& Chi); +void normalize(World &world, X_space &Chi); static auto kronecker(size_t l, size_t n) -> double { @@ -281,7 +319,7 @@ static auto kronecker(size_t l, size_t n) -> double { return 0.0; } -auto solid_harmonics(World& world, int n) -> std::map, real_function_3d>; +auto solid_harmonics(World &world, int n) -> std::map, real_function_3d>; /*** * @brief Prints the norms of the functions of a response space @@ -291,23 +329,28 @@ auto solid_harmonics(World& world, int n) -> std::map, real_fun * @param world * @param f */ -void print_norms(World& world, const response_space& f); +void print_norms(World &world, const response_space &f); + // Returns a list of solid harmonics such that: // solid_harm.size() * num_ground_orbs > 2 * num. resp. components -auto make_xyz_functions(World& world) -> vector_real_function_3d; +auto make_xyz_functions(World &world) -> vector_real_function_3d; + // Selects from a list of functions and energies the k functions with the // lowest energy -auto select_functions(World& world, response_space f, Tensor& energies, size_t k, +auto select_functions(World &world, response_space f, Tensor &energies, size_t k, size_t print_level) -> response_space; + // Sorts the given tensor of eigenvalues and // response functions -void sort(World& world, Tensor& vals, response_space& f); -void sort(World& world, Tensor& vals, X_space& f); +void sort(World &world, Tensor &vals, response_space &f); + +void sort(World &world, Tensor &vals, X_space &f); // Specialized for response calculations that returns orthonormalized // functions -auto gram_schmidt(World& world, const response_space& f) -> response_space; +auto gram_schmidt(World &world, const response_space &f) -> response_space; + /// Computes the transition density between set of two response functions x and y. /// Uses std::transform to iterate between x and y vectors /// \param world @@ -315,45 +358,49 @@ auto gram_schmidt(World& world, const response_space& f) -> response_space; /// \param x /// \param y /// \return -auto transition_density(World& world, const vector_real_function_3d& orbitals, - const response_space& x, const response_space& y) - -> vector_real_function_3d; +auto transition_density(World &world, const vector_real_function_3d &orbitals, + const response_space &x, const response_space &y) +-> vector_real_function_3d; -auto transition_densityTDA(World& world, const vector_real_function_3d& orbitals, - const response_space& x) -> vector_real_function_3d; +auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals, + const response_space &x) -> vector_real_function_3d; -auto transform(World& world, const response_space& f, const Tensor& U) -> response_space; +auto transform(World &world, const response_space &f, const Tensor &U) -> response_space; -auto transform(World& world, const X_space& x, const Tensor& U) -> X_space; +auto transform(World &world, const X_space &x, const Tensor &U) -> X_space; // result(i,j) = inner(a[i],b[j]).sum() -auto expectation(World& world, const response_space& A, const response_space& B) -> Tensor; +auto expectation(World &world, const response_space &A, const response_space &B) -> Tensor; class ResponseTester { public: - static void load_calc(World& world, ResponseBase* p, double thresh) { + static void load_calc(World &world, ResponseBase *p, double thresh) { p->set_protocol(world, thresh); p->load(world, p->r_params.restart_file()); p->check_k(world, thresh, FunctionDefaults<3>::get_k()); } - static X_space compute_gamma_full(World& world, ResponseBase* p, double thresh) { + + static X_space compute_gamma_full(World &world, ResponseBase *p, double thresh) { XCOperator xc = p->make_xc_operator(world); X_space gamma = p->compute_gamma_full(world, {p->Chi, p->ground_orbitals, p->ground_orbitals}, xc); return gamma; } - X_space compute_lambda_X(World& world, ResponseBase* p, double thresh) { + + X_space compute_lambda_X(World &world, ResponseBase *p, double thresh) { XCOperator xc = p->make_xc_operator(world); X_space gamma = p->compute_lambda_X(world, p->Chi, xc, p->r_params.calc_type()); return gamma; } - std::pair compute_VFOX(World& world, ResponseBase* p, bool compute_y) { + + std::pair compute_VFOX(World &world, ResponseBase *p, bool compute_y) { XCOperator xc = p->make_xc_operator(world); X_space V = p->compute_V0X(world, p->Chi, xc, compute_y); X_space F = p->compute_F0X(world, p->Chi, xc, compute_y); return {V, F}; } }; + #endif// MADNESS_RESPONSEBASE_HPP diff --git a/src/apps/molresponse/TDDFT.h b/src/apps/molresponse/TDDFT.h index 815b4198298..5c654c15376 100644 --- a/src/apps/molresponse/TDDFT.h +++ b/src/apps/molresponse/TDDFT.h @@ -3,11 +3,11 @@ #ifndef SRC_APPS_MOLRESPONSE_TDDFT_H_ #define SRC_APPS_MOLRESPONSE_TDDFT_H_ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include // The kain solver diff --git a/src/apps/molresponse/calc_runner.cc b/src/apps/molresponse/calc_runner.cc index 70100f5670e..236d7fa8f40 100644 --- a/src/apps/molresponse/calc_runner.cc +++ b/src/apps/molresponse/calc_runner.cc @@ -1,5 +1,5 @@ // Copyright 2021 Adrian Hurtado -#include +#include #include #include @@ -11,11 +11,11 @@ #include "Plot_VTK.h" #include "TDDFT.h" -#include "chem/NWChem.h"// For nwchem interface -#include "chem/SCFOperators.h" -#include "chem/molecule.h" -#include "chem/potentialmanager.h" -#include "chem/projector.h"// For easy calculation of (1 - \hat{\rho}^0) +#include "madness/chem/NWChem.h"// For nwchem interface +#include "madness/chem/SCFOperators.h" +#include "madness/chem/molecule.h" +#include "madness/chem/potentialmanager.h" +#include "madness/chem/projector.h"// For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "molresponse/basic_operators.h" #include "molresponse/density.h" diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index e14e7791d92..cf47058b150 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -5,7 +5,7 @@ #include #include -#include "apps/chem/SCFOperators.h" +#include "madness/chem/SCFOperators.h" #include "response_parameters.h" void print_molecule(World &world, const GroundStateCalculation &g_params) { diff --git a/src/apps/molresponse/ground_parameters.h b/src/apps/molresponse/ground_parameters.h index 75ea5a2d89c..b59a175f894 100644 --- a/src/apps/molresponse/ground_parameters.h +++ b/src/apps/molresponse/ground_parameters.h @@ -8,14 +8,14 @@ #include -#include "../chem/NWChem.h"// For nwchem interface -#include "../chem/SCFOperators.h" +#include "madness/chem/NWChem.h"// For nwchem interface +#include "madness/chem/SCFOperators.h" #include "../chem/molecule.h" #include "Plot_VTK.h" #include "basic_operators.h" -#include "chem/pointgroupsymmetry.h" -#include "chem/potentialmanager.h" -#include "chem/projector.h"// For easy calculation of (1 - \hat{\rho}^0) +#include "madness/chem/pointgroupsymmetry.h" +#include "madness/chem/potentialmanager.h" +#include "madness/chem/projector.h"// For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "madness/mra/functypedefs.h" #include "madness/tensor/tensor.h" diff --git a/src/apps/molresponse/iterate_excited.cc b/src/apps/molresponse/iterate_excited.cc index 63cd9d5bdc3..157affb59d6 100644 --- a/src/apps/molresponse/iterate_excited.cc +++ b/src/apps/molresponse/iterate_excited.cc @@ -10,7 +10,7 @@ #include "Plot_VTK.h" #include "TDDFT.h" #include "madness/tensor/tensor_json.hpp" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) +#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) #include "madness/mra/funcdefaults.h" #include "molresponse/response_functions.h" #include "molresponse/timer.h" diff --git a/src/apps/molresponse/property.cc b/src/apps/molresponse/property.cc index a22e0942760..cfc57a6d19b 100644 --- a/src/apps/molresponse/property.cc +++ b/src/apps/molresponse/property.cc @@ -1,5 +1,5 @@ #include "molresponse/property.h" -#include +#include #include #include diff --git a/src/apps/molresponse/property.h b/src/apps/molresponse/property.h index 119bef6dc40..23abe95fd73 100644 --- a/src/apps/molresponse/property.h +++ b/src/apps/molresponse/property.h @@ -11,7 +11,7 @@ #include "../../madness/mra/funcplot.h" #include "../chem/SCFOperators.h" #include "../chem/molecule.h" -#include +#include #include #include diff --git a/src/apps/molresponse/response_parameters.cpp b/src/apps/molresponse/response_parameters.cpp index 33a91f2bb66..0cf7569aa11 100644 --- a/src/apps/molresponse/response_parameters.cpp +++ b/src/apps/molresponse/response_parameters.cpp @@ -3,6 +3,8 @@ // #include "response_parameters.h" +using json=nlohmann::json; + void madness::from_json(const json& j, ResponseParameters& p) { p.from_json(j); print("--------JSON-Parameters------------\n", p.print_to_string()); diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index e3486da758a..939ebcab6a6 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -6,9 +6,9 @@ #ifndef SRC_APPS_MOLRESPONSE_RESPONSE_PARAMETERS_H_ #define SRC_APPS_MOLRESPONSE_RESPONSE_PARAMETERS_H_ -#include -#include -#include +#include +#include +#include #include #include #include diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 1d170205143..a276b9e8064 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -9,7 +9,7 @@ #include "FrequencyResponse.hpp" #include "ResponseExceptions.hpp" #include "TDDFT.h" -#include "apps/chem/SCF.h" +#include "madness/chem/SCF.h" #include "madness/tensor/tensor_json.hpp" #include "madness/world/worldmem.h" #include "response_data_base.hpp" diff --git a/src/apps/molresponse/testing/write_test_input.h b/src/apps/molresponse/testing/write_test_input.h index c2b3769eeba..ff557f213fa 100644 --- a/src/apps/molresponse/testing/write_test_input.h +++ b/src/apps/molresponse/testing/write_test_input.h @@ -6,7 +6,7 @@ #ifndef MADNESS_WRITE_RESPONSE_INPUT_H #define MADNESS_WRITE_RESPONSE_INPUT_H -#include +#include #include "response_parameters.h" diff --git a/src/madness/chem/QCCalculationParametersBase.cc b/src/madness/chem/QCCalculationParametersBase.cc index bc3b27d4596..93910aa3e83 100644 --- a/src/madness/chem/QCCalculationParametersBase.cc +++ b/src/madness/chem/QCCalculationParametersBase.cc @@ -5,7 +5,7 @@ * Author: fbischoff */ -#include +#include #include #include #include @@ -19,76 +19,67 @@ namespace madness { /// print all parameters -void QCCalculationParametersBase::print(const std::string header, - const std::string footer) const { - - std::string body=print_to_string(); - if (header.size()>0) madness::print(header); - ::madness::print(body); - if (footer.size()>0) madness::print(footer); -} - -std::string QCCalculationParametersBase::print_to_string(bool non_defaults_only) const { - - // sort parameters according to increasing print_order - typedef std::tuple keyvalT; - std::list list; - for (auto& p : parameters) list.push_back(keyvalT(p.second.get_print_order(),p.first,p.second)); - list.sort([](const keyvalT& first, const keyvalT& second) {return std::get<0>(first) < std::get<0>(second);}); - - std::stringstream ss; - int counter=0; - for (auto& p : list) { - const QCParameter& param=std::get<2>(p); - if (non_defaults_only and (param.precedence==QCParameter::def)) continue; - ss << param.print_line(std::get<1>(p)); - if (++counter0) madness::print(header); + ::madness::print(body); + if (footer.size()>0) madness::print(footer); + } + + std::string QCCalculationParametersBase::print_to_string(bool non_defaults_only) const { + + // sort parameters according to increasing print_order + typedef std::tuple keyvalT; + std::list list; + for (auto& p : parameters) list.push_back(keyvalT(p.second.get_print_order(),p.first,p.second)); + list.sort([](const keyvalT& first, const keyvalT& second) {return std::get<0>(first) < std::get<0>(second);}); + + std::stringstream ss; + for (auto& p : list) { + const QCParameter& param=std::get<2>(p); + if (non_defaults_only and (param.precedence==QCParameter::def)) continue; + ss << param.print_line(std::get<1>(p)); + ss << std::endl; + } + return ss.str(); + } /// read the parameters from file and broadcast -void QCCalculationParametersBase::read_input(World& world, const std::string filename, const std::string tag) { - - std::string filecontents, line; - std::string errmsg; - if (world.rank()==0) { - try { - std::ifstream f(filename.c_str()); - while (std::getline(f, line)) filecontents += line + "\n"; - read_internal(world, filecontents, tag); - } catch (std::invalid_argument& e) { - errmsg=e.what(); - throw; - } catch (std::exception& e) { - std::stringstream ss; - ss << "could not read data group >>" << tag << "<< in file " << filename << std::endl; - errmsg=ss.str(); + void QCCalculationParametersBase::read_input(World& world, const std::string filename, const std::string tag) { + + std::string filecontents, line; + if (world.rank()==0) { + try { + std::ifstream f(filename.c_str()); + while (std::getline(f, line)) filecontents += line + "\n"; + read_internal(world, filecontents, tag); + } catch (madness::MadnessException& e) { + std::cout << "could not find " << tag << " in file " << filename << std::endl; + } } + world.gop.broadcast_serializable(*this, 0); } - world.gop.broadcast_serializable(*this, 0); - if (errmsg.size()>0) throw std::runtime_error(errmsg); -} /// read the parameters from the command line and broadcast /// syntax is: qcprogram --mp2='maxiter 10; freeze 1' --dft:maxiter=20 --Xmpi:debug=true /// the argument in quotes is the value of the parser keys -void QCCalculationParametersBase::read_commandline_options(World& world, const commandlineparser& parser, - const std::string tag) { - if (not parser.key_exists(tag)) return; - std::string value=parser.value(tag); - // turn this into a fake input file - if (world.rank()==0) { - std::string q="'"; - std::replace_copy(value.begin(), value.end(), value.begin(), q.c_str()[0] , ' '); - std::replace_copy(value.begin(), value.end(), value.begin(), ';', '\n'); - value=tag+"\n"+value+"\nend"; -// print("value",value); - read_internal(world, value,tag); - } - world.gop.broadcast_serializable(*this, 0); -} + void QCCalculationParametersBase::read_commandline_options(World& world, const commandlineparser& parser, + const std::string tag) { + if (not parser.key_exists(tag)) return; + std::string value=parser.value(tag); + // turn this into a fake input file + if (world.rank()==0) { + std::string q="'"; + std::replace_copy(value.begin(), value.end(), value.begin(), q.c_str()[0] , ' '); + std::replace_copy(value.begin(), value.end(), value.begin(), ';', '\n'); + value=tag+"\n"+value+"\nend"; + read_internal(world, value,tag); + } + world.gop.broadcast_serializable(*this, 0); + } @@ -96,85 +87,78 @@ void QCCalculationParametersBase::read_commandline_options(World& world, const c /// only parameters that are defined in the constructor will be processed, /// all others will be discarded. -void QCCalculationParametersBase::read_internal(World& world, std::string& filecontents, std::string tag) { - std::stringstream f(filecontents); - position_stream_to_word(f, tag, '#', true, true); - std::string line, key,value; - - // read input lines - while (std::getline(f,line)) { - - // all in lower case - std::transform(line.begin(), line.end(), line.begin(), ::tolower); - - // remove comments from line - std::size_t last = line.find_first_of('#'); - line=line.substr(0,last); - std::replace_copy(line.begin(), line.end(), line.begin(),'=', ' '); - - std::stringstream sline(line); - - // sline might be empty by now - if (not (sline >> key)) continue; - if (print_debug) ::madness::print("reading key ",key); - - // skip comment line - if (key[0]=='#') continue; - if (key=="end") break; - - // check if key exists in the initialized parameter list - if (not (parameter_exists(key))) { - if (not ignore_unknown_keys) { - if (world.rank()==0) { - ::madness::print("found unknown key: ",key); - ::madness::print("in datagroup: ",tag); - } - throw std::runtime_error("input error"); + void QCCalculationParametersBase::read_internal(World& world, std::string& filecontents, std::string tag) { + std::stringstream f(filecontents); + position_stream_to_word(f, tag, '#', true, true); + std::string line, key,value; + + // read input lines + while (std::getline(f,line)) { + + // all in lower case + std::transform(line.begin(), line.end(), line.begin(), ::tolower); + + // remove comments from line + std::size_t last = line.find_first_of('#'); + line=line.substr(0,last); + + std::stringstream sline(line); + + // sline might be empty by now + if (not (sline >> key)) continue; + if (print_debug) ::madness::print("reading key ",key); + + // skip comment line + if (key[0]=='#') continue; + if (key=="end") break; + + // check if key exists in the initialized parameter list + if (not (parameter_exists(key))) { + if (world.rank()==0) madness::print("ignoring unknown parameter in input file: ",key); + continue; + } + + std::string word,line1; + while (sline >> word) {line1+=word+" ";} + // trim result + last = line1.find_last_not_of(' '); + line1=line1.substr(0, last+1); + + + // check which type to expect from the given key + // this look clumsy, maybe there are more elegant solutions? + bool success=false; + try { + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value >(key,line1) or success; + success=try_setting_user_defined_value >(key,line1) or success; + success=try_setting_user_defined_value >(key,line1) or success; + success=try_setting_user_defined_value >(key,line1) or success; + success=try_setting_user_defined_value >(key,line1) or success; + + } catch (std::runtime_error& e) { + std::string errmsg="found an error for key >> "+key+" << \n" +e.what(); + throw std::runtime_error(errmsg); + } + if (not success) { + madness::print("\n\ncould not assign the input parameter for key ",key); + std::string requested_type=get_parameter(key).get_type(); + madness::print("\trequested type: ",requested_type,"\n"); + madness::print("add the corresponding type to QCCalculationsParametersBase.h\n\n"); + MADNESS_EXCEPTION("add the corresponding type to QCCalculationsParametersBase.h",1); } - if ((not ignore_unknown_keys_silently) - and (world.rank()==0)) madness::print("ignoring unknown parameter in input file: ",key); - continue; - } - - std::string word,line1; - while (sline >> word) {line1+=word+" ";} - // trim result - last = line1.find_last_not_of(' '); - line1=line1.substr(0, last+1); - - - // check which type to expect from the given key - // this look clumsy, maybe there are more elegant solutions? - bool success=false; - try { - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value >(key,line1) or success; - success=try_setting_user_defined_value >(key,line1) or success; - success=try_setting_user_defined_value >(key,line1) or success; - success=try_setting_user_defined_value >(key,line1) or success; - success=try_setting_user_defined_value >(key,line1) or success; - - } catch (std::invalid_argument& e) { - throw; - } catch (std::exception& e) { - std::string errmsg="found an error for key >> "+key+" << \n" +e.what(); - throw std::runtime_error(errmsg); - } - if (not success) { - madness::print("\n\ncould not assign the input parameter for key ",key); - std::string requested_type=get_parameter(key).get_type(); - madness::print("\trequested type: ",requested_type,"\n"); - madness::print("add the corresponding type to QCCalculationsParametersBase.h\n\n"); - throw std::invalid_argument("add the corresponding type to QCCalculationsParametersBase.h"); - } - } -}; - - -} /* namespace madness */ + } + }; + + + bool operator!=(const QCCalculationParametersBase& p1, + const QCCalculationParametersBase& p2) { + return !(p1 == p2); + } +} /* namespace madness */ \ No newline at end of file diff --git a/src/madness/chem/QCCalculationParametersBase.h b/src/madness/chem/QCCalculationParametersBase.h index 5f8fdd070b0..643c3e8cd40 100644 --- a/src/madness/chem/QCCalculationParametersBase.h +++ b/src/madness/chem/QCCalculationParametersBase.h @@ -8,107 +8,109 @@ #ifndef SRC_APPS_CHEM_QCCALCULATIONPARAMETERSBASE_H_ #define SRC_APPS_CHEM_QCCALCULATIONPARAMETERSBASE_H_ -#include + +#include #include -#include +#include #include #include #include #include #include #include -#include +#include +#include +using json =nlohmann::json; namespace madness { -template -static typename std::enable_if::value, void>::type -check_for_inf(const std::string& str, T& arg) { - std::string sinf; - std::stringstream ss; - ss << std::numeric_limits::infinity(); - sinf=ss.str(); + template + static typename std::enable_if::value, void>::type + check_for_inf(const std::string& str, T& arg) { + std::string sinf; + std::stringstream ss; + ss << std::numeric_limits::infinity(); + sinf=ss.str(); - if (sinf==str) arg=std::numeric_limits::infinity(); -} + if (sinf==str) arg=std::numeric_limits::infinity(); + } -template -static typename std::enable_if::value, void>::type -check_for_inf(const std::string& str, T& arg) { - return; -} + template + static typename std::enable_if::value, void>::type + check_for_inf(const std::string& str, T& arg) { + return; + } /// inverting the print method from print.h for std::vector /// TODO: move this where it belongs (into print.h ??) -template > -std::istream& operator>>(std::istream& is, std::vector& v) { - - // get the full line from opening to closing brackets [ .. ] - std::string word, line=""; - while (is >> word) { - line+=word; - if (word.find(']')!=std::string::npos) break; - } - if (line.size()!=0) is.clear(); - - // remove enclosing brackets and commas - auto find_c = [](char& c){ return ((c==',') or (c=='[') or (c==']')); }; - std::replace_if (line.begin(), line.end(), find_c, ' '); // 0 2 0 4 0 6 0 8 0 - - // stream the values into the container - std::stringstream sline(line); - T tmp; - while (sline >> word) { - std::stringstream sword(word); - sword >> tmp; - check_for_inf(word,tmp); - v.push_back(tmp); - } - if (sline.bad()) { - madness::print("error while reading vector from istream: "); - madness::print(line,"\n"); - throw std::runtime_error("IO error"); - } - - return is; -} + template > + std::istream& operator>>(std::istream& is, std::vector& v) { + + // get the full line from opening to closing brackets [ .. ] + std::string word, line=""; + while (is >> word) { + line+=word; + if (word.find(']')!=std::string::npos) break; + } + + // remove enclosing brackets and commas + auto find_c = [](char& c){ return ((c==',') or (c=='[') or (c==']')); }; + std::replace_if (line.begin(), line.end(), find_c, ' '); // 0 2 0 4 0 6 0 8 0 + + // stream the values into the container + std::stringstream sline(line); + T tmp; + while (sline >> word) { + std::stringstream sword(word); + sword >> tmp; + check_for_inf(word,tmp); + v.push_back(tmp); + } + if (sline.bad()) { + madness::print("error while reading vector from istream: "); + madness::print(line,"\n"); + MADNESS_EXCEPTION("IO error",1); + } + + return is; + } /// inverting the print method from print.h for std::vector /// TODO: move this where it belongs (into print.h ??) -template -std::istream& operator>>(std::istream& is, std::pair& p) { - - // get all words from the line - std::string word, line=""; - while (is >> word) { - line+=word + " "; - }; - // have to set this here to account for the error handling later.. - is.clear(); - - // remove enclosing brackets and commas - auto find_c = [](char& c){ return ((c==',') or (c=='(') or (c==')')); }; - std::replace_if (line.begin(), line.end(), find_c, ' '); // 0 2 0 4 0 6 0 8 0 - - // stream the values into the container - std::stringstream sline(line); - T tmp1; - Q tmp2; - sline >> tmp1 >> tmp2; - if (sline.bad() or sline.fail()) { - madness::print("error while reading vector from istream: "); - madness::print(line,"\n"); - throw std::runtime_error("IO error"); - } - p=std::pair(tmp1,tmp2); - - return is; -} + template + std::istream& operator>>(std::istream& is, std::pair& p) { + + // get all words from the line + std::string word, line=""; + while (is >> word) { + line+=word + " "; + }; + // have to set this here to account for the error handling later.. + is.clear(); + + // remove enclosing brackets and commas + auto find_c = [](char& c){ return ((c==',') or (c=='(') or (c==')')); }; + std::replace_if (line.begin(), line.end(), find_c, ' '); // 0 2 0 4 0 6 0 8 0 + + // stream the values into the container + std::stringstream sline(line); + T tmp1; + Q tmp2; + sline >> tmp1 >> tmp2; + if (sline.bad() or sline.fail()) { + madness::print("error while reading vector from istream: "); + madness::print(line,"\n"); + MADNESS_EXCEPTION("IO error",1); + } + p=std::pair(tmp1,tmp2); + + return is; + } /// structure holding the value for a given parameter @@ -120,123 +122,119 @@ std::istream& operator>>(std::istream& is, std::pair& p) { /// /// all values are stored as strings and must be converted to their respective types by the /// QCCalculationParametersBase class (see below) -struct QCParameter { -public: - QCParameter() {}; - - QCParameter(const std::string v, const std::string t, const std::string comment="", - const std::vector allowed_values1={}) - : default_value(v), type(t), comment(comment), allowed_values(allowed_values1) { - static int i=0; - print_order=i++; - set_all(); - } - - void set_derived_value(const std::string val) { - precedence=std::max(derived,precedence); - derived_value=val; - set_all(); - } - void set_user_defined_value(const std::string val) { - precedence=std::max(defined,precedence); - user_defined_value=val; - set_all(); - } - - bool is_user_defined() const { - return (precedence==defined); - } + struct QCParameter { + public: + QCParameter() {}; + + QCParameter(const std::string v, const std::string t, const std::string comment="", + const std::vector allowed_values1={}) + : default_value(v), type(t), comment(comment), allowed_values(allowed_values1) { + static int i=0; + print_order=i++; + set_all(); + } - std::string get_value() const {return value;} - std::string get_type() const {return type;} - std::string get_comment() const {return comment;} - std::string print_precedence() const { - if (precedence==def) return "default"; - if (precedence==derived) return "derived"; - if (precedence==defined) return "defined"; - std::stringstream sprecedence; - sprecedence << precedence; - throw std::runtime_error("unknown precedence in QCParameter"+sprecedence.str()); - return "darn"; - } - - int get_print_order() const {return print_order;} - - std::string print_line(const std::string& key) const { - - auto fill_left = [](const int size, const std::string word) { - int nspaces=std::max(int(0),size-int(word.length())); - return std::string(nspaces, ' ')+word; - }; - auto fill_right = [](const int size, const std::string word) { - int nspaces=std::max(int(0),size-int(word.length())); - return word+std::string(nspaces, ' '); - }; - - std::string result=fill_left(20,key)+" "+fill_right(10,get_value()) + " # " - +fill_right(10,print_precedence()) - // +fill_right(5,get_type()) - + fill_right(45,get_comment()); - if (allowed_values.size()>0) { - using madness::operators::operator<<; - std::stringstream ss; - ss << allowed_values; - result+=ss.str(); - } - - // trim result - std::size_t last = result.find_last_not_of(' '); - return result.substr(0, last+1); - } - - template void serialize (Archive& ar) { - ar & value & default_value & derived_value & user_defined_value & type & null & - comment & allowed_values & print_order & precedence; - } - - enum {def, derived, defined} precedence=def; - - hashT hash() const { - return hash_value(value); - } + void set_derived_value(const std::string val) { + precedence=std::max(derived,precedence); + derived_value=val; + set_all(); + } + void set_user_defined_value(const std::string val) { + precedence=std::max(defined,precedence); + user_defined_value=val; + set_all(); + } -private: + std::string get_value() const {return value;} + std::string get_type() const {return type;} + std::string get_comment() const {return comment;} + std::string print_precedence() const { + if (precedence==def) return "default"; + if (precedence==derived) return "derived"; + if (precedence==defined) return "defined"; + std::stringstream sprecedence; + sprecedence << precedence; + throw std::runtime_error("unknown precedence in QCParameter"+sprecedence.str()); + return "darn"; + } - void set_all() { - value=default_value; - if (derived_value!=null) value=derived_value; - if (user_defined_value!=null) value=user_defined_value; - if (not check_allowed()) throw std::invalid_argument(not_allowed_errmsg()); - } + int get_print_order() const {return print_order;} - bool check_allowed() { - if (allowed_values.size()==0) return true; - auto it = std::find(allowed_values.begin(), allowed_values.end(), value); - return (it!=allowed_values.end()); - } + std::string print_line(const std::string& key) const { - std::string not_allowed_errmsg() const { + auto fill_left = [](const int size, const std::string word) { + int nspaces=std::max(int(0),size-int(word.length())); + return std::string(nspaces, ' ')+word; + }; + auto fill_right = [](const int size, const std::string word) { + int nspaces=std::max(int(0),size-int(word.length())); + return word+std::string(nspaces, ' '); + }; + + std::string result=fill_left(20,key)+" "+fill_right(10,get_value()) + " # " + +fill_right(10,print_precedence()) + // +fill_right(5,get_type()) + + fill_right(45,get_comment()); + if (allowed_values.size()>0) { using madness::operators::operator<<; - std::stringstream ss; - ss<< allowed_values; - std::string errmsg="\ntrying to assign a value that's not allowed\n\n"; - errmsg+="\tuser-defined value: " + value + "\n"; - errmsg+="\tallowed values: " + ss.str() + "\n\n"; - return errmsg; - } + std::stringstream ss; + ss << allowed_values; + result+=ss.str(); + } + + // trim result + std::size_t last = result.find_last_not_of(' '); + return result.substr(0, last+1); + } + + template void serialize (Archive& ar) { + ar & value & default_value & derived_value & user_defined_value & type & null & + comment & allowed_values & print_order & precedence; + } + + enum {def, derived, defined} precedence=def; + + hashT hash() const { + return hash_value(value); + } + + private: + + void set_all() { + value=default_value; + if (derived_value!=null) value=derived_value; + if (user_defined_value!=null) value=user_defined_value; + if (not check_allowed()) throw std::runtime_error(not_allowed_errmsg()); + } + bool check_allowed() { + if (allowed_values.size()==0) return true; + auto it = std::find(allowed_values.begin(), allowed_values.end(), value); + return (it!=allowed_values.end()); + } + + std::string not_allowed_errmsg() const { + using madness::operators::operator<<; + std::stringstream ss; + ss<< allowed_values; + std::string errmsg="\ntrying to assign a value that's not allowed\n\n"; + errmsg+="\tuser-defined value: " + value + "\n"; + errmsg+="\tallowed values: " + ss.str() + "\n\n"; + return errmsg; + } - std::string value; - std::string default_value=""; - std::string derived_value=""; - std::string user_defined_value=""; - std::string type=""; - std::string null=""; - std::string comment=""; - std::vector allowed_values=std::vector(); - int print_order=0; // use this for printing the parameters in the same order as they are defined -}; + std::string value=""; + std::string default_value=""; + std::string derived_value=""; + std::string user_defined_value=""; + std::string type=""; + std::string null=""; + std::string comment=""; + std::vector allowed_values=std::vector(); + int print_order=0; // use this for printing the parameters in the same order as they are defined + + }; /// class for holding the parameters for calculation @@ -253,337 +251,424 @@ struct QCParameter { /// parameters are kept in a map with key (string) and value (QCParameter), /// types are converted whenever a parameter is accessed (i.e. should not be /// done too frequently in an inner loop) -class QCCalculationParametersBase { - -public: - /// print all parameters - void print(const std::string header="", const std::string footer="") const; - - std::string print_to_string(bool non_defaults_only=false) const; - - template - T get(const std::string key) const { - const QCParameter& parameter=get_parameter(key); - MADNESS_ASSERT(check_type(key,parameter)); - if (std::is_same::value) { - return fromstring(add_quotes(parameter.get_value())); - } - return fromstring(parameter.get_value()); - } - - bool is_user_defined(std::string key) const { - return get_parameter(key).is_user_defined(); - } + class QCCalculationParametersBase { + + public: + /// print all parameters + void print(const std::string header="", const std::string footer="") const; + + std::string print_to_string(bool non_defaults_only=false) const; + + template + T get(const std::string key) const { + const QCParameter& parameter=get_parameter(key); + MADNESS_ASSERT(check_type(key,parameter)); + if (std::is_same::value) { + return fromstring(add_quotes(parameter.get_value())); + } + return fromstring(parameter.get_value()); + } - template void serialize (Archive& ar) { - ar & parameters & print_debug; - } + template void serialize (Archive& ar) { + ar & parameters & print_debug; + } - hashT hash() const { - return hash_range(parameters.begin(), parameters.end()); - } + hashT hash() const { + return hash_range(parameters.begin(), parameters.end()); + } -protected: + protected: - typedef std::map ParameterContainerT; - ParameterContainerT parameters; + typedef std::map ParameterContainerT; + ParameterContainerT parameters; - virtual void read_input_and_commandline_options(World& world, - const commandlineparser& parser, - const std::string tag) { - try { + virtual void read_input_and_commandline_options(World& world, + const commandlineparser& parser, + const std::string tag) { read_input(world,parser.value("input"),tag); - } catch (std::invalid_argument& e) { - throw; - } catch (std::exception& e) { - print(e.what()); + read_commandline_options(world,parser,tag); } - read_commandline_options(world,parser,tag); - } -private: - /// read the parameters from file - - /// only world.rank()==0 reads the input file and broadcasts to all other nodes, - /// so we don't need to serialize the ParameterMap - void read_input(World& world, const std::string filename, const std::string tag); - - void read_commandline_options(World& world, const commandlineparser& parser, const std::string tag); - -protected: - - bool print_debug=false; - bool ignore_unknown_keys=true; - bool ignore_unknown_keys_silently=false; - bool throw_if_datagroup_not_found=true; - - /// ctor for testing - QCCalculationParametersBase() {} - - /// copy ctor - QCCalculationParametersBase(const QCCalculationParametersBase& other) - : parameters(other.parameters) - , print_debug(other.print_debug) { - } - - /// destructor - virtual ~QCCalculationParametersBase() {} - - template - void initialize(const std::string& key, const T& value, const std::string comment="", - const std::vector allowed_values={}) { - - if (parameters.find(key)!=parameters.end()) { - madness::print("you cannot initialize a parameter twice: ",key); - throw std::runtime_error("initialization error"); - } - - std::string svalue=tostring(value); - std::string type = std::type_index(typeid(T)).name(); - - // transform everything to lower case - std::string key_lower=key; - std::transform(key_lower.begin(), key_lower.end(), key_lower.begin(), ::tolower); - std::transform(svalue.begin(), svalue.end(), svalue.begin(), ::tolower); - std::vector av_lower_vec; - for (auto av : allowed_values) { - std::string av_lower=tostring(av); - std::transform(av_lower.begin(), av_lower.end(), av_lower.begin(), ::tolower); - av_lower_vec.push_back(av_lower); - } - - parameters.insert(std::make_pair - (std::string(key_lower),QCParameter(svalue,type,comment,av_lower_vec))); - } - -public: - template - void set_derived_value(const std::string& key, const T& value) { - - QCParameter& parameter=get_parameter(key); - if (not check_type_silent(parameter)) { - throw std::runtime_error("type error in set_derived_value for key "+key); - } - parameter.set_derived_value(tostring(value)); - } - - ParameterContainerT get_all_parameters() const { - return parameters; - } + private: + /// read the parameters from file + /// only world.rank()==0 reads the input file and broadcasts to all other nodes, + /// so we don't need to serialize the ParameterMap + void read_input(World& world, const std::string filename, const std::string tag); -protected: + void read_commandline_options(World& world, const commandlineparser& parser, const std::string tag); - template - bool try_setting_user_defined_value(const std::string& key, const std::string& val) { + protected: - if (not check_type_silent(get_parameter(key))) return false; - if (print_debug) ::madness::print("key:",key,"will set type" ,std::type_index(typeid(T)).name()); - T value=fromstring(val); - set_user_defined_value(key,value); - return true; - } + bool print_debug=false; -public: - template - void set_user_defined_value(const std::string& key, const T& value) { + /// ctor for testing + QCCalculationParametersBase() {} - QCParameter& parameter=get_parameter(key); - if (not check_type_silent(parameter)) { - throw std::runtime_error("type error in set_user_defined_value"); - } + /// copy ctor + QCCalculationParametersBase(const QCCalculationParametersBase& other) + : parameters(other.parameters) + , print_debug(other.print_debug) { + } - parameter.set_user_defined_value(tostring(value)); - } -protected: + /// destructor + virtual ~QCCalculationParametersBase() {} + + template + void initialize(const std::string& key, const T& value, const std::string comment="", + const std::vector allowed_values={}) { + + if (parameters.find(key)!=parameters.end()) { + madness::print("you cannot initialize a parameter twice: ",key); + throw std::runtime_error("initialization error"); + } + + std::string svalue=tostring(value); + std::string type = std::type_index(typeid(T)).name(); + + // transform everything to lower case + std::string key_lower=key; + std::transform(key_lower.begin(), key_lower.end(), key_lower.begin(), ::tolower); + std::transform(svalue.begin(), svalue.end(), svalue.begin(), ::tolower); + std::vector av_lower_vec; + for (auto av : allowed_values) { + std::string av_lower=tostring(av); + std::transform(av_lower.begin(), av_lower.end(), av_lower.begin(), ::tolower); + av_lower_vec.push_back(av_lower); + } + + parameters.insert(std::make_pair + (std::string(key_lower),QCParameter(svalue,type,comment,av_lower_vec))); + } - const QCParameter& get_parameter(const std::string key) const { - if (not parameter_exists(key)) { - throw std::runtime_error("could not find parameter for key "+key); - } - const QCParameter& parameter=parameters.find(key)->second; - return parameter; - } + public: + template + void set_derived_value(const std::string& key, const T& value) { -public: - QCParameter& get_parameter(const std::string key) { - if (not parameter_exists(key)) { - madness::print("\ncould not find parameter for key",key,"\n"); - throw std::runtime_error("could not find parameter for key "+key); - } - QCParameter& parameter=parameters.find(key)->second; - return parameter; - } + QCParameter& parameter=get_parameter(key); + if (not check_type_silent(parameter)) { + throw std::runtime_error("type error in set_derived_value for key "+key); + } + parameter.set_derived_value(tostring(value)); + } - bool parameter_exists(const std::string& key) const { - return (parameters.find(key)!=parameters.end()); - } + protected: + template + bool try_setting_user_defined_value(const std::string& key, const std::string& val) { - template - static bool check_type(const std::string key, const QCParameter& parameter) { - if (check_type_silent(parameter)) return true; + if (not check_type_silent(get_parameter(key))) return false; - madness::print("trying to get the wrong type in QCCalculationParametersBase"); - madness::print("key ",key); - madness::print("parameter type ",parameter.get_type()); - madness::print("setting type ",std::type_index(typeid(T)).name()); - madness::print("value ",parameter.get_value()); - return false; - } + if (print_debug) ::madness::print("key:",key,"will set type" ,std::type_index(typeid(T)).name()); + T value=fromstring(val); + set_user_defined_value(key,value); + return true; + } - template - static bool check_type_silent(const QCParameter& parameter) { - return (parameter.get_type()==std::type_index(typeid(T)).name()); - } + public: + void from_json(const json& j) { + for (auto [key, value]: j.items()) { + QCParameter& parameter = get_parameter(key); + // ::print("key: ", key, " value: ", value); + parameter.set_user_defined_value(tostring(value)); + } + } + json to_json() const { + json j_params = {}; + // TODO Is there a way to the get member for every parameter even though get is a template function? + for (auto& p: parameters) { + auto param_type = p.second.get_type(); + if (param_type == "i") { + j_params[p.first] = get(p.first); + // if vector of double + } else if (param_type == "d") { + j_params[p.first] = get(p.first); + + // if vector of bool + } else if (param_type == "b") { + j_params[p.first] = get(p.first); + + // if vector of doubles? + } else if (param_type == "St6vectorIdSaIdEE") { + j_params[p.first] = get>(p.first); + } else if (param_type == "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE") { + auto sval = get(p.first); + if (!sval.empty()) continue; + j_params[p.first] = sval; + // size t + } else if (p.second.get_type() == "m") { + j_params[p.first] = get(p.first); + } + } + return j_params; + } + /** + * Adds the response parameters to an existing json under key "parameters" + * @param j + */ + void to_json(json& j) const { + json j_params = {}; + // TODO Is there a way to the get member for every parameter even though get is a template function? + for (auto& p: parameters) { + auto param_type = p.second.get_type(); + if (param_type == "i") { + j_params[p.first] = get(p.first); + // if vector of double + } else if (param_type == "d") { + j_params[p.first] = get(p.first); + + // if vector of bool + } else if (param_type == "b") { + j_params[p.first] = get(p.first); + + // if vector of doubles? + } else if (param_type == "St6vectorIdSaIdEE") { + j_params[p.first] = get>(p.first); + } else if (param_type == "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE") { + auto sval = get(p.first); + if (!sval.empty()) continue; + j_params[p.first] = sval; + // size t + } else if (p.second.get_type() == "m") { + j_params[p.first] = get(p.first); + } + } + j["parameters"] = j_params; + } - /// read the stream, starting from tag + bool operator==(const QCCalculationParametersBase& other) const { + + for (auto& p: parameters) { + auto param_type = p.second.get_type(); + + if (param_type == "i") { + if (get(p.first) != other.get(p.first)) { return false; }; + // if vector of double + } else if (param_type == "d") { + if (get(p.first) != other.get(p.first)) { return false; }; + // if vector of bool + } else if (param_type == "b") { + if (get(p.first) != other.get(p.first)) { return false; }; + // if vector of doubles? + } else if (param_type == "St6vectorIdSaIdEE") { + if (get>(p.first) != + other.get>(p.first)) { + + return false; + }; + } else if (param_type == "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE") { + if (get(p.first) != other.get(p.first)) { + return false; + }; + } else if (p.second.get_type() == "m") { + if (get(p.first) != other.get(p.first)) { return false; }; + } + } + return true; + } - /// only parameters that are defined in the constructor will be processed, - /// all others will be discarded. - virtual void read_internal(World& world, std::string& filecontents, std::string tag); + template + void set_user_defined_value(const std::string& key, const T& value) { + QCParameter& parameter=get_parameter(key); + if (not check_type_silent(parameter)) { + throw std::runtime_error("type error in set_user_defined_value"); + } - static std::string tostring(const bool& arg) { - std::ostringstream ss; - ss << std::boolalpha << arg; - return ss.str(); - } + parameter.set_user_defined_value(tostring(value)); + } + protected: + + const QCParameter& get_parameter(const std::string key) const { + if (not parameter_exists(key)) { + throw std::runtime_error("could not find parameter for key "+key); + } + const QCParameter& parameter=parameters.find(key)->second; + return parameter; + } + + public: + QCParameter& get_parameter(const std::string key) { + if (not parameter_exists(key)) { + madness::print("\ncould not find parameter for key",key,"\n"); + throw std::runtime_error("could not find parameter for key "+key); + } + QCParameter& parameter=parameters.find(key)->second; + return parameter; + } + + bool parameter_exists(const std::string& key) const { + return (parameters.find(key)!=parameters.end()); + } + + + template + static bool check_type(const std::string key, const QCParameter& parameter) { + if (check_type_silent(parameter)) return true; + + madness::print("trying to get the wrong type in QCCalculationParametersBase"); + madness::print("key ",key); + madness::print("parameter type ",parameter.get_type()); + madness::print("setting type ",std::type_index(typeid(T)).name()); + madness::print("value ",parameter.get_value()); + return false; + } + + template + static bool check_type_silent(const QCParameter& parameter) { + return (parameter.get_type()==std::type_index(typeid(T)).name()); + } + + /// read the stream, starting from tag + + /// only parameters that are defined in the constructor will be processed, + /// all others will be discarded. + virtual void read_internal(World& world, std::string& filecontents, std::string tag); + + + static std::string tostring(const bool& arg) { + std::ostringstream ss; + ss << std::boolalpha << arg; + return ss.str(); + } + + template + static std::string tostring(const T& arg) { + using madness::operators::operator<<; + std::ostringstream ss; + + ss< + static typename std::enable_if::value, void>::type + overwrite_if_inf(std::string& str, const T& arg) { + if (std::isinf(arg)) { + std::stringstream ss; + ss << std::numeric_limits::infinity(); + str=ss.str(); + } + } + + template + static typename std::enable_if::value, void>::type + overwrite_if_inf(std::string& str, const T& arg) { + return; + } + + template + static typename std::enable_if::value, T>::type + fromstring(const std::string& arg) { + + std::stringstream ssvalue(arg); + + // if argument is std::string read the everything between possible double quotes + T result=read_quotes(ssvalue); + + bool type_conversion_failed=ssvalue.fail(); + + // check for infinity in floating point conversions + if (type_conversion_failed and (std::is_floating_point::value)) { + + const static T inf=std::numeric_limits::infinity(); + std::string sinf=tostring(inf); // repeat type conversion from above + if (sinf==arg) result=inf; + type_conversion_failed=false; + } + + if (type_conversion_failed) { + + std::string errmsg="error in type conversion for argument >> " + arg + + " << to type " + std::type_index(typeid(T)).name(); + throw std::runtime_error(errmsg); + } + + // check for trailing characters + std::string word; + while (ssvalue >> word) { + std::string errmsg="trailing characters in arguement >> " + arg + " <<"; + throw std::runtime_error(errmsg); + } + return result; + } + + template + static typename std::enable_if::value, T>::type + read_quotes(std::stringstream& ssvalue) { + T arg=ssvalue.str(); + T result; + + if (arg.find("\"")==std::string::npos) { // no double quotes found + ssvalue >> result; + + } else { // found double quotes + int counter=0; + while (counter<2) { + T tmp; + ssvalue >> tmp; + if (ssvalue.fail()) { + std::string errmsg="missing closing double quote in line >> " + arg; + throw std::runtime_error(errmsg); + } + result+=" "+tmp; + counter=std::count(result.begin(), result.end(), '"'); + } + + // use only the text between the double quotes + result=trim_blanks(trim_quotes(result)); + } + return result; + } + + static std::string trim_blanks(const std::string arg) { + std::size_t first=arg.find_first_not_of(' '); + std::size_t last=arg.find_last_not_of(' '); + return arg.substr(first,last-first+1); + } + + static std::string trim_quotes(const std::string arg) { + std::size_t first=arg.find_first_of('"'); + std::size_t last=arg.find_last_of('"'); + return arg.substr(first+1,last-first-1); + } + + static std::string add_quotes(const std::string arg) { + return "\""+arg+"\""; + } + + + template + static typename std::enable_if::value, T>::type + read_quotes(std::stringstream& ssvalue) { + T result; + ssvalue >> result; + return result; + } + + template + static typename std::enable_if::value, T>::type fromstring( + const std::string& arg) { + std::string str = arg; + std::transform(str.begin(), str.end(), str.begin(), ::tolower); + if (str == "true" or str == "1" or str == "yes") return true; + if (str == "false" or str == "0" or str == "no") return false; + std::string errmsg = "error in type conversion for argument >> " + arg + + " << to type " + std::type_index(typeid(T)).name(); + throw std::runtime_error(errmsg); + return 0; + } + }; + + + bool operator!=(const QCCalculationParametersBase& p1, const QCCalculationParametersBase& p2); - template - static std::string tostring(const T& arg) { - using madness::operators::operator<<; - std::ostringstream ss; - - ss< - static typename std::enable_if::value, void>::type - overwrite_if_inf(std::string& str, const T& arg) { - if (std::isinf(arg)) { - std::stringstream ss; - ss << std::numeric_limits::infinity(); - str=ss.str(); - } - } - - template - static typename std::enable_if::value, void>::type - overwrite_if_inf(std::string& str, const T& arg) { - return; - } - - template - static typename std::enable_if::value, T>::type - fromstring(const std::string& arg) { - - std::stringstream ssvalue(arg); - - // if argument is std::string read the everything between possible double quotes - T result=read_quotes(ssvalue); - - bool type_conversion_failed=ssvalue.fail(); - - // check for infinity in floating point conversions - if (type_conversion_failed and (std::is_floating_point::value)) { - - const static T inf=std::numeric_limits::infinity(); - std::string sinf=tostring(inf); // repeat type conversion from above - if (sinf==arg) result=inf; - type_conversion_failed=false; - } - - if (type_conversion_failed) { - - std::string errmsg="error in type conversion for argument >> " + arg - + " << to type " + std::type_index(typeid(T)).name(); - throw std::runtime_error(errmsg); - } - - // check for trailing characters - std::string word; - while (ssvalue >> word) { - std::string errmsg="trailing characters in arguement >> " + arg + " <<"; - throw std::runtime_error(errmsg); - } - return result; - } - - template - static typename std::enable_if::value, T>::type - read_quotes(std::stringstream& ssvalue) { - T arg=ssvalue.str(); - T result; - - if (arg.find("\"")==std::string::npos) { // no double quotes found - ssvalue >> result; - - } else { // found double quotes - int counter=0; - while (counter<2) { - T tmp; - ssvalue >> tmp; - if (ssvalue.fail()) { - std::string errmsg="missing closing double quote in line >> " + arg; - throw std::runtime_error(errmsg); - } - result+=" "+tmp; - counter=std::count(result.begin(), result.end(), '"'); - } - - // use only the text between the double quotes - result=trim_blanks(trim_quotes(result)); - } - return result; - } - - static std::string trim_blanks(const std::string arg) { - std::size_t first=arg.find_first_not_of(' '); - std::size_t last=arg.find_last_not_of(' '); - return arg.substr(first,last-first+1); - } - - static std::string trim_quotes(const std::string arg) { - std::size_t first=arg.find_first_of('"'); - std::size_t last=arg.find_last_of('"'); - return arg.substr(first+1,last-first-1); - } - - static std::string add_quotes(const std::string arg) { - return "\""+arg+"\""; - } - - - template - static typename std::enable_if::value, T>::type - read_quotes(std::stringstream& ssvalue) { - T result; - ssvalue >> result; - return result; - } - - template - static typename std::enable_if::value, T>::type - fromstring(const std::string& arg) { - std::string str=arg; - std::transform(str.begin(), str.end(), str.begin(), ::tolower); - if (str=="true" or str=="1" or str=="yes") return true; - if (str=="false" or str=="0" or str=="no") return false; - std::string errmsg="error in type conversion for argument >> " + arg - + " << to type " + std::type_index(typeid(T)).name(); - throw std::runtime_error(errmsg); - return 0; - } - -}; } /* namespace madness */ -#endif /* SRC_APPS_CHEM_QCCALCULATIONPARAMETERSBASE_H_ */ +#endif /* SRC_APPS_CHEM_QCCALCULATIONPARAMETERSBASE_H_ */ \ No newline at end of file From 2d47d3a5a30056e8323faee05c0bdef5990da982 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 31 Aug 2022 17:25:11 -0400 Subject: [PATCH 0221/1312] everything builds --- src/apps/molresponse/molresponse.cc | 2 +- .../chem/QCCalculationParametersBase.cc | 34 ++++++++--- .../chem/QCCalculationParametersBase.h | 59 +++++++++++++------ 3 files changed, 68 insertions(+), 27 deletions(-) diff --git a/src/apps/molresponse/molresponse.cc b/src/apps/molresponse/molresponse.cc index 428082c9b12..4ebfdc42b36 100644 --- a/src/apps/molresponse/molresponse.cc +++ b/src/apps/molresponse/molresponse.cc @@ -35,7 +35,7 @@ /// \file molresponse.cc /// \brief Molecular Response DFT code /// \defgroup molresponse The molecular density funcitonal response code -#include +#include #include #include "ExcitedResponse.hpp" diff --git a/src/madness/chem/QCCalculationParametersBase.cc b/src/madness/chem/QCCalculationParametersBase.cc index 93910aa3e83..84620978a53 100644 --- a/src/madness/chem/QCCalculationParametersBase.cc +++ b/src/madness/chem/QCCalculationParametersBase.cc @@ -5,7 +5,7 @@ * Author: fbischoff */ -#include +#include #include #include #include @@ -37,11 +37,12 @@ namespace madness { list.sort([](const keyvalT& first, const keyvalT& second) {return std::get<0>(first) < std::get<0>(second);}); std::stringstream ss; + int counter=0; for (auto& p : list) { const QCParameter& param=std::get<2>(p); if (non_defaults_only and (param.precedence==QCParameter::def)) continue; ss << param.print_line(std::get<1>(p)); - ss << std::endl; + if (++counter>" << tag << "<< in file " << filename << std::endl; + errmsg=ss.str(); } } world.gop.broadcast_serializable(*this, 0); + if (errmsg.size()>0) throw std::runtime_error(errmsg); } /// read the parameters from the command line and broadcast @@ -76,6 +84,7 @@ namespace madness { std::replace_copy(value.begin(), value.end(), value.begin(), q.c_str()[0] , ' '); std::replace_copy(value.begin(), value.end(), value.begin(), ';', '\n'); value=tag+"\n"+value+"\nend"; +// print("value",value); read_internal(world, value,tag); } world.gop.broadcast_serializable(*this, 0); @@ -101,6 +110,7 @@ namespace madness { // remove comments from line std::size_t last = line.find_first_of('#'); line=line.substr(0,last); + std::replace_copy(line.begin(), line.end(), line.begin(),'=', ' '); std::stringstream sline(line); @@ -114,7 +124,15 @@ namespace madness { // check if key exists in the initialized parameter list if (not (parameter_exists(key))) { - if (world.rank()==0) madness::print("ignoring unknown parameter in input file: ",key); + if (not ignore_unknown_keys) { + if (world.rank()==0) { + ::madness::print("found unknown key: ",key); + ::madness::print("in datagroup: ",tag); + } + throw std::runtime_error("input error"); + } + if ((not ignore_unknown_keys_silently) + and (world.rank()==0)) madness::print("ignoring unknown parameter in input file: ",key); continue; } @@ -142,7 +160,9 @@ namespace madness { success=try_setting_user_defined_value >(key,line1) or success; success=try_setting_user_defined_value >(key,line1) or success; - } catch (std::runtime_error& e) { + } catch (std::invalid_argument& e) { + throw; + } catch (std::exception& e) { std::string errmsg="found an error for key >> "+key+" << \n" +e.what(); throw std::runtime_error(errmsg); } @@ -151,7 +171,7 @@ namespace madness { std::string requested_type=get_parameter(key).get_type(); madness::print("\trequested type: ",requested_type,"\n"); madness::print("add the corresponding type to QCCalculationsParametersBase.h\n\n"); - MADNESS_EXCEPTION("add the corresponding type to QCCalculationsParametersBase.h",1); + throw std::invalid_argument("add the corresponding type to QCCalculationsParametersBase.h"); } } }; diff --git a/src/madness/chem/QCCalculationParametersBase.h b/src/madness/chem/QCCalculationParametersBase.h index 643c3e8cd40..0753ddcc868 100644 --- a/src/madness/chem/QCCalculationParametersBase.h +++ b/src/madness/chem/QCCalculationParametersBase.h @@ -8,23 +8,22 @@ #ifndef SRC_APPS_CHEM_QCCALCULATIONPARAMETERSBASE_H_ #define SRC_APPS_CHEM_QCCALCULATIONPARAMETERSBASE_H_ - -#include +#include #include -#include +#include #include #include #include #include #include #include -#include -#include +#include +#include -using json =nlohmann::json; namespace madness { + using json =nlohmann::json; template static typename std::enable_if::value, void>::type @@ -54,6 +53,7 @@ namespace madness { line+=word; if (word.find(']')!=std::string::npos) break; } + if (line.size()!=0) is.clear(); // remove enclosing brackets and commas auto find_c = [](char& c){ return ((c==',') or (c=='[') or (c==']')); }; @@ -71,7 +71,7 @@ namespace madness { if (sline.bad()) { madness::print("error while reading vector from istream: "); madness::print(line,"\n"); - MADNESS_EXCEPTION("IO error",1); + throw std::runtime_error("IO error"); } return is; @@ -105,7 +105,7 @@ namespace madness { if (sline.bad() or sline.fail()) { madness::print("error while reading vector from istream: "); madness::print(line,"\n"); - MADNESS_EXCEPTION("IO error",1); + throw std::runtime_error("IO error"); } p=std::pair(tmp1,tmp2); @@ -145,6 +145,10 @@ namespace madness { set_all(); } + bool is_user_defined() const { + return (precedence==defined); + } + std::string get_value() const {return value;} std::string get_type() const {return type;} std::string get_comment() const {return comment;} @@ -204,7 +208,7 @@ namespace madness { value=default_value; if (derived_value!=null) value=derived_value; if (user_defined_value!=null) value=user_defined_value; - if (not check_allowed()) throw std::runtime_error(not_allowed_errmsg()); + if (not check_allowed()) throw std::invalid_argument(not_allowed_errmsg()); } bool check_allowed() { @@ -224,7 +228,7 @@ namespace madness { } - std::string value=""; + std::string value; std::string default_value=""; std::string derived_value=""; std::string user_defined_value=""; @@ -269,6 +273,10 @@ namespace madness { return fromstring(parameter.get_value()); } + bool is_user_defined(std::string key) const { + return get_parameter(key).is_user_defined(); + } + template void serialize (Archive& ar) { ar & parameters & print_debug; } @@ -285,7 +293,13 @@ namespace madness { virtual void read_input_and_commandline_options(World& world, const commandlineparser& parser, const std::string tag) { - read_input(world,parser.value("input"),tag); + try { + read_input(world,parser.value("input"),tag); + } catch (std::invalid_argument& e) { + throw; + } catch (std::exception& e) { + print(e.what()); + } read_commandline_options(world,parser,tag); } @@ -300,8 +314,10 @@ namespace madness { protected: - bool print_debug=false; + bool ignore_unknown_keys=true; + bool ignore_unknown_keys_silently=false; + bool throw_if_datagroup_not_found=true; /// ctor for testing QCCalculationParametersBase() {} @@ -353,6 +369,11 @@ namespace madness { parameter.set_derived_value(tostring(value)); } + ParameterContainerT get_all_parameters() const { + return parameters; + } + + protected: template @@ -652,14 +673,14 @@ namespace madness { } template - static typename std::enable_if::value, T>::type fromstring( - const std::string& arg) { - std::string str = arg; + static typename std::enable_if::value, T>::type + fromstring(const std::string& arg) { + std::string str=arg; std::transform(str.begin(), str.end(), str.begin(), ::tolower); - if (str == "true" or str == "1" or str == "yes") return true; - if (str == "false" or str == "0" or str == "no") return false; - std::string errmsg = "error in type conversion for argument >> " + arg + - " << to type " + std::type_index(typeid(T)).name(); + if (str=="true" or str=="1" or str=="yes") return true; + if (str=="false" or str=="0" or str=="no") return false; + std::string errmsg="error in type conversion for argument >> " + arg + + " << to type " + std::type_index(typeid(T)).name(); throw std::runtime_error(errmsg); return 0; } From 6c96d813f1b9a141b747c3d3cf482fb56523ca17 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 31 Aug 2022 17:27:51 -0400 Subject: [PATCH 0222/1312] run it like this to match frequency calc --- src/apps/molresponse/testing/mad-excited.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/mad-excited.cpp b/src/apps/molresponse/testing/mad-excited.cpp index ccc586ebab0..9d717fad897 100644 --- a/src/apps/molresponse/testing/mad-excited.cpp +++ b/src/apps/molresponse/testing/mad-excited.cpp @@ -33,7 +33,7 @@ auto main(int argc, char *argv[]) -> int { std::cout.precision(6); - if (argc != 4) { + if (argc != 5) { std::cout << "Wrong number of inputs" << std::endl; return 1; @@ -41,7 +41,8 @@ auto main(int argc, char *argv[]) -> int { const std::string molecule_name{argv[1]}; const std::string xc{argv[2]}; - const std::string is_high_prec{argv[3]}; + const std::string op{argv[3]}; + const std::string is_high_prec{argv[4]}; bool high_prec; From 1408199368f5dba30a02396a0fc3fe4559ef15fa Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 31 Aug 2022 17:47:30 -0400 Subject: [PATCH 0223/1312] some changes related to molecule change --- src/apps/molresponse/testing/mad-freq.cpp | 1 - src/apps/molresponse/testing/runners.hpp | 1 + src/madness/chem/SCF.cc | 307 +++++++++++----------- 3 files changed, 154 insertions(+), 155 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 7daf425a48b..13053fb83d2 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -56,7 +56,6 @@ auto main(int argc, char *argv[]) -> int { auto schema = runSchema(xc); auto m_schema = moldftSchema(molecule_name, xc, schema); - m_schema.print(); auto f_schema = frequencySchema(schema, m_schema, op); try { diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index a276b9e8064..f52091cc7bf 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -416,6 +416,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo CalculationParameters param_calc; json calcInfo; if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { + std::cout<<"Reading Calc Info JSON"<> calcInfo; param_calc.from_json(calcInfo["parameters"]); diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 9963627cee0..0bd25086f6f 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -227,173 +227,172 @@ void SCF::copy_data(World& world, const SCF& other) { at_nbf = other.at_nbf; } -void SCF::save_mos(World& world) { - PROFILE_MEMBER_FUNC(SCF); - auto archivename=param.prefix()+".restartdata"; - archive::ParallelOutputArchive ar(world, archivename.c_str(), param.get("nio")); - // IF YOU CHANGE ANYTHING HERE MAKE SURE TO UPDATE THIS VERSION NUMBER - /* - * After spin restricted - double L; - int k; - Molecule molecule; - std::string xc; - */ - unsigned int version = 2; - ar & version; - ar & current_energy & param.spin_restricted(); - ar & param.L() & FunctionDefaults<3>::get_k() & molecule & param.xc(); -// Re order so it doesn't effect orbital data - - ar & (unsigned int) (amo.size()); - ar & aeps & aocc & aset; - for (unsigned int i = 0; i < amo.size(); ++i) ar & amo[i]; - if (!param.spin_restricted()) { - ar & (unsigned int) (bmo.size()); - ar & beps & bocc & bset; - for (unsigned int i = 0; i < bmo.size(); ++i) ar & bmo[i]; - } - - // Do not make a restartaodata file if nwchem orbitals used, - // as no aoamo/aobmo overlap matrix can be computed - if (param.nwfile() == "none") { - tensorT Saoamo = matrix_inner(world, ao, amo); - tensorT Saobmo = (!param.spin_restricted()) ? matrix_inner(world, ao, bmo) : tensorT(); - if (world.rank() == 0) { - archive::BinaryFstreamOutputArchive arao(param.prefix()+".restartaodata"); - arao << Saoamo << aeps << aocc << aset; - if (!param.spin_restricted()) arao << Saobmo << beps << bocc << bset; + void SCF::save_mos(World &world) { + PROFILE_MEMBER_FUNC(SCF); + archive::ParallelOutputArchive ar(world, "restartdata", + param.get("nio")); + // IF YOU CHANGE ANYTHING HERE MAKE SURE TO UPDATE THIS VERSION NUMBER + /* + * After spin restricted + double L; + int k; + Molecule molecule; + std::string xc; + */ + unsigned int version = 3; + ar &version; + ar ¤t_energy ¶m.spin_restricted(); + ar ¶m.L() & FunctionDefaults<3>::get_k() & molecule ¶m.xc() & param.localize_method(); + // Re order so it doesn't effect orbital data + + ar &(unsigned int) (amo.size()); + ar &aeps &aocc &aset; + for (unsigned int i = 0; i < amo.size(); ++i) ar &amo[i]; + if (!param.spin_restricted()) { + ar &(unsigned int) (bmo.size()); + ar &beps &bocc &bset; + for (unsigned int i = 0; i < bmo.size(); ++i) ar &bmo[i]; } - } -} -void SCF::load_mos(World& world) { - PROFILE_MEMBER_FUNC(SCF); - // const double trantol = vtol / std::min(30.0, double(param.nalpha)); - const double thresh = FunctionDefaults<3>::get_thresh(); - const int k = FunctionDefaults<3>::get_k(); - unsigned int nmo = 0; - bool spinrest = false; - - amo.clear(); - bmo.clear(); - - archive::ParallelInputArchive ar(world, param.prefix()+".restartdata"); - - /* - File format: - unsigned int version; - double current energy; - bool spinrestricted --> if true only alpha orbitals are present - double L; - int k; - Molecule molecule; - std::string xc; - unsigned int nmo_alpha; - Tensor aeps; - Tensor aocc; - vector aset; - for i from 0 to nalpha-1: - . Function amo[i] - repeat for beta if !spinrestricted - */ - // Local copies for a basic check - double L; - int k1; // Ignored for restarting, used in response only - unsigned int version = 2; // UPDATE THIS IF YOU CHANGE ANYTHING - unsigned int archive_version; - - ar & archive_version; - - if (archive_version != version) { - if (world.rank() == 0) - print( - "Loading from a different version of archive. Archive version", archive_version, "MADNESS version", - version); - throw "Invalid archive"; + // Do not make a restartaodata file if nwchem orbitals used, + // as no aoamo/aobmo overlap matrix can be computed + if (param.nwfile() == "none") { + tensorT Saoamo = matrix_inner(world, ao, amo); + tensorT Saobmo = (!param.spin_restricted()) ? matrix_inner(world, ao, bmo) : tensorT(); + if (world.rank() == 0) { + archive::BinaryFstreamOutputArchive arao("restartaodata"); + arao << Saoamo << aeps << aocc << aset; + if (!param.spin_restricted()) arao << Saobmo << beps << bocc << bset; + } + } } - // LOTS OF LOGIC MISSING HERE TO CHANGE OCCUPATION NO., SET, - // EPS, SWAP, ... sigh - ar & current_energy & spinrest; - // Reorder - ar & L & k1 & molecule & param.xc(); - - ar & nmo; - MADNESS_ASSERT(nmo >= unsigned(param.nmo_alpha())); - ar & aeps & aocc & aset; - // Some basic checks - if (L != param.L()) { - if (world.rank() == 0) - print( - "Warning: Box size mismatch between archive and input parameter. " - "Archive value", - L, - "Param value", - param.L()); - throw "Mismatch in box sizes"; - } - if (world.rank() == 0) { - print("Restarting from this molecular geometry"); - molecule.print(); - } - amo.resize(nmo); - for (unsigned int i = 0; i < amo.size(); ++i) ar & amo[i]; - unsigned int n_core = molecule.n_core_orb_all(); - if (nmo > unsigned(param.nmo_alpha())) { - aset = vector(aset.begin() + n_core, aset.begin() + n_core + param.nmo_alpha()); - amo = vecfuncT(amo.begin() + n_core, amo.begin() + n_core + param.nmo_alpha()); - aeps = copy(aeps(Slice(n_core, n_core + param.nmo_alpha() - 1))); - aocc = copy(aocc(Slice(n_core, n_core + param.nmo_alpha() - 1))); - } + void SCF::load_mos(World &world) { + PROFILE_MEMBER_FUNC(SCF); + // const double trantol = vtol / std::min(30.0, double(param.nalpha)); + const double thresh = FunctionDefaults<3>::get_thresh(); + const int k = FunctionDefaults<3>::get_k(); + unsigned int nmo = 0; + bool spinrest = false; + + amo.clear(); + bmo.clear(); + + archive::ParallelInputArchive ar(world, "restartdata"); + + /* + File format: + unsigned int version; + double current energy; + bool spinrestricted --> if true only alpha orbitals are present + double L; + int k; + Molecule molecule; + std::string xc; + std::string localize; + unsigned int nmo_alpha; + Tensor aeps; + Tensor aocc; + vector aset; + for i from 0 to nalpha-1: + . Function amo[i] + repeat for beta if !spinrestricted + */ + // Local copies for a basic check + double L; + int k1; // Ignored for restarting, used in response only + unsigned int version = 3;// UPDATE THIS IF YOU CHANGE ANYTHING + unsigned int archive_version; + + ar &archive_version; + + if (archive_version != version) { + if (world.rank() == 0) + print("Loading from a different version of archive. Archive version", archive_version, + "MADNESS version", version); + throw "Invalid archive"; + } - if (amo[0].k() != k) { - reconstruct(world, amo); - for (unsigned int i = 0; i < amo.size(); ++i) amo[i] = madness::project(amo[i], k, thresh, false); - world.gop.fence(); - } - set_thresh(world, amo, thresh); + // LOTS OF LOGIC MISSING HERE TO CHANGE OCCUPATION NO., SET, + // EPS, SWAP, ... sigh + ar ¤t_energy &spinrest; + // Reorder + ar &L &k1 &molecule ¶m.xc() & param.localize_method(); + + ar &nmo; + MADNESS_ASSERT(nmo >= unsigned(param.nmo_alpha())); + ar &aeps &aocc &aset; + // Some basic checks + if (L != param.L()) { + if (world.rank() == 0) + print("Warning: Box size mismatch between archive and input parameter. " + "Archive value", + L, "Param value", param.L()); + throw "Mismatch in box sizes"; + } + if (world.rank() == 0) { + print("Restarting from this molecular geometry"); + molecule.print(); + } + amo.resize(nmo); + for (unsigned int i = 0; i < amo.size(); ++i) ar &amo[i]; + unsigned int n_core = molecule.n_core_orb_all(); + if (nmo > unsigned(param.nmo_alpha())) { + aset = vector(aset.begin() + n_core, aset.begin() + n_core + param.nmo_alpha()); + amo = vecfuncT(amo.begin() + n_core, amo.begin() + n_core + param.nmo_alpha()); + aeps = copy(aeps(Slice(n_core, n_core + param.nmo_alpha() - 1))); + aocc = copy(aocc(Slice(n_core, n_core + param.nmo_alpha() - 1))); + } - // normalize(world, amo); - // amo = transform(world, amo, Q3(matrix_inner(world, amo, amo)), - // trantol, true); truncate(world, amo); normalize(world, amo); + if (amo[0].k() != k) { + reconstruct(world, amo); + for (unsigned int i = 0; i < amo.size(); ++i) + amo[i] = madness::project(amo[i], k, thresh, false); + world.gop.fence(); + } + set_thresh(world, amo, thresh); + + // normalize(world, amo); + // amo = transform(world, amo, Q3(matrix_inner(world, amo, amo)), + // trantol, true); truncate(world, amo); normalize(world, amo); + + if (!param.spin_restricted()) { + if (spinrest) {// Only alpha spin orbitals were on disk + MADNESS_ASSERT(param.nmo_alpha() >= param.nmo_beta()); + bmo.resize(param.nmo_beta()); + bset.resize(param.nmo_beta()); + beps = copy(aeps(Slice(0, param.nmo_beta() - 1))); + bocc = copy(aocc(Slice(0, param.nmo_beta() - 1))); + for (int i = 0; i < param.nmo_beta(); ++i) bmo[i] = copy(amo[i]); + } else { + ar &nmo; + ar &beps &bocc &bset; - if (!param.spin_restricted()) { - if (spinrest) { // Only alpha spin orbitals were on disk - MADNESS_ASSERT(param.nmo_alpha() >= param.nmo_beta()); - bmo.resize(param.nmo_beta()); - bset.resize(param.nmo_beta()); - beps = copy(aeps(Slice(0, param.nmo_beta() - 1))); - bocc = copy(aocc(Slice(0, param.nmo_beta() - 1))); - for (int i = 0; i < param.nmo_beta(); ++i) bmo[i] = copy(amo[i]); - } else { - ar & nmo; - ar & beps & bocc & bset; + bmo.resize(nmo); + for (unsigned int i = 0; i < bmo.size(); ++i) ar &bmo[i]; - bmo.resize(nmo); - for (unsigned int i = 0; i < bmo.size(); ++i) ar & bmo[i]; + if (nmo > unsigned(param.nmo_beta())) { + bset = vector(bset.begin() + n_core, bset.begin() + n_core + param.nmo_beta()); + bmo = vecfuncT(bmo.begin() + n_core, bmo.begin() + n_core + param.nmo_beta()); + beps = copy(beps(Slice(n_core, n_core + param.nmo_beta() - 1))); + bocc = copy(bocc(Slice(n_core, n_core + param.nmo_beta() - 1))); + } - if (nmo > unsigned(param.nmo_beta())) { - bset = vector(bset.begin() + n_core, bset.begin() + n_core + param.nmo_beta()); - bmo = vecfuncT(bmo.begin() + n_core, bmo.begin() + n_core + param.nmo_beta()); - beps = copy(beps(Slice(n_core, n_core + param.nmo_beta() - 1))); - bocc = copy(bocc(Slice(n_core, n_core + param.nmo_beta() - 1))); - } + if (bmo[0].k() != k) { + reconstruct(world, bmo); + for (unsigned int i = 0; i < bmo.size(); ++i) + bmo[i] = madness::project(bmo[i], k, thresh, false); + world.gop.fence(); + } + set_thresh(world, amo, thresh); - if (bmo[0].k() != k) { - reconstruct(world, bmo); - for (unsigned int i = 0; i < bmo.size(); ++i) bmo[i] = madness::project(bmo[i], k, thresh, false); - world.gop.fence(); + // normalize(world, bmo); + // bmo = transform(world, bmo, Q3(matrix_inner(world, bmo, + // bmo)), trantol, true); truncate(world, bmo); + // normalize(world, bmo); } - set_thresh(world, amo, thresh); - - // normalize(world, bmo); - // bmo = transform(world, bmo, Q3(matrix_inner(world, bmo, - // bmo)), trantol, true); truncate(world, bmo); - // normalize(world, bmo); } } -} void SCF::do_plots(World& world) { PROFILE_MEMBER_FUNC(SCF); From b1f265bb0197aed1018c0a572d60fd1631edf454 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Sep 2022 14:50:31 -0400 Subject: [PATCH 0224/1312] mpi + frequency calc works! --- src/apps/molresponse/FrequencyResponse.cpp | 66 +++++--- src/apps/molresponse/ResponseBase.cpp | 175 +++++++++++---------- src/apps/molresponse/molresponse.cc | 10 +- src/apps/molresponse/response_functions.h | 124 +++++++++------ src/apps/molresponse/timer.cc | 2 + 5 files changed, 216 insertions(+), 161 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index df760106002..5634da81e12 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -8,6 +8,7 @@ void FrequencyResponse::initialize(World &world) { Chi = PQ.copy(); } + void FrequencyResponse::iterate(World &world) { size_t iter; // Variables needed to iterate @@ -172,29 +173,31 @@ void FrequencyResponse::iterate(World &world) { } } + std::cout << "MPI BARRIER before update " << std::endl; + world.mpi.Barrier(); auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, x_vectors, x_residuals, iter, max_rotation); - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make_density_old", "make_density_old", iter_timing); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega = make_density(world, new_chi); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make_density_new", "make_density_new", iter_timing); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bsh_residualsX = copy(new_res.residual_norms); bsh_residualsY = copy(new_res.residual_norms); Chi = new_chi.copy(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } @@ -228,7 +231,7 @@ void FrequencyResponse::iterate(World &world) { } } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "Iteration Timing", "iter_total", iter_timing); } time_data.add_data(iter_timing); @@ -255,15 +258,22 @@ void FrequencyResponse::iterate(World &world) { compute_and_print_polarizability(world, Chi, PQ, "Converged"); } } + auto FrequencyResponse::update(World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, NonLinearXsolver &kain_x_space, vector &Xvector, vector &Xresidual, size_t iteration, const double &maxrotn) - -> std::tuple { +-> std::tuple { + + print("before start time ", r_params.print_level()); + std::cout << "MPI BARRIER 2 " << std::endl; + world.mpi.Barrier(); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + std::cout << "MPI BARRIER 3 " << std::endl; + world.mpi.Barrier(); size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; @@ -288,7 +298,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // truncate y if compute y //if (compute_y) new_chi.Y.truncate_rf(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } // if not compute y then copy x in to y @@ -296,12 +306,13 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // print x norms } + auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts) - -> X_space { - if (world.rank() == 0 && r_params.print_level() >= 1) { +-> X_space { + if (r_params.print_level() >= 1) { molresponse::start_timer(world); print("--------------- BSH UPDATE RESPONSE------------------"); } @@ -332,12 +343,13 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); } return bsh_X; } + void FrequencyResponse::frequency_to_json(json &j_mol_in, size_t iter, const Tensor &polar_ij) { json j = {}; @@ -356,6 +368,7 @@ void FrequencyResponse::compute_and_print_polarizability(World &world, X_space & print(G); } } + void FrequencyResponse::save(World &world, const std::string &name) { @@ -377,16 +390,16 @@ void FrequencyResponse::save(World &world, const std::string &name) { // (for i from 0 to m-1 ) // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); + ar & r_params.archive(); + ar & r_params.tda(); + ar & r_params.num_orbitals(); + ar & r_params.num_states(); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; } } @@ -410,23 +423,24 @@ void FrequencyResponse::load(World &world, const std::string &name) { // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); + ar & r_params.archive(); + ar & r_params.tda(); + ar & r_params.num_orbitals(); + ar & r_params.num_states(); Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; world.gop.fence(); if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; world.gop.fence(); } } + auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { auto [gc, molecule, r_params] = calc.get_parameter(); X_space PQ(world, r_params.num_states(), r_params.num_orbitals()); @@ -444,6 +458,7 @@ auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { PQ.Y = PQ.X; return PQ; } + auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { auto [gc, molecule, r_params] = calc.get_parameter(); X_space PQ(world, r_params.num_states(), r_params.num_orbitals()); @@ -460,6 +475,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { PQ.Y = PQ.X; return PQ; } + auto vector_to_PQ(World &world, const vector_real_function_3d &p, const vector_real_function_3d &ground_orbitals, double lo) -> response_space { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 88cf14c789d..d24baa8421e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -10,12 +10,12 @@ /// \param world /// \param params ResponseBase::ResponseBase(World &world, const CalcParams ¶ms) - : r_params(params.response_parameters), - molecule(params.molecule), - ground_calc(params.ground_calculation), - ground_orbitals(ground_calc.orbitals()), - ground_energies(ground_calc.get_energies()), - Chi(world, r_params.num_states(), r_params.num_orbitals()) { + : r_params(params.response_parameters), + molecule(params.molecule), + ground_calc(params.ground_calculation), + ground_orbitals(ground_calc.orbitals()), + ground_energies(ground_calc.get_energies()), + Chi(world, r_params.num_states(), r_params.num_orbitals()) { // Broadcast to all the other nodes world.gop.broadcast_serializable(r_params, 0); @@ -106,7 +106,7 @@ void ResponseBase::check_k(World &world, double thresh, int k) { /// \param world /// \return auto ResponseBase::ComputeHamiltonianPair(World &world) const - -> std::pair, Tensor> { +-> std::pair, Tensor> { // Basic output if (r_params.print_level() >= 1) molresponse::start_timer(world); auto phi = ground_orbitals; @@ -314,7 +314,7 @@ void ResponseBase::load_balance_chi(World &world) { } auto ResponseBase::make_bsh_operators_response(World &world, double &shift, double &omega) const - -> std::vector { +-> std::vector { if (r_params.print_level() >= 1) molresponse::start_timer(world); double tol = FunctionDefaults<3>::get_thresh(); @@ -345,23 +345,29 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, const XCOperator &xc, const std::string &calc_type) const -> X_space { - if (world.rank() == 0 && r_params.print_level() >= 1) { + print("before start time ", r_params.print_level()); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); print("------------compute theta x_________"); } + std::cout << "MPI BARRIER 3 " << std::endl; + world.mpi.Barrier(); bool compute_Y = calc_type == "full"; X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); + + std::cout << "MPI BARRIER 4 " << std::endl; + world.mpi.Barrier(); // compute - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_Y); //V0X.truncate(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space E0X(world, chi.num_states(), chi.num_orbitals()); if (r_params.localize() != "canon") { E0X = chi.copy(); @@ -369,14 +375,14 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (compute_Y) { E0X.Y = E0X.Y * ham_no_diag; } if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } X_space gamma; // compute - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (calc_type == "full") { gamma = compute_gamma_full(world, {chi, ground_orbitals, ground_orbitals}, xc); } else if (calc_type == "static") { @@ -384,19 +390,19 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } else { gamma = compute_gamma_tda(world, {chi, ground_orbitals, ground_orbitals}, xc); } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } Theta_X = (V0X - E0X) + gamma; Theta_X.truncate(); // Theta_X.truncate(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); } if (r_params.print_level() >= 20) { print_inner(world, "xThetax", chi, Theta_X); } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); } @@ -421,7 +427,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit truncate(world, vf); d_alpha.truncate(); - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space gamma(world, m, n); // x functions // Two ways single vector or vector vector style @@ -438,12 +444,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit X_space W(world, m, n); X_space KX(world, m, n); X_space KY(world, m, n); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } // apply the exchange kernel to rho if necessary - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // Create Coulomb potential on ground_orbitals functionT rho_x_b; functionT rho_y_b; @@ -468,7 +474,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // J.Y=j_x+j_y; J.Y = J.X.copy(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } @@ -479,15 +485,15 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto xc_rho = xc.apply_xc_kernel(rho_alpha); return mul(world, xc_rho, phi0); }; - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); W.Y = W.X.copy(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } for (size_t b = 0; b < m; b++) { vecfuncT x, y; @@ -501,7 +507,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit KX.Y[b] = newK(phi0, x, vf); // |i> } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -509,7 +515,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // trucate all response functions // update gamma functions - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } /* J.truncate(); @@ -520,19 +526,19 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; //gamma.truncate(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } // project out ground state - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, phi0); for (size_t i = 0; i < m; i++) { gamma.X[i] = projector(gamma.X[i]); gamma.Y[i] = projector(gamma.Y[i]); } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -589,7 +595,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens size_t num_orbitals = d_alpha.num_orbitals(); // shallow copy - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space gamma(world, num_states, num_orbitals); // x functions // here I create the orbital products for elctron interaction terms @@ -601,12 +607,12 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens X_space J(world, num_states, num_orbitals); X_space KX(world, num_states, num_orbitals); X_space KY(world, num_states, num_orbitals); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } // apply the exchange kernel to rho if necessary - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto rho = transition_density(world, phi0, d_alpha.X, d_alpha.X); // Create Coulomb potential on ground_orbitals @@ -619,7 +625,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } @@ -629,18 +635,18 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens auto xc_rho = xc.apply_xc_kernel(rho_alpha); return mul(world, xc_rho, phi0); }; - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // for every transition density apply the exchange kernel and multiply the // vector of orbitals std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); W.Y = W.X.copy(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } for (size_t b = 0; b < num_states; b++) { vecfuncT x, y; @@ -653,12 +659,12 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens // |y> } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } // for each response state we compute the Gamma response functions // trucate all response functions - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } /* J.truncate(); KX.truncate(); @@ -668,20 +674,20 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens // update gamma functions gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } // project out ground state - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, phi0); for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } gamma.Y = gamma.X.copy(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } J.clear(); KX.clear(); @@ -695,7 +701,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_clear_functions", "gamma_clear_functions", iter_timing); } @@ -714,7 +720,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density size_t num_states = d_alpha.num_states(); size_t num_orbitals = d_alpha.num_orbitals(); - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space gamma(world, num_states, num_orbitals); // x functions vector_real_function_3d phi_phi; @@ -722,11 +728,11 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density response_space J(world, num_states, num_orbitals); response_space k1_x(world, num_states, num_orbitals); response_space W(world, num_states, num_orbitals); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto rho = transition_densityTDA(world, phi0, d_alpha.X); @@ -737,7 +743,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density }; std::transform(rho.begin(), rho.end(), J.begin(), compute_jx); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } @@ -747,18 +753,18 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density auto xc_rho = xc.apply_xc_kernel(rho_alpha); return mul(world, xc_rho, phi0); }; - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // for every transition density apply the exchange kernel and multiply the // vector of orbitals std::transform(rho.begin(), rho.end(), W.begin(), compute_wx); W = W.copy(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } for (size_t b = 0; b < num_states; b++) { vecfuncT x; @@ -766,27 +772,27 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density k1_x[b] = newK(x, phi0, vf); } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } k1_x.truncate_rf(); J.truncate_rf(); W.truncate_rf(); gamma.X = (J * 2) - k1_x * xcf.hf_exchange_coefficient() + W; - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, ground_orbitals); for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); truncate(world, gamma.X[i]); } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -796,7 +802,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density print(gamma.X.norm2()); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } J.clear(); k1_x.clear(); @@ -810,7 +816,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density FunctionDefaults<3>::set_pmap(oldpmap);// ! DON'T FORGET ! } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_clear_functions", "gamma_clear_functions", iter_timing); } @@ -872,10 +878,11 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator return Lambda_X; } + auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, XCOperator &xc, const std::string &calc_type) const - -> std::tuple { +-> std::tuple { // compute bool compute_Y = calc_type == "full"; @@ -931,10 +938,12 @@ auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, // EXC0=W[ground_density] auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator &xc, bool compute_Y) const -> X_space { - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::start_timer(world); print("------------compute VO[x]_________"); } + std::cout << "MPI BARRIER " << std::endl; + world.mpi.Barrier(); // Start a timer size_t m = X.num_states(); size_t n = X.num_orbitals(); @@ -950,13 +959,14 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // v_nuc first real_function_3d v_nuc, v_j0, v_k0, v_xc; + if (not r_params.store_potential()) { v_nuc = potential_manager->vnuclear(); //v_nuc.truncate(); } else {// Already pre-computed v_nuc = stored_v_nuc; } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "V0_nuc", "V0_nuc", iter_timing); } // Coulomb Potential J0*f @@ -972,23 +982,22 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[0]", "J[0]", iter_timing); } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (xcf.hf_exchange_coefficient() != 1.0) { + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } v_xc = xc.make_xc_potential(); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "XC[0]", "XC[0]", iter_timing); + } } else { // make a zero function v_xc = Function(FunctionFactory(world).fence(false).initial_level(1)); } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "XC[0]", "XC[0]", iter_timing); - } // Intermediaries world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - world.gop.fence(); auto k = [&](const vector_real_function_3d &xi) { world.gop.fence(); return newK(phi0_copy, phi0_copy, xi); @@ -1090,7 +1099,7 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_space &g_chi, const std::string &calc_type) -> residuals { - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.X.size(); size_t n = chi.X.size_orbitals(); // compute residual @@ -1115,7 +1124,7 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); } // Next calculate 2-norm of these vectors of differences @@ -1126,7 +1135,7 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, NonLinearXsolver &kain_x_space, std::vector &Xvector, std::vector &Xresidual) -> X_space { - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); @@ -1158,7 +1167,7 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, } */ if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); } return kain_update; @@ -1169,7 +1178,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi size_t m = old_Chi.num_states(); size_t n = old_Chi.num_orbitals(); - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } print(maxrotn); auto diff = temp - old_Chi; diff.truncate(); @@ -1222,7 +1231,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi } if (world.rank() == 0) { print("----------------End Step Restriction -----------------"); } - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "x_space_restriction", "x_space_restriction", iter_timing); } } @@ -1535,7 +1544,7 @@ auto solid_harmonics(World &world, int n) -> std::map, real_fun 1.0 / std::sqrt((l + m + 1) * (l - m + 1)) * ((2 * l + 1) * z * result[std::vector{l, m}] - sqrt((l + m) * (l - m)) * (x * x + y * y + z * z) * - result[std::vector{l - 1, m}]); + result[std::vector{l - 1, m}]); } } @@ -1601,14 +1610,15 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu size_t m = X.num_states(); size_t n = X.num_orbitals(); + molresponse::start_timer(world); if (world.size() > 1) { - molresponse::start_timer(world); LoadBalanceDeux<3> lb(world); - + for (unsigned int j = 0; j < n; ++j) { + lb.add_tree(psi0[j], lbcost(1.0, 8.0), false); + lb.add_tree(vf[j], lbcost(1.0, 8.0), false); + } for (unsigned int i = 0; i < m; ++i) { - lb.add_tree(psi0[i], lbcost(1.0, 8.0), false); - lb.add_tree(vf[i], lbcost(1.0, 8.0), false); for (unsigned int j = 0; j < n; ++j) { // add a tree for orbitals lb.add_tree(X.X[i][j], lbcost(1.0, 8.0), false); @@ -1619,7 +1629,6 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu // newpamap is the new pmap just based on the orbitals std::shared_ptr>> new_process_map = lb.load_balance(load_balance); - molresponse::end_timer(world, "Gamma compute load_balance_chi"); // default process map // We set the new_process_map molresponse::start_timer(world); @@ -1639,6 +1648,7 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu // return a copy with the same process map since we only have one world return {X.copy(), copy(world, psi0), copy(world, vf)}; } + molresponse::end_timer(world, "Gamma compute load_balance_chi"); } void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, @@ -1658,8 +1668,8 @@ void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, for (int axis = 0; axis < 3; ++axis) { // x y z functionT fdip = factoryT(world) - .functor(functorT(new madness::DipoleFunctor(axis))) - .initial_level(4); + .functor(functorT(new madness::DipoleFunctor(axis))) + .initial_level(4); dip(axis, _) = inner(world, x, mul_sparse(world, fdip, x, vtol)); // - ^2-^2-^2 for (int i = 0; i < nmo1; ++i) rsq(i) -= dip(axis, i) * dip(axis, i); @@ -1721,6 +1731,7 @@ void ResponseBase::output_json() { } void ResponseBase::converged_to_json(json &j) { j["converged"] = converged; } + void ResponseBase::print_inner(World &world, const std::string &name, const X_space &left, const X_space &right) { auto m_val = inner(left, right); @@ -1780,6 +1791,7 @@ response_space transform(World &world, const response_space &f, const Tensor &U) -> X_space { // Return container X_space result(world, x.num_states(), x.num_orbitals()); @@ -2044,11 +2056,13 @@ response_timing::response_timing() : iter(0) { cpu_time_data.insert({"subspace_reduce", std::vector(0)}); cpu_time_data.insert({"diagonalize_response_matrix", std::vector(0)}); } + void response_timing::print_data() { for (const auto &[key, value]: wall_time_data) { print(key, " : ", value); } for (const auto &[key, value]: cpu_time_data) { print(key, " : ", value); } } + /** * add the pair of s wall_time and cpu_time to the time_data and wall_data maps * @@ -2069,6 +2083,7 @@ void response_timing::add_data(std::map> v.second.push_back(values[v.first].second);// .first to get first value of pair wall_time }); } + void response_timing::to_json(json &j) { ::print("FREQUENCY TIME DATA TO JSON"); diff --git a/src/apps/molresponse/molresponse.cc b/src/apps/molresponse/molresponse.cc index 4ebfdc42b36..bb7133130c6 100644 --- a/src/apps/molresponse/molresponse.cc +++ b/src/apps/molresponse/molresponse.cc @@ -48,7 +48,7 @@ #include static inline int file_exists(const char *inpname) { - struct stat buffer {}; + struct stat buffer{}; size_t rc = stat(inpname, &buffer); return (rc == 0); } @@ -60,9 +60,9 @@ using namespace madness; int main(int argc, char **argv) { World &world = madness::initialize(argc, argv); + startup(world, argc, argv, true); + sleep(10); int result = 0; - world.gop.fence(); - startup(world, argc, argv); std::cout.precision(6); std::string filename = "response.in"; @@ -84,8 +84,8 @@ int main(int argc, char **argv) { print("\n"); calc_params.response_parameters.print("response"); // put the response parameters in a j_molrespone json object - calc_params.response_parameters.to_json(calc.j_molresponse); } + calc_params.response_parameters.to_json(calc.j_molresponse); // set protocol to the first calc.solve(world); calc.output_json(); @@ -108,8 +108,8 @@ int main(int argc, char **argv) { calc_params.molecule.print(); print("\n"); calc_params.response_parameters.print("response"); - calc_params.response_parameters.to_json(calc.j_molresponse); } + calc_params.response_parameters.to_json(calc.j_molresponse); // set protocol to the first calc.solve(world); calc.output_json(); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 3193b3b4fcd..de52c434c00 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -17,6 +17,7 @@ namespace madness { typedef std::vector response_matrix; + /* * * @brief response matrix holds response vectors for response state * @@ -51,21 +52,22 @@ namespace madness { * implementations * @param y */ - response_space(const response_space& y) - : num_states(y.size()), - num_orbitals(y.size_orbitals()), - x(y.x) {} + response_space(const response_space &y) + : num_states(y.size()), + num_orbitals(y.size_orbitals()), + x(y.x) {} + // assignment // Copy assignment should copy the members of y and leave y Unchanged // The problem is what happens when we copy two functions - response_space& operator=(const response_space& y) { + response_space &operator=(const response_space &y) { // if (this != &y) {// is it the same object? this->num_states = y.size(); this->num_orbitals = y.size_orbitals(); this->x = y.x; if (x.size() != num_states) { x.resize(num_states); } - World& world = y[0][0].world(); + World &world = y[0][0].world(); // print("perhaps this is the problem"); std::transform(y.x.begin(), y.x.end(), x.begin(), [&](auto yi) { return madness::copy(world, yi); }); @@ -84,13 +86,14 @@ namespace madness { * @param num_states * @param num_orbitals */ - response_space(World& world, size_t num_states, size_t num_orbitals) - : num_states(num_states), - num_orbitals(num_orbitals), - x(response_matrix(num_states)) { - for (auto& state: x) { - state = zero_functions(world, static_cast(num_orbitals), true); + response_space(World &world, size_t num_states, size_t num_orbitals) + : num_states(num_states), + num_orbitals(num_orbitals), + x(response_matrix(num_states)) { + for (auto &state: x) { + state = zero_functions(world, static_cast(num_orbitals), false); } + world.gop.fence(); } // Conversion from respones_matrix /** @@ -98,12 +101,13 @@ namespace madness { * * @param x */ - explicit response_space(const response_matrix& x) - : num_states(x.size()), - num_orbitals(x[0].size()), - x(x) {} + explicit response_space(const response_matrix &x) + : num_states(x.size()), + num_orbitals(x[0].size()), + x(x) {} + // Determines if two ResponseFunctions are the same size - friend bool same_size(const response_space& a, const response_space& b) { + friend bool same_size(const response_space &a, const response_space &b) { return ((a.size() == b.size()) && (a.size_orbitals() == b.size_orbitals())); } @@ -115,14 +119,15 @@ namespace madness { * @param i * @return vector_real_function_3d& */ - vector_real_function_3d& operator[](size_t i) { return x.at(i); } + vector_real_function_3d &operator[](size_t i) { return x.at(i); } + /** * @brief access vector of functions const * * @param i * @return const vector_real_function_3d& */ - const vector_real_function_3d& operator[](size_t i) const { return x.at(i); } + const vector_real_function_3d &operator[](size_t i) const { return x.at(i); } // KAIN must have this // element wise addition. we add each vector separately @@ -134,11 +139,11 @@ namespace madness { * @param rhs_y * @return response_space */ - response_space operator+(const response_space& rhs_y) const { + response_space operator+(const response_space &rhs_y) const { MADNESS_ASSERT(size() > 0); MADNESS_ASSERT(same_size(*this, rhs_y));// assert that same size - World& world = this->x[0][0].world(); + World &world = this->x[0][0].world(); response_space result(world, num_states, num_orbitals);// create zero_functions @@ -158,11 +163,11 @@ namespace madness { * @param rhs_y * @return response_space */ - response_space operator-(const response_space& rhs_y) const { + response_space operator-(const response_space &rhs_y) const { MADNESS_ASSERT(size() > 0); MADNESS_ASSERT(same_size(*this, rhs_y));// assert that same size - World& world = this->x[0][0].world(); + World &world = this->x[0][0].world(); response_space result(world, num_states, num_orbitals);// create zero_functions @@ -180,23 +185,25 @@ namespace madness { * @return response_space */ friend response_space operator*(response_space y, double a) { - World& world = y.x.at(0).at(0).world(); + World &world = y.x.at(0).at(0).world(); response_space result = y.copy();// deep copy for (unsigned int i = 0; i < y.num_states; i++) { madness::scale(world, result[i], a); } return result; } + friend response_space operator*(double a, response_space y) { - World& world = y.x.at(0).at(0).world(); + World &world = y.x.at(0).at(0).world(); response_space result = y.copy();// deep copy for (unsigned int i = 0; i < y.num_states; i++) { madness::scale(world, result[i], a); } return result; } - response_space& operator*=(double a) { - World& world = this->x[0][0].world(); + + response_space &operator*=(double a) { + World &world = this->x[0][0].world(); for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a); } @@ -205,8 +212,8 @@ namespace madness { // Scaling all internal functions by an external function // g[i][j] = x[i][j] * f - friend response_space operator*(const response_space& a, const Function& f) { - World& world = a.x.at(0).at(0).world(); + friend response_space operator*(const response_space &a, const Function &f) { + World &world = a.x.at(0).at(0).world(); response_space result(world, a.num_states, a.num_orbitals);// create zero_functions for (unsigned int i = 0; i < a.num_states; i++) { @@ -216,14 +223,16 @@ namespace madness { return result; } + // Scaling all internal functions by an external function // g[i][j] = x[i][j] * f - friend response_space operator*(const Function& f, const response_space& a) { + friend response_space operator*(const Function &f, const response_space &a) { // commutative property return a * f; } - response_space operator*(const Function& f) { - World& world = x[0][0].world(); + + response_space operator*(const Function &f) { + World &world = x[0][0].world(); response_space result(world, num_states, num_orbitals);// create zero_functions for (size_t i = 0; i < num_states; i++) { @@ -234,10 +243,10 @@ namespace madness { return result; } - friend response_space operator*(const response_space& a, const Tensor& b) { + friend response_space operator*(const response_space &a, const Tensor &b) { MADNESS_ASSERT(a.size() > 0); MADNESS_ASSERT(!a[0].empty()); - World& world = a[0][0].world(); + World &world = a[0][0].world(); response_space result(world, a.num_states, a.num_orbitals); for (unsigned int i = 0; i < a.size(); i++) { @@ -246,10 +255,11 @@ namespace madness { return result; } + // KAIN must have this - response_space& operator+=(const response_space& b) { + response_space &operator+=(const response_space &b) { MADNESS_ASSERT(same_size(*this, b)); - World& world = x[0][0].world(); + World &world = x[0][0].world(); for (size_t i = 0; i < num_states; i++) { this->x[i] = add(world, this->x[i], b[i]); } return *this; @@ -258,7 +268,7 @@ namespace madness { // Returns a deep copy response_space copy() const { response_space result(x[0][0].world(), num_states, num_orbitals); - World& world = x[0][0].world(); + World &world = x[0][0].world(); std::transform(x.begin(), x.end(), result.x.begin(), @@ -268,7 +278,7 @@ namespace madness { return result; } - response_space copy(const std::shared_ptr > >& pmap, + response_space copy(const std::shared_ptr > > &pmap, bool fence = false) const { response_space result(x[0][0].world(), num_states, num_orbitals); @@ -280,7 +290,7 @@ namespace madness { } // Mimicking std::vector with these 4 - void push_back(const vector_real_function_3d& f) { + void push_back(const vector_real_function_3d &f) { x.push_back(f); num_states++; // print("im calling response_space push back"); @@ -291,6 +301,7 @@ namespace madness { num_orbitals = f.size(); } } + void pop_back() { MADNESS_ASSERT(num_states >= 1); x.pop_back(); @@ -301,21 +312,28 @@ namespace madness { num_orbitals = 0; } } + void clear() { x.clear(); num_states = 0; num_orbitals = 0; } + auto begin() { return x.begin(); } + auto end() { return x.end(); } + const auto begin() const { return x.begin(); } + const auto end() const { return x.end(); } + size_t size() const { return num_states; } + size_t size_orbitals() const { return num_orbitals; } // Mimicing standard madness calls with these 3 void zero() { - auto& world = x[0][0].world(); + auto &world = x[0][0].world(); std::generate(x.begin(), x.end(), [&]() { return zero_functions(world, num_orbitals, true); }); @@ -328,13 +346,13 @@ namespace madness { void compress_rf() { //for (size_t k = 0; k < num_states; k++) { compress(x[0][0].world(), x[k], true); } - auto& world = x[0][0].world(); + auto &world = x[0][0].world(); std::for_each(x.begin(), x.end(), [&](auto xi) { compress(world, xi, true); }); } void reconstruct_rf() { //for (size_t k = 0; k < num_states; k++) { reconstruct(x[0][0].world(), x[k], true); } - auto& world = x[0][0].world(); + auto &world = x[0][0].world(); std::for_each(x.begin(), x.end(), [&](auto xi) { reconstruct(world, xi, true); }); } @@ -348,7 +366,7 @@ namespace madness { } void truncate_rf(double tol) { - auto& world = x[0][0].world(); + auto &world = x[0][0].world(); std::for_each(x.begin(), x.end(), [&](auto xi) { truncate(world, xi, tol, true); }); /* for (size_t k = 0; k < num_states; k++) { truncate(x[0][0].world(), x[k], tol, true); } @@ -357,7 +375,7 @@ namespace madness { // Returns norms of each state Tensor norm2() { - auto& world = x[0][0].world(); + auto &world = x[0][0].world(); Tensor answer(num_states); for (size_t i = 0; i < num_states; i++) { answer(i) = madness::norm2(world, x[i]); } @@ -368,12 +386,13 @@ namespace madness { // Scales each state (read: entire row) by corresponding vector element // new[i] = old[i] * mat[i] - void scale(Tensor& mat) { + void scale(Tensor &mat) { for (size_t i = 0; i < num_states; i++) madness::scale(x[0][0].world(), x[i], mat[i], false); // x[i] = x[i] * mat[i]; } - friend bool operator==(const response_space& a, const response_space& y) { + + friend bool operator==(const response_space &a, const response_space &y) { if (!same_size(a, y)) return false; for (size_t b = 0; b < a.size(); ++b) { for (size_t k = 0; b < a.size_orbitals(); ++k) { @@ -384,14 +403,15 @@ namespace madness { } return true; } - friend Tensor response_space_inner(const response_space& a, - const response_space& b) { + + friend Tensor response_space_inner(const response_space &a, + const response_space &b) { MADNESS_ASSERT(a.size() > 0); MADNESS_ASSERT(a.size() == b.size()); MADNESS_ASSERT(!a[0].empty()); MADNESS_ASSERT(a[0].size() == b[0].size()); - World& world = a[0][0].world(); + World &world = a[0][0].world(); size_t dim_1 = a.size(); size_t dim_2 = b[0].size(); @@ -410,8 +430,9 @@ namespace madness { return result; } }; + // Final piece for KAIN - inline double inner(response_space& a, response_space& b) { + inline double inner(response_space &a, response_space &b) { MADNESS_ASSERT(a.size() > 0); MADNESS_ASSERT(a.size() == b.size()); MADNESS_ASSERT(!a[0].empty()); @@ -426,7 +447,8 @@ namespace madness { return value; } - auto transposeResponseMatrix(const response_matrix& x) -> response_matrix; + + auto transposeResponseMatrix(const response_matrix &x) -> response_matrix; // Final piece for KAIN }// End namespace madness diff --git a/src/apps/molresponse/timer.cc b/src/apps/molresponse/timer.cc index 829c7b53a7e..c3ff13c439d 100644 --- a/src/apps/molresponse/timer.cc +++ b/src/apps/molresponse/timer.cc @@ -33,6 +33,7 @@ namespace molresponse { } void end_timer(World& world, const char* msg, const std::string& key, std::map>& time) { + world.gop.fence(); double wall = wall_time() - pop(ttt); double cpu = cpu_time() - pop(sss); @@ -44,6 +45,7 @@ namespace molresponse { time[key] = timings; + if (world.rank() == 0) printf(" timer: %20.20s %8.2fs %8.2fs\n", msg, cpu, wall); } }// namespace molresponse From 76bb1bd5e25e7a48189ccb976143ba3fd1af82ca Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sat, 3 Sep 2022 09:14:21 -0400 Subject: [PATCH 0225/1312] reverting Hannes change to restore the derivative operator functionality --- src/madness/chem/CalculationParameters.h | 4 ++++ src/madness/chem/SCF.cc | 2 +- src/madness/chem/SCF.h | 7 +++++++ src/madness/chem/SCFOperators.cc | 20 ++++++++++++-------- src/madness/chem/SCFOperators.h | 10 +++++++--- src/madness/chem/oep.h | 5 ++++- 6 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/madness/chem/CalculationParameters.h b/src/madness/chem/CalculationParameters.h index 3886a0728a1..6467f87caee 100644 --- a/src/madness/chem/CalculationParameters.h +++ b/src/madness/chem/CalculationParameters.h @@ -70,6 +70,8 @@ struct CalculationParameters : public QCCalculationParametersBase { initialize >("convergence_criteria",{"bsh_residual","total_energy"},"possible values are: bsh_residual, total_energy, each_energy, density"); initialize ("k",-1,"polynomial order"); initialize("l",20,"user coordinates box size"); + initialize("deriv","abgv","derivative method",{"abgv","bspline","ble"}); + initialize("dft_deriv","abgv","derivative method for gga potentials",{"abgv","bspline","ble"}); initialize("maxrotn",0.25,"step restriction used in autoshift algorithm"); initialize ("nvalpha",0,"number of alpha virtuals to compute"); initialize ("nvbeta",0,"number of beta virtuals to compute"); @@ -188,6 +190,8 @@ struct CalculationParameters : public QCCalculationParametersBase { int maxiter() const {return get("maxiter");} double orbitalshift() const {return get("orbitalshift");} + std::string deriv() const {return get("deriv");} + std::string dft_deriv() const {return get("dft_deriv");} std::string pcm_data() const {return get("pcm_data");} std::string ac_data() const {return get("ac_data");} std::string xc() const {return get("xc");} diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 77594063a18..9963627cee0 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -1224,7 +1224,7 @@ vecfuncT SCF::apply_potential(World& world, const tensorT& occ, if (xc.is_dft() && !(xc.hf_exchange_coefficient() == 1.0)) { START_TIMER(world); - XCOperator xcoperator(world, this, ispin); + XCOperator xcoperator(world, this, ispin, param.dft_deriv()); if (ispin == 0) exc = xcoperator.compute_xc_energy(); vloc += xcoperator.make_xc_potential(); diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 487076c85ae..7dc570b8cfb 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -275,6 +275,13 @@ class SCF { coulop = poperatorT(CoulombOperatorPtr(world, param.lo(), thresh)); gradop = gradient_operator(world); + // Update coefficients if using a different derivative + if (param.deriv() == "bspline") { + for (int i = 0; i < 3; ++i) (*gradop[i]).set_bspline1(); + } else if (param.deriv() == "ble") { + for (int i = 0; i < 3; ++i) (*gradop[i]).set_ble1(); + } + mask = functionT(factoryT(world).f(mask3).initial_level(4).norefine()); if (world.rank() == 0 and param.print_level() > 1) { print("\nSolving NDIM=", NDIM, " with thresh", thresh, " k", diff --git a/src/madness/chem/SCFOperators.cc b/src/madness/chem/SCFOperators.cc index a90d1a5e433..8cfd61cfd31 100644 --- a/src/madness/chem/SCFOperators.cc +++ b/src/madness/chem/SCFOperators.cc @@ -345,8 +345,8 @@ std::vector> DNuclear::operator()(const std::vector XCOperator::XCOperator(World &world, std::string xc_data, const bool spin_polarized, - const real_function_3d &arho, const real_function_3d &brho) - : world(world), nbeta(0), ispin(0), + const real_function_3d &arho, const real_function_3d &brho, std::string deriv) + : world(world), dft_deriv(deriv), nbeta(0), ispin(0), extra_truncation(FunctionDefaults<3>::get_thresh() * 0.01) { nbeta = (brho.norm2() > 0.0); // does this make sense @@ -358,8 +358,8 @@ XCOperator::XCOperator(World &world, std::string xc_data, const bool sp } template -XCOperator::XCOperator(World &world, const SCF *calc, int ispin) - : world(world), ispin(ispin), extra_truncation(FunctionDefaults<3>::get_thresh() * 0.01) { +XCOperator::XCOperator(World &world, const SCF *calc, int ispin, std::string deriv) + : world(world), dft_deriv(deriv), ispin(ispin), extra_truncation(FunctionDefaults<3>::get_thresh() * 0.01) { xc = std::shared_ptr(new XCfunctional()); xc->initialize(calc->param.xc(), !calc->param.spin_restricted(), world); nbeta = calc->param.nbeta(); @@ -405,8 +405,8 @@ XCOperator::XCOperator(World &world, const Nemo *nemo, int ispin) template XCOperator::XCOperator(World &world, const SCF *calc, const real_function_3d &arho, - const real_function_3d &brho, int ispin) - : world(world), nbeta(calc->param.nbeta()), ispin(ispin), + const real_function_3d &brho, int ispin, std::string deriv) + : world(world), dft_deriv(deriv), nbeta(calc->param.nbeta()), ispin(ispin), extra_truncation(FunctionDefaults<3>::get_thresh() * 0.01) { xc = std::shared_ptr(new XCfunctional()); xc->initialize(calc->param.xc(), !calc->param.spin_restricted(), world); @@ -580,7 +580,9 @@ vecfuncT XCOperator::prep_xc_args(const real_function_3d &arho, real_function_3d logdensa = unary_op(arho, logme()); vecfuncT grada; - grada = grad(logdensa); // Default is abgv + if (dft_deriv == "bspline") grada = grad_bspline_one(logdensa); // b-spline + else if (dft_deriv == "ble") grada = grad_ble_one(logdensa); // BLE + else grada = grad(logdensa); // Default is abgv real_function_3d chi = dot(world, grada, grada); xcargs[XCfunctional::enum_chi_aa] = chi; xcargs[XCfunctional::enum_zetaa_x] = grada[0]; @@ -591,7 +593,9 @@ vecfuncT XCOperator::prep_xc_args(const real_function_3d &arho, real_function_3d logdensb = unary_op(brho, logme()); // Bryan's edits for derivatives vecfuncT gradb; - gradb = grad(logdensb); // Default is abgv + if (dft_deriv == "bspline") gradb = grad_bspline_one(logdensa); // b-spline + else if (dft_deriv == "ble") gradb = grad_ble_one(logdensa); // BLE + else gradb = grad(logdensa); // Default is abgv real_function_3d chib = dot(world, gradb, gradb); real_function_3d chiab = dot(world, grada, gradb); xcargs[XCfunctional::enum_zetab_x] = gradb[0]; diff --git a/src/madness/chem/SCFOperators.h b/src/madness/chem/SCFOperators.h index fbe1c544726..8d3d2fef1db 100644 --- a/src/madness/chem/SCFOperators.h +++ b/src/madness/chem/SCFOperators.h @@ -635,17 +635,18 @@ class XCOperator : public SCFOperatorBase { /// custom ctor with information about the XC functional XCOperator(World& world, std::string xc_data, const bool spin_polarized, - const real_function_3d& arho, const real_function_3d& brho); + const real_function_3d& arho, const real_function_3d& brho, + std::string deriv="abgv"); /// ctor with an SCF calculation, will initialize the necessary intermediates - XCOperator(World& world, const SCF* scf, int ispin=0); + XCOperator(World& world, const SCF* scf, int ispin=0, std::string deriv="abgv"); /// ctor with a Nemo calculation, will initialize the necessary intermediates XCOperator(World& world, const Nemo* nemo, int ispin=0); /// ctor with an SCF calculation, will initialize the necessary intermediates XCOperator(World& world, const SCF* scf, const real_function_3d& arho, - const real_function_3d& brho, int ispin=0); + const real_function_3d& brho, int ispin=0, std::string deriv="abgv"); /// ctor with an Nemo calculation, will initialize the necessary intermediates XCOperator(World& world, const Nemo* scf, const real_function_3d& arho, @@ -700,6 +701,9 @@ class XCOperator : public SCFOperatorBase { /// the world World& world; + /// which derivative operator to use + std::string dft_deriv; + public: /// interface to the actual XC functionals std::shared_ptr xc; diff --git a/src/madness/chem/oep.h b/src/madness/chem/oep.h index 08087265fb7..6fed44e5d62 100644 --- a/src/madness/chem/oep.h +++ b/src/madness/chem/oep.h @@ -333,6 +333,7 @@ class OEP : public Nemo { for (int idim=0; idim<3; ++idim) { real_derivative_3d D(world,idim); + if(param.dft_deriv() == "bspline") D.set_bspline1(); vecfuncT nemo_copy=copy(world,nemo); refine(world,nemo_copy); std::vector dnemo=apply(world,D,nemo_copy); @@ -357,7 +358,9 @@ class OEP : public Nemo { for (long i = 0; i < nemo.size(); i++) { vecfuncT nemo_copy=copy(world,nemo); refine(world,nemo_copy); - grad_nemo[i] = grad(nemo_copy[i]); // default gradient using abgv + + if(param.dft_deriv() == "bspline") grad_nemo[i] = grad_bspline_one(nemo_copy[i]); // gradient using b-spline + else grad_nemo[i] = grad(nemo_copy[i]); // default gradient using abgv } vecfuncT grad_nemo_term; From 64f003e1c8d8e6bd04686df1a542b054831cda9c Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sat, 3 Sep 2022 09:28:20 -0400 Subject: [PATCH 0226/1312] minimal patch to fix open shell GGA bug --- src/madness/chem/SCFOperators.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/madness/chem/SCFOperators.cc b/src/madness/chem/SCFOperators.cc index 8cfd61cfd31..92502f75718 100644 --- a/src/madness/chem/SCFOperators.cc +++ b/src/madness/chem/SCFOperators.cc @@ -593,9 +593,9 @@ vecfuncT XCOperator::prep_xc_args(const real_function_3d &arho, real_function_3d logdensb = unary_op(brho, logme()); // Bryan's edits for derivatives vecfuncT gradb; - if (dft_deriv == "bspline") gradb = grad_bspline_one(logdensa); // b-spline - else if (dft_deriv == "ble") gradb = grad_ble_one(logdensa); // BLE - else gradb = grad(logdensa); // Default is abgv + if (dft_deriv == "bspline") gradb = grad_bspline_one(logdensb); // b-spline + else if (dft_deriv == "ble") gradb = grad_ble_one(logdensb); // BLE + else gradb = grad(logdensb); // Default is abgv real_function_3d chib = dot(world, gradb, gradb); real_function_3d chiab = dot(world, grada, gradb); xcargs[XCfunctional::enum_zetab_x] = gradb[0]; From b7df5184b892b8a03642ccb55175443ca057c5c5 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sat, 3 Sep 2022 20:32:07 -0400 Subject: [PATCH 0227/1312] in dirac forgot to update changed path to chem --- src/apps/dirac/DF.cc | 6 +++--- src/apps/dirac/DF.h | 2 +- src/apps/dirac/DFParameters.h | 2 +- src/apps/dirac/InitParameters.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/dirac/DF.cc b/src/apps/dirac/DF.cc index 2306f7df2a7..515c432baa9 100644 --- a/src/apps/dirac/DF.cc +++ b/src/apps/dirac/DF.cc @@ -13,7 +13,7 @@ #include "DF.h" //#include "Plot_VTK.h" #include "fcwf.h" -#include +#include using namespace madness; @@ -207,7 +207,7 @@ class GaussianNucleusFunctor : public FunctionFunctorInterface { //get atomic numbers for(unsigned int i = 0; i < m_Rlist.size(); i++){ - m_Zlist.push_back(molecule.get_atom_number(i)); + m_Zlist.push_back(molecule.get_atomic_number(i)); } //find atomic mass numbers for each atom. This list matches that of Visccher and Dyall (1997) @@ -348,7 +348,7 @@ void DF::make_fermi_potential(World& world, real_convolution_3d& op, real_functi //Go through the atoms in the molecule and construct the total charge distribution due to all nuclei for(unsigned int i = 0; i < num_atoms; i++){ - Zlist[i] = Init_params.molecule.get_atom_number(i); + Zlist[i] = Init_params.molecule.get_atomic_number(i); FermiNucDistFunctor rho(Zlist[i], Rlist[i],DFparams.bohr_rad); temp = real_factory_3d(world).functor(rho).truncate_mode(0); tempnorm = temp.trace(); diff --git a/src/apps/dirac/DF.h b/src/apps/dirac/DF.h index cd7338f775b..a688de968eb 100644 --- a/src/apps/dirac/DF.h +++ b/src/apps/dirac/DF.h @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include "DFParameters.h" #include "InitParameters.h" diff --git a/src/apps/dirac/DFParameters.h b/src/apps/dirac/DFParameters.h index 45225700ffb..3ce9a274220 100644 --- a/src/apps/dirac/DFParameters.h +++ b/src/apps/dirac/DFParameters.h @@ -5,7 +5,7 @@ #ifndef MADNESS_APPS_DFPARAMS_H_INCLUDED #define MADNESS_APPS_DFPARAMS_H_INCLUDED -#include +#include namespace madness { diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index 767f6b82654..d2c84c8e843 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -7,7 +7,7 @@ #define MADNESS_APPS_DFGUESSPARAMS_H_INCLUDED #include "fcwf.h" -#include +#include Function,3> function_real2complex(const Function& r); double myxfunc(const madness::coord_3d& r); From 7fa503b8908b68a44a462ff4b7be2d4f69f40723 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sat, 3 Sep 2022 21:29:44 -0400 Subject: [PATCH 0228/1312] missed a chem path here --- src/apps/dirac/InitParameters.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index d2c84c8e843..1db41388d02 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -77,15 +77,21 @@ namespace madness{ //read in what's in the archive. See SCF.cc for how these archives are stored archive::ParallelInputArchive input(world, filename.c_str()); + unsigned int version; + std::string xc; + + input & version; input & Init_total_energy; // double input & spinrestricted; // bool + input & L; // double box size + input & order; // int wavelet order + input & molecule; // Molecule + input & xc; + input & num_occupied; // int input & temp_energies; // Tensor orbital energies input & occ; // Tensor orbital occupations input & dummy2; // std::vector sets of orbitals(?) - input & L; // double box size - input & order; // int wavelet order - input & molecule; // Molecule //For now assume spin-restricted means closed shell in moldft closed_shell = spinrestricted; From 6fcee8bf6f30b6ee9b3ae39036e6f708f9c36cf2 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sat, 3 Sep 2022 21:38:23 -0400 Subject: [PATCH 0229/1312] RK tests the quasi relativistic operators but is history I think --- src/apps/dirac/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/dirac/CMakeLists.txt b/src/apps/dirac/CMakeLists.txt index a6685762aaa..a347ab643cb 100644 --- a/src/apps/dirac/CMakeLists.txt +++ b/src/apps/dirac/CMakeLists.txt @@ -3,6 +3,6 @@ add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc) target_link_libraries(DFdriver MADchem MADmra) -add_executable(rk rk.cc) -target_link_libraries(rk MADchem MADmra -lgmp -lmpfr) +#add_executable(rk rk.cc) +#target_link_libraries(rk MADchem MADmra -lgmp -lmpfr) From 95776c6f71bc50e1dba216bc22e9f464b4777dae Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sun, 4 Sep 2022 09:10:25 -0400 Subject: [PATCH 0230/1312] use add_mad_executable --- src/apps/dirac/CMakeLists.txt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/apps/dirac/CMakeLists.txt b/src/apps/dirac/CMakeLists.txt index a347ab643cb..8675150f24e 100644 --- a/src/apps/dirac/CMakeLists.txt +++ b/src/apps/dirac/CMakeLists.txt @@ -1,7 +1,13 @@ -# src/apps/moldft +# src/apps/dirac + +add_mad_executable(DFdriver "DFdriver.cc;DF.cc;fcwf.cc" MADchem) + +#target_link_libraries(DFdriver MADchem MADmra) + +add_dependencies(applications-madness DFdriver) + +install(TARGETS DFdriver DESTINATION "${MADNESS_INSTALL_BINDIR}") -add_executable(DFdriver DFdriver.cc DF.cc fcwf.cc) -target_link_libraries(DFdriver MADchem MADmra) #add_executable(rk rk.cc) #target_link_libraries(rk MADchem MADmra -lgmp -lmpfr) From bbf51ec50b1e33025bd9fb9fe23aab86dab55e33 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sun, 4 Sep 2022 09:35:58 -0400 Subject: [PATCH 0231/1312] smoothed derivative data files were not being installed --- src/madness/mra/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/mra/CMakeLists.txt b/src/madness/mra/CMakeLists.txt index 9fb75b59fd3..e3b9906516c 100644 --- a/src/madness/mra/CMakeLists.txt +++ b/src/madness/mra/CMakeLists.txt @@ -22,7 +22,7 @@ add_mad_library(mra MADMRA_SOURCES MADMRA_HEADERS "linalg;tinyxml;muparser" "mad # Install the MADmra library # install(TARGETS mraplot DESTINATION "${MADNESS_INSTALL_BINDIR}") -install(FILES autocorr coeffs gaussleg +install(FILES autocorr coeffs gaussleg ble-first.txt ble-second.txt b-spline-deriv1.txt b-spline-deriv2.txt b-spline-deriv3.txt DESTINATION "${MADNESS_INSTALL_DATADIR}" COMPONENT mra) From 3c20a0a19387648d966d9a3ac8ebb6630be3249c Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sun, 4 Sep 2022 11:00:55 -0400 Subject: [PATCH 0232/1312] changed set_eprec to update_rcut_from_eprec --- src/apps/moldft/testperiodicdft.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/moldft/testperiodicdft.cc b/src/apps/moldft/testperiodicdft.cc index 4e29a7e8e00..8507f41ee8d 100644 --- a/src/apps/moldft/testperiodicdft.cc +++ b/src/apps/moldft/testperiodicdft.cc @@ -974,7 +974,7 @@ int main(int argc, char** argv) { //molecule.add_atom( 3*L/4, L/4, 3*L/4, 14.0, 14); //molecule.add_atom( L/4, 3*L/4, 3*L/4, 14.0, 14); - molecule.set_eprec(1e-3); + molecule.update_rcut_with_eprec(1e-3); // Load basis aobasis.read_file("sto-3g"); From d5b74548c31c14c1eaa244f2ad60e752e31c98bf Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sun, 4 Sep 2022 11:02:18 -0400 Subject: [PATCH 0233/1312] commented molresponse out since build is broken and Adrian needs to merge recent version --- src/apps/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt index 9c54a70d7c6..7a730f723a5 100644 --- a/src/apps/CMakeLists.txt +++ b/src/apps/CMakeLists.txt @@ -4,7 +4,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory(tdse) add_subdirectory(moldft) -add_subdirectory(molresponse) +#add_subdirectory(molresponse) # temporarily removed since build is breaking add_subdirectory(pno) add_subdirectory(nemo) add_subdirectory(cis) From 2e2748ae7352b2a3366102e338ca1918f36ede70 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sun, 4 Sep 2022 13:11:58 -0400 Subject: [PATCH 0234/1312] brief documentation about how to run the DHF code --- src/apps/dirac/README | 53 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/src/apps/dirac/README b/src/apps/dirac/README index ba47816c90e..127cb8bd6d6 100644 --- a/src/apps/dirac/README +++ b/src/apps/dirac/README @@ -1,14 +1,51 @@ -README file for Joel Anderson's fork of MADNESS +Basic instructions to run the Dirac Hartree-Fock code. -Notes: -After configuration with cmake, you may need to go to /src/madness/config.h and change the line: +Can start from moldft or a previous DFdriver calculation. There is nearly working functionality to restart from NWChem (look at readnw() in InitParamters.h) that would have multiple advantages, though note that moldft can be started from NWChem. -/*undef HAVE_INTEL_MKL */ +1) Be atom starting from moldft -to: +Run moldft with +--------- +dft + xc hf +end -def HAVE_INTEL_MKL 1 +geometry + be 0 0 0 +end +--------- -making sure that you do in fact have Intel MKL. +Then run DFdriver with +--------- +DiracFock + archive be.restartdata + small 1e-5 + thresh 1e-6 + kain + maxsub 5 + no_save +end +--------- + +List of interesting input options (from DFParameters.h) + + std::string archive; ///< Name of input archive to read in ground state + int max_iter; ///< Maximum number of iterations + double small; ///< Minimum length scale to be resolved + double thresh; ///< Accuracy criterion when truncating + int k; ///< Number of legendre polynomials in scaling basis + bool kain; ///< Turns on KAIN nonlinear solver + int maxsub; ///< Sets maximum subspace size for KAIN + double maxrotn; ///< maximum step allowed by kain + bool restart; ///< Indicates this is a restarted DF job + int nucleus; ///< Indicates which nucleus model to use (1 for fermi, anything else for Gaussian) + bool do_save; ///< Whether or not to save after each iteration. Defaults to true. Turn off with 'no_save' + std::string savefile; ///< Gives the file to save the archive each iteration Default: DFrestartdata (in working directory) + int lb_iter; ///< How many iterations to load balance (after the initial load balancing) + bool lineplot; ///< Whether or not to make lineplots at the end of the job + bool no_compute; ///< If true, will skip all computation + double bohr_rad; ///< bohr radius in fm (default: 52917.7211) + int min_iter; ///< minimum number of iterations (default: 2) + +(Kramers restricted does not seem to be working --- bug in the exchange piece?) -This is due to a bug that I don't know how to fix, where even if you have Intel MKL, cmake doesn't set the right preprocessing macros, and ends up compiling pieces of code without it. From 9d0c2beb4594a83a343ccdc097d52e34961fa766 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Mon, 5 Sep 2022 14:00:05 -0400 Subject: [PATCH 0235/1312] added more atoms to the structure library --- src/madness/chem/structure_library | 339 +++++++++++++++++++++++++---- 1 file changed, 297 insertions(+), 42 deletions(-) diff --git a/src/madness/chem/structure_library b/src/madness/chem/structure_library index 2201759a7ec..74e11333fa5 100644 --- a/src/madness/chem/structure_library +++ b/src/madness/chem/structure_library @@ -1,18 +1,273 @@ +structure=h +geometry +h 0 0 0 +end + structure=he geometry he 0 0 0 end +structure=li +geometry +li 0 0 0 +end + +structure=be +geometry +be 0 0 0 +end + +structure=b +geometry +b 0 0 0 +end + +structure=c +geometry +c 0 0 0 +end + +structure=n +geometry +n 0 0 0 +end + +structure=o +geometry +o 0 0 0 +end + +structure=f +geometry +f 0 0 0 +end + structure=ne geometry ne 0 0 0 end +structure=na +geometry +na 0 0 0 +end + +structure=mg +geometry +mg 0 0 0 +end + +structure=al +geometry +al 0 0 0 +end + +structure=si +geometry +si 0 0 0 +end + +structure=p +geometry +p 0 0 0 +end + +structure=s +geometry +s 0 0 0 +end + +structure=cl +geometry +cl 0 0 0 +end + structure=ar geometry ar 0 0 0 end +structure=k +geometry +k 0 0 0 +end + +structure=ca +geometry +ca 0 0 0 +end + +structure=sc +geometry +sc 0 0 0 +end + +structure=ti +geometry +ti 0 0 0 +end + +structure=v +geometry +v 0 0 0 +end + +structure=cr +geometry +cr 0 0 0 +end + +structure=mn +geometry +mn 0 0 0 +end + +structure=fe +geometry +fe 0 0 0 +end + +structure=co +geometry +co 0 0 0 +end + +structure=ni +geometry +ni 0 0 0 +end + +structure=cu +geometry +cu 0 0 0 +end + +structure=zn +geometry +zn 0 0 0 +end + +structure=ga +geometry +ga 0 0 0 +end + +structure=ge +geometry +ge 0 0 0 +end + +structure=as +geometry +as 0 0 0 +end + +structure=se +geometry +se 0 0 0 +end + +structure=br +geometry +br 0 0 0 +end + +structure=kr +geometry +kr 0 0 0 +end + +structure=rb +geometry +rb 0 0 0 +end + +structure=sr +geometry +sr 0 0 0 +end + +structure=y +geometry +y 0 0 0 +end + +structure=zr +geometry +zr 0 0 0 +end + +structure=nb +geometry +nb 0 0 0 +end + +structure=mo +geometry +mo 0 0 0 +end + +structure=tc +geometry +tc 0 0 0 +end + +structure=ru +geometry +ru 0 0 0 +end + +structure=rh +geometry +rh 0 0 0 +end + +structure=pd +geometry +pd 0 0 0 +end + +structure=ag +geometry +ag 0 0 0 +end + +structure=cd +geometry +cd 0 0 0 +end + +structure=in +geometry +in 0 0 0 +end + +structure=sn +geometry +sn 0 0 0 +end + +structure=sb +geometry +sb 0 0 0 +end + +structure=te +geometry +te 0 0 0 +end + +structure=i +geometry +i 0 0 0 +end + +structure=xe +geometry +xe 0 0 0 +end + structure=ch4 structure=methane geometry @@ -47,64 +302,64 @@ end structure=water2 geometry units angs - H -1.958940 -0.032063 0.725554 - H -0.607485 0.010955 0.056172 - O -1.538963 0.004548 -0.117331 - H 1.727607 0.762122 -0.351887 - H 1.704312 -0.747744 -0.399151 - O 1.430776 -0.003706 0.113495 + h -1.958940 -0.032063 0.725554 + h -0.607485 0.010955 0.056172 + o -1.538963 0.004548 -0.117331 + h 1.727607 0.762122 -0.351887 + h 1.704312 -0.747744 -0.399151 + o 1.430776 -0.003706 0.113495 end structure=water3 geometry units angs - O -0.167787 1.645761 0.108747 - H 0.613411 1.102620 0.113724 - H -0.093821 2.209720 -0.643619 - O 1.517569 -0.667424 -0.080674 - H 1.989645 -1.098799 0.612047 - H 0.668397 -1.091798 -0.139744 - O -1.350388 -0.964879 -0.092208 - H -1.908991 -1.211298 0.626207 - H -1.263787 -0.018107 -0.055536 + o -0.167787 1.645761 0.108747 + h 0.613411 1.102620 0.113724 + h -0.093821 2.209720 -0.643619 + o 1.517569 -0.667424 -0.080674 + h 1.989645 -1.098799 0.612047 + h 0.668397 -1.091798 -0.139744 + o -1.350388 -0.964879 -0.092208 + h -1.908991 -1.211298 0.626207 + h -1.263787 -0.018107 -0.055536 end structure=water4 geometry units angs - O 0.216486 -1.989005 0.035297 - H -0.603911 -1.505274 -0.033552 - H 0.138672 -2.535875 0.799566 - H 1.505276 -0.603920 0.033505 - O 1.989004 0.216483 -0.035296 - H 2.535922 0.138690 -0.799534 - O -1.989001 -0.216487 -0.035297 - H -2.535947 -0.138688 -0.799513 - H -1.505273 0.603920 0.033493 - O -0.216485 1.989007 0.035294 - H -0.138694 2.535879 0.799565 - H 0.603919 1.505277 -0.033513 + o 0.216486 -1.989005 0.035297 + h -0.603911 -1.505274 -0.033552 + h 0.138672 -2.535875 0.799566 + h 1.505276 -0.603920 0.033505 + o 1.989004 0.216483 -0.035296 + h 2.535922 0.138690 -0.799534 + o -1.989001 -0.216487 -0.035297 + h -2.535947 -0.138688 -0.799513 + h -1.505273 0.603920 0.033493 + o -0.216485 1.989007 0.035294 + h -0.138694 2.535879 0.799565 + h 0.603919 1.505277 -0.033513 end structure=water5 geometry units angs - O -0.571270 2.322980 -0.003174 - O 2.038411 1.261129 -0.102281 - O 1.831197 -1.536089 0.156570 - O -0.890568 -2.217987 -0.100067 - O -2.398873 0.159801 -0.005022 - H -0.541626 2.994645 0.657473 - H 2.545757 1.390343 -0.886606 - H 2.127985 -1.971116 0.938635 - H -1.172378 -2.646489 -0.891417 - H -3.019733 0.318743 0.686131 - H 0.319714 1.986524 -0.080413 - H 2.008500 0.316696 0.040400 - H 0.922213 -1.803155 0.031130 - H -1.429035 -1.432872 -0.018620 - H -1.832579 0.928012 -0.044919 + o -0.571270 2.322980 -0.003174 + o 2.038411 1.261129 -0.102281 + o 1.831197 -1.536089 0.156570 + o -0.890568 -2.217987 -0.100067 + o -2.398873 0.159801 -0.005022 + h -0.541626 2.994645 0.657473 + h 2.545757 1.390343 -0.886606 + h 2.127985 -1.971116 0.938635 + h -1.172378 -2.646489 -0.891417 + h -3.019733 0.318743 0.686131 + h 0.319714 1.986524 -0.080413 + h 2.008500 0.316696 0.040400 + h 0.922213 -1.803155 0.031130 + h -1.429035 -1.432872 -0.018620 + h -1.832579 0.928012 -0.044919 end From 9a544ae6a3853281c886ac77d8fe925b7c4aab40 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Mon, 5 Sep 2022 14:01:52 -0400 Subject: [PATCH 0236/1312] added new line in print statement --- src/apps/moldft/moldft.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/moldft/moldft.cc b/src/apps/moldft/moldft.cc index 7c951da3a99..cd96d559cff 100644 --- a/src/apps/moldft/moldft.cc +++ b/src/apps/moldft/moldft.cc @@ -156,7 +156,7 @@ int main(int argc, char **argv) { MolecularEnergy E(world, calc); double energy = E.value(calc.molecule.get_all_coords().flat()); // ugh! if ((world.rank() == 0) and (calc.param.print_level() > 0)) - printf("final energy=%16.8f ", energy); + printf("final energy=%16.8f \n", energy); E.output_calc_info_schema(); functionT rho = calc.make_density(world, calc.aocc, calc.amo); From 5db53b618fa6286f75bef38ec5eb3063d4db1d1c Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Mon, 5 Sep 2022 20:32:17 -0400 Subject: [PATCH 0237/1312] side effects and assert don't mix since assertions are disabled with optimization --- src/madness/mra/derivative.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/madness/mra/derivative.h b/src/madness/mra/derivative.h index 3c877e5f58f..bf00cf959f8 100644 --- a/src/madness/mra/derivative.h +++ b/src/madness/mra/derivative.h @@ -659,23 +659,23 @@ namespace madness { if (m == this->k) { for (int i=0; i> rp_bsp(i,j)); + MADNESS_CHECK(f >> rp_bsp(i,j)); for (int i=0; i> r0_bsp(i,j)); + MADNESS_CHECK(f >> r0_bsp(i,j)); for (int i=0; i> rm_bsp(i,j)); + MADNESS_CHECK(f >> rm_bsp(i,j)); found = true; break; } else { double junk; for (int i=0; i<3*m*m; i++) - MADNESS_ASSERT(f >> junk); + MADNESS_CHECK(f >> junk); } } - MADNESS_ASSERT(found); + MADNESS_CHECK(found); Tensor r0_bsp_t = transpose(r0_bsp); Tensor rp_bsp_t = transpose(rp_bsp); Tensor rm_bsp_t = transpose(rm_bsp); @@ -734,8 +734,8 @@ namespace madness { int k = FunctionDefaults::get_k()) { std::vector< std::shared_ptr< Derivative > > r(NDIM); for (std::size_t d=0; d(world,d,bc,Function(),Function(),k)); } return r; From e5e23a03d33734f4d8d65644786c383521deaa58 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Mon, 5 Sep 2022 23:11:09 -0400 Subject: [PATCH 0238/1312] Molecule eprec handling fixes - Molecule::update_rcut_with_eprec changes eprec, as it did before https://github.com/m-a-d-n-e-s-s/madness/commit/ae801e24ca5426d82e66de085438b3ddd1bda2b2#r82992324 - added Molecule ctor that obviates the need for Molecule::update_rcut_with_eprec --- src/madness/chem/molecule.cc | 11 +++++++---- src/madness/chem/molecule.h | 4 ++++ src/madness/chem/test_SCFOperators.cc | 1 - 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/madness/chem/molecule.cc b/src/madness/chem/molecule.cc index 83296098deb..dd3f9194835 100644 --- a/src/madness/chem/molecule.cc +++ b/src/madness/chem/molecule.cc @@ -79,6 +79,9 @@ std::ostream& operator<<(std::ostream& s, const Atom& atom) { return s; } +Molecule::Molecule(std::vector atoms, double eprec, CorePotentialManager core_poт, madness::Tensor field) : atoms(std::move(atoms)), core_pot(std::move(core_pot)), field(std::move(field)) { + this->update_rcut_with_eprec(eprec); +} Molecule::Molecule(World& world, const commandlineparser& parser) :parameters(world,parser), atoms(), rcut(), core_pot(), field(3L) { @@ -325,7 +328,7 @@ void Molecule::read_xyz(const std::string filename) { //version without pseudo-atoms void Molecule::add_atom(double x, double y, double z, double q, int atomic_number) { atoms.push_back(Atom(x,y,z,q,atomic_number)); - double c = smoothing_parameter(q, parameters.eprec()); // eprec is error per atom + double c = smoothing_parameter(q, get_eprec()); // eprec is error per atom //printf("smoothing param %.6f\n", c); double radius = get_atomic_data(atomic_number).covalent_radius;//Jacob added atomic_radii.push_back(radius*1e-10/madness::constants::atomic_unit_of_length);// Jacob added @@ -335,7 +338,7 @@ void Molecule::add_atom(double x, double y, double z, double q, int atomic_numbe //version specifying pseudo-atoms void Molecule::add_atom(double x, double y, double z, double q, int atomic_number, bool pseudo_atom) { atoms.push_back(Atom(x,y,z,q,atomic_number,pseudo_atom)); - double c = smoothing_parameter(q, parameters.eprec()); // eprec is error per atom + double c = smoothing_parameter(q, get_eprec()); // eprec is error per atom //printf("smoothing param %.6f\n", c); double radius = get_atomic_data(atomic_number).covalent_radius;//Jacob added atomic_radii.push_back(radius*1e-10/madness::constants::atomic_unit_of_length);// Jacob added @@ -407,7 +410,7 @@ void Molecule::set_all_coords(const madness::Tensor& c) { /// updates rcuts with given eprec void Molecule::update_rcut_with_eprec(double value) { -// eprec = value; + if (value != get_eprec()) parameters.set_user_defined_value("eprec",value); for (size_t i=0; i atoms, double eprec, CorePotentialManager core_pot = {}, madness::Tensor field = madness::Tensor(3L)); + + /// makes a molecule using contents of \p parser Molecule(World& world, const commandlineparser& parser); void get_structure(); diff --git a/src/madness/chem/test_SCFOperators.cc b/src/madness/chem/test_SCFOperators.cc index 87be4871d85..9365bcebb50 100644 --- a/src/madness/chem/test_SCFOperators.cc +++ b/src/madness/chem/test_SCFOperators.cc @@ -704,7 +704,6 @@ int dnuclear_anchor_test(World& world) { parser.set_keyval("input",test_input.filename()); SCF calc(world,parser); calc.molecule.update_rcut_with_eprec(thresh*0.1); - calc.molecule.parameters.set_user_defined_value("eprec",thresh*0.1); calc.make_nuclear_potential(world); // derivative of atom wrt axis From da56da6c9320a55a064b793b81741a72fdfdf2a2 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Mon, 5 Sep 2022 23:12:58 -0400 Subject: [PATCH 0239/1312] fixup: replace #pragma GCC uses with MADNESS_PRAGMA_GCC pragmas --- src/madness/mra/key.h | 6 +++--- src/madness/tensor/tensor.h | 12 ++++++------ src/madness/world/vector.h | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/madness/mra/key.h b/src/madness/mra/key.h index 1e1847b3a51..368f34e7a88 100644 --- a/src/madness/mra/key.h +++ b/src/madness/mra/key.h @@ -275,12 +275,12 @@ namespace madness { for (int i=0; i(LDIM); ++i) { l1[i]=l[i]; } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Waggressive-loop-optimizations" +MADNESS_PRAGMA_GCC(diagnostic push) +MADNESS_PRAGMA_GCC(diagnostic ignored "-Waggressive-loop-optimizations") for (size_t i=LDIM; i(n,l1); key2=Key(n,l2); diff --git a/src/madness/tensor/tensor.h b/src/madness/tensor/tensor.h index 5b05a141112..a47524d5b2b 100644 --- a/src/madness/tensor/tensor.h +++ b/src/madness/tensor/tensor.h @@ -365,12 +365,12 @@ namespace madness { } catch (...) { // Ideally use if constexpr here but want headers C++14 for cuda compatibility -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Warray-bounds" +MADNESS_PRAGMA_GCC(diagnostic push) +MADNESS_PRAGMA_GCC(diagnostic ignored "-Warray-bounds") std::printf("new failed nd=%ld type=%ld size=%ld\n", nd, id(), _size); std::printf(" %ld %ld %ld %ld %ld %ld\n", d[0], d[1], d[2], d[3], d[4], d[5]); -#pragma GCC diagnostic pop +MADNESS_PRAGMA_GCC(diagnostic pop) TENSOR_EXCEPTION("new failed",_size,this); } //std::printf("allocated %p [%ld] %ld\n", _p, size, p.use_count()); @@ -443,13 +443,13 @@ namespace madness { _shptr = t._shptr; _size = t._size; _ndim = t._ndim; -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +MADNESS_PRAGMA_GCC(diagnostic push) +MADNESS_PRAGMA_GCC(diagnostic ignored "-Wmaybe-uninitialized") for (int i=0; i& other) { -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wuninitialized" -#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +MADNESS_PRAGMA_GCC(diagnostic push) +MADNESS_PRAGMA_GCC(diagnostic ignored "-Wuninitialized") +MADNESS_PRAGMA_GCC(diagnostic ignored "-Wmaybe-uninitialized") data_ = other.data_; -#pragma GCC diagnostic pop +MADNESS_PRAGMA_GCC(diagnostic pop) } /// Copy constructor is deep (because \c Vector is POD). From 0737d10db7d497e1e33bb778e099eabc73973520 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Mon, 5 Sep 2022 23:13:10 -0400 Subject: [PATCH 0240/1312] typos --- src/madness/mra/mra.h | 2 +- src/madness/world/worldref.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/madness/mra/mra.h b/src/madness/mra/mra.h index abc8a56ea2a..9fab680c1d6 100644 --- a/src/madness/mra/mra.h +++ b/src/madness/mra/mra.h @@ -568,7 +568,7 @@ namespace madness { } - /// Sets the vaule of the truncation threshold. Optional global fence. + /// Sets the value of the truncation threshold. Optional global fence. /// A fence is required to ensure consistent global state. void set_thresh(double value, bool fence = true) { diff --git a/src/madness/world/worldref.h b/src/madness/world/worldref.h index 4a31bf8c7d2..7b23f54bbc5 100644 --- a/src/madness/world/worldref.h +++ b/src/madness/world/worldref.h @@ -499,7 +499,7 @@ namespace madness { return pointer_; } - /// Reference shared_ptr accssor + /// Reference shared_ptr accessor /// \return A const reference to the references shared pointer /// \throw MadnessException If the pointer is not local From 287b4186300ac539ce2b8a636d621f29a3e73223 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 08:49:55 -0400 Subject: [PATCH 0241/1312] scf_data --- src/apps/molresponse/ExcitedResponse.cpp | 145 ++--- src/madness/chem/SCF.cc | 654 ++++++++++++----------- src/madness/chem/SCF.h | 33 +- 3 files changed, 457 insertions(+), 375 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index ca6c08e2723..d5f75db9345 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -93,6 +93,7 @@ void ExcitedResponse::initialize(World &world) { trial.clear(); // Initial guess for y are zero functions } + // Creates random guess functions semi-intelligently(?) /// & creates random guesses for nu /// \param world @@ -243,6 +244,7 @@ X_space ExcitedResponse::make_nwchem_trial(World &world, size_t m) const { return trial; } + // Returns initial guess functions as // ground MO * solid harmonics X_space ExcitedResponse::create_trial_functions(World &world, size_t k) const { @@ -390,6 +392,7 @@ X_space ExcitedResponse::create_trial_functions2(World &world) const { // Done return trials; } + // Simplified iterate scheme for guesses void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { // Variables needed to iterate @@ -469,11 +472,13 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { // Ensure right number of omegas if (size_t(omega.dim(0)) != Ni) { - if (world.rank() == 0) - print("\n Adding", Ni - omega.dim(0), + auto Ni_d = Ni - omega.dim(0); + if (world.rank() == 0) { + print("\n Adding", Ni_d, "eigenvalue(s) (counters subspace size " "reduction in " "diagonalizatoin)."); + } Tensor temp(Ni); temp(Slice(0, omega.dim(0) - 1)) = omega; for (size_t i = omega.dim(0); i < Ni; i++) temp[i] = 2.5 * i; @@ -493,7 +498,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { x_shifts = create_shift(world, ground_energies, omega, "x"); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space E0X(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); @@ -503,7 +508,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { } world.gop.fence(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if ( r_params.print_level() >= 1) { molresponse::end_timer(world, "E0mDX", "E0mDX", iter_timing); } X_space theta_X = X_space(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); @@ -515,18 +520,27 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { theta_X.X = theta_X.X * -2; theta_X.X.truncate_rf(); + print("BARRIER before create BSH"); + world.mpi.Barrier(); // Construct BSH operators auto bsh_x_operators = create_bsh_operators(world, x_shifts, ground_energies, omega, r_params.lo(), FunctionDefaults<3>::get_thresh()); + print("BARRIER before apply BSH"); + world.mpi.Barrier(); // Apply BSH and get updated components if (r_params.print_level() >= 1) molresponse::start_timer(world); bsh_resp = apply(world, bsh_x_operators, theta_X.X); if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply BSH:"); // Project out ground state - for (size_t i = 0; i < Ni; i++) bsh_resp[i] = projector(bsh_resp[i]); + //for (size_t i = 0; i < Ni; i++) bsh_resp[i] = projector(bsh_resp[i]); + + for (auto &bsh_i: bsh_resp.x) { + bsh_i = projector(bsh_i); + + } // Save new components guesses.X = bsh_resp; // Apply mask @@ -557,7 +571,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { } } }// Done with iterate gues - // Simplified iterate scheme for guesses +// Simplified iterate scheme for guesses /** * @brief Diagonalize AX=SX frequencies @@ -678,6 +692,7 @@ void ExcitedResponse::deflateFull(World &world, X_space &Chi, X_space &old_Chi, old_Lambda_X = Lambda_X.copy(); } } + std::tuple, X_space, X_space, X_space, X_space> ExcitedResponse::rotate_excited_space(World &world, X_space &chi, X_space &lchi, X_space &v_chi, X_space &gamma_chi) { @@ -830,7 +845,7 @@ std::pair, Tensor> ExcitedResponse::excited_eig( print("size_l: ", size_l); print("size_s: ", size_s); print("NUMZERO: ", num_zero); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "reduce subspace", "subspace_reduce", iter_timing); } if (r_params.print_level() >= 1) molresponse::start_timer(world); @@ -931,13 +946,14 @@ std::pair, Tensor> ExcitedResponse::excited_eig( Tensor selected = sort_eigenvalues(world, new_omega, U); // End timer - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "diagonalize response matrix", "diagonalize_response_matrix", iter_timing); } return {new_omega, U}; } + void ExcitedResponse::augment(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, X_space &last_Lambda_X, Tensor &S, Tensor &A, Tensor &old_S, Tensor &old_A, size_t print_level) { @@ -1148,12 +1164,14 @@ std::tuple ExcitedResponse::rotate_excited_v auto rotated_gamma_chi = transform(world, gamma_chi, U); - if (world.rank() == 0 and r_params.print_level() >= 10) { + if (r_params.print_level() >= 10) { Tensor S; S = response_space_inner(rotated_chi.X, rotated_chi.X) - response_space_inner(rotated_chi.Y, rotated_chi.Y); - print("\n After apply transform Overlap Matrix:"); - print(S); + if (world.rank() == 0) { + print("\n After apply transform Overlap Matrix:"); + print(S); + } } @@ -1165,6 +1183,7 @@ std::tuple ExcitedResponse::rotate_excited_v return {rotated_chi, rotated_l_chi, rotated_v_chi, rotated_gamma_chi}; } + Tensor ExcitedResponse::diagonalizeFullResponseMatrix( World &world, X_space &Chi, X_space &Lambda_X, Tensor &omega, Tensor &S, Tensor &A, const double thresh, size_t print_level) { @@ -1411,6 +1430,7 @@ compared to 2/3 way unrolling (though not by much). return U; } + Tensor ExcitedResponse::diagonalizeFockMatrix(World &world, X_space &Chi, X_space &Lambda_X, Tensor &evals, Tensor &A, Tensor &S, @@ -1450,6 +1470,7 @@ Tensor ExcitedResponse::diagonalizeFockMatrix(World &world, X_space &Chi return U; } + Tensor ExcitedResponse::get_fock_transformation(World &world, Tensor &overlap, Tensor &fock, Tensor &evals, const double thresh_degenerate) const { @@ -1587,6 +1608,7 @@ Tensor ExcitedResponse::get_fock_transformation(World &world, Tensor ExcitedResponse::sort_eigenvalues(World &world, Tensor &vals, Tensor &vecs) const { // Get relevant sizes @@ -1625,6 +1647,7 @@ Tensor ExcitedResponse::sort_eigenvalues(World &world, Tensor &vals // Done return selected; } + Tensor ExcitedResponse::create_shift(World &world, const Tensor &ground, const Tensor &omega, std::string xy) const { // Start a timer @@ -1667,6 +1690,7 @@ Tensor ExcitedResponse::create_shift(World &world, const Tensor // Done return result; } + response_space ExcitedResponse::apply_shift(World &world, const Tensor &shifts, const response_space &V, const response_space &f) { // Start timer @@ -1693,6 +1717,7 @@ response_space ExcitedResponse::apply_shift(World &world, const Tensor & // Done return shifted_V; } + std::vector>> ExcitedResponse::create_bsh_operators(World &world, const Tensor &shift, const Tensor &ground, const Tensor &omega, @@ -1731,6 +1756,7 @@ ExcitedResponse::create_bsh_operators(World &world, const Tensor &shift, // Done return operators; } + void ExcitedResponse::excited_to_json(json &j_mol_in, size_t iter, const Tensor &omega) { json j = {}; @@ -1741,6 +1767,7 @@ void ExcitedResponse::excited_to_json(json &j_mol_in, size_t iter, const Tensor< auto index = j_mol_in["protocol_data"].size() - 1; j_mol_in["protocol_data"][index]["property_data"].push_back(j); } + void ExcitedResponse::iterate(World &world) { size_t iter; QProjector projector(world, ground_orbitals); @@ -1838,14 +1865,6 @@ void ExcitedResponse::iterate(World &world) { if (world.rank() == 0) print(" -------------------------------"); } - if (r_params.print_level() >= 1) { - if (world.rank() == 0) { - print("Chi.x norms at start of iteration: ", iter); - print(Chi.X.norm2()); - print("Chi.y norms at start of iteration ", iter); - print(Chi.Y.norm2()); - } - } print("Excited State Frequencies "); print(omega); @@ -1941,28 +1960,28 @@ void ExcitedResponse::iterate(World &world) { world, Chi, xc, projector, kain_x_space, Xvector, Xresidual, iter, max_rotation); - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, old_chi); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make_density_old", "make_density_old", iter_timing); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega = make_density(world, new_chi); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make_density_new", "make_density_new", iter_timing); } - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bsh_residualsX = copy(new_res.residual_norms); bsh_residualsY = copy(new_res.residual_norms); omega = copy(new_omega); Chi = new_chi.copy(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } xij_res_norms = new_res.residual.component_norm2s(); - xij_norms=Chi.component_norm2s(); + xij_norms = Chi.component_norm2s(); density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); /* @@ -1986,7 +2005,7 @@ void ExcitedResponse::iterate(World &world) { // Basic output - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "Iteration Timing", "iter_total", iter_timing); } time_data.add_data(iter_timing); @@ -2022,13 +2041,6 @@ void ExcitedResponse::iterate(World &world) { print(bsh_residualsY); print(" Final density residuals:"); print(density_residuals); - - print(" Final X-state response function residuals:"); - print(Chi.X.norm2()); - if (not r_params.tda()) { - if (world.rank() == 0) print(" Final y-state response function residuals:"); - if (world.rank() == 0) print(Chi.Y.norm2()); - } } /* @@ -2053,7 +2065,7 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & QProjector &projector, NonLinearXsolver &kain_x_space, vector &Xvector, vector &Xresidual, size_t iter, const double &maxrotn) - -> std::tuple, X_space, X_space, residuals> { +-> std::tuple, X_space, X_space, residuals> { size_t m = Chi.num_states(); bool compute_y = not r_params.tda(); @@ -2088,7 +2100,7 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & //X_space theta_X = compute_theta_X(world, rotated_chi, xc, r_params.calc_type()); - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space rotated_EOX(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); if (r_params.localize() != "canon") { rotated_EOX = rotated_chi.copy(); @@ -2100,15 +2112,15 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & } } world.gop.fence(); - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "E0mDX", "E0mDX", iter_timing); } X_space theta_X = X_space(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); - if (world.rank() == 0 && r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } theta_X = rotated_v_x - rotated_EOX + rotated_gamma_x; - if (world.rank() == 0 && r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); } print("BSH update iter = ", iter); @@ -2134,8 +2146,9 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & return {new_omega, rotated_chi, new_chi, {new_res, bsh}}; } + auto ExcitedResponse::bsh_update_excited(World &world, const Tensor &omega, - X_space &theta_X, QProjector &projector) -> X_space { + X_space &theta_X, QProjector &projector) -> X_space { size_t m = theta_X.num_states(); size_t n = theta_X.num_orbitals(); bool compute_y = !r_params.tda(); @@ -2198,6 +2211,7 @@ auto ExcitedResponse::bsh_update_excited(World &world, const Tensor &ome return bsh_X; } + void ExcitedResponse::analysis(World &world, const X_space &chi) { // Sizes get used a lot here, so lets get a local copy size_t n = chi.X[0].size(); @@ -2384,17 +2398,17 @@ void ExcitedResponse::save(World &world, const std::string &name) { // (for i from 0 to m-1 ) // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω + ar & r_params.archive(); + ar & r_params.tda(); + ar & r_params.num_orbitals(); + ar & r_params.num_states(); + ar & omega; for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; } } @@ -2418,24 +2432,25 @@ void ExcitedResponse::load(World &world, const std::string &name) { // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω + ar & r_params.archive(); + ar & r_params.tda(); + ar & r_params.num_orbitals(); + ar & r_params.num_states(); + ar & omega; Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; world.gop.fence(); if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; world.gop.fence(); } } + /** * Create Virtual Space Excited State Guess from atomic orbitals * @param world @@ -2443,12 +2458,11 @@ void ExcitedResponse::load(World &world, const std::string &name) { */ X_space ExcitedResponse::create_virtual_ao_guess(World &world) const { - print("thresh : ", FunctionDefaults<3>::get_thresh()); - print("k : ", FunctionDefaults<3>::get_k()); auto phi_0 = copy(world, ground_orbitals); - print("Ground Orbital norms: ", norm2s_T(world, phi_0)); auto ao_basis_set = AtomicBasisSet{"aug-cc-pvdz"}; - ao_basis_set.print(molecule); + if (world.rank() == 0) { + ao_basis_set.print(molecule); + } vecfuncT ao_vec = vecfuncT(ao_basis_set.nbf(molecule)); @@ -2458,26 +2472,16 @@ X_space ExcitedResponse::create_virtual_ao_guess(World &world) const { ao_vec[i] = factoryT(world).functor(aofunc); } world.gop.fence(); - print("number of ao_basis_functions: ", ao_vec.size()); - - madness::print("norm of ao basis functions: ", norm2s_T(world, ao_vec)); QProjector projector(world, phi_0); // project ground_state from each atomic orbital basis std::transform(ao_vec.begin(), ao_vec.end(), ao_vec.begin(), [&](auto &f) { return projector(f); }); - print("overlap between phi0: ", matrix_inner(world, phi_0, ao_vec)); - madness::print("norm of ao basis after projection: ", norm2s_T(world, ao_vec)); - print("number of ao_basis_functions: ", ao_vec.size()); auto overlap_S = matrix_inner(world, ao_vec, ao_vec); - print("Overlap S : \n", overlap_S); Tensor U, sigma, VT; //S=U*sigma*VT svd(overlap_S, U, sigma, VT); - print("singular values of overlap: \n", sigma); - print("left singular vectors of overlap:\n", U); - print("right singular vectors of overlap:\n", VT); auto first_small = std::find_if(sigma.ptr(), sigma.ptr() + sigma.size(), [](auto num) { return num < .05; }); @@ -2488,7 +2492,6 @@ X_space ExcitedResponse::create_virtual_ao_guess(World &world) const { // remove small singular vectors here auto overlap_SU = matrix_inner(world, xao, xao); - print("Overlap S after transform : \n", overlap_SU); // copy pao to xao response space vector @@ -2562,7 +2565,6 @@ X_space ExcitedResponse::create_virtual_ao_guess(World &world) const { print("ground_orb energies : \n", ground_energies); print("homo energy : \n", e_homo); print("virtual orbital energies : \n", e_a); - print("norm of virtual ", norm2s_T(world, phi_a)); } e_a = e_a.flat(); @@ -2578,8 +2580,6 @@ X_space ExcitedResponse::create_virtual_ao_guess(World &world) const { phi_a = virtual_phi; e_a = virtual_e; - print("virtual orbital energies after clean up : \n", e_a); - print("norm of virtual after clean up ", norm2s_T(world, phi_a)); auto t = phi_a.size() * r_params.num_orbitals(); @@ -2598,6 +2598,7 @@ X_space ExcitedResponse::create_virtual_ao_guess(World &world) const { world.gop.fence(); return x_guess; } + /** * Create Virtual Space Excited State Guess from atomic orbitals * @param world diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 0bd25086f6f..91a408e42ae 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -70,75 +70,150 @@ namespace madness { // bool sym=false) -template -static void verify_tree(World& world, const std::vector >& v) { - for (unsigned int i = 0; i < v.size(); i++) { - v[i].verify_tree(); + template + static void verify_tree(World &world, const std::vector > &v) { + for (unsigned int i = 0; i < v.size(); i++) { + v[i].verify_tree(); + } } -} -template -struct unaryexp { - void operator()(const Key& key, Tensor& t) const { - //vzExp(t.size, t.ptr(), t.ptr()); - UNARY_OPTIMIZED_ITERATOR(double_complex, t, *_p0 = exp(*_p0);); - } + template + struct unaryexp { + void operator()(const Key &key, Tensor &t) const { + //vzExp(t.size, t.ptr(), t.ptr()); + UNARY_OPTIMIZED_ITERATOR(double_complex, t, *_p0 = exp(*_p0);); + } - template - void serialize(Archive& ar) {} -}; + template + void serialize(Archive &ar) {} + }; -static double rsquared(const coordT& r) { - return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; -} + static double rsquared(const coordT &r) { + return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; + } // Returns exp(-I*t*V) -static Function make_exp(double t, const Function& v) { - v.reconstruct(); - Function expV = double_complex(0.0, -t) * v; - expV.unaryop(unaryexp<3>()); - //expV.truncate(); expV.reconstruct(); - return expV; -} + static Function make_exp(double t, const Function &v) { + v.reconstruct(); + Function expV = double_complex(0.0, -t) * v; + expV.unaryop(unaryexp<3>()); + //expV.truncate(); expV.reconstruct(); + return expV; + } // Timer modified to correctly nest -static bool print_timings = false; -static std::vector ttt, sss; + static bool print_timings = false; + static std::vector ttt, sss; -static void START_TIMER(World& world) { - world.gop.fence(); - ttt.push_back(wall_time()); - sss.push_back(cpu_time()); + static void START_TIMER(World &world) { + world.gop.fence(); + ttt.push_back(wall_time()); + sss.push_back(cpu_time()); + } + + static double pop(std::vector &v) { + MADNESS_ASSERT(v.size()); + double x = v.back(); + v.pop_back(); + return x; + } + + static void END_TIMER(World &world, const char *msg) { + double wall = wall_time() - pop(ttt), cpu = cpu_time() - pop(sss); + if (world.rank() == 0 and print_timings) printf("timer: %20.20s %8.2fs %8.2fs\n", msg, cpu, wall); + } + + +/// Given overlap matrix, return rotation with 3rd order error to orthonormalize the vectors + tensorT Q3(const tensorT &s) { + tensorT Q = inner(s, s); + Q.gaxpy(0.2, s, -2.0 / 3.0); + for (int i = 0; i < s.dim(0); ++i) Q(i, i) += 1.0; + return Q.scale(15.0 / 8.0); + } + +/// Given overlap matrix, return rotation with 2nd order error to orthonormalize the vectors + tensorT Q2(const tensorT &s) { + tensorT Q = -0.5 * s; + for (int i = 0; i < s.dim(0); ++i) Q(i, i) += 1.5; + return Q; + } + +}// namespace madness + +void +SCF::output_scf_info_schema(const int &iter, const std::map &vals, const tensorT &dipole_T) const { + nlohmann::json j = {}; + j.push_back(nlohmann::json()); + // TODO (Adrian) possibly read in json from filesystem. + // if it exists figure out the size. pushback for each protocol + j[0]["scf_iterations"] = iter; + const double thresh = FunctionDefaults<3>::get_thresh(); + const int k = FunctionDefaults<3>::get_k(); + j[0]["scf_threshold"] = thresh; + j[0]["scf_k"] = k; + for (auto const &[key, val]: vals) { + j[0][key] = val; + } + j[0]["scf_dipole_moment"] = tensor_to_json(dipole_T); + int num = 0; + std::string save = param.prefix() + ".scf_info.json"; +#ifdef MADCHEM_HAS_STD_FILESYSTEM + if (std::filesystem::exists(save)) { + std::ifstream ifs(save); +#else + std::ifstream ifs(save); + if (ifs) { +#endif + nlohmann::json j_old; + ifs >> j_old; + print(j_old); + j_old.push_back(j); + j = j_old; + }; + std::ofstream ofs(save); + ofs << j; } -static double pop(std::vector& v) { - MADNESS_ASSERT(v.size()); - double x = v.back(); - v.pop_back(); - return x; +void scf_data::add_data(std::map values) { + print("ADDING DATA"); + + iter++; + std::for_each(e_data.begin(), e_data.end(), [&values](auto &v) { + print(v.first, " : ", values[v.first]); + v.second.push_back(values[v.first]); + }); } -static void END_TIMER(World& world, const char *msg) { - double wall = wall_time() - pop(ttt), cpu = cpu_time() - pop(sss); - if (world.rank() == 0 and print_timings) printf("timer: %20.20s %8.2fs %8.2fs\n", msg, cpu, wall); +scf_data::scf_data() : iter(0) { + + e_data.insert({"e_kinetic", std::vector(0)}); + e_data.insert({"e_local", std::vector(0)}); + e_data.insert({"e_nuclear", std::vector(0)}); + e_data.insert({"e_coulomb", std::vector(0)}); + e_data.insert({"e_pcm", std::vector(0)}); + e_data.insert({"e_xc", std::vector(0)}); + e_data.insert({"e_nrep", std::vector(0)}); + e_data.insert({"e_tot", std::vector(0)}); } -/// Given overlap matrix, return rotation with 3rd order error to orthonormalize the vectors -tensorT Q3(const tensorT& s) { - tensorT Q = inner(s, s); - Q.gaxpy(0.2, s, -2.0 / 3.0); - for (int i = 0; i < s.dim(0); ++i) Q(i, i) += 1.0; - return Q.scale(15.0 / 8.0); +void scf_data::to_json(json &j) { + ::print("SCF DATA TO JSON"); + + j["scf_e_data"] = json(); + j["scf_e_data"]["iterations"] = iter; + + for (const auto &e: e_data) { + //::print(e.second); + j["scf_e_data"].push_back({e.first, e.second}); + } } -/// Given overlap matrix, return rotation with 2nd order error to orthonormalize the vectors -tensorT Q2(const tensorT& s) { - tensorT Q = -0.5 * s; - for (int i = 0; i < s.dim(0); ++i) Q(i, i) += 1.5; - return Q; +void scf_data::print_data() { + for (const auto &[key, value]: e_data) { print(key, " : ", value); } } @@ -146,10 +221,10 @@ tensorT Q2(const tensorT& s) { // } /// collective constructor, reads \c input on rank 0, broadcasts to all -SCF::SCF(World& world, const commandlineparser& parser) : param(CalculationParameters(world, parser)) { +SCF::SCF(World &world, const commandlineparser &parser) : param(CalculationParameters(world, parser)) { PROFILE_MEMBER_FUNC(SCF); - molecule=Molecule(world,parser); + molecule = Molecule(world, parser); // param.read(world,parser.value("input"),"dft"); if (world.rank() == 0) { @@ -213,7 +288,7 @@ SCF::SCF(World& world, const commandlineparser& parser) : param(CalculationParam } -void SCF::copy_data(World& world, const SCF& other) { +void SCF::copy_data(World &world, const SCF &other) { aeps = copy(other.aeps); beps = copy(other.beps); aocc = copy(other.aocc); @@ -227,174 +302,174 @@ void SCF::copy_data(World& world, const SCF& other) { at_nbf = other.at_nbf; } - void SCF::save_mos(World &world) { - PROFILE_MEMBER_FUNC(SCF); - archive::ParallelOutputArchive ar(world, "restartdata", - param.get("nio")); - // IF YOU CHANGE ANYTHING HERE MAKE SURE TO UPDATE THIS VERSION NUMBER - /* - * After spin restricted - double L; - int k; - Molecule molecule; - std::string xc; - */ - unsigned int version = 3; - ar &version; - ar ¤t_energy ¶m.spin_restricted(); - ar ¶m.L() & FunctionDefaults<3>::get_k() & molecule ¶m.xc() & param.localize_method(); - // Re order so it doesn't effect orbital data - - ar &(unsigned int) (amo.size()); - ar &aeps &aocc &aset; - for (unsigned int i = 0; i < amo.size(); ++i) ar &amo[i]; - if (!param.spin_restricted()) { - ar &(unsigned int) (bmo.size()); - ar &beps &bocc &bset; - for (unsigned int i = 0; i < bmo.size(); ++i) ar &bmo[i]; - } +void SCF::save_mos(World &world) { + PROFILE_MEMBER_FUNC(SCF); + archive::ParallelOutputArchive ar(world, "restartdata", + param.get("nio")); + // IF YOU CHANGE ANYTHING HERE MAKE SURE TO UPDATE THIS VERSION NUMBER + /* + * After spin restricted + double L; + int k; + Molecule molecule; + std::string xc; + */ + unsigned int version = 3; + ar & version; + ar & current_energy & param.spin_restricted(); + ar & param.L() & FunctionDefaults<3>::get_k() & molecule & param.xc() & param.localize_method(); + // Re order so it doesn't effect orbital data + + ar & (unsigned int) (amo.size()); + ar & aeps & aocc & aset; + for (unsigned int i = 0; i < amo.size(); ++i) ar & amo[i]; + if (!param.spin_restricted()) { + ar & (unsigned int) (bmo.size()); + ar & beps & bocc & bset; + for (unsigned int i = 0; i < bmo.size(); ++i) ar & bmo[i]; + } - // Do not make a restartaodata file if nwchem orbitals used, - // as no aoamo/aobmo overlap matrix can be computed - if (param.nwfile() == "none") { - tensorT Saoamo = matrix_inner(world, ao, amo); - tensorT Saobmo = (!param.spin_restricted()) ? matrix_inner(world, ao, bmo) : tensorT(); - if (world.rank() == 0) { - archive::BinaryFstreamOutputArchive arao("restartaodata"); - arao << Saoamo << aeps << aocc << aset; - if (!param.spin_restricted()) arao << Saobmo << beps << bocc << bset; - } + // Do not make a restartaodata file if nwchem orbitals used, + // as no aoamo/aobmo overlap matrix can be computed + if (param.nwfile() == "none") { + tensorT Saoamo = matrix_inner(world, ao, amo); + tensorT Saobmo = (!param.spin_restricted()) ? matrix_inner(world, ao, bmo) : tensorT(); + if (world.rank() == 0) { + archive::BinaryFstreamOutputArchive arao("restartaodata"); + arao << Saoamo << aeps << aocc << aset; + if (!param.spin_restricted()) arao << Saobmo << beps << bocc << bset; } } +} - void SCF::load_mos(World &world) { - PROFILE_MEMBER_FUNC(SCF); - // const double trantol = vtol / std::min(30.0, double(param.nalpha)); - const double thresh = FunctionDefaults<3>::get_thresh(); - const int k = FunctionDefaults<3>::get_k(); - unsigned int nmo = 0; - bool spinrest = false; - - amo.clear(); - bmo.clear(); - - archive::ParallelInputArchive ar(world, "restartdata"); - - /* - File format: - unsigned int version; - double current energy; - bool spinrestricted --> if true only alpha orbitals are present - double L; - int k; - Molecule molecule; - std::string xc; - std::string localize; - unsigned int nmo_alpha; - Tensor aeps; - Tensor aocc; - vector aset; - for i from 0 to nalpha-1: - . Function amo[i] - repeat for beta if !spinrestricted - */ - // Local copies for a basic check - double L; - int k1; // Ignored for restarting, used in response only - unsigned int version = 3;// UPDATE THIS IF YOU CHANGE ANYTHING - unsigned int archive_version; - - ar &archive_version; - - if (archive_version != version) { - if (world.rank() == 0) - print("Loading from a different version of archive. Archive version", archive_version, - "MADNESS version", version); - throw "Invalid archive"; - } +void SCF::load_mos(World &world) { + PROFILE_MEMBER_FUNC(SCF); + // const double trantol = vtol / std::min(30.0, double(param.nalpha)); + const double thresh = FunctionDefaults<3>::get_thresh(); + const int k = FunctionDefaults<3>::get_k(); + unsigned int nmo = 0; + bool spinrest = false; + + amo.clear(); + bmo.clear(); + + archive::ParallelInputArchive ar(world, "restartdata"); + + /* + File format: + unsigned int version; + double current energy; + bool spinrestricted --> if true only alpha orbitals are present + double L; + int k; + Molecule molecule; + std::string xc; + std::string localize; + unsigned int nmo_alpha; + Tensor aeps; + Tensor aocc; + vector aset; + for i from 0 to nalpha-1: + . Function amo[i] + repeat for beta if !spinrestricted + */ + // Local copies for a basic check + double L; + int k1; // Ignored for restarting, used in response only + unsigned int version = 3;// UPDATE THIS IF YOU CHANGE ANYTHING + unsigned int archive_version; + + ar & archive_version; + + if (archive_version != version) { + if (world.rank() == 0) + print("Loading from a different version of archive. Archive version", archive_version, + "MADNESS version", version); + throw "Invalid archive"; + } - // LOTS OF LOGIC MISSING HERE TO CHANGE OCCUPATION NO., SET, - // EPS, SWAP, ... sigh - ar ¤t_energy &spinrest; - // Reorder - ar &L &k1 &molecule ¶m.xc() & param.localize_method(); - - ar &nmo; - MADNESS_ASSERT(nmo >= unsigned(param.nmo_alpha())); - ar &aeps &aocc &aset; - // Some basic checks - if (L != param.L()) { - if (world.rank() == 0) - print("Warning: Box size mismatch between archive and input parameter. " - "Archive value", - L, "Param value", param.L()); - throw "Mismatch in box sizes"; - } - if (world.rank() == 0) { - print("Restarting from this molecular geometry"); - molecule.print(); - } - amo.resize(nmo); - for (unsigned int i = 0; i < amo.size(); ++i) ar &amo[i]; - unsigned int n_core = molecule.n_core_orb_all(); - if (nmo > unsigned(param.nmo_alpha())) { - aset = vector(aset.begin() + n_core, aset.begin() + n_core + param.nmo_alpha()); - amo = vecfuncT(amo.begin() + n_core, amo.begin() + n_core + param.nmo_alpha()); - aeps = copy(aeps(Slice(n_core, n_core + param.nmo_alpha() - 1))); - aocc = copy(aocc(Slice(n_core, n_core + param.nmo_alpha() - 1))); - } + // LOTS OF LOGIC MISSING HERE TO CHANGE OCCUPATION NO., SET, + // EPS, SWAP, ... sigh + ar & current_energy & spinrest; + // Reorder + ar & L & k1 & molecule & param.xc() & param.localize_method(); + + ar & nmo; + MADNESS_ASSERT(nmo >= unsigned(param.nmo_alpha())); + ar & aeps & aocc & aset; + // Some basic checks + if (L != param.L()) { + if (world.rank() == 0) + print("Warning: Box size mismatch between archive and input parameter. " + "Archive value", + L, "Param value", param.L()); + throw "Mismatch in box sizes"; + } + if (world.rank() == 0) { + print("Restarting from this molecular geometry"); + molecule.print(); + } + amo.resize(nmo); + for (unsigned int i = 0; i < amo.size(); ++i) ar & amo[i]; + unsigned int n_core = molecule.n_core_orb_all(); + if (nmo > unsigned(param.nmo_alpha())) { + aset = vector(aset.begin() + n_core, aset.begin() + n_core + param.nmo_alpha()); + amo = vecfuncT(amo.begin() + n_core, amo.begin() + n_core + param.nmo_alpha()); + aeps = copy(aeps(Slice(n_core, n_core + param.nmo_alpha() - 1))); + aocc = copy(aocc(Slice(n_core, n_core + param.nmo_alpha() - 1))); + } - if (amo[0].k() != k) { - reconstruct(world, amo); - for (unsigned int i = 0; i < amo.size(); ++i) - amo[i] = madness::project(amo[i], k, thresh, false); - world.gop.fence(); - } - set_thresh(world, amo, thresh); - - // normalize(world, amo); - // amo = transform(world, amo, Q3(matrix_inner(world, amo, amo)), - // trantol, true); truncate(world, amo); normalize(world, amo); - - if (!param.spin_restricted()) { - if (spinrest) {// Only alpha spin orbitals were on disk - MADNESS_ASSERT(param.nmo_alpha() >= param.nmo_beta()); - bmo.resize(param.nmo_beta()); - bset.resize(param.nmo_beta()); - beps = copy(aeps(Slice(0, param.nmo_beta() - 1))); - bocc = copy(aocc(Slice(0, param.nmo_beta() - 1))); - for (int i = 0; i < param.nmo_beta(); ++i) bmo[i] = copy(amo[i]); - } else { - ar &nmo; - ar &beps &bocc &bset; + if (amo[0].k() != k) { + reconstruct(world, amo); + for (unsigned int i = 0; i < amo.size(); ++i) + amo[i] = madness::project(amo[i], k, thresh, false); + world.gop.fence(); + } + set_thresh(world, amo, thresh); - bmo.resize(nmo); - for (unsigned int i = 0; i < bmo.size(); ++i) ar &bmo[i]; + // normalize(world, amo); + // amo = transform(world, amo, Q3(matrix_inner(world, amo, amo)), + // trantol, true); truncate(world, amo); normalize(world, amo); - if (nmo > unsigned(param.nmo_beta())) { - bset = vector(bset.begin() + n_core, bset.begin() + n_core + param.nmo_beta()); - bmo = vecfuncT(bmo.begin() + n_core, bmo.begin() + n_core + param.nmo_beta()); - beps = copy(beps(Slice(n_core, n_core + param.nmo_beta() - 1))); - bocc = copy(bocc(Slice(n_core, n_core + param.nmo_beta() - 1))); - } + if (!param.spin_restricted()) { + if (spinrest) {// Only alpha spin orbitals were on disk + MADNESS_ASSERT(param.nmo_alpha() >= param.nmo_beta()); + bmo.resize(param.nmo_beta()); + bset.resize(param.nmo_beta()); + beps = copy(aeps(Slice(0, param.nmo_beta() - 1))); + bocc = copy(aocc(Slice(0, param.nmo_beta() - 1))); + for (int i = 0; i < param.nmo_beta(); ++i) bmo[i] = copy(amo[i]); + } else { + ar & nmo; + ar & beps & bocc & bset; - if (bmo[0].k() != k) { - reconstruct(world, bmo); - for (unsigned int i = 0; i < bmo.size(); ++i) - bmo[i] = madness::project(bmo[i], k, thresh, false); - world.gop.fence(); - } - set_thresh(world, amo, thresh); + bmo.resize(nmo); + for (unsigned int i = 0; i < bmo.size(); ++i) ar & bmo[i]; + + if (nmo > unsigned(param.nmo_beta())) { + bset = vector(bset.begin() + n_core, bset.begin() + n_core + param.nmo_beta()); + bmo = vecfuncT(bmo.begin() + n_core, bmo.begin() + n_core + param.nmo_beta()); + beps = copy(beps(Slice(n_core, n_core + param.nmo_beta() - 1))); + bocc = copy(bocc(Slice(n_core, n_core + param.nmo_beta() - 1))); + } - // normalize(world, bmo); - // bmo = transform(world, bmo, Q3(matrix_inner(world, bmo, - // bmo)), trantol, true); truncate(world, bmo); - // normalize(world, bmo); + if (bmo[0].k() != k) { + reconstruct(world, bmo); + for (unsigned int i = 0; i < bmo.size(); ++i) + bmo[i] = madness::project(bmo[i], k, thresh, false); + world.gop.fence(); } + set_thresh(world, amo, thresh); + + // normalize(world, bmo); + // bmo = transform(world, bmo, Q3(matrix_inner(world, bmo, + // bmo)), trantol, true); truncate(world, bmo); + // normalize(world, bmo); } } +} -void SCF::do_plots(World& world) { +void SCF::do_plots(World &world) { PROFILE_MEMBER_FUNC(SCF); START_TIMER(world); @@ -440,7 +515,7 @@ void SCF::do_plots(World& world) { END_TIMER(world, "plotting"); } -void SCF::project(World& world) { +void SCF::project(World &world) { PROFILE_MEMBER_FUNC(SCF); reconstruct(world, amo); for (unsigned int i = 0; i < amo.size(); ++i) { @@ -462,7 +537,7 @@ void SCF::project(World& world) { } } -void SCF::make_nuclear_potential(World& world) { +void SCF::make_nuclear_potential(World &world) { PROFILE_MEMBER_FUNC(SCF); START_TIMER(world); potentialmanager = std::shared_ptr& set) { +void SCF::analyze_vectors(World &world, const vecfuncT &mo, const tensorT &occ, + const tensorT &energy, const std::vector &set) { START_TIMER(world); PROFILE_MEMBER_FUNC(SCF); tensorT Saomo = matrix_inner(world, ao, mo); @@ -555,7 +630,7 @@ void SCF::analyze_vectors(World& world, const vecfuncT& mo, const tensorT& occ, } // this version is faster than the previous version on BG/Q -distmatT SCF::kinetic_energy_matrix(World& world, const vecfuncT& v) const { +distmatT SCF::kinetic_energy_matrix(World &world, const vecfuncT &v) const { PROFILE_MEMBER_FUNC(SCF); int n = v.size(); distmatT r = column_distributed_matrix(world, n, n); @@ -585,12 +660,12 @@ distmatT SCF::kinetic_energy_matrix(World& world, const vecfuncT& v) const { return r; } -bool SCF::restart_aos(World& world) { +bool SCF::restart_aos(World &world) { tensorT Saoamo, Saobmo; bool OK = true; if (world.rank() == 0) { try { - archive::BinaryFstreamInputArchive arao(param.prefix()+".restartaodata"); + archive::BinaryFstreamInputArchive arao(param.prefix() + ".restartaodata"); arao >> Saoamo >> aeps >> aocc >> aset; if (Saoamo.dim(0) != int(ao.size()) || Saoamo.dim(1) != param.nmo_alpha()) { print(" AO alpha restart data size mismatch --- starting from atomic guess instead", Saoamo.dim(0), @@ -637,7 +712,7 @@ bool SCF::restart_aos(World& world) { return true; } -void SCF::initial_guess(World& world) { +void SCF::initial_guess(World &world) { PROFILE_MEMBER_FUNC(SCF); START_TIMER(world); if (param.restart()) { @@ -924,7 +999,7 @@ void SCF::initial_guess(World& world) { // Get center of charge for madness std::vector mad_coc(3, 0); for (int i = 0; i < molecule.natom(); ++i) { - const Atom& atom = molecule.get_atom(i); + const Atom &atom = molecule.get_atom(i); int charge = atom.atomic_number; mad_coc[0] += atom.x * charge; mad_coc[1] += atom.y * charge; @@ -952,7 +1027,7 @@ void SCF::initial_guess(World& world) { nw_coords(i, 2) = nwchem.atoms[i].position[2]; nw_coords(i, 3) = symbol_to_atomic_number(nwchem.atoms[i].symbol) * 1000.0; - const Atom& atom = molecule.get_atom(i); + const Atom &atom = molecule.get_atom(i); mad_coords(i, 0) = atom.x; mad_coords(i, 1) = atom.y; mad_coords(i, 2) = atom.z; @@ -971,7 +1046,7 @@ void SCF::initial_guess(World& world) { molecule.rotate(q(Slice(0, 2), Slice(0, 2))); if (world.rank() == 0 && param.print_level() > 3) print("New MADNESS coordinates:"); for (int i = 0; i < molecule.natom(); ++i) { - const Atom& atom = molecule.get_atom(i); + const Atom &atom = molecule.get_atom(i); if (world.rank() == 0 && param.print_level() > 3) print(atomic_number_to_symbol(atom.atomic_number), atom.x, atom.y, atom.z); } @@ -1097,8 +1172,8 @@ void SCF::initial_guess(World& world) { /// @param[in] occ occupation numbers /// @param[in] nmo number of MOs for the given spin /// @return vector of length nmo with the set index for each MO -std::vector SCF::group_orbital_sets(World& world, const tensorT& eps, - const tensorT& occ, const int nmo) const { +std::vector SCF::group_orbital_sets(World &world, const tensorT &eps, + const tensorT &occ, const int nmo) const { PROFILE_MEMBER_FUNC(SCF); std::vector set = std::vector(static_cast(nmo), 0); @@ -1122,7 +1197,7 @@ std::vector SCF::group_orbital_sets(World& world, const tensorT& eps, } -void SCF::initial_load_bal(World& world) { +void SCF::initial_load_bal(World &world) { PROFILE_MEMBER_FUNC(SCF); LoadBalanceDeux<3> lb(world); real_function_3d vnuc; @@ -1139,8 +1214,8 @@ void SCF::initial_load_bal(World& world) { FunctionDefaults<3>::redistribute(world, lb.load_balance(param.loadbalparts())); } -functionT SCF::make_density(World& world, const tensorT& occ, - const vecfuncT& v) const { +functionT SCF::make_density(World &world, const tensorT &occ, + const vecfuncT &v) const { PROFILE_MEMBER_FUNC(SCF); vecfuncT vsq = square(world, v); compress(world, vsq); @@ -1154,8 +1229,8 @@ functionT SCF::make_density(World& world, const tensorT& occ, return rho; } -functionT SCF::make_density(World& world, const tensorT& occ, - const cvecfuncT& v) { +functionT SCF::make_density(World &world, const tensorT &occ, + const cvecfuncT &v) { PROFILE_MEMBER_FUNC(SCF); reconstruct(world, v); // For max parallelism std::vector vsq(v.size()); @@ -1180,7 +1255,7 @@ functionT SCF::make_density(World& world, const tensorT& occ, return rho; } -std::vector SCF::make_bsh_operators(World& world, const tensorT& evals) const { +std::vector SCF::make_bsh_operators(World &world, const tensorT &evals) const { PROFILE_MEMBER_FUNC(SCF); int nmo = evals.dim(0); std::vector ops(nmo); @@ -1203,7 +1278,7 @@ std::vector SCF::make_bsh_operators(World& world, const tensorT& eva // Used only for initial guess that is always spin-restricted LDA -functionT SCF::make_lda_potential(World& world, const functionT& arho) { +functionT SCF::make_lda_potential(World &world, const functionT &arho) { PROFILE_MEMBER_FUNC(SCF); functionT vlda = copy(arho); vlda.reconstruct(); @@ -1211,9 +1286,9 @@ functionT SCF::make_lda_potential(World& world, const functionT& arho) { return vlda; } -vecfuncT SCF::apply_potential(World& world, const tensorT& occ, - const vecfuncT& amo, - const functionT& vlocal, double& exc, double& enl, int ispin) { +vecfuncT SCF::apply_potential(World &world, const tensorT &occ, + const vecfuncT &amo, + const functionT &vlocal, double &exc, double &enl, int ispin) { PROFILE_MEMBER_FUNC(SCF); functionT vloc = copy(vlocal); exc = 0.0; @@ -1272,7 +1347,7 @@ vecfuncT SCF::apply_potential(World& world, const tensorT& occ, return Vpsi; } -tensorT SCF::derivatives(World& world, const functionT& rho) const { +tensorT SCF::derivatives(World &world, const functionT &rho) const { PROFILE_MEMBER_FUNC(SCF); START_TIMER(world); @@ -1336,7 +1411,7 @@ tensorT SCF::derivatives(World& world, const functionT& rho) const { print( " ------ ------------ ------------ ------------ ------------ ------------ ------------"); for (size_t i = 0; i < molecule.natom(); ++i) { - const Atom& atom = molecule.get_atom(i); + const Atom &atom = molecule.get_atom(i); printf(" %5d %12.6f %12.6f %12.6f %12.6f %12.6f %12.6f\n", int(i), atom.x, atom.y, atom.z, r[i * 3 + 0], r[i * 3 + 1], r[i * 3 + 2]); @@ -1345,7 +1420,7 @@ tensorT SCF::derivatives(World& world, const functionT& rho) const { return r; } -tensorT SCF::dipole(World& world, const functionT& rho) const { +tensorT SCF::dipole(World &world, const functionT &rho) const { PROFILE_MEMBER_FUNC(SCF); START_TIMER(world); tensorT mu(3); @@ -1371,8 +1446,8 @@ tensorT SCF::dipole(World& world, const functionT& rho) const { return mu; } -void SCF::vector_stats(const std::vector& v, double& rms, - double& maxabsval) const { +void SCF::vector_stats(const std::vector &v, double &rms, + double &maxabsval) const { PROFILE_MEMBER_FUNC(SCF); rms = 0.0; maxabsval = v[0]; @@ -1383,8 +1458,8 @@ void SCF::vector_stats(const std::vector& v, double& rms, rms = sqrt(rms / v.size()); } -vecfuncT SCF::compute_residual(World& world, tensorT& occ, tensorT& fock, - const vecfuncT& psi, vecfuncT& Vpsi, double& err) { +vecfuncT SCF::compute_residual(World &world, tensorT &occ, tensorT &fock, + const vecfuncT &psi, vecfuncT &Vpsi, double &err) { START_TIMER(world); PROFILE_MEMBER_FUNC(SCF); @@ -1438,8 +1513,8 @@ vecfuncT SCF::compute_residual(World& world, tensorT& occ, tensorT& fock, return r; } -tensorT SCF::make_fock_matrix(World& world, const vecfuncT& psi, - const vecfuncT& Vpsi, const tensorT& occ, double& ekinetic) const { +tensorT SCF::make_fock_matrix(World &world, const vecfuncT &psi, + const vecfuncT &Vpsi, const tensorT &occ, double &ekinetic) const { PROFILE_MEMBER_FUNC(SCF); START_TIMER(world); tensorT pe = matrix_inner(world, Vpsi, psi, true); @@ -1496,7 +1571,7 @@ tensorT SCF::make_fock_matrix(World& world, const vecfuncT& psi, /// Returned is a *replicated* tensor of \f$(ij|kl)\f$ with \f$i>=j\f$ /// and \f$k>=l\f$. The symmetry \f$(ij|kl)=(kl|ij)\f$ is enforced. -Tensor SCF::twoint(World& world, const vecfuncT& psi) const { +Tensor SCF::twoint(World &world, const vecfuncT &psi) const { PROFILE_MEMBER_FUNC(SCF); double tol = FunctionDefaults<3>::get_thresh(); /// Important this is consistent with Coulomb reconstruct(world, psi); @@ -1526,8 +1601,8 @@ Tensor SCF::twoint(World& world, const vecfuncT& psi) const { /// @param[in] occ the occupation numbers /// @param[in] thresh_degenerate threshold for orbitals being degenerate /// @return the unitary matrix U: U^T F U = evals -tensorT SCF::get_fock_transformation(World& world, const tensorT& overlap, - tensorT& fock, tensorT& evals, const tensorT& occ, +tensorT SCF::get_fock_transformation(World &world, const tensorT &overlap, + tensorT &fock, tensorT &evals, const tensorT &occ, const double thresh_degenerate) const { PROFILE_MEMBER_FUNC(SCF); @@ -1557,8 +1632,8 @@ tensorT SCF::get_fock_transformation(World& world, const tensorT& overlap, /// @param[in] occ occupation numbers /// @param[in] thresh threshold for rotation and truncation /// @return the unitary matrix U: U^T F U = evals -tensorT SCF::diag_fock_matrix(World& world, tensorT& fock, vecfuncT& psi, - vecfuncT& Vpsi, tensorT& evals, const tensorT& occ, +tensorT SCF::diag_fock_matrix(World &world, tensorT &fock, vecfuncT &psi, + vecfuncT &Vpsi, tensorT &evals, const tensorT &occ, const double thresh) const { PROFILE_MEMBER_FUNC(SCF); @@ -1590,8 +1665,8 @@ tensorT SCF::diag_fock_matrix(World& world, tensorT& fock, vecfuncT& psi, return U; } -void SCF::loadbal(World& world, functionT& arho, functionT& brho, - functionT& arho_old, functionT& brho_old, subspaceT& subspace) { +void SCF::loadbal(World &world, functionT &arho, functionT &brho, + functionT &arho_old, functionT &brho_old, subspaceT &subspace) { if (world.size() == 1) return; @@ -1625,12 +1700,12 @@ void SCF::loadbal(World& world, functionT& arho, functionT& brho, world.gop.fence(); } -void SCF::rotate_subspace(World& world, const tensorT& U, subspaceT& subspace, +void SCF::rotate_subspace(World &world, const tensorT &U, subspaceT &subspace, int lo, int nfunc, double trantol) const { PROFILE_MEMBER_FUNC(SCF); for (unsigned int iter = 0; iter < subspace.size(); ++iter) { - vecfuncT& v = subspace[iter].first; - vecfuncT& r = subspace[iter].second; + vecfuncT &v = subspace[iter].first; + vecfuncT &r = subspace[iter].second; vecfuncT vnew = transform(world, vecfuncT(&v[lo], &v[lo + nfunc]), U, trantol, false); vecfuncT rnew = transform(world, vecfuncT(&r[lo], &r[lo + nfunc]), U, trantol, false); world.gop.fence(); @@ -1642,12 +1717,12 @@ void SCF::rotate_subspace(World& world, const tensorT& U, subspaceT& subspace, world.gop.fence(); } -void SCF::rotate_subspace(World& world, const distmatT& dUT, subspaceT& subspace, +void SCF::rotate_subspace(World &world, const distmatT &dUT, subspaceT &subspace, int lo, int nfunc, double trantol) const { PROFILE_MEMBER_FUNC(SCF); for (unsigned int iter = 0; iter < subspace.size(); ++iter) { - vecfuncT& v = subspace[iter].first; - vecfuncT& r = subspace[iter].second; + vecfuncT &v = subspace[iter].first; + vecfuncT &r = subspace[iter].second; vecfuncT vnew = transform(world, vecfuncT(&v[lo], &v[lo + nfunc]), dUT, false); vecfuncT rnew = transform(world, vecfuncT(&r[lo], &r[lo + nfunc]), dUT, false); world.gop.fence(); @@ -1659,9 +1734,9 @@ void SCF::rotate_subspace(World& world, const distmatT& dUT, subspaceT& subspace world.gop.fence(); } -void SCF::update_subspace(World& world, vecfuncT& Vpsia, vecfuncT& Vpsib, - tensorT& focka, tensorT& fockb, subspaceT& subspace, tensorT& Q, - double& bsh_residual, double& update_residual) { +void SCF::update_subspace(World &world, vecfuncT &Vpsia, vecfuncT &Vpsib, + tensorT &focka, tensorT &fockb, subspaceT &subspace, tensorT &Q, + double &bsh_residual, double &update_residual) { PROFILE_MEMBER_FUNC(SCF); double aerr = 0.0, berr = 0.0; vecfuncT vm = amo; @@ -1706,8 +1781,8 @@ void SCF::update_subspace(World& world, vecfuncT& Vpsia, vecfuncT& Vpsib, tensorT ms(m); tensorT sm(m); for (int s = 0; s < m; ++s) { - const vecfuncT& vs = subspace[s].first; - const vecfuncT& rs = subspace[s].second; + const vecfuncT &vs = subspace[s].first; + const vecfuncT &rs = subspace[s].second; for (unsigned int i = 0; i < vm.size(); ++i) { ms[s] += vm[i].inner_local(rs[i]); sm[s] += vs[i].inner_local(rm[i]); @@ -1760,8 +1835,8 @@ void SCF::update_subspace(World& world, vecfuncT& Vpsia, vecfuncT& Vpsib, vecfuncT bmo_new = zero_functions_compressed(world, bmo.size(), false); world.gop.fence(); for (unsigned int m = 0; m < subspace.size(); ++m) { - const vecfuncT& vm = subspace[m].first; - const vecfuncT& rm = subspace[m].second; + const vecfuncT &vm = subspace[m].first; + const vecfuncT &rm = subspace[m].second; const vecfuncT vma(vm.begin(), vm.begin() + amo.size()); const vecfuncT rma(rm.begin(), rm.begin() + amo.size()); const vecfuncT vmb(vm.end() - bmo.size(), vm.end()); @@ -1801,7 +1876,7 @@ void SCF::update_subspace(World& world, vecfuncT& Vpsia, vecfuncT& Vpsib, /// @param[inout] new_mo vector of orbitals from the KAIN solver /// @param[in] spin "alpha" or "beta" for user information /// @return max residual -double SCF::do_step_restriction(World& world, const vecfuncT& mo, vecfuncT& mo_new, +double SCF::do_step_restriction(World &world, const vecfuncT &mo, vecfuncT &mo_new, std::string spin) const { PROFILE_MEMBER_FUNC(SCF); std::vector anorm = norm2s(world, sub(world, mo, mo_new)); @@ -1833,7 +1908,7 @@ double SCF::do_step_restriction(World& world, const vecfuncT& mo, vecfuncT& mo_n /// @param[in] world the world /// @param[inout] amo_new the vectors to be orthonormalized -void SCF::orthonormalize(World& world, vecfuncT& amo_new, int nocc) const { +void SCF::orthonormalize(World &world, vecfuncT &amo_new, int nocc) const { PROFILE_MEMBER_FUNC(SCF); START_TIMER(world); double trantol = vtol / std::min(30.0, double(amo_new.size())); @@ -1873,7 +1948,7 @@ void SCF::orthonormalize(World& world, vecfuncT& amo_new, int nocc) const { /// @param[in] world the world /// @param[inout] amo_new the vectors to be orthonormalized -void SCF::orthonormalize(World& world, vecfuncT& amo_new) const { +void SCF::orthonormalize(World &world, vecfuncT &amo_new) const { PROFILE_MEMBER_FUNC(SCF); START_TIMER(world); double trantol = vtol / std::min(30.0, double(amo.size())); @@ -1900,7 +1975,7 @@ void SCF::orthonormalize(World& world, vecfuncT& amo_new) const { complex_functionT APPLY(const complex_operatorT *q1d, - const complex_functionT& psi) { + const complex_functionT &psi) { complex_functionT r = psi; // Shallow copy violates constness !!!!!!!!!!!!!!!!! coordT lo, hi; lo[2] = -10; @@ -1923,7 +1998,7 @@ complex_functionT APPLY(const complex_operatorT *q1d, // For given protocol, solve the DFT/HF/response equations -void SCF::solve(World& world) { +void SCF::solve(World &world) { PROFILE_MEMBER_FUNC(SCF); functionT arho_old, brho_old; const double dconv = std::max(FunctionDefaults<3>::get_thresh(), @@ -2103,6 +2178,14 @@ void SCF::solve(World& world) { printf(" nuclear-repulsion %16.8f\n", enrep); printf(" total %16.8f\n\n", etot); } + e_data.add_data({{"e_kinetic", ekinetic}, + {"e_local", enonlocal}, + {"e_nuclear", enuclear}, + {"e_coulomb", ecoulomb}, + {"e_pcm", epcm}, + {"e_xc", exc}, + {"e_nrep", enrep}, + {"e_tot", etot}}); if (iter > 0) { //print("##convergence criteria: density delta=", da < dconv * molecule.natom() && db < dconv * molecule.natom(), ", bsh_residual=", (param.conv_only_dens || bsh_residual < 5.0*dconv)); @@ -2168,10 +2251,10 @@ void SCF::solve(World& world) { // write eigenvalues etc to a file at the same time for plotting DOS etc. FILE *f = 0; if (param.nbeta() != 0 && !param.spin_restricted()) { - std::string name=std::string(param.prefix()+".energies_alpha.dat"); + std::string name = std::string(param.prefix() + ".energies_alpha.dat"); f = fopen(name.c_str(), "w"); } else { - std::string name=param.prefix()+".energies.dat"; + std::string name = param.prefix() + ".energies.dat"; f = fopen(name.c_str(), "w"); } @@ -2185,7 +2268,7 @@ void SCF::solve(World& world) { if (param.nbeta() != 0 && !param.spin_restricted()) { long nmo = bmo.size(); FILE *f = 0; - std::string name=param.prefix()+".energies_beta.dat"; + std::string name = param.prefix() + ".energies_beta.dat"; f = fopen(name.c_str(), "w"); fprintf(f, "# %8li\n", nmo); @@ -2249,36 +2332,3 @@ void SCF::solve(World& world) { -void SCF::output_scf_info_schema(const int& iter, const std::map& vals, const tensorT& dipole_T) { - nlohmann::json j = {}; - j.push_back(nlohmann::json()); - // TODO (Adrian) possibly read in json from filesystem. - // if it exists figure out the size. pushback for each protocol - j[0]["scf_iterations"] = iter; - const double thresh = FunctionDefaults<3>::get_thresh(); - const int k = FunctionDefaults<3>::get_k(); - j[0]["scf_threshold"] = thresh; - j[0]["scf_k"] = k; - for (auto const& [key, val]: vals) { - j[0][key] = val; - } - j[0]["scf_dipole_moment"] = tensor_to_json(dipole_T); - int num = 0; - std::string save = param.prefix()+".scf_info.json"; -#ifdef MADCHEM_HAS_STD_FILESYSTEM - if (std::filesystem::exists(save)) { - std::ifstream ifs(save); -#else - std::ifstream ifs(save); - if (ifs) { -#endif - nlohmann::json j_old; - ifs >> j_old; - print(j_old); - j_old.push_back(j); - j = j_old; - }; - std::ofstream ofs(save); - ofs << j; -} -} diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 7dc570b8cfb..37e0299372b 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -170,6 +170,21 @@ class MomentFunctor : public FunctionFunctorInterface { } }; + class scf_data { + + std::map> e_data; + int iter; + public: + + scf_data(); + + void to_json(json &j); + + void print_data(); + + void add_data(std::map values); + }; + class SCF { public: @@ -182,6 +197,8 @@ class SCF { AtomicBasisSet aobasis; functionT mask; + scf_data e_data; + /// alpha and beta molecular orbitals vecfuncT amo, bmo; @@ -487,7 +504,7 @@ class SCF { void solve(World& world); // - void output_scf_info_schema(const int& iter, const std::map& vals, const tensorT& dipole_T); + void output_scf_info_schema(const int& iter, const std::map& vals, const tensorT& dipole_T) const; }; @@ -666,13 +683,27 @@ class MolecularEnergy : public OptimizationTargetInterface, public QCPropertyInt vec_pair_tensor_T double_tensor_vals; CalculationParameters param = calc.param; + + + int_vals.push_back({"calcinfo_nmo", param.nmo_alpha() + param.nmo_beta()}); int_vals.push_back({"calcinfo_nalpha", param.nalpha()}); int_vals.push_back({"calcinfo_nbeta", param.nbeta()}); int_vals.push_back({"calcinfo_natom", calc.molecule.natom()}); + int_vals.push_back({"k", FunctionDefaults<3>::get_k()}); + to_json(j, int_vals); double_vals.push_back({"return_energy", value(calc.molecule.get_all_coords().flat())}); to_json(j, double_vals); + double_tensor_vals.push_back({"scf_eigenvalues_a", calc.aeps}); + if (param.nbeta() != 0 && !param.spin_restricted()) { + double_tensor_vals.push_back({"scf_eigenvalues_b", calc.beps}); + } + + to_json(j, double_tensor_vals); + param.to_json(j); + calc.e_data.to_json(j); + output_schema(param.prefix()+".calc_info", j); } }; From b5ebe97044a5ce7b8dbf9b7bd1b30573353b3dcf Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 6 Sep 2022 08:26:36 -0400 Subject: [PATCH 0242/1312] amended e5e23a03d33734f4d8d65644786c383521deaa58 --- src/madness/chem/molecule.cc | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/madness/chem/molecule.cc b/src/madness/chem/molecule.cc index dd3f9194835..1b4bdd65972 100644 --- a/src/madness/chem/molecule.cc +++ b/src/madness/chem/molecule.cc @@ -79,7 +79,15 @@ std::ostream& operator<<(std::ostream& s, const Atom& atom) { return s; } -Molecule::Molecule(std::vector atoms, double eprec, CorePotentialManager core_poт, madness::Tensor field) : atoms(std::move(atoms)), core_pot(std::move(core_pot)), field(std::move(field)) { +Molecule::Molecule(std::vector atoms, double eprec, CorePotentialManager core_pot, madness::Tensor field) : atoms(std::move(atoms)), core_pot(std::move(core_pot)), field(std::move(field)) { + atomic_radii.reserve(this->atoms.size()); + for(auto&& atom: this->atoms) { + double radius = + get_atomic_data(atom.z).covalent_radius; + atomic_radii.emplace_back( + radius * 1e-10 / + madness::constants::atomic_unit_of_length); + } this->update_rcut_with_eprec(eprec); } @@ -410,11 +418,15 @@ void Molecule::set_all_coords(const madness::Tensor& c) { /// updates rcuts with given eprec void Molecule::update_rcut_with_eprec(double value) { - if (value != get_eprec()) parameters.set_user_defined_value("eprec",value); - for (size_t i=0; i Date: Tue, 6 Sep 2022 11:30:30 -0400 Subject: [PATCH 0243/1312] add molresponse back --- src/apps/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt index 7a730f723a5..9c54a70d7c6 100644 --- a/src/apps/CMakeLists.txt +++ b/src/apps/CMakeLists.txt @@ -4,7 +4,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory(tdse) add_subdirectory(moldft) -#add_subdirectory(molresponse) # temporarily removed since build is breaking +add_subdirectory(molresponse) add_subdirectory(pno) add_subdirectory(nemo) add_subdirectory(cis) From 093306abe9c5017befc8169d29985a17a4e3552b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 11:32:12 -0400 Subject: [PATCH 0244/1312] formatting from master --- src/madness/chem/QCCalculationParametersBase.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/madness/chem/QCCalculationParametersBase.cc b/src/madness/chem/QCCalculationParametersBase.cc index 84620978a53..3719e724a2a 100644 --- a/src/madness/chem/QCCalculationParametersBase.cc +++ b/src/madness/chem/QCCalculationParametersBase.cc @@ -177,6 +177,7 @@ namespace madness { }; + bool operator!=(const QCCalculationParametersBase& p1, const QCCalculationParametersBase& p2) { return !(p1 == p2); From 490f1ed44963ea76369723dd248c6876bab0cd29 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 12:30:02 -0400 Subject: [PATCH 0245/1312] fix some header file locations --- .../molresponse/testing/database_testing.cpp | 6 +- .../molresponse/testing/full_excited_test.cpp | 15 ++--- .../testing/generate_excited_data.cpp | 2 +- .../testing/generate_frequency_data.cpp | 2 +- .../testing/mad-excited-symmetry-adapted.cpp | 2 +- .../molresponse/testing/madness_catch_main.cc | 65 +++++++++---------- .../testing/qcschema_json_testing.cpp | 3 +- .../molresponse/testing/test_development.cpp | 8 +-- 8 files changed, 48 insertions(+), 55 deletions(-) diff --git a/src/apps/molresponse/testing/database_testing.cpp b/src/apps/molresponse/testing/database_testing.cpp index ebf8119a2f4..0ce2cb78d1e 100644 --- a/src/apps/molresponse/testing/database_testing.cpp +++ b/src/apps/molresponse/testing/database_testing.cpp @@ -9,9 +9,9 @@ #include "FrequencyResponse.hpp" #include "ResponseExceptions.hpp" #include "TDDFT.h" -#include "apps/chem/SCF.h" -#include "apps/external_headers/catch.hpp" -#include "apps/external_headers/tensor_json.hpp" +#include "madness/chem/SCF.h" +#include "madness/external/catch/catch.hpp" +#include "madness/tensor/tensor_json.hpp" #include "madness/world/worldmem.h" #include "response_functions.h" #include "runners.hpp" diff --git a/src/apps/molresponse/testing/full_excited_test.cpp b/src/apps/molresponse/testing/full_excited_test.cpp index 3e9c812868e..57c9167e24e 100644 --- a/src/apps/molresponse/testing/full_excited_test.cpp +++ b/src/apps/molresponse/testing/full_excited_test.cpp @@ -2,19 +2,12 @@ // Created by adrianhurtado on 2/11/22. // -#include "ExcitedResponse.hpp" #include "ResponseExceptions.hpp" -#include "TDDFT.h" -#include "apps/chem/SCF.h" #include "madness/tensor/tensor_json.hpp" #include "madness/world/worldmem.h" -#include "response_data_base.hpp" #include "response_functions.h" #include "runners.hpp" #include "string" -#include "timer.h" -#include "write_test_input.h" -#include "x_space.h" #if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) @@ -23,7 +16,7 @@ #include static inline int file_exists(const char *input_name) { - struct stat buffer {}; + struct stat buffer{}; size_t rc = stat(input_name, &buffer); return (rc == 0); } @@ -60,7 +53,7 @@ int main(int argc, char *argv[]) { if (std::filesystem::is_directory(schema.molecule_path)) { // for every molecule within the molecule path for (const std::filesystem::directory_entry &mol_path: - std::filesystem::directory_iterator(schema.molecule_path)) { + std::filesystem::directory_iterator(schema.molecule_path)) { std::filesystem::current_path(schema.xc_path); @@ -72,12 +65,12 @@ int main(int argc, char *argv[]) { auto m_schema = moldftSchema(molecule_name, xc, schema); - moldft(world, m_schema, true,false,high_prec); + moldft(world, m_schema, true, false, high_prec); auto excited_schema = excitedSchema(schema, m_schema); excited_schema.print(); - bool success = runExcited(world, excited_schema, false,high_prec); + bool success = runExcited(world, excited_schema, false, high_prec); } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { diff --git a/src/apps/molresponse/testing/generate_excited_data.cpp b/src/apps/molresponse/testing/generate_excited_data.cpp index 82f09e39f1d..b912e634f58 100644 --- a/src/apps/molresponse/testing/generate_excited_data.cpp +++ b/src/apps/molresponse/testing/generate_excited_data.cpp @@ -3,7 +3,7 @@ // #include "ResponseExceptions.hpp" -#include "apps/chem/SCF.h" +#include "madness/chem/SCF.h" #include "madness/tensor/tensor_json.hpp" #include "madness/world/worldmem.h" #include "response_data_base.hpp" diff --git a/src/apps/molresponse/testing/generate_frequency_data.cpp b/src/apps/molresponse/testing/generate_frequency_data.cpp index 04c1974494e..9783d7899b2 100644 --- a/src/apps/molresponse/testing/generate_frequency_data.cpp +++ b/src/apps/molresponse/testing/generate_frequency_data.cpp @@ -3,7 +3,7 @@ // #include "ResponseExceptions.hpp" -#include "apps/chem/SCF.h" +#include "madness/chem/SCF.h" #include "madness/tensor/tensor_json.hpp" #include "madness/world/worldmem.h" #include "response_data_base.hpp" diff --git a/src/apps/molresponse/testing/mad-excited-symmetry-adapted.cpp b/src/apps/molresponse/testing/mad-excited-symmetry-adapted.cpp index e3a67bdd7a1..34a8cbb7469 100644 --- a/src/apps/molresponse/testing/mad-excited-symmetry-adapted.cpp +++ b/src/apps/molresponse/testing/mad-excited-symmetry-adapted.cpp @@ -4,7 +4,7 @@ #include "ExcitedResponse.hpp" #include "FrequencyResponse.hpp" #include "ResponseExceptions.hpp" -#include "apps/chem/SCF.h" +#include "/chem/SCF.h" #include "apps/external_headers/tensor_json.hpp" #include "madness/world/worldmem.h" #include "response_functions.h" diff --git a/src/apps/molresponse/testing/madness_catch_main.cc b/src/apps/molresponse/testing/madness_catch_main.cc index a52c6558eeb..556633ef1f7 100644 --- a/src/apps/molresponse/testing/madness_catch_main.cc +++ b/src/apps/molresponse/testing/madness_catch_main.cc @@ -1,40 +1,39 @@ #define CATCH_CONFIG_RUNNER -#include "madness/external/catch/catch.hpp" -#include "apps/chem/SCF.h" -#include "madness/world/worldmem.h" +#include "madness/external/catch/catch.hpp" +#include "madness/chem/SCF.h" int main(int argc, char *argv[]) { - //World& world=initialize(argc, argv);// initializes a world argument with argc and argv - // World world(SafeMPI::COMM_WORLD); - // startup(world, argc, argv, true); - try { - int result = Catch::Session().run(argc, argv); - return result; - } catch (const SafeMPI::Exception &e) { - print(e); - error("caught an MPI exception"); - } catch (const madness::MadnessException &e) { - print(e); - error("caught a MADNESS exception"); - } catch (const madness::TensorException &e) { - print(e); - error("caught a Tensor exception"); - } catch (const char *s) { - print(s); - error("caught a string exception"); - } catch (const std::string &s) { - print(s); - error("caught a string (class) exception"); - } catch (const std::exception &e) { - print(e.what()); - error("caught an STL exception"); - } catch (...) { - error("caught unhandled exception"); - } + //World& world=initialize(argc, argv);// initializes a world argument with argc and argv + // World world(SafeMPI::COMM_WORLD); + // startup(world, argc, argv, true); + try { + int result = Catch::Session().run(argc, argv); + return result; + } catch (const SafeMPI::Exception &e) { + print(e); + error("caught an MPI exception"); + } catch (const madness::MadnessException &e) { + print(e); + error("caught a MADNESS exception"); + } catch (const madness::TensorException &e) { + print(e); + error("caught a Tensor exception"); + } catch (const char *s) { + print(s); + error("caught a string exception"); + } catch (const std::string &s) { + print(s); + error("caught a string (class) exception"); + } catch (const std::exception &e) { + print(e.what()); + error("caught an STL exception"); + } catch (...) { + error("caught unhandled exception"); + } - // print_meminfo(world.rank(), "startup"); - // std::cout.precision(6); - // print_stats(world); + // print_meminfo(world.rank(), "startup"); + // std::cout.precision(6); + // print_stats(world); } diff --git a/src/apps/molresponse/testing/qcschema_json_testing.cpp b/src/apps/molresponse/testing/qcschema_json_testing.cpp index d4ef3f5a8ed..b8ddffc53c1 100644 --- a/src/apps/molresponse/testing/qcschema_json_testing.cpp +++ b/src/apps/molresponse/testing/qcschema_json_testing.cpp @@ -3,6 +3,7 @@ // #include "madness/tensor/tensor_json.hpp" +#include "madness/external/catch/catch.hpp" #include "response_functions.h" #include "timer.h" #include "string" @@ -167,7 +168,7 @@ TEST_CASE("print_QCSchema Test ", "Json Tensor Indexing") { to_json(j,double_tensor_vals); - output_schema(<#initializer #>, "test_schema", j); + output_schema( "test_schema", j); } TEST_CASE("Response Parameters Test ", "Testing parameters to_json") { diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index 309a9f0b986..498052eb688 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -8,9 +8,9 @@ #include "FrequencyResponse.hpp" #include "ResponseExceptions.hpp" #include "TDDFT.h" -#include "apps/chem/SCF.h" -#include "apps/external_headers/catch.hpp" -#include "apps/external_headers/tensor_json.hpp" +#include "madness/chem/SCF.h" +#include "madness/external/catch/catch.hpp" +#include "madness/tensor/tensor_json.hpp" #include "madness/world/worldmem.h" #include "response_functions.h" #include "response_parameters.h" @@ -45,7 +45,7 @@ int main(int argc, char *argv[]) { auto excited_schema = excitedSchema(schema, m_schema); excited_schema.print(); ResponseParameters r_params{}; - set_excited_parameters(r_params, excited_schema.xc, excited_schema.num_states); + set_excited_parameters(r_params, excited_schema.xc, excited_schema.num_states, false); create_excited_paths(r_params, excited_schema, false); std::filesystem::current_path(excited_schema.excited_state_run_path); set_and_write_restart_excited_parameters(r_params, excited_schema, false); From 0bbd249ce4266b1f9299943397c6d0919de31ef7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 12:30:39 -0400 Subject: [PATCH 0246/1312] updated catch file which handles cstdef and cpp17 --- src/apps/molresponse/testing/CMakeLists.txt | 15 +- src/madness/external/catch/catch.hpp | 9524 ++++++++++--------- 2 files changed, 4779 insertions(+), 4760 deletions(-) diff --git a/src/apps/molresponse/testing/CMakeLists.txt b/src/apps/molresponse/testing/CMakeLists.txt index 1e9f4cdd3f5..ea67a767d00 100644 --- a/src/apps/molresponse/testing/CMakeLists.txt +++ b/src/apps/molresponse/testing/CMakeLists.txt @@ -1,12 +1,10 @@ # src/apps/molresponse/testing -add_mad_executable(test_schema_json "madness_catch_main.cc;qcschema_json_testing.cpp" "MADresponse;MADchem" ,) # Uses [mol] [xc] [operator] as input add_mad_executable(mad-freq "mad-freq.cpp" "MADall_response;MADchem") add_mad_executable(mad-excited "mad-excited.cpp" "MADall_response;MADchem") -add_mad_executable(mad-excited-symmetry-adapted "mad-excited-symmetry-adapted.cpp" "MADall_response;MADchem") # Uses "response.in" file as input @@ -22,6 +20,17 @@ add_mad_executable(full_ground_tests "full_ground_test.cpp" "MADchem;MADresponse add_mad_executable(generate_excited "generate_excited_data.cpp" "MADall_response;MADchem") add_mad_executable(generate_frequency "generate_frequency_data.cpp" "MADall_response;MADchem") -add_mad_executable(database-test "database_testing.cpp" "MADall_response;MADchem") add_mad_executable(test-dev "test_development.cpp" "MADall_response;MADchem") # Add dependencies for MADchem + +# Catch related things +# TODO catch breaks build ... finds cstdef with cpp17 and looks for mac cstdef +# // Check if byte is available and usable +# if __has_include() && defined(CATCH_CPP17_OR_GREATER) +# include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstddef" +# The above b + + +#a dd_mad_executable(database-test "database_testing.cpp" "MADall_response;MADchem") +# add_mad_executable(mad-excited-symmetry-adapted "mad-excited-symmetry-adapted.cpp" "MADall_response;MADchem") +add_mad_executable(test_schema_json "madness_catch_main.cc;qcschema_json_testing.cpp" "MADresponse;MADchem" ,) diff --git a/src/madness/external/catch/catch.hpp b/src/madness/external/catch/catch.hpp index 46c963b6d7c..af4ec5e3fe8 100644 --- a/src/madness/external/catch/catch.hpp +++ b/src/madness/external/catch/catch.hpp @@ -1,9 +1,9 @@ /* - * Catch v2.13.7 - * Generated: 2021-07-28 20:29:27.753164 + * Catch v2.13.9 + * Generated: 2022-04-12 22:37:23.260201 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2021 Two Blue Cubes Ltd. All rights reserved. + * Copyright (c) 2022 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -15,7 +15,7 @@ #define CATCH_VERSION_MAJOR 2 #define CATCH_VERSION_MINOR 13 -#define CATCH_VERSION_PATCH 7 +#define CATCH_VERSION_PATCH 9 #ifdef __clang__ # pragma clang system_header @@ -36,9 +36,9 @@ # pragma clang diagnostic ignored "-Wcovered-switch-default" # endif #elif defined __GNUC__ - // Because REQUIREs trigger GCC's -Wparentheses, and because still - // supported version of g++ have only buggy support for _Pragmas, - // Wparentheses have to be suppressed globally. +// Because REQUIREs trigger GCC's -Wparentheses, and because still +// supported version of g++ have only buggy support for _Pragmas, +// Wparentheses have to be suppressed globally. # pragma GCC diagnostic ignored "-Wparentheses" // See #674 for details # pragma GCC diagnostic push @@ -69,7 +69,7 @@ // See e.g.: // https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h.auto.html #ifdef __APPLE__ -# include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/TargetConditionals.h" +# include # if (defined(TARGET_OS_OSX) && TARGET_OS_OSX == 1) || \ (defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1) # define CATCH_PLATFORM_MAC @@ -186,13 +186,13 @@ namespace Catch { //////////////////////////////////////////////////////////////////////////////// // Assume that non-Windows platforms support posix signals by default #if !defined(CATCH_PLATFORM_WINDOWS) - #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS +#define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS #endif //////////////////////////////////////////////////////////////////////////////// // We know some environments not to support full POSIX signals #if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__) - #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +#define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS #endif #ifdef __OS400__ @@ -240,9 +240,6 @@ namespace Catch { // Visual C++ #if defined(_MSC_VER) -# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) -# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) - // Universal Windows platform does not support SEH // Or console colours (or console at all...) # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) @@ -251,13 +248,18 @@ namespace Catch { # define CATCH_INTERNAL_CONFIG_WINDOWS_SEH # endif +# if !defined(__clang__) // Handle Clang masquerading for msvc + // MSVC traditional preprocessor needs some workaround for __VA_ARGS__ // _MSVC_TRADITIONAL == 0 means new conformant preprocessor // _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor -# if !defined(__clang__) // Handle Clang masquerading for msvc # if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) # define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR # endif // MSVC_TRADITIONAL + +// Only do this if we're not using clang on Windows, which uses `diagnostic push` & `diagnostic pop` +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) # endif // __clang__ #endif // _MSC_VER @@ -282,7 +284,7 @@ namespace Catch { //////////////////////////////////////////////////////////////////////////////// // Embarcadero C++Build #if defined(__BORLANDC__) - #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN +#define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN #endif //////////////////////////////////////////////////////////////////////////////// @@ -293,7 +295,7 @@ namespace Catch { // Otherwise all supported compilers support COUNTER macro, // but user still might want to turn it off #if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L ) - #define CATCH_INTERNAL_CONFIG_COUNTER +#define CATCH_INTERNAL_CONFIG_COUNTER #endif //////////////////////////////////////////////////////////////////////////////// @@ -302,7 +304,7 @@ namespace Catch { // This means that it is detected as Windows, but does not provide // the same set of capabilities as real Windows does. #if defined(UNDER_RTSS) || defined(RTX64_BUILD) - #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH +#define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH #define CATCH_INTERNAL_CONFIG_NO_ASYNC #define CATCH_CONFIG_COLOUR_NONE #endif @@ -313,28 +315,28 @@ namespace Catch { // Various stdlib support checks that require __has_include #if defined(__has_include) - // Check if string_view is available and usable - #if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW - #endif - - // Check if optional is available and usable - # if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL - # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) - - // Check if byte is available and usable - # if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstddef" - # if defined(__cpp_lib_byte) && (__cpp_lib_byte > 0) - # define CATCH_INTERNAL_CONFIG_CPP17_BYTE - # endif - # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) - - // Check if variant is available and usable - # if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # if defined(__clang__) && (__clang_major__ < 8) - // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 +// Check if string_view is available and usable +#if __has_include() && defined(CATCH_CPP17_OR_GREATER) +# define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW +#endif + +// Check if optional is available and usable +# if __has_include() && defined(CATCH_CPP17_OR_GREATER) +# define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL +# endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) + +// Check if byte is available and usable +# if __has_include() && defined(CATCH_CPP17_OR_GREATER) +# include +# if defined(__cpp_lib_byte) && (__cpp_lib_byte > 0) +# define CATCH_INTERNAL_CONFIG_CPP17_BYTE +# endif +# endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) + +// Check if variant is available and usable +# if __has_include() && defined(CATCH_CPP17_OR_GREATER) +# if defined(__clang__) && (__clang_major__ < 8) +// work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 // fix should be in clang 8, workaround in libstdc++ 8.2 # include # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) @@ -342,10 +344,10 @@ namespace Catch { # else # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) - # else - # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT - # endif // defined(__clang__) && (__clang_major__ < 8) - # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) +# else +# define CATCH_INTERNAL_CONFIG_CPP17_VARIANT +# endif // defined(__clang__) && (__clang_major__ < 8) +# endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) #endif // defined(__has_include) #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) @@ -471,9 +473,9 @@ namespace Catch { # define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) #endif -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iosfwd" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdint" +#include +#include +#include // We need a dummy global operator<< so we can bring it into Catch namespace later struct Catch_global_namespace_dummy {}; @@ -482,9 +484,9 @@ std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy); namespace Catch { struct CaseSensitive { enum Choice { - Yes, - No - }; }; + Yes, + No + }; }; class NonCopyable { NonCopyable( NonCopyable const& ) = delete; @@ -501,8 +503,8 @@ namespace Catch { SourceLineInfo() = delete; SourceLineInfo( char const* _file, std::size_t _line ) noexcept - : file( _file ), - line( _line ) + : file( _file ), + line( _line ) {} SourceLineInfo( SourceLineInfo const& other ) = default; @@ -561,7 +563,7 @@ namespace Catch { // start catch_interfaces_testcase.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" +#include namespace Catch { @@ -591,10 +593,10 @@ namespace Catch { // end catch_interfaces_testcase.h // start catch_stringref.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstddef" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iosfwd" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" +#include +#include +#include +#include namespace Catch { @@ -618,13 +620,13 @@ namespace Catch { StringRef( char const* rawChars ) noexcept; constexpr StringRef( char const* rawChars, size_type size ) noexcept - : m_start( rawChars ), - m_size( size ) + : m_start( rawChars ), + m_size( size ) {} StringRef( std::string const& stdString ) noexcept - : m_start( stdString.c_str() ), - m_size( stdString.size() ) + : m_start( stdString.c_str() ), + m_size( stdString.size() ) {} explicit operator std::string() const { @@ -916,7 +918,7 @@ constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) n // start catch_meta.hpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/type_traits" +#include namespace Catch { template @@ -956,40 +958,40 @@ namespace mpl_{ // end catch_meta.hpp namespace Catch { -template -class TestInvokerAsMethod : public ITestInvoker { - void (C::*m_testAsMethod)(); -public: - TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {} + template + class TestInvokerAsMethod : public ITestInvoker { + void (C::*m_testAsMethod)(); + public: + TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {} - void invoke() const override { - C obj; - (obj.*m_testAsMethod)(); - } -}; + void invoke() const override { + C obj; + (obj.*m_testAsMethod)(); + } + }; -auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker*; + auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker*; -template -auto makeTestInvoker( void (C::*testAsMethod)() ) noexcept -> ITestInvoker* { - return new(std::nothrow) TestInvokerAsMethod( testAsMethod ); -} + template + auto makeTestInvoker( void (C::*testAsMethod)() ) noexcept -> ITestInvoker* { + return new(std::nothrow) TestInvokerAsMethod( testAsMethod ); + } -struct NameAndTags { - NameAndTags( StringRef const& name_ = StringRef(), StringRef const& tags_ = StringRef() ) noexcept; - StringRef name; - StringRef tags; -}; + struct NameAndTags { + NameAndTags( StringRef const& name_ = StringRef(), StringRef const& tags_ = StringRef() ) noexcept; + StringRef name; + StringRef tags; + }; -struct AutoReg : NonCopyable { - AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept; - ~AutoReg(); -}; + struct AutoReg : NonCopyable { + AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept; + ~AutoReg(); + }; } // end namespace Catch #if defined(CATCH_CONFIG_DISABLE) - #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \ +#define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \ static void TestName() #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \ namespace{ \ @@ -1010,57 +1012,57 @@ struct AutoReg : NonCopyable { #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \ - INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) + INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename TestType, __VA_ARGS__ ) #else #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) ) + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename TestType, __VA_ARGS__ ) ) #endif #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \ - INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) + INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__ ) #else #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__ ) ) #endif #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \ - INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) #else #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) ) + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) ) #endif #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \ - INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) #else #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) ) + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) ) #endif #endif - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ static void TestName(); \ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ static void TestName() - #define INTERNAL_CATCH_TESTCASE( ... ) \ - INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) +#define INTERNAL_CATCH_TESTCASE( ... ) \ + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ), __VA_ARGS__ ) - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, "&" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ \ @@ -1071,18 +1073,18 @@ struct AutoReg : NonCopyable { } \ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ void TestName::test() - #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ - INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) +#define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ), ClassName, __VA_ARGS__ ) - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION - /////////////////////////////////////////////////////////////////////////////// - #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\ +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ @@ -1112,22 +1114,22 @@ struct AutoReg : NonCopyable { INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature)) #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR - #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ - INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) +#define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename TestType, __VA_ARGS__ ) #else - #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) ) +#define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename TestType, __VA_ARGS__ ) ) #endif #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR - #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \ - INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) +#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__ ) #else - #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) +#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__ ) ) #endif - #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \ +#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ @@ -1161,22 +1163,22 @@ struct AutoReg : NonCopyable { static void TestFuncName() #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR - #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\ - INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T,__VA_ARGS__) +#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename T,__VA_ARGS__) #else - #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T, __VA_ARGS__ ) ) +#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename T, __VA_ARGS__ ) ) #endif #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR - #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\ - INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__) +#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__) #else - #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) +#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__ ) ) #endif - #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\ +#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ @@ -1203,10 +1205,10 @@ struct AutoReg : NonCopyable { template \ static void TestFunc() - #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \ - INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, TmplList ) +#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \ + INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, TmplList ) - #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ +#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ @@ -1236,22 +1238,22 @@ struct AutoReg : NonCopyable { INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature)) #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR - #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ - INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) +#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) #else - #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) ) +#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) ) #endif #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR - #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \ - INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) +#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) #else - #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) ) +#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) ) #endif - #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\ +#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ @@ -1288,22 +1290,22 @@ struct AutoReg : NonCopyable { void TestName::test() #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR - #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\ - INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T, __VA_ARGS__ ) +#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), ClassName, Name, Tags, typename T, __VA_ARGS__ ) #else - #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T,__VA_ARGS__ ) ) +#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), ClassName, Name, Tags, typename T,__VA_ARGS__ ) ) #endif #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR - #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\ - INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature, __VA_ARGS__ ) +#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), ClassName, Name, Tags, Signature, __VA_ARGS__ ) #else - #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\ - INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) ) +#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) ) #endif - #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \ +#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ @@ -1334,7 +1336,7 @@ struct AutoReg : NonCopyable { void TestName::test() #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \ - INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, TmplList ) + INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), ClassName, Name, Tags, TmplList ) // end catch_test_registry.h // start catch_capture.hpp @@ -1349,36 +1351,36 @@ namespace Catch { // ResultWas::OfType enum struct ResultWas { enum OfType { - Unknown = -1, - Ok = 0, - Info = 1, - Warning = 2, + Unknown = -1, + Ok = 0, + Info = 1, + Warning = 2, - FailureBit = 0x10, + FailureBit = 0x10, - ExpressionFailed = FailureBit | 1, - ExplicitFailure = FailureBit | 2, + ExpressionFailed = FailureBit | 1, + ExplicitFailure = FailureBit | 2, - Exception = 0x100 | FailureBit, + Exception = 0x100 | FailureBit, - ThrewException = Exception | 1, - DidntThrowException = Exception | 2, + ThrewException = Exception | 1, + DidntThrowException = Exception | 2, - FatalErrorCondition = 0x200 | FailureBit + FatalErrorCondition = 0x200 | FailureBit - }; }; + }; }; bool isOk( ResultWas::OfType resultType ); bool isJustInfo( int flags ); // ResultDisposition::Flags enum struct ResultDisposition { enum Flags { - Normal = 0x01, + Normal = 0x01, - ContinueOnFailure = 0x02, // Failures fail test, but execution continues - FalseTest = 0x04, // Prefix expression with ! - SuppressFail = 0x08 // Failures are reported but do not fail the test - }; }; + ContinueOnFailure = 0x02, // Failures fail test, but execution continues + FalseTest = 0x04, // Prefix expression with ! + SuppressFail = 0x08 // Failures are reported but do not fail the test + }; }; ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ); @@ -1410,15 +1412,15 @@ namespace Catch { // start catch_tostring.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstddef" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/type_traits" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include +#include +#include +#include // start catch_stream.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iosfwd" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstddef" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ostream" +#include +#include +#include namespace Catch { @@ -1456,7 +1458,7 @@ namespace Catch { // end catch_stream.h // start catch_interfaces_enum_values_registry.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" +#include namespace Catch { @@ -1492,7 +1494,7 @@ namespace Catch { // end catch_interfaces_enum_values_registry.h #ifdef CATCH_CONFIG_CPP17_STRING_VIEW -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string_view" +#include #endif #ifdef __OBJC__ @@ -1555,14 +1557,14 @@ namespace Catch { template std::string rawMemoryToString( const T& object ) { - return rawMemoryToString( &object, sizeof(object) ); + return rawMemoryToString( &object, sizeof(object) ); } template class IsStreamInsertable { template static auto test(int) - -> decltype(std::declval() << std::declval(), std::true_type()); + -> decltype(std::declval() << std::declval(), std::true_type()); template static auto test(...)->std::false_type; @@ -1576,21 +1578,21 @@ namespace Catch { template typename std::enable_if< - !std::is_enum::value && !std::is_base_of::value, - std::string>::type convertUnstreamable( T const& ) { + !std::is_enum::value && !std::is_base_of::value, + std::string>::type convertUnstreamable( T const& ) { return Detail::unprintableString; } template typename std::enable_if< - !std::is_enum::value && std::is_base_of::value, - std::string>::type convertUnstreamable(T const& ex) { + !std::is_enum::value && std::is_base_of::value, + std::string>::type convertUnstreamable(T const& ex) { return ex.what(); } template typename std::enable_if< - std::is_enum::value - , std::string>::type convertUnstreamable( T const& value ) { + std::is_enum::value + , std::string>::type convertUnstreamable( T const& value ) { return convertUnknownEnumToString( value ); } @@ -1614,18 +1616,18 @@ namespace Catch { template static typename std::enable_if<::Catch::Detail::IsStreamInsertable::value, std::string>::type - convert(const Fake& value) { - ReusableStringStream rss; - // NB: call using the function-like syntax to avoid ambiguity with - // user-defined templated operator<< under clang. - rss.operator<<(value); - return rss.str(); + convert(const Fake& value) { + ReusableStringStream rss; + // NB: call using the function-like syntax to avoid ambiguity with + // user-defined templated operator<< under clang. + rss.operator<<(value); + return rss.str(); } template static typename std::enable_if::value, std::string>::type - convert( const Fake& value ) { + convert( const Fake& value ) { #if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER) return Detail::convertUnstreamable(value); #else @@ -2052,48 +2054,48 @@ namespace Catch { // Separate std::chrono::duration specialization #if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ctime" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ratio" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/chrono" +#include +#include +#include namespace Catch { -template -struct ratio_string { - static std::string symbol(); -}; - -template -std::string ratio_string::symbol() { - Catch::ReusableStringStream rss; - rss << '[' << Ratio::num << '/' - << Ratio::den << ']'; - return rss.str(); -} -template <> -struct ratio_string { - static std::string symbol(); -}; -template <> -struct ratio_string { - static std::string symbol(); -}; -template <> -struct ratio_string { - static std::string symbol(); -}; -template <> -struct ratio_string { - static std::string symbol(); -}; -template <> -struct ratio_string { - static std::string symbol(); -}; -template <> -struct ratio_string { - static std::string symbol(); -}; + template + struct ratio_string { + static std::string symbol(); + }; + + template + std::string ratio_string::symbol() { + Catch::ReusableStringStream rss; + rss << '[' << Ratio::num << '/' + << Ratio::den << ']'; + return rss.str(); + } + template <> + struct ratio_string { + static std::string symbol(); + }; + template <> + struct ratio_string { + static std::string symbol(); + }; + template <> + struct ratio_string { + static std::string symbol(); + }; + template <> + struct ratio_string { + static std::string symbol(); + }; + template <> + struct ratio_string { + static std::string symbol(); + }; + template <> + struct ratio_string { + static std::string symbol(); + }; //////////// // std::chrono::duration specializations @@ -2184,7 +2186,7 @@ namespace Catch { \ #endif // end catch_tostring.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iosfwd" +#include #ifdef _MSC_VER #pragma warning(push) @@ -2203,8 +2205,8 @@ namespace Catch { virtual void streamReconstructedExpression( std::ostream &os ) const = 0; ITransientExpression( bool isBinaryExpression, bool result ) - : m_isBinaryExpression( isBinaryExpression ), - m_result( result ) + : m_isBinaryExpression( isBinaryExpression ), + m_result( result ) {} // We don't actually need a virtual destructor, but many static analysers @@ -2231,66 +2233,66 @@ namespace Catch { public: BinaryExpr( bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs ) - : ITransientExpression{ true, comparisonResult }, - m_lhs( lhs ), - m_op( op ), - m_rhs( rhs ) + : ITransientExpression{ true, comparisonResult }, + m_lhs( lhs ), + m_op( op ), + m_rhs( rhs ) {} template auto operator && ( T ) const -> BinaryExpr const { static_assert(always_false::value, - "chained comparisons are not supported inside assertions, " - "wrap the expression inside parentheses, or decompose it"); + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); } template auto operator || ( T ) const -> BinaryExpr const { static_assert(always_false::value, - "chained comparisons are not supported inside assertions, " - "wrap the expression inside parentheses, or decompose it"); + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); } template auto operator == ( T ) const -> BinaryExpr const { static_assert(always_false::value, - "chained comparisons are not supported inside assertions, " - "wrap the expression inside parentheses, or decompose it"); + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); } template auto operator != ( T ) const -> BinaryExpr const { static_assert(always_false::value, - "chained comparisons are not supported inside assertions, " - "wrap the expression inside parentheses, or decompose it"); + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); } template auto operator > ( T ) const -> BinaryExpr const { static_assert(always_false::value, - "chained comparisons are not supported inside assertions, " - "wrap the expression inside parentheses, or decompose it"); + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); } template auto operator < ( T ) const -> BinaryExpr const { static_assert(always_false::value, - "chained comparisons are not supported inside assertions, " - "wrap the expression inside parentheses, or decompose it"); + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); } template auto operator >= ( T ) const -> BinaryExpr const { static_assert(always_false::value, - "chained comparisons are not supported inside assertions, " - "wrap the expression inside parentheses, or decompose it"); + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); } template auto operator <= ( T ) const -> BinaryExpr const { static_assert(always_false::value, - "chained comparisons are not supported inside assertions, " - "wrap the expression inside parentheses, or decompose it"); + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); } }; @@ -2304,8 +2306,8 @@ namespace Catch { public: explicit UnaryExpr( LhsT lhs ) - : ITransientExpression{ false, static_cast(lhs) }, - m_lhs( lhs ) + : ITransientExpression{ false, static_cast(lhs) }, + m_lhs( lhs ) {} }; @@ -2386,15 +2388,15 @@ namespace Catch { template auto operator && ( RhsT const& ) -> BinaryExpr const { static_assert(always_false::value, - "operator&& is not supported inside assertions, " - "wrap the expression inside parentheses, or decompose it"); + "operator&& is not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); } template auto operator || ( RhsT const& ) -> BinaryExpr const { static_assert(always_false::value, - "operator|| is not supported inside assertions, " - "wrap the expression inside parentheses, or decompose it"); + "operator|| is not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); } auto makeUnaryExpr() const -> UnaryExpr { @@ -2429,8 +2431,8 @@ namespace Catch { // end catch_decomposer.h // start catch_interfaces_capture.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/chrono" +#include +#include namespace Catch { @@ -2551,10 +2553,10 @@ namespace Catch { public: AssertionHandler - ( StringRef const& macroName, - SourceLineInfo const& lineInfo, - StringRef capturedExpression, - ResultDisposition::Flags resultDisposition ); + ( StringRef const& macroName, + SourceLineInfo const& lineInfo, + StringRef capturedExpression, + ResultDisposition::Flags resultDisposition ); ~AssertionHandler() { if ( !m_completed ) { m_resultCapture.handleIncomplete( m_assertionInfo ); @@ -2589,8 +2591,8 @@ namespace Catch { // end catch_assertionhandler.h // start catch_message.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" +#include +#include namespace Catch { @@ -2675,9 +2677,9 @@ namespace Catch { #if !defined(CATCH_CONFIG_DISABLE) #if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION) - #define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__ +#define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__ #else - #define CATCH_INTERNAL_STRINGIFY(...) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION" +#define CATCH_INTERNAL_STRINGIFY(...) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION" #endif #if defined(CATCH_CONFIG_FAST_COMPILE) || defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) @@ -2820,7 +2822,7 @@ namespace Catch { // start catch_totals.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstddef" +#include namespace Catch { @@ -2851,20 +2853,20 @@ namespace Catch { } // end catch_totals.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include namespace Catch { struct SectionInfo { SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name ); + ( SourceLineInfo const& _lineInfo, + std::string const& _name ); // Deprecated SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name, - std::string const& ) : SectionInfo( _lineInfo, _name ) {} + ( SourceLineInfo const& _lineInfo, + std::string const& _name, + std::string const& ) : SectionInfo( _lineInfo, _name ) {} std::string name; std::string description; // !Deprecated: this will always be empty @@ -2882,7 +2884,7 @@ namespace Catch { // end catch_section_info.h // start catch_timer.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdint" +#include namespace Catch { @@ -2902,7 +2904,7 @@ namespace Catch { } // namespace Catch // end catch_timer.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include namespace Catch { @@ -2942,8 +2944,8 @@ namespace Catch { // start catch_interfaces_registry_hub.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include +#include namespace Catch { @@ -2991,13 +2993,13 @@ namespace Catch { // end catch_interfaces_registry_hub.h #if defined(CATCH_CONFIG_DISABLE) - #define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \ +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \ static std::string translatorName( signature ) #endif -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/exception" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" +#include +#include +#include namespace Catch { using exceptionTranslateFunction = std::string(*)(); @@ -3022,7 +3024,7 @@ namespace Catch { public: ExceptionTranslator( std::string(*translateFunction)( T& ) ) - : m_translateFunction( translateFunction ) + : m_translateFunction( translateFunction ) {} std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override { @@ -3049,7 +3051,7 @@ namespace Catch { template ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { getMutableRegistryHub().registerTranslator - ( new ExceptionTranslator( translateFunction ) ); + ( new ExceptionTranslator( translateFunction ) ); } }; } @@ -3068,130 +3070,130 @@ namespace Catch { // end catch_interfaces_exception.h // start catch_approx.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/type_traits" +#include namespace Catch { -namespace Detail { + namespace Detail { - class Approx { - private: - bool equalityComparisonImpl(double other) const; - // Validates the new margin (margin >= 0) - // out-of-line to avoid including stdexcept in the header - void setMargin(double margin); - // Validates the new epsilon (0 < epsilon < 1) - // out-of-line to avoid including stdexcept in the header - void setEpsilon(double epsilon); + class Approx { + private: + bool equalityComparisonImpl(double other) const; + // Validates the new margin (margin >= 0) + // out-of-line to avoid including stdexcept in the header + void setMargin(double margin); + // Validates the new epsilon (0 < epsilon < 1) + // out-of-line to avoid including stdexcept in the header + void setEpsilon(double epsilon); - public: - explicit Approx ( double value ); + public: + explicit Approx ( double value ); - static Approx custom(); + static Approx custom(); - Approx operator-() const; + Approx operator-() const; - template ::value>::type> - Approx operator()( T const& value ) { - Approx approx( static_cast(value) ); - approx.m_epsilon = m_epsilon; - approx.m_margin = m_margin; - approx.m_scale = m_scale; - return approx; - } + template ::value>::type> + Approx operator()( T const& value ) const { + Approx approx( static_cast(value) ); + approx.m_epsilon = m_epsilon; + approx.m_margin = m_margin; + approx.m_scale = m_scale; + return approx; + } - template ::value>::type> - explicit Approx( T const& value ): Approx(static_cast(value)) - {} + template ::value>::type> + explicit Approx( T const& value ): Approx(static_cast(value)) + {} - template ::value>::type> - friend bool operator == ( const T& lhs, Approx const& rhs ) { - auto lhs_v = static_cast(lhs); - return rhs.equalityComparisonImpl(lhs_v); - } + template ::value>::type> + friend bool operator == ( const T& lhs, Approx const& rhs ) { + auto lhs_v = static_cast(lhs); + return rhs.equalityComparisonImpl(lhs_v); + } - template ::value>::type> - friend bool operator == ( Approx const& lhs, const T& rhs ) { - return operator==( rhs, lhs ); - } + template ::value>::type> + friend bool operator == ( Approx const& lhs, const T& rhs ) { + return operator==( rhs, lhs ); + } - template ::value>::type> - friend bool operator != ( T const& lhs, Approx const& rhs ) { - return !operator==( lhs, rhs ); - } + template ::value>::type> + friend bool operator != ( T const& lhs, Approx const& rhs ) { + return !operator==( lhs, rhs ); + } - template ::value>::type> - friend bool operator != ( Approx const& lhs, T const& rhs ) { - return !operator==( rhs, lhs ); - } + template ::value>::type> + friend bool operator != ( Approx const& lhs, T const& rhs ) { + return !operator==( rhs, lhs ); + } - template ::value>::type> - friend bool operator <= ( T const& lhs, Approx const& rhs ) { - return static_cast(lhs) < rhs.m_value || lhs == rhs; - } + template ::value>::type> + friend bool operator <= ( T const& lhs, Approx const& rhs ) { + return static_cast(lhs) < rhs.m_value || lhs == rhs; + } - template ::value>::type> - friend bool operator <= ( Approx const& lhs, T const& rhs ) { - return lhs.m_value < static_cast(rhs) || lhs == rhs; - } + template ::value>::type> + friend bool operator <= ( Approx const& lhs, T const& rhs ) { + return lhs.m_value < static_cast(rhs) || lhs == rhs; + } - template ::value>::type> - friend bool operator >= ( T const& lhs, Approx const& rhs ) { - return static_cast(lhs) > rhs.m_value || lhs == rhs; - } + template ::value>::type> + friend bool operator >= ( T const& lhs, Approx const& rhs ) { + return static_cast(lhs) > rhs.m_value || lhs == rhs; + } - template ::value>::type> - friend bool operator >= ( Approx const& lhs, T const& rhs ) { - return lhs.m_value > static_cast(rhs) || lhs == rhs; - } + template ::value>::type> + friend bool operator >= ( Approx const& lhs, T const& rhs ) { + return lhs.m_value > static_cast(rhs) || lhs == rhs; + } - template ::value>::type> - Approx& epsilon( T const& newEpsilon ) { - double epsilonAsDouble = static_cast(newEpsilon); - setEpsilon(epsilonAsDouble); - return *this; - } + template ::value>::type> + Approx& epsilon( T const& newEpsilon ) { + double epsilonAsDouble = static_cast(newEpsilon); + setEpsilon(epsilonAsDouble); + return *this; + } - template ::value>::type> - Approx& margin( T const& newMargin ) { - double marginAsDouble = static_cast(newMargin); - setMargin(marginAsDouble); - return *this; - } + template ::value>::type> + Approx& margin( T const& newMargin ) { + double marginAsDouble = static_cast(newMargin); + setMargin(marginAsDouble); + return *this; + } - template ::value>::type> - Approx& scale( T const& newScale ) { - m_scale = static_cast(newScale); - return *this; - } + template ::value>::type> + Approx& scale( T const& newScale ) { + m_scale = static_cast(newScale); + return *this; + } - std::string toString() const; + std::string toString() const; - private: - double m_epsilon; - double m_margin; - double m_scale; - double m_value; - }; -} // end namespace Detail + private: + double m_epsilon; + double m_margin; + double m_scale; + double m_value; + }; + } // end namespace Detail -namespace literals { - Detail::Approx operator "" _a(long double val); - Detail::Approx operator "" _a(unsigned long long val); -} // end namespace literals + namespace literals { + Detail::Approx operator "" _a(long double val); + Detail::Approx operator "" _a(unsigned long long val); + } // end namespace literals -template<> -struct StringMaker { - static std::string convert(Catch::Detail::Approx const& value); -}; + template<> + struct StringMaker { + static std::string convert(Catch::Detail::Approx const& value); + }; } // end namespace Catch // end catch_approx.h // start catch_string_manip.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iosfwd" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" +#include +#include +#include namespace Catch { @@ -3227,42 +3229,42 @@ namespace Catch { // start catch_matchers.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" +#include +#include namespace Catch { -namespace Matchers { - namespace Impl { - - template struct MatchAllOf; - template struct MatchAnyOf; - template struct MatchNotOf; + namespace Matchers { + namespace Impl { - class MatcherUntypedBase { - public: - MatcherUntypedBase() = default; - MatcherUntypedBase ( MatcherUntypedBase const& ) = default; - MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = delete; - std::string toString() const; + template struct MatchAllOf; + template struct MatchAnyOf; + template struct MatchNotOf; - protected: - virtual ~MatcherUntypedBase(); - virtual std::string describe() const = 0; - mutable std::string m_cachedToString; - }; + class MatcherUntypedBase { + public: + MatcherUntypedBase() = default; + MatcherUntypedBase ( MatcherUntypedBase const& ) = default; + MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = delete; + std::string toString() const; + + protected: + virtual ~MatcherUntypedBase(); + virtual std::string describe() const = 0; + mutable std::string m_cachedToString; + }; #ifdef __clang__ -# pragma clang diagnostic push + # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wnon-virtual-dtor" #endif - template - struct MatcherMethod { - virtual bool match( ObjectT const& arg ) const = 0; - }; + template + struct MatcherMethod { + virtual bool match( ObjectT const& arg ) const = 0; + }; #if defined(__OBJC__) - // Hack to fix Catch GH issue #1661. Could use id for generic Object support. + // Hack to fix Catch GH issue #1661. Could use id for generic Object support. // use of const for Object pointers is very uncommon and under ARC it causes some kind of signature mismatch that breaks compilation template<> struct MatcherMethod { @@ -3274,116 +3276,116 @@ namespace Matchers { # pragma clang diagnostic pop #endif - template - struct MatcherBase : MatcherUntypedBase, MatcherMethod { + template + struct MatcherBase : MatcherUntypedBase, MatcherMethod { - MatchAllOf operator && ( MatcherBase const& other ) const; - MatchAnyOf operator || ( MatcherBase const& other ) const; - MatchNotOf operator ! () const; - }; + MatchAllOf operator && ( MatcherBase const& other ) const; + MatchAnyOf operator || ( MatcherBase const& other ) const; + MatchNotOf operator ! () const; + }; - template - struct MatchAllOf : MatcherBase { - bool match( ArgT const& arg ) const override { - for( auto matcher : m_matchers ) { - if (!matcher->match(arg)) - return false; + template + struct MatchAllOf : MatcherBase { + bool match( ArgT const& arg ) const override { + for( auto matcher : m_matchers ) { + if (!matcher->match(arg)) + return false; + } + return true; } - return true; - } - std::string describe() const override { - std::string description; - description.reserve( 4 + m_matchers.size()*32 ); - description += "( "; - bool first = true; - for( auto matcher : m_matchers ) { - if( first ) - first = false; - else - description += " and "; - description += matcher->toString(); + std::string describe() const override { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + bool first = true; + for( auto matcher : m_matchers ) { + if( first ) + first = false; + else + description += " and "; + description += matcher->toString(); + } + description += " )"; + return description; } - description += " )"; - return description; - } - MatchAllOf operator && ( MatcherBase const& other ) { - auto copy(*this); - copy.m_matchers.push_back( &other ); - return copy; - } + MatchAllOf operator && ( MatcherBase const& other ) { + auto copy(*this); + copy.m_matchers.push_back( &other ); + return copy; + } - std::vector const*> m_matchers; - }; - template - struct MatchAnyOf : MatcherBase { + std::vector const*> m_matchers; + }; + template + struct MatchAnyOf : MatcherBase { - bool match( ArgT const& arg ) const override { - for( auto matcher : m_matchers ) { - if (matcher->match(arg)) - return true; + bool match( ArgT const& arg ) const override { + for( auto matcher : m_matchers ) { + if (matcher->match(arg)) + return true; + } + return false; } - return false; - } - std::string describe() const override { - std::string description; - description.reserve( 4 + m_matchers.size()*32 ); - description += "( "; - bool first = true; - for( auto matcher : m_matchers ) { - if( first ) - first = false; - else - description += " or "; - description += matcher->toString(); + std::string describe() const override { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + bool first = true; + for( auto matcher : m_matchers ) { + if( first ) + first = false; + else + description += " or "; + description += matcher->toString(); + } + description += " )"; + return description; } - description += " )"; - return description; - } - MatchAnyOf operator || ( MatcherBase const& other ) { - auto copy(*this); - copy.m_matchers.push_back( &other ); - return copy; - } + MatchAnyOf operator || ( MatcherBase const& other ) { + auto copy(*this); + copy.m_matchers.push_back( &other ); + return copy; + } - std::vector const*> m_matchers; - }; + std::vector const*> m_matchers; + }; - template - struct MatchNotOf : MatcherBase { + template + struct MatchNotOf : MatcherBase { - MatchNotOf( MatcherBase const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {} + MatchNotOf( MatcherBase const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {} - bool match( ArgT const& arg ) const override { - return !m_underlyingMatcher.match( arg ); - } + bool match( ArgT const& arg ) const override { + return !m_underlyingMatcher.match( arg ); + } - std::string describe() const override { - return "not " + m_underlyingMatcher.toString(); - } - MatcherBase const& m_underlyingMatcher; - }; + std::string describe() const override { + return "not " + m_underlyingMatcher.toString(); + } + MatcherBase const& m_underlyingMatcher; + }; - template - MatchAllOf MatcherBase::operator && ( MatcherBase const& other ) const { - return MatchAllOf() && *this && other; - } - template - MatchAnyOf MatcherBase::operator || ( MatcherBase const& other ) const { - return MatchAnyOf() || *this || other; - } - template - MatchNotOf MatcherBase::operator ! () const { - return MatchNotOf( *this ); - } + template + MatchAllOf MatcherBase::operator && ( MatcherBase const& other ) const { + return MatchAllOf() && *this && other; + } + template + MatchAnyOf MatcherBase::operator || ( MatcherBase const& other ) const { + return MatchAnyOf() || *this || other; + } + template + MatchNotOf MatcherBase::operator ! () const { + return MatchNotOf( *this ); + } - } // namespace Impl + } // namespace Impl -} // namespace Matchers + } // namespace Matchers -using namespace Matchers; -using Matchers::Impl::MatcherBase; + using namespace Matchers; + using Matchers::Impl::MatcherBase; } // namespace Catch @@ -3391,374 +3393,374 @@ using Matchers::Impl::MatcherBase; // start catch_matchers_exception.hpp namespace Catch { -namespace Matchers { -namespace Exception { + namespace Matchers { + namespace Exception { -class ExceptionMessageMatcher : public MatcherBase { - std::string m_message; -public: + class ExceptionMessageMatcher : public MatcherBase { + std::string m_message; + public: - ExceptionMessageMatcher(std::string const& message): - m_message(message) - {} + ExceptionMessageMatcher(std::string const& message): + m_message(message) + {} - bool match(std::exception const& ex) const override; + bool match(std::exception const& ex) const override; - std::string describe() const override; -}; + std::string describe() const override; + }; -} // namespace Exception + } // namespace Exception -Exception::ExceptionMessageMatcher Message(std::string const& message); + Exception::ExceptionMessageMatcher Message(std::string const& message); -} // namespace Matchers + } // namespace Matchers } // namespace Catch // end catch_matchers_exception.hpp // start catch_matchers_floating.h namespace Catch { -namespace Matchers { + namespace Matchers { - namespace Floating { + namespace Floating { - enum class FloatingPointKind : uint8_t; + enum class FloatingPointKind : uint8_t; - struct WithinAbsMatcher : MatcherBase { - WithinAbsMatcher(double target, double margin); - bool match(double const& matchee) const override; - std::string describe() const override; - private: - double m_target; - double m_margin; - }; + struct WithinAbsMatcher : MatcherBase { + WithinAbsMatcher(double target, double margin); + bool match(double const& matchee) const override; + std::string describe() const override; + private: + double m_target; + double m_margin; + }; - struct WithinUlpsMatcher : MatcherBase { - WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType); - bool match(double const& matchee) const override; - std::string describe() const override; - private: - double m_target; - uint64_t m_ulps; - FloatingPointKind m_type; - }; + struct WithinUlpsMatcher : MatcherBase { + WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType); + bool match(double const& matchee) const override; + std::string describe() const override; + private: + double m_target; + uint64_t m_ulps; + FloatingPointKind m_type; + }; - // Given IEEE-754 format for floats and doubles, we can assume - // that float -> double promotion is lossless. Given this, we can - // assume that if we do the standard relative comparison of - // |lhs - rhs| <= epsilon * max(fabs(lhs), fabs(rhs)), then we get - // the same result if we do this for floats, as if we do this for - // doubles that were promoted from floats. - struct WithinRelMatcher : MatcherBase { - WithinRelMatcher(double target, double epsilon); - bool match(double const& matchee) const override; - std::string describe() const override; - private: - double m_target; - double m_epsilon; - }; + // Given IEEE-754 format for floats and doubles, we can assume + // that float -> double promotion is lossless. Given this, we can + // assume that if we do the standard relative comparison of + // |lhs - rhs| <= epsilon * max(fabs(lhs), fabs(rhs)), then we get + // the same result if we do this for floats, as if we do this for + // doubles that were promoted from floats. + struct WithinRelMatcher : MatcherBase { + WithinRelMatcher(double target, double epsilon); + bool match(double const& matchee) const override; + std::string describe() const override; + private: + double m_target; + double m_epsilon; + }; - } // namespace Floating - - // The following functions create the actual matcher objects. - // This allows the types to be inferred - Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff); - Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff); - Floating::WithinAbsMatcher WithinAbs(double target, double margin); - Floating::WithinRelMatcher WithinRel(double target, double eps); - // defaults epsilon to 100*numeric_limits::epsilon() - Floating::WithinRelMatcher WithinRel(double target); - Floating::WithinRelMatcher WithinRel(float target, float eps); - // defaults epsilon to 100*numeric_limits::epsilon() - Floating::WithinRelMatcher WithinRel(float target); - -} // namespace Matchers + } // namespace Floating + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff); + Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff); + Floating::WithinAbsMatcher WithinAbs(double target, double margin); + Floating::WithinRelMatcher WithinRel(double target, double eps); + // defaults epsilon to 100*numeric_limits::epsilon() + Floating::WithinRelMatcher WithinRel(double target); + Floating::WithinRelMatcher WithinRel(float target, float eps); + // defaults epsilon to 100*numeric_limits::epsilon() + Floating::WithinRelMatcher WithinRel(float target); + + } // namespace Matchers } // namespace Catch // end catch_matchers_floating.h // start catch_matchers_generic.hpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/functional" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include +#include namespace Catch { -namespace Matchers { -namespace Generic { + namespace Matchers { + namespace Generic { -namespace Detail { - std::string finalizeDescription(const std::string& desc); -} + namespace Detail { + std::string finalizeDescription(const std::string& desc); + } -template -class PredicateMatcher : public MatcherBase { - std::function m_predicate; - std::string m_description; -public: + template + class PredicateMatcher : public MatcherBase { + std::function m_predicate; + std::string m_description; + public: - PredicateMatcher(std::function const& elem, std::string const& descr) - :m_predicate(std::move(elem)), - m_description(Detail::finalizeDescription(descr)) - {} + PredicateMatcher(std::function const& elem, std::string const& descr) + :m_predicate(std::move(elem)), + m_description(Detail::finalizeDescription(descr)) + {} - bool match( T const& item ) const override { - return m_predicate(item); - } + bool match( T const& item ) const override { + return m_predicate(item); + } - std::string describe() const override { - return m_description; - } -}; + std::string describe() const override { + return m_description; + } + }; -} // namespace Generic + } // namespace Generic - // The following functions create the actual matcher objects. - // The user has to explicitly specify type to the function, because - // inferring std::function is hard (but possible) and - // requires a lot of TMP. - template - Generic::PredicateMatcher Predicate(std::function const& predicate, std::string const& description = "") { - return Generic::PredicateMatcher(predicate, description); - } + // The following functions create the actual matcher objects. + // The user has to explicitly specify type to the function, because + // inferring std::function is hard (but possible) and + // requires a lot of TMP. + template + Generic::PredicateMatcher Predicate(std::function const& predicate, std::string const& description = "") { + return Generic::PredicateMatcher(predicate, description); + } -} // namespace Matchers + } // namespace Matchers } // namespace Catch // end catch_matchers_generic.hpp // start catch_matchers_string.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include namespace Catch { -namespace Matchers { + namespace Matchers { - namespace StdString { + namespace StdString { - struct CasedString - { - CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ); - std::string adjustString( std::string const& str ) const; - std::string caseSensitivitySuffix() const; + struct CasedString + { + CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ); + std::string adjustString( std::string const& str ) const; + std::string caseSensitivitySuffix() const; - CaseSensitive::Choice m_caseSensitivity; - std::string m_str; - }; + CaseSensitive::Choice m_caseSensitivity; + std::string m_str; + }; - struct StringMatcherBase : MatcherBase { - StringMatcherBase( std::string const& operation, CasedString const& comparator ); - std::string describe() const override; + struct StringMatcherBase : MatcherBase { + StringMatcherBase( std::string const& operation, CasedString const& comparator ); + std::string describe() const override; - CasedString m_comparator; - std::string m_operation; - }; + CasedString m_comparator; + std::string m_operation; + }; - struct EqualsMatcher : StringMatcherBase { - EqualsMatcher( CasedString const& comparator ); - bool match( std::string const& source ) const override; - }; - struct ContainsMatcher : StringMatcherBase { - ContainsMatcher( CasedString const& comparator ); - bool match( std::string const& source ) const override; - }; - struct StartsWithMatcher : StringMatcherBase { - StartsWithMatcher( CasedString const& comparator ); - bool match( std::string const& source ) const override; - }; - struct EndsWithMatcher : StringMatcherBase { - EndsWithMatcher( CasedString const& comparator ); - bool match( std::string const& source ) const override; - }; + struct EqualsMatcher : StringMatcherBase { + EqualsMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + struct ContainsMatcher : StringMatcherBase { + ContainsMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + struct StartsWithMatcher : StringMatcherBase { + StartsWithMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + struct EndsWithMatcher : StringMatcherBase { + EndsWithMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; - struct RegexMatcher : MatcherBase { - RegexMatcher( std::string regex, CaseSensitive::Choice caseSensitivity ); - bool match( std::string const& matchee ) const override; - std::string describe() const override; + struct RegexMatcher : MatcherBase { + RegexMatcher( std::string regex, CaseSensitive::Choice caseSensitivity ); + bool match( std::string const& matchee ) const override; + std::string describe() const override; - private: - std::string m_regex; - CaseSensitive::Choice m_caseSensitivity; - }; + private: + std::string m_regex; + CaseSensitive::Choice m_caseSensitivity; + }; - } // namespace StdString + } // namespace StdString - // The following functions create the actual matcher objects. - // This allows the types to be inferred + // The following functions create the actual matcher objects. + // This allows the types to be inferred - StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); - StdString::RegexMatcher Matches( std::string const& regex, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::RegexMatcher Matches( std::string const& regex, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); -} // namespace Matchers + } // namespace Matchers } // namespace Catch // end catch_matchers_string.h // start catch_matchers_vector.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" +#include namespace Catch { -namespace Matchers { + namespace Matchers { - namespace Vector { - template - struct ContainsElementMatcher : MatcherBase> { + namespace Vector { + template + struct ContainsElementMatcher : MatcherBase> { - ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} + ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} - bool match(std::vector const &v) const override { - for (auto const& el : v) { - if (el == m_comparator) { - return true; + bool match(std::vector const &v) const override { + for (auto const& el : v) { + if (el == m_comparator) { + return true; + } } + return false; } - return false; - } - std::string describe() const override { - return "Contains: " + ::Catch::Detail::stringify( m_comparator ); - } + std::string describe() const override { + return "Contains: " + ::Catch::Detail::stringify( m_comparator ); + } - T const& m_comparator; - }; + T const& m_comparator; + }; - template - struct ContainsMatcher : MatcherBase> { + template + struct ContainsMatcher : MatcherBase> { - ContainsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} + ContainsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} - bool match(std::vector const &v) const override { - // !TBD: see note in EqualsMatcher - if (m_comparator.size() > v.size()) - return false; - for (auto const& comparator : m_comparator) { - auto present = false; - for (const auto& el : v) { - if (el == comparator) { - present = true; - break; - } - } - if (!present) { + bool match(std::vector const &v) const override { + // !TBD: see note in EqualsMatcher + if (m_comparator.size() > v.size()) return false; + for (auto const& comparator : m_comparator) { + auto present = false; + for (const auto& el : v) { + if (el == comparator) { + present = true; + break; + } + } + if (!present) { + return false; + } } + return true; + } + std::string describe() const override { + return "Contains: " + ::Catch::Detail::stringify( m_comparator ); } - return true; - } - std::string describe() const override { - return "Contains: " + ::Catch::Detail::stringify( m_comparator ); - } - std::vector const& m_comparator; - }; + std::vector const& m_comparator; + }; - template - struct EqualsMatcher : MatcherBase> { + template + struct EqualsMatcher : MatcherBase> { - EqualsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} + EqualsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} - bool match(std::vector const &v) const override { - // !TBD: This currently works if all elements can be compared using != - // - a more general approach would be via a compare template that defaults - // to using !=. but could be specialised for, e.g. std::vector etc - // - then just call that directly - if (m_comparator.size() != v.size()) - return false; - for (std::size_t i = 0; i < v.size(); ++i) - if (m_comparator[i] != v[i]) + bool match(std::vector const &v) const override { + // !TBD: This currently works if all elements can be compared using != + // - a more general approach would be via a compare template that defaults + // to using !=. but could be specialised for, e.g. std::vector etc + // - then just call that directly + if (m_comparator.size() != v.size()) return false; - return true; - } - std::string describe() const override { - return "Equals: " + ::Catch::Detail::stringify( m_comparator ); - } - std::vector const& m_comparator; - }; + for (std::size_t i = 0; i < v.size(); ++i) + if (m_comparator[i] != v[i]) + return false; + return true; + } + std::string describe() const override { + return "Equals: " + ::Catch::Detail::stringify( m_comparator ); + } + std::vector const& m_comparator; + }; - template - struct ApproxMatcher : MatcherBase> { + template + struct ApproxMatcher : MatcherBase> { - ApproxMatcher(std::vector const& comparator) : m_comparator( comparator ) {} + ApproxMatcher(std::vector const& comparator) : m_comparator( comparator ) {} - bool match(std::vector const &v) const override { - if (m_comparator.size() != v.size()) - return false; - for (std::size_t i = 0; i < v.size(); ++i) - if (m_comparator[i] != approx(v[i])) + bool match(std::vector const &v) const override { + if (m_comparator.size() != v.size()) return false; - return true; - } - std::string describe() const override { - return "is approx: " + ::Catch::Detail::stringify( m_comparator ); - } - template ::value>::type> - ApproxMatcher& epsilon( T const& newEpsilon ) { - approx.epsilon(newEpsilon); - return *this; - } - template ::value>::type> - ApproxMatcher& margin( T const& newMargin ) { - approx.margin(newMargin); - return *this; - } - template ::value>::type> - ApproxMatcher& scale( T const& newScale ) { - approx.scale(newScale); - return *this; - } + for (std::size_t i = 0; i < v.size(); ++i) + if (m_comparator[i] != approx(v[i])) + return false; + return true; + } + std::string describe() const override { + return "is approx: " + ::Catch::Detail::stringify( m_comparator ); + } + template ::value>::type> + ApproxMatcher& epsilon( T const& newEpsilon ) { + approx.epsilon(newEpsilon); + return *this; + } + template ::value>::type> + ApproxMatcher& margin( T const& newMargin ) { + approx.margin(newMargin); + return *this; + } + template ::value>::type> + ApproxMatcher& scale( T const& newScale ) { + approx.scale(newScale); + return *this; + } - std::vector const& m_comparator; - mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom(); - }; + std::vector const& m_comparator; + mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom(); + }; - template - struct UnorderedEqualsMatcher : MatcherBase> { - UnorderedEqualsMatcher(std::vector const& target) : m_target(target) {} - bool match(std::vector const& vec) const override { - if (m_target.size() != vec.size()) { - return false; + template + struct UnorderedEqualsMatcher : MatcherBase> { + UnorderedEqualsMatcher(std::vector const& target) : m_target(target) {} + bool match(std::vector const& vec) const override { + if (m_target.size() != vec.size()) { + return false; + } + return std::is_permutation(m_target.begin(), m_target.end(), vec.begin()); } - return std::is_permutation(m_target.begin(), m_target.end(), vec.begin()); - } - std::string describe() const override { - return "UnorderedEquals: " + ::Catch::Detail::stringify(m_target); - } - private: - std::vector const& m_target; - }; + std::string describe() const override { + return "UnorderedEquals: " + ::Catch::Detail::stringify(m_target); + } + private: + std::vector const& m_target; + }; - } // namespace Vector + } // namespace Vector - // The following functions create the actual matcher objects. - // This allows the types to be inferred + // The following functions create the actual matcher objects. + // This allows the types to be inferred - template, typename AllocMatch = AllocComp> - Vector::ContainsMatcher Contains( std::vector const& comparator ) { - return Vector::ContainsMatcher( comparator ); - } + template, typename AllocMatch = AllocComp> + Vector::ContainsMatcher Contains( std::vector const& comparator ) { + return Vector::ContainsMatcher( comparator ); + } - template> - Vector::ContainsElementMatcher VectorContains( T const& comparator ) { - return Vector::ContainsElementMatcher( comparator ); - } + template> + Vector::ContainsElementMatcher VectorContains( T const& comparator ) { + return Vector::ContainsElementMatcher( comparator ); + } - template, typename AllocMatch = AllocComp> - Vector::EqualsMatcher Equals( std::vector const& comparator ) { - return Vector::EqualsMatcher( comparator ); - } + template, typename AllocMatch = AllocComp> + Vector::EqualsMatcher Equals( std::vector const& comparator ) { + return Vector::EqualsMatcher( comparator ); + } - template, typename AllocMatch = AllocComp> - Vector::ApproxMatcher Approx( std::vector const& comparator ) { - return Vector::ApproxMatcher( comparator ); - } + template, typename AllocMatch = AllocComp> + Vector::ApproxMatcher Approx( std::vector const& comparator ) { + return Vector::ApproxMatcher( comparator ); + } - template, typename AllocMatch = AllocComp> - Vector::UnorderedEqualsMatcher UnorderedEquals(std::vector const& target) { - return Vector::UnorderedEqualsMatcher( target ); - } + template, typename AllocMatch = AllocComp> + Vector::UnorderedEqualsMatcher UnorderedEquals(std::vector const& target) { + return Vector::UnorderedEqualsMatcher( target ); + } -} // namespace Matchers + } // namespace Matchers } // namespace Catch // end catch_matchers_vector.h @@ -3771,10 +3773,10 @@ namespace Catch { StringRef m_matcherString; public: MatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString ) - : ITransientExpression{ true, matcher.match( arg ) }, - m_arg( arg ), - m_matcher( matcher ), - m_matcherString( matcherString ) + : ITransientExpression{ true, matcher.match( arg ) }, + m_arg( arg ), + m_matcher( matcher ), + m_matcherString( matcherString ) {} void streamReconstructedExpression( std::ostream &os ) const override { @@ -3835,7 +3837,7 @@ namespace Catch { // start catch_interfaces_generatortracker.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include namespace Catch { @@ -3845,9 +3847,9 @@ namespace Catch { GeneratorUntypedBase() = default; virtual ~GeneratorUntypedBase(); // Attempts to move the generator to the next element - // - // Returns true iff the move succeeded (and a valid element - // can be retrieved). + // + // Returns true iff the move succeeded (and a valid element + // can be retrieved). virtual bool next() = 0; }; using GeneratorBasePtr = std::unique_ptr; @@ -3866,7 +3868,7 @@ namespace Catch { // end catch_interfaces_generatortracker.h // start catch_enforce.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/exception" +#include namespace Catch { #if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) @@ -3905,194 +3907,194 @@ namespace Catch { do{ if( !(condition) ) CATCH_ERROR( __VA_ARGS__ ); } while(false) // end catch_enforce.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" +#include +#include +#include -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/utility" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/exception" +#include +#include namespace Catch { -class GeneratorException : public std::exception { - const char* const m_msg = ""; - -public: - GeneratorException(const char* msg): - m_msg(msg) - {} - - const char* what() const noexcept override final; -}; + class GeneratorException : public std::exception { + const char* const m_msg = ""; -namespace Generators { - - // !TBD move this into its own location? - namespace pf{ - template - std::unique_ptr make_unique( Args&&... args ) { - return std::unique_ptr(new T(std::forward(args)...)); - } - } + public: + GeneratorException(const char* msg): + m_msg(msg) + {} - template - struct IGenerator : GeneratorUntypedBase { - virtual ~IGenerator() = default; - - // Returns the current element of the generator - // - // \Precondition The generator is either freshly constructed, - // or the last call to `next()` returned true - virtual T const& get() const = 0; - using type = T; + const char* what() const noexcept override final; }; - template - class SingleValueGenerator final : public IGenerator { - T m_value; - public: - SingleValueGenerator(T&& value) : m_value(std::move(value)) {} + namespace Generators { - T const& get() const override { - return m_value; - } - bool next() override { - return false; + // !TBD move this into its own location? + namespace pf{ + template + std::unique_ptr make_unique( Args&&... args ) { + return std::unique_ptr(new T(std::forward(args)...)); + } } - }; - template - class FixedValuesGenerator final : public IGenerator { - static_assert(!std::is_same::value, - "FixedValuesGenerator does not support bools because of std::vector" - "specialization, use SingleValue Generator instead."); - std::vector m_values; - size_t m_idx = 0; - public: - FixedValuesGenerator( std::initializer_list values ) : m_values( values ) {} + template + struct IGenerator : GeneratorUntypedBase { + virtual ~IGenerator() = default; + + // Returns the current element of the generator + // + // \Precondition The generator is either freshly constructed, + // or the last call to `next()` returned true + virtual T const& get() const = 0; + using type = T; + }; - T const& get() const override { - return m_values[m_idx]; - } - bool next() override { - ++m_idx; - return m_idx < m_values.size(); - } - }; + template + class SingleValueGenerator final : public IGenerator { + T m_value; + public: + SingleValueGenerator(T&& value) : m_value(std::move(value)) {} - template - class GeneratorWrapper final { - std::unique_ptr> m_generator; - public: - GeneratorWrapper(std::unique_ptr> generator): - m_generator(std::move(generator)) - {} - T const& get() const { - return m_generator->get(); - } - bool next() { - return m_generator->next(); - } - }; + T const& get() const override { + return m_value; + } + bool next() override { + return false; + } + }; - template - GeneratorWrapper value(T&& value) { - return GeneratorWrapper(pf::make_unique>(std::forward(value))); - } - template - GeneratorWrapper values(std::initializer_list values) { - return GeneratorWrapper(pf::make_unique>(values)); - } + template + class FixedValuesGenerator final : public IGenerator { + static_assert(!std::is_same::value, + "FixedValuesGenerator does not support bools because of std::vector" + "specialization, use SingleValue Generator instead."); + std::vector m_values; + size_t m_idx = 0; + public: + FixedValuesGenerator( std::initializer_list values ) : m_values( values ) {} - template - class Generators : public IGenerator { - std::vector> m_generators; - size_t m_current = 0; + T const& get() const override { + return m_values[m_idx]; + } + bool next() override { + ++m_idx; + return m_idx < m_values.size(); + } + }; - void populate(GeneratorWrapper&& generator) { - m_generators.emplace_back(std::move(generator)); - } - void populate(T&& val) { - m_generators.emplace_back(value(std::forward(val))); - } - template - void populate(U&& val) { - populate(T(std::forward(val))); + template + class GeneratorWrapper final { + std::unique_ptr> m_generator; + public: + GeneratorWrapper(std::unique_ptr> generator): + m_generator(std::move(generator)) + {} + T const& get() const { + return m_generator->get(); + } + bool next() { + return m_generator->next(); + } + }; + + template + GeneratorWrapper value(T&& value) { + return GeneratorWrapper(pf::make_unique>(std::forward(value))); } - template - void populate(U&& valueOrGenerator, Gs &&... moreGenerators) { - populate(std::forward(valueOrGenerator)); - populate(std::forward(moreGenerators)...); + template + GeneratorWrapper values(std::initializer_list values) { + return GeneratorWrapper(pf::make_unique>(values)); } - public: - template - Generators(Gs &&... moreGenerators) { - m_generators.reserve(sizeof...(Gs)); - populate(std::forward(moreGenerators)...); - } + template + class Generators : public IGenerator { + std::vector> m_generators; + size_t m_current = 0; - T const& get() const override { - return m_generators[m_current].get(); - } + void populate(GeneratorWrapper&& generator) { + m_generators.emplace_back(std::move(generator)); + } + void populate(T&& val) { + m_generators.emplace_back(value(std::forward(val))); + } + template + void populate(U&& val) { + populate(T(std::forward(val))); + } + template + void populate(U&& valueOrGenerator, Gs &&... moreGenerators) { + populate(std::forward(valueOrGenerator)); + populate(std::forward(moreGenerators)...); + } - bool next() override { - if (m_current >= m_generators.size()) { - return false; + public: + template + Generators(Gs &&... moreGenerators) { + m_generators.reserve(sizeof...(Gs)); + populate(std::forward(moreGenerators)...); } - const bool current_status = m_generators[m_current].next(); - if (!current_status) { - ++m_current; + + T const& get() const override { + return m_generators[m_current].get(); + } + + bool next() override { + if (m_current >= m_generators.size()) { + return false; + } + const bool current_status = m_generators[m_current].next(); + if (!current_status) { + ++m_current; + } + return m_current < m_generators.size(); } - return m_current < m_generators.size(); + }; + + template + GeneratorWrapper> table( std::initializer_list::type...>> tuples ) { + return values>( tuples ); } - }; - template - GeneratorWrapper> table( std::initializer_list::type...>> tuples ) { - return values>( tuples ); - } + // Tag type to signal that a generator sequence should convert arguments to a specific type + template + struct as {}; - // Tag type to signal that a generator sequence should convert arguments to a specific type - template - struct as {}; + template + auto makeGenerators( GeneratorWrapper&& generator, Gs &&... moreGenerators ) -> Generators { + return Generators(std::move(generator), std::forward(moreGenerators)...); + } + template + auto makeGenerators( GeneratorWrapper&& generator ) -> Generators { + return Generators(std::move(generator)); + } + template + auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generators { + return makeGenerators( value( std::forward( val ) ), std::forward( moreGenerators )... ); + } + template + auto makeGenerators( as, U&& val, Gs &&... moreGenerators ) -> Generators { + return makeGenerators( value( T( std::forward( val ) ) ), std::forward( moreGenerators )... ); + } - template - auto makeGenerators( GeneratorWrapper&& generator, Gs &&... moreGenerators ) -> Generators { - return Generators(std::move(generator), std::forward(moreGenerators)...); - } - template - auto makeGenerators( GeneratorWrapper&& generator ) -> Generators { - return Generators(std::move(generator)); - } - template - auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generators { - return makeGenerators( value( std::forward( val ) ), std::forward( moreGenerators )... ); - } - template - auto makeGenerators( as, U&& val, Gs &&... moreGenerators ) -> Generators { - return makeGenerators( value( T( std::forward( val ) ) ), std::forward( moreGenerators )... ); - } + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker&; - auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker&; + template + // Note: The type after -> is weird, because VS2015 cannot parse + // the expression used in the typedef inside, when it is in + // return type. Yeah. + auto generate( StringRef generatorName, SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval().get()) { + using UnderlyingType = typename decltype(generatorExpression())::type; - template - // Note: The type after -> is weird, because VS2015 cannot parse - // the expression used in the typedef inside, when it is in - // return type. Yeah. - auto generate( StringRef generatorName, SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval().get()) { - using UnderlyingType = typename decltype(generatorExpression())::type; + IGeneratorTracker& tracker = acquireGeneratorTracker( generatorName, lineInfo ); + if (!tracker.hasGenerator()) { + tracker.setGenerator(pf::make_unique>(generatorExpression())); + } - IGeneratorTracker& tracker = acquireGeneratorTracker( generatorName, lineInfo ); - if (!tracker.hasGenerator()) { - tracker.setGenerator(pf::make_unique>(generatorExpression())); + auto const& generator = static_cast const&>( *tracker.getGenerator() ); + return generator.get(); } - auto const& generator = static_cast const&>( *tracker.getGenerator() ); - return generator.get(); - } - -} // namespace Generators + } // namespace Generators } // namespace Catch #define GENERATE( ... ) \ @@ -4112,224 +4114,229 @@ namespace Generators { // start catch_generators_generic.hpp namespace Catch { -namespace Generators { + namespace Generators { - template - class TakeGenerator : public IGenerator { - GeneratorWrapper m_generator; - size_t m_returned = 0; - size_t m_target; - public: - TakeGenerator(size_t target, GeneratorWrapper&& generator): - m_generator(std::move(generator)), - m_target(target) - { - assert(target != 0 && "Empty generators are not allowed"); - } - T const& get() const override { - return m_generator.get(); - } - bool next() override { - ++m_returned; - if (m_returned >= m_target) { - return false; + template + class TakeGenerator : public IGenerator { + GeneratorWrapper m_generator; + size_t m_returned = 0; + size_t m_target; + public: + TakeGenerator(size_t target, GeneratorWrapper&& generator): + m_generator(std::move(generator)), + m_target(target) + { + assert(target != 0 && "Empty generators are not allowed"); + } + T const& get() const override { + return m_generator.get(); } + bool next() override { + ++m_returned; + if (m_returned >= m_target) { + return false; + } - const auto success = m_generator.next(); - // If the underlying generator does not contain enough values - // then we cut short as well - if (!success) { - m_returned = m_target; + const auto success = m_generator.next(); + // If the underlying generator does not contain enough values + // then we cut short as well + if (!success) { + m_returned = m_target; + } + return success; } - return success; - } - }; + }; - template - GeneratorWrapper take(size_t target, GeneratorWrapper&& generator) { - return GeneratorWrapper(pf::make_unique>(target, std::move(generator))); - } + template + GeneratorWrapper take(size_t target, GeneratorWrapper&& generator) { + return GeneratorWrapper(pf::make_unique>(target, std::move(generator))); + } - template - class FilterGenerator : public IGenerator { - GeneratorWrapper m_generator; - Predicate m_predicate; - public: - template - FilterGenerator(P&& pred, GeneratorWrapper&& generator): - m_generator(std::move(generator)), - m_predicate(std::forward

(pred)) - { - if (!m_predicate(m_generator.get())) { - // It might happen that there are no values that pass the - // filter. In that case we throw an exception. - auto has_initial_value = next(); - if (!has_initial_value) { - Catch::throw_exception(GeneratorException("No valid value found in filtered generator")); + template + class FilterGenerator : public IGenerator { + GeneratorWrapper m_generator; + Predicate m_predicate; + public: + template + FilterGenerator(P&& pred, GeneratorWrapper&& generator): + m_generator(std::move(generator)), + m_predicate(std::forward

(pred)) + { + if (!m_predicate(m_generator.get())) { + // It might happen that there are no values that pass the + // filter. In that case we throw an exception. + auto has_initial_value = nextImpl(); + if (!has_initial_value) { + Catch::throw_exception(GeneratorException("No valid value found in filtered generator")); + } } } - } - T const& get() const override { - return m_generator.get(); - } + T const& get() const override { + return m_generator.get(); + } - bool next() override { - bool success = m_generator.next(); - if (!success) { - return false; + bool next() override { + return nextImpl(); } - while (!m_predicate(m_generator.get()) && (success = m_generator.next()) == true); - return success; - } - }; - template - GeneratorWrapper filter(Predicate&& pred, GeneratorWrapper&& generator) { - return GeneratorWrapper(std::unique_ptr>(pf::make_unique>(std::forward(pred), std::move(generator)))); - } + private: + bool nextImpl() { + bool success = m_generator.next(); + if (!success) { + return false; + } + while (!m_predicate(m_generator.get()) && (success = m_generator.next()) == true); + return success; + } + }; - template - class RepeatGenerator : public IGenerator { - static_assert(!std::is_same::value, - "RepeatGenerator currently does not support bools" - "because of std::vector specialization"); - GeneratorWrapper m_generator; - mutable std::vector m_returned; - size_t m_target_repeats; - size_t m_current_repeat = 0; - size_t m_repeat_index = 0; - public: - RepeatGenerator(size_t repeats, GeneratorWrapper&& generator): - m_generator(std::move(generator)), - m_target_repeats(repeats) - { - assert(m_target_repeats > 0 && "Repeat generator must repeat at least once"); + template + GeneratorWrapper filter(Predicate&& pred, GeneratorWrapper&& generator) { + return GeneratorWrapper(std::unique_ptr>(pf::make_unique>(std::forward(pred), std::move(generator)))); } - T const& get() const override { - if (m_current_repeat == 0) { - m_returned.push_back(m_generator.get()); - return m_returned.back(); + template + class RepeatGenerator : public IGenerator { + static_assert(!std::is_same::value, + "RepeatGenerator currently does not support bools" + "because of std::vector specialization"); + GeneratorWrapper m_generator; + mutable std::vector m_returned; + size_t m_target_repeats; + size_t m_current_repeat = 0; + size_t m_repeat_index = 0; + public: + RepeatGenerator(size_t repeats, GeneratorWrapper&& generator): + m_generator(std::move(generator)), + m_target_repeats(repeats) + { + assert(m_target_repeats > 0 && "Repeat generator must repeat at least once"); + } + + T const& get() const override { + if (m_current_repeat == 0) { + m_returned.push_back(m_generator.get()); + return m_returned.back(); + } + return m_returned[m_repeat_index]; } - return m_returned[m_repeat_index]; - } - bool next() override { - // There are 2 basic cases: - // 1) We are still reading the generator - // 2) We are reading our own cache + bool next() override { + // There are 2 basic cases: + // 1) We are still reading the generator + // 2) We are reading our own cache + + // In the first case, we need to poke the underlying generator. + // If it happily moves, we are left in that state, otherwise it is time to start reading from our cache + if (m_current_repeat == 0) { + const auto success = m_generator.next(); + if (!success) { + ++m_current_repeat; + } + return m_current_repeat < m_target_repeats; + } - // In the first case, we need to poke the underlying generator. - // If it happily moves, we are left in that state, otherwise it is time to start reading from our cache - if (m_current_repeat == 0) { - const auto success = m_generator.next(); - if (!success) { + // In the second case, we need to move indices forward and check that we haven't run up against the end + ++m_repeat_index; + if (m_repeat_index == m_returned.size()) { + m_repeat_index = 0; ++m_current_repeat; } return m_current_repeat < m_target_repeats; } + }; - // In the second case, we need to move indices forward and check that we haven't run up against the end - ++m_repeat_index; - if (m_repeat_index == m_returned.size()) { - m_repeat_index = 0; - ++m_current_repeat; - } - return m_current_repeat < m_target_repeats; + template + GeneratorWrapper repeat(size_t repeats, GeneratorWrapper&& generator) { + return GeneratorWrapper(pf::make_unique>(repeats, std::move(generator))); } - }; - - template - GeneratorWrapper repeat(size_t repeats, GeneratorWrapper&& generator) { - return GeneratorWrapper(pf::make_unique>(repeats, std::move(generator))); - } - template - class MapGenerator : public IGenerator { - // TBD: provide static assert for mapping function, for friendly error message - GeneratorWrapper m_generator; - Func m_function; - // To avoid returning dangling reference, we have to save the values - T m_cache; - public: - template - MapGenerator(F2&& function, GeneratorWrapper&& generator) : - m_generator(std::move(generator)), - m_function(std::forward(function)), - m_cache(m_function(m_generator.get())) - {} + template + class MapGenerator : public IGenerator { + // TBD: provide static assert for mapping function, for friendly error message + GeneratorWrapper m_generator; + Func m_function; + // To avoid returning dangling reference, we have to save the values + T m_cache; + public: + template + MapGenerator(F2&& function, GeneratorWrapper&& generator) : + m_generator(std::move(generator)), + m_function(std::forward(function)), + m_cache(m_function(m_generator.get())) + {} - T const& get() const override { - return m_cache; - } - bool next() override { - const auto success = m_generator.next(); - if (success) { - m_cache = m_function(m_generator.get()); + T const& get() const override { + return m_cache; } - return success; - } - }; + bool next() override { + const auto success = m_generator.next(); + if (success) { + m_cache = m_function(m_generator.get()); + } + return success; + } + }; - template > - GeneratorWrapper map(Func&& function, GeneratorWrapper&& generator) { - return GeneratorWrapper( - pf::make_unique>(std::forward(function), std::move(generator)) - ); - } + template > + GeneratorWrapper map(Func&& function, GeneratorWrapper&& generator) { + return GeneratorWrapper( + pf::make_unique>(std::forward(function), std::move(generator)) + ); + } - template - GeneratorWrapper map(Func&& function, GeneratorWrapper&& generator) { - return GeneratorWrapper( - pf::make_unique>(std::forward(function), std::move(generator)) - ); - } + template + GeneratorWrapper map(Func&& function, GeneratorWrapper&& generator) { + return GeneratorWrapper( + pf::make_unique>(std::forward(function), std::move(generator)) + ); + } - template - class ChunkGenerator final : public IGenerator> { - std::vector m_chunk; - size_t m_chunk_size; - GeneratorWrapper m_generator; - bool m_used_up = false; - public: - ChunkGenerator(size_t size, GeneratorWrapper generator) : - m_chunk_size(size), m_generator(std::move(generator)) - { - m_chunk.reserve(m_chunk_size); - if (m_chunk_size != 0) { - m_chunk.push_back(m_generator.get()); - for (size_t i = 1; i < m_chunk_size; ++i) { - if (!m_generator.next()) { - Catch::throw_exception(GeneratorException("Not enough values to initialize the first chunk")); - } + template + class ChunkGenerator final : public IGenerator> { + std::vector m_chunk; + size_t m_chunk_size; + GeneratorWrapper m_generator; + bool m_used_up = false; + public: + ChunkGenerator(size_t size, GeneratorWrapper generator) : + m_chunk_size(size), m_generator(std::move(generator)) + { + m_chunk.reserve(m_chunk_size); + if (m_chunk_size != 0) { m_chunk.push_back(m_generator.get()); + for (size_t i = 1; i < m_chunk_size; ++i) { + if (!m_generator.next()) { + Catch::throw_exception(GeneratorException("Not enough values to initialize the first chunk")); + } + m_chunk.push_back(m_generator.get()); + } } } - } - std::vector const& get() const override { - return m_chunk; - } - bool next() override { - m_chunk.clear(); - for (size_t idx = 0; idx < m_chunk_size; ++idx) { - if (!m_generator.next()) { - return false; + std::vector const& get() const override { + return m_chunk; + } + bool next() override { + m_chunk.clear(); + for (size_t idx = 0; idx < m_chunk_size; ++idx) { + if (!m_generator.next()) { + return false; + } + m_chunk.push_back(m_generator.get()); } - m_chunk.push_back(m_generator.get()); + return true; } - return true; - } - }; + }; - template - GeneratorWrapper> chunk(size_t size, GeneratorWrapper&& generator) { - return GeneratorWrapper>( - pf::make_unique>(size, std::move(generator)) - ); - } + template + GeneratorWrapper> chunk(size_t size, GeneratorWrapper&& generator) { + return GeneratorWrapper>( + pf::make_unique>(size, std::move(generator)) + ); + } -} // namespace Generators + } // namespace Generators } // namespace Catch // end catch_generators_generic.hpp @@ -4337,7 +4344,7 @@ namespace Generators { // start catch_context.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include namespace Catch { @@ -4403,10 +4410,10 @@ namespace Catch { public: Option() : nullableValue( nullptr ) {} Option( T const& _value ) - : nullableValue( new( storage ) T( _value ) ) + : nullableValue( new( storage ) T( _value ) ) {} Option( Option const& _other ) - : nullableValue( _other ? new( storage ) T( *_other ) : nullptr ) + : nullableValue( _other ? new( storage ) T( *_other ) : nullptr ) {} ~Option() { @@ -4458,11 +4465,11 @@ namespace Catch { } // end namespace Catch // end catch_option.hpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/chrono" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iosfwd" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include +#include +#include +#include +#include namespace Catch { @@ -4473,32 +4480,32 @@ namespace Catch { }; struct WarnAbout { enum What { - Nothing = 0x00, - NoAssertions = 0x01, - NoTests = 0x02 - }; }; + Nothing = 0x00, + NoAssertions = 0x01, + NoTests = 0x02 + }; }; struct ShowDurations { enum OrNot { - DefaultForReporter, - Always, - Never - }; }; + DefaultForReporter, + Always, + Never + }; }; struct RunTests { enum InWhatOrder { - InDeclarationOrder, - InLexicographicalOrder, - InRandomOrder - }; }; + InDeclarationOrder, + InLexicographicalOrder, + InRandomOrder + }; }; struct UseColour { enum YesOrNo { - Auto, - Yes, - No - }; }; + Auto, + Yes, + No + }; }; struct WaitForKeypress { enum When { - Never, - BeforeStart = 1, - BeforeExit = 2, - BeforeStartAndExit = BeforeStart | BeforeExit - }; }; + Never, + BeforeStart = 1, + BeforeExit = 2, + BeforeStartAndExit = BeforeStart | BeforeExit + }; }; class TestSpec; @@ -4539,7 +4546,7 @@ namespace Catch { // end catch_interfaces_config.h // start catch_random_number_generator.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdint" +#include namespace Catch { @@ -4587,160 +4594,160 @@ namespace Catch { } // end namespace Catch // end catch_random_number_generator.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/random" +#include namespace Catch { -namespace Generators { + namespace Generators { -template -class RandomFloatingGenerator final : public IGenerator { - Catch::SimplePcg32& m_rng; - std::uniform_real_distribution m_dist; - Float m_current_number; -public: + template + class RandomFloatingGenerator final : public IGenerator { + Catch::SimplePcg32& m_rng; + std::uniform_real_distribution m_dist; + Float m_current_number; + public: - RandomFloatingGenerator(Float a, Float b): - m_rng(rng()), - m_dist(a, b) { - static_cast(next()); - } + RandomFloatingGenerator(Float a, Float b): + m_rng(rng()), + m_dist(a, b) { + static_cast(next()); + } - Float const& get() const override { - return m_current_number; - } - bool next() override { - m_current_number = m_dist(m_rng); - return true; - } -}; + Float const& get() const override { + return m_current_number; + } + bool next() override { + m_current_number = m_dist(m_rng); + return true; + } + }; -template -class RandomIntegerGenerator final : public IGenerator { - Catch::SimplePcg32& m_rng; - std::uniform_int_distribution m_dist; - Integer m_current_number; -public: + template + class RandomIntegerGenerator final : public IGenerator { + Catch::SimplePcg32& m_rng; + std::uniform_int_distribution m_dist; + Integer m_current_number; + public: - RandomIntegerGenerator(Integer a, Integer b): - m_rng(rng()), - m_dist(a, b) { - static_cast(next()); - } + RandomIntegerGenerator(Integer a, Integer b): + m_rng(rng()), + m_dist(a, b) { + static_cast(next()); + } - Integer const& get() const override { - return m_current_number; - } - bool next() override { - m_current_number = m_dist(m_rng); - return true; - } -}; + Integer const& get() const override { + return m_current_number; + } + bool next() override { + m_current_number = m_dist(m_rng); + return true; + } + }; // TODO: Ideally this would be also constrained against the various char types, // but I don't expect users to run into that in practice. -template -typename std::enable_if::value && !std::is_same::value, -GeneratorWrapper>::type -random(T a, T b) { - return GeneratorWrapper( - pf::make_unique>(a, b) - ); -} - -template -typename std::enable_if::value, -GeneratorWrapper>::type -random(T a, T b) { - return GeneratorWrapper( - pf::make_unique>(a, b) - ); -} + template + typename std::enable_if::value && !std::is_same::value, + GeneratorWrapper>::type + random(T a, T b) { + return GeneratorWrapper( + pf::make_unique>(a, b) + ); + } -template -class RangeGenerator final : public IGenerator { - T m_current; - T m_end; - T m_step; - bool m_positive; - -public: - RangeGenerator(T const& start, T const& end, T const& step): - m_current(start), - m_end(end), - m_step(step), - m_positive(m_step > T(0)) - { - assert(m_current != m_end && "Range start and end cannot be equal"); - assert(m_step != T(0) && "Step size cannot be zero"); - assert(((m_positive && m_current <= m_end) || (!m_positive && m_current >= m_end)) && "Step moves away from end"); - } + template + typename std::enable_if::value, + GeneratorWrapper>::type + random(T a, T b) { + return GeneratorWrapper( + pf::make_unique>(a, b) + ); + } - RangeGenerator(T const& start, T const& end): - RangeGenerator(start, end, (start < end) ? T(1) : T(-1)) - {} + template + class RangeGenerator final : public IGenerator { + T m_current; + T m_end; + T m_step; + bool m_positive; - T const& get() const override { - return m_current; - } + public: + RangeGenerator(T const& start, T const& end, T const& step): + m_current(start), + m_end(end), + m_step(step), + m_positive(m_step > T(0)) + { + assert(m_current != m_end && "Range start and end cannot be equal"); + assert(m_step != T(0) && "Step size cannot be zero"); + assert(((m_positive && m_current <= m_end) || (!m_positive && m_current >= m_end)) && "Step moves away from end"); + } - bool next() override { - m_current += m_step; - return (m_positive) ? (m_current < m_end) : (m_current > m_end); - } -}; + RangeGenerator(T const& start, T const& end): + RangeGenerator(start, end, (start < end) ? T(1) : T(-1)) + {} -template -GeneratorWrapper range(T const& start, T const& end, T const& step) { - static_assert(std::is_arithmetic::value && !std::is_same::value, "Type must be numeric"); - return GeneratorWrapper(pf::make_unique>(start, end, step)); -} + T const& get() const override { + return m_current; + } -template -GeneratorWrapper range(T const& start, T const& end) { - static_assert(std::is_integral::value && !std::is_same::value, "Type must be an integer"); - return GeneratorWrapper(pf::make_unique>(start, end)); -} + bool next() override { + m_current += m_step; + return (m_positive) ? (m_current < m_end) : (m_current > m_end); + } + }; -template -class IteratorGenerator final : public IGenerator { - static_assert(!std::is_same::value, - "IteratorGenerator currently does not support bools" - "because of std::vector specialization"); + template + GeneratorWrapper range(T const& start, T const& end, T const& step) { + static_assert(std::is_arithmetic::value && !std::is_same::value, "Type must be numeric"); + return GeneratorWrapper(pf::make_unique>(start, end, step)); + } - std::vector m_elems; - size_t m_current = 0; -public: - template - IteratorGenerator(InputIterator first, InputSentinel last):m_elems(first, last) { - if (m_elems.empty()) { - Catch::throw_exception(GeneratorException("IteratorGenerator received no valid values")); + template + GeneratorWrapper range(T const& start, T const& end) { + static_assert(std::is_integral::value && !std::is_same::value, "Type must be an integer"); + return GeneratorWrapper(pf::make_unique>(start, end)); } - } - T const& get() const override { - return m_elems[m_current]; - } + template + class IteratorGenerator final : public IGenerator { + static_assert(!std::is_same::value, + "IteratorGenerator currently does not support bools" + "because of std::vector specialization"); - bool next() override { - ++m_current; - return m_current != m_elems.size(); - } -}; + std::vector m_elems; + size_t m_current = 0; + public: + template + IteratorGenerator(InputIterator first, InputSentinel last):m_elems(first, last) { + if (m_elems.empty()) { + Catch::throw_exception(GeneratorException("IteratorGenerator received no valid values")); + } + } -template ::value_type> -GeneratorWrapper from_range(InputIterator from, InputSentinel to) { - return GeneratorWrapper(pf::make_unique>(from, to)); -} + T const& get() const override { + return m_elems[m_current]; + } -template -GeneratorWrapper from_range(Container const& cnt) { - return GeneratorWrapper(pf::make_unique>(cnt.begin(), cnt.end())); -} + bool next() override { + ++m_current; + return m_current != m_elems.size(); + } + }; + + template ::value_type> + GeneratorWrapper from_range(InputIterator from, InputSentinel to) { + return GeneratorWrapper(pf::make_unique>(from, to)); + } + + template + GeneratorWrapper from_range(Container const& cnt) { + return GeneratorWrapper(pf::make_unique>(cnt.begin(), cnt.end())); + } -} // namespace Generators + } // namespace Generators } // namespace Catch // end catch_generators_specific.hpp @@ -4749,9 +4756,9 @@ GeneratorWrapper from_range(Container const& cnt) { // in the conditionally compiled sections // start catch_test_case_info.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include +#include +#include #ifdef __clang__ #pragma clang diagnostic push @@ -5093,9 +5100,9 @@ namespace Catch } // end catch_wildcard_pattern.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include +#include +#include namespace Catch { @@ -5171,7 +5178,7 @@ namespace Catch { // end catch_test_spec.h // start catch_interfaces_tag_alias_registry.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include namespace Catch { @@ -5251,9 +5258,9 @@ namespace Catch { // end catch_test_spec_parser.h // Libstdc++ doesn't like incomplete classes for unique_ptr -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include +#include +#include #ifndef CATCH_CONFIG_CONSOLE_WIDTH #define CATCH_CONFIG_CONSOLE_WIDTH 80 @@ -5369,7 +5376,7 @@ namespace Catch { // end catch_config.hpp // start catch_assertionresult.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include namespace Catch { @@ -5405,7 +5412,7 @@ namespace Catch { SourceLineInfo getSourceInfo() const; StringRef getTestMacroName() const; - //protected: + //protected: AssertionInfo m_info; AssertionResultData m_resultData; }; @@ -5462,12 +5469,12 @@ namespace Catch { #include #endif // CATCH_CONFIG_ENABLE_BENCHMARKING -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iosfwd" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/map" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/set" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" +#include +#include +#include +#include +#include +#include namespace Catch { @@ -5706,13 +5713,13 @@ namespace Catch { } // end namespace Catch // end catch_interfaces_reporter.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstring" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cfloat" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdio" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ostream" +#include +#include +#include +#include +#include +#include +#include namespace Catch { void prepareExpandedExpression(AssertionResult& result); @@ -5729,8 +5736,8 @@ namespace Catch { struct StreamingReporterBase : IStreamingReporter { StreamingReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) { m_reporterPrefs.shouldRedirectStdOut = false; if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) ) @@ -5846,8 +5853,8 @@ namespace Catch { using TestRunNode = Node; CumulativeReporterBase( ReporterConfig const& _config ) - : m_config( _config.fullConfig() ), - stream( _config.stream() ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) { m_reporterPrefs.shouldRedirectStdOut = false; if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) ) @@ -5879,9 +5886,9 @@ namespace Catch { else { SectionNode& parentNode = *m_sectionStack.back(); auto it = - std::find_if( parentNode.childSections.begin(), - parentNode.childSections.end(), - BySectionInfo( sectionInfo ) ); + std::find_if( parentNode.childSections.begin(), + parentNode.childSections.end(), + BySectionInfo( sectionInfo ) ); if( it == parentNode.childSections.end() ) { node = std::make_shared( incompleteStats ); parentNode.childSections.push_back( node ); @@ -6212,7 +6219,7 @@ namespace Catch { // start catch_xmlwriter.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" +#include namespace Catch { enum class XmlFormatting { @@ -7461,167 +7468,167 @@ namespace Catch { // Keep these here for external reporters // start catch_test_case_tracker.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include +#include +#include namespace Catch { -namespace TestCaseTracking { - - struct NameAndLocation { - std::string name; - SourceLineInfo location; - - NameAndLocation( std::string const& _name, SourceLineInfo const& _location ); - friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) { - return lhs.name == rhs.name - && lhs.location == rhs.location; - } - }; + namespace TestCaseTracking { - class ITracker; + struct NameAndLocation { + std::string name; + SourceLineInfo location; - using ITrackerPtr = std::shared_ptr; + NameAndLocation( std::string const& _name, SourceLineInfo const& _location ); + friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) { + return lhs.name == rhs.name + && lhs.location == rhs.location; + } + }; - class ITracker { - NameAndLocation m_nameAndLocation; + class ITracker; - public: - ITracker(NameAndLocation const& nameAndLoc) : - m_nameAndLocation(nameAndLoc) - {} + using ITrackerPtr = std::shared_ptr; - // static queries - NameAndLocation const& nameAndLocation() const { - return m_nameAndLocation; - } + class ITracker { + NameAndLocation m_nameAndLocation; - virtual ~ITracker(); + public: + ITracker(NameAndLocation const& nameAndLoc) : + m_nameAndLocation(nameAndLoc) + {} - // dynamic queries - virtual bool isComplete() const = 0; // Successfully completed or failed - virtual bool isSuccessfullyCompleted() const = 0; - virtual bool isOpen() const = 0; // Started but not complete - virtual bool hasChildren() const = 0; - virtual bool hasStarted() const = 0; + // static queries + NameAndLocation const& nameAndLocation() const { + return m_nameAndLocation; + } - virtual ITracker& parent() = 0; + virtual ~ITracker(); - // actions - virtual void close() = 0; // Successfully complete - virtual void fail() = 0; - virtual void markAsNeedingAnotherRun() = 0; + // dynamic queries + virtual bool isComplete() const = 0; // Successfully completed or failed + virtual bool isSuccessfullyCompleted() const = 0; + virtual bool isOpen() const = 0; // Started but not complete + virtual bool hasChildren() const = 0; + virtual bool hasStarted() const = 0; - virtual void addChild( ITrackerPtr const& child ) = 0; - virtual ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) = 0; - virtual void openChild() = 0; + virtual ITracker& parent() = 0; - // Debug/ checking - virtual bool isSectionTracker() const = 0; - virtual bool isGeneratorTracker() const = 0; - }; + // actions + virtual void close() = 0; // Successfully complete + virtual void fail() = 0; + virtual void markAsNeedingAnotherRun() = 0; - class TrackerContext { + virtual void addChild( ITrackerPtr const& child ) = 0; + virtual ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) = 0; + virtual void openChild() = 0; - enum RunState { - NotStarted, - Executing, - CompletedCycle + // Debug/ checking + virtual bool isSectionTracker() const = 0; + virtual bool isGeneratorTracker() const = 0; }; - ITrackerPtr m_rootTracker; - ITracker* m_currentTracker = nullptr; - RunState m_runState = NotStarted; + class TrackerContext { - public: + enum RunState { + NotStarted, + Executing, + CompletedCycle + }; + + ITrackerPtr m_rootTracker; + ITracker* m_currentTracker = nullptr; + RunState m_runState = NotStarted; - ITracker& startRun(); - void endRun(); + public: - void startCycle(); - void completeCycle(); + ITracker& startRun(); + void endRun(); - bool completedCycle() const; - ITracker& currentTracker(); - void setCurrentTracker( ITracker* tracker ); - }; + void startCycle(); + void completeCycle(); - class TrackerBase : public ITracker { - protected: - enum CycleState { - NotStarted, - Executing, - ExecutingChildren, - NeedsAnotherRun, - CompletedSuccessfully, - Failed + bool completedCycle() const; + ITracker& currentTracker(); + void setCurrentTracker( ITracker* tracker ); }; - using Children = std::vector; - TrackerContext& m_ctx; - ITracker* m_parent; - Children m_children; - CycleState m_runState = NotStarted; + class TrackerBase : public ITracker { + protected: + enum CycleState { + NotStarted, + Executing, + ExecutingChildren, + NeedsAnotherRun, + CompletedSuccessfully, + Failed + }; - public: - TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); + using Children = std::vector; + TrackerContext& m_ctx; + ITracker* m_parent; + Children m_children; + CycleState m_runState = NotStarted; - bool isComplete() const override; - bool isSuccessfullyCompleted() const override; - bool isOpen() const override; - bool hasChildren() const override; - bool hasStarted() const override { - return m_runState != NotStarted; - } + public: + TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); + + bool isComplete() const override; + bool isSuccessfullyCompleted() const override; + bool isOpen() const override; + bool hasChildren() const override; + bool hasStarted() const override { + return m_runState != NotStarted; + } - void addChild( ITrackerPtr const& child ) override; + void addChild( ITrackerPtr const& child ) override; - ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) override; - ITracker& parent() override; + ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) override; + ITracker& parent() override; - void openChild() override; + void openChild() override; - bool isSectionTracker() const override; - bool isGeneratorTracker() const override; + bool isSectionTracker() const override; + bool isGeneratorTracker() const override; - void open(); + void open(); - void close() override; - void fail() override; - void markAsNeedingAnotherRun() override; + void close() override; + void fail() override; + void markAsNeedingAnotherRun() override; - private: - void moveToParent(); - void moveToThis(); - }; + private: + void moveToParent(); + void moveToThis(); + }; - class SectionTracker : public TrackerBase { - std::vector m_filters; - std::string m_trimmed_name; - public: - SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); + class SectionTracker : public TrackerBase { + std::vector m_filters; + std::string m_trimmed_name; + public: + SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); - bool isSectionTracker() const override; + bool isSectionTracker() const override; - bool isComplete() const override; + bool isComplete() const override; - static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ); + static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ); - void tryOpen(); + void tryOpen(); - void addInitialFilters( std::vector const& filters ); - void addNextFilters( std::vector const& filters ); - //! Returns filters active in this tracker - std::vector const& getFilters() const; - //! Returns whitespace-trimmed name of the tracked section - std::string const& trimmedName() const; - }; + void addInitialFilters( std::vector const& filters ); + void addNextFilters( std::vector const& filters ); + //! Returns filters active in this tracker + std::vector const& getFilters() const; + //! Returns whitespace-trimmed name of the tracked section + std::string const& trimmedName() const; + }; -} // namespace TestCaseTracking + } // namespace TestCaseTracking -using TestCaseTracking::ITracker; -using TestCaseTracking::TrackerContext; -using TestCaseTracking::SectionTracker; + using TestCaseTracking::ITracker; + using TestCaseTracking::TrackerContext; + using TestCaseTracking::SectionTracker; } // namespace Catch @@ -7852,80 +7859,80 @@ namespace Catch { // end catch_stats.cpp // start catch_approx.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cmath" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/limits" +#include +#include namespace { // Performs equivalent check of std::fabs(lhs - rhs) <= margin // But without the subtraction to allow for INFINITY in comparison -bool marginComparison(double lhs, double rhs, double margin) { - return (lhs + margin >= rhs) && (rhs + margin >= lhs); -} + bool marginComparison(double lhs, double rhs, double margin) { + return (lhs + margin >= rhs) && (rhs + margin >= lhs); + } } namespace Catch { -namespace Detail { + namespace Detail { - Approx::Approx ( double value ) - : m_epsilon( std::numeric_limits::epsilon()*100 ), - m_margin( 0.0 ), - m_scale( 0.0 ), - m_value( value ) - {} + Approx::Approx ( double value ) + : m_epsilon( std::numeric_limits::epsilon()*100 ), + m_margin( 0.0 ), + m_scale( 0.0 ), + m_value( value ) + {} - Approx Approx::custom() { - return Approx( 0 ); - } + Approx Approx::custom() { + return Approx( 0 ); + } - Approx Approx::operator-() const { - auto temp(*this); - temp.m_value = -temp.m_value; - return temp; - } + Approx Approx::operator-() const { + auto temp(*this); + temp.m_value = -temp.m_value; + return temp; + } - std::string Approx::toString() const { - ReusableStringStream rss; - rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )"; - return rss.str(); - } + std::string Approx::toString() const { + ReusableStringStream rss; + rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )"; + return rss.str(); + } - bool Approx::equalityComparisonImpl(const double other) const { - // First try with fixed margin, then compute margin based on epsilon, scale and Approx's value - // Thanks to Richard Harris for his help refining the scaled margin value - return marginComparison(m_value, other, m_margin) - || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(std::isinf(m_value)? 0 : m_value))); - } + bool Approx::equalityComparisonImpl(const double other) const { + // First try with fixed margin, then compute margin based on epsilon, scale and Approx's value + // Thanks to Richard Harris for his help refining the scaled margin value + return marginComparison(m_value, other, m_margin) + || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(std::isinf(m_value)? 0 : m_value))); + } - void Approx::setMargin(double newMargin) { - CATCH_ENFORCE(newMargin >= 0, - "Invalid Approx::margin: " << newMargin << '.' - << " Approx::Margin has to be non-negative."); - m_margin = newMargin; - } + void Approx::setMargin(double newMargin) { + CATCH_ENFORCE(newMargin >= 0, + "Invalid Approx::margin: " << newMargin << '.' + << " Approx::Margin has to be non-negative."); + m_margin = newMargin; + } - void Approx::setEpsilon(double newEpsilon) { - CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0, - "Invalid Approx::epsilon: " << newEpsilon << '.' - << " Approx::epsilon has to be in [0, 1]"); - m_epsilon = newEpsilon; - } + void Approx::setEpsilon(double newEpsilon) { + CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0, + "Invalid Approx::epsilon: " << newEpsilon << '.' + << " Approx::epsilon has to be in [0, 1]"); + m_epsilon = newEpsilon; + } -} // end namespace Detail + } // end namespace Detail -namespace literals { - Detail::Approx operator "" _a(long double val) { - return Detail::Approx(val); - } - Detail::Approx operator "" _a(unsigned long long val) { - return Detail::Approx(val); - } -} // end namespace literals + namespace literals { + Detail::Approx operator "" _a(long double val) { + return Detail::Approx(val); + } + Detail::Approx operator "" _a(unsigned long long val) { + return Detail::Approx(val); + } + } // end namespace literals -std::string StringMaker::convert(Catch::Detail::Approx const& value) { - return value.toString(); -} + std::string StringMaker::convert(Catch::Detail::Approx const& value) { + return value.toString(); + } } // end namespace Catch // end catch_approx.cpp @@ -7939,7 +7946,7 @@ namespace Catch { #ifdef CATCH_PLATFORM_MAC - #if defined(__i386__) || defined(__x86_64__) +#if defined(__i386__) || defined(__x86_64__) #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */ #elif defined(__aarch64__) #define CATCH_TRAP() __asm__(".inst 0xd4200000") @@ -7947,7 +7954,7 @@ namespace Catch { #elif defined(CATCH_PLATFORM_IPHONE) - // use inline assembler +// use inline assembler #if defined(__i386__) || defined(__x86_64__) #define CATCH_TRAP() __asm__("int $3") #elif defined(__aarch64__) @@ -7959,29 +7966,29 @@ namespace Catch { #endif #elif defined(CATCH_PLATFORM_LINUX) - // If we can use inline assembler, do it because this allows us to break - // directly at the location of the failing check instead of breaking inside - // raise() called from it, i.e. one stack frame below. - #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) - #define CATCH_TRAP() asm volatile ("int $3") /* NOLINT */ - #else // Fall back to the generic way. - #include +// If we can use inline assembler, do it because this allows us to break +// directly at the location of the failing check instead of breaking inside +// raise() called from it, i.e. one stack frame below. +#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) +#define CATCH_TRAP() asm volatile ("int $3") /* NOLINT */ +#else // Fall back to the generic way. +#include #define CATCH_TRAP() raise(SIGTRAP) - #endif +#endif #elif defined(_MSC_VER) - #define CATCH_TRAP() __debugbreak() +#define CATCH_TRAP() __debugbreak() #elif defined(__MINGW32__) extern "C" __declspec(dllimport) void __stdcall DebugBreak(); #define CATCH_TRAP() DebugBreak() #endif #ifndef CATCH_BREAK_INTO_DEBUGGER - #ifdef CATCH_TRAP - #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }() - #else - #define CATCH_BREAK_INTO_DEBUGGER() []{}() - #endif +#ifdef CATCH_TRAP +#define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }() +#else +#define CATCH_BREAK_INTO_DEBUGGER() []{}() +#endif #endif // end catch_debugger.h @@ -7989,7 +7996,7 @@ namespace Catch { // start catch_fatal_condition.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" +#include namespace Catch { @@ -8032,7 +8039,7 @@ namespace Catch { FatalConditionHandler* m_handler; public: FatalConditionHandlerGuard(FatalConditionHandler* handler): - m_handler(handler) { + m_handler(handler) { m_handler->engage(); } ~FatalConditionHandlerGuard() { @@ -8043,7 +8050,7 @@ namespace Catch { } // end namespace Catch // end catch_fatal_condition.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include namespace Catch { @@ -8187,7 +8194,7 @@ namespace Catch { } LazyExpression::LazyExpression( bool isNegated ) - : m_isNegated( isNegated ) + : m_isNegated( isNegated ) {} LazyExpression::LazyExpression( LazyExpression const& other ) : m_isNegated( other.m_isNegated ) {} @@ -8213,12 +8220,12 @@ namespace Catch { } AssertionHandler::AssertionHandler - ( StringRef const& macroName, - SourceLineInfo const& lineInfo, - StringRef capturedExpression, - ResultDisposition::Flags resultDisposition ) - : m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition }, - m_resultCapture( getResultCapture() ) + ( StringRef const& macroName, + SourceLineInfo const& lineInfo, + StringRef capturedExpression, + ResultDisposition::Flags resultDisposition ) + : m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition }, + m_resultCapture( getResultCapture() ) {} void AssertionHandler::handleExpr( ITransientExpression const& expr ) { @@ -8285,8 +8292,8 @@ namespace Catch { namespace Catch { AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression): - lazyExpression(_lazyExpression), - resultType(_resultType) {} + lazyExpression(_lazyExpression), + resultType(_resultType) {} std::string AssertionResultData::reconstructExpression() const { @@ -8301,8 +8308,8 @@ namespace Catch { } AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) - : m_info( info ), - m_resultData( data ) + : m_info( info ), + m_resultData( data ) {} // Result was a success @@ -8361,8 +8368,8 @@ namespace Catch { std::string AssertionResult::getExpandedExpression() const { std::string expr = m_resultData.reconstructExpression(); return expr.empty() - ? getExpression() - : expr; + ? getExpression() + : expr; } std::string AssertionResult::getMessage() const { @@ -8437,7 +8444,7 @@ namespace Catch { #ifndef CLARA_CONFIG_OPTIONAL_TYPE #ifdef __has_include #if __has_include() && __cplusplus >= 201703L -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/optional" +#include #define CLARA_CONFIG_OPTIONAL_TYPE std::optional #endif #endif @@ -8455,1220 +8462,1220 @@ namespace Catch { // This project is hosted at https://github.com/philsquared/textflowcpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ostream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" +#include +#include +#include +#include #ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH #define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH 80 #endif namespace Catch { -namespace clara { -namespace TextFlow { + namespace clara { + namespace TextFlow { -inline auto isWhitespace(char c) -> bool { - static std::string chars = " \t\n\r"; - return chars.find(c) != std::string::npos; -} -inline auto isBreakableBefore(char c) -> bool { - static std::string chars = "[({<|"; - return chars.find(c) != std::string::npos; -} -inline auto isBreakableAfter(char c) -> bool { - static std::string chars = "])}>.,:;*+-=&/\\"; - return chars.find(c) != std::string::npos; -} + inline auto isWhitespace(char c) -> bool { + static std::string chars = " \t\n\r"; + return chars.find(c) != std::string::npos; + } + inline auto isBreakableBefore(char c) -> bool { + static std::string chars = "[({<|"; + return chars.find(c) != std::string::npos; + } + inline auto isBreakableAfter(char c) -> bool { + static std::string chars = "])}>.,:;*+-=&/\\"; + return chars.find(c) != std::string::npos; + } -class Columns; + class Columns; -class Column { - std::vector m_strings; - size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH; - size_t m_indent = 0; - size_t m_initialIndent = std::string::npos; + class Column { + std::vector m_strings; + size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH; + size_t m_indent = 0; + size_t m_initialIndent = std::string::npos; -public: - class iterator { - friend Column; + public: + class iterator { + friend Column; - Column const& m_column; - size_t m_stringIndex = 0; - size_t m_pos = 0; + Column const& m_column; + size_t m_stringIndex = 0; + size_t m_pos = 0; - size_t m_len = 0; - size_t m_end = 0; - bool m_suffix = false; + size_t m_len = 0; + size_t m_end = 0; + bool m_suffix = false; - iterator(Column const& column, size_t stringIndex) - : m_column(column), - m_stringIndex(stringIndex) {} + iterator(Column const& column, size_t stringIndex) + : m_column(column), + m_stringIndex(stringIndex) {} - auto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; } + auto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; } - auto isBoundary(size_t at) const -> bool { - assert(at > 0); - assert(at <= line().size()); + auto isBoundary(size_t at) const -> bool { + assert(at > 0); + assert(at <= line().size()); - return at == line().size() || - (isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) || - isBreakableBefore(line()[at]) || - isBreakableAfter(line()[at - 1]); - } + return at == line().size() || + (isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) || + isBreakableBefore(line()[at]) || + isBreakableAfter(line()[at - 1]); + } - void calcLength() { - assert(m_stringIndex < m_column.m_strings.size()); - - m_suffix = false; - auto width = m_column.m_width - indent(); - m_end = m_pos; - if (line()[m_pos] == '\n') { - ++m_end; - } - while (m_end < line().size() && line()[m_end] != '\n') - ++m_end; - - if (m_end < m_pos + width) { - m_len = m_end - m_pos; - } else { - size_t len = width; - while (len > 0 && !isBoundary(m_pos + len)) - --len; - while (len > 0 && isWhitespace(line()[m_pos + len - 1])) - --len; - - if (len > 0) { - m_len = len; - } else { - m_suffix = true; - m_len = width - 1; - } - } - } + void calcLength() { + assert(m_stringIndex < m_column.m_strings.size()); - auto indent() const -> size_t { - auto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent : std::string::npos; - return initial == std::string::npos ? m_column.m_indent : initial; - } + m_suffix = false; + auto width = m_column.m_width - indent(); + m_end = m_pos; + if (line()[m_pos] == '\n') { + ++m_end; + } + while (m_end < line().size() && line()[m_end] != '\n') + ++m_end; - auto addIndentAndSuffix(std::string const &plain) const -> std::string { - return std::string(indent(), ' ') + (m_suffix ? plain + "-" : plain); - } + if (m_end < m_pos + width) { + m_len = m_end - m_pos; + } else { + size_t len = width; + while (len > 0 && !isBoundary(m_pos + len)) + --len; + while (len > 0 && isWhitespace(line()[m_pos + len - 1])) + --len; + + if (len > 0) { + m_len = len; + } else { + m_suffix = true; + m_len = width - 1; + } + } + } - public: - using difference_type = std::ptrdiff_t; - using value_type = std::string; - using pointer = value_type * ; - using reference = value_type & ; - using iterator_category = std::forward_iterator_tag; - - explicit iterator(Column const& column) : m_column(column) { - assert(m_column.m_width > m_column.m_indent); - assert(m_column.m_initialIndent == std::string::npos || m_column.m_width > m_column.m_initialIndent); - calcLength(); - if (m_len == 0) - m_stringIndex++; // Empty string - } + auto indent() const -> size_t { + auto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent : std::string::npos; + return initial == std::string::npos ? m_column.m_indent : initial; + } - auto operator *() const -> std::string { - assert(m_stringIndex < m_column.m_strings.size()); - assert(m_pos <= m_end); - return addIndentAndSuffix(line().substr(m_pos, m_len)); - } + auto addIndentAndSuffix(std::string const &plain) const -> std::string { + return std::string(indent(), ' ') + (m_suffix ? plain + "-" : plain); + } - auto operator ++() -> iterator& { - m_pos += m_len; - if (m_pos < line().size() && line()[m_pos] == '\n') - m_pos += 1; - else - while (m_pos < line().size() && isWhitespace(line()[m_pos])) - ++m_pos; - - if (m_pos == line().size()) { - m_pos = 0; - ++m_stringIndex; - } - if (m_stringIndex < m_column.m_strings.size()) - calcLength(); - return *this; - } - auto operator ++(int) -> iterator { - iterator prev(*this); - operator++(); - return prev; - } + public: + using difference_type = std::ptrdiff_t; + using value_type = std::string; + using pointer = value_type * ; + using reference = value_type & ; + using iterator_category = std::forward_iterator_tag; + + explicit iterator(Column const& column) : m_column(column) { + assert(m_column.m_width > m_column.m_indent); + assert(m_column.m_initialIndent == std::string::npos || m_column.m_width > m_column.m_initialIndent); + calcLength(); + if (m_len == 0) + m_stringIndex++; // Empty string + } - auto operator ==(iterator const& other) const -> bool { - return - m_pos == other.m_pos && - m_stringIndex == other.m_stringIndex && - &m_column == &other.m_column; - } - auto operator !=(iterator const& other) const -> bool { - return !operator==(other); - } - }; - using const_iterator = iterator; + auto operator *() const -> std::string { + assert(m_stringIndex < m_column.m_strings.size()); + assert(m_pos <= m_end); + return addIndentAndSuffix(line().substr(m_pos, m_len)); + } - explicit Column(std::string const& text) { m_strings.push_back(text); } + auto operator ++() -> iterator& { + m_pos += m_len; + if (m_pos < line().size() && line()[m_pos] == '\n') + m_pos += 1; + else + while (m_pos < line().size() && isWhitespace(line()[m_pos])) + ++m_pos; + + if (m_pos == line().size()) { + m_pos = 0; + ++m_stringIndex; + } + if (m_stringIndex < m_column.m_strings.size()) + calcLength(); + return *this; + } + auto operator ++(int) -> iterator { + iterator prev(*this); + operator++(); + return prev; + } - auto width(size_t newWidth) -> Column& { - assert(newWidth > 0); - m_width = newWidth; - return *this; - } - auto indent(size_t newIndent) -> Column& { - m_indent = newIndent; - return *this; - } - auto initialIndent(size_t newIndent) -> Column& { - m_initialIndent = newIndent; - return *this; - } + auto operator ==(iterator const& other) const -> bool { + return + m_pos == other.m_pos && + m_stringIndex == other.m_stringIndex && + &m_column == &other.m_column; + } + auto operator !=(iterator const& other) const -> bool { + return !operator==(other); + } + }; + using const_iterator = iterator; - auto width() const -> size_t { return m_width; } - auto begin() const -> iterator { return iterator(*this); } - auto end() const -> iterator { return { *this, m_strings.size() }; } - - inline friend std::ostream& operator << (std::ostream& os, Column const& col) { - bool first = true; - for (auto line : col) { - if (first) - first = false; - else - os << "\n"; - os << line; - } - return os; - } + explicit Column(std::string const& text) { m_strings.push_back(text); } - auto operator + (Column const& other)->Columns; + auto width(size_t newWidth) -> Column& { + assert(newWidth > 0); + m_width = newWidth; + return *this; + } + auto indent(size_t newIndent) -> Column& { + m_indent = newIndent; + return *this; + } + auto initialIndent(size_t newIndent) -> Column& { + m_initialIndent = newIndent; + return *this; + } - auto toString() const -> std::string { - std::ostringstream oss; - oss << *this; - return oss.str(); - } -}; + auto width() const -> size_t { return m_width; } + auto begin() const -> iterator { return iterator(*this); } + auto end() const -> iterator { return { *this, m_strings.size() }; } + + inline friend std::ostream& operator << (std::ostream& os, Column const& col) { + bool first = true; + for (auto line : col) { + if (first) + first = false; + else + os << "\n"; + os << line; + } + return os; + } -class Spacer : public Column { + auto operator + (Column const& other)->Columns; -public: - explicit Spacer(size_t spaceWidth) : Column("") { - width(spaceWidth); - } -}; + auto toString() const -> std::string { + std::ostringstream oss; + oss << *this; + return oss.str(); + } + }; -class Columns { - std::vector m_columns; + class Spacer : public Column { -public: + public: + explicit Spacer(size_t spaceWidth) : Column("") { + width(spaceWidth); + } + }; - class iterator { - friend Columns; - struct EndTag {}; + class Columns { + std::vector m_columns; - std::vector const& m_columns; - std::vector m_iterators; - size_t m_activeIterators; + public: - iterator(Columns const& columns, EndTag) - : m_columns(columns.m_columns), - m_activeIterators(0) { - m_iterators.reserve(m_columns.size()); + class iterator { + friend Columns; + struct EndTag {}; - for (auto const& col : m_columns) - m_iterators.push_back(col.end()); - } + std::vector const& m_columns; + std::vector m_iterators; + size_t m_activeIterators; - public: - using difference_type = std::ptrdiff_t; - using value_type = std::string; - using pointer = value_type * ; - using reference = value_type & ; - using iterator_category = std::forward_iterator_tag; + iterator(Columns const& columns, EndTag) + : m_columns(columns.m_columns), + m_activeIterators(0) { + m_iterators.reserve(m_columns.size()); - explicit iterator(Columns const& columns) - : m_columns(columns.m_columns), - m_activeIterators(m_columns.size()) { - m_iterators.reserve(m_columns.size()); + for (auto const& col : m_columns) + m_iterators.push_back(col.end()); + } - for (auto const& col : m_columns) - m_iterators.push_back(col.begin()); - } + public: + using difference_type = std::ptrdiff_t; + using value_type = std::string; + using pointer = value_type * ; + using reference = value_type & ; + using iterator_category = std::forward_iterator_tag; - auto operator ==(iterator const& other) const -> bool { - return m_iterators == other.m_iterators; - } - auto operator !=(iterator const& other) const -> bool { - return m_iterators != other.m_iterators; - } - auto operator *() const -> std::string { - std::string row, padding; - - for (size_t i = 0; i < m_columns.size(); ++i) { - auto width = m_columns[i].width(); - if (m_iterators[i] != m_columns[i].end()) { - std::string col = *m_iterators[i]; - row += padding + col; - if (col.size() < width) - padding = std::string(width - col.size(), ' '); - else - padding = ""; - } else { - padding += std::string(width, ' '); - } - } - return row; - } - auto operator ++() -> iterator& { - for (size_t i = 0; i < m_columns.size(); ++i) { - if (m_iterators[i] != m_columns[i].end()) - ++m_iterators[i]; - } - return *this; - } - auto operator ++(int) -> iterator { - iterator prev(*this); - operator++(); - return prev; - } - }; - using const_iterator = iterator; + explicit iterator(Columns const& columns) + : m_columns(columns.m_columns), + m_activeIterators(m_columns.size()) { + m_iterators.reserve(m_columns.size()); - auto begin() const -> iterator { return iterator(*this); } - auto end() const -> iterator { return { *this, iterator::EndTag() }; } + for (auto const& col : m_columns) + m_iterators.push_back(col.begin()); + } - auto operator += (Column const& col) -> Columns& { - m_columns.push_back(col); - return *this; - } - auto operator + (Column const& col) -> Columns { - Columns combined = *this; - combined += col; - return combined; - } + auto operator ==(iterator const& other) const -> bool { + return m_iterators == other.m_iterators; + } + auto operator !=(iterator const& other) const -> bool { + return m_iterators != other.m_iterators; + } + auto operator *() const -> std::string { + std::string row, padding; + + for (size_t i = 0; i < m_columns.size(); ++i) { + auto width = m_columns[i].width(); + if (m_iterators[i] != m_columns[i].end()) { + std::string col = *m_iterators[i]; + row += padding + col; + if (col.size() < width) + padding = std::string(width - col.size(), ' '); + else + padding = ""; + } else { + padding += std::string(width, ' '); + } + } + return row; + } + auto operator ++() -> iterator& { + for (size_t i = 0; i < m_columns.size(); ++i) { + if (m_iterators[i] != m_columns[i].end()) + ++m_iterators[i]; + } + return *this; + } + auto operator ++(int) -> iterator { + iterator prev(*this); + operator++(); + return prev; + } + }; + using const_iterator = iterator; - inline friend std::ostream& operator << (std::ostream& os, Columns const& cols) { + auto begin() const -> iterator { return iterator(*this); } + auto end() const -> iterator { return { *this, iterator::EndTag() }; } - bool first = true; - for (auto line : cols) { - if (first) - first = false; - else - os << "\n"; - os << line; - } - return os; - } + auto operator += (Column const& col) -> Columns& { + m_columns.push_back(col); + return *this; + } + auto operator + (Column const& col) -> Columns { + Columns combined = *this; + combined += col; + return combined; + } - auto toString() const -> std::string { - std::ostringstream oss; - oss << *this; - return oss.str(); - } -}; + inline friend std::ostream& operator << (std::ostream& os, Columns const& cols) { -inline auto Column::operator + (Column const& other) -> Columns { - Columns cols; - cols += *this; - cols += other; - return cols; -} -} + bool first = true; + for (auto line : cols) { + if (first) + first = false; + else + os << "\n"; + os << line; + } + return os; + } -} + auto toString() const -> std::string { + std::ostringstream oss; + oss << *this; + return oss.str(); + } + }; + + inline auto Column::operator + (Column const& other) -> Columns { + Columns cols; + cols += *this; + cols += other; + return cols; + } + } + + } } // ----------- end of #include from clara_textflow.hpp ----------- // ........... back in clara.hpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cctype" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/set" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" +#include +#include +#include +#include +#include #if !defined(CATCH_PLATFORM_WINDOWS) && ( defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) ) #define CATCH_PLATFORM_WINDOWS #endif namespace Catch { namespace clara { -namespace detail { + namespace detail { - // Traits for extracting arg and return type of lambdas (for single argument lambdas) - template - struct UnaryLambdaTraits : UnaryLambdaTraits {}; + // Traits for extracting arg and return type of lambdas (for single argument lambdas) + template + struct UnaryLambdaTraits : UnaryLambdaTraits {}; - template - struct UnaryLambdaTraits { - static const bool isValid = false; - }; + template + struct UnaryLambdaTraits { + static const bool isValid = false; + }; - template - struct UnaryLambdaTraits { - static const bool isValid = true; - using ArgType = typename std::remove_const::type>::type; - using ReturnType = ReturnT; - }; + template + struct UnaryLambdaTraits { + static const bool isValid = true; + using ArgType = typename std::remove_const::type>::type; + using ReturnType = ReturnT; + }; - class TokenStream; + class TokenStream; - // Transport for raw args (copied from main args, or supplied via init list for testing) - class Args { - friend TokenStream; - std::string m_exeName; - std::vector m_args; + // Transport for raw args (copied from main args, or supplied via init list for testing) + class Args { + friend TokenStream; + std::string m_exeName; + std::vector m_args; - public: - Args( int argc, char const* const* argv ) - : m_exeName(argv[0]), - m_args(argv + 1, argv + argc) {} + public: + Args( int argc, char const* const* argv ) + : m_exeName(argv[0]), + m_args(argv + 1, argv + argc) {} - Args( std::initializer_list args ) - : m_exeName( *args.begin() ), - m_args( args.begin()+1, args.end() ) - {} + Args( std::initializer_list args ) + : m_exeName( *args.begin() ), + m_args( args.begin()+1, args.end() ) + {} - auto exeName() const -> std::string { - return m_exeName; - } - }; + auto exeName() const -> std::string { + return m_exeName; + } + }; - // Wraps a token coming from a token stream. These may not directly correspond to strings as a single string - // may encode an option + its argument if the : or = form is used - enum class TokenType { - Option, Argument - }; - struct Token { - TokenType type; - std::string token; - }; + // Wraps a token coming from a token stream. These may not directly correspond to strings as a single string + // may encode an option + its argument if the : or = form is used + enum class TokenType { + Option, Argument + }; + struct Token { + TokenType type; + std::string token; + }; - inline auto isOptPrefix( char c ) -> bool { - return c == '-' + inline auto isOptPrefix( char c ) -> bool { + return c == '-' #ifdef CATCH_PLATFORM_WINDOWS - || c == '/' + || c == '/' #endif - ; - } - - // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled - class TokenStream { - using Iterator = std::vector::const_iterator; - Iterator it; - Iterator itEnd; - std::vector m_tokenBuffer; - - void loadBuffer() { - m_tokenBuffer.resize( 0 ); - - // Skip any empty strings - while( it != itEnd && it->empty() ) - ++it; - - if( it != itEnd ) { - auto const &next = *it; - if( isOptPrefix( next[0] ) ) { - auto delimiterPos = next.find_first_of( " :=" ); - if( delimiterPos != std::string::npos ) { - m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); - m_tokenBuffer.push_back( { TokenType::Argument, next.substr( delimiterPos + 1 ) } ); - } else { - if( next[1] != '-' && next.size() > 2 ) { - std::string opt = "- "; - for( size_t i = 1; i < next.size(); ++i ) { - opt[1] = next[i]; - m_tokenBuffer.push_back( { TokenType::Option, opt } ); + ; + } + + // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled + class TokenStream { + using Iterator = std::vector::const_iterator; + Iterator it; + Iterator itEnd; + std::vector m_tokenBuffer; + + void loadBuffer() { + m_tokenBuffer.resize( 0 ); + + // Skip any empty strings + while( it != itEnd && it->empty() ) + ++it; + + if( it != itEnd ) { + auto const &next = *it; + if( isOptPrefix( next[0] ) ) { + auto delimiterPos = next.find_first_of( " :=" ); + if( delimiterPos != std::string::npos ) { + m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); + m_tokenBuffer.push_back( { TokenType::Argument, next.substr( delimiterPos + 1 ) } ); + } else { + if( next[1] != '-' && next.size() > 2 ) { + std::string opt = "- "; + for( size_t i = 1; i < next.size(); ++i ) { + opt[1] = next[i]; + m_tokenBuffer.push_back( { TokenType::Option, opt } ); + } + } else { + m_tokenBuffer.push_back( { TokenType::Option, next } ); + } } } else { - m_tokenBuffer.push_back( { TokenType::Option, next } ); + m_tokenBuffer.push_back( { TokenType::Argument, next } ); } } - } else { - m_tokenBuffer.push_back( { TokenType::Argument, next } ); } - } - } - - public: - explicit TokenStream( Args const &args ) : TokenStream( args.m_args.begin(), args.m_args.end() ) {} - - TokenStream( Iterator it, Iterator itEnd ) : it( it ), itEnd( itEnd ) { - loadBuffer(); - } - - explicit operator bool() const { - return !m_tokenBuffer.empty() || it != itEnd; - } - auto count() const -> size_t { return m_tokenBuffer.size() + (itEnd - it); } + public: + explicit TokenStream( Args const &args ) : TokenStream( args.m_args.begin(), args.m_args.end() ) {} - auto operator*() const -> Token { - assert( !m_tokenBuffer.empty() ); - return m_tokenBuffer.front(); - } + TokenStream( Iterator it, Iterator itEnd ) : it( it ), itEnd( itEnd ) { + loadBuffer(); + } - auto operator->() const -> Token const * { - assert( !m_tokenBuffer.empty() ); - return &m_tokenBuffer.front(); - } + explicit operator bool() const { + return !m_tokenBuffer.empty() || it != itEnd; + } - auto operator++() -> TokenStream & { - if( m_tokenBuffer.size() >= 2 ) { - m_tokenBuffer.erase( m_tokenBuffer.begin() ); - } else { - if( it != itEnd ) - ++it; - loadBuffer(); - } - return *this; - } - }; + auto count() const -> size_t { return m_tokenBuffer.size() + (itEnd - it); } - class ResultBase { - public: - enum Type { - Ok, LogicError, RuntimeError - }; + auto operator*() const -> Token { + assert( !m_tokenBuffer.empty() ); + return m_tokenBuffer.front(); + } - protected: - ResultBase( Type type ) : m_type( type ) {} - virtual ~ResultBase() = default; + auto operator->() const -> Token const * { + assert( !m_tokenBuffer.empty() ); + return &m_tokenBuffer.front(); + } - virtual void enforceOk() const = 0; + auto operator++() -> TokenStream & { + if( m_tokenBuffer.size() >= 2 ) { + m_tokenBuffer.erase( m_tokenBuffer.begin() ); + } else { + if( it != itEnd ) + ++it; + loadBuffer(); + } + return *this; + } + }; - Type m_type; - }; + class ResultBase { + public: + enum Type { + Ok, LogicError, RuntimeError + }; - template - class ResultValueBase : public ResultBase { - public: - auto value() const -> T const & { - enforceOk(); - return m_value; - } + protected: + ResultBase( Type type ) : m_type( type ) {} + virtual ~ResultBase() = default; - protected: - ResultValueBase( Type type ) : ResultBase( type ) {} + virtual void enforceOk() const = 0; - ResultValueBase( ResultValueBase const &other ) : ResultBase( other ) { - if( m_type == ResultBase::Ok ) - new( &m_value ) T( other.m_value ); - } + Type m_type; + }; - ResultValueBase( Type, T const &value ) : ResultBase( Ok ) { - new( &m_value ) T( value ); - } + template + class ResultValueBase : public ResultBase { + public: + auto value() const -> T const & { + enforceOk(); + return m_value; + } - auto operator=( ResultValueBase const &other ) -> ResultValueBase & { - if( m_type == ResultBase::Ok ) - m_value.~T(); - ResultBase::operator=(other); - if( m_type == ResultBase::Ok ) - new( &m_value ) T( other.m_value ); - return *this; - } + protected: + ResultValueBase( Type type ) : ResultBase( type ) {} - ~ResultValueBase() override { - if( m_type == Ok ) - m_value.~T(); - } + ResultValueBase( ResultValueBase const &other ) : ResultBase( other ) { + if( m_type == ResultBase::Ok ) + new( &m_value ) T( other.m_value ); + } - union { - T m_value; - }; - }; + ResultValueBase( Type, T const &value ) : ResultBase( Ok ) { + new( &m_value ) T( value ); + } - template<> - class ResultValueBase : public ResultBase { - protected: - using ResultBase::ResultBase; - }; + auto operator=( ResultValueBase const &other ) -> ResultValueBase & { + if( m_type == ResultBase::Ok ) + m_value.~T(); + ResultBase::operator=(other); + if( m_type == ResultBase::Ok ) + new( &m_value ) T( other.m_value ); + return *this; + } - template - class BasicResult : public ResultValueBase { - public: - template - explicit BasicResult( BasicResult const &other ) - : ResultValueBase( other.type() ), - m_errorMessage( other.errorMessage() ) - { - assert( type() != ResultBase::Ok ); - } + ~ResultValueBase() override { + if( m_type == Ok ) + m_value.~T(); + } - template - static auto ok( U const &value ) -> BasicResult { return { ResultBase::Ok, value }; } - static auto ok() -> BasicResult { return { ResultBase::Ok }; } - static auto logicError( std::string const &message ) -> BasicResult { return { ResultBase::LogicError, message }; } - static auto runtimeError( std::string const &message ) -> BasicResult { return { ResultBase::RuntimeError, message }; } + union { + T m_value; + }; + }; - explicit operator bool() const { return m_type == ResultBase::Ok; } - auto type() const -> ResultBase::Type { return m_type; } - auto errorMessage() const -> std::string { return m_errorMessage; } + template<> + class ResultValueBase : public ResultBase { + protected: + using ResultBase::ResultBase; + }; - protected: - void enforceOk() const override { + template + class BasicResult : public ResultValueBase { + public: + template + explicit BasicResult( BasicResult const &other ) + : ResultValueBase( other.type() ), + m_errorMessage( other.errorMessage() ) + { + assert( type() != ResultBase::Ok ); + } - // Errors shouldn't reach this point, but if they do - // the actual error message will be in m_errorMessage - assert( m_type != ResultBase::LogicError ); - assert( m_type != ResultBase::RuntimeError ); - if( m_type != ResultBase::Ok ) - std::abort(); - } + template + static auto ok( U const &value ) -> BasicResult { return { ResultBase::Ok, value }; } + static auto ok() -> BasicResult { return { ResultBase::Ok }; } + static auto logicError( std::string const &message ) -> BasicResult { return { ResultBase::LogicError, message }; } + static auto runtimeError( std::string const &message ) -> BasicResult { return { ResultBase::RuntimeError, message }; } + + explicit operator bool() const { return m_type == ResultBase::Ok; } + auto type() const -> ResultBase::Type { return m_type; } + auto errorMessage() const -> std::string { return m_errorMessage; } + + protected: + void enforceOk() const override { + + // Errors shouldn't reach this point, but if they do + // the actual error message will be in m_errorMessage + assert( m_type != ResultBase::LogicError ); + assert( m_type != ResultBase::RuntimeError ); + if( m_type != ResultBase::Ok ) + std::abort(); + } - std::string m_errorMessage; // Only populated if resultType is an error + std::string m_errorMessage; // Only populated if resultType is an error - BasicResult( ResultBase::Type type, std::string const &message ) - : ResultValueBase(type), - m_errorMessage(message) - { - assert( m_type != ResultBase::Ok ); - } + BasicResult( ResultBase::Type type, std::string const &message ) + : ResultValueBase(type), + m_errorMessage(message) + { + assert( m_type != ResultBase::Ok ); + } - using ResultValueBase::ResultValueBase; - using ResultBase::m_type; - }; + using ResultValueBase::ResultValueBase; + using ResultBase::m_type; + }; - enum class ParseResultType { - Matched, NoMatch, ShortCircuitAll, ShortCircuitSame - }; + enum class ParseResultType { + Matched, NoMatch, ShortCircuitAll, ShortCircuitSame + }; - class ParseState { - public: + class ParseState { + public: - ParseState( ParseResultType type, TokenStream const &remainingTokens ) - : m_type(type), - m_remainingTokens( remainingTokens ) - {} + ParseState( ParseResultType type, TokenStream const &remainingTokens ) + : m_type(type), + m_remainingTokens( remainingTokens ) + {} - auto type() const -> ParseResultType { return m_type; } - auto remainingTokens() const -> TokenStream { return m_remainingTokens; } + auto type() const -> ParseResultType { return m_type; } + auto remainingTokens() const -> TokenStream { return m_remainingTokens; } - private: - ParseResultType m_type; - TokenStream m_remainingTokens; - }; + private: + ParseResultType m_type; + TokenStream m_remainingTokens; + }; - using Result = BasicResult; - using ParserResult = BasicResult; - using InternalParseResult = BasicResult; + using Result = BasicResult; + using ParserResult = BasicResult; + using InternalParseResult = BasicResult; - struct HelpColumns { - std::string left; - std::string right; - }; + struct HelpColumns { + std::string left; + std::string right; + }; - template - inline auto convertInto( std::string const &source, T& target ) -> ParserResult { - std::stringstream ss; - ss << source; - ss >> target; - if( ss.fail() ) - return ParserResult::runtimeError( "Unable to convert '" + source + "' to destination type" ); - else - return ParserResult::ok( ParseResultType::Matched ); - } - inline auto convertInto( std::string const &source, std::string& target ) -> ParserResult { - target = source; - return ParserResult::ok( ParseResultType::Matched ); - } - inline auto convertInto( std::string const &source, bool &target ) -> ParserResult { - std::string srcLC = source; - std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( unsigned char c ) { return static_cast( std::tolower(c) ); } ); - if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" || srcLC == "on") - target = true; - else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" || srcLC == "off") - target = false; - else - return ParserResult::runtimeError( "Expected a boolean value but did not recognise: '" + source + "'" ); - return ParserResult::ok( ParseResultType::Matched ); - } + template + inline auto convertInto( std::string const &source, T& target ) -> ParserResult { + std::stringstream ss; + ss << source; + ss >> target; + if( ss.fail() ) + return ParserResult::runtimeError( "Unable to convert '" + source + "' to destination type" ); + else + return ParserResult::ok( ParseResultType::Matched ); + } + inline auto convertInto( std::string const &source, std::string& target ) -> ParserResult { + target = source; + return ParserResult::ok( ParseResultType::Matched ); + } + inline auto convertInto( std::string const &source, bool &target ) -> ParserResult { + std::string srcLC = source; + std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( unsigned char c ) { return static_cast( std::tolower(c) ); } ); + if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" || srcLC == "on") + target = true; + else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" || srcLC == "off") + target = false; + else + return ParserResult::runtimeError( "Expected a boolean value but did not recognise: '" + source + "'" ); + return ParserResult::ok( ParseResultType::Matched ); + } #ifdef CLARA_CONFIG_OPTIONAL_TYPE - template - inline auto convertInto( std::string const &source, CLARA_CONFIG_OPTIONAL_TYPE& target ) -> ParserResult { - T temp; - auto result = convertInto( source, temp ); - if( result ) - target = std::move(temp); - return result; - } + template + inline auto convertInto( std::string const &source, CLARA_CONFIG_OPTIONAL_TYPE& target ) -> ParserResult { + T temp; + auto result = convertInto( source, temp ); + if( result ) + target = std::move(temp); + return result; + } #endif // CLARA_CONFIG_OPTIONAL_TYPE - struct NonCopyable { - NonCopyable() = default; - NonCopyable( NonCopyable const & ) = delete; - NonCopyable( NonCopyable && ) = delete; - NonCopyable &operator=( NonCopyable const & ) = delete; - NonCopyable &operator=( NonCopyable && ) = delete; - }; - - struct BoundRef : NonCopyable { - virtual ~BoundRef() = default; - virtual auto isContainer() const -> bool { return false; } - virtual auto isFlag() const -> bool { return false; } - }; - struct BoundValueRefBase : BoundRef { - virtual auto setValue( std::string const &arg ) -> ParserResult = 0; - }; - struct BoundFlagRefBase : BoundRef { - virtual auto setFlag( bool flag ) -> ParserResult = 0; - virtual auto isFlag() const -> bool { return true; } - }; - - template - struct BoundValueRef : BoundValueRefBase { - T &m_ref; + struct NonCopyable { + NonCopyable() = default; + NonCopyable( NonCopyable const & ) = delete; + NonCopyable( NonCopyable && ) = delete; + NonCopyable &operator=( NonCopyable const & ) = delete; + NonCopyable &operator=( NonCopyable && ) = delete; + }; - explicit BoundValueRef( T &ref ) : m_ref( ref ) {} + struct BoundRef : NonCopyable { + virtual ~BoundRef() = default; + virtual auto isContainer() const -> bool { return false; } + virtual auto isFlag() const -> bool { return false; } + }; + struct BoundValueRefBase : BoundRef { + virtual auto setValue( std::string const &arg ) -> ParserResult = 0; + }; + struct BoundFlagRefBase : BoundRef { + virtual auto setFlag( bool flag ) -> ParserResult = 0; + virtual auto isFlag() const -> bool { return true; } + }; - auto setValue( std::string const &arg ) -> ParserResult override { - return convertInto( arg, m_ref ); - } - }; + template + struct BoundValueRef : BoundValueRefBase { + T &m_ref; - template - struct BoundValueRef> : BoundValueRefBase { - std::vector &m_ref; + explicit BoundValueRef( T &ref ) : m_ref( ref ) {} - explicit BoundValueRef( std::vector &ref ) : m_ref( ref ) {} + auto setValue( std::string const &arg ) -> ParserResult override { + return convertInto( arg, m_ref ); + } + }; - auto isContainer() const -> bool override { return true; } + template + struct BoundValueRef> : BoundValueRefBase { + std::vector &m_ref; - auto setValue( std::string const &arg ) -> ParserResult override { - T temp; - auto result = convertInto( arg, temp ); - if( result ) - m_ref.push_back( temp ); - return result; - } - }; + explicit BoundValueRef( std::vector &ref ) : m_ref( ref ) {} - struct BoundFlagRef : BoundFlagRefBase { - bool &m_ref; + auto isContainer() const -> bool override { return true; } - explicit BoundFlagRef( bool &ref ) : m_ref( ref ) {} + auto setValue( std::string const &arg ) -> ParserResult override { + T temp; + auto result = convertInto( arg, temp ); + if( result ) + m_ref.push_back( temp ); + return result; + } + }; - auto setFlag( bool flag ) -> ParserResult override { - m_ref = flag; - return ParserResult::ok( ParseResultType::Matched ); - } - }; + struct BoundFlagRef : BoundFlagRefBase { + bool &m_ref; - template - struct LambdaInvoker { - static_assert( std::is_same::value, "Lambda must return void or clara::ParserResult" ); + explicit BoundFlagRef( bool &ref ) : m_ref( ref ) {} - template - static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult { - return lambda( arg ); - } - }; + auto setFlag( bool flag ) -> ParserResult override { + m_ref = flag; + return ParserResult::ok( ParseResultType::Matched ); + } + }; - template<> - struct LambdaInvoker { - template - static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult { - lambda( arg ); - return ParserResult::ok( ParseResultType::Matched ); - } - }; + template + struct LambdaInvoker { + static_assert( std::is_same::value, "Lambda must return void or clara::ParserResult" ); - template - inline auto invokeLambda( L const &lambda, std::string const &arg ) -> ParserResult { - ArgType temp{}; - auto result = convertInto( arg, temp ); - return !result - ? result - : LambdaInvoker::ReturnType>::invoke( lambda, temp ); - } + template + static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult { + return lambda( arg ); + } + }; - template - struct BoundLambda : BoundValueRefBase { - L m_lambda; + template<> + struct LambdaInvoker { + template + static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult { + lambda( arg ); + return ParserResult::ok( ParseResultType::Matched ); + } + }; - static_assert( UnaryLambdaTraits::isValid, "Supplied lambda must take exactly one argument" ); - explicit BoundLambda( L const &lambda ) : m_lambda( lambda ) {} + template + inline auto invokeLambda( L const &lambda, std::string const &arg ) -> ParserResult { + ArgType temp{}; + auto result = convertInto( arg, temp ); + return !result + ? result + : LambdaInvoker::ReturnType>::invoke( lambda, temp ); + } - auto setValue( std::string const &arg ) -> ParserResult override { - return invokeLambda::ArgType>( m_lambda, arg ); - } - }; + template + struct BoundLambda : BoundValueRefBase { + L m_lambda; - template - struct BoundFlagLambda : BoundFlagRefBase { - L m_lambda; + static_assert( UnaryLambdaTraits::isValid, "Supplied lambda must take exactly one argument" ); + explicit BoundLambda( L const &lambda ) : m_lambda( lambda ) {} - static_assert( UnaryLambdaTraits::isValid, "Supplied lambda must take exactly one argument" ); - static_assert( std::is_same::ArgType, bool>::value, "flags must be boolean" ); + auto setValue( std::string const &arg ) -> ParserResult override { + return invokeLambda::ArgType>( m_lambda, arg ); + } + }; - explicit BoundFlagLambda( L const &lambda ) : m_lambda( lambda ) {} + template + struct BoundFlagLambda : BoundFlagRefBase { + L m_lambda; - auto setFlag( bool flag ) -> ParserResult override { - return LambdaInvoker::ReturnType>::invoke( m_lambda, flag ); - } - }; + static_assert( UnaryLambdaTraits::isValid, "Supplied lambda must take exactly one argument" ); + static_assert( std::is_same::ArgType, bool>::value, "flags must be boolean" ); - enum class Optionality { Optional, Required }; + explicit BoundFlagLambda( L const &lambda ) : m_lambda( lambda ) {} - struct Parser; + auto setFlag( bool flag ) -> ParserResult override { + return LambdaInvoker::ReturnType>::invoke( m_lambda, flag ); + } + }; - class ParserBase { - public: - virtual ~ParserBase() = default; - virtual auto validate() const -> Result { return Result::ok(); } - virtual auto parse( std::string const& exeName, TokenStream const &tokens) const -> InternalParseResult = 0; - virtual auto cardinality() const -> size_t { return 1; } + enum class Optionality { Optional, Required }; - auto parse( Args const &args ) const -> InternalParseResult { - return parse( args.exeName(), TokenStream( args ) ); - } - }; + struct Parser; - template - class ComposableParserImpl : public ParserBase { - public: - template - auto operator|( T const &other ) const -> Parser; + class ParserBase { + public: + virtual ~ParserBase() = default; + virtual auto validate() const -> Result { return Result::ok(); } + virtual auto parse( std::string const& exeName, TokenStream const &tokens) const -> InternalParseResult = 0; + virtual auto cardinality() const -> size_t { return 1; } - template - auto operator+( T const &other ) const -> Parser; - }; + auto parse( Args const &args ) const -> InternalParseResult { + return parse( args.exeName(), TokenStream( args ) ); + } + }; - // Common code and state for Args and Opts - template - class ParserRefImpl : public ComposableParserImpl { - protected: - Optionality m_optionality = Optionality::Optional; - std::shared_ptr m_ref; - std::string m_hint; - std::string m_description; + template + class ComposableParserImpl : public ParserBase { + public: + template + auto operator|( T const &other ) const -> Parser; - explicit ParserRefImpl( std::shared_ptr const &ref ) : m_ref( ref ) {} + template + auto operator+( T const &other ) const -> Parser; + }; - public: - template - ParserRefImpl( T &ref, std::string const &hint ) - : m_ref( std::make_shared>( ref ) ), - m_hint( hint ) - {} + // Common code and state for Args and Opts + template + class ParserRefImpl : public ComposableParserImpl { + protected: + Optionality m_optionality = Optionality::Optional; + std::shared_ptr m_ref; + std::string m_hint; + std::string m_description; - template - ParserRefImpl( LambdaT const &ref, std::string const &hint ) - : m_ref( std::make_shared>( ref ) ), - m_hint(hint) - {} + explicit ParserRefImpl( std::shared_ptr const &ref ) : m_ref( ref ) {} - auto operator()( std::string const &description ) -> DerivedT & { - m_description = description; - return static_cast( *this ); - } + public: + template + ParserRefImpl( T &ref, std::string const &hint ) + : m_ref( std::make_shared>( ref ) ), + m_hint( hint ) + {} + + template + ParserRefImpl( LambdaT const &ref, std::string const &hint ) + : m_ref( std::make_shared>( ref ) ), + m_hint(hint) + {} + + auto operator()( std::string const &description ) -> DerivedT & { + m_description = description; + return static_cast( *this ); + } - auto optional() -> DerivedT & { - m_optionality = Optionality::Optional; - return static_cast( *this ); - }; + auto optional() -> DerivedT & { + m_optionality = Optionality::Optional; + return static_cast( *this ); + }; - auto required() -> DerivedT & { - m_optionality = Optionality::Required; - return static_cast( *this ); - }; + auto required() -> DerivedT & { + m_optionality = Optionality::Required; + return static_cast( *this ); + }; - auto isOptional() const -> bool { - return m_optionality == Optionality::Optional; - } + auto isOptional() const -> bool { + return m_optionality == Optionality::Optional; + } - auto cardinality() const -> size_t override { - if( m_ref->isContainer() ) - return 0; - else - return 1; - } + auto cardinality() const -> size_t override { + if( m_ref->isContainer() ) + return 0; + else + return 1; + } - auto hint() const -> std::string { return m_hint; } - }; + auto hint() const -> std::string { return m_hint; } + }; - class ExeName : public ComposableParserImpl { - std::shared_ptr m_name; - std::shared_ptr m_ref; + class ExeName : public ComposableParserImpl { + std::shared_ptr m_name; + std::shared_ptr m_ref; - template - static auto makeRef(LambdaT const &lambda) -> std::shared_ptr { - return std::make_shared>( lambda) ; - } + template + static auto makeRef(LambdaT const &lambda) -> std::shared_ptr { + return std::make_shared>( lambda) ; + } - public: - ExeName() : m_name( std::make_shared( "" ) ) {} + public: + ExeName() : m_name( std::make_shared( "" ) ) {} - explicit ExeName( std::string &ref ) : ExeName() { - m_ref = std::make_shared>( ref ); - } + explicit ExeName( std::string &ref ) : ExeName() { + m_ref = std::make_shared>( ref ); + } - template - explicit ExeName( LambdaT const& lambda ) : ExeName() { - m_ref = std::make_shared>( lambda ); - } + template + explicit ExeName( LambdaT const& lambda ) : ExeName() { + m_ref = std::make_shared>( lambda ); + } - // The exe name is not parsed out of the normal tokens, but is handled specially - auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { - return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) ); - } + // The exe name is not parsed out of the normal tokens, but is handled specially + auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { + return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) ); + } - auto name() const -> std::string { return *m_name; } - auto set( std::string const& newName ) -> ParserResult { + auto name() const -> std::string { return *m_name; } + auto set( std::string const& newName ) -> ParserResult { - auto lastSlash = newName.find_last_of( "\\/" ); - auto filename = ( lastSlash == std::string::npos ) - ? newName - : newName.substr( lastSlash+1 ); + auto lastSlash = newName.find_last_of( "\\/" ); + auto filename = ( lastSlash == std::string::npos ) + ? newName + : newName.substr( lastSlash+1 ); - *m_name = filename; - if( m_ref ) - return m_ref->setValue( filename ); - else - return ParserResult::ok( ParseResultType::Matched ); - } - }; + *m_name = filename; + if( m_ref ) + return m_ref->setValue( filename ); + else + return ParserResult::ok( ParseResultType::Matched ); + } + }; - class Arg : public ParserRefImpl { - public: - using ParserRefImpl::ParserRefImpl; + class Arg : public ParserRefImpl { + public: + using ParserRefImpl::ParserRefImpl; - auto parse( std::string const &, TokenStream const &tokens ) const -> InternalParseResult override { - auto validationResult = validate(); - if( !validationResult ) - return InternalParseResult( validationResult ); + auto parse( std::string const &, TokenStream const &tokens ) const -> InternalParseResult override { + auto validationResult = validate(); + if( !validationResult ) + return InternalParseResult( validationResult ); - auto remainingTokens = tokens; - auto const &token = *remainingTokens; - if( token.type != TokenType::Argument ) - return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); + auto remainingTokens = tokens; + auto const &token = *remainingTokens; + if( token.type != TokenType::Argument ) + return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); - assert( !m_ref->isFlag() ); - auto valueRef = static_cast( m_ref.get() ); + assert( !m_ref->isFlag() ); + auto valueRef = static_cast( m_ref.get() ); - auto result = valueRef->setValue( remainingTokens->token ); - if( !result ) - return InternalParseResult( result ); - else - return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); - } - }; + auto result = valueRef->setValue( remainingTokens->token ); + if( !result ) + return InternalParseResult( result ); + else + return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); + } + }; - inline auto normaliseOpt( std::string const &optName ) -> std::string { + inline auto normaliseOpt( std::string const &optName ) -> std::string { #ifdef CATCH_PLATFORM_WINDOWS - if( optName[0] == '/' ) + if( optName[0] == '/' ) return "-" + optName.substr( 1 ); else #endif - return optName; - } - - class Opt : public ParserRefImpl { - protected: - std::vector m_optNames; - - public: - template - explicit Opt( LambdaT const &ref ) : ParserRefImpl( std::make_shared>( ref ) ) {} + return optName; + } - explicit Opt( bool &ref ) : ParserRefImpl( std::make_shared( ref ) ) {} + class Opt : public ParserRefImpl { + protected: + std::vector m_optNames; - template - Opt( LambdaT const &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {} + public: + template + explicit Opt( LambdaT const &ref ) : ParserRefImpl( std::make_shared>( ref ) ) {} - template - Opt( T &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {} + explicit Opt( bool &ref ) : ParserRefImpl( std::make_shared( ref ) ) {} - auto operator[]( std::string const &optName ) -> Opt & { - m_optNames.push_back( optName ); - return *this; - } + template + Opt( LambdaT const &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {} - auto getHelpColumns() const -> std::vector { - std::ostringstream oss; - bool first = true; - for( auto const &opt : m_optNames ) { - if (first) - first = false; - else - oss << ", "; - oss << opt; - } - if( !m_hint.empty() ) - oss << " <" << m_hint << ">"; - return { { oss.str(), m_description } }; - } + template + Opt( T &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {} - auto isMatch( std::string const &optToken ) const -> bool { - auto normalisedToken = normaliseOpt( optToken ); - for( auto const &name : m_optNames ) { - if( normaliseOpt( name ) == normalisedToken ) - return true; - } - return false; - } + auto operator[]( std::string const &optName ) -> Opt & { + m_optNames.push_back( optName ); + return *this; + } - using ParserBase::parse; + auto getHelpColumns() const -> std::vector { + std::ostringstream oss; + bool first = true; + for( auto const &opt : m_optNames ) { + if (first) + first = false; + else + oss << ", "; + oss << opt; + } + if( !m_hint.empty() ) + oss << " <" << m_hint << ">"; + return { { oss.str(), m_description } }; + } - auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { - auto validationResult = validate(); - if( !validationResult ) - return InternalParseResult( validationResult ); + auto isMatch( std::string const &optToken ) const -> bool { + auto normalisedToken = normaliseOpt( optToken ); + for( auto const &name : m_optNames ) { + if( normaliseOpt( name ) == normalisedToken ) + return true; + } + return false; + } - auto remainingTokens = tokens; - if( remainingTokens && remainingTokens->type == TokenType::Option ) { - auto const &token = *remainingTokens; - if( isMatch(token.token ) ) { - if( m_ref->isFlag() ) { - auto flagRef = static_cast( m_ref.get() ); - auto result = flagRef->setFlag( true ); - if( !result ) - return InternalParseResult( result ); - if( result.value() == ParseResultType::ShortCircuitAll ) - return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); - } else { - auto valueRef = static_cast( m_ref.get() ); - ++remainingTokens; - if( !remainingTokens ) - return InternalParseResult::runtimeError( "Expected argument following " + token.token ); - auto const &argToken = *remainingTokens; - if( argToken.type != TokenType::Argument ) - return InternalParseResult::runtimeError( "Expected argument following " + token.token ); - auto result = valueRef->setValue( argToken.token ); - if( !result ) - return InternalParseResult( result ); - if( result.value() == ParseResultType::ShortCircuitAll ) - return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); + using ParserBase::parse; + + auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { + auto validationResult = validate(); + if( !validationResult ) + return InternalParseResult( validationResult ); + + auto remainingTokens = tokens; + if( remainingTokens && remainingTokens->type == TokenType::Option ) { + auto const &token = *remainingTokens; + if( isMatch(token.token ) ) { + if( m_ref->isFlag() ) { + auto flagRef = static_cast( m_ref.get() ); + auto result = flagRef->setFlag( true ); + if( !result ) + return InternalParseResult( result ); + if( result.value() == ParseResultType::ShortCircuitAll ) + return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); + } else { + auto valueRef = static_cast( m_ref.get() ); + ++remainingTokens; + if( !remainingTokens ) + return InternalParseResult::runtimeError( "Expected argument following " + token.token ); + auto const &argToken = *remainingTokens; + if( argToken.type != TokenType::Argument ) + return InternalParseResult::runtimeError( "Expected argument following " + token.token ); + auto result = valueRef->setValue( argToken.token ); + if( !result ) + return InternalParseResult( result ); + if( result.value() == ParseResultType::ShortCircuitAll ) + return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); + } + return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); + } } - return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); + return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); } - } - return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); - } - auto validate() const -> Result override { - if( m_optNames.empty() ) - return Result::logicError( "No options supplied to Opt" ); - for( auto const &name : m_optNames ) { - if( name.empty() ) - return Result::logicError( "Option name cannot be empty" ); + auto validate() const -> Result override { + if( m_optNames.empty() ) + return Result::logicError( "No options supplied to Opt" ); + for( auto const &name : m_optNames ) { + if( name.empty() ) + return Result::logicError( "Option name cannot be empty" ); #ifdef CATCH_PLATFORM_WINDOWS - if( name[0] != '-' && name[0] != '/' ) + if( name[0] != '-' && name[0] != '/' ) return Result::logicError( "Option name must begin with '-' or '/'" ); #else - if( name[0] != '-' ) - return Result::logicError( "Option name must begin with '-'" ); + if( name[0] != '-' ) + return Result::logicError( "Option name must begin with '-'" ); #endif - } - return ParserRefImpl::validate(); - } - }; + } + return ParserRefImpl::validate(); + } + }; - struct Help : Opt { - Help( bool &showHelpFlag ) - : Opt([&]( bool flag ) { - showHelpFlag = flag; - return ParserResult::ok( ParseResultType::ShortCircuitAll ); - }) - { - static_cast( *this ) - ("display usage information") + struct Help : Opt { + Help( bool &showHelpFlag ) + : Opt([&]( bool flag ) { + showHelpFlag = flag; + return ParserResult::ok( ParseResultType::ShortCircuitAll ); + }) + { + static_cast( *this ) + ("display usage information") ["-?"]["-h"]["--help"] - .optional(); - } - }; - - struct Parser : ParserBase { - - mutable ExeName m_exeName; - std::vector m_options; - std::vector m_args; + .optional(); + } + }; - auto operator|=( ExeName const &exeName ) -> Parser & { - m_exeName = exeName; - return *this; - } + struct Parser : ParserBase { - auto operator|=( Arg const &arg ) -> Parser & { - m_args.push_back(arg); - return *this; - } + mutable ExeName m_exeName; + std::vector m_options; + std::vector m_args; - auto operator|=( Opt const &opt ) -> Parser & { - m_options.push_back(opt); - return *this; - } + auto operator|=( ExeName const &exeName ) -> Parser & { + m_exeName = exeName; + return *this; + } - auto operator|=( Parser const &other ) -> Parser & { - m_options.insert(m_options.end(), other.m_options.begin(), other.m_options.end()); - m_args.insert(m_args.end(), other.m_args.begin(), other.m_args.end()); - return *this; - } + auto operator|=( Arg const &arg ) -> Parser & { + m_args.push_back(arg); + return *this; + } - template - auto operator|( T const &other ) const -> Parser { - return Parser( *this ) |= other; - } + auto operator|=( Opt const &opt ) -> Parser & { + m_options.push_back(opt); + return *this; + } - // Forward deprecated interface with '+' instead of '|' - template - auto operator+=( T const &other ) -> Parser & { return operator|=( other ); } - template - auto operator+( T const &other ) const -> Parser { return operator|( other ); } + auto operator|=( Parser const &other ) -> Parser & { + m_options.insert(m_options.end(), other.m_options.begin(), other.m_options.end()); + m_args.insert(m_args.end(), other.m_args.begin(), other.m_args.end()); + return *this; + } - auto getHelpColumns() const -> std::vector { - std::vector cols; - for (auto const &o : m_options) { - auto childCols = o.getHelpColumns(); - cols.insert( cols.end(), childCols.begin(), childCols.end() ); - } - return cols; - } + template + auto operator|( T const &other ) const -> Parser { + return Parser( *this ) |= other; + } - void writeToStream( std::ostream &os ) const { - if (!m_exeName.name().empty()) { - os << "usage:\n" << " " << m_exeName.name() << " "; - bool required = true, first = true; - for( auto const &arg : m_args ) { - if (first) - first = false; - else - os << " "; - if( arg.isOptional() && required ) { - os << "["; - required = false; + // Forward deprecated interface with '+' instead of '|' + template + auto operator+=( T const &other ) -> Parser & { return operator|=( other ); } + template + auto operator+( T const &other ) const -> Parser { return operator|( other ); } + + auto getHelpColumns() const -> std::vector { + std::vector cols; + for (auto const &o : m_options) { + auto childCols = o.getHelpColumns(); + cols.insert( cols.end(), childCols.begin(), childCols.end() ); } - os << "<" << arg.hint() << ">"; - if( arg.cardinality() == 0 ) - os << " ... "; + return cols; } - if( !required ) - os << "]"; - if( !m_options.empty() ) - os << " options"; - os << "\n\nwhere options are:" << std::endl; - } - auto rows = getHelpColumns(); - size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH; - size_t optWidth = 0; - for( auto const &cols : rows ) - optWidth = (std::max)(optWidth, cols.left.size() + 2); - - optWidth = (std::min)(optWidth, consoleWidth/2); + void writeToStream( std::ostream &os ) const { + if (!m_exeName.name().empty()) { + os << "usage:\n" << " " << m_exeName.name() << " "; + bool required = true, first = true; + for( auto const &arg : m_args ) { + if (first) + first = false; + else + os << " "; + if( arg.isOptional() && required ) { + os << "["; + required = false; + } + os << "<" << arg.hint() << ">"; + if( arg.cardinality() == 0 ) + os << " ... "; + } + if( !required ) + os << "]"; + if( !m_options.empty() ) + os << " options"; + os << "\n\nwhere options are:" << std::endl; + } - for( auto const &cols : rows ) { - auto row = - TextFlow::Column( cols.left ).width( optWidth ).indent( 2 ) + - TextFlow::Spacer(4) + - TextFlow::Column( cols.right ).width( consoleWidth - 7 - optWidth ); - os << row << std::endl; - } - } + auto rows = getHelpColumns(); + size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH; + size_t optWidth = 0; + for( auto const &cols : rows ) + optWidth = (std::max)(optWidth, cols.left.size() + 2); - friend auto operator<<( std::ostream &os, Parser const &parser ) -> std::ostream& { - parser.writeToStream( os ); - return os; - } + optWidth = (std::min)(optWidth, consoleWidth/2); - auto validate() const -> Result override { - for( auto const &opt : m_options ) { - auto result = opt.validate(); - if( !result ) - return result; - } - for( auto const &arg : m_args ) { - auto result = arg.validate(); - if( !result ) - return result; - } - return Result::ok(); - } + for( auto const &cols : rows ) { + auto row = + TextFlow::Column( cols.left ).width( optWidth ).indent( 2 ) + + TextFlow::Spacer(4) + + TextFlow::Column( cols.right ).width( consoleWidth - 7 - optWidth ); + os << row << std::endl; + } + } - using ParserBase::parse; + friend auto operator<<( std::ostream &os, Parser const &parser ) -> std::ostream& { + parser.writeToStream( os ); + return os; + } - auto parse( std::string const& exeName, TokenStream const &tokens ) const -> InternalParseResult override { + auto validate() const -> Result override { + for( auto const &opt : m_options ) { + auto result = opt.validate(); + if( !result ) + return result; + } + for( auto const &arg : m_args ) { + auto result = arg.validate(); + if( !result ) + return result; + } + return Result::ok(); + } - struct ParserInfo { - ParserBase const* parser = nullptr; - size_t count = 0; - }; - const size_t totalParsers = m_options.size() + m_args.size(); - assert( totalParsers < 512 ); - // ParserInfo parseInfos[totalParsers]; // <-- this is what we really want to do - ParserInfo parseInfos[512]; + using ParserBase::parse; - { - size_t i = 0; - for (auto const &opt : m_options) parseInfos[i++].parser = &opt; - for (auto const &arg : m_args) parseInfos[i++].parser = &arg; - } + auto parse( std::string const& exeName, TokenStream const &tokens ) const -> InternalParseResult override { - m_exeName.set( exeName ); + struct ParserInfo { + ParserBase const* parser = nullptr; + size_t count = 0; + }; + const size_t totalParsers = m_options.size() + m_args.size(); + assert( totalParsers < 512 ); + // ParserInfo parseInfos[totalParsers]; // <-- this is what we really want to do + ParserInfo parseInfos[512]; + + { + size_t i = 0; + for (auto const &opt : m_options) parseInfos[i++].parser = &opt; + for (auto const &arg : m_args) parseInfos[i++].parser = &arg; + } - auto result = InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) ); - while( result.value().remainingTokens() ) { - bool tokenParsed = false; + m_exeName.set( exeName ); + + auto result = InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) ); + while( result.value().remainingTokens() ) { + bool tokenParsed = false; + + for( size_t i = 0; i < totalParsers; ++i ) { + auto& parseInfo = parseInfos[i]; + if( parseInfo.parser->cardinality() == 0 || parseInfo.count < parseInfo.parser->cardinality() ) { + result = parseInfo.parser->parse(exeName, result.value().remainingTokens()); + if (!result) + return result; + if (result.value().type() != ParseResultType::NoMatch) { + tokenParsed = true; + ++parseInfo.count; + break; + } + } + } - for( size_t i = 0; i < totalParsers; ++i ) { - auto& parseInfo = parseInfos[i]; - if( parseInfo.parser->cardinality() == 0 || parseInfo.count < parseInfo.parser->cardinality() ) { - result = parseInfo.parser->parse(exeName, result.value().remainingTokens()); - if (!result) + if( result.value().type() == ParseResultType::ShortCircuitAll ) return result; - if (result.value().type() != ParseResultType::NoMatch) { - tokenParsed = true; - ++parseInfo.count; - break; - } + if( !tokenParsed ) + return InternalParseResult::runtimeError( "Unrecognised token: " + result.value().remainingTokens()->token ); } + // !TBD Check missing required options + return result; } + }; - if( result.value().type() == ParseResultType::ShortCircuitAll ) - return result; - if( !tokenParsed ) - return InternalParseResult::runtimeError( "Unrecognised token: " + result.value().remainingTokens()->token ); + template + template + auto ComposableParserImpl::operator|( T const &other ) const -> Parser { + return Parser() | static_cast( *this ) | other; } - // !TBD Check missing required options - return result; - } - }; - - template - template - auto ComposableParserImpl::operator|( T const &other ) const -> Parser { - return Parser() | static_cast( *this ) | other; - } -} // namespace detail + } // namespace detail // A Combined parser -using detail::Parser; + using detail::Parser; // A parser for options -using detail::Opt; + using detail::Opt; // A parser for arguments -using detail::Arg; + using detail::Arg; // Wrapper for argc, argv from main() -using detail::Args; + using detail::Args; // Specifies the name of the executable -using detail::ExeName; + using detail::ExeName; // Convenience wrapper for option parser that specifies the help option -using detail::Help; + using detail::Help; // enum of result types from a parse -using detail::ParseResultType; + using detail::ParseResultType; // Result type for parser operation -using detail::ParserResult; + using detail::ParserResult; -}} // namespace Catch::clara + }} // namespace Catch::clara // end clara.hpp #ifdef __clang__ @@ -9689,8 +9696,8 @@ namespace Catch { } // end namespace Catch // end catch_commandline.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/fstream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ctime" +#include +#include namespace Catch { @@ -9699,86 +9706,86 @@ namespace Catch { using namespace clara; auto const setWarning = [&]( std::string const& warning ) { - auto warningSet = [&]() { - if( warning == "NoAssertions" ) - return WarnAbout::NoAssertions; + auto warningSet = [&]() { + if( warning == "NoAssertions" ) + return WarnAbout::NoAssertions; - if ( warning == "NoTests" ) - return WarnAbout::NoTests; + if ( warning == "NoTests" ) + return WarnAbout::NoTests; - return WarnAbout::Nothing; - }(); + return WarnAbout::Nothing; + }(); - if (warningSet == WarnAbout::Nothing) - return ParserResult::runtimeError( "Unrecognised warning: '" + warning + "'" ); - config.warnings = static_cast( config.warnings | warningSet ); - return ParserResult::ok( ParseResultType::Matched ); - }; + if (warningSet == WarnAbout::Nothing) + return ParserResult::runtimeError( "Unrecognised warning: '" + warning + "'" ); + config.warnings = static_cast( config.warnings | warningSet ); + return ParserResult::ok( ParseResultType::Matched ); + }; auto const loadTestNamesFromFile = [&]( std::string const& filename ) { - std::ifstream f( filename.c_str() ); - if( !f.is_open() ) - return ParserResult::runtimeError( "Unable to load input file: '" + filename + "'" ); - - std::string line; - while( std::getline( f, line ) ) { - line = trim(line); - if( !line.empty() && !startsWith( line, '#' ) ) { - if( !startsWith( line, '"' ) ) - line = '"' + line + '"'; - config.testsOrTags.push_back( line ); - config.testsOrTags.emplace_back( "," ); - } + std::ifstream f( filename.c_str() ); + if( !f.is_open() ) + return ParserResult::runtimeError( "Unable to load input file: '" + filename + "'" ); + + std::string line; + while( std::getline( f, line ) ) { + line = trim(line); + if( !line.empty() && !startsWith( line, '#' ) ) { + if( !startsWith( line, '"' ) ) + line = '"' + line + '"'; + config.testsOrTags.push_back( line ); + config.testsOrTags.emplace_back( "," ); } - //Remove comma in the end - if(!config.testsOrTags.empty()) - config.testsOrTags.erase( config.testsOrTags.end()-1 ); + } + //Remove comma in the end + if(!config.testsOrTags.empty()) + config.testsOrTags.erase( config.testsOrTags.end()-1 ); - return ParserResult::ok( ParseResultType::Matched ); - }; + return ParserResult::ok( ParseResultType::Matched ); + }; auto const setTestOrder = [&]( std::string const& order ) { - if( startsWith( "declared", order ) ) - config.runOrder = RunTests::InDeclarationOrder; - else if( startsWith( "lexical", order ) ) - config.runOrder = RunTests::InLexicographicalOrder; - else if( startsWith( "random", order ) ) - config.runOrder = RunTests::InRandomOrder; - else - return clara::ParserResult::runtimeError( "Unrecognised ordering: '" + order + "'" ); - return ParserResult::ok( ParseResultType::Matched ); - }; + if( startsWith( "declared", order ) ) + config.runOrder = RunTests::InDeclarationOrder; + else if( startsWith( "lexical", order ) ) + config.runOrder = RunTests::InLexicographicalOrder; + else if( startsWith( "random", order ) ) + config.runOrder = RunTests::InRandomOrder; + else + return clara::ParserResult::runtimeError( "Unrecognised ordering: '" + order + "'" ); + return ParserResult::ok( ParseResultType::Matched ); + }; auto const setRngSeed = [&]( std::string const& seed ) { - if( seed != "time" ) - return clara::detail::convertInto( seed, config.rngSeed ); - config.rngSeed = static_cast( std::time(nullptr) ); - return ParserResult::ok( ParseResultType::Matched ); - }; + if( seed != "time" ) + return clara::detail::convertInto( seed, config.rngSeed ); + config.rngSeed = static_cast( std::time(nullptr) ); + return ParserResult::ok( ParseResultType::Matched ); + }; auto const setColourUsage = [&]( std::string const& useColour ) { - auto mode = toLower( useColour ); - - if( mode == "yes" ) - config.useColour = UseColour::Yes; - else if( mode == "no" ) - config.useColour = UseColour::No; - else if( mode == "auto" ) - config.useColour = UseColour::Auto; - else - return ParserResult::runtimeError( "colour mode must be one of: auto, yes or no. '" + useColour + "' not recognised" ); - return ParserResult::ok( ParseResultType::Matched ); - }; + auto mode = toLower( useColour ); + + if( mode == "yes" ) + config.useColour = UseColour::Yes; + else if( mode == "no" ) + config.useColour = UseColour::No; + else if( mode == "auto" ) + config.useColour = UseColour::Auto; + else + return ParserResult::runtimeError( "colour mode must be one of: auto, yes or no. '" + useColour + "' not recognised" ); + return ParserResult::ok( ParseResultType::Matched ); + }; auto const setWaitForKeypress = [&]( std::string const& keypress ) { - auto keypressLc = toLower( keypress ); - if (keypressLc == "never") - config.waitForKeypress = WaitForKeypress::Never; - else if( keypressLc == "start" ) - config.waitForKeypress = WaitForKeypress::BeforeStart; - else if( keypressLc == "exit" ) - config.waitForKeypress = WaitForKeypress::BeforeExit; - else if( keypressLc == "both" ) - config.waitForKeypress = WaitForKeypress::BeforeStartAndExit; - else - return ParserResult::runtimeError( "keypress argument must be one of: never, start, exit or both. '" + keypress + "' not recognised" ); + auto keypressLc = toLower( keypress ); + if (keypressLc == "never") + config.waitForKeypress = WaitForKeypress::Never; + else if( keypressLc == "start" ) + config.waitForKeypress = WaitForKeypress::BeforeStart; + else if( keypressLc == "exit" ) + config.waitForKeypress = WaitForKeypress::BeforeExit; + else if( keypressLc == "both" ) + config.waitForKeypress = WaitForKeypress::BeforeStartAndExit; + else + return ParserResult::runtimeError( "keypress argument must be one of: never, start, exit or both. '" + keypress + "' not recognised" ); return ParserResult::ok( ParseResultType::Matched ); - }; + }; auto const setVerbosity = [&]( std::string const& verbosity ) { auto lcVerbosity = toLower( verbosity ); if( lcVerbosity == "quiet" ) @@ -9805,100 +9812,100 @@ namespace Catch { }; auto cli - = ExeName( config.processName ) - | Help( config.showHelp ) - | Opt( config.listTests ) - ["-l"]["--list-tests"] - ( "list all/matching test cases" ) - | Opt( config.listTags ) - ["-t"]["--list-tags"] - ( "list all/matching tags" ) - | Opt( config.showSuccessfulTests ) - ["-s"]["--success"] - ( "include successful tests in output" ) - | Opt( config.shouldDebugBreak ) - ["-b"]["--break"] - ( "break into debugger on failure" ) - | Opt( config.noThrow ) - ["-e"]["--nothrow"] - ( "skip exception tests" ) - | Opt( config.showInvisibles ) - ["-i"]["--invisibles"] - ( "show invisibles (tabs, newlines)" ) - | Opt( config.outputFilename, "filename" ) - ["-o"]["--out"] - ( "output filename" ) - | Opt( setReporter, "name" ) - ["-r"]["--reporter"] - ( "reporter to use (defaults to console)" ) - | Opt( config.name, "name" ) - ["-n"]["--name"] - ( "suite name" ) - | Opt( [&]( bool ){ config.abortAfter = 1; } ) - ["-a"]["--abort"] - ( "abort at first failure" ) - | Opt( [&]( int x ){ config.abortAfter = x; }, "no. failures" ) - ["-x"]["--abortx"] - ( "abort after x failures" ) - | Opt( setWarning, "warning name" ) - ["-w"]["--warn"] - ( "enable warnings" ) - | Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, "yes|no" ) - ["-d"]["--durations"] - ( "show test durations" ) - | Opt( config.minDuration, "seconds" ) - ["-D"]["--min-duration"] - ( "show test durations for tests taking at least the given number of seconds" ) - | Opt( loadTestNamesFromFile, "filename" ) - ["-f"]["--input-file"] - ( "load test names to run from a file" ) - | Opt( config.filenamesAsTags ) - ["-#"]["--filenames-as-tags"] - ( "adds a tag for the filename" ) - | Opt( config.sectionsToRun, "section name" ) - ["-c"]["--section"] - ( "specify section to run" ) - | Opt( setVerbosity, "quiet|normal|high" ) - ["-v"]["--verbosity"] - ( "set output verbosity" ) - | Opt( config.listTestNamesOnly ) - ["--list-test-names-only"] - ( "list all/matching test cases names only" ) - | Opt( config.listReporters ) - ["--list-reporters"] - ( "list all reporters" ) - | Opt( setTestOrder, "decl|lex|rand" ) - ["--order"] - ( "test case order (defaults to decl)" ) - | Opt( setRngSeed, "'time'|number" ) - ["--rng-seed"] - ( "set a specific seed for random numbers" ) - | Opt( setColourUsage, "yes|no" ) - ["--use-colour"] - ( "should output be colourised" ) - | Opt( config.libIdentify ) - ["--libidentify"] - ( "report name and version according to libidentify standard" ) - | Opt( setWaitForKeypress, "never|start|exit|both" ) - ["--wait-for-keypress"] - ( "waits for a keypress before exiting" ) - | Opt( config.benchmarkSamples, "samples" ) - ["--benchmark-samples"] - ( "number of samples to collect (default: 100)" ) - | Opt( config.benchmarkResamples, "resamples" ) - ["--benchmark-resamples"] - ( "number of resamples for the bootstrap (default: 100000)" ) - | Opt( config.benchmarkConfidenceInterval, "confidence interval" ) - ["--benchmark-confidence-interval"] - ( "confidence interval for the bootstrap (between 0 and 1, default: 0.95)" ) - | Opt( config.benchmarkNoAnalysis ) - ["--benchmark-no-analysis"] - ( "perform only measurements; do not perform any analysis" ) - | Opt( config.benchmarkWarmupTime, "benchmarkWarmupTime" ) - ["--benchmark-warmup-time"] - ( "amount of time in milliseconds spent on warming up each test (default: 100)" ) - | Arg( config.testsOrTags, "test name|pattern|tags" ) - ( "which test or tests to use" ); + = ExeName( config.processName ) + | Help( config.showHelp ) + | Opt( config.listTests ) + ["-l"]["--list-tests"] + ( "list all/matching test cases" ) + | Opt( config.listTags ) + ["-t"]["--list-tags"] + ( "list all/matching tags" ) + | Opt( config.showSuccessfulTests ) + ["-s"]["--success"] + ( "include successful tests in output" ) + | Opt( config.shouldDebugBreak ) + ["-b"]["--break"] + ( "break into debugger on failure" ) + | Opt( config.noThrow ) + ["-e"]["--nothrow"] + ( "skip exception tests" ) + | Opt( config.showInvisibles ) + ["-i"]["--invisibles"] + ( "show invisibles (tabs, newlines)" ) + | Opt( config.outputFilename, "filename" ) + ["-o"]["--out"] + ( "output filename" ) + | Opt( setReporter, "name" ) + ["-r"]["--reporter"] + ( "reporter to use (defaults to console)" ) + | Opt( config.name, "name" ) + ["-n"]["--name"] + ( "suite name" ) + | Opt( [&]( bool ){ config.abortAfter = 1; } ) + ["-a"]["--abort"] + ( "abort at first failure" ) + | Opt( [&]( int x ){ config.abortAfter = x; }, "no. failures" ) + ["-x"]["--abortx"] + ( "abort after x failures" ) + | Opt( setWarning, "warning name" ) + ["-w"]["--warn"] + ( "enable warnings" ) + | Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, "yes|no" ) + ["-d"]["--durations"] + ( "show test durations" ) + | Opt( config.minDuration, "seconds" ) + ["-D"]["--min-duration"] + ( "show test durations for tests taking at least the given number of seconds" ) + | Opt( loadTestNamesFromFile, "filename" ) + ["-f"]["--input-file"] + ( "load test names to run from a file" ) + | Opt( config.filenamesAsTags ) + ["-#"]["--filenames-as-tags"] + ( "adds a tag for the filename" ) + | Opt( config.sectionsToRun, "section name" ) + ["-c"]["--section"] + ( "specify section to run" ) + | Opt( setVerbosity, "quiet|normal|high" ) + ["-v"]["--verbosity"] + ( "set output verbosity" ) + | Opt( config.listTestNamesOnly ) + ["--list-test-names-only"] + ( "list all/matching test cases names only" ) + | Opt( config.listReporters ) + ["--list-reporters"] + ( "list all reporters" ) + | Opt( setTestOrder, "decl|lex|rand" ) + ["--order"] + ( "test case order (defaults to decl)" ) + | Opt( setRngSeed, "'time'|number" ) + ["--rng-seed"] + ( "set a specific seed for random numbers" ) + | Opt( setColourUsage, "yes|no" ) + ["--use-colour"] + ( "should output be colourised" ) + | Opt( config.libIdentify ) + ["--libidentify"] + ( "report name and version according to libidentify standard" ) + | Opt( setWaitForKeypress, "never|start|exit|both" ) + ["--wait-for-keypress"] + ( "waits for a keypress before exiting" ) + | Opt( config.benchmarkSamples, "samples" ) + ["--benchmark-samples"] + ( "number of samples to collect (default: 100)" ) + | Opt( config.benchmarkResamples, "resamples" ) + ["--benchmark-resamples"] + ( "number of resamples for the bootstrap (default: 100000)" ) + | Opt( config.benchmarkConfidenceInterval, "confidence interval" ) + ["--benchmark-confidence-interval"] + ( "confidence interval for the bootstrap (between 0 and 1, default: 0.95)" ) + | Opt( config.benchmarkNoAnalysis ) + ["--benchmark-no-analysis"] + ( "perform only measurements; do not perform any analysis" ) + | Opt( config.benchmarkWarmupTime, "benchmarkWarmupTime" ) + ["--benchmark-warmup-time"] + ( "amount of time in milliseconds spent on warming up each test (default: 100)" ) + | Arg( config.testsOrTags, "test name|pattern|tags" ) + ( "which test or tests to use" ); return cli; } @@ -9907,8 +9914,8 @@ namespace Catch { // end catch_commandline.cpp // start catch_common.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstring" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ostream" +#include +#include namespace Catch { @@ -9944,8 +9951,8 @@ namespace Catch { namespace Catch { Config::Config( ConfigData const& data ) - : m_data( data ), - m_stream( openStream() ) + : m_data( data ), + m_stream( openStream() ) { // We need to trim filter specs to avoid trouble with superfluous // whitespace (esp. important for bdd macros, as those are manually @@ -10069,7 +10076,7 @@ namespace Catch { #endif // defined(CATCH_PLATFORM_WINDOWS) // end catch_windows_h_proxy.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" +#include namespace Catch { namespace { @@ -10166,78 +10173,78 @@ namespace { #elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/unistd.h" +#include namespace Catch { -namespace { - - // use POSIX/ ANSI console terminal codes - // Thanks to Adam Strzelecki for original contribution - // (http://github.com/nanoant) - // https://github.com/philsquared/Catch/pull/131 - class PosixColourImpl : public IColourImpl { - public: - void use( Colour::Code _colourCode ) override { - switch( _colourCode ) { - case Colour::None: - case Colour::White: return setColour( "[0m" ); - case Colour::Red: return setColour( "[0;31m" ); - case Colour::Green: return setColour( "[0;32m" ); - case Colour::Blue: return setColour( "[0;34m" ); - case Colour::Cyan: return setColour( "[0;36m" ); - case Colour::Yellow: return setColour( "[0;33m" ); - case Colour::Grey: return setColour( "[1;30m" ); - - case Colour::LightGrey: return setColour( "[0;37m" ); - case Colour::BrightRed: return setColour( "[1;31m" ); - case Colour::BrightGreen: return setColour( "[1;32m" ); - case Colour::BrightWhite: return setColour( "[1;37m" ); - case Colour::BrightYellow: return setColour( "[1;33m" ); + namespace { - case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); - default: CATCH_INTERNAL_ERROR( "Unknown colour requested" ); + // use POSIX/ ANSI console terminal codes + // Thanks to Adam Strzelecki for original contribution + // (http://github.com/nanoant) + // https://github.com/philsquared/Catch/pull/131 + class PosixColourImpl : public IColourImpl { + public: + void use( Colour::Code _colourCode ) override { + switch( _colourCode ) { + case Colour::None: + case Colour::White: return setColour( "[0m" ); + case Colour::Red: return setColour( "[0;31m" ); + case Colour::Green: return setColour( "[0;32m" ); + case Colour::Blue: return setColour( "[0;34m" ); + case Colour::Cyan: return setColour( "[0;36m" ); + case Colour::Yellow: return setColour( "[0;33m" ); + case Colour::Grey: return setColour( "[1;30m" ); + + case Colour::LightGrey: return setColour( "[0;37m" ); + case Colour::BrightRed: return setColour( "[1;31m" ); + case Colour::BrightGreen: return setColour( "[1;32m" ); + case Colour::BrightWhite: return setColour( "[1;37m" ); + case Colour::BrightYellow: return setColour( "[1;33m" ); + + case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); + default: CATCH_INTERNAL_ERROR( "Unknown colour requested" ); + } + } + static IColourImpl* instance() { + static PosixColourImpl s_instance; + return &s_instance; } - } - static IColourImpl* instance() { - static PosixColourImpl s_instance; - return &s_instance; - } - private: - void setColour( const char* _escapeCode ) { - getCurrentContext().getConfig()->stream() - << '\033' << _escapeCode; - } - }; + private: + void setColour( const char* _escapeCode ) { + getCurrentContext().getConfig()->stream() + << '\033' << _escapeCode; + } + }; - bool useColourOnPlatform() { - return + bool useColourOnPlatform() { + return #if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE) - !isDebuggerActive() && + !isDebuggerActive() && #endif #if !(defined(__DJGPP__) && defined(__STRICT_ANSI__)) - isatty(STDOUT_FILENO) + isatty(STDOUT_FILENO) #else - false + false #endif - ; - } - IColourImpl* platformColourInstance() { - ErrnoGuard guard; - IConfigPtr config = getCurrentContext().getConfig(); - UseColour::YesOrNo colourMode = config - ? config->useColour() - : UseColour::Auto; - if( colourMode == UseColour::Auto ) - colourMode = useColourOnPlatform() - ? UseColour::Yes - : UseColour::No; - return colourMode == UseColour::Yes - ? PosixColourImpl::instance() - : NoColourImpl::instance(); - } - -} // end anon namespace + ; + } + IColourImpl* platformColourInstance() { + ErrnoGuard guard; + IConfigPtr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = useColourOnPlatform() + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? PosixColourImpl::instance() + : NoColourImpl::instance(); + } + + } // end anon namespace } // end namespace Catch #else // not Windows or ANSI /////////////////////////////////////////////// @@ -10352,7 +10359,7 @@ namespace Catch { // start catch_debug_console.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include namespace Catch { void writeToDebugConsole( std::string const& text ); @@ -10370,7 +10377,7 @@ namespace Catch { #elif defined(CATCH_PLATFORM_WINDOWS) - namespace Catch { +namespace Catch { void writeToDebugConsole( std::string const& text ) { ::OutputDebugStringA( text.c_str() ); } @@ -10378,12 +10385,12 @@ namespace Catch { #else - namespace Catch { - void writeToDebugConsole( std::string const& text ) { - // !TBD: Need a version for Mac/ XCode and other IDEs - Catch::cout() << text; - } +namespace Catch { + void writeToDebugConsole( std::string const& text ) { + // !TBD: Need a version for Mac/ XCode and other IDEs + Catch::cout() << text; } +} #endif // Platform // end catch_debug_console.cpp @@ -10391,16 +10398,16 @@ namespace Catch { #if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE) -# include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" -# include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/sys/types.h" -# include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/unistd.h" -# include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstddef" -# include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ostream" +# include +# include +# include +# include +# include #ifdef __apple_build_version__ // These headers will only compile with AppleClang (XCode) // For other compilers (Clang, GCC, ... ) we need to exclude them -# include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/sys/sysctl.h" +# include #endif namespace Catch { @@ -10449,37 +10456,37 @@ namespace Catch { } // namespace Catch #elif defined(CATCH_PLATFORM_LINUX) - #include - #include - - namespace Catch{ - // The standard POSIX way of detecting a debugger is to attempt to - // ptrace() the process, but this needs to be done from a child and not - // this process itself to still allow attaching to this process later - // if wanted, so is rather heavy. Under Linux we have the PID of the - // "debugger" (which doesn't need to be gdb, of course, it could also - // be strace, for example) in /proc/$PID/status, so just get it from - // there instead. - bool isDebuggerActive(){ - // Libstdc++ has a bug, where std::ifstream sets errno to 0 - // This way our users can properly assert over errno values - ErrnoGuard guard; - std::ifstream in("/proc/self/status"); - for( std::string line; std::getline(in, line); ) { - static const int PREFIX_LEN = 11; - if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { - // We're traced if the PID is not 0 and no other PID starts - // with 0 digit, so it's enough to check for just a single - // character. - return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; - } - } +#include +#include - return false; +namespace Catch{ + // The standard POSIX way of detecting a debugger is to attempt to + // ptrace() the process, but this needs to be done from a child and not + // this process itself to still allow attaching to this process later + // if wanted, so is rather heavy. Under Linux we have the PID of the + // "debugger" (which doesn't need to be gdb, of course, it could also + // be strace, for example) in /proc/$PID/status, so just get it from + // there instead. + bool isDebuggerActive(){ + // Libstdc++ has a bug, where std::ifstream sets errno to 0 + // This way our users can properly assert over errno values + ErrnoGuard guard; + std::ifstream in("/proc/self/status"); + for( std::string line; std::getline(in, line); ) { + static const int PREFIX_LEN = 11; + if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { + // We're traced if the PID is not 0 and no other PID starts + // with 0 digit, so it's enough to check for just a single + // character. + return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; + } } - } // namespace Catch + + return false; + } +} // namespace Catch #elif defined(_MSC_VER) - extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); +extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); namespace Catch { bool isDebuggerActive() { return IsDebuggerPresent() != 0; @@ -10506,8 +10513,8 @@ namespace Catch { void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ) { if( lhs.size() + rhs.size() < 40 && - lhs.find('\n') == std::string::npos && - rhs.find('\n') == std::string::npos ) + lhs.find('\n') == std::string::npos && + rhs.find('\n') == std::string::npos ) os << lhs << " " << op << " " << rhs; else os << lhs << "\n" << op << "\n" << rhs; @@ -10516,7 +10523,7 @@ namespace Catch { // end catch_decomposer.cpp // start catch_enforce.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/stdexcept" +#include namespace Catch { #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER) @@ -10548,8 +10555,8 @@ namespace Catch { // start catch_enum_values_registry.cpp // start catch_enum_values_registry.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include +#include namespace Catch { @@ -10572,8 +10579,8 @@ namespace Catch { // end catch_enum_values_registry.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/map" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" +#include +#include namespace Catch { @@ -10639,20 +10646,20 @@ namespace Catch { // end catch_enum_values_registry.cpp // start catch_errno_guard.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cerrno" +#include namespace Catch { - ErrnoGuard::ErrnoGuard():m_oldErrno(errno){} - ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; } + ErrnoGuard::ErrnoGuard():m_oldErrno(errno){} + ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; } } // end catch_errno_guard.cpp // start catch_exception_translator_registry.cpp // start catch_exception_translator_registry.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include +#include +#include namespace Catch { @@ -10747,7 +10754,7 @@ namespace Catch { // end catch_exception_translator_registry.cpp // start catch_fatal_condition.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" +#include #if !defined( CATCH_CONFIG_WINDOWS_SEH ) && !defined( CATCH_CONFIG_POSIX_SIGNALS ) @@ -10854,7 +10861,7 @@ namespace Catch { #if defined( CATCH_CONFIG_POSIX_SIGNALS ) -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/signal.h" +#include namespace Catch { @@ -10864,12 +10871,12 @@ namespace Catch { }; static SignalDefs signalDefs[] = { - { SIGINT, "SIGINT - Terminal interrupt signal" }, - { SIGILL, "SIGILL - Illegal instruction signal" }, - { SIGFPE, "SIGFPE - Floating point error signal" }, - { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, - { SIGTERM, "SIGTERM - Termination request signal" }, - { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } + { SIGINT, "SIGINT - Terminal interrupt signal" }, + { SIGILL, "SIGILL - Illegal instruction signal" }, + { SIGFPE, "SIGFPE - Floating point error signal" }, + { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, + { SIGTERM, "SIGTERM - Termination request signal" }, + { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } }; // Older GCCs trigger -Wmissing-field-initializers for T foo = {} @@ -10957,26 +10964,26 @@ namespace Catch { // end catch_fatal_condition.cpp // start catch_generators.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/limits" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/set" +#include +#include namespace Catch { -IGeneratorTracker::~IGeneratorTracker() {} + IGeneratorTracker::~IGeneratorTracker() {} -const char* GeneratorException::what() const noexcept { - return m_msg; -} + const char* GeneratorException::what() const noexcept { + return m_msg; + } -namespace Generators { + namespace Generators { - GeneratorUntypedBase::~GeneratorUntypedBase() {} + GeneratorUntypedBase::~GeneratorUntypedBase() {} - auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { - return getResultCapture().acquireGeneratorTracker( generatorName, lineInfo ); - } + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { + return getResultCapture().acquireGeneratorTracker( generatorName, lineInfo ); + } -} // namespace Generators + } // namespace Generators } // namespace Catch // end catch_generators.cpp // start catch_interfaces_capture.cpp @@ -11064,10 +11071,10 @@ namespace Catch { namespace Catch { ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig ) - : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} + : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream ) - : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} + : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} std::ostream& ReporterConfig::stream() const { return *m_stream; } IConfigPtr ReporterConfig::fullConfig() const { return m_fullConfig; } @@ -11077,17 +11084,17 @@ namespace Catch { GroupInfo::GroupInfo( std::string const& _name, std::size_t _groupIndex, std::size_t _groupsCount ) - : name( _name ), - groupIndex( _groupIndex ), - groupsCounts( _groupsCount ) + : name( _name ), + groupIndex( _groupIndex ), + groupsCounts( _groupsCount ) {} - AssertionStats::AssertionStats( AssertionResult const& _assertionResult, - std::vector const& _infoMessages, - Totals const& _totals ) - : assertionResult( _assertionResult ), - infoMessages( _infoMessages ), - totals( _totals ) + AssertionStats::AssertionStats( AssertionResult const& _assertionResult, + std::vector const& _infoMessages, + Totals const& _totals ) + : assertionResult( _assertionResult ), + infoMessages( _infoMessages ), + totals( _totals ) { assertionResult.m_resultData.lazyExpression.m_transientExpression = _assertionResult.m_resultData.lazyExpression.m_transientExpression; @@ -11102,16 +11109,16 @@ namespace Catch { } } - AssertionStats::~AssertionStats() = default; + AssertionStats::~AssertionStats() = default; SectionStats::SectionStats( SectionInfo const& _sectionInfo, Counts const& _assertions, double _durationInSeconds, bool _missingAssertions ) - : sectionInfo( _sectionInfo ), - assertions( _assertions ), - durationInSeconds( _durationInSeconds ), - missingAssertions( _missingAssertions ) + : sectionInfo( _sectionInfo ), + assertions( _assertions ), + durationInSeconds( _durationInSeconds ), + missingAssertions( _missingAssertions ) {} SectionStats::~SectionStats() = default; @@ -11121,11 +11128,11 @@ namespace Catch { std::string const& _stdOut, std::string const& _stdErr, bool _aborting ) - : testInfo( _testInfo ), - totals( _totals ), - stdOut( _stdOut ), - stdErr( _stdErr ), - aborting( _aborting ) + : testInfo( _testInfo ), + totals( _totals ), + stdOut( _stdOut ), + stdErr( _stdErr ), + aborting( _aborting ) {} TestCaseStats::~TestCaseStats() = default; @@ -11133,24 +11140,24 @@ namespace Catch { TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo, Totals const& _totals, bool _aborting ) - : groupInfo( _groupInfo ), - totals( _totals ), - aborting( _aborting ) + : groupInfo( _groupInfo ), + totals( _totals ), + aborting( _aborting ) {} TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo ) - : groupInfo( _groupInfo ), - aborting( false ) + : groupInfo( _groupInfo ), + aborting( false ) {} TestGroupStats::~TestGroupStats() = default; TestRunStats::TestRunStats( TestRunInfo const& _runInfo, - Totals const& _totals, - bool _aborting ) - : runInfo( _runInfo ), - totals( _totals ), - aborting( _aborting ) + Totals const& _totals, + bool _aborting ) + : runInfo( _runInfo ), + totals( _totals ), + aborting( _aborting ) {} TestRunStats::~TestRunStats() = default; @@ -11197,7 +11204,7 @@ namespace Catch { #else - Catch::LeakDetector::LeakDetector() {} +Catch::LeakDetector::LeakDetector() {} #endif @@ -11209,7 +11216,7 @@ Catch::LeakDetector::~LeakDetector() { // start catch_list.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/set" +#include namespace Catch { @@ -11241,9 +11248,9 @@ namespace Catch { } // end catch_text.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/limits" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iomanip" +#include +#include +#include namespace Catch { @@ -11258,8 +11265,8 @@ namespace Catch { auto matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( auto const& testCaseInfo : matchedTestCases ) { Colour::Code colour = testCaseInfo.isHidden() - ? Colour::SecondaryText - : Colour::None; + ? Colour::SecondaryText + : Colour::None; Colour colourGuard( colour ); Catch::cout() << Column( testCaseInfo.name ).initialIndent( 2 ).indent( 4 ) << "\n"; @@ -11288,9 +11295,9 @@ namespace Catch { for( auto const& testCaseInfo : matchedTestCases ) { matchedTests++; if( startsWith( testCaseInfo.name, '#' ) ) - Catch::cout() << '"' << testCaseInfo.name << '"'; + Catch::cout() << '"' << testCaseInfo.name << '"'; else - Catch::cout() << testCaseInfo.name; + Catch::cout() << testCaseInfo.name; if ( config.verbosity() >= Verbosity::High ) Catch::cout() << "\t@" << testCaseInfo.lineInfo; Catch::cout() << std::endl; @@ -11345,9 +11352,9 @@ namespace Catch { rss << " " << std::setw(2) << tagCount.second.count << " "; auto str = rss.str(); auto wrapper = Column( tagCount.second.all() ) - .initialIndent( 0 ) - .indent( str.size() ) - .width( CATCH_CONFIG_CONSOLE_WIDTH-10 ); + .initialIndent( 0 ) + .indent( str.size() ) + .width( CATCH_CONFIG_CONSOLE_WIDTH-10 ); Catch::cout() << str << wrapper << '\n'; } Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl; @@ -11364,12 +11371,12 @@ namespace Catch { for( auto const& factoryKvp : factories ) { Catch::cout() << Column( factoryKvp.first + ":" ) - .indent(2) - .width( 5+maxNameLen ) - + Column( factoryKvp.second->getDescription() ) - .initialIndent(0) - .indent(2) - .width( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) + .indent(2) + .width( 5+maxNameLen ) + + Column( factoryKvp.second->getDescription() ) + .initialIndent(0) + .indent(2) + .width( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) << "\n"; } Catch::cout() << std::endl; @@ -11395,46 +11402,46 @@ namespace Catch { // start catch_matchers.cpp namespace Catch { -namespace Matchers { - namespace Impl { + namespace Matchers { + namespace Impl { - std::string MatcherUntypedBase::toString() const { - if( m_cachedToString.empty() ) - m_cachedToString = describe(); - return m_cachedToString; - } + std::string MatcherUntypedBase::toString() const { + if( m_cachedToString.empty() ) + m_cachedToString = describe(); + return m_cachedToString; + } - MatcherUntypedBase::~MatcherUntypedBase() = default; + MatcherUntypedBase::~MatcherUntypedBase() = default; - } // namespace Impl -} // namespace Matchers + } // namespace Impl + } // namespace Matchers -using namespace Matchers; -using Matchers::Impl::MatcherBase; + using namespace Matchers; + using Matchers::Impl::MatcherBase; } // namespace Catch // end catch_matchers.cpp // start catch_matchers_exception.cpp namespace Catch { -namespace Matchers { -namespace Exception { + namespace Matchers { + namespace Exception { -bool ExceptionMessageMatcher::match(std::exception const& ex) const { - return ex.what() == m_message; -} + bool ExceptionMessageMatcher::match(std::exception const& ex) const { + return ex.what() == m_message; + } -std::string ExceptionMessageMatcher::describe() const { - return "exception message matches \"" + m_message + "\""; -} + std::string ExceptionMessageMatcher::describe() const { + return "exception message matches \"" + m_message + "\""; + } -} -Exception::ExceptionMessageMatcher Message(std::string const& message) { - return Exception::ExceptionMessageMatcher(message); -} + } + Exception::ExceptionMessageMatcher Message(std::string const& message) { + return Exception::ExceptionMessageMatcher(message); + } // namespace Exception -} // namespace Matchers + } // namespace Matchers } // namespace Catch // end catch_matchers_exception.cpp // start catch_matchers_floating.cpp @@ -11449,7 +11456,7 @@ namespace Catch { // end catch_polyfills.hpp // start catch_to_string.hpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include namespace Catch { template @@ -11465,57 +11472,57 @@ namespace Catch { } // end namespace Catch // end catch_to_string.hpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cmath" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdlib" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdint" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstring" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/type_traits" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iomanip" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/limits" +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace Catch { -namespace { - - int32_t convert(float f) { - static_assert(sizeof(float) == sizeof(int32_t), "Important ULP matcher assumption violated"); - int32_t i; - std::memcpy(&i, &f, sizeof(f)); - return i; - } + namespace { - int64_t convert(double d) { - static_assert(sizeof(double) == sizeof(int64_t), "Important ULP matcher assumption violated"); - int64_t i; - std::memcpy(&i, &d, sizeof(d)); - return i; - } + int32_t convert(float f) { + static_assert(sizeof(float) == sizeof(int32_t), "Important ULP matcher assumption violated"); + int32_t i; + std::memcpy(&i, &f, sizeof(f)); + return i; + } - template - bool almostEqualUlps(FP lhs, FP rhs, uint64_t maxUlpDiff) { - // Comparison with NaN should always be false. - // This way we can rule it out before getting into the ugly details - if (Catch::isnan(lhs) || Catch::isnan(rhs)) { - return false; + int64_t convert(double d) { + static_assert(sizeof(double) == sizeof(int64_t), "Important ULP matcher assumption violated"); + int64_t i; + std::memcpy(&i, &d, sizeof(d)); + return i; } - auto lc = convert(lhs); - auto rc = convert(rhs); + template + bool almostEqualUlps(FP lhs, FP rhs, uint64_t maxUlpDiff) { + // Comparison with NaN should always be false. + // This way we can rule it out before getting into the ugly details + if (Catch::isnan(lhs) || Catch::isnan(rhs)) { + return false; + } + + auto lc = convert(lhs); + auto rc = convert(rhs); - if ((lc < 0) != (rc < 0)) { - // Potentially we can have +0 and -0 - return lhs == rhs; - } + if ((lc < 0) != (rc < 0)) { + // Potentially we can have +0 and -0 + return lhs == rhs; + } - // static cast as a workaround for IBM XLC - auto ulpDiff = std::abs(static_cast(lc - rc)); - return static_cast(ulpDiff) <= maxUlpDiff; - } + // static cast as a workaround for IBM XLC + auto ulpDiff = std::abs(static_cast(lc - rc)); + return static_cast(ulpDiff) <= maxUlpDiff; + } #if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) - float nextafter(float x, float y) { + float nextafter(float x, float y) { return ::nextafterf(x, y); } @@ -11525,163 +11532,163 @@ namespace { #endif // ^^^ CATCH_CONFIG_GLOBAL_NEXTAFTER ^^^ -template -FP step(FP start, FP direction, uint64_t steps) { - for (uint64_t i = 0; i < steps; ++i) { + template + FP step(FP start, FP direction, uint64_t steps) { + for (uint64_t i = 0; i < steps; ++i) { #if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) - start = Catch::nextafter(start, direction); + start = Catch::nextafter(start, direction); #else - start = std::nextafter(start, direction); + start = std::nextafter(start, direction); #endif - } - return start; -} + } + return start; + } // Performs equivalent check of std::fabs(lhs - rhs) <= margin // But without the subtraction to allow for INFINITY in comparison -bool marginComparison(double lhs, double rhs, double margin) { - return (lhs + margin >= rhs) && (rhs + margin >= lhs); -} + bool marginComparison(double lhs, double rhs, double margin) { + return (lhs + margin >= rhs) && (rhs + margin >= lhs); + } -template -void write(std::ostream& out, FloatingPoint num) { - out << std::scientific - << std::setprecision(std::numeric_limits::max_digits10 - 1) - << num; -} + template + void write(std::ostream& out, FloatingPoint num) { + out << std::scientific + << std::setprecision(std::numeric_limits::max_digits10 - 1) + << num; + } -} // end anonymous namespace + } // end anonymous namespace -namespace Matchers { -namespace Floating { + namespace Matchers { + namespace Floating { - enum class FloatingPointKind : uint8_t { - Float, - Double - }; + enum class FloatingPointKind : uint8_t { + Float, + Double + }; - WithinAbsMatcher::WithinAbsMatcher(double target, double margin) - :m_target{ target }, m_margin{ margin } { - CATCH_ENFORCE(margin >= 0, "Invalid margin: " << margin << '.' - << " Margin has to be non-negative."); - } + WithinAbsMatcher::WithinAbsMatcher(double target, double margin) + :m_target{ target }, m_margin{ margin } { + CATCH_ENFORCE(margin >= 0, "Invalid margin: " << margin << '.' + << " Margin has to be non-negative."); + } - // Performs equivalent check of std::fabs(lhs - rhs) <= margin - // But without the subtraction to allow for INFINITY in comparison - bool WithinAbsMatcher::match(double const& matchee) const { - return (matchee + m_margin >= m_target) && (m_target + m_margin >= matchee); - } + // Performs equivalent check of std::fabs(lhs - rhs) <= margin + // But without the subtraction to allow for INFINITY in comparison + bool WithinAbsMatcher::match(double const& matchee) const { + return (matchee + m_margin >= m_target) && (m_target + m_margin >= matchee); + } - std::string WithinAbsMatcher::describe() const { - return "is within " + ::Catch::Detail::stringify(m_margin) + " of " + ::Catch::Detail::stringify(m_target); - } + std::string WithinAbsMatcher::describe() const { + return "is within " + ::Catch::Detail::stringify(m_margin) + " of " + ::Catch::Detail::stringify(m_target); + } - WithinUlpsMatcher::WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType) - :m_target{ target }, m_ulps{ ulps }, m_type{ baseType } { - CATCH_ENFORCE(m_type == FloatingPointKind::Double - || m_ulps < (std::numeric_limits::max)(), - "Provided ULP is impossibly large for a float comparison."); - } + WithinUlpsMatcher::WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType) + :m_target{ target }, m_ulps{ ulps }, m_type{ baseType } { + CATCH_ENFORCE(m_type == FloatingPointKind::Double + || m_ulps < (std::numeric_limits::max)(), + "Provided ULP is impossibly large for a float comparison."); + } #if defined(__clang__) -#pragma clang diagnostic push + #pragma clang diagnostic push // Clang <3.5 reports on the default branch in the switch below #pragma clang diagnostic ignored "-Wunreachable-code" #endif - bool WithinUlpsMatcher::match(double const& matchee) const { - switch (m_type) { - case FloatingPointKind::Float: - return almostEqualUlps(static_cast(matchee), static_cast(m_target), m_ulps); - case FloatingPointKind::Double: - return almostEqualUlps(matchee, m_target, m_ulps); - default: - CATCH_INTERNAL_ERROR( "Unknown FloatingPointKind value" ); - } - } + bool WithinUlpsMatcher::match(double const& matchee) const { + switch (m_type) { + case FloatingPointKind::Float: + return almostEqualUlps(static_cast(matchee), static_cast(m_target), m_ulps); + case FloatingPointKind::Double: + return almostEqualUlps(matchee, m_target, m_ulps); + default: + CATCH_INTERNAL_ERROR( "Unknown FloatingPointKind value" ); + } + } #if defined(__clang__) #pragma clang diagnostic pop #endif - std::string WithinUlpsMatcher::describe() const { - std::stringstream ret; + std::string WithinUlpsMatcher::describe() const { + std::stringstream ret; - ret << "is within " << m_ulps << " ULPs of "; + ret << "is within " << m_ulps << " ULPs of "; - if (m_type == FloatingPointKind::Float) { - write(ret, static_cast(m_target)); - ret << 'f'; - } else { - write(ret, m_target); - } + if (m_type == FloatingPointKind::Float) { + write(ret, static_cast(m_target)); + ret << 'f'; + } else { + write(ret, m_target); + } - ret << " (["; - if (m_type == FloatingPointKind::Double) { - write(ret, step(m_target, static_cast(-INFINITY), m_ulps)); - ret << ", "; - write(ret, step(m_target, static_cast( INFINITY), m_ulps)); - } else { - // We have to cast INFINITY to float because of MinGW, see #1782 - write(ret, step(static_cast(m_target), static_cast(-INFINITY), m_ulps)); - ret << ", "; - write(ret, step(static_cast(m_target), static_cast( INFINITY), m_ulps)); - } - ret << "])"; + ret << " (["; + if (m_type == FloatingPointKind::Double) { + write(ret, step(m_target, static_cast(-INFINITY), m_ulps)); + ret << ", "; + write(ret, step(m_target, static_cast( INFINITY), m_ulps)); + } else { + // We have to cast INFINITY to float because of MinGW, see #1782 + write(ret, step(static_cast(m_target), static_cast(-INFINITY), m_ulps)); + ret << ", "; + write(ret, step(static_cast(m_target), static_cast( INFINITY), m_ulps)); + } + ret << "])"; - return ret.str(); - } + return ret.str(); + } - WithinRelMatcher::WithinRelMatcher(double target, double epsilon): - m_target(target), - m_epsilon(epsilon){ - CATCH_ENFORCE(m_epsilon >= 0., "Relative comparison with epsilon < 0 does not make sense."); - CATCH_ENFORCE(m_epsilon < 1., "Relative comparison with epsilon >= 1 does not make sense."); - } + WithinRelMatcher::WithinRelMatcher(double target, double epsilon): + m_target(target), + m_epsilon(epsilon){ + CATCH_ENFORCE(m_epsilon >= 0., "Relative comparison with epsilon < 0 does not make sense."); + CATCH_ENFORCE(m_epsilon < 1., "Relative comparison with epsilon >= 1 does not make sense."); + } - bool WithinRelMatcher::match(double const& matchee) const { - const auto relMargin = m_epsilon * (std::max)(std::fabs(matchee), std::fabs(m_target)); - return marginComparison(matchee, m_target, - std::isinf(relMargin)? 0 : relMargin); - } + bool WithinRelMatcher::match(double const& matchee) const { + const auto relMargin = m_epsilon * (std::max)(std::fabs(matchee), std::fabs(m_target)); + return marginComparison(matchee, m_target, + std::isinf(relMargin)? 0 : relMargin); + } - std::string WithinRelMatcher::describe() const { - Catch::ReusableStringStream sstr; - sstr << "and " << m_target << " are within " << m_epsilon * 100. << "% of each other"; - return sstr.str(); - } + std::string WithinRelMatcher::describe() const { + Catch::ReusableStringStream sstr; + sstr << "and " << m_target << " are within " << m_epsilon * 100. << "% of each other"; + return sstr.str(); + } -}// namespace Floating + }// namespace Floating -Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff) { - return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Double); -} + Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff) { + return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Double); + } -Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff) { - return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Float); -} + Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff) { + return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Float); + } -Floating::WithinAbsMatcher WithinAbs(double target, double margin) { - return Floating::WithinAbsMatcher(target, margin); -} + Floating::WithinAbsMatcher WithinAbs(double target, double margin) { + return Floating::WithinAbsMatcher(target, margin); + } -Floating::WithinRelMatcher WithinRel(double target, double eps) { - return Floating::WithinRelMatcher(target, eps); -} + Floating::WithinRelMatcher WithinRel(double target, double eps) { + return Floating::WithinRelMatcher(target, eps); + } -Floating::WithinRelMatcher WithinRel(double target) { - return Floating::WithinRelMatcher(target, std::numeric_limits::epsilon() * 100); -} + Floating::WithinRelMatcher WithinRel(double target) { + return Floating::WithinRelMatcher(target, std::numeric_limits::epsilon() * 100); + } -Floating::WithinRelMatcher WithinRel(float target, float eps) { - return Floating::WithinRelMatcher(target, eps); -} + Floating::WithinRelMatcher WithinRel(float target, float eps) { + return Floating::WithinRelMatcher(target, eps); + } -Floating::WithinRelMatcher WithinRel(float target) { - return Floating::WithinRelMatcher(target, std::numeric_limits::epsilon() * 100); -} + Floating::WithinRelMatcher WithinRel(float target) { + return Floating::WithinRelMatcher(target, std::numeric_limits::epsilon() * 100); + } -} // namespace Matchers + } // namespace Matchers } // namespace Catch // end catch_matchers_floating.cpp // start catch_matchers_generic.cpp @@ -11696,104 +11703,104 @@ std::string Catch::Matchers::Generic::Detail::finalizeDescription(const std::str // end catch_matchers_generic.cpp // start catch_matchers_string.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/regex" +#include namespace Catch { -namespace Matchers { + namespace Matchers { - namespace StdString { + namespace StdString { - CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) - : m_caseSensitivity( caseSensitivity ), - m_str( adjustString( str ) ) - {} - std::string CasedString::adjustString( std::string const& str ) const { - return m_caseSensitivity == CaseSensitive::No - ? toLower( str ) - : str; - } - std::string CasedString::caseSensitivitySuffix() const { - return m_caseSensitivity == CaseSensitive::No - ? " (case insensitive)" - : std::string(); - } + CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_str( adjustString( str ) ) + {} + std::string CasedString::adjustString( std::string const& str ) const { + return m_caseSensitivity == CaseSensitive::No + ? toLower( str ) + : str; + } + std::string CasedString::caseSensitivitySuffix() const { + return m_caseSensitivity == CaseSensitive::No + ? " (case insensitive)" + : std::string(); + } - StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) - : m_comparator( comparator ), - m_operation( operation ) { - } + StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) + : m_comparator( comparator ), + m_operation( operation ) { + } - std::string StringMatcherBase::describe() const { - std::string description; - description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + - m_comparator.caseSensitivitySuffix().size()); - description += m_operation; - description += ": \""; - description += m_comparator.m_str; - description += "\""; - description += m_comparator.caseSensitivitySuffix(); - return description; - } + std::string StringMatcherBase::describe() const { + std::string description; + description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + + m_comparator.caseSensitivitySuffix().size()); + description += m_operation; + description += ": \""; + description += m_comparator.m_str; + description += "\""; + description += m_comparator.caseSensitivitySuffix(); + return description; + } - EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} + EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} - bool EqualsMatcher::match( std::string const& source ) const { - return m_comparator.adjustString( source ) == m_comparator.m_str; - } + bool EqualsMatcher::match( std::string const& source ) const { + return m_comparator.adjustString( source ) == m_comparator.m_str; + } - ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} + ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} - bool ContainsMatcher::match( std::string const& source ) const { - return contains( m_comparator.adjustString( source ), m_comparator.m_str ); - } + bool ContainsMatcher::match( std::string const& source ) const { + return contains( m_comparator.adjustString( source ), m_comparator.m_str ); + } - StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} + StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} - bool StartsWithMatcher::match( std::string const& source ) const { - return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); - } + bool StartsWithMatcher::match( std::string const& source ) const { + return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } - EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} + EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} - bool EndsWithMatcher::match( std::string const& source ) const { - return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); - } + bool EndsWithMatcher::match( std::string const& source ) const { + return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } - RegexMatcher::RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity): m_regex(std::move(regex)), m_caseSensitivity(caseSensitivity) {} + RegexMatcher::RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity): m_regex(std::move(regex)), m_caseSensitivity(caseSensitivity) {} - bool RegexMatcher::match(std::string const& matchee) const { - auto flags = std::regex::ECMAScript; // ECMAScript is the default syntax option anyway - if (m_caseSensitivity == CaseSensitive::Choice::No) { - flags |= std::regex::icase; + bool RegexMatcher::match(std::string const& matchee) const { + auto flags = std::regex::ECMAScript; // ECMAScript is the default syntax option anyway + if (m_caseSensitivity == CaseSensitive::Choice::No) { + flags |= std::regex::icase; + } + auto reg = std::regex(m_regex, flags); + return std::regex_match(matchee, reg); } - auto reg = std::regex(m_regex, flags); - return std::regex_match(matchee, reg); - } - std::string RegexMatcher::describe() const { - return "matches " + ::Catch::Detail::stringify(m_regex) + ((m_caseSensitivity == CaseSensitive::Choice::Yes)? " case sensitively" : " case insensitively"); - } + std::string RegexMatcher::describe() const { + return "matches " + ::Catch::Detail::stringify(m_regex) + ((m_caseSensitivity == CaseSensitive::Choice::Yes)? " case sensitively" : " case insensitively"); + } - } // namespace StdString + } // namespace StdString - StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); - } - StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); - } - StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); - } - StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { - return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); - } + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } - StdString::RegexMatcher Matches(std::string const& regex, CaseSensitive::Choice caseSensitivity) { - return StdString::RegexMatcher(regex, caseSensitivity); - } + StdString::RegexMatcher Matches(std::string const& regex, CaseSensitive::Choice caseSensitivity) { + return StdString::RegexMatcher(regex, caseSensitivity); + } -} // namespace Matchers + } // namespace Matchers } // namespace Catch // end catch_matchers_string.cpp // start catch_message.cpp @@ -11805,18 +11812,18 @@ namespace Catch { } // end namespace Catch // end catch_uncaught_exceptions.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/stack" +#include +#include namespace Catch { MessageInfo::MessageInfo( StringRef const& _macroName, SourceLineInfo const& _lineInfo, ResultWas::OfType _type ) - : macroName( _macroName ), - lineInfo( _lineInfo ), - type( _type ), - sequence( ++globalCount ) + : macroName( _macroName ), + lineInfo( _lineInfo ), + type( _type ), + sequence( ++globalCount ) {} bool MessageInfo::operator==( MessageInfo const& other ) const { @@ -11835,19 +11842,19 @@ namespace Catch { Catch::MessageBuilder::MessageBuilder( StringRef const& macroName, SourceLineInfo const& lineInfo, ResultWas::OfType type ) - :m_info(macroName, lineInfo, type) {} + :m_info(macroName, lineInfo, type) {} //////////////////////////////////////////////////////////////////////////// ScopedMessage::ScopedMessage( MessageBuilder const& builder ) - : m_info( builder.m_info ), m_moved() + : m_info( builder.m_info ), m_moved() { m_info.message = builder.m_stream.str(); getResultCapture().pushScopedMessage( m_info ); } ScopedMessage::ScopedMessage( ScopedMessage&& old ) - : m_info( old.m_info ), m_moved() + : m_info( old.m_info ), m_moved() { old.m_moved = true; } @@ -11883,31 +11890,31 @@ namespace Catch { for (size_t pos = 0; pos < names.size(); ++pos) { char c = names[pos]; switch (c) { - case '[': - case '{': - case '(': - // It is basically impossible to disambiguate between - // comparison and start of template args in this context + case '[': + case '{': + case '(': + // It is basically impossible to disambiguate between + // comparison and start of template args in this context // case '<': - openings.push(c); - break; - case ']': - case '}': - case ')': + openings.push(c); + break; + case ']': + case '}': + case ')': // case '>': - openings.pop(); - break; - case '"': - case '\'': - pos = skipq(pos, c); - break; - case ',': - if (start != pos && openings.empty()) { - m_messages.emplace_back(macroName, lineInfo, resultType); - m_messages.back().message = static_cast(trimmed(start, pos)); - m_messages.back().message += " := "; - start = pos; - } + openings.pop(); + break; + case '"': + case '\'': + pos = skipq(pos, c); + break; + case ',': + if (start != pos && openings.empty()) { + m_messages.emplace_back(macroName, lineInfo, resultType); + m_messages.back().message = static_cast(trimmed(start, pos)); + m_messages.back().message += " := "; + start = pos; + } } } assert(openings.empty() && "Mismatched openings"); @@ -11938,9 +11945,9 @@ namespace Catch { #ifndef TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H #define TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdio" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iosfwd" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include +#include +#include namespace Catch { @@ -12041,14 +12048,14 @@ namespace Catch { #endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H // end catch_output_redirect.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdio" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstring" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/fstream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/stdexcept" +#include +#include +#include +#include +#include #if defined(CATCH_CONFIG_NEW_CAPTURE) - #if defined(_MSC_VER) +#if defined(_MSC_VER) #include //_dup and _dup2 #define dup _dup #define dup2 _dup2 @@ -12061,9 +12068,9 @@ namespace Catch { namespace Catch { RedirectedStream::RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream ) - : m_originalStream( originalStream ), - m_redirectionStream( redirectionStream ), - m_prevBuf( m_originalStream.rdbuf() ) + : m_originalStream( originalStream ), + m_redirectionStream( redirectionStream ), + m_prevBuf( m_originalStream.rdbuf() ) { m_originalStream.rdbuf( m_redirectionStream.rdbuf() ); } @@ -12076,14 +12083,14 @@ namespace Catch { auto RedirectedStdOut::str() const -> std::string { return m_rss.str(); } RedirectedStdErr::RedirectedStdErr() - : m_cerr( Catch::cerr(), m_rss.get() ), - m_clog( Catch::clog(), m_rss.get() ) + : m_cerr( Catch::cerr(), m_rss.get() ), + m_clog( Catch::clog(), m_rss.get() ) {} auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); } RedirectedStreams::RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr) - : m_redirectedCout(redirectedCout), - m_redirectedCerr(redirectedCerr) + : m_redirectedCout(redirectedCout), + m_redirectedCerr(redirectedCerr) {} RedirectedStreams::~RedirectedStreams() { @@ -12093,7 +12100,7 @@ namespace Catch { #if defined(CATCH_CONFIG_NEW_CAPTURE) -#if defined(_MSC_VER) + #if defined(_MSC_VER) TempFile::TempFile() { if (tmpnam_s(m_buffer)) { CATCH_RUNTIME_ERROR("Could not get a temp filename"); @@ -12170,7 +12177,7 @@ namespace Catch { } // namespace Catch #if defined(CATCH_CONFIG_NEW_CAPTURE) - #if defined(_MSC_VER) +#if defined(_MSC_VER) #undef dup #undef dup2 #undef fileno @@ -12179,7 +12186,7 @@ namespace Catch { // end catch_output_redirect.cpp // start catch_polyfills.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cmath" +#include namespace Catch { @@ -12206,10 +12213,10 @@ namespace Catch { namespace Catch { -namespace { + namespace { #if defined(_MSC_VER) -#pragma warning(push) + #pragma warning(push) #pragma warning(disable:4146) // we negate uint32 during the rotate #endif // Safe rotr implementation thanks to John Regehr @@ -12223,7 +12230,7 @@ namespace { #pragma warning(pop) #endif -} + } SimplePcg32::SimplePcg32(result_type seed_) { seed(seed_); @@ -12268,10 +12275,10 @@ namespace { // start catch_test_case_registry_impl.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/set" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ios" +#include +#include +#include +#include namespace Catch { @@ -12324,7 +12331,7 @@ namespace Catch { // end catch_test_case_registry_impl.h // start catch_reporter_registry.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/map" +#include namespace Catch { @@ -12353,7 +12360,7 @@ namespace Catch { // start catch_tag_alias.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" +#include namespace Catch { @@ -12367,7 +12374,7 @@ namespace Catch { } // end namespace Catch // end catch_tag_alias.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/map" +#include namespace Catch { @@ -12387,8 +12394,8 @@ namespace Catch { // end catch_tag_alias_registry.h // start catch_startup_exception_registry.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/exception" +#include +#include namespace Catch { @@ -12571,9 +12578,9 @@ namespace Catch { // end catch_result_type.cpp // start catch_run_context.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" +#include +#include +#include namespace Catch { @@ -12582,7 +12589,7 @@ namespace Catch { GeneratorBasePtr m_generator; GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) - : TrackerBase( nameAndLocation, ctx, parent ) + : TrackerBase( nameAndLocation, ctx, parent ) {} ~GeneratorTracker(); @@ -12643,11 +12650,11 @@ namespace Catch { } // If at least one child started executing, don't wait if ( std::find_if( - m_children.begin(), - m_children.end(), - []( TestCaseTracking::ITrackerPtr tracker ) { - return tracker->hasStarted(); - } ) != m_children.end() ) { + m_children.begin(), + m_children.end(), + []( TestCaseTracking::ITrackerPtr tracker ) { + return tracker->hasStarted(); + } ) != m_children.end() ) { return false; } @@ -12661,10 +12668,10 @@ namespace Catch { parent = &( parent->parent() ); } assert( parent && - "Missing root (test case) level section" ); + "Missing root (test case) level section" ); auto const& parentSection = - static_cast( *parent ); + static_cast( *parent ); auto const& filters = parentSection.getFilters(); // No filters -> no restrictions on running sections if ( filters.empty() ) { @@ -12676,8 +12683,8 @@ namespace Catch { std::find( filters.begin(), filters.end(), static_cast( *child ) - .trimmedName() ) != - filters.end() ) { + .trimmedName() ) != + filters.end() ) { return true; } } @@ -12708,12 +12715,12 @@ namespace Catch { } RunContext::RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter) - : m_runInfo(_config->name()), - m_context(getCurrentMutableContext()), - m_config(_config), - m_reporter(std::move(reporter)), - m_lastAssertionInfo{ StringRef(), SourceLineInfo("",0), StringRef(), ResultDisposition::Normal }, - m_includeSuccessfulResults( m_config->includeSuccessfulResults() || m_reporter->getPreferences().shouldReportAllAssertions ) + : m_runInfo(_config->name()), + m_context(getCurrentMutableContext()), + m_config(_config), + m_reporter(std::move(reporter)), + m_lastAssertionInfo{ StringRef(), SourceLineInfo("",0), StringRef(), ResultDisposition::Normal }, + m_includeSuccessfulResults( m_config->includeSuccessfulResults() || m_reporter->getPreferences().shouldReportAllAssertions ) { m_context.setRunner(this); m_context.setConfig(m_config); @@ -12762,10 +12769,10 @@ namespace Catch { } m_totals.testCases += deltaTotals.testCases; m_reporter->testCaseEnded(TestCaseStats(testInfo, - deltaTotals, - redirectedCout, - redirectedCerr, - aborting())); + deltaTotals, + redirectedCout, + redirectedCerr, + aborting())); m_activeTestCase = nullptr; m_testCaseTracker = nullptr; @@ -12899,8 +12906,8 @@ namespace Catch { std::string RunContext::getCurrentTestName() const { return m_activeTestCase - ? m_activeTestCase->getTestCaseInfo().name - : std::string(); + ? m_activeTestCase->getTestCaseInfo().name + : std::string(); } const AssertionResult * RunContext::getLastResult() const { @@ -12940,17 +12947,17 @@ namespace Catch { deltaTotals.testCases.failed = 1; deltaTotals.assertions.failed = 1; m_reporter->testCaseEnded(TestCaseStats(testInfo, - deltaTotals, - std::string(), - std::string(), - false)); + deltaTotals, + std::string(), + std::string(), + false)); m_totals.testCases.failed++; testGroupEnded(std::string(), m_totals, 1, 1); m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false)); } bool RunContext::lastAssertionPassed() { - return m_lastAssertionPassed; + return m_lastAssertionPassed; } void RunContext::assertionPassed() { @@ -13024,7 +13031,7 @@ namespace Catch { // If sections ended prematurely due to an exception we stored their // infos here so we can tear them down outside the unwind process. for (auto it = m_unfinishedSections.rbegin(), - itEnd = m_unfinishedSections.rend(); + itEnd = m_unfinishedSections.rend(); it != itEnd; ++it) sectionEnded(*it); @@ -13032,9 +13039,9 @@ namespace Catch { } void RunContext::handleExpr( - AssertionInfo const& info, - ITransientExpression const& expr, - AssertionReaction& reaction + AssertionInfo const& info, + ITransientExpression const& expr, + AssertionReaction& reaction ) { m_reporter->assertionStarting( info ); @@ -13162,8 +13169,8 @@ namespace Catch { namespace Catch { Section::Section( SectionInfo const& info ) - : m_info( info ), - m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) + : m_info( info ), + m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) { m_timer.start(); } @@ -13190,10 +13197,10 @@ namespace Catch { namespace Catch { SectionInfo::SectionInfo - ( SourceLineInfo const& _lineInfo, - std::string const& _name ) - : name( _name ), - lineInfo( _lineInfo ) + ( SourceLineInfo const& _lineInfo, + std::string const& _name ) + : name( _name ), + lineInfo( _lineInfo ) {} } // end namespace Catch @@ -13202,7 +13209,7 @@ namespace Catch { // start catch_session.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include namespace Catch { @@ -13216,9 +13223,9 @@ namespace Catch { void libIdentify(); int applyCommandLine( int argc, char const * const * argv ); - #if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE) +#if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE) int applyCommandLine( int argc, wchar_t const * const * argv ); - #endif +#endif void useConfigData( ConfigData const& configData ); @@ -13252,7 +13259,7 @@ namespace Catch { // end catch_session.h // start catch_version.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iosfwd" +#include namespace Catch { @@ -13281,10 +13288,10 @@ namespace Catch { } // end catch_version.h -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdlib" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iomanip" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/set" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iterator" +#include +#include +#include +#include namespace Catch { @@ -13321,8 +13328,8 @@ namespace Catch { class TestGroup { public: explicit TestGroup(std::shared_ptr const& config) - : m_config{config} - , m_context{config, makeReporter(config)} + : m_config{config} + , m_context{config, makeReporter(config)} { auto const& allTestCases = getAllTestCasesSorted(*m_config); m_matches = m_config->testSpec().matchesByFilter(allTestCases, *m_config); @@ -13358,7 +13365,7 @@ namespace Catch { if (!invalidArgs.empty()) { for (auto const& invalidArg: invalidArgs) - m_context.reporter().reportInvalidArguments(invalidArg); + m_context.reporter().reportInvalidArguments(invalidArg); } m_context.testGroupEnded(m_config->name(), totals, 1, 1); @@ -13385,6 +13392,10 @@ namespace Catch { filename.erase(0, lastSlash); filename[0] = '#'; } + else + { + filename.insert(0, "#"); + } auto lastDot = filename.find_last_of('.'); if (lastDot != std::string::npos) { @@ -13456,10 +13467,10 @@ namespace Catch { config(); getCurrentMutableContext().setConfig(m_config); Catch::cerr() - << Colour( Colour::Red ) - << "\nError(s) in input:\n" - << Column( result.errorMessage() ).indent( 2 ) - << "\n\n"; + << Colour( Colour::Red ) + << "\nError(s) in input:\n" + << Column( result.errorMessage() ).indent( 2 ) + << "\n\n"; Catch::cerr() << "Run with -? for usage\n" << std::endl; return MaxExitCode; } @@ -13572,7 +13583,7 @@ namespace Catch { // end catch_session.cpp // start catch_singletons.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" +#include namespace Catch { @@ -13604,7 +13615,7 @@ namespace Catch { #if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) namespace Catch { -void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept { + void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept { CATCH_TRY { m_exceptions.push_back(exception); } CATCH_CATCH_ALL { @@ -13622,111 +13633,111 @@ void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexce // end catch_startup_exception_registry.cpp // start catch_stream.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdio" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iostream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/fstream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include +#include +#include +#include +#include +#include namespace Catch { Catch::IStream::~IStream() = default; namespace Detail { namespace { - template - class StreamBufImpl : public std::streambuf { - char data[bufferSize]; - WriterF m_writer; - - public: - StreamBufImpl() { - setp( data, data + sizeof(data) ); - } + template + class StreamBufImpl : public std::streambuf { + char data[bufferSize]; + WriterF m_writer; - ~StreamBufImpl() noexcept { - StreamBufImpl::sync(); - } + public: + StreamBufImpl() { + setp( data, data + sizeof(data) ); + } - private: - int overflow( int c ) override { - sync(); + ~StreamBufImpl() noexcept { + StreamBufImpl::sync(); + } - if( c != EOF ) { - if( pbase() == epptr() ) - m_writer( std::string( 1, static_cast( c ) ) ); - else - sputc( static_cast( c ) ); + private: + int overflow( int c ) override { + sync(); + + if( c != EOF ) { + if( pbase() == epptr() ) + m_writer( std::string( 1, static_cast( c ) ) ); + else + sputc( static_cast( c ) ); + } + return 0; } - return 0; - } - int sync() override { - if( pbase() != pptr() ) { - m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); - setp( pbase(), epptr() ); + int sync() override { + if( pbase() != pptr() ) { + m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); + setp( pbase(), epptr() ); + } + return 0; } - return 0; - } - }; + }; - /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// - struct OutputDebugWriter { + struct OutputDebugWriter { - void operator()( std::string const&str ) { - writeToDebugConsole( str ); - } - }; + void operator()( std::string const&str ) { + writeToDebugConsole( str ); + } + }; - /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// - class FileStream : public IStream { - mutable std::ofstream m_ofs; - public: - FileStream( StringRef filename ) { - m_ofs.open( filename.c_str() ); - CATCH_ENFORCE( !m_ofs.fail(), "Unable to open file: '" << filename << "'" ); - } - ~FileStream() override = default; - public: // IStream - std::ostream& stream() const override { - return m_ofs; - } - }; + class FileStream : public IStream { + mutable std::ofstream m_ofs; + public: + FileStream( StringRef filename ) { + m_ofs.open( filename.c_str() ); + CATCH_ENFORCE( !m_ofs.fail(), "Unable to open file: '" << filename << "'" ); + } + ~FileStream() override = default; + public: // IStream + std::ostream& stream() const override { + return m_ofs; + } + }; - /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// - class CoutStream : public IStream { - mutable std::ostream m_os; - public: - // Store the streambuf from cout up-front because - // cout may get redirected when running tests - CoutStream() : m_os( Catch::cout().rdbuf() ) {} - ~CoutStream() override = default; + class CoutStream : public IStream { + mutable std::ostream m_os; + public: + // Store the streambuf from cout up-front because + // cout may get redirected when running tests + CoutStream() : m_os( Catch::cout().rdbuf() ) {} + ~CoutStream() override = default; - public: // IStream - std::ostream& stream() const override { return m_os; } - }; + public: // IStream + std::ostream& stream() const override { return m_os; } + }; - /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// - class DebugOutStream : public IStream { - std::unique_ptr> m_streamBuf; - mutable std::ostream m_os; - public: - DebugOutStream() - : m_streamBuf( new StreamBufImpl() ), - m_os( m_streamBuf.get() ) - {} + class DebugOutStream : public IStream { + std::unique_ptr> m_streamBuf; + mutable std::ostream m_os; + public: + DebugOutStream() + : m_streamBuf( new StreamBufImpl() ), + m_os( m_streamBuf.get() ) + {} - ~DebugOutStream() override = default; + ~DebugOutStream() override = default; - public: // IStream - std::ostream& stream() const override { return m_os; } - }; + public: // IStream + std::ostream& stream() const override { return m_os; } + }; - }} // namespace anon::detail + }} // namespace anon::detail /////////////////////////////////////////////////////////////////////////// @@ -13768,8 +13779,8 @@ namespace Catch { }; ReusableStringStream::ReusableStringStream() - : m_index( Singleton::getMutable().add() ), - m_oss( Singleton::getMutable().m_streams[m_index].get() ) + : m_index( Singleton::getMutable().add() ), + m_oss( Singleton::getMutable().m_streams[m_index].get() ) {} ReusableStringStream::~ReusableStringStream() { @@ -13793,11 +13804,11 @@ namespace Catch { // end catch_stream.cpp // start catch_string_manip.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ostream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstring" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cctype" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" +#include +#include +#include +#include +#include namespace Catch { @@ -13880,8 +13891,8 @@ namespace Catch { } pluralise::pluralise( std::size_t count, std::string const& label ) - : m_count( count ), - m_label( label ) + : m_count( count ), + m_label( label ) {} std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { @@ -13895,14 +13906,14 @@ namespace Catch { // end catch_string_manip.cpp // start catch_stringref.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ostream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstring" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdint" +#include +#include +#include +#include namespace Catch { StringRef::StringRef( char const* rawChars ) noexcept - : StringRef( rawChars, static_cast(std::strlen(rawChars) ) ) + : StringRef( rawChars, static_cast(std::strlen(rawChars) ) ) {} auto StringRef::c_str() const -> char const* { @@ -13922,7 +13933,7 @@ namespace Catch { } auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool { return m_size == other.m_size - && (std::memcmp( m_start, other.m_start, m_size ) == 0); + && (std::memcmp( m_start, other.m_start, m_size ) == 0); } auto operator << ( std::ostream& os, StringRef const& str ) -> std::ostream& { @@ -13959,7 +13970,7 @@ namespace Catch { // end catch_tag_alias_autoregistrar.cpp // start catch_tag_alias_registry.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" +#include namespace Catch { @@ -13988,12 +13999,12 @@ namespace Catch { void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) { CATCH_ENFORCE( startsWith(alias, "[@") && endsWith(alias, ']'), - "error: tag alias, '" << alias << "' is not of the form [@alias name].\n" << lineInfo ); + "error: tag alias, '" << alias << "' is not of the form [@alias name].\n" << lineInfo ); CATCH_ENFORCE( m_registry.insert(std::make_pair(alias, TagAlias(tag, lineInfo))).second, - "error: tag alias, '" << alias << "' already registered.\n" - << "\tFirst seen at: " << find(alias)->lineInfo << "\n" - << "\tRedefined at: " << lineInfo ); + "error: tag alias, '" << alias << "' already registered.\n" + << "\tFirst seen at: " << find(alias)->lineInfo << "\n" + << "\tRedefined at: " << lineInfo ); } ITagAliasRegistry::~ITagAliasRegistry() {} @@ -14006,10 +14017,10 @@ namespace Catch { // end catch_tag_alias_registry.cpp // start catch_test_case_info.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cctype" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/exception" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" +#include +#include +#include +#include namespace Catch { @@ -14036,9 +14047,9 @@ namespace Catch { } void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { CATCH_ENFORCE( !isReservedTag(tag), - "Tag name: [" << tag << "] is not allowed.\n" - << "Tag names starting with non alphanumeric characters are reserved\n" - << _lineInfo ); + "Tag name: [" << tag << "] is not allowed.\n" + << "Tag names starting with non alphanumeric characters are reserved\n" + << _lineInfo ); } } @@ -14109,11 +14120,11 @@ namespace Catch { std::string const& _description, std::vector const& _tags, SourceLineInfo const& _lineInfo ) - : name( _name ), - className( _className ), - description( _description ), - lineInfo( _lineInfo ), - properties( None ) + : name( _name ), + className( _className ), + description( _description ), + lineInfo( _lineInfo ), + properties( None ) { setTags( *this, _tags ); } @@ -14179,8 +14190,8 @@ namespace Catch { // end catch_test_case_info.cpp // start catch_test_case_registry_impl.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" +#include +#include namespace Catch { @@ -14189,7 +14200,7 @@ namespace Catch { using hash_t = uint64_t; explicit TestHasher( hash_t hashSuffix ): - m_hashSuffix{ hashSuffix } {} + m_hashSuffix{ hashSuffix } {} uint32_t operator()( TestCase const& t ) const { // FNV-1a hash with multiplication fold. @@ -14237,11 +14248,11 @@ namespace Catch { std::sort(indexed_tests.begin(), indexed_tests.end(), [](hashedTest const& lhs, hashedTest const& rhs) { - if (lhs.first == rhs.first) { - return lhs.second->name < rhs.second->name; - } - return lhs.first < rhs.first; - }); + if (lhs.first == rhs.first) { + return lhs.second->name < rhs.second->name; + } + return lhs.first < rhs.first; + }); std::vector sorted; sorted.reserve( indexed_tests.size() ); @@ -14269,9 +14280,9 @@ namespace Catch { for( auto const& function : functions ) { auto prev = seenFunctions.insert( function ); CATCH_ENFORCE( prev.second, - "error: TEST_CASE( \"" << function.name << "\" ) already defined.\n" - << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" - << "\tRedefined at " << function.getTestCaseInfo().lineInfo ); + "error: TEST_CASE( \"" << function.name << "\" ) already defined.\n" + << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" + << "\tRedefined at " << function.getTestCaseInfo().lineInfo ); } } @@ -14338,11 +14349,11 @@ namespace Catch { // end catch_test_case_registry_impl.cpp // start catch_test_case_tracker.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/stdexcept" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" +#include +#include +#include +#include +#include #if defined(__clang__) # pragma clang diagnostic push @@ -14350,226 +14361,226 @@ namespace Catch { #endif namespace Catch { -namespace TestCaseTracking { + namespace TestCaseTracking { - NameAndLocation::NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) - : name( _name ), - location( _location ) - {} + NameAndLocation::NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) + : name( _name ), + location( _location ) + {} - ITracker::~ITracker() = default; + ITracker::~ITracker() = default; - ITracker& TrackerContext::startRun() { - m_rootTracker = std::make_shared( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, nullptr ); - m_currentTracker = nullptr; - m_runState = Executing; - return *m_rootTracker; - } + ITracker& TrackerContext::startRun() { + m_rootTracker = std::make_shared( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, nullptr ); + m_currentTracker = nullptr; + m_runState = Executing; + return *m_rootTracker; + } - void TrackerContext::endRun() { - m_rootTracker.reset(); - m_currentTracker = nullptr; - m_runState = NotStarted; - } + void TrackerContext::endRun() { + m_rootTracker.reset(); + m_currentTracker = nullptr; + m_runState = NotStarted; + } - void TrackerContext::startCycle() { - m_currentTracker = m_rootTracker.get(); - m_runState = Executing; - } - void TrackerContext::completeCycle() { - m_runState = CompletedCycle; - } + void TrackerContext::startCycle() { + m_currentTracker = m_rootTracker.get(); + m_runState = Executing; + } + void TrackerContext::completeCycle() { + m_runState = CompletedCycle; + } - bool TrackerContext::completedCycle() const { - return m_runState == CompletedCycle; - } - ITracker& TrackerContext::currentTracker() { - return *m_currentTracker; - } - void TrackerContext::setCurrentTracker( ITracker* tracker ) { - m_currentTracker = tracker; - } + bool TrackerContext::completedCycle() const { + return m_runState == CompletedCycle; + } + ITracker& TrackerContext::currentTracker() { + return *m_currentTracker; + } + void TrackerContext::setCurrentTracker( ITracker* tracker ) { + m_currentTracker = tracker; + } - TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ): - ITracker(nameAndLocation), - m_ctx( ctx ), - m_parent( parent ) - {} + TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ): + ITracker(nameAndLocation), + m_ctx( ctx ), + m_parent( parent ) + {} - bool TrackerBase::isComplete() const { - return m_runState == CompletedSuccessfully || m_runState == Failed; - } - bool TrackerBase::isSuccessfullyCompleted() const { - return m_runState == CompletedSuccessfully; - } - bool TrackerBase::isOpen() const { - return m_runState != NotStarted && !isComplete(); - } - bool TrackerBase::hasChildren() const { - return !m_children.empty(); - } + bool TrackerBase::isComplete() const { + return m_runState == CompletedSuccessfully || m_runState == Failed; + } + bool TrackerBase::isSuccessfullyCompleted() const { + return m_runState == CompletedSuccessfully; + } + bool TrackerBase::isOpen() const { + return m_runState != NotStarted && !isComplete(); + } + bool TrackerBase::hasChildren() const { + return !m_children.empty(); + } + + void TrackerBase::addChild( ITrackerPtr const& child ) { + m_children.push_back( child ); + } - void TrackerBase::addChild( ITrackerPtr const& child ) { - m_children.push_back( child ); - } + ITrackerPtr TrackerBase::findChild( NameAndLocation const& nameAndLocation ) { + auto it = std::find_if( m_children.begin(), m_children.end(), + [&nameAndLocation]( ITrackerPtr const& tracker ){ + return + tracker->nameAndLocation().location == nameAndLocation.location && + tracker->nameAndLocation().name == nameAndLocation.name; + } ); + return( it != m_children.end() ) + ? *it + : nullptr; + } + ITracker& TrackerBase::parent() { + assert( m_parent ); // Should always be non-null except for root + return *m_parent; + } - ITrackerPtr TrackerBase::findChild( NameAndLocation const& nameAndLocation ) { - auto it = std::find_if( m_children.begin(), m_children.end(), - [&nameAndLocation]( ITrackerPtr const& tracker ){ - return - tracker->nameAndLocation().location == nameAndLocation.location && - tracker->nameAndLocation().name == nameAndLocation.name; - } ); - return( it != m_children.end() ) - ? *it - : nullptr; - } - ITracker& TrackerBase::parent() { - assert( m_parent ); // Should always be non-null except for root - return *m_parent; - } + void TrackerBase::openChild() { + if( m_runState != ExecutingChildren ) { + m_runState = ExecutingChildren; + if( m_parent ) + m_parent->openChild(); + } + } + + bool TrackerBase::isSectionTracker() const { return false; } + bool TrackerBase::isGeneratorTracker() const { return false; } - void TrackerBase::openChild() { - if( m_runState != ExecutingChildren ) { - m_runState = ExecutingChildren; + void TrackerBase::open() { + m_runState = Executing; + moveToThis(); if( m_parent ) m_parent->openChild(); } - } - - bool TrackerBase::isSectionTracker() const { return false; } - bool TrackerBase::isGeneratorTracker() const { return false; } - - void TrackerBase::open() { - m_runState = Executing; - moveToThis(); - if( m_parent ) - m_parent->openChild(); - } - void TrackerBase::close() { + void TrackerBase::close() { - // Close any still open children (e.g. generators) - while( &m_ctx.currentTracker() != this ) - m_ctx.currentTracker().close(); + // Close any still open children (e.g. generators) + while( &m_ctx.currentTracker() != this ) + m_ctx.currentTracker().close(); - switch( m_runState ) { - case NeedsAnotherRun: - break; + switch( m_runState ) { + case NeedsAnotherRun: + break; - case Executing: - m_runState = CompletedSuccessfully; - break; - case ExecutingChildren: - if( std::all_of(m_children.begin(), m_children.end(), [](ITrackerPtr const& t){ return t->isComplete(); }) ) + case Executing: m_runState = CompletedSuccessfully; - break; + break; + case ExecutingChildren: + if( std::all_of(m_children.begin(), m_children.end(), [](ITrackerPtr const& t){ return t->isComplete(); }) ) + m_runState = CompletedSuccessfully; + break; - case NotStarted: - case CompletedSuccessfully: - case Failed: - CATCH_INTERNAL_ERROR( "Illogical state: " << m_runState ); + case NotStarted: + case CompletedSuccessfully: + case Failed: + CATCH_INTERNAL_ERROR( "Illogical state: " << m_runState ); - default: - CATCH_INTERNAL_ERROR( "Unknown state: " << m_runState ); + default: + CATCH_INTERNAL_ERROR( "Unknown state: " << m_runState ); + } + moveToParent(); + m_ctx.completeCycle(); + } + void TrackerBase::fail() { + m_runState = Failed; + if( m_parent ) + m_parent->markAsNeedingAnotherRun(); + moveToParent(); + m_ctx.completeCycle(); + } + void TrackerBase::markAsNeedingAnotherRun() { + m_runState = NeedsAnotherRun; } - moveToParent(); - m_ctx.completeCycle(); - } - void TrackerBase::fail() { - m_runState = Failed; - if( m_parent ) - m_parent->markAsNeedingAnotherRun(); - moveToParent(); - m_ctx.completeCycle(); - } - void TrackerBase::markAsNeedingAnotherRun() { - m_runState = NeedsAnotherRun; - } - void TrackerBase::moveToParent() { - assert( m_parent ); - m_ctx.setCurrentTracker( m_parent ); - } - void TrackerBase::moveToThis() { - m_ctx.setCurrentTracker( this ); - } + void TrackerBase::moveToParent() { + assert( m_parent ); + m_ctx.setCurrentTracker( m_parent ); + } + void TrackerBase::moveToThis() { + m_ctx.setCurrentTracker( this ); + } - SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) - : TrackerBase( nameAndLocation, ctx, parent ), - m_trimmed_name(trim(nameAndLocation.name)) - { - if( parent ) { - while( !parent->isSectionTracker() ) - parent = &parent->parent(); + SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : TrackerBase( nameAndLocation, ctx, parent ), + m_trimmed_name(trim(nameAndLocation.name)) + { + if( parent ) { + while( !parent->isSectionTracker() ) + parent = &parent->parent(); - SectionTracker& parentSection = static_cast( *parent ); - addNextFilters( parentSection.m_filters ); + SectionTracker& parentSection = static_cast( *parent ); + addNextFilters( parentSection.m_filters ); + } } - } - bool SectionTracker::isComplete() const { - bool complete = true; + bool SectionTracker::isComplete() const { + bool complete = true; - if (m_filters.empty() - || m_filters[0] == "" - || std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end()) { - complete = TrackerBase::isComplete(); + if (m_filters.empty() + || m_filters[0] == "" + || std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end()) { + complete = TrackerBase::isComplete(); + } + return complete; } - return complete; - } - bool SectionTracker::isSectionTracker() const { return true; } + bool SectionTracker::isSectionTracker() const { return true; } - SectionTracker& SectionTracker::acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { - std::shared_ptr section; + SectionTracker& SectionTracker::acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { + std::shared_ptr section; - ITracker& currentTracker = ctx.currentTracker(); - if( ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { - assert( childTracker ); - assert( childTracker->isSectionTracker() ); - section = std::static_pointer_cast( childTracker ); - } - else { - section = std::make_shared( nameAndLocation, ctx, ¤tTracker ); - currentTracker.addChild( section ); + ITracker& currentTracker = ctx.currentTracker(); + if( ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isSectionTracker() ); + section = std::static_pointer_cast( childTracker ); + } + else { + section = std::make_shared( nameAndLocation, ctx, ¤tTracker ); + currentTracker.addChild( section ); + } + if( !ctx.completedCycle() ) + section->tryOpen(); + return *section; } - if( !ctx.completedCycle() ) - section->tryOpen(); - return *section; - } - void SectionTracker::tryOpen() { - if( !isComplete() ) - open(); - } + void SectionTracker::tryOpen() { + if( !isComplete() ) + open(); + } - void SectionTracker::addInitialFilters( std::vector const& filters ) { - if( !filters.empty() ) { - m_filters.reserve( m_filters.size() + filters.size() + 2 ); - m_filters.emplace_back(""); // Root - should never be consulted - m_filters.emplace_back(""); // Test Case - not a section filter - m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); + void SectionTracker::addInitialFilters( std::vector const& filters ) { + if( !filters.empty() ) { + m_filters.reserve( m_filters.size() + filters.size() + 2 ); + m_filters.emplace_back(""); // Root - should never be consulted + m_filters.emplace_back(""); // Test Case - not a section filter + m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); + } + } + void SectionTracker::addNextFilters( std::vector const& filters ) { + if( filters.size() > 1 ) + m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() ); } - } - void SectionTracker::addNextFilters( std::vector const& filters ) { - if( filters.size() > 1 ) - m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() ); - } - std::vector const& SectionTracker::getFilters() const { - return m_filters; - } + std::vector const& SectionTracker::getFilters() const { + return m_filters; + } - std::string const& SectionTracker::trimmedName() const { - return m_trimmed_name; - } + std::string const& SectionTracker::trimmedName() const { + return m_trimmed_name; + } -} // namespace TestCaseTracking + } // namespace TestCaseTracking -using TestCaseTracking::ITracker; -using TestCaseTracking::TrackerContext; -using TestCaseTracking::SectionTracker; + using TestCaseTracking::ITracker; + using TestCaseTracking::TrackerContext; + using TestCaseTracking::SectionTracker; } // namespace Catch @@ -14591,11 +14602,11 @@ namespace Catch { CATCH_TRY { getMutableRegistryHub() .registerTest( - makeTestCase( - invoker, - extractClassName( classOrMethod ), - nameAndTags, - lineInfo)); + makeTestCase( + invoker, + extractClassName( classOrMethod ), + nameAndTags, + lineInfo)); } CATCH_CATCH_ALL { // Do not throw when constructing global objects, instead register the exception to be processed later getMutableRegistryHub().registerStartupException(); @@ -14607,15 +14618,15 @@ namespace Catch { // end catch_test_registry.cpp // start catch_test_spec.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/string" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/vector" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include +#include +#include +#include namespace Catch { TestSpec::Pattern::Pattern( std::string const& name ) - : m_name( name ) + : m_name( name ) {} TestSpec::Pattern::~Pattern() = default; @@ -14625,8 +14636,8 @@ namespace Catch { } TestSpec::NamePattern::NamePattern( std::string const& name, std::string const& filterString ) - : Pattern( filterString ) - , m_wildcardPattern( toLower( name ), CaseSensitive::No ) + : Pattern( filterString ) + , m_wildcardPattern( toLower( name ), CaseSensitive::No ) {} bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const { @@ -14634,8 +14645,8 @@ namespace Catch { } TestSpec::TagPattern::TagPattern( std::string const& tag, std::string const& filterString ) - : Pattern( filterString ) - , m_tag( toLower( tag ) ) + : Pattern( filterString ) + , m_tag( toLower( tag ) ) {} bool TestSpec::TagPattern::matches( TestCaseInfo const& testCase ) const { @@ -14645,8 +14656,8 @@ namespace Catch { } TestSpec::ExcludedPattern::ExcludedPattern( PatternPtr const& underlyingPattern ) - : Pattern( underlyingPattern->name() ) - , m_underlyingPattern( underlyingPattern ) + : Pattern( underlyingPattern->name() ) + , m_underlyingPattern( underlyingPattern ) {} bool TestSpec::ExcludedPattern::matches( TestCaseInfo const& testCase ) const { @@ -14707,11 +14718,11 @@ namespace Catch { m_realPatternPos = 0; for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) - //if visitChar fails - if( !visitChar( m_arg[m_pos] ) ){ - m_testSpec.m_invalidArgs.push_back(arg); - break; - } + //if visitChar fails + if( !visitChar( m_arg[m_pos] ) ){ + m_testSpec.m_invalidArgs.push_back(arg); + break; + } endMode(); return *this; } @@ -14729,23 +14740,23 @@ namespace Catch { } switch( m_mode ) { - case None: - if( processNoneChar( c ) ) - return true; - break; - case Name: - processNameChar( c ); - break; - case EscapedName: - endMode(); - addCharToPattern(c); - return true; - default: - case Tag: - case QuotedName: - if( processOtherChar( c ) ) + case None: + if( processNoneChar( c ) ) + return true; + break; + case Name: + processNameChar( c ); + break; + case EscapedName: + endMode(); + addCharToPattern(c); return true; - break; + default: + case Tag: + case QuotedName: + if( processOtherChar( c ) ) + return true; + break; } m_substring += c; @@ -14759,20 +14770,20 @@ namespace Catch { // without adding the given character to the current pattern strings bool TestSpecParser::processNoneChar( char c ) { switch( c ) { - case ' ': - return true; - case '~': - m_exclusion = true; - return false; - case '[': - startNewMode( Tag ); - return false; - case '"': - startNewMode( QuotedName ); - return false; - default: - startNewMode( Name ); - return false; + case ' ': + return true; + case '~': + m_exclusion = true; + return false; + case '[': + startNewMode( Tag ); + return false; + case '"': + startNewMode( QuotedName ); + return false; + default: + startNewMode( Name ); + return false; } } void TestSpecParser::processNameChar( char c ) { @@ -14796,17 +14807,17 @@ namespace Catch { } void TestSpecParser::endMode() { switch( m_mode ) { - case Name: - case QuotedName: - return addNamePattern(); - case Tag: - return addTagPattern(); - case EscapedName: - revertBackToLastMode(); - return; - case None: - default: - return startNewMode( None ); + case Name: + case QuotedName: + return addNamePattern(); + case Tag: + return addTagPattern(); + case EscapedName: + revertBackToLastMode(); + return; + case None: + default: + return startNewMode( None ); } } void TestSpecParser::escape() { @@ -14839,26 +14850,26 @@ namespace Catch { } void TestSpecParser::saveLastMode() { - lastMode = m_mode; + lastMode = m_mode; } void TestSpecParser::revertBackToLastMode() { - m_mode = lastMode; + m_mode = lastMode; } bool TestSpecParser::separate() { - if( (m_mode==QuotedName) || (m_mode==Tag) ){ - //invalid argument, signal failure to previous scope. - m_mode = None; - m_pos = m_arg.size(); - m_substring.clear(); - m_patternName.clear(); - m_realPatternPos = 0; - return false; - } - endMode(); - addFilter(); - return true; //success + if( (m_mode==QuotedName) || (m_mode==Tag) ){ + //invalid argument, signal failure to previous scope. + m_mode = None; + m_pos = m_arg.size(); + m_substring.clear(); + m_patternName.clear(); + m_realPatternPos = 0; + return false; + } + endMode(); + addFilter(); + return true; //success } std::string TestSpecParser::preprocessPattern() { @@ -14926,7 +14937,7 @@ namespace Catch { // end catch_test_spec_parser.cpp // start catch_timer.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/chrono" +#include static const uint64_t nanosecondsInSecond = 1000000000; @@ -14973,7 +14984,7 @@ namespace Catch { } void Timer::start() { - m_nanoseconds = getCurrentNanosecondsSinceEpoch(); + m_nanoseconds = getCurrentNanosecondsSinceEpoch(); } auto Timer::getElapsedNanoseconds() const -> uint64_t { return getCurrentNanosecondsSinceEpoch() - m_nanoseconds; @@ -15003,67 +15014,67 @@ namespace Catch { #define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER #endif -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cmath" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iomanip" +#include +#include namespace Catch { -namespace Detail { + namespace Detail { - const std::string unprintableString = "{?}"; + const std::string unprintableString = "{?}"; - namespace { - const int hexThreshold = 255; + namespace { + const int hexThreshold = 255; + + struct Endianness { + enum Arch { Big, Little }; - struct Endianness { - enum Arch { Big, Little }; + static Arch which() { + int one = 1; + // If the lowest byte we read is non-zero, we can assume + // that little endian format is used. + auto value = *reinterpret_cast(&one); + return value ? Little : Big; + } + }; + } - static Arch which() { - int one = 1; - // If the lowest byte we read is non-zero, we can assume - // that little endian format is used. - auto value = *reinterpret_cast(&one); - return value ? Little : Big; + std::string rawMemoryToString( const void *object, std::size_t size ) { + // Reverse order for little endian architectures + int i = 0, end = static_cast( size ), inc = 1; + if( Endianness::which() == Endianness::Little ) { + i = end-1; + end = inc = -1; } - }; - } - std::string rawMemoryToString( const void *object, std::size_t size ) { - // Reverse order for little endian architectures - int i = 0, end = static_cast( size ), inc = 1; - if( Endianness::which() == Endianness::Little ) { - i = end-1; - end = inc = -1; + unsigned char const *bytes = static_cast(object); + ReusableStringStream rss; + rss << "0x" << std::setfill('0') << std::hex; + for( ; i != end; i += inc ) + rss << std::setw(2) << static_cast(bytes[i]); + return rss.str(); } - - unsigned char const *bytes = static_cast(object); - ReusableStringStream rss; - rss << "0x" << std::setfill('0') << std::hex; - for( ; i != end; i += inc ) - rss << std::setw(2) << static_cast(bytes[i]); - return rss.str(); } -} -template -std::string fpToString( T value, int precision ) { - if (Catch::isnan(value)) { - return "nan"; - } + template + std::string fpToString( T value, int precision ) { + if (Catch::isnan(value)) { + return "nan"; + } - ReusableStringStream rss; - rss << std::setprecision( precision ) - << std::fixed - << value; - std::string d = rss.str(); - std::size_t i = d.find_last_not_of( '0' ); - if( i != std::string::npos && i != d.size()-1 ) { - if( d[i] == '.' ) - i++; - d = d.substr( 0, i+1 ); + ReusableStringStream rss; + rss << std::setprecision( precision ) + << std::fixed + << value; + std::string d = rss.str(); + std::size_t i = d.find_last_not_of( '0' ); + if( i != std::string::npos && i != d.size()-1 ) { + if( d[i] == '.' ) + i++; + d = d.substr( 0, i+1 ); + } + return d; } - return d; -} //// ======================================================= //// // @@ -15071,169 +15082,169 @@ std::string fpToString( T value, int precision ) { // //// ======================================================= //// -std::string StringMaker::convert(const std::string& str) { - if (!getCurrentContext().getConfig()->showInvisibles()) { - return '"' + str + '"'; - } + std::string StringMaker::convert(const std::string& str) { + if (!getCurrentContext().getConfig()->showInvisibles()) { + return '"' + str + '"'; + } - std::string s("\""); - for (char c : str) { - switch (c) { - case '\n': - s.append("\\n"); - break; - case '\t': - s.append("\\t"); - break; - default: - s.push_back(c); - break; + std::string s("\""); + for (char c : str) { + switch (c) { + case '\n': + s.append("\\n"); + break; + case '\t': + s.append("\\t"); + break; + default: + s.push_back(c); + break; + } } + s.append("\""); + return s; } - s.append("\""); - return s; -} #ifdef CATCH_CONFIG_CPP17_STRING_VIEW -std::string StringMaker::convert(std::string_view str) { - return ::Catch::Detail::stringify(std::string{ str }); -} + std::string StringMaker::convert(std::string_view str) { + return ::Catch::Detail::stringify(std::string{ str }); + } #endif -std::string StringMaker::convert(char const* str) { - if (str) { - return ::Catch::Detail::stringify(std::string{ str }); - } else { - return{ "{null string}" }; + std::string StringMaker::convert(char const* str) { + if (str) { + return ::Catch::Detail::stringify(std::string{ str }); + } else { + return{ "{null string}" }; + } } -} -std::string StringMaker::convert(char* str) { - if (str) { - return ::Catch::Detail::stringify(std::string{ str }); - } else { - return{ "{null string}" }; + std::string StringMaker::convert(char* str) { + if (str) { + return ::Catch::Detail::stringify(std::string{ str }); + } else { + return{ "{null string}" }; + } } -} #ifdef CATCH_CONFIG_WCHAR -std::string StringMaker::convert(const std::wstring& wstr) { - std::string s; - s.reserve(wstr.size()); - for (auto c : wstr) { - s += (c <= 0xff) ? static_cast(c) : '?'; + std::string StringMaker::convert(const std::wstring& wstr) { + std::string s; + s.reserve(wstr.size()); + for (auto c : wstr) { + s += (c <= 0xff) ? static_cast(c) : '?'; + } + return ::Catch::Detail::stringify(s); } - return ::Catch::Detail::stringify(s); -} # ifdef CATCH_CONFIG_CPP17_STRING_VIEW -std::string StringMaker::convert(std::wstring_view str) { - return StringMaker::convert(std::wstring(str)); -} + std::string StringMaker::convert(std::wstring_view str) { + return StringMaker::convert(std::wstring(str)); + } # endif -std::string StringMaker::convert(wchar_t const * str) { - if (str) { - return ::Catch::Detail::stringify(std::wstring{ str }); - } else { - return{ "{null string}" }; + std::string StringMaker::convert(wchar_t const * str) { + if (str) { + return ::Catch::Detail::stringify(std::wstring{ str }); + } else { + return{ "{null string}" }; + } } -} -std::string StringMaker::convert(wchar_t * str) { - if (str) { - return ::Catch::Detail::stringify(std::wstring{ str }); - } else { - return{ "{null string}" }; + std::string StringMaker::convert(wchar_t * str) { + if (str) { + return ::Catch::Detail::stringify(std::wstring{ str }); + } else { + return{ "{null string}" }; + } } -} #endif #if defined(CATCH_CONFIG_CPP17_BYTE) -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstddef" -std::string StringMaker::convert(std::byte value) { - return ::Catch::Detail::stringify(std::to_integer(value)); -} +#include + std::string StringMaker::convert(std::byte value) { + return ::Catch::Detail::stringify(std::to_integer(value)); + } #endif // defined(CATCH_CONFIG_CPP17_BYTE) -std::string StringMaker::convert(int value) { - return ::Catch::Detail::stringify(static_cast(value)); -} -std::string StringMaker::convert(long value) { - return ::Catch::Detail::stringify(static_cast(value)); -} -std::string StringMaker::convert(long long value) { - ReusableStringStream rss; - rss << value; - if (value > Detail::hexThreshold) { - rss << " (0x" << std::hex << value << ')'; + std::string StringMaker::convert(int value) { + return ::Catch::Detail::stringify(static_cast(value)); + } + std::string StringMaker::convert(long value) { + return ::Catch::Detail::stringify(static_cast(value)); + } + std::string StringMaker::convert(long long value) { + ReusableStringStream rss; + rss << value; + if (value > Detail::hexThreshold) { + rss << " (0x" << std::hex << value << ')'; + } + return rss.str(); } - return rss.str(); -} -std::string StringMaker::convert(unsigned int value) { - return ::Catch::Detail::stringify(static_cast(value)); -} -std::string StringMaker::convert(unsigned long value) { - return ::Catch::Detail::stringify(static_cast(value)); -} -std::string StringMaker::convert(unsigned long long value) { - ReusableStringStream rss; - rss << value; - if (value > Detail::hexThreshold) { - rss << " (0x" << std::hex << value << ')'; + std::string StringMaker::convert(unsigned int value) { + return ::Catch::Detail::stringify(static_cast(value)); + } + std::string StringMaker::convert(unsigned long value) { + return ::Catch::Detail::stringify(static_cast(value)); + } + std::string StringMaker::convert(unsigned long long value) { + ReusableStringStream rss; + rss << value; + if (value > Detail::hexThreshold) { + rss << " (0x" << std::hex << value << ')'; + } + return rss.str(); } - return rss.str(); -} -std::string StringMaker::convert(bool b) { - return b ? "true" : "false"; -} + std::string StringMaker::convert(bool b) { + return b ? "true" : "false"; + } -std::string StringMaker::convert(signed char value) { - if (value == '\r') { - return "'\\r'"; - } else if (value == '\f') { - return "'\\f'"; - } else if (value == '\n') { - return "'\\n'"; - } else if (value == '\t') { - return "'\\t'"; - } else if ('\0' <= value && value < ' ') { - return ::Catch::Detail::stringify(static_cast(value)); - } else { - char chstr[] = "' '"; - chstr[1] = value; - return chstr; + std::string StringMaker::convert(signed char value) { + if (value == '\r') { + return "'\\r'"; + } else if (value == '\f') { + return "'\\f'"; + } else if (value == '\n') { + return "'\\n'"; + } else if (value == '\t') { + return "'\\t'"; + } else if ('\0' <= value && value < ' ') { + return ::Catch::Detail::stringify(static_cast(value)); + } else { + char chstr[] = "' '"; + chstr[1] = value; + return chstr; + } + } + std::string StringMaker::convert(char c) { + return ::Catch::Detail::stringify(static_cast(c)); + } + std::string StringMaker::convert(unsigned char c) { + return ::Catch::Detail::stringify(static_cast(c)); } -} -std::string StringMaker::convert(char c) { - return ::Catch::Detail::stringify(static_cast(c)); -} -std::string StringMaker::convert(unsigned char c) { - return ::Catch::Detail::stringify(static_cast(c)); -} -std::string StringMaker::convert(std::nullptr_t) { - return "nullptr"; -} + std::string StringMaker::convert(std::nullptr_t) { + return "nullptr"; + } -int StringMaker::precision = 5; + int StringMaker::precision = 5; -std::string StringMaker::convert(float value) { - return fpToString(value, precision) + 'f'; -} + std::string StringMaker::convert(float value) { + return fpToString(value, precision) + 'f'; + } -int StringMaker::precision = 10; + int StringMaker::precision = 10; -std::string StringMaker::convert(double value) { - return fpToString(value, precision); -} + std::string StringMaker::convert(double value) { + return fpToString(value, precision); + } -std::string ratio_string::symbol() { return "a"; } -std::string ratio_string::symbol() { return "f"; } -std::string ratio_string::symbol() { return "p"; } -std::string ratio_string::symbol() { return "n"; } -std::string ratio_string::symbol() { return "u"; } -std::string ratio_string::symbol() { return "m"; } + std::string ratio_string::symbol() { return "a"; } + std::string ratio_string::symbol() { return "f"; } + std::string ratio_string::symbol() { return "p"; } + std::string ratio_string::symbol() { return "n"; } + std::string ratio_string::symbol() { return "u"; } + std::string ratio_string::symbol() { return "m"; } } // end namespace Catch @@ -15317,7 +15328,7 @@ namespace Catch { # endif #endif -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/exception" +#include #if defined(__cpp_lib_uncaught_exceptions) \ && !defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) @@ -15334,7 +15345,7 @@ namespace Catch { #endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP // end catch_config_uncaught_exceptions.hpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/exception" +#include namespace Catch { bool uncaught_exceptions() { @@ -15345,26 +15356,26 @@ namespace Catch { #else return std::uncaught_exception(); #endif - } + } } // end namespace Catch // end catch_uncaught_exceptions.cpp // start catch_version.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ostream" +#include namespace Catch { Version::Version - ( unsigned int _majorVersion, - unsigned int _minorVersion, - unsigned int _patchNumber, - char const * const _branchName, - unsigned int _buildNumber ) - : majorVersion( _majorVersion ), - minorVersion( _minorVersion ), - patchNumber( _patchNumber ), - branchName( _branchName ), - buildNumber( _buildNumber ) + ( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ) + : majorVersion( _majorVersion ), + minorVersion( _minorVersion ), + patchNumber( _patchNumber ), + branchName( _branchName ), + buildNumber( _buildNumber ) {} std::ostream& operator << ( std::ostream& os, Version const& version ) { @@ -15380,7 +15391,7 @@ namespace Catch { } Version const& libraryVersion() { - static Version version( 2, 13, 7, "", 0 ); + static Version version( 2, 13, 9, "", 0 ); return version; } @@ -15392,8 +15403,8 @@ namespace Catch { WildcardPattern::WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) - : m_caseSensitivity( caseSensitivity ), - m_pattern( normaliseString( pattern ) ) + : m_caseSensitivity( caseSensitivity ), + m_pattern( normaliseString( pattern ) ) { if( startsWith( m_pattern, '*' ) ) { m_pattern = m_pattern.substr( 1 ); @@ -15427,74 +15438,74 @@ namespace Catch { // end catch_wildcard_pattern.cpp // start catch_xmlwriter.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iomanip" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/type_traits" +#include +#include namespace Catch { -namespace { + namespace { - size_t trailingBytes(unsigned char c) { - if ((c & 0xE0) == 0xC0) { - return 2; - } - if ((c & 0xF0) == 0xE0) { - return 3; - } - if ((c & 0xF8) == 0xF0) { - return 4; + size_t trailingBytes(unsigned char c) { + if ((c & 0xE0) == 0xC0) { + return 2; + } + if ((c & 0xF0) == 0xE0) { + return 3; + } + if ((c & 0xF8) == 0xF0) { + return 4; + } + CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered"); } - CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered"); - } - uint32_t headerValue(unsigned char c) { - if ((c & 0xE0) == 0xC0) { - return c & 0x1F; - } - if ((c & 0xF0) == 0xE0) { - return c & 0x0F; - } - if ((c & 0xF8) == 0xF0) { - return c & 0x07; + uint32_t headerValue(unsigned char c) { + if ((c & 0xE0) == 0xC0) { + return c & 0x1F; + } + if ((c & 0xF0) == 0xE0) { + return c & 0x0F; + } + if ((c & 0xF8) == 0xF0) { + return c & 0x07; + } + CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered"); } - CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered"); - } - void hexEscapeChar(std::ostream& os, unsigned char c) { - std::ios_base::fmtflags f(os.flags()); - os << "\\x" - << std::uppercase << std::hex << std::setfill('0') << std::setw(2) - << static_cast(c); - os.flags(f); - } + void hexEscapeChar(std::ostream& os, unsigned char c) { + std::ios_base::fmtflags f(os.flags()); + os << "\\x" + << std::uppercase << std::hex << std::setfill('0') << std::setw(2) + << static_cast(c); + os.flags(f); + } - bool shouldNewline(XmlFormatting fmt) { - return !!(static_cast::type>(fmt & XmlFormatting::Newline)); - } + bool shouldNewline(XmlFormatting fmt) { + return !!(static_cast::type>(fmt & XmlFormatting::Newline)); + } - bool shouldIndent(XmlFormatting fmt) { - return !!(static_cast::type>(fmt & XmlFormatting::Indent)); - } + bool shouldIndent(XmlFormatting fmt) { + return !!(static_cast::type>(fmt & XmlFormatting::Indent)); + } -} // anonymous namespace + } // anonymous namespace XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) { return static_cast( - static_cast::type>(lhs) | - static_cast::type>(rhs) + static_cast::type>(lhs) | + static_cast::type>(rhs) ); } XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) { return static_cast( - static_cast::type>(lhs) & - static_cast::type>(rhs) + static_cast::type>(lhs) & + static_cast::type>(rhs) ); } XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat ) - : m_str( str ), - m_forWhat( forWhat ) + : m_str( str ), + m_forWhat( forWhat ) {} void XmlEncode::encodeTo( std::ostream& os ) const { @@ -15504,89 +15515,89 @@ namespace { for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) { unsigned char c = m_str[idx]; switch (c) { - case '<': os << "<"; break; - case '&': os << "&"; break; + case '<': os << "<"; break; + case '&': os << "&"; break; - case '>': - // See: http://www.w3.org/TR/xml/#syntax - if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']') - os << ">"; - else - os << c; - break; + case '>': + // See: http://www.w3.org/TR/xml/#syntax + if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']') + os << ">"; + else + os << c; + break; - case '\"': - if (m_forWhat == ForAttributes) - os << """; - else - os << c; - break; + case '\"': + if (m_forWhat == ForAttributes) + os << """; + else + os << c; + break; - default: - // Check for control characters and invalid utf-8 + default: + // Check for control characters and invalid utf-8 - // Escape control characters in standard ascii - // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 - if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) { - hexEscapeChar(os, c); - break; - } + // Escape control characters in standard ascii + // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 + if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) { + hexEscapeChar(os, c); + break; + } - // Plain ASCII: Write it to stream - if (c < 0x7F) { - os << c; - break; - } + // Plain ASCII: Write it to stream + if (c < 0x7F) { + os << c; + break; + } - // UTF-8 territory - // Check if the encoding is valid and if it is not, hex escape bytes. - // Important: We do not check the exact decoded values for validity, only the encoding format - // First check that this bytes is a valid lead byte: - // This means that it is not encoded as 1111 1XXX - // Or as 10XX XXXX - if (c < 0xC0 || - c >= 0xF8) { - hexEscapeChar(os, c); - break; - } + // UTF-8 territory + // Check if the encoding is valid and if it is not, hex escape bytes. + // Important: We do not check the exact decoded values for validity, only the encoding format + // First check that this bytes is a valid lead byte: + // This means that it is not encoded as 1111 1XXX + // Or as 10XX XXXX + if (c < 0xC0 || + c >= 0xF8) { + hexEscapeChar(os, c); + break; + } - auto encBytes = trailingBytes(c); - // Are there enough bytes left to avoid accessing out-of-bounds memory? - if (idx + encBytes - 1 >= m_str.size()) { - hexEscapeChar(os, c); - break; - } - // The header is valid, check data - // The next encBytes bytes must together be a valid utf-8 - // This means: bitpattern 10XX XXXX and the extracted value is sane (ish) - bool valid = true; - uint32_t value = headerValue(c); - for (std::size_t n = 1; n < encBytes; ++n) { - unsigned char nc = m_str[idx + n]; - valid &= ((nc & 0xC0) == 0x80); - value = (value << 6) | (nc & 0x3F); - } + auto encBytes = trailingBytes(c); + // Are there enough bytes left to avoid accessing out-of-bounds memory? + if (idx + encBytes - 1 >= m_str.size()) { + hexEscapeChar(os, c); + break; + } + // The header is valid, check data + // The next encBytes bytes must together be a valid utf-8 + // This means: bitpattern 10XX XXXX and the extracted value is sane (ish) + bool valid = true; + uint32_t value = headerValue(c); + for (std::size_t n = 1; n < encBytes; ++n) { + unsigned char nc = m_str[idx + n]; + valid &= ((nc & 0xC0) == 0x80); + value = (value << 6) | (nc & 0x3F); + } - if ( - // Wrong bit pattern of following bytes - (!valid) || - // Overlong encodings - (value < 0x80) || - (0x80 <= value && value < 0x800 && encBytes > 2) || - (0x800 < value && value < 0x10000 && encBytes > 3) || - // Encoded value out of range - (value >= 0x110000) - ) { - hexEscapeChar(os, c); - break; - } + if ( + // Wrong bit pattern of following bytes + (!valid) || + // Overlong encodings + (value < 0x80) || + (0x80 <= value && value < 0x800 && encBytes > 2) || + (0x800 < value && value < 0x10000 && encBytes > 3) || + // Encoded value out of range + (value >= 0x110000) + ) { + hexEscapeChar(os, c); + break; + } - // If we got here, this is in fact a valid(ish) utf-8 sequence - for (std::size_t n = 0; n < encBytes; ++n) { - os << m_str[idx + n]; - } - idx += encBytes - 1; - break; + // If we got here, this is in fact a valid(ish) utf-8 sequence + for (std::size_t n = 0; n < encBytes; ++n) { + os << m_str[idx + n]; + } + idx += encBytes - 1; + break; } } } @@ -15597,13 +15608,13 @@ namespace { } XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer, XmlFormatting fmt ) - : m_writer( writer ), - m_fmt(fmt) + : m_writer( writer ), + m_fmt(fmt) {} XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) noexcept - : m_writer( other.m_writer ), - m_fmt(other.m_fmt) + : m_writer( other.m_writer ), + m_fmt(other.m_fmt) { other.m_writer = nullptr; other.m_fmt = XmlFormatting::None; @@ -15751,11 +15762,11 @@ namespace { // end catch_xmlwriter.cpp // start catch_reporter_bases.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstring" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cfloat" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdio" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/memory" +#include +#include +#include +#include +#include namespace Catch { void prepareExpandedExpression(AssertionResult& result) { @@ -15809,7 +15820,7 @@ namespace Catch { } TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config) - :StreamingReporterBase(_config) {} + :StreamingReporterBase(_config) {} std::set TestEventListenerBase::getSupportedVerbosities() { return { Verbosity::Quiet, Verbosity::Normal, Verbosity::High }; @@ -15846,258 +15857,258 @@ namespace { } // anon namespace namespace Catch { -namespace { + namespace { // Colour, message variants: // - white: No tests ran. // - red: Failed [both/all] N test cases, failed [both/all] M assertions. // - white: Passed [both/all] N test cases (no assertions). // - red: Failed N tests cases, failed M assertions. -// - green: Passed [both/all] N tests cases with M assertions. -void printTotals(std::ostream& out, const Totals& totals) { - if (totals.testCases.total() == 0) { - out << "No tests ran."; - } else if (totals.testCases.failed == totals.testCases.total()) { - Colour colour(Colour::ResultError); - const std::string qualify_assertions_failed = - totals.assertions.failed == totals.assertions.total() ? - bothOrAll(totals.assertions.failed) : std::string(); - out << - "Failed " << bothOrAll(totals.testCases.failed) - << pluralise(totals.testCases.failed, "test case") << ", " - "failed " << qualify_assertions_failed << - pluralise(totals.assertions.failed, "assertion") << '.'; - } else if (totals.assertions.total() == 0) { - out << - "Passed " << bothOrAll(totals.testCases.total()) - << pluralise(totals.testCases.total(), "test case") - << " (no assertions)."; - } else if (totals.assertions.failed) { - Colour colour(Colour::ResultError); - out << - "Failed " << pluralise(totals.testCases.failed, "test case") << ", " - "failed " << pluralise(totals.assertions.failed, "assertion") << '.'; - } else { - Colour colour(Colour::ResultSuccess); - out << - "Passed " << bothOrAll(totals.testCases.passed) - << pluralise(totals.testCases.passed, "test case") << - " with " << pluralise(totals.assertions.passed, "assertion") << '.'; - } -} +// - green: Passed [both/all] N tests cases with M assertions. + void printTotals(std::ostream& out, const Totals& totals) { + if (totals.testCases.total() == 0) { + out << "No tests ran."; + } else if (totals.testCases.failed == totals.testCases.total()) { + Colour colour(Colour::ResultError); + const std::string qualify_assertions_failed = + totals.assertions.failed == totals.assertions.total() ? + bothOrAll(totals.assertions.failed) : std::string(); + out << + "Failed " << bothOrAll(totals.testCases.failed) + << pluralise(totals.testCases.failed, "test case") << ", " + "failed " << qualify_assertions_failed << + pluralise(totals.assertions.failed, "assertion") << '.'; + } else if (totals.assertions.total() == 0) { + out << + "Passed " << bothOrAll(totals.testCases.total()) + << pluralise(totals.testCases.total(), "test case") + << " (no assertions)."; + } else if (totals.assertions.failed) { + Colour colour(Colour::ResultError); + out << + "Failed " << pluralise(totals.testCases.failed, "test case") << ", " + "failed " << pluralise(totals.assertions.failed, "assertion") << '.'; + } else { + Colour colour(Colour::ResultSuccess); + out << + "Passed " << bothOrAll(totals.testCases.passed) + << pluralise(totals.testCases.passed, "test case") << + " with " << pluralise(totals.assertions.passed, "assertion") << '.'; + } + } // Implementation of CompactReporter formatting -class AssertionPrinter { -public: - AssertionPrinter& operator= (AssertionPrinter const&) = delete; - AssertionPrinter(AssertionPrinter const&) = delete; - AssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages) - : stream(_stream) - , result(_stats.assertionResult) - , messages(_stats.infoMessages) - , itMessage(_stats.infoMessages.begin()) - , printInfoMessages(_printInfoMessages) {} - - void print() { - printSourceInfo(); - - itMessage = messages.begin(); - - switch (result.getResultType()) { - case ResultWas::Ok: - printResultType(Colour::ResultSuccess, passedString()); - printOriginalExpression(); - printReconstructedExpression(); - if (!result.hasExpression()) - printRemainingMessages(Colour::None); - else - printRemainingMessages(); - break; - case ResultWas::ExpressionFailed: - if (result.isOk()) - printResultType(Colour::ResultSuccess, failedString() + std::string(" - but was ok")); - else - printResultType(Colour::Error, failedString()); - printOriginalExpression(); - printReconstructedExpression(); - printRemainingMessages(); - break; - case ResultWas::ThrewException: - printResultType(Colour::Error, failedString()); - printIssue("unexpected exception with message:"); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::FatalErrorCondition: - printResultType(Colour::Error, failedString()); - printIssue("fatal error condition with message:"); - printMessage(); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::DidntThrowException: - printResultType(Colour::Error, failedString()); - printIssue("expected exception, got none"); - printExpressionWas(); - printRemainingMessages(); - break; - case ResultWas::Info: - printResultType(Colour::None, "info"); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::Warning: - printResultType(Colour::None, "warning"); - printMessage(); - printRemainingMessages(); - break; - case ResultWas::ExplicitFailure: - printResultType(Colour::Error, failedString()); - printIssue("explicitly"); - printRemainingMessages(Colour::None); - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - printResultType(Colour::Error, "** internal error **"); - break; - } - } - -private: - void printSourceInfo() const { - Colour colourGuard(Colour::FileName); - stream << result.getSourceInfo() << ':'; - } + class AssertionPrinter { + public: + AssertionPrinter& operator= (AssertionPrinter const&) = delete; + AssertionPrinter(AssertionPrinter const&) = delete; + AssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages) + : stream(_stream) + , result(_stats.assertionResult) + , messages(_stats.infoMessages) + , itMessage(_stats.infoMessages.begin()) + , printInfoMessages(_printInfoMessages) {} + + void print() { + printSourceInfo(); + + itMessage = messages.begin(); + + switch (result.getResultType()) { + case ResultWas::Ok: + printResultType(Colour::ResultSuccess, passedString()); + printOriginalExpression(); + printReconstructedExpression(); + if (!result.hasExpression()) + printRemainingMessages(Colour::None); + else + printRemainingMessages(); + break; + case ResultWas::ExpressionFailed: + if (result.isOk()) + printResultType(Colour::ResultSuccess, failedString() + std::string(" - but was ok")); + else + printResultType(Colour::Error, failedString()); + printOriginalExpression(); + printReconstructedExpression(); + printRemainingMessages(); + break; + case ResultWas::ThrewException: + printResultType(Colour::Error, failedString()); + printIssue("unexpected exception with message:"); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::FatalErrorCondition: + printResultType(Colour::Error, failedString()); + printIssue("fatal error condition with message:"); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::DidntThrowException: + printResultType(Colour::Error, failedString()); + printIssue("expected exception, got none"); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::Info: + printResultType(Colour::None, "info"); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::Warning: + printResultType(Colour::None, "warning"); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::ExplicitFailure: + printResultType(Colour::Error, failedString()); + printIssue("explicitly"); + printRemainingMessages(Colour::None); + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + printResultType(Colour::Error, "** internal error **"); + break; + } + } - void printResultType(Colour::Code colour, std::string const& passOrFail) const { - if (!passOrFail.empty()) { - { - Colour colourGuard(colour); - stream << ' ' << passOrFail; + private: + void printSourceInfo() const { + Colour colourGuard(Colour::FileName); + stream << result.getSourceInfo() << ':'; } - stream << ':'; - } - } - void printIssue(std::string const& issue) const { - stream << ' ' << issue; - } + void printResultType(Colour::Code colour, std::string const& passOrFail) const { + if (!passOrFail.empty()) { + { + Colour colourGuard(colour); + stream << ' ' << passOrFail; + } + stream << ':'; + } + } - void printExpressionWas() { - if (result.hasExpression()) { - stream << ';'; - { - Colour colour(dimColour()); - stream << " expression was:"; + void printIssue(std::string const& issue) const { + stream << ' ' << issue; } - printOriginalExpression(); - } - } - void printOriginalExpression() const { - if (result.hasExpression()) { - stream << ' ' << result.getExpression(); - } - } + void printExpressionWas() { + if (result.hasExpression()) { + stream << ';'; + { + Colour colour(dimColour()); + stream << " expression was:"; + } + printOriginalExpression(); + } + } - void printReconstructedExpression() const { - if (result.hasExpandedExpression()) { - { - Colour colour(dimColour()); - stream << " for: "; + void printOriginalExpression() const { + if (result.hasExpression()) { + stream << ' ' << result.getExpression(); + } } - stream << result.getExpandedExpression(); - } - } - void printMessage() { - if (itMessage != messages.end()) { - stream << " '" << itMessage->message << '\''; - ++itMessage; - } - } + void printReconstructedExpression() const { + if (result.hasExpandedExpression()) { + { + Colour colour(dimColour()); + stream << " for: "; + } + stream << result.getExpandedExpression(); + } + } + + void printMessage() { + if (itMessage != messages.end()) { + stream << " '" << itMessage->message << '\''; + ++itMessage; + } + } - void printRemainingMessages(Colour::Code colour = dimColour()) { - if (itMessage == messages.end()) - return; + void printRemainingMessages(Colour::Code colour = dimColour()) { + if (itMessage == messages.end()) + return; - const auto itEnd = messages.cend(); - const auto N = static_cast(std::distance(itMessage, itEnd)); + const auto itEnd = messages.cend(); + const auto N = static_cast(std::distance(itMessage, itEnd)); - { - Colour colourGuard(colour); - stream << " with " << pluralise(N, "message") << ':'; - } + { + Colour colourGuard(colour); + stream << " with " << pluralise(N, "message") << ':'; + } - while (itMessage != itEnd) { - // If this assertion is a warning ignore any INFO messages - if (printInfoMessages || itMessage->type != ResultWas::Info) { - printMessage(); - if (itMessage != itEnd) { - Colour colourGuard(dimColour()); - stream << " and"; + while (itMessage != itEnd) { + // If this assertion is a warning ignore any INFO messages + if (printInfoMessages || itMessage->type != ResultWas::Info) { + printMessage(); + if (itMessage != itEnd) { + Colour colourGuard(dimColour()); + stream << " and"; + } + continue; + } + ++itMessage; } - continue; } - ++itMessage; - } - } -private: - std::ostream& stream; - AssertionResult const& result; - std::vector messages; - std::vector::const_iterator itMessage; - bool printInfoMessages; -}; + private: + std::ostream& stream; + AssertionResult const& result; + std::vector messages; + std::vector::const_iterator itMessage; + bool printInfoMessages; + }; -} // anon namespace + } // anon namespace - std::string CompactReporter::getDescription() { - return "Reports test results on a single line, suitable for IDEs"; - } + std::string CompactReporter::getDescription() { + return "Reports test results on a single line, suitable for IDEs"; + } - void CompactReporter::noMatchingTestCases( std::string const& spec ) { - stream << "No test cases matched '" << spec << '\'' << std::endl; - } + void CompactReporter::noMatchingTestCases( std::string const& spec ) { + stream << "No test cases matched '" << spec << '\'' << std::endl; + } - void CompactReporter::assertionStarting( AssertionInfo const& ) {} + void CompactReporter::assertionStarting( AssertionInfo const& ) {} - bool CompactReporter::assertionEnded( AssertionStats const& _assertionStats ) { - AssertionResult const& result = _assertionStats.assertionResult; + bool CompactReporter::assertionEnded( AssertionStats const& _assertionStats ) { + AssertionResult const& result = _assertionStats.assertionResult; - bool printInfoMessages = true; + bool printInfoMessages = true; - // Drop out if result was successful and we're not printing those - if( !m_config->includeSuccessfulResults() && result.isOk() ) { - if( result.getResultType() != ResultWas::Warning ) - return false; - printInfoMessages = false; - } + // Drop out if result was successful and we're not printing those + if( !m_config->includeSuccessfulResults() && result.isOk() ) { + if( result.getResultType() != ResultWas::Warning ) + return false; + printInfoMessages = false; + } - AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); - printer.print(); + AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); + printer.print(); - stream << std::endl; - return true; - } + stream << std::endl; + return true; + } - void CompactReporter::sectionEnded(SectionStats const& _sectionStats) { - double dur = _sectionStats.durationInSeconds; - if ( shouldShowDuration( *m_config, dur ) ) { - stream << getFormattedDuration( dur ) << " s: " << _sectionStats.sectionInfo.name << std::endl; - } + void CompactReporter::sectionEnded(SectionStats const& _sectionStats) { + double dur = _sectionStats.durationInSeconds; + if ( shouldShowDuration( *m_config, dur ) ) { + stream << getFormattedDuration( dur ) << " s: " << _sectionStats.sectionInfo.name << std::endl; } + } - void CompactReporter::testRunEnded( TestRunStats const& _testRunStats ) { - printTotals( stream, _testRunStats.totals ); - stream << '\n' << std::endl; - StreamingReporterBase::testRunEnded( _testRunStats ); - } + void CompactReporter::testRunEnded( TestRunStats const& _testRunStats ) { + printTotals( stream, _testRunStats.totals ); + stream << '\n' << std::endl; + StreamingReporterBase::testRunEnded( _testRunStats ); + } - CompactReporter::~CompactReporter() {} + CompactReporter::~CompactReporter() {} CATCH_REGISTER_REPORTER( "compact", CompactReporter ) @@ -16105,8 +16116,8 @@ class AssertionPrinter { // end catch_reporter_compact.cpp // start catch_reporter_console.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cfloat" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstdio" +#include +#include #if defined(_MSC_VER) #pragma warning(push) @@ -16122,403 +16133,403 @@ class AssertionPrinter { namespace Catch { -namespace { + namespace { // Formatter impl for ConsoleReporter -class ConsoleAssertionPrinter { -public: - ConsoleAssertionPrinter& operator= (ConsoleAssertionPrinter const&) = delete; - ConsoleAssertionPrinter(ConsoleAssertionPrinter const&) = delete; - ConsoleAssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages) - : stream(_stream), - stats(_stats), - result(_stats.assertionResult), - colour(Colour::None), - message(result.getMessage()), - messages(_stats.infoMessages), - printInfoMessages(_printInfoMessages) { - switch (result.getResultType()) { - case ResultWas::Ok: - colour = Colour::Success; - passOrFail = "PASSED"; - //if( result.hasMessage() ) - if (_stats.infoMessages.size() == 1) - messageLabel = "with message"; - if (_stats.infoMessages.size() > 1) - messageLabel = "with messages"; - break; - case ResultWas::ExpressionFailed: - if (result.isOk()) { - colour = Colour::Success; - passOrFail = "FAILED - but was ok"; - } else { - colour = Colour::Error; - passOrFail = "FAILED"; - } - if (_stats.infoMessages.size() == 1) - messageLabel = "with message"; - if (_stats.infoMessages.size() > 1) - messageLabel = "with messages"; - break; - case ResultWas::ThrewException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to unexpected exception with "; - if (_stats.infoMessages.size() == 1) - messageLabel += "message"; - if (_stats.infoMessages.size() > 1) - messageLabel += "messages"; - break; - case ResultWas::FatalErrorCondition: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "due to a fatal error condition"; - break; - case ResultWas::DidntThrowException: - colour = Colour::Error; - passOrFail = "FAILED"; - messageLabel = "because no exception was thrown where one was expected"; - break; - case ResultWas::Info: - messageLabel = "info"; - break; - case ResultWas::Warning: - messageLabel = "warning"; - break; - case ResultWas::ExplicitFailure: - passOrFail = "FAILED"; - colour = Colour::Error; - if (_stats.infoMessages.size() == 1) - messageLabel = "explicitly with message"; - if (_stats.infoMessages.size() > 1) - messageLabel = "explicitly with messages"; - break; - // These cases are here to prevent compiler warnings - case ResultWas::Unknown: - case ResultWas::FailureBit: - case ResultWas::Exception: - passOrFail = "** internal error **"; - colour = Colour::Error; - break; - } - } - - void print() const { - printSourceInfo(); - if (stats.totals.assertions.total() > 0) { - printResultType(); - printOriginalExpression(); - printReconstructedExpression(); - } else { - stream << '\n'; - } - printMessage(); - } + class ConsoleAssertionPrinter { + public: + ConsoleAssertionPrinter& operator= (ConsoleAssertionPrinter const&) = delete; + ConsoleAssertionPrinter(ConsoleAssertionPrinter const&) = delete; + ConsoleAssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages) + : stream(_stream), + stats(_stats), + result(_stats.assertionResult), + colour(Colour::None), + message(result.getMessage()), + messages(_stats.infoMessages), + printInfoMessages(_printInfoMessages) { + switch (result.getResultType()) { + case ResultWas::Ok: + colour = Colour::Success; + passOrFail = "PASSED"; + //if( result.hasMessage() ) + if (_stats.infoMessages.size() == 1) + messageLabel = "with message"; + if (_stats.infoMessages.size() > 1) + messageLabel = "with messages"; + break; + case ResultWas::ExpressionFailed: + if (result.isOk()) { + colour = Colour::Success; + passOrFail = "FAILED - but was ok"; + } else { + colour = Colour::Error; + passOrFail = "FAILED"; + } + if (_stats.infoMessages.size() == 1) + messageLabel = "with message"; + if (_stats.infoMessages.size() > 1) + messageLabel = "with messages"; + break; + case ResultWas::ThrewException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to unexpected exception with "; + if (_stats.infoMessages.size() == 1) + messageLabel += "message"; + if (_stats.infoMessages.size() > 1) + messageLabel += "messages"; + break; + case ResultWas::FatalErrorCondition: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to a fatal error condition"; + break; + case ResultWas::DidntThrowException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "because no exception was thrown where one was expected"; + break; + case ResultWas::Info: + messageLabel = "info"; + break; + case ResultWas::Warning: + messageLabel = "warning"; + break; + case ResultWas::ExplicitFailure: + passOrFail = "FAILED"; + colour = Colour::Error; + if (_stats.infoMessages.size() == 1) + messageLabel = "explicitly with message"; + if (_stats.infoMessages.size() > 1) + messageLabel = "explicitly with messages"; + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + passOrFail = "** internal error **"; + colour = Colour::Error; + break; + } + } -private: - void printResultType() const { - if (!passOrFail.empty()) { - Colour colourGuard(colour); - stream << passOrFail << ":\n"; - } - } - void printOriginalExpression() const { - if (result.hasExpression()) { - Colour colourGuard(Colour::OriginalExpression); - stream << " "; - stream << result.getExpressionInMacro(); - stream << '\n'; - } - } - void printReconstructedExpression() const { - if (result.hasExpandedExpression()) { - stream << "with expansion:\n"; - Colour colourGuard(Colour::ReconstructedExpression); - stream << Column(result.getExpandedExpression()).indent(2) << '\n'; - } - } - void printMessage() const { - if (!messageLabel.empty()) - stream << messageLabel << ':' << '\n'; - for (auto const& msg : messages) { - // If this assertion is a warning ignore any INFO messages - if (printInfoMessages || msg.type != ResultWas::Info) - stream << Column(msg.message).indent(2) << '\n'; - } - } - void printSourceInfo() const { - Colour colourGuard(Colour::FileName); - stream << result.getSourceInfo() << ": "; - } - - std::ostream& stream; - AssertionStats const& stats; - AssertionResult const& result; - Colour::Code colour; - std::string passOrFail; - std::string messageLabel; - std::string message; - std::vector messages; - bool printInfoMessages; -}; - -std::size_t makeRatio(std::size_t number, std::size_t total) { - std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0; - return (ratio == 0 && number > 0) ? 1 : ratio; -} + void print() const { + printSourceInfo(); + if (stats.totals.assertions.total() > 0) { + printResultType(); + printOriginalExpression(); + printReconstructedExpression(); + } else { + stream << '\n'; + } + printMessage(); + } -std::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k) { - if (i > j && i > k) - return i; - else if (j > k) - return j; - else - return k; -} + private: + void printResultType() const { + if (!passOrFail.empty()) { + Colour colourGuard(colour); + stream << passOrFail << ":\n"; + } + } + void printOriginalExpression() const { + if (result.hasExpression()) { + Colour colourGuard(Colour::OriginalExpression); + stream << " "; + stream << result.getExpressionInMacro(); + stream << '\n'; + } + } + void printReconstructedExpression() const { + if (result.hasExpandedExpression()) { + stream << "with expansion:\n"; + Colour colourGuard(Colour::ReconstructedExpression); + stream << Column(result.getExpandedExpression()).indent(2) << '\n'; + } + } + void printMessage() const { + if (!messageLabel.empty()) + stream << messageLabel << ':' << '\n'; + for (auto const& msg : messages) { + // If this assertion is a warning ignore any INFO messages + if (printInfoMessages || msg.type != ResultWas::Info) + stream << Column(msg.message).indent(2) << '\n'; + } + } + void printSourceInfo() const { + Colour colourGuard(Colour::FileName); + stream << result.getSourceInfo() << ": "; + } -struct ColumnInfo { - enum Justification { Left, Right }; - std::string name; - int width; - Justification justification; -}; -struct ColumnBreak {}; -struct RowBreak {}; - -class Duration { - enum class Unit { - Auto, - Nanoseconds, - Microseconds, - Milliseconds, - Seconds, - Minutes - }; - static const uint64_t s_nanosecondsInAMicrosecond = 1000; - static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond; - static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond; - static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond; - - double m_inNanoseconds; - Unit m_units; - -public: - explicit Duration(double inNanoseconds, Unit units = Unit::Auto) - : m_inNanoseconds(inNanoseconds), - m_units(units) { - if (m_units == Unit::Auto) { - if (m_inNanoseconds < s_nanosecondsInAMicrosecond) - m_units = Unit::Nanoseconds; - else if (m_inNanoseconds < s_nanosecondsInAMillisecond) - m_units = Unit::Microseconds; - else if (m_inNanoseconds < s_nanosecondsInASecond) - m_units = Unit::Milliseconds; - else if (m_inNanoseconds < s_nanosecondsInAMinute) - m_units = Unit::Seconds; + std::ostream& stream; + AssertionStats const& stats; + AssertionResult const& result; + Colour::Code colour; + std::string passOrFail; + std::string messageLabel; + std::string message; + std::vector messages; + bool printInfoMessages; + }; + + std::size_t makeRatio(std::size_t number, std::size_t total) { + std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0; + return (ratio == 0 && number > 0) ? 1 : ratio; + } + + std::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k) { + if (i > j && i > k) + return i; + else if (j > k) + return j; else - m_units = Unit::Minutes; + return k; } - } + struct ColumnInfo { + enum Justification { Left, Right }; + std::string name; + int width; + Justification justification; + }; + struct ColumnBreak {}; + struct RowBreak {}; + + class Duration { + enum class Unit { + Auto, + Nanoseconds, + Microseconds, + Milliseconds, + Seconds, + Minutes + }; + static const uint64_t s_nanosecondsInAMicrosecond = 1000; + static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond; + static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond; + static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond; - auto value() const -> double { - switch (m_units) { - case Unit::Microseconds: - return m_inNanoseconds / static_cast(s_nanosecondsInAMicrosecond); - case Unit::Milliseconds: - return m_inNanoseconds / static_cast(s_nanosecondsInAMillisecond); - case Unit::Seconds: - return m_inNanoseconds / static_cast(s_nanosecondsInASecond); - case Unit::Minutes: - return m_inNanoseconds / static_cast(s_nanosecondsInAMinute); - default: - return m_inNanoseconds; - } - } - auto unitsAsString() const -> std::string { - switch (m_units) { - case Unit::Nanoseconds: - return "ns"; - case Unit::Microseconds: - return "us"; - case Unit::Milliseconds: - return "ms"; - case Unit::Seconds: - return "s"; - case Unit::Minutes: - return "m"; - default: - return "** internal error **"; - } + double m_inNanoseconds; + Unit m_units; - } - friend auto operator << (std::ostream& os, Duration const& duration) -> std::ostream& { - return os << duration.value() << ' ' << duration.unitsAsString(); - } -}; -} // end anon namespace + public: + explicit Duration(double inNanoseconds, Unit units = Unit::Auto) + : m_inNanoseconds(inNanoseconds), + m_units(units) { + if (m_units == Unit::Auto) { + if (m_inNanoseconds < s_nanosecondsInAMicrosecond) + m_units = Unit::Nanoseconds; + else if (m_inNanoseconds < s_nanosecondsInAMillisecond) + m_units = Unit::Microseconds; + else if (m_inNanoseconds < s_nanosecondsInASecond) + m_units = Unit::Milliseconds; + else if (m_inNanoseconds < s_nanosecondsInAMinute) + m_units = Unit::Seconds; + else + m_units = Unit::Minutes; + } -class TablePrinter { - std::ostream& m_os; - std::vector m_columnInfos; - std::ostringstream m_oss; - int m_currentColumn = -1; - bool m_isOpen = false; + } -public: - TablePrinter( std::ostream& os, std::vector columnInfos ) - : m_os( os ), - m_columnInfos( std::move( columnInfos ) ) {} + auto value() const -> double { + switch (m_units) { + case Unit::Microseconds: + return m_inNanoseconds / static_cast(s_nanosecondsInAMicrosecond); + case Unit::Milliseconds: + return m_inNanoseconds / static_cast(s_nanosecondsInAMillisecond); + case Unit::Seconds: + return m_inNanoseconds / static_cast(s_nanosecondsInASecond); + case Unit::Minutes: + return m_inNanoseconds / static_cast(s_nanosecondsInAMinute); + default: + return m_inNanoseconds; + } + } + auto unitsAsString() const -> std::string { + switch (m_units) { + case Unit::Nanoseconds: + return "ns"; + case Unit::Microseconds: + return "us"; + case Unit::Milliseconds: + return "ms"; + case Unit::Seconds: + return "s"; + case Unit::Minutes: + return "m"; + default: + return "** internal error **"; + } - auto columnInfos() const -> std::vector const& { - return m_columnInfos; - } + } + friend auto operator << (std::ostream& os, Duration const& duration) -> std::ostream& { + return os << duration.value() << ' ' << duration.unitsAsString(); + } + }; + } // end anon namespace - void open() { - if (!m_isOpen) { - m_isOpen = true; - *this << RowBreak(); + class TablePrinter { + std::ostream& m_os; + std::vector m_columnInfos; + std::ostringstream m_oss; + int m_currentColumn = -1; + bool m_isOpen = false; - Columns headerCols; - Spacer spacer(2); - for (auto const& info : m_columnInfos) { - headerCols += Column(info.name).width(static_cast(info.width - 2)); - headerCols += spacer; - } - m_os << headerCols << '\n'; + public: + TablePrinter( std::ostream& os, std::vector columnInfos ) + : m_os( os ), + m_columnInfos( std::move( columnInfos ) ) {} - m_os << Catch::getLineOfChars<'-'>() << '\n'; + auto columnInfos() const -> std::vector const& { + return m_columnInfos; } - } - void close() { - if (m_isOpen) { - *this << RowBreak(); - m_os << std::endl; - m_isOpen = false; - } - } - template - friend TablePrinter& operator << (TablePrinter& tp, T const& value) { - tp.m_oss << value; - return tp; - } - - friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) { - auto colStr = tp.m_oss.str(); - const auto strSize = colStr.size(); - tp.m_oss.str(""); - tp.open(); - if (tp.m_currentColumn == static_cast(tp.m_columnInfos.size() - 1)) { - tp.m_currentColumn = -1; - tp.m_os << '\n'; - } - tp.m_currentColumn++; - - auto colInfo = tp.m_columnInfos[tp.m_currentColumn]; - auto padding = (strSize + 1 < static_cast(colInfo.width)) - ? std::string(colInfo.width - (strSize + 1), ' ') - : std::string(); - if (colInfo.justification == ColumnInfo::Left) - tp.m_os << colStr << padding << ' '; - else - tp.m_os << padding << colStr << ' '; - return tp; - } + void open() { + if (!m_isOpen) { + m_isOpen = true; + *this << RowBreak(); - friend TablePrinter& operator << (TablePrinter& tp, RowBreak) { - if (tp.m_currentColumn > 0) { - tp.m_os << '\n'; - tp.m_currentColumn = -1; - } - return tp; - } -}; + Columns headerCols; + Spacer spacer(2); + for (auto const& info : m_columnInfos) { + headerCols += Column(info.name).width(static_cast(info.width - 2)); + headerCols += spacer; + } + m_os << headerCols << '\n'; -ConsoleReporter::ConsoleReporter(ReporterConfig const& config) - : StreamingReporterBase(config), - m_tablePrinter(new TablePrinter(config.stream(), - [&config]() -> std::vector { - if (config.fullConfig()->benchmarkNoAnalysis()) - { - return{ - { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left }, - { " samples", 14, ColumnInfo::Right }, - { " iterations", 14, ColumnInfo::Right }, - { " mean", 14, ColumnInfo::Right } - }; + m_os << Catch::getLineOfChars<'-'>() << '\n'; + } } - else - { - return{ - { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left }, - { "samples mean std dev", 14, ColumnInfo::Right }, - { "iterations low mean low std dev", 14, ColumnInfo::Right }, - { "estimated high mean high std dev", 14, ColumnInfo::Right } - }; + void close() { + if (m_isOpen) { + *this << RowBreak(); + m_os << std::endl; + m_isOpen = false; + } } - }())) {} -ConsoleReporter::~ConsoleReporter() = default; -std::string ConsoleReporter::getDescription() { - return "Reports test results as plain lines of text"; -} + template + friend TablePrinter& operator << (TablePrinter& tp, T const& value) { + tp.m_oss << value; + return tp; + } + + friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) { + auto colStr = tp.m_oss.str(); + const auto strSize = colStr.size(); + tp.m_oss.str(""); + tp.open(); + if (tp.m_currentColumn == static_cast(tp.m_columnInfos.size() - 1)) { + tp.m_currentColumn = -1; + tp.m_os << '\n'; + } + tp.m_currentColumn++; + + auto colInfo = tp.m_columnInfos[tp.m_currentColumn]; + auto padding = (strSize + 1 < static_cast(colInfo.width)) + ? std::string(colInfo.width - (strSize + 1), ' ') + : std::string(); + if (colInfo.justification == ColumnInfo::Left) + tp.m_os << colStr << padding << ' '; + else + tp.m_os << padding << colStr << ' '; + return tp; + } -void ConsoleReporter::noMatchingTestCases(std::string const& spec) { - stream << "No test cases matched '" << spec << '\'' << std::endl; -} + friend TablePrinter& operator << (TablePrinter& tp, RowBreak) { + if (tp.m_currentColumn > 0) { + tp.m_os << '\n'; + tp.m_currentColumn = -1; + } + return tp; + } + }; -void ConsoleReporter::reportInvalidArguments(std::string const&arg){ - stream << "Invalid Filter: " << arg << std::endl; -} + ConsoleReporter::ConsoleReporter(ReporterConfig const& config) + : StreamingReporterBase(config), + m_tablePrinter(new TablePrinter(config.stream(), + [&config]() -> std::vector { + if (config.fullConfig()->benchmarkNoAnalysis()) + { + return{ + { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left }, + { " samples", 14, ColumnInfo::Right }, + { " iterations", 14, ColumnInfo::Right }, + { " mean", 14, ColumnInfo::Right } + }; + } + else + { + return{ + { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left }, + { "samples mean std dev", 14, ColumnInfo::Right }, + { "iterations low mean low std dev", 14, ColumnInfo::Right }, + { "estimated high mean high std dev", 14, ColumnInfo::Right } + }; + } + }())) {} + ConsoleReporter::~ConsoleReporter() = default; -void ConsoleReporter::assertionStarting(AssertionInfo const&) {} + std::string ConsoleReporter::getDescription() { + return "Reports test results as plain lines of text"; + } -bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) { - AssertionResult const& result = _assertionStats.assertionResult; + void ConsoleReporter::noMatchingTestCases(std::string const& spec) { + stream << "No test cases matched '" << spec << '\'' << std::endl; + } - bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + void ConsoleReporter::reportInvalidArguments(std::string const&arg){ + stream << "Invalid Filter: " << arg << std::endl; + } - // Drop out if result was successful but we're not printing them. - if (!includeResults && result.getResultType() != ResultWas::Warning) - return false; + void ConsoleReporter::assertionStarting(AssertionInfo const&) {} - lazyPrint(); + bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) { + AssertionResult const& result = _assertionStats.assertionResult; - ConsoleAssertionPrinter printer(stream, _assertionStats, includeResults); - printer.print(); - stream << std::endl; - return true; -} + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + + // Drop out if result was successful but we're not printing them. + if (!includeResults && result.getResultType() != ResultWas::Warning) + return false; -void ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) { - m_tablePrinter->close(); - m_headerPrinted = false; - StreamingReporterBase::sectionStarting(_sectionInfo); -} -void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) { - m_tablePrinter->close(); - if (_sectionStats.missingAssertions) { lazyPrint(); - Colour colour(Colour::ResultError); - if (m_sectionStack.size() > 1) - stream << "\nNo assertions in section"; - else - stream << "\nNo assertions in test case"; - stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; - } - double dur = _sectionStats.durationInSeconds; - if (shouldShowDuration(*m_config, dur)) { - stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name << std::endl; + + ConsoleAssertionPrinter printer(stream, _assertionStats, includeResults); + printer.print(); + stream << std::endl; + return true; } - if (m_headerPrinted) { + + void ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) { + m_tablePrinter->close(); m_headerPrinted = false; + StreamingReporterBase::sectionStarting(_sectionInfo); + } + void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) { + m_tablePrinter->close(); + if (_sectionStats.missingAssertions) { + lazyPrint(); + Colour colour(Colour::ResultError); + if (m_sectionStack.size() > 1) + stream << "\nNo assertions in section"; + else + stream << "\nNo assertions in test case"; + stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; + } + double dur = _sectionStats.durationInSeconds; + if (shouldShowDuration(*m_config, dur)) { + stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name << std::endl; + } + if (m_headerPrinted) { + m_headerPrinted = false; + } + StreamingReporterBase::sectionEnded(_sectionStats); } - StreamingReporterBase::sectionEnded(_sectionStats); -} #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) -void ConsoleReporter::benchmarkPreparing(std::string const& name) { + void ConsoleReporter::benchmarkPreparing(std::string const& name) { lazyPrintWithoutClosingBenchmarkTable(); auto nameCol = Column(name).width(static_cast(m_tablePrinter->columnInfos()[0].width - 2)); @@ -16565,217 +16576,217 @@ void ConsoleReporter::benchmarkFailed(std::string const& error) { } #endif // CATCH_CONFIG_ENABLE_BENCHMARKING -void ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) { - m_tablePrinter->close(); - StreamingReporterBase::testCaseEnded(_testCaseStats); - m_headerPrinted = false; -} -void ConsoleReporter::testGroupEnded(TestGroupStats const& _testGroupStats) { - if (currentGroupInfo.used) { - printSummaryDivider(); - stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; - printTotals(_testGroupStats.totals); - stream << '\n' << std::endl; + void ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) { + m_tablePrinter->close(); + StreamingReporterBase::testCaseEnded(_testCaseStats); + m_headerPrinted = false; + } + void ConsoleReporter::testGroupEnded(TestGroupStats const& _testGroupStats) { + if (currentGroupInfo.used) { + printSummaryDivider(); + stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; + printTotals(_testGroupStats.totals); + stream << '\n' << std::endl; + } + StreamingReporterBase::testGroupEnded(_testGroupStats); + } + void ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) { + printTotalsDivider(_testRunStats.totals); + printTotals(_testRunStats.totals); + stream << std::endl; + StreamingReporterBase::testRunEnded(_testRunStats); + } + void ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) { + StreamingReporterBase::testRunStarting(_testInfo); + printTestFilters(); } - StreamingReporterBase::testGroupEnded(_testGroupStats); -} -void ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) { - printTotalsDivider(_testRunStats.totals); - printTotals(_testRunStats.totals); - stream << std::endl; - StreamingReporterBase::testRunEnded(_testRunStats); -} -void ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) { - StreamingReporterBase::testRunStarting(_testInfo); - printTestFilters(); -} -void ConsoleReporter::lazyPrint() { + void ConsoleReporter::lazyPrint() { - m_tablePrinter->close(); - lazyPrintWithoutClosingBenchmarkTable(); -} + m_tablePrinter->close(); + lazyPrintWithoutClosingBenchmarkTable(); + } -void ConsoleReporter::lazyPrintWithoutClosingBenchmarkTable() { + void ConsoleReporter::lazyPrintWithoutClosingBenchmarkTable() { - if (!currentTestRunInfo.used) - lazyPrintRunInfo(); - if (!currentGroupInfo.used) - lazyPrintGroupInfo(); + if (!currentTestRunInfo.used) + lazyPrintRunInfo(); + if (!currentGroupInfo.used) + lazyPrintGroupInfo(); - if (!m_headerPrinted) { - printTestCaseAndSectionHeader(); - m_headerPrinted = true; + if (!m_headerPrinted) { + printTestCaseAndSectionHeader(); + m_headerPrinted = true; + } } -} -void ConsoleReporter::lazyPrintRunInfo() { - stream << '\n' << getLineOfChars<'~'>() << '\n'; - Colour colour(Colour::SecondaryText); - stream << currentTestRunInfo->name - << " is a Catch v" << libraryVersion() << " host application.\n" - << "Run with -? for options\n\n"; + void ConsoleReporter::lazyPrintRunInfo() { + stream << '\n' << getLineOfChars<'~'>() << '\n'; + Colour colour(Colour::SecondaryText); + stream << currentTestRunInfo->name + << " is a Catch v" << libraryVersion() << " host application.\n" + << "Run with -? for options\n\n"; - if (m_config->rngSeed() != 0) - stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; + if (m_config->rngSeed() != 0) + stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; - currentTestRunInfo.used = true; -} -void ConsoleReporter::lazyPrintGroupInfo() { - if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1) { - printClosedHeader("Group: " + currentGroupInfo->name); - currentGroupInfo.used = true; + currentTestRunInfo.used = true; } -} -void ConsoleReporter::printTestCaseAndSectionHeader() { - assert(!m_sectionStack.empty()); - printOpenHeader(currentTestCaseInfo->name); + void ConsoleReporter::lazyPrintGroupInfo() { + if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1) { + printClosedHeader("Group: " + currentGroupInfo->name); + currentGroupInfo.used = true; + } + } + void ConsoleReporter::printTestCaseAndSectionHeader() { + assert(!m_sectionStack.empty()); + printOpenHeader(currentTestCaseInfo->name); - if (m_sectionStack.size() > 1) { - Colour colourGuard(Colour::Headers); + if (m_sectionStack.size() > 1) { + Colour colourGuard(Colour::Headers); - auto - it = m_sectionStack.begin() + 1, // Skip first section (test case) + auto + it = m_sectionStack.begin() + 1, // Skip first section (test case) itEnd = m_sectionStack.end(); - for (; it != itEnd; ++it) - printHeaderString(it->name, 2); - } + for (; it != itEnd; ++it) + printHeaderString(it->name, 2); + } - SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; + SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; - stream << getLineOfChars<'-'>() << '\n'; - Colour colourGuard(Colour::FileName); - stream << lineInfo << '\n'; - stream << getLineOfChars<'.'>() << '\n' << std::endl; -} + stream << getLineOfChars<'-'>() << '\n'; + Colour colourGuard(Colour::FileName); + stream << lineInfo << '\n'; + stream << getLineOfChars<'.'>() << '\n' << std::endl; + } -void ConsoleReporter::printClosedHeader(std::string const& _name) { - printOpenHeader(_name); - stream << getLineOfChars<'.'>() << '\n'; -} -void ConsoleReporter::printOpenHeader(std::string const& _name) { - stream << getLineOfChars<'-'>() << '\n'; - { - Colour colourGuard(Colour::Headers); - printHeaderString(_name); + void ConsoleReporter::printClosedHeader(std::string const& _name) { + printOpenHeader(_name); + stream << getLineOfChars<'.'>() << '\n'; + } + void ConsoleReporter::printOpenHeader(std::string const& _name) { + stream << getLineOfChars<'-'>() << '\n'; + { + Colour colourGuard(Colour::Headers); + printHeaderString(_name); + } } -} // if string has a : in first line will set indent to follow it on // subsequent lines -void ConsoleReporter::printHeaderString(std::string const& _string, std::size_t indent) { - std::size_t i = _string.find(": "); - if (i != std::string::npos) - i += 2; - else - i = 0; - stream << Column(_string).indent(indent + i).initialIndent(indent) << '\n'; -} + void ConsoleReporter::printHeaderString(std::string const& _string, std::size_t indent) { + std::size_t i = _string.find(": "); + if (i != std::string::npos) + i += 2; + else + i = 0; + stream << Column(_string).indent(indent + i).initialIndent(indent) << '\n'; + } -struct SummaryColumn { + struct SummaryColumn { - SummaryColumn( std::string _label, Colour::Code _colour ) - : label( std::move( _label ) ), - colour( _colour ) {} - SummaryColumn addRow( std::size_t count ) { - ReusableStringStream rss; - rss << count; - std::string row = rss.str(); - for (auto& oldRow : rows) { - while (oldRow.size() < row.size()) - oldRow = ' ' + oldRow; - while (oldRow.size() > row.size()) - row = ' ' + row; - } - rows.push_back(row); - return *this; - } + SummaryColumn( std::string _label, Colour::Code _colour ) + : label( std::move( _label ) ), + colour( _colour ) {} + SummaryColumn addRow( std::size_t count ) { + ReusableStringStream rss; + rss << count; + std::string row = rss.str(); + for (auto& oldRow : rows) { + while (oldRow.size() < row.size()) + oldRow = ' ' + oldRow; + while (oldRow.size() > row.size()) + row = ' ' + row; + } + rows.push_back(row); + return *this; + } - std::string label; - Colour::Code colour; - std::vector rows; + std::string label; + Colour::Code colour; + std::vector rows; -}; + }; -void ConsoleReporter::printTotals( Totals const& totals ) { - if (totals.testCases.total() == 0) { - stream << Colour(Colour::Warning) << "No tests ran\n"; - } else if (totals.assertions.total() > 0 && totals.testCases.allPassed()) { - stream << Colour(Colour::ResultSuccess) << "All tests passed"; - stream << " (" - << pluralise(totals.assertions.passed, "assertion") << " in " - << pluralise(totals.testCases.passed, "test case") << ')' - << '\n'; - } else { + void ConsoleReporter::printTotals( Totals const& totals ) { + if (totals.testCases.total() == 0) { + stream << Colour(Colour::Warning) << "No tests ran\n"; + } else if (totals.assertions.total() > 0 && totals.testCases.allPassed()) { + stream << Colour(Colour::ResultSuccess) << "All tests passed"; + stream << " (" + << pluralise(totals.assertions.passed, "assertion") << " in " + << pluralise(totals.testCases.passed, "test case") << ')' + << '\n'; + } else { - std::vector columns; - columns.push_back(SummaryColumn("", Colour::None) - .addRow(totals.testCases.total()) - .addRow(totals.assertions.total())); - columns.push_back(SummaryColumn("passed", Colour::Success) - .addRow(totals.testCases.passed) - .addRow(totals.assertions.passed)); - columns.push_back(SummaryColumn("failed", Colour::ResultError) - .addRow(totals.testCases.failed) - .addRow(totals.assertions.failed)); - columns.push_back(SummaryColumn("failed as expected", Colour::ResultExpectedFailure) - .addRow(totals.testCases.failedButOk) - .addRow(totals.assertions.failedButOk)); - - printSummaryRow("test cases", columns, 0); - printSummaryRow("assertions", columns, 1); + std::vector columns; + columns.push_back(SummaryColumn("", Colour::None) + .addRow(totals.testCases.total()) + .addRow(totals.assertions.total())); + columns.push_back(SummaryColumn("passed", Colour::Success) + .addRow(totals.testCases.passed) + .addRow(totals.assertions.passed)); + columns.push_back(SummaryColumn("failed", Colour::ResultError) + .addRow(totals.testCases.failed) + .addRow(totals.assertions.failed)); + columns.push_back(SummaryColumn("failed as expected", Colour::ResultExpectedFailure) + .addRow(totals.testCases.failedButOk) + .addRow(totals.assertions.failedButOk)); + + printSummaryRow("test cases", columns, 0); + printSummaryRow("assertions", columns, 1); + } + } + void ConsoleReporter::printSummaryRow(std::string const& label, std::vector const& cols, std::size_t row) { + for (auto col : cols) { + std::string value = col.rows[row]; + if (col.label.empty()) { + stream << label << ": "; + if (value != "0") + stream << value; + else + stream << Colour(Colour::Warning) << "- none -"; + } else if (value != "0") { + stream << Colour(Colour::LightGrey) << " | "; + stream << Colour(col.colour) + << value << ' ' << col.label; + } + } + stream << '\n'; } -} -void ConsoleReporter::printSummaryRow(std::string const& label, std::vector const& cols, std::size_t row) { - for (auto col : cols) { - std::string value = col.rows[row]; - if (col.label.empty()) { - stream << label << ": "; - if (value != "0") - stream << value; + + void ConsoleReporter::printTotalsDivider(Totals const& totals) { + if (totals.testCases.total() > 0) { + std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total()); + std::size_t failedButOkRatio = makeRatio(totals.testCases.failedButOk, totals.testCases.total()); + std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total()); + while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1) + findMax(failedRatio, failedButOkRatio, passedRatio)++; + while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1) + findMax(failedRatio, failedButOkRatio, passedRatio)--; + + stream << Colour(Colour::Error) << std::string(failedRatio, '='); + stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '='); + if (totals.testCases.allPassed()) + stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '='); else - stream << Colour(Colour::Warning) << "- none -"; - } else if (value != "0") { - stream << Colour(Colour::LightGrey) << " | "; - stream << Colour(col.colour) - << value << ' ' << col.label; + stream << Colour(Colour::Success) << std::string(passedRatio, '='); + } else { + stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '='); } + stream << '\n'; } - stream << '\n'; -} - -void ConsoleReporter::printTotalsDivider(Totals const& totals) { - if (totals.testCases.total() > 0) { - std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total()); - std::size_t failedButOkRatio = makeRatio(totals.testCases.failedButOk, totals.testCases.total()); - std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total()); - while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1) - findMax(failedRatio, failedButOkRatio, passedRatio)++; - while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1) - findMax(failedRatio, failedButOkRatio, passedRatio)--; - - stream << Colour(Colour::Error) << std::string(failedRatio, '='); - stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '='); - if (totals.testCases.allPassed()) - stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '='); - else - stream << Colour(Colour::Success) << std::string(passedRatio, '='); - } else { - stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '='); + void ConsoleReporter::printSummaryDivider() { + stream << getLineOfChars<'-'>() << '\n'; } - stream << '\n'; -} -void ConsoleReporter::printSummaryDivider() { - stream << getLineOfChars<'-'>() << '\n'; -} -void ConsoleReporter::printTestFilters() { - if (m_config->testSpec().hasFilters()) { - Colour guard(Colour::BrightYellow); - stream << "Filters: " << serializeFilters(m_config->getTestsOrTags()) << '\n'; + void ConsoleReporter::printTestFilters() { + if (m_config->testSpec().hasFilters()) { + Colour guard(Colour::BrightYellow); + stream << "Filters: " << serializeFilters(m_config->getTestsOrTags()) << '\n'; + } } -} -CATCH_REGISTER_REPORTER("console", ConsoleReporter) + CATCH_REGISTER_REPORTER("console", ConsoleReporter) } // end namespace Catch @@ -16789,11 +16800,11 @@ CATCH_REGISTER_REPORTER("console", ConsoleReporter) // end catch_reporter_console.cpp // start catch_reporter_junit.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/sstream" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/ctime" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/algorithm" -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/iomanip" +#include +#include +#include +#include +#include namespace Catch { @@ -16846,12 +16857,12 @@ namespace Catch { } // anonymous namespace JunitReporter::JunitReporter( ReporterConfig const& _config ) - : CumulativeReporterBase( _config ), - xml( _config.stream() ) - { - m_reporterPrefs.shouldRedirectStdOut = true; - m_reporterPrefs.shouldReportAllAssertions = true; - } + : CumulativeReporterBase( _config ), + xml( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = true; + m_reporterPrefs.shouldReportAllAssertions = true; + } JunitReporter::~JunitReporter() {} @@ -16920,13 +16931,13 @@ namespace Catch { auto properties = xml.scopedElement("properties"); if (m_config->hasTestFilters()) { xml.scopedElement("property") - .writeAttribute("name", "filters") - .writeAttribute("value", serializeFilters(m_config->getTestsOrTags())); + .writeAttribute("name", "filters") + .writeAttribute("value", serializeFilters(m_config->getTestsOrTags())); } if (m_config->rngSeed() != 0) { xml.scopedElement("property") - .writeAttribute("name", "random-seed") - .writeAttribute("value", m_config->rngSeed()); + .writeAttribute("name", "random-seed") + .writeAttribute("value", m_config->rngSeed()); } } @@ -16989,7 +17000,7 @@ namespace Catch { if (sectionNode.stats.assertions.failedButOk) { xml.scopedElement("skipped") - .writeAttribute("message", "TEST_CASE tagged with !mayfail"); + .writeAttribute("message", "TEST_CASE tagged with !mayfail"); } writeAssertions( sectionNode ); @@ -17026,7 +17037,7 @@ namespace Catch { elementName = "failure"; break; - // We should never see these here: + // We should never see these here: case ResultWas::Info: case ResultWas::Warning: case ResultWas::Ok: @@ -17075,7 +17086,7 @@ namespace Catch { // end catch_reporter_junit.cpp // start catch_reporter_listening.cpp -#include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cassert" +#include namespace Catch { @@ -17239,8 +17250,8 @@ namespace Catch { namespace Catch { XmlReporter::XmlReporter( ReporterConfig const& _config ) - : StreamingReporterBase( _config ), - m_xml(_config.stream()) + : StreamingReporterBase( _config ), + m_xml(_config.stream()) { m_reporterPrefs.shouldRedirectStdOut = true; m_reporterPrefs.shouldReportAllAssertions = true; @@ -17258,8 +17269,8 @@ namespace Catch { void XmlReporter::writeSourceInfo( SourceLineInfo const& sourceInfo ) { m_xml - .writeAttribute( "filename", sourceInfo.file ) - .writeAttribute( "line", sourceInfo.line ); + .writeAttribute( "filename", sourceInfo.file ) + .writeAttribute( "line", sourceInfo.line ); } void XmlReporter::noMatchingTestCases( std::string const& s ) { @@ -17278,21 +17289,21 @@ namespace Catch { m_xml.writeAttribute( "filters", serializeFilters( m_config->getTestsOrTags() ) ); if( m_config->rngSeed() != 0 ) m_xml.scopedElement( "Randomness" ) - .writeAttribute( "seed", m_config->rngSeed() ); + .writeAttribute( "seed", m_config->rngSeed() ); } void XmlReporter::testGroupStarting( GroupInfo const& groupInfo ) { StreamingReporterBase::testGroupStarting( groupInfo ); m_xml.startElement( "Group" ) - .writeAttribute( "name", groupInfo.name ); + .writeAttribute( "name", groupInfo.name ); } void XmlReporter::testCaseStarting( TestCaseInfo const& testInfo ) { StreamingReporterBase::testCaseStarting(testInfo); m_xml.startElement( "TestCase" ) - .writeAttribute( "name", trim( testInfo.name ) ) - .writeAttribute( "description", testInfo.description ) - .writeAttribute( "tags", testInfo.tagsAsString() ); + .writeAttribute( "name", trim( testInfo.name ) ) + .writeAttribute( "description", testInfo.description ) + .writeAttribute( "tags", testInfo.tagsAsString() ); writeSourceInfo( testInfo.lineInfo ); @@ -17305,7 +17316,7 @@ namespace Catch { StreamingReporterBase::sectionStarting( sectionInfo ); if( m_sectionDepth++ > 0 ) { m_xml.startElement( "Section" ) - .writeAttribute( "name", trim( sectionInfo.name ) ); + .writeAttribute( "name", trim( sectionInfo.name ) ); writeSourceInfo( sectionInfo.lineInfo ); m_xml.ensureTagClosed(); } @@ -17339,15 +17350,15 @@ namespace Catch { // Print the expression if there is one. if( result.hasExpression() ) { m_xml.startElement( "Expression" ) - .writeAttribute( "success", result.succeeded() ) - .writeAttribute( "type", result.getTestMacroName() ); + .writeAttribute( "success", result.succeeded() ) + .writeAttribute( "type", result.getTestMacroName() ); writeSourceInfo( result.getSourceInfo() ); m_xml.scopedElement( "Original" ) - .writeText( result.getExpression() ); + .writeText( result.getExpression() ); m_xml.scopedElement( "Expanded" ) - .writeText( result.getExpandedExpression() ); + .writeText( result.getExpandedExpression() ); } // And... Print a result applicable to each result type. @@ -17366,7 +17377,7 @@ namespace Catch { break; case ResultWas::Info: m_xml.scopedElement( "Info" ) - .writeText( result.getMessage() ); + .writeText( result.getMessage() ); break; case ResultWas::Warning: // Warning will already have been written @@ -17422,26 +17433,26 @@ namespace Catch { StreamingReporterBase::testGroupEnded( testGroupStats ); // TODO: Check testGroupStats.aborting and act accordingly. m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) - .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) - .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); + .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) + .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); m_xml.scopedElement( "OverallResultsCases") - .writeAttribute( "successes", testGroupStats.totals.testCases.passed ) - .writeAttribute( "failures", testGroupStats.totals.testCases.failed ) - .writeAttribute( "expectedFailures", testGroupStats.totals.testCases.failedButOk ); + .writeAttribute( "successes", testGroupStats.totals.testCases.passed ) + .writeAttribute( "failures", testGroupStats.totals.testCases.failed ) + .writeAttribute( "expectedFailures", testGroupStats.totals.testCases.failedButOk ); m_xml.endElement(); } void XmlReporter::testRunEnded( TestRunStats const& testRunStats ) { StreamingReporterBase::testRunEnded( testRunStats ); m_xml.scopedElement( "OverallResults" ) - .writeAttribute( "successes", testRunStats.totals.assertions.passed ) - .writeAttribute( "failures", testRunStats.totals.assertions.failed ) - .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); + .writeAttribute( "successes", testRunStats.totals.assertions.passed ) + .writeAttribute( "failures", testRunStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); m_xml.scopedElement( "OverallResultsCases") - .writeAttribute( "successes", testRunStats.totals.testCases.passed ) - .writeAttribute( "failures", testRunStats.totals.testCases.failed ) - .writeAttribute( "expectedFailures", testRunStats.totals.testCases.failedButOk ); + .writeAttribute( "successes", testRunStats.totals.testCases.passed ) + .writeAttribute( "failures", testRunStats.totals.testCases.failed ) + .writeAttribute( "expectedFailures", testRunStats.totals.testCases.failedButOk ); m_xml.endElement(); } @@ -17648,9 +17659,9 @@ int main (int argc, char * const argv[]) { #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) #define CATCH_BENCHMARK(...) \ - INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,)) + INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(C_A_T_C_H_B_E_N_C_H_), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,)) #define CATCH_BENCHMARK_ADVANCED(name) \ - INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name) + INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(C_A_T_C_H_B_E_N_C_H_), name) #endif // CATCH_CONFIG_ENABLE_BENCHMARKING // If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required @@ -17752,9 +17763,9 @@ int main (int argc, char * const argv[]) { #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) #define BENCHMARK(...) \ - INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,)) + INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(C_A_T_C_H_B_E_N_C_H_), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,)) #define BENCHMARK_ADVANCED(name) \ - INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name) + INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(C_A_T_C_H_B_E_N_C_H_), name) #endif // CATCH_CONFIG_ENABLE_BENCHMARKING using Catch::Detail::Approx; @@ -17801,8 +17812,8 @@ using Catch::Detail::Approx; #define CATCH_WARN( msg ) (void)(0) #define CATCH_CAPTURE( msg ) (void)(0) -#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) -#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ )) +#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ )) #define CATCH_METHOD_AS_TEST_CASE( method, ... ) #define CATCH_REGISTER_TEST_CASE( Function, ... ) (void)(0) #define CATCH_SECTION( ... ) @@ -17811,7 +17822,7 @@ using Catch::Detail::Approx; #define CATCH_FAIL_CHECK( ... ) (void)(0) #define CATCH_SUCCEED( ... ) (void)(0) -#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ )) #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR #define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) @@ -17834,8 +17845,8 @@ using Catch::Detail::Approx; #endif // "BDD-style" convenience wrappers -#define CATCH_SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) -#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className ) +#define CATCH_SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ )) +#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ), className ) #define CATCH_GIVEN( desc ) #define CATCH_AND_GIVEN( desc ) #define CATCH_WHEN( desc ) @@ -17883,10 +17894,10 @@ using Catch::Detail::Approx; #define INFO( msg ) (void)(0) #define UNSCOPED_INFO( msg ) (void)(0) #define WARN( msg ) (void)(0) -#define CAPTURE( msg ) (void)(0) +#define CAPTURE( ... ) (void)(0) -#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) -#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ )) +#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ )) #define METHOD_AS_TEST_CASE( method, ... ) #define REGISTER_TEST_CASE( Function, ... ) (void)(0) #define SECTION( ... ) @@ -17894,7 +17905,7 @@ using Catch::Detail::Approx; #define FAIL( ... ) (void)(0) #define FAIL_CHECK( ... ) (void)(0) #define SUCCEED( ... ) (void)(0) -#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ )) #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR #define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) @@ -17924,8 +17935,8 @@ using Catch::Detail::Approx; #define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) // "BDD-style" convenience wrappers -#define SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) ) -#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className ) +#define SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ) ) +#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ), className ) #define GIVEN( desc ) #define AND_GIVEN( desc ) @@ -17956,4 +17967,3 @@ using Catch::Detail::Approx; // end catch_reenable_warnings.h // end catch.hpp #endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED - From 2b4ab9ac97d90bd56daec9a2e7b7b7e275b96352 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 12:30:51 -0400 Subject: [PATCH 0247/1312] remove comment --- src/apps/molresponse/testing/CMakeLists.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/apps/molresponse/testing/CMakeLists.txt b/src/apps/molresponse/testing/CMakeLists.txt index ea67a767d00..d1c6b0f3469 100644 --- a/src/apps/molresponse/testing/CMakeLists.txt +++ b/src/apps/molresponse/testing/CMakeLists.txt @@ -23,13 +23,6 @@ add_mad_executable(generate_frequency "generate_frequency_data.cpp" "MADall_resp add_mad_executable(test-dev "test_development.cpp" "MADall_response;MADchem") # Add dependencies for MADchem -# Catch related things -# TODO catch breaks build ... finds cstdef with cpp17 and looks for mac cstdef -# // Check if byte is available and usable -# if __has_include() && defined(CATCH_CPP17_OR_GREATER) -# include "../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/c++/v1/cstddef" -# The above b - #a dd_mad_executable(database-test "database_testing.cpp" "MADall_response;MADchem") # add_mad_executable(mad-excited-symmetry-adapted "mad-excited-symmetry-adapted.cpp" "MADall_response;MADchem") From 3d807abb4411a63f1341831b88212984bc9c2043 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 12:44:36 -0400 Subject: [PATCH 0248/1312] add param.prefix --- src/madness/chem/SCF.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 94e0ce1b1ce..0ceb4e5e3e5 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -352,7 +352,7 @@ void SCF::load_mos(World& world) { amo.clear(); bmo.clear(); - archive::ParallelInputArchive ar(world, "restartdata"); + archive::ParallelInputArchive ar(world, param.prefix()+"restartdata"); /* File format: From 6b1b76094707caec8d657483fd757e83f1eddf96 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 12:52:47 -0400 Subject: [PATCH 0249/1312] white space fixes --- .../chem/QCCalculationParametersBase.cc | 273 +++++++++--------- 1 file changed, 137 insertions(+), 136 deletions(-) diff --git a/src/madness/chem/QCCalculationParametersBase.cc b/src/madness/chem/QCCalculationParametersBase.cc index 3719e724a2a..f1856f21e72 100644 --- a/src/madness/chem/QCCalculationParametersBase.cc +++ b/src/madness/chem/QCCalculationParametersBase.cc @@ -19,76 +19,76 @@ namespace madness { /// print all parameters - void QCCalculationParametersBase::print(const std::string header, - const std::string footer) const { - - std::string body=print_to_string(); - if (header.size()>0) madness::print(header); - ::madness::print(body); - if (footer.size()>0) madness::print(footer); - } - - std::string QCCalculationParametersBase::print_to_string(bool non_defaults_only) const { - - // sort parameters according to increasing print_order - typedef std::tuple keyvalT; - std::list list; - for (auto& p : parameters) list.push_back(keyvalT(p.second.get_print_order(),p.first,p.second)); - list.sort([](const keyvalT& first, const keyvalT& second) {return std::get<0>(first) < std::get<0>(second);}); - - std::stringstream ss; - int counter=0; - for (auto& p : list) { - const QCParameter& param=std::get<2>(p); - if (non_defaults_only and (param.precedence==QCParameter::def)) continue; - ss << param.print_line(std::get<1>(p)); - if (++counter0) madness::print(header); + ::madness::print(body); + if (footer.size()>0) madness::print(footer); +} + +std::string QCCalculationParametersBase::print_to_string(bool non_defaults_only) const { + + // sort parameters according to increasing print_order + typedef std::tuple keyvalT; + std::list list; + for (auto& p : parameters) list.push_back(keyvalT(p.second.get_print_order(),p.first,p.second)); + list.sort([](const keyvalT& first, const keyvalT& second) {return std::get<0>(first) < std::get<0>(second);}); + + std::stringstream ss; + int counter=0; + for (auto& p : list) { + const QCParameter& param=std::get<2>(p); + if (non_defaults_only and (param.precedence==QCParameter::def)) continue; + ss << param.print_line(std::get<1>(p)); + if (++counter>" << tag << "<< in file " << filename << std::endl; - errmsg=ss.str(); - } +void QCCalculationParametersBase::read_input(World& world, const std::string filename, const std::string tag) { + + std::string filecontents, line; + std::string errmsg; + if (world.rank()==0) { + try { + std::ifstream f(filename.c_str()); + while (std::getline(f, line)) filecontents += line + "\n"; + read_internal(world, filecontents, tag); + } catch (std::invalid_argument& e) { + errmsg=e.what(); + throw; + } catch (std::exception& e) { + std::stringstream ss; + ss << "could not read data group >>" << tag << "<< in file " << filename << std::endl; + errmsg=ss.str(); } - world.gop.broadcast_serializable(*this, 0); - if (errmsg.size()>0) throw std::runtime_error(errmsg); } + world.gop.broadcast_serializable(*this, 0); + if (errmsg.size()>0) throw std::runtime_error(errmsg); +} /// read the parameters from the command line and broadcast /// syntax is: qcprogram --mp2='maxiter 10; freeze 1' --dft:maxiter=20 --Xmpi:debug=true /// the argument in quotes is the value of the parser keys - void QCCalculationParametersBase::read_commandline_options(World& world, const commandlineparser& parser, - const std::string tag) { - if (not parser.key_exists(tag)) return; - std::string value=parser.value(tag); - // turn this into a fake input file - if (world.rank()==0) { - std::string q="'"; - std::replace_copy(value.begin(), value.end(), value.begin(), q.c_str()[0] , ' '); - std::replace_copy(value.begin(), value.end(), value.begin(), ';', '\n'); - value=tag+"\n"+value+"\nend"; +void QCCalculationParametersBase::read_commandline_options(World& world, const commandlineparser& parser, + const std::string tag) { + if (not parser.key_exists(tag)) return; + std::string value=parser.value(tag); + // turn this into a fake input file + if (world.rank()==0) { + std::string q="'"; + std::replace_copy(value.begin(), value.end(), value.begin(), q.c_str()[0] , ' '); + std::replace_copy(value.begin(), value.end(), value.begin(), ';', '\n'); + value=tag+"\n"+value+"\nend"; // print("value",value); - read_internal(world, value,tag); - } - world.gop.broadcast_serializable(*this, 0); - } + read_internal(world, value,tag); + } + world.gop.broadcast_serializable(*this, 0); +} @@ -96,85 +96,86 @@ namespace madness { /// only parameters that are defined in the constructor will be processed, /// all others will be discarded. - void QCCalculationParametersBase::read_internal(World& world, std::string& filecontents, std::string tag) { - std::stringstream f(filecontents); - position_stream_to_word(f, tag, '#', true, true); - std::string line, key,value; - - // read input lines - while (std::getline(f,line)) { - - // all in lower case - std::transform(line.begin(), line.end(), line.begin(), ::tolower); - - // remove comments from line - std::size_t last = line.find_first_of('#'); - line=line.substr(0,last); - std::replace_copy(line.begin(), line.end(), line.begin(),'=', ' '); - - std::stringstream sline(line); - - // sline might be empty by now - if (not (sline >> key)) continue; - if (print_debug) ::madness::print("reading key ",key); - - // skip comment line - if (key[0]=='#') continue; - if (key=="end") break; - - // check if key exists in the initialized parameter list - if (not (parameter_exists(key))) { - if (not ignore_unknown_keys) { - if (world.rank()==0) { - ::madness::print("found unknown key: ",key); - ::madness::print("in datagroup: ",tag); - } - throw std::runtime_error("input error"); +void QCCalculationParametersBase::read_internal(World& world, std::string& filecontents, std::string tag) { + std::stringstream f(filecontents); + position_stream_to_word(f, tag, '#', true, true); + std::string line, key,value; + + // read input lines + while (std::getline(f,line)) { + + // all in lower case + std::transform(line.begin(), line.end(), line.begin(), ::tolower); + + // remove comments from line + std::size_t last = line.find_first_of('#'); + line=line.substr(0,last); + std::replace_copy(line.begin(), line.end(), line.begin(),'=', ' '); + + std::stringstream sline(line); + + // sline might be empty by now + if (not (sline >> key)) continue; + if (print_debug) ::madness::print("reading key ",key); + + // skip comment line + if (key[0]=='#') continue; + if (key=="end") break; + + // check if key exists in the initialized parameter list + if (not (parameter_exists(key))) { + if (not ignore_unknown_keys) { + if (world.rank()==0) { + ::madness::print("found unknown key: ",key); + ::madness::print("in datagroup: ",tag); } - if ((not ignore_unknown_keys_silently) - and (world.rank()==0)) madness::print("ignoring unknown parameter in input file: ",key); - continue; + throw std::runtime_error("input error"); } + if ((not ignore_unknown_keys_silently) + and (world.rank()==0)) madness::print("ignoring unknown parameter in input file: ",key); + continue; + } + + std::string word,line1; + while (sline >> word) {line1+=word+" ";} + // trim result + last = line1.find_last_not_of(' '); + line1=line1.substr(0, last+1); + + + // check which type to expect from the given key + // this look clumsy, maybe there are more elegant solutions? + bool success=false; + try { + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value(key,line1) or success; + success=try_setting_user_defined_value >(key,line1) or success; + success=try_setting_user_defined_value >(key,line1) or success; + success=try_setting_user_defined_value >(key,line1) or success; + success=try_setting_user_defined_value >(key,line1) or success; + success=try_setting_user_defined_value >(key,line1) or success; + + } catch (std::invalid_argument& e) { + throw; + } catch (std::exception& e) { + std::string errmsg="found an error for key >> "+key+" << \n" +e.what(); + throw std::runtime_error(errmsg); + } + if (not success) { + madness::print("\n\ncould not assign the input parameter for key ",key); + std::string requested_type=get_parameter(key).get_type(); + madness::print("\trequested type: ",requested_type,"\n"); + madness::print("add the corresponding type to QCCalculationsParametersBase.h\n\n"); + throw std::invalid_argument("add the corresponding type to QCCalculationsParametersBase.h"); + } + } +}; - std::string word,line1; - while (sline >> word) {line1+=word+" ";} - // trim result - last = line1.find_last_not_of(' '); - line1=line1.substr(0, last+1); - - - // check which type to expect from the given key - // this look clumsy, maybe there are more elegant solutions? - bool success=false; - try { - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value(key,line1) or success; - success=try_setting_user_defined_value >(key,line1) or success; - success=try_setting_user_defined_value >(key,line1) or success; - success=try_setting_user_defined_value >(key,line1) or success; - success=try_setting_user_defined_value >(key,line1) or success; - success=try_setting_user_defined_value >(key,line1) or success; - - } catch (std::invalid_argument& e) { - throw; - } catch (std::exception& e) { - std::string errmsg="found an error for key >> "+key+" << \n" +e.what(); - throw std::runtime_error(errmsg); - } - if (not success) { - madness::print("\n\ncould not assign the input parameter for key ",key); - std::string requested_type=get_parameter(key).get_type(); - madness::print("\trequested type: ",requested_type,"\n"); - madness::print("add the corresponding type to QCCalculationsParametersBase.h\n\n"); - throw std::invalid_argument("add the corresponding type to QCCalculationsParametersBase.h"); - } - } - }; From 2124d65247cfffad3db5954e3221652d865776e8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 12:58:09 -0400 Subject: [PATCH 0250/1312] white space fixes --- .../chem/QCCalculationParametersBase.h | 1009 ++++++++--------- 1 file changed, 504 insertions(+), 505 deletions(-) diff --git a/src/madness/chem/QCCalculationParametersBase.h b/src/madness/chem/QCCalculationParametersBase.h index 0753ddcc868..982ea39c55f 100644 --- a/src/madness/chem/QCCalculationParametersBase.h +++ b/src/madness/chem/QCCalculationParametersBase.h @@ -25,92 +25,92 @@ namespace madness { using json =nlohmann::json; - template - static typename std::enable_if::value, void>::type - check_for_inf(const std::string& str, T& arg) { - std::string sinf; - std::stringstream ss; - ss << std::numeric_limits::infinity(); - sinf=ss.str(); - - if (sinf==str) arg=std::numeric_limits::infinity(); - } - - template - static typename std::enable_if::value, void>::type - check_for_inf(const std::string& str, T& arg) { - return; - } +template +static typename std::enable_if::value, void>::type +check_for_inf(const std::string& str, T& arg) { + std::string sinf; + std::stringstream ss; + ss << std::numeric_limits::infinity(); + sinf=ss.str(); + + if (sinf==str) arg=std::numeric_limits::infinity(); +} + +template +static typename std::enable_if::value, void>::type +check_for_inf(const std::string& str, T& arg) { + return; +} /// inverting the print method from print.h for std::vector /// TODO: move this where it belongs (into print.h ??) - template > - std::istream& operator>>(std::istream& is, std::vector& v) { - - // get the full line from opening to closing brackets [ .. ] - std::string word, line=""; - while (is >> word) { - line+=word; - if (word.find(']')!=std::string::npos) break; - } - if (line.size()!=0) is.clear(); - - // remove enclosing brackets and commas - auto find_c = [](char& c){ return ((c==',') or (c=='[') or (c==']')); }; - std::replace_if (line.begin(), line.end(), find_c, ' '); // 0 2 0 4 0 6 0 8 0 - - // stream the values into the container - std::stringstream sline(line); - T tmp; - while (sline >> word) { - std::stringstream sword(word); - sword >> tmp; - check_for_inf(word,tmp); - v.push_back(tmp); - } - if (sline.bad()) { - madness::print("error while reading vector from istream: "); - madness::print(line,"\n"); - throw std::runtime_error("IO error"); - } - - return is; - } +template > +std::istream& operator>>(std::istream& is, std::vector& v) { + + // get the full line from opening to closing brackets [ .. ] + std::string word, line=""; + while (is >> word) { + line+=word; + if (word.find(']')!=std::string::npos) break; + } + if (line.size()!=0) is.clear(); + + // remove enclosing brackets and commas + auto find_c = [](char& c){ return ((c==',') or (c=='[') or (c==']')); }; + std::replace_if (line.begin(), line.end(), find_c, ' '); // 0 2 0 4 0 6 0 8 0 + + // stream the values into the container + std::stringstream sline(line); + T tmp; + while (sline >> word) { + std::stringstream sword(word); + sword >> tmp; + check_for_inf(word,tmp); + v.push_back(tmp); + } + if (sline.bad()) { + madness::print("error while reading vector from istream: "); + madness::print(line,"\n"); + throw std::runtime_error("IO error"); + } + + return is; +} /// inverting the print method from print.h for std::vector /// TODO: move this where it belongs (into print.h ??) - template - std::istream& operator>>(std::istream& is, std::pair& p) { - - // get all words from the line - std::string word, line=""; - while (is >> word) { - line+=word + " "; - }; - // have to set this here to account for the error handling later.. - is.clear(); - - // remove enclosing brackets and commas - auto find_c = [](char& c){ return ((c==',') or (c=='(') or (c==')')); }; - std::replace_if (line.begin(), line.end(), find_c, ' '); // 0 2 0 4 0 6 0 8 0 - - // stream the values into the container - std::stringstream sline(line); - T tmp1; - Q tmp2; - sline >> tmp1 >> tmp2; - if (sline.bad() or sline.fail()) { - madness::print("error while reading vector from istream: "); - madness::print(line,"\n"); - throw std::runtime_error("IO error"); - } - p=std::pair(tmp1,tmp2); - - return is; - } +template +std::istream& operator>>(std::istream& is, std::pair& p) { + + // get all words from the line + std::string word, line=""; + while (is >> word) { + line+=word + " "; + }; + // have to set this here to account for the error handling later.. + is.clear(); + + // remove enclosing brackets and commas + auto find_c = [](char& c){ return ((c==',') or (c=='(') or (c==')')); }; + std::replace_if (line.begin(), line.end(), find_c, ' '); // 0 2 0 4 0 6 0 8 0 + + // stream the values into the container + std::stringstream sline(line); + T tmp1; + Q tmp2; + sline >> tmp1 >> tmp2; + if (sline.bad() or sline.fail()) { + madness::print("error while reading vector from istream: "); + madness::print(line,"\n"); + throw std::runtime_error("IO error"); + } + p=std::pair(tmp1,tmp2); + + return is; +} /// structure holding the value for a given parameter @@ -122,124 +122,123 @@ namespace madness { /// /// all values are stored as strings and must be converted to their respective types by the /// QCCalculationParametersBase class (see below) - struct QCParameter { - public: - QCParameter() {}; - - QCParameter(const std::string v, const std::string t, const std::string comment="", - const std::vector allowed_values1={}) - : default_value(v), type(t), comment(comment), allowed_values(allowed_values1) { - static int i=0; - print_order=i++; - set_all(); - } - - void set_derived_value(const std::string val) { - precedence=std::max(derived,precedence); - derived_value=val; - set_all(); - } - void set_user_defined_value(const std::string val) { - precedence=std::max(defined,precedence); - user_defined_value=val; - set_all(); - } - - bool is_user_defined() const { - return (precedence==defined); - } +struct QCParameter { +public: + QCParameter() {}; + + QCParameter(const std::string v, const std::string t, const std::string comment="", + const std::vector allowed_values1={}) + : default_value(v), type(t), comment(comment), allowed_values(allowed_values1) { + static int i=0; + print_order=i++; + set_all(); + } + + void set_derived_value(const std::string val) { + precedence=std::max(derived,precedence); + derived_value=val; + set_all(); + } + void set_user_defined_value(const std::string val) { + precedence=std::max(defined,precedence); + user_defined_value=val; + set_all(); + } + + bool is_user_defined() const { + return (precedence==defined); + } - std::string get_value() const {return value;} - std::string get_type() const {return type;} - std::string get_comment() const {return comment;} - std::string print_precedence() const { - if (precedence==def) return "default"; - if (precedence==derived) return "derived"; - if (precedence==defined) return "defined"; - std::stringstream sprecedence; - sprecedence << precedence; - throw std::runtime_error("unknown precedence in QCParameter"+sprecedence.str()); - return "darn"; - } + std::string get_value() const {return value;} + std::string get_type() const {return type;} + std::string get_comment() const {return comment;} + std::string print_precedence() const { + if (precedence==def) return "default"; + if (precedence==derived) return "derived"; + if (precedence==defined) return "defined"; + std::stringstream sprecedence; + sprecedence << precedence; + throw std::runtime_error("unknown precedence in QCParameter"+sprecedence.str()); + return "darn"; + } + + int get_print_order() const {return print_order;} + + std::string print_line(const std::string& key) const { + + auto fill_left = [](const int size, const std::string word) { + int nspaces=std::max(int(0),size-int(word.length())); + return std::string(nspaces, ' ')+word; + }; + auto fill_right = [](const int size, const std::string word) { + int nspaces=std::max(int(0),size-int(word.length())); + return word+std::string(nspaces, ' '); + }; + + std::string result=fill_left(20,key)+" "+fill_right(10,get_value()) + " # " + +fill_right(10,print_precedence()) + // +fill_right(5,get_type()) + + fill_right(45,get_comment()); + if (allowed_values.size()>0) { + using madness::operators::operator<<; + std::stringstream ss; + ss << allowed_values; + result+=ss.str(); + } + + // trim result + std::size_t last = result.find_last_not_of(' '); + return result.substr(0, last+1); + } + + template void serialize (Archive& ar) { + ar & value & default_value & derived_value & user_defined_value & type & null & + comment & allowed_values & print_order & precedence; + } + + enum {def, derived, defined} precedence=def; + + hashT hash() const { + return hash_value(value); + } - int get_print_order() const {return print_order;} +private: - std::string print_line(const std::string& key) const { + void set_all() { + value=default_value; + if (derived_value!=null) value=derived_value; + if (user_defined_value!=null) value=user_defined_value; + if (not check_allowed()) throw std::invalid_argument(not_allowed_errmsg()); + } - auto fill_left = [](const int size, const std::string word) { - int nspaces=std::max(int(0),size-int(word.length())); - return std::string(nspaces, ' ')+word; - }; - auto fill_right = [](const int size, const std::string word) { - int nspaces=std::max(int(0),size-int(word.length())); - return word+std::string(nspaces, ' '); - }; + bool check_allowed() { + if (allowed_values.size()==0) return true; + auto it = std::find(allowed_values.begin(), allowed_values.end(), value); + return (it!=allowed_values.end()); + } - std::string result=fill_left(20,key)+" "+fill_right(10,get_value()) + " # " - +fill_right(10,print_precedence()) - // +fill_right(5,get_type()) - + fill_right(45,get_comment()); - if (allowed_values.size()>0) { + std::string not_allowed_errmsg() const { using madness::operators::operator<<; - std::stringstream ss; - ss << allowed_values; - result+=ss.str(); - } - - // trim result - std::size_t last = result.find_last_not_of(' '); - return result.substr(0, last+1); - } - - template void serialize (Archive& ar) { - ar & value & default_value & derived_value & user_defined_value & type & null & - comment & allowed_values & print_order & precedence; - } - - enum {def, derived, defined} precedence=def; - - hashT hash() const { - return hash_value(value); - } - - private: - - void set_all() { - value=default_value; - if (derived_value!=null) value=derived_value; - if (user_defined_value!=null) value=user_defined_value; - if (not check_allowed()) throw std::invalid_argument(not_allowed_errmsg()); - } - - bool check_allowed() { - if (allowed_values.size()==0) return true; - auto it = std::find(allowed_values.begin(), allowed_values.end(), value); - return (it!=allowed_values.end()); - } - - std::string not_allowed_errmsg() const { - using madness::operators::operator<<; - std::stringstream ss; - ss<< allowed_values; - std::string errmsg="\ntrying to assign a value that's not allowed\n\n"; - errmsg+="\tuser-defined value: " + value + "\n"; - errmsg+="\tallowed values: " + ss.str() + "\n\n"; - return errmsg; - } - - - std::string value; - std::string default_value=""; - std::string derived_value=""; - std::string user_defined_value=""; - std::string type=""; - std::string null=""; - std::string comment=""; - std::vector allowed_values=std::vector(); - int print_order=0; // use this for printing the parameters in the same order as they are defined - - }; - + std::stringstream ss; + ss<< allowed_values; + std::string errmsg="\ntrying to assign a value that's not allowed\n\n"; + errmsg+="\tuser-defined value: " + value + "\n"; + errmsg+="\tallowed values: " + ss.str() + "\n\n"; + return errmsg; + } + + + std::string value; + std::string default_value=""; + std::string derived_value=""; + std::string user_defined_value=""; + std::string type=""; + std::string null=""; + std::string comment=""; + std::vector allowed_values=std::vector(); + int print_order=0; // use this for printing the parameters in the same order as they are defined + +}; /// class for holding the parameters for calculation @@ -255,139 +254,139 @@ namespace madness { /// parameters are kept in a map with key (string) and value (QCParameter), /// types are converted whenever a parameter is accessed (i.e. should not be /// done too frequently in an inner loop) - class QCCalculationParametersBase { - - public: - /// print all parameters - void print(const std::string header="", const std::string footer="") const; - - std::string print_to_string(bool non_defaults_only=false) const; - - template - T get(const std::string key) const { - const QCParameter& parameter=get_parameter(key); - MADNESS_ASSERT(check_type(key,parameter)); - if (std::is_same::value) { - return fromstring(add_quotes(parameter.get_value())); - } - return fromstring(parameter.get_value()); - } - - bool is_user_defined(std::string key) const { - return get_parameter(key).is_user_defined(); - } - - template void serialize (Archive& ar) { - ar & parameters & print_debug; - } - - hashT hash() const { - return hash_range(parameters.begin(), parameters.end()); - } - - protected: - - typedef std::map ParameterContainerT; - ParameterContainerT parameters; - - virtual void read_input_and_commandline_options(World& world, - const commandlineparser& parser, - const std::string tag) { - try { - read_input(world,parser.value("input"),tag); - } catch (std::invalid_argument& e) { - throw; - } catch (std::exception& e) { - print(e.what()); - } - read_commandline_options(world,parser,tag); - } - - private: - /// read the parameters from file - - /// only world.rank()==0 reads the input file and broadcasts to all other nodes, - /// so we don't need to serialize the ParameterMap - void read_input(World& world, const std::string filename, const std::string tag); - - void read_commandline_options(World& world, const commandlineparser& parser, const std::string tag); - - protected: - - bool print_debug=false; - bool ignore_unknown_keys=true; - bool ignore_unknown_keys_silently=false; - bool throw_if_datagroup_not_found=true; - - /// ctor for testing - QCCalculationParametersBase() {} - - /// copy ctor - QCCalculationParametersBase(const QCCalculationParametersBase& other) - : parameters(other.parameters) - , print_debug(other.print_debug) { - } - - /// destructor - virtual ~QCCalculationParametersBase() {} - - template - void initialize(const std::string& key, const T& value, const std::string comment="", - const std::vector allowed_values={}) { +class QCCalculationParametersBase { + +public: + /// print all parameters + void print(const std::string header="", const std::string footer="") const; + + std::string print_to_string(bool non_defaults_only=false) const; + + template + T get(const std::string key) const { + const QCParameter& parameter=get_parameter(key); + MADNESS_ASSERT(check_type(key,parameter)); + if (std::is_same::value) { + return fromstring(add_quotes(parameter.get_value())); + } + return fromstring(parameter.get_value()); + } + + bool is_user_defined(std::string key) const { + return get_parameter(key).is_user_defined(); + } - if (parameters.find(key)!=parameters.end()) { - madness::print("you cannot initialize a parameter twice: ",key); - throw std::runtime_error("initialization error"); - } + template void serialize (Archive& ar) { + ar & parameters & print_debug; + } - std::string svalue=tostring(value); - std::string type = std::type_index(typeid(T)).name(); - - // transform everything to lower case - std::string key_lower=key; - std::transform(key_lower.begin(), key_lower.end(), key_lower.begin(), ::tolower); - std::transform(svalue.begin(), svalue.end(), svalue.begin(), ::tolower); - std::vector av_lower_vec; - for (auto av : allowed_values) { - std::string av_lower=tostring(av); - std::transform(av_lower.begin(), av_lower.end(), av_lower.begin(), ::tolower); - av_lower_vec.push_back(av_lower); - } + hashT hash() const { + return hash_range(parameters.begin(), parameters.end()); + } - parameters.insert(std::make_pair - (std::string(key_lower),QCParameter(svalue,type,comment,av_lower_vec))); - } +protected: - public: - template - void set_derived_value(const std::string& key, const T& value) { + typedef std::map ParameterContainerT; + ParameterContainerT parameters; - QCParameter& parameter=get_parameter(key); - if (not check_type_silent(parameter)) { - throw std::runtime_error("type error in set_derived_value for key "+key); - } - parameter.set_derived_value(tostring(value)); + virtual void read_input_and_commandline_options(World& world, + const commandlineparser& parser, + const std::string tag) { + try { + read_input(world,parser.value("input"),tag); + } catch (std::invalid_argument& e) { + throw; + } catch (std::exception& e) { + print(e.what()); } + read_commandline_options(world,parser,tag); + } - ParameterContainerT get_all_parameters() const { - return parameters; - } +private: + /// read the parameters from file + + /// only world.rank()==0 reads the input file and broadcasts to all other nodes, + /// so we don't need to serialize the ParameterMap + void read_input(World& world, const std::string filename, const std::string tag); + + void read_commandline_options(World& world, const commandlineparser& parser, const std::string tag); + +protected: + + bool print_debug=false; + bool ignore_unknown_keys=true; + bool ignore_unknown_keys_silently=false; + bool throw_if_datagroup_not_found=true; + + /// ctor for testing + QCCalculationParametersBase() {} + + /// copy ctor + QCCalculationParametersBase(const QCCalculationParametersBase& other) + : parameters(other.parameters) + , print_debug(other.print_debug) { + } + + /// destructor + virtual ~QCCalculationParametersBase() {} + + template + void initialize(const std::string& key, const T& value, const std::string comment="", + const std::vector allowed_values={}) { + + if (parameters.find(key)!=parameters.end()) { + madness::print("you cannot initialize a parameter twice: ",key); + throw std::runtime_error("initialization error"); + } + + std::string svalue=tostring(value); + std::string type = std::type_index(typeid(T)).name(); + + // transform everything to lower case + std::string key_lower=key; + std::transform(key_lower.begin(), key_lower.end(), key_lower.begin(), ::tolower); + std::transform(svalue.begin(), svalue.end(), svalue.begin(), ::tolower); + std::vector av_lower_vec; + for (auto av : allowed_values) { + std::string av_lower=tostring(av); + std::transform(av_lower.begin(), av_lower.end(), av_lower.begin(), ::tolower); + av_lower_vec.push_back(av_lower); + } + + parameters.insert(std::make_pair + (std::string(key_lower),QCParameter(svalue,type,comment,av_lower_vec))); + } + +public: + template + void set_derived_value(const std::string& key, const T& value) { + + QCParameter& parameter=get_parameter(key); + if (not check_type_silent(parameter)) { + throw std::runtime_error("type error in set_derived_value for key "+key); + } + parameter.set_derived_value(tostring(value)); + } + + ParameterContainerT get_all_parameters() const { + return parameters; + } - protected: +protected: - template - bool try_setting_user_defined_value(const std::string& key, const std::string& val) { + template + bool try_setting_user_defined_value(const std::string& key, const std::string& val) { - if (not check_type_silent(get_parameter(key))) return false; + if (not check_type_silent(get_parameter(key))) return false; - if (print_debug) ::madness::print("key:",key,"will set type" ,std::type_index(typeid(T)).name()); - T value=fromstring(val); - set_user_defined_value(key,value); - return true; - } + if (print_debug) ::madness::print("key:",key,"will set type" ,std::type_index(typeid(T)).name()); + T value=fromstring(val); + set_user_defined_value(key,value); + return true; + } - public: +public: void from_json(const json& j) { for (auto [key, value]: j.items()) { QCParameter& parameter = get_parameter(key); @@ -489,201 +488,201 @@ namespace madness { return true; } - template - void set_user_defined_value(const std::string& key, const T& value) { - - QCParameter& parameter=get_parameter(key); - if (not check_type_silent(parameter)) { - throw std::runtime_error("type error in set_user_defined_value"); - } - - parameter.set_user_defined_value(tostring(value)); - } - protected: - - const QCParameter& get_parameter(const std::string key) const { - if (not parameter_exists(key)) { - throw std::runtime_error("could not find parameter for key "+key); - } - const QCParameter& parameter=parameters.find(key)->second; - return parameter; - } - - public: - QCParameter& get_parameter(const std::string key) { - if (not parameter_exists(key)) { - madness::print("\ncould not find parameter for key",key,"\n"); - throw std::runtime_error("could not find parameter for key "+key); - } - QCParameter& parameter=parameters.find(key)->second; - return parameter; - } - - bool parameter_exists(const std::string& key) const { - return (parameters.find(key)!=parameters.end()); - } - - - template - static bool check_type(const std::string key, const QCParameter& parameter) { - if (check_type_silent(parameter)) return true; - - madness::print("trying to get the wrong type in QCCalculationParametersBase"); - madness::print("key ",key); - madness::print("parameter type ",parameter.get_type()); - madness::print("setting type ",std::type_index(typeid(T)).name()); - madness::print("value ",parameter.get_value()); - return false; - } - - template - static bool check_type_silent(const QCParameter& parameter) { - return (parameter.get_type()==std::type_index(typeid(T)).name()); - } - - /// read the stream, starting from tag - - /// only parameters that are defined in the constructor will be processed, - /// all others will be discarded. - virtual void read_internal(World& world, std::string& filecontents, std::string tag); - - - static std::string tostring(const bool& arg) { - std::ostringstream ss; - ss << std::boolalpha << arg; - return ss.str(); - } - - template - static std::string tostring(const T& arg) { - using madness::operators::operator<<; - std::ostringstream ss; - - ss< - static typename std::enable_if::value, void>::type - overwrite_if_inf(std::string& str, const T& arg) { - if (std::isinf(arg)) { - std::stringstream ss; - ss << std::numeric_limits::infinity(); - str=ss.str(); - } - } - - template - static typename std::enable_if::value, void>::type - overwrite_if_inf(std::string& str, const T& arg) { - return; - } - - template - static typename std::enable_if::value, T>::type - fromstring(const std::string& arg) { - - std::stringstream ssvalue(arg); - - // if argument is std::string read the everything between possible double quotes - T result=read_quotes(ssvalue); - - bool type_conversion_failed=ssvalue.fail(); - - // check for infinity in floating point conversions - if (type_conversion_failed and (std::is_floating_point::value)) { - - const static T inf=std::numeric_limits::infinity(); - std::string sinf=tostring(inf); // repeat type conversion from above - if (sinf==arg) result=inf; - type_conversion_failed=false; - } - - if (type_conversion_failed) { - - std::string errmsg="error in type conversion for argument >> " + arg - + " << to type " + std::type_index(typeid(T)).name(); - throw std::runtime_error(errmsg); - } - - // check for trailing characters - std::string word; - while (ssvalue >> word) { - std::string errmsg="trailing characters in arguement >> " + arg + " <<"; - throw std::runtime_error(errmsg); - } - return result; - } - - template - static typename std::enable_if::value, T>::type - read_quotes(std::stringstream& ssvalue) { - T arg=ssvalue.str(); - T result; - - if (arg.find("\"")==std::string::npos) { // no double quotes found - ssvalue >> result; - - } else { // found double quotes - int counter=0; - while (counter<2) { - T tmp; - ssvalue >> tmp; - if (ssvalue.fail()) { - std::string errmsg="missing closing double quote in line >> " + arg; - throw std::runtime_error(errmsg); - } - result+=" "+tmp; - counter=std::count(result.begin(), result.end(), '"'); - } - - // use only the text between the double quotes - result=trim_blanks(trim_quotes(result)); - } - return result; - } - - static std::string trim_blanks(const std::string arg) { - std::size_t first=arg.find_first_not_of(' '); - std::size_t last=arg.find_last_not_of(' '); - return arg.substr(first,last-first+1); - } - - static std::string trim_quotes(const std::string arg) { - std::size_t first=arg.find_first_of('"'); - std::size_t last=arg.find_last_of('"'); - return arg.substr(first+1,last-first-1); - } - - static std::string add_quotes(const std::string arg) { - return "\""+arg+"\""; - } - - - template - static typename std::enable_if::value, T>::type - read_quotes(std::stringstream& ssvalue) { - T result; - ssvalue >> result; - return result; - } - - template - static typename std::enable_if::value, T>::type - fromstring(const std::string& arg) { - std::string str=arg; - std::transform(str.begin(), str.end(), str.begin(), ::tolower); - if (str=="true" or str=="1" or str=="yes") return true; - if (str=="false" or str=="0" or str=="no") return false; - std::string errmsg="error in type conversion for argument >> " + arg - + " << to type " + std::type_index(typeid(T)).name(); - throw std::runtime_error(errmsg); - return 0; - } + template + void set_user_defined_value(const std::string& key, const T& value) { + + QCParameter& parameter=get_parameter(key); + if (not check_type_silent(parameter)) { + throw std::runtime_error("type error in set_user_defined_value"); + } + + parameter.set_user_defined_value(tostring(value)); + } +protected: + + const QCParameter& get_parameter(const std::string key) const { + if (not parameter_exists(key)) { + throw std::runtime_error("could not find parameter for key "+key); + } + const QCParameter& parameter=parameters.find(key)->second; + return parameter; + } + +public: + QCParameter& get_parameter(const std::string key) { + if (not parameter_exists(key)) { + madness::print("\ncould not find parameter for key",key,"\n"); + throw std::runtime_error("could not find parameter for key "+key); + } + QCParameter& parameter=parameters.find(key)->second; + return parameter; + } + + bool parameter_exists(const std::string& key) const { + return (parameters.find(key)!=parameters.end()); + } + + + template + static bool check_type(const std::string key, const QCParameter& parameter) { + if (check_type_silent(parameter)) return true; + + madness::print("trying to get the wrong type in QCCalculationParametersBase"); + madness::print("key ",key); + madness::print("parameter type ",parameter.get_type()); + madness::print("setting type ",std::type_index(typeid(T)).name()); + madness::print("value ",parameter.get_value()); + return false; + } + + template + static bool check_type_silent(const QCParameter& parameter) { + return (parameter.get_type()==std::type_index(typeid(T)).name()); + } + + /// read the stream, starting from tag + + /// only parameters that are defined in the constructor will be processed, + /// all others will be discarded. + virtual void read_internal(World& world, std::string& filecontents, std::string tag); + + + static std::string tostring(const bool& arg) { + std::ostringstream ss; + ss << std::boolalpha << arg; + return ss.str(); + } + + template + static std::string tostring(const T& arg) { + using madness::operators::operator<<; + std::ostringstream ss; + + ss< + static typename std::enable_if::value, void>::type + overwrite_if_inf(std::string& str, const T& arg) { + if (std::isinf(arg)) { + std::stringstream ss; + ss << std::numeric_limits::infinity(); + str=ss.str(); + } + } + + template + static typename std::enable_if::value, void>::type + overwrite_if_inf(std::string& str, const T& arg) { + return; + } + + template + static typename std::enable_if::value, T>::type + fromstring(const std::string& arg) { + + std::stringstream ssvalue(arg); + + // if argument is std::string read the everything between possible double quotes + T result=read_quotes(ssvalue); + + bool type_conversion_failed=ssvalue.fail(); + + // check for infinity in floating point conversions + if (type_conversion_failed and (std::is_floating_point::value)) { + + const static T inf=std::numeric_limits::infinity(); + std::string sinf=tostring(inf); // repeat type conversion from above + if (sinf==arg) result=inf; + type_conversion_failed=false; + } + + if (type_conversion_failed) { + + std::string errmsg="error in type conversion for argument >> " + arg + + " << to type " + std::type_index(typeid(T)).name(); + throw std::runtime_error(errmsg); + } + + // check for trailing characters + std::string word; + while (ssvalue >> word) { + std::string errmsg="trailing characters in arguement >> " + arg + " <<"; + throw std::runtime_error(errmsg); + } + return result; + } + + template + static typename std::enable_if::value, T>::type + read_quotes(std::stringstream& ssvalue) { + T arg=ssvalue.str(); + T result; + + if (arg.find("\"")==std::string::npos) { // no double quotes found + ssvalue >> result; + + } else { // found double quotes + int counter=0; + while (counter<2) { + T tmp; + ssvalue >> tmp; + if (ssvalue.fail()) { + std::string errmsg="missing closing double quote in line >> " + arg; + throw std::runtime_error(errmsg); + } + result+=" "+tmp; + counter=std::count(result.begin(), result.end(), '"'); + } + + // use only the text between the double quotes + result=trim_blanks(trim_quotes(result)); + } + return result; + } + + static std::string trim_blanks(const std::string arg) { + std::size_t first=arg.find_first_not_of(' '); + std::size_t last=arg.find_last_not_of(' '); + return arg.substr(first,last-first+1); + } + + static std::string trim_quotes(const std::string arg) { + std::size_t first=arg.find_first_of('"'); + std::size_t last=arg.find_last_of('"'); + return arg.substr(first+1,last-first-1); + } + + static std::string add_quotes(const std::string arg) { + return "\""+arg+"\""; + } + + + template + static typename std::enable_if::value, T>::type + read_quotes(std::stringstream& ssvalue) { + T result; + ssvalue >> result; + return result; + } + + template + static typename std::enable_if::value, T>::type + fromstring(const std::string& arg) { + std::string str=arg; + std::transform(str.begin(), str.end(), str.begin(), ::tolower); + if (str=="true" or str=="1" or str=="yes") return true; + if (str=="false" or str=="0" or str=="no") return false; + std::string errmsg="error in type conversion for argument >> " + arg + + " << to type " + std::type_index(typeid(T)).name(); + throw std::runtime_error(errmsg); + return 0; + } }; @@ -692,4 +691,4 @@ namespace madness { } /* namespace madness */ -#endif /* SRC_APPS_CHEM_QCCALCULATIONPARAMETERSBASE_H_ */ \ No newline at end of file +#endif /* SRC_APPS_CHEM_QCCALCULATIONPARAMETERSBASE_H_ */ From a29fb1e3381251400c1c6846cd4e91dab21838bf Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 13:01:35 -0400 Subject: [PATCH 0251/1312] move the timings --- src/apps/molresponse/ResponseBase.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d24baa8421e..e976db6b6dd 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1610,9 +1610,9 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu size_t m = X.num_states(); size_t n = X.num_orbitals(); - molresponse::start_timer(world); if (world.size() > 1) { + molresponse::start_timer(world); LoadBalanceDeux<3> lb(world); for (unsigned int j = 0; j < n; ++j) { lb.add_tree(psi0[j], lbcost(1.0, 8.0), false); @@ -1631,7 +1631,6 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu lb.load_balance(load_balance); // default process map // We set the new_process_map - molresponse::start_timer(world); FunctionDefaults<3>::set_pmap(new_process_map);// set default to be new world.gop.fence(); @@ -1642,13 +1641,12 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu auto psi0_copy = copy(world, psi0, new_process_map, false); auto vf_copy = copy(world, vf, new_process_map, false); world.gop.fence();// then fence - molresponse::end_timer(world, "Gamma redist"); + molresponse::end_timer(world, "Gamma Orbital Load Balance"); return {X_copy, psi0_copy, vf_copy}; } else { // return a copy with the same process map since we only have one world return {X.copy(), copy(world, psi0), copy(world, vf)}; } - molresponse::end_timer(world, "Gamma compute load_balance_chi"); } void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, From e3e54c3820604614d20a34452e3bc7b23f871de5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 13:01:48 -0400 Subject: [PATCH 0252/1312] auto return zero vector --- src/apps/molresponse/testing/response_data_base.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp index 2d8ecacc6c7..896694e05e3 100644 --- a/src/apps/molresponse/testing/response_data_base.hpp +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -130,6 +130,7 @@ auto generate_dipole_frequencies(std::string molecule_name, std::string xc, } catch (const json::out_of_range &e) { std::cout << e.what() << std::endl; + return std::vector(0); // The molecule file exists in the database therefore it is okay to add to frequency.json } From a1262cf9df4d1e5ee5d161ab3fb04fb10bd5f7d1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 13:23:17 -0400 Subject: [PATCH 0253/1312] don't print all the data taht is added to scf_data class --- src/madness/chem/SCF.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 0ceb4e5e3e5..5535e72f71f 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -177,11 +177,11 @@ SCF::output_scf_info_schema(const int &iter, const std::map } void scf_data::add_data(std::map values) { - print("ADDING DATA"); + //print("ADDING DATA"); iter++; std::for_each(e_data.begin(), e_data.end(), [&values](auto &v) { - print(v.first, " : ", values[v.first]); + // print(v.first, " : ", values[v.first]); v.second.push_back(values[v.first]); }); } From e1fa3d009fdfabe1965650eb635d9d45f7ab2f76 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 14:35:01 -0400 Subject: [PATCH 0254/1312] fix paths --- src/apps/molresponse/ground_parameters.h | 2 +- src/apps/molresponse/response_parameters.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ground_parameters.h b/src/apps/molresponse/ground_parameters.h index b59a175f894..d60c1fae7bc 100644 --- a/src/apps/molresponse/ground_parameters.h +++ b/src/apps/molresponse/ground_parameters.h @@ -24,7 +24,7 @@ using namespace madness; class GroundStateCalculation { // Ground state parameters that are read in from archive - std::string inFile{"../restartdata"};///< Name of input archive to read in ground state + std::string inFile{"../moldft.restartdata"};///< Name of input archive to read in ground state bool spinrestricted{true}; ///< Indicates if ground state calc. was open or closed ///< shell unsigned int num_orbitals{}; ///< Number of orbitals in ground state diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index 939ebcab6a6..2a497103766 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -25,7 +25,7 @@ namespace madness { ResponseParameters(const ResponseParameters& other) = default; ResponseParameters() { - initialize("archive", "restartdata", + initialize("archive", "../moldft.restartdata", "file to read ground parameters from"); initialize("nwchem", false, "Using nwchem files for intelligent starting guess"); initialize("nwchem_dir", "none", From 26100f51008e1cbaefa104d1165c9cd8fe741b23 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 14:36:10 -0400 Subject: [PATCH 0255/1312] Update runners.hpp --- src/apps/molresponse/testing/runners.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index f52091cc7bf..59c6046ccb1 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -112,8 +112,8 @@ struct moldftSchema { xc(m_xc) { moldft_path = addPath(schema.xc_path, '/' + mol_name); - moldft_restart = addPath(moldft_path, "/restartdata.00000"); - calc_info_json_path = addPath(moldft_path, "/calc_info.json"); + moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); + calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); @@ -471,7 +471,7 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); } - r_params.set_user_defined_value("archive", std::string("../restartdata")); + //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(15)); r_params.set_user_defined_value("maxsub", size_t(10)); // if its too large then bad guess is very strong @@ -506,7 +506,7 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); } - r_params.set_user_defined_value("archive", std::string("../restartdata")); + //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(30)); r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); From 6315d1ca072b421d4a5dc67b9d76454d50ee0d68 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Sep 2022 17:52:35 -0400 Subject: [PATCH 0256/1312] param.prefix()."restartdata" --- src/madness/chem/SCF.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 5535e72f71f..44d37ab95f8 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -352,7 +352,7 @@ void SCF::load_mos(World& world) { amo.clear(); bmo.clear(); - archive::ParallelInputArchive ar(world, param.prefix()+"restartdata"); + archive::ParallelInputArchive ar(world, param.prefix()+".restartdata"); /* File format: From 273fd2da737fa4c11ebcbe69b0d538116dfd4bde Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 13:30:28 -0400 Subject: [PATCH 0257/1312] fence after copy --- src/apps/molresponse/response_functions.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index de52c434c00..914f1b7c4a5 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -273,6 +273,7 @@ namespace madness { std::transform(x.begin(), x.end(), result.x.begin(), [&world](auto xi) { return madness::copy(world, xi); }); + world.gop.fence(); return result; From 198efcf7f1d7350c32222ee5cdee8d7306025f86 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 13:43:53 -0400 Subject: [PATCH 0258/1312] world rank 0 does printing --- src/apps/molresponse/testing/runners.hpp | 38 ++++++++++++++++++------ 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 59c6046ccb1..5cd137a70da 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -416,7 +416,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo CalculationParameters param_calc; json calcInfo; if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { - std::cout<<"Reading Calc Info JSON"<> calcInfo; param_calc.from_json(calcInfo["parameters"]); @@ -428,17 +428,24 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // if parameters are different or if I want to run no matter what run // if I want to restart and if I can. restart - print("param1 != param_calc = ", param1 != param_calc); + if (world.rank() == 0) { + print("param1 != param_calc = ", param1 != param_calc); + } if (tryMOLDFT(param1, param_calc) || try_run) { - print("-------------Running moldft------------"); + if (world.rank() == 0) { + print("-------------Running moldft------------"); + } // if params are different run and if restart exists and if im asking to restar if (std::filesystem::exists(moldftSchema.moldft_restart) && restart) { param1.set_user_defined_value("restart", true); } + world.gop.fence(); + molresponse::write_test_input test_input(param1, "moldft.in", moldftSchema.mol_path);// molecule HF commandlineparser parser; parser.set_keyval("input", test_input.filename()); + world.gop.fence(); SCF calc(world, parser); calc.set_protocol<3>(world, 1e-4); MolecularEnergy ME(world, calc); @@ -763,15 +770,20 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr std::pair success{schema.moldft_path, false}; bool first = true; for (const auto &freq: schema.freq) { - print(success.second); + + if (world.rank() == 0) { + print(success.second); + } std::filesystem::current_path(schema.moldft_path); if (first) { first = false; } else if (success.second) { // if the previous run succeeded then set the restart path - print("restart_path", restart_path); restart_path = success.first; - print("restart_path = success.first", restart_path); + if (world.rank() == 0) { + print("restart_path", restart_path); + print("restart_path = success.first", restart_path); + } } else { throw Response_Convergence_Error{}; } @@ -779,7 +791,9 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr success = RunResponse(world, "response.in", freq, schema.op, schema.xc, schema.moldft_path, restart_path, high_prec); - print("Frequency ", freq, " completed"); + if (world.rank() == 0) { + print("Frequency ", freq, " completed"); + } } } @@ -795,14 +809,20 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, bool high_prec) { if (std::filesystem::is_directory(m_schema.moldft_path)) { - cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; + if(world.rank()==0){ + cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; + } } else {// create the file std::filesystem::create_directory(m_schema.moldft_path); + if(world.rank()==0){ cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" << m_schema.moldft_path << ":\n"; + } } std::filesystem::current_path(m_schema.moldft_path); - cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; + if(world.rank()==0) { + cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; + } runMOLDFT(world, m_schema, try_moldft, restart, high_prec); } From 8a95a043d55311958063e556d408c214699f45bb Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 13:44:28 -0400 Subject: [PATCH 0259/1312] add mpi barriers for debugging --- src/apps/molresponse/ResponseBase.cpp | 92 +++++++++++++++------------ 1 file changed, 50 insertions(+), 42 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index e976db6b6dd..85272707972 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -10,12 +10,12 @@ /// \param world /// \param params ResponseBase::ResponseBase(World &world, const CalcParams ¶ms) - : r_params(params.response_parameters), - molecule(params.molecule), - ground_calc(params.ground_calculation), - ground_orbitals(ground_calc.orbitals()), - ground_energies(ground_calc.get_energies()), - Chi(world, r_params.num_states(), r_params.num_orbitals()) { + : r_params(params.response_parameters), + molecule(params.molecule), + ground_calc(params.ground_calculation), + ground_orbitals(ground_calc.orbitals()), + ground_energies(ground_calc.get_energies()), + Chi(world, r_params.num_states(), r_params.num_orbitals()) { // Broadcast to all the other nodes world.gop.broadcast_serializable(r_params, 0); @@ -106,7 +106,7 @@ void ResponseBase::check_k(World &world, double thresh, int k) { /// \param world /// \return auto ResponseBase::ComputeHamiltonianPair(World &world) const --> std::pair, Tensor> { + -> std::pair, Tensor> { // Basic output if (r_params.print_level() >= 1) molresponse::start_timer(world); auto phi = ground_orbitals; @@ -314,7 +314,7 @@ void ResponseBase::load_balance_chi(World &world) { } auto ResponseBase::make_bsh_operators_response(World &world, double &shift, double &omega) const --> std::vector { + -> std::vector { if (r_params.print_level() >= 1) molresponse::start_timer(world); double tol = FunctionDefaults<3>::get_thresh(); @@ -345,10 +345,11 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, const XCOperator &xc, const std::string &calc_type) const -> X_space { - print("before start time ", r_params.print_level()); if (r_params.print_level() >= 1) { molresponse::start_timer(world); - print("------------compute theta x_________"); + if (world.rank() == 0) { + print("------------compute theta x_________"); + } } std::cout << "MPI BARRIER 3 " << std::endl; world.mpi.Barrier(); @@ -882,7 +883,7 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, XCOperator &xc, const std::string &calc_type) const --> std::tuple { + -> std::tuple { // compute bool compute_Y = calc_type == "full"; @@ -940,9 +941,8 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< bool compute_Y) const -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - print("------------compute VO[x]_________"); } - std::cout << "MPI BARRIER " << std::endl; + std::cout << "MPI BARRIER V0X " << std::endl; world.mpi.Barrier(); // Start a timer size_t m = X.num_states(); @@ -1050,6 +1050,8 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } + std::cout << "MPI BARRIER V0X END " << std::endl; + world.mpi.Barrier(); // Basic output // Done @@ -1098,7 +1100,8 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< } auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_space &g_chi, - const std::string &calc_type) -> residuals { + const std::string &calc_type) + -> residuals { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.X.size(); size_t n = chi.X.size_orbitals(); @@ -1134,7 +1137,8 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, NonLinearXsolver &kain_x_space, std::vector &Xvector, - std::vector &Xresidual) -> X_space { + std::vector &Xresidual) + -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); size_t n = chi.num_orbitals(); @@ -1544,7 +1548,7 @@ auto solid_harmonics(World &world, int n) -> std::map, real_fun 1.0 / std::sqrt((l + m + 1) * (l - m + 1)) * ((2 * l + 1) * z * result[std::vector{l, m}] - sqrt((l + m) * (l - m)) * (x * x + y * y + z * z) * - result[std::vector{l - 1, m}]); + result[std::vector{l - 1, m}]); } } @@ -1566,28 +1570,28 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct const response_space &x, const response_space &y) { // Get sizes // Check sizes and then run the algorithm - size_t m = x.size(); - auto xx = x.copy(); - auto yy = y.copy(); - auto phi0 = copy(world, orbitals); + //size_t m = x.size(); + // auto xx = x.copy(); + // auto yy = y.copy(); + // auto phi0 = copy(world, orbitals); + //world.gop.fence(); - xx.truncate_rf(); - yy.truncate_rf(); - truncate(world, phi0); + //xx.truncate_rf(); + // yy.truncate_rf(); + //truncate(world, phi0); + std::vector densities = zero_functions(world, x.size()); // Return container - std::vector densities = zero_functions(world, m); std::transform(x.begin(), x.end(), y.begin(), densities.begin(), - [&world, &phi0](auto x_alpha, auto y_alpha) { - auto dx = dot(world, x_alpha, phi0); + [&world, &orbitals](auto x_alpha, auto y_alpha) { + auto dx = dot(world, x_alpha, orbitals); world.gop.fence(); - auto dy = dot(world, phi0, y_alpha); + auto dy = dot(world, orbitals, y_alpha); return dx + dy; }); - truncate(world, densities); world.gop.fence(); - // Done! + //truncate(world, densities, FunctionDefaults<3>::get_thresh(), true); return densities; } @@ -1601,7 +1605,8 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct * @return */ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &input, - const double load_balance) -> gamma_orbitals { + const double load_balance) + -> gamma_orbitals { auto X = std::get<0>(input); auto psi0 = std::get<1>(input); @@ -1611,18 +1616,21 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu size_t n = X.num_orbitals(); if (world.size() > 1) { - molresponse::start_timer(world); LoadBalanceDeux<3> lb(world); for (unsigned int j = 0; j < n; ++j) { lb.add_tree(psi0[j], lbcost(1.0, 8.0), false); lb.add_tree(vf[j], lbcost(1.0, 8.0), false); } - for (unsigned int i = 0; i < m; ++i) { - for (unsigned int j = 0; j < n; ++j) { - // add a tree for orbitals - lb.add_tree(X.X[i][j], lbcost(1.0, 8.0), false); - lb.add_tree(X.Y[i][j], lbcost(1.0, 8.0), false); + + for (const auto &xi: X.X) { + for (const auto &xij: xi) { + lb.add_tree(xij, lbcost(1.0, 8.0), false); + } + } + for (const auto &yi: X.Y) { + for (const auto &yij: yi) { + lb.add_tree(yij, lbcost(1.0, 8.0), false); } } world.gop.fence(); @@ -1636,8 +1644,6 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu world.gop.fence(); // copy orbitals using new pmap auto X_copy = X.copy(new_process_map, false); - world.gop.fence();// then fence - auto psi0_copy = copy(world, psi0, new_process_map, false); auto vf_copy = copy(world, vf, new_process_map, false); world.gop.fence();// then fence @@ -1666,8 +1672,8 @@ void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, for (int axis = 0; axis < 3; ++axis) { // x y z functionT fdip = factoryT(world) - .functor(functorT(new madness::DipoleFunctor(axis))) - .initial_level(4); + .functor(functorT(new madness::DipoleFunctor(axis))) + .initial_level(4); dip(axis, _) = inner(world, x, mul_sparse(world, fdip, x, vtol)); // - ^2-^2-^2 for (int i = 0; i < nmo1; ++i) rsq(i) -= dip(axis, i) * dip(axis, i); @@ -1694,7 +1700,8 @@ void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, } auto ResponseBase::project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, - const Molecule &mol) -> vecfuncT { + const Molecule &mol) + -> vecfuncT { vecfuncT ao = vecfuncT(aobasis.nbf(mol)); for (int i = 0; i < aobasis.nbf(mol); ++i) { functorT aofunc(new madchem::AtomicBasisFunctor(aobasis.get_atomic_basis_function(mol, i))); @@ -1742,7 +1749,8 @@ void ResponseBase::print_inner(World &world, const std::string &name, const X_sp auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals, - const response_space &x) -> vector_real_function_3d { + const response_space &x) + -> vector_real_function_3d { // Get sizes size_t m = x.size(); From c0a67a8b320a8faeb4eca24251aab3d69eb5120d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 13:47:34 -0400 Subject: [PATCH 0260/1312] add mpi barriers for debugging --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5634da81e12..812d634eb6f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -120,10 +120,12 @@ void FrequencyResponse::iterate(World &world) { auto relative_max_bsh = relative_bsh.absmax(); Tensor polar = -2 * inner(Chi, PQ); + world.gop.fence(); // Todo add chi norm and chi_x function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, xij_norms, xij_res_norms, rho_norms, density_residuals); frequency_to_json(j_molresponse, iter, polar); + world.gop.fence(); if (r_params.print_level() >= 1) { @@ -279,8 +281,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bool compute_y = omega_n != 0.0; // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); + + std::cout << "MPI BARRIER After Theta X " << std::endl; + world.mpi.Barrier(); // compute residual X_space - print("BSH update iter = ", iteration); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); From 3aaf8731e4353bac6165fb46cb8239f2ae510c18 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 17:57:12 -0400 Subject: [PATCH 0261/1312] printing --- src/apps/molresponse/FrequencyResponse.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 812d634eb6f..d45a3692027 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -318,7 +318,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - print("--------------- BSH UPDATE RESPONSE------------------"); + if (world.rank()==0){ + print("--------------- BSH UPDATE RESPONSE------------------"); + } } size_t m = theta_X.X.size(); From c89ee52983da95fdf9bb151a8d296f39be91b909 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 17:57:26 -0400 Subject: [PATCH 0262/1312] sleep for debugging --- src/apps/molresponse/testing/mad-freq.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 13053fb83d2..b4773113a00 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -31,6 +31,7 @@ auto main(int argc, char *argv[]) -> int { int result = 0; world.gop.fence(); startup(world, argc, argv); + sleep(10); std::cout.precision(6); From 31f43cd75d3af4aed8a3245621f155404f7f4b2a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 18:00:59 -0400 Subject: [PATCH 0263/1312] printing for debugging --- src/apps/molresponse/ResponseBase.cpp | 59 +++++++++++++++++++++------ 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 85272707972..29378fee48f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -592,13 +592,32 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); + for (const auto &xi: d_alpha.X) { + for (const auto &xij: xi) { + + print("xij", xij.max_depth()," ",(void*)xij.get_impl().get()); + } + } + for (const auto &yi: d_alpha.Y) { + for (const auto &yij: yi) { + print("yij", yij.max_depth()," ",(void*)yij.get_impl().get()); + } + } + + for (const auto &pi: phi0) { + print("orbitals", pi.max_depth()," ",(void*)pi.get_impl().get()); + } + + std::cout << "MPI After Load Balancing " << std::endl; + world.mpi.Barrier(); + size_t num_states = d_alpha.num_states(); size_t num_orbitals = d_alpha.num_orbitals(); // shallow copy if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space gamma(world, num_states, num_orbitals); - // x functions // here I create the orbital products for elctron interaction terms vecfuncT phi_phi; vecfuncT x_phi; @@ -608,6 +627,10 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens X_space J(world, num_states, num_orbitals); X_space KX(world, num_states, num_orbitals); X_space KY(world, num_states, num_orbitals); + + std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; + world.mpi.Barrier(); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } @@ -1571,25 +1594,35 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct // Get sizes // Check sizes and then run the algorithm //size_t m = x.size(); - // auto xx = x.copy(); - // auto yy = y.copy(); - // auto phi0 = copy(world, orbitals); + // auto xx = x.copy(); + // auto yy = y.copy(); + // auto phi0 = copy(world, orbitals); //world.gop.fence(); //xx.truncate_rf(); - // yy.truncate_rf(); + // yy.truncate_rf(); //truncate(world, phi0); - std::vector densities = zero_functions(world, x.size()); + std::vector densities = zero_functions(world, x.size(), true); // Return container + auto compute_density = [&world, &orbitals](const auto& x_alpha,const auto &y_alpha) { + for (const auto &xij: x_alpha) { + print("xij !!", xij.max_depth()," ",(void*)xij.get_impl().get()); + } + auto dx = dot(world, x_alpha, orbitals, true); + for (const auto &yij: y_alpha) { + print("yij !!", yij.max_depth()," ",(void*)yij.get_impl().get()); + } + auto dy = dot(world, orbitals, y_alpha, true); + return dx + dy; + }; + + for (const auto &phi_i: orbitals) { + print("phi_i !!", phi_i.max_depth()," ",(void*)phi_i.get_impl().get()); + } std::transform(x.begin(), x.end(), y.begin(), densities.begin(), - [&world, &orbitals](auto x_alpha, auto y_alpha) { - auto dx = dot(world, x_alpha, orbitals); - world.gop.fence(); - auto dy = dot(world, orbitals, y_alpha); - return dx + dy; - }); + compute_density); world.gop.fence(); //truncate(world, densities, FunctionDefaults<3>::get_thresh(), true); return densities; @@ -1648,7 +1681,7 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu auto vf_copy = copy(world, vf, new_process_map, false); world.gop.fence();// then fence molresponse::end_timer(world, "Gamma Orbital Load Balance"); - return {X_copy, psi0_copy, vf_copy}; + return {X_copy.copy(), copy(world,psi0_copy), copy(world,vf_copy)}; } else { // return a copy with the same process map since we only have one world return {X.copy(), copy(world, psi0), copy(world, vf)}; From 9a3c349136c6f3e5a48df0ce8eee408219f982c2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 18:32:31 -0400 Subject: [PATCH 0264/1312] fence individual copy with pmap --- src/apps/molresponse/ResponseBase.cpp | 113 ++++++++++++-------------- src/apps/molresponse/ResponseBase.hpp | 4 +- 2 files changed, 55 insertions(+), 62 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 29378fee48f..7444c0deb2f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -385,11 +385,11 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (calc_type == "full") { - gamma = compute_gamma_full(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); } else if (calc_type == "static") { - gamma = compute_gamma_static(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); @@ -415,7 +415,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit const XCOperator &xc) const -> X_space { std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); - auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); + auto [d_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); size_t num_states = d_alpha.num_states(); size_t num_orbitals = d_alpha.num_orbitals(); @@ -425,7 +425,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // copy old pmap truncate(world, phi0); - truncate(world, vf); d_alpha.truncate(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -501,11 +500,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit x = d_alpha.X[b]; y = d_alpha.Y[b]; // |x> - KX.X[b] = newK(x, phi0, vf); - KY.X[b] = newK(phi0, y, vf); + KX.X[b] = newK(x, phi0, phi0); + KY.X[b] = newK(phi0, y, phi0); // |y> - KY.Y[b] = newK(y, phi0, vf); - KX.Y[b] = newK(phi0, x, vf); + KY.Y[b] = newK(y, phi0, phi0); + KX.Y[b] = newK(phi0, x, phi0); // |i> } if (r_params.print_level() >= 1) { @@ -569,7 +568,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit d_alpha.clear(); phi0.clear(); - vf.clear(); if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! @@ -582,37 +580,38 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // Get sizes } -auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &density, +auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gammaOrbitals, const XCOperator &xc) const -> X_space { - // X contains the response vector that makes up the response density at a + // X contains the response vector that makes up the response gammaOrbitals at a // given order std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); - auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); + auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); - for (const auto &xi: d_alpha.X) { + + for (const auto &xi: xy.X) { for (const auto &xij: xi) { - print("xij", xij.max_depth()," ",(void*)xij.get_impl().get()); + print("xij", xij.max_depth(), " ", (void *) xij.get_impl().get()); } } - for (const auto &yi: d_alpha.Y) { + for (const auto &yi: xy.Y) { for (const auto &yij: yi) { - print("yij", yij.max_depth()," ",(void*)yij.get_impl().get()); + print("yij", yij.max_depth(), " ", (void *) yij.get_impl().get()); } } for (const auto &pi: phi0) { - print("orbitals", pi.max_depth()," ",(void*)pi.get_impl().get()); + print("orbitals", pi.max_depth(), " ", (void *) pi.get_impl().get()); } std::cout << "MPI After Load Balancing " << std::endl; world.mpi.Barrier(); - size_t num_states = d_alpha.num_states(); - size_t num_orbitals = d_alpha.num_orbitals(); + size_t num_states = xy.num_states(); + size_t num_orbitals = xy.num_orbitals(); // shallow copy if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -638,7 +637,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto rho = transition_density(world, phi0, d_alpha.X, d_alpha.X); + auto rho = transition_density(world, phi0, xy.X, xy.X); // Create Coulomb potential on ground_orbitals auto compute_jx = [&, &phi0 = phi0](auto rho_alpha) { @@ -660,7 +659,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens return mul(world, xc_rho, phi0); }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // for every transition density apply the exchange kernel and multiply the + // for every transition gammaOrbitals apply the exchange kernel and multiply the // vector of orbitals std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); W.Y = W.X.copy(); @@ -674,12 +673,12 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens for (size_t b = 0; b < num_states; b++) { vecfuncT x, y; - x = d_alpha.X[b]; - y = d_alpha.Y[b]; + x = xy.X[b]; + y = xy.Y[b]; // |x> - KX.X[b] = newK(x, phi0, vf); + KX.X[b] = newK(x, phi0, phi0); // |i> - KY.X[b] = newK(phi0, y, vf); + KY.X[b] = newK(phi0, y, phi0); // |y> } @@ -717,9 +716,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens KX.clear(); KY.clear(); W.clear(); - d_alpha.clear(); + xy.clear(); phi0.clear(); - vf.clear(); if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! @@ -739,7 +737,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density, const XCOperator &xc) const -> X_space { - auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); + auto [d_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); std::shared_ptr>> oldpmap = FunctionDefaults<3>::get_pmap(); size_t num_states = d_alpha.num_states(); size_t num_orbitals = d_alpha.num_orbitals(); @@ -793,7 +791,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density for (size_t b = 0; b < num_states; b++) { vecfuncT x; x = d_alpha.X[b]; - k1_x[b] = newK(x, phi0, vf); + k1_x[b] = newK(x, phi0, phi0); } if (r_params.print_level() >= 1) { @@ -834,7 +832,6 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density d_alpha.clear(); phi0.clear(); - vf.clear(); if (world.size() > 1) { FunctionDefaults<3>::set_pmap(oldpmap);// ! DON'T FORGET ! @@ -881,11 +878,11 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator // compute if (calc_type == "full") { - gamma = compute_gamma_full(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); } else if (calc_type == "static") { - gamma = compute_gamma_static(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); } if (r_params.print_level() >= 5) { print(""); @@ -940,11 +937,11 @@ auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, X_space gamma; // compute if (calc_type == "full") { - gamma = compute_gamma_full(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); } else if (calc_type == "static") { - gamma = compute_gamma_static(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); } X_space Lambda_X(world, m, n);// = X_space(world, chi.num_states(), chi.num_orbitals()); @@ -1605,21 +1602,20 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct std::vector densities = zero_functions(world, x.size(), true); // Return container - auto compute_density = [&world, &orbitals](const auto& x_alpha,const auto &y_alpha) { - - for (const auto &xij: x_alpha) { - print("xij !!", xij.max_depth()," ",(void*)xij.get_impl().get()); + auto compute_density = [&world, &orbitals](const auto &x_alpha, const auto &y_alpha) { + for (const auto &xij: x_alpha) { + print("xij !!", xij.max_depth(), " ", (void *) xij.get_impl().get()); } auto dx = dot(world, x_alpha, orbitals, true); - for (const auto &yij: y_alpha) { - print("yij !!", yij.max_depth()," ",(void*)yij.get_impl().get()); - } + for (const auto &yij: y_alpha) { + print("yij !!", yij.max_depth(), " ", (void *) yij.get_impl().get()); + } auto dy = dot(world, orbitals, y_alpha, true); return dx + dy; }; for (const auto &phi_i: orbitals) { - print("phi_i !!", phi_i.max_depth()," ",(void*)phi_i.get_impl().get()); + print("phi_i !!", phi_i.max_depth(), " ", (void *) phi_i.get_impl().get()); } std::transform(x.begin(), x.end(), y.begin(), densities.begin(), compute_density); @@ -1637,13 +1633,12 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct * @param load_balance * @return */ -auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &input, +auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &gammaOrbitals, const double load_balance) -> gamma_orbitals { - auto X = std::get<0>(input); - auto psi0 = std::get<1>(input); - auto vf = std::get<2>(input); + auto X = std::get<0>(gammaOrbitals); + auto psi0 = std::get<1>(gammaOrbitals); size_t m = X.num_states(); size_t n = X.num_orbitals(); @@ -1651,11 +1646,10 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu if (world.size() > 1) { molresponse::start_timer(world); LoadBalanceDeux<3> lb(world); - for (unsigned int j = 0; j < n; ++j) { - lb.add_tree(psi0[j], lbcost(1.0, 8.0), false); - lb.add_tree(vf[j], lbcost(1.0, 8.0), false); - } + for (const auto &phi0_i: psi0) { + lb.add_tree(phi0_i, lbcost(1.0, 8.0), false); + } for (const auto &xi: X.X) { for (const auto &xij: xi) { lb.add_tree(xij, lbcost(1.0, 8.0), false); @@ -1668,7 +1662,7 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu } world.gop.fence(); // newpamap is the new pmap just based on the orbitals - std::shared_ptr>> new_process_map = + auto new_process_map = lb.load_balance(load_balance); // default process map // We set the new_process_map @@ -1676,15 +1670,14 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu world.gop.fence(); // copy orbitals using new pmap - auto X_copy = X.copy(new_process_map, false); - auto psi0_copy = copy(world, psi0, new_process_map, false); - auto vf_copy = copy(world, vf, new_process_map, false); - world.gop.fence();// then fence + auto X_copy = X.copy(new_process_map, true); + auto psi0_copy = copy(world, psi0, new_process_map, true); + molresponse::end_timer(world, "Gamma Orbital Load Balance"); - return {X_copy.copy(), copy(world,psi0_copy), copy(world,vf_copy)}; + return {X_copy, psi0_copy}; } else { // return a copy with the same process map since we only have one world - return {X.copy(), copy(world, psi0), copy(world, vf)}; + return {X.copy(), copy(world, psi0)}; } } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 1cea35c9d66..adc8d9d83c2 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -48,7 +48,7 @@ struct residuals { }; -using gamma_orbitals = std::tuple; +using gamma_orbitals = std::tuple; class ResponseBase { public: @@ -385,7 +385,7 @@ class ResponseTester { static X_space compute_gamma_full(World &world, ResponseBase *p, double thresh) { XCOperator xc = p->make_xc_operator(world); X_space gamma = - p->compute_gamma_full(world, {p->Chi, p->ground_orbitals, p->ground_orbitals}, xc); + p->compute_gamma_full(world, {p->Chi, p->ground_orbitals}, xc); return gamma; } From 9b778377a17ffc12451f4b03a075cb006c526abd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 18:34:27 -0400 Subject: [PATCH 0265/1312] comment out debug printing and mpi barriers --- src/apps/molresponse/ResponseBase.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7444c0deb2f..7acd0f6976c 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -351,13 +351,13 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, print("------------compute theta x_________"); } } - std::cout << "MPI BARRIER 3 " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER 3 " << std::endl; + // world.mpi.Barrier(); bool compute_Y = calc_type == "full"; X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); - std::cout << "MPI BARRIER 4 " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER 4 " << std::endl; + // world.mpi.Barrier(); // compute if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_Y); @@ -591,6 +591,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); + /* for (const auto &xi: xy.X) { for (const auto &xij: xi) { @@ -606,9 +607,10 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm for (const auto &pi: phi0) { print("orbitals", pi.max_depth(), " ", (void *) pi.get_impl().get()); } + */ - std::cout << "MPI After Load Balancing " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI After Load Balancing " << std::endl; + // world.mpi.Barrier(); size_t num_states = xy.num_states(); size_t num_orbitals = xy.num_orbitals(); @@ -627,8 +629,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm X_space KX(world, num_states, num_orbitals); X_space KY(world, num_states, num_orbitals); - std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; + // world.mpi.Barrier(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); @@ -962,8 +964,9 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - std::cout << "MPI BARRIER V0X " << std::endl; - world.mpi.Barrier(); + + // // std::cout << "MPI BARRIER V0X " << std::endl; + // // world.mpi.Barrier(); // Start a timer size_t m = X.num_states(); size_t n = X.num_orbitals(); @@ -1070,8 +1073,8 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } - std::cout << "MPI BARRIER V0X END " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER V0X END " << std::endl; + // world.mpi.Barrier(); // Basic output // Done From ff7094b0d91913f838fdc5749e0098a9c2b1f78b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 20:12:49 -0400 Subject: [PATCH 0266/1312] cleaning up --- src/apps/molresponse/FrequencyResponse.cpp | 18 +- src/apps/molresponse/ResponseBase.cpp | 7 +- .../molresponse/testing/full_excited_test.cpp | 4 +- .../testing/full_frequency_test.cpp | 6 +- .../molresponse/testing/full_ground_test.cpp | 4 +- src/apps/molresponse/testing/mad-excited.cpp | 4 +- src/apps/molresponse/testing/mad-freq.cpp | 16 +- src/apps/molresponse/testing/runners.hpp | 159 +++++++++++------- .../molresponse/testing/test_development.cpp | 4 +- 9 files changed, 136 insertions(+), 86 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d45a3692027..c65ded3c39d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -175,8 +175,8 @@ void FrequencyResponse::iterate(World &world) { } } - std::cout << "MPI BARRIER before update " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER before update " << std::endl; + // world.mpi.Barrier(); auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, x_vectors, x_residuals, iter, max_rotation); @@ -269,21 +269,21 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator size_t iteration, const double &maxrotn) -> std::tuple { - print("before start time ", r_params.print_level()); - std::cout << "MPI BARRIER 2 " << std::endl; - world.mpi.Barrier(); + // print("before start time ", r_params.print_level()); +// std::cout << "MPI BARRIER 2 " << std::endl; + // world.mpi.Barrier(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - std::cout << "MPI BARRIER 3 " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER 3 " << std::endl; + //world.mpi.Barrier(); size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); - std::cout << "MPI BARRIER After Theta X " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER After Theta X " << std::endl; + // world.mpi.Barrier(); // compute residual X_space X_space new_chi = diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7acd0f6976c..c41e9edc11d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1606,20 +1606,25 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct // Return container auto compute_density = [&world, &orbitals](const auto &x_alpha, const auto &y_alpha) { + /* for (const auto &xij: x_alpha) { print("xij !!", xij.max_depth(), " ", (void *) xij.get_impl().get()); } + */ auto dx = dot(world, x_alpha, orbitals, true); + /* for (const auto &yij: y_alpha) { print("yij !!", yij.max_depth(), " ", (void *) yij.get_impl().get()); - } + }*/ auto dy = dot(world, orbitals, y_alpha, true); return dx + dy; }; + /* for (const auto &phi_i: orbitals) { print("phi_i !!", phi_i.max_depth(), " ", (void *) phi_i.get_impl().get()); } + */ std::transform(x.begin(), x.end(), y.begin(), densities.begin(), compute_density); world.gop.fence(); diff --git a/src/apps/molresponse/testing/full_excited_test.cpp b/src/apps/molresponse/testing/full_excited_test.cpp index 57c9167e24e..a86bab3b9df 100644 --- a/src/apps/molresponse/testing/full_excited_test.cpp +++ b/src/apps/molresponse/testing/full_excited_test.cpp @@ -47,7 +47,7 @@ int main(int argc, char *argv[]) { high_prec = false; } - auto schema = runSchema(xc); + auto schema = runSchema(<#initializer #>, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -64,7 +64,7 @@ int main(int argc, char *argv[]) { try { - auto m_schema = moldftSchema(molecule_name, xc, schema); + auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); moldft(world, m_schema, true, false, high_prec); auto excited_schema = excitedSchema(schema, m_schema); diff --git a/src/apps/molresponse/testing/full_frequency_test.cpp b/src/apps/molresponse/testing/full_frequency_test.cpp index 4d11b7aec3a..ef58bf0fe95 100644 --- a/src/apps/molresponse/testing/full_frequency_test.cpp +++ b/src/apps/molresponse/testing/full_frequency_test.cpp @@ -38,7 +38,7 @@ int main(int argc, char *argv[]) { high_prec = false; } - auto schema = runSchema(xc); + auto schema = runSchema(<#initializer #>, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -51,9 +51,9 @@ int main(int argc, char *argv[]) { auto molecule_name = mol_path.path().stem(); try { - auto m_schema = moldftSchema(molecule_name, xc, schema); + auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); moldft(world, m_schema, true, false, high_prec); - auto f_schema = frequencySchema(schema, m_schema, op); + auto f_schema = frequencySchema(<#initializer #>, schema, m_schema, op); runFrequencyTests(world, f_schema, high_prec); } catch (const SafeMPI::Exception &e) { diff --git a/src/apps/molresponse/testing/full_ground_test.cpp b/src/apps/molresponse/testing/full_ground_test.cpp index 5d4f2ca2da9..acf061d94f3 100644 --- a/src/apps/molresponse/testing/full_ground_test.cpp +++ b/src/apps/molresponse/testing/full_ground_test.cpp @@ -39,7 +39,7 @@ int main(int argc, char *argv[]) { startup(world, argc, argv); std::cout.precision(6); - auto schema = runSchema(xc); + auto schema = runSchema(<#initializer #>, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -53,7 +53,7 @@ int main(int argc, char *argv[]) { std::cout << "\n\n----------------------------------------------------\n"; std::cout << "Beginning Tests for Molecule: " << molecule_name << "\n"; try { - auto m_schema = moldftSchema(molecule_name, xc, schema); + auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); m_schema.print(); moldft(world, m_schema, true, true, 0); } catch (const SafeMPI::Exception &e) { diff --git a/src/apps/molresponse/testing/mad-excited.cpp b/src/apps/molresponse/testing/mad-excited.cpp index 9d717fad897..23c1eda8154 100644 --- a/src/apps/molresponse/testing/mad-excited.cpp +++ b/src/apps/molresponse/testing/mad-excited.cpp @@ -53,12 +53,12 @@ auto main(int argc, char *argv[]) -> int { high_prec = false; } - auto schema = runSchema(xc); + auto schema = runSchema(world, xc); auto mol_path = addPath(schema.molecule_path, molecule_name); try { - auto m_schema = moldftSchema(molecule_name, xc, schema); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); moldft(world, m_schema, false, true, high_prec); auto excited_schema = excitedSchema(schema, m_schema); excited_schema.print(); diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index b4773113a00..fe020e35e47 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -55,19 +55,19 @@ auto main(int argc, char *argv[]) -> int { } try { - auto schema = runSchema(xc); - auto m_schema = moldftSchema(molecule_name, xc, schema); - auto f_schema = frequencySchema(schema, m_schema, op); - try { - - moldft(world, m_schema, false, false, high_prec); + auto schema = runSchema(world, xc); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); + auto f_schema = frequencySchema(world, schema, m_schema, op); + if (std::filesystem::exists(m_schema.calc_info_json_path) && std::filesystem::exists(m_schema.moldft_restart)) { + // TODO set up to read calc_info json and check if its converged runFrequencyTests(world, f_schema, high_prec); - } catch (MadnessException &madnessException) { - print(madnessException); + } else { + moldft(world, m_schema, true, false, high_prec); runFrequencyTests(world, f_schema, high_prec); } + } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { std::cout << e << std::endl; } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 5cd137a70da..d4ed72a26f7 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -46,17 +46,22 @@ struct runSchema { path dalton_excited_json;// path to dalton excited json ResponseDataBase rdb; - explicit runSchema(const std::string &xc) { + explicit runSchema(World &world, const std::string &xc) { root = std::filesystem::current_path();//="/"+molecule_name; molecule_path = root; molecule_path += "/molecules"; xc_path = addPath(root, "/" + xc); + world.gop.fence(); if (std::filesystem::exists(xc_path)) { - std::cout << "XC Directory Exists" << std::endl; + if (world.rank() == 0) { + std::cout << "XC Directory Exists" << std::endl; + } } else { - std::cout << "Creating XC directory" << std::endl; + if (world.rank() == 0) { + std::cout << "Creating XC directory" << std::endl; + } std::filesystem::create_directory(xc_path); } @@ -70,16 +75,24 @@ struct runSchema { if (std::filesystem::exists(freq_json)) { std::ifstream ifs(freq_json); - std::cout << "Trying to read frequency.json" << std::endl; json j_read; ifs >> j_read; - std::cout << "READ IT" << std::endl; rdb.set_data(j_read); + + if (world.rank() == 0) { + std::cout << "Trying to read frequency.json" << std::endl; + std::cout << "READ IT" << std::endl; + } + } else { - std::cout << "did not find frequency.json" << std::endl; + if (world.rank() == 0) { + std::cout << "did not find frequency.json" << std::endl; + } + } + if (world.rank() == 0) { + print(); } - print(); } void print() const { @@ -107,7 +120,7 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(const std::string &molecule_name, const std::string &m_xc, const runSchema &schema) + moldftSchema(World &world, const std::string &molecule_name, const std::string &m_xc, const runSchema &schema) : mol_name(molecule_name), xc(m_xc) { @@ -123,13 +136,18 @@ struct moldftSchema { // read results into json ifs >> moldft_json; // Here are the current answers... check to see if th - std::cout << "Here are the current answers for" << molecule_name - << " check to see if they need to be updated please!" << std::endl; - cout << moldft_path; + world.gop.fence(); + if (world.rank() == 0) { + std::cout << "Here are the current answers for" << molecule_name + << " check to see if they need to be updated please!" << std::endl; + cout << moldft_path; + } } else { - std::cout << " We do not have moldft answers so please run and save the " - "results in the molecule directory" - << std::endl; + if (world.rank() == 0) { + std::cout << " We do not have moldft answers so please run and save the " + "results in the molecule directory" + << std::endl; + } } if (std::filesystem::exists(moldft_restart) && @@ -137,12 +155,17 @@ struct moldftSchema { // if both exist, read the calc_info json std::ifstream ifs(calc_info_json_path); ifs >> calc_info_json; - std::cout << "time: " << calc_info_json["time"] << std::endl; - std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; - std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] - << std::endl; + world.gop.fence(); + if (world.rank() == 0) { + std::cout << "time: " << calc_info_json["time"] << std::endl; + std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; + std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] + << std::endl; + } + } + if (world.rank() == 0) { + print(); } - print(); } void print() const { @@ -165,14 +188,15 @@ struct frequencySchema { const path moldft_path; vector freq; - frequencySchema(const runSchema run_schema, const moldftSchema m_schema, - const std::string r_operator) + frequencySchema(World &world, const runSchema run_schema, const moldftSchema m_schema, const std::string r_operator) : mol_name(m_schema.mol_name), xc(m_schema.xc), op(r_operator), moldft_path(m_schema.moldft_path) { freq = run_schema.rdb.get_frequencies(mol_name, xc, op); - print_schema(); + if (world.rank() == 0) { + print_schema(); + } } void print_schema() { @@ -360,7 +384,6 @@ auto generate_response_frequency_run_path(const std::filesystem::path &moldft_pa auto run_path = moldft_path; run_path += "/"; run_path += std::filesystem::path(run_name); - std::cout << run_path << endl; return run_path; } @@ -377,9 +400,6 @@ auto tryMOLDFT(CalculationParameters &p1, CalculationParameters &p2) -> bool { auto proto1 = p1.get>("protocol"); auto proto2 = p1.get>("protocol"); - std::cout << *(proto2.end() - 1) << std::endl; - std::cout << *(proto1.end() - 1) << std::endl; - return *(proto1.end() - 1) != *(proto2.end() - 1); } @@ -415,13 +435,18 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo CalculationParameters param_calc; json calcInfo; + world.gop.fence(); if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { - std::cout << "Reading Calc Info JSON" << std::endl; + if (world.rank() == 0) { + std::cout << "Reading Calc Info JSON" << std::endl; + } std::ifstream ifs(moldftSchema.calc_info_json_path); ifs >> calcInfo; param_calc.from_json(calcInfo["parameters"]); - print(param1.print_to_string()); - print(param_calc.print_to_string()); + if (world.rank() == 0) { + print(param1.print_to_string()); + print(param_calc.print_to_string()); + } } //If the parameters are exactly equal do not run // If calc info doesn't exist the param_calc will definitely be different @@ -440,11 +465,13 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("restart", true); } world.gop.fence(); - - molresponse::write_test_input test_input(param1, "moldft.in", - moldftSchema.mol_path);// molecule HF + if (world.rank() == 0) { + molresponse::write_test_input test_input(param1, "moldft.in", + moldftSchema.mol_path);// molecule HF + } + world.gop.fence(); commandlineparser parser; - parser.set_keyval("input", test_input.filename()); + parser.set_keyval("input", "moldft.in"); world.gop.fence(); SCF calc(world, parser); calc.set_protocol<3>(world, 1e-4); @@ -453,8 +480,10 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo ME.value(calc.molecule.get_all_coords().flat());// ugh! ME.output_calc_info_schema(); } else { - print("Skipping Calculation and printing CALC INFO"); - std::cout << calcInfo; + if (world.rank() == 0) { + print("Skipping Calculation and printing CALC INFO"); + std::cout << calcInfo; + } } } @@ -541,47 +570,60 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: * @param frequency * @param moldft_path */ -static auto set_frequency_path_and_restart(ResponseParameters ¶meters, - const std::string &property, const double &frequency, - const std::string &xc, - const std::filesystem::path &moldft_path, - std::filesystem::path &restart_path, bool restart) +static auto set_frequency_path_and_restart(World &world, ResponseParameters ¶meters, const std::string &property, const double &frequency, const std::string &xc, const std::filesystem::path &moldft_path, std::filesystem::path &restart_path, bool restart) -> std::filesystem::path { - print("set_frequency_path_and_restart"); - print("restart path", restart_path); + if (world.rank() == 0) { + print("set_frequency_path_and_restart"); + print("restart path", restart_path); + } // change the logic create save path auto frequency_run_path = generate_response_frequency_run_path(moldft_path, property, frequency, xc); - print("frequency run path", frequency_run_path); + if (world.rank() == 0) { + print("frequency run path", frequency_run_path); + } // Crea if (std::filesystem::is_directory(frequency_run_path)) { - cout << "Response directory found " << std::endl; + if (world.rank() == 0) { + cout << "Response directory found " << std::endl; + } } else {// create the file std::filesystem::create_directory(frequency_run_path); - cout << "Creating response_path directory" << std::endl; + if (world.rank() == 0) { + cout << "Creating response_path directory" << std::endl; + } } + world.gop.fence(); std::filesystem::current_path(frequency_run_path); // Calling this function will make the current working directory the // frequency save path auto [save_path, save_string] = generate_frequency_save_path(frequency_run_path); - print("save string", save_string); + if (world.rank() == 0) { + + print("save string", save_string); + } parameters.set_user_defined_value("save", true); parameters.set_user_defined_value("save_file", save_string); + world.gop.fence(); // if restart and restartfile exists go ahead and set the restart file if (restart) { if (std::filesystem::exists(save_path)) { parameters.set_user_defined_value("restart", true); parameters.set_user_defined_value("restart_file", save_string); - print("found save directory... restarting from save_string ", save_string); + if (world.rank() == 0) { + print("found save directory... restarting from save_string ", save_string); + } } else if (std::filesystem::exists(restart_path)) { - print(" restart path", restart_path); + if (world.rank() == 0) { + print(" restart path", restart_path); + } parameters.set_user_defined_value("restart", true); auto split_restart_path = split(restart_path.replace_extension("").string(), '/'); @@ -589,10 +631,13 @@ static auto set_frequency_path_and_restart(ResponseParameters ¶meters, std::string restart_file_short = "../" + split_restart_path[split_restart_path.size() - 2] + "/" + split_restart_path[split_restart_path.size() - 1]; - print("relative restart path", restart_file_short); parameters.set_user_defined_value("restart_file", restart_file_short); - print("found restart directory... restarting from restart_path.string ", - restart_path.string()); + + if (world.rank() == 0) { + print("relative restart path", restart_file_short); + print("found restart directory... restarting from restart_path.string ", + restart_path.string()); + } } else { parameters.set_user_defined_value("restart", false); @@ -623,7 +668,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // Set the response parameters ResponseParameters r_params{}; set_frequency_response_parameters(r_params, property, xc, frequency, highPrecision); - auto save_path = set_frequency_path_and_restart(r_params, property, frequency, xc, moldft_path, + auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, moldft_path, restart_path, true); if (world.rank() == 0) { molresponse::write_response_input(r_params, filename); } @@ -809,18 +854,18 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, bool high_prec) { if (std::filesystem::is_directory(m_schema.moldft_path)) { - if(world.rank()==0){ + if (world.rank() == 0) { cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; } } else {// create the file std::filesystem::create_directory(m_schema.moldft_path); - if(world.rank()==0){ - cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" - << m_schema.moldft_path << ":\n"; + if (world.rank() == 0) { + cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" + << m_schema.moldft_path << ":\n"; } } std::filesystem::current_path(m_schema.moldft_path); - if(world.rank()==0) { + if (world.rank() == 0) { cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; } diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index 498052eb688..3c734f0e3e9 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -39,9 +39,9 @@ int main(int argc, char *argv[]) { // A calculation is defined by a molecule, functional, and operator // xc include (hf/lda) // operators include (excited-state) - auto schema = runSchema(xc); + auto schema = runSchema(<#initializer #>, xc); auto mol_path = addPath(schema.molecule_path, molecule_name); - auto m_schema = moldftSchema(molecule_name, xc, schema); + auto m_schema = moldftSchema(<#initializer#>, molecule_name, xc, schema); auto excited_schema = excitedSchema(schema, m_schema); excited_schema.print(); ResponseParameters r_params{}; From ee1e12715d337489b3c57c209f35b409ef8e68f3 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 8 Sep 2022 06:37:15 -0400 Subject: [PATCH 0267/1312] add missing declarations of explicit instantiations of GaussianConvolution1DCache::map define in convolution1d.h to match the definitions in mra1.cc and avoid warnings what using these maps (e.g., clearing) in user code --- src/madness/mra/convolution1d.h | 11 +++++++++++ src/madness/mra/mra1.cc | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/madness/mra/convolution1d.h b/src/madness/mra/convolution1d.h index b76c8a60350..3f3926320b4 100644 --- a/src/madness/mra/convolution1d.h +++ b/src/madness/mra/convolution1d.h @@ -880,6 +880,17 @@ namespace madness { } }; + + // instantiated in mra1.cc + template <> + ConcurrentHashMap< hashT, std::shared_ptr< GaussianConvolution1D > > + GaussianConvolution1DCache::map; + + // instantiated in mra1.cc + template <> + ConcurrentHashMap< hashT, std::shared_ptr< GaussianConvolution1D > > + GaussianConvolution1DCache::map; + } #endif // MADNESS_MRA_CONVOLUTION1D_H__INCLUDED diff --git a/src/madness/mra/mra1.cc b/src/madness/mra/mra1.cc index f4375cb7237..e4426e1a2a7 100644 --- a/src/madness/mra/mra1.cc +++ b/src/madness/mra/mra1.cc @@ -41,11 +41,11 @@ namespace madness { template <> ConcurrentHashMap< hashT, std::shared_ptr< GaussianConvolution1D > > - GaussianConvolution1DCache::map = ConcurrentHashMap< hashT, std::shared_ptr< GaussianConvolution1D > >(); + GaussianConvolution1DCache::map = {}; template <> ConcurrentHashMap< hashT, std::shared_ptr< GaussianConvolution1D > > - GaussianConvolution1DCache::map = ConcurrentHashMap< hashT, std::shared_ptr< GaussianConvolution1D > >(); + GaussianConvolution1DCache::map = {}; #ifdef FUNCTION_INSTANTIATE_1 From 54cd74b5eaa558d105d3a963782c3eb7fd8f25ec Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 8 Sep 2022 06:38:26 -0400 Subject: [PATCH 0268/1312] amends b5ebe97044a5ce7b8dbf9b7bd1b30573353b3dcf --- src/madness/chem/molecule.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/chem/molecule.cc b/src/madness/chem/molecule.cc index 1b4bdd65972..448b0960ed1 100644 --- a/src/madness/chem/molecule.cc +++ b/src/madness/chem/molecule.cc @@ -83,7 +83,7 @@ Molecule::Molecule(std::vector atoms, double eprec, CorePotentialManager c atomic_radii.reserve(this->atoms.size()); for(auto&& atom: this->atoms) { double radius = - get_atomic_data(atom.z).covalent_radius; + get_atomic_data(atom.get_atomic_number()).covalent_radius; atomic_radii.emplace_back( radius * 1e-10 / madness::constants::atomic_unit_of_length); From caabe1dd6aaec59752913ed07840596b5cde1e8e Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 8 Sep 2022 06:45:18 -0400 Subject: [PATCH 0269/1312] PotentialManager::core_type also recognizes "none", in sync with Molecule::core_type field --- src/madness/chem/potentialmanager.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/madness/chem/potentialmanager.h b/src/madness/chem/potentialmanager.h index 45cb066201c..c480f364ffc 100644 --- a/src/madness/chem/potentialmanager.h +++ b/src/madness/chem/potentialmanager.h @@ -202,7 +202,9 @@ std::string core_type; vnuc = real_factory_3d(world).functor(real_functor_3d(new MolecularPotentialFunctor(molecule))).thresh(vtol).truncate_on_project(); vnuc.set_thresh(FunctionDefaults<3>::get_thresh()); vnuc.reconstruct(); - if (core_type != "") { + // "" is legacy core_type value for all-electron (also be used by CorePotentialManager) + // "none" is current core_type value for all-electron + if (core_type != "" && core_type != "none") { real_function_3d c_pot = real_factory_3d(world).functor(real_functor_3d(new MolecularCorePotentialFunctor(molecule))).thresh(vtol).initial_level(4); c_pot.set_thresh(FunctionDefaults<3>::get_thresh()); c_pot.reconstruct(); From d82f2dba5f87d1882b2688a03f7ef94e2395dc69 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 8 Sep 2022 06:46:23 -0400 Subject: [PATCH 0270/1312] fixed {Molecule,ResponseParameters}::core_type value range: mpc -> mcp --- src/apps/molresponse/response_parameters.h | 2 +- src/madness/chem/molecule.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index 2a497103766..ffd7394d2a5 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -41,7 +41,7 @@ namespace madness { initialize>("plot_data", std::vector{0}, "Orbitals to plot"); initialize>("plot_cell", std::vector(), "lo-hi plot cell (default is all space)"); - initialize("core_type", "none", "core potential type", {"none", "mpc"}); + initialize("core_type", "none", "core potential type", {"none", "mcp"}); initialize("plot_l", -1.0, "Controls the plotting box size"); initialize("plot_pts", 201, "Controls number of points in plots"); initialize("plot_all_orbitals", false, diff --git a/src/madness/chem/molecule.h b/src/madness/chem/molecule.h index cd6bfef8690..f2085fc1786 100644 --- a/src/madness/chem/molecule.h +++ b/src/madness/chem/molecule.h @@ -143,7 +143,7 @@ class Molecule { initialize ("no_orient",false,"if true the molecule coordinates will not be reoriented and/or symmetrized"); initialize ("symtol",-1.e-2,"distance threshold for determining the symmetry-equivalent atoms; negative: old algorithm"); - initialize ("core_type","none","core potential type",{"none","mpc"}); + initialize ("core_type","none","core potential type",{"none","mcp"}); initialize ("psp_calc",false,"pseudopotential calculation for all atoms"); initialize ("pure_ae",true,"pure all electron calculation with no pseudo-atoms"); From b0244c06111eb0d7a11a6f2fd49e814f9086fcdf Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 8 Sep 2022 09:39:37 -0400 Subject: [PATCH 0271/1312] Fix the stalling --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index c65ded3c39d..dbef82d1901 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -257,8 +257,8 @@ void FrequencyResponse::iterate(World &world) { print(bsh_residualsY); print(" Final density residuals:"); print(density_residuals); - compute_and_print_polarizability(world, Chi, PQ, "Converged"); } + compute_and_print_polarizability(world, Chi, PQ, "Converged"); } auto FrequencyResponse::update(World &world, X_space &chi, XCOperator &xc, diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index d4ed72a26f7..82cad0db58b 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -687,6 +687,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, rhs_generator = nuclear_generator; } FrequencyResponse calc(world, calc_params, frequency, rhs_generator); + world.gop.fence(); if (world.rank() == 0) { print("\n\n"); print(" MADNESS Time-Dependent Density Functional Theory Response " @@ -699,8 +700,11 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // put the response parameters in a j_molrespone json object calc_params.response_parameters.to_json(calc.j_molresponse); } + world.gop.fence(); // set protocol to the first calc.solve(world); + world.gop.fence(); + // set protocol to the first calc.time_data.to_json(calc.j_molresponse); calc.time_data.print_data(); calc.output_json(); From 6faa7cf33a6b789cd2023e95f15834fafcf52472 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 8 Sep 2022 09:50:44 -0400 Subject: [PATCH 0272/1312] add missing #include to make potentialmanager.h usable --- src/madness/chem/potentialmanager.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/madness/chem/potentialmanager.h b/src/madness/chem/potentialmanager.h index c480f364ffc..643083efea3 100644 --- a/src/madness/chem/potentialmanager.h +++ b/src/madness/chem/potentialmanager.h @@ -38,6 +38,7 @@ #include #include +#include #include #include #include From c3bc045d2fe4f6cbb2e9a1e2d724b556e789346f Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 8 Sep 2022 10:20:36 -0400 Subject: [PATCH 0273/1312] introduced PotentialManager::{molecule,core_type}() methods --- src/madness/chem/potentialmanager.h | 46 +++++++++++++++++------------ 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/madness/chem/potentialmanager.h b/src/madness/chem/potentialmanager.h index 643083efea3..5eca333a7df 100644 --- a/src/madness/chem/potentialmanager.h +++ b/src/madness/chem/potentialmanager.h @@ -109,13 +109,21 @@ class CoreOrbitalDerivativeFunctor : public FunctionFunctorInterface { class PotentialManager { private: -Molecule molecule; +Molecule mol; real_function_3d vnuc; -std::string core_type; +std::string core_type_; public: PotentialManager(const Molecule& molecule, const std::string& core_type) - : molecule(molecule), core_type(core_type) {} + : mol(molecule), core_type_(core_type) {} + + const Molecule& molecule() const { + return this->mol; + } + + const std::string& core_type() const { + return this->core_type_; + } const real_function_3d& vnuclear() { return vnuc; @@ -125,25 +133,25 @@ std::string core_type; { int npsi = psi.size(); if (npsi == 0) return psi; - int natom = molecule.natom(); + int natom = mol.natom(); vector_real_function_3d proj = zero_functions_compressed(world, npsi); real_tensor overlap_sum(static_cast(npsi)); for (int i=0; i bc; - unsigned int atn = molecule.get_atom(atom).atomic_number; - unsigned int ncore = molecule.n_core_orb(atn); + unsigned int atn = mol.get_atom(atom).atomic_number; + unsigned int ncore = mol.n_core_orb(atn); // projecting core & d/dx core for (unsigned int c=0; c::get_thresh() * safety; - vnuc = real_factory_3d(world).functor(real_functor_3d(new MolecularPotentialFunctor(molecule))).thresh(vtol).truncate_on_project(); + vnuc = real_factory_3d(world).functor(real_functor_3d(new MolecularPotentialFunctor(mol))).thresh(vtol).truncate_on_project(); vnuc.set_thresh(FunctionDefaults<3>::get_thresh()); vnuc.reconstruct(); // "" is legacy core_type value for all-electron (also be used by CorePotentialManager) // "none" is current core_type value for all-electron - if (core_type != "" && core_type != "none") { - real_function_3d c_pot = real_factory_3d(world).functor(real_functor_3d(new MolecularCorePotentialFunctor(molecule))).thresh(vtol).initial_level(4); + if (core_type_ != "" && core_type_ != "none") { + real_function_3d c_pot = real_factory_3d(world).functor(real_functor_3d(new MolecularCorePotentialFunctor(mol))).thresh(vtol).initial_level(4); c_pot.set_thresh(FunctionDefaults<3>::get_thresh()); c_pot.reconstruct(); vnuc += c_pot; From f30ba3b7c718082c310b2ddc45112a66b9d71ea4 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 8 Sep 2022 10:24:05 -0400 Subject: [PATCH 0274/1312] missing #include in convolution1d.h --- src/madness/mra/simplecache.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/madness/mra/simplecache.h b/src/madness/mra/simplecache.h index eba5a573495..3ed2b39c7da 100644 --- a/src/madness/mra/simplecache.h +++ b/src/madness/mra/simplecache.h @@ -34,6 +34,7 @@ #define MADNESS_MRA_SIMPLECACHE_H__INCLUDED #include +#include namespace madness { /// Simplified interface around hash_map to cache stuff for 1D From 2c46e3f23934e02bf21056de5a090eafe3fa9266 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Fri, 9 Sep 2022 14:23:52 -0400 Subject: [PATCH 0275/1312] typo --- src/madness/chem/CalculationParameters.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/chem/CalculationParameters.h b/src/madness/chem/CalculationParameters.h index 6467f87caee..4a69d23dc9d 100644 --- a/src/madness/chem/CalculationParameters.h +++ b/src/madness/chem/CalculationParameters.h @@ -110,7 +110,7 @@ struct CalculationParameters : public QCCalculationParametersBase { initialize ("nbeta",-1,"number of beta spin electrons"); initialize ("nmo_alpha",-1,"number of alpha spin molecular orbitals"); initialize ("nmo_beta",-1,"number of beta spin molecular orbitals"); - initialize ("lo",1.e10,"smallest length scale we need to resolve"); + initialize ("lo",1.e-10,"smallest length scale we need to resolve"); initialize > ("protocol",{1.e-4,1.e-6},"calculation protocol"); // geometry optimization parameters From 6ba8e928c31d81156263241c11a79c749f9a339f Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Fri, 9 Sep 2022 14:45:59 -0400 Subject: [PATCH 0276/1312] dox++ --- src/madness/mra/vmra.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index dd59030cbc8..23c16efb55b 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -557,7 +557,7 @@ namespace madness { } -/// Transforms a vector of functions according to new[i] = sum[j] old[j]*c[j,i] + /// Transforms a vector of functions according to new[i] = sum[j] old[j]*c[j,i] /// Uses sparsity in the transformation matrix --- set small elements to /// zero to take advantage of this. @@ -587,7 +587,8 @@ namespace madness { return vc; } - + /// this version of transform uses Function::vtransform and screens + /// using both elements of `c` and `v` template std::vector< Function > transform(World& world, const std::vector< Function >& v, From 28fe721449acb37de3a6032b8d5ca508b7948a58 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Sep 2022 14:41:18 -0400 Subject: [PATCH 0277/1312] fixing up with new changes to runner --- src/apps/molresponse/testing/full_excited_test.cpp | 4 ++-- src/apps/molresponse/testing/full_frequency_test.cpp | 6 +++--- src/apps/molresponse/testing/full_ground_test.cpp | 4 ++-- src/apps/molresponse/testing/test_development.cpp | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/testing/full_excited_test.cpp b/src/apps/molresponse/testing/full_excited_test.cpp index a86bab3b9df..34a0e45860a 100644 --- a/src/apps/molresponse/testing/full_excited_test.cpp +++ b/src/apps/molresponse/testing/full_excited_test.cpp @@ -47,7 +47,7 @@ int main(int argc, char *argv[]) { high_prec = false; } - auto schema = runSchema(<#initializer #>, xc); + auto schema = runSchema(world, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -64,7 +64,7 @@ int main(int argc, char *argv[]) { try { - auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); moldft(world, m_schema, true, false, high_prec); auto excited_schema = excitedSchema(schema, m_schema); diff --git a/src/apps/molresponse/testing/full_frequency_test.cpp b/src/apps/molresponse/testing/full_frequency_test.cpp index ef58bf0fe95..f389acd0a91 100644 --- a/src/apps/molresponse/testing/full_frequency_test.cpp +++ b/src/apps/molresponse/testing/full_frequency_test.cpp @@ -38,7 +38,7 @@ int main(int argc, char *argv[]) { high_prec = false; } - auto schema = runSchema(<#initializer #>, xc); + auto schema = runSchema(world, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -51,9 +51,9 @@ int main(int argc, char *argv[]) { auto molecule_name = mol_path.path().stem(); try { - auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); moldft(world, m_schema, true, false, high_prec); - auto f_schema = frequencySchema(<#initializer #>, schema, m_schema, op); + auto f_schema = frequencySchema(world, schema, m_schema, op); runFrequencyTests(world, f_schema, high_prec); } catch (const SafeMPI::Exception &e) { diff --git a/src/apps/molresponse/testing/full_ground_test.cpp b/src/apps/molresponse/testing/full_ground_test.cpp index acf061d94f3..deeef50fea0 100644 --- a/src/apps/molresponse/testing/full_ground_test.cpp +++ b/src/apps/molresponse/testing/full_ground_test.cpp @@ -39,7 +39,7 @@ int main(int argc, char *argv[]) { startup(world, argc, argv); std::cout.precision(6); - auto schema = runSchema(<#initializer #>, xc); + auto schema = runSchema(world, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -53,7 +53,7 @@ int main(int argc, char *argv[]) { std::cout << "\n\n----------------------------------------------------\n"; std::cout << "Beginning Tests for Molecule: " << molecule_name << "\n"; try { - auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); m_schema.print(); moldft(world, m_schema, true, true, 0); } catch (const SafeMPI::Exception &e) { diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index 3c734f0e3e9..bc1582f67f7 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -39,9 +39,9 @@ int main(int argc, char *argv[]) { // A calculation is defined by a molecule, functional, and operator // xc include (hf/lda) // operators include (excited-state) - auto schema = runSchema(<#initializer #>, xc); + auto schema = runSchema(world, xc); auto mol_path = addPath(schema.molecule_path, molecule_name); - auto m_schema = moldftSchema(<#initializer#>, molecule_name, xc, schema); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); auto excited_schema = excitedSchema(schema, m_schema); excited_schema.print(); ResponseParameters r_params{}; From f91af1dcb1d47cb8381b756bf87c65b323ea4642 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Sep 2022 16:54:41 -0400 Subject: [PATCH 0278/1312] generate frequencies based on cc-pVDZ results --- .../testing/response_data_base.hpp | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp index 896694e05e3..3fd59e1d239 100644 --- a/src/apps/molresponse/testing/response_data_base.hpp +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -106,8 +106,7 @@ class ResponseDataBase { } }; -auto generate_dipole_frequencies(std::string molecule_name, std::string xc, - std::string op) -> vector { +auto generate_dipole_frequencies(const std::string &molecule_name, std::string xc) -> vector { if (std::filesystem::exists("molecules/dalton-excited.json")) { std::ifstream ifs("molecules/dalton-excited.json"); @@ -115,13 +114,13 @@ auto generate_dipole_frequencies(std::string molecule_name, std::string xc, json dalton_excited; ifs >> dalton_excited; - ::print("Read Dalton Excited"); - ::print(dalton_excited); + ::print("Read Dalton Excited for ", molecule_name); + ::print(dalton_excited[molecule_name][xc]["excited-state"]["cc-pVTZ"]["response"]["freq"]); std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] - ["aug-cc-pVTZ"]["response"]["freq"]; + ["cc-pVTZ"]["response"]["freq"]; auto omega_max = freq.at(0); omega_max = omega_max / 2.0; - ::print(omega_max); + ::print("max frequency at cc-pVTZ", omega_max); std::vector omegas = {}; int Nsteps = 9; @@ -130,8 +129,11 @@ auto generate_dipole_frequencies(std::string molecule_name, std::string xc, } catch (const json::out_of_range &e) { std::cout << e.what() << std::endl; - return std::vector(0); + return std::vector(1,0); // The molecule file exists in the database therefore it is okay to add to frequency.json + } catch (const json::type_error &e) { + std::cout << e.what() << std::endl; + return std::vector(1,0); } } else { @@ -147,10 +149,10 @@ json generate_response_data(const std::filesystem::path &molecule_path, const st if (mol_path.path().extension() == ".mol") { auto molecule_name = mol_path.path().stem(); data[molecule_name][xc][property] = - generate_dipole_frequencies(molecule_name, xc, property); + generate_dipole_frequencies(molecule_name, xc); } } - std::cout << data << endl; + //std::cout << data << endl; return data; } From b2bcccd1052c8439997af999215260678c127683 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 08:20:07 -0400 Subject: [PATCH 0279/1312] some added fences in compute gamma --- src/apps/molresponse/ResponseBase.cpp | 26 ++++++++++++++++-------- src/apps/molresponse/testing/runners.hpp | 2 +- src/apps/molresponse/x_space.cc | 1 + 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c41e9edc11d..530809ff392 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -467,6 +467,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // compute j_x = op(rho_x)*phi0 std::transform(d_alpha.X.begin(), d_alpha.X.end(), j_x.begin(), compute_j); // compute j_y = op(rho_y)*phi0 + std::transform(d_alpha.Y.begin(), d_alpha.Y.end(), j_y.begin(), compute_j); J.X = j_x + j_y; @@ -507,6 +508,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit KX.Y[b] = newK(phi0, x, phi0); // |i> } + world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -537,6 +539,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit gamma.X[i] = projector(gamma.X[i]); gamma.Y[i] = projector(gamma.Y[i]); } + world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); @@ -544,13 +547,18 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); - print_inner(world, "xJx", d_alpha, J); - print_inner(world, "xKXx", d_alpha, KX); - print_inner(world, "xKYx", d_alpha, KY); + if (world.rank() == 0) { + print_inner(world, "xJx", d_alpha, J); + print_inner(world, "xKXx", d_alpha, KX); + print_inner(world, "xKYx", d_alpha, KY); + } X_space K = KX + KY; - print_inner(world, "xKx", d_alpha, KX); - print_inner(world, "xWx", d_alpha, W); - print_inner(world, "xGammax", d_alpha, gamma); + world.gop.fence(); + if (world.rank() == 0) { + print_inner(world, "xKx", d_alpha, KX); + print_inner(world, "xWx", d_alpha, W); + print_inner(world, "xGammax", d_alpha, gamma); + } molresponse::end_timer(world, "Print Expectation Creating Gamma:"); } // put @@ -2126,7 +2134,7 @@ void response_timing::add_data(std::map> void response_timing::to_json(json &j) { - ::print("FREQUENCY TIME DATA TO JSON"); + //::print("FREQUENCY TIME DATA TO JSON"); j["time_data"] = json(); j["time_data"]["iterations"] = iter; @@ -2134,9 +2142,9 @@ void response_timing::to_json(json &j) { j["time_data"]["wall_time"] = json(); for (const auto &e: wall_time_data) { - j["time_data"]["wall_time"][e.first].push_back(e.second); + j["time_data"]["wall_time"][e.first] = e.second; } j["time_data"]["cpu_time"] = json(); - for (const auto &e: cpu_time_data) { j["time_data"]["cpu_time"][e.first].push_back(e.second); } + for (const auto &e: cpu_time_data) { j["time_data"]["cpu_time"][e.first] = e.second; } } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 82cad0db58b..a3b61fce82b 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -706,7 +706,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, world.gop.fence(); // set protocol to the first calc.time_data.to_json(calc.j_molresponse); - calc.time_data.print_data(); + //calc.time_data.print_data(); calc.output_json(); return {save_path, calc.j_molresponse["converged"]}; } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 4707fa5101e..0b29c130131 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -16,6 +16,7 @@ namespace madness { [&](const auto& yi) { mi.push_back(copy(yi)); }); b++; } + world.gop.fence(); return mX; } From 246e7cfbf0fa523b795347ba7ba050b5ead3f5d1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 08:24:07 -0400 Subject: [PATCH 0280/1312] only world 0 prints to the json file --- src/apps/molresponse/molresponse.cc | 7 +++++-- src/apps/molresponse/testing/runners.hpp | 6 ++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/molresponse.cc b/src/apps/molresponse/molresponse.cc index bb7133130c6..17db081366a 100644 --- a/src/apps/molresponse/molresponse.cc +++ b/src/apps/molresponse/molresponse.cc @@ -48,7 +48,7 @@ #include static inline int file_exists(const char *inpname) { - struct stat buffer{}; + struct stat buffer {}; size_t rc = stat(inpname, &buffer); return (rc == 0); } @@ -112,7 +112,10 @@ int main(int argc, char **argv) { calc_params.response_parameters.to_json(calc.j_molresponse); // set protocol to the first calc.solve(world); - calc.output_json(); + world.gop.fence(); + if (world.rank() == 0) { + calc.output_json(); + } } else { if (world.rank() == 0) { print("Response not implemented"); } } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index a3b61fce82b..437f966f58f 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -705,9 +705,11 @@ auto RunResponse(World &world, const std::string &filename, double frequency, calc.solve(world); world.gop.fence(); // set protocol to the first - calc.time_data.to_json(calc.j_molresponse); + if(world.rank()==0){ + //calc.time_data.to_json(calc.j_molresponse); + calc.output_json(); + } //calc.time_data.print_data(); - calc.output_json(); return {save_path, calc.j_molresponse["converged"]}; } From 966f71b47cb9ba4ae03200cba2cdd4895ec85ecf Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:22:25 -0400 Subject: [PATCH 0281/1312] remove deprecated files --- src/apps/molresponse/CMakeLists.txt | 6 - src/apps/molresponse/Lambda_X.cc | 85 - src/apps/molresponse/TDDFT.cc | 3526 ----------------------- src/apps/molresponse/TDDFT.h | 740 ----- src/apps/molresponse/Theta_X.cc | 103 - src/apps/molresponse/basic_operators.cc | 165 +- src/apps/molresponse/density.cc | 65 - src/apps/molresponse/density.h | 86 - src/apps/molresponse/densityVector.cpp | 542 ---- src/apps/molresponse/densityVector.hpp | 80 - src/apps/molresponse/iter_freq2.cc | 243 -- src/apps/molresponse/iterate_excited.cc | 476 --- src/apps/molresponse/iterate_freq.cc | 302 -- src/apps/molresponse/iterate_gamma.cc | 572 ---- src/apps/molresponse/load_balance.h | 5 - src/apps/molresponse/timer.cc | 25 +- src/apps/molresponse/timer.h | 7 +- 17 files changed, 100 insertions(+), 6928 deletions(-) delete mode 100644 src/apps/molresponse/Lambda_X.cc delete mode 100644 src/apps/molresponse/TDDFT.cc delete mode 100644 src/apps/molresponse/TDDFT.h delete mode 100644 src/apps/molresponse/Theta_X.cc delete mode 100644 src/apps/molresponse/density.cc delete mode 100644 src/apps/molresponse/density.h delete mode 100644 src/apps/molresponse/densityVector.cpp delete mode 100644 src/apps/molresponse/densityVector.hpp delete mode 100644 src/apps/molresponse/iter_freq2.cc delete mode 100644 src/apps/molresponse/iterate_excited.cc delete mode 100644 src/apps/molresponse/iterate_freq.cc delete mode 100644 src/apps/molresponse/iterate_gamma.cc delete mode 100644 src/apps/molresponse/load_balance.h diff --git a/src/apps/molresponse/CMakeLists.txt b/src/apps/molresponse/CMakeLists.txt index c58ab0a5ea6..95acb3f2d4b 100644 --- a/src/apps/molresponse/CMakeLists.txt +++ b/src/apps/molresponse/CMakeLists.txt @@ -18,7 +18,6 @@ set(MOLRESPONSE_HEADERS ResponseBase.hpp ExcitedResponse.hpp FrequencyResponse.hpp - density.h property.h x_space.h global_functions.h @@ -51,7 +50,6 @@ set(R_BASE_HEADERS ResponseBase.hpp ExcitedResponse.hpp FrequencyResponse.hpp - density.h property.h global_functions.h x_space.h @@ -75,10 +73,6 @@ set(RALL_SOURCES basic_operators.cc Plot_VTK.cc response_parameters.cpp - calc_runner.cc - iterate_excited.cc - Lambda_X.cc - Theta_X.cc x_space.cc ) diff --git a/src/apps/molresponse/Lambda_X.cc b/src/apps/molresponse/Lambda_X.cc deleted file mode 100644 index bec73cc4839..00000000000 --- a/src/apps/molresponse/Lambda_X.cc +++ /dev/null @@ -1,85 +0,0 @@ - -#include -#include -#include // The kain solver -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../chem/SCFOperators.h" -#include "../chem/molecule.h" -#include "../chem/xcfunctional.h" -#include "molresponse/TDDFT.h" -#include "molresponse/x_space.h" - -X_space TDDFT::Compute_Lambda_X(World& world, - X_space& Chi, - XCOperator xc, - std::string calc_type) { - // compute - - bool compute_Y = calc_type.compare("full") == 0; - - X_space Lambda_X; // = X_space(world, Chi.num_states(), Chi.num_orbitals()); - X_space F0X = compute_F0X(world, Chi, xc, compute_Y); - X_space Chi_truncated = Chi.copy(); - Chi_truncated.truncate(); - if (r_params.print_level() >= 20) { - print("---------------Lambda ----------------"); - print(""); - print(inner(Chi_truncated, F0X)); - } - // put it all together - - X_space E0X = Chi_truncated.copy(); - E0X.truncate(); - E0X.X = E0X.X * hamiltonian; - - if (compute_Y) { - E0X.Y = E0X.Y * hamiltonian; - } - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi_truncated, E0X)); - } - - // put it all together - X_space gamma; - - // compute - if (calc_type.compare("full") == 0) { - gamma = compute_gamma_full(world, Chi, xc); - } else if (calc_type.compare("static") == 0) { - gamma = compute_gamma_static(world, Chi, xc); - } else { - gamma = compute_gamma_tda(world, Chi, xc); - } - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi_truncated, gamma)); - } - - Lambda_X = (F0X - E0X) + gamma; - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi_truncated, Lambda_X)); - } - Lambda_X.truncate(); - - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi_truncated, Lambda_X)); - } - - return Lambda_X; -} diff --git a/src/apps/molresponse/TDDFT.cc b/src/apps/molresponse/TDDFT.cc deleted file mode 100644 index 4176af9840e..00000000000 --- a/src/apps/molresponse/TDDFT.cc +++ /dev/null @@ -1,3526 +0,0 @@ -/* - * Copyright 2021 Adrian Hurtado - * - * - - * - * Written by: bsundahl and molresponse - * Date: A long time ago... and today - * - */ - -#include "TDDFT.h" - -#include -#include // For easy calculation of (1 - \hat{\rho}^0) -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -using namespace madchem; - -// The TDDFT constructor initializes the preliminary calculation details including -// the Chi vectors and the PQ vectors if they are required -// ground orbitals -// molecule -// We also intialize the molresponse.json file -TDDFT::TDDFT(World &world, density_vector &rho) - : r_params(rho.r_params), - g_params(rho.g_params), - molecule(rho.molecule), - omega(rho.omega), - rho(rho) { - // Start the timer - Chi = rho.Chi; - PQ = rho.PQ; - xcf.initialize(r_params.xc(), !r_params.spinrestricted(), world, r_params.print_level() >= 10); - // - r_params.to_json(j_molresponse); - - ground_orbitals = g_params.orbitals(); - ground_energies = g_params.get_energies(); - - molresponse::start_timer(world); - - // Broadcast to all other nodes - world.gop.broadcast_serializable(r_params, 0); - world.gop.broadcast_serializable(molecule, 0); - - // Read in archive - // Create the projector Qhat to be used in any calculation - - // Set some function defaults - FunctionDefaults<3>::set_cubic_cell(-r_params.L(), r_params.L()); - FunctionDefaults<3>::set_truncate_mode(1); - FunctionDefaults<3>::set_truncate_on_project(true); - - // Create the masking function - mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); - - if (world.size() > 1) { - // Start a timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - if (world.rank() == 0) print("");// Makes it more legible - - LoadBalanceDeux<3> lb(world); - for (unsigned int j = 0; j < r_params.num_orbitals(); j++) { - lb.add_tree(ground_orbitals[j], lbcost(1.0, 8.0), true); - } - FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); - - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Load balancing:"); - } -} - - -// Save the current response calculation -void TDDFT::save(World &world, const std::string &name) { - // Archive to write everything to - archive::ParallelOutputArchive ar(world, name.c_str(), 1); - // Just going to enforce 1 io server - - // Saving, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω - - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; - if (not r_params.tda()) { - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; - } -} - -// Load a response calculation -void TDDFT::load(World &world, const std::string &name) { - // The archive to read from - archive::ParallelInputArchive ar(world, name.c_str()); - - // Reading in, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) - - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω - - Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); - - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; - world.gop.fence(); - - if (not r_params.tda()) { - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; - world.gop.fence(); - } -} - -void TDDFT::initial_load_bal(World &world) { - LoadBalanceDeux<3> lb(world); - real_function_3d vnuc; - vnuc = potential_manager->vnuclear(); - lb.add_tree(vnuc, lbcost(r_params.vnucextra() * 1.0, r_params.vnucextra() * 8.0)); - FunctionDefaults<3>::redistribute(world, lb.load_balance(r_params.loadbalparts())); -} - -void TDDFT::load_balance(World &world, vecfuncT rho_omega, X_space Chi, const X_space &Chi_old) { - molresponse::start_timer(world); - if (world.size() == 1) return; - - LoadBalanceDeux<3> lb(world); - real_function_3d v_nuclear; - v_nuclear = potential_manager->vnuclear(); - lb.add_tree(v_nuclear, - lbcost(r_params.vnucextra() * 1.0, r_params.vnucextra() * 8.0), false); - for (size_t i = 0; i < Chi.X.size(); ++i) { - lb.add_tree(rho_omega[i], lbcost(1.0, 8.0), false); - } - for (size_t i = 0; i < Chi.X.size(); ++i) { - for (size_t j = 0; j < Chi.X.size_orbitals(); ++j) { - lb.add_tree(Chi.X[i][j], lbcost(1.0, 8.0), false); - } - } - if (r_params.omega() != 0) { - for (size_t i = 0; i < Chi.X.size(); ++i) { - for (size_t j = 0; j < Chi.X.size_orbitals(); ++j) { - lb.add_tree(Chi.Y[i][j], lbcost(1.0, 8.0), false); - } - } - } - - world.gop.fence(); - - FunctionDefaults<3>::redistribute( - world, - lb.load_balance(r_params.loadbalparts()));// 6.0 needs retuning after - - world.gop.fence(); - molresponse::end_timer(world, "Load balancing"); - print_meminfo(world.rank(), "Load balancing"); -} - -// compute pmap based on ground and first order orbitals -// set default pmap to new pmap -// make orbital copies using new pmap -void TDDFT::orbital_load_balance(World &world, vecfuncT &psi0, vecfuncT &psi0_copy, X_space &Chi, - X_space &Chi_copy) { - size_t m = r_params.num_states(); - size_t n = r_params.num_orbitals(); - - if (world.size() > 1) { - molresponse::start_timer(world); - LoadBalanceDeux<3> lb(world); - for (unsigned int i = 0; i < m; ++i) { - lb.add_tree(psi0[i], lbcost(1.0, 8.0), false); - for (unsigned int j = 0; j < n; ++j) { - // add a tree for orbitals - lb.add_tree(Chi.X[i][j], lbcost(1.0, 8.0), false); - lb.add_tree(Chi.Y[i][j], lbcost(1.0, 8.0), false); - } - } - - world.gop.fence(); - - // newpamap is the new pmap just based on the orbitals - std::shared_ptr>> new_process_map = - lb.load_balance(r_params.loadbalparts()); - molresponse::end_timer(world, "Gamma compute load_balance_chi"); - // default process map - // We set the new_process_map - molresponse::start_timer(world); - FunctionDefaults<3>::set_pmap(new_process_map);// set default to be new - - world.gop.fence(); - // copy orbitals using new pmap - Chi_copy = Chi.copy(new_process_map, false); - world.gop.fence();// then fence - - psi0_copy = copy(world, ground_orbitals, new_process_map, false); - world.gop.fence();// then fence - molresponse::end_timer(world, "Gamma redist"); - } -} - -// (Each state's norm should be 1, not the -// individual functions norms) -void TDDFT::normalize(World &world, response_space &f) { - // Run over rows - for (unsigned int i = 0; i < f.size(); i++) { - // Get the normalization constant - // (Sum included inside inner) - double norm = inner(f[i], f[i]); - norm = sqrt(norm); - // Doing this to deal with zero functions. - // Maybe not smrt. - if (norm == 0) continue; - - // And scale - f[i] = f[i] * (1.0 / norm); - } -} - -// (Each state's norm should be 1, not the -// individual functions norms) -// non-standard normalization for eigen value problem -void TDDFT::normalize(World &world, response_space &f, response_space &g) { - // Run over rows - for (size_t i = 0; i < f.size(); i++) { - // Get the normalization constant - // (Sum included inside inner) - double normf = inner(f[i], f[i]); - double normg = inner(g[i], g[i]); - double norm = sqrt(normf - normg); - - // Doing this to deal with zero functions. - // Maybe not smrt. - if (norm == 0) continue; - // And scale - scale(world, f[i], (1.0 / norm)); - scale(world, g[i], (1.0 / norm)); - } -} - -void TDDFT::normalize(World &world, X_space &chi) { - // Run over rows - for (size_t i = 0; i < chi.num_states(); i++) { - // Get the normalization constant - // (Sum included inside inner) - double normf = inner(chi.X[i], chi.X[i]); - double normg = inner(chi.Y[i], chi.Y[i]); - double norm = sqrt(normf - normg); - // Doing this to deal with zero functions. - // Maybe not smrt. - if (norm == 0) continue; - chi.X[i] = chi.X[i] * (1.0 / norm); - chi.Y[i] = chi.Y[i] * (1.0 / norm); - } -} - -// Prints norms of the given vector of vector of functions -void TDDFT::print_norms(World &world, response_space f) { - // Container - Tensor norms(f.size(), f[0].size()); - - // Calc the norms - for (unsigned int i = 0; i < f.size(); i++) { - for (unsigned int j = 0; j < f[0].size(); j++) { norms(i, j) = f[i][j].norm2(); } - } - - // Print em in a smart way - if (world.rank() == 0) print(norms); -} - -// Small function to print geometry of a molecule nicely - -// Radial function -static double kronecker(size_t l, size_t n) { - if (l == n) return 1.0; - return 0.0; -} - -// Returns a list of solid harmonics such that: -// solid_harm.size() * num_ground_orbs > 2 * num. resp. components -std::map, real_function_3d> TDDFT::solid_harmonics(World &world, int n) { - // Container to return - std::map, real_function_3d> result; - - // Create the basic x, y, z, constant and zero - real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - real_function_3d c = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); - real_function_3d zero = real_factory_3d(world); - - // Add in first few, since they're simple - // Assuming n >= 1 - result[std::vector{0, 0}] = copy(c); - result[std::vector{0, -1}] = zero; - result[std::vector{0, 1}] = zero; - result[std::vector{-1, 0}] = zero; - - // Generate the solid harmonics recursively from here - for (int l = 0; l < n; l++) { - // Calculate ends of this row first - result[std::vector{l + 1, l + 1}] = - sqrt(pow(2, kronecker(l, 0) * (2 * l) / (2 * l + 1))) * - (x * result[std::vector{l, l}] - - (1 - kronecker(l, 0) * y * result[std::vector{l, -l}])); - result[std::vector{l + 1, -l - 1}] = - sqrt(pow(2, kronecker(l, 0) * (2 * l) / (2 * l + 1))) * - (y * result[std::vector{l, l}] + - (1 - kronecker(l, 0) * x * result[std::vector{l, -l}])); - - // Formula below calls for some functions that don't exist. - // Need zeroes where that would occur - result[std::vector{l + 1, l + 2}] = zero; - result[std::vector{l + 1, -l - 2}] = zero; - - // Run over quantum number m - for (int m = -l; m < l + 1; m++) { - // Calculate remaining terms - result[std::vector{l + 1, m}] = - 1.0 / std::sqrt((l + m + 1) * (l - m + 1)) * - ((2 * l + 1) * z * result[std::vector{l, m}] - - sqrt((l + m) * (l - m)) * (x * x + y * y + z * z) * - result[std::vector{l - 1, m}]); - } - } - - // Get rid of any zero functions we added - for (auto it = result.begin(); it != result.end();) { - if (it->second.norm2() == 0) it = result.erase(it); - else - ++it; - } - - // Also get rid of the constant - result.erase(std::vector{0, 0}); - - // Done - return result; -} - -// Returns a list of solid harmonics such that: -// solid_harm.size() * num_ground_orbs > 2 * num. resp. components -std::map, real_function_3d> TDDFT::simple_spherical_harmonics(World &world, - int n) { - // Container to return - std::map, real_function_3d> result; - - // Create the basic x, y, z, constant and zero - real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - real_function_3d c = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); - real_function_3d zero = real_factory_3d(world); - - real_function_3d rfunc = (x * x + y * y + z * z); - double r = rfunc.norm2(); - - std::vector funcs; - funcs[0] = c; - - funcs[1] = y.scale(1 / r); - funcs[2] = z.scale(1 / r); - funcs[3] = x.scale(1 / r); - - funcs[4] = x * y; - funcs[5] = y * z; - funcs[6] = 2 * z * z - x * x - y * y; - funcs[7] = z * x; - funcs[8] = x * x - y * y; - - funcs[4] = funcs[4].scale(1 / (r * r)); - funcs[5] = funcs[5].scale(1 / (r * r)); - funcs[6] = funcs[6].scale(1 / (r * r)); - funcs[7] = funcs[7].scale(1 / (r * r)); - funcs[8] = funcs[8].scale(1 / (r * r)); - - size_t num = 0; - for (int l = 0; l < n; l++) { - for (int m = -l; m <= l; m++) { - result[vector{l, m}] = funcs[num]; - num += 1; - } - } - - // Done - return result; -} - -// Returns initial guess functions as -// ground MO * solid harmonics -X_space TDDFT::create_trial_functions(World &world, size_t k, - std::vector &orbitals, size_t print_level) { - // Get size - print("In create trial functions"); - size_t n = orbitals.size(); - - // Create solid harmonics such that num. solids * num. orbitals > k. - // The total number of solid harmonics that exist up to level n is - // (n+1)^2 (because we count from zero) - // Always do at least 8 (through the d orbital angular momentum functions, - // minus ) - std::map, real_function_3d> solids = - solid_harmonics(world, std::max(2.0, ceil(sqrt(k / n) - 1))); - - // Useful info. - if (world.rank() == 0) print(" Created", solids.size(), "solid harmonics.\n"); - - // Container to return - response_space trials_X; - - // Counter for number of trials created - size_t count = 0; - - // Multiply each solid harmonic onto a ground state orbital - for (size_t i = 0; i < n; i++) { - // For each solid harmonic - for (const auto &key: solids) { - // Temp zero functions - std::vector temp = - zero_functions_compressed(world, static_cast(n)); - - // Create one non-zero function and add to trials - temp[count % n] = key.second * orbitals[n - count % n - 1]; - trials_X.push_back(temp); - count++; - } - - // Stop when we first get beyond k components - if (count >= k) break; - } - - // Debugging output - if (print_level >= 2) { - if (world.rank() == 0) print(" Norms of guess functions:"); - print_norms(world, trials_X); - } - - // Truncate - madness::truncate(world, trials_X, madness::FunctionDefaults<3>::get_thresh(), true); - - X_space trials(world, count, n); - trials.X = trials_X.copy(); - trials_X.clear(); - - // Done - return trials; -} - -// Returns initial guess functions as -// ground MO * -X_space TDDFT::create_trial_functions2(World &world, std::vector &orbitals, - size_t print_level) { - // Get size - size_t n = orbitals.size(); - size_t directions = 3; - // (n+1)^2 (because we count from zero) - // adsf - // - std::vector xyz = createDipoleFunctionMap(world); - // create 3 x n orbital functions - std::vector> functions; - - print("Debug Norms", xyz[0].norm2()); - print("Debug Norms", xyz[1].norm2()); - print("Debug Norms", xyz[2].norm2()); - - for (size_t d = 0; d < directions; d++) { - vector temp; - for (size_t i = 0; i < n; i++) { - // create x functions then y.. then z .. - temp.push_back(orbitals[i] * xyz[d]); - print("Debug Norms of temp ", i, "=", temp[i].norm2()); - print("Debug Norms of orbitals ", i, "=", orbitals[i].norm2()); - } - // all the x then the y then the z - functions.push_back(temp); - } - print("number of orbitals: ", orbitals.size()); - - // Container to return - size_t count = 0; - - X_space trials(world, 3 * n * n, n); - for (size_t i = 0; i < n; i++) { - for (size_t d = 0; d < directions; d++) { - for (size_t o = 0; o < n; o++) { - // trials[i + j + o][o] = functions[i][j]; - trials.X[count][o] = copy(functions.at(d).at(o)); - count++; - } - } - } - // The above generates response function as follows - // all functions start off as zeros - // 1 [x1 0 0 ] - // 2 [0 x1 0 ] - // 3 [0 0 x1 ] - // 4 [y1 0 0 ] - // 5 [0 y1 0 ] - // 6 [0 0 y1 ] - // 7 [z1 0 0 ] - // 8 [0 z1 0 ] - // 9 [0 0 z1 ] - // 10 [x2 0 0 ] - // 11 [0 x2 0 ] - // 12 [0 0 x2 ] - // 13 [y2 0 0 ] - // 14 [0 y2 0 ] - // 15 [0 0 y2 ] - // 16 [z2 0 0 ] - // 17 [0 z2 0 ] - // 18 [0 0 z2 ] - // 19 [x3 0 0 ] - // 20 [0 x3 0 ] - // 21 [0 0 x3 ] - // 22 [y3 0 0 ] - // 23 [0 y3 0 ] - // 24 [0 0 y3 ] - // 25 [z3 0 0 ] - // 26 [0 z3 0 ] - // 27 [0 0 z3 ] - // for each orbital for each direction - // Counter for number of trials created - // Multiply each solid harmonic onto a ground state orbital - // for each orbital we - - // For each solid harmonic - // Temp zero functions - - // Debugging output - if (print_level >= 2) { - if (world.rank() == 0) print(" Norms of guess functions:"); - print_norms(world, trials.X); - } - - // Truncate - madness::truncate(world, trials.X); - - // Done - return trials; -} - -// Returns a list of solid harmonics such that: -// solid_harm.size() * num_ground_orbs > 2 * num. resp. components -std::vector TDDFT::createDipoleFunctionMap(World &world) { - // Container to return - - // Create the basic x, y, z, constant and zero - real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - - // real_function_3d rfunc = (x * x + y * y + z * z); - // double r = rfunc.norm2(); - - std::vector funcs; - funcs.push_back(x); - funcs.push_back(y); - funcs.push_back(z); - // Done - return funcs; -} - -typedef Tensor tensorT; -typedef Function functionT; -typedef std::shared_ptr> functorT; -typedef FunctionFactory factoryT; - -response_space TDDFT::PropertyRHS(World &world, PropertyBase &p) const { - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - response_space rhs(world, p.num_operators, r_params.num_orbitals()); - - reconstruct(world, ground_orbitals); - QProjector Qhat(world, ground_orbitals); - // Set the dipoles (ground orbitals are probably - // more accurate now, so recalc the dipoles) - // why is it called dipole guess. - // This is just orbitals times dipole operator - std::vector orbitals = ground_orbitals; - - print("num operators ", p.num_operators); - for (size_t i = 0; i < p.num_operators; i++) { - // question here....MolecularDerivativeFunctor takes derivative with - // respect to axis atom and axis - // here we save - // need to project - - rhs[i] = mul(world, p.operator_vector.at(i), ground_orbitals, r_params.lo()); - - truncate(world, rhs[i]); - // rhs[i].truncate_vec(); - - // project rhs vectors for state - rhs[i] = Qhat(rhs[i]); - // truncate(world, rhs[i], true); - for (size_t j = 0; j < orbitals.size(); j++) { - print("RHS norm for after orbital ", j, "Response state ", i, ": ", rhs[i][j].norm2()); - } - - world.gop.fence(); - // core projector contribution - } - - // if (world.rank() ==dipole 0) print("derivatives:\n", r, ru, rc, ra); - molresponse::end_timer(world, "rhs vectors"); - return rhs; -} - -// Calculates ground state coulomb potential -real_function_3d TDDFT::Coulomb(World &world) { - // Coulomb operator - real_convolution_3d op = - CoulombOperator(world, r_params.lo(), FunctionDefaults<3>::get_thresh()); - - // Get density - std::vector vsq = square(world, ground_orbitals); - compress(world, vsq); - real_function_3d rho = real_factory_3d(world); - rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], 1.0, false); } - world.gop.fence(); - vsq.clear(); - - // Apply operator and truncate - rho = apply(op, rho); - rho.truncate(); - - // Done - return rho; -} - -response_space TDDFT::exchange(World &world, response_space &f) { - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - - // Container for results and others - response_space result(world, m, n); - real_function_3d psif = real_function_3d(world); - - // Modified 'small memory' algorithm from SCF.cc - f.reconstruct_rf(); - // K[ground_density]xp=\sum_i |i> - // for each state - // for each occ orbital - // - create the vector of orbital products - // - gaxpy to collect into result - // compute product - - // Run over each excited state - for (size_t k = 0; k < m; k++) { - // And run over each occupied state - for (size_t j = 0; j < n; j++) { - // Get a vector of transition densities - // v[i]= phi[i]*f[k][:] - auto phix = - mul_sparse(world, ground_orbitals[j], f[k], FunctionDefaults<3>::get_thresh()); - // Clean up - truncate(world, phix); - // Apply operator to each member of vector - phix = apply(world, *coulop, phix); - // Clean up - truncate(world, phix); - // Final multiplication of each member of vector by a single function - phix = mul_sparse(world, ground_orbitals[j], phix, FunctionDefaults<3>::get_thresh()); - // Add the vector to result - gaxpy(world, 1.0, result[k], 1.0, phix); - } - } - - // Truncate - madness::truncate(world, result); - - // Done! - return result; -} - -void TDDFT::make_nuclear_potential(World &world) { - molresponse::start_timer(world); - potential_manager = - std::shared_ptr(new PotentialManager(molecule, r_params.core_type())); - potential_manager->make_nuclear_potential(world); -} - -// Returns the ground state potential applied to functions f -// (V0 f) V0=(Vnuc+J0-K0+EXC0) -// J0=J[ground_density] -// K0=K[ground_density]f -// EXC0=EXC[ground_density] - -// result(i,j) = inner(a[i],b[j]).sum() -Tensor TDDFT::expectation(World &world, const response_space &A, const response_space &B) { - // Get sizes - MADNESS_ASSERT(A.size() > 0); - MADNESS_ASSERT(A.size() == B.size()); - MADNESS_ASSERT(A[0].size() > 0); - MADNESS_ASSERT(A[0].size() == B[0].size()); - - size_t dim_1 = A.size(); - size_t dim_2 = A[0].size(); - // Need to take transpose of each input ResponseFunction - response_space A_t(world, dim_2, dim_1); - response_space B_t(world, dim_2, dim_1); - for (size_t i = 0; i < dim_1; i++) { - for (size_t j = 0; j < dim_2; j++) { - A_t[j][i] = A[i][j]; - B_t[j][i] = B[i][j]; - } - } - // Container for result - Tensor result(dim_1, dim_1); - /** - * @brief - * [x1 x2 x3]T[x1 x2 x3] - * - */ - // Run over dimension two - // each vector in orbital has dim_1 response functoins associated - for (size_t p = 0; p < dim_2; p++) { result += matrix_inner(world, A_t[p], B_t[p]); } - - // Done - return result; -} - - -void TDDFT::PrintRFExpectation(World &world, response_space f, response_space g, std::string fname, - std::string gname) { - Tensor t = response_space_inner(f, g); - if (world.rank() == 0) { - print(" Expectation between ", fname, " and ", gname); - print(t); - } -} - -void TDDFT::PrintResponseVectorNorms(World &world, response_space f, std::string fname) { - if (world.rank() == 0) { - print(" Norms of ResVector: ", fname); - print(f.norm2()); - } -} - -// compute rms and maxabsval of vector of doubles -void TDDFT::vector_stats(const std::vector &v, double &rms, double &maxabsval) const { - rms = 0.0; - maxabsval = v[0]; - for (size_t i = 0; i < v.size(); ++i) { - rms += v[i] * v[i]; - maxabsval = std::max(maxabsval, std::abs(v[i])); - } - rms = sqrt(rms / v.size()); -} - -void TDDFT::vector_stats_new(const Tensor v, double &rms, double &maxabsval) const { - rms = 0.0; - for (size_t i = 0; i < v.size(); ++i) { rms += v[i] * v[i]; } - rms = sqrt(rms / v.size()); - maxabsval = v.max(); -} - - -double TDDFT::do_step_restriction(World &world, const vecfuncT &x, vecfuncT &x_new, - std::string spin) const { - std::vector anorm = norm2s(world, sub(world, x, x_new)); - size_t nres = 0; - for (unsigned int i = 0; i < x.size(); ++i) { - print("anorm ", i, " : ", anorm[i]); - if (anorm[i] > r_params.maxrotn()) { - double s = r_params.maxrotn() / anorm[i]; - ++nres; - if (world.rank() == 0) { - if (nres == 1 and (r_params.print_level() > 1)) - printf(" restricting step for %s orbitals:", spin.c_str()); - printf(" %d", i); - } - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - x_new[i].truncate(); - } - } - if (nres > 0 && world.rank() == 0 and (r_params.print_level() > 1)) printf("\n"); - - world.gop.fence(); - double rms, maxval; - vector_stats(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; -} - -double TDDFT::do_step_restriction(World &world, const vecfuncT &x, vecfuncT &x_new, - std::string spin, double maxrotn) const { - Tensor anorm = norm2s_T(world, sub(world, x, x_new)); - print("ANORM", anorm); - print("maxrotn: ", maxrotn); - for (unsigned int i = 0; i < x_new.size(); ++i) { - print("anorm ", i, " : ", anorm[i]); - if (anorm[i] > maxrotn) { - double s = maxrotn / anorm[i]; - /* -if (world.rank() == 0) { -if (nres == 1 and (r_params.print_level() > 1)) printf(" restricting step for -%s orbitals:", spin.c_str()); printf(" %d", i); -} -*/ - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - // x_new[i].truncate(); - } - } - world.gop.fence(); - double rms, maxval; - vector_stats_new(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; -} - -double TDDFT::do_step_restriction(World &world, const vecfuncT &x, const vecfuncT &y, - vecfuncT &x_new, vecfuncT &y_new, std::string spin) const { - // sub(world, x, x_new) - vecfuncT x_diff = sub(world, x, x_new); - vecfuncT y_diff = sub(world, y, y_new); - - // sub(world, x, x_new) - Tensor anorm_x = norm2s_T(world, x_diff); - Tensor anorm_y = norm2s_T(world, y_diff); - Tensor anorm(x.size()); - for (unsigned int i = 0; i < x.size(); ++i) { - anorm[i] = std::sqrt(anorm_x[i] * anorm_x[i] + anorm_y[i] * anorm_y[i]); - } - - for (unsigned int i = 0; i < x.size(); ++i) { - if (anorm[i] > r_params.maxrotn()) { - double s = r_params.maxrotn() / anorm[i]; - size_t nres = 0; - if (world.rank() == 0) { - if (nres == 1 and (r_params.print_level() > 1)) - printf(" restricting step for %s orbitals:", spin.c_str()); - printf(" %d", i); - } - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - y_new[i].gaxpy(s, y[i], 1.0 - s, false); - } - } - - world.gop.fence(); - double rms, maxval; - vector_stats_new(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; -} - -// Construct the Hamiltonian -// Returns the shift needed to make sure that -// -2.0 * (ground_state_energy + excited_state_energy) -// is negative. Please note: The same shift needs to -// be applied to the potential. -Tensor TDDFT::create_shift(World &world, Tensor &ground, Tensor &omega, - size_t print_level, std::string xy) { - // Start a timer - if (print_level >= 1) molresponse::start_timer(world); - - // Get sizes - size_t m = omega.size(); - size_t n = ground.size(); - - // Container to hold shift - Tensor result(m, n); - - // Run over excited components - for (size_t k = 0; k < m; k++) { - // Run over ground components - for (size_t p = 0; p < n; p++) { - if (ground(p) + omega(k) > 0) { - // Calculate the shift needed to get energy to -0.05, - // which was arbitrary (same as moldft) - result(k, p) = -(ground(p) + omega(k) + 0.05); - - // Basic output - if (print_level >= 2) { - if (world.rank() == 0) - printf(" Shift needed for transition from ground orbital %d to " - "response %s state %d\n", - static_cast(p), xy.c_str(), static_cast(k)); - if (world.rank() == 0) print(" Ground energy =", ground(p)); - if (world.rank() == 0) print(" Excited energy =", omega(k)); - if (world.rank() == 0) print(" Shifting by", result(k, p)); - if (world.rank() == 0) print(""); - } - } - } - } - - // End timer - if (print_level >= 1) molresponse::end_timer(world, "Create shift:"); - - // Done - return result; -} - -// Returns the shift needed to make sure that -// (ground_state_energy + excited_state_energy + shift) = target -// Please note: The same shift needs to be applied to the potential. -Tensor TDDFT::create_shift_target(World &world, Tensor &ground, - Tensor &omega, double target, size_t print_level, - std::string xy) { - // Start a timer - if (print_level >= 1) molresponse::start_timer(world); - - // Get sizes - size_t m = omega.size(); - size_t n = ground.size(); - - // Container to hold shift - Tensor result(m, n); - - // Run over excited components - for (size_t k = 0; k < m; k++) { - // Run over ground components - for (size_t p = 0; p < n; p++) { - // Calculate the shift needed to get energy to target - result(k, p) = -(ground(p) + omega(k) - target); - - // Basic output - if (print_level >= 2) { - if (world.rank() == 0) - printf(" Shift needed for transition from ground orbital %d to " - "response %s state %d\n", - static_cast(p), xy.c_str(), static_cast(k)); - if (world.rank() == 0) print(" Ground energy =", ground(p)); - if (world.rank() == 0) print(" Excited energy =", omega(k)); - if (world.rank() == 0) print(" Shifting by", result(k, p)); - if (world.rank() == 0) print(""); - } - } - } - - // End timer - if (print_level >= 1) molresponse::end_timer(world, "Create shift:"); - - // Done - return result; -} - -// Returns the given shift applied to the given potential -response_space TDDFT::apply_shift(World &world, Tensor &shifts, response_space &V, - response_space &f) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from V - size_t n = V[0].size(); - size_t m = V.size(); - - // Container to return - response_space shifted_V(world, m, n); - - // Run over occupied - for (size_t k = 0; k < m; k++) { - // Run over virtual - for (size_t p = 0; p < n; p++) { shifted_V[k][p] = V[k][p] + shifts(k, p) * f[k][p]; } - } - - shifted_V.truncate_rf(); - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply shift:"); - - // Done - return shifted_V; -} - -// Returns the given shift applied to the given potential -response_space TDDFT::apply_shift(World &world, double &shift, response_space &V, - response_space &f) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from V - size_t n = V[0].size(); - size_t m = V.size(); - - // Container to return - response_space shifted_V(world, m, n); - - // Run over occupied - for (size_t k = 0; k < m; k++) { - // Run over virtual - for (size_t p = 0; p < n; p++) { shifted_V[k][p] = V[k][p] + shift * f[k][p]; } - } - - shifted_V.truncate_rf(); - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply shift:"); - - // Done - return shifted_V; -} - -// Function to make a vector of BSH operators using ground and excited -// state energies -std::vector>> TDDFT::create_bsh_operators( - World &world, Tensor &shift, Tensor &ground, Tensor &omega, - double lo, double thresh) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from ground and omega - size_t n = ground.size(); - size_t m = omega.size(); - - // Make the vector - std::vector>> operators; - - // Make a BSH operator for each response function - // Run over excited components - for (size_t k = 0; k < m; k++) { - // Container for intermediary - std::vector> temp(n); - - // Run over occupied components - for (size_t p = 0; p < n; p++) { - double mu = sqrt(-2.0 * (ground(p) + omega(k) + shift(k, p))); - print("res state ", k, " orb ", p, " bsh exponent mu :", mu); - temp[p] = std::shared_ptr>( - BSHOperatorPtr3D(world, mu, lo, thresh)); - } - - // Add intermediary to return container - operators.push_back(temp); - } - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); - - // Done - return operators; -} - -// Function to make a vector of BSH operators using ground and excited -// state energies -std::vector>> -TDDFT::CreateBSHOperatorPropertyVector(World &world, Tensor &shift, Tensor &ground, - Tensor &omega, double lo, double thresh) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from ground and omega - size_t n = ground.size();// number of orbitals - size_t num_states = r_params.num_states(); - size_t num_freq = omega.size();// number of frequency states - // print("num of freq", num_freq); - - // Make the vector - std::vector>> operators; - - // Make a BSH operator for each response function - // Run over excited components - // print("num of states bsh step", num_states); - for (size_t k = 0; k < num_freq; k++) { - // Container for intermediary - std::vector> temp(n); - for (size_t state = 0; state < num_states; state++) { - // Run over occupied components - for (size_t p = 0; p < n; p++) { - temp[p] = std::shared_ptr>(BSHOperatorPtr3D( - world, sqrt(-2.0 * (ground(p) + omega(k) + shift(k, p))), lo, thresh)); - } - operators.push_back(temp); - } - - // Add intermediary to return container - } - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); - - // Done - return operators; -} - -std::vector TDDFT::make_bsh_operators_response(World &world, double &shift, - double &omega) const { - if (r_params.print_level() >= 1) molresponse::start_timer(world); - double tol = FunctionDefaults<3>::get_thresh(); - // Sizes inferred from ground and omega - size_t num_orbitals = ground_energies.size();// number of orbitals - std::vector ops(num_orbitals); - // Run over occupied components - for (size_t p = 0; p < num_orbitals; p++) { - double mu = sqrt(-2.0 * (ground_energies(p) + omega + shift)); - ops[p] = poperatorT(BSHOperatorPtr3D(world, mu, r_params.lo(), tol)); - } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "make bsh operators response"); - } - return ops; - // End timer -} - -// shift -std::vector> TDDFT::CreateBSHOperatorPropertyVector( - World &world, double &shift, Tensor &ground, double &omega, double lo, double eps) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from ground and omega - size_t num_ground_states = ground.size();// number of orbitals - // print("num of freq", num_freq); - - // Make the vector - std::vector> ghat_operators(num_ground_states); - - // Make a BSH operator for each response function - // Run over excited components - // print("num of states bsh step", num_states); - // Container for intermediary - // Run over occupied components - for (size_t p = 0; p < num_ground_states; p++) { - double mu = sqrt(-2.0 * (ground(p) + omega + shift)); - ghat_operators[p] = std::shared_ptr>( - BSHOperatorPtr3D(world, mu, lo, eps)); - } - // Add intermediary to return container - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); - - // Done - return ghat_operators; -} - - -void TDDFT::print_residual_norms(World &world, X_space &res, bool compute_y, size_t iteration) { - long m = static_cast(res.num_states()); - - Tensor x_norms(m); - Tensor y_norms(m); - for (long i = 0; i < m; i++) x_norms(i) = norm2(world, res.X[i]); - if (compute_y) { - for (size_t i = 0; i < m; i++) y_norms(i) = norm2(world, res.Y[i]); - } - if (r_params.print_level() >= 0 and world.rank() == 0) { - if (compute_y) { - std::cout << "res " << iteration << " X :"; - for (long i(0); i < m; i++) { std::cout << x_norms[i] << " "; } - std::cout << " Y :"; - for (long i(0); i < m; i++) { std::cout << y_norms[i] << " "; } - std::cout << endl; - } else { - print("resX ", iteration, " :", x_norms); - } - } -} - -X_space TDDFT::bsh_update_response(World &world, X_space &theta_X, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, - QProjector &projector, double &x_shifts) { - size_t m = theta_X.X.size(); - size_t n = theta_X.X.size_orbitals(); - bool compute_y = r_params.omega() != 0.0; - - molresponse::start_timer(world); - - theta_X.X += Chi.X * x_shifts; - theta_X.X += PQ.X; - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - - if (compute_y) { - theta_X.Y += PQ.Y; - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); - } - molresponse::end_timer(world, "Compute residual stuff theta_X"); - - // apply bsh - molresponse::start_timer(world); - X_space bsh_X(world, m, n); - - bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } - molresponse::end_timer(world, "Apply BSH to theta_X"); - - molresponse::start_timer(world); - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); - - if (compute_y) { - for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } - bsh_X.truncate(); - } else { - bsh_X.X.truncate_rf(); - bsh_X.Y = bsh_X.X.copy(); - } - molresponse::end_timer(world, "Project and truncate BSH_X"); - - return bsh_X; -} - -void TDDFT::update_x_space_excited(World &world, X_space &old_Chi, X_space &Chi, - X_space &old_Lambda_X, X_space &res, XCOperator &xc, - QProjector &projector, Tensor &omega, - NonLinearXsolver &kain_x_space, std::vector &Xvector, - std::vector &Xresidual, - Tensor &energy_residuals, Tensor &old_energy, - Tensor &bsh_residualsX, Tensor &bsh_residualsY, - Tensor &S, Tensor &old_S, Tensor &A, - Tensor &old_A, size_t iter, Tensor &maxrotn) { - size_t m = Chi.num_states(); - bool compute_y = not r_params.tda(); - - Tensor x_shifts(m); - Tensor y_shifts(m); - print("Entering Compute Lambda"); - - if (compute_y) { - gram_schmidt(world, Chi.X, Chi.Y); - normalize(world, Chi); - } else { - gram_schmidt(world, Chi.X); - normalize(world, Chi.X); - } - // - X_space Lambda_X = Compute_Lambda_X(world, Chi, xc, r_params.calc_type()); - // This diagonalizes XAX and computes new omegas - // updates Chi - print("omega before transform"); - print(omega); - old_energy = omega; - compute_new_omegas_transform(world, old_Chi, Chi, old_Lambda_X, Lambda_X, omega, old_energy, S, - old_S, A, old_A, energy_residuals, iter); - // now Chi is rotated to new position - // roatate Chi and old Chi saves this value - // old_Chi = Chi.copy(); - - print("omega before transform"); - print(old_energy); - print("omega after transform"); - print(omega); - // Analysis gets messed up if BSH is last thing applied - // so exit early if last iteration - if (iter == r_params.maxiter() - 1) { - print("Reached max iter"); - } else { - X_space theta_X = Compute_Theta_X(world, Chi, xc, r_params.calc_type()); - // Calculates shifts needed for potential / energies - print("BSH update iter = ", iter); - X_space temp = bsh_update_excited(world, omega, theta_X, projector); - - res = compute_residual(world, Chi, temp, bsh_residualsX, bsh_residualsY, - r_params.calc_type()); - // kain if iteration >0 or first run where there should not be a problem - // computed temp and res - if (r_params.kain() && (iter > 0) && true) { - temp = kain_x_space_update(world, Chi, res, kain_x_space, Xvector, Xresidual); - } - if (iter > 0) { x_space_step_restriction(world, Chi, temp, compute_y, maxrotn); } - - temp.X.truncate_rf(); - if (compute_y) temp.Y.truncate_rf(); - Chi = temp.copy(); - // print x norms - } - - // Apply mask - /* -for (size_t i = 0; i < m; i++) Chi.X[i] = mask * Chi.X[i]; -if (not r_params.tda()) { -for (size_t i = 0; i < m; i++) Chi.Y[i] = mask * Chi.Y[i]; -} -*/ -} - -// Load Balancing -void TDDFT::compute_new_omegas_transform(World &world, X_space &old_Chi, X_space &Chi, - X_space &old_Lambda_X, X_space &Lambda_X, - Tensor &omega, Tensor &old_energy, - Tensor &S, Tensor &old_S, - Tensor &A, Tensor &old_A, - Tensor &energy_residuals, size_t iter) { - size_t m = Chi.X.size(); - bool compute_y = not r_params.tda(); - // Basic output - if (r_params.print_level() >= 1 and world.rank() == 0) { - print("Before Deflate"); - print("\n Excitation Energies:"); - print("i=", iter, " roots: ", iter, omega); - } - if (!compute_y) { - deflateTDA(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, old_S, old_A, omega, iter, m); - // Constructing S - // Full TDHF - } else { - deflateFull(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, old_S, old_A, omega, iter, m); - } - - // Basic output - if (r_params.print_level() >= 1 and world.rank() == 0) { - print("After Deflate"); - print("\n Excitation Energies:"); - print("i=", iter, " roots: ", iter, omega); - } - - // Calculate energy residual and update old_energy - energy_residuals = abs(omega - old_energy); -} - -/** - * @brief Computes the BSH Update for an excited state calculation. Passes in - * omega and computes the necessary shifts in the potential, computes BSH - * operators and applys BSH operator - * - * \f$\boldsymbol{\chi}^m=-2 - * \boldsymbol{\hat{G}} * \boldsymbol{\Theta}\boldsymbol{\chi}\f$ - * - * @param world - * @param theta_X - * @param projector - * @param converged - * @return X_space - */ -X_space TDDFT::bsh_update_excited(World &world, const Tensor &omega, X_space &theta_X, - QProjector &projector) { - size_t m = theta_X.num_states(); - size_t n = theta_X.num_orbitals(); - bool compute_y = !r_params.tda(); - Tensor x_shifts(m); - Tensor y_shifts(m); - print("omega before shifts"); - Tensor omega_plus = omega; - Tensor omega_minus = -omega; - print(omega); - x_shifts = create_shift(world, ground_energies, omega_plus, r_params.print_level(), "x"); - // Compute Theta X - // Apply the shifts - theta_X.X = apply_shift(world, x_shifts, theta_X.X, Chi.X); - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - if (compute_y) { - // theta_X.Y = apply_shift(world, y_shifts, theta_X.Y, Chi.Y); - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); - } - // Construct BSH operators - std::vector>> bsh_x_ops = - create_bsh_operators(world, x_shifts, ground_energies, omega_plus, r_params.lo(), - FunctionDefaults<3>::get_thresh()); - std::vector>> bsh_y_ops; - if (compute_y) { - Tensor omega_minus = -omega; - bsh_y_ops = create_bsh_operators(world, y_shifts, ground_energies, omega_minus, - r_params.lo(), FunctionDefaults<3>::get_thresh()); - } - X_space bsh_X(world, m, n); - // Apply BSH and get updated response components - bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); - if (compute_y) { - for (size_t i = 0; i < m; i++) bsh_X.Y[i] = projector(bsh_X.Y[i]); - } - - // Only update non-converged components - for (size_t i = 0; i < m; i++) { - bsh_X.X[i] = bsh_X.X[i]; - bsh_X.X[i] = mask * bsh_X.X[i]; - if (compute_y) { - bsh_X.Y[i] = bsh_X.Y[i]; - bsh_X.Y[i] = mask * bsh_X.Y[i]; - } - } - // Ensure orthogonal guesses - - bsh_X.truncate(); - - return bsh_X; -} - -/** - * @brief Computes the the X_space kain update - * - * @param world - * @param temp - * @param res - * @param kain_x_space - * @param Xvector - * @param Xresidual - * @return X_space - */ -X_space TDDFT::kain_x_space_update(World &world, const X_space &temp, const X_space &res, - NonLinearXsolver &kain_x_space, std::vector &Xvector, - std::vector &Xresidual) { - size_t m = temp.num_states(); - size_t n = temp.num_orbitals(); - X_space kain_update(world, m, n); - molresponse::start_timer(world); - for (size_t b = 0; b < m; b++) { - Xvector[b].X[0] = copy(world, temp.X[b]); - Xvector[b].Y[0] = copy(world, temp.Y[b]); - Xresidual[b].X[0] = copy(world, res.X[b]); - Xresidual[b].Y[0] = copy(world, res.Y[b]); - } - - for (size_t b = 0; b < m; b++) { - // passing xvectors - X_vector kain_X = kain_x_space[b].update(Xvector[b], Xresidual[b], - FunctionDefaults<3>::get_thresh(), 3.0); - // deep copy of vector of functions - kain_update.X[b] = copy(world, kain_X.X[0]); - kain_update.Y[b] = copy(world, kain_X.Y[0]); - } - molresponse::end_timer(world, " KAIN update:"); - return kain_update; -} - -void TDDFT::x_space_step_restriction(World &world, X_space &old_Chi, X_space &temp, bool restrict_y, - Tensor &maxrotn) { - size_t m = old_Chi.num_states(); - molresponse::start_timer(world); - print(maxrotn); - - for (size_t b = 0; b < m; b++) { - if (true) { - // do_step_restriction(world, old_Chi.X[b], temp.X[b], old_Chi.Y[b], - // temp.Y[b], "x and y_response"); if the norm(new-old) > max - do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn[b]); - - do_step_restriction(world, old_Chi.Y[b], temp.Y[b], "y_response", maxrotn[b]); - // do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response"); - // do_step_restriction(world, old_Chi.Y[b], temp.Y[b], "y_response"); - } else { - do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn[b]); - } - } - - molresponse::end_timer(world, " Step Restriction:"); -} - -// Returns the second order update to the energies of the excited components -// Not currently used. -Tensor TDDFT::calculate_energy_update(World &world, response_space &rhs, - response_space &f_residuals, response_space &new_f, - size_t print_level, std::string xy) { - /* - * The correction is: - * \delta \omega^{(k)} = - \frac{ \sum_p\left< \hat{V}^0 x_p^{(k)}(r) - * + (1 - \hat{\rho}^0) \Gamma_p^{(k)}(r)\right| \left. x_p^{(k)} - - * \~{x}_p^{(k)} \right> } { \sum_p \left| \left| \~{x}_p^{(k)} \right| - * \right|^2 } - */ - - // Basic output - if (print_level >= 1) { - if (world.rank() == 0) - printf(" Calculating energy residuals for %s components\n", xy.c_str()); - } - - // Size inferred - size_t m = rhs.size(); - - // Container for updates - Tensor updates(m); - - // Need to run over all functions in rhs and calculate inner products. - // rhs contains the bra in the braket notation above, and f_residuals - // is the ket. - - // Run over excited components - for (size_t k = 0; k < m; k++) { - // vmra.h function, line 627 - // Sum is included inside function call - updates(k) = inner(f_residuals[k], rhs[k]); - - // Normalize update function - // The -1.0 is the leading coefficient in the update formula - // the 1/2 is to undo the scaling of V - updates(k) = -1.0 / 2.0 * updates(k) / inner(new_f[k], new_f[k]); - } - - if (print_level >= 1) { - // Print energy deltas - if (world.rank() == 0) printf(" Energy residuals for %s components:\n", xy.c_str()); - if (world.rank() == 0) print("Er: ", abs(updates)); - } - - // Done? - return updates; -} - -vecfuncT TDDFT::make_density(World &world, X_space &Chi, std::string calc_type) { - molresponse::start_timer(world); - vecfuncT rho_omega; - if (calc_type.compare("full") == 0) { - rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.Y); - } else if (calc_type.compare("static") == 0) { - rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.X); - } else { - rho_omega = transition_densityTDA(world, ground_orbitals, Chi.X); - } - - molresponse::end_timer(world, "Make density omega"); - print_meminfo(world.rank(), "Make density omega"); - world.gop.fence(); - return rho_omega; -} - -// Specialized for response calculations that returns orthonormalized -// functions -response_space TDDFT::gram_schmidt(World &world, response_space &f) { - // Sizes inferred - size_t m = f.size(); - - // Return container - response_space result = f.copy(); - - // Orthogonalize - for (size_t j = 0; j < m; j++) { - // Need to normalize the row - double norm = norm2(world, result[j]); - - // Now scale each entry - scale(world, result[j], 1.0 / norm); - - // Project out from the rest of the vectors - for (size_t k = j + 1; k < m; k++) { - // Temp function to hold the sum - // of inner products - // vmra.h function, line 627 - double temp = inner(result[j], result[k]); - - // Now subtract - gaxpy(world, 1.0, result[k], -temp, result[j]); - } - } - - result.truncate_rf(); - - // Done - return result; -} - -// Specialized for response calculations that returns orthonormalized -// functions -void TDDFT::gram_schmidt(World &world, response_space &f, response_space &g) { - // Sizes inferred - size_t m = f.size(); - - // Orthogonalize - for (size_t j = 0; j < m; j++) { - // Need to normalize the row - double norm = inner(f[j], f[j]) - inner(g[j], g[j]); - - // Now scale each entry - scale(world, f[j], 1.0 / sqrt(norm)); - scale(world, g[j], 1.0 / sqrt(norm)); - - // Project out from the rest of the vectors - for (size_t k = j + 1; k < m; k++) { - // Temp function to hold the sum - // of inner products - // vmra.h function, line 627 - double temp = inner(f[j], f[k]) - inner(g[j], g[k]); - - // Now subtract - gaxpy(world, 1.0, f[k], -temp, f[j]); - gaxpy(world, 1.0, g[k], -temp, g[j]); - } - } - - f.truncate_rf(); - g.truncate_rf(); -} - -// Returns the max norm of the given vector of functions -double TDDFT::calculate_max_residual(World &world, response_space &f) { - // Container for max - double max = 0.0; - - // Run over all functions in f - for (unsigned int i = 0; i < f.size(); i++) { - double temp = 0.0; - - for (unsigned int j = 0; j < f[0].size(); j++) { temp += pow(f[i][j].norm2(), 2); } - - temp = sqrt(temp); - - if (temp > max) max = temp; - } - - // Done - return max; -} - -// Selects the 'active' orbitals from ground state orbitals to be used in -// the calculation (based on energy distance from the HOMO). Function needs -// knowledge of ground_orbitals and g_params.energies. Function sets -// act_orbitals and num_act_orbitals. -void TDDFT::select_active_subspace(World &world) { - // Default output - if (r_params.print_level() >= 0) { - // Set print output to something reasonable - std::cout.precision(2); - std::cout << std::fixed; - - if (world.rank() == 0) - print(" Selecting ground state subspace to excite from for " - "components."); - if (world.rank() == 0) - print(" This is all orbitals between", r_params.e_range_lo(), "and", - r_params.e_range_hi(), "\n"); - - // Reset precision - std::cout.precision(10); - std::cout << std::scientific; - } - - // Determine active orbitals based on energy differences - // from HOMO - for (unsigned int i = 0; i < r_params.num_orbitals(); i++) { - if (r_params.e_range_lo() < g_params.get_energies()(i) and - g_params.get_energies()(i) < r_params.e_range_hi()) { - // This orbital should be active, so add to list - active.push_back(i); - } - } - - // Make sure we have at least one ground state orbital to excite from - MADNESS_ASSERT(active.size() > 0); - - // Now that we know size, allocate act_ground_energies - act_ground_energies = Tensor(active.size()); - - // Now to pull the functions and energies and add to act_orbitals and - // act_ground_energies - for (unsigned int i = 0; i < active.size(); i++) { - act_orbitals.push_back(ground_orbitals[active[i]]); - act_ground_energies(i) = g_params.get_energies()(active[i]);// Put energies on diagonal - } - - // Also set the active size - act_num_orbitals = act_orbitals.size(); - - print("Found", act_num_orbitals, "active orbitals."); -} - -// Selects from a list of functions and energies the k functions with the -// lowest energy -response_space TDDFT::select_functions(World &world, response_space &f, Tensor &energies, - size_t k, size_t print_level) { - // Container for result - response_space answer; - - // Debugging output - if (print_level >= 1) { - if (world.rank() == 0) - print("\n Selecting the", k, "lowest excitation energy components.\n"); - } - - // Get rid of extra functions and save - // the first k - while (f.size() > k) f.pop_back(); - answer = f; - answer.truncate_rf(); - - // Get rid of extra energies and save - // the first k - energies = energies(Slice(0, k - 1)); - - // Basic output - if (print_level >= 1) { - if (world.rank() == 0) print(" The selected components have excitation energies:"); - if (world.rank() == 0) print(energies); - } - - // Done - return answer; -} - -// Calculate the exponentiation of a matrix through first order (I think) -Tensor TDDFT::matrix_exponential(const Tensor &A) { - const double tol = 1e-13; - MADNESS_ASSERT(A.dim((0) == A.dim(1))); - - // Scale A by a power of 2 until it is "small" - double anorm = A.normf(); - size_t n = 0; - double scale = 1.0; - while (anorm * scale > 0.1) { - ++n; - scale *= 0.5; - } - Tensor B = scale * A;// B = A*2^-n - - // Compute exp(B) using Taylor series - Tensor expB = Tensor(2, B.dims()); - for (int64_t i = 0; i < expB.dim(0); ++i) expB(i, i) = 1.0; - - size_t k = 1; - Tensor term = B; - while (term.normf() > tol) { - expB += term; - term = inner(term, B); - ++k; - term.scale(1.0 / k); - } - - // Repeatedly square to recover exp(A) - while (n--) { expB = inner(expB, expB); } - - return expB; -} - -/// compute the unitary transformation that diagonalizes the fock matrix - -/// @param[in] world the world -/// @param[in] overlap the overlap matrix of the orbitals -/// @param[inout] fock the fock matrix; diagonal upon exit -/// @param[out] evals the orbital energies -/// @param[in] thresh_degenerate threshold for orbitals being -/// degenerate -/// @return the unitary matrix U: U^T F U = evals -Tensor TDDFT::get_fock_transformation(World &world, Tensor &overlap, - Tensor &fock, Tensor &evals, - const double thresh_degenerate) { - // Run an SVD on the overlap matrix and ignore values - // less than thresh_degenerate - Tensor r_vecs; - Tensor s_vals; - Tensor l_vecs; - Tensor overlap_copy = copy(overlap); - svd(overlap_copy, l_vecs, s_vals, r_vecs); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print("\n Singular values of overlap matrix:"); - print(s_vals); - print(" Left singular vectors of overlap matrix:"); - print(l_vecs); - } - - // Check how many singular values are less than 10*thresh_degen - size_t num_sv = 0; - for (int64_t i = 0; i < s_vals.dim(0); i++) { - if (s_vals(i) < 10 * thresh_degenerate) { - if (world.rank() == 0 and num_sv == 0) print(""); - if (world.rank() == 0) - printf(" Detected singular value (%.8f) below threshold (%.8f). " - "Reducing subspace size.\n", - s_vals(i), 10 * thresh_degenerate); - num_sv++; - } - if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_sv > 0) print(""); - } - - // Going to use these a lot here, so just calculate them - size_t size_l = s_vals.dim(0); - size_t size_s = size_l - num_sv; - Tensor l_vecs_s(size_l, num_sv); - - // Transform into this smaller space if necessary - if (num_sv > 0) { - // Cut out the singular values that are small - // (singular values come out in descending order) - overlap = Tensor(size_s, size_s); - for (size_t i = 0; i < size_s; i++) overlap(i, i) = s_vals(i); - - // Copy the active vectors to a smaller container - l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Reduced size left singular vectors of overlap matrix:"); - print(l_vecs_s); - } - - // Transform - Tensor work(size_l, size_s); - mxm(size_l, size_s, size_l, work.ptr(), fock.ptr(), l_vecs_s.ptr()); - fock = Tensor(size_s, size_s); - Tensor l_vecs_t = transpose(l_vecs); - mxm(size_s, size_s, size_l, fock.ptr(), l_vecs_t.ptr(), work.ptr()); - } - - // Diagonalize using lapack - Tensor U; - sygv(fock, overlap, 1, U, evals); - - int64_t nmo = fock.dim(0);// NOLINT - - bool switched = true; - while (switched) { - switched = false; - for (int64_t i = 0; i < nmo; i++) { - for (int64_t j = i + 1; j < nmo; j++) { - double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); - double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); - if (snew > sold) { - Tensor tmp = copy(U(_, i)); - U(_, i) = U(_, j); - U(_, j) = tmp; - std::swap(evals[i], evals[j]); - switched = true; - } - } - } - } - - // Fix phases. - for (int64_t i = 0; i < nmo; ++i)// NOLINT - if (U(i, i) < 0.0) U(_, i).scale(-1.0); - - // Rotations between effectively degenerate components confound - // the non-linear equation solver ... undo these rotations - int64_t ilo = 0;// first element of cluster NOLINT - while (ilo < nmo - 1) { - int64_t ihi = ilo;// NOLINT - while (fabs(evals[ilo] - evals[ihi + 1]) < - thresh_degenerate * 100.0 * std::max(fabs(evals[ilo]), 1.0)) { - ++ihi; - if (ihi == nmo - 1) break; - } - int64_t nclus = ihi - ilo + 1;// NOLINT - if (nclus > 1) { - Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); - - // Polar Decomposition - Tensor VH(nclus, nclus); - Tensor W(nclus, nclus); - Tensor sigma(nclus); - - svd(q, W, sigma, VH); - q = transpose(inner(W, VH));// Should be conj. tranpose if complex - U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); - } - ilo = ihi + 1; - } - - fock = 0; - for (unsigned int i = 0; i < nmo; ++i) fock(i, i) = evals(i); - - // If we transformed into the smaller subspace, time to transform back - if (num_sv > 0) { - // Temp. storage - Tensor temp_U(size_l, size_l); - Tensor U2(size_l, size_l); - - // Copy U back to larger size - temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); - for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; - - // Transform back - mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); - - U = copy(U2); - } - - return U; -} - -// Sorts the given Tensor of energies -Tensor TDDFT::sort_eigenvalues(World &world, Tensor &vals, Tensor &vecs) { - // Get relevant sizes - size_t k = vals.size(); - - // Tensor to hold selection order - Tensor selected(k); - - // Copy everything... - std::vector vals_copy; - for (size_t i = 0; i < k; i++) vals_copy.push_back(vals[i]); - Tensor vals_copy2 = copy(vals); - Tensor vecs_copy = copy(vecs); - - // Now sort vals_copy - std::sort(vals_copy.begin(), vals_copy.end()); - - // Now sort the rest of the things, using the sorted energy list - // to find the correct indices - for (size_t i = 0; i < k; i++) { - // Find matching index in sorted vals_copy - size_t j = 0; - while (fabs(vals_copy[i] - vals_copy2[j]) > 1e-8 && j < k) j++; - - // Add in to list which one we're taking - selected(i) = j; - - // Put corresponding things in the correct place - vals(i) = vals_copy[i]; - vecs(_, i) = vecs_copy(_, j); - - // Change the value of vals_copy2[j] to help deal with duplicates? - vals_copy2[j] = 10000.0; - } - - // Done - return selected; -} - -/// diagonalize the fock matrix, taking care of degenerate components - -/// Vpsi is passed in to make sure orbitals and Vpsi are in phase -/// @param[in] world the world -/// @param[in] fock -/// @param[inout] psi the orbitals -/// @param[inout] Vpsi the orbital times the potential -/// @param[inout] gamma the orbital times the perturbed potential -/// @param[out] evals the orbital energies -/// @param[in] overlap the overlap matrix -/// @param[in] thresh threshold for rotation and truncation -Tensor TDDFT::diagonalizeFockMatrix(World &world, X_space &Chi, X_space &Lambda_X, - Tensor &evals, Tensor &A, - Tensor &S, const double thresh) { - // compute the unitary transformation matrix U that diagonalizes - // the fock matrix - Tensor U = get_fock_transformation(world, S, A, evals, thresh); - - // Sort into ascending order - Tensor selected = sort_eigenvalues(world, evals, U); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" U:"); - print(U); - } - - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // transform the orbitals and the potential - // Truncate happens inside here - Chi.X = transform(world, Chi.X, U); - Lambda_X.X = transform(world, Lambda_X.X, U); - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); - - // Normalize x - normalize(world, Chi.X); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Eigenvector coefficients from diagonalization:"); - print(U); - } - - return U; -} - -// Transforms the given matrix of functions according to the give -// transformation matrix. Used to update orbitals / potential -response_space TDDFT::transform(World &world, response_space &f, Tensor &U) { - // Return container - response_space result; - - // Go element by element - for (unsigned int i = 0; i < f.size(); i++) { - // Temp for the result of one row - std::vector temp = - zero_functions_compressed(world, f[0].size()); - - for (unsigned int j = 0; j < f.size(); j++) { gaxpy(world, 1.0, temp, U(j, i), f[j]); } - - // Add to temp to result - result.push_back(temp); - } - - result.truncate_rf(); - - // Done - return result; -} - -// If using a larger subspace to diagonalize in, this will put everything in -// the right spot -/** - * @brief Diagonolize in larger subspace x - * - * @param world - * @param S - * @param A - * @param Current Ax - * @param Last Axold - * @param x_response - * @param old_S - * @param old_A - * @param old_x_response - * @param print_level - */ - -void TDDFT::augment(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &last_Lambda_X, Tensor &S, Tensor &A, - Tensor &old_S, Tensor &old_A, size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - // Get sizes - size_t m = Chi.X.size(); - // Create work space, will overwrite S and A in the end - Tensor temp_S(2 * m, 2 * m); - Tensor temp_A(2 * m, 2 * m); - /** - * @brief Need to create off diagonal blocks of A - * A= - * [xAx xAx_old ] - * [xoldAx xoldAxold] - * - */ - // Calculate correct inner products of upper off diagonal - - Tensor off = response_space_inner(Chi.X, last_Lambda_X.X); - temp_A(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off);// top right - // Now for lower off diagonal - off = response_space_inner(old_Chi.X, Lambda_X.X); - temp_A(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off); // bottom left - temp_A(Slice(0, m - 1), Slice(0, m - 1)) = copy(A); // xAx top left - temp_A(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_A);// xoldAxold bottom right - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" Before symmeterizing A:"); - print(temp_A); - } - // Save temp_A as A_x - // Need to symmeterize A as well (?) - A = 0.5 * (temp_A + transpose(temp_A)); - /** - * @brief Creating S - * S= [ ] - * [ ] - */ - // Now create upper off diagonal block of S - off = expectation(world, Chi.X, old_Chi.X); - // Use slicing to put in correct spot - temp_S(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off);// top right - // Now the lower off diagonal block - // (Go ahead and cheat and use the transpose...) - off = transpose(off);// just transpose - // Use slicing to put in correct spot - temp_S(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off);// bottom right - // Put together the rest of S - temp_S(Slice(0, m - 1), Slice(0, m - 1)) = copy(S); // top left - temp_S(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_S);// - // Save temp_S as S_x - S = copy(temp_S); - // Add in old vectors to current vectors for the appropriate ones - // Augment the vectors step - for (size_t i = 0; i < m; i++) { - Chi.X.push_back(old_Chi.X[i]); - Lambda_X.X.push_back(last_Lambda_X.X[i]); - } - - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print("\n Augmented response matrix:"); - print(A); - } - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" Augmented overlap matrix:"); - print(S); - } - - // SUPER debugging - if (print_level >= 3) { - if (world.rank() == 0) print(" Calculating condition number of aug. response matrix"); - } -} - -// If using a larger subspace to diagonalize in, this will put everything in -// the right spot -void TDDFT::augment_full(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &last_Lambda_X, Tensor &S, Tensor &A, - Tensor &old_S, Tensor &old_A, size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - size_t m = Chi.num_states(); - for (size_t i = 0; i < m; i++) { - Chi.push_back(copy(world, old_Chi.X[i]), copy(world, old_Chi.Y[i])); - Lambda_X.push_back(copy(world, last_Lambda_X.X[i]), copy(world, last_Lambda_X.Y[i])); - } - Tensor temp_A = inner(Chi, Lambda_X); - A = 0.5 * (temp_A + transpose(temp_A)); - S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); - - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print("\n Augmented response matrix:"); - print(A); - } - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" Augmented overlap matrix:"); - print(S); - } - - // SUPER debugging - if (print_level >= 3) { - if (world.rank() == 0) print(" Calculating condition number of aug. response matrix"); - } -} -// If using a larger subspace to diagonalize in, after diagonalization this -// will put everything in the right spot - -void TDDFT::unaugment(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &last_Lambda_X, Tensor &omega, Tensor &S_x, - Tensor &A_x, Tensor &old_S, Tensor &old_A, - size_t num_states, size_t iter, size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - // Note: the eigenvalues and vectors were sorted after diagonalization - // and hence all the functions are sorted in ascending order of energy - - // Quick copy of m lowest eigenvalues - omega = omega(Slice(0, num_states - 1)); - // Pop off the "m" vectors off the back end of appropriate vectors - // (only after first iteration) - if (iter > 0) { - for (size_t i = 0; i < num_states; i++) { - Chi.X.pop_back(); - Lambda_X.X.pop_back(); - } - } - old_Chi.X = Chi.X.copy(); - last_Lambda_X.X = Lambda_X.X.copy(); - - old_S = response_space_inner(Chi.X, Chi.X); - old_A = Tensor(num_states, num_states); - for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Unaug. resp. mat.:"); -} -// If using a larger subspace to diagonalize in, after diagonalization this -// will put everything in the right spot - -void TDDFT::unaugment_full(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &last_Lambda_X, Tensor &omega, Tensor &S_x, - Tensor &A_x, Tensor &old_S, Tensor &old_A, - size_t num_states, size_t iter, size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - // Note: the eigenvalues and vectors were sorted after diagonalization - // and hence all the functions are sorted in ascending order of energy - - // Quick copy of m lowest eigenvalues - omega = omega(Slice(0, num_states - 1)); - - // Pop off the "m" vectors off the back end of appropriate vectors - // (only after first iteration) - print("Entering Loop to pop_back Chi and LambdaX"); - if (iter > 0) { - for (size_t i = 0; i < num_states; i++) { - print("pop back Chi and LambdaX"); - Chi.pop_back(); - Lambda_X.pop_back(); - } - } - - old_Chi = Chi.copy(); - last_Lambda_X = Lambda_X.copy(); - - old_S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); - old_A = Tensor(num_states, num_states); - for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Unaug. resp. mat.:"); -} -// Diagonalize the full response matrix, taking care of degenerate -// components Why diagonalization and then transform the x_fe vectors - -Tensor TDDFT::diagonalizeFullResponseMatrix(World &world, X_space &Chi, X_space &Lambda_X, - Tensor &omega, Tensor &S, - Tensor &A, const double thresh, - size_t print_level) { - // compute the unitary transformation matrix U that diagonalizes - // the response matrix - Tensor U = GetFullResponseTransformation(world, S, A, omega, thresh); - - // Sort into ascending order - // Tensor selected = sort_eigenvalues(world, omega, U); - - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - Chi.X = transform(world, Chi.X, U); - Chi.Y = transform(world, Chi.Y, U); - Tensor Sxa, Sya, Sa; - - Sxa = response_space_inner(Chi.X, Chi.X); - Sya = response_space_inner(Chi.Y, Chi.Y); - Sa = Sxa - Sya; - - if (world.rank() == 0 and r_params.print_level() >= 10) { - print("\n After apply transform Overlap Matrix:"); - print(Sxa); - print(Sya); - print(Sa); - } - - Lambda_X.X = transform(world, Lambda_X.X, U); - Lambda_X.Y = transform(world, Lambda_X.Y, U); - // Transform the vectors of functions - // Truncate happens in here - // we do transform here - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); - - // Normalize x and y - normalize(world, Chi); - - // Debugging output - if (world.rank() == 0 and print_level >= 2) { - print(" Eigenvector coefficients from diagonalization:"); - print(U); - } - - // Return the selected functions - return U; -} - -// Similar to what robert did above in "get_fock_transformation" -Tensor TDDFT::GetFullResponseTransformation(World &world, Tensor &S, - Tensor &A, Tensor &evals, - const double thresh_degenerate) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Get size - size_t m = S.dim(0); - - // Run an SVD on the overlap matrix and ignore values - // less than thresh_degenerate - Tensor r_vecs, s_vals, l_vecs; - Tensor S_copy = copy(S); - /** - * @brief SVD on overlap matrix S - * S=UsVT - * S, U, s , VT - * - */ - svd(S_copy, l_vecs, s_vals, r_vecs); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print("\n Singular values of overlap matrix:"); - print(s_vals); - print(" Left singular vectors of overlap matrix:"); - print(l_vecs); - } - - // Check how many singular values are less than 10*thresh_degen - size_t num_zero = 0; - for (int64_t i = 0; i < s_vals.dim(0); i++) { - if (s_vals(i) < 10 * thresh_degenerate) { - if (world.rank() == 0 and num_zero == 0) print(""); - if (world.rank() == 0) - printf(" Detected singular value (%.8f) below threshold (%.8f). " - "Reducing subspace size.\n", - s_vals(i), 10 * thresh_degenerate); - num_zero++; - } - if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_zero > 0) print(""); - } - - // Going to use these a lot here, so just calculate them - size_t size_l = s_vals.dim(0); // number of singular values - size_t size_s = size_l - num_zero;// smaller subspace size - /** - * @brief l_vecs_s(m,1) - * - * @return Tensor - */ - Tensor l_vecs_s(size_l, - num_zero);// number of sv by number smaller than thress - Tensor copyA = copy(A); // we copy xAx - - // Transform into this smaller space if necessary - if (num_zero > 0) { - print("num_zero = ", num_zero); - // Cut out the singular values that are small - // (singular values come out in descending order) - - // S(m-sl,m-sl) - S = Tensor(size_s, size_s);// create size of new size - for (size_t i = 0; i < size_s; i++) S(i, i) = s_vals(i); - // Copy the active vectors to a smaller container - // left vectors [m,m-sl] - l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Reduced size left singular vectors of overlap matrix:"); - print(l_vecs_s); - } - - // Transform - // Work(m,m-sl) - Tensor work(size_l, size_s); - /* - c(i,j) = c(i,j) + sum(k) a(i,k)*b(k,j) - - where it is assumed that the last index in each array is has unit - stride and the dimensions are as provided. - - 4-way unrolled k loop ... empirically fastest on PIII - compared to 2/3 way unrolling (though not by much). -*/ - // dimi,dimj,dimk,c,a,b - mxm(size_l, size_s, size_l, work.ptr(), A.ptr(), l_vecs_s.ptr()); - // A*left - copyA = Tensor(size_s, size_s); - Tensor l_vecs_t = transpose(l_vecs); - // s s l, copyA=lvect_t*A*left - mxm(size_s, size_s, size_l, copyA.ptr(), l_vecs_t.ptr(), work.ptr()); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Reduced response matrix:"); - print(copyA); - print(" Reduced overlap matrix:"); - print(S); - } - } - // Diagonalize (NOT A SYMMETRIC DIAGONALIZATION!!!!) - // Potentially complex eigenvalues come out of this - Tensor> omega(size_s); - Tensor U(size_s, size_s); - ggevp(world, copyA, S, U, omega); - - // Eigenvectors come out oddly packaged if there are - // complex eigenvalues. - // Currently only supporting real valued eigenvalues - // so throw an error if any imaginary components are - // not zero enough - double max_imag = abs(imag(omega)).max(); - if (world.rank() == 0 and r_params.print_level() >= 2) - print("\n Max imaginary component of eigenvalues:", max_imag, "\n"); - MADNESS_ASSERT(max_imag <= r_params.dconv());// MUST BE REAL! - evals = real(omega); - - // Easier to just resize here - m = evals.dim(0); - - bool switched = true; - while (switched) { - switched = false; - for (size_t i = 0; i < m; i++) { - for (size_t j = i + 1; j < m; j++) { - double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); - double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); - if (snew > sold) { - Tensor tmp = copy(U(_, i)); - U(_, i) = U(_, j); - U(_, j) = tmp; - std::swap(evals[i], evals[j]); - switched = true; - } - } - } - } - - // Fix phases. - for (size_t i = 0; i < m; ++i) - if (U(i, i) < 0.0) U(_, i).scale(-1.0); - - // Rotations between effectively degenerate components confound - // the non-linear equation solver ... undo these rotations - size_t ilo = 0;// first element of cluster - while (ilo < m - 1) { - size_t ihi = ilo; - while (fabs(evals[ilo] - evals[ihi + 1]) < - thresh_degenerate * 10.0 * std::max(fabs(evals[ilo]), 1.0)) { - ++ihi; - if (ihi == m - 1) break; - } - int64_t nclus = ihi - ilo + 1; - if (nclus > 1) { - Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); - - // Polar Decomposition - Tensor VH(nclus, nclus); - Tensor W(nclus, nclus); - Tensor sigma(nclus); - - svd(q, W, sigma, VH); - q = transpose(inner(W, VH));// Should be conj. tranpose if complex - U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); - } - ilo = ihi + 1; - } - - // If we transformed into the smaller subspace, time to transform back - if (num_zero > 0) { - // Temp. storage - Tensor temp_U(size_l, size_l); - Tensor U2(size_l, size_l); - - // Copy U back to larger size - temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); - for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; - - // Transform U back - mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); - U = copy(U2); - } - - // Sort into ascending order - Tensor selected = sort_eigenvalues(world, evals, U); - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Diag. resp. mat."); - - return U; -} - -// Sorts the given tensor of eigenvalues and -// response functions -void TDDFT::sort(World &world, Tensor &vals, response_space &f) { - // Get relevant sizes - size_t k = vals.size(); - - // Copy everything... - response_space f_copy(f); - Tensor vals_copy = copy(vals); - Tensor vals_copy2 = copy(vals); - - // Now sort vals_copy - std::sort(vals_copy.ptr(), vals_copy.ptr() + vals_copy.size()); - - // Now sort the rest of the things, using the sorted energy list - // to find the correct indices - for (size_t i = 0; i < k; i++) { - // Find matching index in sorted vals_copy - size_t j = 0; - while (fabs(vals_copy(i) - vals_copy2(j)) > 1e-8 && j < k) j++; - - // Put corresponding function, difference function, value residual and - // value in the correct place - f[i] = f_copy[j]; - vals(i) = vals_copy(i); - - // Change the value of vals_copy2[j] to help deal with duplicates? - vals_copy2(j) = 10000.0; - } -} - -void TDDFT::sort(World &world, Tensor &vals, X_space &f) { - // Get relevant sizes - size_t k = vals.size(); - - // Copy everything... - X_space f_copy(f); - Tensor vals_copy = copy(vals); - Tensor vals_copy2 = copy(vals); - - // Now sort vals_copy - std::sort(vals_copy.ptr(), vals_copy.ptr() + vals_copy.size()); - - // Now sort the rest of the things, using the sorted energy list - // to find the correct indices - for (size_t i = 0; i < k; i++) { - // Find matching index in sorted vals_copy - size_t j = 0; - while (fabs(vals_copy(i) - vals_copy2(j)) > 1e-8 && j < k) j++; - - // Put corresponding function, difference function, value residual and - // value in the correct place - f.X[i] = f_copy.X[j]; - f.Y[i] = f_copy.Y[j]; - - vals(i) = vals_copy(i); - - // Change the value of vals_copy2[j] to help deal with duplicates? - vals_copy2(j) = 10000.0; - } -} - -/** - * @brief Diagonalize AX=SX omega - * - * @param world - * @param S - * @param old_S - * @param old_A - * @param x_response - * @param old_x_response - * @param ElectronResponses - * @param OldElectronResponses - * @param omega - * @param iteration - * @param m - */ - -void TDDFT::deflateGuesses(World &world, X_space &Chi, X_space &Lambda_X, Tensor &S, - Tensor &omega, size_t &iteration, size_t &m) { - // XX =Omega XAX - S = response_space_inner(Chi.X, Chi.X); - Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Guess Overlap matrix:"); - print(S); - print(" Guess XAX matrix:"); - print(XAX); - } - // Just to be sure dimensions work out, clear omega - omega.clear(); - diagonalizeFockMatrix(world, Chi, Lambda_X, omega, XAX, S, FunctionDefaults<3>::get_thresh()); -} - -void TDDFT::deflateTDA(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &old_Lambda_X, Tensor &S, Tensor old_S, - Tensor old_A, Tensor &omega, size_t &iteration, size_t &m) { - S = response_space_inner(Chi.X, Chi.X); - Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Overlap matrix:"); - print(S); - } - - // Augment S_x, A_x, x_gamma, x_response, V_x_response and x_gamma - // if using a larger subspace and not iteration zero (TODO ---Gotta - // look at this and make sure it uses my new functions molresponse ) - // by default r_params.larger_subspace() = 0 therefore never uses this - if (iteration < r_params.larger_subspace() and iteration > 0) { - print("Using augmented subspace"); - augment(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, XAX, old_S, old_A, - r_params.print_level()); - } - - // Solve Ax = Sxw - // Just to be sure dimensions work out, clear omega - omega.clear(); - diagonalizeFockMatrix(world, Chi, Lambda_X, omega, XAX, S, FunctionDefaults<3>::get_thresh()); - - // If larger subspace, need to "un-augment" everything - if (iteration < r_params.larger_subspace()) { - print("Unaugmenting subspace"); - unaugment(world, Chi, old_Chi, Lambda_X, old_Lambda_X, omega, S, XAX, old_S, old_A, - r_params.num_states(), iteration, r_params.print_level()); - } -} - -void TDDFT::deflateFull(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &old_Lambda_X, Tensor &S, Tensor old_S, - Tensor old_A, Tensor &omega, size_t &iteration, size_t &m) { - // Debugging output - Tensor A; - - if (iteration < r_params.larger_subspace() and iteration > 0) { - print("Entering Augment Full"); - augment_full(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, A, old_S, old_A, - r_params.print_level()); - // computes Augments A and S - - } else { - S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); - if (world.rank() == 0 && (r_params.print_level() >= 10)) { - print("\n Overlap Matrix:"); - print(S); - } - X_space Chi_copy = Chi.copy(); - Chi_copy.truncate(); - A = inner(Chi_copy, Lambda_X); - if (world.rank() == 0 && (r_params.print_level() >= 10)) { - print("\n Lambda Matrix:"); - print(A); - } - } - - omega.clear(); - - Tensor U = diagonalizeFullResponseMatrix(world, Chi, Lambda_X, omega, S, A, - FunctionDefaults<3>::get_thresh(), - r_params.print_level()); - - if (iteration < r_params.larger_subspace() and iteration > 0) { - print("Entering Unaugment Full"); - unaugment_full(world, Chi, old_Chi, Lambda_X, old_Lambda_X, omega, S, A, old_S, old_A, - r_params.num_states(), iteration, r_params.print_level()); - } else { - old_Chi = Chi.copy(); - old_Lambda_X = Lambda_X.copy(); - } -} - -// const double thresh, int print_level) { -// Creates the XCOperator object and initializes it with correct -// parameters -XCOperator TDDFT::create_XCOperator(World &world, std::vector orbitals, - std::string xc) { - // First calculate the ground state density - std::vector vsq = square(world, ground_orbitals);// we square each orbital - compress(world, vsq); // compress into multiwavelet representation - real_function_3d rho = real_factory_3d(world);// create function rho - rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], 1.0, false); } - world.gop.fence(); - - // And create the object using r_params.xc() - XCOperator xcop(world, xc, false, rho, - rho);// world,which xc, spin_polarized? ,spinup, spindown - - return xcop; -} - -// Uses an XCOperator to construct v_xc for the ground state -// density Returns d^2/d rho^2 E_xc[rho] -std::vector TDDFT::create_fxc(World &world, - std::vector &orbitals, - response_space &f, response_space &g) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - - // Next need the perturbed density - std::vector drho = transition_density(world, orbitals, f, g); - - // Return container - std::vector vxc; - - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { vxc.push_back(xc.apply_xc_kernel(drho[i])); } - // for each density apply xckernel - - return vxc; -} - -// Uses an XCOperator to construct v_xc for the ground state -// density Returns d^2/d rho^2 E_xc[rho] -std::vector TDDFT::GetWxcOnFDensities( - World &world, const std::vector &orbitals, const response_space &f) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - // Next need the perturbed density - std::vector drhoM = GetTransitionDensities(world, orbitals, f); - // Return container - std::vector Wfxc; - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { Wfxc.push_back(xc.apply_xc_kernel(drhoM[i])); } - // for each density apply xckernel - - return Wfxc; -} - -std::vector TDDFT::GetConjugateWxcOnFDensities( - World &world, const std::vector &orbitals, const response_space &f) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - - // Next need the perturbed density - std::vector drhoM = GetConjugateTransitionDensities(world, orbitals, f); - // Return container - std::vector conjugateWfvxc; - - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { - conjugateWfvxc.push_back(xc.apply_xc_kernel(drhoM[i])); - } - // for each density apply xckernel - - return conjugateWfvxc; -} - -std::vector TDDFT::CreateXCDerivative( - World &world, const std::vector &orbitals, const response_space &f) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - size_t m = f.size(); // get the number of response functions - size_t n = f[0].size();// get the number of orbitals function - - std::vector drho = zero_functions(world, m); - // Run over virtual... - for (size_t i = 0; i < m; i++) { - // Run over occupied... - for (size_t j = 0; j < n; j++) { - // y functions are zero if TDA is active - drho[i] = drho[i] + orbitals[j] * f[i][j];//+ orbitals[j] * y[i][j]; - } - } - // Return container - std::vector vxc; - - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { vxc.push_back(xc.apply_xc_kernel(drho[i])); } - // for each density apply xckernel - - return vxc; -} - -// Iterates the response functions until converged or out of iterations -// - -// Simplified iterate scheme for guesses -// Create and diagonalize the CIS matrix for improved initial guess -response_space TDDFT::diagonalize_CIS_guess(World &world, std::vector &virtuals, - Tensor &omega, - std::vector &orbitals, - Tensor &energies, double lo, double thresh, - size_t print_level) { - // Projecter for removing ground state - QProjector Q(world, orbitals); - - // Diagonalize under ground state hamiltonian a few times - // Create overlap - compress(world, virtuals); - Tensor S = matrix_inner(world, virtuals, virtuals); - - // Create Fock matrix - // -1 suppresses output - Tensor Fmat = CreateGroundHamiltonian(world, virtuals, -1); - - // Diagonalize - Tensor U, evals, dummy(virtuals.size()); - U = get_fock_transformation(world, S, Fmat, evals, thresh); - - // Transform and truncate functions - virtuals = madness::transform(world, virtuals, U); - truncate(world, virtuals, thresh, false); - - // filter out any ground state functions that crept in - std::vector true_virtuals; - for (unsigned int a = 0; a < virtuals.size(); a++) { - if (evals(a) > 0.0) true_virtuals.push_back(virtuals[a]); - } - - // Make sure we still have functions - if (true_virtuals.empty()) - MADNESS_EXCEPTION("Virtuals are empty: Too much overlap with occupied orbitals", 1); - - // Saving new components - virtuals = Q(true_virtuals); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) print(" Remaining virtuals:", virtuals.size()); - - // Now make the CIS matrix (copied from Jakob) - if (world.rank() == 0) print(" Forming CIS matrix for improved initial guess."); - - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - size_t I = -1;// combined index from i and a, start is -1 so that - // initial value - // is 0 - size_t J = -1;// combined index from j and b, start is -1 so that - // initial value - // is 0 - - const size_t m = virtuals.size(); - const size_t n = orbitals.size(); - - Tensor MCIS(m * n, m * n); - real_convolution_3d op = CoulombOperator(world, lo, thresh); - - for (size_t i = 0; i < n; i++) { - const real_function_3d brai = orbitals[i]; - const std::vector igv = apply(world, op, virtuals * brai); - const std::vector igm = apply(world, op, orbitals * brai); - - for (size_t a = 0; a < m; a++) { - I++; - J = -1; - for (size_t j = 0; j < n; j++) { - const real_function_3d braj = orbitals[j]; - - for (size_t b = 0; b < m; b++) { - J++; - double diag_element = 0.0; - - if (i == j and a == b) diag_element = Fmat(a, a) - energies(i); - - MCIS(I, J) = diag_element + 2.0 * inner(braj * virtuals[b], igv[a]) - - inner(virtuals[a] * virtuals[b], igm[j]); - } - } - } - } - - // End timer - if (print_level >= 1) molresponse::end_timer(world, "Form CIS matrix:"); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" CIS matrix:"); - print(MCIS); - } - - // Diagonalize CIS matrix - syev(MCIS, U, evals); - - // Always print this? - if (world.rank() == 0) { - print(" Initial CIS matrix eigenvalues:"); - print(evals); - } - - // Now construct the initial guess - response_space f(world, U.dim(0), n); - omega = Tensor(U.dim(0)); - - I = -1; - for (size_t i = 0; i < n; i++) { - for (size_t a = 0; a < m; a++) { - I++; - J = -1; - if (evals(I) < 0.0) { - if (world.rank() == 0) print(" Skipping negative root:", evals(I)); - continue; - } - for (size_t j = 0; j < n; j++) { - for (size_t b = 0; b < m; b++) { - J++; - f[I][j] += U(J, I) * virtuals[b]; - omega(I) = evals(I); - } - } - } - } - - f.truncate_rf(); - - // Done. Whew. - return f; -} - -// Simplified iterate scheme for guesses -void TDDFT::iterate_guess(World &world, X_space &guesses) { - // Variables needed to iterate - size_t iteration = 0;// Iteration counter - QProjector projector(world, - ground_orbitals);// Projector to project out ground state - size_t m = r_params.num_states(); // Number of excited states - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - Tensor x_shifts; // Holds the shifted energy values - response_space bsh_resp(world, m, n); // Holds wave function corrections - response_space V; // Holds V^0 applied to response functions - response_space shifted_V;// Holds the shifted V^0 applied to response functions - Tensor S; // Overlap matrix of response components for x states - real_function_3d v_xc; // For TDDFT - - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - // Useful to have - response_space zeros(world, m, n); - - // Now to iterate - while (iteration < r_params.guess_max_iter()) { - // Start a timer for this iteration - molresponse::start_timer(world); - // - size_t N0 = guesses.X.size(); - size_t Ni = N0; - - // No*exp(log(Np/N0)/p*t) to exponential decay - // the number of states down to 2*r_params.states - /* -if (iteration > 1 && r_params.guess_xyz() && Ni > Np) { -Ni = std::ceil(N0 * std::exp(std::log(static_cast(Np) / - static_cast(N0)) / - static_cast(p) * iteration)); -sort(world, omega, guesses.X); -print(omega); -for (size_t i = 0; i < Ni; i++) { -Ni = 0; -if (omega[i] < 1) { -Ni++; -} -} -// this function selects k functions -guesses.X = -select_functions(world, guesses.X, omega, Ni, r_params.print_level()); -} -*/ - - // Basic output - if (r_params.print_level() >= 1) { - if (world.rank() == 0) - printf("\n Guess Iteration %d at time %.1fs\n", static_cast(iteration), - wall_time()); - if (world.rank() == 0) print(" -------------------------------------"); - } - - // Load balance - // Only balancing on x-components. Smart? - if (world.size() > 1 && ((iteration < 2) or (iteration % 5 == 0)) and - - iteration != 0) { - // Start a timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - if (world.rank() == 0) print("");// Makes it more legible - - LoadBalanceDeux<3> lb(world); - for (size_t j = 0; j < n; j++) { - for (size_t k = 0; k < r_params.num_states(); k++) { - lb.add_tree(guesses.X[k][j], lbcost(1.0, 8.0), true); - } - } - FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); - - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Load balancing:"); - } - - // compute rho_omega - rho_omega = transition_densityTDA(world, ground_orbitals, guesses.X); - // Project out ground state - for (size_t i = 0; i < Ni; i++) guesses.X[i] = projector(guesses.X[i]); - - // Truncate before doing expensive things - guesses.X.truncate_rf(); - - // Normalize after projection - if (r_params.tda()) normalize(world, guesses.X); - - // (TODO why not normalize if not tda) - // compute Y = false - X_space Lambda_X = Compute_Lambda_X(world, guesses, xc, "tda"); - - deflateGuesses(world, guesses, Lambda_X, S, omega, iteration, m); - // Debugging output - - // Ensure right number of omegas - if (size_t(omega.dim(0)) != Ni) { - if (world.rank() == 0) - print("\n Adding", Ni - omega.dim(0), - "eigenvalue(s) (counters subspace size " - "reduction in " - "diagonalizatoin)."); - Tensor temp(Ni); - temp(Slice(0, omega.dim(0) - 1)) = omega; - for (size_t i = omega.dim(0); i < Ni; i++) temp[i] = 2.5 * i; - omega = copy(temp); - } - - // Basic output - if (r_params.print_level() >= 1 and world.rank() == 0) { - print("\n Excitation Energies:"); - print("gi=", iteration, " roots: ", omega); - } - - // Only do BSH if not the last iteration - if (iteration + 1 < r_params.guess_max_iter()) { - // Calculates shifts needed for potential / energies - // If none needed, the zero tensor is returned - x_shifts = create_shift(world, ground_energies, omega, r_params.print_level(), "x"); - - X_space theta_X = Compute_Theta_X(world, guesses, xc, "tda"); - theta_X.X = apply_shift(world, x_shifts, theta_X.X, guesses.X); - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - - // Construct BSH operators - std::vector>> bsh_x_operators = - create_bsh_operators(world, x_shifts, ground_energies, omega, r_params.lo(), - FunctionDefaults<3>::get_thresh()); - - // Apply BSH and get updated components - if (r_params.print_level() >= 1) molresponse::start_timer(world); - bsh_resp = apply(world, bsh_x_operators, theta_X.X); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply BSH:"); - - // Project out ground state - for (size_t i = 0; i < Ni; i++) bsh_resp[i] = projector(bsh_resp[i]); - // Save new components - guesses.X = bsh_resp; - // Apply mask - for (size_t i = 0; i < Ni; i++) guesses.X[i] = mask * guesses.X[i]; - } - - // Ensure orthogonal guesses - for (size_t i = 0; i < 2; i++) { - molresponse::start_timer(world); - // Orthog - guesses.X = gram_schmidt(world, guesses.X); - molresponse::end_timer(world, "orthog"); - - molresponse::start_timer(world); - // Normalize - normalize(world, guesses.X); - molresponse::end_timer(world, "normalize"); - } - - // Update counter - iteration += 1; - // Done with the iteration.. truncate - guesses.X.truncate_rf(); - - // Basic output - if (r_params.print_level() >= 1) {// - molresponse::end_timer(world, " This iteration:"); - } - } -}// Done with iterate gues -// Simplified iterate scheme for guesses - -// Adds in random noise to a vector of vector of functions -response_space TDDFT::add_randomness(World &world, response_space &f, double magnitude) { - // Copy input functions - response_space f_copy = f.copy(); - - // Lambda function to add in noise - auto noise = [](const Key<3> &key, Tensor &x) mutable { - Tensor y(x.size()); - y.fillrandom(); - // y.scale(magnitude); - y.scale(1e3); - x = x + y; - // x(0,0,0) += y(0,0,0)-0.5; - }; - // TODO - // Go through each function in f_copy and add in random noise - for (unsigned int i = 0; i < f_copy.size(); i++) { - for (unsigned int j = 0; j < f_copy[0].size(); j++) { - // Add in random noise using rng and a the defined lambda function - f_copy[i][j].unaryop(noise);// not sure how this workes - // i see we pass lambda function noise - } - - // Apply mask to get boundary condition right - f_copy[i] = mask * f_copy[i];// apply mask - } - - // Done - return f_copy; -} - -// Creates the ground state hamiltonian from given functions f -Tensor TDDFT::CreateGroundHamiltonian(World &world, std::vector f, - size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - // Get sizes - size_t m = f.size(); - // Debugging - if (print_level > 2) { - Tensor S = matrix_inner(world, f, f); - if (world.rank() == 0) print(" Ground state overlap:"); - if (world.rank() == 0) print(S); - } - // Calculate T - // Make the derivative operators in each direction - real_derivative_3d Dx(world, 0); - real_derivative_3d Dy(world, 1); - real_derivative_3d Dz(world, 2); - - // Apply derivatives once, and take inner products - // according to this formula (faster / less noise): - // < f | \nabla^2 | f > = - < \nabla f | \nabla f > - reconstruct(world, f); - std::vector fx = apply(world, Dx, f); - std::vector fy = apply(world, Dy, f); - std::vector fz = apply(world, Dz, f); - compress(world, fx, false); - compress(world, fy, false); - compress(world, fz, false); - world.gop.fence(); - - // Construct T according to above formula - // Note: No negative as the formula above - // has one as well, so they cancel - Tensor T = 1.0 / 2.0 * - (matrix_inner(world, fx, fx) + matrix_inner(world, fy, fy) + - matrix_inner(world, fz, fz)); - - // Construct V - // v_nuc first - potential_manager->make_nuclear_potential(world); - real_function_3d v_nuc = potential_manager->vnuclear(); - v_nuc.truncate(); - - // V_coul next - // This does not include final multiplication of each orbital - // 2 is from integrating out spin - real_function_3d v_coul = 2.0 * Coulomb(world); - - // Clear old stored potentials - stored_v_coul.clear(); - stored_v_nuc.clear(); - - // If storing potentials, save them here - if (r_params.store_potential()) { - stored_v_nuc = copy(v_nuc); - stored_v_coul = copy(v_coul); - } - - // Sum coulomb (pre multiplied) and v_nuc - // v_nuc comes out negative from potential manager, so add it - real_function_3d v = v_coul + v_nuc; - - // Apply V to f functions - std::vector vf = v * f; - - // Clear stored_potential - stored_potential.clear(); - - // ALWAYS DO THIS FOR THE STORED POTENTIAL!! - // exchange last - // 'small memory' algorithm from SCF.cc - real_convolution_3d op = - CoulombOperator(world, r_params.lo(), FunctionDefaults<3>::get_thresh()); - std::vector Kf = zero_functions_compressed(world, m); - for (size_t i = 0; i < m; ++i) { - std::vector psif = - mul_sparse(world, f[i], f, FunctionDefaults<3>::get_thresh()); - truncate(world, psif); - psif = apply(world, op, psif); - truncate(world, psif); - - // Save the potential here if we are saving it - if (r_params.store_potential()) { stored_potential.push_back(psif); } - - psif = mul_sparse(world, f[i], psif, FunctionDefaults<3>::get_thresh()); - gaxpy(world, 1.0, Kf, 1.0, psif); - } - - // Only use the exchange above if HF: - Tensor V; - real_function_3d v_xc; - - if (r_params.xc() == "hf") { - // Construct V - V = matrix_inner(world, f, vf) - matrix_inner(world, f, Kf); - } else {// DFT - - XCOperator xcop = create_XCOperator(world, f, r_params.xc()); - - real_function_3d v_xc = xcop.make_xc_potential(); - v = v + v_xc; - std::vector vf = v * f; - if ((*xcop.xc).hf_exchange_coefficient() > 0.0) { - // XCOperator has member variable xc, which is an - // xcfunctional which has the hf_exchange_coeff we need here - gaxpy(world, 1.0, vf, -(*xcop.xc).hf_exchange_coefficient(), Kf); - } - V = matrix_inner(world, f, vf); - } - - // Now create the hamiltonian - hamiltonian = T + V; - - for (int64_t i = 0; i < hamiltonian.dim(0); i++) { - for (int64_t j = i + 1; j < hamiltonian.dim(1); j++) { - // print(i, j); - // print(xAx(i, j)); - // print(xAx(j, i)); - hamiltonian(j, i) = hamiltonian(i, j); - } - } - double traceOfHamiltonian(0); - for (int64_t i = 0; i < hamiltonian.dim(0); i++) { traceOfHamiltonian += hamiltonian(i, i); } - print("Trace of Hamiltonian"); - print(traceOfHamiltonian); - // Save a matrix that is - // (T+V) - Lambda * eye - // Copy hamiltonian and zero the diagonal - ham_no_diag = copy(hamiltonian); - for (size_t i = 0; i < m; i++) ham_no_diag(i, i) = 0.0; - - // Debug output - if (print_level >= 2 and world.rank() == 0) { - print(" Ground state hamiltonian:"); - print(hamiltonian); - } - - // End timer - if (print_level >= 1) molresponse::end_timer(world, " Create grnd ham:"); - - return hamiltonian; -} - -functionT TDDFT::make_ground_density(World &world, const vecfuncT &v) { - tensorT occ = g_params.get_occ(); - vecfuncT vsq = square(world, v); - compress(world, vsq); - functionT rho = factoryT(world); - rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], double(1.0), false); } - world.gop.fence(); - vsq.clear(); - return rho; -} - -// Creates the transition densities -std::vector TDDFT::transition_density(World &world, - std::vector &orbitals, - response_space &x, response_space &y) { - // Get sizes - size_t m = x.size(); - - // Return container - std::vector densities = zero_functions(world, m); - x.truncate_rf(); - y.truncate_rf(); - truncate(world, orbitals); - for (size_t b = 0; b < m; b++) { - // Run over occupied... - // y functions are zero if TDA is active - densities[b] = dot(world, x[b], orbitals); - densities[b] += dot(world, orbitals, y[b]); - } - - truncate(world, densities); - world.gop.fence(); - // Done! - return densities; -} - -std::vector TDDFT::transition_densityTDA( - World &world, std::vector const &orbitals, response_space &x) { - // Get sizes - size_t m = x.size(); - // Return container - std::vector densities = zero_functions(world, m); - x.truncate_rf(); - truncate(world, ground_orbitals); - for (size_t b = 0; b < m; b++) { - // y functions are zero if TDA is active - densities[b] = dot(world, x[b], ground_orbitals); - } - - truncate(world, densities); - world.gop.fence(); - // Done! - return densities; -} - -// Creates the transition density -std::vector TDDFT::GetTransitionDensities( - World &world, const std::vector &orbitals, const response_space &f) { - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - // Return container - std::vector densities = zero_functions(world, m); - - // Run over virtual... - for (size_t i = 0; i < m; i++) { - // Run over occupied... - for (size_t j = 0; j < n; j++) { - // y functions are zero if TDA is active - densities[i] = densities[i] + orbitals[j] * f[i][j]; - // densities[i] =densities[i] + orbitals[j] * dagger(f[i][j]);TODO: - // DAGGER - } - } - - // Done! - return densities; -} - -std::vector TDDFT::GetConjugateTransitionDensities( - World &world, const std::vector &orbitals, const response_space &f) { - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - // Return container - std::vector densities = zero_functions(world, m); - // Run over virtual... - for (size_t i = 0; i < m; i++) { - // Run over occupied... - for (size_t j = 0; j < n; j++) { - // y functions are zero if TDA is active - densities[i] = densities[i] + orbitals[j] * f[i][j]; - // densities[i] + orbitals[j] * dagger(f[i][j]) TODO: DAGGER; - } - } - // Done! - return densities; -} - -Tensor TDDFT::polarizability() { return -2 * inner(Chi, PQ); } - -void TDDFT::PrintPolarizabilityAnalysis(World &world, const Tensor polar_tensor) { - // Final polarizability analysis - // diagonalize - Tensor V, epolar; - syev(polar_tensor, V, epolar); - double Dpolar_average = 0.0; - double Dpolar_iso = 0.0; - for (unsigned int i = 0; i < 3; ++i) Dpolar_average = Dpolar_average + epolar[i]; - Dpolar_average = Dpolar_average / 3.0; - Dpolar_iso = sqrt(.5) * sqrt(std::pow(polar_tensor(0, 0) - polar_tensor(1, 1), 2) + - std::pow(polar_tensor(1, 1) - polar_tensor(2, 2), 2) + - std::pow(polar_tensor(2, 2) - polar_tensor(0, 0), 2)); - - if (world.rank() == 0) { - print("\nTotal Dynamic Polarizability Tensor"); - printf("\nFrequency = %.6f a.u.\n\n", omega(0, 0)); - // printf("\nWavelength = %.6f a.u.\n\n", r_params.omega() * ???); - print("Polarizability", "Final"); - print(polar_tensor); - printf("\tEigenvalues = "); - printf("\t %.6f \t %.6f \t %.6f \n", epolar[0], epolar[1], epolar[2]); - printf("\tIsotropic = \t %.6f \n", Dpolar_average); - printf("\tAnisotropic = \t %.6f \n", Dpolar_iso); - printf("\n"); - } -} - - -void TDDFT::compute_and_print_polarizability(World &world, X_space &Chi, X_space &PQ, - std::string message) { - Tensor G = -2 * inner(Chi, PQ); - if (world.rank() == 0) { - print("Polarizability", message); - print(G); - } -} - -void TDDFT::plot_excited_states(World &world, size_t iteration, response_space &x_response, - response_space &y_response, ResponseParameters const &r_params, - GroundStateCalculation const &g_params) { - std::filesystem::create_directories("plots/virtual"); - // num orbitals - size_t n = x_response[0].size(); - size_t m = x_response.size(); - - std::string dir("xyz"); - // for plotname size - size_t buffSize = 500; - char plotname[buffSize]; - double Lp = std::min(r_params.L(), 24.0); - // Doing line plots along each axis - for (int d = 0; d < 3; d++) { - // print ground_state - plotCoords plt(0, Lp); - for (int b = 0; b < static_cast(m); b++) { - for (int i = 0; i < static_cast(n); i++) { - // print ground_state - // plot x function x_dir_b_i__k_iter - snprintf(plotname, buffSize, "plots/virtual/x_direction_%c_res_%d_orb_%d", dir[d], - static_cast(b), static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, x_response[b][i]); - - // plot y functione y_dir_b_i__k_iter - snprintf(plotname, buffSize, "plots/xy/y_direction_%c_res_%d_orb_%d", dir[d], - static_cast(b), static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, y_response[b][i]); - } - } - } - world.gop.fence(); - - // END TESTING -} - -vecfuncT TDDFT::project_ao_basis(World &world, const AtomicBasisSet &aobasis) { - // Make at_to_bf, at_nbf ... map from atom to first bf on atom, and nbf/atom - std::vector at_to_bf, at_nbf; - aobasis.atoms_to_bfn(molecule, at_to_bf, at_nbf); - - return project_ao_basis_only(world, aobasis, molecule); -} - - -vecfuncT TDDFT::project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, - const Molecule &molecule) { - vecfuncT ao = vecfuncT(aobasis.nbf(molecule)); - for (int i = 0; i < aobasis.nbf(molecule); ++i) { - functorT aofunc(new AtomicBasisFunctor(aobasis.get_atomic_basis_function(molecule, i))); - ao[i] = factoryT(world).functor(aofunc).truncate_on_project().nofence().truncate_mode(1); - } - world.gop.fence(); - truncate(world, ao); - madness::normalize(world, ao); - return ao; -} - - -/// A MADNESS functor to compute either x, y, or z -class DipoleFunctor : public FunctionFunctorInterface { -private: - const int axis; - -public: - DipoleFunctor(int axis) : axis(axis) {} - - double operator()(const coordT &x) const { return x[axis]; } -}; - -/// A MADNESS functor to compute the cartesian moment x^i * y^j * z^k (i, j, k -/// integer and >= 0) -class MomentFunctor : public FunctionFunctorInterface { -private: - const int i, j, k; - -public: - MomentFunctor(int i, int j, int k) : i(i), j(j), k(k) {} - - MomentFunctor(const std::vector &x) : i(x[0]), j(x[1]), k(x[2]) {} - - double operator()(const coordT &r) const { - double xi = 1.0, yj = 1.0, zk = 1.0; - for (int p = 0; p < i; ++p) xi *= r[0]; - for (int p = 0; p < j; ++p) yj *= r[1]; - for (int p = 0; p < k; ++p) zk *= r[2]; - return xi * yj * zk; - } -}; - -void TDDFT::analyze_vectors(World &world, const vecfuncT &x, std::string response_state) { - molresponse::start_timer(world); - AtomicBasisSet sto3g("sto-3g"); - vecfuncT ao = project_ao_basis(world, sto3g); - - tensorT C = matrix_inner(world, ao, x); - int nmo1 = x.size(); - tensorT rsq, dip(3, nmo1); - { - functionT frsq = factoryT(world).f(rsquared).initial_level(4); - // - // - rsq = inner(world, x, mul_sparse(world, frsq, x, vtol)); - for (int axis = 0; axis < 3; ++axis) { - // x y z - functionT fdip = factoryT(world) - .functor(functorT(new madness::DipoleFunctor(axis))) - .initial_level(4); - dip(axis, _) = inner(world, x, mul_sparse(world, fdip, x, vtol)); - // - ^2-^2-^2 - for (int i = 0; i < nmo1; ++i) rsq(i) -= dip(axis, i) * dip(axis, i); - } - } - molresponse::end_timer(world, "Analyze vectors"); - - long nmo = x.size(); - size_t ncoeff = 0; - for (long i = 0; i < nmo; ++i) { - size_t ncoeffi = x[i].size(); - ncoeff += ncoeffi; - if (world.rank() == 0 and (r_params.print_level() > 1)) { - print(response_state + " orbital : ", i); - - printf("ncoeff=%.2e:", (double) ncoeffi); - - printf("center=(%.2f,%.2f,%.2f) : radius=%.2f\n", dip(0, i), dip(1, i), dip(2, i), - sqrt(rsq(i))); - sto3g.print_anal(molecule, C(i, _)); - printf("total number of coefficients = %.8e\n\n", double(ncoeff)); - } - } -} -// Main function, makes sure everything happens in correct order -// compute the frequency response, r_params sets the the calculation type. -// options are dipole,nuclear,order2, order3. Computes the density respone -// No matter the calculation type we do the same iteration. -// The only difference is the number of response states as well as the -// number of right hand side vectors. - -// Exactam eam -// Deuces diff --git a/src/apps/molresponse/TDDFT.h b/src/apps/molresponse/TDDFT.h deleted file mode 100644 index 5c654c15376..00000000000 --- a/src/apps/molresponse/TDDFT.h +++ /dev/null @@ -1,740 +0,0 @@ -// Copyright 2021 Adrian Hurtado - -#ifndef SRC_APPS_MOLRESPONSE_TDDFT_H_ -#define SRC_APPS_MOLRESPONSE_TDDFT_H_ - -#include -#include -#include -#include -#include -#include -#include -#include // The kain solver -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "madness/tensor/tensor_json.hpp" -#include -#include -#include -#include -#include -#include -#include -#include - -// Functor from SCF.cc (it wasn't linking right, no idea why, so just copied and -// renamed here) A copy of a MADNESS functor to compute the cartesian moment x^i -// * y^j * z^k (i, j, k integer and >= 0) -class BS_MomentFunctor : public FunctionFunctorInterface { - private: - const int i, j, k; - - public: - BS_MomentFunctor(int i, int j, int k) : i(i), j(j), k(k) {} - explicit BS_MomentFunctor(const std::vector& x) : i(x[0]), j(x[1]), k(x[2]) {} - double operator()(const Vector& r) const { - double xi = 1.0, yj = 1.0, zk = 1.0; - for (int p = 0; p < i; ++p) xi *= r[0]; - for (int p = 0; p < j; ++p) yj *= r[1]; - for (int p = 0; p < k; ++p) zk *= r[2]; - return xi * yj * zk; - } -}; - -/// an N-dimensional real-valued Gaussian function - -/// the function looks like -/// \[ -/// f(r) = x^i y^j .. z^k exp(-alpha r^2) -/// \] -template -class GaussianGuess : public FunctionFunctorInterface { - typedef Vector coordT; - - public: - /// ctor - - /// @param[in] origin the origin of the Gauss function - /// @param[in] alpha the exponent exp(-alpha r^2) - /// @param[in] ijk the monomial x^i y^j z^k exp(-alpha r^2) (for NDIM) - GaussianGuess(const coordT& origin, const double alpha, const std::vector ijk = std::vector(NDIM)) - : origin(origin), exponent(alpha), ijk(ijk) {} - - coordT origin; - double exponent; ///< exponent of the guess - std::vector ijk; ///< cartesian exponents - - double operator()(const coordT& xyz) const { - double arg = 0.0, prefac = 1.0; - for (std::size_t i = 0; i < NDIM; ++i) { - arg += (xyz[i] - origin[i]) * (xyz[i] - origin[i]); - prefac *= pow(xyz[i], ijk[i]); - } - const double e = exponent * arg; - return prefac * exp(-e); - } -}; - -class ResidualResponseVectors { - public: - response_space x; - response_space y; - ResidualResponseVectors(World& world, size_t m, int n) { - x = response_space(world, m, n); - y = response_space(world, m, n); - } -}; -typedef Vector coordT; -typedef std::shared_ptr> functorT; -typedef Function functionT; -typedef std::vector vecfuncT; -typedef std::pair pairvecfuncT; -typedef Tensor tensorT; -typedef DistributedMatrix distmatT; -typedef FunctionFactory factoryT; -typedef SeparatedConvolution operatorT; -typedef std::shared_ptr poperatorT; -typedef Function, 3> complex_functionT; -typedef Convolution1D complex_operatorT; -typedef std::vector> NonLinearXsolver; - -class TDDFT { - public: - // ResponseParameter object to hold all user input variables - std::shared_ptr potential_manager; - // CalculationParameters param; - functionT mask; - - ResponseParameters r_params; - GroundStateCalculation g_params; - Molecule molecule; - - // Tensors for holding energies - // residuals, and shifts - Tensor omega; // Energies of response functions - Tensor e_residuals; // Residuals of energies - - // Information that is inferred from input file - // Ground state orbitals being used in calculation - std::vector act_orbitals; - std::vector ground_orbitals; - Tensor ground_energies; // Ground state hamiltonian tensor - // Ground state energies being used for calculation - Tensor act_ground_energies; - Tensor hamiltonian; // Ground state hamiltonian tensor - Tensor ham_no_diag; // Ground state ham. without diagonal (Used when - // localized orbitals are given) - std::vector active; // The labels of orbitals selected as "active" - unsigned int act_num_orbitals; // Number of ground state orbitals being used - // in calculation - - // XCfunction object for DFT calculations - XCfunctional xcf; - - // Mask function to handle boundary conditions - - // Functions - real_function_3d stored_v_nuc; // Stored nuclear potential from ground state - real_function_3d stored_v_coul; // Stored coulomb potential from ground state - - X_space Chi; - X_space PQ; - density_vector rho; - functionT rho0; - vecfuncT rho_omega; - - response_space stored_potential; // The ground state potential, stored only - // if store_potential is true (default is - // false). Holds the integrals - // \int dr \frac{\phi_i^\dagger - // phi_j}{\left| r - r' \right|} - PropertyBase p; // for frequency calculations - - - poperatorT coulop; - std::vector> gradop; - double vtol; - nlohmann::json j_molresponse; - - // Member variables - public: - // Collective constructor for response uses contents of file \c filename and - - TDDFT(World& world, density_vector& rho); - // Saves a response calculation - void save(World& world, const std::string & name); - - // Loads a response calculation - void load(World& world, const std::string & name); - // Initial load balance using vnuc - void initial_load_bal(World& world); - void load_balance(World& world, vecfuncT rho_omega, X_space Chi, const X_space& Chi_old); - void orbital_load_balance(World& world, - vecfuncT& psi0, - vecfuncT& psi0_copy, - X_space& Chi, - X_space& Chi_copy); - // Normalizes in the response sense - static void normalize(World& world, response_space& f); - - // Normalizes in the response sense - void normalize(World& world, response_space& f, response_space& g); - // Normalize X_space xx-yy=1 - void normalize(World& world, X_space& chi); - - // Prints norms of the given vector - void print_norms(World& world, response_space function); - - // Returns a set of vector of vector of real_function_3d of proper size, - // initialized to zero - - // Returns a list of solid harmonics - std::map, real_function_3d> solid_harmonics(World& world, int n); - // returns a map of real form spherical harmonics n=level...returns (n+1)^2 - // functions - std::map, real_function_3d> simple_spherical_harmonics(World& world, int n); - // returns a map of real form spherical harmonics n=level...returns (n+1)^2 - // functions - std::vector createDipoleFunctionMap(World& world); - // Returns initial response functions - X_space create_trial_functions(World& world, - size_t k, - std::vector& orbitals, - size_t print_level); - X_space create_trial_functions2(World& world, std::vector& orbitals, size_t print_level); - - response_space PropertyRHS(World& world, PropertyBase& p) const; - // Returns the derivative of the coulomb operator, applied to ground state - // orbitals - - // Returns the diagonal (letter A) elements of response matrix - X_space compute_gamma_full(World& world, X_space& Chi, const XCOperator& xc); - X_space compute_gamma_static(World& world, X_space& Chi, XCOperator xc); - X_space compute_gamma_tda(World& world, X_space& Chi, XCOperator xc); - // Note: No post multiplication involved here - real_function_3d Coulomb(World& world); - - // Returns the result of ground state exchange applied to response functions - response_space exchange(World& world, response_space& f); - - // Returns the ground state potential applied to response functions - void make_nuclear_potential(World& world); - X_space compute_V0X(World& world, X_space& Chi, XCOperator xc, bool compute_Y); - X_space compute_F0X(World& world, X_space& Chi, XCOperator xc, bool compute_Y); - - // Returns a tensor, where entry (i,j) = inner(a[i], b[j]).sum() - Tensor expectation(World& world, const response_space& a, const response_space& b); - void PrintRFExpectation(World& world, - response_space f, - response_space g, - std::string fname, - std::string gname); - void PrintResponseVectorNorms(World& world, response_space f, std::string fname); - - void vector_stats(const std::vector& v, double& rms, double& maxabsval) const; - - void vector_stats_new(const Tensor v, double& rms, double& maxabsval) const; - - double do_step_restriction(World& world, const vecfuncT& x, vecfuncT& x_new, std::string spin) const; - double do_step_restriction(World& world, - const vecfuncT& x, - vecfuncT& x_new, - std::string spin, - double maxrotn) const; - - double do_step_restriction(World& world, - const vecfuncT& x, - const vecfuncT& y, - vecfuncT& x_new, - vecfuncT& y_new, - std::string spin) const; - - X_space Compute_Theta_X(World& world, X_space& Chi, XCOperator xc, std::string calc_type); - X_space Compute_Lambda_X(World& world, X_space& Chi, XCOperator xc, std::string calc_type); - // Returns the hamiltonian matrix, equation 45 from the paper - // -2.0 * (ground_state_energy + excited_state_energy) is positive - Tensor create_shift(World& world, - Tensor& ground, - Tensor& omega, - size_t print_level, - std::string xy); - - // Returns the shift needed for each orbital to make sure - // (ground_state_energy + excited_state_energy + shift) = target - Tensor create_shift_target(World& world, - Tensor& ground, - Tensor& omega, - double target, - size_t print_level, - std::string xy); - - // Returns the given shift applied to the given potentials - response_space apply_shift(World& world, Tensor& shifts, response_space& V, response_space& f); - // single shift value - response_space apply_shift(World& world, double& shift, response_space& V, response_space& f); - - // Returns a vector of BSH operators - std::vector>> create_bsh_operators(World& world, - Tensor& shift, - Tensor& ground, - Tensor& omega, - double lo, - double thresh); - - std::vector make_bsh_operators_response( - World& world, - double& shift, - double& omega) const; // Returns a vector of BSH operators - std::vector>> CreateBSHOperatorPropertyVector( - World& world, - Tensor& shift, - Tensor& ground, - Tensor& omega, - double lo, - double thresh); - // here omega and shifts are doubles - std::vector> CreateBSHOperatorPropertyVector(World& world, - double& shift, - Tensor& ground, - double& omega, - double lo, - double thresh); - - void update_x_space_response(World& world, - X_space& Chi, - X_space& residual, - XCOperator& xc, - std::vector& bsh_x_ops, - std::vector& bsh_y_ops, - QProjector& projector, - double& x_shifts, - double& omega_n, - NonLinearXsolver& kain_x_space, - std::vector Xvector, - std::vector Xresidual, - Tensor& bsh_residualsX, - Tensor& bsh_residualsY, - size_t iteration, - Tensor& maxrotn); - - X_space bsh_update_response(World& world, - X_space& theta_X, - std::vector& bsh_x_ops, - std::vector& bsh_y_ops, - QProjector& projector, - double& x_shifts); - - X_space compute_residual(World& world, - X_space& old_Chi, - X_space& temp, - Tensor& bsh_residualsX, - Tensor& bsh_residualsY, - std::string calc_type); - - void print_residual_norms(World& world, X_space& old_Chi, bool compute_y, size_t iteration); - X_space bsh_update_excited(World& world, - const Tensor& omega, - X_space& theta_X, - QProjector& projector); - - void update_x_space_excited(World& world, - X_space& old_Chi, - X_space& Chi, - X_space& old_Lambda_X, - X_space& residuals, - XCOperator& xc, - QProjector& projector, - Tensor& omega, - NonLinearXsolver& kain_x_space, - std::vector& Xvector, - std::vector& Xresidual, - Tensor& energy_residuals, - Tensor& old_energy, - Tensor& bsh_residualsX, - Tensor& bsh_residualsY, - Tensor& S, - Tensor& old_S, - Tensor& A, - Tensor& old_A, - size_t iteration, - Tensor& maxrotn); - void compute_new_omegas_transform(World& world, - X_space& old_Chi, - X_space& Chi, - X_space& old_Lambda_X, - X_space& Lambda_X, - Tensor& omega, - Tensor& old_energy, - Tensor& S, - Tensor& old_S, - Tensor& A, - Tensor& old_A, - Tensor& energy_residuals, - size_t iteration); - - - X_space kain_x_space_update(World& world, - const X_space& temp, - const X_space& res, - NonLinearXsolver& kain_x_space, - std::vector& Xvector, - std::vector& Xresidual); - void x_space_step_restriction(World& world, - X_space& old_Chi, - X_space& temp, - bool restrict_y, - Tensor& maxrotn); - // Returns the second order update to the energy - Tensor calculate_energy_update(World& world, - response_space& gamma, - response_space& f_residuals, - response_space& new_f, - size_t print_level, - std::string xy); - - // Returns response functions that have been orthonormalized via - // modified Gram-Schmidt. Note: This is specifically designed for - // response functions only - vecfuncT make_density(World& world, X_space& Chi, std::string calc_type); - response_space gram_schmidt(World& world, response_space& f); - - void gram_schmidt(World& world, response_space& f, response_space& g); - - // Returns the max norm of the given vector of functions - double calculate_max_residual(World& world, response_space& f); - - // Selects the 'active' orbitals from ground state orbitals to be used in - // the calculation (based on energy distance from the HOMO.) Function needs - // knowledge of g_params.orbitals and g_params.ground_energies. Function - // sets - void select_active_subspace(World& world); - // Selects from a list of functions and energies the k functions with the - // lowest energy - response_space select_functions(World& world, - response_space& f, - Tensor& energies, - size_t k, - size_t print_level); - - // Calculates the exponentiation of a matrix through first order (I think) - Tensor matrix_exponential(const Tensor& A); - - // Computes the unitary transformation that diagonalizes the fock matrix - Tensor get_fock_transformation(World& world, - Tensor& overlap, - Tensor& fock, - Tensor& evals, - const double thresh_degenerate); - - // Sorts the given Tensor of energies - Tensor sort_eigenvalues(World& world, Tensor& vals, Tensor& vecs); - - // Diagonalizes the fock matrix, taking care of degerate states - - Tensor diagonalizeFockMatrix(World& world, - X_space& Chi, - X_space& Lambda_X, - Tensor& evals, - Tensor& A, - Tensor& S, - const double thresh); - // Transforms the given matrix of functions according to the given - // transformation matrix. Used to update orbitals / potentials - response_space transform(World& world, response_space& f, Tensor& U); - - // If using a larger subspace to diagonalize in, this will put everything in - - void augment(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& last_Lambda_X, - Tensor& S_x, - Tensor& A_x, - Tensor& old_S, - Tensor& old_A, - size_t print_level); - // If using a larger subspace to diagonalize in, this will put everything in - // the right spot - void augment_full(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& last_Lambda_X, - Tensor& S_x, - Tensor& A_x, - Tensor& old_S, - Tensor& old_A, - size_t print_level); - - // If using a larger subspace to diagonalize in, after diagonalization this - // will put everything in the right spot - void unaugment(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& last_Lambda_X, - Tensor& omega, - Tensor& S_x, - Tensor& A_x, - Tensor& old_S, - Tensor& old_A, - size_t num_states, - size_t iter, - size_t print_level); - // If using a larger subspace to diagonalize in, after diagonalization this - // will put everything in the right spot - void unaugment_full(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& last_Lambda_X, - Tensor& omega, - Tensor& S_x, - Tensor& A_x, - Tensor& old_S, - Tensor& old_A, - size_t num_states, - size_t iter, - size_t print_level); - Tensor diagonalizeFullResponseMatrix(World& world, - X_space& Chi, - X_space& Lambda_X, - Tensor& omega, - Tensor& S, - Tensor& A, - const double thresh, - size_t print_level); - - // Similar to what robert did above in "get_fock_transformation" - Tensor GetFullResponseTransformation(World& world, - Tensor& S, - Tensor& A, - Tensor& evals, - const double thresh); - - // Sorts the given Tensor and response functions in place - void sort(World& world, Tensor& vals, response_space& f); - void sort(World& world, Tensor& vals, X_space& f); - - void deflateGuesses(World& world, - X_space& Chi, - X_space& Lambda_X, - Tensor& S, - Tensor& omega, - size_t& iteration, - size_t& m); - void deflateTDA(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& old_Lambda_X, - Tensor& S, - Tensor old_S, - Tensor old_A, - Tensor& omega, - size_t& iteration, - size_t& m); - - void deflateFull(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& old_Lambda_X, - Tensor& S, - Tensor old_S, - Tensor old_A, - Tensor& omega, - size_t& iteration, - size_t& m); - // Creates the XCOperator object and initializes it with correct - // parameters - XCOperator create_XCOperator(World& world, - std::vector orbitals, - std::string xc); - - // Uses an XCOperator to construct v_xc for the ground state - // density Returns d^2/d rho^2 E_xc[rho] - std::vector create_fxc(World& world, - std::vector& orbitals, - response_space& f, - response_space& g); - - std::vector GetWxcOnFDensities(World& world, - const std::vector& orbitals, - const response_space& f); - std::vector GetConjugateWxcOnFDensities(World& world, - const std::vector& orbitals, - const response_space& f); - - std::vector CreateXCDerivative(World& world, - const std::vector& orbitals, - const response_space& f); - - // Iterates the trial functions until covergence or it runs out of - // iterations - void iterate_excited(World& world, X_space& Chi); - - // Uses member variables - void analysis(World& world, X_space& Chi); - - // Simplified iterate scheme for guesses - void iterate_guess(World& world, X_space& guesses); - - // Create and diagonalize the CIS matrix for improved initial guess - response_space diagonalize_CIS_guess(World& world, - std::vector& virtuals, - Tensor& omega, - std::vector& orbitals, - Tensor& energies, - double lo, - double thresh, - size_t print_level); - - // Adds random noise to function f - response_space add_randomness(World& world, response_space& f, double magnitude); - - // Creates the transition density - functionT make_ground_density(World& world, const vecfuncT& v); - // Creates the transition density - std::vector transition_density(World& world, - std::vector& orbitals, - response_space& x, - response_space& y); - std::vector transition_densityTDA(World& world, - std::vector const& orbitals, - response_space& x); - // Get transition density from f and orbitals - std::vector GetTransitionDensities(World& world, - const std::vector& orbitals, - const response_space& f); - - std::vector GetConjugateTransitionDensities(World& world, - const std::vector& orbitals, - const response_space& f); - // Creates the ground state hamiltonian for the orbitals in the active - // subspace (aka the orbitals in tda_act_orbitals) - Tensor CreateGroundHamiltonian(World& world, std::vector f, size_t print_level); - - // Sets the different k/thresh levels - template - void set_protocol(World& world, double thresh); - - // Verifies that correct order of polynomial is in use for all - void check_k(World& world, double thresh, size_t k); - - // Creates random guess functions semi-intelligently(?) - X_space create_random_guess(World& world, - size_t m, - size_t n, - vector_real_function_3d& grounds, - Molecule& molecule); - - // Creates random guess functions semi-intelligently(?) - std::vector create_random_guess(World& world, - size_t m, - std::vector& grounds, - Molecule& molecule); - - // Creates an initial guess using NWChem outputs from a ground state - // calculation Requires: - // 1. nwchem output file (named as "base_name.out") - // 2. nwchem movecs file (named as "base_name.movecs") - X_space create_nwchem_guess(World& world, size_t m); - - // Creates potentials using the ResponsePotential object - // Potentials are modified in place - - - // Solves the response equations for response states - void solve_excited_states(World& world); - - // Iterates the response functions until converged or out of iterations - - void iterate_freq2(World& world); - // Calculates polarizability according to - // alpha_ij(\omega) = -sum_{m occ} + - // - Tensor polarizability(); - void PrintPolarizabilityAnalysis(World& world, const Tensor polar_tensor); - - class plotCoords { - public: - coord_3d lo, hi; - - plotCoords() { - lo[0] = 0.0; - lo[1] = 0.0; - lo[2] = 0.0; - hi[0] = 0.0; - hi[1] = 0.0; - hi[2] = 0.0; - } - plotCoords(size_t direction, double Lp) { - lo[0] = 0.0; - lo[1] = 0.0; - lo[2] = 0.0; - - hi[0] = 0.0; - hi[1] = 0.0; - hi[2] = 0.0; - - lo[direction] = -Lp; - hi[direction] = Lp; - } - }; - plotCoords SetPlotCoord(size_t i, double Lp); - - void PlotGroundandResponseOrbitals(World& world, - size_t iteration, - response_space& x_response, - response_space& y_response, - ResponseParameters const& r_params, - GroundStateCalculation const& g_params); - void compute_and_print_polarizability(World& world, X_space& Chi, X_space& PQ, std::string message); - void plot_excited_states(World& world, - size_t iteration, - response_space& x_response, - response_space& y_response, - ResponseParameters const& r_params, - GroundStateCalculation const& g_params); - // Solves the response equations for the polarizability - void solve_response_states(World& world); - vecfuncT project_ao_basis(World& world, const AtomicBasisSet& aobasis); - - vecfuncT project_ao_basis_only(World& world, const AtomicBasisSet& aobasis, const Molecule& molecule); - void analyze_vectors(World& world, const vecfuncT& x, std::string response_state); - void output_json() const; - void initialize_excited_json(); - static void excited_to_json(nlohmann::json& json, - size_t iter, - const Tensor& tensor, - const Tensor& tensor1, - const Tensor& tensor2, - const Tensor& tensor3); - static void frequency_to_json(nlohmann::json& json, - size_t iter, - const Tensor& tensor, - const Tensor& tensor1, - const Tensor& tensor2, - const Tensor& tensor3); - vecfuncT make_density(World& world); -}; -#endif // SRC_APPS_MOLRESPONSE_TDDFT_H_ - -// Deuces diff --git a/src/apps/molresponse/Theta_X.cc b/src/apps/molresponse/Theta_X.cc deleted file mode 100644 index a5c2e856c54..00000000000 --- a/src/apps/molresponse/Theta_X.cc +++ /dev/null @@ -1,103 +0,0 @@ - - -#include - - -#include - -#include "../chem/SCFOperators.h" -#include "../chem/molecule.h" -#include "../chem/xcfunctional.h" -#include "molresponse/TDDFT.h" - -#include "molresponse/response_functions.h" -#include "molresponse/response_parameters.h" - -#include "molresponse/x_space.h" -using json = nlohmann::json; - - -X_space TDDFT::Compute_Theta_X(World& world, X_space& Chi, XCOperator xc, std::string calc_type) { - bool compute_Y = calc_type.compare("full") == 0; - X_space Theta_X = X_space(world, Chi.num_states(), Chi.num_orbitals()); - // compute - X_space V0X = compute_V0X(world, Chi, xc, compute_Y); - - V0X.truncate(); - if (r_params.print_level() >= 20) { - print("---------------Theta ----------------"); - print(""); - print(inner(Chi, V0X)); - } - - X_space E0X(world, Chi.num_states(), Chi.num_orbitals()); - if (r_params.localize().compare("canon") == 0) { - E0X = Chi.copy(); - E0X.truncate(); - E0X.X = E0X.X * ham_no_diag; - if (compute_Y) { - E0X.Y = E0X.Y * ham_no_diag; - } - - E0X.truncate(); - } - - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi, E0X)); - } - - X_space gamma; - // compute - if (calc_type.compare("full") == 0) { - gamma = compute_gamma_full(world, Chi, xc); - } else if (calc_type.compare("static") == 0) { - gamma = compute_gamma_static(world, Chi, xc); - } else { - gamma = compute_gamma_tda(world, Chi, xc); - } - - Theta_X = (V0X - E0X) + gamma; - Theta_X.truncate(); - - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi, Theta_X)); - } - - return Theta_X; -} -void TDDFT::output_json() const { - std::ofstream ofs("response.json"); - ofs << j_molresponse; -} -void TDDFT::excited_to_json(json& j_mol_in, - size_t iter, - const Tensor& res_X, - const Tensor& res_Y, - const Tensor& density_res, - const Tensor& omega) { - json j = {}; - j["iter"] = iter; - j["res_X"] = tensor_to_json(res_X); - j["res_Y"] = tensor_to_json(res_Y); - j["density_residuals"] = tensor_to_json(density_res); - j["omega"] = tensor_to_json(omega); - auto index = j_mol_in["protocol_data"].size() - 1; - j_mol_in["protocol_data"][index]["iter_data"].push_back(j); -} -void TDDFT::frequency_to_json(json& j_mol_in, - size_t iter, - const Tensor& res_X, - const Tensor& res_Y, - const Tensor& density_res, - const Tensor& omega) { - json j = {}; - j["iter"] = iter; - j["res_X"] = tensor_to_json(res_X); - j["res_Y"] = tensor_to_json(res_Y); - j["density_residuals"] = tensor_to_json(density_res); - j["polar"] = tensor_to_json(omega); - auto index = j_mol_in["protocol_data"].size() - 1; - j_mol_in["protocol_data"][index]["iter_data"].push_back(j); -} diff --git a/src/apps/molresponse/basic_operators.cc b/src/apps/molresponse/basic_operators.cc index 68dfea263eb..2a906295701 100644 --- a/src/apps/molresponse/basic_operators.cc +++ b/src/apps/molresponse/basic_operators.cc @@ -6,85 +6,90 @@ namespace madness { -// Returns a shallow copy of the transpose of a vector of vector of functions -response_space transpose(response_space &f) { - MADNESS_ASSERT(f.size() > 0); - MADNESS_ASSERT(f[0].size() > 0); - - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - - // Return container - response_space g(f[0][0].world(), m, n); - - // Now do shallow copies - for (size_t i = 0; i < m; i++) - for (size_t j = 0; j < n; j++) g[j][i] = f[i][j]; - - // Done - return g; -} - -// Truncate a vector of vector of functions -void truncate(World &world, response_space &v, double tol, bool fence) { - MADNESS_ASSERT(v.size() > 0); - MADNESS_ASSERT(v[0].size() > 0); - - for (unsigned int i = 0; i < v.size(); i++) { - truncate(world, v[i], tol, fence); - } -} - -// Apply a vector of vector of operators to a vector of vector of functions -// g[i][j] = op[i][j](f[i][j]) -response_space apply(World &world, - std::vector>> &op, - response_space &f) { - MADNESS_ASSERT(f.size() > 0); - MADNESS_ASSERT(f.size() == op.size()); - MADNESS_ASSERT(f[0].size() == op[0].size()); - - response_space result(f[0][0].world(), f.size(), f[0].size()); - - for (unsigned int i = 0; i < f.size(); i++) { - // Using vmra.h function, line 889 - result[i] = apply(world, op[i], f[i]); - } - - return result; -} -// Apply a vector of operators to a set of response states -// -response_space apply(World &world, std::vector> &op, response_space &f) { - MADNESS_ASSERT(f.size() > 0); - MADNESS_ASSERT(f[0].size() == op.size()); - - response_space result(f[0][0].world(), f.size(), f[0].size()); - - for (unsigned int i = 0; i < f.size(); i++) { - // Using vmra.h function, line 889 - /// Applies a vector of operators to a vector of functions --- q[i] = - /// apply(op[i],f[i]) - result[i] = apply(world, op, f[i]); - } - - return result; -} - -// Apply the derivative operator to a vector of vector of functions -response_space apply(World &world, real_derivative_3d &op, response_space &f) { - MADNESS_ASSERT(f.size() > 0); - - response_space result; - - for (unsigned int i = 0; i < f.size(); i++) { - std::vector temp = apply(world, op, f[i]); - result.push_back(temp); - } - - return result; -} -} // namespace madness + // Returns a shallow copy of the transpose of a vector of vector of functions + response_space transpose(response_space &f) { + MADNESS_ASSERT(f.size() > 0); + MADNESS_ASSERT(f[0].size() > 0); + + // Get sizes + size_t m = f.size(); + size_t n = f[0].size(); + + // Return container + response_space g(f[0][0].world(), m, n); + + // Now do shallow copies + for (size_t i = 0; i < m; i++) + for (size_t j = 0; j < n; j++) g[j][i] = f[i][j]; + + // Done + return g; + } + + // Truncate a vector of vector of functions + void truncate(World &world, response_space &v, double tol, bool fence) { + MADNESS_ASSERT(v.size() > 0); + MADNESS_ASSERT(v[0].size() > 0); + + for (unsigned int i = 0; i < v.size(); i++) { + truncate(world, v[i], tol, fence); + } + } + + // Apply a vector of vector of operators to a vector of vector of functions + // g[i][j] = op[i][j](f[i][j]) + response_space apply(World &world, + std::vector>> &op, + response_space &f) { + MADNESS_ASSERT(f.size() > 0); + MADNESS_ASSERT(f.size() == op.size()); + MADNESS_ASSERT(f[0].size() == op[0].size()); + + response_space result(f[0][0].world(), f.size(), f[0].size()); + + for (unsigned int i = 0; i < f.size(); i++) { + // Using vmra.h function, line 889 + result[i] = apply(world, op[i], f[i]); + } + + return result; + } + // Apply a vector of operators to a set of response states + // + response_space apply(World &world, std::vector> &op, response_space &f) { + MADNESS_ASSERT(f.size() > 0); + MADNESS_ASSERT(f[0].size() == op.size()); + + response_space result(f[0][0].world(), f.size(), f[0].size()); + + transform(f.begin(), f.end(), result.begin(), [&](const auto &fi) { return apply(world, op, fi); }); + + world.gop.fence(); + /* + for (unsigned int i = 0; i < f.size(); i++) { + // Using vmra.h function, line 889 + /// Applies a vector of operators to a vector of functions --- q[i] = + /// apply(op[i],f[i]) + result[i] = apply(world, op, f[i]); + } + */ + + return result; + } + + // Apply the derivative operator to a vector of vector of functions + response_space apply(World &world, real_derivative_3d &op, response_space &f) { + MADNESS_ASSERT(f.size() > 0); + + response_space result; + + for (unsigned int i = 0; i < f.size(); i++) { + std::vector temp = apply(world, op, f[i]); + result.push_back(temp); + } + + return result; + } +}// namespace madness // Deuces diff --git a/src/apps/molresponse/density.cc b/src/apps/molresponse/density.cc deleted file mode 100644 index 6d636994831..00000000000 --- a/src/apps/molresponse/density.cc +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2021 Adrian Hurtado -#include "molresponse/density.h" - -#include -#include -#include -#include - -#include "../../madness/mra/funcplot.h" -#include "TDDFT.h" -#include "molresponse/global_functions.h" -#include "molresponse/ground_parameters.h" -#include "molresponse/property.h" -#include "molresponse/response_functions.h" -#include "molresponse/response_parameters.h" - -typedef Tensor TensorT; -typedef Function FunctionT; -typedef std::shared_ptr> FunctorT; -typedef FunctionFactory FactoryT; -typedef std::vector VectorFunction3DT; - -density_vector::density_vector(World &world, ResponseParameters &other_rparams, - GroundStateCalculation &other_gparams) - : num_states(other_rparams.num_states()), - num_orbitals(other_rparams.num_orbitals()), - property(), - r_params(other_rparams), // should be a copy - g_params(other_gparams), - Chi(world, num_states, num_orbitals), - PQ(world, num_states, num_orbitals), - orbitals(copy(world, other_gparams.orbitals())), - molecule(other_gparams.molecule()) { - - if (r_params.excited_state()) { - this->omega = Tensor(r_params.num_states()); - } else { - this->omega = Tensor(1); - this->omega(0, 0) = r_params.omega(); - } -} - -// right now everything uses copy - -ResponseParameters density_vector::GetResponseParameters() { return r_params; } - -density_vector set_density_type(World &world, ResponseParameters & R, GroundStateCalculation & G) { - if (R.excited_state()) { - return excited_state_density_vector(world, R, G); - } else if (R.dipole()) - return dipole_density_vector(world, R, G); - else if (R.nuclear()) { - return nuclear_density_vector(world, R, G); - } else if (R.second_order()) { - MADNESS_EXCEPTION("not implemented yet", 0); - return density_vector(world, R, G); - } else if (R.third_order()) { - MADNESS_EXCEPTION("not implemented yet", 0); - return density_vector(world, R, G); - - } else { - MADNESS_EXCEPTION("what is this????", 0); - return density_vector(world, R, G); - } -}; diff --git a/src/apps/molresponse/density.h b/src/apps/molresponse/density.h deleted file mode 100644 index 7a383aadc66..00000000000 --- a/src/apps/molresponse/density.h +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef SRC_APPS_molresponse_DENSITY_H_ -#define SRC_APPS_molresponse_DENSITY_H_ - -#include -#include - -#include -#include -#include -#include - -#include "CalculationParameters.h" -#include "molresponse/ground_parameters.h" -#include "molresponse/property.h" -#include "molresponse/response_parameters.h" -#include "timers.h" -#include "xcfunctional.h" - -typedef Tensor TensorT; -typedef Function FunctionT; -typedef std::shared_ptr> FunctorT; -typedef FunctionFactory FactoryT; -typedef std::vector VectorFunction3DT; - - -// operator used to create it. -// homogeneous sol----x and y functions. -// particular sol --- depends on lower order functions used to create it. -// it also needs a xc functional -// The r_params and Gparmas used to create the density. -// -class density_vector { - protected: - // operator used create first order density - Tensor omega; // frequency or frequencies - const size_t num_states; // number of response states - const size_t num_orbitals; // number of ground state orbitals - const std::string property; // excited state, nuclear,dipole - - const ResponseParameters r_params; // Response Parameters - const GroundStateCalculation g_params; - - PropertyBase property_operator; // dipole, nuclear, or none - X_space Chi; - X_space PQ; - VectorFunction3DT orbitals; - - // first order frequency response densities - VectorFunction3DT rho_omega; // the response density vector - Molecule molecule; - - public: - friend class TDDFT; - // Collective constructor - density_vector(World& world, ResponseParameters& other_rparams, - GroundStateCalculation& other_gparams); - density_vector(const density_vector& other) = default; - - ResponseParameters GetResponseParameters(); -}; - -class dipole_density_vector : public density_vector { - public: - dipole_density_vector(World& world, ResponseParameters R, GroundStateCalculation G) - : density_vector(world, R, G) {} -}; - -class nuclear_density_vector : public density_vector { - public: - nuclear_density_vector(World& world, ResponseParameters R, GroundStateCalculation G) - : density_vector(world, R, G) {} -}; - -class excited_state_density_vector : public density_vector { - public: - excited_state_density_vector(World& world, ResponseParameters R, GroundStateCalculation G) - : density_vector(world, R, G) {} -}; - -density_vector set_density_type(World& world, ResponseParameters & R, GroundStateCalculation& G); -// The TDDFT constructor initializes the preliminary calculation details including -// the Chi vectors and the PQ vectors if they are required -// ground orbitals -// molecule -// We also intialize the molresponse.json file -#endif // SRC_APPS_molresponse_DENSITY_H_ diff --git a/src/apps/molresponse/densityVector.cpp b/src/apps/molresponse/densityVector.cpp deleted file mode 100644 index 45a21462544..00000000000 --- a/src/apps/molresponse/densityVector.cpp +++ /dev/null @@ -1,542 +0,0 @@ -// -// Created by adrianhurtado on 1/24/22. -// - -#include "densityVector.hpp" -#include "../timer.h" - -namespace madness{ - -} - -response_space FrequencySolver::PropertyRHS(World &world, PropertyBase &p) const { - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - } - response_space rhs(world, p.num_operators, r_params.num_orbitals()); - - reconstruct(world, ground_orbitals); - QProjector Qhat(world, ground_orbitals); - // Set the dipoles (ground orbitals are probably - // more accurate now, so recalc the dipoles) - // why is it called dipole guess. - // This is just orbitals times dipole operator - std::vector orbitals = ground_orbitals; - - print("num operators ", p.num_operators); - for (size_t i = 0; i < p.num_operators; i++) { - // question here....MolecularDerivativeFunctor takes derivative with - // respect to axis atom and axis - // here we save - // need to project - - rhs[i] = mul(world, p.operator_vector.at(i), ground_orbitals, r_params.lo()); - - truncate(world, rhs[i]); - // rhs[i].truncate_vec(); - - // project rhs vectors for state - rhs[i] = Qhat(rhs[i]); - // truncate(world, rhs[i], true); - for (size_t j = 0; j < orbitals.size(); j++) { - print("RHS norm for after orbital ", j, "Response state ", i, ": ", rhs[i][j].norm2()); - } - - world.gop.fence(); - // core projector contribution - } - - // if (world.rank() ==dipole 0) print("derivatives:\n", r, ru, rc, ra); - molresponse::end_timer(world, "rhs vectors"); - return rhs; -} -void FrequencySolver::compute(World &world, FrequencyVector& rho) { - molresponse::start_timer(world); - if (r_params.plot_initial()) { - if (world.rank() == 0) print("\n Plotting ground state densities.\n"); - if (r_params.plot_l() > 0.0) - do_vtk_plots(world, - r_params.plot_pts(), - r_params.plot_l(), - 0, - r_params.num_orbitals(), - molecule, - square(world, ground_orbitals), - "ground"); - else - do_vtk_plots(world, - r_params.plot_pts(), - r_params.L() / 2.0, - 0, - r_params.num_orbitals(), - molecule, - square(world, ground_orbitals), - "ground"); - } - // Warm and fuzzy - if (world.rank() == 0) { - print("\n\n Response Calculation"); - print(" ------------------------"); - } - auto protocols=r_params.protocol(); - print(protocols); - for (unsigned int proto = 0; proto < protocols.size(); proto++) { - // Set defaults inside here - // default value of - auto thresh=protocols[proto]; - print(thresh); - set_protocol(world,thresh); - - check_k(world, thresh, FunctionDefaults<3>::get_k()); - // Do something to ensure all functions have same k value - j_molresponse["protocol_data"].push_back({}); - j_molresponse["protocol_data"][proto]["proto"] = thresh;//r_params.protocol()[proto]; - j_molresponse["protocol_data"][proto]["iter_data"]={}; - - if (r_params.dipole()) { - if (world.rank() == 0) print("creating dipole property operator"); - p = DipoleVector(world); - } else if (r_params.nuclear()) { - if (world.rank() == 0) print("creating nuclear property operator"); - p = NuclearVector(world, molecule); - } - if (proto == 0) { - if (r_params.restart()) { - if (world.rank() == 0) print(" Initial guess from file:", r_params.restart_file()); - load(world, r_params.restart_file()); - check_k(world, thresh, FunctionDefaults<3>::get_k()); - - if (r_params.dipole()) { - // set states - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - print("P: ", PQ.X.norm2()); - print("Q: ", PQ.Y.norm2()); - - // set RHS_Vector - } else if (r_params.nuclear()) { - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - - } else if (r_params.order2()) { - // - } else if (r_params.order3()) { - // - } else { - MADNESS_EXCEPTION("not a valid response state ", 0); - } - } else { // Dipole guesses - - if (r_params.dipole()) { - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - // set states - // - print("okay this is not a good idea if it comes up more than once"); - // set RHS_Vector - } else if (r_params.nuclear()) { - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - } else if (r_params.order2()) { - // - } else if (r_params.order3()) { - // - } else { - MADNESS_EXCEPTION("not a valid response state ", 0); - } - } - } - // - // Here i should print some information about the calculation we are - // about to do - print("Pre iteration Information"); - print("Number of Response States: ", r_params.num_states()); - print("Number of Ground States: ", r_params.num_orbitals()); - print("k = ", FunctionDefaults<3>::get_k()); - print("protocol threshold = ", FunctionDefaults<3>::get_k()); - - print("Property rhs func k = ", PQ.X[0][0].k()); - print("Property func k thresh= ", PQ.X[0][0].thresh()); - - print("Property rhs func Q k = ", PQ.Y[0][0].k()); - print("Property func Q k thresh = ", PQ.Y[0][0].thresh()); - - print("Property rhs func P norms", PQ.X.norm2()); - print("Property rhs func Q norms", PQ.Y.norm2()); - - if (proto > 0) { - r_params.set_derived_value("first_run", false); - } - // Now actually ready to iterate... - // iterate_freq(world); - iterate(world); - // IterateFrequencyResponse(world, P, Q); - } // end for --finished reponse density - - // Plot the response function if desired - if (r_params.plot()) { - // Need to get densities first - std::vector densities = make_density(world); - - // For the instance where we don't plot all the orbitals - std::vector plot_densities; - for (size_t i : r_params.plot_data()) { - plot_densities.push_back(densities[i]); - } - - // Now plot - if (world.rank() == 0) print("\n Plotting response state densities.\n"); - if (r_params.plot_l() > 0.0) - do_vtk_plots(world, - r_params.plot_pts(), - r_params.plot_l(), - 0, - r_params.plot_data().size(), - molecule, - plot_densities, - "response-state"); - else - do_vtk_plots(world, - r_params.plot_pts(), - r_params.L(), - 0, - r_params.plot_data().size(), - molecule, - plot_densities, - "response-state"); - } - - std::cout.precision(2); - std::cout << std::fixed; - // Get start time - molresponse::end_timer(world, "total:"); -} // end compute frequency response - -void FrequencySolver::iterate(World& world) { - size_t iter; - // Variables needed to iterate - QProjector projector(world, ground_orbitals); - size_t m = r_params.num_states(); // Number of excited states - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - - real_function_3d v_xc; // For TDDFT - bool converged = false; // Converged flag - const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - // m residuals for x and y - Tensor bsh_residualsX(m); - Tensor bsh_residualsY(m); - Tensor density_residuals(m); - - vecfuncT rho_omega_old(m); - - // initialize DFT XC functional operator - XCOperator xc = make_xc_operator(world); - - // create X space residuals - X_space residuals(world, m, n); - X_space old_Chi(world, m, n); - // Create the X space - // vector of Xvectors - std::vector Xvector; - std::vector Xresidual; - for (size_t b = 0; b < m; b++) { - Xvector.emplace_back(Chi, b); - Xresidual.emplace_back(residuals, b); - } - // If DFT, initialize the XCOperator - - // create a std vector of XNONLinearsolvers - NonLinearXsolver kain_x_space; - for (size_t b = 0; b < m; b++) { - kain_x_space.push_back( - XNonlinearSolver(X_space_allocator(world, n), true)); - } - // if kain set the max sub of each of the solvers - if (r_params.kain()){ - for (auto& solver:kain_x_space){ - solver.set_maxsub(r_params.maxsub()); - } - } - // - double omega_n = r_params.omega(); - omega_n = abs(omega_n); - omega[0] = omega_n; - // We compute with positive frequencies - print("Warning input frequency is assumed to be positive"); - print("Computing at positive frequency omega = ", omega_n); - double x_shifts = 0.0; - double y_shifts = 0.0; - // if less negative orbital energy + frequency is positive or greater than 0 - if ((ground_energies[n - 1] + omega_n) >= 0.0) { - // Calculate minimum shift needed such that \eps + \omega + shift < 0 - print("*** we are shifting just so you know!!!"); - x_shifts = -.05 - (omega_n + ground_energies[n - 1]); - } - std::vector bsh_x_ops = make_bsh_operators_response(world, x_shifts, omega_n); - std::vector bsh_y_ops; - - bool static_res = (omega_n == 0.0); - bool compute_y = not static_res; - // Negate omega to make this next set of BSH operators \eps - omega - if (compute_y) { - omega_n = -omega_n; - bsh_y_ops = make_bsh_operators_response(world, y_shifts, omega_n); - omega_n = -omega_n; - } - - Tensor maxrotn(m); - maxrotn.fill(dconv * 100); - - for (iter = 0; iter <= r_params.maxiter(); ++iter) { - // Basic output - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - if (world.rank() == 0) printf("\n Iteration %d at time %.1fs\n", static_cast(iter), wall_time()); - if (world.rank() == 0) print("-------------------------------------------"); - } - if (r_params.print_level() >= 1) { - if (world.rank() == 0) { - print("Chi.x norms at start of iteration: ", iter); - print(Chi.X.norm2()); - print("Chi.y norms at start of iteration ", iter); - print(Chi.Y.norm2()); - } - } - - old_Chi = Chi.copy(); - rho_omega_old = rho_omega; - // compute rho_omega - rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.Y); - // rho_omega = make_density(world, Chi, compute_y); - - if (iter < 2 || (iter % 10) == 0) { - load_balance(world); - } - - // compute density residuals - if (iter > 0) { - density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); - // Take the max between this an a minimum maxrotn step - maxrotn = (bsh_residualsX + bsh_residualsY) / 4; - print("maxrotn", maxrotn); - for (size_t i = 0; i < Chi.num_states(); i++) { - if (maxrotn[i] < r_params.maxrotn()) { - maxrotn[i] = r_params.maxrotn(); - print("less than maxrotn....set to maxrotn"); - } - } - if (world.rank() == 0 and (r_params.print_level() > 1)) { - print("Density residuals"); - print(density_residuals); - print("BSH residuals"); - print("x", bsh_residualsX); - print("y", bsh_residualsY); - print("maxrotn", maxrotn); - } - } - - if (iter > 0) { - if (density_residuals.max() > 2) { - break; - } - double d_residual = density_residuals.max(); - double d_conv = dconv * std::max(size_t(5), molecule.natom()); - // Test convergence and set to true - if ((d_residual < d_conv) and - ((std::max(bsh_residualsX.absmax(), bsh_residualsY.absmax()) < d_conv * 5.0) or - r_params.get("conv_only_dens"))) { - converged = true; - } - - if (converged || iter == r_params.maxiter() - 1) { - // if converged print converged - if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { - print("\nConverged!\n"); - } - - if (r_params.save()) { - molresponse::start_timer(world); - save(world, r_params.save_file()); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Save:"); - } - // Basic output - if (r_params.print_level() >= 1) molresponse::end_timer(world, " This iteration:"); - // plot orbitals - if (r_params.plot_all_orbitals()) { - PlotGroundandResponseOrbitals(world, iter, Chi.X, Chi.Y, r_params, ground_calc); - } - ground_density = make_ground_density(world); - if (r_params.plot()) { - do_vtk_plots(world, 200, r_params.L(), molecule, ground_density, rho_omega, ground_orbitals, Chi); - } - break; - } - } - update_x_space_response(world, - Chi, - residuals, - xc, - bsh_x_ops, - bsh_y_ops, - projector, - x_shifts, - omega_n, - kain_x_space, - Xvector, - Xresidual, - bsh_residualsX, - bsh_residualsY, - iter, - maxrotn); - - Tensor polar = -2 * inner(Chi, PQ); - - frequency_to_json(j_molresponse, iter, bsh_residualsX, bsh_residualsY, density_residuals, polar); - } - - if (world.rank() == 0) print("\n"); - if (world.rank() == 0) print(" Finished Response Calculation "); - if (world.rank() == 0) print(" ------------------------"); - if (world.rank() == 0) print("\n"); - - // Did we converge? - if (iter == r_params.maxiter() && not converged) { - if (world.rank() == 0) print(" Failed to converge. Reason:"); - if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); - if (world.rank() == 0) print(" Running analysis on current values.\n"); - } - if (world.rank() == 0) { - print(" Final energy residuals X:"); - print(bsh_residualsX); - print(" Final energy residuals Y:"); - print(bsh_residualsY); - print(" Final density residuals:"); - print(density_residuals); - compute_and_print_polarizability(world, "Converged"); - } -} - -void FrequencySolver::compute_and_print_polarizability(World &world, std::string message) { - Tensor G = -2 * inner(Chi, PQ); - if (world.rank() == 0) { - print("Polarizability", message); - print(G); - } -} -void FrequencySolver::frequency_to_json(json& j_mol_in, - size_t iter, - const Tensor& res_X, - const Tensor& res_Y, - const Tensor& density_res, - const Tensor& omega) { - json j = {}; - j["iter"] = iter; - j["res_X"] = tensor_to_json(res_X); - j["res_Y"] = tensor_to_json(res_Y); - j["density_residuals"] = tensor_to_json(density_res); - j["polar"] = tensor_to_json(omega); - auto index = j_mol_in["protocol_data"].size() - 1; - j_mol_in["protocol_data"][index]["iter_data"].push_back(j); -} -void FrequencySolver::update_x_space_response(World &world, - X_space &Chi, - X_space &res, - XCOperator &xc, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, - QProjector &projector, - double &x_shifts, - double &omega_n, - NonLinearXsolver &kain_x_space, - std::vector Xvector, - std::vector Xresidual, - Tensor &bsh_residualsX, - Tensor &bsh_residualsY, - size_t iteration, - Tensor &maxrotn) { - size_t m = Chi.num_states(); - bool compute_y = r_params.omega() != 0.0; - // size_t n = Chi.num_orbitals(); - - Tensor errX(m); - Tensor errY(m); - - X_space theta_X = Compute_Theta_X(world, Chi, xc, r_params.calc_type()); - // compute residual X_space - print("BSH update iter = ", iteration); - - X_space temp = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - - res = compute_residual(world, Chi, temp, bsh_residualsX, bsh_residualsY, r_params.calc_type()); - - // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 0)) { - temp = kain_x_space_update(world, Chi, res, kain_x_space, Xvector, Xresidual); - } - - if (iteration > 0) { - x_space_step_restriction(world, Chi, temp, compute_y, maxrotn); - } - // truncate x - temp.X.truncate_rf(); - // truncate y if compute y - if (compute_y) temp.Y.truncate_rf(); - // if not compute y then copy x in to y - if (!compute_y) temp.Y = temp.X.copy(); - Chi = temp.copy(); - // print x norms -} -X_space FrequencySolver::bsh_update_response(World &world, - X_space &theta_X, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, - QProjector &projector, - double &x_shifts) { - size_t m = theta_X.X.size(); - size_t n = theta_X.X.size_orbitals(); - bool compute_y = r_params.omega() != 0.0; - - molresponse::start_timer(world); - - theta_X.X += Chi.X * x_shifts; - theta_X.X += PQ.X; - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - - if (compute_y) { - theta_X.Y += PQ.Y; - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); - } - molresponse::end_timer(world, "Compute residual stuff theta_X"); - - // apply bsh - molresponse::start_timer(world); - X_space bsh_X(world, m, n); - - bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) { - bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - } - molresponse::end_timer(world, "Apply BSH to theta_X"); - - molresponse::start_timer(world); - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); - - if (compute_y) { - for (size_t i = 0; i < m; i++) { - bsh_X.Y[i] = projector(bsh_X.Y[i]); - } - bsh_X.truncate(); - } else { - bsh_X.X.truncate_rf(); - bsh_X.Y = bsh_X.X.copy(); - } - molresponse::end_timer(world, "Project and truncate BSH_X"); - - return bsh_X; -} - - - diff --git a/src/apps/molresponse/densityVector.hpp b/src/apps/molresponse/densityVector.hpp deleted file mode 100644 index 9003a2dec45..00000000000 --- a/src/apps/molresponse/densityVector.hpp +++ /dev/null @@ -1,80 +0,0 @@ -// -// Created by adrianhurtado on 1/24/22. -// - -#ifndef MADNESS_DENSITYVECTOR_HPP -#define MADNESS_DENSITYVECTOR_HPP -#include "molresponse/global_functions.h" -#include "property.h" - -#include "mra.h" -#include "ResponseBase.hpp" - -class DensityVector { - public: - DensityVector() = default; - virtual void compute(World& world) = 0; - virtual ~DensityVector() = default; -}; - -class FrequencyVector; - -class FrequencySolver : public ResponseBase { - public: - virtual ~FrequencySolver() = default; - void compute(World&world,FrequencyVector& density); - private: - PropertyBase p; // for frequency calculations - X_space PQ; - Tensor omega; - response_space PropertyRHS(World& world, PropertyBase& p) const; - void iterate(World& world); - void compute_and_print_polarizability(World& world, std::string message); - void frequency_to_json(json& j_mol_in, - size_t iter, - const Tensor& res_X, - const Tensor& res_Y, - const Tensor& density_res, - const Tensor& omega); - void update_x_space_response(World& world, - X_space& Chi, - X_space& res, - XCOperator& xc, - vector& bsh_x_ops, - vector& bsh_y_ops, - QProjector& projector, - double& x_shifts, - double& omega_n, - NonLinearXsolver& kain_x_space, - vector Xvector, - vector Xresidual, - Tensor& bsh_residualsX, - Tensor& bsh_residualsY, - size_t iteration, - Tensor& maxrotn); - X_space bsh_update_response(World& world, - X_space& theta_X, - vector& bsh_x_ops, - vector& bsh_y_ops, - QProjector& projector, - double& x_shifts); -}; - - -class FrequencyVector : public DensityVector { - public: - FrequencyVector(World& world, std::unique_ptr calc) : computing(std::move(calc)) {} - - protected: - std::unique_ptr computing; - private: - X_space PQ; - Tensor omega; -}; - - - - - - -#endif // MADNESS_DENSITYVECTOR_HPP diff --git a/src/apps/molresponse/iter_freq2.cc b/src/apps/molresponse/iter_freq2.cc deleted file mode 100644 index 28bbca2b984..00000000000 --- a/src/apps/molresponse/iter_freq2.cc +++ /dev/null @@ -1,243 +0,0 @@ - -// Copyright 2021 Adrian Hurtado -#include - -#include -#include -#include -#include -#include - -#include "../chem/NWChem.h" // For nwchem interface -#include "../chem/SCFOperators.h" -#include "../chem/molecule.h" -#include "Plot_VTK.h" -#include "TDDFT.h" -#include "madness/tensor/tensor_json.hpp" -#include "chem/potentialmanager.h" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) -#include "madness/mra/funcdefaults.h" -#include "molresponse/basic_operators.h" -#include "molresponse/density.h" -#include "molresponse/global_functions.h" -#include "molresponse/property.h" -#include "molresponse/response_functions.h" -#include "molresponse/timer.h" - -using json = nlohmann::json; - -json freq_iteration_to_json(int iter, - const Tensor& bsh_residualsX, - const Tensor& bsh_residualsY, - const Tensor& density_residuals, - const Tensor& polar) { - json j_iter = {}; - j_iter["iter"] = iter; - j_iter["bsh_residualsX"] = tensor_to_json(bsh_residualsX); - j_iter["bsh_residualsY"] = tensor_to_json(bsh_residualsY); - j_iter["density_residuals"] = tensor_to_json(density_residuals); - j_iter["polarizability"] = tensor_to_json(polar); - return j_iter; -} - -// Iterate Frequency Response -void TDDFT::iterate_freq2(World& world) { - size_t iter; - // Variables needed to iterate - QProjector projector(world, ground_orbitals); - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - size_t m = r_params.num_states(); // Number of excited states - - real_function_3d v_xc; // For TDDFT - bool converged = false; // Converged flag - const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - // m residuals for x and y - Tensor bsh_residualsX(m); - Tensor bsh_residualsY(m); - Tensor density_residuals(m); - - vecfuncT rho_omega_old(m); - - // initialize DFT XC functional operator - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - - // create X space residuals - X_space residuals(world, m, n); - X_space old_Chi(world, m, n); - // Create the X space - // vector of Xvectors - std::vector Xvector; - std::vector Xresidual; - for (size_t b = 0; b < m; b++) { - Xvector.push_back(X_vector(Chi, b)); - Xresidual.push_back(X_vector(residuals, b)); - } - // If DFT, initialize the XCOperator - - // create a std vector of XNONLinearsolvers - NonLinearXsolver kain_x_space; - for (size_t b = 0; b < m; b++) { - kain_x_space.push_back( - XNonlinearSolver(X_space_allocator(world, n), true)); - } - for (size_t b = 0; b < m; b++) { - if (r_params.kain()) kain_x_space[b].set_maxsub(r_params.maxsub()); - } - // - double omega_n = r_params.omega(); - omega_n = abs(omega_n); - omega[0] = omega_n; - // We compute with positive frequencies - print("Warning input frequency is assumed to be positive"); - print("Computing at positive frequency omega = ", omega_n); - double x_shifts = 0.0; - double y_shifts = 0.0; - // if less negative orbital energy + frequency is positive or greater than 0 - if ((ground_energies[n - 1] + omega_n) >= 0.0) { - // Calculate minimum shift needed such that \eps + \omega + shift < 0 - print("*** we are shifting just so you know!!!"); - x_shifts = -.05 - (omega_n + ground_energies[n - 1]); - } - std::vector bsh_x_ops = make_bsh_operators_response(world, x_shifts, omega_n); - std::vector bsh_y_ops; - - bool static_res = (omega_n == 0.0); - bool compute_y = not static_res; - // Negate omega to make this next set of BSH operators \eps - omega - if (compute_y) { - omega_n = -omega_n; - bsh_y_ops = make_bsh_operators_response(world, y_shifts, omega_n); - omega_n = -omega_n; - } - - Tensor maxrotn(m); - maxrotn.fill(dconv * 100); - - for (iter = 0; iter <= r_params.maxiter(); ++iter) { - // Basic output - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - if (world.rank() == 0) printf("\n Iteration %d at time %.1fs\n", static_cast(iter), wall_time()); - if (world.rank() == 0) print("-------------------------------------------"); - } - if (r_params.print_level() >= 1) { - if (world.rank() == 0) { - print("Chi.x norms at start of iteration: ", iter); - print(Chi.X.norm2()); - print("Chi.y norms at start of iteration ", iter); - print(Chi.Y.norm2()); - } - } - - old_Chi = Chi.copy(); - rho_omega_old = rho_omega; - // compute rho_omega - rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.Y); - // rho_omega = make_density(world, Chi, compute_y); - - if (iter < 2 || (iter % 10) == 0) { - load_balance(world, rho_omega, Chi, old_Chi); - } - - // compute density residuals - if (iter > 0) { - density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); - // Take the max between this an a minimum maxrotn step - maxrotn = (bsh_residualsX + bsh_residualsY) / 4; - print("maxrotn", maxrotn); - for (size_t i = 0; i < Chi.num_states(); i++) { - if (maxrotn[i] < r_params.maxrotn()) { - maxrotn[i] = r_params.maxrotn(); - print("less than maxrotn....set to maxrotn"); - } - } - if (world.rank() == 0 and (r_params.print_level() > 1)) { - print("Density residuals"); - print(density_residuals); - print("BSH residuals"); - print("x", bsh_residualsX); - print("y", bsh_residualsY); - print("maxrotn", maxrotn); - } - } - - if (iter > 0) { - if (density_residuals.max() > 2) { - break; - } - double d_residual = density_residuals.max(); - double d_conv = dconv * std::max(size_t(5), molecule.natom()); - // Test convergence and set to true - if ((d_residual < d_conv) and - ((std::max(bsh_residualsX.absmax(), bsh_residualsY.absmax()) < d_conv * 5.0) or - r_params.get("conv_only_dens"))) { - converged = true; - } - - if (converged || iter == r_params.maxiter() - 1) { - // if converged print converged - if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { - print("\nConverged!\n"); - } - - if (r_params.save()) { - molresponse::start_timer(world); - save(world, r_params.save_file()); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Save:"); - } - // Basic output - if (r_params.print_level() >= 1) molresponse::end_timer(world, " This iteration:"); - // plot orbitals - if (r_params.plot_all_orbitals()) { - PlotGroundandResponseOrbitals(world, iter, Chi.X, Chi.Y, r_params, g_params); - } - rho0 = make_ground_density(world, ground_orbitals); - if (r_params.plot()) { - do_vtk_plots(world, 200, r_params.L(), molecule, rho0, rho_omega, ground_orbitals, Chi); - } - break; - } - } - update_x_space_response(world, - Chi, - residuals, - xc, - bsh_x_ops, - bsh_y_ops, - projector, - x_shifts, - omega_n, - kain_x_space, - Xvector, - Xresidual, - bsh_residualsX, - bsh_residualsY, - iter, - maxrotn); - - Tensor polar = -2 * inner(Chi, PQ); - - frequency_to_json(j_molresponse, iter, bsh_residualsX, bsh_residualsY, density_residuals, polar); - } - - if (world.rank() == 0) print("\n"); - if (world.rank() == 0) print(" Finished Response Calculation "); - if (world.rank() == 0) print(" ------------------------"); - if (world.rank() == 0) print("\n"); - - // Did we converge? - if (iter == r_params.maxiter() && not converged) { - if (world.rank() == 0) print(" Failed to converge. Reason:"); - if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); - if (world.rank() == 0) print(" Running analysis on current values.\n"); - } - if (world.rank() == 0) { - print(" Final energy residuals X:"); - print(bsh_residualsX); - print(" Final energy residuals Y:"); - print(bsh_residualsY); - print(" Final density residuals:"); - print(density_residuals); - compute_and_print_polarizability(world, Chi, PQ, "Converged"); - } -} diff --git a/src/apps/molresponse/iterate_excited.cc b/src/apps/molresponse/iterate_excited.cc deleted file mode 100644 index 157affb59d6..00000000000 --- a/src/apps/molresponse/iterate_excited.cc +++ /dev/null @@ -1,476 +0,0 @@ -// Copyright 2021 Adrian Hurtado -#include -#include -#include -#include -#include - -#include "../chem/SCFOperators.h" -#include "../chem/molecule.h" -#include "Plot_VTK.h" -#include "TDDFT.h" -#include "madness/tensor/tensor_json.hpp" -#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) -#include "madness/mra/funcdefaults.h" -#include "molresponse/response_functions.h" -#include "molresponse/timer.h" -#include "molresponse/x_space.h" - -nlohmann::json iteration_to_json(int iter, - const Tensor& bsh_residualsX, - const Tensor& bsh_residualsY, - const Tensor& density_residuals, - const Tensor& omega) { - nlohmann::json j_iter = {}; - j_iter["iter"] = iter; - j_iter["bsh_residualsX"] = tensor_to_json(bsh_residualsX); - j_iter["bsh_residualsY"] = tensor_to_json(bsh_residualsY); - j_iter["density_residuals"] = tensor_to_json(density_residuals); - j_iter["omega"] = tensor_to_json(omega); - return j_iter; -} - -void TDDFT::iterate_excited(World& world, X_space& Chi) { - size_t iter; - QProjector projector(world, ground_orbitals); - size_t m = r_params.num_states(); // Number of excited states - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - - const auto dconv = - std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - - Tensor maxrotn(m); - maxrotn.fill(dconv * 100); - - // m residuals for x and y - Tensor bsh_residualsX(m); - Tensor density_residuals(m); - Tensor bsh_residualsY(m); - // saved response densities - vecfuncT rho_omega_old(m); - // initialize DFT XC functional operator - XCOperator xc = - create_XCOperator(world, ground_orbitals, r_params.xc()); - - // create X space residuals - X_space residuals(world, m, n); - X_space old_Chi(world, m, n); - X_space old_Lambda_X(world, m, n); - - // Create the X space - bool converged = false; // Converged flag - // vector of Xvectors - std::vector Xvector; - std::vector Xresidual; - for (size_t b = 0; b < m; b++) { - Xvector.push_back(X_vector(Chi, b)); - Xresidual.push_back(X_vector(residuals, b)); - } - // If DFT, initialize the XCOperator - - NonLinearXsolver kain_x_space; - size_t nkain = m; // (r_params.omega() != 0.0) ? 2 * m : m; - for (size_t b = 0; b < nkain; b++) { - kain_x_space.push_back( - XNonlinearSolver( - X_space_allocator(world, n), false)); - if (r_params.kain()) kain_x_space[b].set_maxsub(r_params.maxsub()); - } - - response_space bsh_x_resp(world, m, n); // Holds wave function corrections - response_space bsh_y_resp(world, m, n); // Holds wave function corrections - - Tensor old_energy(m); // Holds previous iteration's energy - Tensor energy_residuals(m); // Holds energy residuals - // Holds the norms of y function residuals (for convergence) - Tensor x_norms(m); - Tensor y_norms(m); - - response_space x_differences(world, m, n); - response_space y_differences(world, m, n); - - response_space x_residuals(world, m, n); - response_space y_residuals(world, m, n); - - Tensor x_shifts; // Holds the shifted energy values - Tensor y_shifts; // Holds the shifted energy values - - Tensor S; // Overlap matrix of response components for x states - real_function_3d v_xc; // For TDDFT - Tensor old_A; - Tensor A; - Tensor old_S; - - // Now to iterate - for (iter = 0; iter < r_params.maxiter(); ++iter) { - // Start a timer for this iteration - // Basic output - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - if (world.rank() == 0) - printf("\n Iteration %d at time %.1fs\n", - static_cast(iter), - wall_time()); - if (world.rank() == 0) print(" -------------------------------"); - } - - if (r_params.print_level() >= 1) { - if (world.rank() == 0) { - print("Chi.x norms at start of iteration: ", iter); - print(Chi.X.norm2()); - print("Chi.y norms at start of iteration ", iter); - print(Chi.Y.norm2()); - } - } - print("Excited State Frequencies "); - print(omega); - - // rho_omega_old = make_density(world, old_Chi, r_params.calc_type()); - rho_omega_old = rho_omega; - // compute rho_omega - rho_omega = make_density(world, Chi, r_params.calc_type()); - - // Normalize after projection - - if (iter < 2 || (iter % 10) == 0) { - load_balance(world, rho_omega, Chi, old_Chi); - } - - // compute density residuals - if (iter > 0) { - density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); - maxrotn = (bsh_residualsX + bsh_residualsY) / 4; - for (size_t i = 0; i < Chi.num_states(); i++) { - if (maxrotn[i] < r_params.maxrotn()) { - maxrotn[i] = r_params.maxrotn(); - print("less than maxrotn....set to maxrotn"); - } - } - if (world.rank() == 0 and (r_params.print_level() > 2)) { - print("Density residuals"); - print("dres", density_residuals); - print("BSH residuals"); - print("xres", bsh_residualsX); - print("yres", bsh_residualsY); - print("maxrotn", maxrotn); - } - } - - if (iter > 0) { - // Only checking on X components even for full as Y are so small - if (density_residuals.max() > 2) { - break; - } - - double d_residual = density_residuals.max(); - double d_conv = dconv * std::max(size_t(5), molecule.natom()); - - if ((d_residual < d_conv) and - ((std::max(bsh_residualsX.absmax(), bsh_residualsY.absmax()) < - d_conv * 5.0) or - r_params.get("conv_only_dens"))) { - converged = true; - } - if (converged || iter == r_params.maxiter() - 1) { - // if converged print converged - if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { - print("\nConverged!\n"); - } - - if (r_params.save()) { - molresponse::start_timer(world); - save(world, r_params.save_file()); - if (r_params.print_level() >= 1) - molresponse::end_timer(world, "Save:"); - } - // Basic output - if (r_params.print_level() >= 1) - molresponse::end_timer(world, " This iteration:"); - // plot orbitals - if (r_params.plot_all_orbitals()) { - PlotGroundandResponseOrbitals( - world, iter, Chi.X, Chi.Y, r_params, g_params); - } - rho0 = make_ground_density(world, ground_orbitals); - if (r_params.plot()) { - do_vtk_plots(world, - 200, - r_params.L(), - molecule, - rho0, - rho_omega, - ground_orbitals, - Chi); - } - break; - } - } - update_x_space_excited(world, - old_Chi, - Chi, - old_Lambda_X, - residuals, - xc, - projector, - omega, - kain_x_space, - Xvector, - Xresidual, - energy_residuals, - old_energy, - bsh_residualsX, - bsh_residualsY, - S, - old_S, - A, - old_A, - iter, - maxrotn); - - excited_to_json(j_molresponse,iter,bsh_residualsX,bsh_residualsY,density_residuals,omega); - - // Basic output - if (r_params.print_level() >= 1) - molresponse::end_timer(world, " This iteration:"); - } - - if (world.rank() == 0) print("\n"); - if (world.rank() == 0) print(" Finished Excited State Calculation "); - if (world.rank() == 0) print(" ------------------------"); - if (world.rank() == 0) print("\n"); - - // Did we converge? - if (iter == r_params.maxiter() && not converged) { - if (world.rank() == 0) print(" Failed to converge. Reason:"); - if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); - if (world.rank() == 0) print(" Running analysis on current values.\n"); - } - - // Sorstatict - if (!r_params.tda()) { - sort(world, omega, Chi); - } else { - sort(world, omega, Chi.X); - } - - // Print final things - if (world.rank() == 0) { - print(" Final excitation energies:"); - print(omega); - print(" Final energy residuals X:"); - print(bsh_residualsX); - print(" Final energy residuals Y:"); - print(bsh_residualsY); - print(" Final density residuals:"); - print(density_residuals); - - print(" Final X-state response function residuals:"); - print(Chi.X.norm2()); - if (not r_params.tda()) { - if (world.rank() == 0) - print(" Final y-state response function residuals:"); - if (world.rank() == 0) print(Chi.Y.norm2()); - } - } - - analysis(world, Chi); - print("--------------------------------------------------------"); - for (size_t i = 0; i < m; i++) { - std::string x_state = "x_" + std::to_string(i) + "_"; - analyze_vectors(world, Chi.X[i], x_state); - print("--------------------------------------------------------"); - } - if (not r_params.tda()) { - for (size_t i = 0; i < m; i++) { - std::string y_state = "y_" + std::to_string(i) + "_"; - analyze_vectors(world, Chi.Y[i], y_state); - print("--------------------------------------------------------"); - } - } - // append the json to the file - std::ofstream ofs; // open json file in append mode - ofs.open("j_excited.json"); -} - -void TDDFT::analysis(World& world, X_space& Chi) { - // Sizes get used a lot here, so lets get a local copy - size_t n = Chi.X[0].size(); - size_t m = Chi.X.size(); - - // Per response function, want to print the contributions from each - // ground state So print the norm of each function? - Tensor x_norms(m, n); - Tensor y_norms(m, n); - - // Calculate the inner products - for (long i = 0; i < m; i++) { - for (long j = 0; j < n; j++) { - x_norms(i, j) = Chi.X[i][j].norm2(); - - if (not r_params.tda()) y_norms(i, j) = Chi.Y[i][j].norm2(); - } - } - - // 'sort' these inner products within in each row - Tensor cpy = copy(x_norms); - Tensor x_order(m, n); - Tensor y_order(m, n); - for (long i = 0; i < m; i++) { - for (long j = 0; j < n; j++) { - double x = cpy(i, _).max(); - size_t z = 0; - while (x != cpy(i, z)) z++; - cpy(i, z) = -100.0; - x_order(i, j) = z; - - // Also sort y if full response - if (not r_params.tda()) { - y_order(i, j) = z; - } - } - } - - // Need these to calculate dipole/quadrapole - real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - - // Calculate transition dipole moments for each response function - Tensor dipoles(m, 3); - - // Run over each excited state - for (size_t i = 0; i < m; i++) { - // Add in contribution from each ground state - for (size_t j = 0; j < n; j++) { - dipoles(i, 0) += inner(ground_orbitals[j], x * Chi.X[i][j]); - dipoles(i, 1) += inner(ground_orbitals[j], y * Chi.X[i][j]); - dipoles(i, 2) += inner(ground_orbitals[j], z * Chi.X[i][j]); - - if (not r_params.tda()) { - dipoles(i, 0) += inner(ground_orbitals[j], x * Chi.Y[i][j]); - dipoles(i, 1) += inner(ground_orbitals[j], y * Chi.Y[i][j]); - dipoles(i, 2) += inner(ground_orbitals[j], z * Chi.Y[i][j]); - } - } - - // Normalization (negative?) - dipoles(i, 0) *= -sqrt(2.0); - dipoles(i, 1) *= -sqrt(2.0); - dipoles(i, 2) *= -sqrt(2.0); - } - - // Calculate oscillator strength - Tensor oscillator(m); - for (size_t i = 0; i < m; i++) { - oscillator(i) = - 2.0 / 3.0 * - (dipoles(i, 0) * dipoles(i, 0) + dipoles(i, 1) * dipoles(i, 1) + - dipoles(i, 2) * dipoles(i, 2)) * - omega(i); - } - - // Calculate transition quadrapole moments - Tensor quadrupoles(m, 3, 3); - - // Run over each excited state - for (long i = 0; i < m; i++) { - // Add in contribution from each ground state - for (long j = 0; j < n; j++) { - quadrupoles(i, 0, 0) += inner(ground_orbitals[j], x * x * Chi.X[i][j]); - quadrupoles(i, 0, 1) += inner(ground_orbitals[j], x * y * Chi.X[i][j]); - quadrupoles(i, 0, 2) += inner(ground_orbitals[j], x * z * Chi.X[i][j]); - quadrupoles(i, 1, 0) += inner(ground_orbitals[j], y * x * Chi.X[i][j]); - quadrupoles(i, 1, 1) += inner(ground_orbitals[j], y * y * Chi.X[i][j]); - quadrupoles(i, 1, 2) += inner(ground_orbitals[j], y * z * Chi.X[i][j]); - quadrupoles(i, 2, 0) += inner(ground_orbitals[j], z * x * Chi.X[i][j]); - quadrupoles(i, 2, 1) += inner(ground_orbitals[j], z * y * Chi.X[i][j]); - quadrupoles(i, 2, 2) += inner(ground_orbitals[j], z * z * Chi.X[i][j]); - - if (not r_params.tda()) { - quadrupoles(i, 0, 0) += inner(ground_orbitals[j], x * x * Chi.Y[i][j]); - quadrupoles(i, 0, 1) += inner(ground_orbitals[j], x * y * Chi.Y[i][j]); - quadrupoles(i, 0, 2) += inner(ground_orbitals[j], x * z * Chi.Y[i][j]); - quadrupoles(i, 1, 0) += inner(ground_orbitals[j], y * x * Chi.Y[i][j]); - quadrupoles(i, 1, 1) += inner(ground_orbitals[j], y * y * Chi.Y[i][j]); - quadrupoles(i, 1, 2) += inner(ground_orbitals[j], y * z * Chi.Y[i][j]); - quadrupoles(i, 2, 0) += inner(ground_orbitals[j], z * x * Chi.Y[i][j]); - quadrupoles(i, 2, 1) += inner(ground_orbitals[j], z * y * Chi.Y[i][j]); - quadrupoles(i, 2, 2) += inner(ground_orbitals[j], z * z * Chi.Y[i][j]); - } - } - // Normalization - quadrupoles(i, 0, 0) *= sqrt(2.0); - quadrupoles(i, 0, 1) *= sqrt(2.0); - quadrupoles(i, 0, 2) *= sqrt(2.0); - quadrupoles(i, 1, 0) *= sqrt(2.0); - quadrupoles(i, 1, 1) *= sqrt(2.0); - quadrupoles(i, 1, 2) *= sqrt(2.0); - quadrupoles(i, 2, 0) *= sqrt(2.0); - quadrupoles(i, 2, 1) *= sqrt(2.0); - quadrupoles(i, 2, 2) *= sqrt(2.0); - } - - // Now print? - if (world.rank() == 0) { - for (long i = 0; i < m; i++) { - printf(" Response Function %d\t\t%7.8f a.u.", - static_cast(i), - omega(i)); - print("\n --------------------------------------------"); - printf(" Response Function %d\t\t%7.8f eV", - static_cast(i), - omega(i) * 27.2114); - print("\n --------------------------------------------"); - - print("\n Transition Dipole Moments"); - printf(" X: %7.8f Y: %7.8f Z: %7.8f\n", - dipoles(i, 0), - dipoles(i, 1), - dipoles(i, 2)); - - printf("\n Dipole Oscillator Strength: %7.8f\n", oscillator(i)); - - print("\n Transition Quadrupole Moments"); - printf(" %16s %16s %16s\n", "X", "Y", "Z"); - printf(" X %16.8f %16.8f %16.8f\n", - quadrupoles(i, 0, 0), - quadrupoles(i, 0, 1), - quadrupoles(i, 0, 2)); - printf(" Y %16.8f %16.8f %16.8f\n", - quadrupoles(i, 1, 0), - quadrupoles(i, 1, 1), - quadrupoles(i, 1, 2)); - printf(" Z %16.8f %16.8f %16.8f\n", - quadrupoles(i, 2, 0), - quadrupoles(i, 2, 1), - quadrupoles(i, 2, 2)); - - // Print contributions - // Only print the top 5? - if (r_params.tda()) { - print("\n Dominant Contributions:"); - for (long j = 0; j < std::min(size_t(5), n); j++) { - printf(" Occupied %d %7.8f\n", - x_order(i, j), - x_norms(i, x_order(i, j))); - } - - print("\n"); - } else { - print("\n Dominant Contributions:"); - print(" x y"); - for (long j = 0; j < std::min(size_t(5), n); j++) { - printf(" Occupied %d %7.8f %7.8f\n", - x_order(i, j), - x_norms(i, x_order(i, j)), - y_norms(i, y_order(i, j))); - } - - print("\n"); - } - } - } -} diff --git a/src/apps/molresponse/iterate_freq.cc b/src/apps/molresponse/iterate_freq.cc deleted file mode 100644 index f375a31a063..00000000000 --- a/src/apps/molresponse/iterate_freq.cc +++ /dev/null @@ -1,302 +0,0 @@ - - -// Copyright 2021 Adrian Hurtado -#include - -#include -#include -#include -#include -#include - -#include "../chem/NWChem.h" // For nwchem interface -#include "../chem/SCFOperators.h" -#include "../chem/molecule.h" -#include "Plot_VTK.h" -#include "TDDFT.h" -#include "chem/potentialmanager.h" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) -#include "madness/mra/funcdefaults.h" -#include "molresponse/basic_operators.h" -#include "molresponse/density.h" -#include "molresponse/global_functions.h" -#include "molresponse/property.h" -#include "molresponse/response_functions.h" -#include "molresponse/timer.h" - -// Iterate Frequency Response -void TDDFT::iterate_freq(World& world) { - // Variables needed to iterate - size_t iteration = 0; // Iteration counter - QProjector projector(world, ground_orbitals); - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - size_t m = r_params.n_states(); // Number of excited states - - // Holds the norms of y function residuals (for convergence) - Tensor x_norms(m); - Tensor y_norms(m); - // Holds wave function corrections - response_space x_differences(world, m, n); - response_space y_differences(world, m, n); - - response_space x_residuals(world, m, n); - response_space y_residuals(world, m, n); - // response functions - - real_function_3d v_xc; // For TDDFT - bool converged = false; // Converged flag - const double dconv = - std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - - response_space bsh_x_resp(world, m, n); // Holds wave function corrections - response_space bsh_y_resp(world, m, n); // Holds wave function corrections - - // initialize DFT XC functional operator - XCOperator xc = - create_XCOperator(world, ground_orbitals, r_params.xc()); - - /***Create X space and X Vectors for Kain************************************* - * - * - * - * X space refers to X and Y vector spaces |X,Y> - * X vector is a single |X_b,Y_b> b is a single response state - * For kain we need a vector of X_vectors - */ - // create X space residuals - X_space residuals(world, m, n); - X_space old_Chi(world, m, n); - // Create the X space - // vector of Xvectors - std::vector Xvector; - std::vector Xresidual; - for (size_t b = 0; b < m; b++) { - Xvector.push_back(X_vector(Chi, b)); - Xresidual.push_back(X_vector(residuals, b)); - } - // If DFT, initialize the XCOperator - std::vector> - kain_x_space; - size_t nkain = m; // (r_params.omega() != 0.0) ? 2 * m : m; - for (size_t b = 0; b < nkain; b++) { - kain_x_space.push_back( - XNonlinearSolver( - X_space_allocator(world, n), false)); - if (r_params.kain()) kain_x_space[b].set_maxsub(r_params.maxsub()); - } - // - double omega_n = r_params.omega(); - omega_n = abs(omega_n); - omega[0] = omega_n; - // We compute with positive frequencies - print("Warning input frequency is assumed to be positive"); - print("Computing at positive frequency omega = ", omega_n); - double x_shifts{0}; - double y_shifts{0}; - // if less negative orbital energy + frequency is positive or greater than 0 - print("Ground State orbitals"); - print(ground_energies); - if ((ground_energies[n - 1] + omega_n) >= 0.0) { - // Calculate minimum shift needed such that \eps + \omega + shift < 0 - print("*** we are shifting just so you know!!!"); - x_shifts = -(omega_n + ground_energies[n - 1]); - } - // Construct BSH operators - std::vector> bsh_x_operators = - CreateBSHOperatorPropertyVector( - world, x_shifts, ground_energies, omega_n, .001, 1e-6); - std::vector> bsh_y_operators; - - // Negate omega to make this next set of BSH operators \eps - omega - if (omega_n != 0.0) { - omega_n = -omega_n; - bsh_y_operators = CreateBSHOperatorPropertyVector( - world, y_shifts, ground_energies, omega_n, .001, 1e-6); - omega_n = -omega_n; - } - // create couloumb operator - // Now to iterate - // while (iteration < r_params.maxiter() and !converged) { - - for (int iter = 0; iter < r_params.maxiter(); ++iter) { - // Basic output - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - if (world.rank() == 0) - printf("\n Iteration %d at time %.1fs\n", - static_cast(iteration), - wall_time()); - if (world.rank() == 0) print(" -------------------------------"); - } - - // If omega = 0.0, x = y - if (r_params.omega() == 0.0) Chi.Y = Chi.X.copy(); - // Save current to old - // deep copy of response functions - old_Chi = Chi.copy(); - - X_space theta_X = Compute_Theta_X(world, Chi, xc, r_params.calc_type()); - // Apply shifts and rhs - theta_X.X += Chi.X * x_shifts; - theta_X.X += PQ.X; - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - - if (r_params.omega() != 0.0) { - theta_X.Y += PQ.Y; - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); - } - // Load Balancing - if (world.size() > 1 && (iteration < 2 or iteration % 5 == 0)) { - // Start a timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - if (world.rank() == 0) print(""); // Makes it more legible - // (TODO Ask Robert about load balancing) - LoadBalanceDeux<3> lb(world); - for (size_t j = 0; j < n; j++) { - for (size_t k = 0; k < r_params.n_states(); k++) { - lb.add_tree(Chi.X[k][j], lbcost(1.0, 8.0), true); - lb.add_tree(theta_X.X[k][j], lbcost(1.0, 8.0), true); - } - } - FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); - if (r_params.print_level() >= 1) - molresponse::end_timer(world, "Load balancing:"); - } - X_space temp(world, m, n); - // Debugging output - if (r_params.print_level() >= 2) { - if (world.rank() == 0) - print(" Norms of RHS x components before application of BSH:"); - print_norms(world, theta_X.X); - - if (r_params.omega() != 0.0) { - if (world.rank() == 0) - print(" Norms of RHS y components before application BSH:"); - print_norms(world, theta_X.Y); - } - } - // apply bsh - bsh_x_resp = apply(world, bsh_x_operators, theta_X.X); - if (r_params.omega() != 0.0) - bsh_y_resp = apply(world, bsh_y_operators, theta_X.Y); - - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_x_resp[i] = projector(bsh_x_resp[i]); - if (not r_params.tda()) { - for (size_t i = 0; i < m; i++) bsh_y_resp[i] = projector(bsh_y_resp[i]); - } - - temp.X = bsh_x_resp.copy(); - if (r_params.omega() != 0.0) { - temp.Y = bsh_y_resp.copy(); - } else { - temp.Y = temp.X.copy(); - } - temp.X.truncate_rf(); - temp.Y.truncate_rf(); - // compute differences - x_differences = old_Chi.X - temp.X; - if (omega_n != 0.0) y_differences = old_Chi.Y - temp.Y; - // Next calculate 2-norm of these vectors of differences - // Remember: the entire vector is one state - for (size_t i = 0; i < m; i++) x_norms(i) = norm2(world, x_differences[i]); - if (omega_n != 0.0) { - for (size_t i = 0; i < m; i++) - y_norms(i) = norm2(world, y_differences[i]); - } - - // Basic output - if (r_params.print_level() >= 0 and world.rank() == 0) { - if (omega_n != 0.0) { - std::cout << "res " << iteration << " X :"; - for (size_t i(0); i < m; i++) { - std::cout << x_norms[i] << " "; - } - std::cout << " Y :"; - for (size_t i(0); i < m; i++) { - std::cout << y_norms[i] << " "; - } - std::cout << endl; - } else { - print("resX ", iteration, " :", x_norms); - } - } - - if (r_params.kain()) { - residuals = X_space(x_differences, y_differences); - // seperate X_space vectors into individual vectors - for (size_t b = 0; b < m; b++) { - Xvector[b] = (X_vector(temp, b)); - Xresidual[b] = (X_vector(residuals, b)); - } - - molresponse::start_timer(world); - for (size_t b = 0; b < nkain; b++) { - X_vector kain_X = kain_x_space[b].update( - Xvector[b], Xresidual[b], FunctionDefaults<3>::get_thresh(), 3.0); - temp.X[b].assign(kain_X.X[0].begin(), kain_X.X[0].end()); - temp.Y[b].assign(kain_X.Y[0].begin(), kain_X.Y[0].end()); - } - molresponse::end_timer(world, " KAIN update:"); - } - if (iteration > 0) { - for (size_t b = 0; b < m; b++) { - do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response"); - if (omega_n != 0.0) { - do_step_restriction(world, old_Chi.Y[b], temp.X[b], "y_response"); - } - } - } - // print x norms - temp.X.truncate_rf(); - if (omega_n == 0.0) temp.Y = temp.X.copy(); - if (omega_n != 0.0) temp.Y.truncate_rf(); - // temp-> Chi - Chi = temp.copy(); - if (r_params.print_level() >= 1) { - print("Chi.x norms in iteration after truncate: ", iteration); - print(Chi.X.norm2()); - - print("Chi.y norms in iteration after truncate: ", iteration); - print(Chi.Y.norm2()); - } - - // Check convergence - if (std::max(x_norms.absmax(), y_norms.absmax()) < dconv and - iteration > 0) { - if (r_params.print_level() >= 1) - molresponse::end_timer(world, "This iteration:"); - if (world.rank() == 0) print("\n Converged!"); - converged = true; - break; - } - // Update counter - iteration += 1; - // X_space PQ(P, rhs_y); - Tensor G = -2 * inner(Chi, PQ); - // Polarizability Tensor - print("Polarizability Tensor"); - print(G); - // Save - if (r_params.save()) { - molresponse::start_timer(world); - save(world, r_params.save_file()); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Save:"); - } - // Basic output - if (r_params.print_level() >= 1) - molresponse::end_timer(world, " This iteration:"); - // plot orbitals - if (r_params.plot_all_orbitals()) { - PlotGroundandResponseOrbitals( - world, iteration, Chi.X, Chi.Y, r_params, g_params); - } - for (size_t b = 0; b < m; b++) { - Xvector[b] = (X_vector(world, 0)); - Xresidual[b] = (X_vector(world, 0)); - } - - } // while converged -} diff --git a/src/apps/molresponse/iterate_gamma.cc b/src/apps/molresponse/iterate_gamma.cc deleted file mode 100644 index 9a021d2e572..00000000000 --- a/src/apps/molresponse/iterate_gamma.cc +++ /dev/null @@ -1,572 +0,0 @@ - - -#include -#include -#include - -#include "../chem/molecule.h" -#include "TDDFT.h" -#include "basic_operators.h" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) -#include "madness/mra/funcdefaults.h" -#include "madness/mra/vmra.h" -#include "molresponse/global_functions.h" -#include "molresponse/response_functions.h" -#include "molresponse/timer.h" -#include "molresponse/x_space.h" - -// compute exchange |i> -vecfuncT K(vecfuncT& ket, vecfuncT& bra, vecfuncT& vf) { - World& world = ket[0].world(); - int n = bra.size(); - int nf = ket.size(); - double tol = FunctionDefaults<3>::get_thresh(); /// Important this is - double mul_tol = 0.0; - const double lo = 1.e-4; - const double econv = FunctionDefaults<3>::get_thresh(); - - std::shared_ptr poisson; - poisson = std::shared_ptr( - CoulombOperatorPtr(world, lo, econv)); - /// consistent with Coulomb - vecfuncT Kf = zero_functions_compressed(world, nf); - - reconstruct(world, bra); - reconstruct(world, ket); - reconstruct(world, vf); - - // i-j sym - for (int i = 0; i < n; ++i) { - // for each |i> - vecfuncT psif = mul_sparse(world, bra[i], vf, mul_tol); /// was vtol - truncate(world, psif); - // apply to vector of products .. ... - psif = apply(world, *poisson.get(), psif); - truncate(world, psif); - // multiply by ket i |i>: |i> |i> |i> - psif = mul_sparse(world, ket[i], psif, mul_tol); /// was vtol - /// Generalized A*X+Y for vectors of functions ---- a[i] = alpha*a[i] + - // 1*Kf+occ[i]*psif - gaxpy(world, double(1.0), Kf, double(1.0), psif); - } - truncate(world, Kf, tol); - return Kf; -} -// sum_i |i> for each p - -X_space TDDFT::compute_gamma_full(World& world, - X_space& Chi, - const XCOperator &xc) { - size_t m = Chi.num_states(); - size_t n = Chi.num_orbitals(); - // copy old pmap - std::shared_ptr>> oldpmap = - FunctionDefaults<3>::get_pmap(); - - X_space Chi_copy = Chi; - vecfuncT phi0_copy = ground_orbitals; - truncate(world, phi0_copy); - Chi_copy.truncate(); - - orbital_load_balance(world, ground_orbitals, phi0_copy, Chi, Chi_copy); - - molresponse::start_timer(world); - X_space gamma(world, m, n); - // x functions - // Two ways single vector or vector vector style - // here I create the orbital products for elctron interaction terms - vecfuncT phi_phi; - vecfuncT x_phi; - vecfuncT y_phi; - functionT temp_J; - - X_space J(world, m, n); - X_space JX(world, m, n); - X_space JY(world, m, n); - X_space W(world, m, n); - X_space KX(world, m, n); - X_space KY(world, m, n); - molresponse::end_timer(world, "Create Zero functions for Gamma calc"); - - // apply the exchange kernel to rho if necessary - molresponse::start_timer(world); - // Create Coulomb potential on ground_orbitals - functionT rho_x_b; - functionT rho_y_b; - - for (size_t b = 0; b < m; b++) { - rho_x_b = dot(world, Chi_copy.X[b], phi0_copy); - rho_y_b = dot(world, Chi_copy.Y[b], phi0_copy); - rho_x_b.truncate(); - rho_y_b.truncate(); - rho_x_b = apply(*coulop, rho_x_b); - rho_y_b = apply(*coulop, rho_y_b); - rho_x_b.truncate(); - rho_y_b.truncate(); - JX.X[b] = JX.Y[b] = mul(world, rho_x_b, phi0_copy); - JY.X[b] = JY.Y[b] = mul(world, rho_y_b, phi0_copy); - } - - J = JX + JY; - molresponse::end_timer(world, "J[omega] phi:"); - - // Create Coulomb potential on ground_orbitals - if (xcf.hf_exchange_coefficient() != 1.0) { - molresponse::start_timer(world); - std::vector Wphi; - for (size_t b = 0; b < m; b++) { - Wphi.push_back(xc.apply_xc_kernel(rho_omega[b])); - W.X[b] = mul(world, Wphi[b], phi0_copy); - } - W.Y = W.X.copy(); - molresponse::end_timer(world, "XC[omega] phi:"); - } - - molresponse::start_timer(world); - for (size_t b = 0; b < m; b++) { - vecfuncT x, y; - x = Chi_copy.X[b]; - y = Chi_copy.Y[b]; - // |x> - KX.X[b] = K(x, phi0_copy, phi0_copy); - KY.X[b] = K(phi0_copy, y, phi0_copy); - // |y> - KY.Y[b] = K(y, phi0_copy, phi0_copy); - KX.Y[b] = K(phi0_copy, x, phi0_copy); - // |i> - } - molresponse::end_timer(world, "K[omega] phi:"); - J.truncate(); - KX.truncate(); - KY.truncate(); - W.truncate(); - // for each response state we compute the Gamma response functions - // trucate all response functions - - // update gamma functions - molresponse::start_timer(world); - gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; - molresponse::end_timer(world, "Add Gamma parts J-K+W :"); - - // project out ground state - molresponse::start_timer(world); - QProjector projector(world, phi0_copy); - for (size_t i = 0; i < m; i++) { - gamma.X[i] = projector(gamma.X[i]); - gamma.Y[i] = projector(gamma.Y[i]); - } - - molresponse::end_timer(world, "Project Gamma:"); - - if (r_params.print_level() >= 10) { - molresponse::start_timer(world); - print("inner "); - print(inner(Chi_copy, JX)); - print("inner "); - print(inner(Chi_copy, JY)); - print("inner "); - print(inner(Chi_copy, J)); - print("inner "); - print(inner(Chi_copy, KX)); - print("inner "); - print(inner(Chi_copy, KY)); - print("inner "); - X_space K = KX + KY; - print(inner(Chi_copy, K)); - print("inner "); - print(inner(Chi_copy, W)); - print("inner "); - print(inner(Chi_copy, gamma)); - - molresponse::end_timer(world, "Print Expectation Creating Gamma:"); - } - // put it all together - // no 2-electron - // End timer - - molresponse::start_timer(world); - J.clear(); - KX.clear(); - KY.clear(); - W.clear(); - Chi_copy.clear(); - - if (world.size() > 1) { - FunctionDefaults<3>::set_pmap(oldpmap); // ! DON'T FORGET ! - } - molresponse::end_timer(world, "Clear functions and set old pmap"); - // Done - world.gop.fence(); - return gamma; - // Get sizes -} - -X_space TDDFT::compute_gamma_static(World& world, - X_space& Chi, - XCOperator xc) { - size_t m = r_params.num_states(); - size_t n = r_params.num_orbitals(); - // shallow copy - std::shared_ptr>> oldpmap = - FunctionDefaults<3>::get_pmap(); - - X_space Chi_copy = Chi; - vecfuncT phi0_copy = ground_orbitals; - - orbital_load_balance(world, ground_orbitals, phi0_copy, Chi, Chi_copy); - - molresponse::start_timer(world); - X_space gamma(world, m, n); - // x functions - // here I create the orbital products for elctron interaction terms - vecfuncT phi_phi; - vecfuncT x_phi; - functionT temp_J; - - X_space W(world, m, n); - X_space J(world, m, n); - X_space KX(world, m, n); - X_space KY(world, m, n); - molresponse::end_timer(world, "Create Zero functions for Gamma calc"); - - // apply the exchange kernel to rho if necessary - molresponse::start_timer(world); - // Create Coulomb potential on ground_orbitals - for (size_t b = 0; b < m; b++) { - temp_J = apply(*coulop, rho_omega[b]); - temp_J.truncate(); - J.X[b] = mul(world, temp_J, phi0_copy); - } - - molresponse::end_timer(world, "J[omega] phi:"); - - // Create Coulomb potential on ground_orbitals - if (xcf.hf_exchange_coefficient() != 1.0) { - molresponse::start_timer(world); - std::vector Wphi; - for (size_t b = 0; b < m; b++) { - Wphi.push_back(xc.apply_xc_kernel(rho_omega[b])); - W.X[b] = mul(world, Wphi[b], phi0_copy); - } - molresponse::end_timer(world, "XC[omega] phi:"); - } - - molresponse::start_timer(world); - - for (size_t b = 0; b < m; b++) { - vecfuncT x, y; - x = Chi_copy.X[b]; - y = Chi_copy.Y[b]; - // |x> - KX.X[b] = K(x, phi0_copy, phi0_copy); - // |i> - KY.X[b] = K(phi0_copy, y, phi0_copy); - // |y> - } - - molresponse::end_timer(world, "K[omega] phi:"); - // for each response state we compute the Gamma response functions - // trucate all response functions - J.truncate(); - KX.truncate(); - KY.truncate(); - W.truncate(); - - molresponse::start_timer(world); - // update gamma functions - gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; - molresponse::end_timer(world, "Add Gamma parts J-K+W :"); - - // project out ground state - molresponse::start_timer(world); - QProjector projector(world, phi0_copy); - for (size_t i = 0; i < m; i++) { - gamma.X[i] = projector(gamma.X[i]); - } - molresponse::end_timer(world, "Project Gamma:"); - - molresponse::start_timer(world); - - J.clear(); - KX.clear(); - KY.clear(); - W.clear(); - Chi_copy.clear(); - - if (world.size() > 1) { - FunctionDefaults<3>::set_pmap(oldpmap); // ! DON'T FORGET ! - } - - molresponse::end_timer(world, "Clear functions and set old pmap"); - // Done - world.gop.fence(); - return gamma; - // Get sizes -} - -X_space TDDFT::compute_gamma_tda(World& world, - X_space& Chi, - XCOperator xc) { - size_t m = Chi.num_states(); - size_t n = Chi.num_orbitals(); - - std::shared_ptr>> oldpmap = - FunctionDefaults<3>::get_pmap(); - - X_space Chi_copy = Chi; - vecfuncT phi0_copy = ground_orbitals; - - orbital_load_balance(world, ground_orbitals, phi0_copy, Chi, Chi_copy); - - molresponse::start_timer(world); - X_space gamma(world, m, n); - // x functions - - vector_real_function_3d phi_phi; - real_function_3d temp_J; - - response_space J(world, m, n); - response_space k1_x(world, m, n); - response_space W(world, m, n); - molresponse::end_timer(world, "Create Zero functions for Gamma calc"); - - molresponse::start_timer(world); - // Create Coulomb potential on ground_orbitals - for (size_t b = 0; b < m; b++) { - temp_J = apply(*coulop, rho_omega[b]); - temp_J.truncate(); - J[b] = mul(world, temp_J, phi0_copy); - } - molresponse::end_timer(world, "J[omega] phi:"); - - // Create Coulomb potential on ground_orbitals - if (xcf.hf_exchange_coefficient() != 1.0) { - molresponse::start_timer(world); - std::vector XC_phi; - for (size_t b = 0; b < m; b++) { - XC_phi.push_back(xc.apply_xc_kernel(rho_omega[b])); - W[b] = mul(world, XC_phi[b], phi0_copy); - } - molresponse::end_timer(world, "XC[omega] phi:"); - } - - molresponse::start_timer(world); - - for (size_t b = 0; b < m; b++) { - vecfuncT x; - x = Chi_copy.X[b]; - k1_x[b] = K(x, phi0_copy, phi0_copy); - } - - molresponse::end_timer(world, "K[omega] phi:"); - - k1_x.truncate_rf(); - J.truncate_rf(); - W.truncate_rf(); - - if (r_params.print_level() >= 2) { - molresponse::start_timer(world); - print("-------------------------Gamma Functions ------------------"); - print("2-Electron Potential for Iteration of x"); - PrintResponseVectorNorms(world, J * 2, "J"); - PrintResponseVectorNorms(world, k1_x, "k1_x"); - molresponse::end_timer(world, "Print Response Vector Norms:"); - } - - molresponse::start_timer(world); - QProjector projector(world, ground_orbitals); - gamma.X = (J * 2) - k1_x * xcf.hf_exchange_coefficient() + W; - molresponse::end_timer(world, "Add Gamma parts J-K+W :"); - - molresponse::start_timer(world); - for (size_t i = 0; i < m; i++) { - gamma.X[i] = projector(gamma.X[i]); - truncate(world, gamma.X[i]); - } - molresponse::end_timer(world, "Project Gamma:"); - - if (r_params.print_level() >= 2) { - print("------------------------ Gamma Functions Norms ------------------"); - print("Gamma X norms"); - print(gamma.X.norm2()); - } - - if (r_params.print_level() >= 2) { - print(""); - PrintRFExpectation(world, Chi_copy.X, gamma.X, "x", "Gamma)"); - } - - molresponse::start_timer(world); - - J.clear(); - k1_x.clear(); - W.clear(); - Chi_copy.clear(); - - if (world.size() > 1) { - FunctionDefaults<3>::set_pmap(oldpmap); // ! DON'T FORGET ! - } - - molresponse::end_timer(world, "Clear functions and set old pmap"); - // Done - world.gop.fence(); - return gamma; -} - -// Returns the ground state potential applied to functions f -// (V0 f) V0=(Vnuc+J0-K0+W0) -// J0=J[ground_density] -// K0=K[ground_density]f -// EXC0=W[ground_density] -X_space TDDFT::compute_V0X(World& world, - X_space& Chi, - XCOperator xc, - bool compute_Y) { - // Start a timer - - size_t m = Chi.num_states(); - size_t n = Chi.num_orbitals(); - - X_space V0 = X_space(world, m, n); - X_space K0 = X_space(world, m, n); - - X_space Chi_copy = Chi; - vecfuncT phi0_copy = ground_orbitals; - Chi_copy.truncate(); - truncate(world, phi0_copy); - // v_nuc first - real_function_3d v_nuc, v_j0, v_k0, v_xc; - - molresponse::start_timer(world); - if (not r_params.store_potential()) { - v_nuc = potential_manager->vnuclear(); - v_nuc.truncate(); - } else { // Already pre-computed - v_nuc = stored_v_nuc; - } - molresponse::end_timer(world, "Nuclear energy"); - // Coulomb Potential J0*f - molresponse::start_timer(world); - if (not r_params.store_potential()) { - // "a" is the core type - // scale rho by 2 TODO - // J^0 x^alpha - v_j0 = apply(*coulop, rho0); - v_j0.scale(2.0); - } else { // Already pre-computed - v_j0 = stored_v_coul; - } - molresponse::end_timer(world, "Coulomb Potential J[ground_density]"); - - if (xcf.hf_exchange_coefficient() != 1.0) { - v_xc = xc.make_xc_potential(); - } else { - // make a zero function - v_xc = Function( - FunctionFactory(world).fence(false).initial_level(1)); - } - - // Intermediaries - - molresponse::start_timer(world); - - // If including any exact HF exchange - if (xcf.hf_exchange_coefficient()) { - for (size_t b = 0; b < m; b++) { - K0.X[b] = K(phi0_copy, phi0_copy, Chi_copy.X[b]); - if (compute_Y) { - K0.Y[b] = K(phi0_copy, phi0_copy, Chi_copy.Y[b]); - } - } - } - if (r_params.print_level() >= 10) { - print("inner "); - print(inner(Chi_copy, K0)); - } - molresponse::end_timer(world, "K[ground_density]"); - // Vnuc+V0+VXC - molresponse::start_timer(world); - real_function_3d v0 = v_j0 + v_nuc + v_xc; - - V0.X = v0 * Chi.X; - V0.X += (-1 * K0.X * xcf.hf_exchange_coefficient()); - - if (compute_Y) { - V0.Y = v0 * Chi.Y; - V0.Y += (-1 * K0.Y * xcf.hf_exchange_coefficient()); - } - if (r_params.print_level() >= 3) { - print("inner "); - print(inner(Chi_copy, V0)); - } - molresponse::end_timer(world, "V0X"); - - // Basic output - - // Done - return V0; -} -// kinetic energy operator on response vector -response_space T(World& world, response_space& f) { - response_space T; // Fock = (T + V) * orbitals - real_derivative_3d Dx(world, 0); - real_derivative_3d Dy(world, 1); - real_derivative_3d Dz(world, 2); - // Apply derivatives to orbitals - f.reconstruct_rf(); - response_space dvx = apply(world, Dx, f); - response_space dvy = apply(world, Dy, f); - response_space dvz = apply(world, Dz, f); - // Apply again for 2nd derivatives - response_space dvx2 = apply(world, Dx, dvx); - response_space dvy2 = apply(world, Dy, dvy); - response_space dvz2 = apply(world, Dz, dvz); - T = (dvx2 + dvy2 + dvz2) * (-0.5); - return T; -} -// Returns the ground state fock operator applied to functions f -X_space TDDFT::compute_F0X(World& world, - X_space& Chi, - XCOperator xc, - bool compute_Y) { - // Debugging output - - molresponse::start_timer(world); - size_t m = Chi.num_states(); - size_t n = Chi.num_orbitals(); - - X_space chi_copy = Chi.copy(); - // chi_copy.truncate(); - X_space F0X = X_space(world, m, n); - X_space T0X = X_space(world, m, n); - T0X.X = T(world, chi_copy.X); - if (compute_Y) { - T0X.Y = T(world, chi_copy.Y); - } - if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, T0X)); - } - - X_space V0X = compute_V0X(world, chi_copy, xc, compute_Y); - if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, V0X)); - } - - F0X = T0X + V0X; - - if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, F0X)); - } - - molresponse::end_timer(world, "F0X:"); - // Done - return F0X; -} - -#pragma clang diagnostic pop \ No newline at end of file diff --git a/src/apps/molresponse/load_balance.h b/src/apps/molresponse/load_balance.h deleted file mode 100644 index bb90c11ea9b..00000000000 --- a/src/apps/molresponse/load_balance.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef SRC_APPS_molresponse_LOAD_BALANCE_H -#define SRC_APPS_molresponse_LOAD_BALANCE_H -#include "TDDFT.h" - -#endif diff --git a/src/apps/molresponse/timer.cc b/src/apps/molresponse/timer.cc index c3ff13c439d..70d5e84cb1a 100644 --- a/src/apps/molresponse/timer.cc +++ b/src/apps/molresponse/timer.cc @@ -5,37 +5,36 @@ #include -#include "TDDFT.h" #include "madness/mra/mra.h" // Needed for timers namespace molresponse { - double pop(std::vector& v) { + double pop(std::vector &v) { double x = v.back(); v.pop_back(); return x; } // Pulled from SCF.cc, starts a timer - void start_timer(World& world) { + void start_timer(madness::World &world) { world.gop.fence(); - ttt.push_back(wall_time()); - sss.push_back(cpu_time()); + ttt.push_back(madness::wall_time()); + sss.push_back(madness::cpu_time()); } // Stops a timer - void end_timer(World& world, const char* msg) { + void end_timer(madness::World &world, const char *msg) { world.gop.fence(); - MADNESS_CHECK(ttt.size() > 0); + MADNESS_CHECK(!ttt.empty()); - double wall = wall_time() - pop(ttt); - double cpu = cpu_time() - pop(sss); + double wall = madness::wall_time() - pop(ttt); + double cpu = madness::cpu_time() - pop(sss); if (world.rank() == 0) printf(" timer: %20.20s %8.2fs %8.2fs\n", msg, cpu, wall); } - void end_timer(World& world, const char* msg, const std::string& key, - std::map>& time) { + void end_timer(madness::World &world, const char *msg, const std::string &key, + std::map> &time) { world.gop.fence(); - double wall = wall_time() - pop(ttt); - double cpu = cpu_time() - pop(sss); + double wall = madness::wall_time() - pop(ttt); + double cpu = madness::cpu_time() - pop(sss); std::pair timings; // first is wall diff --git a/src/apps/molresponse/timer.h b/src/apps/molresponse/timer.h index 1116aa99146..cf377ce57ec 100644 --- a/src/apps/molresponse/timer.h +++ b/src/apps/molresponse/timer.h @@ -4,19 +4,18 @@ #include -#include "TDDFT.h" #include "madness/mra/mra.h" // Needed for timers namespace molresponse { double pop(std::vector& v); // Pulled from SCF.cc, starts a timer static std::vector ttt, sss; -void start_timer(World& world); +void start_timer(madness::World& world); // Stops a timer -void end_timer(World& world, const char* msg); +void end_timer(madness::World& world, const char* msg); -void end_timer(World& world, const char* msg, const std::string& key, +void end_timer(madness::World& world, const char* msg, const std::string& key, std::map>& time); } // namespace molresponse From 8433eae88b0760b039d5ff7633b21adc9026d2b9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:27:37 -0400 Subject: [PATCH 0282/1312] using madness functors and functions --- src/apps/molresponse/global_functions.h | 3 +-- src/apps/molresponse/property.cc | 7 +++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 1291a2b611d..675c45ccac9 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -5,7 +5,6 @@ #include #include -#include "molresponse/density.h" #include "response_parameters.h" struct CalcParams { @@ -47,6 +46,6 @@ response_space T(World &world, response_space &f); vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); -static double rsquared(const coordT &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } +static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } /// Mask function to switch from 0 to 1 smoothly at boundary #endif// SRC_APPS_molresponse_GLOBAL_FUNCTIONS_H_ diff --git a/src/apps/molresponse/property.cc b/src/apps/molresponse/property.cc index cfc57a6d19b..4b02e9e96cf 100644 --- a/src/apps/molresponse/property.cc +++ b/src/apps/molresponse/property.cc @@ -1,7 +1,6 @@ #include "molresponse/property.h" #include -#include #include #include @@ -18,7 +17,7 @@ DipoleVector::DipoleVector(World &world) : PropertyBase() { for (size_t i = 0; i < 3; i++) { std::vector f(3, 0); f[i] = 1; - operator_vector.at(i) = real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(f))); + operator_vector.at(i) = real_factory_3d(world).functor(real_functor_3d(new MomentFunctor(f))); // prsize_t k L truncation print("norm of dipole function ", operator_vector[i].norm2()); } @@ -41,10 +40,10 @@ NuclearVector::NuclearVector(World &world, Molecule &molecule) : PropertyBase() for (size_t axis = 0; axis < 3; ++axis) { // question here....MolecularDerivativeFunctor takes derivative with // respect to axis atom and axis - FunctorT func(new MolecularDerivativeFunctor(molecule, atom, axis)); + functorT func(new MolecularDerivativeFunctor(molecule, atom, axis)); // here we save operator_vector.at(atom * 3 + axis) = - FunctionT(FactoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); + functionT (factoryT (world).functor(func).nofence().truncate_on_project().truncate_mode(0)); // prsize_t k L truncation print("norm of derivative function ", operator_vector[atom * 3 + axis].norm2()); } From 028ade58a071e5b0d5bc261266ec6c38141b3e89 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:28:08 -0400 Subject: [PATCH 0283/1312] we now shallow copy x_space --- src/apps/molresponse/x_space.cc | 41 +++++----- src/apps/molresponse/x_space.h | 128 ++++++++++++++++++-------------- 2 files changed, 92 insertions(+), 77 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 0b29c130131..a78764010a4 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -6,17 +6,18 @@ #include "response_functions.h" namespace madness { - auto to_response_matrix(const X_space& x) -> response_matrix { - World& world = x.X[0][0].world(); + auto to_response_matrix(const X_space &x) -> response_matrix { auto mX = response_matrix(x.num_states()); int b = 0; - for (auto& mi: mX) { - mi = copy(world, x.X[b]); - std::for_each(x.Y[b].begin(), x.Y[b].end(), - [&](const auto& yi) { mi.push_back(copy(yi)); }); + auto num_orbitals = x.num_orbitals(); + std::for_each(mX.begin(), mX.end(), [&](auto &mi) { + //auto norm_vi = norm2(world, x_vec); + mi = vector_real_function_3d(2 * num_orbitals); + //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } + std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); + std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals); b++; - } - world.gop.fence(); + }); return mX; } @@ -25,24 +26,24 @@ namespace madness { * @param x * @return */ - auto to_flattened_vector(const X_space& x) -> vector_real_function_3d { + auto to_flattened_vector(const X_space &x) -> vector_real_function_3d { - World& world = x.X[0][0].world(); + World &world = x.X[0][0].world(); auto num_orbitals = 2 * x.num_orbitals(); - auto vij = vector_real_function_3d(x.num_states()*num_orbitals); + auto vij = vector_real_function_3d(x.num_states() * num_orbitals); auto mx = to_response_matrix(x); int b = 0; - for (auto& mi: mx) { + for (auto &mi: mx) { std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); b++; } return vij; } - auto to_X_space(const response_matrix& x) -> X_space { + auto to_X_space(const response_matrix &x) -> X_space { - World& world = x[0][0].world(); + World &world = x[0][0].world(); auto num_states = x.size(); auto num_orbitals = size_t(x[0].size() / 2); @@ -64,20 +65,20 @@ namespace madness { return x_space; } - auto transposeResponseMatrix(const response_matrix& x) -> response_matrix { + auto transposeResponseMatrix(const response_matrix &x) -> response_matrix { auto XT = response_matrix(x[0].size()); auto b = 0; - for (auto& xi: XT) { + for (auto &xi: XT) { auto j = 0; xi = vector_real_function_3d(x.size()); - for (auto& xji: xi) { xji = copy(x[j++][b]); } + for (auto &xji: xi) { xji = x[j++][b]; } b++; } return XT; } - auto inner(const X_space& A, const X_space& B) -> Tensor { + auto inner(const X_space &A, const X_space &B) -> Tensor { MADNESS_ASSERT(size_states(A) > 0); MADNESS_ASSERT(size_orbitals(A) > 0); MADNESS_ASSERT(same_size(A, B)); @@ -87,7 +88,7 @@ namespace madness { auto a = to_response_matrix(A); auto b = to_response_matrix(B); - World& world = a[0][0].world(); + World &world = a[0][0].world(); auto a_transpose = transposeResponseMatrix(a); auto b_transpose = transposeResponseMatrix(b); @@ -100,7 +101,7 @@ namespace madness { // Container for result Tensor result(a.size(), a.size()); int p = 0; - std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto& ati) { + std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) { result += matrix_inner(world, ati, b_transpose[p++]); }); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index ea0687cf155..0bae7a2c10f 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -15,9 +15,9 @@ namespace madness { struct X_space; - auto to_response_matrix(const X_space& x) -> response_matrix; - auto to_flattened_vector(const X_space& x) -> vector_real_function_3d; - auto to_X_space(const response_matrix& x) -> X_space; + auto to_response_matrix(const X_space &x) -> response_matrix; + auto to_flattened_vector(const X_space &x) -> vector_real_function_3d; + auto to_X_space(const response_matrix &x) -> X_space; struct X_space { private: size_t n_states; // Num. of resp. states @@ -32,7 +32,7 @@ namespace madness { // default constructor X_space() : n_states(0), n_orbitals(0), X(), Y() {} // Copy constructor - X_space(const X_space& A) + X_space(const X_space &A) : n_states(size_states(A)), n_orbitals(size_orbitals(A)), X(A.X), @@ -49,7 +49,7 @@ namespace madness { /// Works in either basis. Different distributions imply /// asynchronous communication and the optional fence is /// collective. - auto copy(const std::shared_ptr>>& pmap, + auto copy(const std::shared_ptr>> &pmap, bool fence = false) const -> X_space { X_space copyX(X[0][0].world(), n_states, n_orbitals); copyX.X = X.copy(pmap, fence); @@ -57,23 +57,24 @@ namespace madness { return copyX; } // assignment - auto operator=(const X_space& B) -> X_space& { + auto operator=(const X_space &B) -> X_space & { if (this != &B) {// is it the same object? this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - this->X = B.X.copy(); - this->Y = B.Y.copy(); + + this->X = B.X; + this->Y = B.Y; } return *this;// NO SHALLOW COPIES } // Zero Constructor - X_space(World& world, size_t n_states, size_t n_orbitals) + X_space(World &world, size_t n_states, size_t n_orbitals) : n_states(n_states), n_orbitals(n_orbitals), X(world, n_states, n_orbitals), Y(world, n_states, n_orbitals) {} // explicit constructor from 2 resonse_space - explicit X_space(response_space& X, response_space& Y) { + explicit X_space(response_space &X, response_space &Y) { MADNESS_ASSERT(X.size() == Y.size()); MADNESS_ASSERT(X[0].size() == Y[0].size()); this->n_states = X.size(); @@ -85,22 +86,24 @@ namespace madness { X.clear(); Y.clear(); } - auto operator+(const X_space& B) -> X_space { + auto operator+(const X_space &B) -> X_space { MADNESS_ASSERT(same_size(*this, B)); - World& world = this->X[0][0].world(); + World &world = this->X[0][0].world(); auto ax = to_response_matrix(*this); + world.gop.fence(); auto bx = to_response_matrix(B); + world.gop.fence(); response_matrix add_x(num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](auto a, auto b) { return add(world, a, b); }); + [&](const auto &a, const auto &b) { return add(world, a, b); }); return to_X_space(add_x); } - auto operator+=(const X_space& B) -> X_space& { + auto operator+=(const X_space &B) -> X_space & { MADNESS_ASSERT(same_size(*this, B)); this->X += B.X; this->Y += B.Y; @@ -130,10 +133,22 @@ namespace madness { if (n_states == 0) { n_orbitals = 0; } } - friend auto operator+(const X_space& A, const X_space& B) -> X_space { + static X_space zero_functions(World &world, size_t n_states, size_t n_orbitals) { + auto zeros = X_space(world, n_states, n_orbitals); + + for (auto &xi: zeros.X) { + xi = ::madness::zero_functions(world, n_orbitals, true); + } + for (auto &yi: zeros.Y) { + yi = ::madness::zero_functions(world, n_orbitals, true); + } + return zeros; + } + + friend auto operator+(const X_space &A, const X_space &B) -> X_space { MADNESS_ASSERT(same_size(A, B)); - World& world = A.X[0][0].world(); + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions auto ax = to_response_matrix(A); @@ -153,17 +168,17 @@ namespace madness { X_space operator-(const X_space B) { MADNESS_ASSERT(same_size(*this, B)); - World& world = this->X[0][0].world(); + World &world = this->X[0][0].world(); X_space result(world, n_states, n_orbitals); result.X = X - B.X; result.Y = Y - B.Y; return result; } - friend X_space operator-(const X_space& A, const X_space& B) { + friend X_space operator-(const X_space &A, const X_space &B) { MADNESS_ASSERT(same_size(A, B)); - World& world = A.X[0][0].world(); + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions result.X = A.X - B.X; @@ -171,38 +186,38 @@ namespace madness { return result; } - friend X_space operator*(const X_space& A, const double& b) { - World& world = A.X[0][0].world(); + friend X_space operator*(const X_space &A, const double &b) { + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions result.X = A.X * b; result.Y = A.Y * b; return result; } - friend X_space operator*(const double& b, const X_space& A) { - World& world = A.X[0][0].world(); + friend X_space operator*(const double &b, const X_space &A) { + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions result.X = A.X * b; result.Y = A.Y * b; return result; } - X_space operator*(const double& b) { + X_space operator*(const double &b) { this->X *= b; this->Y *= b; return *this; } - friend X_space operator*(const X_space& A, const Function& f) { - World& world = A.X[0][0].world(); + friend X_space operator*(const X_space &A, const Function &f) { + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions result.X = A.X * f; result.Y = A.Y * f; return result; } - friend auto operator*(const Function& f, const X_space& A) -> X_space { - World& world = A.X[0][0].world(); + friend auto operator*(const Function &f, const X_space &A) -> X_space { + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions result.X = A.X * f; @@ -210,11 +225,11 @@ namespace madness { return result; } - friend auto operator*(const X_space& A, const Tensor& b) -> X_space { + friend auto operator*(const X_space &A, const Tensor &b) -> X_space { MADNESS_ASSERT(size_states(A) > 0); MADNESS_ASSERT(size_orbitals(A) > 0); - World& world = A.X[0][0].world(); + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals); result.X = A.X * b; result.Y = A.Y * b; @@ -227,7 +242,7 @@ namespace madness { * @param B * @return */ - friend auto inner(const X_space& A, const X_space& B) -> Tensor; + friend auto inner(const X_space &A, const X_space &B) -> Tensor; void truncate() { X.truncate_rf(); @@ -235,28 +250,28 @@ namespace madness { } auto norm2s() -> Tensor { - World& world = X[0][0].world(); + World &world = X[0][0].world(); Tensor norms(num_states()); for (size_t b = 0; b < num_states(); b++) { auto xb = madness::copy(world, X[b]); - for (auto& yb: Y[b]) { xb.push_back(madness::copy(yb, true)); } + for (auto &yb: Y[b]) { xb.push_back(madness::copy(yb, true)); } norms[b] = sqrt(inner(xb, xb)); } return norms; } auto component_norm2s() const -> Tensor { - World& world = X[0][0].world(); + World &world = X[0][0].world(); auto rx = to_flattened_vector(*this); auto norms = norm2s_T(world, rx); return norms.reshape(n_states, 2 * n_orbitals); } - friend auto size_states(const X_space& x) -> size_t { return x.n_states; } - friend auto size_orbitals(const X_space& x) -> size_t { return x.n_orbitals; } - friend auto same_size(const X_space& A, const X_space& B) -> bool { + friend auto size_states(const X_space &x) -> size_t { return x.n_states; } + friend auto size_orbitals(const X_space &x) -> size_t { return x.n_orbitals; } + friend auto same_size(const X_space &A, const X_space &B) -> bool { return ((size_states(A) == size_states(B) && size_orbitals(A) == size_orbitals(B))); } }; @@ -265,23 +280,25 @@ namespace madness { // the world object. struct X_vector : public X_space { - X_vector(World& world, size_t n_orbtials) : X_space(world, size_t(1), n_orbtials) {} + X_vector(World &world, size_t n_orbtials) { + this->X_space::zero_functions(world, size_t(1), n_orbtials); + } X_vector(X_space A, size_t b) : X_space(A.X[0][0].world(), size_t(1), A.num_orbitals()) { X[0] = A.X[b]; Y[0] = A.Y[b]; } - friend X_vector operator-(const X_vector& A, const X_vector& B) { + friend X_vector operator-(const X_vector &A, const X_vector &B) { MADNESS_ASSERT(same_size(A, B)); - World& world = A.X[0][0].world(); + World &world = A.X[0][0].world(); X_vector result(world, size_orbitals(A));// create zero_functions result.X = A.X - B.X; result.Y = A.Y - B.Y; return result; } - friend X_vector operator*(const X_vector& A, const double& c) { - World& world = A.X[0][0].world(); + friend X_vector operator*(const X_vector &A, const double &c) { + World &world = A.X[0][0].world(); X_vector result(world, size_orbitals(A));// create zero_functions result.X = A.X * c; result.Y = A.Y * c; @@ -293,7 +310,7 @@ namespace madness { copyX.Y = Y.copy(); return copyX; } - auto operator+=(const X_vector& B) -> X_vector& { + auto operator+=(const X_vector &B) -> X_vector & { MADNESS_ASSERT(same_size(*this, B)); @@ -302,7 +319,7 @@ namespace madness { return *this; } - inline friend auto inner(X_vector& A, X_vector& B) -> double { + inline friend auto inner(X_vector &A, X_vector &B) -> double { MADNESS_ASSERT(size_states(A) == 1); MADNESS_ASSERT(size_orbitals(A) > 0); MADNESS_ASSERT(same_size(A, B)); @@ -311,7 +328,7 @@ namespace madness { Tensor G1(1, 1); Tensor G2(1, 1); - World& world = A.X[0][0].world(); + World &world = A.X[0][0].world(); auto ax = madness::copy(world, A.X[0]); auto ay = madness::copy(world, A.Y[0]); @@ -319,8 +336,8 @@ namespace madness { auto bx = madness::copy(world, B.X[0]); auto by = madness::copy(world, B.Y[0]); - for (auto& ayi: ay) { ax.push_back(madness::copy(ayi)); } - for (auto& byi: by) { bx.push_back(madness::copy(byi)); }; + for (auto &ayi: ay) { ax.push_back(madness::copy(ayi)); } + for (auto &byi: by) { bx.push_back(madness::copy(byi)); }; double result = inner(ax, bx); @@ -328,25 +345,22 @@ namespace madness { } }; // function object with allocator()() - struct X_space_allocator { - World& world; - const size_t n_states; + struct response_matrix_allocator { + World &world; const size_t n_orbtials; - X_space_allocator(World& world, size_t n_orbtials) + response_matrix_allocator(World &world, size_t n_orbtials) : world(world), - n_states(size_t(1)), n_orbtials(n_orbtials) {} // overloading the default constructor () operator - X_vector operator()() { + vector_real_function_3d operator()() { print("allocator called with ", int(n_orbtials), " orbitals"); - // returning constructor of x_vector - return X_vector(world, n_orbtials); + return zero_functions(world, n_orbtials); } // Copy constructor - X_space_allocator operator=(const X_space_allocator& other) { - return X_space_allocator(world, other.n_orbtials); + response_matrix_allocator operator=(const response_matrix_allocator &other) { + return response_matrix_allocator(world, other.n_orbtials); } }; }// namespace madness From b06a757112e7795b60b7d471ae91b1c8a9e27cde Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:28:27 -0400 Subject: [PATCH 0284/1312] remove tddft --- src/apps/molresponse/testing/runners.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 437f966f58f..c27e0c1f256 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -8,7 +8,6 @@ #include "ExcitedResponse.hpp" #include "FrequencyResponse.hpp" #include "ResponseExceptions.hpp" -#include "TDDFT.h" #include "madness/chem/SCF.h" #include "madness/tensor/tensor_json.hpp" #include "madness/world/worldmem.h" From 94417ce0a9a6950735f2937e17cc205da8dca1de Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:28:56 -0400 Subject: [PATCH 0285/1312] kain now uses a vector of vectors instead of X_vectors --- src/apps/molresponse/ExcitedResponse.cpp | 113 +++++++++++++-------- src/apps/molresponse/ExcitedResponse.hpp | 2 +- src/apps/molresponse/FrequencyResponse.cpp | 28 ++--- src/apps/molresponse/FrequencyResponse.hpp | 4 +- src/apps/molresponse/ResponseBase.cpp | 80 +++++++++------ src/apps/molresponse/ResponseBase.hpp | 8 +- src/apps/molresponse/response_functions.h | 31 +++--- 7 files changed, 157 insertions(+), 109 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index d5f75db9345..b1870ddb1ad 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -93,12 +93,40 @@ void ExcitedResponse::initialize(World &world) { trial.clear(); // Initial guess for y are zero functions } +/// an N-dimensional real-valued Gaussian function + +/// the function looks like +/// \[ +/// f(r) = x^i y^j .. z^k exp(-alpha r^2) +/// \] +template +class GaussianGuess : public FunctionFunctorInterface { + typedef Vector coordT; + +public: + /// ctor + + /// @param[in] origin the origin of the Gauss function + /// @param[in] alpha the exponent exp(-alpha r^2) + /// @param[in] ijk the monomial x^i y^j z^k exp(-alpha r^2) (for NDIM) + GaussianGuess(const coordT &origin, const double alpha, const std::vector ijk = std::vector(NDIM)) + : origin(origin), exponent(alpha), ijk(ijk) {} + + coordT origin; + double exponent; ///< exponent of the guess + std::vector ijk;///< cartesian exponents + + double operator()(const coordT &xyz) const { + double arg = 0.0, prefac = 1.0; + for (std::size_t i = 0; i < NDIM; ++i) { + arg += (xyz[i] - origin[i]) * (xyz[i] - origin[i]); + prefac *= pow(xyz[i], ijk[i]); + } + const double e = exponent * arg; + return prefac * exp(-e); + } +}; -// Creates random guess functions semi-intelligently(?) -/// & creates random guesses for nu -/// \param world -/// \param num_states -/// \return X_space ExcitedResponse::make_random_trial(World &world, size_t m) const { // Basic output if (world.rank() == 0) print(" Using a random guess for initial response functions.\n"); @@ -404,9 +432,9 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { Tensor x_shifts; // Holds the shifted energy values response_space bsh_resp(world, m, n); // Holds wave function corrections response_space V; // Holds V^0 applied to response functions - response_space shifted_V;// Holds the shifted V^0 applied to response functions - Tensor S; // Overlap matrix of response components for x states - real_function_3d v_xc; // For TDDFT + response_space shifted_V; // Holds the shifted V^0 applied to response functions + Tensor S; // Overlap matrix of response components for x states + real_function_3d v_xc; // For TDDFT // Useful to have response_space zeros(world, m, n); @@ -508,7 +536,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { } world.gop.fence(); - if ( r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "E0mDX", "E0mDX", iter_timing); } X_space theta_X = X_space(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); @@ -539,7 +567,6 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { for (auto &bsh_i: bsh_resp.x) { bsh_i = projector(bsh_i); - } // Save new components guesses.X = bsh_resp; @@ -1808,20 +1835,20 @@ void ExcitedResponse::iterate(World &world) { X_space old_Lambda_X(world, m, n); // vector of Xvectors - std::vector Xvector; - std::vector Xresidual; - for (size_t b = 0; b < m; b++) { - Xvector.emplace_back(Chi, b); - Xresidual.emplace_back(residuals, b); - } + response_matrix x_vectors; + response_matrix x_residuals; + x_vectors = to_response_matrix(Chi); + x_residuals = to_response_matrix(residuals); // If DFT, initialize the XCOperator - NonLinearXsolver kain_x_space; + response_solver kain_x_space; size_t nkain = m;// (r_params.omega() != 0.0) ? 2 * m : m; - for (size_t b = 0; b < nkain; b++) { - kain_x_space.push_back(XNonlinearSolver( - X_space_allocator(world, n), false)); - if (r_params.kain()) kain_x_space[b].set_maxsub(r_params.maxsub()); + for (size_t b = 0; b < m; b++) { + kain_x_space.push_back(XNonlinearSolver( + response_matrix_allocator(world, n), true)); + } + if (r_params.kain()) { + for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } response_space bsh_x_resp(world, m, n);// Holds wave function corrections @@ -1836,8 +1863,6 @@ void ExcitedResponse::iterate(World &world) { response_space x_differences(world, m, n); response_space y_differences(world, m, n); - response_space x_residuals(world, m, n); - response_space y_residuals(world, m, n); Tensor x_shifts;// Holds the shifted energy values Tensor y_shifts;// Holds the shifted energy values @@ -1957,7 +1982,7 @@ void ExcitedResponse::iterate(World &world) { // Followed by step restriction // residual is computed as new_chi-old_chi where both have been previously rotated. auto [new_omega, old_chi, new_chi, new_res] = update( - world, Chi, xc, projector, kain_x_space, Xvector, Xresidual, iter, max_rotation); + world, Chi, xc, projector, kain_x_space, x_vectors, x_residuals, iter, max_rotation); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -2062,10 +2087,10 @@ void ExcitedResponse::iterate(World &world) { } auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator &xc, - QProjector &projector, NonLinearXsolver &kain_x_space, - vector &Xvector, vector &Xresidual, size_t iter, + QProjector &projector, response_solver &kain_x_space, + response_matrix &Xvector, response_matrix &Xresidual, size_t iter, const double &maxrotn) --> std::tuple, X_space, X_space, residuals> { + -> std::tuple, X_space, X_space, residuals> { size_t m = Chi.num_states(); bool compute_y = not r_params.tda(); @@ -2250,11 +2275,11 @@ void ExcitedResponse::analysis(World &world, const X_space &chi) { // Need these to calculate dipole/quadrapole real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_functor_3d(new MomentFunctor(std::vector{1, 0, 0}))); real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_functor_3d(new MomentFunctor(std::vector{0, 1, 0}))); real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + real_functor_3d(new MomentFunctor(std::vector{0, 0, 1}))); // Calculate transition dipole moments for each response function Tensor dipoles(m, 3); @@ -2398,17 +2423,17 @@ void ExcitedResponse::save(World &world, const std::string &name) { // (for i from 0 to m-1 ) // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar & r_params.archive(); - ar & r_params.tda(); - ar & r_params.num_orbitals(); - ar & r_params.num_states(); - ar & omega; + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); + ar ω for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; } } @@ -2432,21 +2457,21 @@ void ExcitedResponse::load(World &world, const std::string &name) { // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar & r_params.archive(); - ar & r_params.tda(); - ar & r_params.num_orbitals(); - ar & r_params.num_states(); - ar & omega; + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); + ar ω Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; world.gop.fence(); if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; world.gop.fence(); } } diff --git a/src/apps/molresponse/ExcitedResponse.hpp b/src/apps/molresponse/ExcitedResponse.hpp index 769263eefd1..60c7294675a 100644 --- a/src/apps/molresponse/ExcitedResponse.hpp +++ b/src/apps/molresponse/ExcitedResponse.hpp @@ -133,7 +133,7 @@ class ExcitedResponse : public ResponseBase { World& world, X_space& chi, X_space& lchi, X_space& v_chi, X_space& gamma_chi); std::tuple, X_space, X_space, residuals> update( World& world, X_space& Chi, XCOperator& xc, QProjector& projector, - NonLinearXsolver& kain_x_space, vector& Xvector, vector& Xresidual, + response_solver &kain_x_space, response_matrix &Xvector, response_matrix &Xresidual, size_t iter, const double& maxrotn); X_space create_response_guess(World& world) const; std::tuple, Tensor, Tensor> reduce_subspace( diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index dbef82d1901..6be3e25826f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -35,20 +35,24 @@ void FrequencyResponse::iterate(World &world) { XCOperator xc = make_xc_operator(world); // create X space residuals - X_space residuals(world, m, n); + X_space residuals=X_space::zero_functions(world, m, n); - std::vector x_vectors; - std::vector x_residuals; + std::vector x_vectors; + std::vector x_residuals; + x_vectors= to_response_matrix(Chi); + x_residuals= to_response_matrix(residuals); + /* for (size_t b = 0; b < m; b++) { x_vectors.emplace_back(Chi, b); x_residuals.emplace_back(residuals, b); } + */ // create a std vector of XNONLinearsolvers - NonLinearXsolver kain_x_space; + response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - X_space_allocator(world, n), true)); + kain_x_space.push_back(XNonlinearSolver( + response_matrix_allocator(world, 2*n), true)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -264,8 +268,8 @@ void FrequencyResponse::iterate(World &world) { auto FrequencyResponse::update(World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, - double &x_shifts, double &omega_n, NonLinearXsolver &kain_x_space, - vector &Xvector, vector &Xresidual, + double &x_shifts, double &omega_n, response_solver &kain_x_space, + response_matrix &Xvector, response_matrix &Xresidual, size_t iteration, const double &maxrotn) -> std::tuple { @@ -455,9 +459,9 @@ auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { for (size_t atom = 0; atom < molecule.natom(); ++atom) { for (size_t axis = 0; axis < 3; ++axis) { - FunctorT func(new madchem::MolecularDerivativeFunctor(molecule, atom, axis)); - nuclear_vector.at(atom * 3 + axis) = FunctionT( - FactoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); + functorT func(new madchem::MolecularDerivativeFunctor(molecule, atom, axis)); + nuclear_vector.at(atom * 3 + axis) = functionT( + factoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); } } PQ.X = vector_to_PQ(world, nuclear_vector, calc.get_orbitals(), r_params.lo()); @@ -474,7 +478,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { std::vector f(3, 0); f[i++] = 1; - d = real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(f))); + d = real_factory_3d(world).functor(real_functor_3d(new MomentFunctor(f))); } //truncate(world, dipole_vectors, true); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals(), r_params.lo()); diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 41a53fff310..efd87eab91a 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -49,8 +49,8 @@ class FrequencyResponse : public ResponseBase { vector& bsh_x_ops, vector& bsh_y_ops, QProjector& projector, double& x_shifts, - double& omega_n, NonLinearXsolver& kain_x_space, - vector& Xvector, vector& Xresidual, + double& omega_n, response_solver &kain_x_space, + response_matrix &Xvector, response_matrix &Xresidual, size_t iteration, const double& maxrotn); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 530809ff392..5a98529e0a2 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -441,9 +441,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit response_space j_x(world, m, n); response_space j_y(world, m, n); - X_space W(world, m, n); - X_space KX(world, m, n); - X_space KY(world, m, n); + X_space W = X_space::zero_functions(world, m, n); + X_space KX = X_space::zero_functions(world, m, n); + X_space KY = X_space::zero_functions(world, m, n); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } @@ -547,18 +547,14 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); - if (world.rank() == 0) { - print_inner(world, "xJx", d_alpha, J); - print_inner(world, "xKXx", d_alpha, KX); - print_inner(world, "xKYx", d_alpha, KY); - } + print_inner(world, "xJx", d_alpha, J); + print_inner(world, "xKXx", d_alpha, KX); + print_inner(world, "xKYx", d_alpha, KY); X_space K = KX + KY; world.gop.fence(); - if (world.rank() == 0) { - print_inner(world, "xKx", d_alpha, KX); - print_inner(world, "xWx", d_alpha, W); - print_inner(world, "xGammax", d_alpha, gamma); - } + print_inner(world, "xKx", d_alpha, KX); + print_inner(world, "xWx", d_alpha, W); + print_inner(world, "xGammax", d_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); } // put @@ -632,10 +628,10 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm vecfuncT x_phi; functionT temp_J; - X_space W(world, num_states, num_orbitals); + X_space W = X_space::zero_functions(world, num_states, num_orbitals); X_space J(world, num_states, num_orbitals); - X_space KX(world, num_states, num_orbitals); - X_space KY(world, num_states, num_orbitals); + X_space KX = X_space::zero_functions(world, num_states, num_orbitals); + X_space KY = X_space::zero_functions(world, num_states, num_orbitals); // std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; // world.mpi.Barrier(); @@ -657,6 +653,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm }; std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); + J.Y = J.X.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); @@ -1166,14 +1163,20 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp } auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, - const X_space &residual_chi, NonLinearXsolver &kain_x_space, - std::vector &Xvector, - std::vector &Xresidual) + const X_space &residual_chi, response_solver &kain_x_space, + response_matrix &Xvector, + response_matrix &Xresidual) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); + + + Xvector = to_response_matrix(chi); + Xresidual = to_response_matrix(residual_chi); + + /* for (size_t b = 0; b < m; b++) { Xvector[b].X[0] = copy(world, chi.X[b]); @@ -1182,15 +1185,27 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, Xresidual[b].X[0] = copy(world, residual_chi.X[b]); Xresidual[b].Y[0] = copy(world, residual_chi.Y[b]); } + */ + response_matrix update(m); + for (auto &update_i: update) { + update_i = vector_real_function_3d(n); + } if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } + int b = 0; + std::transform(Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), [&](auto &xi, auto &ri) { + return kain_x_space[b++].update(xi, ri); + }); + + /* std::for_each(kain_x_space.begin(), kain_x_space.end(), [&](auto &ki) { auto kain_X = ki.update(Xvector[b], Xresidual[b]); - kain_update.X[b] = copy(world, kain_X.X[0]); - kain_update.Y[b] = copy(world, kain_X.Y[0]); + update[b] = copy(world, kain_X); b++; }); + */ + kain_update = to_X_space(update); /* for (size_t b = 0; b < m; b++) { @@ -1411,23 +1426,24 @@ void ResponseBase::solve(World &world) { bool first_protocol = true; for (const auto &iter_thresh: protocol) { // We set the protocol and function defaults here for the given threshold of - // protocol set_protocol(world, iter_thresh); - check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); - protocol_to_json(j_molresponse, iter_thresh); + // protocol if (first_protocol) { if (r_params.restart()) { if (world.rank() == 0) { print(" Restarting from file:", r_params.restart_file()); } load(world, r_params.restart_file()); - check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); first_protocol = false; } else { this->initialize(world); } + check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); first_protocol = false; + } else { + check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); } + protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... this->iterate(world); } @@ -1539,13 +1555,13 @@ auto solid_harmonics(World &world, int n) -> std::map, real_fun // Create the basic x, y, z, constant and zero real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_functor_3d(new MomentFunctor(std::vector{1, 0, 0}))); real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_functor_3d(new MomentFunctor(std::vector{0, 1, 0}))); real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + real_functor_3d(new MomentFunctor(std::vector{0, 0, 1}))); real_function_3d c = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); + real_functor_3d(new MomentFunctor(std::vector{0, 0, 0}))); real_function_3d zero = real_factory_3d(world); // Add in first few, since they're simple @@ -2026,11 +2042,11 @@ auto make_xyz_functions(World &world) -> vector_real_function_3d { // Create the basic x, y, z, constant and zero real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_functor_3d(new MomentFunctor(std::vector{1, 0, 0}))); real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_functor_3d(new MomentFunctor(std::vector{0, 1, 0}))); real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + real_functor_3d(new MomentFunctor(std::vector{0, 0, 1}))); std::vector funcs = {x, y, z}; return funcs; diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index adc8d9d83c2..8ebaa1a0ac5 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -10,8 +10,8 @@ #include #include +#include #include "global_functions.h" -#include "load_balance.h" #include "madness/mra/functypedefs.h" #include "madness/mra/mra.h" #include @@ -25,6 +25,8 @@ using namespace madness; using json=nlohmann::json; +typedef std::vector> response_solver; + class response_timing { std::map> wall_time_data; std::map> cpu_time_data; @@ -197,8 +199,8 @@ class ResponseBase { auto kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, - NonLinearXsolver &kain_x_space, vector &Xvector, - vector &Xresidual) -> X_space; + response_solver &kain_x_space, response_matrix &Xvector, + response_matrix &Xresidual) -> X_space; void x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, bool restrict_y, const double &maxrotn); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 914f1b7c4a5..f8e025faeb6 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -53,9 +53,9 @@ namespace madness { * @param y */ response_space(const response_space &y) - : num_states(y.size()), - num_orbitals(y.size_orbitals()), - x(y.x) {} + : num_states(y.size()), + num_orbitals(y.size_orbitals()), + x(y.x) {} // assignment // Copy assignment should copy the members of y and leave y Unchanged @@ -67,10 +67,10 @@ namespace madness { this->num_orbitals = y.size_orbitals(); this->x = y.x; if (x.size() != num_states) { x.resize(num_states); } - World &world = y[0][0].world(); + //World &world = y[0][0].world(); // print("perhaps this is the problem"); std::transform(y.x.begin(), y.x.end(), x.begin(), - [&](auto yi) { return madness::copy(world, yi); }); + [&](auto yi) { return yi; }); } return *this;// } @@ -87,11 +87,11 @@ namespace madness { * @param num_orbitals */ response_space(World &world, size_t num_states, size_t num_orbitals) - : num_states(num_states), - num_orbitals(num_orbitals), - x(response_matrix(num_states)) { + : num_states(num_states), + num_orbitals(num_orbitals), + x(response_matrix(num_states)) { for (auto &state: x) { - state = zero_functions(world, static_cast(num_orbitals), false); + state = vector_real_function_3d(num_orbitals); } world.gop.fence(); } @@ -102,9 +102,9 @@ namespace madness { * @param x */ explicit response_space(const response_matrix &x) - : num_states(x.size()), - num_orbitals(x[0].size()), - x(x) {} + : num_states(x.size()), + num_orbitals(x[0].size()), + x(x) {} // Determines if two ResponseFunctions are the same size friend bool same_size(const response_space &a, const response_space &b) { @@ -267,19 +267,20 @@ namespace madness { // Returns a deep copy response_space copy() const { - response_space result(x[0][0].world(), num_states, num_orbitals); World &world = x[0][0].world(); + response_space result(world, num_states, num_orbitals); + std::transform(x.begin(), x.end(), result.x.begin(), - [&world](auto xi) { return madness::copy(world, xi); }); + [&world](auto &xi) { return madness::copy(world, xi); }); world.gop.fence(); return result; } - response_space copy(const std::shared_ptr > > &pmap, + response_space copy(const std::shared_ptr>> &pmap, bool fence = false) const { response_space result(x[0][0].world(), num_states, num_orbitals); From 2c9835bee8d03ac2148f492be4de44a85dbdb041 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:40:20 -0400 Subject: [PATCH 0286/1312] Update test development to remove tddft --- src/apps/molresponse/testing/test_development.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index bc1582f67f7..fda4ceff2af 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -7,18 +7,10 @@ #include "ExcitedResponse.hpp" #include "FrequencyResponse.hpp" #include "ResponseExceptions.hpp" -#include "TDDFT.h" -#include "madness/chem/SCF.h" -#include "madness/external/catch/catch.hpp" #include "madness/tensor/tensor_json.hpp" -#include "madness/world/worldmem.h" #include "response_functions.h" #include "response_parameters.h" #include "runners.hpp" -#include "string" -#include "timer.h" -#include "write_test_input.h" -#include "x_space.h" using path = std::filesystem::path; From e1aeaa14442b5dc85d49964b8bbbe910b4d4bd4d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:40:58 -0400 Subject: [PATCH 0287/1312] Update test_development.cpp --- src/apps/molresponse/testing/test_development.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index fda4ceff2af..a3a4f9b7791 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -2,7 +2,6 @@ // Created by adrianhurtado on 1/1/22. // -#include #include "ExcitedResponse.hpp" #include "FrequencyResponse.hpp" From 468a95ba78745e801f1dcfd3ad6f1608ec157b61 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:54:12 -0400 Subject: [PATCH 0288/1312] fix to finish building everything --- .../testing/qcschema_json_testing.cpp | 87 ++++++++++--------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/src/apps/molresponse/testing/qcschema_json_testing.cpp b/src/apps/molresponse/testing/qcschema_json_testing.cpp index b8ddffc53c1..7282b28ad49 100644 --- a/src/apps/molresponse/testing/qcschema_json_testing.cpp +++ b/src/apps/molresponse/testing/qcschema_json_testing.cpp @@ -2,11 +2,12 @@ // Created by adrianhurtado on 1/1/22. // -#include "madness/tensor/tensor_json.hpp" #include "madness/external/catch/catch.hpp" +#include "madness/tensor/tensor_json.hpp" #include "response_functions.h" -#include "timer.h" +#include "response_parameters.h" #include "string" +#include "timer.h" #include "x_space.h" unsigned int Factorial(unsigned int number) { @@ -18,26 +19,26 @@ TEST_CASE("X_space", "[copy]") { unsigned int n = 4; int argc = 1; char** argv = nullptr; - initialize(argc, argv); // initializes a world argument with argc and argv + madness::initialize(argc, argv); // initializes a world argument with argc and argv { - World world(SafeMPI::COMM_WORLD); + madness::World world(SafeMPI::COMM_WORLD); startup(world, 1, nullptr, true); // TODO: ask Robert about proper startup and implement molresponse::start_timer(world); - X_space v{world, m, n}; + madness::X_space v{world, m, n}; REQUIRE(v.num_states() == m); // world.gop.fence(); REQUIRE(v.num_orbitals() == n); molresponse::end_timer(world, "basic x space test"); - finalize(); + madness::finalize(); } } TEST_CASE("Json Testing", "Simple JSON") { // create an empty structure (null) - json j; + nlohmann::json j; // add a number that is stored as double (note the implicit conversion of j to // an object) j["pi"] = 3.141; @@ -54,7 +55,7 @@ TEST_CASE("Json Testing", "Simple JSON") { // add another object (using an initializer list of pairs) j["object"] = {{"currency", "USD"}, {"value", 42.99}}; // instead, you could also write (which looks very similar to the JSON above) - json j2 = {{"pi", 3.141}, + nlohmann::json j2 = {{"pi", 3.141}, {"happy", true}, {"name", "Niels"}, {"nothing", nullptr}, @@ -67,7 +68,7 @@ TEST_CASE("Json Testing", "Simple JSON") { } template -bool operator==(const Tensor& a, const Tensor& b) { +bool operator==(const madness::Tensor& a, const madness::Tensor& b) { // check the size if (a.size() != b.size()) { return false; @@ -87,21 +88,21 @@ bool operator==(const Tensor& a, const Tensor& b) { } TEST_CASE("Json Testing 2", "Serialization") { - Tensor a(3, 3); - Tensor b(3, 2, 4); - Tensor c(1, 3); + madness::Tensor a(3, 3); + madness::Tensor b(3, 2, 4); + madness::Tensor c(1, 3); a.fillrandom(); b.fillindex(); c.fill(3); - json j_a = tensor_to_json(a); - json j_b = tensor_to_json(b); - json j_c = tensor_to_json(c); + nlohmann::json j_a = tensor_to_json(a); + nlohmann::json j_b = tensor_to_json(b); + nlohmann::json j_c = tensor_to_json(c); // How can I make this an automatic template function? - auto a_copy = tensor_from_json(j_a); - auto b_copy = tensor_from_json(j_b); - auto c_copy = tensor_from_json(j_c); + auto a_copy = madness::tensor_from_json(j_a); + auto b_copy = madness::tensor_from_json(j_b); + auto c_copy = madness::tensor_from_json(j_c); REQUIRE(a == a_copy); REQUIRE(b == b_copy); @@ -109,20 +110,20 @@ TEST_CASE("Json Testing 2", "Serialization") { } TEST_CASE("Json Testing 3", "Json Tensor Indexing") { - Tensor a(3, 3); - Tensor b(3, 2, 4); - Tensor c(1, 3); + madness::Tensor a(3, 3); + madness::Tensor b(3, 2, 4); + madness::Tensor c(1, 3); a.fillrandom(); b.fillindex(); c.fill(3); - json j = {}; + nlohmann::json j = {}; - json j_a = tensor_to_json(a); - json j_b = tensor_to_json(b); - json j_c = tensor_to_json(c); + nlohmann::json j_a = tensor_to_json(a); + nlohmann::json j_b = tensor_to_json(b); + nlohmann::json j_c = tensor_to_json(c); for (int i = 0; i < 3; i++) { - json j_iter = {}; + nlohmann::json j_iter = {}; j_iter["iter"] = i; j_iter["a"] = j_a; j_iter["b"] = j_b; @@ -131,36 +132,36 @@ TEST_CASE("Json Testing 3", "Json Tensor Indexing") { } std::ofstream ofs("j_iters.json"); - ofs << j << endl; - std::cout << j << endl; + ofs << j << std::endl; + std::cout << j << std::endl; // How can I make this an automatic template function? } TEST_CASE("print_QCSchema Test ", "Json Tensor Indexing") { - vec_pair_ints int_vals; - vec_pair_T double_vals; - vec_pair_tensor_T double_tensor_vals; + madness::vec_pair_ints int_vals; + madness::vec_pair_T double_vals; + madness::vec_pair_tensor_T double_tensor_vals; - json j={}; + nlohmann::json j={}; int_vals.push_back({"a", 4}); int_vals.push_back({"b", 5}); int_vals.push_back({"c", 4}); int_vals.push_back({"d", 6}); - to_json(j,int_vals); + madness::to_json(j,int_vals); double_vals.push_back({"aa", 4}); double_vals.push_back({"bb", 5}); double_vals.push_back({"cc", 4}); double_vals.push_back({"dd", 6}); - to_json(j,double_vals); + madness::to_json(j,double_vals); - Tensor t_a(3, 3); - Tensor t_b(3, 2, 4); - Tensor t_c(1, 3); + madness::Tensor t_a(3, 3); + madness::Tensor t_b(3, 2, 4); + madness::Tensor t_c(1, 3); double_tensor_vals.push_back({"t_a",t_a}); double_tensor_vals.push_back({"t_b",t_b}); @@ -168,27 +169,27 @@ TEST_CASE("print_QCSchema Test ", "Json Tensor Indexing") { to_json(j,double_tensor_vals); - output_schema( "test_schema", j); + madness::output_schema( "test_schema", j); } TEST_CASE("Response Parameters Test ", "Testing parameters to_json") { int argc = 1; char** argv = nullptr; - initialize(argc, argv); // initializes a world argument with argc and argv + madness::initialize(argc, argv); // initializes a world argument with argc and argv { - World world(SafeMPI::COMM_WORLD); + madness::World world(SafeMPI::COMM_WORLD); startup(world, 1, nullptr, true); // TODO: ask Robert about proper startup and implement molresponse::start_timer(world); // Everything goes in here - ResponseParameters r_params; - json j; + madness::ResponseParameters r_params; + nlohmann::json j; r_params.to_json(j); world.gop.fence(); - std::cout< Date: Tue, 13 Sep 2022 19:02:57 -0400 Subject: [PATCH 0289/1312] add fence before computing theta_x --- src/apps/molresponse/ResponseBase.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 5a98529e0a2..44337f02de8 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -396,6 +396,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + world.gop.fence(); Theta_X = (V0X - E0X) + gamma; Theta_X.truncate(); // Theta_X.truncate(); From 50f99fdc4b0e2deeed5daa6428dc2128c4455aea Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 14 Sep 2022 17:51:05 -0400 Subject: [PATCH 0290/1312] printing on rank 0 --- src/apps/molresponse/FrequencyResponse.cpp | 62 +++++++++++----------- src/apps/molresponse/ResponseBase.cpp | 6 ++- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6be3e25826f..776b4aa9ed6 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -35,13 +35,13 @@ void FrequencyResponse::iterate(World &world) { XCOperator xc = make_xc_operator(world); // create X space residuals - X_space residuals=X_space::zero_functions(world, m, n); + X_space residuals = X_space::zero_functions(world, m, n); std::vector x_vectors; std::vector x_residuals; - x_vectors= to_response_matrix(Chi); - x_residuals= to_response_matrix(residuals); + x_vectors = to_response_matrix(Chi); + x_residuals = to_response_matrix(residuals); /* for (size_t b = 0; b < m; b++) { x_vectors.emplace_back(Chi, b); @@ -51,16 +51,18 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, 2*n), true)); + kain_x_space.push_back(XNonlinearSolver( + response_matrix_allocator(world, 2 * n), true)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } // // We compute with positive frequencies - print("Warning input frequency is assumed to be positive"); - print("Computing at positive frequency omega = ", omega); + if (world.rank() == 0) { + print("Warning input frequency is assumed to be positive"); + print("Computing at positive frequency omega = ", omega); + } double x_shifts = 0.0; double y_shifts = 0.0; // if less negative orbital energy + frequency is positive or greater than 0 @@ -179,8 +181,8 @@ void FrequencyResponse::iterate(World &world) { } } - // std::cout << "MPI BARRIER before update " << std::endl; - // world.mpi.Barrier(); + // std::cout << "MPI BARRIER before update " << std::endl; + // world.mpi.Barrier(); auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, x_vectors, x_residuals, iter, max_rotation); @@ -271,14 +273,14 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator double &x_shifts, double &omega_n, response_solver &kain_x_space, response_matrix &Xvector, response_matrix &Xresidual, size_t iteration, const double &maxrotn) --> std::tuple { + -> std::tuple { - // print("before start time ", r_params.print_level()); -// std::cout << "MPI BARRIER 2 " << std::endl; - // world.mpi.Barrier(); + // print("before start time ", r_params.print_level()); + // std::cout << "MPI BARRIER 2 " << std::endl; + // world.mpi.Barrier(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // std::cout << "MPI BARRIER 3 " << std::endl; + // std::cout << "MPI BARRIER 3 " << std::endl; //world.mpi.Barrier(); size_t m = chi.num_states(); @@ -286,8 +288,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); - // std::cout << "MPI BARRIER After Theta X " << std::endl; - // world.mpi.Barrier(); + // std::cout << "MPI BARRIER After Theta X " << std::endl; + // world.mpi.Barrier(); // compute residual X_space X_space new_chi = @@ -319,10 +321,10 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts) --> X_space { + -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank()==0){ + if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } @@ -400,16 +402,16 @@ void FrequencyResponse::save(World &world, const std::string &name) { // (for i from 0 to m-1 ) // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar & r_params.archive(); - ar & r_params.tda(); - ar & r_params.num_orbitals(); - ar & r_params.num_states(); + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; } } @@ -433,20 +435,20 @@ void FrequencyResponse::load(World &world, const std::string &name) { // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar & r_params.archive(); - ar & r_params.tda(); - ar & r_params.num_orbitals(); - ar & r_params.num_states(); + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; world.gop.fence(); if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; world.gop.fence(); } } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 44337f02de8..e67d8e1a47e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -227,8 +227,10 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) { traceOfHamiltonian += new_hamiltonian(i, i); } - print("Trace of Hamiltonian"); - print(traceOfHamiltonian); + if (world.rank() == 0) { + print("Trace of Hamiltonian"); + print(traceOfHamiltonian); + } // Save a matrix that is // (T+phiVphi) - Lambda * eye // Copy new_hamiltonian and zero the diagonal From af353a9a02368e644a15196e09ba5eecc4c9769e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 14 Sep 2022 17:51:20 -0400 Subject: [PATCH 0291/1312] param set on rank 0 --- src/apps/molresponse/testing/runners.hpp | 57 +++++++++++++----------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index c27e0c1f256..36db655f29d 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -415,50 +415,50 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo bool high_prec) { CalculationParameters param1; + json calcInfo; - param1.set_user_defined_value("maxiter", 20); - //param1.set_user_defined_value("Kain", true); + if (world.rank() == 0) { - param1.set_user_defined_value("xc", moldftSchema.xc); - param1.set_user_defined_value("l", 200); + param1.set_user_defined_value("maxiter", 20); + //param1.set_user_defined_value("Kain", true); - if (high_prec) { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - param1.set_user_defined_value("dconv", 1e-6); - } else { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); - param1.set_user_defined_value("dconv", 1e-4); - } + param1.set_user_defined_value("xc", moldftSchema.xc); + param1.set_user_defined_value("l", 200); - param1.set_user_defined_value("localize", "new"); + if (high_prec) { + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + param1.set_user_defined_value("dconv", 1e-6); + } else { + param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); + param1.set_user_defined_value("dconv", 1e-4); + } - CalculationParameters param_calc; - json calcInfo; - world.gop.fence(); - if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { - if (world.rank() == 0) { + param1.set_user_defined_value("localize", "new"); + CalculationParameters param_calc; + if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { std::cout << "Reading Calc Info JSON" << std::endl; - } - std::ifstream ifs(moldftSchema.calc_info_json_path); - ifs >> calcInfo; - param_calc.from_json(calcInfo["parameters"]); - if (world.rank() == 0) { + std::ifstream ifs(moldftSchema.calc_info_json_path); + ifs >> calcInfo; + param_calc.from_json(calcInfo["parameters"]); print(param1.print_to_string()); print(param_calc.print_to_string()); + print("param1 != param_calc = ", param1 != param_calc); } + } + world.gop.broadcast_serializable(param1, 0); + world.gop.broadcast(calcInfo, 0); + //If the parameters are exactly equal do not run // If calc info doesn't exist the param_calc will definitely be different // if parameters are different or if I want to run no matter what run // if I want to restart and if I can. restart - if (world.rank() == 0) { - print("param1 != param_calc = ", param1 != param_calc); - } - if (tryMOLDFT(param1, param_calc) || try_run) { + if (try_run) { if (world.rank() == 0) { print("-------------Running moldft------------"); } + world.gop.fence(); // if params are different run and if restart exists and if im asking to restar if (std::filesystem::exists(moldftSchema.moldft_restart) && restart) { param1.set_user_defined_value("restart", true); @@ -472,8 +472,10 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo commandlineparser parser; parser.set_keyval("input", "moldft.in"); world.gop.fence(); + SCF calc(world, parser); calc.set_protocol<3>(world, 1e-4); + MolecularEnergy ME(world, calc); // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! @@ -704,7 +706,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, calc.solve(world); world.gop.fence(); // set protocol to the first - if(world.rank()==0){ + if (world.rank() == 0) { //calc.time_data.to_json(calc.j_molresponse); calc.output_json(); } @@ -870,6 +872,7 @@ void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, } } std::filesystem::current_path(m_schema.moldft_path); + world.gop.fence(); if (world.rank() == 0) { cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; } From d1ad4493d675fd4c75c150ee49ecdacb80174104 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 14 Sep 2022 17:55:30 -0400 Subject: [PATCH 0292/1312] fixing mad-freq case --- src/madness/chem/molecule.h | 688 ++++++++++++++++++------------------ 1 file changed, 340 insertions(+), 348 deletions(-) diff --git a/src/madness/chem/molecule.h b/src/madness/chem/molecule.h index cd6bfef8690..319c71d877b 100644 --- a/src/madness/chem/molecule.h +++ b/src/madness/chem/molecule.h @@ -36,8 +36,8 @@ /// \brief Declaration of molecule related classes and functions #include -#include -#include +#include +#include #include #include #include @@ -53,474 +53,466 @@ namespace madness { -class World; + class World; -class Atom { -public: - double x, y, z, q; ///< Coordinates and charge in atomic units - unsigned int atomic_number; ///< Atomic number - double mass; ///< Mass - bool pseudo_atom; ///< Indicates if this atom uses a pseudopotential + class Atom { + public: + double x, y, z, q; ///< Coordinates and charge in atomic units + unsigned int atomic_number;///< Atomic number + double mass; ///< Mass + bool pseudo_atom; ///< Indicates if this atom uses a pseudopotential - explicit Atom(double x, double y, double z, double q, unsigned int atomic_number, bool pseudo_atom) + explicit Atom(double x, double y, double z, double q, unsigned int atomic_number, bool pseudo_atom) : x(x), y(y), z(z), q(q), atomic_number(atomic_number), pseudo_atom(pseudo_atom) { - mass= get_atomic_data(atomic_number).mass; + mass = get_atomic_data(atomic_number).mass; - if (mass==-1.0) MADNESS_EXCEPTION("faulty element in Atom",1); + if (mass == -1.0) MADNESS_EXCEPTION("faulty element in Atom", 1); - // unstable elements are indicated by negative masses, the mass - // is taken from the longest-living element - if (mass<0.0) mass*=-1.0; - - } + // unstable elements are indicated by negative masses, the mass + // is taken from the longest-living element + if (mass < 0.0) mass *= -1.0; + } - explicit Atom(double x, double y, double z, double q, unsigned int atomic_number) + explicit Atom(double x, double y, double z, double q, unsigned int atomic_number) : x(x), y(y), z(z), q(q), atomic_number(atomic_number) { - mass= get_atomic_data(atomic_number).mass; - - if (mass==-1.0) MADNESS_EXCEPTION("faulty element in Atom",1); - - // unstable elements are indicated by negative masses, the mass - // is taken from the longest-living element - if (mass<0.0) mass*=-1.0; - - pseudo_atom = false; - - } + mass = get_atomic_data(atomic_number).mass; - Atom(const Atom& a) : x(a.x), y(a.y), z(a.z), q(a.q), - atomic_number(a.atomic_number), mass(a.mass), pseudo_atom(a.pseudo_atom) {} + if (mass == -1.0) MADNESS_EXCEPTION("faulty element in Atom", 1); - /// Default construct makes a zero charge ghost atom at origin - Atom() : x(0), y(0), z(0), q(0), atomic_number(0), mass(0.0), pseudo_atom(false) {} + // unstable elements are indicated by negative masses, the mass + // is taken from the longest-living element + if (mass < 0.0) mass *= -1.0; - int get_atomic_number() const {return atomic_number;} - - madness::Vector get_coords() const { - return madness::Vector{x, y, z}; - } - - /// return the mass in atomic units (electron mass = 1 a.u.) - double get_mass_in_au() const {return constants::atomic_mass_in_au * mass;} - - template - void serialize(Archive& ar) { - ar & x & y & z & q & atomic_number & mass & pseudo_atom; - } -}; + pseudo_atom = false; + } -std::ostream& operator<<(std::ostream& s, const Atom& atom); + Atom(const Atom &a) : x(a.x), y(a.y), z(a.z), q(a.q), + atomic_number(a.atomic_number), mass(a.mass), pseudo_atom(a.pseudo_atom) {} -class Molecule { -public: - struct GeometryParameters : public QCCalculationParametersBase { - GeometryParameters(const GeometryParameters& other) = default; + /// Default construct makes a zero charge ghost atom at origin + Atom() : x(0), y(0), z(0), q(0), atomic_number(0), mass(0.0), pseudo_atom(false) {} - GeometryParameters(World& world, const commandlineparser& parser) : GeometryParameters() { - try { - set_global_convenience_options(parser); - read_input_and_commandline_options(world, parser, "geometry"); - set_derived_values(parser); + int get_atomic_number() const { return atomic_number; } - } catch (std::exception& e) { - print("geometry","end"); - throw; -// MADNESS_EXCEPTION("faulty geometry input",1); - } + madness::Vector get_coords() const { + return madness::Vector{x, y, z}; } - GeometryParameters() { - ignore_unknown_keys=true; - ignore_unknown_keys_silently=true; - throw_if_datagroup_not_found=true; - -// initialize>("source",{"inputfile"},"where to get the coordinates from: ({inputfile}, {library,xxx}, {xyz,xxx.xyz})"); - initialize("source_type","inputfile","where to get the coordinates from",{"inputfile","xyz","library"}); - initialize("source_name","TBD","name of the geometry from the library or the input file"); - initialize("eprec",1.e-4,"smoothing for the nuclear potential"); - initialize("units","atomic","coordinate units",{"atomic","angstrom","bohr","au"}); - initialize>("field",{0.0,0.0,0.0},"external electric field"); - initialize ("no_orient",false,"if true the molecule coordinates will not be reoriented and/or symmetrized"); - initialize ("symtol",-1.e-2,"distance threshold for determining the symmetry-equivalent atoms; negative: old algorithm"); - - initialize ("core_type","none","core potential type",{"none","mpc"}); - initialize ("psp_calc",false,"pseudopotential calculation for all atoms"); - initialize ("pure_ae",true,"pure all electron calculation with no pseudo-atoms"); + /// return the mass in atomic units (electron mass = 1 a.u.) + double get_mass_in_au() const { return constants::atomic_mass_in_au * mass; } + template + void serialize(Archive &ar) { + ar &x &y &z &q &atomic_number &mass &pseudo_atom; } + }; - void set_global_convenience_options(const commandlineparser& parser) { - - if (parser.key_exists("geometry")) { - set_user_defined_value("source_name",parser.value("geometry")); - } + std::ostream &operator<<(std::ostream &s, const Atom &atom); - } + class Molecule { + public: + struct GeometryParameters : public QCCalculationParametersBase { + GeometryParameters(const GeometryParameters &other) = default; - void set_derived_values(const commandlineparser& parser) { - // check if we use an xyz file, the structure library or the input file - set_derived_value("source_name",parser.value("input")); // will not override user input - std::string src_type= derive_source_type_from_name(source_name(), parser); - set_derived_value("source_type",src_type); - - // check for ambiguities in the derived source type - if (not is_user_defined("source_type")) { - std::ifstream f(source_name().c_str()); - bool found_geometry_file=f.good(); -// bool found_geometry_file=std::filesystem::exists(source_name()); - - bool geometry_found_in_library=true; - try { // check for existence of file and structure in the library - std::ifstream f; - position_stream_in_library(f,source_name()); - } catch(...){ - geometry_found_in_library=false; - } + GeometryParameters(World &world, const commandlineparser &parser) : GeometryParameters() { + try { + set_global_convenience_options(parser); + read_input_and_commandline_options(world, parser, "geometry"); + set_derived_values(parser); - if (found_geometry_file and geometry_found_in_library) { - madness::print("\n\n"); - madness::print("geometry specification ambiguous: found geometry in the structure library and in a file\n"); - madness::print(" ",get_structure_library_path()); - madness::print(" ",source_name()); - madness::print("\nPlease specify the location of your geometry input by one of the two lines:\n"); - madness::print(" source_type xyz"); - madness::print(" source_type library\n\n"); - MADNESS_EXCEPTION("faulty input\n\n",1); + } catch (std::exception &e) { + print("geometry", "end"); + throw; + // MADNESS_EXCEPTION("faulty geometry input",1); } } -// std::vector src=source(); -// -// // some convenience for the user -// -// // if source is the input file provide the name of the input file -// if (src.size()==1 and src[0]=="inputfile") -// set_derived_value("source",std::vector({src[0],parser.value("input")})); -// // if source is not "inputfile" or "library" assume an xyz file -// if (src.size()==1 and src[0]!="inputfile") { -// std::size_t found=src[0].find("xyz"); -// if (found==src[0].size()-3) { // check input file ends with xyz -// set_user_defined_value("source", std::vector({"xyz", src[0]})); -// } else { -// throw std::runtime_error("error in deriving geometry parameters"); -// } -// } - - if (source_type()=="xyz") set_derived_value("units",std::string("angstrom")); - if (units()=="bohr" or units()=="au") set_derived_value("units","atomic"); - } - - std::string source_type() const {return get("source_type");} - std::string source_name() const {return get("source_name");} - std::vector field() const {return get>("field");} - double eprec() const {return get("eprec");} - std::string units() const {return get("units");} - std::string core_type() const {return get("core_type");} - bool psp_calc() const {return get("psp_calc");} - bool pure_ae() const {return get("pure_ae");} - bool no_orient() const {return get("no_orient");} - double symtol() const {return get("symtol");} - - static std::string derive_source_type_from_name(const std::string name, - const commandlineparser& parser) { - if (name==parser.value("input")) return "inputfile"; - std::size_t pos = name.find(".xyz"); - if (pos!=std::string::npos) return "xyz"; - return "library"; - } + GeometryParameters() { + ignore_unknown_keys = true; + ignore_unknown_keys_silently = true; + throw_if_datagroup_not_found = true; + + // initialize>("source",{"inputfile"},"where to get the coordinates from: ({inputfile}, {library,xxx}, {xyz,xxx.xyz})"); + initialize("source_type", "inputfile", "where to get the coordinates from", {"inputfile", "xyz", "library"}); + initialize("source_name", "TBD", "name of the geometry from the library or the input file"); + initialize("eprec", 1.e-4, "smoothing for the nuclear potential"); + initialize("units", "atomic", "coordinate units", {"atomic", "angstrom", "bohr", "au"}); + initialize>("field", {0.0, 0.0, 0.0}, "external electric field"); + initialize("no_orient", false, "if true the molecule coordinates will not be reoriented and/or symmetrized"); + initialize("symtol", -1.e-2, "distance threshold for determining the symmetry-equivalent atoms; negative: old algorithm"); + + initialize("core_type", "none", "core potential type", {"none", "mpc"}); + initialize("psp_calc", false, "pseudopotential calculation for all atoms"); + initialize("pure_ae", true, "pure all electron calculation with no pseudo-atoms"); + } - }; + void set_global_convenience_options(const commandlineparser &parser) { -private: - // If you add more fields don't forget to serialize them - std::vector atoms; - std::vector rcut; // Reciprocal of the smoothing radius - CorePotentialManager core_pot; - madness::Tensor field; + if (parser.key_exists("geometry")) { + set_user_defined_value("source_name", parser.value("geometry")); + } + } - /// The molecular point group is automatically assigned in the identify_pointgroup function - std::string pointgroup_="c1"; + void set_derived_values(const commandlineparser &parser) { + // check if we use an xyz file, the structure library or the input file + set_derived_value("source_name", parser.value("input"));// will not override user input + std::string src_type = derive_source_type_from_name(source_name(), parser); + set_derived_value("source_type", src_type); + + // check for ambiguities in the derived source type + if (is_user_defined("source_type")) {// TODO breaks if i create molecule and then read and write to param write inputfile and read... runner.hpp + std::ifstream f(source_name().c_str()); + bool found_geometry_file = f.good(); + // bool found_geometry_file=std::filesystem::exists(source_name()); + + bool geometry_found_in_library = true; + try {// check for existence of file and structure in the library + std::ifstream f; + position_stream_in_library(f, source_name()); + } catch (...) { + geometry_found_in_library = false; + } + + if (found_geometry_file and geometry_found_in_library) { + madness::print("\n\n"); + madness::print("geometry specification ambiguous: found geometry in the structure library and in a file\n"); + madness::print(" ", get_structure_library_path()); + madness::print(" ", source_name()); + madness::print("\nPlease specify the location of your geometry input by one of the two lines:\n"); + madness::print(" source_type xyz"); + madness::print(" source_type library\n\n"); + MADNESS_EXCEPTION("faulty input\n\n", 1); + } + } -public: - GeometryParameters parameters; + // std::vector src=source(); + // + // // some convenience for the user + // + // // if source is the input file provide the name of the input file + // if (src.size()==1 and src[0]=="inputfile") + // set_derived_value("source",std::vector({src[0],parser.value("input")})); + // // if source is not "inputfile" or "library" assume an xyz file + // if (src.size()==1 and src[0]!="inputfile") { + // std::size_t found=src[0].find("xyz"); + // if (found==src[0].size()-3) { // check input file ends with xyz + // set_user_defined_value("source", std::vector({"xyz", src[0]})); + // } else { + // throw std::runtime_error("error in deriving geometry parameters"); + // } + // } + + if (source_type() == "xyz") set_derived_value("units", std::string("angstrom")); + if (units() == "bohr" or units() == "au") set_derived_value("units", "atomic"); + } - static void print_parameters(); + std::string source_type() const { return get("source_type"); } + std::string source_name() const { return get("source_name"); } + std::vector field() const { return get>("field"); } + double eprec() const { return get("eprec"); } + std::string units() const { return get("units"); } + std::string core_type() const { return get("core_type"); } + bool psp_calc() const { return get("psp_calc"); } + bool pure_ae() const { return get("pure_ae"); } + bool no_orient() const { return get("no_orient"); } + double symtol() const { return get("symtol"); } + + static std::string derive_source_type_from_name(const std::string name, + const commandlineparser &parser) { + if (name == parser.value("input")) return "inputfile"; + std::size_t pos = name.find(".xyz"); + if (pos != std::string::npos) return "xyz"; + return "library"; + } + }; - std::string get_pointgroup() const {return pointgroup_;} + private: + // If you add more fields don't forget to serialize them + std::vector atoms; + std::vector rcut;// Reciprocal of the smoothing radius + CorePotentialManager core_pot; + madness::Tensor field; -private: + /// The molecular point group is automatically assigned in the identify_pointgroup function + std::string pointgroup_ = "c1"; - void swapaxes(int ix, int iy); + public: + GeometryParameters parameters; - template - bool test_for_op(opT op, const double symtol) const; + static void print_parameters(); - template - void symmetrize_for_op(opT op, const double symtol); + std::string get_pointgroup() const { return pointgroup_; } - template - int find_symmetry_equivalent_atom(int iatom, opT op, const double symtol) const; + private: + void swapaxes(int ix, int iy); - bool test_for_c2(double xaxis, double yaxis, double zaxis, const double symtol) const; + template + bool test_for_op(opT op, const double symtol) const; - bool test_for_sigma(double xaxis, double yaxis, double zaxis, const double symtol) const; + template + void symmetrize_for_op(opT op, const double symtol); - bool test_for_inverse(const double symtol) const; + template + int find_symmetry_equivalent_atom(int iatom, opT op, const double symtol) const; - /// Apply to (x,y,z) a C2 rotation about an axis thru the origin and (xaxis,yaxis,zaxis) - struct apply_c2{ - double xaxis, yaxis, zaxis; - apply_c2(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} - void operator()(double& x, double& y, double& z) const { - double raxissq = xaxis*xaxis + yaxis*yaxis + zaxis*zaxis; - double dx = x*xaxis*xaxis/raxissq; - double dy = y*yaxis*yaxis/raxissq; - double dz = z*zaxis*zaxis/raxissq; - x = 2.0*dx - x; - y = 2.0*dy - y; - z = 2.0*dz - z; - } - }; + bool test_for_c2(double xaxis, double yaxis, double zaxis, const double symtol) const; - /// Apply to (x,y,z) a reflection through a plane containing the origin with normal (xaxis,yaxis,zaxis) - struct apply_sigma{ - double xaxis, yaxis, zaxis; - apply_sigma(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} - void operator()(double& x, double& y, double& z) const { - double raxissq = xaxis * xaxis + yaxis * yaxis + zaxis * zaxis; - double dx = x * xaxis * xaxis / raxissq; - double dy = y * yaxis * yaxis / raxissq; - double dz = z * zaxis * zaxis / raxissq; - - x = x - 2.0 * dx; - y = y - 2.0 * dy; - z = z - 2.0 * dz; - } - }; + bool test_for_sigma(double xaxis, double yaxis, double zaxis, const double symtol) const; - struct apply_inverse{ - double xaxis, yaxis, zaxis; - apply_inverse(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} - void operator()(double& x, double& y, double& z) const { - x = -x; - y = -y; - z = -z; - } - }; + bool test_for_inverse(const double symtol) const; -public: + /// Apply to (x,y,z) a C2 rotation about an axis thru the origin and (xaxis,yaxis,zaxis) + struct apply_c2 { + double xaxis, yaxis, zaxis; + apply_c2(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} + void operator()(double &x, double &y, double &z) const { + double raxissq = xaxis * xaxis + yaxis * yaxis + zaxis * zaxis; + double dx = x * xaxis * xaxis / raxissq; + double dy = y * yaxis * yaxis / raxissq; + double dz = z * zaxis * zaxis / raxissq; + x = 2.0 * dx - x; + y = 2.0 * dy - y; + z = 2.0 * dz - z; + } + }; + + /// Apply to (x,y,z) a reflection through a plane containing the origin with normal (xaxis,yaxis,zaxis) + struct apply_sigma { + double xaxis, yaxis, zaxis; + apply_sigma(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} + void operator()(double &x, double &y, double &z) const { + double raxissq = xaxis * xaxis + yaxis * yaxis + zaxis * zaxis; + double dx = x * xaxis * xaxis / raxissq; + double dy = y * yaxis * yaxis / raxissq; + double dz = z * zaxis * zaxis / raxissq; + + x = x - 2.0 * dx; + y = y - 2.0 * dy; + z = z - 2.0 * dz; + } + }; + + struct apply_inverse { + double xaxis, yaxis, zaxis; + apply_inverse(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} + void operator()(double &x, double &y, double &z) const { + x = -x; + y = -y; + z = -z; + } + }; - /// Makes a molecule with zero atoms - Molecule() : atoms(), rcut(), core_pot(), field(3L) {}; + public: + /// Makes a molecule with zero atoms + Molecule() : atoms(), rcut(), core_pot(), field(3L){}; - /// makes a molecule from a list of atoms - Molecule(std::vector atoms, double eprec, CorePotentialManager core_pot = {}, madness::Tensor field = madness::Tensor(3L)); + /// makes a molecule from a list of atoms + Molecule(std::vector atoms, double eprec, CorePotentialManager core_pot = {}, madness::Tensor field = madness::Tensor(3L)); - /// makes a molecule using contents of \p parser - Molecule(World& world, const commandlineparser& parser); + /// makes a molecule using contents of \p parser + Molecule(World &world, const commandlineparser &parser); - void get_structure(); + void get_structure(); - void read_structure_from_library(const std::string& name); + void read_structure_from_library(const std::string &name); - static std::istream& position_stream_in_library(std::ifstream& f, const std::string& name); + static std::istream &position_stream_in_library(std::ifstream &f, const std::string &name); - static std::string get_structure_library_path(); + static std::string get_structure_library_path(); - /// print out a Gaussian cubefile header - std::vector cubefile_header() const; + /// print out a Gaussian cubefile header + std::vector cubefile_header() const; - // initializes Molecule using the contents of file \c filename - void read_file(const std::string& filename); + // initializes Molecule using the contents of file \c filename + void read_file(const std::string &filename); - // initializes Molecule using the contents of stream \c f - void read(std::istream& f); + // initializes Molecule using the contents of stream \c f + void read(std::istream &f); - // initializes Molecule using the contents of file \c filenam assuming an xyz file - void read_xyz(const std::string filename); + // initializes Molecule using the contents of file \c filenam assuming an xyz file + void read_xyz(const std::string filename); - void read_core_file(const std::string& filename); + void read_core_file(const std::string &filename); - std::string guess_file() const { return core_pot.guess_file(); }; + std::string guess_file() const { return core_pot.guess_file(); }; - unsigned int n_core_orb_all() const ; + unsigned int n_core_orb_all() const; - unsigned int n_core_orb(unsigned int atn) const { - if (core_pot.is_defined(atn)) - return core_pot.n_core_orb_base(atn); - else - return 0; - }; + unsigned int n_core_orb(unsigned int atn) const { + if (core_pot.is_defined(atn)) + return core_pot.n_core_orb_base(atn); + else + return 0; + }; - unsigned int get_core_l(unsigned int atn, unsigned int c) const { - return core_pot.get_core_l(atn, c); - } + unsigned int get_core_l(unsigned int atn, unsigned int c) const { + return core_pot.get_core_l(atn, c); + } - double get_core_bc(unsigned int atn, unsigned int c) const { - return core_pot.get_core_bc(atn, c); - } + double get_core_bc(unsigned int atn, unsigned int c) const { + return core_pot.get_core_bc(atn, c); + } - double core_eval(int atom, unsigned int core, int m, double x, double y, double z) const; + double core_eval(int atom, unsigned int core, int m, double x, double y, double z) const; - double core_derivative(int atom, int axis, unsigned int core, int m, double x, double y, double z) const; + double core_derivative(int atom, int axis, unsigned int core, int m, double x, double y, double z) const; - bool is_potential_defined(unsigned int atn) const { return core_pot.is_defined(atn); }; + bool is_potential_defined(unsigned int atn) const { return core_pot.is_defined(atn); }; - bool is_potential_defined_atom(int i) const { return core_pot.is_defined(atoms[i].atomic_number); }; + bool is_potential_defined_atom(int i) const { return core_pot.is_defined(atoms[i].atomic_number); }; - void add_atom(double x, double y, double z, double q, int atn); + void add_atom(double x, double y, double z, double q, int atn); - void add_atom(double x, double y, double z, double q, int atn, bool psat); + void add_atom(double x, double y, double z, double q, int atn, bool psat); - size_t natom() const { - return atoms.size(); - }; + size_t natom() const { + return atoms.size(); + }; - void set_atom_charge(unsigned int i, double zeff); + void set_atom_charge(unsigned int i, double zeff); - unsigned int get_atom_charge(unsigned int i) const; + unsigned int get_atom_charge(unsigned int i) const; - unsigned int get_atomic_number(unsigned int i) const; + unsigned int get_atomic_number(unsigned int i) const; - void set_pseudo_atom(unsigned int i, bool psat); + void set_pseudo_atom(unsigned int i, bool psat); - bool get_pseudo_atom(unsigned int i) const; + bool get_pseudo_atom(unsigned int i) const; - void set_atom_coords(unsigned int i, double x, double y, double z); + void set_atom_coords(unsigned int i, double x, double y, double z); - madness::Tensor get_all_coords() const; + madness::Tensor get_all_coords() const; - std::vector< madness::Vector > get_all_coords_vec() const; + std::vector> get_all_coords_vec() const; - std::vector atomic_radii; + std::vector atomic_radii; - void set_all_coords(const madness::Tensor& newcoords); + void set_all_coords(const madness::Tensor &newcoords); - void update_rcut_with_eprec(double value); + void update_rcut_with_eprec(double value); - void set_rcut(double value); + void set_rcut(double value); - std::vector get_rcut() const {return rcut;} + std::vector get_rcut() const { return rcut; } - void set_core_eprec(double value) { - core_pot.set_eprec(value); - } + void set_core_eprec(double value) { + core_pot.set_eprec(value); + } - void set_core_rcut(double value) { - core_pot.set_rcut(value); - } + void set_core_rcut(double value) { + core_pot.set_rcut(value); + } - double get_eprec() const { - return parameters.eprec(); - } + double get_eprec() const { + return parameters.eprec(); + } - double bounding_cube() const; + double bounding_cube() const; - const Atom& get_atom(unsigned int i) const; + const Atom &get_atom(unsigned int i) const; - const std::vector & get_atoms()const{return atoms;} + const std::vector &get_atoms() const { return atoms; } - void print() const; + void print() const; - double inter_atomic_distance(unsigned int i,unsigned int j) const; + double inter_atomic_distance(unsigned int i, unsigned int j) const; - double nuclear_repulsion_energy() const; + double nuclear_repulsion_energy() const; - double nuclear_repulsion_derivative(size_t iatom, int axis) const; + double nuclear_repulsion_derivative(size_t iatom, int axis) const; - /// compute the nuclear-nuclear contribution to the second derivatives + /// compute the nuclear-nuclear contribution to the second derivatives - /// @param[in] iatom the i-th atom (row of the hessian) - /// @param[in] jatom the j-th atom (column of the hessian) - /// @param[in] iaxis the xyz axis of the i-th atom - /// @param[in] jaxis the xyz axis of the j-th atom - /// return the (3*iatom + iaxis, 3*jatom + jaxis) matix element of the hessian - double nuclear_repulsion_second_derivative(int iatom, int jatom, - int iaxis, int jaxis) const; + /// @param[in] iatom the i-th atom (row of the hessian) + /// @param[in] jatom the j-th atom (column of the hessian) + /// @param[in] iaxis the xyz axis of the i-th atom + /// @param[in] jaxis the xyz axis of the j-th atom + /// return the (3*iatom + iaxis, 3*jatom + jaxis) matix element of the hessian + double nuclear_repulsion_second_derivative(int iatom, int jatom, + int iaxis, int jaxis) const; - /// return the hessian matrix of the second derivatives d^2/dxdy V + /// return the hessian matrix of the second derivatives d^2/dxdy V - /// no factor 0.5 included - Tensor nuclear_repulsion_hessian() const; + /// no factor 0.5 included + Tensor nuclear_repulsion_hessian() const; - /// compute the dipole moment of the nuclei + /// compute the dipole moment of the nuclei - /// @param[in] axis the axis (x, y, z) - double nuclear_dipole(int axis) const; + /// @param[in] axis the axis (x, y, z) + double nuclear_dipole(int axis) const; - /// compute the derivative of the nuclear dipole wrt a nuclear displacement + /// compute the derivative of the nuclear dipole wrt a nuclear displacement - /// @param[in] atom the atom which will be displaced - /// @param[in] axis the axis where the atom will be displaced - /// @return a vector which all 3 components of the dipole derivative - Tensor nuclear_dipole_derivative(const int atom, const int axis) const; + /// @param[in] atom the atom which will be displaced + /// @param[in] axis the axis where the atom will be displaced + /// @return a vector which all 3 components of the dipole derivative + Tensor nuclear_dipole_derivative(const int atom, const int axis) const; - double nuclear_charge_density(double x, double y, double z) const; + double nuclear_charge_density(double x, double y, double z) const; - double mol_nuclear_charge_density(double x, double y, double z) const; + double mol_nuclear_charge_density(double x, double y, double z) const; - double smallest_length_scale() const; + double smallest_length_scale() const; - std::string symmetrize_and_identify_point_group(const double symtol); + std::string symmetrize_and_identify_point_group(const double symtol); - /// Moves the center of nuclear charge to the origin - void center(); + /// Moves the center of nuclear charge to the origin + void center(); - /// rotates the molecule and the external field + /// rotates the molecule and the external field - /// @param[in] D the rotation matrix - void rotate(const Tensor& D); + /// @param[in] D the rotation matrix + void rotate(const Tensor &D); - /// translate the molecule - void translate(const Tensor& translation); + /// translate the molecule + void translate(const Tensor &translation); - Tensor center_of_mass() const; + Tensor center_of_mass() const; - /// compute the mass-weighting matrix for the hessian + /// compute the mass-weighting matrix for the hessian - /// use as - /// mass_weighted_hessian=inner(massweights,inner(hessian,massweights)); - Tensor massweights() const { + /// use as + /// mass_weighted_hessian=inner(massweights,inner(hessian,massweights)); + Tensor massweights() const { - Tensor M(3*natom(),3*natom()); - for (size_t i=0; i M(3 * natom(), 3 * natom()); + for (size_t i = 0; i < natom(); i++) { + const double sqrtmass = 1.0 / sqrt(get_atom(i).get_mass_in_au()); + M(3 * i, 3 * i) = sqrtmass; + M(3 * i + 1, 3 * i + 1) = sqrtmass; + M(3 * i + 2, 3 * i + 2) = sqrtmass; + } + return M; } - return M; - } + Tensor moment_of_inertia() const; - Tensor moment_of_inertia() const; + void orient(bool verbose = false); - void orient(bool verbose=false); + double total_nuclear_charge() const; - double total_nuclear_charge() const; + /// nuclear attraction potential for the whole molecule + double nuclear_attraction_potential(double x, double y, double z) const; - /// nuclear attraction potential for the whole molecule - double nuclear_attraction_potential(double x, double y, double z) const; + /// nuclear attraction potential for a specific atom in the molecule + double atomic_attraction_potential(int iatom, double x, double y, double z) const; - /// nuclear attraction potential for a specific atom in the molecule - double atomic_attraction_potential(int iatom, double x, double y, double z) const; + double molecular_core_potential(double x, double y, double z) const; - double molecular_core_potential(double x, double y, double z) const; + double core_potential_derivative(int atom, int axis, double x, double y, double z) const; - double core_potential_derivative(int atom, int axis, double x, double y, double z) const; + double nuclear_attraction_potential_derivative(int atom, int axis, double x, double y, double z) const; - double nuclear_attraction_potential_derivative(int atom, int axis, double x, double y, double z) const; + double nuclear_attraction_potential_second_derivative(int atom, int iaxis, + int jaxis, double x, double y, double z) const; - double nuclear_attraction_potential_second_derivative(int atom, int iaxis, - int jaxis, double x, double y, double z) const; - - template - void serialize(Archive& ar) { - ar & atoms & rcut & core_pot & parameters & pointgroup_ & field; - } -}; + template + void serialize(Archive &ar) { + ar &atoms &rcut &core_pot ¶meters &pointgroup_ &field; + } + }; -} +}// namespace madness #endif From fa4df1b27775ce7a77fd4ed2235d583a54888371 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 11:39:32 -0400 Subject: [PATCH 0293/1312] exchange clean up --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/Plot_VTK.cc | 1 - src/apps/molresponse/ResponseBase.cpp | 51 ++++++++++++++++++---- src/apps/molresponse/response_functions.h | 12 ++--- src/apps/molresponse/response_parameters.h | 2 +- src/apps/molresponse/testing/runners.hpp | 4 +- src/apps/molresponse/x_space.cc | 44 +++++++++++++++++++ src/apps/molresponse/x_space.h | 23 ++++++---- 8 files changed, 110 insertions(+), 29 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 776b4aa9ed6..9248482623d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -52,7 +52,7 @@ void FrequencyResponse::iterate(World &world) { response_solver kain_x_space; for (size_t b = 0; b < m; b++) { kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, 2 * n), true)); + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } diff --git a/src/apps/molresponse/Plot_VTK.cc b/src/apps/molresponse/Plot_VTK.cc index 0bc22880647..b6e6d4088c7 100644 --- a/src/apps/molresponse/Plot_VTK.cc +++ b/src/apps/molresponse/Plot_VTK.cc @@ -254,4 +254,3 @@ void do_vtk_plots(World &world, } } // namespace madness -// Dueces diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index e67d8e1a47e..a371e14c47a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -499,18 +499,39 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + auto xy = to_response_matrix(d_alpha); + auto yx = to_conjugate_response_matrix(d_alpha); + + + auto exchange_response = create_response_matrix(m, 2 * n); + auto conjugate_exchange_response = create_response_matrix(m, 2 * n); + + world.gop.fence(); + auto phi0_response = copy(world, phi0); + std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi0_i) { phi0_response.push_back(madness::copy(phi0_i)); }); + std::transform(xy.begin(), xy.end(), exchange_response.begin(), [&](const auto &x) { return newK(x, phi0_response, phi0_response); }); + world.gop.fence(); + std::transform(yx.begin(), yx.end(), conjugate_exchange_response.begin(), [&](const auto &conj_x) { return newK(phi0_response, conj_x, phi0_response); }); + + auto kx = to_X_space(exchange_response); + auto ky = to_X_space(conjugate_exchange_response); + /* for (size_t b = 0; b < m; b++) { vecfuncT x, y; x = d_alpha.X[b]; y = d_alpha.Y[b]; // |x> - KX.X[b] = newK(x, phi0, phi0); KY.X[b] = newK(phi0, y, phi0); + KX.Y[b] = newK(phi0, x, phi0); // |y> + KX.X[b] = newK(x, phi0, phi0); KY.Y[b] = newK(y, phi0, phi0); - KX.Y[b] = newK(phi0, x, phi0); // |i> } + */ + + world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -529,7 +550,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit W.truncate(); */ - gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (kx + ky) * xcf.hf_exchange_coefficient() + W; //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); @@ -551,11 +572,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); print_inner(world, "xJx", d_alpha, J); - print_inner(world, "xKXx", d_alpha, KX); - print_inner(world, "xKYx", d_alpha, KY); - X_space K = KX + KY; + print_inner(world, "xKXx", d_alpha, kx); + print_inner(world, "xKYx", d_alpha, ky); + X_space K = kx + ky; world.gop.fence(); - print_inner(world, "xKx", d_alpha, KX); print_inner(world, "xWx", d_alpha, W); print_inner(world, "xGammax", d_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); @@ -571,6 +591,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit j_y.clear(); KX.clear(); KY.clear(); + kx.clear(); + ky.clear(); W.clear(); d_alpha.clear(); @@ -681,16 +703,27 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + // normal exchange + std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), [&](const auto &xi) { + return newK(xi, phi0, phi0); + }); + // conjugate exchange + std::transform(xy.Y.begin(), xy.Y.end(), KY.X.begin(), [&](const auto &yi) { + return newK(phi0, yi, phi0); + }); + + /* for (size_t b = 0; b < num_states; b++) { vecfuncT x, y; x = xy.X[b]; - y = xy.Y[b]; - // |x> KX.X[b] = newK(x, phi0, phi0); // |i> + y = xy.Y[b]; KY.X[b] = newK(phi0, y, phi0); // |y> } + */ if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index f8e025faeb6..afa5c34269d 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -271,7 +271,6 @@ namespace madness { response_space result(world, num_states, num_orbitals); - std::transform(x.begin(), x.end(), result.x.begin(), [&world](auto &xi) { return madness::copy(world, xi); }); world.gop.fence(); @@ -282,11 +281,12 @@ namespace madness { response_space copy(const std::shared_ptr>> &pmap, bool fence = false) const { - response_space result(x[0][0].world(), num_states, num_orbitals); + auto &world = x[0][0].world(); + response_space result(world, num_states, num_orbitals); + world.gop.fence(); + + std::transform(x.begin(), x.end(), result.x.begin(), [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); - for (size_t i = 0; i < num_states; i++) { - result.x[i] = madness::copy(x[0][0].world(), x[i], pmap, fence); - } return result; } @@ -327,7 +327,7 @@ namespace madness { const auto begin() const { return x.begin(); } - const auto end() const { return x.end(); } + [[nodiscard]] const auto end() const { return x.end(); } size_t size() const { return num_states; } diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index 2a497103766..b4b81749e1c 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -25,7 +25,7 @@ namespace madness { ResponseParameters(const ResponseParameters& other) = default; ResponseParameters() { - initialize("archive", "../moldft.restartdata", + initialize("archive", "../mad.restartdata", "file to read ground parameters from"); initialize("nwchem", false, "Using nwchem files for intelligent starting guess"); initialize("nwchem_dir", "none", diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 36db655f29d..2086a0f4670 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -124,8 +124,8 @@ struct moldftSchema { xc(m_xc) { moldft_path = addPath(schema.xc_path, '/' + mol_name); - moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); - calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); + moldft_restart = addPath(moldft_path, "/mad.restartdata.00000"); + calc_info_json_path = addPath(moldft_path, "/mad.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index a78764010a4..f41ee2faef0 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -6,6 +6,12 @@ #include "response_functions.h" namespace madness { + auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) -> response_matrix { + + auto matrix = response_matrix(num_states); + std::for_each(matrix.begin(), matrix.end(), [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); + return matrix; + } auto to_response_matrix(const X_space &x) -> response_matrix { auto mX = response_matrix(x.num_states()); int b = 0; @@ -21,6 +27,21 @@ namespace madness { return mX; } + auto to_conjugate_response_matrix(const X_space &x) -> response_matrix { + auto mX = response_matrix(x.num_states()); + int b = 0; + auto num_orbitals = x.num_orbitals(); + std::for_each(mX.begin(), mX.end(), [&](auto &mi) { + //auto norm_vi = norm2(world, x_vec); + mi = vector_real_function_3d(2 * num_orbitals); + //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } + std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin()); + std::copy(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals); + b++; + }); + return mX; + } + /** * Flattens all response functions into a single vector of functions * @param x @@ -62,6 +83,29 @@ namespace madness { // if (world.rank() == 0) { print("norms after copy ", norms); } + return x_space; + } + auto to_conjugate_X_space(const response_matrix &x) -> X_space { + + World &world = x[0][0].world(); + + auto num_states = x.size(); + auto num_orbitals = size_t(x[0].size() / 2); + auto x_space = X_space(world, num_states, num_orbitals); + + int b = 0; + std::for_each(x.begin(), x.end(), [&](auto x_vec) { + //auto norm_vi = norm2(world, x_vec); + //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } + std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.Y[b].begin()); + std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.X[b].begin()); + b++; + }); + + // auto norms = x_space.norm2s(); + // if (world.rank() == 0) { print("norms after copy ", norms); } + + return x_space; } diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 0bae7a2c10f..1a598db4d53 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -15,9 +15,12 @@ namespace madness { struct X_space; + auto create_response_matrix(const size_t &num_state, const size_t &num_orbitals) -> response_matrix; auto to_response_matrix(const X_space &x) -> response_matrix; + auto to_conjugate_response_matrix(const X_space &x) -> response_matrix; auto to_flattened_vector(const X_space &x) -> vector_real_function_3d; auto to_X_space(const response_matrix &x) -> X_space; + auto to_conjugate_X_space(const response_matrix &x) -> X_space; struct X_space { private: size_t n_states; // Num. of resp. states @@ -38,10 +41,11 @@ namespace madness { X(A.X), Y(A.Y) {} X_space copy() const { - X_space copyX(X[0][0].world(), n_states, n_orbitals); - copyX.X = X.copy(); - copyX.Y = Y.copy(); - return copyX; + auto &world = X[0][0].world(); + auto m = to_response_matrix(*this); + auto copy_m = create_response_matrix(num_states(), num_orbitals()); + std::transform(m.begin(), m.end(), copy_m.begin(), [&](const auto &mi) { return madness::copy(world, mi, true); }); + return to_X_space(copy_m); } /// Create a new copy of the function with different distribution and optional /// fence @@ -51,10 +55,11 @@ namespace madness { /// collective. auto copy(const std::shared_ptr>> &pmap, bool fence = false) const -> X_space { - X_space copyX(X[0][0].world(), n_states, n_orbitals); - copyX.X = X.copy(pmap, fence); - copyX.Y = Y.copy(pmap, fence); - return copyX; + auto &world = X[0][0].world(); + auto m = to_response_matrix(*this); + auto copy_m = create_response_matrix(num_states(), num_orbitals()); + std::transform(m.begin(), m.end(), copy_m.begin(), [&](const auto &mi) { return madness::copy(world, mi, pmap, true); }); + return to_X_space(copy_m); } // assignment auto operator=(const X_space &B) -> X_space & { @@ -353,7 +358,7 @@ namespace madness { n_orbtials(n_orbtials) {} // overloading the default constructor () operator vector_real_function_3d operator()() { - print("allocator called with ", int(n_orbtials), " orbitals"); + //print("allocator called with ", int(n_orbtials), " orbitals"); // returning constructor of x_vector return zero_functions(world, n_orbtials); } From 96ab0cf0bbadce536d4e99023dc9fc445f3d1406 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 11:52:21 -0400 Subject: [PATCH 0294/1312] not sure waht is going on with the param.prefix but back to moldft --- src/apps/molresponse/response_parameters.h | 2 +- src/apps/molresponse/testing/runners.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index b4b81749e1c..2a497103766 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -25,7 +25,7 @@ namespace madness { ResponseParameters(const ResponseParameters& other) = default; ResponseParameters() { - initialize("archive", "../mad.restartdata", + initialize("archive", "../moldft.restartdata", "file to read ground parameters from"); initialize("nwchem", false, "Using nwchem files for intelligent starting guess"); initialize("nwchem_dir", "none", diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2086a0f4670..36db655f29d 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -124,8 +124,8 @@ struct moldftSchema { xc(m_xc) { moldft_path = addPath(schema.xc_path, '/' + mol_name); - moldft_restart = addPath(moldft_path, "/mad.restartdata.00000"); - calc_info_json_path = addPath(moldft_path, "/mad.calc_info.json"); + moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); + calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); From efd197cda1673b67284340442be3a21e805b6bba Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 15:27:07 -0400 Subject: [PATCH 0295/1312] Add a to respone vector function --- src/apps/molresponse/x_space.cc | 8 ++++++++ src/apps/molresponse/x_space.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index f41ee2faef0..38644836494 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -6,6 +6,14 @@ #include "response_functions.h" namespace madness { + auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d { + auto &world = vec[0].world(); + // copy the vector + auto response_vector = copy(world, vec); + // copy the vector + std::for_each(vec.begin(), vec.end(), [&](const auto &phi0_i) { response_vector.push_back(madness::copy(phi0_i)); }); + return response_vector; + } auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) -> response_matrix { auto matrix = response_matrix(num_states); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 1a598db4d53..3372c350197 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -15,6 +15,8 @@ namespace madness { struct X_space; + + auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d; auto create_response_matrix(const size_t &num_state, const size_t &num_orbitals) -> response_matrix; auto to_response_matrix(const X_space &x) -> response_matrix; auto to_conjugate_response_matrix(const X_space &x) -> response_matrix; From 635a73f558aa6c4b079cf3301623fe17113066c7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 15:27:55 -0400 Subject: [PATCH 0296/1312] using to response vector function in exchange and create density --- src/apps/molresponse/ResponseBase.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index a371e14c47a..49bb0742eb8 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -278,12 +278,17 @@ auto ResponseBase::make_xc_operator(World &world) const -> XCOperator auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfuncT { - vecfuncT density; + auto density = vector_real_function_3d(chi.num_states()); auto calc_type = r_params.calc_type(); - if (calc_type == "full") { - density = transition_density(world, ground_orbitals, chi.X, chi.Y); - } else if (calc_type == "static") { - density = transition_density(world, ground_orbitals, chi.X, chi.X); + if (calc_type == "full" || "static") { + + auto r_matrix = to_response_matrix(chi); + auto r_phi0 = to_response_vector(ground_orbitals); + + std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), [&](const auto &ri) { + return dot(world, ri, r_phi0); + }); + } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } @@ -508,8 +513,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto conjugate_exchange_response = create_response_matrix(m, 2 * n); world.gop.fence(); - auto phi0_response = copy(world, phi0); - std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi0_i) { phi0_response.push_back(madness::copy(phi0_i)); }); + auto phi0_response = to_response_vector(phi0); std::transform(xy.begin(), xy.end(), exchange_response.begin(), [&](const auto &x) { return newK(x, phi0_response, phi0_response); }); world.gop.fence(); std::transform(yx.begin(), yx.end(), conjugate_exchange_response.begin(), [&](const auto &conj_x) { return newK(phi0_response, conj_x, phi0_response); }); @@ -1649,6 +1653,7 @@ auto solid_harmonics(World &world, int n) -> std::map, real_fun return result; } + vector_real_function_3d transition_density(World &world, const vector_real_function_3d &orbitals, const response_space &x, const response_space &y) { // Get sizes From e5dc027c90f1ce38e0a0078d3b45fd2b253a2ab6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 16:21:16 -0400 Subject: [PATCH 0297/1312] Improving convergence --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9248482623d..03f9c6925cc 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -20,7 +20,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(5 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(50 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 3d5cdbc97ae1ac77bf61c679f01672983f88a977 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 17:44:09 -0400 Subject: [PATCH 0298/1312] Back to regular exchange --- src/apps/molresponse/ResponseBase.cpp | 32 ++++++++++++++++----------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 49bb0742eb8..d5e571997cd 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -505,22 +505,31 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + /* auto xy = to_response_matrix(d_alpha); auto yx = to_conjugate_response_matrix(d_alpha); - auto exchange_response = create_response_matrix(m, 2 * n); auto conjugate_exchange_response = create_response_matrix(m, 2 * n); + auto full_exchange = create_response_matrix(m, 2 * n); world.gop.fence(); auto phi0_response = to_response_vector(phi0); - std::transform(xy.begin(), xy.end(), exchange_response.begin(), [&](const auto &x) { return newK(x, phi0_response, phi0_response); }); + std::transform(xy.begin(), xy.end(), exchange_response.begin(), [&](const auto &xy_i) { return newK(xy_i, phi0_response, phi0_response); }); world.gop.fence(); std::transform(yx.begin(), yx.end(), conjugate_exchange_response.begin(), [&](const auto &conj_x) { return newK(phi0_response, conj_x, phi0_response); }); + world.gop.fence(); + + + std::transform(exchange_response.begin(), exchange_response.end(), conjugate_exchange_response.begin(), full_exchange.begin(), [&](const auto &kxi, const auto &kyi) { + return add(world, kxi, kyi); + }); + + auto K = to_X_space(full_exchange); +*/ + world.gop.fence(); + - auto kx = to_X_space(exchange_response); - auto ky = to_X_space(conjugate_exchange_response); - /* for (size_t b = 0; b < m; b++) { vecfuncT x, y; x = d_alpha.X[b]; @@ -533,10 +542,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit KY.Y[b] = newK(y, phi0, phi0); // |i> } - */ - world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -554,7 +561,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit W.truncate(); */ - gamma = (2 * J) - (kx + ky) * xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); @@ -576,9 +583,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); print_inner(world, "xJx", d_alpha, J); - print_inner(world, "xKXx", d_alpha, kx); - print_inner(world, "xKYx", d_alpha, ky); - X_space K = kx + ky; + print_inner(world, "xKXx", d_alpha, KX); + print_inner(world, "xKYx", d_alpha, KY); + X_space K = KX + KY; + print_inner(world, "xKx", d_alpha, K); world.gop.fence(); print_inner(world, "xWx", d_alpha, W); print_inner(world, "xGammax", d_alpha, gamma); @@ -595,8 +603,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit j_y.clear(); KX.clear(); KY.clear(); - kx.clear(); - ky.clear(); W.clear(); d_alpha.clear(); From 1a87f1f527f860ebc26e7bc1315145510dafa19b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 18:18:56 -0400 Subject: [PATCH 0299/1312] adding some fences in exchange --- src/apps/molresponse/ResponseBase.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d5e571997cd..581b151e2ed 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -362,6 +362,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, // world.mpi.Barrier(); bool compute_Y = calc_type == "full"; X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); + world.gop.fence(); // std::cout << "MPI BARRIER 4 " << std::endl; // world.mpi.Barrier(); @@ -482,6 +483,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // TODO is copy better than adding? probably? // J.Y=j_x+j_y; J.Y = J.X.copy(); + world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); @@ -527,7 +529,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto K = to_X_space(full_exchange); */ - world.gop.fence(); for (size_t b = 0; b < m; b++) { @@ -536,10 +537,15 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit y = d_alpha.Y[b]; // |x> KY.X[b] = newK(phi0, y, phi0); + world.gop.fence(); + KX.Y[b] = newK(phi0, x, phi0); + world.gop.fence(); KX.Y[b] = newK(phi0, x, phi0); // |y> KX.X[b] = newK(x, phi0, phi0); + world.gop.fence(); KY.Y[b] = newK(y, phi0, phi0); + world.gop.fence(); // |i> } @@ -1027,12 +1033,14 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< X_space Chi_copy = X; vecfuncT phi0_copy = madness::copy(world, ground_orbitals); + world.gop.fence(); Chi_copy.truncate(); //Chi_copy.truncate(); truncate(world, phi0_copy); // v_nuc first real_function_3d v_nuc, v_j0, v_k0, v_xc; + world.gop.fence(); if (not r_params.store_potential()) { v_nuc = potential_manager->vnuclear(); From 3b6e2d2149d52e4ef35f575221a22ba3c88d75f8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 18 Sep 2022 13:27:58 -0400 Subject: [PATCH 0300/1312] exchange uses a copy of phi0 with phi0 --- src/apps/molresponse/ResponseBase.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 581b151e2ed..362e0a92a8c 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -530,21 +530,23 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto K = to_X_space(full_exchange); */ + auto phi0_c = ::madness::copy(world, phi0); for (size_t b = 0; b < m; b++) { vecfuncT x, y; x = d_alpha.X[b]; y = d_alpha.Y[b]; + world.gop.fence(); // |x> - KY.X[b] = newK(phi0, y, phi0); + KY.X[b] = newK(phi0, y, phi0_c); world.gop.fence(); - KX.Y[b] = newK(phi0, x, phi0); + KX.Y[b] = newK(phi0, x, phi0_c); world.gop.fence(); - KX.Y[b] = newK(phi0, x, phi0); + KX.Y[b] = newK(phi0, x, phi0_c); // |y> - KX.X[b] = newK(x, phi0, phi0); + KX.X[b] = newK(x, phi0, phi0_c); world.gop.fence(); - KY.Y[b] = newK(y, phi0, phi0); + KY.Y[b] = newK(y, phi0, phi0_c); world.gop.fence(); // |i> } From 8f4f16d55f4f828df8ea7d68fb38fb8d9a02d4de Mon Sep 17 00:00:00 2001 From: fbischoff Date: Mon, 19 Sep 2022 17:08:26 +0200 Subject: [PATCH 0301/1312] make tests work again --- src/madness/chem/MolecularOrbitals.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/madness/chem/MolecularOrbitals.h b/src/madness/chem/MolecularOrbitals.h index d39d845222c..173239ee989 100644 --- a/src/madness/chem/MolecularOrbitals.h +++ b/src/madness/chem/MolecularOrbitals.h @@ -245,13 +245,13 @@ class MolecularOrbitals : public archive::ParallelSerializableObject { unsigned int version = 2; // UPDATE THIS IF YOU CHANGE ANYTHING unsigned int archive_version; double current_energy; - std::string xc; + std::string xc, localize_method; archive::ParallelInputArchive ar(world, filename.c_str()); ar & version; ar & current_energy & spinrestricted; - ar & L& k1& molecule& xc; + ar & L& k1& molecule& xc & localize_method; MolecularOrbitals amo, bmo; amo.load_mos(ar, molecule, nmo_alpha); From 425d82ebc207d72b420a6464e0a1f07f626b0c62 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 20 Sep 2022 08:34:24 -0400 Subject: [PATCH 0302/1312] new vtk plotting for molresponse --- src/apps/molresponse/FrequencyResponse.cpp | 5 - src/apps/molresponse/Plot_VTK.cc | 622 +++++++++++++-------- src/apps/molresponse/Plot_VTK.h | 45 +- src/apps/molresponse/response_parameters.h | 2 +- 4 files changed, 419 insertions(+), 255 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 03f9c6925cc..a0c953d2ba0 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -172,11 +172,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.plot_all_orbitals()) { plotResponseOrbitals(world, iter, Chi.X, Chi.Y, r_params, ground_calc); } - if (r_params.plot()) { - auto rho0 = make_ground_density(world); - do_vtk_plots(world, 200, r_params.L(), molecule, rho0, rho_omega, - ground_orbitals, Chi); - } break; } } diff --git a/src/apps/molresponse/Plot_VTK.cc b/src/apps/molresponse/Plot_VTK.cc index b6e6d4088c7..109972315bc 100644 --- a/src/apps/molresponse/Plot_VTK.cc +++ b/src/apps/molresponse/Plot_VTK.cc @@ -22,235 +22,399 @@ #include "../chem/molecule.h" namespace madness { -void do_vtk_plots(World &world, - int npt_plot, - double L, - int plotlo, - int plothi, - Molecule molecule, - std::vector densities, - std::string name) { - // Stuff needed to plot - // - std::string vtk_dir = "vtk_plots"; - std::filesystem::create_directories(vtk_dir); - - std::string geo_file; - const char *filename; - Vector points{npt_plot, npt_plot, npt_plot}; - - // Plot the whole box? - Vector box_lo{-L, -L, -L}; - Vector box_hi{L, L, L}; - - // Write an .xyz file with current geometry (to deal with molecular - // reorientations that might occur) - FILE *f = 0; - geo_file = vtk_dir + "/geometry.xyz"; - - f = fopen(geo_file.c_str(), "w"); - - // Write the header - fprintf(f, "%zu", molecule.natom()); - fprintf(f, "\n\n"); - - // Get the data - std::vector> coords = molecule.get_all_coords_vec(); - - // Write the data - size_t Natoms = molecule.natom(); - for (size_t i = 0; i < Natoms; i++) { - std::fprintf(f, - "%5s %16.12f %16.12f %16.12f\n", - atomic_number_to_symbol(molecule.get_atomic_number(i)).c_str(), - coords[i][0], - coords[i][1], - coords[i][2]); - } - - // Clean up - fclose(f); - - std::string response_file; - // Needed to plot the full electron density - real_function_3d rho = real_factory_3d(world); - - // Plot each orbital requested - for (int i = plotlo; i < plothi; i++) { - // Add to total - rho += densities[i]; - - // Create filename in such a way that visit associates them together - response_file = vtk_dir + "/" + name + std::to_string(i) + ".vts"; - filename = response_file.c_str(); - - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(densities[i], - "electrondensity", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); - } - std::string b; - - // Plot the full density - b = vtk_dir + "/" + "total-electrondensity.vts"; - filename = b.c_str(); - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(rho, - "total-electrondensity", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); -} -void do_vtk_plots(World &world, - int npt_plot, - double L, - Molecule molecule, - real_function_3d &rho_0, - std::vector &rho_omega, - std::vector &ground_orbitals, - X_space &Chi) { - std::string vtk_dir = "vtk_plots"; - std::filesystem::create_directories(vtk_dir); - std::string geo_file; - const char *filename; - Vector points{npt_plot, npt_plot, npt_plot}; - // Plot the whole box? - Vector box_lo{-L, -L, -L}; - Vector box_hi{L, L, L}; - // Write an .xyz file with current geometry (to deal with molecular - // reorientations that might occur) - FILE *f = 0; - geo_file = vtk_dir + "/geometry.xyz"; - - f = fopen(geo_file.c_str(), "w"); - // Write the header - fprintf(f, "%zu", molecule.natom()); - fprintf(f, "\n\n"); - // Get the data - std::vector> coords = molecule.get_all_coords_vec(); - // Write the data - size_t Natoms = molecule.natom(); - for (size_t i = 0; i < Natoms; i++) { - std::fprintf(f, - "%5s %16.12f %16.12f %16.12f\n", - atomic_number_to_symbol(molecule.get_atomic_number(i)).c_str(), - coords[i][0], - coords[i][1], - coords[i][2]); - } - // Clean up - fclose(f); - std::string rho0_file = "rho_0.vts"; - filename = rho0_file.c_str(); - - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(rho_0, - "ground_density", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); - // ground orbitals - std::string g_orb_file = "phi_"; - std::string fname; - for (size_t i = 0; i < Chi.num_orbitals(); ++i) { - fname = vtk_dir + "/" + g_orb_file + std::to_string(i) + ".vts"; - filename = fname.c_str(); - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(ground_orbitals[i], - "ground_orbital", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); - } - - std::string x_orb_file = "x_"; - for (size_t i = 0; i < Chi.num_states(); ++i) { - for (size_t j = 0; j < Chi.num_orbitals(); ++j) { - fname = vtk_dir + "/" + x_orb_file + std::to_string(i) + "_" + - std::to_string(j) + ".vts"; - filename = fname.c_str(); - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(Chi.X[i][j], - "x_orbitals", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); + void write_molecules_to_file(const Molecule &molecule, const std::string &geo_file) { + + + FILE *f = nullptr; + f = fopen(geo_file.c_str(), "w"); + // Write the header + fprintf(f, "%zu", molecule.natom()); + fprintf(f, "\n\n"); + // Get the data + auto coords = molecule.get_all_coords_vec(); + + // Write the data + size_t Natoms = molecule.natom(); + for (size_t i = 0; i < Natoms; i++) { + std::fprintf(f, + "%5s %16.12f %16.12f %16.12f\n", + atomic_number_to_symbol(molecule.get_atomic_number(i)).c_str(), + coords[i][0], + coords[i][1], + coords[i][2]); + } + + // Clean up + fclose(f); } - } - std::string y_orb_file = "y_"; - for (size_t i = 0; i < Chi.num_states(); ++i) { - for (size_t j = 0; j < Chi.num_orbitals(); ++j) { - fname = vtk_dir + "/" + y_orb_file + std::to_string(i) + "_" + - std::to_string(j) + ".vts"; - filename = fname.c_str(); - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(Chi.Y[i][j], - "y_orbitals", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); + void do_response_orbital_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const vector_real_function_3d &ground_orbs, const response_matrix &responseMatrix) { + // Stuff needed to plot + // + Vector box_lo{-L/4, -L/4, -L/4}; + Vector box_hi{L/4, L/4, L/4}; + + + std::string vtk_dir = "vtk_plots"; + std::filesystem::create_directories(vtk_dir); + + std::string geo_file; + const char *filename; + + Vector points{npt_plot, npt_plot, npt_plot}; + // Plot the whole box? + + // Write an .xyz file with current geometry (to deal with molecular + // reorientations that might occur) + FILE *f = nullptr; + geo_file = vtk_dir + "/geometry.xyz"; + write_molecules_to_file(molecule, geo_file); + + + std::string response_file; + // Needed to plot the full electron density + real_function_3d rho = real_factory_3d(world); + + int orb_num = 0; + + std::for_each(ground_orbs.begin(), ground_orbs.end(), [&](const auto &phi0_i) { + auto orb_file = vtk_dir + "/phi0_" + std::to_string(orb_num) + ".vts"; + filename = orb_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(phi0_i, + "ground_orbtial", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + orb_num++; + }); + + + auto state_number = 0; + std::for_each(responseMatrix.begin(), responseMatrix.end(), [&](const auto &xy) { + auto num_orbitals = xy.size() / 2; + // plot the x first + auto orb_num = 0; + std::for_each(xy.begin(), xy.begin() + num_orbitals, [&](const auto &xi) { + auto orb_file = vtk_dir + "/" + "x" + std::to_string(state_number) + std::to_string(orb_num) + ".vts"; + filename = orb_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(xi, + "response_x_orbitals", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + orb_num++; + }); + orb_num = 0; + std::for_each(xy.begin() + num_orbitals, xy.end(), [&](const auto &yi) { + auto orb_file = vtk_dir + "/" + "y" + std::to_string(state_number) + std::to_string(orb_num) + ".vts"; + filename = orb_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(yi, + "response_y_orbitals", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + orb_num++; + }); + state_number++; + }); } - } - - std::string rho_1_file = "rho_1_"; - for (size_t i = 0; i < Chi.num_states(); ++i) { - fname = vtk_dir + "/" + rho_1_file + std::to_string(i) + ".vts"; - filename = fname.c_str(); - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(rho_omega[i], - "transition_density", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); - } - - // - // - // - // - // -} -} // namespace madness + void do_response_density_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const real_function_3d &ground_density, const vector_real_function_3d &response_density) { + // Stuff needed to plot + // + Vector box_lo{-L/4, -L/4, -L/4}; + Vector box_hi{L/4, L/4, L/4}; + + + std::string vtk_dir = "vtk_plots"; + std::filesystem::create_directories(vtk_dir); + + std::string geo_file; + const char *filename; + + Vector points{npt_plot, npt_plot, npt_plot}; + + std::string response_file; + //***********************************ground density plot + auto density_file = vtk_dir + "/" + "rho0.vts"; + filename = density_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(ground_density, + "ground_density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + //***********************************ground density plot + int state_number = 0; + std::for_each(response_density.begin(), response_density.end(), [&](const auto &rho_i) { + auto density_file = vtk_dir + "/" + "response_rho_" + std::to_string(state_number) + ".vts"; + filename = density_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(rho_i, + "response_density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + auto total_density_i = ground_density + rho_i; + auto total_density_file = vtk_dir + "/" + "total-rho_" + std::to_string(state_number) + ".vts"; + filename = total_density_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(total_density_i, + "total_density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + state_number++; + }); + } + void do_vtk_plots(World &world, + int npt_plot, + double L, + int lowest_orbital, + int highest_orbital, + const Molecule &molecule, + std::vector densities, + const std::string &name) { + // Stuff needed to plot + // + Vector box_lo{-L, -L, -L}; + Vector box_hi{L, L, L}; + + + std::string vtk_dir = "vtk_plots"; + std::filesystem::create_directories(vtk_dir); + + std::string geo_file; + const char *filename; + + Vector points{npt_plot, npt_plot, npt_plot}; + // Plot the whole box? + + // Write an .xyz file with current geometry (to deal with molecular + // reorientations that might occur) + FILE *f = nullptr; + + std::string response_file; + // Needed to plot the full electron density + real_function_3d rho = real_factory_3d(world); + + // Plot each orbital requested + for (int i = lowest_orbital; i < highest_orbital; i++) { + // Add to total + rho += densities[i]; + + // Create filename in such a way that visit associates them together + response_file = vtk_dir + "/" + name + std::to_string(i) + ".vts"; + filename = response_file.c_str(); + + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + + // function + // field anem + // world + // file name + // plot lo + // plot hi + // npts + // binary + // plot refile + plotvtk_data(densities[i], + "density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + std::string b; + + // Plot the full density + b = vtk_dir + "/" + "total-electrondensity.vts"; + filename = b.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(rho, + "total-electrondensity", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + void do_vtk_plots(World &world, + int npt_plot, + double L, + Molecule molecule, + real_function_3d &rho_0, + std::vector &rho_omega, + std::vector &ground_orbitals, + X_space &Chi) { + std::string vtk_dir = "vtk_plots"; + std::filesystem::create_directories(vtk_dir); + std::string geo_file; + const char *filename; + Vector points{npt_plot, npt_plot, npt_plot}; + // Plot the whole box? + Vector box_lo{-L, -L, -L}; + Vector box_hi{L, L, L}; + // Write an .xyz file with current geometry (to deal with molecular + // reorientations that might occur) + FILE *f = 0; + geo_file = vtk_dir + "/geometry.xyz"; + + f = fopen(geo_file.c_str(), "w"); + // Write the header + fprintf(f, "%zu", molecule.natom()); + fprintf(f, "\n\n"); + // Get the data + std::vector> coords = molecule.get_all_coords_vec(); + // Write the data + size_t Natoms = molecule.natom(); + for (size_t i = 0; i < Natoms; i++) { + std::fprintf(f, + "%5s %16.12f %16.12f %16.12f\n", + atomic_number_to_symbol(molecule.get_atomic_number(i)).c_str(), + coords[i][0], + coords[i][1], + coords[i][2]); + } + // Clean up + fclose(f); + std::string rho0_file = "rho_0.vts"; + filename = rho0_file.c_str(); + + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(rho_0, + "ground_density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + // ground orbitals + std::string g_orb_file = "phi_"; + std::string fname; + for (size_t i = 0; i < Chi.num_orbitals(); ++i) { + fname = vtk_dir + "/" + g_orb_file + std::to_string(i) + ".vts"; + filename = fname.c_str(); + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(ground_orbitals[i], + "ground_orbital", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + + std::string x_orb_file = "x_"; + for (size_t i = 0; i < Chi.num_states(); ++i) { + for (size_t j = 0; j < Chi.num_orbitals(); ++j) { + fname = vtk_dir + "/" + x_orb_file + std::to_string(i) + "_" + + std::to_string(j) + ".vts"; + filename = fname.c_str(); + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(Chi.X[i][j], + "x_orbitals", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + } + std::string y_orb_file = "y_"; + for (size_t i = 0; i < Chi.num_states(); ++i) { + for (size_t j = 0; j < Chi.num_orbitals(); ++j) { + fname = vtk_dir + "/" + y_orb_file + std::to_string(i) + "_" + + std::to_string(j) + ".vts"; + filename = fname.c_str(); + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(Chi.Y[i][j], + "y_orbitals", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + } + + std::string rho_1_file = "rho_1_"; + for (size_t i = 0; i < Chi.num_states(); ++i) { + fname = vtk_dir + "/" + rho_1_file + std::to_string(i) + ".vts"; + filename = fname.c_str(); + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(rho_omega[i], + "transition_density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + + // + // + // + // + // + } +}// namespace madness diff --git a/src/apps/molresponse/Plot_VTK.h b/src/apps/molresponse/Plot_VTK.h index c0b53f0cd4a..fe2fdba2be6 100644 --- a/src/apps/molresponse/Plot_VTK.h +++ b/src/apps/molresponse/Plot_VTK.h @@ -23,25 +23,30 @@ #include "../chem/molecule.h" #include "x_space.h" namespace madness { -void do_vtk_plots(World &world, - int npt_plot, - double L, - int plotlo, - int plothi, - Molecule molecule, - std::vector densities, - std::string name); - -void do_vtk_plots(World &world, - int npt_plot, - double L, - Molecule molecule, - real_function_3d &rho_0, - std::vector &rho_omega, - std::vector &ground_orbitals, - X_space &Chi); - -} // namespace madness -#endif // SRC_APPS_molresponse_PLOT_VTK_H_ + + void write_molecules_to_file(const Molecule &molecule, const std::string &geo_file); + void do_response_orbital_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const vector_real_function_3d &ground_orbs, const response_matrix &responseMatrix); + void do_response_density_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const real_function_3d &ground_density, const vector_real_function_3d &response_density); + + void do_vtk_plots(World &world, + int npt_plot, + double L, + int lowest_orbital, + int highest_orbital, + const Molecule &molecule, + std::vector densities, + const std::string &name); + + void do_vtk_plots(World &world, + int npt_plot, + double L, + Molecule molecule, + real_function_3d &rho_0, + std::vector &rho_omega, + std::vector &ground_orbitals, + X_space &Chi); + +}// namespace madness +#endif// SRC_APPS_molresponse_PLOT_VTK_H_ // Dueces diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index 2a497103766..8046a4c11f4 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -43,7 +43,7 @@ namespace madness { "lo-hi plot cell (default is all space)"); initialize("core_type", "none", "core potential type", {"none", "mpc"}); initialize("plot_l", -1.0, "Controls the plotting box size"); - initialize("plot_pts", 201, "Controls number of points in plots"); + initialize("plot_pts",51, "Controls number of points in plots"); initialize("plot_all_orbitals", false, "Turn on 2D plotting of response orbitals "); initialize("maxiter", 25, "maximum number of iterations"); From f2812a021df3c108e10da7bf51bae08143ae0aa5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Sep 2022 08:15:27 -0400 Subject: [PATCH 0303/1312] Trying Multiworld efficient --- src/apps/molresponse/global_functions.cc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index cf47058b150..2ae7251bd0a 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -73,16 +73,11 @@ auto T(World &world, response_space &f) -> response_space { // compute exchange |i> auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfuncT { World &world = ket[0].world(); - int n = bra.size(); - int nf = ket.size(); - - double tol = FunctionDefaults<3>::get_thresh();/// Important this is - double mul_tol = 1e-7; const double lo = 1.e-10; Exchange op{}; op.set_parameters(bra, ket, lo); - op.set_algorithm(op.small_memory); + op.set_algorithm(op.multiworld_efficient); return op(vf); } // sum_i |i> for each p \ No newline at end of file From 54c37b5ff04f438f5ce2f8683a1c9ea8a64eaabc Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Sep 2022 08:15:42 -0400 Subject: [PATCH 0304/1312] fence after += --- src/apps/molresponse/response_functions.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index afa5c34269d..34775d7515f 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -261,6 +261,7 @@ namespace madness { MADNESS_ASSERT(same_size(*this, b)); World &world = x[0][0].world(); for (size_t i = 0; i < num_states; i++) { this->x[i] = add(world, this->x[i], b[i]); } + world.gop.fence(); return *this; } From 2e74557f04205c678d90d8df126b6ff3bc654ad6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Sep 2022 08:16:02 -0400 Subject: [PATCH 0305/1312] clean up compute gamma --- src/apps/molresponse/ResponseBase.cpp | 100 +++++++++++--------------- 1 file changed, 43 insertions(+), 57 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 362e0a92a8c..41f319f1167 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -424,20 +424,16 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit const XCOperator &xc) const -> X_space { std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); - auto [d_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); - - size_t num_states = d_alpha.num_states(); - size_t num_orbitals = d_alpha.num_orbitals(); + auto [chi_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); - size_t m = d_alpha.num_states(); - size_t n = d_alpha.num_orbitals(); - // copy old pmap + size_t num_states = chi_alpha.num_states(); + size_t num_orbitals = chi_alpha.num_orbitals(); - truncate(world, phi0); - d_alpha.truncate(); + //truncate(world, phi0); + //// chi_alpha.truncate(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space gamma(world, m, n); + // x functions // Two ways single vector or vector vector style // here I create the orbital products for elctron interaction terms @@ -446,13 +442,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit vecfuncT y_phi; functionT temp_J; - X_space J(world, m, n); - response_space j_x(world, m, n); - response_space j_y(world, m, n); + X_space J(world, num_states, num_orbitals); + response_space j_x(world, num_states, num_orbitals); + response_space j_y(world, num_states, num_orbitals); - X_space W = X_space::zero_functions(world, m, n); - X_space KX = X_space::zero_functions(world, m, n); - X_space KY = X_space::zero_functions(world, m, n); + X_space W = X_space::zero_functions(world, num_states, num_orbitals); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } @@ -463,21 +457,22 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit functionT rho_x_b; functionT rho_y_b; + auto mul_tol = FunctionDefaults<3>::get_thresh(); // note that x can refer to x or y - auto compute_j = [&, &phi0 = phi0](auto dx) { + auto compute_j = [&, &phi0 = phi0](const auto &dx) { // compute density with response function dx and orbitals phi0 auto rho_x_b = dot(world, dx, phi0); rho_x_b.truncate(); // apply the coulomb operator to rho_b rho_x_b = apply(*shared_coulomb_operator, rho_x_b); - return mul(world, rho_x_b, phi0); + return mul_sparse(world, rho_x_b, phi0, mul_tol, true); }; // compute j_x = op(rho_x)*phi0 - std::transform(d_alpha.X.begin(), d_alpha.X.end(), j_x.begin(), compute_j); + std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); // compute j_y = op(rho_y)*phi0 - std::transform(d_alpha.Y.begin(), d_alpha.Y.end(), j_y.begin(), compute_j); + std::transform(chi_alpha.Y.begin(), chi_alpha.Y.end(), j_y.begin(), compute_j); J.X = j_x + j_y; // TODO is copy better than adding? probably? @@ -491,7 +486,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { - auto rho = transition_density(world, phi0, d_alpha.X, d_alpha.X); + auto rho = transition_density(world, phi0, chi_alpha.X, chi_alpha.X); auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { auto xc_rho = xc.apply_xc_kernel(rho_alpha); return mul(world, xc_rho, phi0); @@ -508,8 +503,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit /* - auto xy = to_response_matrix(d_alpha); - auto yx = to_conjugate_response_matrix(d_alpha); + auto xy = to_response_matrix(chi_alpha); + auto yx = to_conjugate_response_matrix(chi_alpha); auto exchange_response = create_response_matrix(m, 2 * n); auto conjugate_exchange_response = create_response_matrix(m, 2 * n); @@ -530,12 +525,13 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto K = to_X_space(full_exchange); */ + X_space KX = X_space::zero_functions(world, num_states, num_orbitals); + X_space KY = X_space::zero_functions(world, num_states, num_orbitals); auto phi0_c = ::madness::copy(world, phi0); - - for (size_t b = 0; b < m; b++) { - vecfuncT x, y; - x = d_alpha.X[b]; - y = d_alpha.Y[b]; + vecfuncT x, y; + for (size_t b = 0; b < num_states; b++) { + x = chi_alpha.X[b]; + y = chi_alpha.Y[b]; world.gop.fence(); // |x> KY.X[b] = newK(phi0, y, phi0_c); @@ -569,6 +565,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit W.truncate(); */ + X_space gamma(world, num_states, num_orbitals); gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; //gamma.truncate(); if (r_params.print_level() >= 1) { @@ -578,7 +575,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, phi0); - for (size_t i = 0; i < m; i++) { + for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); gamma.Y[i] = projector(gamma.Y[i]); } @@ -590,14 +587,14 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); - print_inner(world, "xJx", d_alpha, J); - print_inner(world, "xKXx", d_alpha, KX); - print_inner(world, "xKYx", d_alpha, KY); + print_inner(world, "xJx", chi_alpha, J); + print_inner(world, "xKXx", chi_alpha, KX); + print_inner(world, "xKYx", chi_alpha, KY); X_space K = KX + KY; - print_inner(world, "xKx", d_alpha, K); + print_inner(world, "xKx", chi_alpha, K); world.gop.fence(); - print_inner(world, "xWx", d_alpha, W); - print_inner(world, "xGammax", d_alpha, gamma); + print_inner(world, "xWx", chi_alpha, W); + print_inner(world, "xGammax", chi_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); } // put @@ -613,7 +610,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit KY.clear(); W.clear(); - d_alpha.clear(); + chi_alpha.clear(); phi0.clear(); if (world.size() > 1) { @@ -1082,30 +1079,13 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto k = [&](const vector_real_function_3d &xi) { - world.gop.fence(); - return newK(phi0_copy, phi0_copy, xi); - }; - - world.gop.fence(); - // If including any exact HF exchange - /* - if (xcf.hf_exchange_coefficient() != 0.0) { - std::transform(Chi_copy.X.begin(), Chi_copy.X.end(), K0.X.begin(), k); - if (compute_Y) { - std::transform(Chi_copy.Y.begin(), Chi_copy.Y.end(), K0.Y.begin(), k); - } else { - K0.Y = K0.X.copy(); - world.gop.fence(); - } - } - */ + auto phi0_c = copy(world, phi0_copy); int b = 0; - for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_copy, Chi_copy.X[b++]); } + for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } if (compute_Y) { b = 0; - for (auto &k0y: K0.Y) { k0y = newK(phi0_copy, phi0_copy, Chi_copy.Y[b++]); } + for (auto &k0y: K0.Y) { k0y = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); } } else { K0.Y = K0.X.copy(); } @@ -1120,7 +1100,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< //v0.truncate(FunctionDefaults<3>::get_thresh(), true); V0.X = v0 * X.X; - V0.X += (-1 * K0.X * xcf.hf_exchange_coefficient()); + V0.X += -1 * K0.X * xcf.hf_exchange_coefficient(); if (compute_Y) { V0.Y = v0 * X.Y; @@ -1505,6 +1485,12 @@ void ResponseBase::solve(World &world) { } // At this point we should know if calc converged maybe add a flag to response.json which states if it has converged_to_json(j_molresponse); + if (r_params.plot()) { + auto r_matrix = to_response_matrix(Chi); + do_response_orbital_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, ground_orbitals, r_matrix); + auto response_densities = make_density(world, Chi); + do_response_density_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, ground_density, response_densities); + } // Plot the response function if desired From 98d66da93e6bdfe4317ceec5711523d65298bb25 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Sep 2022 10:33:57 -0400 Subject: [PATCH 0306/1312] adjust print level --- src/apps/molresponse/testing/response_data_base.hpp | 2 +- src/apps/molresponse/testing/runners.hpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp index 3fd59e1d239..0b2b865ee59 100644 --- a/src/apps/molresponse/testing/response_data_base.hpp +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -115,7 +115,7 @@ auto generate_dipole_frequencies(const std::string &molecule_name, std::string x json dalton_excited; ifs >> dalton_excited; ::print("Read Dalton Excited for ", molecule_name); - ::print(dalton_excited[molecule_name][xc]["excited-state"]["cc-pVTZ"]["response"]["freq"]); + ::print(dalton_excited[molecule_name][xc]["excited-state"]["cc-pVDZ"]["response"]["freq"]); std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] ["cc-pVTZ"]["response"]["freq"]; auto omega_max = freq.at(0); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 36db655f29d..2977740ddb6 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -550,7 +550,8 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); r_params.set_user_defined_value("plot_all_orbitals", false); - r_params.set_user_defined_value("print_level", 20); + r_params.set_user_defined_value("plot", true); + r_params.set_user_defined_value("print_level", 2); r_params.set_user_defined_value("save", true); // set xc, property, frequency,and restart r_params.set_user_defined_value("xc", xc); @@ -704,6 +705,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, world.gop.fence(); // set protocol to the first calc.solve(world); + // TODO Why would I plot the ground state density here if the protocol or k is world.gop.fence(); // set protocol to the first if (world.rank() == 0) { From 34d3b3d834e3c38deffaabf00b7fe8610f1213ce Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 27 Sep 2022 13:00:53 -0400 Subject: [PATCH 0307/1312] resolve linking error with gcc 12 : init routine not generated for RMI::is_server_thread --- src/madness/world/worldrmi.cc | 5 ++++- src/madness/world/worldrmi.h | 9 ++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/madness/world/worldrmi.cc b/src/madness/world/worldrmi.cc index 9d6fe901101..e056e8b65c9 100644 --- a/src/madness/world/worldrmi.cc +++ b/src/madness/world/worldrmi.cc @@ -50,7 +50,10 @@ namespace madness { volatile bool RMI::debugging = false; std::list< std::unique_ptr > RMI::send_req; - thread_local bool RMI::is_server_thread = false; + bool& RMI::is_server_thread_accessor() { + static thread_local bool is_server_thread = false; + return is_server_thread; + } #if HAVE_INTEL_TBB tbb::task* RMI::tbb_rmi_parent_task = nullptr; diff --git a/src/madness/world/worldrmi.h b/src/madness/world/worldrmi.h index 9970ce3b5d7..ea7a7ba11e3 100644 --- a/src/madness/world/worldrmi.h +++ b/src/madness/world/worldrmi.h @@ -148,9 +148,8 @@ namespace madness { typedef uint16_t counterT; typedef uint32_t attrT; - static thread_local bool is_server_thread; //< if true this thread is the server thread - - + /// @return reference to the boolean variable indicating whether this thread is the server thread + static bool& is_server_thread_accessor(); public: @@ -165,8 +164,8 @@ namespace madness { static int testsome_backoff_us; - static void set_this_thread_is_server(bool flag = true) {is_server_thread = flag;} - static bool get_this_thread_is_server() {return is_server_thread;} + static void set_this_thread_is_server(bool flag = true) { is_server_thread_accessor() = flag;} + static bool get_this_thread_is_server() {return is_server_thread_accessor();} static std::list< std::unique_ptr > send_req; // List of outstanding world active messages sent by the server From 306b7831b0161c2a0178aa795ece57fe09ab7caa Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 4 Oct 2022 09:49:20 -0400 Subject: [PATCH 0308/1312] use a basic loop in compute density --- src/apps/molresponse/ResponseBase.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 41f319f1167..e4615b73556 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -253,7 +253,10 @@ auto ResponseBase::make_ground_density(World &world) const -> functionT { compress(world, vsq); functionT rho = factoryT(world); rho.compress(); - for (const auto &phi_squared: vsq) rho.gaxpy(1.0, phi_squared, 1.0, false); + for (unsigned int i = 0; i < vsq.size(); ++i) { + rho.gaxpy(1.0, vsq[i], 1.0, false); + } + //for (const auto &phi_squared: vsq) rho.gaxpy(2.0, phi_squared, 1.0, false); world.gop.fence(); vsq.clear(); return rho; From 968c7c3f609eaa09586c9f6e1439015695a005e6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 4 Oct 2022 09:49:57 -0400 Subject: [PATCH 0309/1312] Change field name to r_density_state number --- src/apps/molresponse/Plot_VTK.cc | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/apps/molresponse/Plot_VTK.cc b/src/apps/molresponse/Plot_VTK.cc index 109972315bc..e32f6115de9 100644 --- a/src/apps/molresponse/Plot_VTK.cc +++ b/src/apps/molresponse/Plot_VTK.cc @@ -50,8 +50,8 @@ namespace madness { void do_response_orbital_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const vector_real_function_3d &ground_orbs, const response_matrix &responseMatrix) { // Stuff needed to plot // - Vector box_lo{-L/4, -L/4, -L/4}; - Vector box_hi{L/4, L/4, L/4}; + Vector box_lo{-L / 4, -L / 4, -L / 4}; + Vector box_hi{L / 4, L / 4, L / 4}; std::string vtk_dir = "vtk_plots"; @@ -138,8 +138,8 @@ namespace madness { void do_response_density_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const real_function_3d &ground_density, const vector_real_function_3d &response_density) { // Stuff needed to plot // - Vector box_lo{-L/4, -L/4, -L/4}; - Vector box_hi{L/4, L/4, L/4}; + Vector box_lo{-L / 4, -L / 4, -L / 4}; + Vector box_hi{L / 4, L / 4, L / 4}; std::string vtk_dir = "vtk_plots"; @@ -171,23 +171,10 @@ namespace madness { std::for_each(response_density.begin(), response_density.end(), [&](const auto &rho_i) { auto density_file = vtk_dir + "/" + "response_rho_" + std::to_string(state_number) + ".vts"; filename = density_file.c_str(); + auto field_name = "r_density_" + std::to_string(state_number); plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); plotvtk_data(rho_i, - "response_density", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); - auto total_density_i = ground_density + rho_i; - auto total_density_file = vtk_dir + "/" + "total-rho_" + std::to_string(state_number) + ".vts"; - filename = total_density_file.c_str(); - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(total_density_i, - "total_density", + field_name.c_str(), world, filename, box_lo, From 0e5df5fb8e3473b677b3e3d80cd7039a5744f3ba Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Oct 2022 11:44:51 -0400 Subject: [PATCH 0310/1312] Update printing for calculation init --- src/apps/molresponse/global_functions.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 2ae7251bd0a..dfb6088fdc1 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -44,11 +44,15 @@ auto initialize_calc_params(World &world, const std::string &input_file) -> Calc parser.set_keyval("input", input_file); r_params.read_input_and_commandline_options(world, parser, "response"); GroundStateCalculation ground_calculation{world, r_params.archive()}; - ground_calculation.print_params(); + if (world.rank() == 0) { + ground_calculation.print_params(); + } Molecule molecule = ground_calculation.molecule(); r_params.set_ground_state_calculation_data(ground_calculation); r_params.set_derived_values(world, molecule); - r_params.print(); + if(world.rank()==0){ + r_params.print(); + } return {ground_calculation, molecule, r_params}; } // TODO some operator definitions that I will need to move to a separate file From 8e87c8f973b7d8711317269f10a607252f7febce Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Oct 2022 15:33:26 -0400 Subject: [PATCH 0311/1312] frequency response --- src/apps/molresponse/ResponseBase.cpp | 7 ++++--- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index e4615b73556..be6617260f2 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -712,6 +712,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // for every transition gammaOrbitals apply the exchange kernel and multiply the // vector of orbitals std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); + W.Y = W.X.copy(); if (r_params.print_level() >= 1) { @@ -1084,6 +1085,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< auto phi0_c = copy(world, phi0_copy); + world.gop.fence(); int b = 0; for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } if (compute_Y) { @@ -1092,8 +1094,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } else { K0.Y = K0.X.copy(); } - - if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } // Vnuc+V0+VXC @@ -1189,7 +1189,8 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp auto res_b_norms = std::vector{}; for (const auto &xij: xi) res_b_norms.push_back(xij.norm2()); world.gop.fence(); - if (world.rank() == 0) { print("||f(x)||_: ", j++, res_b_norms); } + if (world.rank() == 0) { print("||f(x)||_: ", j, res_b_norms); } + j++; } } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2977740ddb6..06ba2f11264 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -540,7 +540,7 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); r_params.set_user_defined_value("dconv", 1e-6); } else { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-6}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); From 69c0a69026c56592ae228bca5f087a8f15529932 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Sun, 16 Oct 2022 10:05:27 -0400 Subject: [PATCH 0312/1312] revise git revision handling ... no more MADgit library target --- CMakeLists.txt | 28 ++++---- cmake/config.h.in | 1 - cmake/git_version.cmake | 71 ------------------- src/apps/cc2/CMakeLists.txt | 2 +- src/apps/cc2/cc2.cc | 2 +- src/apps/cis/CMakeLists.txt | 2 +- src/apps/cis/cis.cpp | 7 +- src/apps/mp2/CMakeLists.txt | 2 +- src/apps/mp2/mp2.cc | 3 +- src/apps/nemo/CMakeLists.txt | 2 +- src/apps/nemo/nemo.cc | 10 +-- src/apps/oep/CMakeLists.txt | 2 +- src/apps/oep/oep.cc | 2 +- src/apps/zcis/CMakeLists.txt | 2 +- src/apps/znemo/CMakeLists.txt | 2 +- src/examples/CMakeLists.txt | 2 +- src/examples/ac_corr.cc | 2 +- src/examples/density_smoothing.cc | 7 +- src/examples/helium_exact.cc | 2 +- src/examples/madinfo.cc | 6 +- src/madness/chem/CMakeLists.txt | 4 +- .../chem/benchmark_exchange_operator.cc | 10 +-- src/madness/chem/znemo.h | 23 +++--- src/madness/misc/CMakeLists.txt | 31 +++----- src/madness/misc/gitinfo.h | 64 ----------------- src/madness/misc/{gitinfo.cc => info.cc} | 25 ++++--- src/madness/{world => misc}/info.h | 20 +++++- src/madness/world/CMakeLists.txt | 5 +- src/madness/world/info.cc | 62 ---------------- src/madness/world/world.h | 2 +- 30 files changed, 98 insertions(+), 305 deletions(-) delete mode 100644 cmake/git_version.cmake delete mode 100644 src/madness/misc/gitinfo.h rename src/madness/misc/{gitinfo.cc => info.cc} (53%) rename src/madness/{world => misc}/info.h (82%) mode change 100755 => 100644 delete mode 100755 src/madness/world/info.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index d31cb606f3c..442cc724d1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,20 @@ set(MADNESS_MINOR_VERSION 10) set(MADNESS_MICRO_VERSION 1) set(MADNESS_VERSION "${MADNESS_MAJOR_VERSION}.${MADNESS_MINOR_VERSION}.${MADNESS_MICRO_VERSION}") +# Get the git revision tag information + +if(EXISTS ${PROJECT_SOURCE_DIR}/.git) + find_package(Git REQUIRED) + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse -q HEAD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT_VARIABLE MADNESS_REVISION ) + string(REGEX MATCH "[0-9a-f]*" + MADNESS_REVISION "${MADNESS_REVISION}") +else() + set(MADNESS_REVISION "unknown") +endif() + # Declare ourselves ============================================================ project(MADNESS @@ -675,20 +689,6 @@ endif() add_subdirectory(src) add_subdirectory(doc) -# Get the git revision tag information ========================================= - -if(EXISTS ${PROJECT_SOURCE_DIR}/.git) - find_package(Git REQUIRED) - execute_process( - COMMAND ${GIT_EXECUTABLE} rev-parse -q HEAD - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - OUTPUT_VARIABLE MADNESS_REVISION ) - string(REGEX MATCH "[0-9a-f]*" - MADNESS_REVISION "${MADNESS_REVISION}") -else() - set(MADNESS_REVISION "unknown") -endif() - # Generate configure files ===================================================== configure_file( diff --git a/cmake/config.h.in b/cmake/config.h.in index 247561021cc..0a8e1ce08d6 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -8,7 +8,6 @@ #define MADNESS_MAJOR_VERSION @MADNESS_MAJOR_VERSION@ #define MADNESS_MINOR_VERSION @MADNESS_MAJOR_VERSION@ #define MADNESS_MICRO_VERSION @MADNESS_MAJOR_VERSION@ -#define MADNESS_REVISION "@MADNESS_REVISION@" /* Configured information */ #define MADNESS_CONFIGURATION_CXX "@CMAKE_CXX_COMPILER@" diff --git a/cmake/git_version.cmake b/cmake/git_version.cmake deleted file mode 100644 index bf31368bd41..00000000000 --- a/cmake/git_version.cmake +++ /dev/null @@ -1,71 +0,0 @@ -cmake_minimum_required(VERSION 3.0.0) - -message(STATUS "Resolving GIT Version") - -set(_build_version "unknown") - - -find_package(Git) -if(GIT_FOUND) - execute_process( - COMMAND ${GIT_EXECUTABLE} rev-parse HEAD - WORKING_DIRECTORY "${local_dir}" - OUTPUT_VARIABLE _build_version_only - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - execute_process( - COMMAND ${GIT_EXECUTABLE} diff --quiet - WORKING_DIRECTORY "${local_dir}" - RESULT_VARIABLE differs - ) - -# add a trailing plus if the code was change compared to the revision - if (${differs} EQUAL 0) -# message(STATUS "GIT_DIFF not differing") - string(CONCAT _build_version ${_build_version_only}) - else() -# message(STATUS "GIT_DIFF differing") - string(CONCAT _build_version ${_build_version_only}+) - endif() - message(STATUS "GIT hash: ${_build_version}") -else() - message(STATUS "GIT not found") -endif() - -string(TIMESTAMP _time_stamp) - -#configure_file(${local_dir}/git_version.h.in ${output_dir}/git_version.h @ONLY) - -#configure_file(${local_dir}/gitinfo.cc.in ${output_dir}/gitinfo.cc @ONLY) - -set(VERSION "const char* MADNESS_GITREVISION=\"${_build_version}\";") - -set(VERSIONFILE "${output_dir}/gitversion.h") -set(VERSIONSOURCE "${source_dir}/gitinfo.cc") - -#message(STATUS "looking for file ${VERSIONFILE}") - -if(EXISTS ${VERSIONFILE}) -# message(STATUS "reading file ${VERSIONFILE}") - file(READ ${VERSIONFILE} VERSION_) - message(STATUS "contents of the gitversion file: ${VERSION_}") -else() - set(VERSION_ "") - message(STATUS "cannot find file ${VERSIONFILE}") -endif() - - -if (NOT "${VERSION}" STREQUAL "${VERSION_}") - file(WRITE ${VERSIONFILE} "${VERSION}") - message(STATUS "creating file ${VERSIONFILE}") - execute_process( - COMMAND touch "gitinfo.cc" - WORKING_DIRECTORY "${source_dir}" - ) - -else() - message(STATUS "file ${FILE} is up to date") -endif() - - diff --git a/src/apps/cc2/CMakeLists.txt b/src/apps/cc2/CMakeLists.txt index 8ba98a01b46..83135e51dc2 100644 --- a/src/apps/cc2/CMakeLists.txt +++ b/src/apps/cc2/CMakeLists.txt @@ -1,6 +1,6 @@ # src/apps/moldft -add_mad_executable(cc2 cc2.cc "MADchem;MADgit") +add_mad_executable(cc2 cc2.cc "MADchem") add_dependencies(applications-madness cc2) diff --git a/src/apps/cc2/cc2.cc b/src/apps/cc2/cc2.cc index 021ed951b34..f4a1250779b 100644 --- a/src/apps/cc2/cc2.cc +++ b/src/apps/cc2/cc2.cc @@ -41,7 +41,7 @@ #include "madness/chem/CC2.h" -#include "madness/misc/gitinfo.h" +#include "madness/misc/info.h" using namespace madness; diff --git a/src/apps/cis/CMakeLists.txt b/src/apps/cis/CMakeLists.txt index 06432035a9a..b2297cf3416 100644 --- a/src/apps/cis/CMakeLists.txt +++ b/src/apps/cis/CMakeLists.txt @@ -1,6 +1,6 @@ # src/apps/moldft -add_mad_executable(cis cis.cpp "MADchem;MADgit") +add_mad_executable(cis cis.cpp "MADchem") add_dependencies(applications-madness cis) diff --git a/src/apps/cis/cis.cpp b/src/apps/cis/cis.cpp index d7d979e3685..27af93e32f9 100644 --- a/src/apps/cis/cis.cpp +++ b/src/apps/cis/cis.cpp @@ -5,11 +5,10 @@ * Author: Jakob S. Kottmann */ +#include +#include +#include #include -#include -#include -#include - using namespace madness; diff --git a/src/apps/mp2/CMakeLists.txt b/src/apps/mp2/CMakeLists.txt index 999f9e283b9..bf4e2eca397 100644 --- a/src/apps/mp2/CMakeLists.txt +++ b/src/apps/mp2/CMakeLists.txt @@ -1,6 +1,6 @@ # src/apps/moldft -add_mad_executable(mp2 mp2.cc "MADchem;MADgit") +add_mad_executable(mp2 mp2.cc "MADchem") add_dependencies(applications-madness mp2) install(TARGETS mp2 DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/mp2/mp2.cc b/src/apps/mp2/mp2.cc index 56bacd37e87..69988610b33 100644 --- a/src/apps/mp2/mp2.cc +++ b/src/apps/mp2/mp2.cc @@ -39,9 +39,8 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES -#include "madness/world/info.h" #include "madness/chem/mp2.h" -#include "madness/misc/gitinfo.h" +#include "madness/misc/info.h" using namespace madness; diff --git a/src/apps/nemo/CMakeLists.txt b/src/apps/nemo/CMakeLists.txt index eba931cdc79..f809459d727 100644 --- a/src/apps/nemo/CMakeLists.txt +++ b/src/apps/nemo/CMakeLists.txt @@ -1,6 +1,6 @@ # src/apps/moldft -add_mad_executable(nemo nemo.cc "MADchem;MADgit") +add_mad_executable(nemo nemo.cc "MADchem") add_dependencies(applications-madness nemo) install(TARGETS nemo DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/nemo/nemo.cc b/src/apps/nemo/nemo.cc index 341a220fb38..c59ad4fd8cd 100644 --- a/src/apps/nemo/nemo.cc +++ b/src/apps/nemo/nemo.cc @@ -44,11 +44,11 @@ */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include using namespace madness; diff --git a/src/apps/oep/CMakeLists.txt b/src/apps/oep/CMakeLists.txt index 7d5a484fdc0..a05b36544f5 100644 --- a/src/apps/oep/CMakeLists.txt +++ b/src/apps/oep/CMakeLists.txt @@ -1,6 +1,6 @@ # src/apps/moldft -add_mad_executable(oep oep.cc "MADchem;MADgit") +add_mad_executable(oep oep.cc "MADchem") add_dependencies(applications-madness oep) install(TARGETS oep DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/oep/oep.cc b/src/apps/oep/oep.cc index f925733e186..448550bcca2 100644 --- a/src/apps/oep/oep.cc +++ b/src/apps/oep/oep.cc @@ -38,7 +38,7 @@ #include -#include +#include using namespace madness; diff --git a/src/apps/zcis/CMakeLists.txt b/src/apps/zcis/CMakeLists.txt index aba7e333709..4889d5b8a1b 100644 --- a/src/apps/zcis/CMakeLists.txt +++ b/src/apps/zcis/CMakeLists.txt @@ -1,6 +1,6 @@ # src/apps/moldft -add_mad_executable(zcis zcis.cc "MADchem;MADgit") +add_mad_executable(zcis zcis.cc "MADchem") add_dependencies(applications-madness zcis) diff --git a/src/apps/znemo/CMakeLists.txt b/src/apps/znemo/CMakeLists.txt index d7a438ffb92..e4f7e3f94ad 100644 --- a/src/apps/znemo/CMakeLists.txt +++ b/src/apps/znemo/CMakeLists.txt @@ -1,6 +1,6 @@ # src/apps/moldft -add_mad_executable(znemo znemo.cc "MADchem;MADgit") +add_mad_executable(znemo znemo.cc "MADchem") add_dependencies(applications-madness znemo) diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt index 3148972ca95..4715fee334d 100644 --- a/src/examples/CMakeLists.txt +++ b/src/examples/CMakeLists.txt @@ -14,6 +14,6 @@ endif() # Create executables for example applications foreach(example ${EXAMPLE_SOURCES}) - add_mad_executable(${example} ${example}.cc "MADchem;MADgit") + add_mad_executable(${example} ${example}.cc "MADchem") add_dependencies(numerical-examples-madness ${example}) endforeach() diff --git a/src/examples/ac_corr.cc b/src/examples/ac_corr.cc index f88dd9cb68c..aae5954f273 100644 --- a/src/examples/ac_corr.cc +++ b/src/examples/ac_corr.cc @@ -12,7 +12,7 @@ #include #include //#include -#include +#include #include diff --git a/src/examples/density_smoothing.cc b/src/examples/density_smoothing.cc index 8b424e51036..8eec56c1ee0 100644 --- a/src/examples/density_smoothing.cc +++ b/src/examples/density_smoothing.cc @@ -45,6 +45,7 @@ */ #include "smooth.h" #include +#include using namespace madness; @@ -62,13 +63,9 @@ int main(int argc, char** argv) { startup(world,argc,argv); std::cout.precision(6); -#ifdef MADNESS_GITREVISION - const char* gitrev = MADNESS_GITREVISION; - const std::string gitrevision(gitrev); if (world.rank()==0) { - print(" git revision ...",gitrevision); + print(" git revision ...", info::git_commit()); } -#endif try { diff --git a/src/examples/helium_exact.cc b/src/examples/helium_exact.cc index 44f23fdfdca..91b530839a6 100644 --- a/src/examples/helium_exact.cc +++ b/src/examples/helium_exact.cc @@ -40,7 +40,7 @@ */ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES -#include +#include #include #include #include diff --git a/src/examples/madinfo.cc b/src/examples/madinfo.cc index a6180f3c47f..4f4d3fc44cd 100644 --- a/src/examples/madinfo.cc +++ b/src/examples/madinfo.cc @@ -8,13 +8,11 @@ #include #include +#include "madness/misc/info.h" #include -#include "madness/misc/gitinfo.h" int main() { - std::string line1(MADNESS_REVISION); - std::cout << "The git revision at configure time is: " << line1 << std::endl; - std::string line(madness::info::mad_git_commit()); + std::string line(madness::info::git_commit()); std::cout << "The git revision at compile time is: " << line << std::endl; std::string line2(madness::info::build_time()); std::string line3(madness::info::build_date()); diff --git a/src/madness/chem/CMakeLists.txt b/src/madness/chem/CMakeLists.txt index 81dadff6c30..8589003048b 100644 --- a/src/madness/chem/CMakeLists.txt +++ b/src/madness/chem/CMakeLists.txt @@ -149,12 +149,12 @@ if(BUILD_TESTING) list(APPEND CHEM_TEST_SOURCES test_dft.cc test_SCFOperators.cc) endif(LIBXC_FOUND) - add_unittests(chem "${CHEM_TEST_SOURCES}" "MADchem;MADgtest;MADgit") + add_unittests(chem "${CHEM_TEST_SOURCES}" "MADchem;MADgtest") # Create other test executables not included in the unit tests set(CHEM_OTHER_TESTS testxc benchmark_exchange_operator) foreach(_test ${CHEM_OTHER_TESTS}) - add_mad_executable(${_test} "${_test}.cc" "MADchem;MADgit") + add_mad_executable(${_test} "${_test}.cc" "MADchem") endforeach() endif() diff --git a/src/madness/chem/benchmark_exchange_operator.cc b/src/madness/chem/benchmark_exchange_operator.cc index 56cd6aee6e5..7a98c06b1e5 100644 --- a/src/madness/chem/benchmark_exchange_operator.cc +++ b/src/madness/chem/benchmark_exchange_operator.cc @@ -1,12 +1,12 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include -#include -#include -#include +#include +#include +#include +#include +#include #include -#include -#include using namespace madness; diff --git a/src/madness/chem/znemo.h b/src/madness/chem/znemo.h index 879f154a728..0673d3f7242 100644 --- a/src/madness/chem/znemo.h +++ b/src/madness/chem/znemo.h @@ -8,22 +8,19 @@ #ifndef SRC_APPS_CHEM_ZNEMO_H_ #define SRC_APPS_CHEM_ZNEMO_H_ - +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include #include -#include -#include -#include -#include -#include #include -#include -#include -#include - +#include namespace madness { diff --git a/src/madness/misc/CMakeLists.txt b/src/madness/misc/CMakeLists.txt index 9e9dda17485..7890a554415 100644 --- a/src/madness/misc/CMakeLists.txt +++ b/src/madness/misc/CMakeLists.txt @@ -1,33 +1,18 @@ # src/madness/misc -set(MADMISC_HEADERS misc.h ran.h phandler.h interpolation_1d.h cfft.h) +set(MADMISC_HEADERS misc.h ran.h phandler.h interpolation_1d.h cfft.h info.h) set(MADMISC_SOURCES - checksum_file.cc position_stream.cc gprofexit.cc ran.cc cfft.cc) + checksum_file.cc position_stream.cc gprofexit.cc ran.cc cfft.cc info.cc) +# feed MADNESS_REVISION to info.cc only to avoid recompiling everything +set_property( + SOURCE info.cc + PROPERTY COMPILE_DEFINITIONS + MADNESS_REVISION=\"${MADNESS_REVISION}\" +) # Create the MADmisc library add_mad_library(misc MADMISC_SOURCES MADMISC_HEADERS "world" "madness/misc/") -# Create the compile-time git library: git_version.cmake will write the gitinfo.cc file, -add_custom_command( - OUTPUT "${PROJECT_BINARY_DIR}/src/madness/misc/git_version.h" - SYMBOLIC "${PROJECT_BINARY_DIR}/src/madness/misc/_git_version.h" - COMMAND ${CMAKE_COMMAND} - -Dlocal_dir="${PROJECT_SOURCE_DIR}/cmake/" - -Doutput_dir="${PROJECT_BINARY_DIR}/src/madness/misc" - -Dsource_dir="${PROJECT_SOURCE_DIR}/src/madness/misc" - -P "${PROJECT_SOURCE_DIR}/cmake/git_version.cmake" - COMMENT "generating the gitversion file" -) -add_custom_target_subproject(madness mgit - DEPENDS "${PROJECT_BINARY_DIR}/src/madness/misc/git_version.h" -) - -set(MADGIT_HEADERS gitinfo.h) -set(MADGIT_SOURCES gitinfo.cc ) - -add_mad_library(git MADGIT_SOURCES MADGIT_HEADERS "world" "madness/misc/") -add_dependencies(MADgit-obj mgit-madness) - if(BUILD_TESTING) # The list of unit test source files diff --git a/src/madness/misc/gitinfo.h b/src/madness/misc/gitinfo.h deleted file mode 100644 index 968f78f6a10..00000000000 --- a/src/madness/misc/gitinfo.h +++ /dev/null @@ -1,64 +0,0 @@ - -/* - This file is part of MADNESS. - - Copyright (C) 2015 Stony Brook University - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For more information please contact: - - Robert J. Harrison - Oak Ridge National Laboratory - One Bethel Valley Road - P.O. Box 2008, MS-6367 - - email: harrisonrj@ornl.gov - tel: 865-241-3937 - fax: 865-572-0680 -*/ - - -#ifndef SRC_MADNESS_MISC_GITINFO_H_ -#define SRC_MADNESS_MISC_GITINFO_H_ - -/** - \file info.h - \brief Defines functions that give information on this version of MADNESS. - \ingroup configuration -*/ - -namespace madness { - namespace info { - - /// Get the git commit number for this version. - - /// \return The git commit number. - const char* mad_git_commit(); - - /// return the build time - const char* build_time(); - - /// return the build date - const char* build_date(); - - std::string print_revision_information(); - - } // namespace info -} // namespace madness - - - -#endif /* SRC_MADNESS_MISC_GITINFO_H_ */ diff --git a/src/madness/misc/gitinfo.cc b/src/madness/misc/info.cc similarity index 53% rename from src/madness/misc/gitinfo.cc rename to src/madness/misc/info.cc index c3e2134f1c9..aa2c1669531 100644 --- a/src/madness/misc/gitinfo.cc +++ b/src/madness/misc/info.cc @@ -7,7 +7,6 @@ #include -#include #include #include #include @@ -15,8 +14,17 @@ namespace madness { namespace info { - const char* mad_git_commit() { - return MADNESS_GITREVISION; + const char* version() { +#ifdef MADNESS_VERSION // from madness_config.h + return MADNESS_VERSION; +#else + return "unavailable"; +#endif + } + + + const char* git_commit() { + return MADNESS_REVISION; } const char* build_time() { @@ -29,16 +37,11 @@ namespace madness { std::string print_revision_information() { std::stringstream ss; -#ifdef MADNESS_REVISION - const char* gitrev = MADNESS_REVISION; - const std::string gitrevision(gitrev); - ss << " git revision at configure time ... " << gitrevision << std::endl; -#endif - const std::string gitrevision1(info::mad_git_commit()); - ss << " git revision at build time ... " << gitrevision1 << std::endl; + const std::string gitrevision1(info::git_commit()); + ss << " git revision ... " << gitrevision1 << std::endl; const std::string time(build_time()); const std::string date(build_date()); - ss << " build time at ... " << time << " on " << date << std::endl; + ss << " built date/time ... " << date << "/" << time << std::endl; return ss.str(); } diff --git a/src/madness/world/info.h b/src/madness/misc/info.h old mode 100755 new mode 100644 similarity index 82% rename from src/madness/world/info.h rename to src/madness/misc/info.h index f2beca2e212..7d31e126a53 --- a/src/madness/world/info.h +++ b/src/madness/misc/info.h @@ -1,3 +1,4 @@ + /* This file is part of MADNESS. @@ -29,8 +30,9 @@ fax: 865-572-0680 */ -#ifndef MADNESS_WORLD_INFO_H__INCLUDED -#define MADNESS_WORLD_INFO_H__INCLUDED + +#ifndef SRC_MADNESS_MISC_INFO_H_ +#define SRC_MADNESS_MISC_INFO_H_ /** \file info.h @@ -38,6 +40,8 @@ \ingroup configuration */ +#include + namespace madness { namespace info { @@ -51,7 +55,17 @@ namespace madness { /// \return The MADNESS version number. const char* version(); + /// return the build time + const char* build_time(); + + /// return the build date + const char* build_date(); + + std::string print_revision_information(); + } // namespace info } // namespace madness -#endif // MADNESS_WORLD_INFO_H__INCLUDED + + +#endif /* SRC_MADNESS_MISC_INFO_H_ */ diff --git a/src/madness/world/CMakeLists.txt b/src/madness/world/CMakeLists.txt index 1a5d3ff271a..99021530618 100644 --- a/src/madness/world/CMakeLists.txt +++ b/src/madness/world/CMakeLists.txt @@ -1,7 +1,7 @@ # src/madness/world set(MADWORLD_HEADERS - info.h archive.h print.h worldam.h future.h worldmpi.h + archive.h print.h worldam.h future.h worldmpi.h world_task_queue.h array_addons.h stack.h vector.h worldgop.h world_object.h buffer_archive.h nodefaults.h dependency_interface.h worldhash.h worldref.h worldtypes.h dqueue.h parallel_archive.h parallel_dc_archive.h @@ -15,7 +15,7 @@ set(MADWORLD_HEADERS cloud.h test_utilities.h timing_utilities.h) set(MADWORLD_SOURCES madness_exception.cc world.cc timers.cc future.cc redirectio.cc - archive_type_names.cc info.cc debug.cc print.cc worldmem.cc worldrmi.cc + archive_type_names.cc debug.cc print.cc worldmem.cc worldrmi.cc safempi.cc worldpapi.cc worldref.cc worldam.cc worldprofile.cc thread.cc world_task_queue.cc worldgop.cc deferred_cleanup.cc worldmutex.cc binary_fstream_archive.cc text_fstream_archive.cc lookup3.c worldmpi.cc @@ -46,7 +46,6 @@ if(MADNESS_ENABLE_CEREAL) endif() # Set the dependencies for the MADworld library -#target_compile_definitions(${targetname} PUBLIC "-DMADNESS_GITREVISION=\"`git --git-dir=$(top_srcdir)/.git rev-parse HEAD`\"") target_include_directories(${targetname} PUBLIC $ $) diff --git a/src/madness/world/info.cc b/src/madness/world/info.cc deleted file mode 100755 index a841bbdeec6..00000000000 --- a/src/madness/world/info.cc +++ /dev/null @@ -1,62 +0,0 @@ -/* - This file is part of MADNESS. - - Copyright (C) 2015 Stony Brook University - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - For more information please contact: - - Robert J. Harrison - Oak Ridge National Laboratory - One Bethel Valley Road - P.O. Box 2008, MS-6367 - - email: harrisonrj@ornl.gov - tel: 865-241-3937 - fax: 865-572-0680 -*/ - -/** - \file info.cc - \brief Implements functions that give information on this version of MADNESS. - \ingroup configuration -*/ - -#include "info.h" - -#include - -namespace madness { - namespace info { - - const char* git_commit() { -#ifdef MADNESS_GITREVISION - return MADNESS_GITREVISION; -#else - return "unavailable"; -#endif - } - - const char* version() { -#ifdef MADNESS_VERSION // from config.h - return MADNESS_VERSION; -#else - return "unavailable"; -#endif - } - - } // namespace info -} // namespace madness diff --git a/src/madness/world/world.h b/src/madness/world/world.h index 3d380d2dacb..cb69bce28d8 100644 --- a/src/madness/world/world.h +++ b/src/madness/world/world.h @@ -341,7 +341,7 @@ namespace madness { /// /// \note All unique objects of any type within a \c World must /// presently be created in the same order on all processes so - /// as to provide the uniquess property without global + /// as to guarantee the uniqueness without global /// communication. /// \tparam T The type of data to be associated. /// \param[in] ptr Pointer to the data that will be associated From c8aabb219f1f9eb31c16eb8075192b17158aba8d Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Mon, 17 Oct 2022 10:51:24 -0400 Subject: [PATCH 0313/1312] prefer git description to git revision (the latter is contained in the former) --- CMakeLists.txt | 14 ----- cmake/modules/GetGitMetadata.cmake | 83 ++++++++++++++++++++++++++++++ src/examples/density_smoothing.cc | 2 +- src/examples/helium_exact.cc | 2 +- src/examples/madinfo.cc | 3 +- src/madness/misc/CMakeLists.txt | 14 +++-- src/madness/misc/info.cc | 9 ++-- src/madness/misc/info.h | 5 ++ 8 files changed, 106 insertions(+), 26 deletions(-) create mode 100644 cmake/modules/GetGitMetadata.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 442cc724d1f..47b589894f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,20 +15,6 @@ set(MADNESS_MINOR_VERSION 10) set(MADNESS_MICRO_VERSION 1) set(MADNESS_VERSION "${MADNESS_MAJOR_VERSION}.${MADNESS_MINOR_VERSION}.${MADNESS_MICRO_VERSION}") -# Get the git revision tag information - -if(EXISTS ${PROJECT_SOURCE_DIR}/.git) - find_package(Git REQUIRED) - execute_process( - COMMAND ${GIT_EXECUTABLE} rev-parse -q HEAD - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - OUTPUT_VARIABLE MADNESS_REVISION ) - string(REGEX MATCH "[0-9a-f]*" - MADNESS_REVISION "${MADNESS_REVISION}") -else() - set(MADNESS_REVISION "unknown") -endif() - # Declare ourselves ============================================================ project(MADNESS diff --git a/cmake/modules/GetGitMetadata.cmake b/cmake/modules/GetGitMetadata.cmake new file mode 100644 index 00000000000..a07148b0cc6 --- /dev/null +++ b/cmake/modules/GetGitMetadata.cmake @@ -0,0 +1,83 @@ +# +# SPDX-FileCopyrightText: 2022 Eduard Valeyev +# +# SPDX-License-Identifier: BSD-2-Clause +# + +# +# vgkit_cmake_git_revision() defines variable ${PROJECT_NAME_UPPER}_GIT_REVISION, +# where ${PROJECT_NAME_UPPER} is the upper-case version of ${PROJECT_NAME}, to +# the "long-form" GIT revision produced by `git rev-parse -q HEAD` command. +# N.B. If the variable is already defined will print a warning message but not change the value of +# ${PROJECT_NAME_UPPER}_GIT_REVISION +# +macro(vgkit_cmake_git_revision) + string(TOUPPER "${PROJECT_NAME}_GIT_REVISION" vgkit_cmake_git_revision_result) + if (DEFINED ${vgkit_cmake_git_revision_result}) + message(WARNING "vgkit_cmake_git_revision() called for project ${PROJECT_NAME} but the result variable ${vgkit_cmake_git_revision_result} already defined; will not change its value") + else() + if(EXISTS ${PROJECT_SOURCE_DIR}/.git) + find_package(Git REQUIRED) + if (GIT_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse -q HEAD + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE vgkit_cmake_git_revision_errcod + OUTPUT_VARIABLE ${vgkit_cmake_git_revision_result} + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT vgkit_cmake_git_revision_errcod EQUAL 0) + set(${vgkit_cmake_git_revision_result} "unknown") + endif() + unset(vgkit_cmake_git_revision_errcod) + else() + set(${vgkit_cmake_git_revision_result} "unknown") + endif() + else() + set(${vgkit_cmake_git_revision_result} "unknown") + endif() + endif() + unset(vgkit_cmake_git_revision_result) +endmacro() + +# +# vgkit_cmake_git_description() defines variable ${PROJECT_NAME_UPPER}_GIT_DESCRIPTION, +# where ${PROJECT_NAME_UPPER} is the upper-case version of ${PROJECT_NAME}, to +# the human-readable form produced by `git describe --dirty` command. +# If the variable is already defined will print a warning message but not change the value of +# ${PROJECT_NAME_UPPER}_GIT_DESCRIPTION +# +macro(vgkit_cmake_git_description) + string(TOUPPER "${PROJECT_NAME}_GIT_DESCRIPTION" vgkit_cmake_git_description_result) + if (DEFINED ${vgkit_cmake_git_description_result}) + message(WARNING "vgkit_cmake_git_description() called for project ${PROJECT_NAME} but the result variable ${vgkit_cmake_git_description_result} already defined; will not change its value") + else() + if(EXISTS ${PROJECT_SOURCE_DIR}/.git) + find_package(Git REQUIRED) + if (GIT_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} describe --dirty + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE vgkit_cmake_git_description_errcod + OUTPUT_VARIABLE ${vgkit_cmake_git_description_result} + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT vgkit_cmake_git_description_errcod EQUAL 0) + set(${vgkit_cmake_git_description_errcod} "unknown") + endif() + unset(vgkit_cmake_git_description_errcod) + else() + set(${vgkit_cmake_git_description_errcod} "unknown") + endif() + else() + set(${vgkit_cmake_git_description_errcod} "unknown") + endif() + endif() + unset(vgkit_cmake_git_description_errcod) +endmacro() + +# +# vgkit_cmake_git_metadata() invokes vgkit_cmake_git_revision and vgkit_cmake_git_description +# +macro(vgkit_cmake_git_metadata) + vgkit_cmake_git_revision() + vgkit_cmake_git_description() +endmacro() diff --git a/src/examples/density_smoothing.cc b/src/examples/density_smoothing.cc index 8eec56c1ee0..17bce120792 100644 --- a/src/examples/density_smoothing.cc +++ b/src/examples/density_smoothing.cc @@ -64,7 +64,7 @@ int main(int argc, char** argv) { std::cout.precision(6); if (world.rank()==0) { - print(" git revision ...", info::git_commit()); + print(" git source description ...", info::git_source_description()); } try { diff --git a/src/examples/helium_exact.cc b/src/examples/helium_exact.cc index 91b530839a6..9f33606e6aa 100644 --- a/src/examples/helium_exact.cc +++ b/src/examples/helium_exact.cc @@ -441,7 +441,7 @@ int main(int argc, char** argv) { std::cout.precision(6); if (world.rank()==0) { - print(" git revision ...", info::git_commit()); + print(" git source description ...", info::git_source_description()); } if (world.rank() == 0) { diff --git a/src/examples/madinfo.cc b/src/examples/madinfo.cc index 4f4d3fc44cd..78471883be2 100644 --- a/src/examples/madinfo.cc +++ b/src/examples/madinfo.cc @@ -12,8 +12,7 @@ #include int main() { - std::string line(madness::info::git_commit()); - std::cout << "The git revision at compile time is: " << line << std::endl; + std::cout << "The git source tree description at compile time is: " << madness::info::git_source_description() << std::endl; std::string line2(madness::info::build_time()); std::string line3(madness::info::build_date()); std::cout << "MADNESS built on: " << line3 << " at " << line2 << std::endl; diff --git a/src/madness/misc/CMakeLists.txt b/src/madness/misc/CMakeLists.txt index 7890a554415..9b6811550f6 100644 --- a/src/madness/misc/CMakeLists.txt +++ b/src/madness/misc/CMakeLists.txt @@ -3,11 +3,15 @@ set(MADMISC_HEADERS misc.h ran.h phandler.h interpolation_1d.h cfft.h info.h) set(MADMISC_SOURCES checksum_file.cc position_stream.cc gprofexit.cc ran.cc cfft.cc info.cc) -# feed MADNESS_REVISION to info.cc only to avoid recompiling everything -set_property( - SOURCE info.cc - PROPERTY COMPILE_DEFINITIONS - MADNESS_REVISION=\"${MADNESS_REVISION}\" +# retrieve git metadata +include(GetGitMetadata) +vgkit_cmake_git_metadata() +# feed MADNESS_GIT_{REVISION,DESCRIPTION} to info.cc only to avoid recompiling everything +set_source_files_properties( + info.cc + PROPERTIES + COMPILE_DEFINITIONS + "MADNESS_GIT_REVISION=\"${MADNESS_GIT_REVISION}\";MADNESS_GIT_DESCRIPTION=\"${MADNESS_GIT_DESCRIPTION}\"" ) # Create the MADmisc library diff --git a/src/madness/misc/info.cc b/src/madness/misc/info.cc index aa2c1669531..612a939a07a 100644 --- a/src/madness/misc/info.cc +++ b/src/madness/misc/info.cc @@ -24,7 +24,11 @@ namespace madness { const char* git_commit() { - return MADNESS_REVISION; + return MADNESS_GIT_REVISION; + } + + const char* git_source_description() { + return MADNESS_GIT_DESCRIPTION; } const char* build_time() { @@ -37,8 +41,7 @@ namespace madness { std::string print_revision_information() { std::stringstream ss; - const std::string gitrevision1(info::git_commit()); - ss << " git revision ... " << gitrevision1 << std::endl; + ss << " git source description ... " << info::git_source_description() << std::endl; const std::string time(build_time()); const std::string date(build_date()); ss << " built date/time ... " << date << "/" << time << std::endl; diff --git a/src/madness/misc/info.h b/src/madness/misc/info.h index 7d31e126a53..16baeb0a700 100644 --- a/src/madness/misc/info.h +++ b/src/madness/misc/info.h @@ -50,6 +50,11 @@ namespace madness { /// \return The git commit number. const char* git_commit(); + /// Get the git source tree human-readable description (see `git describe --dirty`) + + /// \return The git commit number. + const char* git_source_description(); + /// Get the MADNESS version number. /// \return The MADNESS version number. From bb20c047736493f2014641a48694232781575cc0 Mon Sep 17 00:00:00 2001 From: Thomas Herault Date: Thu, 20 Oct 2022 17:29:18 -0400 Subject: [PATCH 0314/1312] Update PaRSEC: use parsec mempools to allocate and free parsec tasks, as some schedulers rely on persistence of these objects to avoid taking costly locks --- src/madness/world/parsec.cc | 32 ++++++++++++++++++++++++-------- src/madness/world/parsec.h | 4 +++- src/madness/world/thread.h | 6 +++++- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/madness/world/parsec.cc b/src/madness/world/parsec.cc index 7f162a91e73..7a6705b8d52 100644 --- a/src/madness/world/parsec.cc +++ b/src/madness/world/parsec.cc @@ -152,22 +152,38 @@ namespace madness { parsec_context_t *ParsecRuntime::context() { return ctx; } - parsec_task_t ParsecRuntime::task(bool is_high_priority, void *ptr) { - parsec_task_t parsec_task{}; - parsec_task.taskpool = &tp; - parsec_task.task_class = &madness_parsec_tc; - parsec_task.chore_id = 0; - parsec_task.status = PARSEC_TASK_STATUS_NONE; - parsec_task.priority = is_high_priority ? 1000 : 0; // 1 & 0 would work as good - ((void **)parsec_task.locals)[0] = ptr; + parsec_execution_stream_t *ParsecRuntime::execution_stream() { + parsec_execution_stream_t *my_es; + my_es = parsec_my_execution_stream(); + if(nullptr == my_es) { + my_es = context()->virtual_processes[0]->execution_streams[0]; + } + assert(nullptr != my_es); + return my_es; + } + + parsec_task_t *ParsecRuntime::task(bool is_high_priority, void *ptr) { + parsec_execution_stream_t *my_es = execution_stream(); + parsec_task_t *parsec_task = parsec_thread_mempool_allocate( my_es->context_mempool ); + parsec_task->taskpool = &tp; + parsec_task->task_class = &madness_parsec_tc; + parsec_task->chore_id = 0; + parsec_task->status = PARSEC_TASK_STATUS_NONE; + parsec_task->priority = is_high_priority ? 1000 : 0; // 1 & 0 would work as good + ((void **)parsec_task->locals)[0] = ptr; return parsec_task; } + void ParsecRuntime::delete_parsec_task(parsec_task_t *task) { + parsec_thread_mempool_free( task->mempool_owner, task ); + } + void ParsecRuntime::schedule(PoolTaskInterface *task) { parsec_task_t *parsec_task = &(task->parsec_task); PARSEC_LIST_ITEM_SINGLETON(parsec_task); tp.tdm.module->taskpool_addto_nb_tasks(&tp, 1); __parsec_schedule(ctx->virtual_processes[0]->execution_streams[0], parsec_task, 0); + __parsec_schedule(execution_stream(), parsec_task, 0); } void ParsecRuntime::wait() { diff --git a/src/madness/world/parsec.h b/src/madness/world/parsec.h index d2ecb9c0c36..e20efe73774 100644 --- a/src/madness/world/parsec.h +++ b/src/madness/world/parsec.h @@ -30,10 +30,12 @@ namespace madness{ ~ParsecRuntime(); static parsec_context_t* context(); + static parsec_execution_stream_t *execution_stream(); static void schedule(PoolTaskInterface* task); static int test(); static void wait(); - static parsec_task_t task(bool is_high_priority, void *ptr); + static parsec_task_t *task(bool is_high_priority, void *ptr); + static void delete_parsec_task(parsec_task_t *t); }; } diff --git a/src/madness/world/thread.h b/src/madness/world/thread.h index b50082bfab9..b0fc4d73ed2 100644 --- a/src/madness/world/thread.h +++ b/src/madness/world/thread.h @@ -980,6 +980,10 @@ namespace madness { /// Destructor. /// \todo Should we either use a unique_ptr for barrier or check that barrier != nullptr here? virtual ~PoolTaskInterface() { +#if HAVE_PARSEC + ParsecRuntime::delete_parsec_task(parsec_task); + parsec_task = nullptr; +#endif delete barrier; } @@ -1002,7 +1006,7 @@ namespace madness { } #if HAVE_PARSEC //////////// Parsec Related Begin //////////////////// - parsec_task_t parsec_task; + parsec_task_t *parsec_task; //////////// Parsec Related End /////////////////// #endif From 04365c6971b789f1cf931301d49860e9e33454c3 Mon Sep 17 00:00:00 2001 From: Thomas Herault Date: Thu, 20 Oct 2022 17:36:09 -0400 Subject: [PATCH 0315/1312] Bump up PaRSEC version. Removes race condition in termination detector --- external/versions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/versions.cmake b/external/versions.cmake index e7c1e3adcc6..2061dc60d23 100644 --- a/external/versions.cmake +++ b/external/versions.cmake @@ -1 +1 @@ -set(MADNESS_TRACKED_PARSEC_TAG 89fdb88c6bdfcee3904c013a0856403762a5479f) +set(MADNESS_TRACKED_PARSEC_TAG cb9322046c1f856fbca5804a9f96b83bbe2e676b) From 55b1024ffc4daadb57d4e8b4bd5463d6a3bd9609 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Fri, 21 Oct 2022 09:59:43 -0400 Subject: [PATCH 0316/1312] fixup --- src/madness/world/parsec.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/madness/world/parsec.cc b/src/madness/world/parsec.cc index 7a6705b8d52..5fd6f83bd42 100644 --- a/src/madness/world/parsec.cc +++ b/src/madness/world/parsec.cc @@ -164,7 +164,7 @@ namespace madness { parsec_task_t *ParsecRuntime::task(bool is_high_priority, void *ptr) { parsec_execution_stream_t *my_es = execution_stream(); - parsec_task_t *parsec_task = parsec_thread_mempool_allocate( my_es->context_mempool ); + parsec_task_t* parsec_task = static_cast( parsec_thread_mempool_allocate( my_es->context_mempool ) ); parsec_task->taskpool = &tp; parsec_task->task_class = &madness_parsec_tc; parsec_task->chore_id = 0; @@ -179,7 +179,7 @@ namespace madness { } void ParsecRuntime::schedule(PoolTaskInterface *task) { - parsec_task_t *parsec_task = &(task->parsec_task); + parsec_task_t* parsec_task = task->parsec_task; PARSEC_LIST_ITEM_SINGLETON(parsec_task); tp.tdm.module->taskpool_addto_nb_tasks(&tp, 1); __parsec_schedule(ctx->virtual_processes[0]->execution_streams[0], parsec_task, 0); From 6dfe7bfbf5ea2a42291a47d0e872478ffc6a2f40 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Fri, 21 Oct 2022 11:08:42 -0400 Subject: [PATCH 0317/1312] scheduling parsec tasks twice is bad --- src/madness/world/parsec.cc | 6 ++++-- src/madness/world/thread.h | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/madness/world/parsec.cc b/src/madness/world/parsec.cc index 5fd6f83bd42..4ed341cb3f4 100644 --- a/src/madness/world/parsec.cc +++ b/src/madness/world/parsec.cc @@ -18,6 +18,7 @@ namespace madness { parsec_hook_return_t release_madness_task (parsec_execution_stream_t *es, parsec_task_t *task) { PoolTaskInterface *c = ((PoolTaskInterface **)task->locals)[0]; + assert(c); (void)es; delete(c); return PARSEC_HOOK_RETURN_DONE; @@ -26,6 +27,7 @@ namespace madness { parsec_hook_return_t run_madness_task(parsec_execution_stream_t *eu, parsec_task_t *task) { PoolTaskInterface *c = ((PoolTaskInterface **)task->locals)[0]; + assert(c); c->run(TaskThreadEnv(1, 0, 0)); return PARSEC_HOOK_RETURN_DONE; } @@ -165,6 +167,7 @@ namespace madness { parsec_task_t *ParsecRuntime::task(bool is_high_priority, void *ptr) { parsec_execution_stream_t *my_es = execution_stream(); parsec_task_t* parsec_task = static_cast( parsec_thread_mempool_allocate( my_es->context_mempool ) ); + PARSEC_LIST_ITEM_SINGLETON(parsec_task); parsec_task->taskpool = &tp; parsec_task->task_class = &madness_parsec_tc; parsec_task->chore_id = 0; @@ -174,7 +177,7 @@ namespace madness { return parsec_task; } - void ParsecRuntime::delete_parsec_task(parsec_task_t *task) { + void ParsecRuntime::delete_parsec_task(parsec_task_t *task) { parsec_thread_mempool_free( task->mempool_owner, task ); } @@ -182,7 +185,6 @@ namespace madness { parsec_task_t* parsec_task = task->parsec_task; PARSEC_LIST_ITEM_SINGLETON(parsec_task); tp.tdm.module->taskpool_addto_nb_tasks(&tp, 1); - __parsec_schedule(ctx->virtual_processes[0]->execution_streams[0], parsec_task, 0); __parsec_schedule(execution_stream(), parsec_task, 0); } diff --git a/src/madness/world/thread.h b/src/madness/world/thread.h index b0fc4d73ed2..12d1004b5d4 100644 --- a/src/madness/world/thread.h +++ b/src/madness/world/thread.h @@ -964,7 +964,7 @@ namespace madness { count = 0; } - /// Contructor setting teh speicified task attributes. + /// Contructor setting the specified task attributes. /// \param[in] attr The task attributes. explicit PoolTaskInterface(const TaskAttributes& attr) @@ -981,8 +981,9 @@ namespace madness { /// \todo Should we either use a unique_ptr for barrier or check that barrier != nullptr here? virtual ~PoolTaskInterface() { #if HAVE_PARSEC - ParsecRuntime::delete_parsec_task(parsec_task); - parsec_task = nullptr; + *(reinterpret_cast(&(parsec_task->locals[0]))) = nullptr; + ParsecRuntime::delete_parsec_task(parsec_task); + parsec_task = nullptr; #endif delete barrier; } From 73b9d2d6674d7fda24ffc56c429584dad1e68a18 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sun, 30 Oct 2022 12:35:37 +0100 Subject: [PATCH 0318/1312] minor corrections --- src/apps/dirac/InitParameters.h | 4 +++- src/madness/chem/SCF.cc | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index 1db41388d02..c87ab0124ee 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -79,6 +79,7 @@ namespace madness{ archive::ParallelInputArchive input(world, filename.c_str()); unsigned int version; std::string xc; + std::string localize_method; input & version; input & Init_total_energy; // double @@ -87,7 +88,8 @@ namespace madness{ input & order; // int wavelet order input & molecule; // Molecule input & xc; - + input & localize_method; + input & num_occupied; // int input & temp_energies; // Tensor orbital energies input & occ; // Tensor orbital occupations diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 44d37ab95f8..39a863cf804 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -1864,7 +1864,7 @@ void SCF::update_subspace(World& world, vecfuncT& Vpsia, vecfuncT& Vpsib, do_step_restriction(world, bmo, bmo_new, "beta"); orthonormalize(world, bmo_new, param.nbeta()); bmo = bmo_new; - } else { + } else if (param.nbeta()>0) { bmo = amo; } } From 7bc9b37bc63a4a6616ef8497b8a039d409191287 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 1 Nov 2022 14:00:23 -0400 Subject: [PATCH 0319/1312] sync DFDriver with SCF::save_mos to allow starting from moldft orbitals --- src/apps/dirac/InitParameters.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/dirac/InitParameters.h b/src/apps/dirac/InitParameters.h index 1db41388d02..c409e3043aa 100644 --- a/src/apps/dirac/InitParameters.h +++ b/src/apps/dirac/InitParameters.h @@ -75,10 +75,11 @@ namespace madness{ std::vector dummy2; Tensor temp_energies; - //read in what's in the archive. See SCF.cc for how these archives are stored + //read in what's in the archive. See SCF::save_mos for how these archives are stored archive::ParallelInputArchive input(world, filename.c_str()); unsigned int version; std::string xc; + std::string localize_method; input & version; input & Init_total_energy; // double @@ -87,7 +88,8 @@ namespace madness{ input & order; // int wavelet order input & molecule; // Molecule input & xc; - + input & localize_method; + input & num_occupied; // int input & temp_energies; // Tensor orbital energies input & occ; // Tensor orbital occupations From 47c74bf9c8c54da9ab88327d78ed48b600fe5d2b Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 2 Nov 2022 19:25:39 +0100 Subject: [PATCH 0320/1312] make nlohmann_json build similar to tinyxml --- src/madness/external/CMakeLists.txt | 1 + src/madness/external/nlohmann_json/CMakeLists.txt | 12 ++++++++++++ src/madness/external/nlohmann_json/json.cc | 5 +++++ 3 files changed, 18 insertions(+) create mode 100644 src/madness/external/nlohmann_json/CMakeLists.txt create mode 100644 src/madness/external/nlohmann_json/json.cc diff --git a/src/madness/external/CMakeLists.txt b/src/madness/external/CMakeLists.txt index 1afef86fc37..4148ace6f33 100644 --- a/src/madness/external/CMakeLists.txt +++ b/src/madness/external/CMakeLists.txt @@ -7,6 +7,7 @@ endif() if (NOT MADNESS_BUILD_MADWORLD_ONLY) add_subdirectory(muParser) add_subdirectory(tinyxml) + add_subdirectory(nlohmann_json) endif (NOT MADNESS_BUILD_MADWORLD_ONLY) # if want embedded elemental ... diff --git a/src/madness/external/nlohmann_json/CMakeLists.txt b/src/madness/external/nlohmann_json/CMakeLists.txt new file mode 100644 index 00000000000..53a31315d58 --- /dev/null +++ b/src/madness/external/nlohmann_json/CMakeLists.txt @@ -0,0 +1,12 @@ +# src/madness/external/nlohmann_json + +set(MADNLOHMANN_JSON_HEADERS json.hpp) +set(MADNLOHMANN_JSON_SOURCES json.cc ) +#set(MADTINYXML_SOURCES tinystr.cc tinyxml.cc tinyxmlerror.cc tinyxmlparser.cc) + +# Create the MADtinyxml library +add_mad_library(nlohmann_json MADNLOHMANN_JSON_SOURCES MADNLOHMANN_JSON_HEADERS "dummy" "madness/external/nlohmann_json/") +#add_mad_library(tinyxml MADTINYXML_SOURCES MADTINYXML_HEADERS "dummy" "madness/external/tinyxml/") +#add_mad_hdr_library(nlohmann_json MADNLOHMANN_JSON_HEADERS "dummy" "madness/external/nlohmann_json/") + +#target_compile_options(MADtinyxml PRIVATE -O0) \ No newline at end of file diff --git a/src/madness/external/nlohmann_json/json.cc b/src/madness/external/nlohmann_json/json.cc new file mode 100644 index 00000000000..e0e8eb85da8 --- /dev/null +++ b/src/madness/external/nlohmann_json/json.cc @@ -0,0 +1,5 @@ +// +// Created by Florian Bischoff on 11/1/22. +// + +#include "json.hpp" From 29a2bf3d3c2670c608b7bfdf2299d76fbc20e041 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Fri, 4 Nov 2022 17:29:04 -0400 Subject: [PATCH 0321/1312] fix build issued + reduce compile noise when using C++20 - volatile is deprecated , hushing this but needs proper fix @robertjharrison - is_pod deprecated - misc compile fixes --- cmake/modules/AddMADLibrary.cmake | 16 +++++++++++++++- src/madness/tensor/gentensor.h | 32 +++++++++++++++---------------- src/madness/tensor/tensor.h | 2 +- src/madness/world/stack.h | 4 ++-- src/madness/world/type_traits.h | 2 +- 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/cmake/modules/AddMADLibrary.cmake b/cmake/modules/AddMADLibrary.cmake index d13e2805b0e..b939895041a 100644 --- a/cmake/modules/AddMADLibrary.cmake +++ b/cmake/modules/AddMADLibrary.cmake @@ -87,6 +87,13 @@ macro(add_mad_library _name _source_files _header_files _dep_mad_comp _include_d endforeach(_dep ${_dep_mad_comp}) set_target_properties(${targetname} PROPERTIES LINK_FLAGS "${LINK_FLAGS}") target_compile_features(${targetname} INTERFACE "cxx_std_${CMAKE_CXX_STANDARD}") + if (CMAKE_CXX_STANDARD GREATER_EQUAL 20) + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + target_compile_options(MAD${_name} PUBLIC "-Wno-deprecated-volatile") + elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + target_compile_options(MAD${_name} PUBLIC "-Wno-volatile") + endif() + endif() endmacro() @@ -138,6 +145,13 @@ macro(add_mad_hdr_library _name _header_files _dep_mad_comp _include_dir) endforeach() target_compile_features(MAD${_name} INTERFACE "cxx_std_${CMAKE_CXX_STANDARD}") - + if (CMAKE_CXX_STANDARD GREATER_EQUAL 20) + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + target_compile_options(MAD${_name} INTERFACE "-Wno-deprecated-volatile") + elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + target_compile_options(MAD${_name} INTERFACE "-Wno-volatile") + endif() + endif() + set(${_name}_is_mad_hdr_lib TRUE) endmacro() diff --git a/src/madness/tensor/gentensor.h b/src/madness/tensor/gentensor.h index 503dd98c813..c9d368fee3b 100644 --- a/src/madness/tensor/gentensor.h +++ b/src/madness/tensor/gentensor.h @@ -177,16 +177,16 @@ namespace madness { public: - GenTensor() : Tensor() {} + GenTensor() : Tensor() {} - GenTensor(const Tensor& t1) : Tensor(t1) {} - GenTensor(const Tensor& t1, const TensorArgs& targs) : Tensor(t1) {} - GenTensor(const Tensor& t1, double eps, const TensorType tt) : Tensor(t1) {} - GenTensor(const TensorType tt): Tensor() {} - GenTensor(std::vector v, const TensorType& tt) : Tensor(v) {} - GenTensor(std::vector v, const TensorArgs& targs) : Tensor(v) {} - GenTensor(const SRConf& sr1) : Tensor() {MADNESS_EXCEPTION("no ctor with SRConf: use HAVE_GENTENSOR",1);} - GenTensor(long nd, const long d[], const TensorType& tt) : Tensor(nd,d){}; + GenTensor(const Tensor& t1) : Tensor(t1) {} + GenTensor(const Tensor& t1, const TensorArgs& targs) : Tensor(t1) {} + GenTensor(const Tensor& t1, double eps, const TensorType tt) : Tensor(t1) {} + GenTensor(const TensorType tt): Tensor() {} + GenTensor(std::vector v, const TensorType& tt) : Tensor(v) {} + GenTensor(std::vector v, const TensorArgs& targs) : Tensor(v) {} + GenTensor(const SRConf& sr1) : Tensor() {MADNESS_EXCEPTION("no ctor with SRConf: use HAVE_GENTENSOR",1);} + GenTensor(long nd, const long d[], const TensorType& tt) : Tensor(nd,d){}; /// Type conversion makes a deep copy template operator GenTensor() const { // type conv => deep copy @@ -196,15 +196,15 @@ namespace madness { } GenTensor convert(const TensorArgs& targs) const {return copy(*this);} - GenTensor reconstruct_tensor() const {return *this;} - GenTensor full_tensor() const {return *this;} - GenTensor& full_tensor() {return *this;} + GenTensor reconstruct_tensor() const {return *this;} + GenTensor full_tensor() const {return *this;} + GenTensor& full_tensor() {return *this;} - GenTensor get_tensor() const {return *this;} - GenTensor& get_tensor() {return *this;} + GenTensor get_tensor() const {return *this;} + GenTensor& get_tensor() {return *this;} - GenTensor full_tensor_copy() const {return copy(*this);} - GenTensor full_tensor_copy() {return copy(*this);} + GenTensor full_tensor_copy() const {return copy(*this);} + GenTensor full_tensor_copy() {return copy(*this);} bool is_assigned() const {return this->size()>0;}; bool has_data() const {return this->size()>0;}; diff --git a/src/madness/tensor/tensor.h b/src/madness/tensor/tensor.h index a47524d5b2b..2cb18d7c020 100644 --- a/src/madness/tensor/tensor.h +++ b/src/madness/tensor/tensor.h @@ -2037,7 +2037,7 @@ MADNESS_PRAGMA_GCC(diagnostic pop) /// operation and discarding. template class SliceTensor : public Tensor { private: - SliceTensor(); + SliceTensor(); public: diff --git a/src/madness/world/stack.h b/src/madness/world/stack.h index 89cb826ed19..8f6ec47250d 100644 --- a/src/madness/world/stack.h +++ b/src/madness/world/stack.h @@ -151,7 +151,7 @@ namespace madness { /// \tparam T The type of data stored in the stack. /// \tparam N The fixed size of the stack. template - class Stack : public detail::StackBase::value> { + class Stack : public detail::StackBase::value && std::is_trivial::value> { public: typedef T value_type; ///< Type of the stack elements. typedef T& reference; ///< Element reference type. @@ -164,7 +164,7 @@ namespace madness { size_type capacity_; ///< The maximum size, in elements, of the \c data_ buffer. char buffer_[sizeof(T) * N]; ///< Static buffer for storing a small number of elements. - typedef detail::StackBase::value> StackBase_; + typedef detail::StackBase::value && std::is_trivial::value> StackBase_; using StackBase_::destroy; using StackBase_::uninitialized_move; diff --git a/src/madness/world/type_traits.h b/src/madness/world/type_traits.h index 6aae10ab845..df2406c2764 100644 --- a/src/madness/world/type_traits.h +++ b/src/madness/world/type_traits.h @@ -222,7 +222,7 @@ namespace madness { std::is_arithmetic::value || \ std::is_function::value || \ is_any_function_pointer_v || \ - (std::is_pod::value && !std::is_pointer::value); + (std::is_standard_layout::value && std::is_trivial::value && !std::is_pointer::value); // ((std::is_class::value || std::is_array::value) && std::is_trivially_copyable::value); }; From 23a63af8494a5011ce1464fd33c5336bf1d13551 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 10 Nov 2022 21:13:35 -0500 Subject: [PATCH 0322/1312] response edits --- src/apps/molresponse/FrequencyResponse.cpp | 13 ------------- .../molresponse/testing/generate_frequency_data.cpp | 2 ++ src/apps/molresponse/testing/response_data_base.hpp | 4 ++-- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index a0c953d2ba0..2cb66c9fe1c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -270,23 +270,13 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator size_t iteration, const double &maxrotn) -> std::tuple { - // print("before start time ", r_params.print_level()); - // std::cout << "MPI BARRIER 2 " << std::endl; - // world.mpi.Barrier(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // std::cout << "MPI BARRIER 3 " << std::endl; - //world.mpi.Barrier(); - size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); - // std::cout << "MPI BARRIER After Theta X " << std::endl; - // world.mpi.Barrier(); - // compute residual X_space - X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); @@ -299,9 +289,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x - //new_chi.X.truncate_rf(); - // truncate y if compute y - //if (compute_y) new_chi.Y.truncate_rf(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); diff --git a/src/apps/molresponse/testing/generate_frequency_data.cpp b/src/apps/molresponse/testing/generate_frequency_data.cpp index 9783d7899b2..9a245931f97 100644 --- a/src/apps/molresponse/testing/generate_frequency_data.cpp +++ b/src/apps/molresponse/testing/generate_frequency_data.cpp @@ -54,6 +54,8 @@ int main(int argc, char *argv[]) { ifs >> j_read; std::cout << "READ IT" << std::endl; json data = generate_response_data(molecule_path, xc, op, {0}); + + print(data); j_read.merge_patch(data); // make the keyword and add the data std::ofstream ofs("molecules/frequency.json"); diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp index 0b2b865ee59..6c37e4b4863 100644 --- a/src/apps/molresponse/testing/response_data_base.hpp +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -115,9 +115,9 @@ auto generate_dipole_frequencies(const std::string &molecule_name, std::string x json dalton_excited; ifs >> dalton_excited; ::print("Read Dalton Excited for ", molecule_name); - ::print(dalton_excited[molecule_name][xc]["excited-state"]["cc-pVDZ"]["response"]["freq"]); + ::print(dalton_excited[molecule_name][xc]["excited-state"]["aug-cc-pVTZ"]["response"]["freq"]); std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] - ["cc-pVTZ"]["response"]["freq"]; + ["aug-cc-pVTZ"]["response"]["freq"]; auto omega_max = freq.at(0); omega_max = omega_max / 2.0; ::print("max frequency at cc-pVTZ", omega_max); From d4f695e6c144df83b372996f5d34fb72018b20a3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 10 Nov 2022 21:13:52 -0500 Subject: [PATCH 0323/1312] to_json for molecule --- src/madness/chem/molecule.cc | 20 ++++++++++++++++++++ src/madness/chem/molecule.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/src/madness/chem/molecule.cc b/src/madness/chem/molecule.cc index 1b4bdd65972..9cbdf4c20ba 100644 --- a/src/madness/chem/molecule.cc +++ b/src/madness/chem/molecule.cc @@ -440,6 +440,26 @@ const Atom& Molecule::get_atom(unsigned int i) const { return atoms[i]; } +// Returns molecule in qc-schema format +// symbols (nat,) atom symbols in title case. array[string] +// geometry (3*nat,) vector of xyz coordinates [a0] of the atoms. array[number] +// There are optional parameters yet to be implemented +// https://molssi-qc-schema.readthedocs.io/en/latest/auto_topology.html +nlohmann::json Molecule::to_json() const { + nlohmann::json mol_schema; + mol_schema["symbols"] = {}; + mol_schema["geometry"] = {}; + + get_atomic_data(atoms[0].atomic_number).symbol; + for (size_t i = 0; i < natom(); ++i) { + mol_schema["symbols"].push_back(get_atomic_data(atoms[i].atomic_number).symbol); + mol_schema["geometry"].push_back({atoms[i].x, atoms[i].y, atoms[i].z}); + } + return mol_schema; +} + + + void Molecule::print() const { std::string p =parameters.print_to_string(); std::cout.flush(); diff --git a/src/madness/chem/molecule.h b/src/madness/chem/molecule.h index 319c71d877b..25227da631d 100644 --- a/src/madness/chem/molecule.h +++ b/src/madness/chem/molecule.h @@ -511,6 +511,8 @@ namespace madness { void serialize(Archive &ar) { ar &atoms &rcut &core_pot ¶meters &pointgroup_ &field; } + json to_json() const; + json to_json() const; }; }// namespace madness From 4c17b5d77f822bb91c08ebfa06044feade70ef3f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 10 Nov 2022 21:19:11 -0500 Subject: [PATCH 0324/1312] adding to calc json schema --- src/madness/chem/SCF.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 37e0299372b..818957066a2 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -684,13 +684,21 @@ class MolecularEnergy : public OptimizationTargetInterface, public QCPropertyInt CalculationParameters param = calc.param; - + nlohmann::json calc_precision={ }; + calc_precision["eprec"]=calc.molecule.parameters.eprec(); + calc_precision["dconv"]=calc.param.dconv(); + calc_precision["econv"]=calc.param.econv(); + calc_precision["thresh"]=FunctionDefaults<3>::get_thresh(); + calc_precision["k"]=FunctionDefaults<3>::get_k(); + + auto mol_json=this->calc.molecule.to_json(); + int_vals.push_back({"k", FunctionDefaults<3>::get_k()}); int_vals.push_back({"calcinfo_nmo", param.nmo_alpha() + param.nmo_beta()}); int_vals.push_back({"calcinfo_nalpha", param.nalpha()}); int_vals.push_back({"calcinfo_nbeta", param.nbeta()}); int_vals.push_back({"calcinfo_natom", calc.molecule.natom()}); - int_vals.push_back({"k", FunctionDefaults<3>::get_k()}); + to_json(j, int_vals); double_vals.push_back({"return_energy", value(calc.molecule.get_all_coords().flat())}); @@ -704,6 +712,9 @@ class MolecularEnergy : public OptimizationTargetInterface, public QCPropertyInt param.to_json(j); calc.e_data.to_json(j); + j["precision"]=calc_precision; + j["molecule"]=mol_json; + output_schema(param.prefix()+".calc_info", j); } }; From 27190e6f0ee957cc358b342b270a2903d17e97ba Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 10 Nov 2022 21:31:44 -0500 Subject: [PATCH 0325/1312] compile please --- src/madness/chem/SCF.h | 1 - src/madness/chem/molecule.h | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 818957066a2..b5552022879 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -692,7 +692,6 @@ class MolecularEnergy : public OptimizationTargetInterface, public QCPropertyInt calc_precision["k"]=FunctionDefaults<3>::get_k(); auto mol_json=this->calc.molecule.to_json(); - int_vals.push_back({"k", FunctionDefaults<3>::get_k()}); int_vals.push_back({"calcinfo_nmo", param.nmo_alpha() + param.nmo_beta()}); int_vals.push_back({"calcinfo_nalpha", param.nalpha()}); diff --git a/src/madness/chem/molecule.h b/src/madness/chem/molecule.h index 25227da631d..87d3753419f 100644 --- a/src/madness/chem/molecule.h +++ b/src/madness/chem/molecule.h @@ -511,8 +511,7 @@ namespace madness { void serialize(Archive &ar) { ar &atoms &rcut &core_pot ¶meters &pointgroup_ &field; } - json to_json() const; - json to_json() const; + [[nodiscard]] json to_json() const; }; }// namespace madness From 4d2f414c71e35b2941116913ae224329641a8cbd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 10 Nov 2022 21:38:53 -0500 Subject: [PATCH 0326/1312] adding more data to json --- src/apps/molresponse/ResponseBase.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index be6617260f2..56a91470a7e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1834,8 +1834,16 @@ void ResponseBase::output_json() { ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); print(ss.str()); - j_molresponse["time"] = ss.str(); - j_molresponse["wall_time"] = wall_time(); + nlohmann::json calc_precision={ }; + calc_precision["dconv"]=r_params.dconv(); + calc_precision["thresh"]=FunctionDefaults<3>::get_thresh(); + calc_precision["k"]=FunctionDefaults<3>::get_k(); + j_molresponse["precision"]=calc_precision; + nlohmann::json timing={ }; + timing["datetime"] = ss.str(); + timing["wall_time"] = wall_time(); + timing["cpu_time"] = cpu_time(); + j_molresponse["time_data"]=timing; std::ofstream ofs("response_base.json"); ofs << std::setw(4) << j_molresponse; } From 322ad992ce7a65138c72476dbc31e8c116526e32 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 11 Nov 2022 11:52:29 -0500 Subject: [PATCH 0327/1312] switch to small memory algorithm --- src/apps/molresponse/ResponseBase.cpp | 23 ----------------------- src/apps/molresponse/global_functions.cc | 5 +++-- src/apps/molresponse/testing/runners.hpp | 2 +- src/apps/molresponse/x_space.h | 5 +++-- 4 files changed, 7 insertions(+), 28 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 56a91470a7e..101a364872c 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -505,29 +505,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* - auto xy = to_response_matrix(chi_alpha); - auto yx = to_conjugate_response_matrix(chi_alpha); - - auto exchange_response = create_response_matrix(m, 2 * n); - auto conjugate_exchange_response = create_response_matrix(m, 2 * n); - auto full_exchange = create_response_matrix(m, 2 * n); - - world.gop.fence(); - auto phi0_response = to_response_vector(phi0); - std::transform(xy.begin(), xy.end(), exchange_response.begin(), [&](const auto &xy_i) { return newK(xy_i, phi0_response, phi0_response); }); - world.gop.fence(); - std::transform(yx.begin(), yx.end(), conjugate_exchange_response.begin(), [&](const auto &conj_x) { return newK(phi0_response, conj_x, phi0_response); }); - world.gop.fence(); - - - std::transform(exchange_response.begin(), exchange_response.end(), conjugate_exchange_response.begin(), full_exchange.begin(), [&](const auto &kxi, const auto &kyi) { - return add(world, kxi, kyi); - }); - - auto K = to_X_space(full_exchange); -*/ - X_space KX = X_space::zero_functions(world, num_states, num_orbitals); X_space KY = X_space::zero_functions(world, num_states, num_orbitals); auto phi0_c = ::madness::copy(world, phi0); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index dfb6088fdc1..b81d6696d90 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -81,7 +81,8 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu Exchange op{}; op.set_parameters(bra, ket, lo); - op.set_algorithm(op.multiworld_efficient); - return op(vf); + op.set_algorithm(op.small_memory); + auto vk=op(vf); + return vk ; } // sum_i |i> for each p \ No newline at end of file diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 06ba2f11264..4498ff8a9c4 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -444,7 +444,6 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo print(param_calc.print_to_string()); print("param1 != param_calc = ", param1 != param_calc); } - } world.gop.broadcast_serializable(param1, 0); world.gop.broadcast(calcInfo, 0); @@ -834,6 +833,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr } else if (success.second) { // if the previous run succeeded then set the restart path restart_path = success.first; + world.gop.fence(); if (world.rank() == 0) { print("restart_path", restart_path); print("restart_path = success.first", restart_path); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 3372c350197..8973ff72e26 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -144,11 +144,12 @@ namespace madness { auto zeros = X_space(world, n_states, n_orbitals); for (auto &xi: zeros.X) { - xi = ::madness::zero_functions(world, n_orbitals, true); + xi = ::madness::zero_functions(world, n_orbitals, false); } for (auto &yi: zeros.Y) { - yi = ::madness::zero_functions(world, n_orbitals, true); + yi = ::madness::zero_functions(world, n_orbitals, false); } + world.gop.fence(); return zeros; } From c1d80a4204a059b431507c397759f73087dce68c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 11 Nov 2022 14:09:14 -0500 Subject: [PATCH 0328/1312] back to multiworld efficient --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index b81d6696d90..5d3ad94f81b 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -81,7 +81,7 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu Exchange op{}; op.set_parameters(bra, ket, lo); - op.set_algorithm(op.small_memory); + op.set_algorithm(op.multiworld_efficient); auto vk=op(vf); return vk ; } From 06fd24b521c70b0872ea86084da874b2def65342 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 11 Nov 2022 16:30:38 -0500 Subject: [PATCH 0329/1312] 3 options for precision in mad-freq --- src/apps/molresponse/testing/mad-freq.cpp | 19 ++++++------ src/apps/molresponse/testing/runners.hpp | 35 ++++++++++++++--------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index fe020e35e47..f48a51ab9a6 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -44,14 +44,13 @@ auto main(int argc, char *argv[]) -> int { const std::string molecule_name{argv[1]}; const std::string xc{argv[2]}; const std::string op{argv[3]}; - const std::string is_high_prec{argv[4]}; + const std::string precision{argv[4]}; - bool high_prec; - - if (is_high_prec == "high") { - high_prec = true; - } else { - high_prec = false; + if (precision != "high" && precision != "low" && precision != "super") { + if (world.rank() == 0) { + std::cout << "Set precision to low high super" << std::endl; + } + return 1; } try { @@ -60,11 +59,11 @@ auto main(int argc, char *argv[]) -> int { auto f_schema = frequencySchema(world, schema, m_schema, op); if (std::filesystem::exists(m_schema.calc_info_json_path) && std::filesystem::exists(m_schema.moldft_restart)) { // TODO set up to read calc_info json and check if its converged - runFrequencyTests(world, f_schema, high_prec); + runFrequencyTests(world, f_schema, precision); } else { - moldft(world, m_schema, true, false, high_prec); - runFrequencyTests(world, f_schema, high_prec); + moldft(world, m_schema, true, false, precision); + runFrequencyTests(world, f_schema, precision); } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 4498ff8a9c4..6cdf5f32116 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -412,7 +412,7 @@ auto tryMOLDFT(CalculationParameters &p1, CalculationParameters &p2) -> bool { * @param xc */ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, bool restart, - bool high_prec) { + const std::string &precision) { CalculationParameters param1; json calcInfo; @@ -425,12 +425,15 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("xc", moldftSchema.xc); param1.set_user_defined_value("l", 200); - if (high_prec) { + if (precision == "low") { + param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); + param1.set_user_defined_value("dconv", 1e-4); + } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); param1.set_user_defined_value("dconv", 1e-6); } else { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); - param1.set_user_defined_value("dconv", 1e-4); + param1.set_user_defined_value>("protocol", {1e-9}); + param1.set_user_defined_value("dconv", 1e-7); } param1.set_user_defined_value("localize", "new"); @@ -534,13 +537,16 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, */ void set_frequency_response_parameters(ResponseParameters &r_params, const std::string &property, const std::string &xc, const double &frequency, - bool high_precision) { - if (high_precision) { + const std::string &precision) { + if (precision == "high") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); r_params.set_user_defined_value("dconv", 1e-6); - } else { + } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); + } else { + r_params.set_user_defined_value>("protocol", {1e-9}); + r_params.set_user_defined_value("dconv", 1e-7); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(30)); @@ -664,11 +670,11 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par auto RunResponse(World &world, const std::string &filename, double frequency, const std::string &property, const std::string &xc, const std::filesystem::path &moldft_path, std::filesystem::path restart_path, - bool highPrecision) -> std::pair { + const std::string &precision) -> std::pair { // Set the response parameters ResponseParameters r_params{}; - set_frequency_response_parameters(r_params, property, xc, frequency, highPrecision); + set_frequency_response_parameters(r_params, property, xc, frequency, precision); auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, moldft_path, restart_path, true); @@ -678,7 +684,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, std::ifstream ifs("response_base.json"); json response_base; ifs >> response_base; - if (response_base["converged"]) { return {save_path, true}; } + if (response_base["converged"] && response_base["precision"]["dconv"] == r_params.dconv()) { return {save_path, true}; } } auto calc_params = initialize_calc_params(world, std::string(filename)); RHS_Generator rhs_generator; @@ -814,7 +820,7 @@ auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec * @param xc * @param property */ -void runFrequencyTests(World &world, const frequencySchema &schema, bool high_prec) { +void runFrequencyTests(World &world, const frequencySchema &schema, const std::string &high_prec) { std::filesystem::current_path(schema.moldft_path); // add a restart path @@ -827,6 +833,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr if (world.rank() == 0) { print(success.second); } + std::filesystem::current_path(schema.moldft_path); if (first) { first = false; @@ -858,9 +865,9 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr * @param m_schema * @param try_moldft do we try moldft or not... if we try we still may restart * @param restart do we force a restart or not - * @param high_prec high precision or no? + * @param precision high precision or no? */ -void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, bool high_prec) { +void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, const std::string &precision) { if (std::filesystem::is_directory(m_schema.moldft_path)) { if (world.rank() == 0) { @@ -879,7 +886,7 @@ void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; } - runMOLDFT(world, m_schema, try_moldft, restart, high_prec); + runMOLDFT(world, m_schema, try_moldft, restart, precision); } #endif// MADNESS_RUNNERS_HPP From 48419ede2f3cc7838bff35e44e009da75afb2224 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 12 Nov 2022 08:59:15 -0500 Subject: [PATCH 0330/1312] New exchange on ground --- src/apps/molresponse/ResponseBase.cpp | 23 ++++++----- src/apps/molresponse/global_functions.cc | 52 ++++++++++++++++++++++-- src/apps/molresponse/global_functions.h | 1 + src/apps/molresponse/x_space.cc | 5 ++- 4 files changed, 66 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 101a364872c..8f76a350564 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1064,12 +1064,13 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< auto phi0_c = copy(world, phi0_copy); world.gop.fence(); int b = 0; - for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } if (compute_Y) { - b = 0; - for (auto &k0y: K0.Y) { k0y = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); } + auto xX = to_response_matrix(X); + auto kmatrix = ground_exchange(phi0_copy, xX); + K0 = to_X_space(kmatrix); } else { - K0.Y = K0.X.copy(); + K0.X.x = ground_exchange(phi0_copy, Chi_copy.X.x); + K0.Y = K0.X; } if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } @@ -1811,16 +1812,16 @@ void ResponseBase::output_json() { ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); print(ss.str()); - nlohmann::json calc_precision={ }; - calc_precision["dconv"]=r_params.dconv(); - calc_precision["thresh"]=FunctionDefaults<3>::get_thresh(); - calc_precision["k"]=FunctionDefaults<3>::get_k(); - j_molresponse["precision"]=calc_precision; - nlohmann::json timing={ }; + nlohmann::json calc_precision = {}; + calc_precision["dconv"] = r_params.dconv(); + calc_precision["thresh"] = FunctionDefaults<3>::get_thresh(); + calc_precision["k"] = FunctionDefaults<3>::get_k(); + j_molresponse["precision"] = calc_precision; + nlohmann::json timing = {}; timing["datetime"] = ss.str(); timing["wall_time"] = wall_time(); timing["cpu_time"] = cpu_time(); - j_molresponse["time_data"]=timing; + j_molresponse["time_data"] = timing; std::ofstream ofs("response_base.json"); ofs << std::setw(4) << j_molresponse; } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 5d3ad94f81b..f25ce8035d8 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -50,7 +50,7 @@ auto initialize_calc_params(World &world, const std::string &input_file) -> Calc Molecule molecule = ground_calculation.molecule(); r_params.set_ground_state_calculation_data(ground_calculation); r_params.set_derived_values(world, molecule); - if(world.rank()==0){ + if (world.rank() == 0) { r_params.print(); } return {ground_calculation, molecule, r_params}; @@ -74,6 +74,52 @@ auto T(World &world, response_space &f) -> response_space { return T; } +// compute exchange |i> +/** + * Computes ground density exchange on response vectors + * This algorithm places all functions in a single vector, + * computes exchange and returns the result into a response + * matrix + * + * @param v1 + * @param v2 + * @param f + * @return + */ +auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response_matrix { + World &world = phi0[0].world(); + + vecfuncT phi_vect(x.size() * phi0.size()); + vecfuncT x_vect(x.size() * phi0.size()); + + long b = 0; + for (const auto &xi: x) { + auto v0 = madness::copy(world, phi0); + std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { + phi_vect[b] = copy(phi_i); + }); + std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + x_vect[b] = copy(xij); + }); + b++; + } + const double lo = 1.e-10; + + Exchange op{}; + op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); + op.set_algorithm(op.small_memory); + auto exchange_vect = op(x_vect); + + auto exchange_matrix= create_response_matrix(x.size(),phi0.size()); + b=0; + for(auto & xi :exchange_matrix){ + for (auto&xij : xi){ + xij=copy(exchange_vect[b++]); + } + + } + return exchange_matrix; +} // compute exchange |i> auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfuncT { World &world = ket[0].world(); @@ -82,7 +128,7 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu Exchange op{}; op.set_parameters(bra, ket, lo); op.set_algorithm(op.multiworld_efficient); - auto vk=op(vf); - return vk ; + auto vk = op(vf); + return vk; } // sum_i |i> for each p \ No newline at end of file diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 675c45ccac9..e04ab6a16b6 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -44,6 +44,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); +auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response_matrix; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 38644836494..3918f4936f1 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -63,8 +63,11 @@ namespace madness { auto mx = to_response_matrix(x); int b = 0; - for (auto &mi: mx) { + for (const auto &mi: mx) { std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); + std::for_each(mi.begin(), mi.end(),[&](const auto &mix) { + vij[b * num_orbitals] = copy(mix); + }); b++; } return vij; From b2e40e39f19deda23355a8bc2041bbdf52a724af Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 12 Nov 2022 09:19:17 -0500 Subject: [PATCH 0331/1312] Fix bug and add timings --- src/apps/molresponse/global_functions.cc | 25 ++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f25ce8035d8..162effc639e 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -93,31 +93,36 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response vecfuncT x_vect(x.size() * phi0.size()); long b = 0; + long n = 0; + molresponse::start_timer(world); for (const auto &xi: x) { - auto v0 = madness::copy(world, phi0); std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { - phi_vect[b] = copy(phi_i); + phi_vect[b++] = copy(phi_i); }); std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - x_vect[b] = copy(xij); + x_vect[n++] = copy(xij); }); - b++; } + world.gop.fence(); + molresponse::end_timer(world,"ground exchange copy"); + molresponse::start_timer(world); const double lo = 1.e-10; Exchange op{}; op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); op.set_algorithm(op.small_memory); auto exchange_vect = op(x_vect); + molresponse::end_timer(world,"ground exchange apply"); + molresponse::start_timer(world); - auto exchange_matrix= create_response_matrix(x.size(),phi0.size()); - b=0; - for(auto & xi :exchange_matrix){ - for (auto&xij : xi){ - xij=copy(exchange_vect[b++]); + auto exchange_matrix = create_response_matrix(x.size(), phi0.size()); + b = 0; + for (auto &xi: exchange_matrix) { + for (auto &xij: xi) { + xij = copy(exchange_vect[b++]); } - } + molresponse::end_timer(world,"ground exchange reorganize"); return exchange_matrix; } // compute exchange |i> From cc2501c54387fa120a313a7264e724a14fd16e71 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 17:37:06 -0500 Subject: [PATCH 0332/1312] new exchange --- src/apps/molresponse/ResponseBase.cpp | 4 ++-- src/apps/molresponse/global_functions.cc | 26 ++++++++++++++++-------- src/apps/molresponse/global_functions.h | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 8f76a350564..117e6cbd2d5 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1066,10 +1066,10 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< int b = 0; if (compute_Y) { auto xX = to_response_matrix(X); - auto kmatrix = ground_exchange(phi0_copy, xX); + auto kmatrix = ground_exchange(phi0_copy, xX, true); K0 = to_X_space(kmatrix); } else { - K0.X.x = ground_exchange(phi0_copy, Chi_copy.X.x); + K0.X.x = ground_exchange(phi0_copy, Chi_copy.X.x, false); K0.Y = K0.X; } if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 162effc639e..82dd58b3c41 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -86,25 +86,35 @@ auto T(World &world, response_space &f) -> response_space { * @param f * @return */ -auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response_matrix { +auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix { World &world = phi0[0].world(); + auto num_orbitals = phi0.size(); + long n{}; + if (compute_y) { + n = 2; + } else { + n = 1; + } + vecfuncT phi_vect(x.size() * n * phi0.size()); + vecfuncT x_vect(x.size() * n * phi0.size()); + - vecfuncT phi_vect(x.size() * phi0.size()); - vecfuncT x_vect(x.size() * phi0.size()); + int orb_i = 0; + std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i % num_orbitals]); }); long b = 0; - long n = 0; + long j = 0; molresponse::start_timer(world); for (const auto &xi: x) { std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { phi_vect[b++] = copy(phi_i); }); std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - x_vect[n++] = copy(xij); + x_vect[j++] = copy(xij); }); } world.gop.fence(); - molresponse::end_timer(world,"ground exchange copy"); + molresponse::end_timer(world, "ground exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; @@ -112,7 +122,7 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); op.set_algorithm(op.small_memory); auto exchange_vect = op(x_vect); - molresponse::end_timer(world,"ground exchange apply"); + molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); auto exchange_matrix = create_response_matrix(x.size(), phi0.size()); @@ -122,7 +132,7 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response xij = copy(exchange_vect[b++]); } } - molresponse::end_timer(world,"ground exchange reorganize"); + molresponse::end_timer(world, "ground exchange reorganize"); return exchange_matrix; } // compute exchange |i> diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index e04ab6a16b6..c344b08c919 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -44,7 +44,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); -auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response_matrix; +auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } From a1d25f8d4688d89901537e98f7292d1736a4bcd5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 18:31:09 -0500 Subject: [PATCH 0333/1312] new response exchange --- src/apps/molresponse/ResponseBase.cpp | 71 ++++------------------- src/apps/molresponse/global_functions.cc | 73 ++++++++++++++++++++++++ src/apps/molresponse/global_functions.h | 1 + 3 files changed, 85 insertions(+), 60 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 117e6cbd2d5..cef5adddb49 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -504,38 +504,13 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - X_space KX = X_space::zero_functions(world, num_states, num_orbitals); - X_space KY = X_space::zero_functions(world, num_states, num_orbitals); - auto phi0_c = ::madness::copy(world, phi0); - vecfuncT x, y; - for (size_t b = 0; b < num_states; b++) { - x = chi_alpha.X[b]; - y = chi_alpha.Y[b]; - world.gop.fence(); - // |x> - KY.X[b] = newK(phi0, y, phi0_c); - world.gop.fence(); - KX.Y[b] = newK(phi0, x, phi0_c); - world.gop.fence(); - KX.Y[b] = newK(phi0, x, phi0_c); - // |y> - KX.X[b] = newK(x, phi0, phi0_c); - world.gop.fence(); - KY.Y[b] = newK(y, phi0, phi0_c); - world.gop.fence(); - // |i> - } - - + auto x = to_response_matrix(chi_alpha); + auto x_d = to_conjugate_response_matrix(chi_alpha); + auto hf_exchange_matrix = response_exchange(phi0, x, x_d, false); + auto K = to_X_space(hf_exchange_matrix); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } - - // for each response state we compute the Gamma response functions - // trucate all response functions - - // update gamma functions if (r_params.print_level() >= 1) { molresponse::start_timer(world); } /* @@ -546,7 +521,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit */ X_space gamma(world, num_states, num_orbitals); - gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (K) *xcf.hf_exchange_coefficient() + W; //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); @@ -568,9 +543,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); print_inner(world, "xJx", chi_alpha, J); - print_inner(world, "xKXx", chi_alpha, KX); - print_inner(world, "xKYx", chi_alpha, KY); - X_space K = KX + KY; print_inner(world, "xKx", chi_alpha, K); world.gop.fence(); print_inner(world, "xWx", chi_alpha, W); @@ -586,8 +558,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit J.clear(); j_x.clear(); j_y.clear(); - KX.clear(); - KY.clear(); + K.clear(); W.clear(); chi_alpha.clear(); @@ -650,8 +621,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm X_space W = X_space::zero_functions(world, num_states, num_orbitals); X_space J(world, num_states, num_orbitals); - X_space KX = X_space::zero_functions(world, num_states, num_orbitals); - X_space KY = X_space::zero_functions(world, num_states, num_orbitals); + X_space K = X_space::zero_functions(world, num_states, num_orbitals); // std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; // world.mpi.Barrier(); @@ -698,28 +668,10 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - + K.X.x = response_exchange(phi0, xy.X.x, xy.X.x, true); + K.Y = K.X.copy(); // normal exchange - std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), [&](const auto &xi) { - return newK(xi, phi0, phi0); - }); - // conjugate exchange - std::transform(xy.Y.begin(), xy.Y.end(), KY.X.begin(), [&](const auto &yi) { - return newK(phi0, yi, phi0); - }); - /* - for (size_t b = 0; b < num_states; b++) { - vecfuncT x, y; - x = xy.X[b]; - KX.X[b] = newK(x, phi0, phi0); - // |i> - y = xy.Y[b]; - KY.X[b] = newK(phi0, y, phi0); - // |y> - } - */ if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -735,7 +687,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ // update gamma functions - gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (K) *xcf.hf_exchange_coefficient() + W; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } @@ -752,8 +704,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::start_timer(world); } J.clear(); - KX.clear(); - KY.clear(); + K.clear(); W.clear(); xy.clear(); phi0.clear(); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 82dd58b3c41..892cb15df3b 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -121,7 +121,9 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool Exchange op{}; op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); op.set_algorithm(op.small_memory); + world.gop.fence(); auto exchange_vect = op(x_vect); + world.gop.fence(); molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); @@ -132,9 +134,80 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool xij = copy(exchange_vect[b++]); } } + world.gop.fence(); molresponse::end_timer(world, "ground exchange reorganize"); return exchange_matrix; } +// compute full response exchange |i> +/** + * Computes ground density exchange on response vectors + * This algorithm places all functions in a single vector, + * computes exchange and returns the result into a response + * matrix + * + * @param v1 + * @param v2 + * @param f + * @return + */ +auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, const bool static_response) -> response_matrix { + World &world = phi0[0].world(); + auto num_orbitals = phi0.size(); + long n{}; + + n = (static_response) ? 1 : 2; + vecfuncT phi_vect(x.size() * n * phi0.size()); + vecfuncT x_vect(x.size() * n * phi0.size()); + vecfuncT xd_vect(x.size() * n * phi0.size()); + int orb_i = 0; + std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i % num_orbitals]); }); + long b = 0; + long j = 0; + molresponse::start_timer(world); + for (const auto &xi: x) { + std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + x_vect[j++] = copy(xij); + }); + } + for (const auto &xi: x_dagger) { + std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + xd_vect[j++] = copy(xij); + }); + } + world.gop.fence(); + molresponse::end_timer(world, "response exchange copy"); + molresponse::start_timer(world); + const double lo = 1.e-10; + auto phi_copy = madness::copy(world, phi_vect); + Exchange kx{}; + kx.set_parameters(x_vect, phi_copy, lo); + kx.set_algorithm(kx.small_memory); + Exchange kxd{}; + kxd.set_parameters(phi_copy, xd_vect, lo); + kxd.set_algorithm(kxd.small_memory); + + world.gop.fence(); + auto exchange_vector = kx(phi_vect); + world.gop.fence(); + auto exchange_conjugate_vector = kxd(phi_vect); + world.gop.fence(); + molresponse::end_timer(world, "response exchange apply"); + molresponse::start_timer(world); + + vecfuncT exchange = exchange_vector + exchange_conjugate_vector; + + + auto exchange_matrix = create_response_matrix(x.size(), n * phi0.size()); + b = 0; + for (auto &xi: exchange_matrix) { + for (auto &xij: xi) { + xij = copy(exchange[b++]); + } + } + world.gop.fence(); + molresponse::end_timer(world, "response exchange reorganize"); + return exchange_matrix; +} // compute exchange |i> auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfuncT { World &world = ket[0].world(); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index c344b08c919..c1f7921e2fc 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -45,6 +45,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); response_space T(World &world, response_space &f); auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix; +auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, bool static_response) -> response_matrix; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } From 11ad892828ae72a349ba439234d2682fd1309924 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 19:02:37 -0500 Subject: [PATCH 0334/1312] unbug static exchange --- src/apps/molresponse/ResponseBase.cpp | 2 +- src/apps/molresponse/global_functions.cc | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index cef5adddb49..4ebbef4ad61 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -668,7 +668,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K.X.x = response_exchange(phi0, xy.X.x, xy.X.x, true); + K.X.x = response_exchange(phi0, xy.X.x, xy.X.copy().x, true); K.Y = K.X.copy(); // normal exchange diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 892cb15df3b..438d541ac12 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -169,6 +169,8 @@ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const res x_vect[j++] = copy(xij); }); } + world.gop.fence(); + j = 0; for (const auto &xi: x_dagger) { std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { xd_vect[j++] = copy(xij); From dfcc3a2a03ff614406884423d9393a705c89402a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 19:13:08 -0500 Subject: [PATCH 0335/1312] back to multiworld efficient --- src/apps/molresponse/global_functions.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 438d541ac12..c649efe406f 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -120,7 +120,7 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool Exchange op{}; op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); - op.set_algorithm(op.small_memory); + op.set_algorithm(op.multiworld_efficient); world.gop.fence(); auto exchange_vect = op(x_vect); world.gop.fence(); @@ -183,10 +183,10 @@ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const res auto phi_copy = madness::copy(world, phi_vect); Exchange kx{}; kx.set_parameters(x_vect, phi_copy, lo); - kx.set_algorithm(kx.small_memory); + kx.set_algorithm(kx.multiworld_efficient); Exchange kxd{}; kxd.set_parameters(phi_copy, xd_vect, lo); - kxd.set_algorithm(kxd.small_memory); + kxd.set_algorithm(kxd.multiworld_efficient); world.gop.fence(); auto exchange_vector = kx(phi_vect); From 7d6601d5d4d6fc23fa102d2335910384b0f26744 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 19:46:53 -0500 Subject: [PATCH 0336/1312] back to multiworld efficient --- src/apps/molresponse/ResponseBase.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 4ebbef4ad61..b478d5f9fae 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -507,7 +507,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto x = to_response_matrix(chi_alpha); auto x_d = to_conjugate_response_matrix(chi_alpha); auto hf_exchange_matrix = response_exchange(phi0, x, x_d, false); + world.gop.fence(); auto K = to_X_space(hf_exchange_matrix); + world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } From e8b631ca207e307945217682969afe044c16fb0e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 21:27:43 -0500 Subject: [PATCH 0337/1312] whoops i didnt copy the ground-state vectors --- src/apps/molresponse/global_functions.cc | 2 +- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index c649efe406f..f6c7dbd1974 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -160,7 +160,7 @@ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const res vecfuncT x_vect(x.size() * n * phi0.size()); vecfuncT xd_vect(x.size() * n * phi0.size()); int orb_i = 0; - std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i % num_orbitals]); }); + std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); long b = 0; long j = 0; molresponse::start_timer(world); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 6cdf5f32116..2fc9b9a8c6f 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -556,7 +556,7 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: r_params.set_user_defined_value("first_order", true); r_params.set_user_defined_value("plot_all_orbitals", false); r_params.set_user_defined_value("plot", true); - r_params.set_user_defined_value("print_level", 2); + r_params.set_user_defined_value("print_level", 20); r_params.set_user_defined_value("save", true); // set xc, property, frequency,and restart r_params.set_user_defined_value("xc", xc); From 86e1dc8f7f3d271409e9f4b156b02e310ba754d4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 22:14:18 -0500 Subject: [PATCH 0338/1312] debugging response --- src/apps/molresponse/ResponseBase.cpp | 2 ++ src/apps/molresponse/global_functions.cc | 35 ++++++++++++------------ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index b478d5f9fae..83d3330ad14 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -506,6 +506,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto x = to_response_matrix(chi_alpha); auto x_d = to_conjugate_response_matrix(chi_alpha); + auto hf_exchange_matrix = response_exchange(phi0, x, x_d, false); world.gop.fence(); auto K = to_X_space(hf_exchange_matrix); @@ -670,6 +671,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + K.X.x = response_exchange(phi0, xy.X.x, xy.X.copy().x, true); K.Y = K.X.copy(); // normal exchange diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f6c7dbd1974..631d6129867 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -152,46 +152,45 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool */ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, const bool static_response) -> response_matrix { World &world = phi0[0].world(); + molresponse::start_timer(world); auto num_orbitals = phi0.size(); long n{}; - n = (static_response) ? 1 : 2; vecfuncT phi_vect(x.size() * n * phi0.size()); vecfuncT x_vect(x.size() * n * phi0.size()); vecfuncT xd_vect(x.size() * n * phi0.size()); int orb_i = 0; - std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); - long b = 0; + for (auto &phi_i: phi_vect) { phi_i = copy(phi0[orb_i++ % num_orbitals]); } long j = 0; - molresponse::start_timer(world); for (const auto &xi: x) { - std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + for (const auto &xij: xi) { x_vect[j++] = copy(xij); - }); + } } world.gop.fence(); j = 0; for (const auto &xi: x_dagger) { - std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + for (const auto &xij: xi) { xd_vect[j++] = copy(xij); - }); + } } world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; - auto phi_copy = madness::copy(world, phi_vect); - Exchange kx{}; - kx.set_parameters(x_vect, phi_copy, lo); - kx.set_algorithm(kx.multiworld_efficient); - Exchange kxd{}; - kxd.set_parameters(phi_copy, xd_vect, lo); - kxd.set_algorithm(kxd.multiworld_efficient); + auto phi_copy1 = madness::copy(world, phi_vect,true); + auto phi_copy2 = madness::copy(world, phi_vect,true); + Exchange x_phi_K{}; + x_phi_K.set_parameters(x_vect, phi_copy1, lo); + x_phi_K.set_algorithm(x_phi_K.multiworld_efficient); + Exchange phi_xd_K{}; + phi_xd_K.set_parameters(phi_copy2, xd_vect, lo); + phi_xd_K.set_algorithm(phi_xd_K.multiworld_efficient); world.gop.fence(); - auto exchange_vector = kx(phi_vect); + auto exchange_vector = x_phi_K(phi_vect); world.gop.fence(); - auto exchange_conjugate_vector = kxd(phi_vect); + auto exchange_conjugate_vector = phi_xd_K(phi_vect); world.gop.fence(); molresponse::end_timer(world, "response exchange apply"); molresponse::start_timer(world); @@ -200,7 +199,7 @@ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const res auto exchange_matrix = create_response_matrix(x.size(), n * phi0.size()); - b = 0; + int b = 0; for (auto &xi: exchange_matrix) { for (auto &xij: xi) { xij = copy(exchange[b++]); From a2a07031299fbabd16b8c6de09160b6db11e8899 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Mon, 14 Nov 2022 11:53:56 +0100 Subject: [PATCH 0339/1312] fixed compilations problems, modified localizer.cc to handle complex numbers --- src/madness/chem/SCF.h | 2 +- src/madness/chem/localizer.cc | 23 ++++++++++++++++++----- src/madness/tensor/CMakeLists.txt | 2 +- src/madness/tensor/tensor_json.hpp | 2 +- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 37e0299372b..b17437c7d45 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -61,7 +61,7 @@ #include #include -#include "madness/tensor/tensor_json.hpp" +#include #include namespace madness { diff --git a/src/madness/chem/localizer.cc b/src/madness/chem/localizer.cc index b004e7a71c1..20dfb91c164 100644 --- a/src/madness/chem/localizer.cc +++ b/src/madness/chem/localizer.cc @@ -566,8 +566,10 @@ void Localizer::undo_reordering(Tensor& U, const Tensor& occ, Tensor< for (int i = 0; i < nmo; i++) { for (int j = i + 1; j < nmo; j++) { if (occ(i) == occ(j)) { - double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); - double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); +// double sold = std::abs(U(i, i) * U(i, i) + U(j, j) * U(j, j)); +// double snew = std::abs(U(i, j) * U(i, j) + U(j, i) * U(j, i)); + double sold = std::real(U(i,i)*std::conj(U(i,i))) + std::real(U(j,j)*std::conj(U(j,j))); + double snew = std::real(U(i,j)*std::conj(U(i,j))) + std::real(U(j,i)*std::conj(U(j,i))); if (snew > sold) { Tensor tmp = copy(U(_, i)); U(_, i) = U(_, j); @@ -581,9 +583,12 @@ void Localizer::undo_reordering(Tensor& U, const Tensor& occ, Tensor< } // Fix phases. - for (long i = 0; i < nmo; ++i) - if (U(i, i) < 0.0) - U(_, i).scale(-1.0); +// for (long i = 0; i < nmo; ++i) +// if (std::real(U(i, i)) < 0.0) +// U(_, i).scale(-1.0); + + for (long i = 0; i < nmo; ++i) U(_, i).scale(conditional_conj(U(i,i))/std::abs(U(i,i))); + } @@ -737,7 +742,15 @@ template void Localizer::undo_degenerate_rotations(Tensor& U, const Tensor& evals, const double thresh_degenerate); +template +void +Localizer::undo_degenerate_rotations(Tensor& U, const Tensor& evals, const double thresh_degenerate); + template void Localizer::undo_reordering(Tensor& U, const Tensor& occ, Tensor& eval); + +template +void +Localizer::undo_reordering(Tensor& U, const Tensor& occ, Tensor& eval); } diff --git a/src/madness/tensor/CMakeLists.txt b/src/madness/tensor/CMakeLists.txt index 0d5e185149e..6ec51249deb 100644 --- a/src/madness/tensor/CMakeLists.txt +++ b/src/madness/tensor/CMakeLists.txt @@ -20,7 +20,7 @@ set(MADTENSOR_HEADERS aligned.h mxm.h tensorexcept.h tensoriter_spec.h type_data.h basetensor.h tensor.h tensor_macros.h vector_factory.h slice.h tensoriter.h tensor_spec.h vmath.h systolic.h gentensor.h srconf.h distributed_matrix.h - tensortrain.h SVDTensor.h) + tensortrain.h SVDTensor.h tensor_json.hpp) set(MADTENSOR_SOURCES tensor.cc tensoriter.cc basetensor.cc vmath.cc) # logically these headers should be part of their own library (MADclapack) diff --git a/src/madness/tensor/tensor_json.hpp b/src/madness/tensor/tensor_json.hpp index db567d1507c..25263b96eb4 100644 --- a/src/madness/tensor/tensor_json.hpp +++ b/src/madness/tensor/tensor_json.hpp @@ -11,7 +11,7 @@ // #include "catch.hpp" #include -#include "mra.h" +//#include "mra.h" #include "tensor.h" //using namespace madness; From b5ba91da00e7ba66d5baa67b0ef8acb7c5624c34 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 08:00:48 -0500 Subject: [PATCH 0340/1312] make sure i copy correctly --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 631d6129867..ae9f3bc948f 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -100,7 +100,7 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool int orb_i = 0; - std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i % num_orbitals]); }); + std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); long b = 0; long j = 0; From 257c5b7cab1a405f334c789cc426425533319283 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 08:09:05 -0500 Subject: [PATCH 0341/1312] ground exchange --- src/apps/molresponse/global_functions.cc | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index ae9f3bc948f..b7bbc4ef2d0 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -88,6 +88,7 @@ auto T(World &world, response_space &f) -> response_space { */ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix { World &world = phi0[0].world(); + molresponse::start_timer(world); auto num_orbitals = phi0.size(); long n{}; if (compute_y) { @@ -98,17 +99,10 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool vecfuncT phi_vect(x.size() * n * phi0.size()); vecfuncT x_vect(x.size() * n * phi0.size()); - int orb_i = 0; std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); - - long b = 0; long j = 0; - molresponse::start_timer(world); - for (const auto &xi: x) { - std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { - phi_vect[b++] = copy(phi_i); - }); + for (const auto &xi: x) {// copy the response matrix into a single vector of functions std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { x_vect[j++] = copy(xij); }); @@ -117,18 +111,18 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool molresponse::end_timer(world, "ground exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; - Exchange op{}; + // Do exchange by creating operator with parameters op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); op.set_algorithm(op.multiworld_efficient); world.gop.fence(); + // apply exchange phi phi x auto exchange_vect = op(x_vect); - world.gop.fence(); molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); - auto exchange_matrix = create_response_matrix(x.size(), phi0.size()); - b = 0; + auto exchange_matrix = create_response_matrix(x.size(), n*phi0.size()); + long b = 0; for (auto &xi: exchange_matrix) { for (auto &xij: xi) { xij = copy(exchange_vect[b++]); From 5348cfe127a7c66bad708c79c8d11ab5c0085a11 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 08:50:27 -0500 Subject: [PATCH 0342/1312] ground-exchange rework --- src/apps/molresponse/ResponseBase.cpp | 10 +---- src/apps/molresponse/global_functions.cc | 50 +++++++++++++++-------- src/apps/molresponse/global_functions.h | 2 +- src/apps/molresponse/response_functions.h | 8 ++++ 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 83d3330ad14..912e2d7b4f7 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1019,14 +1019,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< auto phi0_c = copy(world, phi0_copy); world.gop.fence(); int b = 0; - if (compute_Y) { - auto xX = to_response_matrix(X); - auto kmatrix = ground_exchange(phi0_copy, xX, true); - K0 = to_X_space(kmatrix); - } else { - K0.X.x = ground_exchange(phi0_copy, Chi_copy.X.x, false); - K0.Y = K0.X; - } + K0 = ground_exchange(phi0_copy, X, compute_Y); if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } // Vnuc+V0+VXC @@ -1044,6 +1037,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } else { V0.Y = V0.X.copy(); } + if (r_params.print_level() >= 20) { print_inner(world, "xV0x", Chi_copy, V0); } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index b7bbc4ef2d0..1ccbfcd716a 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -86,51 +86,65 @@ auto T(World &world, response_space &f) -> response_space { * @param f * @return */ -auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix { +auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); - auto num_orbitals = phi0.size(); + X_space K0 = X_space(world, x.num_states(), x.num_orbitals()); long n{}; + response_matrix xx; + // place all x and y functions into a single response vector if (compute_y) { n = 2; + xx = to_response_matrix(x); + // place all x } else { n = 1; + xx = x.X.x; + // if not compute y we are only working with the x functions } - vecfuncT phi_vect(x.size() * n * phi0.size()); - vecfuncT x_vect(x.size() * n * phi0.size()); - - int orb_i = 0; - std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); - long j = 0; - for (const auto &xi: x) {// copy the response matrix into a single vector of functions + // should have num_states * num_orbitals * n if compute y n=2 else n=1 + vecfuncT x_vector(x.num_states() * n * x.num_orbitals()); + long ij = 0; + for (const auto &xi: xx) {// copy the response matrix into a single vector of functions std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - x_vect[j++] = copy(xij); + x_vector.at(ij++) = copy(xij); }); } + vecfuncT phi_vector(x.num_states() * n * phi0.size()); + int orb_i = 0; + // copy ground-state orbitals into a single long vector + std::for_each(phi_vector.begin(), phi_vector.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; Exchange op{}; // Do exchange by creating operator with parameters - op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); + op.set_parameters(phi_vector, madness::copy(world, phi_vector), lo); op.set_algorithm(op.multiworld_efficient); world.gop.fence(); // apply exchange phi phi x - auto exchange_vect = op(x_vect); + auto exchange_vector = op(x_vector); molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); - auto exchange_matrix = create_response_matrix(x.size(), n*phi0.size()); - long b = 0; + auto exchange_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); + long b = 0; for (auto &xi: exchange_matrix) { for (auto &xij: xi) { - xij = copy(exchange_vect[b++]); + xij = copy(exchange_vector[b++]); } } + if (compute_y) { + K0 = to_X_space(exchange_matrix); + } else { + K0.X = exchange_matrix; + K0.X = K0.Y.copy(); + } + world.gop.fence(); molresponse::end_timer(world, "ground exchange reorganize"); - return exchange_matrix; + return K0; } // compute full response exchange |i> /** @@ -172,8 +186,8 @@ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const res molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; - auto phi_copy1 = madness::copy(world, phi_vect,true); - auto phi_copy2 = madness::copy(world, phi_vect,true); + auto phi_copy1 = madness::copy(world, phi_vect, true); + auto phi_copy2 = madness::copy(world, phi_vect, true); Exchange x_phi_K{}; x_phi_K.set_parameters(x_vect, phi_copy1, lo); x_phi_K.set_algorithm(x_phi_K.multiworld_efficient); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index c1f7921e2fc..64f073f32f5 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -44,7 +44,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); -auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix; +auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space; auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, bool static_response) -> response_matrix; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 34775d7515f..a15e757a81e 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -74,6 +74,14 @@ namespace madness { } return *this;// } + + response_space &operator=(const response_matrix &y) { + // + this->num_states = y.size(); + this->num_orbitals = y[0].size(); + this->x = y; + return *this;// + } // Initialize functions to zero // m = number of response states // n = number of ground state orbitals From 5d535ac10af9d177ff130300266ca7b8624a8aa3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 08:57:11 -0500 Subject: [PATCH 0343/1312] Copy correctly --- .gitignore | 1 + src/apps/molresponse/global_functions.cc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e947318afde..bbf33a63d50 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,4 @@ compile_commands.json *.idx .clang-format /cmake-build-debug/.ninja_deps +compile_commands diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 1ccbfcd716a..80ca4ef2e75 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -139,7 +139,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ K0 = to_X_space(exchange_matrix); } else { K0.X = exchange_matrix; - K0.X = K0.Y.copy(); + K0.Y = K0.X.copy(); } world.gop.fence(); From 7d1213d99aee24b2c6f7f05bf2a91b3c3b6abdb5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 10:27:34 -0500 Subject: [PATCH 0344/1312] Re-write full and static response exchange --- src/apps/molresponse/ResponseBase.cpp | 23 +--- src/apps/molresponse/global_functions.cc | 127 +++++++++++------------ src/apps/molresponse/global_functions.h | 2 +- src/apps/molresponse/x_space.cc | 8 +- 4 files changed, 72 insertions(+), 88 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 912e2d7b4f7..6948e819237 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -503,28 +503,15 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - auto x = to_response_matrix(chi_alpha); - auto x_d = to_conjugate_response_matrix(chi_alpha); - - auto hf_exchange_matrix = response_exchange(phi0, x, x_d, false); - world.gop.fence(); - auto K = to_X_space(hf_exchange_matrix); - world.gop.fence(); + auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* - J.truncate(); - KX.truncate(); - KY.truncate(); - W.truncate(); - */ X_space gamma(world, num_states, num_orbitals); - gamma = (2 * J) - (K) *xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (K * xcf.hf_exchange_coefficient()) + W; //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); @@ -672,9 +659,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K.X.x = response_exchange(phi0, xy.X.x, xy.X.copy().x, true); - K.Y = K.X.copy(); - // normal exchange + K = response_exchange(phi0, xy, false); if (r_params.print_level() >= 1) { @@ -691,7 +676,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ // update gamma functions - gamma = (2 * J) - (K) *xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (K * xcf.hf_exchange_coefficient()) + W; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 80ca4ef2e75..3cc2967ded6 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -2,41 +2,10 @@ #include #include -#include -#include #include "madness/chem/SCFOperators.h" #include "response_parameters.h" -void print_molecule(World &world, const GroundStateCalculation &g_params) { - if (world.rank() == 0) { - // Precision is set to 10 coming in, drop it to 5 - std::cout.precision(5); - std::cout << std::fixed; - - // First get atom - const std::vector atoms = g_params.molecule().get_atoms(); - size_t num_atoms = atoms.size(); - - // Now print - print("\n Geometry Information"); - print(" --------------------\n"); - print(" Units: a.u.\n"); - print(" Atom x y z"); - print("----------------------------------------------------------------"); - for (size_t j = 0; j < num_atoms; j++) { - Vector coords = atoms[j].get_coords(); - std::cout << std::setw(3) << atomic_number_to_symbol(atoms[j].get_atomic_number()); - std::cout << std::setw(18) << std::right << coords[0] << std::setw(18) << coords[1] - << std::setw(18) << coords[2] << endl; - } - print(""); - - // Reset precision - std::cout.precision(10); - std::cout << std::scientific; - } -} auto initialize_calc_params(World &world, const std::string &input_file) -> CalcParams { ResponseParameters r_params{}; @@ -158,64 +127,88 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ * @param f * @return */ -auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, const bool static_response) -> response_matrix { +auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); + X_space K = X_space(world, x.num_states(), x.num_orbitals()); + X_space conjugateK = X_space(world, x.num_states(), x.num_orbitals()); auto num_orbitals = phi0.size(); long n{}; - n = (static_response) ? 1 : 2; - vecfuncT phi_vect(x.size() * n * phi0.size()); - vecfuncT x_vect(x.size() * n * phi0.size()); - vecfuncT xd_vect(x.size() * n * phi0.size()); - int orb_i = 0; - for (auto &phi_i: phi_vect) { phi_i = copy(phi0[orb_i++ % num_orbitals]); } - long j = 0; - for (const auto &xi: x) { - for (const auto &xij: xi) { - x_vect[j++] = copy(xij); - } + response_matrix xx; + response_matrix xx_dagger; + if (compute_y) { + n = 2; + xx = to_response_matrix(x); + xx_dagger = to_conjugate_response_matrix(x); + // place all x + } else { + n = 1; + xx = x.X.x; + xx_dagger = x.X.x; + // if not compute y we are only working with the x functions } - world.gop.fence(); - j = 0; - for (const auto &xi: x_dagger) { - for (const auto &xij: xi) { - xd_vect[j++] = copy(xij); - } + vecfuncT x_vector(x.num_states() * n * x.num_orbitals()); + long ij = 0; + for (const auto &xi: xx) {// copy the response matrix into a single vector of functions + std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + x_vector.at(ij++) = copy(xij); + }); + } + ij = 0; + vecfuncT x_dagger_vector(x.num_states() * n * x.num_orbitals()); + for (const auto &xdi: xx_dagger) {// copy the response matrix into a single vector of functions + std::for_each(xdi.begin(), xdi.end(), [&](const auto &xdij) { + x_dagger_vector.at(ij++) = copy(xdij); + }); } + vecfuncT phi_vector(x.num_states() * n * phi0.size()); + int orb_i = 0; + // copy ground-state orbitals into a single long vector + std::for_each(phi_vector.begin(), phi_vector.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; - auto phi_copy1 = madness::copy(world, phi_vect, true); - auto phi_copy2 = madness::copy(world, phi_vect, true); - Exchange x_phi_K{}; - x_phi_K.set_parameters(x_vect, phi_copy1, lo); - x_phi_K.set_algorithm(x_phi_K.multiworld_efficient); - Exchange phi_xd_K{}; - phi_xd_K.set_parameters(phi_copy2, xd_vect, lo); - phi_xd_K.set_algorithm(phi_xd_K.multiworld_efficient); - + auto phi_copy1 = madness::copy(world, phi_vector, true); + auto phi_copy2 = madness::copy(world, phi_vector, true); + // We have 2 versions of exchange k(x,phi) phi and k(phi,x) phi + // K1.X = k[x ,phi] phi , K2.X = k[phi,y] phi // if static we only compute the top line + // K1.Y = k[y',phi] phi , K2.Y = k[phi,x] phi + // K=K1+K2 + Exchange K1{}; + K1.set_parameters(x_vector, phi_copy1, lo); + K1.set_algorithm(K1.multiworld_efficient); + Exchange K2{}; + K2.set_parameters(phi_copy2, x_dagger_vector, lo); + K2.set_algorithm(K2.multiworld_efficient); world.gop.fence(); - auto exchange_vector = x_phi_K(phi_vect); + + auto K1_vect = K1(phi_vector); world.gop.fence(); - auto exchange_conjugate_vector = phi_xd_K(phi_vect); + auto K2_vect = K2(phi_vector); world.gop.fence(); molresponse::end_timer(world, "response exchange apply"); molresponse::start_timer(world); + vecfuncT K_vector = K1_vect + K2_vect; + world.gop.fence(); - vecfuncT exchange = exchange_vector + exchange_conjugate_vector; - - - auto exchange_matrix = create_response_matrix(x.size(), n * phi0.size()); - int b = 0; + auto exchange_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); + long b = 0; for (auto &xi: exchange_matrix) { for (auto &xij: xi) { - xij = copy(exchange[b++]); + xij = copy(K_vector[b++]); } } world.gop.fence(); + if (compute_y) { + K = to_X_space(exchange_matrix); + } else { + K.X = exchange_matrix; + K.Y = K.X.copy(); + } + world.gop.fence(); molresponse::end_timer(world, "response exchange reorganize"); - return exchange_matrix; + return K; } // compute exchange |i> auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfuncT { diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 64f073f32f5..6733dc52c68 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -45,7 +45,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); response_space T(World &world, response_space &f); auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space; -auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, bool static_response) -> response_matrix; +auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 3918f4936f1..af39ff02b67 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -21,6 +21,7 @@ namespace madness { return matrix; } auto to_response_matrix(const X_space &x) -> response_matrix { + World &world = x.X[0][0].world(); auto mX = response_matrix(x.num_states()); int b = 0; auto num_orbitals = x.num_orbitals(); @@ -29,13 +30,16 @@ namespace madness { mi = vector_real_function_3d(2 * num_orbitals); //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); + world.gop.fence(); std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals); + world.gop.fence(); b++; }); return mX; } auto to_conjugate_response_matrix(const X_space &x) -> response_matrix { + World &world = x.X[0][0].world(); auto mX = response_matrix(x.num_states()); int b = 0; auto num_orbitals = x.num_orbitals(); @@ -44,7 +48,9 @@ namespace madness { mi = vector_real_function_3d(2 * num_orbitals); //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin()); + world.gop.fence(); std::copy(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals); + world.gop.fence(); b++; }); return mX; @@ -65,7 +71,7 @@ namespace madness { int b = 0; for (const auto &mi: mx) { std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); - std::for_each(mi.begin(), mi.end(),[&](const auto &mix) { + std::for_each(mi.begin(), mi.end(), [&](const auto &mix) { vij[b * num_orbitals] = copy(mix); }); b++; From a7891046069518412e24a7f1265307920356a5e8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 12:56:20 -0500 Subject: [PATCH 0345/1312] more debugging --- src/apps/molresponse/ResponseBase.cpp | 1 + src/apps/molresponse/global_functions.cc | 65 ++++++++++++------------ 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6948e819237..d12c6c50637 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -504,6 +504,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange(phi0, chi_alpha, true); + if (r_params.print_level() >= 20) { print_inner(world, "xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 3cc2967ded6..60744b0aea9 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -79,21 +79,16 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ x_vector.at(ij++) = copy(xij); }); } - vecfuncT phi_vector(x.num_states() * n * phi0.size()); + vecfuncT phi_vector1(x.num_states() * n * phi0.size()); + vecfuncT phi_vector2(x.num_states() * n * phi0.size()); int orb_i = 0; // copy ground-state orbitals into a single long vector - std::for_each(phi_vector.begin(), phi_vector.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); + std::for_each(phi_vector1.begin(), phi_vector1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); + phi_vector2 = madness::copy(world, phi_vector1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); molresponse::start_timer(world); - const double lo = 1.e-10; - Exchange op{}; - // Do exchange by creating operator with parameters - op.set_parameters(phi_vector, madness::copy(world, phi_vector), lo); - op.set_algorithm(op.multiworld_efficient); - world.gop.fence(); - // apply exchange phi phi x - auto exchange_vector = op(x_vector); + auto exchange_vector = newK(phi_vector1, phi_vector2, x_vector); molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); @@ -130,8 +125,9 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); + X_space xK1 = X_space(world, x.num_states(), x.num_orbitals()); + X_space xK2 = X_space(world, x.num_states(), x.num_orbitals()); X_space K = X_space(world, x.num_states(), x.num_orbitals()); - X_space conjugateK = X_space(world, x.num_states(), x.num_orbitals()); auto num_orbitals = phi0.size(); long n{}; response_matrix xx; @@ -166,46 +162,51 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput // copy ground-state orbitals into a single long vector std::for_each(phi_vector.begin(), phi_vector.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); world.gop.fence(); - molresponse::end_timer(world, "response exchange copy"); - molresponse::start_timer(world); - const double lo = 1.e-10; auto phi_copy1 = madness::copy(world, phi_vector, true); auto phi_copy2 = madness::copy(world, phi_vector, true); + molresponse::end_timer(world, "response exchange copy"); + molresponse::start_timer(world); // We have 2 versions of exchange k(x,phi) phi and k(phi,x) phi // K1.X = k[x ,phi] phi , K2.X = k[phi,y] phi // if static we only compute the top line // K1.Y = k[y',phi] phi , K2.Y = k[phi,x] phi // K=K1+K2 - Exchange K1{}; - K1.set_parameters(x_vector, phi_copy1, lo); - K1.set_algorithm(K1.multiworld_efficient); - Exchange K2{}; - K2.set_parameters(phi_copy2, x_dagger_vector, lo); - K2.set_algorithm(K2.multiworld_efficient); - world.gop.fence(); - auto K1_vect = K1(phi_vector); + auto K1_vect = newK(x_vector, phi_copy1, phi_vector); world.gop.fence(); - auto K2_vect = K2(phi_vector); + auto K2_vect = newK(phi_copy2, x_dagger_vector, phi_vector); world.gop.fence(); molresponse::end_timer(world, "response exchange apply"); molresponse::start_timer(world); - vecfuncT K_vector = K1_vect + K2_vect; - world.gop.fence(); - - auto exchange_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); + auto K1_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); + auto K2_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); long b = 0; - for (auto &xi: exchange_matrix) { - for (auto &xij: xi) { - xij = copy(K_vector[b++]); + for (auto &k1i: K1_matrix) { + for (auto &k1ij: k1i) { + k1ij = copy(K1_vect[b++]); + } + } + world.gop.fence(); + b = 0; + for (auto &k2i: K2_matrix) { + for (auto &k2ij: k2i) { + k2ij = copy(K2_vect[b++]); } } world.gop.fence(); if (compute_y) { - K = to_X_space(exchange_matrix); + xK1 = to_X_space(K1_matrix); + xK2 = to_X_space(K2_matrix); + world.gop.fence(); + K = xK1 + xK2; } else { - K.X = exchange_matrix; + xK1.X = K1_matrix; + xK2.X = K2_matrix; + world.gop.fence(); + K.X = xK1.X + xK2.X; K.Y = K.X.copy(); } + + world.gop.fence(); molresponse::end_timer(world, "response exchange reorganize"); return K; From 428f133fdcf18bdffc717f19b68c6492cae7db3f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 15:29:07 -0500 Subject: [PATCH 0346/1312] fstream for ofstream --- src/madness/tensor/tensor_json.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/madness/tensor/tensor_json.hpp b/src/madness/tensor/tensor_json.hpp index 25263b96eb4..c98baf3c82a 100644 --- a/src/madness/tensor/tensor_json.hpp +++ b/src/madness/tensor/tensor_json.hpp @@ -9,6 +9,7 @@ #include // #include "catch.hpp" +#include #include //#include "mra.h" From c8c1b25254500aa34a3e280e9a680377e3761572 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 15:29:55 -0500 Subject: [PATCH 0347/1312] fstream for ofstream --- src/madness/tensor/tensor_json.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/madness/tensor/tensor_json.hpp b/src/madness/tensor/tensor_json.hpp index c98baf3c82a..0b6000dbc81 100644 --- a/src/madness/tensor/tensor_json.hpp +++ b/src/madness/tensor/tensor_json.hpp @@ -86,9 +86,6 @@ namespace madness { std::stringstream ss; ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); - print(ss.str()); - print("printing j", j); - j["time"] = ss.str(); j["wall_time"] = wall_time(); From 3021aaf6d3bafe5847ec355f5633064777960d87 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 15 Nov 2022 14:28:27 -0500 Subject: [PATCH 0348/1312] new ground_exchange --- src/apps/molresponse/ResponseBase.cpp | 24 ++++++++++- src/apps/molresponse/global_functions.cc | 54 ++++++++++++++++++++---- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d12c6c50637..db0439a1df5 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -503,6 +503,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 20) { print_inner(world, "xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { @@ -1004,10 +1006,30 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< auto phi0_c = copy(world, phi0_copy); world.gop.fence(); + int b = 0; + for (auto &k0x: K0.X) { + k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); + } + if (compute_Y) { + b = 0; + for (auto &k0x: K0.Y) { + k0x = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); + } + + } else { + K0.Y = K0.X.copy(); + } + if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); + if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]"); } + + if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } // Vnuc+V0+VXC if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 60744b0aea9..ab50ddb20ae 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -7,6 +7,11 @@ #include "response_parameters.h" +static auto set_poisson(World &world, const double lo, const double econv = FunctionDefaults<3>::get_thresh()) { + return std::shared_ptr(CoulombOperatorPtr(world, lo, econv)); +} + + auto initialize_calc_params(World &world, const std::string &input_file) -> CalcParams { ResponseParameters r_params{}; commandlineparser parser; @@ -72,28 +77,59 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ // if not compute y we are only working with the x functions } // should have num_states * num_orbitals * n if compute y n=2 else n=1 - vecfuncT x_vector(x.num_states() * n * x.num_orbitals()); + vecfuncT x_vector(x.num_states() * n * x.num_orbitals() * x.num_orbitals()); long ij = 0; + + + size_t b = 0; for (const auto &xi: xx) {// copy the response matrix into a single vector of functions std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - x_vector.at(ij++) = copy(xij); + auto vect_xij = copy(world, xij, x.num_orbitals(), true); + std::copy(vect_xij.begin(), vect_xij.end(), x_vector.begin() + b * x.num_orbitals());// copy the xij vector n times into a block + b++; }); } - vecfuncT phi_vector1(x.num_states() * n * phi0.size()); - vecfuncT phi_vector2(x.num_states() * n * phi0.size()); + vecfuncT phi1(x.num_orbitals() * x.num_orbitals() * n * x.num_states()); + vecfuncT phi2(x.num_orbitals() * x.num_orbitals() * n * x.num_states()); int orb_i = 0; // copy ground-state orbitals into a single long vector - std::for_each(phi_vector1.begin(), phi_vector1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); - phi_vector2 = madness::copy(world, phi_vector1); + std::for_each(phi1.begin(), phi1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); + phi2 = madness::copy(world, phi1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); molresponse::start_timer(world); - auto exchange_vector = newK(phi_vector1, phi_vector2, x_vector); + reconstruct(world, phi1, false); + reconstruct(world, phi2, false); + reconstruct(world, x_vector, false); + world.gop.fence(); + norm_tree(world, phi1, false); + norm_tree(world, phi2, false); + norm_tree(world, x_vector, false); + world.gop.fence(); + const double lo = 1.0e-10; + auto poisson = set_poisson(world, lo); + auto phiX = mul(world, phi1, x_vector, true); + truncate(world, phiX); + phiX = apply(world, *poisson, phiX); + truncate(world, phiX); + auto phi_phiX = mul(world, phi1, phiX, true); + auto exchange_vector = vecfuncT(x.num_states() * n * x.num_orbitals()); + + b = 0; + for (auto &kij: exchange_vector) { + auto phi_phiX_i = vecfuncT(x.num_orbitals()); + std::copy(phi_phiX.begin() + (b * x.num_orbitals()), phi_phiX.begin() + (b * x.num_orbitals()) + x.num_orbitals(), phi_phiX_i.begin()); + world.gop.fence(); + kij = sum(world, phi_phiX_i, true); + b++; + // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) + } molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); + auto exchange_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); - long b = 0; + b = 0; for (auto &xi: exchange_matrix) { for (auto &xij: xi) { xij = copy(exchange_vector[b++]); @@ -222,4 +258,4 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu auto vk = op(vf); return vk; } -// sum_i |i> for each p \ No newline at end of file +// sum_i |i> for each p From 5001c35ae472f6f9924681d217f999aee26a97ed Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 15 Nov 2022 17:34:37 -0500 Subject: [PATCH 0349/1312] new exchange with old for comparision --- src/apps/molresponse/ResponseBase.cpp | 128 +++++++------ src/apps/molresponse/global_functions.cc | 232 +++++++++++------------ src/apps/molresponse/global_functions.h | 15 +- src/apps/molresponse/x_space.h | 21 +- 4 files changed, 204 insertions(+), 192 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index db0439a1df5..470b9bff739 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -10,10 +10,8 @@ /// \param world /// \param params ResponseBase::ResponseBase(World &world, const CalcParams ¶ms) - : r_params(params.response_parameters), - molecule(params.molecule), - ground_calc(params.ground_calculation), - ground_orbitals(ground_calc.orbitals()), + : r_params(params.response_parameters), molecule(params.molecule), + ground_calc(params.ground_calculation), ground_orbitals(ground_calc.orbitals()), ground_energies(ground_calc.get_energies()), Chi(world, r_params.num_states(), r_params.num_orbitals()) { @@ -253,9 +251,7 @@ auto ResponseBase::make_ground_density(World &world) const -> functionT { compress(world, vsq); functionT rho = factoryT(world); rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { - rho.gaxpy(1.0, vsq[i], 1.0, false); - } + for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], 1.0, false); } //for (const auto &phi_squared: vsq) rho.gaxpy(2.0, phi_squared, 1.0, false); world.gop.fence(); vsq.clear(); @@ -288,9 +284,8 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto r_matrix = to_response_matrix(chi); auto r_phi0 = to_response_vector(ground_orbitals); - std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), [&](const auto &ri) { - return dot(world, ri, r_phi0); - }); + std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), + [&](const auto &ri) { return dot(world, ri, r_phi0); }); } else { density = transition_densityTDA(world, ground_orbitals, chi.X); @@ -357,9 +352,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { - print("------------compute theta x_________"); - } + if (world.rank() == 0) { print("------------compute theta x_________"); } } // std::cout << "MPI BARRIER 3 " << std::endl; // world.mpi.Barrier(); @@ -504,12 +497,34 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space KX = X_space::zero_functions(world, num_states, num_orbitals); + X_space KY = X_space::zero_functions(world, num_states, num_orbitals); + auto phi0_c = madness::copy(world, phi0); + vecfuncT x, y; + for (size_t b = 0; b < num_states; b++) { + x = chi_alpha.X[b]; + y = chi_alpha.Y[b]; - auto K = response_exchange(phi0, chi_alpha, true); - if (r_params.print_level() >= 20) { print_inner(world, "xKx", chi_alpha, K); } + KY.X[b] = newK(phi0, y, phi0_c); + world.gop.fence(); + KX.Y[b] = newK(phi0, x, phi0_c); + world.gop.fence(); + KX.X[b] = newK(x, phi0, phi0_c); + world.gop.fence(); + KY.Y[b] = newK(y, phi0, phi0_c); + world.gop.fence(); + } + auto K = KX + KY; + world.gop.fence(); + if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } + molresponse::start_timer(world); + + K = response_exchange(phi0, chi_alpha, true); + if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -615,6 +630,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm X_space W = X_space::zero_functions(world, num_states, num_orbitals); X_space J(world, num_states, num_orbitals); X_space K = X_space::zero_functions(world, num_states, num_orbitals); + X_space KX = X_space::zero_functions(world, num_states, num_orbitals); + X_space KY = X_space::zero_functions(world, num_states, num_orbitals); // std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; // world.mpi.Barrier(); @@ -662,12 +679,25 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K = response_exchange(phi0, xy, false); + std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), + [&](const auto &xi) { return newK(xi, phi0, phi0); }); + + std::transform(xy.X.begin(), xy.X.end(), KY.X.begin(), + [&](const auto &xi) { return newK(phi0, xi, phi0); }); + K = KX + KY; + world.gop.fence(); + if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); + molresponse::end_timer(world, "old K[omega]", "K[omega]", iter_timing); } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + K = response_exchange(phi0, xy, false); + + if (r_params.print_level() >= 20) { print_inner(world, "new xKx", xy, K); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega"); } // for each response state we compute the Gamma response functions // trucate all response functions if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -941,9 +971,7 @@ auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, // EXC0=W[ground_density] auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator &xc, bool compute_Y) const -> X_space { - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // // std::cout << "MPI BARRIER V0X " << std::endl; // // world.mpi.Barrier(); @@ -1008,14 +1036,10 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< world.gop.fence(); int b = 0; - for (auto &k0x: K0.X) { - k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); - } + for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } if (compute_Y) { b = 0; - for (auto &k0x: K0.Y) { - k0x = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); - } + for (auto &k0x: K0.Y) { k0x = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); } } else { K0.Y = K0.X.copy(); @@ -1102,8 +1126,7 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< } auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_space &g_chi, - const std::string &calc_type) - -> residuals { + const std::string &calc_type) -> residuals { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.X.size(); size_t n = chi.X.size_orbitals(); @@ -1139,8 +1162,7 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, response_solver &kain_x_space, - response_matrix &Xvector, - response_matrix &Xresidual) + response_matrix &Xvector, response_matrix &Xresidual) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); @@ -1162,16 +1184,13 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, } */ response_matrix update(m); - for (auto &update_i: update) { - update_i = vector_real_function_3d(n); - } + for (auto &update_i: update) { update_i = vector_real_function_3d(n); } if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } int b = 0; - std::transform(Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), [&](auto &xi, auto &ri) { - return kain_x_space[b++].update(xi, ri); - }); + std::transform(Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), + [&](auto &xi, auto &ri) { return kain_x_space[b++].update(xi, ri); }); /* std::for_each(kain_x_space.begin(), kain_x_space.end(), [&](auto &ki) { @@ -1426,9 +1445,11 @@ void ResponseBase::solve(World &world) { converged_to_json(j_molresponse); if (r_params.plot()) { auto r_matrix = to_response_matrix(Chi); - do_response_orbital_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, ground_orbitals, r_matrix); + do_response_orbital_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, + ground_orbitals, r_matrix); auto response_densities = make_density(world, Chi); - do_response_density_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, ground_density, response_densities); + do_response_density_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, + ground_density, response_densities); } @@ -1631,8 +1652,7 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct print("phi_i !!", phi_i.max_depth(), " ", (void *) phi_i.get_impl().get()); } */ - std::transform(x.begin(), x.end(), y.begin(), densities.begin(), - compute_density); + std::transform(x.begin(), x.end(), y.begin(), densities.begin(), compute_density); world.gop.fence(); //truncate(world, densities, FunctionDefaults<3>::get_thresh(), true); return densities; @@ -1648,8 +1668,7 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct * @return */ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &gammaOrbitals, - const double load_balance) - -> gamma_orbitals { + const double load_balance) -> gamma_orbitals { auto X = std::get<0>(gammaOrbitals); auto psi0 = std::get<1>(gammaOrbitals); @@ -1661,23 +1680,16 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &gamm molresponse::start_timer(world); LoadBalanceDeux<3> lb(world); - for (const auto &phi0_i: psi0) { - lb.add_tree(phi0_i, lbcost(1.0, 8.0), false); - } + for (const auto &phi0_i: psi0) { lb.add_tree(phi0_i, lbcost(1.0, 8.0), false); } for (const auto &xi: X.X) { - for (const auto &xij: xi) { - lb.add_tree(xij, lbcost(1.0, 8.0), false); - } + for (const auto &xij: xi) { lb.add_tree(xij, lbcost(1.0, 8.0), false); } } for (const auto &yi: X.Y) { - for (const auto &yij: yi) { - lb.add_tree(yij, lbcost(1.0, 8.0), false); - } + for (const auto &yij: yi) { lb.add_tree(yij, lbcost(1.0, 8.0), false); } } world.gop.fence(); // newpamap is the new pmap just based on the orbitals - auto new_process_map = - lb.load_balance(load_balance); + auto new_process_map = lb.load_balance(load_balance); // default process map // We set the new_process_map FunctionDefaults<3>::set_pmap(new_process_map);// set default to be new @@ -1740,8 +1752,7 @@ void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, } auto ResponseBase::project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, - const Molecule &mol) - -> vecfuncT { + const Molecule &mol) -> vecfuncT { vecfuncT ao = vecfuncT(aobasis.nbf(mol)); for (int i = 0; i < aobasis.nbf(mol); ++i) { functorT aofunc(new madchem::AtomicBasisFunctor(aobasis.get_atomic_basis_function(mol, i))); @@ -1797,8 +1808,7 @@ void ResponseBase::print_inner(World &world, const std::string &name, const X_sp auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals, - const response_space &x) - -> vector_real_function_3d { + const response_space &x) -> vector_real_function_3d { // Get sizes size_t m = x.size(); @@ -2147,9 +2157,7 @@ void response_timing::to_json(json &j) { j["time_data"]["wall_time"] = json(); - for (const auto &e: wall_time_data) { - j["time_data"]["wall_time"][e.first] = e.second; - } + for (const auto &e: wall_time_data) { j["time_data"]["wall_time"][e.first] = e.second; } j["time_data"]["cpu_time"] = json(); for (const auto &e: cpu_time_data) { j["time_data"]["cpu_time"][e.first] = e.second; } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index ab50ddb20ae..d12e87a00e7 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -7,7 +7,8 @@ #include "response_parameters.h" -static auto set_poisson(World &world, const double lo, const double econv = FunctionDefaults<3>::get_thresh()) { +static auto set_poisson(World &world, const double lo, + const double econv = FunctionDefaults<3>::get_thresh()) { return std::shared_ptr(CoulombOperatorPtr(world, lo, econv)); } @@ -18,15 +19,11 @@ auto initialize_calc_params(World &world, const std::string &input_file) -> Calc parser.set_keyval("input", input_file); r_params.read_input_and_commandline_options(world, parser, "response"); GroundStateCalculation ground_calculation{world, r_params.archive()}; - if (world.rank() == 0) { - ground_calculation.print_params(); - } + if (world.rank() == 0) { ground_calculation.print_params(); } Molecule molecule = ground_calculation.molecule(); r_params.set_ground_state_calculation_data(ground_calculation); r_params.set_derived_values(world, molecule); - if (world.rank() == 0) { - r_params.print(); - } + if (world.rank() == 0) { r_params.print(); } return {ground_calculation, molecule, r_params}; } // TODO some operator definitions that I will need to move to a separate file @@ -85,7 +82,9 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ for (const auto &xi: xx) {// copy the response matrix into a single vector of functions std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { auto vect_xij = copy(world, xij, x.num_orbitals(), true); - std::copy(vect_xij.begin(), vect_xij.end(), x_vector.begin() + b * x.num_orbitals());// copy the xij vector n times into a block + std::copy(vect_xij.begin(), vect_xij.end(), + x_vector.begin() + + b * x.num_orbitals());// copy the xij vector n times into a block b++; }); } @@ -93,58 +92,12 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ vecfuncT phi2(x.num_orbitals() * x.num_orbitals() * n * x.num_states()); int orb_i = 0; // copy ground-state orbitals into a single long vector - std::for_each(phi1.begin(), phi1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); + std::for_each(phi1.begin(), phi1.end(), + [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); phi2 = madness::copy(world, phi1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); - molresponse::start_timer(world); - reconstruct(world, phi1, false); - reconstruct(world, phi2, false); - reconstruct(world, x_vector, false); - world.gop.fence(); - norm_tree(world, phi1, false); - norm_tree(world, phi2, false); - norm_tree(world, x_vector, false); - world.gop.fence(); - const double lo = 1.0e-10; - auto poisson = set_poisson(world, lo); - auto phiX = mul(world, phi1, x_vector, true); - truncate(world, phiX); - phiX = apply(world, *poisson, phiX); - truncate(world, phiX); - auto phi_phiX = mul(world, phi1, phiX, true); - auto exchange_vector = vecfuncT(x.num_states() * n * x.num_orbitals()); - - b = 0; - for (auto &kij: exchange_vector) { - auto phi_phiX_i = vecfuncT(x.num_orbitals()); - std::copy(phi_phiX.begin() + (b * x.num_orbitals()), phi_phiX.begin() + (b * x.num_orbitals()) + x.num_orbitals(), phi_phiX_i.begin()); - world.gop.fence(); - kij = sum(world, phi_phiX_i, true); - b++; - // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) - } - molresponse::end_timer(world, "ground exchange apply"); - molresponse::start_timer(world); - - - auto exchange_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); - b = 0; - for (auto &xi: exchange_matrix) { - for (auto &xij: xi) { - xij = copy(exchange_vector[b++]); - } - } - if (compute_y) { - K0 = to_X_space(exchange_matrix); - } else { - K0.X = exchange_matrix; - K0.Y = K0.X.copy(); - } - - world.gop.fence(); - molresponse::end_timer(world, "ground exchange reorganize"); - return K0; + return molresponse_exchange(world, phi1, phi2, x_vector, n, x.num_states(), x.num_orbitals()); } // compute full response exchange |i> /** @@ -161,10 +114,12 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); - X_space xK1 = X_space(world, x.num_states(), x.num_orbitals()); - X_space xK2 = X_space(world, x.num_states(), x.num_orbitals()); - X_space K = X_space(world, x.num_states(), x.num_orbitals()); - auto num_orbitals = phi0.size(); + auto num_states = x.num_states(); + auto num_orbitals = x.num_orbitals(); + X_space K1 = X_space(world, num_states, num_orbitals); + X_space K2 = X_space(world, num_states, num_orbitals); + X_space K = X_space(world, num_states, num_orbitals); + long n{}; response_matrix xx; response_matrix xx_dagger; @@ -179,72 +134,65 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput xx_dagger = x.X.x; // if not compute y we are only working with the x functions } - vecfuncT x_vector(x.num_states() * n * x.num_orbitals()); + auto n_exchange = n * num_states * num_orbitals * num_orbitals; + vecfuncT x_vector(n_exchange); long ij = 0; - for (const auto &xi: xx) {// copy the response matrix into a single vector of functions - std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - x_vector.at(ij++) = copy(xij); - }); - } + long x_index = 0; + for (const auto &xi: xx) { // num_states + for (const auto &xij: xi) { //num_orbitals*n + for (int z = 0; z < num_orbitals; z++) {//*num_orbitals + x_index = z + num_orbitals * ij; + x_vector.at(x_index) = copy(xij, false); + } + world.gop.fence(); + ij++; + } + }; ij = 0; - vecfuncT x_dagger_vector(x.num_states() * n * x.num_orbitals()); + x_index = 0; + vecfuncT x_vector_conjugate(n_exchange); for (const auto &xdi: xx_dagger) {// copy the response matrix into a single vector of functions - std::for_each(xdi.begin(), xdi.end(), [&](const auto &xdij) { - x_dagger_vector.at(ij++) = copy(xdij); - }); + for (const auto &xdij: xdi) { + for (int z = 0; z < num_orbitals; z++) { + x_index = z + num_orbitals * ij; + x_vector_conjugate.at(x_index) = copy(xdij, false); + } + world.gop.fence(); + ij++; + } } - vecfuncT phi_vector(x.num_states() * n * phi0.size()); - int orb_i = 0; + vecfuncT phi_right(n_exchange); // copy ground-state orbitals into a single long vector - std::for_each(phi_vector.begin(), phi_vector.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); - world.gop.fence(); - auto phi_copy1 = madness::copy(world, phi_vector, true); - auto phi_copy2 = madness::copy(world, phi_vector, true); - molresponse::end_timer(world, "response exchange copy"); - molresponse::start_timer(world); - // We have 2 versions of exchange k(x,phi) phi and k(phi,x) phi - // K1.X = k[x ,phi] phi , K2.X = k[phi,y] phi // if static we only compute the top line - // K1.Y = k[y',phi] phi , K2.Y = k[phi,x] phi - // K=K1+K2 - - auto K1_vect = newK(x_vector, phi_copy1, phi_vector); - world.gop.fence(); - auto K2_vect = newK(phi_copy2, x_dagger_vector, phi_vector); - world.gop.fence(); - molresponse::end_timer(world, "response exchange apply"); - molresponse::start_timer(world); - auto K1_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); - auto K2_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); - long b = 0; - for (auto &k1i: K1_matrix) { - for (auto &k1ij: k1i) { - k1ij = copy(K1_vect[b++]); + long ii = 0; + long z_index = 0; + long bshift = 0; + auto orb_shift = 0; + std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { + orb_shift = n * num_orbitals * ii; + for (long b = 0; b < num_states; b++) { + bshift = b * n * num_orbitals*num_orbitals; + for (long z = 0; z < n * num_orbitals; z++) { + z_index = bshift + orb_shift + z; + phi_right.at(z_index) = copy(phi_i); + } } - } + ii++; + world.gop.fence(); + }); world.gop.fence(); - b = 0; - for (auto &k2i: K2_matrix) { - for (auto &k2ij: k2i) { - k2ij = copy(K2_vect[b++]); - } - } + vecfuncT phi_left(n_exchange); + long orb_i = 0; + for (auto &phi_i: phi_left) { phi_i = copy(phi0[orb_i++ % num_orbitals]); } world.gop.fence(); - if (compute_y) { - xK1 = to_X_space(K1_matrix); - xK2 = to_X_space(K2_matrix); - world.gop.fence(); - K = xK1 + xK2; - } else { - xK1.X = K1_matrix; - xK2.X = K2_matrix; - world.gop.fence(); - K.X = xK1.X + xK2.X; - K.Y = K.X.copy(); - } - + molresponse::end_timer(world, "response exchange copy"); + molresponse::start_timer(world); + K1 = molresponse_exchange(world, x_vector, phi_left, phi_right, n, num_states, num_orbitals); + K2 = molresponse_exchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, + num_orbitals); + K = K1 + K2; world.gop.fence(); - molresponse::end_timer(world, "response exchange reorganize"); + molresponse::end_timer(world, "response exchange K1+K2 "); return K; } // compute exchange |i> @@ -259,3 +207,53 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu return vk; } // sum_i |i> for each p +auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, const vecfuncT &v3, + const int &n, const int &num_states, const int &num_orbitals) -> X_space { + molresponse::start_timer(world); + + reconstruct(world, v1, false); + reconstruct(world, v2, false); + reconstruct(world, v3, false); + world.gop.fence(); + norm_tree(world, v1, false); + norm_tree(world, v2, false); + norm_tree(world, v3, false); + world.gop.fence(); + const double lo = 1.0e-10; + auto poisson = set_poisson(world, lo); + auto v23 = mul(world, v2, v3, true); + truncate(world, v23); + v23 = apply(world, *poisson, v23); + truncate(world, v23); + auto v123 = mul(world, v1, v23, true); + const long n_exchange{num_states * n * num_orbitals}; + auto exchange_vector = vecfuncT(n_exchange); + + long b = 0; + for (auto &kij: exchange_vector) { + auto phi_phiX_i = vecfuncT(num_orbitals); + std::copy(v123.begin() + (b * num_orbitals), + v123.begin() + (b * num_orbitals) + num_orbitals, phi_phiX_i.begin()); + world.gop.fence(); + kij = sum(world, phi_phiX_i, true); + b++; + // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) + } + molresponse::end_timer(world, "ground exchange apply"); + molresponse::start_timer(world); + auto exchange_matrix = create_response_matrix(num_states, n * num_orbitals); + b = 0; + for (auto &xi: exchange_matrix) { + for (auto &xij: xi) { xij = copy(exchange_vector[b++]); } + } + X_space K0 = X_space::zero_functions(world, num_states, num_orbitals); + if (n == 2) { + K0 = to_X_space(exchange_matrix); + } else { + K0.X = exchange_matrix; + } + world.gop.fence(); + molresponse::end_timer(world, "ground exchange reorganize"); + return K0; +} +// sum_i |i> for each p diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 6733dc52c68..87fbbf3ffcd 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -44,10 +44,19 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); -auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space; -auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space; +auto ground_exchange(const vecfuncT &phi0, const X_space &x, + const bool compute_y) -> X_space; +auto response_exchange(const vecfuncT &phi0, const X_space &x, + const bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); -static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } +// compute exchange |i> +auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, + const vecfuncT &v3, const int &n, + const int &num_states, const int &num_orbitals) + -> X_space; +static double rsquared(const coord_3d &r) { + return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; +} /// Mask function to switch from 0 to 1 smoothly at boundary #endif// SRC_APPS_molresponse_GLOBAL_FUNCTIONS_H_ diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 8973ff72e26..8c406b37f02 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -17,7 +17,8 @@ namespace madness { struct X_space; auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d; - auto create_response_matrix(const size_t &num_state, const size_t &num_orbitals) -> response_matrix; + auto create_response_matrix(const size_t &num_state, const size_t &num_orbitals) + -> response_matrix; auto to_response_matrix(const X_space &x) -> response_matrix; auto to_conjugate_response_matrix(const X_space &x) -> response_matrix; auto to_flattened_vector(const X_space &x) -> vector_real_function_3d; @@ -38,15 +39,13 @@ namespace madness { X_space() : n_states(0), n_orbitals(0), X(), Y() {} // Copy constructor X_space(const X_space &A) - : n_states(size_states(A)), - n_orbitals(size_orbitals(A)), - X(A.X), - Y(A.Y) {} + : n_states(size_states(A)), n_orbitals(size_orbitals(A)), X(A.X), Y(A.Y) {} X_space copy() const { auto &world = X[0][0].world(); auto m = to_response_matrix(*this); auto copy_m = create_response_matrix(num_states(), num_orbitals()); - std::transform(m.begin(), m.end(), copy_m.begin(), [&](const auto &mi) { return madness::copy(world, mi, true); }); + std::transform(m.begin(), m.end(), copy_m.begin(), + [&](const auto &mi) { return madness::copy(world, mi, true); }); return to_X_space(copy_m); } /// Create a new copy of the function with different distribution and optional @@ -60,7 +59,8 @@ namespace madness { auto &world = X[0][0].world(); auto m = to_response_matrix(*this); auto copy_m = create_response_matrix(num_states(), num_orbitals()); - std::transform(m.begin(), m.end(), copy_m.begin(), [&](const auto &mi) { return madness::copy(world, mi, pmap, true); }); + std::transform(m.begin(), m.end(), copy_m.begin(), + [&](const auto &mi) { return madness::copy(world, mi, pmap, true); }); return to_X_space(copy_m); } // assignment @@ -76,9 +76,7 @@ namespace madness { } // Zero Constructor X_space(World &world, size_t n_states, size_t n_orbitals) - : n_states(n_states), - n_orbitals(n_orbitals), - X(world, n_states, n_orbitals), + : n_states(n_states), n_orbitals(n_orbitals), X(world, n_states, n_orbitals), Y(world, n_states, n_orbitals) {} // explicit constructor from 2 resonse_space explicit X_space(response_space &X, response_space &Y) { @@ -357,8 +355,7 @@ namespace madness { World &world; const size_t n_orbtials; response_matrix_allocator(World &world, size_t n_orbtials) - : world(world), - n_orbtials(n_orbtials) {} + : world(world), n_orbtials(n_orbtials) {} // overloading the default constructor () operator vector_real_function_3d operator()() { //print("allocator called with ", int(n_orbtials), " orbitals"); From 4c06db7b24b78f039c98a2fd4e7f0291c0c399d8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 15 Nov 2022 17:50:33 -0500 Subject: [PATCH 0350/1312] truncate after gaxpy --- src/apps/molresponse/global_functions.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index d12e87a00e7..3edb553f1cc 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -170,7 +170,7 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { orb_shift = n * num_orbitals * ii; for (long b = 0; b < num_states; b++) { - bshift = b * n * num_orbitals*num_orbitals; + bshift = b * n * num_orbitals * num_orbitals; for (long z = 0; z < n * num_orbitals; z++) { z_index = bshift + orb_shift + z; phi_right.at(z_index) = copy(phi_i); @@ -239,6 +239,7 @@ auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } + truncate(world, exchange_vector); molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); auto exchange_matrix = create_response_matrix(num_states, n * num_orbitals); From 18d10b21f2492a74cba172d25d92d165dfd26d3e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 16 Nov 2022 14:31:17 -0500 Subject: [PATCH 0351/1312] full exchange debugg --- src/apps/molresponse/ResponseBase.cpp | 11 ++- src/apps/molresponse/global_functions.cc | 109 ++++++++++++++--------- 2 files changed, 75 insertions(+), 45 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 470b9bff739..91f14c18645 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -516,6 +516,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } auto K = KX + KY; world.gop.fence(); + if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", chi_alpha, KX); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, KY); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -682,11 +684,16 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), [&](const auto &xi) { return newK(xi, phi0, phi0); }); - std::transform(xy.X.begin(), xy.X.end(), KY.X.begin(), - [&](const auto &xi) { return newK(phi0, xi, phi0); }); + std::transform(xy.Y.begin(), xy.Y.end(), KY.X.begin(), + [&](const auto &yi) { return newK(phi0, yi, phi0); }); + + + K = KX + KY; world.gop.fence(); if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", xy, KX); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", xy, KY); } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 3edb553f1cc..1ac35e290ce 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -135,61 +135,84 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput // if not compute y we are only working with the x functions } auto n_exchange = n * num_states * num_orbitals * num_orbitals; - vecfuncT x_vector(n_exchange); - long ij = 0; - long x_index = 0; - for (const auto &xi: xx) { // num_states - for (const auto &xij: xi) { //num_orbitals*n - for (int z = 0; z < num_orbitals; z++) {//*num_orbitals - x_index = z + num_orbitals * ij; - x_vector.at(x_index) = copy(xij, false); + vecfuncT phi_right(n_exchange); + long b_index = 0; + long p_index = 0; + long p = 0; + for (long b = 0; b < num_states; b++) { + b_index = b * num_orbitals * num_orbitals * n; + p = 0; + std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_p) { + p_index = p * num_orbitals * n; + for (long j = 0; j < n * num_orbitals; j++) { + phi_right.at(b_index + p_index + j) = copy(phi_p, false); } - world.gop.fence(); - ij++; + p++; + }); + } + + vecfuncT x_vector(n_exchange); + long b = 0; + for (const auto &xb: xx) {// for each state copy the vector n times + b_index = b * num_orbitals * num_orbitals * n; + for (long pi = 0; pi < num_orbitals; pi++) { + p_index = pi * num_orbitals * n; + std::transform(xb.begin(), xb.end(), x_vector.begin() + b_index + p_index, + [&](const auto &xbi) { return copy(xbi); }); } - }; - ij = 0; - x_index = 0; + b++; + } + b = 0; vecfuncT x_vector_conjugate(n_exchange); - for (const auto &xdi: xx_dagger) {// copy the response matrix into a single vector of functions - for (const auto &xdij: xdi) { - for (int z = 0; z < num_orbitals; z++) { - x_index = z + num_orbitals * ij; - x_vector_conjugate.at(x_index) = copy(xdij, false); - } - world.gop.fence(); - ij++; + for (const auto &xdbi: xx_dagger) {// for each state copy the vector n times + b_index = b * num_orbitals * num_orbitals * n; + for (long p = 0; p < num_orbitals; p++) { + p_index = p * num_orbitals * n; + std::transform(xdbi.begin(), xdbi.end(), x_vector_conjugate.begin() + b_index + p_index, + [&](const auto &xbi) { return copy(xbi, false); }); } + b++; } - vecfuncT phi_right(n_exchange); - // copy ground-state orbitals into a single long vector - long ii = 0; - long z_index = 0; - long bshift = 0; - auto orb_shift = 0; - std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { - orb_shift = n * num_orbitals * ii; - for (long b = 0; b < num_states; b++) { - bshift = b * n * num_orbitals * num_orbitals; - for (long z = 0; z < n * num_orbitals; z++) { - z_index = bshift + orb_shift + z; - phi_right.at(z_index) = copy(phi_i); + vecfuncT phi_left=zero_functions(world,n_exchange); + for (long b = 0; b < num_states; b++) { + b_index = b * num_orbitals * num_orbitals * n; + for (long p = 0; p < n * num_orbitals; p++) { + p_index = p * num_orbitals; + for (int i = 0; i < num_orbitals; i++) { + phi_left[b_index + p_index + i] = copy(phi0[i], false); } } - ii++; - world.gop.fence(); - }); + } + world.gop.fence(); - vecfuncT phi_left(n_exchange); - long orb_i = 0; - for (auto &phi_i: phi_left) { phi_i = copy(phi0[orb_i++ % num_orbitals]); } + auto norm_left = norm2s_T(world, phi_left); + auto norm_right = norm2s_T(world, phi_right); + auto norm_x = norm2s_T(world, x_vector); + auto norm_xd = norm2s_T(world, x_vector_conjugate); + world.gop.fence(); + + if (world.rank() == 0) { + + print("left", norm_left); + print("right", norm_right); + print("x", norm_x); + print("xd", norm_xd); + } + + world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); K1 = molresponse_exchange(world, x_vector, phi_left, phi_right, n, num_states, num_orbitals); + world.gop.fence(); + auto xk1 = inner(x, K1); + if (world.rank() == 0) { print("new xk1", xk1); } K2 = molresponse_exchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, num_orbitals); + auto xk2 = inner(x, K2); + if (world.rank() == 0) { print("new xk2", xk2); } + world.gop.fence(); K = K1 + K2; world.gop.fence(); molresponse::end_timer(world, "response exchange K1+K2 "); @@ -231,9 +254,9 @@ auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, long b = 0; for (auto &kij: exchange_vector) { - auto phi_phiX_i = vecfuncT(num_orbitals); - std::copy(v123.begin() + (b * num_orbitals), - v123.begin() + (b * num_orbitals) + num_orbitals, phi_phiX_i.begin()); + auto phi_phiX_i = vecfuncT(num_orbitals * n); + std::copy(v123.begin() + (b * num_orbitals * n), + v123.begin() + (b * num_orbitals) + num_orbitals * n, phi_phiX_i.begin()); world.gop.fence(); kij = sum(world, phi_phiX_i, true); b++; From ef2578fbe2173788466c1d979c6699f67f56ce34 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 16 Nov 2022 18:43:12 -0500 Subject: [PATCH 0352/1312] Exchange Response --- src/apps/molresponse/ResponseBase.cpp | 49 ++----- src/apps/molresponse/global_functions.cc | 157 ++++++++++++----------- src/apps/molresponse/global_functions.h | 4 +- 3 files changed, 97 insertions(+), 113 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 91f14c18645..77626cb1dd7 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -497,27 +497,26 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space KX = X_space::zero_functions(world, num_states, num_orbitals); - X_space KY = X_space::zero_functions(world, num_states, num_orbitals); + X_space K1 = X_space::zero_functions(world, num_states, num_orbitals); + X_space K2 = X_space::zero_functions(world, num_states, num_orbitals); auto phi0_c = madness::copy(world, phi0); vecfuncT x, y; for (size_t b = 0; b < num_states; b++) { x = chi_alpha.X[b]; y = chi_alpha.Y[b]; - - KY.X[b] = newK(phi0, y, phi0_c); + K1.X[b] = newK(x, phi0, phi0_c); world.gop.fence(); - KX.Y[b] = newK(phi0, x, phi0_c); + K1.Y[b] = newK(y, phi0, phi0_c); world.gop.fence(); - KX.X[b] = newK(x, phi0, phi0_c); + K2.X[b] = newK(phi0, y, phi0_c); world.gop.fence(); - KY.Y[b] = newK(y, phi0, phi0_c); + K2.Y[b] = newK(phi0, x, phi0_c); world.gop.fence(); } - auto K = KX + KY; + auto K = K1 + K2; world.gop.fence(); - if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", chi_alpha, KX); } - if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, KY); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", chi_alpha, K1); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, K2); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -525,7 +524,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::start_timer(world); K = response_exchange(phi0, chi_alpha, true); - if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K); } + if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K1); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -596,27 +595,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); - /* - for (const auto &xi: xy.X) { - for (const auto &xij: xi) { - - print("xij", xij.max_depth(), " ", (void *) xij.get_impl().get()); - } - } - for (const auto &yi: xy.Y) { - for (const auto &yij: yi) { - print("yij", yij.max_depth(), " ", (void *) yij.get_impl().get()); - } - } - - for (const auto &pi: phi0) { - print("orbitals", pi.max_depth(), " ", (void *) pi.get_impl().get()); - } - */ - - // std::cout << "MPI After Load Balancing " << std::endl; - // world.mpi.Barrier(); - size_t num_states = xy.num_states(); size_t num_orbitals = xy.num_orbitals(); // shallow copy @@ -688,21 +666,18 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm [&](const auto &yi) { return newK(phi0, yi, phi0); }); - K = KX + KY; world.gop.fence(); - if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", xy, KX); } if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", xy, KY); } - + if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "old K[omega]", "K[omega]", iter_timing); } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange(phi0, xy, false); - if (r_params.print_level() >= 20) { print_inner(world, "new xKx", xy, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega"); } // for each response state we compute the Gamma response functions diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 1ac35e290ce..8a5944f70f8 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -60,6 +60,8 @@ auto T(World &world, response_space &f) -> response_space { auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); + auto num_states = x.num_states(); + auto num_orbitals = x.num_orbitals(); X_space K0 = X_space(world, x.num_states(), x.num_orbitals()); long n{}; response_matrix xx; @@ -73,31 +75,34 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ xx = x.X.x; // if not compute y we are only working with the x functions } + auto n_exchange = n * num_states * num_orbitals * num_orbitals; // should have num_states * num_orbitals * n if compute y n=2 else n=1 - vecfuncT x_vector(x.num_states() * n * x.num_orbitals() * x.num_orbitals()); - long ij = 0; - - - size_t b = 0; - for (const auto &xi: xx) {// copy the response matrix into a single vector of functions - std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - auto vect_xij = copy(world, xij, x.num_orbitals(), true); - std::copy(vect_xij.begin(), vect_xij.end(), - x_vector.begin() + - b * x.num_orbitals());// copy the xij vector n times into a block - b++; + vecfuncT x_vector(n_exchange); + long b_index = 0; + long p_index = 0; + long p = 0; + for (long b = 0; b < num_states; b++) { + b_index = b * num_orbitals * num_orbitals * n; + p = 0; + std::for_each(xx[b].begin(), xx[b].end(), [&](const auto &xb_p) { + p_index = p * num_orbitals; + for (long j = 0; j < num_orbitals; j++) { + x_vector.at(b_index + p_index + j) = copy(xb_p, false); + } + p++; }); } - vecfuncT phi1(x.num_orbitals() * x.num_orbitals() * n * x.num_states()); - vecfuncT phi2(x.num_orbitals() * x.num_orbitals() * n * x.num_states()); + vecfuncT phi1(n_exchange); + vecfuncT phi2(n_exchange); int orb_i = 0; // copy ground-state orbitals into a single long vector std::for_each(phi1.begin(), phi1.end(), - [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); + [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); + world.gop.fence(); phi2 = madness::copy(world, phi1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); - return molresponse_exchange(world, phi1, phi2, x_vector, n, x.num_states(), x.num_orbitals()); + return molresponse_exchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); } // compute full response exchange |i> /** @@ -120,60 +125,63 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput X_space K2 = X_space(world, num_states, num_orbitals); X_space K = X_space(world, num_states, num_orbitals); - long n{}; - response_matrix xx; - response_matrix xx_dagger; - if (compute_y) { - n = 2; - xx = to_response_matrix(x); - xx_dagger = to_conjugate_response_matrix(x); - // place all x - } else { - n = 1; - xx = x.X.x; - xx_dagger = x.X.x; - // if not compute y we are only working with the x functions - } + long n = compute_y ? 2 : 1; auto n_exchange = n * num_states * num_orbitals * num_orbitals; vecfuncT phi_right(n_exchange); long b_index = 0; long p_index = 0; long p = 0; + // 111 222 333 111 222 333 111 222 333 111 222 333 for (long b = 0; b < num_states; b++) { - b_index = b * num_orbitals * num_orbitals * n; + b_index = n * b * num_orbitals * num_orbitals; p = 0; std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_p) { - p_index = p * num_orbitals * n; - for (long j = 0; j < n * num_orbitals; j++) { + p_index = num_orbitals * p; + for (long j = 0; j < num_orbitals; j++) { phi_right.at(b_index + p_index + j) = copy(phi_p, false); } p++; }); + if (compute_y) { + p = 0; + std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_p) { + p_index = num_orbitals * p; + for (long j = 0; j < num_orbitals; j++) { + phi_right.at(num_orbitals*num_orbitals + b_index + p_index + j) = copy(phi_p, false); + } + p++; + }); + } } vecfuncT x_vector(n_exchange); - long b = 0; - for (const auto &xb: xx) {// for each state copy the vector n times - b_index = b * num_orbitals * num_orbitals * n; - for (long pi = 0; pi < num_orbitals; pi++) { - p_index = pi * num_orbitals * n; - std::transform(xb.begin(), xb.end(), x_vector.begin() + b_index + p_index, - [&](const auto &xbi) { return copy(xbi); }); - } - b++; - } - b = 0; vecfuncT x_vector_conjugate(n_exchange); - for (const auto &xdbi: xx_dagger) {// for each state copy the vector n times + for (long b = 0; b < num_states; b++) {// for each state copy the vector n times b_index = b * num_orbitals * num_orbitals * n; - for (long p = 0; p < num_orbitals; p++) { - p_index = p * num_orbitals * n; - std::transform(xdbi.begin(), xdbi.end(), x_vector_conjugate.begin() + b_index + p_index, + for (long j = 0; j < num_orbitals; j++) { + p_index = j * num_orbitals; + std::transform(x.X[b].begin(), x.X[b].end(), x_vector.begin() + b_index + p_index, + [&](const auto &xbi) { return copy(xbi, false); }); + + std::transform(x.Y[b].begin(), x.Y[b].end(), + x_vector_conjugate.begin() + b_index + p_index, [&](const auto &xbi) { return copy(xbi, false); }); } - b++; + if (compute_y) { + long y_shift = num_orbitals * num_orbitals; + for (long j = 0; j < num_orbitals; j++) { + p_index = j * num_orbitals; + std::transform(x.Y[b].begin(), x.Y[b].end(), + x_vector.begin() + b_index + p_index + y_shift, + [&](const auto &ybi) { return copy(ybi, false); }); + std::transform(x.X[b].begin(), x.X[b].end(), + x_vector_conjugate.begin() + b_index + p_index + y_shift, + [&](const auto &ybi) { return copy(ybi, false); }); + } + } } - vecfuncT phi_left=zero_functions(world,n_exchange); + + vecfuncT phi_left(n_exchange); for (long b = 0; b < num_states; b++) { b_index = b * num_orbitals * num_orbitals * n; for (long p = 0; p < n * num_orbitals; p++) { @@ -192,27 +200,24 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput world.gop.fence(); if (world.rank() == 0) { - print("left", norm_left); print("right", norm_right); print("x", norm_x); print("xd", norm_xd); } - - world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); K1 = molresponse_exchange(world, x_vector, phi_left, phi_right, n, num_states, num_orbitals); world.gop.fence(); - auto xk1 = inner(x, K1); - if (world.rank() == 0) { print("new xk1", xk1); } K2 = molresponse_exchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, num_orbitals); - auto xk2 = inner(x, K2); - if (world.rank() == 0) { print("new xk2", xk2); } world.gop.fence(); + auto xk1 = inner(x, K1); + if (world.rank() == 0) { print("new xk1\n", xk1); } + auto xk2 = inner(x, K2); + if (world.rank() == 0) { print("new xk2\n", xk2); } K = K1 + K2; world.gop.fence(); molresponse::end_timer(world, "response exchange K1+K2 "); @@ -230,33 +235,37 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu return vk; } // sum_i |i> for each p -auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, const vecfuncT &v3, - const int &n, const int &num_states, const int &num_orbitals) -> X_space { +auto molresponse_exchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, + const vecfuncT &fp, const int &n, const int &num_states, + const int &num_orbitals) -> X_space { molresponse::start_timer(world); - - reconstruct(world, v1, false); - reconstruct(world, v2, false); - reconstruct(world, v3, false); + reconstruct(world, ket_i, false); + reconstruct(world, bra_i, false); + reconstruct(world, fp, false); world.gop.fence(); - norm_tree(world, v1, false); - norm_tree(world, v2, false); - norm_tree(world, v3, false); + norm_tree(world, ket_i, false); + norm_tree(world, bra_i, false); + norm_tree(world, fp, false); world.gop.fence(); const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); - auto v23 = mul(world, v2, v3, true); - truncate(world, v23); + auto v23 = mul(world, bra_i, fp, true); + + truncate(world, v23, 0.0, true); v23 = apply(world, *poisson, v23); - truncate(world, v23); - auto v123 = mul(world, v1, v23, true); + world.gop.fence(); + truncate(world, v23, 0.0, true); + auto v123 = mul(world, ket_i, v23, true); + world.gop.fence(); const long n_exchange{num_states * n * num_orbitals}; auto exchange_vector = vecfuncT(n_exchange); - long b = 0; + long b_shift = 0; for (auto &kij: exchange_vector) { - auto phi_phiX_i = vecfuncT(num_orbitals * n); - std::copy(v123.begin() + (b * num_orbitals * n), - v123.begin() + (b * num_orbitals) + num_orbitals * n, phi_phiX_i.begin()); + b_shift = b * num_orbitals; + auto phi_phiX_i = vecfuncT(num_orbitals); + std::copy(v123.begin() + b_shift, v123.begin() + b_shift + num_orbitals, + phi_phiX_i.begin()); world.gop.fence(); kij = sum(world, phi_phiX_i, true); b++; diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 87fbbf3ffcd..4e87c230650 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -51,8 +51,8 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> -auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, - const vecfuncT &v3, const int &n, +auto molresponse_exchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, + const vecfuncT &fp, const int &n, const int &num_states, const int &num_orbitals) -> X_space; static double rsquared(const coord_3d &r) { From 9b823b72247b64fbbb7a041848ebaaeaa1f0d2f7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 09:15:45 -0500 Subject: [PATCH 0353/1312] remove norm printing --- src/apps/molresponse/global_functions.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8a5944f70f8..b543d4d10e1 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -191,8 +191,8 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput } } } - world.gop.fence(); + /* auto norm_left = norm2s_T(world, phi_left); auto norm_right = norm2s_T(world, phi_right); auto norm_x = norm2s_T(world, x_vector); @@ -205,6 +205,7 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput print("x", norm_x); print("xd", norm_xd); } + */ world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); From f787804c80638c1a1c164d3b8e1d632d42609d83 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 13:52:35 -0500 Subject: [PATCH 0354/1312] remove old exchange --- src/apps/molresponse/ResponseBase.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 77626cb1dd7..66b78bd1080 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -497,6 +497,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + /* X_space K1 = X_space::zero_functions(world, num_states, num_orbitals); X_space K2 = X_space::zero_functions(world, num_states, num_orbitals); auto phi0_c = madness::copy(world, phi0); @@ -518,19 +519,22 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", chi_alpha, K1); } if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, K2); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } + */ + auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } molresponse::start_timer(world); - K = response_exchange(phi0, chi_alpha, true); - if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K1); } + /* + if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + */ X_space gamma(world, num_states, num_orbitals); - gamma = (2 * J) - (K * xcf.hf_exchange_coefficient()) + W; + gamma = (2 * J) - K * xcf.hf_exchange_coefficient() + W; //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); @@ -657,6 +661,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } } + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), @@ -672,14 +677,16 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", xy, KX); } if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", xy, KY); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "old K[omega]", "K[omega]", iter_timing); } + */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange(phi0, xy, false); if (r_params.print_level() >= 20) { print_inner(world, "new xKx", xy, K); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega"); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); + } // for each response state we compute the Gamma response functions // trucate all response functions if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -691,7 +698,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ // update gamma functions - gamma = (2 * J) - (K * xcf.hf_exchange_coefficient()) + W; + gamma = 2 * J - K * xcf.hf_exchange_coefficient() + W; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } From b415dd1b1fa648385fa262cb03050c4253ac6f1f Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 17 Nov 2022 14:34:05 -0500 Subject: [PATCH 0355/1312] can print {Process,Tagged}Key to std::ostream --- src/madness/world/distributed_id.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/madness/world/distributed_id.h b/src/madness/world/distributed_id.h index cf30903bc1e..1eca998d6bf 100644 --- a/src/madness/world/distributed_id.h +++ b/src/madness/world/distributed_id.h @@ -162,6 +162,13 @@ namespace madness { }; // class ProcessKey + /// Overload redirect to std::ostream to be discoverable via ADL + template + inline std::ostream& operator<<(std::ostream& os, const ProcessKey& key) { + using madness::operators::operator<<; + return os << "{" << key.key() << "," << key.proc() << "}"; + } + /// Key object that uses a tag to differentiate keys. /// \tparam Key The base key type. @@ -236,6 +243,13 @@ namespace madness { }; // class TagKey + /// Overload redirect to std::ostream to be discoverable via ADL + template + inline std::ostream& operator<<(std::ostream& os, const TaggedKey& key) { + using madness::operators::operator<<; + return os << "{" << key.key() << "}"; + } + } // namespace madness namespace std { From 65360f87968d3b0e3689e4e1b1d899d1a824bbf9 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 17 Nov 2022 14:34:36 -0500 Subject: [PATCH 0356/1312] typos --- src/examples/vnucso.cc | 2 +- src/madness/world/worldmem.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/examples/vnucso.cc b/src/examples/vnucso.cc index abcb286c3fa..e14bad4123d 100644 --- a/src/examples/vnucso.cc +++ b/src/examples/vnucso.cc @@ -38,7 +38,7 @@ \file vnucso.cc \brief Solves the Hartree-Fock equation for the 2-cosh potential with spin-orbit in Nuclear - Density Functional Theory witough assumption on spatial symmetry. + Density Functional Theory without assumption of spatial symmetry. \ingroup examples Points of interest diff --git a/src/madness/world/worldmem.cc b/src/madness/world/worldmem.cc index 5e9b03c73e9..6b7025f3cfb 100644 --- a/src/madness/world/worldmem.cc +++ b/src/madness/world/worldmem.cc @@ -247,7 +247,7 @@ namespace madness { return stream; } else throw std::runtime_error( - "madness::print_meminfo_ostream called but print_meminfo_keep_ostream_open() return true; make sure print_meminfo_keep_ostream_open(true) has been called"); + "madness::print_meminfo_ostream called but print_meminfo_keep_ostream_open() returned false; make sure print_meminfo_keep_ostream_open(true) has been called"); } } // namespace madness From bbc26020532db29a34f1c7d1f5d7c71395bf5bd4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 14:56:38 -0500 Subject: [PATCH 0357/1312] debugging --- src/apps/molresponse/ResponseBase.cpp | 3 +- src/apps/molresponse/ResponseBase.hpp | 2 +- src/apps/molresponse/global_functions.cc | 22 +++------ src/apps/molresponse/x_space.cc | 57 ++++++++---------------- src/apps/molresponse/x_space.h | 3 +- 5 files changed, 29 insertions(+), 58 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 66b78bd1080..6a799d1d0bb 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -4,6 +4,7 @@ #include "ResponseBase.hpp" + // Initializes calculation object for both excited state and frequency dependent // Copies both the response and ground state /// Constructs the Base Response @@ -465,6 +466,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit }; // compute j_x = op(rho_x)*phi0 + std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); // compute j_y = op(rho_y)*phi0 @@ -557,7 +559,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::start_timer(world); print_inner(world, "xJx", chi_alpha, J); print_inner(world, "xKx", chi_alpha, K); - world.gop.fence(); print_inner(world, "xWx", chi_alpha, W); print_inner(world, "xGammax", chi_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 8ebaa1a0ac5..d53ce8d2667 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -11,7 +11,7 @@ #include #include -#include "global_functions.h" +#include #include "madness/mra/functypedefs.h" #include "madness/mra/mra.h" #include diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index b543d4d10e1..8a8a2f80856 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -147,7 +147,8 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_p) { p_index = num_orbitals * p; for (long j = 0; j < num_orbitals; j++) { - phi_right.at(num_orbitals*num_orbitals + b_index + p_index + j) = copy(phi_p, false); + phi_right.at(num_orbitals * num_orbitals + b_index + p_index + j) = + copy(phi_p, false); } p++; }); @@ -192,21 +193,6 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput } } world.gop.fence(); - /* - auto norm_left = norm2s_T(world, phi_left); - auto norm_right = norm2s_T(world, phi_right); - auto norm_x = norm2s_T(world, x_vector); - auto norm_xd = norm2s_T(world, x_vector_conjugate); - world.gop.fence(); - - if (world.rank() == 0) { - print("left", norm_left); - print("right", norm_right); - print("x", norm_x); - print("xd", norm_xd); - } - */ - world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); @@ -215,10 +201,12 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput K2 = molresponse_exchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, num_orbitals); world.gop.fence(); + /* auto xk1 = inner(x, K1); if (world.rank() == 0) { print("new xk1\n", xk1); } auto xk2 = inner(x, K2); if (world.rank() == 0) { print("new xk2\n", xk2); } + */ K = K1 + K2; world.gop.fence(); molresponse::end_timer(world, "response exchange K1+K2 "); @@ -273,7 +261,9 @@ auto molresponse_exchange(World &world, const vecfuncT &ket_i, const vecfuncT &b // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } truncate(world, exchange_vector); + world.gop.fence(); molresponse::end_timer(world, "ground exchange apply"); + molresponse::start_timer(world); auto exchange_matrix = create_response_matrix(num_states, n * num_orbitals); b = 0; diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index af39ff02b67..140ddb4d0c9 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -11,13 +11,17 @@ namespace madness { // copy the vector auto response_vector = copy(world, vec); // copy the vector - std::for_each(vec.begin(), vec.end(), [&](const auto &phi0_i) { response_vector.push_back(madness::copy(phi0_i)); }); + std::for_each(vec.begin(), vec.end(), [&](const auto &phi0_i) { + response_vector.push_back(madness::copy(phi0_i)); + }); return response_vector; } - auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) -> response_matrix { + auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) + -> response_matrix { auto matrix = response_matrix(num_states); - std::for_each(matrix.begin(), matrix.end(), [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); + std::for_each(matrix.begin(), matrix.end(), + [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); return matrix; } auto to_response_matrix(const X_space &x) -> response_matrix { @@ -71,9 +75,8 @@ namespace madness { int b = 0; for (const auto &mi: mx) { std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); - std::for_each(mi.begin(), mi.end(), [&](const auto &mix) { - vij[b * num_orbitals] = copy(mix); - }); + std::for_each(mi.begin(), mi.end(), + [&](const auto &mix) { vij[b * num_orbitals] = copy(mix); }); b++; } return vij; @@ -86,22 +89,19 @@ namespace madness { auto num_states = x.size(); auto num_orbitals = size_t(x[0].size() / 2); auto x_space = X_space(world, num_states, num_orbitals); - int b = 0; - std::for_each(x.begin(), x.end(), [&](auto x_vec) { - //auto norm_vi = norm2(world, x_vec); + for (const auto &x_vec: x) { //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } - std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin()); - std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin()); + std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin(), + [&](const auto &xi) { return copy(xi, false); }); + std::transform(x_vec.begin() + num_orbitals, x_vec.end() + num_orbitals, + x_space.Y[b].begin(), [&](const auto &xi) { return copy(xi, false); }); b++; - }); - - // auto norms = x_space.norm2s(); - // if (world.rank() == 0) { print("norms after copy ", norms); } - - + }; return x_space; } + + auto to_conjugate_X_space(const response_matrix &x) -> X_space { World &world = x[0][0].world(); @@ -144,8 +144,6 @@ namespace madness { MADNESS_ASSERT(size_orbitals(A) > 0); MADNESS_ASSERT(same_size(A, B)); - long size = static_cast(A.n_states); - auto a = to_response_matrix(A); auto b = to_response_matrix(B); @@ -165,26 +163,7 @@ namespace madness { std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) { result += matrix_inner(world, ati, b_transpose[p++]); }); - - /* - * TODO Figure out why this won't work - std::inner_product( - a_transpose.begin(), a_transpose.end(), b_transpose.begin(), result, - [](Tensor a, const Tensor& b) { - print("a", a); - print("b", b); - auto ab = a + b; - print("a + b = ", ab); - return ab; - }, - [&](const auto& ai, const auto& bi) { - auto m = matrix_inner(world, ai, bi); - print("m: ", m); - return m; - }); - */ - - //print("results: ", result); + world.gop.fence(); return result; } }// namespace madness diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 8c406b37f02..b8d9fbd1909 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -103,7 +103,8 @@ namespace madness { response_matrix add_x(num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const auto &a, const auto &b) { return add(world, a, b); }); + [&](const auto &a, const auto &b) { return add(world, a, b, false); }); + world.gop.fence(); return to_X_space(add_x); } From aa3a71215be02913b4175f3a22c12ceb3c335845 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 14:58:40 -0500 Subject: [PATCH 0358/1312] remove const qualification from function declarations --- src/apps/molresponse/ResponseBase.cpp | 4 +--- src/apps/molresponse/global_functions.h | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6a799d1d0bb..457f6c00b92 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -496,9 +496,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* X_space K1 = X_space::zero_functions(world, num_states, num_orbitals); X_space K2 = X_space::zero_functions(world, num_states, num_orbitals); @@ -522,6 +519,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, K2); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } */ + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 4e87c230650..ae11edc0301 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -45,9 +45,9 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); response_space T(World &world, response_space &f); auto ground_exchange(const vecfuncT &phi0, const X_space &x, - const bool compute_y) -> X_space; + bool compute_y) -> X_space; auto response_exchange(const vecfuncT &phi0, const X_space &x, - const bool compute_y) -> X_space; + bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> From dd8f17cad42707971e5f307872e5db021f28741a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 15:00:06 -0500 Subject: [PATCH 0359/1312] renaming --- src/apps/molresponse/global_functions.cc | 10 +++++----- src/apps/molresponse/global_functions.h | 17 ++++++----------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8a8a2f80856..90c6b018fd7 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -102,7 +102,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ phi2 = madness::copy(world, phi1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); - return molresponse_exchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); + return molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); } // compute full response exchange |i> /** @@ -196,10 +196,10 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); - K1 = molresponse_exchange(world, x_vector, phi_left, phi_right, n, num_states, num_orbitals); + K1 = molresponseExchange(world, x_vector, phi_left, phi_right, n, num_states, num_orbitals); world.gop.fence(); - K2 = molresponse_exchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, - num_orbitals); + K2 = molresponseExchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, + num_orbitals); world.gop.fence(); /* auto xk1 = inner(x, K1); @@ -224,7 +224,7 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu return vk; } // sum_i |i> for each p -auto molresponse_exchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, +auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, const vecfuncT &fp, const int &n, const int &num_states, const int &num_orbitals) -> X_space { molresponse::start_timer(world); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index ae11edc0301..4a4727422c5 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -44,19 +44,14 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); -auto ground_exchange(const vecfuncT &phi0, const X_space &x, - bool compute_y) -> X_space; -auto response_exchange(const vecfuncT &phi0, const X_space &x, - bool compute_y) -> X_space; +auto ground_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; +auto response_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); +auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, + const vecfuncT &fp, const int &n, const int &num_states, + const int &num_orbitals) -> X_space; vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> -auto molresponse_exchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, - const vecfuncT &fp, const int &n, - const int &num_states, const int &num_orbitals) - -> X_space; -static double rsquared(const coord_3d &r) { - return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; -} +static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } /// Mask function to switch from 0 to 1 smoothly at boundary #endif// SRC_APPS_molresponse_GLOBAL_FUNCTIONS_H_ From 7cfe8fb65bce73b0682a9a336d8ce5860d929989 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 22:15:38 -0500 Subject: [PATCH 0360/1312] some printing --- src/apps/molresponse/ResponseBase.cpp | 2 ++ src/apps/molresponse/global_functions.cc | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 457f6c00b92..ef76c4aa1ab 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1017,6 +1017,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // Intermediaries world.gop.fence(); + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -1035,6 +1036,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 90c6b018fd7..07aef8438f2 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -225,8 +225,8 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu } // sum_i |i> for each p auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, - const vecfuncT &fp, const int &n, const int &num_states, - const int &num_orbitals) -> X_space { + const vecfuncT &fp, const int &n, const int &num_states, + const int &num_orbitals) -> X_space { molresponse::start_timer(world); reconstruct(world, ket_i, false); reconstruct(world, bra_i, false); @@ -262,7 +262,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br } truncate(world, exchange_vector); world.gop.fence(); - molresponse::end_timer(world, "ground exchange apply"); + molresponse::end_timer(world, "exchange apply"); molresponse::start_timer(world); auto exchange_matrix = create_response_matrix(num_states, n * num_orbitals); From 685f492ffce9b68d131d368730a34d3a94ccf432 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 22:15:50 -0500 Subject: [PATCH 0361/1312] bug in transform --- src/apps/molresponse/x_space.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 140ddb4d0c9..f5c34de6932 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -94,7 +94,7 @@ namespace madness { //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin(), [&](const auto &xi) { return copy(xi, false); }); - std::transform(x_vec.begin() + num_orbitals, x_vec.end() + num_orbitals, + std::transform(x_vec.begin() + num_orbitals, x_vec.end() , x_space.Y[b].begin(), [&](const auto &xi) { return copy(xi, false); }); b++; }; From 0480b44a23696536c4636736b786d3699957b6bc Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 22:18:15 -0500 Subject: [PATCH 0362/1312] keep old k0 for comparision --- src/apps/molresponse/ResponseBase.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ef76c4aa1ab..b9a1e51f783 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1017,10 +1017,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // Intermediaries world.gop.fence(); - /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - auto phi0_c = copy(world, phi0_copy); world.gop.fence(); @@ -1035,24 +1032,15 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } - - */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]"); } - - if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } - // Vnuc+V0+VXC if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; - - //v0.truncate(FunctionDefaults<3>::get_thresh(), true); - V0.X = v0 * X.X; V0.X += -1 * K0.X * xcf.hf_exchange_coefficient(); - if (compute_Y) { V0.Y = v0 * X.Y; V0.Y += (-1 * K0.Y * xcf.hf_exchange_coefficient()); @@ -1060,17 +1048,10 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< V0.Y = V0.X.copy(); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", Chi_copy, V0); } - - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } - // std::cout << "MPI BARRIER V0X END " << std::endl; - // world.mpi.Barrier(); - // Basic output - - // Done return V0; } From 1bcd023b227b3e0dcb3e2a4dbe90b74148be87c7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 22:36:48 -0500 Subject: [PATCH 0363/1312] trying to remove std::copy --- src/apps/molresponse/x_space.cc | 34 ++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index f5c34de6932..0c579877b2d 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -32,10 +32,10 @@ namespace madness { std::for_each(mX.begin(), mX.end(), [&](auto &mi) { //auto norm_vi = norm2(world, x_vec); mi = vector_real_function_3d(2 * num_orbitals); - //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } - std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); - world.gop.fence(); - std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals); + std::transform(x.X[b].begin(), x.X[b].end(), mi.begin(), + [&](const auto xbi) { return copy(xbi, false); }); + std::transform(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals, + [&](const auto ybi) { return copy(ybi, false); }); world.gop.fence(); b++; }); @@ -50,10 +50,10 @@ namespace madness { std::for_each(mX.begin(), mX.end(), [&](auto &mi) { //auto norm_vi = norm2(world, x_vec); mi = vector_real_function_3d(2 * num_orbitals); - //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } - std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin()); - world.gop.fence(); - std::copy(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals); + std::transform(x.Y[b].begin(), x.Y[b].end(), mi.begin(), + [&](const auto xbi) { return copy(xbi, false); }); + std::transform(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals, + [&](const auto ybi) { return copy(ybi, false); }); world.gop.fence(); b++; }); @@ -74,9 +74,12 @@ namespace madness { int b = 0; for (const auto &mi: mx) { - std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); + std::transform(mi.begin(), mi.end(), vij.begin() + b * num_orbitals, + [&](const auto mii) { return copy(mii, false); }); + /* std::for_each(mi.begin(), mi.end(), [&](const auto &mix) { vij[b * num_orbitals] = copy(mix); }); + */ b++; } return vij; @@ -94,8 +97,8 @@ namespace madness { //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin(), [&](const auto &xi) { return copy(xi, false); }); - std::transform(x_vec.begin() + num_orbitals, x_vec.end() , - x_space.Y[b].begin(), [&](const auto &xi) { return copy(xi, false); }); + std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin(), + [&](const auto &xi) { return copy(xi, false); }); b++; }; return x_space; @@ -112,12 +115,13 @@ namespace madness { int b = 0; std::for_each(x.begin(), x.end(), [&](auto x_vec) { - //auto norm_vi = norm2(world, x_vec); - //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } - std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.Y[b].begin()); - std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.X[b].begin()); + std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.Y[b].begin(), + [&](const auto &xi) { return copy(xi, false); }); + std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.X[b].begin(), + [&](const auto &xi) { return copy(xi, false); }); b++; }); + world.gop.fence(); // auto norms = x_space.norm2s(); // if (world.rank() == 0) { print("norms after copy ", norms); } From cdd535df8af4abb67671abf827897fa5957e7c44 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 22:52:51 -0500 Subject: [PATCH 0364/1312] back to standard copy for shallow copies --- src/apps/molresponse/ResponseBase.cpp | 2 -- src/apps/molresponse/x_space.cc | 38 +++++++++------------------ 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index b9a1e51f783..20cce21ff83 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -426,8 +426,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit size_t num_states = chi_alpha.num_states(); size_t num_orbitals = chi_alpha.num_orbitals(); - //truncate(world, phi0); - //// chi_alpha.truncate(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 0c579877b2d..c3a6b1d7413 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -24,21 +24,20 @@ namespace madness { [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); return matrix; } + // to response matrix is intended to provide a shallow copy of the response matrix + // to simply reorder the functions auto to_response_matrix(const X_space &x) -> response_matrix { World &world = x.X[0][0].world(); auto mX = response_matrix(x.num_states()); - int b = 0; auto num_orbitals = x.num_orbitals(); + int b = 0; std::for_each(mX.begin(), mX.end(), [&](auto &mi) { - //auto norm_vi = norm2(world, x_vec); mi = vector_real_function_3d(2 * num_orbitals); - std::transform(x.X[b].begin(), x.X[b].end(), mi.begin(), - [&](const auto xbi) { return copy(xbi, false); }); - std::transform(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals, - [&](const auto ybi) { return copy(ybi, false); }); - world.gop.fence(); + std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); // shallow copy + std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals);// shallow copy b++; }); + world.gop.fence(); return mX; } @@ -48,13 +47,9 @@ namespace madness { int b = 0; auto num_orbitals = x.num_orbitals(); std::for_each(mX.begin(), mX.end(), [&](auto &mi) { - //auto norm_vi = norm2(world, x_vec); mi = vector_real_function_3d(2 * num_orbitals); - std::transform(x.Y[b].begin(), x.Y[b].end(), mi.begin(), - [&](const auto xbi) { return copy(xbi, false); }); - std::transform(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals, - [&](const auto ybi) { return copy(ybi, false); }); - world.gop.fence(); + std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin()); // shallow copy + std::copy(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals);// shallow copy b++; }); return mX; @@ -71,15 +66,9 @@ namespace madness { auto num_orbitals = 2 * x.num_orbitals(); auto vij = vector_real_function_3d(x.num_states() * num_orbitals); auto mx = to_response_matrix(x); - int b = 0; for (const auto &mi: mx) { - std::transform(mi.begin(), mi.end(), vij.begin() + b * num_orbitals, - [&](const auto mii) { return copy(mii, false); }); - /* - std::for_each(mi.begin(), mi.end(), - [&](const auto &mix) { vij[b * num_orbitals] = copy(mix); }); - */ + std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); b++; } return vij; @@ -88,19 +77,16 @@ namespace madness { auto to_X_space(const response_matrix &x) -> X_space { World &world = x[0][0].world(); - auto num_states = x.size(); auto num_orbitals = size_t(x[0].size() / 2); auto x_space = X_space(world, num_states, num_orbitals); int b = 0; for (const auto &x_vec: x) { - //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } - std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin(), - [&](const auto &xi) { return copy(xi, false); }); - std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin(), - [&](const auto &xi) { return copy(xi, false); }); + std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin()); + std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin()); b++; }; + world.gop.fence(); return x_space; } From 74e475008d5f697a9cbc51db03d92f941ce57755 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 10:28:41 -0500 Subject: [PATCH 0365/1312] remove old k0 --- src/apps/molresponse/ResponseBase.cpp | 21 ++++----------------- src/apps/molresponse/global_functions.cc | 1 + 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 20cce21ff83..b3c04fd505f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1015,10 +1015,10 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // Intermediaries world.gop.fence(); + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto phi0_c = copy(world, phi0_copy); world.gop.fence(); - int b = 0; for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } if (compute_Y) { @@ -1029,11 +1029,11 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< K0.Y = K0.X.copy(); } if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); - if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]"); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; @@ -1137,21 +1137,8 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, size_t m = chi.num_states(); size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); - - Xvector = to_response_matrix(chi); Xresidual = to_response_matrix(residual_chi); - - /* - for (size_t b = 0; b < m; b++) { - - Xvector[b].X[0] = copy(world, chi.X[b]); - Xvector[b].Y[0] = copy(world, chi.Y[b]); - - Xresidual[b].X[0] = copy(world, residual_chi.X[b]); - Xresidual[b].Y[0] = copy(world, residual_chi.Y[b]); - } - */ response_matrix update(m); for (auto &update_i: update) { update_i = vector_real_function_3d(n); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 07aef8438f2..673df2d422c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -84,6 +84,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ for (long b = 0; b < num_states; b++) { b_index = b * num_orbitals * num_orbitals * n; p = 0; + // for each function in a response vector copy num orbital times std::for_each(xx[b].begin(), xx[b].end(), [&](const auto &xb_p) { p_index = p * num_orbitals; for (long j = 0; j < num_orbitals; j++) { From 20614269f409b776cbffa7bae0d9c832faf614a5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 10:48:27 -0500 Subject: [PATCH 0366/1312] some printing to help debugging --- src/apps/molresponse/FrequencyResponse.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2cb66c9fe1c..5b9e7fbcdb9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -315,20 +315,32 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; + theta_X.X += theta_X.X * x_shifts; theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; + if (world.rank() == 0) { + print("--------------- ThetaX.X------------------"); + } + if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } + + if (world.rank() == 0) { + print("--------------- ThetaX.Y------------------"); + } // apply bsh X_space bsh_X(world, m, n); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + if (world.rank() == 0) { + print("--------------- Apply BSH------------------"); + } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -336,6 +348,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } + if (world.rank() == 0) { + print("--------------- Project BSH------------------"); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); From 1c8bbd713aae43a5b827a46fdf5bde652095bd23 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 18 Nov 2022 17:47:18 +0100 Subject: [PATCH 0367/1312] respect special_points from FunctionFactory --- src/madness/mra/funcimpl.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/madness/mra/funcimpl.h b/src/madness/mra/funcimpl.h index d0ca0000625..69444e57d19 100644 --- a/src/madness/mra/funcimpl.h +++ b/src/madness/mra/funcimpl.h @@ -986,11 +986,15 @@ namespace madness { // additional functors are only evaluated on-demand } else if (functor) { // Project function and optionally refine insert_zero_down_to_initial_level(cdata.key0); + // set the union of the special points of functor and the ones explicitly given to FunctionFactory + std::vector functor_special_points=functor->special_points(); + if (!functor_special_points.empty()) special_points.insert(special_points.end(), functor_special_points.begin(), functor_special_points.end()); + typename dcT::const_iterator end = coeffs.end(); for (typename dcT::const_iterator it=coeffs.begin(); it!=end; ++it) { if (it->second.is_leaf()) woT::task(coeffs.owner(it->first), &implT::project_refine_op, it->first, do_refine, - functor->special_points()); + special_points); } } else { // Set as if a zero function From cf97420103228b1e7eee06f061612d56fae47467 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 12:24:52 -0500 Subject: [PATCH 0368/1312] debugging printing --- src/apps/molresponse/ResponseBase.cpp | 8 +++++--- src/apps/molresponse/response_functions.h | 25 ++++++++--------------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index b3c04fd505f..dc55d3fb25a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -458,22 +458,24 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // compute density with response function dx and orbitals phi0 auto rho_x_b = dot(world, dx, phi0); rho_x_b.truncate(); - // apply the coulomb operator to rho_b rho_x_b = apply(*shared_coulomb_operator, rho_x_b); + world.gop.fence(); return mul_sparse(world, rho_x_b, phi0, mul_tol, true); }; - // compute j_x = op(rho_x)*phi0 - std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); // compute j_y = op(rho_y)*phi0 + if (world.rank() == 0) { print("compute jX"); } std::transform(chi_alpha.Y.begin(), chi_alpha.Y.end(), j_y.begin(), compute_j); + if (world.rank() == 0) { print("compute jy"); } J.X = j_x + j_y; + if (world.rank() == 0) { print("add jx+jy"); } // TODO is copy better than adding? probably? // J.Y=j_x+j_y; J.Y = J.X.copy(); + if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index a15e757a81e..75739dc6fcf 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -53,9 +53,7 @@ namespace madness { * @param y */ response_space(const response_space &y) - : num_states(y.size()), - num_orbitals(y.size_orbitals()), - x(y.x) {} + : num_states(y.size()), num_orbitals(y.size_orbitals()), x(y.x) {} // assignment // Copy assignment should copy the members of y and leave y Unchanged @@ -67,10 +65,10 @@ namespace madness { this->num_orbitals = y.size_orbitals(); this->x = y.x; if (x.size() != num_states) { x.resize(num_states); } - //World &world = y[0][0].world(); + World &world = y[0][0].world(); // print("perhaps this is the problem"); std::transform(y.x.begin(), y.x.end(), x.begin(), - [&](auto yi) { return yi; }); + [&](const auto &yi) { return madness::copy(world, yi, false); }); } return *this;// } @@ -95,12 +93,8 @@ namespace madness { * @param num_orbitals */ response_space(World &world, size_t num_states, size_t num_orbitals) - : num_states(num_states), - num_orbitals(num_orbitals), - x(response_matrix(num_states)) { - for (auto &state: x) { - state = vector_real_function_3d(num_orbitals); - } + : num_states(num_states), num_orbitals(num_orbitals), x(response_matrix(num_states)) { + for (auto &state: x) { state = vector_real_function_3d(num_orbitals); } world.gop.fence(); } // Conversion from respones_matrix @@ -110,9 +104,7 @@ namespace madness { * @param x */ explicit response_space(const response_matrix &x) - : num_states(x.size()), - num_orbitals(x[0].size()), - x(x) {} + : num_states(x.size()), num_orbitals(x[0].size()), x(x) {} // Determines if two ResponseFunctions are the same size friend bool same_size(const response_space &a, const response_space &b) { @@ -281,7 +273,7 @@ namespace madness { std::transform(x.begin(), x.end(), result.x.begin(), - [&world](auto &xi) { return madness::copy(world, xi); }); + [&world](auto &xi) { return madness::copy(world, xi, false); }); world.gop.fence(); @@ -294,7 +286,8 @@ namespace madness { response_space result(world, num_states, num_orbitals); world.gop.fence(); - std::transform(x.begin(), x.end(), result.x.begin(), [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); + std::transform(x.begin(), x.end(), result.x.begin(), + [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); return result; From f524195b492c889b62f243d158ef8218fe90943b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 16:50:02 -0500 Subject: [PATCH 0369/1312] a new assignment operator and rearrange fencing --- src/apps/molresponse/response_functions.h | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 75739dc6fcf..4353ad004da 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -65,10 +65,19 @@ namespace madness { this->num_orbitals = y.size_orbitals(); this->x = y.x; if (x.size() != num_states) { x.resize(num_states); } - World &world = y[0][0].world(); - // print("perhaps this is the problem"); - std::transform(y.x.begin(), y.x.end(), x.begin(), - [&](const auto &yi) { return madness::copy(world, yi, false); }); + // if the functions are initialized then deep copy, + // else shallow copy + // the uninitialized functions. + if (y[0][0].impl_initialized()) { + // print("perhaps this is the problem"); + World &world = y[0][0].world(); + std::transform(y.x.begin(), y.x.end(), x.begin(), + [&](const auto &yi) { return madness::copy(world, yi, false); }); + world.gop.fence(); + } else { + std::transform(y.x.begin(), y.x.end(), x.begin(), + [&](const auto &yi) { return yi; }); + } } return *this;// } @@ -95,7 +104,7 @@ namespace madness { response_space(World &world, size_t num_states, size_t num_orbitals) : num_states(num_states), num_orbitals(num_orbitals), x(response_matrix(num_states)) { for (auto &state: x) { state = vector_real_function_3d(num_orbitals); } - world.gop.fence(); + //world.gop.fence(); } // Conversion from respones_matrix /** From 987a65564bbef04795470ac1aba18471bd6c76ac Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 18:01:38 -0500 Subject: [PATCH 0370/1312] more printing to investigate hangs --- src/apps/molresponse/FrequencyResponse.cpp | 27 ++++++------------ src/apps/molresponse/ResponseBase.cpp | 33 ++++++++++++++++------ 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5b9e7fbcdb9..2381236deed 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -51,8 +51,9 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + kain_x_space.push_back( + XNonlinearSolver( + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -246,7 +247,7 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) print("\n"); // Did we converge? - if (iter == r_params.maxiter() && not converged) { + if (iter == r_params.maxiter() - 1 && not converged) { if (world.rank() == 0) print(" Failed to converge. Reason:"); if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); if (world.rank() == 0) print(" Running analysis on current values.\n"); @@ -306,9 +307,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { - print("--------------- BSH UPDATE RESPONSE------------------"); - } + if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } size_t m = theta_X.X.size(); @@ -320,27 +319,21 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; - if (world.rank() == 0) { - print("--------------- ThetaX.X------------------"); - } + if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } - if (world.rank() == 0) { - print("--------------- ThetaX.Y------------------"); - } + if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } // apply bsh X_space bsh_X(world, m, n); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } - if (world.rank() == 0) { - print("--------------- Apply BSH------------------"); - } + if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -348,9 +341,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0) { - print("--------------- Project BSH------------------"); - } + if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index dc55d3fb25a..7f6edc2e1f5 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -41,11 +41,14 @@ void ResponseBase::check_k(World &world, double thresh, int k) { bool redo = false; // Verify ground state orbitals have correct k if (FunctionDefaults<3>::get_k() != ground_orbitals[0].k()) { + if (world.rank() == 0 && r_params.print_level() > 20) { print("check k ground-orbitals"); } // Re-read orbitals from the archive (assuming // the archive has orbitals stored at a higher // k value than what was previously computed ground_calc.read(world); - reconstruct(world, ground_orbitals); + reconstruct(world, ground_orbitals, true); + + if (world.rank() == 0 && r_params.print_level() > 20) { print("check k reconstruct"); } // Reset correct k (its set in g_params.read) FunctionDefaults<3>::set_k(k); // Project each ground state to correct k @@ -53,11 +56,20 @@ void ResponseBase::check_k(World &world, double thresh, int k) { orbital = project(orbital, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); + if (world.rank() == 0 && r_params.print_level() > 20) { + print("check k project ground-orbitals"); + } // Clean up a bit - truncate(world, ground_orbitals); + truncate(world, ground_orbitals, true); + if (world.rank() == 0 && r_params.print_level() > 20) { + print("check k truncate ground-orbitals"); + } // Now that ground orbitals have correct k lets make the ground density // again ground_density = make_ground_density(world); + if (world.rank() == 0 && r_params.print_level() > 20) { + print("check k make-density ground-orbitals"); + } // Ground state orbitals changed, clear old hamiltonian redo = true; } @@ -67,6 +79,9 @@ void ResponseBase::check_k(World &world, double thresh, int k) { // TODO this doesn't seem right... hamiltonian = HAM; ham_no_diag = HAM_NO_DIAG; + if (world.rank() == 0 && r_params.print_level() > 20) { + print("check k computeHamiltonianPair "); + } } // If we stored the potential, check that too @@ -74,7 +89,7 @@ void ResponseBase::check_k(World &world, double thresh, int k) { if (FunctionDefaults<3>::get_k() != stored_potential[0][0].k()) { // Project the potential into correct k for (auto &potential_vector: stored_potential) { - reconstruct(world, potential_vector); + reconstruct(world, potential_vector, true); for (auto &vi: potential_vector) { vi = project(vi, FunctionDefaults<3>::get_k(), thresh, false); } @@ -82,13 +97,13 @@ void ResponseBase::check_k(World &world, double thresh, int k) { } } if (FunctionDefaults<3>::get_k() != stored_v_coul.k()) - stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, false); + stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, true); if (FunctionDefaults<3>::get_k() != stored_v_nuc.k()) - stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, false); + stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, true); } // Don't forget the mask function as well if (FunctionDefaults<3>::get_k() != mask.k()) { - mask = project(mask, FunctionDefaults<3>::get_k(), thresh, false); + mask = project(mask, FunctionDefaults<3>::get_k(), thresh, true); } ::check_k(world, Chi, thresh, k); @@ -141,6 +156,7 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const Tensor T = 1.0 / 2.0 * (matrix_inner(world, fx, fx) + matrix_inner(world, fy, fy) + matrix_inner(world, fz, fz)); + world.gop.fence(); // Construct phiVphi // v_nuc first @@ -191,6 +207,7 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const if (r_params.store_potential()) { stored_potential.push_back(psif); } psif = mul_sparse(world, phi_i, psif, FunctionDefaults<3>::get_thresh()); gaxpy(world, 1.0, Kphi, 1.0, psif); + world.gop.fence(); } // Only use the exchange above if HF: Tensor phiVphi; @@ -1421,14 +1438,14 @@ void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::ge // Project all x components into correct k for (auto &xi: Chi.X) { - reconstruct(world, xi); + reconstruct(world, xi, true); for (auto &xij: xi) { xij = project(xij, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); } for (auto &yi: Chi.Y) { - reconstruct(world, yi); + reconstruct(world, yi, true); for (auto &yij: yi) { yij = project(yij, FunctionDefaults<3>::get_k(), thresh, false); } From 02e30a9e62004303c32a080a73b97587de57f805 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 18:43:55 -0500 Subject: [PATCH 0371/1312] Revert "more printing to investigate hangs" This reverts commit 987a65564bbef04795470ac1aba18471bd6c76ac. --- src/apps/molresponse/FrequencyResponse.cpp | 27 ++++++++++++------ src/apps/molresponse/ResponseBase.cpp | 33 ++++++---------------- 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2381236deed..5b9e7fbcdb9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -51,9 +51,8 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back( - XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + kain_x_space.push_back(XNonlinearSolver( + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -247,7 +246,7 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) print("\n"); // Did we converge? - if (iter == r_params.maxiter() - 1 && not converged) { + if (iter == r_params.maxiter() && not converged) { if (world.rank() == 0) print(" Failed to converge. Reason:"); if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); if (world.rank() == 0) print(" Running analysis on current values.\n"); @@ -307,7 +306,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } + if (world.rank() == 0) { + print("--------------- BSH UPDATE RESPONSE------------------"); + } } size_t m = theta_X.X.size(); @@ -319,21 +320,27 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; - if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } + if (world.rank() == 0) { + print("--------------- ThetaX.X------------------"); + } if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } - if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } + if (world.rank() == 0) { + print("--------------- ThetaX.Y------------------"); + } // apply bsh X_space bsh_X(world, m, n); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } - if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } + if (world.rank() == 0) { + print("--------------- Apply BSH------------------"); + } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -341,7 +348,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0) { print("--------------- Project BSH------------------"); } + if (world.rank() == 0) { + print("--------------- Project BSH------------------"); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7f6edc2e1f5..dc55d3fb25a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -41,14 +41,11 @@ void ResponseBase::check_k(World &world, double thresh, int k) { bool redo = false; // Verify ground state orbitals have correct k if (FunctionDefaults<3>::get_k() != ground_orbitals[0].k()) { - if (world.rank() == 0 && r_params.print_level() > 20) { print("check k ground-orbitals"); } // Re-read orbitals from the archive (assuming // the archive has orbitals stored at a higher // k value than what was previously computed ground_calc.read(world); - reconstruct(world, ground_orbitals, true); - - if (world.rank() == 0 && r_params.print_level() > 20) { print("check k reconstruct"); } + reconstruct(world, ground_orbitals); // Reset correct k (its set in g_params.read) FunctionDefaults<3>::set_k(k); // Project each ground state to correct k @@ -56,20 +53,11 @@ void ResponseBase::check_k(World &world, double thresh, int k) { orbital = project(orbital, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); - if (world.rank() == 0 && r_params.print_level() > 20) { - print("check k project ground-orbitals"); - } // Clean up a bit - truncate(world, ground_orbitals, true); - if (world.rank() == 0 && r_params.print_level() > 20) { - print("check k truncate ground-orbitals"); - } + truncate(world, ground_orbitals); // Now that ground orbitals have correct k lets make the ground density // again ground_density = make_ground_density(world); - if (world.rank() == 0 && r_params.print_level() > 20) { - print("check k make-density ground-orbitals"); - } // Ground state orbitals changed, clear old hamiltonian redo = true; } @@ -79,9 +67,6 @@ void ResponseBase::check_k(World &world, double thresh, int k) { // TODO this doesn't seem right... hamiltonian = HAM; ham_no_diag = HAM_NO_DIAG; - if (world.rank() == 0 && r_params.print_level() > 20) { - print("check k computeHamiltonianPair "); - } } // If we stored the potential, check that too @@ -89,7 +74,7 @@ void ResponseBase::check_k(World &world, double thresh, int k) { if (FunctionDefaults<3>::get_k() != stored_potential[0][0].k()) { // Project the potential into correct k for (auto &potential_vector: stored_potential) { - reconstruct(world, potential_vector, true); + reconstruct(world, potential_vector); for (auto &vi: potential_vector) { vi = project(vi, FunctionDefaults<3>::get_k(), thresh, false); } @@ -97,13 +82,13 @@ void ResponseBase::check_k(World &world, double thresh, int k) { } } if (FunctionDefaults<3>::get_k() != stored_v_coul.k()) - stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, true); + stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, false); if (FunctionDefaults<3>::get_k() != stored_v_nuc.k()) - stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, true); + stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, false); } // Don't forget the mask function as well if (FunctionDefaults<3>::get_k() != mask.k()) { - mask = project(mask, FunctionDefaults<3>::get_k(), thresh, true); + mask = project(mask, FunctionDefaults<3>::get_k(), thresh, false); } ::check_k(world, Chi, thresh, k); @@ -156,7 +141,6 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const Tensor T = 1.0 / 2.0 * (matrix_inner(world, fx, fx) + matrix_inner(world, fy, fy) + matrix_inner(world, fz, fz)); - world.gop.fence(); // Construct phiVphi // v_nuc first @@ -207,7 +191,6 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const if (r_params.store_potential()) { stored_potential.push_back(psif); } psif = mul_sparse(world, phi_i, psif, FunctionDefaults<3>::get_thresh()); gaxpy(world, 1.0, Kphi, 1.0, psif); - world.gop.fence(); } // Only use the exchange above if HF: Tensor phiVphi; @@ -1438,14 +1421,14 @@ void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::ge // Project all x components into correct k for (auto &xi: Chi.X) { - reconstruct(world, xi, true); + reconstruct(world, xi); for (auto &xij: xi) { xij = project(xij, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); } for (auto &yi: Chi.Y) { - reconstruct(world, yi, true); + reconstruct(world, yi); for (auto &yij: yi) { yij = project(yij, FunctionDefaults<3>::get_k(), thresh, false); } From 9463f0ad76eb4e5e4976ae05554677d07bcaa654 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 18:48:27 -0500 Subject: [PATCH 0372/1312] some printing between protocols --- src/apps/molresponse/ResponseBase.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index dc55d3fb25a..8e8abf183e3 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1379,6 +1379,7 @@ void ResponseBase::solve(World &world) { for (const auto &iter_thresh: protocol) { // We set the protocol and function defaults here for the given threshold of set_protocol(world, iter_thresh); + if (world.rank() == 0) { print("Succesfully set protocol"); } // protocol if (first_protocol) { if (r_params.restart()) { @@ -1389,11 +1390,14 @@ void ResponseBase::solve(World &world) { first_protocol = false; } else { this->initialize(world); + if (world.rank() == 0) { print("Succesfully initialized "); } } check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); + if (world.rank() == 0) { print("Succesfully check K first initialization "); } first_protocol = false; } else { check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); + if (world.rank() == 0) { print("Succesfully check K not first initialization "); } } protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... From f332a543950f3319cb0a276ec159710b664bc42b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 14:52:00 -0500 Subject: [PATCH 0373/1312] lambda reference bug --- src/apps/molresponse/response_functions.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 4353ad004da..e5b1a7315e8 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -360,13 +360,13 @@ namespace madness { void compress_rf() { //for (size_t k = 0; k < num_states; k++) { compress(x[0][0].world(), x[k], true); } auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto xi) { compress(world, xi, true); }); + std::for_each(x.begin(), x.end(), [&](auto& xi) { compress(world, xi, true); }); } void reconstruct_rf() { //for (size_t k = 0; k < num_states; k++) { reconstruct(x[0][0].world(), x[k], true); } auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto xi) { reconstruct(world, xi, true); }); + std::for_each(x.begin(), x.end(), [&](auto& xi) { reconstruct(world, xi, true); }); } void truncate_rf() { @@ -380,7 +380,7 @@ namespace madness { void truncate_rf(double tol) { auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto xi) { truncate(world, xi, tol, true); }); + std::for_each(x.begin(), x.end(), [&](auto& xi) { truncate(world, xi, tol, true); }); /* for (size_t k = 0; k < num_states; k++) { truncate(x[0][0].world(), x[k], tol, true); } */ From 76f4b08a7676c022e22148920dab49709d8a0a99 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 15:01:36 -0500 Subject: [PATCH 0374/1312] using basic vmra funcrtions --- src/apps/molresponse/response_functions.h | 48 ++++++----------------- src/apps/molresponse/x_space.h | 6 +-- 2 files changed, 12 insertions(+), 42 deletions(-) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index e5b1a7315e8..d217dab27d1 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -151,12 +151,9 @@ namespace madness { response_space operator+(const response_space &rhs_y) const { MADNESS_ASSERT(size() > 0); MADNESS_ASSERT(same_size(*this, rhs_y));// assert that same size - World &world = this->x[0][0].world(); - response_space result(world, num_states, num_orbitals);// create zero_functions - - for (size_t i = 0; i < num_states; i++) { result[i] = add(world, x[i], rhs_y[i]); } + for (size_t i = 0; i < num_states; i++) { result[i] = x[i] + rhs_y[i]; } return result; } /* @@ -175,14 +172,9 @@ namespace madness { response_space operator-(const response_space &rhs_y) const { MADNESS_ASSERT(size() > 0); MADNESS_ASSERT(same_size(*this, rhs_y));// assert that same size - World &world = this->x[0][0].world(); - response_space result(world, num_states, num_orbitals);// create zero_functions - - for (size_t i = 0; i < num_states; i++) { - result[i] = sub(world, x[i], rhs_y[i], false); - } + for (size_t i = 0; i < num_states; i++) { result[i] = x[i] - rhs_y[i]; } return result; } @@ -196,26 +188,20 @@ namespace madness { friend response_space operator*(response_space y, double a) { World &world = y.x.at(0).at(0).world(); response_space result = y.copy();// deep copy - for (unsigned int i = 0; i < y.num_states; i++) { madness::scale(world, result[i], a); } - return result; } friend response_space operator*(double a, response_space y) { World &world = y.x.at(0).at(0).world(); response_space result = y.copy();// deep copy - for (unsigned int i = 0; i < y.num_states; i++) { madness::scale(world, result[i], a); } - return result; } response_space &operator*=(double a) { World &world = this->x[0][0].world(); - for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a); } - return *this; } @@ -224,12 +210,10 @@ namespace madness { friend response_space operator*(const response_space &a, const Function &f) { World &world = a.x.at(0).at(0).world(); response_space result(world, a.num_states, a.num_orbitals);// create zero_functions - for (unsigned int i = 0; i < a.num_states; i++) { // Using vmra.h funciton - result[i] = mul(f.world(), f, a[i]); + result[i] = a[i] * f; } - return result; } @@ -243,11 +227,7 @@ namespace madness { response_space operator*(const Function &f) { World &world = x[0][0].world(); response_space result(world, num_states, num_orbitals);// create zero_functions - - for (size_t i = 0; i < num_states; i++) { - // Using vmra.h funciton - result[i] = mul(f.world(), f, x[i]); - } + for (size_t i = 0; i < num_states; i++) { result[i] = x[i] * f; } return result; } @@ -257,11 +237,9 @@ namespace madness { MADNESS_ASSERT(!a[0].empty()); World &world = a[0][0].world(); response_space result(world, a.num_states, a.num_orbitals); - for (unsigned int i = 0; i < a.size(); i++) { result[i] = transform(world, a[i], b, false); } - return result; } @@ -269,18 +247,14 @@ namespace madness { response_space &operator+=(const response_space &b) { MADNESS_ASSERT(same_size(*this, b)); World &world = x[0][0].world(); - for (size_t i = 0; i < num_states; i++) { this->x[i] = add(world, this->x[i], b[i]); } - world.gop.fence(); - + for (size_t i = 0; i < num_states; i++) { this->x[i] += b[i]; } return *this; } // Returns a deep copy - response_space copy() const { + [[nodiscard]] response_space copy() const { World &world = x[0][0].world(); response_space result(world, num_states, num_orbitals); - - std::transform(x.begin(), x.end(), result.x.begin(), [&world](auto &xi) { return madness::copy(world, xi, false); }); world.gop.fence(); @@ -289,8 +263,8 @@ namespace madness { return result; } - response_space copy(const std::shared_ptr>> &pmap, - bool fence = false) const { + [[nodiscard]] response_space copy(const std::shared_ptr>> &pmap, + bool fence = false) const { auto &world = x[0][0].world(); response_space result(world, num_states, num_orbitals); world.gop.fence(); @@ -360,13 +334,13 @@ namespace madness { void compress_rf() { //for (size_t k = 0; k < num_states; k++) { compress(x[0][0].world(), x[k], true); } auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto& xi) { compress(world, xi, true); }); + std::for_each(x.begin(), x.end(), [&](auto &xi) { compress(world, xi, true); }); } void reconstruct_rf() { //for (size_t k = 0; k < num_states; k++) { reconstruct(x[0][0].world(), x[k], true); } auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto& xi) { reconstruct(world, xi, true); }); + std::for_each(x.begin(), x.end(), [&](auto &xi) { reconstruct(world, xi, true); }); } void truncate_rf() { @@ -380,7 +354,7 @@ namespace madness { void truncate_rf(double tol) { auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto& xi) { truncate(world, xi, tol, true); }); + std::for_each(x.begin(), x.end(), [&](auto &xi) { truncate(world, xi, tol, true); }); /* for (size_t k = 0; k < num_states; k++) { truncate(x[0][0].world(), x[k], tol, true); } */ diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index b8d9fbd1909..04986e45873 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -94,18 +94,14 @@ namespace madness { auto operator+(const X_space &B) -> X_space { MADNESS_ASSERT(same_size(*this, B)); World &world = this->X[0][0].world(); - auto ax = to_response_matrix(*this); world.gop.fence(); auto bx = to_response_matrix(B); world.gop.fence(); - response_matrix add_x(num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const auto &a, const auto &b) { return add(world, a, b, false); }); - world.gop.fence(); - + [&](const auto &a, const auto &b) { return a + b; }); return to_X_space(add_x); } From 28f58cdf12b86b77ba239a4465d42b42efeb4a83 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 15:24:18 -0500 Subject: [PATCH 0375/1312] some more clean up --- src/apps/molresponse/response_functions.h | 13 ------------- src/apps/molresponse/x_space.h | 21 +++++---------------- 2 files changed, 5 insertions(+), 29 deletions(-) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index d217dab27d1..2d35f4f9be9 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -65,19 +65,6 @@ namespace madness { this->num_orbitals = y.size_orbitals(); this->x = y.x; if (x.size() != num_states) { x.resize(num_states); } - // if the functions are initialized then deep copy, - // else shallow copy - // the uninitialized functions. - if (y[0][0].impl_initialized()) { - // print("perhaps this is the problem"); - World &world = y[0][0].world(); - std::transform(y.x.begin(), y.x.end(), x.begin(), - [&](const auto &yi) { return madness::copy(world, yi, false); }); - world.gop.fence(); - } else { - std::transform(y.x.begin(), y.x.end(), x.begin(), - [&](const auto &yi) { return yi; }); - } } return *this;// } diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 04986e45873..cfc01ef37ec 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -95,11 +95,8 @@ namespace madness { MADNESS_ASSERT(same_size(*this, B)); World &world = this->X[0][0].world(); auto ax = to_response_matrix(*this); - world.gop.fence(); auto bx = to_response_matrix(B); - world.gop.fence(); response_matrix add_x(num_states()); - std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), [&](const auto &a, const auto &b) { return a + b; }); return to_X_space(add_x); @@ -107,8 +104,10 @@ namespace madness { auto operator+=(const X_space &B) -> X_space & { MADNESS_ASSERT(same_size(*this, B)); - this->X += B.X; - this->Y += B.Y; + auto ax = to_response_matrix(*this); + auto bx = to_response_matrix(B); + int b = 0; + std::for_each(ax.begin(), ax.end(), [&](auto &a) { a += bx[b++]; }); return *this; } @@ -137,7 +136,6 @@ namespace madness { static X_space zero_functions(World &world, size_t n_states, size_t n_orbitals) { auto zeros = X_space(world, n_states, n_orbitals); - for (auto &xi: zeros.X) { xi = ::madness::zero_functions(world, n_orbitals, false); } @@ -150,23 +148,14 @@ namespace madness { friend auto operator+(const X_space &A, const X_space &B) -> X_space { MADNESS_ASSERT(same_size(A, B)); - World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - auto ax = to_response_matrix(A); auto bx = to_response_matrix(B); - response_matrix add_x(A.num_states()); - std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](auto a, auto b) { return add(world, a, b); }); - + [&](auto a, auto b) { return a + b; }); return to_X_space(add_x); - - result.X = A.X + B.X; - result.Y = A.Y + B.Y; - return result; } X_space operator-(const X_space B) { From e1d4df64a2c67a6b124634f0b51d643c128ee152 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 16:17:44 -0500 Subject: [PATCH 0376/1312] modify convergence and add some printing --- src/apps/molresponse/FrequencyResponse.cpp | 31 ++++++++-------------- src/apps/molresponse/global_functions.cc | 18 ++++++------- src/apps/molresponse/testing/runners.hpp | 2 +- src/madness/mra/vmra.h | 1 - 4 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5b9e7fbcdb9..46b97e5eb45 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -18,9 +18,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(75 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(50 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(10 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -51,8 +51,9 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + kain_x_space.push_back( + XNonlinearSolver( + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -283,7 +284,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 0)) { + if (r_params.kain() && (iteration > 3)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); } @@ -306,9 +307,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { - print("--------------- BSH UPDATE RESPONSE------------------"); - } + if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } size_t m = theta_X.X.size(); @@ -320,27 +319,21 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; - if (world.rank() == 0) { - print("--------------- ThetaX.X------------------"); - } + if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } - if (world.rank() == 0) { - print("--------------- ThetaX.Y------------------"); - } + if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } // apply bsh X_space bsh_X(world, m, n); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } - if (world.rank() == 0) { - print("--------------- Apply BSH------------------"); - } + if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -348,9 +341,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0) { - print("--------------- Project BSH------------------"); - } + if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 673df2d422c..3f8981e1689 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -84,14 +84,13 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ for (long b = 0; b < num_states; b++) { b_index = b * num_orbitals * num_orbitals * n; p = 0; - // for each function in a response vector copy num orbital times - std::for_each(xx[b].begin(), xx[b].end(), [&](const auto &xb_p) { + for (const auto &xb_p: xx[b]) { p_index = p * num_orbitals; for (long j = 0; j < num_orbitals; j++) { x_vector.at(b_index + p_index + j) = copy(xb_p, false); } p++; - }); + } } vecfuncT phi1(n_exchange); vecfuncT phi2(n_exchange); @@ -100,8 +99,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ std::for_each(phi1.begin(), phi1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); world.gop.fence(); - phi2 = madness::copy(world, phi1); - world.gop.fence(); + phi2 = madness::copy(world, phi1, true); molresponse::end_timer(world, "ground exchange copy"); return molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); } @@ -233,20 +231,20 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br reconstruct(world, bra_i, false); reconstruct(world, fp, false); world.gop.fence(); + if (world.rank() == 0) { print("exchange reconstruct"); } norm_tree(world, ket_i, false); norm_tree(world, bra_i, false); norm_tree(world, fp, false); world.gop.fence(); + if (world.rank() == 0) { print("exchange norm true"); } const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); auto v23 = mul(world, bra_i, fp, true); - truncate(world, v23, 0.0, true); v23 = apply(world, *poisson, v23); - world.gop.fence(); truncate(world, v23, 0.0, true); auto v123 = mul(world, ket_i, v23, true); - world.gop.fence(); + if (world.rank() == 0) { print("exchange finish apply"); } const long n_exchange{num_states * n * num_orbitals}; auto exchange_vector = vecfuncT(n_exchange); long b = 0; @@ -261,8 +259,8 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } - truncate(world, exchange_vector); - world.gop.fence(); + if (world.rank() == 0) { print("exchange finish sum"); } + truncate(world, exchange_vector, true); molresponse::end_timer(world, "exchange apply"); molresponse::start_timer(world); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2fc9b9a8c6f..0d2c38bba42 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -550,7 +550,7 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: } //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(30)); - r_params.set_user_defined_value("maxsub", size_t(5)); + r_params.set_user_defined_value("maxsub", size_t(7)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index 23c16efb55b..47df33a3a81 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -1347,7 +1347,6 @@ namespace madness { for (unsigned int i=0; i Date: Mon, 21 Nov 2022 16:32:34 -0500 Subject: [PATCH 0377/1312] revert exchange copy function --- src/apps/molresponse/global_functions.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 3f8981e1689..d80c0e3c946 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -84,13 +84,14 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ for (long b = 0; b < num_states; b++) { b_index = b * num_orbitals * num_orbitals * n; p = 0; - for (const auto &xb_p: xx[b]) { + // for each function in a response vector copy num orbital times + std::for_each(xx[b].begin(), xx[b].end(), [&](const auto &xb_p) { p_index = p * num_orbitals; for (long j = 0; j < num_orbitals; j++) { x_vector.at(b_index + p_index + j) = copy(xb_p, false); } p++; - } + }); } vecfuncT phi1(n_exchange); vecfuncT phi2(n_exchange); @@ -236,7 +237,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br norm_tree(world, bra_i, false); norm_tree(world, fp, false); world.gop.fence(); - if (world.rank() == 0) { print("exchange norm true"); } + if (world.rank() == 0) { print("exchange norm tree"); } const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); auto v23 = mul(world, bra_i, fp, true); From 11624f229cf463d012e738b2f156e87dad9c4a81 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 16:46:06 -0500 Subject: [PATCH 0378/1312] back to 0 for sub --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 46b97e5eb45..a28ad700c24 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -284,7 +284,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 3)) { + if (r_params.kain() && (iteration > 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); } From 15fb036b0940befe43381301264c9efdb398d8ba Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 17:30:25 -0500 Subject: [PATCH 0379/1312] revert --- src/apps/molresponse/FrequencyResponse.cpp | 29 ++++++++++++++-------- src/apps/molresponse/global_functions.cc | 12 +++++---- src/apps/molresponse/response_functions.h | 7 ------ src/apps/molresponse/testing/runners.hpp | 2 +- src/madness/mra/vmra.h | 1 + 5 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index a28ad700c24..5b9e7fbcdb9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -18,9 +18,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(75 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(10 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(50 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -51,9 +51,8 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back( - XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + kain_x_space.push_back(XNonlinearSolver( + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -307,7 +306,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } + if (world.rank() == 0) { + print("--------------- BSH UPDATE RESPONSE------------------"); + } } size_t m = theta_X.X.size(); @@ -319,21 +320,27 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; - if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } + if (world.rank() == 0) { + print("--------------- ThetaX.X------------------"); + } if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } - if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } + if (world.rank() == 0) { + print("--------------- ThetaX.Y------------------"); + } // apply bsh X_space bsh_X(world, m, n); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } - if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } + if (world.rank() == 0) { + print("--------------- Apply BSH------------------"); + } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -341,7 +348,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0) { print("--------------- Project BSH------------------"); } + if (world.rank() == 0) { + print("--------------- Project BSH------------------"); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index d80c0e3c946..53da0d1e5f5 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -100,7 +100,8 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ std::for_each(phi1.begin(), phi1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); world.gop.fence(); - phi2 = madness::copy(world, phi1, true); + phi2 = madness::copy(world, phi1); + world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); return molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); } @@ -232,7 +233,6 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br reconstruct(world, bra_i, false); reconstruct(world, fp, false); world.gop.fence(); - if (world.rank() == 0) { print("exchange reconstruct"); } norm_tree(world, ket_i, false); norm_tree(world, bra_i, false); norm_tree(world, fp, false); @@ -241,11 +241,13 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); auto v23 = mul(world, bra_i, fp, true); + truncate(world, v23, 0.0, true); v23 = apply(world, *poisson, v23); + world.gop.fence(); truncate(world, v23, 0.0, true); auto v123 = mul(world, ket_i, v23, true); - if (world.rank() == 0) { print("exchange finish apply"); } + world.gop.fence(); const long n_exchange{num_states * n * num_orbitals}; auto exchange_vector = vecfuncT(n_exchange); long b = 0; @@ -260,8 +262,8 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } - if (world.rank() == 0) { print("exchange finish sum"); } - truncate(world, exchange_vector, true); + truncate(world, exchange_vector); + world.gop.fence(); molresponse::end_timer(world, "exchange apply"); molresponse::start_timer(world); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 2d35f4f9be9..2aad44007e7 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -198,7 +198,6 @@ namespace madness { World &world = a.x.at(0).at(0).world(); response_space result(world, a.num_states, a.num_orbitals);// create zero_functions for (unsigned int i = 0; i < a.num_states; i++) { - // Using vmra.h funciton result[i] = a[i] * f; } return result; @@ -215,7 +214,6 @@ namespace madness { World &world = x[0][0].world(); response_space result(world, num_states, num_orbitals);// create zero_functions for (size_t i = 0; i < num_states; i++) { result[i] = x[i] * f; } - return result; } @@ -245,8 +243,6 @@ namespace madness { std::transform(x.begin(), x.end(), result.x.begin(), [&world](auto &xi) { return madness::copy(world, xi, false); }); world.gop.fence(); - - return result; } @@ -255,11 +251,8 @@ namespace madness { auto &world = x[0][0].world(); response_space result(world, num_states, num_orbitals); world.gop.fence(); - std::transform(x.begin(), x.end(), result.x.begin(), [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); - - return result; } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 0d2c38bba42..2fc9b9a8c6f 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -550,7 +550,7 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: } //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(30)); - r_params.set_user_defined_value("maxsub", size_t(7)); + r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index 47df33a3a81..23c16efb55b 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -1347,6 +1347,7 @@ namespace madness { for (unsigned int i=0; i Date: Mon, 21 Nov 2022 17:47:42 -0500 Subject: [PATCH 0380/1312] edit convergence --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5b9e7fbcdb9..0bb2dec1311 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -18,9 +18,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(50 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(50 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(10 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -283,7 +283,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 0)) { + if (r_params.kain() && (iteration > 3)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); } From 0eda7817d806bce1681bd75a22851afc2f6581b2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 18:03:26 -0500 Subject: [PATCH 0381/1312] revert the thresholds again --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0bb2dec1311..6a842c9e1a7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -18,9 +18,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(50 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(10 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(40 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 4a21828244e079ac1c13101357af24c1192ea821 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 18:09:20 -0500 Subject: [PATCH 0382/1312] printing for exchange debugging --- src/apps/molresponse/global_functions.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 53da0d1e5f5..52f21baa845 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -103,7 +103,9 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ phi2 = madness::copy(world, phi1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); - return molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); + auto K = molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); + if (world.rank() == 0) { print("made it out of molresponseExchange"); } + return K } // compute full response exchange |i> /** @@ -232,6 +234,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br reconstruct(world, ket_i, false); reconstruct(world, bra_i, false); reconstruct(world, fp, false); + if (world.rank() == 0) { print("exchange reconstruct tree"); } world.gop.fence(); norm_tree(world, ket_i, false); norm_tree(world, bra_i, false); @@ -241,13 +244,15 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); auto v23 = mul(world, bra_i, fp, true); - + if (world.rank() == 0) { print("multiply v23"); } truncate(world, v23, 0.0, true); + if (world.rank() == 0) { print("truncate v23"); } v23 = apply(world, *poisson, v23); - world.gop.fence(); + if (world.rank() == 0) { print("apply v23"); } truncate(world, v23, 0.0, true); + if (world.rank() == 0) { print("truncate after apply v23"); } auto v123 = mul(world, ket_i, v23, true); - world.gop.fence(); + if (world.rank() == 0) { print("multiply apply v123"); } const long n_exchange{num_states * n * num_orbitals}; auto exchange_vector = vecfuncT(n_exchange); long b = 0; @@ -262,6 +267,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } + molresponse::end_timer(world, "exchange sum"); truncate(world, exchange_vector); world.gop.fence(); molresponse::end_timer(world, "exchange apply"); From c48abc19f383af80b2eb512a7d34ba35909fa8cf Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 18:10:10 -0500 Subject: [PATCH 0383/1312] a ; --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 52f21baa845..96f57367bc2 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -105,7 +105,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ molresponse::end_timer(world, "ground exchange copy"); auto K = molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); if (world.rank() == 0) { print("made it out of molresponseExchange"); } - return K + return K; } // compute full response exchange |i> /** From d94b97bb7b3ba73151ce97b7c5e52d7121aa4488 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 19:20:10 -0500 Subject: [PATCH 0384/1312] why did i add an extra timer --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 96f57367bc2..8917e383082 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -267,7 +267,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } - molresponse::end_timer(world, "exchange sum"); + if (world.rank() == 0) print("exchange sum"); truncate(world, exchange_vector); world.gop.fence(); molresponse::end_timer(world, "exchange apply"); From e3fe49aa3f318dbf5de03e4d60fd6dc8692efcd2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 20:35:22 -0500 Subject: [PATCH 0385/1312] printing for exchange debugging --- src/apps/molresponse/global_functions.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8917e383082..4cbee181bc3 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -243,7 +243,10 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br if (world.rank() == 0) { print("exchange norm tree"); } const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); + world.gop.fence(); + if (world.rank() == 0) { print("multiply v23"); } auto v23 = mul(world, bra_i, fp, true); + //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } truncate(world, v23, 0.0, true); if (world.rank() == 0) { print("truncate v23"); } From 7828e3c83d5c44371b2a651fbcead2799fda864d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 21:45:53 -0500 Subject: [PATCH 0386/1312] more printing --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 4cbee181bc3..a1b8d926cc2 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -244,7 +244,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); world.gop.fence(); - if (world.rank() == 0) { print("multiply v23"); } + if (world.rank() == 0) { print("create poisson v23"); } auto v23 = mul(world, bra_i, fp, true); //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } From 108b501aa1ed9a6d663fe20baa2fa1ebc56d6fce Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 21:46:14 -0500 Subject: [PATCH 0387/1312] some x space improvements and fix multiply bug --- src/apps/molresponse/x_space.h | 86 ++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index cfc01ef37ec..d09c44c75c2 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -40,7 +40,7 @@ namespace madness { // Copy constructor X_space(const X_space &A) : n_states(size_states(A)), n_orbitals(size_orbitals(A)), X(A.X), Y(A.Y) {} - X_space copy() const { + [[nodiscard]] X_space copy() const { auto &world = X[0][0].world(); auto m = to_response_matrix(*this); auto copy_m = create_response_matrix(num_states(), num_orbitals()); @@ -54,7 +54,7 @@ namespace madness { /// Works in either basis. Different distributions imply /// asynchronous communication and the optional fence is /// collective. - auto copy(const std::shared_ptr>> &pmap, + [[nodiscard]] auto copy(const std::shared_ptr>> &pmap, bool fence = false) const -> X_space { auto &world = X[0][0].world(); auto m = to_response_matrix(*this); @@ -158,63 +158,67 @@ namespace madness { return to_X_space(add_x); } - X_space operator-(const X_space B) { + // C=this-B + X_space operator-(const X_space &B) { MADNESS_ASSERT(same_size(*this, B)); - World &world = this->X[0][0].world(); - X_space result(world, n_states, n_orbitals); - result.X = X - B.X; - result.Y = Y - B.Y; - return result; + + auto ax = to_response_matrix(*this); + auto bx = to_response_matrix(B); + + response_matrix result(B.num_states()); + std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), + [&](auto a, auto b) { return a - b; }); + return to_X_space(result); } friend X_space operator-(const X_space &A, const X_space &B) { MADNESS_ASSERT(same_size(A, B)); - World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions + auto ax = to_response_matrix(A); + auto bx = to_response_matrix(B); - result.X = A.X - B.X; - result.Y = A.Y - B.Y; - return result; + response_matrix result(B.num_states()); + std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), + [&](auto a, auto b) { return a - b; }); + return to_X_space(result); } - friend X_space operator*(const X_space &A, const double &b) { - World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - - result.X = A.X * b; - result.Y = A.Y * b; - return result; - } + friend X_space operator*(const X_space &A, const double &b) { return b * A; } friend X_space operator*(const double &b, const X_space &A) { World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - - result.X = A.X * b; - result.Y = A.Y * b; - return result; - } - X_space operator*(const double &b) { - this->X *= b; - this->Y *= b; - return *this; + auto r = A.copy(); + auto rX = to_response_matrix(r);// create zero_functions + int i = 0; + for (const auto &ri: rX) { rX[i++] = ri * b; } + return r; + } + // + // C=2*a + // + X_space operator*(const double &b) const { + auto r = this->copy(); + auto rX = to_response_matrix(r);// create zero_functions + int i = 0; + for (const auto &ri: rX) { rX[i++] = ri * b; } + return r; } friend X_space operator*(const X_space &A, const Function &f) { World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - - result.X = A.X * f; - result.Y = A.Y * f; - return result; + X_space result(world, A.n_states, A.n_orbitals); // create zero_functions + auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions + auto ax = to_response_matrix(A); + int i = 0; + for (const auto &ai: ax) { rX[i++] = ai * f; } + return to_X_space(rX); } friend auto operator*(const Function &f, const X_space &A) -> X_space { World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - - result.X = A.X * f; - result.Y = A.Y * f; - return result; + auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions + auto ax = to_response_matrix(A); + int i = 0; + for (const auto &ai: ax) { rX[i++] = f * ai; } + return to_X_space(rX); } friend auto operator*(const X_space &A, const Tensor &b) -> X_space { From 5f32046d7ddbcfa87a7856e1e956ce35b9f2e4e4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 21:51:58 -0500 Subject: [PATCH 0388/1312] remove the ambiguous nightmare --- src/apps/molresponse/x_space.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index d09c44c75c2..9e07c3ede4e 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -55,7 +55,7 @@ namespace madness { /// asynchronous communication and the optional fence is /// collective. [[nodiscard]] auto copy(const std::shared_ptr>> &pmap, - bool fence = false) const -> X_space { + bool fence = false) const -> X_space { auto &world = X[0][0].world(); auto m = to_response_matrix(*this); auto copy_m = create_response_matrix(num_states(), num_orbitals()); @@ -195,6 +195,7 @@ namespace madness { // // C=2*a // + /* X_space operator*(const double &b) const { auto r = this->copy(); auto rX = to_response_matrix(r);// create zero_functions @@ -202,6 +203,7 @@ namespace madness { for (const auto &ri: rX) { rX[i++] = ri * b; } return r; } + */ friend X_space operator*(const X_space &A, const Function &f) { World &world = A.X[0][0].world(); From 47daae1a0f2125065fba71f637f1d79b73dcd9f5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 22:17:18 -0500 Subject: [PATCH 0389/1312] trust the copy --- src/apps/molresponse/x_space.cc | 2 -- src/apps/molresponse/x_space.h | 23 ++++++++++++----------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index c3a6b1d7413..de95c487ebe 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -27,7 +27,6 @@ namespace madness { // to response matrix is intended to provide a shallow copy of the response matrix // to simply reorder the functions auto to_response_matrix(const X_space &x) -> response_matrix { - World &world = x.X[0][0].world(); auto mX = response_matrix(x.num_states()); auto num_orbitals = x.num_orbitals(); int b = 0; @@ -37,7 +36,6 @@ namespace madness { std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals);// shallow copy b++; }); - world.gop.fence(); return mX; } diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 9e07c3ede4e..8152739fd21 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -154,12 +154,12 @@ namespace madness { auto bx = to_response_matrix(B); response_matrix add_x(A.num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](auto a, auto b) { return a + b; }); + [&](const auto &a, const auto &b) { return a + b; }); return to_X_space(add_x); } // C=this-B - X_space operator-(const X_space &B) { + X_space operator-(const X_space &B) const { MADNESS_ASSERT(same_size(*this, B)); auto ax = to_response_matrix(*this); @@ -167,7 +167,7 @@ namespace madness { response_matrix result(B.num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), - [&](auto a, auto b) { return a - b; }); + [&](const auto &a, const auto &b) { return a - b; }); return to_X_space(result); } @@ -176,21 +176,20 @@ namespace madness { auto ax = to_response_matrix(A); auto bx = to_response_matrix(B); - response_matrix result(B.num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), - [&](auto a, auto b) { return a - b; }); + [&](const auto &a, const auto &b) { return a - b; }); return to_X_space(result); } friend X_space operator*(const X_space &A, const double &b) { return b * A; } friend X_space operator*(const double &b, const X_space &A) { World &world = A.X[0][0].world(); - auto r = A.copy(); - auto rX = to_response_matrix(r);// create zero_functions + auto rX = response_matrix(A.n_states);// create zero_functions + auto ax = to_response_matrix(A); // create zero_functions int i = 0; for (const auto &ri: rX) { rX[i++] = ri * b; } - return r; + return to_X_space(rX); } // // C=2*a @@ -207,7 +206,6 @@ namespace madness { friend X_space operator*(const X_space &A, const Function &f) { World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals); // create zero_functions auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions auto ax = to_response_matrix(A); int i = 0; @@ -243,8 +241,11 @@ namespace madness { friend auto inner(const X_space &A, const X_space &B) -> Tensor; void truncate() { - X.truncate_rf(); - Y.truncate_rf(); + auto rx = to_response_matrix(*this); + auto &world = rx[0][0].world(); + std::for_each(rx.begin(), rx.end(), [&](auto &xi) { + madness::truncate(world, xi, FunctionDefaults<3>::get_thresh(), true); + }); } auto norm2s() -> Tensor { From b4b63a732aadd7a932dc92a2bbd4ad963e8e12b4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 22:17:33 -0500 Subject: [PATCH 0390/1312] trust the copy --- src/apps/molresponse/x_space.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index de95c487ebe..a62f08a409d 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -84,7 +84,6 @@ namespace madness { std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin()); b++; }; - world.gop.fence(); return x_space; } From 6debd36f10b1a51216435a7bd024b45d62d13695 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 22:19:10 -0500 Subject: [PATCH 0391/1312] ambiguous overload --- src/apps/molresponse/x_space.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 8152739fd21..1dcd50d8e78 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -158,6 +158,7 @@ namespace madness { return to_X_space(add_x); } + /* // C=this-B X_space operator-(const X_space &B) const { MADNESS_ASSERT(same_size(*this, B)); @@ -170,6 +171,7 @@ namespace madness { [&](const auto &a, const auto &b) { return a - b; }); return to_X_space(result); } + */ friend X_space operator-(const X_space &A, const X_space &B) { MADNESS_ASSERT(same_size(A, B)); From 042c6f328aeeb11ed388758670551efa6e41b95f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 22:29:12 -0500 Subject: [PATCH 0392/1312] multiply bug --- src/apps/molresponse/x_space.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 1dcd50d8e78..e06eb7d7f7b 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -190,7 +190,7 @@ namespace madness { auto rX = response_matrix(A.n_states);// create zero_functions auto ax = to_response_matrix(A); // create zero_functions int i = 0; - for (const auto &ri: rX) { rX[i++] = ri * b; } + for (const auto &ai: ax) { rX[i++] = ai * b; } return to_X_space(rX); } // From ee1abc2fefdaac85ebe4056b54a44b92ef399a70 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 09:07:54 -0500 Subject: [PATCH 0393/1312] operations before apply bsh --- src/apps/molresponse/FrequencyResponse.cpp | 40 ++++++++++------------ src/apps/molresponse/response_functions.h | 20 +++++++---- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6a842c9e1a7..086dfebf3a2 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -51,8 +51,9 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + kain_x_space.push_back( + XNonlinearSolver( + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -306,41 +307,40 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { - print("--------------- BSH UPDATE RESPONSE------------------"); - } + if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } size_t m = theta_X.X.size(); size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; - - theta_X.X += theta_X.X * x_shifts; theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; - - if (world.rank() == 0) { - print("--------------- ThetaX.X------------------"); - } + world.gop.fence(); + if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } + world.gop.fence(); - if (world.rank() == 0) { - print("--------------- ThetaX.Y------------------"); - } + if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } // apply bsh X_space bsh_X(world, m, n); - + bsh_x_ops.insert(bsh_x_ops.end(), std::make_move_iterator(bsh_y_ops.begin()), + std::make_move_iterator(bsh_y_ops.end())); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } + if (compute_y) { + auto VX = to_response_matrix(bsh_X); + std::copy() bsh_x_ops for (const auto &vxb: VX) { apply(world, bsh_x_ops, vxb); } - if (world.rank() == 0) { - print("--------------- Apply BSH------------------"); + + bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + + if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -348,9 +348,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0) { - print("--------------- Project BSH------------------"); - } + if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 2aad44007e7..c9b395b9ab5 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -175,20 +175,27 @@ namespace madness { friend response_space operator*(response_space y, double a) { World &world = y.x.at(0).at(0).world(); response_space result = y.copy();// deep copy - for (unsigned int i = 0; i < y.num_states; i++) { madness::scale(world, result[i], a); } + for (unsigned int i = 0; i < y.num_states; i++) { + madness::scale(world, result[i], a, false); + } + world.gop.fence(); return result; } friend response_space operator*(double a, response_space y) { World &world = y.x.at(0).at(0).world(); response_space result = y.copy();// deep copy - for (unsigned int i = 0; i < y.num_states; i++) { madness::scale(world, result[i], a); } + for (unsigned int i = 0; i < y.num_states; i++) { + madness::scale(world, result[i], a, false); + } + world.gop.fence(); return result; } response_space &operator*=(double a) { World &world = this->x[0][0].world(); - for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a); } + for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a,false); } + world.gop.fence(); return *this; } @@ -197,9 +204,7 @@ namespace madness { friend response_space operator*(const response_space &a, const Function &f) { World &world = a.x.at(0).at(0).world(); response_space result(world, a.num_states, a.num_orbitals);// create zero_functions - for (unsigned int i = 0; i < a.num_states; i++) { - result[i] = a[i] * f; - } + for (unsigned int i = 0; i < a.num_states; i++) { result[i] = a[i] * f; } return result; } @@ -231,8 +236,9 @@ namespace madness { // KAIN must have this response_space &operator+=(const response_space &b) { MADNESS_ASSERT(same_size(*this, b)); - World &world = x[0][0].world(); + auto &world = x[0][0].world(); for (size_t i = 0; i < num_states; i++) { this->x[i] += b[i]; } + world.gop.fence(); return *this; } From 0e43c0791980121a37a5043836102f4e32cdd0c8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 09:47:56 -0500 Subject: [PATCH 0394/1312] fix bshy --- src/apps/molresponse/FrequencyResponse.cpp | 8 +------- src/apps/molresponse/global_functions.cc | 2 ++ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 086dfebf3a2..4b0dda98249 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -332,13 +332,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, std::make_move_iterator(bsh_y_ops.end())); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } - if (compute_y) { - auto VX = to_response_matrix(bsh_X); - std::copy() bsh_x_ops for (const auto &vxb: VX) { apply(world, bsh_x_ops, vxb); } - - - bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - } + if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index a1b8d926cc2..65f85f12434 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -157,6 +157,7 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput }); } } + world.gop.fence(); vecfuncT x_vector(n_exchange); vecfuncT x_vector_conjugate(n_exchange); @@ -184,6 +185,7 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput } } } + world.gop.fence(); vecfuncT phi_left(n_exchange); for (long b = 0; b < num_states; b++) { From b9c866f8d265b3609aff05e7fedef5aaa03fdf41 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 10:14:16 -0500 Subject: [PATCH 0395/1312] debug apply step --- src/apps/molresponse/FrequencyResponse.cpp | 2 ++ src/madness/mra/vmra.h | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 4b0dda98249..3a04bf5eae5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -328,8 +328,10 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } // apply bsh X_space bsh_X(world, m, n); + /* bsh_x_ops.insert(bsh_x_ops.end(), std::make_move_iterator(bsh_y_ops.begin()), std::make_move_iterator(bsh_y_ops.end())); + */ bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index 23c16efb55b..b23953cbe77 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -777,7 +777,7 @@ namespace madness { Tensor< TENSOR_RESULT_TYPE(T,R) > matrix_inner(World& world, const std::vector< Function >& f, const std::vector< Function >& g, - bool sym=false) + bool sym=false) { world.gop.fence(); compress(world, f); @@ -823,7 +823,7 @@ namespace madness { if (sym) r(j,i) = conj(r(i,j)); } } - + // for (long i=n-1; i>=0; --i) { // long jtop = m; // if (sym) jtop = i+1; @@ -1603,7 +1603,7 @@ namespace madness { return result; } - // BLM first derivative + // BLM first derivative template std::vector > grad_ble_one(const Function& f, bool refine=false, bool fence=true) { @@ -1645,7 +1645,7 @@ namespace madness { return result; } - // Bspline first derivative + // Bspline first derivative template std::vector > grad_bspline_one(const Function& f, bool refine=false, bool fence=true) { From 63e563e06c6b9eb12ac2f5ddd754b5864633b8d1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 10:34:03 -0500 Subject: [PATCH 0396/1312] tighten convergence --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3a04bf5eae5..ce2b7ef1277 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -20,7 +20,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(40 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(20 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -284,7 +284,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 3)) { + if (r_params.kain() && (iteration > 2)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); } From 29e6d4815da4c7777ed75afef6f2b4adac341e9f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 11:16:38 -0500 Subject: [PATCH 0397/1312] remove fence from within loop and add it at the end --- src/apps/molresponse/global_functions.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 65f85f12434..80992eebe3a 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -267,11 +267,11 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto phi_phiX_i = vecfuncT(num_orbitals); std::copy(v123.begin() + b_shift, v123.begin() + b_shift + num_orbitals, phi_phiX_i.begin()); - world.gop.fence(); - kij = sum(world, phi_phiX_i, true); + kij = sum(world, phi_phiX_i, false); b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } + world.gop.fence(); if (world.rank() == 0) print("exchange sum"); truncate(world, exchange_vector); world.gop.fence(); From 080c3f3e8aa41d147260aba5ce130239c6d2e9b8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 13:30:19 -0500 Subject: [PATCH 0398/1312] help compiler with type --- src/apps/molresponse/ResponseBase.cpp | 11 ++--------- src/apps/molresponse/x_space.h | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 8e8abf183e3..3fef5e865f6 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -401,8 +401,8 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - world.gop.fence(); Theta_X = (V0X - E0X) + gamma; + world.gop.fence(); Theta_X.truncate(); // Theta_X.truncate(); if (r_params.print_level() >= 1) { @@ -593,7 +593,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // X contains the response vector that makes up the response gammaOrbitals at a // given order - std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); + auto old_pmap = FunctionDefaults<3>::get_pmap(); auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); @@ -642,19 +642,14 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } - // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { auto xc_rho = xc.apply_xc_kernel(rho_alpha); return mul(world, xc_rho, phi0); }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // for every transition gammaOrbitals apply the exchange kernel and multiply the - // vector of orbitals std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); - W.Y = W.X.copy(); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } @@ -712,7 +707,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - J.clear(); K.clear(); W.clear(); @@ -729,7 +723,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } // Done // gamma.truncate(); - world.gop.fence(); return gamma; // Get sizes } diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index e06eb7d7f7b..6f66a63c446 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -98,7 +98,7 @@ namespace madness { auto bx = to_response_matrix(B); response_matrix add_x(num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const auto &a, const auto &b) { return a + b; }); + [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { return a + b; }); return to_X_space(add_x); } From c0080be5b25892d02314cfe42ba84323f33b9714 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 13:46:30 -0500 Subject: [PATCH 0399/1312] You gaxpy with false fence --- src/apps/molresponse/x_space.h | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 6f66a63c446..41870320728 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -98,7 +98,10 @@ namespace madness { auto bx = to_response_matrix(B); response_matrix add_x(num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { return a + b; }); + [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { + return gaxpy_oop(1.0, a, 1.0, b, false); + }); + world.gop.fence(); return to_X_space(add_x); } @@ -106,12 +109,15 @@ namespace madness { MADNESS_ASSERT(same_size(*this, B)); auto ax = to_response_matrix(*this); auto bx = to_response_matrix(B); + auto &world = ax[0][0].world(); int b = 0; - std::for_each(ax.begin(), ax.end(), [&](auto &a) { a += bx[b++]; }); + std::for_each(ax.begin(), ax.end(), + [&](auto &a) { gaxpy(world, 1.0, a, 1.0, bx[b++], false); }); + world.gop.fence(); return *this; } - void push_back(vector_real_function_3d x, vector_real_function_3d y) { + void push_back(const vector_real_function_3d &x, const vector_real_function_3d &y) { if (n_orbitals > 0) { MADNESS_ASSERT(n_orbitals == x.size()); MADNESS_ASSERT(n_orbitals == y.size()); @@ -154,7 +160,10 @@ namespace madness { auto bx = to_response_matrix(B); response_matrix add_x(A.num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const auto &a, const auto &b) { return a + b; }); + [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { + return gaxpy_oop(1.0, a, 1.0, b, false); + }); + world.gop.fence(); return to_X_space(add_x); } @@ -175,12 +184,14 @@ namespace madness { friend X_space operator-(const X_space &A, const X_space &B) { MADNESS_ASSERT(same_size(A, B)); - auto ax = to_response_matrix(A); auto bx = to_response_matrix(B); response_matrix result(B.num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), - [&](const auto &a, const auto &b) { return a - b; }); + [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { + return gaxpy_oop(1.0, a, -1.0, b, false); + }); + ax[0][0].world().gop.fence(); return to_X_space(result); } @@ -246,8 +257,9 @@ namespace madness { auto rx = to_response_matrix(*this); auto &world = rx[0][0].world(); std::for_each(rx.begin(), rx.end(), [&](auto &xi) { - madness::truncate(world, xi, FunctionDefaults<3>::get_thresh(), true); + madness::truncate(world, xi, FunctionDefaults<3>::get_thresh(), false); }); + world.gop.fence(); } auto norm2s() -> Tensor { From c430e4c3a81b47cec1319c19840bb8f115b9c1d3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 14:23:46 -0500 Subject: [PATCH 0400/1312] set tol to Function default not 0.0 in exchange --- src/apps/molresponse/global_functions.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 80992eebe3a..69a31814105 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -238,23 +238,25 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br reconstruct(world, fp, false); if (world.rank() == 0) { print("exchange reconstruct tree"); } world.gop.fence(); + /* norm_tree(world, ket_i, false); norm_tree(world, bra_i, false); norm_tree(world, fp, false); - world.gop.fence(); + */ if (world.rank() == 0) { print("exchange norm tree"); } const double lo = 1.0e-10; + auto tol = FunctionDefaults<3>::get_thresh(); auto poisson = set_poisson(world, lo); world.gop.fence(); if (world.rank() == 0) { print("create poisson v23"); } auto v23 = mul(world, bra_i, fp, true); //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } - truncate(world, v23, 0.0, true); + truncate(world, v23, tol, true); if (world.rank() == 0) { print("truncate v23"); } v23 = apply(world, *poisson, v23); if (world.rank() == 0) { print("apply v23"); } - truncate(world, v23, 0.0, true); + truncate(world, v23, tol, true); if (world.rank() == 0) { print("truncate after apply v23"); } auto v123 = mul(world, ket_i, v23, true); if (world.rank() == 0) { print("multiply apply v123"); } @@ -273,8 +275,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br } world.gop.fence(); if (world.rank() == 0) print("exchange sum"); - truncate(world, exchange_vector); - world.gop.fence(); + truncate(world, exchange_vector, tol, true); molresponse::end_timer(world, "exchange apply"); molresponse::start_timer(world); From f08d0375253fa6fa4075821fc92186d7c1b92c5e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 15:18:43 -0500 Subject: [PATCH 0401/1312] compute gamma full --- src/apps/molresponse/ResponseBase.cpp | 11 ++++------- src/apps/molresponse/x_space.cc | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3fef5e865f6..1d288b80534 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -545,10 +545,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit QProjector projector(world, phi0); for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); - gamma.Y[i] = projector(gamma.Y[i]); } world.gop.fence(); - + for (size_t i = 0; i < num_states; i++) { + gamma.Y[i] = projector(gamma.Y[i]); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -572,16 +573,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit j_y.clear(); K.clear(); W.clear(); - chi_alpha.clear(); phi0.clear(); - + molresponse::end_timer(world, "Clear functions and set old pmap"); if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - molresponse::end_timer(world, "Clear functions and set old pmap"); - // Done - world.gop.fence(); //gamma.truncate(); return gamma; // Get sizes diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index a62f08a409d..17f8896a607 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -149,8 +149,8 @@ namespace madness { int p = 0; std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) { result += matrix_inner(world, ati, b_transpose[p++]); + world.gop.fence(); }); - world.gop.fence(); return result; } }// namespace madness From 2f60c0793dcd110f9c869ee51b2b4741e890d6eb Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 12:59:41 -0500 Subject: [PATCH 0402/1312] fence the sum in exchange --- src/apps/molresponse/global_functions.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 69a31814105..f3d88f57848 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -269,11 +269,10 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto phi_phiX_i = vecfuncT(num_orbitals); std::copy(v123.begin() + b_shift, v123.begin() + b_shift + num_orbitals, phi_phiX_i.begin()); - kij = sum(world, phi_phiX_i, false); + kij = sum(world, phi_phiX_i, true); b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } - world.gop.fence(); if (world.rank() == 0) print("exchange sum"); truncate(world, exchange_vector, tol, true); molresponse::end_timer(world, "exchange apply"); From 5693a46a919ffe666d39dddc3a6771a2d375b03c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 13:26:44 -0500 Subject: [PATCH 0403/1312] new iterator sum using gaxpy --- src/apps/molresponse/global_functions.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f3d88f57848..188ddb38160 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -264,15 +264,17 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto exchange_vector = vecfuncT(n_exchange); long b = 0; long b_shift = 0; + compress(world, v123); for (auto &kij: exchange_vector) { b_shift = b * num_orbitals; auto phi_phiX_i = vecfuncT(num_orbitals); - std::copy(v123.begin() + b_shift, v123.begin() + b_shift + num_orbitals, - phi_phiX_i.begin()); - kij = sum(world, phi_phiX_i, true); + // this right here is a sketch of how sums with iterators could work + kij = FunctionFactory(world).compressed(); + std::for_each(v123.begin() + b_shift, v23.begin() + b_shift + num_orbitals, + [&](const auto &v123_i) { kij.gaxpy(1.0, v123_i, 1.0, false); }); b++; - // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } + world.gop.fence(); if (world.rank() == 0) print("exchange sum"); truncate(world, exchange_vector, tol, true); molresponse::end_timer(world, "exchange apply"); From 46f707179f2ebacebfd40c9c187860fb67b21755 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 13:34:11 -0500 Subject: [PATCH 0404/1312] fix the bug --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 188ddb38160..553b675bae1 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -270,7 +270,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto phi_phiX_i = vecfuncT(num_orbitals); // this right here is a sketch of how sums with iterators could work kij = FunctionFactory(world).compressed(); - std::for_each(v123.begin() + b_shift, v23.begin() + b_shift + num_orbitals, + std::for_each(v123.begin() + b_shift, v123.begin() + b_shift + num_orbitals, [&](const auto &v123_i) { kij.gaxpy(1.0, v123_i, 1.0, false); }); b++; } From ef2f79a991f57792a8e9583a843881041ec02d8c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 14:27:28 -0500 Subject: [PATCH 0405/1312] density changes --- src/apps/molresponse/FrequencyResponse.cpp | 14 -------- src/apps/molresponse/ResponseBase.cpp | 40 ++++------------------ src/apps/molresponse/x_space.cc | 8 ++--- 3 files changed, 10 insertions(+), 52 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ce2b7ef1277..26236367b6f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -196,29 +196,15 @@ void FrequencyResponse::iterate(World &world) { } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - bsh_residualsX = copy(new_res.residual_norms); bsh_residualsY = copy(new_res.residual_norms); Chi = new_chi.copy(); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - xij_res_norms = new_res.residual.component_norm2s(); xij_norms = Chi.component_norm2s(); - density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); - /* - max_rotation = (bsh_residualsX + bsh_residualsY) ; - for (size_t i = 0; i < Chi.num_states(); i++) { - if (max_rotation[i] < r_params.max_rotation()) { - max_rotation[i] = r_params.max_rotation(); - print("less than max_rotation....set to max_rotation"); - } - } - */ - Tensor polar = -2 * inner(Chi, PQ); if (r_params.print_level() >= 20) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 1d288b80534..75188173570 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -281,18 +281,14 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto density = vector_real_function_3d(chi.num_states()); auto calc_type = r_params.calc_type(); if (calc_type == "full" || "static") { - auto r_matrix = to_response_matrix(chi); auto r_phi0 = to_response_vector(ground_orbitals); - std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), - [&](const auto &ri) { return dot(world, ri, r_phi0); }); - + [&](const auto &ri) { return dot(world, ri, r_phi0,true); }); } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } truncate(world, density); - world.gop.fence(); return density; } @@ -543,13 +539,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, phi0); - for (size_t i = 0; i < num_states; i++) { - gamma.X[i] = projector(gamma.X[i]); - } + for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } world.gop.fence(); - for (size_t i = 0; i < num_states; i++) { - gamma.Y[i] = projector(gamma.Y[i]); - } + for (size_t i = 0; i < num_states; i++) { gamma.Y[i] = projector(gamma.Y[i]); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -1132,32 +1124,12 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, Xvector = to_response_matrix(chi); Xresidual = to_response_matrix(residual_chi); response_matrix update(m); - for (auto &update_i: update) { update_i = vector_real_function_3d(n); } - if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } - int b = 0; - std::transform(Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), - [&](auto &xi, auto &ri) { return kain_x_space[b++].update(xi, ri); }); - - /* - std::for_each(kain_x_space.begin(), kain_x_space.end(), [&](auto &ki) { - auto kain_X = ki.update(Xvector[b], Xresidual[b]); - update[b] = copy(world, kain_X); - b++; - }); - */ + std::transform( + Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), + [&](const auto &xi, const auto &ri) { return kain_x_space[b++].update(xi, ri); }); kain_update = to_X_space(update); - - /* - for (size_t b = 0; b < m; b++) { - // passing xvectors - X_vector kain_X = kain_x_space[b].update(Xvector[b], Xresidual[b]); - // deep copy of vector of functions - kain_update.X[b] = copy(world, kain_X.X[0]); - kain_update.Y[b] = copy(world, kain_X.Y[0]); - } - */ if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 17f8896a607..a69b443c6de 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -10,10 +10,10 @@ namespace madness { auto &world = vec[0].world(); // copy the vector auto response_vector = copy(world, vec); - // copy the vector - std::for_each(vec.begin(), vec.end(), [&](const auto &phi0_i) { - response_vector.push_back(madness::copy(phi0_i)); + std::for_each(vec.begin(), vec.end(), [&](const real_function_3d &phi0_i) { + response_vector.push_back(madness::copy(phi0_i,false)); }); + world.gop.fence(); return response_vector; } auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) @@ -30,7 +30,7 @@ namespace madness { auto mX = response_matrix(x.num_states()); auto num_orbitals = x.num_orbitals(); int b = 0; - std::for_each(mX.begin(), mX.end(), [&](auto &mi) { + std::for_each(mX.begin(), mX.end(), [&](vector_real_function_3d &mi) { mi = vector_real_function_3d(2 * num_orbitals); std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); // shallow copy std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals);// shallow copy From d59e023fd1d7053dbc47e82b4d9b91f76858ead7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 14:51:56 -0500 Subject: [PATCH 0406/1312] Some printing for debugging --- src/apps/molresponse/ResponseBase.cpp | 6 +++++- src/apps/molresponse/x_space.cc | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 75188173570..a82850811e3 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -282,13 +282,17 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto calc_type = r_params.calc_type(); if (calc_type == "full" || "static") { auto r_matrix = to_response_matrix(chi); + if (world.rank() == 0) { print("make density: to response matrix"); } auto r_phi0 = to_response_vector(ground_orbitals); + if (world.rank() == 0) { print("make density: to response vector"); } std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), - [&](const auto &ri) { return dot(world, ri, r_phi0,true); }); + [&](const auto &ri) { return dot(world, ri, r_phi0, true); }); } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } + if (world.rank() == 0) { print("make density: made density"); } truncate(world, density); + if (world.rank() == 0) { print("make density: truncate"); } return density; } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index a69b443c6de..fb355cb654a 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -11,7 +11,7 @@ namespace madness { // copy the vector auto response_vector = copy(world, vec); std::for_each(vec.begin(), vec.end(), [&](const real_function_3d &phi0_i) { - response_vector.push_back(madness::copy(phi0_i,false)); + response_vector.push_back(madness::copy(phi0_i,true)); }); world.gop.fence(); return response_vector; From be33ccaded2c55bb66a90e744dda36a6c11625b1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 16:33:19 -0500 Subject: [PATCH 0407/1312] separate the gamma additions for debugging --- src/apps/molresponse/ResponseBase.cpp | 19 ++++++++----------- src/apps/molresponse/x_space.h | 19 +++++++------------ 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index a82850811e3..4df5a3d0e62 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -525,21 +525,18 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } molresponse::start_timer(world); - - /* - if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - */ - - X_space gamma(world, num_states, num_orbitals); - gamma = (2 * J) - K * xcf.hf_exchange_coefficient() + W; + auto c_xc = xcf.hf_exchange_coefficient(); + gamma = 2 * J; + if (world.rank() == 0) { print("gamma: 2 * J"); } + gamma += -c_xc * K; + if (world.rank() == 0) { print("gamma: += -c_xc * K"); } + gamma += W; + if (world.rank() == 0) { print("gamma: += W"); } //gamma.truncate(); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); + molresponse::end_timer(world, "gamma add", "gamma_truncate_add", iter_timing); } - // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, phi0); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 41870320728..b1da4b425eb 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -195,8 +195,7 @@ namespace madness { return to_X_space(result); } - friend X_space operator*(const X_space &A, const double &b) { return b * A; } - friend X_space operator*(const double &b, const X_space &A) { + friend X_space operator*(const X_space &A, const double &b) { World &world = A.X[0][0].world(); auto rX = response_matrix(A.n_states);// create zero_functions auto ax = to_response_matrix(A); // create zero_functions @@ -204,18 +203,14 @@ namespace madness { for (const auto &ai: ax) { rX[i++] = ai * b; } return to_X_space(rX); } - // - // C=2*a - // - /* - X_space operator*(const double &b) const { - auto r = this->copy(); - auto rX = to_response_matrix(r);// create zero_functions + friend X_space operator*(const double &b, const X_space &A) { + World &world = A.X[0][0].world(); + auto rX = response_matrix(A.n_states);// create zero_functions + auto ax = to_response_matrix(A); // create zero_functions int i = 0; - for (const auto &ri: rX) { rX[i++] = ri * b; } - return r; + for (const auto &ai: ax) { rX[i++] = b * ai; } + return to_X_space(rX); } - */ friend X_space operator*(const X_space &A, const Function &f) { World &world = A.X[0][0].world(); From 24b9e1b6a23c371bc174af5d119f7eea3292a699 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 17:00:40 -0500 Subject: [PATCH 0408/1312] debugging --- src/apps/molresponse/ResponseBase.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 4df5a3d0e62..a186c5f9993 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -43,9 +43,13 @@ void ResponseBase::check_k(World &world, double thresh, int k) { if (FunctionDefaults<3>::get_k() != ground_orbitals[0].k()) { // Re-read orbitals from the archive (assuming // the archive has orbitals stored at a higher + if (world.rank() == 0) { print("check k: ground orbitals"); } // k value than what was previously computed ground_calc.read(world); + if (world.rank() == 0) { print("check k: read ground orbitals"); } + // k value than what was previously computed reconstruct(world, ground_orbitals); + if (world.rank() == 0) { print("check k: reconstruct ground orbitals"); } // Reset correct k (its set in g_params.read) FunctionDefaults<3>::set_k(k); // Project each ground state to correct k @@ -53,17 +57,22 @@ void ResponseBase::check_k(World &world, double thresh, int k) { orbital = project(orbital, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); + if (world.rank() == 0) { print("check k: project ground orbitals"); } // Clean up a bit truncate(world, ground_orbitals); + if (world.rank() == 0) { print("check k: truncate ground orbitals"); } // Now that ground orbitals have correct k lets make the ground density // again ground_density = make_ground_density(world); + if (world.rank() == 0) { print("check k: make ground density"); } // Ground state orbitals changed, clear old hamiltonian redo = true; } // Recalculate ground state hamiltonian here if (redo or !hamiltonian.has_data()) { + if (world.rank() == 0) { print("check k: re-do hamiltonian"); } auto [HAM, HAM_NO_DIAG] = ComputeHamiltonianPair(world); + if (world.rank() == 0) { print("check k: output hamiltonian"); } // TODO this doesn't seem right... hamiltonian = HAM; ham_no_diag = HAM_NO_DIAG; @@ -89,8 +98,10 @@ void ResponseBase::check_k(World &world, double thresh, int k) { // Don't forget the mask function as well if (FunctionDefaults<3>::get_k() != mask.k()) { mask = project(mask, FunctionDefaults<3>::get_k(), thresh, false); + if (world.rank() == 0) { print("check k: project mask"); } } ::check_k(world, Chi, thresh, k); + if (world.rank() == 0) { print("check k: project Chi"); } // Make sure everything is done before leaving world.gop.fence(); @@ -248,11 +259,11 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const auto ResponseBase::make_ground_density(World &world) const -> functionT { - std::vector vsq = square(world, ground_orbitals); + auto vsq = square(world, ground_orbitals); compress(world, vsq); functionT rho = factoryT(world); rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], 1.0, false); } + for (const auto &vsq_i: vsq) { rho.gaxpy(1.0, vsq_i, 1.0, false); } //for (const auto &phi_squared: vsq) rho.gaxpy(2.0, phi_squared, 1.0, false); world.gop.fence(); vsq.clear(); From acc8323e5954a9e9bfe27506b80a1a32fb6e7f59 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 17:32:01 -0500 Subject: [PATCH 0409/1312] v0x debugging --- src/apps/molresponse/ResponseBase.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index a186c5f9993..29fd0cbae99 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1033,12 +1033,19 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; - V0.X = v0 * X.X; - V0.X += -1 * K0.X * xcf.hf_exchange_coefficient(); + auto c_xc = xcf.hf_exchange_coefficient(); if (compute_Y) { - V0.Y = v0 * X.Y; - V0.Y += (-1 * K0.Y * xcf.hf_exchange_coefficient()); + + V0 = v0 * X; + if (world.rank() == 0) { print("vox: v0=v0*X"); } + V0 += -c_xc * K0; + if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } + } else { + V0.X = v0 * X.X; + if (world.rank() == 0) { print("vox: v0=v0*X"); } + V0.X += -c_xc * K0.X; + if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } V0.Y = V0.X.copy(); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", Chi_copy, V0); } From 62c311ead5ade95d526cad76283fd0cbd0d43295 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 17:39:29 -0500 Subject: [PATCH 0410/1312] some fencing in the read operation --- src/apps/molresponse/ground_parameters.h | 51 +++++++++++++----------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/apps/molresponse/ground_parameters.h b/src/apps/molresponse/ground_parameters.h index d60c1fae7bc..9e64a80f4da 100644 --- a/src/apps/molresponse/ground_parameters.h +++ b/src/apps/molresponse/ground_parameters.h @@ -8,11 +8,11 @@ #include -#include "madness/chem/NWChem.h"// For nwchem interface -#include "madness/chem/SCFOperators.h" #include "../chem/molecule.h" #include "Plot_VTK.h" #include "basic_operators.h" +#include "madness/chem/NWChem.h"// For nwchem interface +#include "madness/chem/SCFOperators.h" #include "madness/chem/pointgroupsymmetry.h" #include "madness/chem/potentialmanager.h" #include "madness/chem/projector.h"// For easy calculation of (1 - \hat{\rho}^0) @@ -25,24 +25,24 @@ using namespace madness; class GroundStateCalculation { // Ground state parameters that are read in from archive std::string inFile{"../moldft.restartdata"};///< Name of input archive to read in ground state - bool spinrestricted{true}; ///< Indicates if ground state calc. was open or closed + bool spinrestricted{true};///< Indicates if ground state calc. was open or closed ///< shell - unsigned int num_orbitals{}; ///< Number of orbitals in ground state - Tensor energies{}; ///< Energy of ground state orbitals - Tensor occ{}; ///< Occupancy of ground state orbitals - double L{}; ///< Box size of ground state - response calcluation is in same box - int k{}; ///< Order of polynomial used in ground state - Molecule molecule_in{};///< The molecule used in ground state calculation + unsigned int num_orbitals{};///< Number of orbitals in ground state + Tensor energies{}; ///< Energy of ground state orbitals + Tensor occ{}; ///< Occupancy of ground state orbitals + double L{}; ///< Box size of ground state - response calcluation is in same box + int k{}; ///< Order of polynomial used in ground state + Molecule molecule_in{}; ///< The molecule used in ground state calculation std::vector g_orbitals{};///< The ground state orbitals std::string xc{}; ///< Name of xc functional used in ground state - std::string localize_method{}; ///< Name of xc functional used in ground state + std::string localize_method{}; ///< Name of xc functional used in ground state // Default constructor public: explicit GroundStateCalculation(World &world) { read(world); } explicit GroundStateCalculation(World &world, const std::string &input_file) - : inFile{input_file} { + : inFile{input_file} { read(world); } @@ -79,18 +79,18 @@ class GroundStateCalculation { std::vector dummy2; archive::ParallelInputArchive input(world, inFile.c_str()); - input & dummyversion; - input & dummy1; // double - input & spinrestricted;// bool - input & L; // double box size - input & k; // int wavelet order - input & molecule_in; // Molecule - input & xc; // std:string xc functional - input & localize_method;// std:string localize method - input & num_orbitals; // int - input & energies; // Tensor orbital energies - input & occ; // Tensor orbital occupations - input & dummy2; // std::vector sets of orbitals(?) + input &dummyversion; + input &dummy1; // double + input &spinrestricted; // bool + input &L; // double box size + input &k; // int wavelet order + input &molecule_in; // Molecule + input &xc; // std:string xc functional + input &localize_method;// std:string localize method + input &num_orbitals; // int + input &energies; // Tensor orbital energies + input &occ; // Tensor orbital occupations + input &dummy2; // std::vector sets of orbitals(?) // Check that order is positive and less than 30 if (k < 1 or k > 30) { @@ -105,13 +105,16 @@ class GroundStateCalculation { FunctionDefaults<3>::set_k(k); // Possible to call this function multiple times now // Do this to ensure everything works. + world.gop.fence(); g_orbitals.clear(); + world.gop.fence(); // Read in ground state orbitals for (unsigned int i = 0; i < num_orbitals; i++) { real_function_3d reader; - input & reader; + input &reader; g_orbitals.push_back(reader); } + world.gop.fence(); //projector_irrep c2v("c2v"); //g_orbitals = c2v(g_orbitals); // Clean up From 07cbba4a5507dfccf88db5e0fcabd263ff21ea51 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 18:05:30 -0500 Subject: [PATCH 0411/1312] more printing --- src/apps/molresponse/FrequencyResponse.cpp | 8 ++++++++ src/apps/molresponse/x_space.h | 3 +-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 26236367b6f..649ef687f99 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -197,15 +197,23 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bsh_residualsX = copy(new_res.residual_norms); + if (world.rank() == 0) { print("copy tensors: bshX"); } bsh_residualsY = copy(new_res.residual_norms); + if (world.rank() == 0) { print("copy tensors: bshY"); } Chi = new_chi.copy(); + if (world.rank() == 0) { print("copy chi:"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } + xij_res_norms = new_res.residual.component_norm2s(); + if (world.rank() == 0) { print("computing residuals: xij residuals"); } xij_norms = Chi.component_norm2s(); + if (world.rank() == 0) { print("computing chi norms: xij residuals"); } density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); + if (world.rank() == 0) { print("computing residuals: density residuals"); } Tensor polar = -2 * inner(Chi, PQ); + if (world.rank() == 0) { print("computing polarizability:"); } if (r_params.print_level() >= 20) { auto [eval, evec] = syev(polar); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index b1da4b425eb..43a4e5185ea 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -269,9 +269,8 @@ namespace madness { return norms; } - auto component_norm2s() const -> Tensor { + [[nodiscard]] auto component_norm2s() const -> Tensor { World &world = X[0][0].world(); - auto rx = to_flattened_vector(*this); auto norms = norm2s_T(world, rx); return norms.reshape(n_states, 2 * n_orbitals); From 39228c3709b78138c46a1954ecd6c0c5330be76d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 18:57:48 -0500 Subject: [PATCH 0412/1312] curious if this will improve convergence by not truncating small coefficients before applying in exchange --- src/apps/molresponse/global_functions.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 553b675bae1..1565902ea43 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -252,7 +252,8 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto v23 = mul(world, bra_i, fp, true); //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } - truncate(world, v23, tol, true); + //truncate(world, v23, tol, true); + // truncate if (world.rank() == 0) { print("truncate v23"); } v23 = apply(world, *poisson, v23); if (world.rank() == 0) { print("apply v23"); } From 7a1bd266f7b4269991c44a07c0facc107b3a0a76 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 28 Nov 2022 14:23:56 -0500 Subject: [PATCH 0413/1312] Re-writing using scale --- src/apps/molresponse/x_space.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 43a4e5185ea..6e0f65e235d 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -208,7 +208,12 @@ namespace madness { auto rX = response_matrix(A.n_states);// create zero_functions auto ax = to_response_matrix(A); // create zero_functions int i = 0; - for (const auto &ai: ax) { rX[i++] = b * ai; } + for (const vector_real_function_3d &ai: ax) { + rX[i] = madness::copy(world, ai, true); + scale(world, rX[i], b, false); + } + // b* ai is bugged. scale does not fence + world.gop.fence(); return to_X_space(rX); } From 59686eec456671b41a016360ef28f7c85f3d36cf Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 28 Nov 2022 14:26:54 -0500 Subject: [PATCH 0414/1312] Re-writing using scale --- src/apps/molresponse/x_space.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 6e0f65e235d..61ea89959c3 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -200,7 +200,11 @@ namespace madness { auto rX = response_matrix(A.n_states);// create zero_functions auto ax = to_response_matrix(A); // create zero_functions int i = 0; - for (const auto &ai: ax) { rX[i++] = ai * b; } + for (const vector_real_function_3d &ai: ax) { + rX[i] = madness::copy(world, ai, true); + scale(world, rX[i], b, false); + i++; + } return to_X_space(rX); } friend X_space operator*(const double &b, const X_space &A) { @@ -211,6 +215,7 @@ namespace madness { for (const vector_real_function_3d &ai: ax) { rX[i] = madness::copy(world, ai, true); scale(world, rX[i], b, false); + i++; } // b* ai is bugged. scale does not fence world.gop.fence(); From ce0e902c8f8246086f26622d0a610e004d36dfc2 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Mon, 28 Nov 2022 09:49:32 -0500 Subject: [PATCH 0415/1312] removed volatile since not needed --- src/madness/misc/ran.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/madness/misc/ran.h b/src/madness/misc/ran.h index b87cfc658f5..a8ff9476716 100644 --- a/src/madness/misc/ran.h +++ b/src/madness/misc/ran.h @@ -73,8 +73,8 @@ namespace madness { const int r; const int s; const double beta; - volatile int cur; - volatile double* const u; + int cur; // Removed volatile since always access in scope of mutex with implied barriers + double* const u; unsigned int simple_state; void generate(); From 8c5fb1d17d855a56a42b585bc8bb191e676d1948 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Mon, 28 Nov 2022 11:34:43 -0500 Subject: [PATCH 0416/1312] removed volatile in prep for C++20 --- still needs testing on ARM and PowerPC --- src/madness/world/dqueue.h | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/madness/world/dqueue.h b/src/madness/world/dqueue.h index d50bde7ea0e..8883d2b2ef9 100644 --- a/src/madness/world/dqueue.h +++ b/src/madness/world/dqueue.h @@ -79,11 +79,15 @@ namespace madness { template class DQueue : private CONDITION_VARIABLE_TYPE { char pad[64]; ///< To put the lock and the data in separate cache lines - volatile size_t n __attribute__((aligned(64))); ///< Number of elements in the buffer - volatile size_t sz; ///< Current capacity - volatile T* volatile buf; ///< Actual buffer - volatile int _front; ///< Index of element at front of buffer - volatile int _back; ///< Index of element at back of buffer + + // n, sz, buf, _front, _back used to be volatile, but not actually needed since every access + // happens with the mutex and its implied barriers. + size_t n __attribute__((aligned(64))); ///< Number of elements in the buffer + size_t sz; ///< Current capacity + T* buf; ///< Actual buffer + int _front; ///< Index of element at front of buffer + int _back; ///< Index of element at back of buffer + DQStats stats; #ifdef MADNESS_DQ_USE_PREBUF @@ -106,7 +110,8 @@ namespace madness { sz *= 2; else sz += 1048576; - volatile T* volatile nbuf = new T[sz]; + //volatile T* volatile nbuf = new T[sz]; + T* nbuf = new T[sz]; int lo = sz/2 - oldsz/2; for (int i=_front; i Date: Mon, 28 Nov 2022 11:52:50 -0500 Subject: [PATCH 0417/1312] removed volatile in prep for C++20 --- still needs testing on ARM and PowerPC --- src/madness/world/worldmutex.h | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/madness/world/worldmutex.h b/src/madness/world/worldmutex.h index 9386ce3b7b2..fbaf652285b 100644 --- a/src/madness/world/worldmutex.h +++ b/src/madness/world/worldmutex.h @@ -304,8 +304,8 @@ namespace madness { #ifdef OLDXXX // This version uses a spin lock class MutexReaderWriter : private Spinlock, private NO_DEFAULTS { - volatile mutable int nreader; - volatile mutable bool writeflag; + mutable int nreader; // used to be volatile but is protected by mutex and associated barriers + mutable bool writeflag; // ditto public: static const int NOLOCK=0; static const int READLOCK=1; @@ -497,9 +497,9 @@ namespace madness { class ConditionVariable : public Spinlock { public: static const int MAX_NTHREAD = 64; - mutable volatile int back; - mutable volatile int front; - mutable volatile bool* volatile fifo[MAX_NTHREAD]; // Circular buffer of flags + mutable int back; // used to be volatile, but is protected by mutex and associated barriers + mutable int front; // ditto + mutable volatile bool* fifo[MAX_NTHREAD]; // volatile needed here; Circular buffer of flags void set_wait_policy(WaitPolicy p, int us = 0) { wait_policy_ = p; @@ -562,10 +562,10 @@ namespace madness { class MutexFair : private Spinlock { private: static const int MAX_NTHREAD = 64; - mutable volatile bool* volatile q[MAX_NTHREAD]; - mutable volatile int n; - mutable volatile int front; - mutable volatile int back; + mutable volatile bool* q[MAX_NTHREAD]; // volatile needed + mutable int n; // volatile not needed due to use of spinlock and associated barriers + mutable int front; + mutable int back; public: MutexFair() : n(0), front(0), back(0) {}; @@ -696,6 +696,7 @@ namespace madness { typedef Mutex SCALABLE_MUTEX_TYPE; #endif + // I THINK THIS IS NO LONGER USED??????????????????????????????????? class Barrier { const int nthread; volatile bool sense; From e4a8bd6696b90080cea4935cde430ce798534710 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Mon, 28 Nov 2022 11:53:33 -0500 Subject: [PATCH 0418/1312] removed volatile, was never needed --- src/madness/world/safempi.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/madness/world/safempi.h b/src/madness/world/safempi.h index a6e42633f97..c48e310f37e 100644 --- a/src/madness/world/safempi.h +++ b/src/madness/world/safempi.h @@ -499,8 +499,8 @@ namespace SafeMPI { int numproc; bool owner; - volatile int utag; - volatile int urtag; + int utag; // Only used by main thread so no volatile or mutex needed + int urtag;// Ditto Impl(const MPI_Comm& c, int m, int n, bool o) : comm(c), me(m), numproc(n), owner(o), utag(1024), urtag(1) @@ -522,9 +522,11 @@ namespace SafeMPI { /// So that send and receiver agree on the tag all processes /// need to call this routine in the same sequence. int unique_tag() { + // RJH removed mutex since ordering requirement across processes means + // there can never be any thread contention. // Cannot use MPI mutex for anything else! // It will preprocess to nothing for MPI_THREAD_MULTIPLE! - madness::ScopedMutex obolus(SafeMPI::charon); + //madness::ScopedMutex obolus(SafeMPI::charon); int result = utag++; if (utag >= 4095) utag = 1024; return result; @@ -536,9 +538,10 @@ namespace SafeMPI { /// /// Tags in [1000,1023] are statically assigned. int unique_reserved_tag() { + // RJH removed mutex since ordering requirement across processes means // Cannot use MPI mutex for anything else! // It will preprocess to nothing for MPI_THREAD_MULTIPLE! - madness::ScopedMutex obolus(SafeMPI::charon); + // madness::ScopedMutex obolus(SafeMPI::charon); int result = urtag++; if (result >= 1000) MADNESS_EXCEPTION( "too many reserved tags in use" , result ); return result; From 4e37853592dbae49d2955adc92e5cdc35ce0b775 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Mon, 28 Nov 2022 17:01:18 -0500 Subject: [PATCH 0419/1312] removed volatile, was never needed in most locations --- src/madness/mra/lbdeux.h | 10 ++++++---- src/madness/world/worldam.h | 7 ++++--- src/madness/world/worldhashmap.h | 6 +++--- src/madness/world/worldprofile.cc | 2 +- src/madness/world/worldprofile.h | 2 +- src/madness/world/worldrmi.cc | 4 ++-- src/madness/world/worldrmi.h | 6 +++--- 7 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/madness/mra/lbdeux.h b/src/madness/mra/lbdeux.h index 169c1a84c97..185a32219e8 100644 --- a/src/madness/mra/lbdeux.h +++ b/src/madness/mra/lbdeux.h @@ -98,10 +98,12 @@ namespace madness { typedef Key keyT; typedef LBNodeDeux nodeT; typedef WorldContainer treeT; - volatile double child_cost[nchild]; - volatile double my_cost; - volatile double total_cost; - volatile bool gotkids; + + double child_cost[nchild]; // Removed volatile since all parallel updates will be under mutex from active message and no unprotected reads + double my_cost; + double total_cost; + bool gotkids; + AtomicInt nsummed; /// Computes index of child key in this node using last bit of translations diff --git a/src/madness/world/worldam.h b/src/madness/world/worldam.h index 54938632345..92baa691587 100644 --- a/src/madness/world/worldam.h +++ b/src/madness/world/worldam.h @@ -244,9 +244,10 @@ namespace madness { unsigned long worldid; ///< The world which contains this instance of WorldAmInterface const ProcessID rank; const int nproc; - volatile int cur_msg; ///< Index of next buffer to attempt to use - volatile unsigned long nsent; ///< Counts no. of AM sent for purpose of termination detection - volatile unsigned long nrecv; ///< Counts no. of AM received for purpose of termination detection + // Next 3 were volatile but no need since protected by spinlock with implied barriers/fence + int cur_msg; ///< Index of next buffer to attempt to use + unsigned long nsent; ///< Counts no. of AM sent for purpose of termination detection + unsigned long nrecv; ///< Counts no. of AM received for purpose of termination detection std::vector map_to_comm_world; ///< Maps rank in current MPI communicator to SafeMPI::COMM_WORLD diff --git a/src/madness/world/worldhashmap.h b/src/madness/world/worldhashmap.h index 7d2a3d27b52..78487767c28 100644 --- a/src/madness/world/worldhashmap.h +++ b/src/madness/world/worldhashmap.h @@ -69,7 +69,7 @@ namespace madness { typedef std::pair datumT; datumT datum; - class entry * volatile next; + class entry * next; entry(const datumT& datum, entry* next) : datum(datum), next(next) {} @@ -84,8 +84,8 @@ namespace madness { // perhaps better to just use more bins public: - entryT* volatile p; - int volatile ninbin; + entryT* p; // was volatile but all uses are protect by mutex with implied barriers and fences + int ninbin; // ditto bin() : p(0),ninbin(0) {} diff --git a/src/madness/world/worldprofile.cc b/src/madness/world/worldprofile.cc index 7d0bf3346a6..bec023eda6f 100644 --- a/src/madness/world/worldprofile.cc +++ b/src/madness/world/worldprofile.cc @@ -42,7 +42,7 @@ namespace madness { thread_local int WorldProfileObj::mythreadid = -1; // means not initialized Spinlock WorldProfile::mutex; - volatile std::vector WorldProfile::items; + std::vector WorldProfile::items; // used to be volatile but not needed due to mutex and implied barriers double WorldProfile::cpu_start = madness::cpu_time(); double WorldProfile::wall_start = madness::wall_time(); diff --git a/src/madness/world/worldprofile.h b/src/madness/world/worldprofile.h index f341d499d30..9c8110f1b37 100644 --- a/src/madness/world/worldprofile.h +++ b/src/madness/world/worldprofile.h @@ -130,7 +130,7 @@ namespace madness { /// Use the macros PROFILE_FUNC, PROFILE_BLOCK, PROFILE_MEMBER_FUNC class WorldProfile { //static ConcurrentHashMap items; - volatile static std::vector items; + static std::vector items; static Spinlock mutex; static double cpu_start; static double wall_start; diff --git a/src/madness/world/worldrmi.cc b/src/madness/world/worldrmi.cc index e056e8b65c9..b917aa027b5 100644 --- a/src/madness/world/worldrmi.cc +++ b/src/madness/world/worldrmi.cc @@ -47,7 +47,7 @@ namespace madness { RMI::RmiTask* RMI::task_ptr = nullptr; RMIStats RMI::stats; - volatile bool RMI::debugging = false; + bool RMI::debugging = false; std::list< std::unique_ptr > RMI::send_req; bool& RMI::is_server_thread_accessor() { @@ -230,7 +230,7 @@ namespace madness { , nproc(comm.Get_size()) , rank(comm.Get_rank()) , finished(false) - , send_counters(new volatile counterT[nproc]) + , send_counters(new counterT[nproc]) , recv_counters(new counterT[nproc]) , max_msg_len_(DEFAULT_MAX_MSG_LEN) , nrecv_(DEFAULT_NRECV) diff --git a/src/madness/world/worldrmi.h b/src/madness/world/worldrmi.h index ea7a7ba11e3..338d3b2298d 100644 --- a/src/madness/world/worldrmi.h +++ b/src/madness/world/worldrmi.h @@ -204,9 +204,9 @@ namespace madness { SafeMPI::Intracomm comm; const int nproc; // No. of processes in comm world const ProcessID rank; // Rank of this process - volatile bool finished; // True if finished + bool volatile finished; // True if finished ... still needs to be volatile since read without critical section or external call - std::unique_ptr send_counters; + std::unique_ptr send_counters; // used to be volatile but no need std::unique_ptr recv_counters; std::size_t max_msg_len_; std::size_t nrecv_; @@ -292,7 +292,7 @@ namespace madness { static RmiTask* task_ptr; // Pointer to the singleton instance static RMIStats stats; - static volatile bool debugging; // True if debugging + static bool debugging; // True if debugging ... used to be volatile but no need static const size_t DEFAULT_MAX_MSG_LEN = 3*512*1024; //!< the default size of recv buffers, in bytes; the actual size can be configured by the user via envvar MAD_BUFFER_SIZE static const int DEFAULT_NRECV = 128; //!< the default # of recv buffers; the actual number can be configured by the user via envvar MAD_RECV_BUFFERS From 63bdb4cfa67bdfdc8d8d03f2db10787eaa56edd6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 28 Nov 2022 17:14:41 -0500 Subject: [PATCH 0420/1312] slightly faster --- src/apps/molresponse/x_space.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 61ea89959c3..7bda5b527b7 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -66,11 +66,14 @@ namespace madness { // assignment auto operator=(const X_space &B) -> X_space & { if (this != &B) {// is it the same object? + this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - this->X = B.X; - this->Y = B.Y; + auto xf = to_response_matrix(*this); + auto xb = to_response_matrix(B); + + xf = xb; } return *this;// NO SHALLOW COPIES } @@ -227,7 +230,8 @@ namespace madness { auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions auto ax = to_response_matrix(A); int i = 0; - for (const auto &ai: ax) { rX[i++] = ai * f; } + for (const auto &ai: ax) { rX[i++] = mul(world, f, ai, false); } + world.gop.fence(); return to_X_space(rX); } friend auto operator*(const Function &f, const X_space &A) -> X_space { @@ -235,7 +239,8 @@ namespace madness { auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions auto ax = to_response_matrix(A); int i = 0; - for (const auto &ai: ax) { rX[i++] = f * ai; } + for (const auto &ai: ax) { rX[i++] = mul(world, f, ai, false); } + world.gop.fence(); return to_X_space(rX); } From a6a4a3a8fd279c7848558c7257b15cca78b8850e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 28 Nov 2022 17:20:18 -0500 Subject: [PATCH 0421/1312] let me not break everything --- src/apps/molresponse/x_space.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 7bda5b527b7..6b9bacb2822 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -70,10 +70,8 @@ namespace madness { this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - auto xf = to_response_matrix(*this); - auto xb = to_response_matrix(B); - - xf = xb; + this->X = B.X; + this->Y = B.Y; } return *this;// NO SHALLOW COPIES } From f507d5efa738c791dee904407041a69f539d4f9a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 28 Nov 2022 17:24:27 -0500 Subject: [PATCH 0422/1312] make sure i return this by this from response matrix assignment --- src/apps/molresponse/x_space.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 6b9bacb2822..75a65c9730e 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -70,8 +70,10 @@ namespace madness { this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - this->X = B.X; - this->Y = B.Y; + auto xf = to_response_matrix(*this); + auto xb = to_response_matrix(B); + xf = xb; + *this = to_X_space(xf); } return *this;// NO SHALLOW COPIES } From 8e61f893ba8963b21048b1e2c4f38529356ad3b4 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Mon, 28 Nov 2022 18:38:45 -0500 Subject: [PATCH 0423/1312] restored volatile warnings since old ones are fixed and new ones should be fixed --- cmake/modules/AddMADLibrary.cmake | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cmake/modules/AddMADLibrary.cmake b/cmake/modules/AddMADLibrary.cmake index b939895041a..13b373f4084 100644 --- a/cmake/modules/AddMADLibrary.cmake +++ b/cmake/modules/AddMADLibrary.cmake @@ -87,13 +87,13 @@ macro(add_mad_library _name _source_files _header_files _dep_mad_comp _include_d endforeach(_dep ${_dep_mad_comp}) set_target_properties(${targetname} PROPERTIES LINK_FLAGS "${LINK_FLAGS}") target_compile_features(${targetname} INTERFACE "cxx_std_${CMAKE_CXX_STANDARD}") - if (CMAKE_CXX_STANDARD GREATER_EQUAL 20) - if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - target_compile_options(MAD${_name} PUBLIC "-Wno-deprecated-volatile") - elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") - target_compile_options(MAD${_name} PUBLIC "-Wno-volatile") - endif() - endif() + # if (CMAKE_CXX_STANDARD GREATER_EQUAL 20) # volatile issues now (mostly) fixed properly, so restore warnings + # if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # target_compile_options(MAD${_name} PUBLIC "-Wno-deprecated-volatile") + # elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + # target_compile_options(MAD${_name} PUBLIC "-Wno-volatile") + # endif() + # endif() endmacro() From 7b5349cb24016280cd51ddb257c0d28fe558acb4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 10:22:19 -0500 Subject: [PATCH 0424/1312] Truncate 100x more than than function default --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 1565902ea43..8ded34c8fe4 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -252,7 +252,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto v23 = mul(world, bra_i, fp, true); //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } - //truncate(world, v23, tol, true); + truncate(world, v23, 0.01 * tol, true); // truncate if (world.rank() == 0) { print("truncate v23"); } v23 = apply(world, *poisson, v23); From 76692df13b9398b8ee11f1af51117677685188fd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 10:32:01 -0500 Subject: [PATCH 0425/1312] mostly formatting --- src/apps/molresponse/testing/runners.hpp | 108 ++++++++--------------- 1 file changed, 37 insertions(+), 71 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2fc9b9a8c6f..f2134490fb2 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -30,7 +30,6 @@ auto split(const std::string &s, char delim) -> vector { } auto addPath(const path &root, const std::string &branch) -> path { - path p_branch = root; p_branch += branch; return p_branch; @@ -46,21 +45,15 @@ struct runSchema { ResponseDataBase rdb; explicit runSchema(World &world, const std::string &xc) { - root = std::filesystem::current_path();//="/"+molecule_name; molecule_path = root; molecule_path += "/molecules"; - xc_path = addPath(root, "/" + xc); world.gop.fence(); if (std::filesystem::exists(xc_path)) { - if (world.rank() == 0) { - std::cout << "XC Directory Exists" << std::endl; - } + if (world.rank() == 0) { std::cout << "XC Directory Exists" << std::endl; } } else { - if (world.rank() == 0) { - std::cout << "Creating XC directory" << std::endl; - } + if (world.rank() == 0) { std::cout << "Creating XC directory" << std::endl; } std::filesystem::create_directory(xc_path); } @@ -68,34 +61,23 @@ struct runSchema { freq_json = addPath(molecule_path, "/frequency.json"); dalton_excited_json = addPath(molecule_path, "/dalton-excited.json"); dalton_dipole_json = addPath(molecule_path, "/dalton-dipole.json"); - rdb = ResponseDataBase(); - - if (std::filesystem::exists(freq_json)) { std::ifstream ifs(freq_json); json j_read; ifs >> j_read; rdb.set_data(j_read); - - if (world.rank() == 0) { std::cout << "Trying to read frequency.json" << std::endl; std::cout << "READ IT" << std::endl; } - } else { - if (world.rank() == 0) { - std::cout << "did not find frequency.json" << std::endl; - } - } - if (world.rank() == 0) { - print(); + if (world.rank() == 0) { std::cout << "did not find frequency.json" << std::endl; } } + if (world.rank() == 0) { print(); } } void print() const { - ::print("------------Database Runner---------------"); ::print("Root: ", root); ::print("Molecule Directory: ", molecule_path); @@ -119,9 +101,9 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(World &world, const std::string &molecule_name, const std::string &m_xc, const runSchema &schema) - : mol_name(molecule_name), - xc(m_xc) { + moldftSchema(World &world, const std::string &molecule_name, const std::string &m_xc, + const runSchema &schema) + : mol_name(molecule_name), xc(m_xc) { moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); @@ -157,14 +139,13 @@ struct moldftSchema { world.gop.fence(); if (world.rank() == 0) { std::cout << "time: " << calc_info_json["time"] << std::endl; - std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; + std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] + << std::endl; std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] << std::endl; } } - if (world.rank() == 0) { - print(); - } + if (world.rank() == 0) { print(); } } void print() const { @@ -187,15 +168,12 @@ struct frequencySchema { const path moldft_path; vector freq; - frequencySchema(World &world, const runSchema run_schema, const moldftSchema m_schema, const std::string r_operator) - : mol_name(m_schema.mol_name), - xc(m_schema.xc), - op(r_operator), + frequencySchema(World &world, const runSchema run_schema, const moldftSchema m_schema, + const std::string r_operator) + : mol_name(m_schema.mol_name), xc(m_schema.xc), op(r_operator), moldft_path(m_schema.moldft_path) { freq = run_schema.rdb.get_frequencies(mol_name, xc, op); - if (world.rank() == 0) { - print_schema(); - } + if (world.rank() == 0) { print_schema(); } } void print_schema() { @@ -266,8 +244,8 @@ std::filesystem::path generate_excited_run_path(const std::filesystem::path &mol * @param excited_state restart path * @return */ -std::pair generate_excited_save_path( - const std::filesystem::path &excited_run_path) { +std::pair +generate_excited_save_path(const std::filesystem::path &excited_run_path) { auto save_path = std::filesystem::path(excited_run_path); std::string save_string = "restart_excited"; @@ -457,9 +435,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // if parameters are different or if I want to run no matter what run // if I want to restart and if I can. restart if (try_run) { - if (world.rank() == 0) { - print("-------------Running moldft------------"); - } + if (world.rank() == 0) { print("-------------Running moldft------------"); } world.gop.fence(); // if params are different run and if restart exists and if im asking to restar if (std::filesystem::exists(moldftSchema.moldft_restart) && restart) { @@ -577,7 +553,11 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: * @param frequency * @param moldft_path */ -static auto set_frequency_path_and_restart(World &world, ResponseParameters ¶meters, const std::string &property, const double &frequency, const std::string &xc, const std::filesystem::path &moldft_path, std::filesystem::path &restart_path, bool restart) +static auto set_frequency_path_and_restart(World &world, ResponseParameters ¶meters, + const std::string &property, const double &frequency, + const std::string &xc, + const std::filesystem::path &moldft_path, + std::filesystem::path &restart_path, bool restart) -> std::filesystem::path { if (world.rank() == 0) { @@ -589,19 +569,13 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par // change the logic create save path auto frequency_run_path = generate_response_frequency_run_path(moldft_path, property, frequency, xc); - if (world.rank() == 0) { - print("frequency run path", frequency_run_path); - } + if (world.rank() == 0) { print("frequency run path", frequency_run_path); } // Crea if (std::filesystem::is_directory(frequency_run_path)) { - if (world.rank() == 0) { - cout << "Response directory found " << std::endl; - } + if (world.rank() == 0) { cout << "Response directory found " << std::endl; } } else {// create the file std::filesystem::create_directory(frequency_run_path); - if (world.rank() == 0) { - cout << "Creating response_path directory" << std::endl; - } + if (world.rank() == 0) { cout << "Creating response_path directory" << std::endl; } } world.gop.fence(); @@ -609,10 +583,7 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par // Calling this function will make the current working directory the // frequency save path auto [save_path, save_string] = generate_frequency_save_path(frequency_run_path); - if (world.rank() == 0) { - - print("save string", save_string); - } + if (world.rank() == 0) { print("save string", save_string); } parameters.set_user_defined_value("save", true); parameters.set_user_defined_value("save_file", save_string); @@ -628,9 +599,7 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par } } else if (std::filesystem::exists(restart_path)) { - if (world.rank() == 0) { - print(" restart path", restart_path); - } + if (world.rank() == 0) { print(" restart path", restart_path); } parameters.set_user_defined_value("restart", true); auto split_restart_path = split(restart_path.replace_extension("").string(), '/'); @@ -675,8 +644,8 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // Set the response parameters ResponseParameters r_params{}; set_frequency_response_parameters(r_params, property, xc, frequency, precision); - auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, moldft_path, - restart_path, true); + auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, + moldft_path, restart_path, true); if (world.rank() == 0) { molresponse::write_response_input(r_params, filename); } // if rbase exists and converged I just return save path and true @@ -684,7 +653,9 @@ auto RunResponse(World &world, const std::string &filename, double frequency, std::ifstream ifs("response_base.json"); json response_base; ifs >> response_base; - if (response_base["converged"] && response_base["precision"]["dconv"] == r_params.dconv()) { return {save_path, true}; } + if (response_base["converged"] && response_base["precision"]["dconv"] == r_params.dconv()) { + return {save_path, true}; + } } auto calc_params = initialize_calc_params(world, std::string(filename)); RHS_Generator rhs_generator; @@ -830,9 +801,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s bool first = true; for (const auto &freq: schema.freq) { - if (world.rank() == 0) { - print(success.second); - } + if (world.rank() == 0) { print(success.second); } std::filesystem::current_path(schema.moldft_path); if (first) { @@ -852,9 +821,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s success = RunResponse(world, "response.in", freq, schema.op, schema.xc, schema.moldft_path, restart_path, high_prec); - if (world.rank() == 0) { - print("Frequency ", freq, " completed"); - } + if (world.rank() == 0) { print("Frequency ", freq, " completed"); } } } @@ -867,12 +834,11 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s * @param restart do we force a restart or not * @param precision high precision or no? */ -void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, const std::string &precision) { +void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, + const std::string &precision) { if (std::filesystem::is_directory(m_schema.moldft_path)) { - if (world.rank() == 0) { - cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; - } + if (world.rank() == 0) { cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; } } else {// create the file std::filesystem::create_directory(m_schema.moldft_path); if (world.rank() == 0) { From 8476a177dacc4c09779786003a2765da3fcd62f5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 10:51:19 -0500 Subject: [PATCH 0426/1312] fix the recursive assignment call --- src/apps/molresponse/x_space.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 75a65c9730e..9c73b28df3b 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -69,11 +69,8 @@ namespace madness { this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - - auto xf = to_response_matrix(*this); - auto xb = to_response_matrix(B); - xf = xb; - *this = to_X_space(xf); + this->X = B.X; + this->Y = B.X; } return *this;// NO SHALLOW COPIES } From ea56b76cad385a2fdb85f7d7b62a44d5131e1a0e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 10:51:36 -0500 Subject: [PATCH 0427/1312] formatting and debugging changes --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++++- src/apps/molresponse/ResponseBase.cpp | 3 --- src/apps/molresponse/global_functions.cc | 1 + src/apps/molresponse/testing/mad-freq.cpp | 16 ++++----------- src/apps/molresponse/testing/runners.hpp | 23 ++++------------------ 5 files changed, 14 insertions(+), 35 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 649ef687f99..6ee74deb334 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -7,7 +7,10 @@ #include "property.h" -void FrequencyResponse::initialize(World &world) { Chi = PQ.copy(); } +void FrequencyResponse::initialize(World &world) { + if (world.rank() == 0) { print("FrequencyResponse::initialize()"); } + Chi = PQ.copy(); +} void FrequencyResponse::iterate(World &world) { size_t iter; @@ -402,6 +405,7 @@ void FrequencyResponse::save(World &world, const std::string &name) { // Load a response calculation void FrequencyResponse::load(World &world, const std::string &name) { + if (world.rank() == 0) { print("FrequencyResponse::load() -state"); } // The archive to read from archive::ParallelInputArchive ar(world, name.c_str()); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 29fd0cbae99..e76cc5cebae 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1348,9 +1348,6 @@ void ResponseBase::solve(World &world) { // Plotting input orbitals if (r_params.plot_initial()) { PlotGroundDensityVTK(world, *this); } - // TODO Why would I plot the ground state density here if the protocol or k is - // not set yet? Warm and fuzzy - // Ready to iterate! const auto protocol = r_params.protocol(); if (world.rank() == 0) { print("Response State Calculation for the following protocols"); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8ded34c8fe4..80fa0b35382 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -24,6 +24,7 @@ auto initialize_calc_params(World &world, const std::string &input_file) -> Calc r_params.set_ground_state_calculation_data(ground_calculation); r_params.set_derived_values(world, molecule); if (world.rank() == 0) { r_params.print(); } + world.gop.fence(); return {ground_calculation, molecule, r_params}; } // TODO some operator definitions that I will need to move to a separate file diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index f48a51ab9a6..4c5a2ff7c77 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -31,37 +31,29 @@ auto main(int argc, char *argv[]) -> int { int result = 0; world.gop.fence(); startup(world, argc, argv); - sleep(10); - + sleep(5); std::cout.precision(6); - if (argc != 5) { - std::cout << "Wrong number of inputs" << std::endl; return 1; } - const std::string molecule_name{argv[1]}; const std::string xc{argv[2]}; const std::string op{argv[3]}; const std::string precision{argv[4]}; - if (precision != "high" && precision != "low" && precision != "super") { - if (world.rank() == 0) { - std::cout << "Set precision to low high super" << std::endl; - } + if (world.rank() == 0) { std::cout << "Set precision to low high super" << std::endl; } return 1; } try { - auto schema = runSchema(world, xc); auto m_schema = moldftSchema(world, molecule_name, xc, schema); auto f_schema = frequencySchema(world, schema, m_schema, op); - if (std::filesystem::exists(m_schema.calc_info_json_path) && std::filesystem::exists(m_schema.moldft_restart)) { + if (std::filesystem::exists(m_schema.calc_info_json_path) && + std::filesystem::exists(m_schema.moldft_restart)) { // TODO set up to read calc_info json and check if its converged runFrequencyTests(world, f_schema, precision); } else { - moldft(world, m_schema, true, false, precision); runFrequencyTests(world, f_schema, precision); } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index f2134490fb2..f12ca3799da 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -104,14 +104,11 @@ struct moldftSchema { moldftSchema(World &world, const std::string &molecule_name, const std::string &m_xc, const runSchema &schema) : mol_name(molecule_name), xc(m_xc) { - moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); - moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); - if (std::filesystem::exists(moldft_json_path)) { std::ifstream ifs(moldft_json_path); // read results into json @@ -137,13 +134,10 @@ struct moldftSchema { std::ifstream ifs(calc_info_json_path); ifs >> calc_info_json; world.gop.fence(); - if (world.rank() == 0) { - std::cout << "time: " << calc_info_json["time"] << std::endl; - std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] - << std::endl; - std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] - << std::endl; - } + std::cout << "time: " << calc_info_json["time"] << std::endl; + std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; + std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] + << std::endl; } if (world.rank() == 0) { print(); } } @@ -640,13 +634,11 @@ auto RunResponse(World &world, const std::string &filename, double frequency, const std::string &property, const std::string &xc, const std::filesystem::path &moldft_path, std::filesystem::path restart_path, const std::string &precision) -> std::pair { - // Set the response parameters ResponseParameters r_params{}; set_frequency_response_parameters(r_params, property, xc, frequency, precision); auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, moldft_path, restart_path, true); - if (world.rank() == 0) { molresponse::write_response_input(r_params, filename); } // if rbase exists and converged I just return save path and true if (std::filesystem::exists("response_base.json")) { @@ -678,8 +670,6 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // put the response parameters in a j_molrespone json object calc_params.response_parameters.to_json(calc.j_molresponse); } - world.gop.fence(); - // set protocol to the first calc.solve(world); // TODO Why would I plot the ground state density here if the protocol or k is world.gop.fence(); @@ -792,7 +782,6 @@ auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec * @param property */ void runFrequencyTests(World &world, const frequencySchema &schema, const std::string &high_prec) { - std::filesystem::current_path(schema.moldft_path); // add a restart path auto restart_path = addPath(schema.moldft_path, "/" + schema.op + "_0-000000.00000/restart_" + @@ -800,9 +789,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s std::pair success{schema.moldft_path, false}; bool first = true; for (const auto &freq: schema.freq) { - if (world.rank() == 0) { print(success.second); } - std::filesystem::current_path(schema.moldft_path); if (first) { first = false; @@ -817,10 +804,8 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s } else { throw Response_Convergence_Error{}; } - success = RunResponse(world, "response.in", freq, schema.op, schema.xc, schema.moldft_path, restart_path, high_prec); - if (world.rank() == 0) { print("Frequency ", freq, " completed"); } } } From eaa570b9f191007a0763d76112fcc5f9b76c26c9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 13:42:00 -0500 Subject: [PATCH 0428/1312] fix some bugs --- src/apps/molresponse/FrequencyResponse.cpp | 4 ---- src/apps/molresponse/FrequencyResponse.hpp | 2 +- src/apps/molresponse/x_space.h | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6ee74deb334..bbba59d2c52 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -481,14 +481,10 @@ auto vector_to_PQ(World &world, const vector_real_function_3d &p, const vector_real_function_3d &ground_orbitals, double lo) -> response_space { response_space rhs(world, p.size(), ground_orbitals.size()); - reconstruct(world, ground_orbitals); - QProjector Qhat(world, ground_orbitals); - std::vector orbitals = copy(world, ground_orbitals); truncate(world, orbitals); - auto f = [&](auto property) { auto phat_phi = mul(world, property, orbitals, lo); // rhs[i].truncate_vec(); diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index efd87eab91a..939db5f21fa 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -25,7 +25,7 @@ class FrequencyResponse : public ResponseBase { : ResponseBase(world, params), omega{frequency}, generator{std::move(rhs)}, - PQ{std::move(generator(world, *this))} {} + PQ{generator(world, *this)} {} void initialize(World& world) override; private: diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 9c73b28df3b..54f48724417 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -70,7 +70,7 @@ namespace madness { this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); this->X = B.X; - this->Y = B.X; + this->Y = B.Y; } return *this;// NO SHALLOW COPIES } From e9eb3f7d448454e660739bf1f3b9884c1adc5a98 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 16:47:45 -0500 Subject: [PATCH 0429/1312] remove printing of ground-state overlap matrix --- src/apps/molresponse/ResponseBase.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index e76cc5cebae..82dbcb90387 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -123,12 +123,6 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const // Get sizes auto num_orbitals = phi.size(); // Debugging - if (r_params.print_level() > 2) { - Tensor S = matrix_inner(world, phi, phi); - if (world.rank() == 0) print(" Ground state overlap:"); - if (world.rank() == 0) print(S); - } - // Calculate T // Make the derivative operators in each direction real_derivative_3d Dx(world, 0); real_derivative_3d Dy(world, 1); @@ -227,9 +221,6 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) { for (int64_t j = i + 1; j < new_hamiltonian.dim(1); j++) { - // print(i, j); - // print(xAx(i, j)); - // print(xAx(j, i)); new_hamiltonian(j, i) = new_hamiltonian(i, j); } } @@ -247,11 +238,6 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const auto new_hamiltonian_no_diag = copy(new_hamiltonian); for (size_t i = 0; i < num_orbitals; i++) new_hamiltonian_no_diag(long(i), long(i)) = 0.0; - // Debug output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Ground state new_hamiltonian:"); - print(new_hamiltonian); - } // End timer if (r_params.print_level() >= 1) molresponse::end_timer(world, " Create grnd ham:"); return {new_hamiltonian, new_hamiltonian_no_diag}; From 3c4190f6465148f03c9090e06c2d176f9eb7972e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 17:01:22 -0500 Subject: [PATCH 0430/1312] normal truncation in exchange --- src/apps/molresponse/FrequencyResponse.cpp | 7 ------- src/apps/molresponse/global_functions.cc | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bbba59d2c52..6597f6e6b70 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -86,10 +86,8 @@ void FrequencyResponse::iterate(World &world) { bsh_y_ops = make_bsh_operators_response(world, y_shifts, omega); omega = -omega; } - vector_real_function_3d rho_omega = make_density(world, Chi); converged = false;// Converged flag - auto thresh = FunctionDefaults<3>::get_thresh(); auto max_rotation = .5; if (thresh >= 1e-2) { @@ -111,9 +109,7 @@ void FrequencyResponse::iterate(World &world) { printf("\n Iteration %d at time %.1fs\n", static_cast(iter), wall_time()); if (world.rank() == 0) print("-------------------------------------------"); } - if (iter < 2 || (iter % 10) == 0) { load_balance_chi(world); } - if (iter > 0) { if (density_residuals.max() > 2) { break; } double d_residual = density_residuals.max(); @@ -121,14 +117,11 @@ void FrequencyResponse::iterate(World &world) { auto chi_norms = Chi.norm2s(); auto relative_bsh = copy(bsh_residualsX); auto rho_norms = norm2s_T(world, rho_omega); - std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); - auto max_bsh = bsh_residualsX.absmax(); auto relative_max_bsh = relative_bsh.absmax(); - Tensor polar = -2 * inner(Chi, PQ); world.gop.fence(); // Todo add chi norm and chi_x diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 80fa0b35382..d1f9eb5033f 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -253,7 +253,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto v23 = mul(world, bra_i, fp, true); //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } - truncate(world, v23, 0.01 * tol, true); + truncate(world, v23, tol, true); // truncate if (world.rank() == 0) { print("truncate v23"); } v23 = apply(world, *poisson, v23); From cb4895ed43bbe78a414e17dc474598ec558a12cf Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 17:09:25 -0500 Subject: [PATCH 0431/1312] remove norm printing --- src/apps/molresponse/ResponseBase.cpp | 19 ------------------- src/apps/molresponse/x_space.h | 10 ++++------ 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 82dbcb90387..ceea824a576 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1090,27 +1090,8 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp size_t n = chi.X.size_orbitals(); // compute residual X_space res(world, m, n); - //res.X = old_Chi.X - temp.X; res = g_chi - chi; - auto residual_norms = res.norm2s(); - if (world.rank() == 0 and (r_params.print_level() > 1)) { - print("||f(x)||_2 = : ", residual_norms); - } - - if (r_params.print_level() >= 5) { - int j = 0; - auto res_vec = to_response_matrix(res); - for (const auto &xi: res_vec) { - auto res_b_norms = std::vector{}; - for (const auto &xij: xi) res_b_norms.push_back(xij.norm2()); - world.gop.fence(); - if (world.rank() == 0) { print("||f(x)||_: ", j, res_b_norms); } - j++; - } - } - - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); } diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 54f48724417..c66ff068f21 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -271,13 +271,11 @@ namespace madness { auto norm2s() -> Tensor { World &world = X[0][0].world(); - Tensor norms(num_states()); - for (size_t b = 0; b < num_states(); b++) { - auto xb = madness::copy(world, X[b]); - for (auto &yb: Y[b]) { xb.push_back(madness::copy(yb, true)); } - norms[b] = sqrt(inner(xb, xb)); - } + auto x = to_response_matrix(*this); + int b = 0; + for (const auto &xb: x) { norms[b++] = norm2(world, xb); } + world.gop.fence(); return norms; } From 15b5e544fabf37f5dea8ac929225435c333eeb15 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 29 Nov 2022 17:11:54 -0500 Subject: [PATCH 0432/1312] more volatile cleanup --- src/madness/world/test_world.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/madness/world/test_world.cc b/src/madness/world/test_world.cc index 01ed71e5703..342d3c8591e 100644 --- a/src/madness/world/test_world.cc +++ b/src/madness/world/test_world.cc @@ -250,7 +250,7 @@ void test5(World& world) { } class TestBarrier : public TaskInterface { - volatile int count; + int count; // does not need to be volatile since barrier includes necessary memory fences public: TestBarrier(const madness::TaskAttributes& attr) @@ -285,12 +285,10 @@ class TestBarrier : public TaskInterface { }; class TimeBarrier : public TaskInterface { -// volatile int count; public: TimeBarrier(const madness::TaskAttributes& attr) : TaskInterface(attr) -// , count(0) { print("Timing barrier with nthread", attr.get_nthread()); } From fe136faa73fe9ce1554c4b265b6a7426b89eee07 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 17:17:12 -0500 Subject: [PATCH 0433/1312] re-write kain without using standard transform --- src/apps/molresponse/ResponseBase.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ceea824a576..d4548405dae 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1101,20 +1101,24 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, response_solver &kain_x_space, - response_matrix &Xvector, response_matrix &Xresidual) + response_matrix &x_vectors, response_matrix &x_residuals) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); - Xvector = to_response_matrix(chi); - Xresidual = to_response_matrix(residual_chi); + x_vectors = to_response_matrix(chi); + x_residuals = to_response_matrix(residual_chi); response_matrix update(m); if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } int b = 0; - std::transform( - Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), - [&](const auto &xi, const auto &ri) { return kain_x_space[b++].update(xi, ri); }); + for (auto &kain_xb: kain_x_space) { + const auto &xi = x_vectors[b]; + const auto &ri = x_vectors[b]; + update[b] = kain_xb.update(xi, ri); + b++; + } + world.gop.fence(); kain_update = to_X_space(update); if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } if (r_params.print_level() >= 1) { From 589f5ecf4a85be2b44bb7ad7d05f63b36b491e06 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 18:16:33 -0500 Subject: [PATCH 0434/1312] some changes to kain --- src/apps/molresponse/ExcitedResponse.cpp | 3 +-- src/apps/molresponse/FrequencyResponse.cpp | 13 +++---------- src/apps/molresponse/FrequencyResponse.hpp | 13 ++++++------- src/apps/molresponse/ResponseBase.cpp | 11 ++++------- src/apps/molresponse/ResponseBase.hpp | 3 +-- 5 files changed, 15 insertions(+), 28 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index b1870ddb1ad..a2882b5e68e 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -2155,8 +2155,7 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & // kain if iteration >0 or first run where there should not be a problem // computed new_chi and res if (r_params.kain() && (iter > 0) && true) { - new_chi = - kain_x_space_update(world, rotated_chi, new_res, kain_x_space, Xvector, Xresidual); + new_chi = kain_x_space_update(world, rotated_chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, rotated_chi, new_chi, compute_y, maxrotn); } diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6597f6e6b70..f10efb2cc64 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -40,11 +40,6 @@ void FrequencyResponse::iterate(World &world) { // create X space residuals X_space residuals = X_space::zero_functions(world, m, n); - std::vector x_vectors; - std::vector x_residuals; - - x_vectors = to_response_matrix(Chi); - x_residuals = to_response_matrix(residuals); /* for (size_t b = 0; b < m; b++) { x_vectors.emplace_back(Chi, b); @@ -175,9 +170,8 @@ void FrequencyResponse::iterate(World &world) { // std::cout << "MPI BARRIER before update " << std::endl; // world.mpi.Barrier(); - auto [new_chi, new_res] = - update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, x_vectors, x_residuals, iter, max_rotation); + auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, + omega, kain_x_space, iter, max_rotation); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -257,7 +251,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - response_matrix &Xvector, response_matrix &Xresidual, size_t iteration, const double &maxrotn) -> std::tuple { @@ -275,7 +268,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp if (r_params.kain() && (iteration > 2)) { - new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); + new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 939db5f21fa..ae1cc1108bd 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -45,13 +45,12 @@ class FrequencyResponse : public ResponseBase { std::string message); void save(World& world, const std::string& name) override; void load(World& world, const std::string& name) override; - std::tuple update(World& world, X_space& chi, XCOperator& xc, - vector& bsh_x_ops, - vector& bsh_y_ops, - QProjector& projector, double& x_shifts, - double& omega_n, response_solver &kain_x_space, - response_matrix &Xvector, response_matrix &Xresidual, - size_t iteration, const double& maxrotn); + std::tuple update(World &world, X_space &chi, XCOperator &xc, + std::vector &bsh_x_ops, + std::vector &bsh_y_ops, + QProjector &projector, double &x_shifts, + double &omega_n, response_solver &kain_x_space, + size_t iteration, const double &maxrotn); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d4548405dae..118b3452a62 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1100,22 +1100,19 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp } auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, - const X_space &residual_chi, response_solver &kain_x_space, - response_matrix &x_vectors, response_matrix &x_residuals) + const X_space &residual_chi, response_solver &kain_x_space) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); - x_vectors = to_response_matrix(chi); - x_residuals = to_response_matrix(residual_chi); response_matrix update(m); + auto x_vectors = to_response_matrix(chi); + auto x_residuals = to_response_matrix(residual_chi); if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } int b = 0; for (auto &kain_xb: kain_x_space) { - const auto &xi = x_vectors[b]; - const auto &ri = x_vectors[b]; - update[b] = kain_xb.update(xi, ri); + update[b] = kain_xb.update(x_vectors[b], x_residuals[b]); b++; } world.gop.fence(); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index d53ce8d2667..3ffb2d699d0 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -199,8 +199,7 @@ class ResponseBase { auto kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, - response_solver &kain_x_space, response_matrix &Xvector, - response_matrix &Xresidual) -> X_space; + response_solver &kain_x_space) -> X_space; void x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, bool restrict_y, const double &maxrotn); From 9cd1297cc4524c9125413b7b5d7ec6f0c85daad5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 19:04:42 -0500 Subject: [PATCH 0435/1312] something is wrong with moldft call --- src/apps/molresponse/testing/mad-freq.cpp | 1 + src/apps/molresponse/testing/runners.hpp | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 4c5a2ff7c77..52cfe9e702c 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -49,6 +49,7 @@ auto main(int argc, char *argv[]) -> int { auto schema = runSchema(world, xc); auto m_schema = moldftSchema(world, molecule_name, xc, schema); auto f_schema = frequencySchema(world, schema, m_schema, op); + world.gop.fence(); if (std::filesystem::exists(m_schema.calc_info_json_path) && std::filesystem::exists(m_schema.moldft_restart)) { // TODO set up to read calc_info json and check if its converged diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index f12ca3799da..b02d7dc7e78 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -134,10 +134,14 @@ struct moldftSchema { std::ifstream ifs(calc_info_json_path); ifs >> calc_info_json; world.gop.fence(); - std::cout << "time: " << calc_info_json["time"] << std::endl; - std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; - std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] - << std::endl; + if (world.rank() == 0) { + + std::cout << "time: " << calc_info_json["time"] << std::endl; + std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] + << std::endl; + std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] + << std::endl; + } } if (world.rank() == 0) { print(); } } @@ -407,7 +411,6 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value>("protocol", {1e-9}); param1.set_user_defined_value("dconv", 1e-7); } - param1.set_user_defined_value("localize", "new"); CalculationParameters param_calc; if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { @@ -446,8 +449,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo world.gop.fence(); SCF calc(world, parser); - calc.set_protocol<3>(world, 1e-4); - + //calc.set_protocol<3>(world, 1e-4); MolecularEnergy ME(world, calc); // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! @@ -670,6 +672,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // put the response parameters in a j_molrespone json object calc_params.response_parameters.to_json(calc.j_molresponse); } + world.gop.fence(); calc.solve(world); // TODO Why would I plot the ground state density here if the protocol or k is world.gop.fence(); From 850605d8c6d5d4a0bd095794d680ef524e75a342 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 19:36:31 -0500 Subject: [PATCH 0436/1312] add everything I need to make moldft work --- src/apps/molresponse/testing/runners.hpp | 28 ++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index b02d7dc7e78..fa2018961fc 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -433,7 +433,6 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // if I want to restart and if I can. restart if (try_run) { if (world.rank() == 0) { print("-------------Running moldft------------"); } - world.gop.fence(); // if params are different run and if restart exists and if im asking to restar if (std::filesystem::exists(moldftSchema.moldft_restart) && restart) { param1.set_user_defined_value("restart", true); @@ -446,13 +445,38 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo world.gop.fence(); commandlineparser parser; parser.set_keyval("input", "moldft.in"); - world.gop.fence(); + if (world.rank() == 0) print("input filename: ", parser.value("input")); + + + print_meminfo(world.rank(), "startup"); + FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); + + std::cout.precision(6); SCF calc(world, parser); + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Hartree-Fock and Density Functional Theory Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc.molecule.print(); + print("\n"); + calc.param.print("dft"); + } + if (world.size() > 1) { + calc.set_protocol<3>(world, 1e-4); + calc.make_nuclear_potential(world); + calc.initial_load_bal(world); + } +//vama + calc.set_protocol<3>(world, calc.param.protocol()[0]); //calc.set_protocol<3>(world, 1e-4); + world.gop.fence(); MolecularEnergy ME(world, calc); + world.gop.fence(); // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! + world.gop.fence(); ME.output_calc_info_schema(); } else { if (world.rank() == 0) { From d96d08e1a0b5b151a2a2cea8ae8a017ce3e4403a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 15:39:22 -0500 Subject: [PATCH 0437/1312] some mad-frequency clean up --- src/apps/molresponse/FrequencyResponse.cpp | 7 -- src/apps/molresponse/testing/mad-freq.cpp | 102 +++++++++++---------- 2 files changed, 55 insertions(+), 54 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f10efb2cc64..ed4b17946f8 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -167,13 +167,8 @@ void FrequencyResponse::iterate(World &world) { break; } } - - // std::cout << "MPI BARRIER before update " << std::endl; - // world.mpi.Barrier(); auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation); - - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); if (r_params.print_level() >= 1) { @@ -184,7 +179,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make_density_new", "make_density_new", iter_timing); } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bsh_residualsX = copy(new_res.residual_norms); if (world.rank() == 0) { print("copy tensors: bshX"); } @@ -195,7 +189,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - xij_res_norms = new_res.residual.component_norm2s(); if (world.rank() == 0) { print("computing residuals: xij residuals"); } xij_norms = Chi.component_norm2s(); diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 52cfe9e702c..a381abf2286 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -27,54 +27,62 @@ using namespace madness; auto main(int argc, char *argv[]) -> int { - World &world = madness::initialize(argc, argv); - int result = 0; - world.gop.fence(); - startup(world, argc, argv); - sleep(5); - std::cout.precision(6); - if (argc != 5) { - std::cout << "Wrong number of inputs" << std::endl; - return 1; - } - const std::string molecule_name{argv[1]}; - const std::string xc{argv[2]}; - const std::string op{argv[3]}; - const std::string precision{argv[4]}; - if (precision != "high" && precision != "low" && precision != "super") { - if (world.rank() == 0) { std::cout << "Set precision to low high super" << std::endl; } - return 1; - } - try { - auto schema = runSchema(world, xc); - auto m_schema = moldftSchema(world, molecule_name, xc, schema); - auto f_schema = frequencySchema(world, schema, m_schema, op); - world.gop.fence(); - if (std::filesystem::exists(m_schema.calc_info_json_path) && - std::filesystem::exists(m_schema.moldft_restart)) { - // TODO set up to read calc_info json and check if its converged - runFrequencyTests(world, f_schema, precision); - } else { - moldft(world, m_schema, true, false, precision); - runFrequencyTests(world, f_schema, precision); - } - - } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { - std::cout << e << std::endl; - } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { - print(s); - } catch (const std::string &s) { print(s); } catch (const std::exception &e) { - print(e.what()); - } catch (const std::filesystem::filesystem_error &ex) { - std::cerr << ex.what() << "\n"; - } catch (...) { error("caught unhandled exception"); } + madness::initialize(argc, argv); - if (world.rank() == 0) { print("Finished All Frequencies"); } + { + World world(SafeMPI::COMM_WORLD); + startup(world, argc, argv, true); - return result; - - // print_meminfo(world.rank(), "startup"); - // std::cout.precision(6); - // print_stats(world); + try { + sleep(5); + std::cout.precision(6); + if (argc != 5) { + std::cout << "Wrong number of inputs" << std::endl; + return 1; + } + const std::string molecule_name{argv[1]}; + const std::string xc{argv[2]}; + const std::string op{argv[3]}; + const std::string precision{argv[4]}; + if (precision != "high" && precision != "low" && precision != "super") { + if (world.rank() == 0) { + std::cout << "Set precision to low high super" << std::endl; + } + return 1; + } + auto schema = runSchema(world, xc); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); + auto f_schema = frequencySchema(world, schema, m_schema, op); + world.gop.fence(); + if (std::filesystem::exists(m_schema.calc_info_json_path) && + std::filesystem::exists(m_schema.moldft_restart)) { + runFrequencyTests(world, f_schema, precision); + } else { + moldft(world, m_schema, true, false, precision); + runFrequencyTests(world, f_schema, precision); + } + } catch (const SafeMPI::Exception &e) { + print(e); + error("caught an MPI exception"); + } catch (const madness::MadnessException &e) { + print(e); + error("caught a MADNESS exception"); + } catch (const madness::TensorException &e) { + print(e); + error("caught a Tensor exception"); + } catch (const char *s) { print(s); } catch (const std::string &s) { + print(s); + } catch (const std::exception &e) { + error("caught an STL exception"); + print(e.what()); + } catch (...) { error("caught unhandled exception"); } + // Nearly all memory will be freed at this point + world.gop.fence(); + world.gop.fence(); + print_stats(world); + if (world.rank() == 0) { print("Finished All Frequencies"); } + } + finalize(); + return 0; } From a54ea85b0023eebf852930ad0fe57c6f93ca1cb0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 16:06:12 -0500 Subject: [PATCH 0438/1312] new rhs set up --- src/apps/molresponse/FrequencyResponse.cpp | 25 +++++++++------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ed4b17946f8..37e8430679c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -445,7 +445,6 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { vector_real_function_3d dipole_vectors(3); size_t i = 0; for (auto &d: dipole_vectors) { - std::vector f(3, 0); f[i++] = 1; d = real_factory_3d(world).functor(real_functor_3d(new MomentFunctor(f))); @@ -456,24 +455,20 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { return PQ; } -auto vector_to_PQ(World &world, const vector_real_function_3d &p, +auto vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, const vector_real_function_3d &ground_orbitals, double lo) -> response_space { - response_space rhs(world, p.size(), ground_orbitals.size()); + response_space rhs(world, rhs_operators.size(), ground_orbitals.size()); reconstruct(world, ground_orbitals); QProjector Qhat(world, ground_orbitals); - std::vector orbitals = copy(world, ground_orbitals); - truncate(world, orbitals); - auto f = [&](auto property) { - auto phat_phi = mul(world, property, orbitals, lo); - // rhs[i].truncate_vec(); - // project rhs vectors for state - phat_phi = Qhat(phat_phi); - truncate(world, phat_phi); - world.gop.fence(); - return phat_phi; - }; - std::transform(p.begin(), p.end(), rhs.begin(), f); + int b = 0; + for (const functionT &pi: rhs_operators) { + auto op_phi = mul(world, pi, ground_orbitals, lo); + op_phi = Qhat(op_phi); + truncate(world, op_phi, true); + rhs[b] = op_phi; + b++; + } return rhs; } // From 21595a0cf7075bc779bee98247b09d89690bb2ec Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 16:17:32 -0500 Subject: [PATCH 0439/1312] not sure how i maintain accuracy if I never change PQ through the iterations --- src/apps/molresponse/FrequencyResponse.cpp | 3 ++- src/apps/molresponse/testing/runners.hpp | 6 ++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 37e8430679c..c25048fb957 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -94,7 +94,7 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-8) { max_rotation = .05; } - + PQ = generator(world, *this); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); // Basic output @@ -450,6 +450,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { d = real_factory_3d(world).functor(real_functor_3d(new MomentFunctor(f))); } //truncate(world, dipole_vectors, true); + world.gop.fence(); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals(), r_params.lo()); PQ.Y = PQ.X; return PQ; diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index fa2018961fc..a64d5cf917b 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -682,8 +682,9 @@ auto RunResponse(World &world, const std::string &filename, double frequency, } else { rhs_generator = nuclear_generator; } + + FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); FrequencyResponse calc(world, calc_params, frequency, rhs_generator); - world.gop.fence(); if (world.rank() == 0) { print("\n\n"); print(" MADNESS Time-Dependent Density Functional Theory Response " @@ -696,9 +697,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // put the response parameters in a j_molrespone json object calc_params.response_parameters.to_json(calc.j_molresponse); } - world.gop.fence(); calc.solve(world); - // TODO Why would I plot the ground state density here if the protocol or k is world.gop.fence(); // set protocol to the first if (world.rank() == 0) { @@ -823,7 +822,6 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s } else if (success.second) { // if the previous run succeeded then set the restart path restart_path = success.first; - world.gop.fence(); if (world.rank() == 0) { print("restart_path", restart_path); print("restart_path = success.first", restart_path); From bd7e4fe3af2d8b5540f67aa47646c1076772cdb7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 16:30:57 -0500 Subject: [PATCH 0440/1312] I thought I was using lo but It was acting as a bool --- src/apps/molresponse/FrequencyResponse.cpp | 8 ++++---- src/apps/molresponse/FrequencyResponse.hpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index c25048fb957..426e338024e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -434,7 +434,7 @@ auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { factoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); } } - PQ.X = vector_to_PQ(world, nuclear_vector, calc.get_orbitals(), r_params.lo()); + PQ.X = vector_to_PQ(world, nuclear_vector, calc.get_orbitals()); PQ.Y = PQ.X; return PQ; } @@ -451,20 +451,20 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { } //truncate(world, dipole_vectors, true); world.gop.fence(); - PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals(), r_params.lo()); + PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); PQ.Y = PQ.X; return PQ; } auto vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, - const vector_real_function_3d &ground_orbitals, double lo) -> response_space { + const vector_real_function_3d &ground_orbitals) -> response_space { response_space rhs(world, rhs_operators.size(), ground_orbitals.size()); reconstruct(world, ground_orbitals); QProjector Qhat(world, ground_orbitals); int b = 0; for (const functionT &pi: rhs_operators) { - auto op_phi = mul(world, pi, ground_orbitals, lo); + auto op_phi = mul(world, pi, ground_orbitals, true); op_phi = Qhat(op_phi); truncate(world, op_phi, true); rhs[b] = op_phi; diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index ae1cc1108bd..9226a1ff8ba 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -12,8 +12,8 @@ class FrequencyResponse; using RHS_Generator = std::function; -response_space vector_to_PQ(World& world, const vector_real_function_3d& p, - const vector_real_function_3d& ground_orbitals, double lo); +response_space vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, + const vector_real_function_3d &ground_orbitals); X_space nuclear_generator(World& world, FrequencyResponse& calc); X_space dipole_generator(World& world, FrequencyResponse& calc); //using RHS_Generator = std::function; From fea66c5c92b09e9f8a532420abbd3ceaa06eaed6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 16:44:16 -0500 Subject: [PATCH 0441/1312] some clean up of the runner. modify params for restart and brodacast --- src/apps/molresponse/testing/runners.hpp | 78 +++++++++--------------- 1 file changed, 28 insertions(+), 50 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index a64d5cf917b..0d214de41ac 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -450,7 +450,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo print_meminfo(world.rank(), "startup"); - FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); + FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap>(world))); std::cout.precision(6); SCF calc(world, parser); @@ -468,7 +468,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo calc.make_nuclear_potential(world); calc.initial_load_bal(world); } -//vama + //vama calc.set_protocol<3>(world, calc.param.protocol()[0]); //calc.set_protocol<3>(world, 1e-4); world.gop.fence(); @@ -580,15 +580,13 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par std::filesystem::path &restart_path, bool restart) -> std::filesystem::path { - if (world.rank() == 0) { - print("set_frequency_path_and_restart"); - print("restart path", restart_path); - } + if (world.rank() == 0) { print("restart path", restart_path); } // change the logic create save path auto frequency_run_path = generate_response_frequency_run_path(moldft_path, property, frequency, xc); + world.gop.fence(); if (world.rank() == 0) { print("frequency run path", frequency_run_path); } // Crea if (std::filesystem::is_directory(frequency_run_path)) { @@ -597,51 +595,34 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par std::filesystem::create_directory(frequency_run_path); if (world.rank() == 0) { cout << "Creating response_path directory" << std::endl; } } - world.gop.fence(); - std::filesystem::current_path(frequency_run_path); - // Calling this function will make the current working directory the // frequency save path auto [save_path, save_string] = generate_frequency_save_path(frequency_run_path); - if (world.rank() == 0) { print("save string", save_string); } - - parameters.set_user_defined_value("save", true); - parameters.set_user_defined_value("save_file", save_string); - world.gop.fence(); - // if restart and restartfile exists go ahead and set the restart file - if (restart) { - if (std::filesystem::exists(save_path)) { - - parameters.set_user_defined_value("restart", true); - parameters.set_user_defined_value("restart_file", save_string); - if (world.rank() == 0) { - print("found save directory... restarting from save_string ", save_string); - } - } else if (std::filesystem::exists(restart_path)) { - - if (world.rank() == 0) { print(" restart path", restart_path); } - parameters.set_user_defined_value("restart", true); - - auto split_restart_path = split(restart_path.replace_extension("").string(), '/'); - - std::string restart_file_short = - "../" + split_restart_path[split_restart_path.size() - 2] + "/" + - split_restart_path[split_restart_path.size() - 1]; - parameters.set_user_defined_value("restart_file", restart_file_short); - - if (world.rank() == 0) { - print("relative restart path", restart_file_short); - print("found restart directory... restarting from restart_path.string ", - restart_path.string()); - } - - } else { - parameters.set_user_defined_value("restart", false); + if (world.rank() == 0) { + parameters.set_user_defined_value("save", true); + parameters.set_user_defined_value("save_file", save_string); + if (restart) {//if we are trying a restart calculation + if (std::filesystem::exists(save_path)) { + //if the save path exists then we know we can + // restart from the previous save + parameters.set_user_defined_value("restart", true); + parameters.set_user_defined_value("restart_file", save_string); + } else if (std::filesystem::exists(restart_path)) { + parameters.set_user_defined_value("restart", true); + auto split_restart_path = split(restart_path.replace_extension("").string(), '/'); + std::string restart_file_short = + "../" + split_restart_path[split_restart_path.size() - 2] + "/" + + split_restart_path[split_restart_path.size() - 1]; + parameters.set_user_defined_value("restart_file", restart_file_short); + // Then we restart from the previous file instead + } else { + parameters.set_user_defined_value("restart", false); + }; // neither file exists therefore you need to start from fresh } - } else { - parameters.set_user_defined_value("restart", false); } + world.gop.broadcast_serializable(parameters, 0); + // if restart and restartfile exists go ahead and set the restart file return save_path; } @@ -683,7 +664,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, rhs_generator = nuclear_generator; } - FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); + FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap>(world))); FrequencyResponse calc(world, calc_params, frequency, rhs_generator); if (world.rank() == 0) { print("\n\n"); @@ -822,10 +803,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s } else if (success.second) { // if the previous run succeeded then set the restart path restart_path = success.first; - if (world.rank() == 0) { - print("restart_path", restart_path); - print("restart_path = success.first", restart_path); - } + if (world.rank() == 0) { print("restart_path", restart_path); } } else { throw Response_Convergence_Error{}; } From a74d046aef92c5f8001bd8dc963350be6d11314c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 16:52:51 -0500 Subject: [PATCH 0442/1312] some more clean up --- src/apps/molresponse/FrequencyResponse.cpp | 5 ++--- src/apps/molresponse/testing/response_data_base.hpp | 12 ------------ 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 426e338024e..8a705bb3e31 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -427,8 +427,8 @@ auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { auto num_operators = size_t(molecule.natom() * 3); auto nuclear_vector = vecfuncT(num_operators); - for (size_t atom = 0; atom < molecule.natom(); ++atom) { - for (size_t axis = 0; axis < 3; ++axis) { + for (long atom = 0; atom < molecule.natom(); ++atom) { + for (long axis = 0; axis < 3; ++axis) { functorT func(new madchem::MolecularDerivativeFunctor(molecule, atom, axis)); nuclear_vector.at(atom * 3 + axis) = functionT( factoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); @@ -458,7 +458,6 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { auto vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, const vector_real_function_3d &ground_orbitals) -> response_space { - response_space rhs(world, rhs_operators.size(), ground_orbitals.size()); reconstruct(world, ground_orbitals); QProjector Qhat(world, ground_orbitals); diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp index 6c37e4b4863..3fec7c5585a 100644 --- a/src/apps/molresponse/testing/response_data_base.hpp +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -54,44 +54,32 @@ class ResponseDataBase { } void add_default_molecule(const json &response_keywords) { - const std::string molecule_name = response_keywords["molecule"]; const std::string xc = response_keywords["xc"]; const std::string op = response_keywords["operator"]; json j_add; if (op == "excited-state") { - j_add[molecule_name][xc][op] = 8; - - } else if (op == "dipole") { - if (std::filesystem::exists("molecules/dalton-excited.json")) { std::ifstream ifs("molecules/dalton-excited.json"); try { - json dalton_excited; ifs >> dalton_excited; ::print("Read Dalton Excited"); ::print(dalton_excited); - - std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] ["aug-cc-pVTZ"]["response"]["freq"]; auto omega_max = freq.at(0); omega_max = omega_max / 2.0; ::print(omega_max); - std::vector omegas = {0, omega_max / 8.0, omega_max / 4.0, omega_max / 2.0, omega_max}; j_add[molecule_name][xc][op] = omegas; - - } catch (const json::out_of_range &e) { std::cout << e.what() << std::endl; // The molecule file exists in the database therefore it is okay to add to frequency.json } - } else { std::cout << " did not find dipole-excited.json" << std::endl; j_add[molecule_name][xc][op] = {0}; From 17dd1155357190e46195e8e13e7a79e0db08542c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 17:14:48 -0500 Subject: [PATCH 0443/1312] some more clean up --- src/apps/molresponse/FrequencyResponse.cpp | 49 +++------------------- 1 file changed, 6 insertions(+), 43 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8a705bb3e31..fcc3ea08e29 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -332,7 +332,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, void FrequencyResponse::frequency_to_json(json &j_mol_in, size_t iter, const Tensor &polar_ij) { json j = {}; - j["iter"] = iter; j["polar"] = tensor_to_json(polar_ij); auto index = j_mol_in["protocol_data"].size() - 1; @@ -349,26 +348,9 @@ void FrequencyResponse::compute_and_print_polarizability(World &world, X_space & } void FrequencyResponse::save(World &world, const std::string &name) { - - // Archive to write everything to archive::ParallelOutputArchive ar(world, name.c_str(), 1); - // Just going to enforce 1 io server - - // Saving, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) + ar &r_params.archive(); ar &r_params.tda(); ar &r_params.num_orbitals(); @@ -387,33 +369,14 @@ void FrequencyResponse::load(World &world, const std::string &name) { if (world.rank() == 0) { print("FrequencyResponse::load() -state"); } // The archive to read from archive::ParallelInputArchive ar(world, name.c_str()); - - // Reading in, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) - ar &r_params.archive(); ar &r_params.tda(); ar &r_params.num_orbitals(); ar &r_params.num_states(); - Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); - for (size_t i = 0; i < r_params.num_states(); i++) for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; world.gop.fence(); - if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; @@ -459,14 +422,14 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { auto vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, const vector_real_function_3d &ground_orbitals) -> response_space { response_space rhs(world, rhs_operators.size(), ground_orbitals.size()); - reconstruct(world, ground_orbitals); - QProjector Qhat(world, ground_orbitals); + auto orbitals = copy(world, ground_orbitals); + reconstruct(world, orbitals); + truncate(world, orbitals); + QProjector Qhat(world, orbitals); int b = 0; for (const functionT &pi: rhs_operators) { auto op_phi = mul(world, pi, ground_orbitals, true); - op_phi = Qhat(op_phi); - truncate(world, op_phi, true); - rhs[b] = op_phi; + rhs[b] = Qhat(op_phi); b++; } return rhs; From 18aea143ad07df7e1e7f7ba245f1d0fd0bbb9895 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 17:17:28 -0500 Subject: [PATCH 0444/1312] PQ printing --- src/apps/molresponse/FrequencyResponse.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index fcc3ea08e29..3499b4a30a1 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -416,6 +416,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { world.gop.fence(); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); PQ.Y = PQ.X; + if (world.rank() == 0) { print("Made new PQ"); } return PQ; } From 0c163e2a4822c375af6d1099356e6ff124bce9b4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 18:07:07 -0500 Subject: [PATCH 0445/1312] clang-tidy --- src/apps/molresponse/testing/mad-freq.cpp | 1 - src/apps/molresponse/testing/runners.hpp | 191 ++++++++---------- .../molresponse/testing/test_development.cpp | 2 +- 3 files changed, 88 insertions(+), 106 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index a381abf2286..96f7aeb98dd 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -54,7 +54,6 @@ auto main(int argc, char *argv[]) -> int { auto schema = runSchema(world, xc); auto m_schema = moldftSchema(world, molecule_name, xc, schema); auto f_schema = frequencySchema(world, schema, m_schema, op); - world.gop.fence(); if (std::filesystem::exists(m_schema.calc_info_json_path) && std::filesystem::exists(m_schema.moldft_restart)) { runFrequencyTests(world, f_schema, precision); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 0d214de41ac..b3550cdf307 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -5,6 +5,8 @@ #ifndef MADNESS_RUNNERS_HPP #define MADNESS_RUNNERS_HPP +#include + #include "ExcitedResponse.hpp" #include "FrequencyResponse.hpp" #include "ResponseExceptions.hpp" @@ -53,27 +55,29 @@ struct runSchema { if (std::filesystem::exists(xc_path)) { if (world.rank() == 0) { std::cout << "XC Directory Exists" << std::endl; } } else { - if (world.rank() == 0) { std::cout << "Creating XC directory" << std::endl; } - std::filesystem::create_directory(xc_path); + if (world.rank() == 0) { + std::cout << "Creating XC directory" << std::endl; + std::filesystem::create_directory(xc_path); + } } - // Get the database where the calculation will be run from freq_json = addPath(molecule_path, "/frequency.json"); dalton_excited_json = addPath(molecule_path, "/dalton-excited.json"); dalton_dipole_json = addPath(molecule_path, "/dalton-dipole.json"); rdb = ResponseDataBase(); - if (std::filesystem::exists(freq_json)) { - std::ifstream ifs(freq_json); - json j_read; - ifs >> j_read; - rdb.set_data(j_read); - if (world.rank() == 0) { - std::cout << "Trying to read frequency.json" << std::endl; + if (world.rank() == 0) { + std::cout << "Trying to read frequency.json" << std::endl; + if (std::filesystem::exists(freq_json)) { + std::ifstream ifs(freq_json); + json j_read; + ifs >> j_read; + rdb.set_data(j_read); std::cout << "READ IT" << std::endl; + } else { + std::cout << "did not find frequency.json" << std::endl; } - } else { - if (world.rank() == 0) { std::cout << "did not find frequency.json" << std::endl; } } + world.gop.broadcast(rdb, 0); if (world.rank() == 0) { print(); } } @@ -101,41 +105,34 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(World &world, const std::string &molecule_name, const std::string &m_xc, + moldftSchema(World &world, const std::string &molecule_name, std::string m_xc, const runSchema &schema) - : mol_name(molecule_name), xc(m_xc) { + : mol_name(molecule_name), xc(std::move(m_xc)) { moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); - if (std::filesystem::exists(moldft_json_path)) { - std::ifstream ifs(moldft_json_path); - // read results into json - ifs >> moldft_json; - // Here are the current answers... check to see if th - world.gop.fence(); - if (world.rank() == 0) { + if (world.rank() == 0) { + if (std::filesystem::exists(moldft_json_path)) { + std::ifstream ifs(moldft_json_path); + ifs >> moldft_json; std::cout << "Here are the current answers for" << molecule_name << " check to see if they need to be updated please!" << std::endl; cout << moldft_path; - } - } else { - if (world.rank() == 0) { + } else { std::cout << " We do not have moldft answers so please run and save the " "results in the molecule directory" << std::endl; } } - - if (std::filesystem::exists(moldft_restart) && - std::filesystem::exists(calc_info_json_path)) { - // if both exist, read the calc_info json - std::ifstream ifs(calc_info_json_path); - ifs >> calc_info_json; - world.gop.fence(); - if (world.rank() == 0) { - + world.gop.broadcast(moldft_json, 0); + if (world.rank() == 0) { + if (std::filesystem::exists(moldft_restart) && + std::filesystem::exists(calc_info_json_path)) { + // if both exist, read the calc_info json + std::ifstream ifs(calc_info_json_path); + ifs >> calc_info_json; std::cout << "time: " << calc_info_json["time"] << std::endl; std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; @@ -143,6 +140,7 @@ struct moldftSchema { << std::endl; } } + world.gop.broadcast(calc_info_json, 0); if (world.rank() == 0) { print(); } } @@ -166,13 +164,8 @@ struct frequencySchema { const path moldft_path; vector freq; - frequencySchema(World &world, const runSchema run_schema, const moldftSchema m_schema, - const std::string r_operator) - : mol_name(m_schema.mol_name), xc(m_schema.xc), op(r_operator), - moldft_path(m_schema.moldft_path) { - freq = run_schema.rdb.get_frequencies(mol_name, xc, op); - if (world.rank() == 0) { print_schema(); } - } + frequencySchema(World &world, const runSchema &run_schema, const moldftSchema& m_schema, + std::string r_operator); void print_schema() { print("Frequency Calculation"); @@ -183,6 +176,16 @@ struct frequencySchema { print("Frequencies : ", freq); } }; +frequencySchema::frequencySchema(World &world, const runSchema &run_schema, + const moldftSchema &m_schema, std::string r_operator) + : mol_name(m_schema.mol_name), xc(m_schema.xc), op(std::move(r_operator)), + moldft_path(m_schema.moldft_path) { + if (world.rank() == 0) { + freq = run_schema.rdb.get_frequencies(mol_name, xc, op); + print_schema(); + } + world.gop.broadcast_serializable(freq, 0); +} /** * Sets the excited state data found in the response_data_base class @@ -274,7 +277,7 @@ struct excitedSchema { rb_json = addPath(excited_state_run_path, "/response_base.json"); } - void print() { + void print() const { ::print("xc: ", xc); ::print("num states: ", num_states); @@ -351,7 +354,7 @@ auto generate_response_frequency_run_path(const std::filesystem::path &moldft_pa const std::string &property, const double &frequency, const std::string &xc) -> std::filesystem::path { std::string s_frequency = std::to_string(frequency); - auto sp = s_frequency.find("."); + auto sp = s_frequency.find('.'); s_frequency = s_frequency.replace(sp, sp, "-"); std::string run_name = property + "_" + xc + "_" + s_frequency; // set r_params to restart true if restart file exist @@ -362,22 +365,6 @@ auto generate_response_frequency_run_path(const std::filesystem::path &moldft_pa return run_path; } -/** - * Reads in current parameters and found parameters from calc_info.json and determines whether we should restart the calculation - * @param p1 - * @param p2 - * @return - */ -auto tryMOLDFT(CalculationParameters &p1, CalculationParameters &p2) -> bool { - - // first get the last protocol - - auto proto1 = p1.get>("protocol"); - auto proto2 = p1.get>("protocol"); - - return *(proto1.end() - 1) != *(proto2.end() - 1); -} - /** * Runs moldft in the path provided. Also generates the moldft input file_name * in the directory provided. @@ -394,10 +381,8 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo json calcInfo; if (world.rank() == 0) { - param1.set_user_defined_value("maxiter", 20); //param1.set_user_defined_value("Kain", true); - param1.set_user_defined_value("xc", moldftSchema.xc); param1.set_user_defined_value("l", 200); @@ -509,7 +494,7 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(15)); r_params.set_user_defined_value("maxsub", size_t(10)); - // if its too large then bad guess is very strong + // if it's too large then bad guess is very strong r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("plot_all_orbitals", false); r_params.set_user_defined_value("save", true); @@ -531,37 +516,40 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, * @param xc * @param frequency */ -void set_frequency_response_parameters(ResponseParameters &r_params, const std::string &property, - const std::string &xc, const double &frequency, - const std::string &precision) { - if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - r_params.set_user_defined_value("dconv", 1e-6); - } else if (precision == "low") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); - r_params.set_user_defined_value("dconv", 1e-4); - } else { - r_params.set_user_defined_value>("protocol", {1e-9}); - r_params.set_user_defined_value("dconv", 1e-7); - } - //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(30)); - r_params.set_user_defined_value("maxsub", size_t(5)); - r_params.set_user_defined_value("kain", true); - r_params.set_user_defined_value("omega", frequency); - r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals", false); - r_params.set_user_defined_value("plot", true); - r_params.set_user_defined_value("print_level", 20); - r_params.set_user_defined_value("save", true); - // set xc, property, frequency,and restart - r_params.set_user_defined_value("xc", xc); - // Here - if (property == "dipole") { - r_params.set_user_defined_value("dipole", true); - } else if (property == "nuclear") { - r_params.set_user_defined_value("nuclear", true); +void set_frequency_response_parameters(World &world, ResponseParameters &r_params, + const std::string &property, const std::string &xc, + const double &frequency, const std::string &precision) { + if (world.rank() == 0) { + if (precision == "high") { + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value("dconv", 1e-6); + } else if (precision == "low") { + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); + r_params.set_user_defined_value("dconv", 1e-4); + } else { + r_params.set_user_defined_value>("protocol", {1e-9}); + r_params.set_user_defined_value("dconv", 1e-7); + } + //r_params.set_user_defined_value("archive", std::string("../restartdata")); + r_params.set_user_defined_value("maxiter", size_t(30)); + r_params.set_user_defined_value("maxsub", size_t(5)); + r_params.set_user_defined_value("kain", true); + r_params.set_user_defined_value("omega", frequency); + r_params.set_user_defined_value("first_order", true); + r_params.set_user_defined_value("plot_all_orbitals", false); + r_params.set_user_defined_value("plot", true); + r_params.set_user_defined_value("print_level", 20); + r_params.set_user_defined_value("save", true); + // set xc, property, frequency,and restart + r_params.set_user_defined_value("xc", xc); + // Here + if (property == "dipole") { + r_params.set_user_defined_value("dipole", true); + } else if (property == "nuclear") { + r_params.set_user_defined_value("nuclear", true); + } } + world.gop.broadcast_serializable(r_params, 0); } /*** @@ -617,7 +605,7 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par // Then we restart from the previous file instead } else { parameters.set_user_defined_value("restart", false); - }; + } // neither file exists therefore you need to start from fresh } } @@ -643,7 +631,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, const std::string &precision) -> std::pair { // Set the response parameters ResponseParameters r_params{}; - set_frequency_response_parameters(r_params, property, xc, frequency, precision); + set_frequency_response_parameters(world, r_params, property, xc, frequency, precision); auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, moldft_path, restart_path, true); if (world.rank() == 0) { molresponse::write_response_input(r_params, filename); } @@ -663,7 +651,6 @@ auto RunResponse(World &world, const std::string &filename, double frequency, } else { rhs_generator = nuclear_generator; } - FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap>(world))); FrequencyResponse calc(world, calc_params, frequency, rhs_generator); if (world.rank() == 0) { @@ -724,8 +711,7 @@ static void set_and_write_restart_excited_parameters(ResponseParameters ¶met * @param frequency * @param moldft_path */ -static void create_excited_paths(ResponseParameters ¶meters, excitedSchema &schema, - bool restart) { +static void create_excited_paths(ResponseParameters ¶meters, excitedSchema &schema) { if (std::filesystem::is_directory(schema.excited_state_run_path)) { cout << "Response directory found " << std::endl; @@ -753,7 +739,7 @@ auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec ResponseParameters r_params{}; set_excited_parameters(r_params, schema.xc, schema.num_states, high_prec); - create_excited_paths(r_params, schema, restart); + create_excited_paths(r_params, schema); std::filesystem::current_path(schema.excited_state_run_path); set_and_write_restart_excited_parameters(r_params, schema, restart); @@ -828,18 +814,15 @@ void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, if (std::filesystem::is_directory(m_schema.moldft_path)) { if (world.rank() == 0) { cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; } } else {// create the file - std::filesystem::create_directory(m_schema.moldft_path); - if (world.rank() == 0) { - cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" - << m_schema.moldft_path << ":\n"; - } + if (world.rank() == 0) { std::filesystem::create_directory(m_schema.moldft_path); } + cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" + << m_schema.moldft_path << ":\n"; + world.gop.fence(); } std::filesystem::current_path(m_schema.moldft_path); - world.gop.fence(); if (world.rank() == 0) { cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; } - runMOLDFT(world, m_schema, try_moldft, restart, precision); } diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index a3a4f9b7791..96ca7f864c5 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -37,7 +37,7 @@ int main(int argc, char *argv[]) { excited_schema.print(); ResponseParameters r_params{}; set_excited_parameters(r_params, excited_schema.xc, excited_schema.num_states, false); - create_excited_paths(r_params, excited_schema, false); + create_excited_paths(r_params, excited_schema); std::filesystem::current_path(excited_schema.excited_state_run_path); set_and_write_restart_excited_parameters(r_params, excited_schema, false); auto xc_path = create_xc_path_and_directory(root, xc); From 7bed554d4691a064da8617363997cb141a573d61 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 18:07:34 -0500 Subject: [PATCH 0446/1312] unused library --- src/apps/molresponse/testing/mad-freq.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 96f7aeb98dd..76b5f6d2b76 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -10,7 +10,6 @@ #if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) #include -#include #include static inline int file_exists(const char *input_name) { From f0c96d488499a00819fa4999ec948ba80940f579 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 21:23:19 -0500 Subject: [PATCH 0447/1312] I don't think I need to bsh residuals to converge so tightly --- src/apps/molresponse/testing/mad-freq.cpp | 4 ++-- src/apps/molresponse/testing/runners.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 76b5f6d2b76..24ab270755e 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -59,6 +59,8 @@ auto main(int argc, char *argv[]) -> int { } else { moldft(world, m_schema, true, false, precision); runFrequencyTests(world, f_schema, precision); + world.gop.fence(); + world.gop.fence(); } } catch (const SafeMPI::Exception &e) { print(e); @@ -76,8 +78,6 @@ auto main(int argc, char *argv[]) -> int { print(e.what()); } catch (...) { error("caught unhandled exception"); } // Nearly all memory will be freed at this point - world.gop.fence(); - world.gop.fence(); print_stats(world); if (world.rank() == 0) { print("Finished All Frequencies"); } } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index b3550cdf307..292fe95937e 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -485,7 +485,7 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, if (high_prec) { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); r_params.set_user_defined_value("dconv", 1e-6); } else { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); @@ -521,7 +521,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); From df51fc73e9c3470b76cf1d4c09c7df0d862789e6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 21:54:59 -0500 Subject: [PATCH 0448/1312] loosening convergence threshold on relative bsh residuals --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- src/apps/molresponse/testing/runners.hpp | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3499b4a30a1..fd1281855b8 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,9 +21,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(10 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(20 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 292fe95937e..8d0100f2f75 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -409,7 +409,6 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo } } world.gop.broadcast_serializable(param1, 0); - world.gop.broadcast(calcInfo, 0); //If the parameters are exactly equal do not run // If calc info doesn't exist the param_calc will definitely be different From 93c8156329a423ace6431449fee776044a09d188 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 22:27:44 -0500 Subject: [PATCH 0449/1312] loosening convergence threshold on relative bsh residuals --- src/apps/molresponse/testing/runners.hpp | 42 +++++++++--------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 8d0100f2f75..8cae8fef032 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -105,34 +105,25 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(World &world, const std::string &molecule_name, std::string m_xc, + moldftSchema(World &world, std::string molecule_name, std::string m_xc, const runSchema &schema) - : mol_name(molecule_name), xc(std::move(m_xc)) { + : mol_name(std::move(molecule_name)), xc(std::move(m_xc)) { moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); - if (world.rank() == 0) { - if (std::filesystem::exists(moldft_json_path)) { - std::ifstream ifs(moldft_json_path); - ifs >> moldft_json; - std::cout << "Here are the current answers for" << molecule_name - << " check to see if they need to be updated please!" << std::endl; - cout << moldft_path; - } else { - std::cout << " We do not have moldft answers so please run and save the " - "results in the molecule directory" - << std::endl; - } + if (std::filesystem::exists(moldft_json_path)) { + std::ifstream ifs(moldft_json_path); + ifs >> moldft_json; } - world.gop.broadcast(moldft_json, 0); - if (world.rank() == 0) { - if (std::filesystem::exists(moldft_restart) && - std::filesystem::exists(calc_info_json_path)) { - // if both exist, read the calc_info json - std::ifstream ifs(calc_info_json_path); - ifs >> calc_info_json; + if (std::filesystem::exists(moldft_restart) && + std::filesystem::exists(calc_info_json_path)) { + // if both exist, read the calc_info json + std::ifstream ifs(calc_info_json_path); + ifs >> calc_info_json; + if (world.rank() == 0) { + std::cout << "time: " << calc_info_json["time"] << std::endl; std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; @@ -140,7 +131,6 @@ struct moldftSchema { << std::endl; } } - world.gop.broadcast(calc_info_json, 0); if (world.rank() == 0) { print(); } } @@ -164,8 +154,8 @@ struct frequencySchema { const path moldft_path; vector freq; - frequencySchema(World &world, const runSchema &run_schema, const moldftSchema& m_schema, - std::string r_operator); + frequencySchema(World &world, const runSchema &run_schema, const moldftSchema &m_schema, + std::string r_operator); void print_schema() { print("Frequency Calculation"); @@ -178,8 +168,8 @@ struct frequencySchema { }; frequencySchema::frequencySchema(World &world, const runSchema &run_schema, const moldftSchema &m_schema, std::string r_operator) - : mol_name(m_schema.mol_name), xc(m_schema.xc), op(std::move(r_operator)), - moldft_path(m_schema.moldft_path) { + : mol_name(m_schema.mol_name), xc(m_schema.xc), op(std::move(r_operator)), + moldft_path(m_schema.moldft_path) { if (world.rank() == 0) { freq = run_schema.rdb.get_frequencies(mol_name, xc, op); print_schema(); From 741fb3f386a339876b1573c620bd1640976b6365 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 22:41:56 -0500 Subject: [PATCH 0450/1312] 100*thresh for dconv --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 22 +++++++--------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index fd1281855b8..85e56a1e9ea 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,7 +21,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(10 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = std::max(500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 8cae8fef032..1af7d9e7fe0 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -65,19 +65,12 @@ struct runSchema { dalton_excited_json = addPath(molecule_path, "/dalton-excited.json"); dalton_dipole_json = addPath(molecule_path, "/dalton-dipole.json"); rdb = ResponseDataBase(); - if (world.rank() == 0) { - std::cout << "Trying to read frequency.json" << std::endl; - if (std::filesystem::exists(freq_json)) { - std::ifstream ifs(freq_json); - json j_read; - ifs >> j_read; - rdb.set_data(j_read); - std::cout << "READ IT" << std::endl; - } else { - std::cout << "did not find frequency.json" << std::endl; - } + if (std::filesystem::exists(freq_json)) { + std::ifstream ifs(freq_json); + json j_read; + ifs >> j_read; + rdb.set_data(j_read); } - world.gop.broadcast(rdb, 0); if (world.rank() == 0) { print(); } } @@ -105,8 +98,7 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(World &world, std::string molecule_name, std::string m_xc, - const runSchema &schema) + moldftSchema(World &world, std::string molecule_name, std::string m_xc, const runSchema &schema) : mol_name(std::move(molecule_name)), xc(std::move(m_xc)) { moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); @@ -510,7 +502,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); From 1053a28f477de5430b7bd6b4b3f53b526906c21f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 23:27:27 -0500 Subject: [PATCH 0451/1312] 100*thresh for dconv --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 85e56a1e9ea..2e42d4a5dba 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 7a8f98f75fab1800f7ca8051c99cf5fd0636dd33 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 12:13:26 -0500 Subject: [PATCH 0452/1312] new step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 59 +++++++--------------- 2 files changed, 18 insertions(+), 43 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2e42d4a5dba..6052e41faf2 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(1500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 118b3452a62..be8f1a0b1ae 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1132,56 +1132,31 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (r_params.print_level() >= 1) { molresponse::start_timer(world); } print(maxrotn); auto diff = temp - old_Chi; - diff.truncate(); + auto m_old = to_response_matrix(old_Chi); + auto m_new = to_response_matrix(temp); + auto m_diff = to_response_matrix(diff); if (world.rank() == 0) { print("----------------Start Step Restriction -----------------"); } for (size_t b = 0; b < m; b++) { - if (true) { - - auto x_copy = copy(world, old_Chi.X[b]); - auto y_copy = copy(world, old_Chi.Y[b]); - - auto x_diff = copy(world, diff.X[b]); - auto y_diff = copy(world, diff.Y[b]); - - - //auto sq_diff_x = square(world, diff.X[b], true); - //auto sq_diff_y = square(world, diff.Y[b], true); - - for (auto &dy: y_diff) { x_diff.push_back(dy); } - for (auto &y: y_copy) { x_copy.push_back(y); } - - auto norm_X = sqrt(inner(x_copy, x_copy)); - auto norm_xb = sqrt(inner(x_diff, x_diff)); - - auto max_step = maxrotn * norm_X; - - + auto step_size = norm2(world, m_diff[b]); + auto norm_xb = norm2(world, m_old[b]); + auto max_step = maxrotn * norm_xb; + if (world.rank() == 0) { + print("---------------- step restriction :", b, " ------------------"); + if (world.rank() == 0) { print("X[b]: ", norm_xb); } + if (world.rank() == 0) { print("deltaX[b]: ", step_size); } + if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } + } + if (step_size > max_step) { + double s = max_step / step_size; if (world.rank() == 0) { - print("---------------- step restriction :", b, " ------------------"); + if (r_params.print_level() > 1) + print(" restricting step for response-state: ", b, " step size", s); } - - if (norm_xb > max_step) { - if (world.rank() == 0) { print("X[b]: ", norm_X); } - if (world.rank() == 0) { print("deltaX[b]: ", norm_xb); } - if (world.rank() == 0) { print("max_rotation: ", maxrotn); } - if (world.rank() == 0) { - print("max_step = max_rotation*norm_X: ", maxrotn * norm_X); - } - double s = max_step / norm_xb; - if (world.rank() == 0) { - if (r_params.print_level() > 1) - print(" restricting step for response-state: ", b, " step size", s); - } - gaxpy(world, s, temp.X[b], (1.0 - s), old_Chi.X[b], true); - gaxpy(world, s, temp.Y[b], (1.0 - s), old_Chi.Y[b], true); - } - } else { - //do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn); + gaxpy(world, s, m_new[b], (1.0 - s), m_old[b], false); } } if (world.rank() == 0) { print("----------------End Step Restriction -----------------"); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "x_space_restriction", "x_space_restriction", iter_timing); } From ad2a0949e625653f0bdec74d3e6618e76d303640 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 12:15:43 -0500 Subject: [PATCH 0453/1312] only gamma +=W if c_xc != 1 --- src/apps/molresponse/ResponseBase.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index be8f1a0b1ae..3e0cff0d118 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -427,7 +427,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // x functions - // Two ways single vector or vector vector style // here I create the orbital products for elctron interaction terms vecfuncT phi_phi; vecfuncT x_phi; @@ -528,8 +527,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.rank() == 0) { print("gamma: 2 * J"); } gamma += -c_xc * K; if (world.rank() == 0) { print("gamma: += -c_xc * K"); } - gamma += W; - if (world.rank() == 0) { print("gamma: += W"); } + + if (xcf.hf_exchange_coefficient() != 1.0) { + gamma += W; + if (world.rank() == 0) { print("gamma: += W"); } + } //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma add", "gamma_truncate_add", iter_timing); From 138ba87b0c29274c7428f0e80975d42e187883c6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 12:17:15 -0500 Subject: [PATCH 0454/1312] deleting some comments --- src/apps/molresponse/ResponseBase.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3e0cff0d118..20ff7233945 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -554,10 +554,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit print_inner(world, "xGammax", chi_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); } - // put - // put it all together - // no 2-electron - // End timer molresponse::start_timer(world); J.clear(); From a135e233e542e222946bb0c290e1f9c7d81d3825 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 12:20:12 -0500 Subject: [PATCH 0455/1312] turn on step restriction with kain --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6052e41faf2..fb9417817c6 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -262,9 +262,9 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp if (r_params.kain() && (iteration > 2)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } - if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x if (r_params.print_level() >= 1) { From c006862f36941223b761901aef3e42f875b82c5e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 14:12:52 -0500 Subject: [PATCH 0456/1312] loosen density convergence --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index fb9417817c6..816e42bec8e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,9 +21,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(250 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(1500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 0950e86a80d494dc761c80ee35e3d1cba7731e7c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 14:30:02 -0500 Subject: [PATCH 0457/1312] limit the number of kain iterations --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 816e42bec8e..e8276750682 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -260,7 +260,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 2)) { + if (r_params.kain() && (iteration > 2 && iteration < 8)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From a6564af02849c9abfbd98cc631a1d414fc35114f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 14:56:42 -0500 Subject: [PATCH 0458/1312] include kain one iteration earlier --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e8276750682..472f0aea8d5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -260,7 +260,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 2 && iteration < 8)) { + if (r_params.kain() && (iteration > 1 && iteration < 6)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From c0ddc49eb44d7dc05948aa4c3666744dc038e30d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 15:05:52 -0500 Subject: [PATCH 0459/1312] seperate step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 472f0aea8d5..46bb09aa3dd 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -260,8 +260,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 1 && iteration < 6)) { + if (r_params.kain() && (iteration > 1 && iteration < 10)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + } + if (r_params.kain() && (iteration > 7)) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From 97a1b42c2cd54d10ab9550a48bd4570a11577f89 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 14:02:09 -0500 Subject: [PATCH 0460/1312] re-implement multiworld exchange --- src/apps/molresponse/ResponseBase.cpp | 3 ++ src/apps/molresponse/global_functions.cc | 55 ++++++++++++++++++++++++ src/apps/molresponse/global_functions.h | 1 + 3 files changed, 59 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 20ff7233945..ecdd28b0b41 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -520,6 +520,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + K = response_exchange_multiworld(phi0, chi_alpha, true); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega] multiworld"); } molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index d1f9eb5033f..70eb9d1594c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -297,4 +297,59 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br molresponse::end_timer(world, "ground exchange reorganize"); return K0; } +/** + * Computes ground density exchange on response vectors + * This algorithm places all functions in a single vector, + * computes exchange and returns the result into a response + * matrix + * + * @param v1 + * @param v2 + * @param f + * @return + */ +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool compute_y) + -> X_space { + World &world = phi0[0].world(); + molresponse::start_timer(world); + + auto num_states = chi.num_states(); + auto num_orbitals = chi.num_orbitals(); + + response_matrix K1 = response_matrix(num_states); + response_matrix K2 = response_matrix(num_states); + response_matrix K = response_matrix(num_states); + + // [x,y] [phi,phi] + auto x_vec = to_response_matrix(chi); + // [y_dag,x_dag] [phi,phi] + auto conjugate_x = to_conjugate_response_matrix(chi); + //phi phi + + vecfuncT response_phi(2 * num_orbitals); + int i = 0; + std::for_each(response_phi.begin(), response_phi.end(), + [&](auto &phi) { phi = phi0[i++ % num_orbitals]; }); + // the question is copying pointers mpi safe + auto phi0_1 = copy(world, response_phi, false); + auto phi0_2 = copy(world, response_phi, false); + world.gop.fence(); + const double lo = 1.e-10; + int b = 0; + for (auto &ki: K) { + Exchange op_1{}; + op_1.set_parameters(x_vec[b], response_phi, lo); + op_1.set_algorithm(op_1.multiworld_efficient); + Exchange op_2{}; + op_2.set_parameters(response_phi, conjugate_x[b], lo); + op_2.set_algorithm(op_2.multiworld_efficient); + auto k1_b = op_1(phi0_1); + auto k2_b = op_2(phi0_2); + ki = gaxpy_oop(1.0, k1_b, 1.0, k2_b, false); + b++; + } + world.gop.fence(); + + return to_X_space(K); +} // sum_i |i> for each p diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 4a4727422c5..8d945fdd1b9 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -50,6 +50,7 @@ vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, const vecfuncT &fp, const int &n, const int &num_states, const int &num_orbitals) -> X_space; +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool compute_y) -> X_space; vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } From 840272e18b39399ee9a32f32c195a302fb6601ce Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 14:06:22 -0500 Subject: [PATCH 0461/1312] with printing for testing --- src/apps/molresponse/ResponseBase.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ecdd28b0b41..67911629523 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -519,10 +519,13 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); + print_inner(world, "old xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, chi_alpha, true); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega] multiworld"); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega] multiworld"); + print_inner(world, "new xKx", chi_alpha, K); + } molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); From dbc378a351740f2d697820cf304ced4c073b1f43 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 15:01:08 -0500 Subject: [PATCH 0462/1312] new exchange --- src/apps/molresponse/global_functions.cc | 61 +++++++++++++----------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 70eb9d1594c..99129715420 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -316,40 +316,43 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); - response_matrix K1 = response_matrix(num_states); - response_matrix K2 = response_matrix(num_states); - response_matrix K = response_matrix(num_states); + auto K = X_space(world, num_states, num_orbitals); - // [x,y] [phi,phi] - auto x_vec = to_response_matrix(chi); - // [y_dag,x_dag] [phi,phi] - auto conjugate_x = to_conjugate_response_matrix(chi); - //phi phi - - vecfuncT response_phi(2 * num_orbitals); - int i = 0; - std::for_each(response_phi.begin(), response_phi.end(), - [&](auto &phi) { phi = phi0[i++ % num_orbitals]; }); + auto phi_1 = copy(world, phi0, false); + auto phi_2 = copy(world, phi0, false); + auto phi_3 = copy(world, phi0, false); + auto phi_4 = copy(world, phi0, false); // the question is copying pointers mpi safe - auto phi0_1 = copy(world, response_phi, false); - auto phi0_2 = copy(world, response_phi, false); world.gop.fence(); const double lo = 1.e-10; - int b = 0; - for (auto &ki: K) { - Exchange op_1{}; - op_1.set_parameters(x_vec[b], response_phi, lo); - op_1.set_algorithm(op_1.multiworld_efficient); - Exchange op_2{}; - op_2.set_parameters(response_phi, conjugate_x[b], lo); - op_2.set_algorithm(op_2.multiworld_efficient); - auto k1_b = op_1(phi0_1); - auto k2_b = op_2(phi0_2); - ki = gaxpy_oop(1.0, k1_b, 1.0, k2_b, false); - b++; + for (int b = 0; b < num_states; b++) { + Exchange op_1x{}; + op_1x.set_parameters(chi.X[b], phi0, lo); + op_1x.set_algorithm(op_1x.small_memory); + + Exchange op_1y{}; + op_1y.set_parameters(chi.Y[b], phi0, lo); + op_1y.set_algorithm(op_1y.small_memory); + + Exchange op_2x{}; + op_2x.set_parameters(phi0, chi.Y[b], lo); + op_2x.set_algorithm(op_2x.small_memory); + Exchange op_2y{}; + op_2y.set_parameters(phi0, chi.X[b], lo); + op_2y.set_algorithm(op_2y.small_memory); + + auto k1x = op_1x(phi_1); + auto k2x = op_2x(phi_1); + + auto k1y = op_1y(phi_1); + auto k2y = op_2y(phi_1); + + + world.gop.fence(); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); + K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); } world.gop.fence(); - - return to_X_space(K); + return K; } // sum_i |i> for each p From d95c96b163b9c6f0ddd7373c6298deade0249765 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 15:29:22 -0500 Subject: [PATCH 0463/1312] try copy algo and set with copy --- src/apps/molresponse/global_functions.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 99129715420..8c2fe6bba0b 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -317,29 +317,30 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_orbitals = chi.num_orbitals(); auto K = X_space(world, num_states, num_orbitals); - auto phi_1 = copy(world, phi0, false); auto phi_2 = copy(world, phi0, false); auto phi_3 = copy(world, phi0, false); auto phi_4 = copy(world, phi0, false); // the question is copying pointers mpi safe + world.gop.fence(); const double lo = 1.e-10; for (int b = 0; b < num_states; b++) { Exchange op_1x{}; + auto algo=op_1x.small_memory; op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(op_1x.small_memory); + op_1x.set_algorithm(algo); Exchange op_1y{}; op_1y.set_parameters(chi.Y[b], phi0, lo); - op_1y.set_algorithm(op_1y.small_memory); + op_1y.set_algorithm(algo); Exchange op_2x{}; op_2x.set_parameters(phi0, chi.Y[b], lo); - op_2x.set_algorithm(op_2x.small_memory); + op_2x.set_algorithm(algo); Exchange op_2y{}; op_2y.set_parameters(phi0, chi.X[b], lo); - op_2y.set_algorithm(op_2y.small_memory); + op_2y.set_algorithm(algo); auto k1x = op_1x(phi_1); auto k2x = op_2x(phi_1); From c78f0c9eda0dff191dac6cf7dbec7607cb054984 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 15:31:38 -0500 Subject: [PATCH 0464/1312] try multiworld efficient --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8c2fe6bba0b..617d055fc1a 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -327,7 +327,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons const double lo = 1.e-10; for (int b = 0; b < num_states; b++) { Exchange op_1x{}; - auto algo=op_1x.small_memory; + auto algo=op_1x.multiworld_efficient; op_1x.set_parameters(chi.X[b], phi0, lo); op_1x.set_algorithm(algo); From a14b515f6a2fbf417dbe2468ac36bbfc261129c1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 15:45:37 -0500 Subject: [PATCH 0465/1312] implement new static exchange --- src/apps/molresponse/global_functions.cc | 59 +++++++++++++++++++++--- src/apps/molresponse/global_functions.h | 3 +- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 617d055fc1a..2e42985d2b7 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -308,8 +308,8 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br * @param f * @return */ -auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool compute_y) - -> X_space { +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, + const Exchange::Algorithm algo) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); @@ -327,7 +327,6 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons const double lo = 1.e-10; for (int b = 0; b < num_states; b++) { Exchange op_1x{}; - auto algo=op_1x.multiworld_efficient; op_1x.set_parameters(chi.X[b], phi0, lo); op_1x.set_algorithm(algo); @@ -343,10 +342,10 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons op_2y.set_algorithm(algo); auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_1); + auto k2x = op_2x(phi_2); - auto k1y = op_1y(phi_1); - auto k2y = op_2y(phi_1); + auto k1y = op_1y(phi_3); + auto k2y = op_2y(phi_4); world.gop.fence(); @@ -356,4 +355,52 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); return K; } + +/** + * Computes ground density exchange on response vectors + * This algorithm places all functions in a single vector, + * computes exchange and returns the result into a response + * matrix + * + * @param v1 + * @param v2 + * @param f + * @return + */ +auto response_exchange_multiworld_static(const vecfuncT &phi0, const X_space &chi, + Exchange::Algorithm algo) -> X_space { + World &world = phi0[0].world(); + molresponse::start_timer(world); + + auto num_states = chi.num_states(); + auto num_orbitals = chi.num_orbitals(); + + auto K = X_space(world, num_states, num_orbitals); + auto phi_1 = copy(world, phi0, false); + auto phi_2 = copy(world, phi0, false); + // the question is copying pointers mpi safe + + world.gop.fence(); + const double lo = 1.e-10; + for (int b = 0; b < num_states; b++) { + Exchange op_1x{}; + op_1x.set_parameters(chi.X[b], phi0, lo); + op_1x.set_algorithm(algo); + + + Exchange op_2x{}; + op_2x.set_parameters(phi0, chi.X[b], lo); + op_2x.set_algorithm(algo); + + auto k1x = op_1x(phi_1); + auto k2x = op_2x(phi_2); + + + world.gop.fence(); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); + K.Y[b] = copy(world, K.X[b], false); + } + world.gop.fence(); + return K; +} // sum_i |i> for each p diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 8d945fdd1b9..36c95fac2c4 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -50,7 +50,8 @@ vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, const vecfuncT &fp, const int &n, const int &num_states, const int &num_orbitals) -> X_space; -auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool compute_y) -> X_space; +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, + const Exchange::Algorithm algo) -> X_space; vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } From e020678e03c13963f755e6ffabdf5a281393a15a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:19:43 -0500 Subject: [PATCH 0466/1312] implement new exchange with comparision --- src/apps/molresponse/ResponseBase.cpp | 19 +++- src/apps/molresponse/global_functions.cc | 116 ++++++++++++++--------- src/apps/molresponse/global_functions.h | 5 +- 3 files changed, 88 insertions(+), 52 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 67911629523..6dad83b67ae 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -519,11 +519,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); - print_inner(world, "old xKx", chi_alpha, K); + print_inner(world, "old xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, chi_alpha, true); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega] multiworld"); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "K[omega] multiworld"); print_inner(world, "new xKx", chi_alpha, K); } molresponse::start_timer(world); @@ -668,10 +669,14 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange(phi0, xy, false); - if (r_params.print_level() >= 20) { print_inner(world, "new xKx", xy, K); } + if (r_params.print_level() >= 20) { print_inner(world, "old static KX", xy, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + K = response_exchange_multiworld(phi0, xy, false); + if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } // for each response state we compute the Gamma response functions // trucate all response functions if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -1018,7 +1023,13 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "old K[0]"); } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + K0 = ground_exchange_multiworld(phi0_copy, X, compute_Y); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "new K[0]", "K[0]", iter_timing); + } if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 2e42985d2b7..e5f6415fa41 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -308,8 +308,8 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br * @param f * @return */ -auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, - const Exchange::Algorithm algo) -> X_space { +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool &compute_y) + -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); @@ -322,40 +322,63 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, auto phi_3 = copy(world, phi0, false); auto phi_4 = copy(world, phi0, false); // the question is copying pointers mpi safe - + Exchange op{}; + const Exchange::Algorithm algo = op.multiworld_efficient; world.gop.fence(); const double lo = 1.e-10; - for (int b = 0; b < num_states; b++) { - Exchange op_1x{}; - op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(algo); + if (compute_y) { + + for (int b = 0; b < num_states; b++) { + Exchange op_1x{}; + op_1x.set_parameters(chi.X[b], phi0, lo); + op_1x.set_algorithm(algo); + + Exchange op_1y{}; + op_1y.set_parameters(chi.Y[b], phi0, lo); + op_1y.set_algorithm(algo); + + Exchange op_2x{}; + op_2x.set_parameters(phi0, chi.Y[b], lo); + op_2x.set_algorithm(algo); + Exchange op_2y{}; + op_2y.set_parameters(phi0, chi.X[b], lo); + op_2y.set_algorithm(algo); + + auto k1x = op_1x(phi_1); + auto k2x = op_2x(phi_2); - Exchange op_1y{}; - op_1y.set_parameters(chi.Y[b], phi0, lo); - op_1y.set_algorithm(algo); + auto k1y = op_1y(phi_3); + auto k2y = op_2y(phi_4); - Exchange op_2x{}; - op_2x.set_parameters(phi0, chi.Y[b], lo); - op_2x.set_algorithm(algo); - Exchange op_2y{}; - op_2y.set_parameters(phi0, chi.X[b], lo); - op_2y.set_algorithm(algo); - auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_2); + world.gop.fence(); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); + K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); + } + } else { + for (int b = 0; b < num_states; b++) { + Exchange op_1x{}; + op_1x.set_parameters(chi.X[b], phi0, lo); + op_1x.set_algorithm(algo); - auto k1y = op_1y(phi_3); - auto k2y = op_2y(phi_4); + Exchange op_2x{}; + op_2x.set_parameters(phi0, chi.X[b], lo); + op_2x.set_algorithm(algo); + auto k1x = op_1x(phi_1); + auto k2x = op_2x(phi_2); + world.gop.fence(); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); + } world.gop.fence(); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); - K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); + K.Y = K.X.copy(); } world.gop.fence(); return K; } +// sum_i |i> for each p /** * Computes ground density exchange on response vectors * This algorithm places all functions in a single vector, @@ -367,40 +390,41 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, * @param f * @return */ -auto response_exchange_multiworld_static(const vecfuncT &phi0, const X_space &chi, - Exchange::Algorithm algo) -> X_space { +auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool &compute_y) + -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); - auto K = X_space(world, num_states, num_orbitals); - auto phi_1 = copy(world, phi0, false); - auto phi_2 = copy(world, phi0, false); + auto K0 = X_space(world, num_states, num_orbitals); // the question is copying pointers mpi safe - + Exchange op{}; + const Exchange::Algorithm algo = op.multiworld_efficient; world.gop.fence(); const double lo = 1.e-10; - for (int b = 0; b < num_states; b++) { - Exchange op_1x{}; - op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(algo); - - - Exchange op_2x{}; - op_2x.set_parameters(phi0, chi.X[b], lo); - op_2x.set_algorithm(algo); - - auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_2); - - + if (compute_y) { + for (int b = 0; b < num_states; b++) { + Exchange op_0x{}; + op_0x.set_parameters(phi0, phi0, lo); + op_0x.set_algorithm(algo); + Exchange op_0y{}; + op_0y.set_parameters(phi0, phi0, lo); + op_0y.set_algorithm(algo); + K0.X[b] = op_0x(chi.X[b]); + K0.Y[b] = op_0y(chi.Y[b]); + } + } else { + for (int b = 0; b < num_states; b++) { + Exchange op_0x{}; + op_0x.set_parameters(phi0, phi0, lo); + op_0x.set_algorithm(algo); + K0.X[b] = op_0x(chi.X[b]); + } world.gop.fence(); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); - K.Y[b] = copy(world, K.X[b], false); + K0.X = K0.Y.copy(); } world.gop.fence(); - return K; + return K0; } -// sum_i |i> for each p diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 36c95fac2c4..fc34b48a106 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -45,13 +45,14 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); response_space T(World &world, response_space &f); auto ground_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; +auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &x, const bool& compute_y) -> X_space; auto response_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, const vecfuncT &fp, const int &n, const int &num_states, const int &num_orbitals) -> X_space; -auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, - const Exchange::Algorithm algo) -> X_space; +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool &compute_y) + -> X_space; vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } From 5e8d2495daade90e5afd6c1e2093774806260b93 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:24:05 -0500 Subject: [PATCH 0467/1312] print the comparisons for kO --- src/apps/molresponse/ResponseBase.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6dad83b67ae..cf7d1fe3335 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1023,15 +1023,18 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "old K[0]"); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "old K[0]"); + print_inner(world, "new xK0x", Chi_copy, K0); + } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(phi0_copy, X, compute_Y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]", "K[0]", iter_timing); + print_inner(world, "new xK0x", Chi_copy, K0); } - if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; auto c_xc = xcf.hf_exchange_coefficient(); From 21bdb6a0d552527e5e320a211b817146bcc75cae Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:30:23 -0500 Subject: [PATCH 0468/1312] multiworld efficient is still kinda slow --- src/apps/molresponse/global_functions.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index e5f6415fa41..a65c51ffe7e 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -323,7 +323,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto phi_4 = copy(world, phi0, false); // the question is copying pointers mpi safe Exchange op{}; - const Exchange::Algorithm algo = op.multiworld_efficient; + const Exchange::Algorithm algo = op.small_memory; world.gop.fence(); const double lo = 1.e-10; if (compute_y) { @@ -401,7 +401,7 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const auto K0 = X_space(world, num_states, num_orbitals); // the question is copying pointers mpi safe Exchange op{}; - const Exchange::Algorithm algo = op.multiworld_efficient; + const Exchange::Algorithm algo = op.small_memory; world.gop.fence(); const double lo = 1.e-10; if (compute_y) { From 78128e8d51b591383530b1490199354b1b178bfd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:35:30 -0500 Subject: [PATCH 0469/1312] blatant bug --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index a65c51ffe7e..5eef987be39 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -423,7 +423,7 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const K0.X[b] = op_0x(chi.X[b]); } world.gop.fence(); - K0.X = K0.Y.copy(); + K0.Y = K0.X.copy(); } world.gop.fence(); return K0; From 5d1938ecfc28c4c0709c8c8a06c5907bf6197a9d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:43:29 -0500 Subject: [PATCH 0470/1312] no need to copy K.X into K.Y for static int --- src/apps/molresponse/global_functions.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 5eef987be39..0c91c1303f1 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -371,8 +371,6 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); } - world.gop.fence(); - K.Y = K.X.copy(); } world.gop.fence(); return K; @@ -422,8 +420,6 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0x.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); } - world.gop.fence(); - K0.Y = K0.X.copy(); } world.gop.fence(); return K0; From d6367e9e7966c1dfa61dee44e377b2ca2ea0912e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:49:38 -0500 Subject: [PATCH 0471/1312] initialize K to zero functions --- src/apps/molresponse/global_functions.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 0c91c1303f1..f9b655d1b5c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -63,7 +63,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ molresponse::start_timer(world); auto num_states = x.num_states(); auto num_orbitals = x.num_orbitals(); - X_space K0 = X_space(world, x.num_states(), x.num_orbitals()); + X_space K0 = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); long n{}; response_matrix xx; // place all x and y functions into a single response vector @@ -396,7 +396,7 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); - auto K0 = X_space(world, num_states, num_orbitals); + auto K0 = X_space::zero_functions(world, num_states, num_orbitals); // the question is copying pointers mpi safe Exchange op{}; const Exchange::Algorithm algo = op.small_memory; From 584efcef21892f8adb2b80ca39c8d3d1fa2a570d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:52:04 -0500 Subject: [PATCH 0472/1312] initialize K to zero functions --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f9b655d1b5c..eec1d6e2db7 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -316,7 +316,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); - auto K = X_space(world, num_states, num_orbitals); + auto K = X_space::zero_functions(world, num_states, num_orbitals); auto phi_1 = copy(world, phi0, false); auto phi_2 = copy(world, phi0, false); auto phi_3 = copy(world, phi0, false); From a78ccc3aa89e21db5f9b00041cbe905d4ab989ed Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 17:13:08 -0500 Subject: [PATCH 0473/1312] remove the large memory exchange algorithm --- src/apps/molresponse/ResponseBase.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index cf7d1fe3335..fe26752a951 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -516,17 +516,19 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto K = response_exchange(phi0, chi_alpha, true); + auto K = response_exchange_multiworld(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); - print_inner(world, "old xKx", chi_alpha, K); } + if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K = response_exchange_multiworld(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { + K = response_exchange(phi0, chi_alpha, true); molresponse::end_timer(world, "K[omega] multiworld"); print_inner(world, "new xKx", chi_alpha, K); } + */ molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); @@ -668,15 +670,18 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K = response_exchange(phi0, xy, false); - if (r_params.print_level() >= 20) { print_inner(world, "old static KX", xy, K); } + K = response_exchange_multiworld(phi0, xy, false); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } + if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } + + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K = response_exchange_multiworld(phi0, xy, false); + K = response_exchange(phi0, xy, false); if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } + */ // for each response state we compute the Gamma response functions // trucate all response functions if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -1022,18 +1027,20 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + /* K0 = ground_exchange(phi0_copy, X, compute_Y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "old K[0]"); print_inner(world, "new xK0x", Chi_copy, K0); } + */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(phi0_copy, X, compute_Y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]", "K[0]", iter_timing); - print_inner(world, "new xK0x", Chi_copy, K0); } + if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; From bd1ff7170db04770f689806aaaab93920715e6a7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 17:21:58 -0500 Subject: [PATCH 0474/1312] tighten dconv --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 46bb09aa3dd..e74a0c65d05 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,7 +21,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(250 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y From 2742ea1c77709e86b76d380d2e173b6029afe4e9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 17:50:43 -0500 Subject: [PATCH 0475/1312] new j --- src/apps/molresponse/ResponseBase.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index fe26752a951..c2fab81664f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -623,13 +623,19 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm auto rho = transition_density(world, phi0, xy.X, xy.X); // Create Coulomb potential on ground_orbitals + /* auto compute_jx = [&, &phi0 = phi0](auto rho_alpha) { auto temp_J = apply(*shared_coulomb_operator, rho_alpha); - temp_J.truncate(); return mul(world, temp_J, phi0); }; + */ - std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); + int b = 0; + for (const auto rho_b: rho) { + auto temp_J = apply(*shared_coulomb_operator, rho_b); + J.X[b++] = mul(world, temp_J, phi0); + } + //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); J.Y = J.X.copy(); if (r_params.print_level() >= 1) { From 942d951e16de2d53acc40dd3258139ecf56f8cd4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 17:54:02 -0500 Subject: [PATCH 0476/1312] relocate some fencing in exchange --- src/apps/molresponse/global_functions.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index eec1d6e2db7..15665018ef6 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -354,6 +354,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); + world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { @@ -369,10 +370,9 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto k2x = op_2x(phi_2); world.gop.fence(); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } } - world.gop.fence(); return K; } @@ -412,6 +412,7 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0y.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); K0.Y[b] = op_0y(chi.Y[b]); + world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { @@ -419,8 +420,8 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0x.set_parameters(phi0, phi0, lo); op_0x.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); + world.gop.fence(); } } - world.gop.fence(); return K0; } From f47cb791e83b7c0e5c13032c3c448be13a535f01 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 17:58:27 -0500 Subject: [PATCH 0477/1312] kain update --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e74a0c65d05..61d20657b93 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -260,7 +260,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 1 && iteration < 10)) { + if (r_params.kain() && (iteration > 2 && iteration < 7)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (r_params.kain() && (iteration > 7)) { From aa1279a8ede2835aef47cc73d5639abe769b378c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 18:32:44 -0500 Subject: [PATCH 0478/1312] idk --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 61d20657b93..e5c92ef7f86 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(750 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c2fab81664f..8b88e21c317 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -620,7 +620,12 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto rho = transition_density(world, phi0, xy.X, xy.X); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + auto rho = make_density(world, xy); + //auto rho = transition_density(world, phi0, xy.X, xy.X); + + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute density J[omega]"); } + // Create Coulomb potential on ground_orbitals /* @@ -1545,6 +1550,7 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct //truncate(world, phi0); std::vector densities = zero_functions(world, x.size(), true); + // Return container auto compute_density = [&world, &orbitals](const auto &x_alpha, const auto &y_alpha) { /* From e972faccd5b90d4d1959ff348c4f5eebef5fd402 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 18:40:38 -0500 Subject: [PATCH 0479/1312] tighten bsh --- src/apps/molresponse/FrequencyResponse.cpp | 5 +++-- src/apps/molresponse/ResponseBase.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e5c92ef7f86..cd36c35e0cf 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(750 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(250 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -260,7 +260,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 2 && iteration < 7)) { + //&& iteration < 7 + if (r_params.kain() && (iteration > 2 )) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (r_params.kain() && (iteration > 7)) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 8b88e21c317..503d50bfbcc 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1176,7 +1176,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, m_diff[b]); auto norm_xb = norm2(world, m_old[b]); - auto max_step = maxrotn * norm_xb; + auto max_step = 0.01*maxrotn * norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } From 4e41119bff1a2de8f475267fe68fa87489f297b8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 20:48:20 -0500 Subject: [PATCH 0480/1312] changes to make_density --- src/apps/molresponse/ResponseBase.cpp | 10 +++++++--- src/apps/molresponse/x_space.cc | 9 +++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 503d50bfbcc..96c30af9624 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -282,8 +282,12 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu if (world.rank() == 0) { print("make density: to response matrix"); } auto r_phi0 = to_response_vector(ground_orbitals); if (world.rank() == 0) { print("make density: to response vector"); } - std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), - [&](const auto &ri) { return dot(world, ri, r_phi0, true); }); + int b = 0; + for (auto &rho_b: density) { + rho_b = dot(world, r_matrix[b], r_phi0); + b++; + } + } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } @@ -1176,7 +1180,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, m_diff[b]); auto norm_xb = norm2(world, m_old[b]); - auto max_step = 0.01*maxrotn * norm_xb; + auto max_step = 0.01 * maxrotn * norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index fb355cb654a..80baab00e06 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -9,10 +9,11 @@ namespace madness { auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d { auto &world = vec[0].world(); // copy the vector - auto response_vector = copy(world, vec); - std::for_each(vec.begin(), vec.end(), [&](const real_function_3d &phi0_i) { - response_vector.push_back(madness::copy(phi0_i,true)); - }); + auto response_vector = vector_real_function_3d(vec.size()); + auto n = vec.size(); + + int i = 0; + for (auto &r0i: response_vector) { r0i = copy(vec[i++ % n], false); } world.gop.fence(); return response_vector; } From 14160d60a137fd52e4456f3f6df3a4b9820e17a0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 20:56:20 -0500 Subject: [PATCH 0481/1312] changes to make_density --- src/apps/molresponse/FrequencyResponse.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index cd36c35e0cf..0216e42101f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,9 +21,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(250 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(250 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -88,11 +88,11 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = .25; + max_rotation = .025; } else if (thresh >= 1e-6) { - max_rotation = .1; + max_rotation = .01; } else if (thresh >= 1e-8) { - max_rotation = .05; + max_rotation = .005; } PQ = generator(world, *this); for (iter = 0; iter < r_params.maxiter(); ++iter) { From 5940e4c193e29e4cf0915484841ad31736cc018d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 21:11:27 -0500 Subject: [PATCH 0482/1312] changes to make_density --- src/apps/molresponse/x_space.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 80baab00e06..36ca05b8a1f 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -13,9 +13,10 @@ namespace madness { auto n = vec.size(); int i = 0; - for (auto &r0i: response_vector) { r0i = copy(vec[i++ % n], false); } + for (auto &r0i: response_vector) { r0i = vec[i++ % n]; } + auto copy_vec = copy(world, response_vector); world.gop.fence(); - return response_vector; + return copy_vec; } auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) -> response_matrix { From 9f256a7d80cd46e4013a24ad6a7a60aed3b66cde Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 21:17:20 -0500 Subject: [PATCH 0483/1312] need to copy it twice --- src/apps/molresponse/x_space.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 36ca05b8a1f..7a6809ac318 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -9,7 +9,7 @@ namespace madness { auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d { auto &world = vec[0].world(); // copy the vector - auto response_vector = vector_real_function_3d(vec.size()); + auto response_vector = vector_real_function_3d(2*vec.size()); auto n = vec.size(); int i = 0; From 46304b49802f5202d311e329ce2ea1da4bd92bd0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 4 Dec 2022 22:50:21 -0500 Subject: [PATCH 0484/1312] remove fence from exchange application --- src/apps/molresponse/global_functions.cc | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 15665018ef6..e48e9e2a5ce 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -318,9 +318,11 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto K = X_space::zero_functions(world, num_states, num_orbitals); auto phi_1 = copy(world, phi0, false); + /* auto phi_2 = copy(world, phi0, false); auto phi_3 = copy(world, phi0, false); auto phi_4 = copy(world, phi0, false); + */ // the question is copying pointers mpi safe Exchange op{}; const Exchange::Algorithm algo = op.small_memory; @@ -345,16 +347,14 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons op_2y.set_algorithm(algo); auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_2); - - auto k1y = op_1y(phi_3); - auto k2y = op_2y(phi_4); + auto k2x = op_2x(phi_1); + auto k1y = op_1y(phi_1); + auto k2y = op_2y(phi_1); world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); - world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { @@ -367,9 +367,8 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons op_2x.set_algorithm(algo); auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_2); + auto k2x = op_2x(phi_1); - world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } } @@ -412,7 +411,6 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0y.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); K0.Y[b] = op_0y(chi.Y[b]); - world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { @@ -420,7 +418,6 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0x.set_parameters(phi0, phi0, lo); op_0x.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); - world.gop.fence(); } } return K0; From ff0ec6e2c103234f1e5b30d7258ac4f3011a1922 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 4 Dec 2022 23:33:10 -0500 Subject: [PATCH 0485/1312] use the same convergence criteria as moldft --- src/apps/molresponse/FrequencyResponse.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0216e42101f..08b7512ac09 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,9 +21,8 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(250 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); - const double relative_max_target = - std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double relative_max_target = 5 * dconv; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -139,14 +138,15 @@ void FrequencyResponse::iterate(World &world) { print("r_params.dconv(): ", r_params.dconv()); print("max rotation: ", max_rotation); print("d_residual_max : ", d_residual); - print("d_residual_max target : ", conv_den); + print("d_residual_max target : ", dconv); print("bsh_residual_max : ", max_bsh); print("relative_bsh_residual_max : ", relative_max_bsh); print("relative_bsh_residual_max target : ", relative_max_target); } } - if ((d_residual < conv_den) and ((relative_max_bsh < relative_max_target) or - r_params.get("conv_only_dens"))) { + if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and + ((relative_max_bsh < relative_max_target) or + r_params.get("conv_only_dens"))) { converged = true; } @@ -261,7 +261,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2 )) { + if (r_params.kain() && (iteration > 2)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (r_params.kain() && (iteration > 7)) { From 8d2548c2645972def94a1c11349a5c3aed96e399 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 08:40:38 -0500 Subject: [PATCH 0486/1312] low high criteria --- src/apps/molresponse/testing/runners.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 1af7d9e7fe0..8e7648bc9ff 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -372,7 +372,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); param1.set_user_defined_value("dconv", 1e-6); } else { param1.set_user_defined_value>("protocol", {1e-9}); @@ -502,8 +502,8 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - r_params.set_user_defined_value("dconv", 1e-6); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + r_params.set_user_defined_value("dconv", 1e-7); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); From 5cfc7c5c57d615658e2f1ceea70335157f86042a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 08:43:34 -0500 Subject: [PATCH 0487/1312] turn off step restriction for now --- src/apps/molresponse/FrequencyResponse.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 08b7512ac09..20994ed3112 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -261,12 +261,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2)) { + if (r_params.kain() && (iteration > 2) && (iteration < 10)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (r_params.kain() && (iteration > 7)) { - x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); - } + if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From a4e6f580047182c303271346b52c43d53b50c16e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 08:57:26 -0500 Subject: [PATCH 0488/1312] change moldft settings --- src/apps/molresponse/testing/runners.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 8e7648bc9ff..e565db222f1 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -373,10 +373,10 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); - param1.set_user_defined_value("dconv", 1e-6); + param1.set_user_defined_value("dconv", 1e-5); } else { - param1.set_user_defined_value>("protocol", {1e-9}); - param1.set_user_defined_value("dconv", 1e-7); + param1.set_user_defined_value>("protocol", {1e-8}); + param1.set_user_defined_value("dconv", 1e-6); } param1.set_user_defined_value("localize", "new"); CalculationParameters param_calc; From 2c4003b7ac3ba2477ccdeab9e481d4e83c100f7f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 09:15:11 -0500 Subject: [PATCH 0489/1312] keep kain on --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 20994ed3112..828184059ce 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -261,7 +261,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2) && (iteration < 10)) { + if (r_params.kain() && (iteration > 2) ) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index e565db222f1..2a88eb477bb 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -443,7 +443,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! world.gop.fence(); - ME.output_calc_info_schema(); + if (world.rank() == 0) { ME.output_calc_info_schema(); } } else { if (world.rank() == 0) { print("Skipping Calculation and printing CALC INFO"); @@ -795,9 +795,11 @@ void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, if (std::filesystem::is_directory(m_schema.moldft_path)) { if (world.rank() == 0) { cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; } } else {// create the file - if (world.rank() == 0) { std::filesystem::create_directory(m_schema.moldft_path); } - cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" - << m_schema.moldft_path << ":\n"; + if (world.rank() == 0) { + std::filesystem::create_directory(m_schema.moldft_path); + cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" + << m_schema.moldft_path << ":\n"; + } world.gop.fence(); } std::filesystem::current_path(m_schema.moldft_path); From 50b3079ad51174b219ef3f9dec551a182818e7a8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 09:31:19 -0500 Subject: [PATCH 0490/1312] keep kain on --- src/apps/molresponse/FrequencyResponse.cpp | 12 ++++++------ src/apps/molresponse/ResponseBase.cpp | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 828184059ce..554a3cfab3d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -87,11 +87,11 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = .025; + max_rotation = thresh * 10000; } else if (thresh >= 1e-6) { - max_rotation = .01; - } else if (thresh >= 1e-8) { - max_rotation = .005; + max_rotation = thresh * 1000; + } else if (thresh >= 1e-7) { + max_rotation = thresh * 100; } PQ = generator(world, *this); for (iter = 0; iter < r_params.maxiter(); ++iter) { @@ -261,10 +261,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2) ) { + if (r_params.kain() && (iteration > 2)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 96c30af9624..95dd77c20db 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1180,7 +1180,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, m_diff[b]); auto norm_xb = norm2(world, m_old[b]); - auto max_step = 0.01 * maxrotn * norm_xb; + auto max_step = maxrotn * norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } @@ -1188,7 +1188,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } if (step_size > max_step) { - double s = max_step / step_size; + double s = max_step; if (world.rank() == 0) { if (r_params.print_level() > 1) print(" restricting step for response-state: ", b, " step size", s); From 0ef3c4028b24ab06f6b6ce2e1c51b996336c8b73 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 13:08:51 -0500 Subject: [PATCH 0491/1312] lets try this for step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 554a3cfab3d..f2c142f4ecb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -91,7 +91,7 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-6) { max_rotation = thresh * 1000; } else if (thresh >= 1e-7) { - max_rotation = thresh * 100; + max_rotation = thresh * 10; } PQ = generator(world, *this); for (iter = 0; iter < r_params.maxiter(); ++iter) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 95dd77c20db..bdbacda5009 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1188,7 +1188,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } if (step_size > max_step) { - double s = max_step; + double s = max_step / step_size; if (world.rank() == 0) { if (r_params.print_level() > 1) print(" restricting step for response-state: ", b, " step size", s); From ec733a6e3a14c0373742043f32b5a880336b6ebc Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 13:34:07 -0500 Subject: [PATCH 0492/1312] spelling --- src/madness/mra/mra.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/mra/mra.h b/src/madness/mra/mra.h index 9fab680c1d6..ded03a6cf16 100644 --- a/src/madness/mra/mra.h +++ b/src/madness/mra/mra.h @@ -594,7 +594,7 @@ namespace madness { /// If the function is not initialized, it just returns. /// /// Returns this for chaining. - /// @param[in] tol Tolerance for truncating the coefficients. Default 0.0 means use the implimentation's member value \c thresh instead. + /// @param[in] tol Tolerance for truncating the coefficients. Default 0.0 means use the implementation's member value \c thresh instead. /// @param[in] fence Do fence Function& truncate(double tol = 0.0, bool fence = true) { PROFILE_MEMBER_FUNC(Function); From 9562bead62feaa3f3257d8def9b8dd5ab60761c5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 14:03:54 -0500 Subject: [PATCH 0493/1312] compute the potential with vtol=.1*thresh --- src/apps/molresponse/ResponseBase.cpp | 59 ++++++++++--------------- src/apps/molresponse/basic_operators.cc | 11 +++-- 2 files changed, 28 insertions(+), 42 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index bdbacda5009..2d3a0740f22 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -979,17 +979,8 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< X_space V0 = X_space(world, m, n); X_space K0 = X_space(world, m, n); - X_space Chi_copy = X; - vecfuncT phi0_copy = madness::copy(world, ground_orbitals); - world.gop.fence(); - Chi_copy.truncate(); - //Chi_copy.truncate(); - truncate(world, phi0_copy); - // v_nuc first real_function_3d v_nuc, v_j0, v_k0, v_xc; - world.gop.fence(); - if (not r_params.store_potential()) { v_nuc = potential_manager->vnuclear(); //v_nuc.truncate(); @@ -1001,12 +992,12 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } // Coulomb Potential J0*f if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (not r_params.store_potential()) { - // "a" is the core type - // scale rho by 2 TODO // J^0 x^alpha - v_j0 = apply(*shared_coulomb_operator, ground_density); - v_j0.scale(2.0); + v_j0 = apply(*shared_coulomb_operator, ground_density, true); + v_j0.scale(2.0, true); + v_j0.truncate(0.0, true); } else {// Already pre-computed v_j0 = stored_v_coul; } @@ -1022,25 +1013,9 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // make a zero function v_xc = Function(FunctionFactory(world).fence(false).initial_level(1)); } - // Intermediaries world.gop.fence(); - /* - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto phi0_c = copy(world, phi0_copy); - world.gop.fence(); - int b = 0; - for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } - if (compute_Y) { - b = 0; - for (auto &k0x: K0.Y) { k0x = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); } - - } else { - K0.Y = K0.X.copy(); - } - if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } - */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } /* K0 = ground_exchange(phi0_copy, X, compute_Y); @@ -1051,34 +1026,46 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K0 = ground_exchange_multiworld(phi0_copy, X, compute_Y); + K0 = ground_exchange_multiworld(ground_orbitals, X, compute_Y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]", "K[0]", iter_timing); } - if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } + if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", X, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; auto c_xc = xcf.hf_exchange_coefficient(); - if (compute_Y) { + double safety = 0.1; + double vtol = safety * FunctionDefaults<3>::get_thresh(); - V0 = v0 * X; + if (compute_Y) { + auto x = to_response_matrix(X); + auto vx = create_response_matrix(X.num_states(), X.num_orbitals()); + std::transform(x.begin(), x.end(), vx.begin(), + [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); + world.gop.fence(); + V0 = to_X_space(vx); + //V0 = v0 * X; if (world.rank() == 0) { print("vox: v0=v0*X"); } V0 += -c_xc * K0; if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } } else { - V0.X = v0 * X.X; + + std::transform(X.X.begin(), X.X.end(), V0.X.begin(), + [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); + world.gop.fence(); + //V0.X = v0 * X.X; if (world.rank() == 0) { print("vox: v0=v0*X"); } V0.X += -c_xc * K0.X; if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } V0.Y = V0.X.copy(); } - if (r_params.print_level() >= 20) { print_inner(world, "xV0x", Chi_copy, V0); } + if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } - + V0.truncate();// we are removing noise here return V0; } diff --git a/src/apps/molresponse/basic_operators.cc b/src/apps/molresponse/basic_operators.cc index 2a906295701..78070f92586 100644 --- a/src/apps/molresponse/basic_operators.cc +++ b/src/apps/molresponse/basic_operators.cc @@ -31,9 +31,7 @@ namespace madness { MADNESS_ASSERT(v.size() > 0); MADNESS_ASSERT(v[0].size() > 0); - for (unsigned int i = 0; i < v.size(); i++) { - truncate(world, v[i], tol, fence); - } + for (unsigned int i = 0; i < v.size(); i++) { truncate(world, v[i], tol, fence); } } // Apply a vector of vector of operators to a vector of vector of functions @@ -56,13 +54,14 @@ namespace madness { } // Apply a vector of operators to a set of response states // - response_space apply(World &world, std::vector> &op, response_space &f) { + response_space apply(World &world, std::vector> &op, + response_space &f) { MADNESS_ASSERT(f.size() > 0); MADNESS_ASSERT(f[0].size() == op.size()); response_space result(f[0][0].world(), f.size(), f[0].size()); - - transform(f.begin(), f.end(), result.begin(), [&](const auto &fi) { return apply(world, op, fi); }); + int i = 0; + for (auto &fi: f.x) { result.x[i++] = apply(world, op, fi); } world.gop.fence(); /* From c11f68637e8842dbcbe65f882fea1b40b9cf81c9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 14:12:11 -0500 Subject: [PATCH 0494/1312] truncate before application --- src/apps/molresponse/FrequencyResponse.cpp | 2 ++ src/apps/molresponse/ResponseBase.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f2c142f4ecb..3826672a61b 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -300,6 +300,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } + theta_X.truncate(); world.gop.fence(); if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } @@ -326,6 +327,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); } + bsh_X.truncate(); return bsh_X; } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2d3a0740f22..7d48e162722 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -475,6 +475,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // TODO is copy better than adding? probably? // J.Y=j_x+j_y; J.Y = J.X.copy(); + J.truncate(); if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); From 614898dd4400391ba6831cf23d626b8f060aca6a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 15:02:57 -0500 Subject: [PATCH 0495/1312] loosen convergence criteria --- src/apps/molresponse/FrequencyResponse.cpp | 7 ++++--- src/apps/molresponse/ResponseBase.cpp | 5 ++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3826672a61b..8ecedaf1808 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,7 +22,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - const double relative_max_target = 5 * dconv; + const double relative_max_target = 50 * dconv; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -89,11 +89,12 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-4) { max_rotation = thresh * 10000; } else if (thresh >= 1e-6) { - max_rotation = thresh * 1000; + max_rotation = thresh * 10; } else if (thresh >= 1e-7) { max_rotation = thresh * 10; } PQ = generator(world, *this); + PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); // Basic output @@ -138,7 +139,7 @@ void FrequencyResponse::iterate(World &world) { print("r_params.dconv(): ", r_params.dconv()); print("max rotation: ", max_rotation); print("d_residual_max : ", d_residual); - print("d_residual_max target : ", dconv); + print("d_residual_max target : ", dconv * 5.0); print("bsh_residual_max : ", max_bsh); print("relative_bsh_residual_max : ", relative_max_bsh); print("relative_bsh_residual_max target : ", relative_max_target); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7d48e162722..8b49e0bef34 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -387,8 +387,6 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } X_space gamma; - // compute - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (calc_type == "full") { gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); @@ -739,6 +737,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm iter_timing); } // Done + gamma.truncate(); // gamma.truncate(); return gamma; // Get sizes @@ -998,7 +997,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // J^0 x^alpha v_j0 = apply(*shared_coulomb_operator, ground_density, true); v_j0.scale(2.0, true); - v_j0.truncate(0.0, true); } else {// Already pre-computed v_j0 = stored_v_coul; } @@ -1035,6 +1033,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; + v0.truncate(); auto c_xc = xcf.hf_exchange_coefficient(); double safety = 0.1; double vtol = safety * FunctionDefaults<3>::get_thresh(); From a102b806c117b8d4ccc22cff0ac640f2908a7534 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:15:47 -0500 Subject: [PATCH 0496/1312] remove projector --- src/apps/molresponse/FrequencyResponse.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8ecedaf1808..9eeb32b6d6a 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -317,12 +317,14 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state + /* for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } } else { bsh_X.Y = bsh_X.X.copy(); } + */ if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { From dd3706261ce13403a899f071a1c72499a3eba4a3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:17:22 -0500 Subject: [PATCH 0497/1312] loosen it more --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9eeb32b6d6a..b50a3953384 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,7 +22,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - const double relative_max_target = 50 * dconv; + const double relative_max_target = 100 * dconv; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -145,7 +145,7 @@ void FrequencyResponse::iterate(World &world) { print("relative_bsh_residual_max target : ", relative_max_target); } } - if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and + if ((d_residual < dconv * std::max(size_t(10), molecule.natom())) and ((relative_max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { converged = true; From cf526ede239ebcf7b60e23f62094e41e0aa064af Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:22:15 -0500 Subject: [PATCH 0498/1312] make sure to copy --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index b50a3953384..ce111f17c78 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -313,7 +313,11 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, */ bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } - if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + if (compute_y) { + bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); + } else { + bsh_X.Y = bsh_X.X.copy(); + } if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state From 18c65a587bb3036e3e392bd13b5a2023ea157ab6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:37:36 -0500 Subject: [PATCH 0499/1312] increase max_rotation --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ce111f17c78..e65cec36439 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -89,9 +89,9 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-4) { max_rotation = thresh * 10000; } else if (thresh >= 1e-6) { - max_rotation = thresh * 10; + max_rotation = thresh * 100; } else if (thresh >= 1e-7) { - max_rotation = thresh * 10; + max_rotation = thresh * 100; } PQ = generator(world, *this); PQ.truncate(); From 9671f1ed23c3cf392b24a6cde6826e2aa24a7134 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:50:06 -0500 Subject: [PATCH 0500/1312] max_rotation --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e65cec36439..18b3372ef80 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -89,9 +89,9 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-4) { max_rotation = thresh * 10000; } else if (thresh >= 1e-6) { - max_rotation = thresh * 100; + max_rotation = thresh * 1000; } else if (thresh >= 1e-7) { - max_rotation = thresh * 100; + max_rotation = thresh * 1000; } PQ = generator(world, *this); PQ.truncate(); From 3f0f05c95b45e31f101f627fe84c31cb4460c2fa Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:51:28 -0500 Subject: [PATCH 0501/1312] change step restriction --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 8b49e0bef34..07206f17cd7 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1167,7 +1167,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, m_diff[b]); auto norm_xb = norm2(world, m_old[b]); - auto max_step = maxrotn * norm_xb; + auto max_step = maxrotn;//* norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } From 46e1b2d8c6e35425cb07fa186b5bb75866f3dc36 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:59:17 -0500 Subject: [PATCH 0502/1312] turn off step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 18b3372ef80..6fba1311634 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -265,7 +265,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From c49bb85e37dbfd3760b989f4802ddbc2b1b3d52f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:01:14 -0500 Subject: [PATCH 0503/1312] loosen it again --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6fba1311634..5043beb81c0 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,8 +21,8 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - const double relative_max_target = 100 * dconv; + const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 + const double relative_max_target = 5 * dconv; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 6edc64adaac7e1687cc7433cfe92106d5a01a1ce Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:09:46 -0500 Subject: [PATCH 0504/1312] tighten relative max target --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5043beb81c0..cf2100683be 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,7 +22,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 5 * dconv; + const double relative_max_target = 15 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 701e57d7a41ba01161207515c3e409c49b956016 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:16:43 -0500 Subject: [PATCH 0505/1312] 90* thresh relative --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index cf2100683be..399797cc615 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,7 +22,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 15 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 90 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 68925b9322c26a96ff728d885916373bf2fc5e35 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:18:21 -0500 Subject: [PATCH 0506/1312] max rotation --- src/apps/molresponse/FrequencyResponse.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 399797cc615..75049112969 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,7 +21,8 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 + const double dconv = + std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 const double relative_max_target = 90 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); @@ -89,9 +90,9 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-4) { max_rotation = thresh * 10000; } else if (thresh >= 1e-6) { - max_rotation = thresh * 1000; + max_rotation = .025; } else if (thresh >= 1e-7) { - max_rotation = thresh * 1000; + max_rotation = .01; } PQ = generator(world, *this); PQ.truncate(); From 09b2f706845b7f97d325c293caf1b6cbf4ce8b9f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:20:18 -0500 Subject: [PATCH 0507/1312] kain update every other --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 75049112969..654f28e2948 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -263,7 +263,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2)) { + if (r_params.kain() && (iteration > 2) & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From 7f8f9504da40e4d3061adbbfc5b1472ea52bb73d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:36:39 -0500 Subject: [PATCH 0508/1312] project out ground-state from bsh residuals --- src/apps/molresponse/FrequencyResponse.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 654f28e2948..2df476ee8bb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,7 +22,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = - std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 + std::max(FunctionDefaults<3>::get_thresh() * 90, r_params.dconv());//.01 .0001 .1e-5 const double relative_max_target = 90 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); @@ -314,22 +314,16 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, */ bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } - if (compute_y) { - bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - } else { - bsh_X.Y = bsh_X.X.copy(); - } + if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state - /* for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } } else { bsh_X.Y = bsh_X.X.copy(); } - */ if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { From e51f074b41466016a608f918517d60315d58ad40 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:57:40 -0500 Subject: [PATCH 0509/1312] tighten up the residuals --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2df476ee8bb..aec3d519c84 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,8 +22,8 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = - std::max(FunctionDefaults<3>::get_thresh() * 90, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 90 * FunctionDefaults<3>::get_thresh(); + std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 + const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -146,7 +146,7 @@ void FrequencyResponse::iterate(World &world) { print("relative_bsh_residual_max target : ", relative_max_target); } } - if ((d_residual < dconv * std::max(size_t(10), molecule.natom())) and + if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and ((relative_max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { converged = true; From f0c40c14df98e23b5a0928e80a856b6e28475b58 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:59:06 -0500 Subject: [PATCH 0510/1312] back to the original settings --- src/apps/molresponse/testing/runners.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2a88eb477bb..fbdef1ec759 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -372,8 +372,8 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); - param1.set_user_defined_value("dconv", 1e-5); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + param1.set_user_defined_value("dconv", 1e-6); } else { param1.set_user_defined_value>("protocol", {1e-8}); param1.set_user_defined_value("dconv", 1e-6); From 5cc2792d37a16912740c7f8c647b566f333f53f9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 18:00:33 -0500 Subject: [PATCH 0511/1312] back to the original settings --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index aec3d519c84..905635cc340 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 250 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index fbdef1ec759..058dedcb6e6 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -502,8 +502,8 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); - r_params.set_user_defined_value("dconv", 1e-7); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); From 135fa0ef55d588bcb36709fe302221a47d7f3f76 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 22:31:51 -0500 Subject: [PATCH 0512/1312] back to the original settings --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 905635cc340..aec3d519c84 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 250 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 5e0fb71e829a01f07632c7f9cd78617148e5200d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 22:35:57 -0500 Subject: [PATCH 0513/1312] tighten the relative residuals --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index aec3d519c84..36d94a71b18 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -263,7 +263,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2) & (iteration % 2 == 0)) { + if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From 131386ca5de614f4b7818324c4809e75e98a8005 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 22:51:39 -0500 Subject: [PATCH 0514/1312] make sure we know when we break --- src/apps/molresponse/FrequencyResponse.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 36d94a71b18..eb1a729355e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -107,7 +107,10 @@ void FrequencyResponse::iterate(World &world) { } if (iter < 2 || (iter % 10) == 0) { load_balance_chi(world); } if (iter > 0) { - if (density_residuals.max() > 2) { break; } + if (density_residuals.max() > 20) { + if (world.rank() == 0) { print("d-residual > 20...break"); } + break; + } double d_residual = density_residuals.max(); // Test convergence and set to true auto chi_norms = Chi.norm2s(); @@ -152,7 +155,7 @@ void FrequencyResponse::iterate(World &world) { converged = true; } - if (converged || iter == r_params.maxiter() - 1) { + if (converged || iter == r_params.maxiter()) { // if converged print converged if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { print("\nConverged!\n"); @@ -229,7 +232,6 @@ void FrequencyResponse::iterate(World &world) { if (iter == r_params.maxiter() && not converged) { if (world.rank() == 0) print(" Failed to converge. Reason:"); if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); - if (world.rank() == 0) print(" Running analysis on current values.\n"); } if (world.rank() == 0) { print(" Final energy residuals X:"); From e767326f050f127fdf5a77165d490c52205146af Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 22:53:16 -0500 Subject: [PATCH 0515/1312] add some step restriction to bigger steps --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index eb1a729355e..27be9e3a4ea 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -88,7 +88,7 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = thresh * 10000; + max_rotation = 10; } else if (thresh >= 1e-6) { max_rotation = .025; } else if (thresh >= 1e-7) { From 73f177ad3a25626bc585b2df880402e0bce76927 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 22:53:58 -0500 Subject: [PATCH 0516/1312] add step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 27be9e3a4ea..62e17bd5fb8 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -268,7 +268,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From f39d24e0c41562097074adf3743206950a53fc77 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:16:31 -0500 Subject: [PATCH 0517/1312] lets max rotation pretty strick unless dx > 10% of ||x|| --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 62e17bd5fb8..d6231a29b81 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -90,7 +90,7 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-4) { max_rotation = 10; } else if (thresh >= 1e-6) { - max_rotation = .025; + max_rotation = 10 * relative_max_target; } else if (thresh >= 1e-7) { max_rotation = .01; } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 07206f17cd7..b758ed9b4d2 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1167,14 +1167,15 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, m_diff[b]); auto norm_xb = norm2(world, m_old[b]); - auto max_step = maxrotn;//* norm_xb; + auto max_step = maxrotn;//norm;//* norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step) { + if (step_size > max_step && step_size < .1 * norm_xb) { + // and if the step size is less thant 10% the vector norm double s = max_step / step_size; if (world.rank() == 0) { if (r_params.print_level() > 1) From c8ce6fd3f50614efe8cbad81de18557b7115c8fc Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:22:52 -0500 Subject: [PATCH 0518/1312] step restriction with kain --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d6231a29b81..96161cbedf2 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -268,7 +268,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From 720aa5d2587a963bbe3f0f52d34374d5fc9ea45e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:26:40 -0500 Subject: [PATCH 0519/1312] 10*relative Max rotation --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 96161cbedf2..546c6a3d8fb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -88,7 +88,7 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 10; + max_rotation = 10 * relative_max_target; } else if (thresh >= 1e-6) { max_rotation = 10 * relative_max_target; } else if (thresh >= 1e-7) { From fd4adaac123c92bb144153688fe7cbb183a915f8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:33:35 -0500 Subject: [PATCH 0520/1312] if stepsize is greater than 10% --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index b758ed9b4d2..7b925f592f7 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1174,7 +1174,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step && step_size < .1 * norm_xb) { + if (step_size > max_step && step_size > .01 * norm_xb) { // and if the step size is less thant 10% the vector norm double s = max_step / step_size; if (world.rank() == 0) { From 1059e5e3e84cf4223c90c09d1cad7b558a314068 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:37:34 -0500 Subject: [PATCH 0521/1312] if stepsize is less than than 10% --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7b925f592f7..7e492e8d3b1 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1174,7 +1174,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step && step_size > .01 * norm_xb) { + if (step_size > max_step && step_size < .01 * norm_xb) { // and if the step size is less thant 10% the vector norm double s = max_step / step_size; if (world.rank() == 0) { From 64e9f6963c10c8f95bb7c5c3923c0ab49378b359 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:49:39 -0500 Subject: [PATCH 0522/1312] restrict if we are close --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7e492e8d3b1..804cf105a27 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1174,7 +1174,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step && step_size < .01 * norm_xb) { + if (step_size > max_step && step_size < 700 * FunctionDefaults<3>::get_thresh()) { // and if the step size is less thant 10% the vector norm double s = max_step / step_size; if (world.rank() == 0) { From 78da0779e3e2d7fef23345029990429cf7ffff3b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:54:03 -0500 Subject: [PATCH 0523/1312] add another protocol guarantee accuracy --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 546c6a3d8fb..f9188c7ff30 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 100 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 058dedcb6e6..9196aa5e011 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -505,14 +505,14 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); r_params.set_user_defined_value("dconv", 1e-4); } else { r_params.set_user_defined_value>("protocol", {1e-9}); r_params.set_user_defined_value("dconv", 1e-7); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(30)); + r_params.set_user_defined_value("maxiter", size_t(15)); r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); From 2b4f850ba7e554c31b6e6908ce49b36d8cf1ee49 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 00:13:21 -0500 Subject: [PATCH 0524/1312] tighten moldft for Be --- src/apps/molresponse/testing/runners.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 9196aa5e011..e7e8c80209a 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -369,8 +369,8 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("l", 200); if (precision == "low") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); - param1.set_user_defined_value("dconv", 1e-4); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + param1.set_user_defined_value("dconv", 1e-5); } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); param1.set_user_defined_value("dconv", 1e-6); From 2668d2ad1860596580a940b517fb95c69bdd1802 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 07:56:49 -0500 Subject: [PATCH 0525/1312] tighten step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f9188c7ff30..546c6a3d8fb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 100 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 6e10920ea210f3510c59428ccb432d2b4bf55701 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 08:12:40 -0500 Subject: [PATCH 0526/1312] i tighted the bsh residual in last commit --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 546c6a3d8fb..57298cc4c39 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 200 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -88,9 +88,9 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 10 * relative_max_target; + max_rotation = 2 * relative_max_target; } else if (thresh >= 1e-6) { - max_rotation = 10 * relative_max_target; + max_rotation = 2 * relative_max_target; } else if (thresh >= 1e-7) { max_rotation = .01; } From 240615470ed97879b08c88ed686f8db5d39d1969 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 08:31:13 -0500 Subject: [PATCH 0527/1312] just a little tighter --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 57298cc4c39..08a5812d63f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 200 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 150 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 25a57ae183371267c647ec84fd0f616165ef917f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 08:31:32 -0500 Subject: [PATCH 0528/1312] just a little tighter --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 08a5812d63f..3b8539b773e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -88,9 +88,9 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 2 * relative_max_target; + max_rotation = 1.5 * relative_max_target; } else if (thresh >= 1e-6) { - max_rotation = 2 * relative_max_target; + max_rotation = 1.5 * relative_max_target; } else if (thresh >= 1e-7) { max_rotation = .01; } From 260f51d7b6aaf4c8b77b1a7d2a42f3dd7367f5a6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 08:59:15 -0500 Subject: [PATCH 0529/1312] just a little tighter --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3b8539b773e..ec4ccb019bf 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -88,9 +88,9 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 1.5 * relative_max_target; + max_rotation = 10 * relative_max_target; } else if (thresh >= 1e-6) { - max_rotation = 1.5 * relative_max_target; + max_rotation = 10 * relative_max_target; } else if (thresh >= 1e-7) { max_rotation = .01; } From 61875f343b58a6e33bf07d453b7e34437ba4d3a9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 13:56:05 -0500 Subject: [PATCH 0530/1312] just a little tighter --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 804cf105a27..dd5fb1127d8 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1174,7 +1174,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step && step_size < 700 * FunctionDefaults<3>::get_thresh()) { + if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { // and if the step size is less thant 10% the vector norm double s = max_step / step_size; if (world.rank() == 0) { From a0dc7b44317e1cdd842398328e8fed46b8dbaf33 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Dec 2022 16:57:17 -0500 Subject: [PATCH 0531/1312] just a little tighter --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ec4ccb019bf..cb7359af616 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 150 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 350 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -88,9 +88,9 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 10 * relative_max_target; + max_rotation = 2 * relative_max_target; } else if (thresh >= 1e-6) { - max_rotation = 10 * relative_max_target; + max_rotation = 2 * relative_max_target; } else if (thresh >= 1e-7) { max_rotation = .01; } From 2a1a63da221b024c32125151b31d256b39a47158 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Dec 2022 17:52:43 -0500 Subject: [PATCH 0532/1312] Convergence standards --- src/apps/molresponse/FrequencyResponse.cpp | 10 ---------- src/apps/molresponse/testing/runners.hpp | 4 ++-- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index cb7359af616..05a90adb09f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -33,19 +33,10 @@ void FrequencyResponse::iterate(World &world) { Tensor xij_res_norms(m, 2 * n); vecfuncT rho_omega_old(m); - // initialize DFT XC functional operator XCOperator xc = make_xc_operator(world); - // create X space residuals X_space residuals = X_space::zero_functions(world, m, n); - - /* - for (size_t b = 0; b < m; b++) { - x_vectors.emplace_back(Chi, b); - x_residuals.emplace_back(residuals, b); - } - */ // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { @@ -56,7 +47,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } - // // We compute with positive frequencies if (world.rank() == 0) { print("Warning input frequency is assumed to be positive"); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index e7e8c80209a..9196aa5e011 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -369,8 +369,8 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("l", 200); if (precision == "low") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); - param1.set_user_defined_value("dconv", 1e-5); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); + param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); param1.set_user_defined_value("dconv", 1e-6); From 4dcb5f4ffddef5ea330b20a83e4272bc4f42a29d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Dec 2022 23:03:24 -0500 Subject: [PATCH 0533/1312] remove step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 05a90adb09f..8981f3f5d3c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -258,7 +258,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From a12b33d6a80e5fd317c997aafa5690e17c666bca Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 8 Dec 2022 10:03:36 -0500 Subject: [PATCH 0534/1312] try masking --- src/apps/molresponse/FrequencyResponse.cpp | 7 +++++++ src/apps/molresponse/global_functions.h | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8981f3f5d3c..4c8973665a6 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -12,6 +12,7 @@ void FrequencyResponse::initialize(World &world) { Chi = PQ.copy(); } + void FrequencyResponse::iterate(World &world) { size_t iter; // Variables needed to iterate @@ -84,10 +85,16 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-7) { max_rotation = .01; } + + + functionT mask; + mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); PQ = generator(world, *this); + PQ = PQ * mask; PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); + Chi = mask * Chi; // Basic output if (r_params.print_level() >= 1) { molresponse::start_timer(world); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index fc34b48a106..d66ac5c20c0 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -7,6 +7,10 @@ #include "response_parameters.h" + + + + struct CalcParams { GroundStateCalculation ground_calculation; Molecule molecule; From 37acec43ff8e79dfd51374674d9eba898272069e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 14:10:47 -0500 Subject: [PATCH 0535/1312] try masking --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 4c8973665a6..1e49793e124 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -265,7 +265,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From 28b9f786f0a7254ab143b4a7c6055459e3b76d91 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 15:26:14 -0500 Subject: [PATCH 0536/1312] use absolute bsh residual --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 1e49793e124..85fca4b4477 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -147,7 +147,7 @@ void FrequencyResponse::iterate(World &world) { } } if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and - ((relative_max_bsh < relative_max_target) or + ((max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { converged = true; } From dffc291e8fe4276b7b6b453f02045a5dd3bbff93 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 15:30:22 -0500 Subject: [PATCH 0537/1312] scale max_bsh relative to bsh_residual --- src/apps/molresponse/FrequencyResponse.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 85fca4b4477..8fa4cb8ebb2 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 350 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 500 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -75,6 +75,7 @@ void FrequencyResponse::iterate(World &world) { vector_real_function_3d rho_omega = make_density(world, Chi); converged = false;// Converged flag auto thresh = FunctionDefaults<3>::get_thresh(); + auto max_rotation = .5; if (thresh >= 1e-2) { max_rotation = 2; @@ -86,7 +87,6 @@ void FrequencyResponse::iterate(World &world) { max_rotation = .01; } - functionT mask; mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); PQ = generator(world, *this); @@ -117,6 +117,7 @@ void FrequencyResponse::iterate(World &world) { chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); + max_rotation = 2 * max_bsh; auto relative_max_bsh = relative_bsh.absmax(); Tensor polar = -2 * inner(Chi, PQ); world.gop.fence(); @@ -147,8 +148,7 @@ void FrequencyResponse::iterate(World &world) { } } if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and - ((max_bsh < relative_max_target) or - r_params.get("conv_only_dens"))) { + ((max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { converged = true; } From 332b3e679e14e38f777c5ede2224c4b0ec78f8f1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 16:02:35 -0500 Subject: [PATCH 0538/1312] tighter step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8fa4cb8ebb2..46a281cf1ec 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -117,7 +117,7 @@ void FrequencyResponse::iterate(World &world) { chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); - max_rotation = 2 * max_bsh; + max_rotation = 1.00 * max_bsh; auto relative_max_bsh = relative_bsh.absmax(); Tensor polar = -2 * inner(Chi, PQ); world.gop.fence(); From 62e66ae9d10598d04706af4b512a9abef9292567 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 16:19:48 -0500 Subject: [PATCH 0539/1312] tighter step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 46a281cf1ec..515af025bd5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 500 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 1000 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 124c7f0242d35d3f5e2b07140628e33ddb17a7fc Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 16:28:32 -0500 Subject: [PATCH 0540/1312] loosen step bsh convergence keep density --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 515af025bd5..ee968163a2f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 1000 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 1500 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 7438ffe68114312943cf1f2ea66fe4927579a25c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 16:46:57 -0500 Subject: [PATCH 0541/1312] loosen step bsh convergence keep density --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ee968163a2f..7f9ae5f9dba 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 1500 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 3000 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 31511fac0d49749426c02f1516e03352bd2d614e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 09:39:39 -0500 Subject: [PATCH 0542/1312] Increase the max iterations --- src/apps/molresponse/testing/runners.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 9196aa5e011..170bcd371c1 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -512,8 +512,8 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("dconv", 1e-7); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(15)); - r_params.set_user_defined_value("maxsub", size_t(5)); + r_params.set_user_defined_value("maxiter", size_t(20)); + r_params.set_user_defined_value("maxsub", size_t(10)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); From 530fd04eb501e5b47b2caa1ef069ab6954564130 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 11:30:29 -0500 Subject: [PATCH 0543/1312] tighten bsh --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 7f9ae5f9dba..e89a74a7b09 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 3000 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 100 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From bff63d31b6c104d311af6677aed210d1aa3525b8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 14:57:30 -0500 Subject: [PATCH 0544/1312] Changing bsh name, loosen target, step restrict*.9 --- src/apps/molresponse/FrequencyResponse.cpp | 12 ++++++------ src/apps/molresponse/ResponseBase.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e89a74a7b09..99ece1db95b 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 100 * FunctionDefaults<3>::get_thresh(); + const double bsh_abs_target = 950 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -80,9 +80,9 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 2 * relative_max_target; + max_rotation = 2 * bsh_abs_target; } else if (thresh >= 1e-6) { - max_rotation = 2 * relative_max_target; + max_rotation = 2 * bsh_abs_target; } else if (thresh >= 1e-7) { max_rotation = .01; } @@ -142,13 +142,13 @@ void FrequencyResponse::iterate(World &world) { print("max rotation: ", max_rotation); print("d_residual_max : ", d_residual); print("d_residual_max target : ", dconv * 5.0); + print("relative residual", relative_max_bsh); print("bsh_residual_max : ", max_bsh); - print("relative_bsh_residual_max : ", relative_max_bsh); - print("relative_bsh_residual_max target : ", relative_max_target); + print("bsh abs target : ", bsh_abs_target); } } if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and - ((max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { + ((max_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { converged = true; } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index dd5fb1127d8..67583198a0f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1176,7 +1176,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi } if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { // and if the step size is less thant 10% the vector norm - double s = max_step / step_size; + double s = .80 * max_step / step_size; if (world.rank() == 0) { if (r_params.print_level() > 1) print(" restricting step for response-state: ", b, " step size", s); From c799de15be3e2c095d854b5e2a82fd7794e0b6dd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:17:14 -0500 Subject: [PATCH 0545/1312] implement polarizability --- src/apps/molresponse/ResponseBase.cpp | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 67583198a0f..7694f22ba4e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -400,6 +400,9 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + // Right here I can compute the polarizability before I try a KAIN UPDATE or step restriction + + Theta_X = (V0X - E0X) + gamma; world.gop.fence(); Theta_X.truncate(); @@ -411,6 +414,33 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); } + // construct lhs for 2nd order property + X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); + auto chi_copy = chi.copy(); + T0X.X = T(world, chi_copy.X); + if (compute_Y) { T0X.Y = T(world, chi_copy.Y); } + if (r_params.print_level() >= 20) { + print("_________________compute F0X _______________________"); + print("inner "); + print(inner(chi_copy, T0X)); + } + + auto diag_E0X = chi.copy(); + if (r_params.localize() != "canon") { + auto diag_only = hamiltonian - ham_no_diag; + diag_E0X.X = E0X.X * diag_only; + if (compute_Y) { E0X.Y = E0X.Y * diag_only; } + if (r_params.print_level() >= 20) { print_inner(world, "xE0_diagx", chi, E0X); } + } + auto omega = r_params.omega(); + + auto V_X = Theta_X.copy(); + V_X += T0X; + V_X = V_X - omega * chi; + V_X = V_X - diag_E0X; + + Tensor polar = -2 * inner(chi, V_X); + print("new polarizability", polar); return Theta_X; } From 86ac2b649e04a7dca27bf1e4decca72d94d3d76d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:18:32 -0500 Subject: [PATCH 0546/1312] pass reference --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7694f22ba4e..0ca8be18b21 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -669,7 +669,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ int b = 0; - for (const auto rho_b: rho) { + for (const auto& rho_b: rho) { auto temp_J = apply(*shared_coulomb_operator, rho_b); J.X[b++] = mul(world, temp_J, phi0); } From 3bdcc963ab97d1c39679172b78f170443c342979 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:23:11 -0500 Subject: [PATCH 0547/1312] pass reference --- src/apps/molresponse/ResponseBase.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 0ca8be18b21..371b0e712b9 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -418,7 +418,11 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); auto chi_copy = chi.copy(); T0X.X = T(world, chi_copy.X); - if (compute_Y) { T0X.Y = T(world, chi_copy.Y); } + if (compute_Y) { + T0X.Y = T(world, chi_copy.Y); + } else { + TOX.Y = TOX.X.copy(); + } if (r_params.print_level() >= 20) { print("_________________compute F0X _______________________"); print("inner "); @@ -669,7 +673,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ int b = 0; - for (const auto& rho_b: rho) { + for (const auto &rho_b: rho) { auto temp_J = apply(*shared_coulomb_operator, rho_b); J.X[b++] = mul(world, temp_J, phi0); } From 63e9be432bd3b0aaa17df30e0d49b5afb5067e46 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:23:32 -0500 Subject: [PATCH 0548/1312] copy TX.X --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 371b0e712b9..c1969e3e059 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -421,7 +421,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (compute_Y) { T0X.Y = T(world, chi_copy.Y); } else { - TOX.Y = TOX.X.copy(); + T0X.Y = T0X.X.copy(); } if (r_params.print_level() >= 20) { print("_________________compute F0X _______________________"); From 4be0ca8f74173deae1fd69565ea9f9b8b045a940 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:26:05 -0500 Subject: [PATCH 0549/1312] if rank==0 --- src/apps/molresponse/ResponseBase.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c1969e3e059..ee3b899c915 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -423,11 +423,6 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } else { T0X.Y = T0X.X.copy(); } - if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, T0X)); - } auto diag_E0X = chi.copy(); if (r_params.localize() != "canon") { @@ -444,7 +439,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, V_X = V_X - diag_E0X; Tensor polar = -2 * inner(chi, V_X); - print("new polarizability", polar); + if (world.rank() == 0) { print("new polarizability", polar); } return Theta_X; } From 0f82899b1bf229fd608bf0a62fa465a4b5d7155c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:58:09 -0500 Subject: [PATCH 0550/1312] moving polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 35 ++++++++++++++++++++++ src/apps/molresponse/ResponseBase.cpp | 25 ---------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 99ece1db95b..bc87a06464d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -291,6 +291,41 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, size_t m = theta_X.X.size(); size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; + // construct lhs for 2nd order property + X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); + auto chi_copy = chi.copy(); + T0X.X = T(world, chi_copy.X); + if (compute_y) { + T0X.Y = T(world, chi_copy.Y); + } else { + T0X.Y = T0X.X.copy(); + } + + auto diag_E0X = chi_copy.copy(); + if (r_params.localize() != "canon") { + auto diag_only = hamiltonian - ham_no_diag; + diag_E0X.X = diag_E0X.X * diag_only; + if (compute_y) { + diag_E0X.Y = diag_E0X.Y * diag_only; + } else { + diag_E0X.Y = diag_E0X.X; + } + } + auto omega = r_params.omega(); + + auto V_X = theta_X.copy(); + V_X += T0X; + V_X.X = V_X.X - omega * chi_copy.X; + if (compute_y) { + V_X.Y = V_X.X + omega * chi_copy.X; + } else { + V_X.Y = V_X.X.copy(); + } + V_X = V_X - diag_E0X; + auto polar = inner(chi_copy, V_X); + + if (world.rank() == 0) { print("new polarizability\n", polar); } + theta_X.X += theta_X.X * x_shifts; theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ee3b899c915..335a6f94cc8 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -414,32 +414,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); } - // construct lhs for 2nd order property - X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); - auto chi_copy = chi.copy(); - T0X.X = T(world, chi_copy.X); - if (compute_Y) { - T0X.Y = T(world, chi_copy.Y); - } else { - T0X.Y = T0X.X.copy(); - } - - auto diag_E0X = chi.copy(); - if (r_params.localize() != "canon") { - auto diag_only = hamiltonian - ham_no_diag; - diag_E0X.X = E0X.X * diag_only; - if (compute_Y) { E0X.Y = E0X.Y * diag_only; } - if (r_params.print_level() >= 20) { print_inner(world, "xE0_diagx", chi, E0X); } - } - auto omega = r_params.omega(); - - auto V_X = Theta_X.copy(); - V_X += T0X; - V_X = V_X - omega * chi; - V_X = V_X - diag_E0X; - Tensor polar = -2 * inner(chi, V_X); - if (world.rank() == 0) { print("new polarizability", polar); } return Theta_X; } From 236a32fde879771d2591f068f2d69346c7b021e0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:58:39 -0500 Subject: [PATCH 0551/1312] bug --- src/apps/molresponse/ResponseBase.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 335a6f94cc8..ca982767b3e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -414,7 +414,6 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); } - Tensor polar = -2 * inner(chi, V_X); return Theta_X; } From 45d622eddb67da7925b3355d85b2a8f48f12d042 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 17:00:31 -0500 Subject: [PATCH 0552/1312] move it into polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 66 +++++++++++----------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bc87a06464d..f4b6d5f7d18 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -255,6 +255,39 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); + X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); + auto chi_copy = chi.copy(); + T0X.X = T(world, chi_copy.X); + if (compute_y) { + T0X.Y = T(world, chi_copy.Y); + } else { + T0X.Y = T0X.X.copy(); + } + + auto diag_E0X = chi_copy.copy(); + if (r_params.localize() != "canon") { + auto diag_only = hamiltonian - ham_no_diag; + diag_E0X.X = diag_E0X.X * diag_only; + if (compute_y) { + diag_E0X.Y = diag_E0X.Y * diag_only; + } else { + diag_E0X.Y = diag_E0X.X; + } + } + auto omega = r_params.omega(); + + auto V_X = theta_X.copy(); + V_X += T0X; + V_X.X = V_X.X - omega * chi_copy.X; + if (compute_y) { + V_X.Y = V_X.X + omega * chi_copy.X; + } else { + V_X.Y = V_X.X.copy(); + } + V_X = V_X - diag_E0X; + auto polar = inner(chi_copy, V_X); + + if (world.rank() == 0) { print("new polarizability\n", polar); } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); @@ -292,39 +325,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; // construct lhs for 2nd order property - X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); - auto chi_copy = chi.copy(); - T0X.X = T(world, chi_copy.X); - if (compute_y) { - T0X.Y = T(world, chi_copy.Y); - } else { - T0X.Y = T0X.X.copy(); - } - - auto diag_E0X = chi_copy.copy(); - if (r_params.localize() != "canon") { - auto diag_only = hamiltonian - ham_no_diag; - diag_E0X.X = diag_E0X.X * diag_only; - if (compute_y) { - diag_E0X.Y = diag_E0X.Y * diag_only; - } else { - diag_E0X.Y = diag_E0X.X; - } - } - auto omega = r_params.omega(); - - auto V_X = theta_X.copy(); - V_X += T0X; - V_X.X = V_X.X - omega * chi_copy.X; - if (compute_y) { - V_X.Y = V_X.X + omega * chi_copy.X; - } else { - V_X.Y = V_X.X.copy(); - } - V_X = V_X - diag_E0X; - auto polar = inner(chi_copy, V_X); - - if (world.rank() == 0) { print("new polarizability\n", polar); } theta_X.X += theta_X.X * x_shifts; theta_X.X += PQ.X; From 9f1f0140c772fc11214aee899ce9fb0296aa1251 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 17:04:03 -0500 Subject: [PATCH 0553/1312] move it into polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f4b6d5f7d18..14657cf4785 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -285,7 +285,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator V_X.Y = V_X.X.copy(); } V_X = V_X - diag_E0X; - auto polar = inner(chi_copy, V_X); + auto polar = 2*inner(chi_copy, V_X); if (world.rank() == 0) { print("new polarizability\n", polar); } X_space new_chi = From f5a24d4eaa549f0daa8ec3259bb7fbf5a385fb4e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 17:15:25 -0500 Subject: [PATCH 0554/1312] adding new polar to compare to --- src/apps/molresponse/FrequencyResponse.cpp | 19 ++++++++++++------- src/apps/molresponse/FrequencyResponse.hpp | 6 ++++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 14657cf4785..6379677fc5f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -32,6 +32,7 @@ void FrequencyResponse::iterate(World &world) { Tensor xij_norms(m, 2 * n); Tensor xij_res_norms(m, 2 * n); + Tensor v_polar(m, m); vecfuncT rho_omega_old(m); // initialize DFT XC functional operator @@ -124,7 +125,7 @@ void FrequencyResponse::iterate(World &world) { // Todo add chi norm and chi_x function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, xij_norms, xij_res_norms, rho_norms, density_residuals); - frequency_to_json(j_molresponse, iter, polar); + frequency_to_json(j_molresponse, iter, polar, v_polar); world.gop.fence(); if (r_params.print_level() >= 1) { @@ -169,8 +170,10 @@ void FrequencyResponse::iterate(World &world) { break; } } - auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, - omega, kain_x_space, iter, max_rotation); + auto [new_chi, new_res, new_polar] = + update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, + kain_x_space, iter, max_rotation); + v_polar = copy(new_polar); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); if (r_params.print_level() >= 1) { @@ -246,7 +249,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, size_t iteration, const double &maxrotn) - -> std::tuple { + -> std::tuple> { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -285,7 +288,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator V_X.Y = V_X.X.copy(); } V_X = V_X - diag_E0X; - auto polar = 2*inner(chi_copy, V_X); + auto polar = 2 * inner(chi_copy, V_X); if (world.rank() == 0) { print("new polarizability\n", polar); } X_space new_chi = @@ -306,7 +309,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator molresponse::end_timer(world, "update response", "update", iter_timing); } // if not compute y then copy x in to y - return {new_chi, {new_res, bsh}}; + return {new_chi, {new_res, bsh}, polar}; // print x norms } @@ -369,10 +372,12 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } void FrequencyResponse::frequency_to_json(json &j_mol_in, size_t iter, - const Tensor &polar_ij) { + const Tensor &polar_ij, + const Tensor &v_polar_ij) { json j = {}; j["iter"] = iter; j["polar"] = tensor_to_json(polar_ij); + j["v_polar"] = tensor_to_json(v_polar_ij); auto index = j_mol_in["protocol_data"].size() - 1; j_mol_in["protocol_data"][index]["property_data"].push_back(j); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 9226a1ff8ba..1ab8e94466a 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -40,12 +40,14 @@ class FrequencyResponse : public ResponseBase { X_space bsh_update_response(World& world, X_space& theta_X, vector& bsh_x_ops, vector& bsh_y_ops, QProjector& projector, double& x_shifts); - static void frequency_to_json(json& j_mol_in, size_t iter, const Tensor& polar_ij); + static void frequency_to_json(json &j_mol_in, size_t iter, const Tensor &polar_ij, + const Tensor &v_polar_ij); static void compute_and_print_polarizability(World& world, X_space& Chi, X_space& pq, std::string message); void save(World& world, const std::string& name) override; void load(World& world, const std::string& name) override; - std::tuple update(World &world, X_space &chi, XCOperator &xc, + std::tuple> + update(World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, From 290f1b0cfbe099a820a242759e5b17fb2ffdb7b8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Dec 2022 10:53:55 -0500 Subject: [PATCH 0555/1312] loosen bsh --- src/apps/molresponse/FrequencyResponse.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6379677fc5f..02837211983 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 950 * FunctionDefaults<3>::get_thresh(); + const double bsh_abs_target = 1150 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -214,6 +214,8 @@ void FrequencyResponse::iterate(World &world) { print(eval); print("polarizability eigenvectors"); print(evec); + print("V polarizability"); + print(v_polar); } } @@ -288,9 +290,9 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator V_X.Y = V_X.X.copy(); } V_X = V_X - diag_E0X; + V_X.truncate(); auto polar = 2 * inner(chi_copy, V_X); - if (world.rank() == 0) { print("new polarizability\n", polar); } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); From f1eaefce4fc2920b85bda0d8d96391815877ac2b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 14 Dec 2022 12:02:12 -0500 Subject: [PATCH 0556/1312] turn off kain after some iterations --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 02837211983..bb80c2d6ce9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -300,7 +300,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { + if (r_params.kain() && (iteration > 2) && (iteration < 8)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From e68c22e6506af8cc4413bca8e7745e8ad2398513 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 09:57:51 -0500 Subject: [PATCH 0557/1312] recompute --- src/apps/molresponse/FrequencyResponse.cpp | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bb80c2d6ce9..74b4578597e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -260,8 +260,23 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); + X_space new_chi = + bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); + + auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); + + // kain update with temp adjusts temp + //&& iteration < 7 + if (r_params.kain() && (iteration > 2) && (iteration < 8)) {// & (iteration % 2 == 0)) { + new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + } + if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + + X_space new_theta_X = compute_theta_X(world, new_chi, xc, r_params.calc_type()); + // truncate x + X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); - auto chi_copy = chi.copy(); + auto chi_copy = new_chi.copy(); T0X.X = T(world, chi_copy.X); if (compute_y) { T0X.Y = T(world, chi_copy.Y); @@ -292,21 +307,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator V_X = V_X - diag_E0X; V_X.truncate(); auto polar = 2 * inner(chi_copy, V_X); - - X_space new_chi = - bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - - auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); - - // kain update with temp adjusts temp - //&& iteration < 7 - if (r_params.kain() && (iteration > 2) && (iteration < 8)) {// & (iteration % 2 == 0)) { - new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); - } - if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } - - // truncate x - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } From 7dce96d6f0d83a98f3b0695c48851dafb0bf7bfb Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 10:10:14 -0500 Subject: [PATCH 0558/1312] recompute vpolarizability --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 74b4578597e..80417fa2008 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -296,7 +296,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } auto omega = r_params.omega(); - auto V_X = theta_X.copy(); + auto V_X = new_theta_X.copy(); V_X += T0X; V_X.X = V_X.X - omega * chi_copy.X; if (compute_y) { From 1210cbc155aa3d6b1fdd7801c3f5bb4d9eba3427 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 12:10:41 -0500 Subject: [PATCH 0559/1312] Use Theta X --- src/apps/molresponse/FrequencyResponse.cpp | 34 ++++------------------ 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 80417fa2008..5dd42b6a953 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -272,41 +272,19 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } - X_space new_theta_X = compute_theta_X(world, new_chi, xc, r_params.calc_type()); + X_space lambda_X = compute_lambda_X(world, new_chi, xc, r_params.calc_type()); // truncate x - X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); auto chi_copy = new_chi.copy(); - T0X.X = T(world, chi_copy.X); - if (compute_y) { - T0X.Y = T(world, chi_copy.Y); - } else { - T0X.Y = T0X.X.copy(); - } - - auto diag_E0X = chi_copy.copy(); - if (r_params.localize() != "canon") { - auto diag_only = hamiltonian - ham_no_diag; - diag_E0X.X = diag_E0X.X * diag_only; - if (compute_y) { - diag_E0X.Y = diag_E0X.Y * diag_only; - } else { - diag_E0X.Y = diag_E0X.X; - } - } auto omega = r_params.omega(); - - auto V_X = new_theta_X.copy(); - V_X += T0X; - V_X.X = V_X.X - omega * chi_copy.X; + lambda_X.X = lambda_X.X - omega * chi_copy.X; if (compute_y) { - V_X.Y = V_X.X + omega * chi_copy.X; + lambda_X.Y = lambda_X.X + omega * chi_copy.X; } else { - V_X.Y = V_X.X.copy(); + lambda_X.Y = lambda_X.X.copy(); } - V_X = V_X - diag_E0X; - V_X.truncate(); - auto polar = 2 * inner(chi_copy, V_X); + lambda_X.truncate(); + auto polar = 2 * inner(chi_copy, lambda_X); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } From 4ea8bab542f42edf6a127456d6d17fc88a474c8e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 12:25:22 -0500 Subject: [PATCH 0560/1312] make lambda_function printing mpi safe --- src/apps/molresponse/ResponseBase.cpp | 69 ++++++++++++++++----------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ca982767b3e..f40412afdfc 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -868,12 +868,6 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator X_space F0X = compute_F0X(world, chi, xc, compute_Y); X_space Chi_truncated = chi.copy(); Chi_truncated.truncate(); - if (r_params.print_level() >= 5) { - print("---------------Lambda ----------------"); - print(""); - print(inner(Chi_truncated, F0X)); - } - // put it all together X_space E0X = Chi_truncated.copy(); E0X.truncate(); @@ -881,13 +875,14 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator if (compute_Y) { E0X.Y = E0X.Y * hamiltonian; } if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi_truncated, E0X)); + auto e0_mx = inner(Chi_truncated, E0X); + if (world.rank() == 0) { + print(""); + print(e0_mx); + } } - // put it all together X_space gamma; - // compute if (calc_type == "full") { gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); @@ -896,17 +891,22 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator } else { gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); } - if (r_params.print_level() >= 5) { - print(""); - print(inner(Chi_truncated, gamma)); + if (r_params.print_level() >= 20) { + auto gamma_mx = inner(Chi_truncated, gamma); + if (world.rank() == 0) { + print(""); + print(gamma_mx); + } } Lambda_X = (F0X - E0X) + gamma; Lambda_X.truncate(); - - if (r_params.print_level() >= 5) { - print(""); - print(inner(Chi_truncated, Lambda_X)); + if (r_params.print_level() >= 20) { + auto lambda_mx = inner(Chi_truncated, Lambda_X); + if (world.rank() == 0) { + print(""); + print(lambda_mx); + } } return Lambda_X; @@ -1086,26 +1086,37 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< X_space F0X = X_space(world, m, n); X_space T0X = X_space(world, m, n); T0X.X = T(world, chi_copy.X); - if (compute_Y) { T0X.Y = T(world, chi_copy.Y); } + if (compute_Y) { + T0X.Y = T(world, chi_copy.Y); + } else { + T0X.Y = T0X.X.copy(); + } if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, T0X)); + auto tx_m = inner(chi_copy, T0X); + if (world.rank() == 0) { + print("_________________compute F0X _______________________"); + print("inner "); + print(tx_m); + } } X_space V0X = compute_V0X(world, chi_copy, xc, compute_Y); if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, V0X)); + auto vxm = inner(chi_copy, V0X); + if (world.rank() == 0) { + print("_________________compute F0X _______________________"); + print("inner "); + print(vxm); + } } - F0X = T0X + V0X; - if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, F0X)); + auto fxm = inner(chi_copy, F0X); + if (world.rank() == 0) { + print("_________________compute F0X _______________________"); + print("inner "); + print(fxm); + } } molresponse::end_timer(world, "F0X:"); From 079a2001ff30898a6e31b9bf40f7ad78806f9bb4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 12:31:48 -0500 Subject: [PATCH 0561/1312] whoops! take the inner with new_chi --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5dd42b6a953..aa65254a9be 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -284,7 +284,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator lambda_X.Y = lambda_X.X.copy(); } lambda_X.truncate(); - auto polar = 2 * inner(chi_copy, lambda_X); + auto polar = 2 * inner(new_chi, lambda_X); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } From 23ab69af7399302b27969d4fc39c1726387df589 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 13:10:51 -0500 Subject: [PATCH 0562/1312] Lets not truncate --- src/apps/molresponse/FrequencyResponse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index aa65254a9be..12a9b9dfb3d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -346,7 +346,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); } - bsh_X.truncate(); return bsh_X; } From fd737dc5522c0db547c71a32f29f44d27394d1aa Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 10:48:36 -0500 Subject: [PATCH 0563/1312] Make a compute T0X vector function --- src/apps/molresponse/FrequencyResponse.cpp | 69 ++++++++++++++++++++-- src/apps/molresponse/FrequencyResponse.hpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 55 +++++++++++++++++ src/apps/molresponse/ResponseBase.hpp | 1 + 4 files changed, 120 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 12a9b9dfb3d..da46d943962 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -250,14 +250,71 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &maxrotn) + size_t iteration, const double &max_rotation) -> std::tuple> { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; - // size_t n = Chi.num_orbitals(); + auto x = chi.copy();// copy chi + X_space V0X = compute_V0X(world, x, xc, compute_y); + X_space TOX = compute_TX(world, x, compute_y); + + + // Just compute theta x and lambda x compoenents here + X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); + world.gop.fence(); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space V0X = compute_V0X(world, chi, xc, compute_y); + //V0X.truncate(); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); + } + if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space E0X(world, chi.num_states(), chi.num_orbitals()); + if (r_params.localize() != "canon") { + E0X = chi.copy(); + E0X.X = E0X.X * ham_no_diag; + if (compute_Y) { E0X.Y = E0X.Y * ham_no_diag; } + if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } + } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); + } + + X_space gamma; + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (calc_type == "full") { + gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); + } else if (calc_type == "static") { + gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); + } else { + gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); + } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); + } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + // Right here I can compute the polarizability before I try a KAIN UPDATE or step restriction + + + Theta_X = (V0X - E0X) + gamma; + world.gop.fence(); + Theta_X.truncate(); + // Theta_X.truncate(); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); + } + if (r_params.print_level() >= 20) { print_inner(world, "xThetax", chi, Theta_X); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); + } + + X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); X_space new_chi = @@ -270,16 +327,16 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2) && (iteration < 8)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } X_space lambda_X = compute_lambda_X(world, new_chi, xc, r_params.calc_type()); // truncate x auto chi_copy = new_chi.copy(); - auto omega = r_params.omega(); - lambda_X.X = lambda_X.X - omega * chi_copy.X; + auto omega_a = r_params.omega(); + lambda_X.X = lambda_X.X - omega_a * chi_copy.X; if (compute_y) { - lambda_X.Y = lambda_X.X + omega * chi_copy.X; + lambda_X.Y = lambda_X.X + omega_a * chi_copy.X; } else { lambda_X.Y = lambda_X.X.copy(); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 1ab8e94466a..250b90385f5 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -52,7 +52,7 @@ class FrequencyResponse : public ResponseBase { std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &maxrotn); + size_t iteration, const double &max_rotation); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f40412afdfc..6b2a55f828b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1072,6 +1072,61 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< return V0; } +// Returns the ground state potential applied to functions f +// (V0 f) V0=(Vnuc+J0-K0+W0) +// J0=J[ground_density] +// K0=K[ground_density]f +// EXC0=W[ground_density] +auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) const -> X_space { + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + X_space T0X = X_space(world, x.num_states(), x.num_orbitals()); + + real_derivative_3d Dx(world, 0); + real_derivative_3d Dy(world, 1); + real_derivative_3d Dz(world, 2); + + if (compute_Y) { + auto t_xx = create_response_matrix(x.num_states(), x.num_orbitals()); + auto xx = to_response_matrix(x); + int b = 0; + for (const auto xi: xx) { + vecfuncT dvx = apply(world, Dx, xi, false); + vecfuncT dvy = apply(world, Dy, xi, false); + vecfuncT dvz = apply(world, Dz, xi, false); + world.gop.fence(); + compress(world, dvx, false); + compress(world, dvy, false); + compress(world, dvz, false); + world.gop.fence(); + vecfuncT dvx2 = apply(world, Dx, dvx, false); + vecfuncT dvy2 = apply(world, Dy, dvy, false); + vecfuncT dvz2 = apply(world, Dz, dvz, false); + world.gop.fence(); + t_xx[b++] = (dvx2 + dvy2 + dvz2) * (-0.5); + } + T0X = to_X_space(t_xx); + } else { + int b = 0; + for (const auto xi: x.X) { + vecfuncT dvx = apply(world, Dx, xi, false); + vecfuncT dvy = apply(world, Dy, xi, false); + vecfuncT dvz = apply(world, Dz, xi, false); + world.gop.fence(); + compress(world, dvx, false); + compress(world, dvy, false); + compress(world, dvz, false); + world.gop.fence(); + vecfuncT dvx2 = apply(world, Dx, dvx, false); + vecfuncT dvy2 = apply(world, Dy, dvy, false); + vecfuncT dvz2 = apply(world, Dz, dvz, false); + world.gop.fence(); + T0X.X[b++] = (dvx2 + dvy2 + dvz2) * (-0.5); + } + T0X.Y = T0X.X.copy(); + } + return T0X; +} // Returns the ground state fock operator applied to functions f auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator &xc, bool compute_Y) const -> X_space { diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 3ffb2d699d0..42a211a17c7 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -294,6 +294,7 @@ class ResponseBase { const Tensor &xij_norms, const Tensor &xij_res_norms, const Tensor &rho_norms, const Tensor &rho_res_norms); + X_space compute_TX(World &world, const X_space &X, bool compute_Y) const; }; From a0b4d183013faf020dbfe694b7a3f78739227793 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 11:20:11 -0500 Subject: [PATCH 0564/1312] reorganize frequency update to also compute the variational polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 93 ++++++++++------------ 1 file changed, 41 insertions(+), 52 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index da46d943962..5fbd1581dd3 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -258,90 +258,79 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; auto x = chi.copy();// copy chi - X_space V0X = compute_V0X(world, x, xc, compute_y); - X_space TOX = compute_TX(world, x, compute_y); - + X_space lambda_X = X_space(world, chi.num_states(), chi.num_orbitals()); + X_space theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); + // We are going to build lambda and theta from individual components // Just compute theta x and lambda x compoenents here - X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); - world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space V0X = compute_V0X(world, chi, xc, compute_y); - //V0X.truncate(); + X_space V0X = compute_V0X(world, x, xc, compute_y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); + if (r_params.print_level() >= 20 && world.rank() == 0) { + print_inner(world, "xV0x", chi, V0X); + } + } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space TOX = compute_TX(world, x, compute_y); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_TX", "TX", iter_timing); + if (r_params.print_level() >= 20 && world.rank() == 0) { + print_inner(world, "xTx", chi, TOX); + } } - if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space E0X(world, chi.num_states(), chi.num_orbitals()); + X_space full_E0X(world, chi.num_states(), chi.num_orbitals()); + X_space offdiag_E0X(world, chi.num_states(), chi.num_orbitals()); if (r_params.localize() != "canon") { - E0X = chi.copy(); - E0X.X = E0X.X * ham_no_diag; - if (compute_Y) { E0X.Y = E0X.Y * ham_no_diag; } - if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } + if (compute_y) { + offdiag_E0X.X = x.X * ham_no_diag; + offdiag_E0X.Y = x.Y * ham_no_diag; + full_E0X.X = x.X * hamiltonian; + full_E0X.Y = x.Y * hamiltonian; + } else { + offdiag_E0X.X = offdiag_E0X.X * ham_no_diag; + offdiag_E0X.Y = offdiag_E0X.X.copy(); + full_E0X.X = full_E0X.X * hamiltonian; + full_E0X.Y = full_E0X.X.copy(); + } } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } - + X_space omega_X = X_space::zero_functions(world, chi.num_states(), chi.num_orbitals()); + if (compute_y) { + omega_X.X = -omega * x.X; + omega_X.Y = omega * x.Y; + } X_space gamma; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - if (calc_type == "full") { - gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); - } else if (calc_type == "static") { + if (compute_y) gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); + else gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); - } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); - } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // Right here I can compute the polarizability before I try a KAIN UPDATE or step restriction - - - Theta_X = (V0X - E0X) + gamma; - world.gop.fence(); - Theta_X.truncate(); - // Theta_X.truncate(); + theta_X = (V0X - offdiag_E0X) + gamma; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); } - if (r_params.print_level() >= 20) { print_inner(world, "xThetax", chi, Theta_X); } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); - } - - - X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); - + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + theta_X = (TOX + V0X - full_E0X) + gamma; + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "lambda_x"); } + auto polar = 2 * inner(x, lambda_X); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); - - // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2) && (iteration < 8)) {// & (iteration % 2 == 0)) { + if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } - X_space lambda_X = compute_lambda_X(world, new_chi, xc, r_params.calc_type()); - // truncate x - - auto chi_copy = new_chi.copy(); - auto omega_a = r_params.omega(); - lambda_X.X = lambda_X.X - omega_a * chi_copy.X; - if (compute_y) { - lambda_X.Y = lambda_X.X + omega_a * chi_copy.X; - } else { - lambda_X.Y = lambda_X.X.copy(); - } - lambda_X.truncate(); - auto polar = 2 * inner(new_chi, lambda_X); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } From 3db6aef4ff995c376a4455098e4a3d5925dff76b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 11:41:12 -0500 Subject: [PATCH 0565/1312] Try this new convergence threshhold --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5fbd1581dd3..bc24b0e9c61 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 1150 * FunctionDefaults<3>::get_thresh(); + const double bsh_abs_target = 50.5 * FunctionDefaults<3>::get_thresh() + 4.493e-6; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 501d6a820cd38f1e5107773b8ab735541a7aea90 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 12:08:17 -0500 Subject: [PATCH 0566/1312] debug the new implementation for update --- src/apps/molresponse/FrequencyResponse.cpp | 18 +++++++----------- src/apps/molresponse/ResponseBase.cpp | 5 ++--- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bc24b0e9c61..c96999f5f3b 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -264,20 +264,16 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // Just compute theta x and lambda x compoenents here if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space V0X = compute_V0X(world, x, xc, compute_y); + X_space V0X = compute_V0X(world, chi, xc, compute_y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); - if (r_params.print_level() >= 20 && world.rank() == 0) { - print_inner(world, "xV0x", chi, V0X); - } + if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space TOX = compute_TX(world, x, compute_y); + X_space TOX = compute_TX(world, chi, compute_y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_TX", "TX", iter_timing); - if (r_params.print_level() >= 20 && world.rank() == 0) { - print_inner(world, "xTx", chi, TOX); - } + if (r_params.print_level() >= 20) { print_inner(world, "xTx", chi, TOX); } } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -290,9 +286,9 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator full_E0X.X = x.X * hamiltonian; full_E0X.Y = x.Y * hamiltonian; } else { - offdiag_E0X.X = offdiag_E0X.X * ham_no_diag; + offdiag_E0X.X = x.X * ham_no_diag; offdiag_E0X.Y = offdiag_E0X.X.copy(); - full_E0X.X = full_E0X.X * hamiltonian; + full_E0X.X = x.X * hamiltonian; full_E0X.Y = full_E0X.X.copy(); } } @@ -319,7 +315,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - theta_X = (TOX + V0X - full_E0X) + gamma; + lambda_X = (TOX + V0X - full_E0X+omega_X) + gamma; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "lambda_x"); } auto polar = 2 * inner(x, lambda_X); X_space new_chi = diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6b2a55f828b..5374c2e3fdb 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1079,7 +1079,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // EXC0=W[ground_density] auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) const -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space T0X = X_space(world, x.num_states(), x.num_orbitals()); real_derivative_3d Dx(world, 0); @@ -1090,7 +1089,7 @@ auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) co auto t_xx = create_response_matrix(x.num_states(), x.num_orbitals()); auto xx = to_response_matrix(x); int b = 0; - for (const auto xi: xx) { + for (const auto &xi: xx) { vecfuncT dvx = apply(world, Dx, xi, false); vecfuncT dvy = apply(world, Dy, xi, false); vecfuncT dvz = apply(world, Dz, xi, false); @@ -1108,7 +1107,7 @@ auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) co T0X = to_X_space(t_xx); } else { int b = 0; - for (const auto xi: x.X) { + for (const auto &xi: x.X) { vecfuncT dvx = apply(world, Dx, xi, false); vecfuncT dvy = apply(world, Dy, xi, false); vecfuncT dvz = apply(world, Dz, xi, false); From 26d7a865e58c9559dc3f21743e28738331f236af Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 15:41:59 -0500 Subject: [PATCH 0567/1312] truncate at each step --- src/apps/molresponse/FrequencyResponse.cpp | 17 +++++++++++------ src/apps/molresponse/ResponseBase.cpp | 3 +++ src/apps/molresponse/global_functions.cc | 3 +++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index c96999f5f3b..689eb20301b 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -292,14 +292,11 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator full_E0X.Y = full_E0X.X.copy(); } } + full_E0X.truncate(); + offdiag_E0X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } - X_space omega_X = X_space::zero_functions(world, chi.num_states(), chi.num_orbitals()); - if (compute_y) { - omega_X.X = -omega * x.X; - omega_X.Y = omega * x.Y; - } X_space gamma; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (compute_y) gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); @@ -311,11 +308,18 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.print_level() >= 1) { molresponse::start_timer(world); } theta_X = (V0X - offdiag_E0X) + gamma; + theta_X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - lambda_X = (TOX + V0X - full_E0X+omega_X) + gamma; + X_space omega_X = X_space::zero_functions(world, chi.num_states(), chi.num_orbitals()); + if (compute_y) { + omega_X.X = -omega * x.X; + omega_X.Y = omega * x.Y; + } + lambda_X = TOX + V0X - full_E0X + omega_X + gamma; + lambda_X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "lambda_x"); } auto polar = 2 * inner(x, lambda_X); X_space new_chi = @@ -389,6 +393,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); } + bsh_X.truncate(); return bsh_X; } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 5374c2e3fdb..c2457e83689 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1048,6 +1048,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); world.gop.fence(); V0 = to_X_space(vx); + V0.truncate(); //V0 = v0 * X; if (world.rank() == 0) { print("vox: v0=v0*X"); } V0 += -c_xc * K0; @@ -1058,9 +1059,11 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< std::transform(X.X.begin(), X.X.end(), V0.X.begin(), [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); world.gop.fence(); + V0.X.truncate_rf(); //V0.X = v0 * X.X; if (world.rank() == 0) { print("vox: v0=v0*X"); } V0.X += -c_xc * K0.X; + if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } V0.Y = V0.X.copy(); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index e48e9e2a5ce..f4df32adf89 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -372,6 +372,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } } + K.truncate(); return K; } @@ -419,6 +420,8 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0x.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); } + K0.Y = K0.X.copy(); } + K0.truncate(); return K0; } From 698db604ac004946b4a65a40441cf9236be8fbbc Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 15:57:45 -0500 Subject: [PATCH 0568/1312] remember to truncate static --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 689eb20301b..cb3ab47c3c7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -118,7 +118,7 @@ void FrequencyResponse::iterate(World &world) { chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); - max_rotation = 1.00 * max_bsh; + max_rotation = 1.50 * max_bsh; auto relative_max_bsh = relative_bsh.absmax(); Tensor polar = -2 * inner(Chi, PQ); world.gop.fence(); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c2457e83689..3ba41f3b7b4 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -647,6 +647,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm J.X[b++] = mul(world, temp_J, phi0); } //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); + J.X.truncate_rf(); J.Y = J.X.copy(); if (r_params.print_level() >= 1) { @@ -666,6 +667,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } } + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -714,6 +716,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } + gamma.truncate(); // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } From 0fce33cd3901f7100c6a31d740dc6de64183c733 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 16:13:00 -0500 Subject: [PATCH 0569/1312] remember to truncate static --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index cb3ab47c3c7..072298ea435 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 50.5 * FunctionDefaults<3>::get_thresh() + 4.493e-6; + const double bsh_abs_target = 575.75 * FunctionDefaults<3>::get_thresh() - 5.5e-4; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 0030fe45d26770bcc49f74d4516748a105c04d9c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 16:43:35 -0500 Subject: [PATCH 0570/1312] bug in convergence --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 072298ea435..9667e0dbb1d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 575.75 * FunctionDefaults<3>::get_thresh() - 5.5e-4; + const double bsh_abs_target = 575.75 * FunctionDefaults<3>::get_thresh() + 2.0e-5; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From bd7952dac8b698c45b8f215c20089892697bb72f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 17:11:12 -0500 Subject: [PATCH 0571/1312] reduce max sub and max iters --- src/apps/molresponse/testing/runners.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 170bcd371c1..60a661b7bc8 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -512,8 +512,8 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("dconv", 1e-7); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(20)); - r_params.set_user_defined_value("maxsub", size_t(10)); + r_params.set_user_defined_value("maxiter", size_t(10)); + r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); From e637939179b7e3c0705638a046095025abdbd634 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 19 Dec 2022 10:48:32 -0500 Subject: [PATCH 0572/1312] increase max iter to 15 --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 60a661b7bc8..9196aa5e011 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -512,7 +512,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("dconv", 1e-7); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(10)); + r_params.set_user_defined_value("maxiter", size_t(15)); r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); From 71e8bab3940e18d17c17108206dffe4f544bce62 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 19 Dec 2022 12:24:34 -0500 Subject: [PATCH 0573/1312] reduce computation for static case --- src/apps/molresponse/FrequencyResponse.cpp | 84 ++++++------ src/apps/molresponse/ResponseBase.cpp | 148 +++++++++++---------- src/apps/molresponse/ResponseBase.hpp | 4 +- src/apps/molresponse/response_functions.h | 7 +- 4 files changed, 133 insertions(+), 110 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9667e0dbb1d..cd860e3d5b7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -30,8 +30,14 @@ void FrequencyResponse::iterate(World &world) { Tensor bsh_residualsY((int(m))); Tensor density_residuals((int(m))); - Tensor xij_norms(m, 2 * n); - Tensor xij_res_norms(m, 2 * n); + bool static_res = (omega == 0.0); + bool compute_y = not static_res; + int r_vector_size; + + r_vector_size = (compute_y) ? 2 * n : n; + + Tensor xij_norms(m, r_vector_size); + Tensor xij_res_norms(m, r_vector_size); Tensor v_polar(m, m); vecfuncT rho_omega_old(m); @@ -44,7 +50,7 @@ void FrequencyResponse::iterate(World &world) { for (size_t b = 0; b < m; b++) { kain_x_space.push_back( XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + response_matrix_allocator(world, r_vector_size), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -64,19 +70,10 @@ void FrequencyResponse::iterate(World &world) { } auto bsh_x_ops = make_bsh_operators_response(world, x_shifts, omega); std::vector bsh_y_ops; - - bool static_res = (omega == 0.0); - bool compute_y = not static_res; - // Negate omega to make this next set of BSH operators \eps - omega - if (compute_y) { - omega = -omega; - bsh_y_ops = make_bsh_operators_response(world, y_shifts, omega); - omega = -omega; - } + bsh_y_ops = (compute_y) ? make_bsh_operators_response(world, y_shifts, -omega) : bsh_x_ops; vector_real_function_3d rho_omega = make_density(world, Chi); converged = false;// Converged flag auto thresh = FunctionDefaults<3>::get_thresh(); - auto max_rotation = .5; if (thresh >= 1e-2) { max_rotation = 2; @@ -87,7 +84,6 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-7) { max_rotation = .01; } - functionT mask; mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); PQ = generator(world, *this); @@ -123,13 +119,12 @@ void FrequencyResponse::iterate(World &world) { Tensor polar = -2 * inner(Chi, PQ); world.gop.fence(); // Todo add chi norm and chi_x - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, - xij_norms, xij_res_norms, rho_norms, density_residuals); - frequency_to_json(j_molresponse, iter, polar, v_polar); - world.gop.fence(); - + if (world.rank() == 0) { + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, + xij_norms, xij_res_norms, rho_norms, density_residuals); + frequency_to_json(j_molresponse, iter, polar, v_polar); + } if (r_params.print_level() >= 1) { - if (world.rank() == 0) { print("thresh: ", FunctionDefaults<3>::get_thresh()); print("k: ", FunctionDefaults<3>::get_k()); @@ -187,8 +182,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bsh_residualsX = copy(new_res.residual_norms); if (world.rank() == 0) { print("copy tensors: bshX"); } - bsh_residualsY = copy(new_res.residual_norms); - if (world.rank() == 0) { print("copy tensors: bshY"); } Chi = new_chi.copy(); if (world.rank() == 0) { print("copy chi:"); } if (r_params.print_level() >= 1) { @@ -291,9 +284,9 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator full_E0X.X = x.X * hamiltonian; full_E0X.Y = full_E0X.X.copy(); } + full_E0X.truncate(); + offdiag_E0X.truncate(); } - full_E0X.truncate(); - offdiag_E0X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } @@ -307,8 +300,14 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - theta_X = (V0X - offdiag_E0X) + gamma; - theta_X.truncate(); + if (compute_y) { + theta_X = (V0X - offdiag_E0X) + gamma; + theta_X.truncate(); + } else { + theta_X.X = (V0X.X - offdiag_E0X.X + gamma.X); + theta_X.X.truncate_rf(); + theta_X.Y = theta_X.X.copy(); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); } @@ -317,11 +316,20 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (compute_y) { omega_X.X = -omega * x.X; omega_X.Y = omega * x.Y; + lambda_X = TOX + V0X - full_E0X + omega_X + gamma; + lambda_X.truncate(); + } else { + lambda_X.X = TOX.X + V0X.X - full_E0X.X + gamma.X; + lambda_X.X.truncate_rf(); } - lambda_X = TOX + V0X - full_E0X + omega_X + gamma; - lambda_X.truncate(); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "lambda_x"); } - auto polar = 2 * inner(x, lambda_X); + Tensor polar; + if (compute_y) { + polar = 2 * inner(x, lambda_X); + } else { + polar = 4 * response_space_inner(x.X, lambda_X.X); + } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); @@ -359,16 +367,14 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; world.gop.fence(); - if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } - if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; + theta_X.truncate(); + } else { + theta_X.X.truncate_rf(); } - theta_X.truncate(); world.gop.fence(); - - if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } // apply bsh X_space bsh_X(world, m, n); /* @@ -384,16 +390,16 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } - } else { - bsh_X.Y = bsh_X.X.copy(); } if (world.rank() == 0) { print("--------------- Project BSH------------------"); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); } - - bsh_X.truncate(); + if (compute_y) { + bsh_X.truncate(); + } else { + bsh_X.X.truncate_rf(); + } return bsh_X; } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3ba41f3b7b4..d5a20cf5585 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -320,7 +320,8 @@ void ResponseBase::load_balance_chi(World &world) { molresponse::end_timer(world, "Load balancing"); } -auto ResponseBase::make_bsh_operators_response(World &world, double &shift, double &omega) const +auto ResponseBase::make_bsh_operators_response(World &world, double &shift, + const double omega) const -> std::vector { if (r_params.print_level() >= 1) molresponse::start_timer(world); @@ -498,43 +499,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - /* - X_space K1 = X_space::zero_functions(world, num_states, num_orbitals); - X_space K2 = X_space::zero_functions(world, num_states, num_orbitals); - auto phi0_c = madness::copy(world, phi0); - vecfuncT x, y; - for (size_t b = 0; b < num_states; b++) { - x = chi_alpha.X[b]; - y = chi_alpha.Y[b]; - K1.X[b] = newK(x, phi0, phi0_c); - world.gop.fence(); - K1.Y[b] = newK(y, phi0, phi0_c); - world.gop.fence(); - K2.X[b] = newK(phi0, y, phi0_c); - world.gop.fence(); - K2.Y[b] = newK(phi0, x, phi0_c); - world.gop.fence(); - } - auto K = K1 + K2; - world.gop.fence(); - if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", chi_alpha, K1); } - if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, K2); } - if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } - */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } - /* - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - if (r_params.print_level() >= 1) { - K = response_exchange(phi0, chi_alpha, true); - molresponse::end_timer(world, "K[omega] multiworld"); - print_inner(world, "new xKx", chi_alpha, K); - } - */ molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); @@ -554,9 +524,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, phi0); - for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } - world.gop.fence(); - for (size_t i = 0; i < num_states; i++) { gamma.Y[i] = projector(gamma.Y[i]); } + for (size_t i = 0; i < num_states; i++) { + gamma.X[i] = projector(gamma.X[i]); + gamma.Y[i] = projector(gamma.Y[i]); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -1189,10 +1160,17 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.X.size(); size_t n = chi.X.size_orbitals(); + bool compute_y = r_params.omega() != 0.0; // compute residual + Tensor residual_norms; X_space res(world, m, n); - res = g_chi - chi; - auto residual_norms = res.norm2s(); + if (compute_y) { + res = g_chi - chi; + residual_norms = res.norm2s(); + } else { + res.X = g_chi.X - chi.X; + residual_norms = res.X.norm2(); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); } @@ -1208,16 +1186,26 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); response_matrix update(m); - auto x_vectors = to_response_matrix(chi); - auto x_residuals = to_response_matrix(residual_chi); + + bool compute_y = r_params.omega() != 0.0; if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } - int b = 0; - for (auto &kain_xb: kain_x_space) { - update[b] = kain_xb.update(x_vectors[b], x_residuals[b]); - b++; + if (compute_y) { + auto x_vectors = to_response_matrix(chi); + auto x_residuals = to_response_matrix(residual_chi); + int b = 0; + for (auto &kain_xb: kain_x_space) { + update[b] = kain_xb.update(x_vectors[b], x_residuals[b]); + b++; + } + world.gop.fence(); + kain_update = to_X_space(update); + } else { + int b = 0; + for (auto &kain_xb: kain_x_space) { + kain_update.X[b] = kain_xb.update(chi.X[b], residual_chi.X[b]); + b++; + } } - world.gop.fence(); - kain_update = to_X_space(update); if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); @@ -1226,36 +1214,62 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, } void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, - bool restrict_y, const double &maxrotn) { + bool restrict_y, const double &max_bsh_rotation) { size_t m = old_Chi.num_states(); size_t n = old_Chi.num_orbitals(); - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - print(maxrotn); - auto diff = temp - old_Chi; - auto m_old = to_response_matrix(old_Chi); - auto m_new = to_response_matrix(temp); - auto m_diff = to_response_matrix(diff); + bool compute_y = r_params.omega() != 0.0; + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + print(max_bsh_rotation); if (world.rank() == 0) { print("----------------Start Step Restriction -----------------"); } - for (size_t b = 0; b < m; b++) { - auto step_size = norm2(world, m_diff[b]); - auto norm_xb = norm2(world, m_old[b]); - auto max_step = maxrotn;//norm;//* norm_xb; - if (world.rank() == 0) { - print("---------------- step restriction :", b, " ------------------"); - if (world.rank() == 0) { print("X[b]: ", norm_xb); } - if (world.rank() == 0) { print("deltaX[b]: ", step_size); } - if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } + if (compute_y) { + auto diff = temp - old_Chi; + auto m_old = to_response_matrix(old_Chi); + auto m_new = to_response_matrix(temp); + auto m_diff = to_response_matrix(diff); + + for (size_t b = 0; b < m; b++) { + auto step_size = norm2(world, m_diff[b]); + auto norm_xb = norm2(world, m_old[b]); + auto max_step = max_bsh_rotation;//norm;//* norm_xb; + if (world.rank() == 0) { + print("---------------- step restriction :", b, " ------------------"); + if (world.rank() == 0) { print("X[b]: ", norm_xb); } + if (world.rank() == 0) { print("deltaX[b]: ", step_size); } + if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } + } + if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { + // and if the step size is less thant 10% the vector norm + double s = .80 * max_step / step_size; + if (world.rank() == 0) { + if (r_params.print_level() > 1) + print(" restricting step for response-state: ", b, " step size", s); + } + gaxpy(world, s, m_new[b], (1.0 - s), m_old[b], false); + } } - if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { - // and if the step size is less thant 10% the vector norm - double s = .80 * max_step / step_size; + } else { + auto diff = temp.X - old_Chi.X; + for (size_t b = 0; b < m; b++) { + auto step_size = norm2(world, diff[b]); + auto norm_xb = norm2(world, old_Chi.X[b]); + auto max_step = max_bsh_rotation;//norm;//* norm_xb; if (world.rank() == 0) { - if (r_params.print_level() > 1) - print(" restricting step for response-state: ", b, " step size", s); + print("---------------- step restriction :", b, " ------------------"); + if (world.rank() == 0) { print("X[b]: ", norm_xb); } + if (world.rank() == 0) { print("deltaX[b]: ", step_size); } + if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } + } + if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { + // and if the step size is less thant 10% the vector norm + double s = .80 * max_step / step_size; + if (world.rank() == 0) { + if (r_params.print_level() > 1) + print(" restricting step for response-state: ", b, " step size", s); + } + gaxpy(world, s, temp.X[b], (1.0 - s), old_Chi.X[b], false); } - gaxpy(world, s, m_new[b], (1.0 - s), m_old[b], false); } } if (world.rank() == 0) { print("----------------End Step Restriction -----------------"); } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 42a211a17c7..e7b163c5812 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -194,7 +194,7 @@ class ResponseBase { void load_balance_chi(World &world); - auto make_bsh_operators_response(World &world, double &shift, double &omega) const + auto make_bsh_operators_response(World &world, double &shift, const double omega) const -> vector; @@ -202,7 +202,7 @@ class ResponseBase { response_solver &kain_x_space) -> X_space; void x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, - bool restrict_y, const double &maxrotn); + bool restrict_y, const double &max_bsh_rotation); void plotResponseOrbitals(World &world, size_t iteration, const response_space &x_response, const response_space &y_response, diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index c9b395b9ab5..db7a61e8e95 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -161,7 +161,10 @@ namespace madness { MADNESS_ASSERT(same_size(*this, rhs_y));// assert that same size World &world = this->x[0][0].world(); response_space result(world, num_states, num_orbitals);// create zero_functions - for (size_t i = 0; i < num_states; i++) { result[i] = x[i] - rhs_y[i]; } + for (size_t i = 0; i < num_states; i++) { + result[i] = gaxpy_oop(1.0, x[i], -1.0, rhs_y[i], false); + } + world.gop.fence(); return result; } @@ -194,7 +197,7 @@ namespace madness { response_space &operator*=(double a) { World &world = this->x[0][0].world(); - for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a,false); } + for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a, false); } world.gop.fence(); return *this; } From ba1c2b11dbab4f7218cb477c61fa67a3c4e470f9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 19 Dec 2022 12:45:11 -0500 Subject: [PATCH 0574/1312] some debugging --- src/apps/molresponse/FrequencyResponse.cpp | 27 +++++++++++++++------- src/apps/molresponse/ResponseBase.cpp | 10 +++++++- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index cd860e3d5b7..b456d201ee2 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -107,16 +107,21 @@ void FrequencyResponse::iterate(World &world) { } double d_residual = density_residuals.max(); // Test convergence and set to true - auto chi_norms = Chi.norm2s(); + auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.X.norm2(); auto relative_bsh = copy(bsh_residualsX); auto rho_norms = norm2s_T(world, rho_omega); std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); - max_rotation = 1.50 * max_bsh; + max_rotation = .95 * max_bsh; auto relative_max_bsh = relative_bsh.absmax(); - Tensor polar = -2 * inner(Chi, PQ); + Tensor polar; + if (compute_y) { + polar = -2 * inner(Chi, PQ); + } else { + polar = -4 * response_space_inner(Chi.X, PQ.X); + } world.gop.fence(); // Todo add chi norm and chi_x if (world.rank() == 0) { @@ -182,18 +187,24 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bsh_residualsX = copy(new_res.residual_norms); if (world.rank() == 0) { print("copy tensors: bshX"); } - Chi = new_chi.copy(); + if (compute_y) { + Chi = new_chi.copy(); + } else { + Chi.X = new_chi.X.copy(); + } if (world.rank() == 0) { print("copy chi:"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - xij_res_norms = new_res.residual.component_norm2s(); - if (world.rank() == 0) { print("computing residuals: xij residuals"); } - xij_norms = Chi.component_norm2s(); if (world.rank() == 0) { print("computing chi norms: xij residuals"); } density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); if (world.rank() == 0) { print("computing residuals: density residuals"); } - Tensor polar = -2 * inner(Chi, PQ); + Tensor polar; + if (compute_y) { + polar = -2 * inner(Chi, PQ); + } else { + polar = -4 * response_space_inner(Chi.X, PQ.X); + } if (world.rank() == 0) { print("computing polarizability:"); } if (r_params.print_level() >= 20) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d5a20cf5585..b3ec41d4ff9 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -277,7 +277,7 @@ auto ResponseBase::make_xc_operator(World &world) const -> XCOperator auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfuncT { auto density = vector_real_function_3d(chi.num_states()); auto calc_type = r_params.calc_type(); - if (calc_type == "full" || "static") { + if (calc_type == "full") { auto r_matrix = to_response_matrix(chi); if (world.rank() == 0) { print("make density: to response matrix"); } auto r_phi0 = to_response_vector(ground_orbitals); @@ -288,6 +288,14 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu b++; } + } else if (calc_type == "static") { + int b = 0; + for (auto &rho_b: density) { + rho_b = 2 * dot(world, chi.X[b], ground_orbitals); + b++; + } + + } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } From 8c6f719fa3ef6019875f40680386f898241309e7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 19 Dec 2022 16:58:05 -0500 Subject: [PATCH 0575/1312] some function copying to get the residuals --- src/apps/molresponse/FrequencyResponse.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index b456d201ee2..1dfebdd03e1 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -48,9 +48,7 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back( - XNonlinearSolver( - response_matrix_allocator(world, r_vector_size), false)); + kain_x_space.emplace_back(response_matrix_allocator(world, r_vector_size), false); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -197,7 +195,19 @@ void FrequencyResponse::iterate(World &world) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } if (world.rank() == 0) { print("computing chi norms: xij residuals"); } - density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); + + if (compute_y) { + xij_res_norms = new_res.residual.component_norm2s(); + xij_norms = Chi.component_norm2s(); + } else { + // TODO this is a waste but needs to be done for the analysis scripts to work. Let's remove it later + new_res.residual.Y = new_res.residual.X; + Chi.Y = Chi.X; + xij_res_norms = new_res.residual.component_norm2s(); + xij_norms = Chi.component_norm2s(); + } + auto density_change = madness::sub(world, rho_omega, rho_omega_old, true); + density_residuals = norm2s_T(world, density_change); if (world.rank() == 0) { print("computing residuals: density residuals"); } Tensor polar; if (compute_y) { From 0b44ef319643cb9721fbe17d294987c146e6460e Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Mon, 19 Dec 2022 23:57:47 -0500 Subject: [PATCH 0576/1312] [cmake] use CMAKE_{C,CXX}_COMPILER_LAUNCHER instead of RULE_LAUNCH_{COMPILE,LINK} --- CMakeLists.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 47b589894f4..8de4b331188 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -622,9 +622,10 @@ endif() # ccache for caching builds find_program(CCACHE ccache) if(CCACHE) - message (STATUS "Found ccache: ${CCACHE}") - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) - set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) + mark_as_advanced(CCACHE) + message (STATUS "Found ccache: ${CCACHE}") + set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE}" CACHE STRING "Compiler launcher to use for compiling C++") + set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE}" CACHE STRING "Compiler launcher to use for compiling C") endif(CCACHE) # Check for external dependencies ============================================== From 9eb07070d45cbc2345926686c6121f8f5fa0be62 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 20 Dec 2022 10:54:53 -0500 Subject: [PATCH 0577/1312] tighten the convergence settings --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/examples/newsolver.cc | 76 +++++++++++----------- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 1dfebdd03e1..93e395ae298 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 575.75 * FunctionDefaults<3>::get_thresh() + 2.0e-5; + const double bsh_abs_target = 191.91 * FunctionDefaults<3>::get_thresh() + 8.0e-6; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/examples/newsolver.cc b/src/examples/newsolver.cc index dc9c8624b66..375ec3e57e4 100644 --- a/src/examples/newsolver.cc +++ b/src/examples/newsolver.cc @@ -1,14 +1,16 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES +//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include using namespace madness; -static const double R = 1.4; // bond length -static const double L = 64.0*R; // box size +static const double R = 1.401042956; // bond length +static const double L = 400.00; // box size static const long k = 8; // wavelet order -static const double thresh = 1e-5; // precision +static const double thresh = 1e-6; // precision +static const double conv_ground_state = 1e-6; // precision +static const double conv_response = 1e-1; // precision static double guess(const coord_3d& r) { const double x=r[0], y=r[1], z=r[2]; @@ -18,18 +20,18 @@ static double guess(const coord_3d& r) { static double V(const coord_3d& r) { const double x=r[0], y=r[1], z=r[2]; - return -1.0/sqrt(x*x+y*y+(z-R/2)*(z-R/2)+1e-8)+ - -1.0/sqrt(x*x+y*y+(z+R/2)*(z+R/2)+1e-8); + return -1.0/sqrt(x*x+y*y+(z-R/2)*(z-R/2)+1e-12)+ + -1.0/sqrt(x*x+y*y+(z+R/2)*(z+R/2)+1e-12); } double rifunction(const coord_3d& r) { return r[2]; //z } -double iterate_ground(World& world, NonlinearSolver& solver, - real_function_3d& V, real_function_3d& psi, +double iterate_ground(World& world, NonlinearSolver& solver, + real_function_3d& V, real_function_3d& psi, double& eps) { - real_convolution_3d op = BSHOperator3D(world, sqrt(-2*eps), 0.001, 1e-6); + real_convolution_3d op = BSHOperator3D(world, sqrt(-2*eps), 0.00001, thresh); real_function_3d Vpsi = (V*psi); Vpsi.scale(-2.0).truncate(); real_function_3d tmp = op(Vpsi).truncate(); @@ -46,14 +48,14 @@ double iterate_ground(World& world, NonlinearSolver& solver, return rnorm; } -double iterate_excite(World& world, NonlinearSolver& solver, - real_function_3d& V, real_function_3d& psi, - real_function_3d& dpsi, double& eps, +double iterate_excite(World& world, NonlinearSolver& solver, + real_function_3d& V, real_function_3d& psi, + real_function_3d& dpsi, double& eps, real_function_3d& ri) { - real_convolution_3d du = CoulombOperator(world, 0.001, 1e-6); + real_convolution_3d du = CoulombOperator(world, 0.00001, thresh); real_function_3d Vdpsi = (V*dpsi); real_function_3d rhs = Vdpsi + (psi*2*du(psi*dpsi)) + (ri*psi); - real_convolution_3d op = BSHOperator3D(world, sqrt(-2*eps), 0.001, 1e-6); + real_convolution_3d op = BSHOperator3D(world, sqrt(-2*eps), 0.00001, thresh); rhs.scale(-2.0).truncate(); real_function_3d r = op(rhs) - dpsi; @@ -71,7 +73,7 @@ double iterate_excite(World& world, NonlinearSolver& solver, struct F { real_function_3d x, y; - F(const real_function_3d& x, const real_function_3d& y) + F(const real_function_3d& x, const real_function_3d& y) : x(x), y(y) {} @@ -124,27 +126,27 @@ double iterate_xy(World& world, solverT& solver, const real_function_3d& V, const real_function_3d& psi, double& eps, const real_function_3d& ri, real_function_3d& x, real_function_3d& y, const double omega) { - real_convolution_3d gOpx = BSHOperator3D(world, sqrt(-2*(eps+omega)), 0.001, 1e-6); - real_convolution_3d gOpy = BSHOperator3D(world, sqrt(-2*(eps-omega)), 0.001, 1e-6); - real_convolution_3d uop = CoulombOperator(world, 0.001, 1e-6); + real_convolution_3d gOpx = BSHOperator3D(world, sqrt(-2*(eps+omega)), 0.00001, thresh); + real_convolution_3d gOpy = BSHOperator3D(world, sqrt(-2*(eps-omega)), 0.00001, thresh); + real_convolution_3d uop = CoulombOperator(world, 0.00001, thresh); real_function_3d gp2 = uop(y*psi); real_function_3d gp3 = uop(x*psi); real_function_3d pp = (gp3 + gp2 + ri) * psi; - + real_function_3d xrhs = V*x + pp; xrhs.scale(-2.0).truncate(); real_function_3d new_x = gOpx(xrhs).truncate(); new_x = new_x - inner(psi,new_x)*psi; double xerr = (x - new_x).norm2(); - + real_function_3d yrhs = V*y + pp; yrhs.scale(-2.0).truncate(); real_function_3d new_y = gOpy(yrhs).truncate(); new_y = new_y - inner(psi,new_y)*psi; double yerr = (y - new_y).norm2(); - + F xy = solver.update(F(x,y), F(new_x-x, new_y-y)); - + x = xy.x.truncate(); y = xy.y.truncate(); print("dynamic", xerr, yerr); @@ -155,7 +157,7 @@ double iterate_xy(World& world, solverT& solver, const real_function_3d& V, int main(int argc, char** argv) { initialize(argc, argv); World world(SafeMPI::COMM_WORLD); - + startup(world,argc,argv); std::cout.precision(6); @@ -163,24 +165,24 @@ int main(int argc, char** argv) { FunctionDefaults<3>::set_thresh(thresh); FunctionDefaults<3>::set_refine(true); FunctionDefaults<3>::set_initial_level(5); - FunctionDefaults<3>::set_truncate_mode(1); + FunctionDefaults<3>::set_truncate_mode(1); FunctionDefaults<3>::set_cubic_cell(-L/2, L/2); - + if (world.rank() == 0) print("\n Solving for the HF wave function\n"); real_function_3d Vnuc = real_factory_3d(world).f(V); real_function_3d psi = real_factory_3d(world).f(guess); psi.truncate(); psi.scale(1.0/psi.norm2()); - real_convolution_3d op = CoulombOperator(world, 0.001, 1e-6); + real_convolution_3d op = CoulombOperator(world, 0.00001, thresh); double eps = -0.6; { NonlinearSolver solver; - for (int iter=0; iter<10; iter++) { + for (int iter=0; iter<20; iter++) { real_function_3d rho = square(psi).truncate(); real_function_3d potential = Vnuc + op(rho).truncate(); double err = iterate_ground(world, solver, potential, psi, eps); - if (err < thresh) break; + if (err < conv_ground_state) break; } } double kinetic_energy = 0.0; @@ -194,7 +196,7 @@ int main(int argc, char** argv) { double two_electron_energy = inner(op(rho),rho); // = double nuclear_attraction_energy = 2.0*inner(Vnuc,rho); // = double nuclear_repulsion_energy = 1.0/R; - double total_energy = kinetic_energy + two_electron_energy + + double total_energy = kinetic_energy + two_electron_energy + nuclear_attraction_energy + nuclear_repulsion_energy; double virial = (nuclear_attraction_energy + two_electron_energy + nuclear_repulsion_energy) / kinetic_energy; @@ -222,7 +224,7 @@ int main(int argc, char** argv) { NonlinearSolver solver; for(int iter=1; iter<=20; iter++) { double err = iterate_excite(world, solver, potential, psi, dpsi, eps, ri); - if (err < 10*thresh) break; + if (err < conv_response) break; } } @@ -257,10 +259,10 @@ int main(int argc, char** argv) { print("< dpsi | r | psi > ",ans5); print(""); print(" < 1 | V - E1 | 0 > =", d2Ea); - print("-< 0 | H0 - E0 | 0 > =", d2Eb); + print("-< 1 | H0 - E0 | 1 > =", d2Eb); print("variational estimate =", 2*d2Ea - d2Eb); } - + // For first frequency use zero as the initial guess but at subsequent // frequencies use the previous solution as the guess. real_function_3d x = real_factory_3d(world); //zero @@ -270,15 +272,15 @@ int main(int argc, char** argv) { if (world.rank() == 0) print("\nSolving for the dynamic response function with omega =", omega,"\n"); XNonlinearSolver solver = XNonlinearSolver(allocator(world)); - + for(int iter=1; iter<=20; iter++) { double err = iterate_xy(world, solver, potential, psi, eps, ri, x, y, omega); - if (err < 10*thresh) break; + if (err < conv_response) break; } real_function_3d drho = (x*psi)+(psi*y); - double alpha_dynamic = -2*inner(ri,drho); - if (world.rank() == 0) + double alpha_dynamic = -2*inner(ri,drho); + if (world.rank() == 0) print("\nalpha_dynamic omega = ",omega," alpha = ",alpha_dynamic); char fname[32]; @@ -289,7 +291,7 @@ int main(int argc, char** argv) { sprintf(fname,"drho_%6.4f.dat", omega); plot_line(fname, 1001, {0.0,0.0,-20.0}, {0.0,0.0,20.0}, drho); } - + finalize(); return 0; } From b6df0626e5e2b2c6b3e3da2a04e60a3a923aab04 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 20 Dec 2022 16:09:02 -0500 Subject: [PATCH 0578/1312] madness::unique_id is printable to std::wostream also --- src/madness/world/uniqueid.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/madness/world/uniqueid.h b/src/madness/world/uniqueid.h index c422cf566b4..ac68cd165d0 100644 --- a/src/madness/world/uniqueid.h +++ b/src/madness/world/uniqueid.h @@ -100,10 +100,13 @@ namespace madness { /// Stream insertion function for a \c uniqueidT. + /// \tparam CharT a character type + /// \tparam Traits a traits type describing \p CharT /// \param[in,out] s The output stream. /// \param[in] id The \c uniqueidT to be output. /// \return The output stream (for chaining). - friend std::ostream& operator<<(std::ostream& s, const uniqueidT& id) { + template + friend std::basic_ostream& operator<<(std::basic_ostream& s, const uniqueidT& id) { s << "{" << id.get_world_id() << "," << id.get_obj_id() << "}"; return s; } From a8fc35f270d5876dabde81eca7c96e44ac8b8b86 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 13:46:03 -0500 Subject: [PATCH 0579/1312] bsh_target_power_rule --- src/apps/molresponse/FrequencyResponse.cpp | 5 ++++- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 93e395ae298..0f9c5c79865 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,10 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 191.91 * FunctionDefaults<3>::get_thresh() + 8.0e-6; + auto thresh = FunctionDefaults<3>::get_thresh(); + const double a_pow = 0.69441118; + const double b_pow = 0.85986518; + const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow); //thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 9196aa5e011..ed0137e89cf 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -369,7 +369,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("l", 200); if (precision == "low") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); From b2f8807cd7efdbec049561d165e2773e7c15e9ab Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 13:48:27 -0500 Subject: [PATCH 0580/1312] debug --- src/apps/molresponse/FrequencyResponse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0f9c5c79865..983f8bafee6 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -74,7 +74,6 @@ void FrequencyResponse::iterate(World &world) { bsh_y_ops = (compute_y) ? make_bsh_operators_response(world, y_shifts, -omega) : bsh_x_ops; vector_real_function_3d rho_omega = make_density(world, Chi); converged = false;// Converged flag - auto thresh = FunctionDefaults<3>::get_thresh(); auto max_rotation = .5; if (thresh >= 1e-2) { max_rotation = 2; From fedb6e6599988c267d5c33947eaf8624c33897d9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 17:51:06 -0500 Subject: [PATCH 0581/1312] Testing new convergence settings --- src/apps/molresponse/FrequencyResponse.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 983f8bafee6..989f8d69666 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -25,9 +25,9 @@ void FrequencyResponse::iterate(World &world) { const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); - const double a_pow = 0.69441118; - const double b_pow = 0.85986518; - const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow); //thresh^a*10^b + const double a_pow = 0.70466272; + const double b_pow = 0.81457002; + const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -114,7 +114,7 @@ void FrequencyResponse::iterate(World &world) { chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); - max_rotation = .95 * max_bsh; + max_rotation = 1.0 * max_bsh; auto relative_max_bsh = relative_bsh.absmax(); Tensor polar; if (compute_y) { @@ -357,10 +357,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { + if (r_params.kain() && (iteration > 0)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } + if (iteration > 0) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); From 77aa0dfa1bce8db9de38195f1bb0ba2ce46de645 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 18:16:51 -0500 Subject: [PATCH 0582/1312] loosen 2nd protocol --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 989f8d69666..b60236ac88d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -25,8 +25,8 @@ void FrequencyResponse::iterate(World &world) { const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); - const double a_pow = 0.70466272; - const double b_pow = 0.81457002; + const double a_pow = 0.59636157; + const double b_pow = 0.16174869; const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); From 9bd73acb21dc2a87f1ba2ca22d5b9e28246efdbb Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 20:29:48 -0500 Subject: [PATCH 0583/1312] kain at 3 restrict at 5 --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index b60236ac88d..4d0e5367924 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -357,10 +357,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (r_params.kain() && (iteration > 0)) {// & (iteration % 2 == 0)) { + if (r_params.kain() && (iteration > 3)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 0) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } + if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); From 13eb31df1859e6ddd4320eb9e23f1f7ad724f65a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 21:01:41 -0500 Subject: [PATCH 0584/1312] kain at 3 restrict at 3 step restrict with kain --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 4d0e5367924..8113bb52097 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -360,7 +360,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 3)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } + if (iteration > 3) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); From cb8ddf74e9049f70375d6aad0f88a045df975e48 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 22:00:48 -0500 Subject: [PATCH 0585/1312] Test without Kain or steprestriction --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8113bb52097..3d1c6f735df 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -357,10 +357,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (r_params.kain() && (iteration > 3)) {// & (iteration % 2 == 0)) { + if (false) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 3) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } + if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); From 9ffb5a441afcda220cae1eb3a1bf6dffd9d68d50 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 12:11:10 -0500 Subject: [PATCH 0586/1312] remove the relative residual --- src/apps/molresponse/ExcitedResponse.cpp | 4 ++-- src/apps/molresponse/FrequencyResponse.cpp | 19 +++++++++---------- src/apps/molresponse/ResponseBase.cpp | 2 -- src/apps/molresponse/ResponseBase.hpp | 5 ++--- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index a2882b5e68e..c483a3b0ccd 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -1917,8 +1917,8 @@ void ExcitedResponse::iterate(World &world) { auto relative_max_bsh = relative_bsh.absmax(); - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, - xij_norms, xij_res_norms, rho_norms, density_residuals); + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, xij_norms, + xij_res_norms, rho_norms, density_residuals); excited_to_json(j_molresponse, iter, omega); diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3d1c6f735df..5c7672cf8fb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -108,14 +108,9 @@ void FrequencyResponse::iterate(World &world) { double d_residual = density_residuals.max(); // Test convergence and set to true auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.X.norm2(); - auto relative_bsh = copy(bsh_residualsX); auto rho_norms = norm2s_T(world, rho_omega); - std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), - chi_norms.ptr(), relative_bsh.ptr(), - [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); max_rotation = 1.0 * max_bsh; - auto relative_max_bsh = relative_bsh.absmax(); Tensor polar; if (compute_y) { polar = -2 * inner(Chi, PQ); @@ -125,8 +120,8 @@ void FrequencyResponse::iterate(World &world) { world.gop.fence(); // Todo add chi norm and chi_x if (world.rank() == 0) { - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, - xij_norms, xij_res_norms, rho_norms, density_residuals); + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, xij_norms, + xij_res_norms, rho_norms, density_residuals); frequency_to_json(j_molresponse, iter, polar, v_polar); } if (r_params.print_level() >= 1) { @@ -138,12 +133,10 @@ void FrequencyResponse::iterate(World &world) { print("xij residual norms: \n", xij_res_norms); print("Chi_X: ", chi_norms); print("bsh_residuals : ", bsh_residualsX); - print("relative_bsh : ", relative_bsh); print("r_params.dconv(): ", r_params.dconv()); print("max rotation: ", max_rotation); print("d_residual_max : ", d_residual); print("d_residual_max target : ", dconv * 5.0); - print("relative residual", relative_max_bsh); print("bsh_residual_max : ", max_bsh); print("bsh abs target : ", bsh_abs_target); } @@ -309,7 +302,13 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } full_E0X.truncate(); offdiag_E0X.truncate(); + if (r_params.print_level() >= 20) { + print_inner(world, "E0", chi, offdiag_E0X); + print_inner(world, "ED", chi, full_E0X); + } } + + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } @@ -357,7 +356,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (false) {// & (iteration % 2 == 0)) { + if (false) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index b3ec41d4ff9..d631871218a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1385,7 +1385,6 @@ void protocol_to_json(json &j, const double proto) { void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, const Tensor &x_abs_norms, - const Tensor &x_rel_norms, const Tensor &xij_norms, const Tensor &xij_abs_norms, const Tensor &rho_norms, @@ -1396,7 +1395,6 @@ void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, const Tens j["x_norms"] = tensor_to_json(x_norms); j["x_abs_error"] = tensor_to_json(x_abs_norms); - j["x_rel_error"] = tensor_to_json(x_rel_norms); j["xij_norms"] = tensor_to_json(xij_norms); j["xij_abs_error"] = tensor_to_json(xij_abs_norms); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index e7b163c5812..644ed516f41 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -290,9 +290,8 @@ class ResponseBase { const X_space &right); void function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, - const Tensor &x_abs_norms, const Tensor &x_rel_norms, - const Tensor &xij_norms, const Tensor &xij_res_norms, - const Tensor &rho_norms, + const Tensor &x_abs_norms, const Tensor &xij_norms, + const Tensor &xij_res_norms, const Tensor &rho_norms, const Tensor &rho_res_norms); X_space compute_TX(World &world, const X_space &X, bool compute_Y) const; }; From 6fcdee84fc8e120e49b1ac0a10d2746334cf177e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 12:14:20 -0500 Subject: [PATCH 0587/1312] Turn on kain after 3 iterations --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5c7672cf8fb..862c2df651c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -356,7 +356,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (false) {// & (iteration % 3 == 0)) { + if (iteration >= 3) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } From ff14e843687b241f7e0176a008478ba57864ea2f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 13:36:19 -0500 Subject: [PATCH 0588/1312] remove xij residuals --- src/apps/molresponse/ExcitedResponse.cpp | 4 +- src/apps/molresponse/FrequencyResponse.cpp | 50 +++++++++++----------- src/apps/molresponse/ResponseBase.cpp | 5 --- src/apps/molresponse/ResponseBase.hpp | 9 ++-- src/apps/molresponse/x_space.h | 12 ++++++ 5 files changed, 45 insertions(+), 35 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index c483a3b0ccd..4c817a9628d 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -1917,8 +1917,8 @@ void ExcitedResponse::iterate(World &world) { auto relative_max_bsh = relative_bsh.absmax(); - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, xij_norms, - xij_res_norms, rho_norms, density_residuals); + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, rho_norms, + density_residuals); excited_to_json(j_molresponse, iter, omega); diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 862c2df651c..02328ab87e4 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -9,7 +9,7 @@ void FrequencyResponse::initialize(World &world) { if (world.rank() == 0) { print("FrequencyResponse::initialize()"); } - Chi = PQ.copy(); + Chi = generator(world, *this); } @@ -25,12 +25,12 @@ void FrequencyResponse::iterate(World &world) { const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); + auto density_target = dconv * std::max(size_t(5), molecule.natom()); const double a_pow = 0.59636157; const double b_pow = 0.16174869; const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); - Tensor bsh_residualsY((int(m))); Tensor density_residuals((int(m))); bool static_res = (omega == 0.0); @@ -39,8 +39,6 @@ void FrequencyResponse::iterate(World &world) { r_vector_size = (compute_y) ? 2 * n : n; - Tensor xij_norms(m, r_vector_size); - Tensor xij_res_norms(m, r_vector_size); Tensor v_polar(m, m); vecfuncT rho_omega_old(m); @@ -56,6 +54,18 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } + + + // New approach solving single function at a time + response_function_solver rf_solver; + for (size_t b = 0; b < m * n; b++) { + rf_solver.emplace_back(response_function_allocator(world), false); + } + if (r_params.kain()) { + for (auto &solver_ij: rf_solver) { solver_ij.set_maxsub(r_params.maxsub()); } + } + + // We compute with positive frequencies if (world.rank() == 0) { print("Warning input frequency is assumed to be positive"); @@ -106,7 +116,6 @@ void FrequencyResponse::iterate(World &world) { break; } double d_residual = density_residuals.max(); - // Test convergence and set to true auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.X.norm2(); auto rho_norms = norm2s_T(world, rho_omega); auto max_bsh = bsh_residualsX.absmax(); @@ -120,8 +129,8 @@ void FrequencyResponse::iterate(World &world) { world.gop.fence(); // Todo add chi norm and chi_x if (world.rank() == 0) { - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, xij_norms, - xij_res_norms, rho_norms, density_residuals); + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, rho_norms, + density_residuals); frequency_to_json(j_molresponse, iter, polar, v_polar); } if (r_params.print_level() >= 1) { @@ -129,19 +138,19 @@ void FrequencyResponse::iterate(World &world) { print("thresh: ", FunctionDefaults<3>::get_thresh()); print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); - print("xij norms: \n", xij_norms); - print("xij residual norms: \n", xij_res_norms); print("Chi_X: ", chi_norms); - print("bsh_residuals : ", bsh_residualsX); - print("r_params.dconv(): ", r_params.dconv()); print("max rotation: ", max_rotation); + print("r_params.dconv(): ", r_params.dconv()); + print("density target : ", density_target); + print("d_residuals : ", density_residuals); print("d_residual_max : ", d_residual); print("d_residual_max target : ", dconv * 5.0); + print("bsh_residuals : ", bsh_residualsX); print("bsh_residual_max : ", max_bsh); print("bsh abs target : ", bsh_abs_target); } } - if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and + if ((d_residual < density_target) and ((max_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { converged = true; } @@ -191,16 +200,6 @@ void FrequencyResponse::iterate(World &world) { } if (world.rank() == 0) { print("computing chi norms: xij residuals"); } - if (compute_y) { - xij_res_norms = new_res.residual.component_norm2s(); - xij_norms = Chi.component_norm2s(); - } else { - // TODO this is a waste but needs to be done for the analysis scripts to work. Let's remove it later - new_res.residual.Y = new_res.residual.X; - Chi.Y = Chi.X; - xij_res_norms = new_res.residual.component_norm2s(); - xij_norms = Chi.component_norm2s(); - } auto density_change = madness::sub(world, rho_omega, rho_omega_old, true); density_residuals = norm2s_T(world, density_change); if (world.rank() == 0) { print("computing residuals: density residuals"); } @@ -210,6 +209,8 @@ void FrequencyResponse::iterate(World &world) { } else { polar = -4 * response_space_inner(Chi.X, PQ.X); } + + auto v_polar2 = 2 * polar - v_polar; if (world.rank() == 0) { print("computing polarizability:"); } if (r_params.print_level() >= 20) { @@ -225,6 +226,8 @@ void FrequencyResponse::iterate(World &world) { print(evec); print("V polarizability"); print(v_polar); + print("V polarizability 2"); + print(v_polar2); } } @@ -247,8 +250,6 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { print(" Final energy residuals X:"); print(bsh_residualsX); - print(" Final energy residuals Y:"); - print(bsh_residualsY); print(" Final density residuals:"); print(density_residuals); } @@ -270,7 +271,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator X_space lambda_X = X_space(world, chi.num_states(), chi.num_orbitals()); X_space theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); // We are going to build lambda and theta from individual components - // Just compute theta x and lambda x compoenents here if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_y); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d631871218a..c92a5c8a17a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1385,8 +1385,6 @@ void protocol_to_json(json &j, const double proto) { void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, const Tensor &x_abs_norms, - const Tensor &xij_norms, - const Tensor &xij_abs_norms, const Tensor &rho_norms, const Tensor &rho_abs_norms) { json j = {}; @@ -1396,9 +1394,6 @@ void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, const Tens j["x_norms"] = tensor_to_json(x_norms); j["x_abs_error"] = tensor_to_json(x_abs_norms); - j["xij_norms"] = tensor_to_json(xij_norms); - j["xij_abs_error"] = tensor_to_json(xij_abs_norms); - j["rho_norms"] = tensor_to_json(rho_norms); j["rho_abs_error"] = tensor_to_json(rho_abs_norms); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 644ed516f41..d350cf7d88f 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -25,7 +25,10 @@ using namespace madness; using json=nlohmann::json; -typedef std::vector> response_solver; +typedef std::vector> + response_solver; +typedef std::vector> + response_function_solver; class response_timing { std::map> wall_time_data; @@ -290,8 +293,8 @@ class ResponseBase { const X_space &right); void function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, - const Tensor &x_abs_norms, const Tensor &xij_norms, - const Tensor &xij_res_norms, const Tensor &rho_norms, + const Tensor &x_abs_norms, + const Tensor &rho_norms, const Tensor &rho_res_norms); X_space compute_TX(World &world, const X_space &X, bool compute_Y) const; }; diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index c66ff068f21..f4d9400a10c 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -379,6 +379,18 @@ namespace madness { return response_matrix_allocator(world, other.n_orbtials); } }; + + struct response_function_allocator { + World &world; + response_function_allocator(World &world) : world(world) {} + // overloading the default constructor () operator + real_function_3d operator()() { + return real_function_3d(real_factory_3d(world).fence(true)); + } + response_function_allocator operator=(const response_function_allocator &other) { + return response_function_allocator(world); + } + }; }// namespace madness #endif// SRC_APPS_MOLRESPONSE_X_SPACE_H_ From d560bde5c8e49168f6b79111c67e74f1f8eca1fd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 13:41:39 -0500 Subject: [PATCH 0589/1312] new solver --- src/apps/molresponse/FrequencyResponse.cpp | 5 +++-- src/apps/molresponse/FrequencyResponse.hpp | 9 ++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 02328ab87e4..bd7751d584d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -174,7 +174,7 @@ void FrequencyResponse::iterate(World &world) { } auto [new_chi, new_res, new_polar] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, iter, max_rotation); + kain_x_space, iter, max_rotation, response_function_solver()); v_polar = copy(new_polar); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); @@ -260,7 +260,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &max_rotation) + size_t iteration, const double &max_rotation, + response_function_solver &solver) -> std::tuple> { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 250b90385f5..abbf619a49d 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -48,11 +48,10 @@ class FrequencyResponse : public ResponseBase { void load(World& world, const std::string& name) override; std::tuple> update(World &world, X_space &chi, XCOperator &xc, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, - QProjector &projector, double &x_shifts, - double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &max_rotation); + std::vector &bsh_x_ops, std::vector &bsh_y_ops, + QProjector &projector, double &x_shifts, double &omega_n, + response_solver &kain_x_space, size_t iteration, const double &max_rotation, + response_function_solver &solver); }; From 7f2260711e35c9ef57a5437c8b6f94c30221af04 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 14:26:22 -0500 Subject: [PATCH 0590/1312] new kain solver.....now test on small collection --- src/apps/molresponse/FrequencyResponse.cpp | 72 ++++++++++++++++++++-- src/apps/molresponse/FrequencyResponse.hpp | 2 + src/apps/molresponse/ResponseBase.cpp | 1 + 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bd7751d584d..d751bac5226 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -9,7 +9,7 @@ void FrequencyResponse::initialize(World &world) { if (world.rank() == 0) { print("FrequencyResponse::initialize()"); } - Chi = generator(world, *this); + Chi = PQ.copy(); } @@ -174,7 +174,7 @@ void FrequencyResponse::iterate(World &world) { } auto [new_chi, new_res, new_polar] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, iter, max_rotation, response_function_solver()); + kain_x_space, iter, max_rotation, rf_solver); v_polar = copy(new_polar); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); @@ -357,8 +357,12 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (iteration >= 3) {// & (iteration % 3 == 0)) { - new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + if (iteration >= 0) {// & (iteration % 3 == 0)) { + if (false) { + new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + } else { + new_chi = new_kain_x_space_update(world, chi, new_chi, solver); + } } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } @@ -371,6 +375,64 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // print x norms } +auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, + response_function_solver &rf_solver) -> X_space { + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + bool compute_y = omega != 0.0; + + size_t m = x.num_states(); + size_t n = x.num_orbitals(); + size_t p = compute_y ? 2 : 1; + + + X_space kain_update(world, m, n); + // step 1 is to place all functions into a single vector + + if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } + + vector_real_function_3d vect_x(m * n * p); + vector_real_function_3d vect_fx(m * n * p); + vector_real_function_3d vect_rx(m * n * p); + + int orb_x; + int orb_y; + for (int i = 0; i < m; i++) { + orb_x = i * p * n; + for (int j = 0; j < n; j++) { + vect_x[orb_x + j] = x.X[i][j]; + vect_fx[orb_x + j] = fx.X[i][j]; + } + if (compute_y) { + orb_y = i * p * n + n; + for (int j = 0; j < n; j++) { + vect_x[orb_y + j] = x.Y[i][j]; + vect_fx[orb_y + j] = fx.Y[i][j]; + } + } + } + vect_rx = sub(world, vect_fx, vect_x); + + for (int i = 0; i < m; i++) { + orb_x = i * p * n; + for (int j = 0; j < n; j++) { + kain_update.X[i][j] = + rf_solver[orb_x + j].update(vect_x[orb_x + j], vect_rx[orb_x + j]); + } + if (compute_y) { + orb_y = i * p * n + n; + for (int j = 0; j < n; j++) { + kain_update.Y[i][j] = + rf_solver[orb_y + j].update(vect_x[orb_y + j], vect_rx[orb_y + j]); + } + } + } + if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); + } + return kain_update; +} auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, std::vector &bsh_x_ops, std::vector &bsh_y_ops, @@ -514,7 +576,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { //truncate(world, dipole_vectors, true); world.gop.fence(); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); - PQ.Y = PQ.X; + PQ.Y = PQ.X.copy(); if (world.rank() == 0) { print("Made new PQ"); } return PQ; } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index abbf619a49d..47701c743e6 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -52,6 +52,8 @@ class FrequencyResponse : public ResponseBase { QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, size_t iteration, const double &max_rotation, response_function_solver &solver); + X_space new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, + response_function_solver &rf_solver); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c92a5c8a17a..2c37db01512 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1221,6 +1221,7 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, return kain_update; } + void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, bool restrict_y, const double &max_bsh_rotation) { size_t m = old_Chi.num_states(); From cbcc5817e85f79858fe88de33762cf2850ab3e40 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 14:32:24 -0500 Subject: [PATCH 0591/1312] new kain solver.....now test on small collection --- src/apps/molresponse/FrequencyResponse.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d751bac5226..d445693d2ae 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -135,17 +135,17 @@ void FrequencyResponse::iterate(World &world) { } if (r_params.print_level() >= 1) { if (world.rank() == 0) { + print("r_params.dconv(): ", r_params.dconv()); print("thresh: ", FunctionDefaults<3>::get_thresh()); print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); print("Chi_X: ", chi_norms); print("max rotation: ", max_rotation); - print("r_params.dconv(): ", r_params.dconv()); - print("density target : ", density_target); print("d_residuals : ", density_residuals); - print("d_residual_max : ", d_residual); - print("d_residual_max target : ", dconv * 5.0); print("bsh_residuals : ", bsh_residualsX); + print("d_residual_max : ", d_residual); + print("density target : ", density_target); + print("d_residual_max target : ",density_target); print("bsh_residual_max : ", max_bsh); print("bsh abs target : ", bsh_abs_target); } From 8eec71d06179b94ff94d17e7e0cf8c3b58ca61d7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 14:35:51 -0500 Subject: [PATCH 0592/1312] remove the 2nd version of polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d445693d2ae..c41cf256a9c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -210,7 +210,6 @@ void FrequencyResponse::iterate(World &world) { polar = -4 * response_space_inner(Chi.X, PQ.X); } - auto v_polar2 = 2 * polar - v_polar; if (world.rank() == 0) { print("computing polarizability:"); } if (r_params.print_level() >= 20) { @@ -226,8 +225,6 @@ void FrequencyResponse::iterate(World &world) { print(evec); print("V polarizability"); print(v_polar); - print("V polarizability 2"); - print(v_polar2); } } From 47ec423f2f1cd6cb5bcd8c4950dd00e6e4633f02 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 14:48:16 -0500 Subject: [PATCH 0593/1312] ensure enough function allocation for y updates --- src/apps/molresponse/FrequencyResponse.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index c41cf256a9c..09805e2925d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -57,8 +57,9 @@ void FrequencyResponse::iterate(World &world) { // New approach solving single function at a time + auto p = compute_y ? 2 : 1; response_function_solver rf_solver; - for (size_t b = 0; b < m * n; b++) { + for (size_t b = 0; b < m * n * p; b++) { rf_solver.emplace_back(response_function_allocator(world), false); } if (r_params.kain()) { @@ -145,7 +146,7 @@ void FrequencyResponse::iterate(World &world) { print("bsh_residuals : ", bsh_residualsX); print("d_residual_max : ", d_residual); print("density target : ", density_target); - print("d_residual_max target : ",density_target); + print("d_residual_max target : ", density_target); print("bsh_residual_max : ", max_bsh); print("bsh abs target : ", bsh_abs_target); } From 5511d7db13dcd51b38792bb637a244943d6a1da2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 15:04:36 -0500 Subject: [PATCH 0594/1312] make sure we copy x --- src/apps/molresponse/FrequencyResponse.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 09805e2925d..f9ae48d6db5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -363,7 +363,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } - + if (~compute_y) { new_chi.Y = new_chi.X.copy(); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } @@ -410,6 +410,7 @@ auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, } } vect_rx = sub(world, vect_fx, vect_x); + truncate(world, vect_rx); for (int i = 0; i < m; i++) { orb_x = i * p * n; @@ -574,6 +575,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { //truncate(world, dipole_vectors, true); world.gop.fence(); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); + ; PQ.Y = PQ.X.copy(); if (world.rank() == 0) { print("Made new PQ"); } return PQ; From 6013626247311b802798ff6bea589ead7dda9c31 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 15:39:05 -0500 Subject: [PATCH 0595/1312] switch it back to xvector kain just truncate residual first --- src/apps/molresponse/FrequencyResponse.cpp | 7 +++---- src/apps/molresponse/ResponseBase.cpp | 2 ++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f9ae48d6db5..d96e5f55156 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -356,7 +356,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 if (iteration >= 0) {// & (iteration % 3 == 0)) { - if (false) { + if (true) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } else { new_chi = new_kain_x_space_update(world, chi, new_chi, solver); @@ -402,7 +402,7 @@ auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, vect_fx[orb_x + j] = fx.X[i][j]; } if (compute_y) { - orb_y = i * p * n + n; + orb_y = orb_x + n; for (int j = 0; j < n; j++) { vect_x[orb_y + j] = x.Y[i][j]; vect_fx[orb_y + j] = fx.Y[i][j]; @@ -419,7 +419,7 @@ auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, rf_solver[orb_x + j].update(vect_x[orb_x + j], vect_rx[orb_x + j]); } if (compute_y) { - orb_y = i * p * n + n; + orb_y = orb_x + n; for (int j = 0; j < n; j++) { kain_update.Y[i][j] = rf_solver[orb_y + j].update(vect_x[orb_y + j], vect_rx[orb_y + j]); @@ -575,7 +575,6 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { //truncate(world, dipole_vectors, true); world.gop.fence(); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); - ; PQ.Y = PQ.X.copy(); if (world.rank() == 0) { print("Made new PQ"); } return PQ; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2c37db01512..63405be21de 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1174,9 +1174,11 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp X_space res(world, m, n); if (compute_y) { res = g_chi - chi; + res.truncate(); residual_norms = res.norm2s(); } else { res.X = g_chi.X - chi.X; + res.X.truncate_rf(); residual_norms = res.X.norm2(); } if (r_params.print_level() >= 1) { From 7087bf6bec1118bf1683b9994a9fa3edd57f756d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:01:49 -0500 Subject: [PATCH 0596/1312] do not truncate after computing residual --- src/apps/molresponse/ResponseBase.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 63405be21de..2c37db01512 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1174,11 +1174,9 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp X_space res(world, m, n); if (compute_y) { res = g_chi - chi; - res.truncate(); residual_norms = res.norm2s(); } else { res.X = g_chi.X - chi.X; - res.X.truncate_rf(); residual_norms = res.X.norm2(); } if (r_params.print_level() >= 1) { From 6769ed07e9bd782fcd627a8e8034498d5bc8db5c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:08:43 -0500 Subject: [PATCH 0597/1312] put the truncation back in --- src/apps/molresponse/ResponseBase.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2c37db01512..63405be21de 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1174,9 +1174,11 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp X_space res(world, m, n); if (compute_y) { res = g_chi - chi; + res.truncate(); residual_norms = res.norm2s(); } else { res.X = g_chi.X - chi.X; + res.X.truncate_rf(); residual_norms = res.X.norm2(); } if (r_params.print_level() >= 1) { From 79de68f515857d8cc945bd2e937707856d7ce844 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:10:09 -0500 Subject: [PATCH 0598/1312] put the truncation back in --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d96e5f55156..28ab3a89b4d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -355,7 +355,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (iteration >= 0) {// & (iteration % 3 == 0)) { + if (iteration > 3) {// & (iteration % 3 == 0)) { if (true) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } else { From 700ad1a5d8f60e140ea80401d6d3bc47d4fa8569 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:15:59 -0500 Subject: [PATCH 0599/1312] make it's this line --- src/apps/molresponse/FrequencyResponse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 28ab3a89b4d..16710708cea 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -363,7 +363,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } - if (~compute_y) { new_chi.Y = new_chi.X.copy(); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } From 44670278503da3899ea95e6c1f1084668ba86622 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:20:02 -0500 Subject: [PATCH 0600/1312] okay this fixed it --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 16710708cea..536fe9aad1c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -355,7 +355,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (iteration > 3) {// & (iteration % 3 == 0)) { + if (iteration > 0) {// & (iteration % 3 == 0)) { if (true) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } else { From af742a5e63602a86c0f05663532e9b467eb43199 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:25:32 -0500 Subject: [PATCH 0601/1312] last try with the new solver --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 536fe9aad1c..9f86731e8bc 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -356,7 +356,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { - if (true) { + if (false) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } else { new_chi = new_kain_x_space_update(world, chi, new_chi, solver); From 691c30e7ec2e8a95a1da0c68f6e6760413d8b378 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:28:06 -0500 Subject: [PATCH 0602/1312] revert it back to old kain solver --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9f86731e8bc..536fe9aad1c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -356,7 +356,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { - if (false) { + if (true) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } else { new_chi = new_kain_x_space_update(world, chi, new_chi, solver); From eb05f6d579f444ceae3ba36c9887b8cb6f946896 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 6 Jan 2023 10:32:41 -0500 Subject: [PATCH 0603/1312] high starts at 1e-6 and ends at 1e-8 in three stages --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index ed0137e89cf..3788d026c28 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -502,7 +502,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value>("protocol", {1e-6, 1e-7, 1e-8}); r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); From 23367b0a6f5c492e588ba1757e66b4e9d10a4a4d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 6 Jan 2023 13:19:07 -0500 Subject: [PATCH 0604/1312] match moldft and response convergence settings --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 3788d026c28..26a617db60a 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -372,7 +372,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + param1.set_user_defined_value>("protocol", {1e-6, 1e-7, 1e-8}); param1.set_user_defined_value("dconv", 1e-6); } else { param1.set_user_defined_value>("protocol", {1e-8}); From c3f3b1f1a96872accfd5467347254c25b4b4a36e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 6 Jan 2023 13:19:23 -0500 Subject: [PATCH 0605/1312] output json after each stage --- src/apps/molresponse/ResponseBase.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 63405be21de..a7a252a6bcf 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1443,6 +1443,10 @@ void ResponseBase::solve(World &world) { protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... this->iterate(world); + if (world.rank() == 0) { + //calc.time_data.to_json(calc.j_molresponse); + this->output_json(); + } } // At this point we should know if calc converged maybe add a flag to response.json which states if it has converged_to_json(j_molresponse); From f28158ff9ff75260619c232351f95d86fedb3f00 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 6 Jan 2023 17:27:23 -0500 Subject: [PATCH 0606/1312] this change is not compatible --- src/apps/molresponse/ResponseBase.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index a7a252a6bcf..63405be21de 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1443,10 +1443,6 @@ void ResponseBase::solve(World &world) { protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... this->iterate(world); - if (world.rank() == 0) { - //calc.time_data.to_json(calc.j_molresponse); - this->output_json(); - } } // At this point we should know if calc converged maybe add a flag to response.json which states if it has converged_to_json(j_molresponse); From eb465decba6f540e5f04c9cd8934f42650537f87 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 11 Jan 2023 10:52:03 +0100 Subject: [PATCH 0607/1312] towards scripted tests --- CMakeLists.txt | 2 ++ cmake/modules/AddScriptedTests.cmake | 38 ++++++++++++++++++++++++++++ src/madness/world/CMakeLists.txt | 5 +++- 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 cmake/modules/AddScriptedTests.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8de4b331188..8e8d2b2d7d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,7 @@ include(CMakeDependentOption) include(AddMADLibrary) include(AddMADExecutable) include(AddUnittests) +include(AddScriptedTests) include(CMakePackageConfigHelpers) include(CopyTargetProperties) include(FeatureSummary) @@ -670,6 +671,7 @@ include(CTest) if(BUILD_TESTING) set(MADNESS_HAS_GOOGLE_TEST 1) add_custom_target_subproject(madness unittests) + add_custom_target_subproject(madness scripted_tests) add_custom_target_subproject(madness check COMMAND ${CMAKE_CTEST_COMMAND} -V -R "madness/test/" USES_TERMINAL) # to be GNU compatible add_dependencies(everything unittests) endif() diff --git a/cmake/modules/AddScriptedTests.cmake b/cmake/modules/AddScriptedTests.cmake new file mode 100644 index 00000000000..ef89ea51116 --- /dev/null +++ b/cmake/modules/AddScriptedTests.cmake @@ -0,0 +1,38 @@ +# macro will build (i.e. copy the test script to the build directory) and execute the script + +# example +# CMakeLists.txt: add_scripted_tests(nemo_test1.py nemo) + + +macro(add_scripted_tests _testcase _binary _labels) + + # Add targets and for scripted tests + add_custom_target_subproject(madness ${_testcase}_scripted_tests) + add_dependencies(scripted_tests-madness ${_testcase}_scripted_tests-madness) + +# Add a test that builds the binary + add_test(madness/test/${_binary}/build + "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${_binary}) + set_tests_properties(madness/test/${_binary}/build + PROPERTIES DEPENDS ${_binary} LABELS scripted_tests) + +# Add a test that copies the test scripts + add_test(madness/test/scripted_tests/${_binary}/${_testcase}/copy + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/${_testcase} + ${CMAKE_CURRENT_BINARY_DIR}/${_testcase}) + set_tests_properties(madness/test/scripted_tests/${_binary}/${_testcase}/copy + PROPERTIES DEPENDS ${_binary} LABELS scripted_tests) + + message(STATUS "testcase: " ${_testcase}) + message(STATUS "binary: " ${_binary}) + message(STATUS "labels: " ${_labels}) + message(STATUS "sourcedir " ${CMAKE_CURRENT_SOURCE_DIR}) + message(STATUS "binarydir " ${CMAKE_CURRENT_BINARY_DIR}) + + # Add the tests (execution and result) and set dependencies + add_test(NAME madness/test/scripted_tests/${_binary}/${_testcase}/run COMMAND ${_testcase}) + set_tests_properties(madness/test/scripted_tests/${_binary}/${_testcase}/run + PROPERTIES LABELS scripted_tests) + +endmacro() \ No newline at end of file diff --git a/src/madness/world/CMakeLists.txt b/src/madness/world/CMakeLists.txt index 99021530618..74b108ffaf3 100644 --- a/src/madness/world/CMakeLists.txt +++ b/src/madness/world/CMakeLists.txt @@ -97,7 +97,10 @@ if(BUILD_TESTING) test_worldref.cc test_stack.cc test_googletest.cc test_tree.cc ) - add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest") + add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest") + +# add_scripted_tests(test.py test_tree "scripted") +# add_scripted_tests(test1.py test_hello "scripted") find_package(CUDA) if (TARGET PaRSEC::parsec AND CUDA_FOUND) From 4ae46bd6a830169474e4e1bec356997e1d18cce3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 11 Jan 2023 12:19:39 -0500 Subject: [PATCH 0608/1312] only break if we should be closer to convergence --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 12 +++++------- src/apps/molresponse/testing/test_development.cpp | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 536fe9aad1c..2dc1c27a957 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -112,7 +112,7 @@ void FrequencyResponse::iterate(World &world) { } if (iter < 2 || (iter % 10) == 0) { load_balance_chi(world); } if (iter > 0) { - if (density_residuals.max() > 20) { + if (density_residuals.max() > 20 && iter > 5) { if (world.rank() == 0) { print("d-residual > 20...break"); } break; } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 26a617db60a..1527731a6e4 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -180,7 +180,6 @@ frequencySchema::frequencySchema(World &world, const runSchema &run_schema, * @return */ size_t set_excited_states(const ResponseDataBase &response_data_base, - const std::filesystem::path &molecule_path, const std::string &molecule_name, const std::string &xc) { const std::string property = "excited-state"; @@ -208,7 +207,7 @@ size_t set_excited_states(const ResponseDataBase &response_data_base, * @return */ std::filesystem::path generate_excited_run_path(const std::filesystem::path &moldft_path, - const size_t &num_states, const std::string &xc) { + const size_t &num_states) { std::string s_num_states = std::to_string(num_states); std::string run_name = "excited-" + s_num_states; // set r_params to restart true if restart file exist @@ -250,9 +249,8 @@ struct excitedSchema { excitedSchema(const runSchema &run_schema, const moldftSchema &m_schema) : xc(m_schema.xc) { - num_states = - set_excited_states(run_schema.rdb, run_schema.molecule_path, m_schema.mol_name, xc); - excited_state_run_path = generate_excited_run_path(m_schema.moldft_path, num_states, xc); + num_states = set_excited_states(run_schema.rdb, m_schema.mol_name, xc); + excited_state_run_path = generate_excited_run_path(m_schema.moldft_path, num_states); auto [sp, s] = generate_excited_save_path(excited_state_run_path); save_path = sp; save_string = s; @@ -692,7 +690,7 @@ static void set_and_write_restart_excited_parameters(ResponseParameters ¶met * @param frequency * @param moldft_path */ -static void create_excited_paths(ResponseParameters ¶meters, excitedSchema &schema) { +static void create_excited_paths(excitedSchema &schema) { if (std::filesystem::is_directory(schema.excited_state_run_path)) { cout << "Response directory found " << std::endl; @@ -720,7 +718,7 @@ auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec ResponseParameters r_params{}; set_excited_parameters(r_params, schema.xc, schema.num_states, high_prec); - create_excited_paths(r_params, schema); + create_excited_paths(schema); std::filesystem::current_path(schema.excited_state_run_path); set_and_write_restart_excited_parameters(r_params, schema, restart); diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index 96ca7f864c5..722b178f1d3 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -37,7 +37,7 @@ int main(int argc, char *argv[]) { excited_schema.print(); ResponseParameters r_params{}; set_excited_parameters(r_params, excited_schema.xc, excited_schema.num_states, false); - create_excited_paths(r_params, excited_schema); + create_excited_paths(excited_schema); std::filesystem::current_path(excited_schema.excited_state_run_path); set_and_write_restart_excited_parameters(r_params, excited_schema, false); auto xc_path = create_xc_path_and_directory(root, xc); From 1907e1579d8fa1feaa68ec4d71fcd160defdc065 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 11 Jan 2023 23:14:08 +0100 Subject: [PATCH 0609/1312] adding more scripted tests for nemo --- bin/madjsoncompare.py | 51 +++++++++++++++++++ cmake/modules/AddScriptedTests.cmake | 35 ++++++++----- src/apps/nemo/CMakeLists.txt | 3 ++ src/apps/nemo/madtest1.scf_info.ref.json | 1 + src/apps/nemo/madtestboys.scf_info.ref.json | 1 + src/apps/nemo/madtestcanon.scf_info.ref.json | 1 + src/apps/nemo/madtestnew.scf_info.ref.json | 1 + src/apps/nemo/test_energy.py | 42 ++++++++++++++++ src/apps/nemo/test_localization.py | 52 ++++++++++++++++++++ 9 files changed, 175 insertions(+), 12 deletions(-) create mode 100644 bin/madjsoncompare.py create mode 100644 src/apps/nemo/madtest1.scf_info.ref.json create mode 100644 src/apps/nemo/madtestboys.scf_info.ref.json create mode 100644 src/apps/nemo/madtestcanon.scf_info.ref.json create mode 100644 src/apps/nemo/madtestnew.scf_info.ref.json create mode 100755 src/apps/nemo/test_energy.py create mode 100755 src/apps/nemo/test_localization.py diff --git a/bin/madjsoncompare.py b/bin/madjsoncompare.py new file mode 100644 index 00000000000..9f71ccc5bf4 --- /dev/null +++ b/bin/madjsoncompare.py @@ -0,0 +1,51 @@ +import json + +class madjsoncompare: + # """takes two json output files and compares individual keys, accessed by a list of descending keys""" + def __init__(self, file1, file2): + self.file1=file1 + self.file2=file2 + self.success=True + + with open(file1, 'r') as f: + self.data1 = json.load(f) + + with open(file2, 'r') as f: + self.data2 = json.load(f) + + def exitcode(self): + if self.success: + return 0 + else: + return 1 + + def compare(self, subsequentkeys, tolerance): + value1=self.data1 + value2=self.data2 + for i in subsequentkeys: + value1=value1[i] + value2=value2[i] + + # print("type of key/value",type(i),type(value1)) + success=False + diff='is different' + if (type(value1)==float): + diff=abs(value1-value2) + success=diff Date: Fri, 13 Jan 2023 13:03:04 +0100 Subject: [PATCH 0610/1312] json for more applications --- src/madness/chem/CCStructures.h | 2 + .../chem/QCCalculationParametersBase.h | 2 +- src/madness/chem/SCF.cc | 59 +++++++++---------- src/madness/chem/SCF.h | 39 ++---------- src/madness/chem/TDHF.cc | 9 +++ src/madness/chem/nemo.cc | 7 +-- src/madness/tensor/tensor_json.hpp | 32 ++++++++-- 7 files changed, 74 insertions(+), 76 deletions(-) diff --git a/src/madness/chem/CCStructures.h b/src/madness/chem/CCStructures.h index 2f7e0a2f2d4..1f1631b15a6 100644 --- a/src/madness/chem/CCStructures.h +++ b/src/madness/chem/CCStructures.h @@ -672,6 +672,8 @@ struct CC_vecfunction { ktmp.second.plot(msg); } } +public: + NLOHMANN_DEFINE_TYPE_INTRUSIVE(CC_vecfunction, excitation, omega, irrep, current_error) }; diff --git a/src/madness/chem/QCCalculationParametersBase.h b/src/madness/chem/QCCalculationParametersBase.h index 982ea39c55f..0a0b50c580a 100644 --- a/src/madness/chem/QCCalculationParametersBase.h +++ b/src/madness/chem/QCCalculationParametersBase.h @@ -297,7 +297,7 @@ class QCCalculationParametersBase { } catch (std::invalid_argument& e) { throw; } catch (std::exception& e) { - print(e.what()); + madness::print(e.what()); } read_commandline_options(world,parser,tag); } diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 39a863cf804..df92af41627 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -142,38 +142,33 @@ tensorT Q2(const tensorT& s) { }// namespace madness -void -SCF::output_scf_info_schema(const int &iter, const std::map &vals, const tensorT &dipole_T) const { +void SCF::output_calc_info_schema() const { nlohmann::json j = {}; - j.push_back(nlohmann::json()); - // TODO (Adrian) possibly read in json from filesystem. - // if it exists figure out the size. pushback for each protocol - j[0]["scf_iterations"] = iter; - const double thresh = FunctionDefaults<3>::get_thresh(); - const int k = FunctionDefaults<3>::get_k(); - j[0]["scf_threshold"] = thresh; - j[0]["scf_k"] = k; - for (auto const &[key, val]: vals) { - j[0][key] = val; - } - j[0]["scf_dipole_moment"] = tensor_to_json(dipole_T); - int num = 0; - std::string save = param.prefix() + ".scf_info.json"; -#ifdef MADCHEM_HAS_STD_FILESYSTEM - if (std::filesystem::exists(save)) { - std::ifstream ifs(save); -#else - std::ifstream ifs(save); - if (ifs) { -#endif - nlohmann::json j_old; - ifs >> j_old; - print(j_old); - j_old.push_back(j); - j = j_old; - }; - std::ofstream ofs(save); - ofs << j; + vec_pair_ints int_vals; + vec_pair_T double_vals; + vec_pair_tensor_T double_tensor_vals; + + + int_vals.push_back({"calcinfo_nmo", param.nmo_alpha() + param.nmo_beta()}); + int_vals.push_back({"calcinfo_nalpha", param.nalpha()}); + int_vals.push_back({"calcinfo_nbeta", param.nbeta()}); + int_vals.push_back({"calcinfo_natom", molecule.natom()}); + int_vals.push_back({"k", FunctionDefaults<3>::get_k()}); + + to_json(j, int_vals); +// double_vals.push_back({"return_energy", value(molecule.get_all_coords().flat())}); + double_vals.push_back({"return_energy", current_energy}); + to_json(j, double_vals); + double_tensor_vals.push_back({"scf_eigenvalues_a", aeps}); + if (param.nbeta() != 0 && !param.spin_restricted()) { + double_tensor_vals.push_back({"scf_eigenvalues_b", beps}); + } + + to_json(j, double_tensor_vals); + param.to_json(j); + e_data.to_json(j); + + output_schema(param.prefix()+".calc_info", j); } void scf_data::add_data(std::map values) { @@ -199,7 +194,7 @@ scf_data::scf_data() : iter(0) { } -void scf_data::to_json(json &j) { +void scf_data::to_json(json &j) const { ::print("SCF DATA TO JSON"); j["scf_e_data"] = json(); diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index b17437c7d45..1fc07f361eb 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -178,7 +178,7 @@ class MomentFunctor : public FunctionFunctorInterface { scf_data(); - void to_json(json &j); + void to_json(json &j) const; void print_data(); @@ -249,7 +249,7 @@ class SCF { static void print_parameters() { CalculationParameters param; print("default parameters for the moldft program are"); - param.print("dft","end"); + param.print("dft", "end"); print("\n\nthe molecular geometry must be specified in a separate block:"); Molecule::print_parameters(); } @@ -503,11 +503,9 @@ class SCF { // For given protocol, solve the DFT/HF/response equations void solve(World& world); - // - void output_scf_info_schema(const int& iter, const std::map& vals, const tensorT& dipole_T) const; + void output_calc_info_schema() const; }; - // Computes molecular energy as a function of the geometry // This is cludgy ... need better factorization of functionality // between calculation, main program and this ... or just merge it all. @@ -676,36 +674,11 @@ class MolecularEnergy : public OptimizationTargetInterface, public QCPropertyInt gradient = calc.derivatives(world, rho); } - void output_calc_info_schema() { - nlohmann::json j = {}; - vec_pair_ints int_vals; - vec_pair_T double_vals; - vec_pair_tensor_T double_tensor_vals; - - CalculationParameters param = calc.param; - - - - int_vals.push_back({"calcinfo_nmo", param.nmo_alpha() + param.nmo_beta()}); - int_vals.push_back({"calcinfo_nalpha", param.nalpha()}); - int_vals.push_back({"calcinfo_nbeta", param.nbeta()}); - int_vals.push_back({"calcinfo_natom", calc.molecule.natom()}); - int_vals.push_back({"k", FunctionDefaults<3>::get_k()}); - - to_json(j, int_vals); - double_vals.push_back({"return_energy", value(calc.molecule.get_all_coords().flat())}); - to_json(j, double_vals); - double_tensor_vals.push_back({"scf_eigenvalues_a", calc.aeps}); - if (param.nbeta() != 0 && !param.spin_restricted()) { - double_tensor_vals.push_back({"scf_eigenvalues_b", calc.beps}); - } + void output_calc_info_schema() const { + calc.output_calc_info_schema(); + } - to_json(j, double_tensor_vals); - param.to_json(j); - calc.e_data.to_json(j); - output_schema(param.prefix()+".calc_info", j); - } }; } diff --git a/src/madness/chem/TDHF.cc b/src/madness/chem/TDHF.cc index 98924b418bb..db9ddfca0d7 100644 --- a/src/madness/chem/TDHF.cc +++ b/src/madness/chem/TDHF.cc @@ -254,6 +254,8 @@ std::vector TDHF::solve_cis() const { if (converged_roots.size() >= size_t(parameters.excitations())) break; } + + return converged_roots; } @@ -1485,6 +1487,7 @@ double TDHF::oscillator_strength_velocity(const CC_vecfunction &x) const { void TDHF::analyze(const std::vector &x) const { const size_t noct = get_active_mo_ket().size(); + nlohmann::json j; for (const CC_vecfunction &root : x) { @@ -1518,7 +1521,13 @@ void TDHF::analyze(const std::vector &x) const { } } if (world.rank() == 0) print(" "); + j.push_back(root); + j.back()["oscillator_strength_length"]=osl; + j.back()["oscillator_strength_velocity"]=osv; } + nlohmann::json j1; + j1["cis_excitations"]=j; + update_schema(get_calc()->param.prefix()+".calc_info", j1); // compute the transition densities const vector_real_function_3d bra_oct = get_active_mo_bra(); diff --git a/src/madness/chem/nemo.cc b/src/madness/chem/nemo.cc index 2d5bc2a2034..c5268541bda 100644 --- a/src/madness/chem/nemo.cc +++ b/src/madness/chem/nemo.cc @@ -216,10 +216,9 @@ double Nemo::value(const Tensor& x) { if(world.rank()==0) std::cout << "Nemo Orbital Energies: " << calc->aeps << "\n"; - std::map results; - results["scf_energy"]=calc->current_energy; - calc->output_scf_info_schema(0,results,dipole); - return calc->current_energy; + calc->output_calc_info_schema(); + + return calc->current_energy; } diff --git a/src/madness/tensor/tensor_json.hpp b/src/madness/tensor/tensor_json.hpp index 25263b96eb4..4e64f936553 100644 --- a/src/madness/tensor/tensor_json.hpp +++ b/src/madness/tensor/tensor_json.hpp @@ -78,20 +78,40 @@ namespace madness { } template - void output_schema(std::string schema_name, nlohmann::json& j) { - std::ofstream ofs(schema_name + ".json"); + nlohmann::json add_time_tag(const nlohmann::json& j1) { + auto print_time = std::chrono::system_clock::now(); auto in_time_t = std::chrono::system_clock::to_time_t(print_time); std::stringstream ss; ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); - print(ss.str()); - print("printing j", j); - + auto j=j1; j["time"] = ss.str(); j["wall_time"] = wall_time(); + return j; + } + + template + void output_schema(const std::string schema_name, const nlohmann::json& j) { + auto j1= add_time_tag(j); + std::ofstream ofs(schema_name + ".json"); + ofs << std::setw(4) << j1; + } - ofs << std::setw(4) << j; + template + nlohmann::json input_schema(const std::string& schema_name) { + // read old schema + std::ifstream ifs(schema_name+".json"); + nlohmann::json j; + if (ifs.is_open()) j=nlohmann::json::parse(ifs); + return j; + } + + template + void update_schema(const std::string schema_name, const nlohmann::json& jnew) { + auto j=input_schema(schema_name); + j.update(jnew); + output_schema(schema_name,j); } }// namespace madness From a78d1f38ee52ea90e9b3548d0ce5fc13845bddad Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 13 Jan 2023 22:57:57 +0100 Subject: [PATCH 0611/1312] json for more applications --- cmake/modules/AddScriptedTests.cmake | 6 +- src/apps/cis/CMakeLists.txt | 3 + ...d_cis_test_energy_he.py.calc_info.ref.json | 95 ++++++++++++++++ ...is_test_symmetry_h2o.py.calc_info.ref.json | 91 ++++++++++++++++ ...s_test_symmetry_h2o.py1.calc_info.ref.json | 91 ++++++++++++++++ src/apps/cis/test_callable.py | 36 +++++++ src/apps/cis/test_energy_he.py | 36 +++++++ src/apps/cis/test_symmetry_h2o.py | 56 ++++++++++ src/apps/moldft/CMakeLists.txt | 3 + ...d_moldft_test_energy.py.calc_info.ref.json | 101 ++++++++++++++++++ src/apps/moldft/test_energy.py | 35 ++++++ ...mad_nemo_test_energy.py.calc_info.ref.json | 77 +++++++++++++ src/apps/nemo/madtest1.scf_info.ref.json | 1 - src/apps/nemo/madtestboys.calc_info.ref.json | 81 ++++++++++++++ src/apps/nemo/madtestboys.scf_info.ref.json | 1 - src/apps/nemo/madtestcanon.calc_info.ref.json | 81 ++++++++++++++ src/apps/nemo/madtestcanon.scf_info.ref.json | 1 - src/apps/nemo/madtestnew.calc_info.ref.json | 81 ++++++++++++++ src/apps/nemo/madtestnew.scf_info.ref.json | 1 - src/apps/nemo/test_energy.py | 37 +++---- src/apps/nemo/test_localization.py | 23 ++-- src/madness/chem/SCF.cc | 3 +- src/madness/chem/TDHF.cc | 2 + 23 files changed, 897 insertions(+), 45 deletions(-) create mode 100644 src/apps/cis/mad_cis_test_energy_he.py.calc_info.ref.json create mode 100644 src/apps/cis/mad_cis_test_symmetry_h2o.py.calc_info.ref.json create mode 100644 src/apps/cis/mad_cis_test_symmetry_h2o.py1.calc_info.ref.json create mode 100755 src/apps/cis/test_callable.py create mode 100755 src/apps/cis/test_energy_he.py create mode 100755 src/apps/cis/test_symmetry_h2o.py create mode 100644 src/apps/moldft/mad_moldft_test_energy.py.calc_info.ref.json create mode 100755 src/apps/moldft/test_energy.py create mode 100644 src/apps/nemo/mad_nemo_test_energy.py.calc_info.ref.json delete mode 100644 src/apps/nemo/madtest1.scf_info.ref.json create mode 100644 src/apps/nemo/madtestboys.calc_info.ref.json delete mode 100644 src/apps/nemo/madtestboys.scf_info.ref.json create mode 100644 src/apps/nemo/madtestcanon.calc_info.ref.json delete mode 100644 src/apps/nemo/madtestcanon.scf_info.ref.json create mode 100644 src/apps/nemo/madtestnew.calc_info.ref.json delete mode 100644 src/apps/nemo/madtestnew.scf_info.ref.json diff --git a/cmake/modules/AddScriptedTests.cmake b/cmake/modules/AddScriptedTests.cmake index ca3b52d3131..17e750fb753 100644 --- a/cmake/modules/AddScriptedTests.cmake +++ b/cmake/modules/AddScriptedTests.cmake @@ -12,8 +12,8 @@ macro(add_scripted_tests _testcase_in _binary _labels) set(_testcase ${_testcase_in}) # Add targets and for scripted tests - add_custom_target_subproject(madness ${_testcase}_scripted_tests) - add_dependencies(scripted_tests-madness ${_testcase}_scripted_tests-madness) + add_custom_target_subproject(madness ${_testcase}_${_binary}_scripted_tests) + add_dependencies(scripted_tests-madness ${_testcase}_${_binary}_scripted_tests-madness) # Add a test that builds the binary add_test(madness/test/${_binary}/build @@ -33,6 +33,8 @@ macro(add_scripted_tests _testcase_in _binary _labels) endif() # copy the test scripts and replaces the variable to the source directory containing the reference json outputs set(SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}) + set(BINARY ${_binary}) + set(TESTCASE ${_testcase}) configure_file(${_testcase} ${_testcase} @ONLY) # message(STATUS "testcase: " ${_testcase}) diff --git a/src/apps/cis/CMakeLists.txt b/src/apps/cis/CMakeLists.txt index b2297cf3416..ca0c01b80ea 100644 --- a/src/apps/cis/CMakeLists.txt +++ b/src/apps/cis/CMakeLists.txt @@ -3,5 +3,8 @@ add_mad_executable(cis cis.cpp "MADchem") add_dependencies(applications-madness cis) +add_scripted_tests(test_callable.py cis "short;application") +add_scripted_tests(test_energy_he.py cis "medium;application") +add_scripted_tests(test_symmetry_h2o.py cis "long;application") install(TARGETS cis DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/cis/mad_cis_test_energy_he.py.calc_info.ref.json b/src/apps/cis/mad_cis_test_energy_he.py.calc_info.ref.json new file mode 100644 index 00000000000..ae3c11ce4ea --- /dev/null +++ b/src/apps/cis/mad_cis_test_energy_he.py.calc_info.ref.json @@ -0,0 +1,95 @@ +{ + "calcinfo_nalpha": 1, + "calcinfo_natom": 1, + "calcinfo_nbeta": 1, + "calcinfo_nmo": 2, + "cis_excitations": [ + { + "current_error": 0.42771340146642123, + "excitation": 0, + "irrep": "a", + "omega": 0.8537474375326528, + "oscillator_strength_length": 0.18676996305232113, + "oscillator_strength_velocity": 0.14416397075254817 + }, + { + "current_error": 0.7899482510479806, + "excitation": 1, + "irrep": "a", + "omega": 0.8622170407245322, + "oscillator_strength_length": 1.1708828224761008e-16, + "oscillator_strength_velocity": 8.783950329067414e-17 + } + ], + "k": 6, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 0.0001, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": -1, + "l": 50.0, + "lo": 0.013396, + "loadbalparts": 2, + "maxiter": 1, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 1, + "nbeta": 1, + "nio": 1, + "nmo_alpha": 1, + "nmo_beta": 1, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": 0.0, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 1 + ], + "size": 1, + "vals": [ + -0.9223614119238546 + ] + }, + "time": "2023-01-13 14:06:06", + "wall_time": 7.2820069789886475 +} \ No newline at end of file diff --git a/src/apps/cis/mad_cis_test_symmetry_h2o.py.calc_info.ref.json b/src/apps/cis/mad_cis_test_symmetry_h2o.py.calc_info.ref.json new file mode 100644 index 00000000000..22871df06a5 --- /dev/null +++ b/src/apps/cis/mad_cis_test_symmetry_h2o.py.calc_info.ref.json @@ -0,0 +1,91 @@ +{ + "calcinfo_nalpha": 5, + "calcinfo_natom": 3, + "calcinfo_nbeta": 5, + "calcinfo_nmo": 10, + "cis_excitations": [ + { + "current_error": 0.0013072029534875592, + "excitation": 0, + "irrep": "b1", + "omega": 0.323418449616142, + "oscillator_strength_length": 0.048603656877145775, + "oscillator_strength_velocity": 0.06653531351642708 + } + ], + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.0001, + "derivatives": false, + "dipole": false, + "econv": 1e-05, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": 8, + "l": 51.427, + "lo": 0.001329, + "loadbalparts": 2, + "maxiter": 25, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 5, + "nbeta": 5, + "nio": 1, + "nmo_alpha": 5, + "nmo_beta": 5, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -76.06815242574442, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 5 + ], + "size": 5, + "vals": [ + -20.5603929499122, + -1.3591667875853617, + -0.7302075856187005, + -0.5839695148435231, + -0.5112127229564482 + ] + }, + "time": "2023-01-13 22:39:23", + "wall_time": 114.18017506599426 +} \ No newline at end of file diff --git a/src/apps/cis/mad_cis_test_symmetry_h2o.py1.calc_info.ref.json b/src/apps/cis/mad_cis_test_symmetry_h2o.py1.calc_info.ref.json new file mode 100644 index 00000000000..dc8f236efe5 --- /dev/null +++ b/src/apps/cis/mad_cis_test_symmetry_h2o.py1.calc_info.ref.json @@ -0,0 +1,91 @@ +{ + "calcinfo_nalpha": 5, + "calcinfo_natom": 3, + "calcinfo_nbeta": 5, + "calcinfo_nmo": 10, + "cis_excitations": [ + { + "current_error": 0.0005892647041639927, + "excitation": 0, + "irrep": "a2", + "omega": 0.3842214144996289, + "oscillator_strength_length": 9.857594355145078e-26, + "oscillator_strength_velocity": 1.8716106572289434e-27 + } + ], + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.0001, + "derivatives": false, + "dipole": false, + "econv": 1e-05, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": 8, + "l": 51.427, + "lo": 0.001329, + "loadbalparts": 2, + "maxiter": 25, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 5, + "nbeta": 5, + "nio": 1, + "nmo_alpha": 5, + "nmo_beta": 5, + "no_compute": true, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -76.06797621693613, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 5 + ], + "size": 5, + "vals": [ + -20.560392949912178, + -1.359166787585358, + -0.7302075856186984, + -0.5839695148435157, + -0.5112127229564459 + ] + }, + "time": "2023-01-13 22:49:56", + "wall_time": 90.58036994934082 +} \ No newline at end of file diff --git a/src/apps/cis/test_callable.py b/src/apps/cis/test_callable.py new file mode 100755 index 00000000000..7dd7e50780a --- /dev/null +++ b/src/apps/cis/test_callable.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") + + prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --input=input --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; excitations=0"' + cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + print("finished with run") + print(p.stdout) + exitcode=p.returncode + print("exitcode ",exitcode) + + # compare results + # cmp=madjsoncompare(outputfile,referencefile) + # cmp.compare(["cis_excitations",0,"irrep"],1.0) + # cmp.compare(["cis_excitations",0,"omega"],1.e-3) + # print("final success: ",cmp.success) + + sys.exit(p.returncode) \ No newline at end of file diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py new file mode 100755 index 00000000000..7c9a4fa9415 --- /dev/null +++ b/src/apps/cis/test_energy_he.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") + + prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --input=input --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; guess_excitations=2; excitations=2"' + cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + print("finished with run") + print(output) + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["cis_excitations",0,"irrep"],1.0) + cmp.compare(["cis_excitations",0,"omega"],1.e-3) + cmp.compare(["cis_excitations",1,"irrep"],1.0) + cmp.compare(["cis_excitations",1,"omega"],1.e-3) + print("final success: ",cmp.success) + + sys.exit(cmp.exitcode()) \ No newline at end of file diff --git a/src/apps/cis/test_symmetry_h2o.py b/src/apps/cis/test_symmetry_h2o.py new file mode 100755 index 00000000000..0bd15b0c009 --- /dev/null +++ b/src/apps/cis/test_symmetry_h2o.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") + + prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --input=input --geometry=h2o' + dft_arguments=' --dft="k=8; localize=canon; prefix='+prefix+'"' + other_arguments=' --response="freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' + cmd='rm '+outputfile+'; cis '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + print("finished with run") + print(output) + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["cis_excitations",0,"irrep"],1.0) + cmp.compare(["cis_excitations",0,"omega"],1.e-4) + cmp.compare(["cis_excitations",0,"oscillator_strength_length"],1.e-3) + cmp.compare(["cis_excitations",0,"oscillator_strength_velocity"],1.e-3) + + referencefile="@SRCDIR@/"+prefix+"1.calc_info.ref.json" + + + dft_arguments=' --dft="k=8; localize=canon; prefix='+prefix+'; no_compute=1"' + other_arguments=' --response="irrep=a2; freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' + cmd='cis '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + print("finished with run") + print(output) + + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["cis_excitations",0,"irrep"],1.0) + cmp.compare(["cis_excitations",0,"omega"],1.e-4) + cmp.compare(["cis_excitations",0,"oscillator_strength_length"],1.e-3) + cmp.compare(["cis_excitations",0,"oscillator_strength_velocity"],1.e-3) + print("final success: ",cmp.success) + + + sys.exit(cmp.exitcode()) \ No newline at end of file diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index d98e863f179..9a95690fad3 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -11,5 +11,8 @@ add_mad_executable(testpg testpg.cc MADchem) add_mad_executable(testperiodicdft testperiodicdft.cc MADchem) +add_scripted_tests(test_energy.py moldft "short;application") + + # removed mcpfit since it is likely only of historic interest install(TARGETS moldft DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/moldft/mad_moldft_test_energy.py.calc_info.ref.json b/src/apps/moldft/mad_moldft_test_energy.py.calc_info.ref.json new file mode 100644 index 00000000000..d1e6e1f8147 --- /dev/null +++ b/src/apps/moldft/mad_moldft_test_energy.py.calc_info.ref.json @@ -0,0 +1,101 @@ +{ + "calcinfo_nalpha": 1, + "calcinfo_natom": 1, + "calcinfo_nbeta": 1, + "calcinfo_nmo": 2, + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 0.0001, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": -1, + "l": 50.0, + "lo": 0.013396, + "loadbalparts": 2, + "maxiter": 1, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 1, + "nbeta": 1, + "nio": 1, + "nmo_alpha": 1, + "nmo_beta": 1, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -2.861353410011521, + "scf_e_data": { + "e_coulomb": [ + 2.018645448166965, + 2.04048235799564 + ], + "e_kinetic": [ + 2.7628170728201096, + 2.8227846011865667 + ], + "e_local": [ + 0.0, + 0.0 + ], + "e_nrep": [ + 0.0, + 0.0 + ], + "e_nuclear": [ + -6.626451864301439, + -6.704379191630678 + ], + "e_pcm": [ + 0.0, + 0.0 + ], + "e_tot": [ + -2.8543126357346864, + -2.861353410011521 + ], + "e_xc": [ + -1.0093232924203221, + -1.0202411775630498 + ], + "iterations": 2 + }, + "scf_eigenvalues_a": { + "dims": [ + 1 + ], + "size": 1, + "vals": [ + -0.5563790539362039 + ] + }, + "time": "2023-01-13 23:48:06", + "wall_time": 1.9541189670562744 +} \ No newline at end of file diff --git a/src/apps/moldft/test_energy.py b/src/apps/moldft/test_energy.py new file mode 100755 index 00000000000..e97ceecb7b7 --- /dev/null +++ b/src/apps/moldft/test_energy.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") + + prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --input=input --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments='' + cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + print("finished with run") + print(p.stdout) + exitcode=p.returncode + print("exitcode ",exitcode) + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["return_energy"],1.e-4) + print("final success: ",cmp.success) + + sys.exit(p.returncode + exitcode) \ No newline at end of file diff --git a/src/apps/nemo/mad_nemo_test_energy.py.calc_info.ref.json b/src/apps/nemo/mad_nemo_test_energy.py.calc_info.ref.json new file mode 100644 index 00000000000..802ddfb9468 --- /dev/null +++ b/src/apps/nemo/mad_nemo_test_energy.py.calc_info.ref.json @@ -0,0 +1,77 @@ +{ + "calcinfo_nalpha": 1, + "calcinfo_natom": 1, + "calcinfo_nbeta": 1, + "calcinfo_nmo": 2, + "k": 6, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 0.0001, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": -1, + "l": 50.0, + "lo": 0.013396, + "loadbalparts": 2, + "maxiter": 1, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 1, + "nbeta": 1, + "nio": 1, + "nmo_alpha": 1, + "nmo_beta": 1, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": 0.0, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 1 + ], + "size": 1, + "vals": [ + -0.9223614119238541 + ] + }, + "time": "2023-01-13 23:53:59", + "wall_time": 1.3197541236877441 +} \ No newline at end of file diff --git a/src/apps/nemo/madtest1.scf_info.ref.json b/src/apps/nemo/madtest1.scf_info.ref.json deleted file mode 100644 index d2d89f7187d..00000000000 --- a/src/apps/nemo/madtest1.scf_info.ref.json +++ /dev/null @@ -1 +0,0 @@ -[{"scf_dipole_moment":{"dims":[3],"size":3,"vals":[-7.344069996440976e-12,-7.339122050401424e-12,-7.327683299149134e-12]},"scf_energy":0.0,"scf_iterations":0,"scf_k":6,"scf_threshold":0.0001},[{"scf_dipole_moment":{"dims":[3],"size":3,"vals":[-7.346708892628164e-12,-7.342900079858948e-12,-7.340962009652167e-12]},"scf_energy":0.0,"scf_iterations":0,"scf_k":6,"scf_threshold":0.0001}]] \ No newline at end of file diff --git a/src/apps/nemo/madtestboys.calc_info.ref.json b/src/apps/nemo/madtestboys.calc_info.ref.json new file mode 100644 index 00000000000..4900bcd04e4 --- /dev/null +++ b/src/apps/nemo/madtestboys.calc_info.ref.json @@ -0,0 +1,81 @@ +{ + "calcinfo_nalpha": 5, + "calcinfo_natom": 3, + "calcinfo_nbeta": 5, + "calcinfo_nmo": 10, + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 3e-05, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": 8, + "l": 51.427, + "lo": 0.001329, + "loadbalparts": 2, + "maxiter": 10, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 5, + "nbeta": 5, + "nio": 1, + "nmo_alpha": 5, + "nmo_beta": 5, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -76.06811421364738, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 5 + ], + "size": 5, + "vals": [ + -20.42914360751624, + -0.9328625128954031, + -0.9328626031474729, + -0.7250463973947698, + -0.7250475832515377 + ] + }, + "time": "2023-01-13 23:38:40", + "wall_time": 36.969685792922974 +} \ No newline at end of file diff --git a/src/apps/nemo/madtestboys.scf_info.ref.json b/src/apps/nemo/madtestboys.scf_info.ref.json deleted file mode 100644 index 6113cc622f3..00000000000 --- a/src/apps/nemo/madtestboys.scf_info.ref.json +++ /dev/null @@ -1 +0,0 @@ -[{"scf_dipole_moment":{"dims":[3],"size":3,"vals":[-2.0264160794481233e-09,-2.9052321837075474e-10,-0.7612897120815444]},"scf_energy":-76.06811421354803,"scf_iterations":0,"scf_k":8,"scf_threshold":3e-05}] \ No newline at end of file diff --git a/src/apps/nemo/madtestcanon.calc_info.ref.json b/src/apps/nemo/madtestcanon.calc_info.ref.json new file mode 100644 index 00000000000..60a39ad6e26 --- /dev/null +++ b/src/apps/nemo/madtestcanon.calc_info.ref.json @@ -0,0 +1,81 @@ +{ + "calcinfo_nalpha": 5, + "calcinfo_natom": 3, + "calcinfo_nbeta": 5, + "calcinfo_nmo": 10, + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 3e-05, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": 8, + "l": 51.427, + "lo": 0.001329, + "loadbalparts": 2, + "maxiter": 10, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 5, + "nbeta": 5, + "nio": 1, + "nmo_alpha": 5, + "nmo_beta": 5, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -76.06814005437352, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 5 + ], + "size": 5, + "vals": [ + -20.560378267443163, + -1.3591598586766904, + -0.7301960973271303, + -0.583960354369421, + -0.5112020665001267 + ] + }, + "time": "2023-01-13 23:11:39", + "wall_time": 36.42744588851929 +} \ No newline at end of file diff --git a/src/apps/nemo/madtestcanon.scf_info.ref.json b/src/apps/nemo/madtestcanon.scf_info.ref.json deleted file mode 100644 index 57448464516..00000000000 --- a/src/apps/nemo/madtestcanon.scf_info.ref.json +++ /dev/null @@ -1 +0,0 @@ -[{"scf_dipole_moment":{"dims":[3],"size":3,"vals":[5.860629285294338e-12,4.614213293479703e-14,-0.7610909290281024]},"scf_energy":-76.06814005437353,"scf_iterations":0,"scf_k":8,"scf_threshold":3e-05}] \ No newline at end of file diff --git a/src/apps/nemo/madtestnew.calc_info.ref.json b/src/apps/nemo/madtestnew.calc_info.ref.json new file mode 100644 index 00000000000..1cd539e54a9 --- /dev/null +++ b/src/apps/nemo/madtestnew.calc_info.ref.json @@ -0,0 +1,81 @@ +{ + "calcinfo_nalpha": 5, + "calcinfo_natom": 3, + "calcinfo_nbeta": 5, + "calcinfo_nmo": 10, + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 3e-05, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": 8, + "l": 51.427, + "lo": 0.001329, + "loadbalparts": 2, + "maxiter": 10, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 5, + "nbeta": 5, + "nio": 1, + "nmo_alpha": 5, + "nmo_beta": 5, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -76.06812003941299, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 5 + ], + "size": 5, + "vals": [ + -20.555091938356124, + -1.0138119526770761, + -1.0138119491001942, + -0.6509448389458057, + -0.5112164209299839 + ] + }, + "time": "2023-01-13 23:42:17", + "wall_time": 36.584208965301514 +} \ No newline at end of file diff --git a/src/apps/nemo/madtestnew.scf_info.ref.json b/src/apps/nemo/madtestnew.scf_info.ref.json deleted file mode 100644 index fb51a0d03eb..00000000000 --- a/src/apps/nemo/madtestnew.scf_info.ref.json +++ /dev/null @@ -1 +0,0 @@ -[{"scf_dipole_moment":{"dims":[3],"size":3,"vals":[1.0102442294823572e-07,9.229512254386729e-11,-0.761167512830669]},"scf_energy":-76.06812003941296,"scf_iterations":0,"scf_k":8,"scf_threshold":3e-05}] \ No newline at end of file diff --git a/src/apps/nemo/test_energy.py b/src/apps/nemo/test_energy.py index 1c48348dc5a..e97ceecb7b7 100755 --- a/src/apps/nemo/test_energy.py +++ b/src/apps/nemo/test_energy.py @@ -2,41 +2,34 @@ import sys import subprocess -import argparse - sys.path.append("@CMAKE_SOURCE_DIR@/bin") from madjsoncompare import madjsoncompare if __name__ == "__main__": - # get command line arguments - parser=argparse.ArgumentParser(description='command line arguments for this test case') - # default value will be set by cmake - parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") - args=parser.parse_args() - # some user output - print("Testing nemo/test_localization") - print(" reference files found in directory:",args.reference_directory) + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") - prefix='madtest1' - outputfile=prefix+'.scf_info.json' - referencefile=args.reference_directory+"/"+prefix+".scf_info.ref.json" + prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - cmd='rm '+outputfile+'; nemo --input=input --geometry=he --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + global_arguments=' --input=input --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments='' + cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,capture_output=True, text=True) print("finished with run") + print(p.stdout) + exitcode=p.returncode + print("exitcode ",exitcode) # compare results cmp=madjsoncompare(outputfile,referencefile) - cmp.compare([0,"scf_k"],1.e-4) - cmp.compare([0,"scf_threshold"],1.e-4) - cmp.compare([0,"scf_energy"],1.e-2) - cmp.compare([0,"scf_energy"],1.e-4) - cmp.compare([0,"scf_dipole_moment","dims"],1.e-4) - cmp.compare([0,"scf_dipole_moment","vals",0],1.e-4) + cmp.compare(["return_energy"],1.e-4) print("final success: ",cmp.success) - sys.exit(cmp.exitcode()) \ No newline at end of file + sys.exit(p.returncode + exitcode) \ No newline at end of file diff --git a/src/apps/nemo/test_localization.py b/src/apps/nemo/test_localization.py index 4a08313c23f..f8355ac3223 100755 --- a/src/apps/nemo/test_localization.py +++ b/src/apps/nemo/test_localization.py @@ -2,7 +2,6 @@ import sys import subprocess -import argparse sys.path.append("@CMAKE_SOURCE_DIR@/bin") from madjsoncompare import madjsoncompare @@ -11,10 +10,10 @@ def localizer_run(localizer): prefix='madtest'+localizer - outputfile=prefix+'.scf_info.json' - refdir=args.reference_directory - referencefile=refdir+"/"+prefix+".scf_info.ref.json" + # prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" cmd='rm '+outputfile+'; nemo --input=input --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' @@ -23,24 +22,16 @@ def localizer_run(localizer): print("finished with run1") cmp=madjsoncompare(outputfile,referencefile) - cmp.compare([0,"scf_k"],1.e-4) - cmp.compare([0,"scf_threshold"],1.e-4) - cmp.compare([0,"scf_energy"],1.e-2) - cmp.compare([0,"scf_energy"],1.e-4) - cmp.compare([0,"scf_dipole_moment","dims"],1.e-4) - cmp.compare([0,"scf_dipole_moment","vals",0],1.e-4) + cmp.compare(["return_energy"],1.e-4) return cmp.success if __name__ == "__main__": - parser=argparse.ArgumentParser(description='command line arguments for this test case') - # default value will be set by cmake - parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") - args=parser.parse_args() + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") - print("Testing nemo/test_localization") - print(" reference files found in directory:",args.reference_directory) success=localizer_run('canon') success=localizer_run('boys') and success success=localizer_run('new') and success diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index df92af41627..c4fa21e90e7 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -168,7 +168,8 @@ void SCF::output_calc_info_schema() const { param.to_json(j); e_data.to_json(j); - output_schema(param.prefix()+".calc_info", j); +// output_schema(param.prefix()+".calc_info", j); + update_schema(param.prefix()+".calc_info", j); } void scf_data::add_data(std::map values) { diff --git a/src/madness/chem/TDHF.cc b/src/madness/chem/TDHF.cc index db9ddfca0d7..66b834aee34 100644 --- a/src/madness/chem/TDHF.cc +++ b/src/madness/chem/TDHF.cc @@ -1525,10 +1525,12 @@ void TDHF::analyze(const std::vector &x) const { j.back()["oscillator_strength_length"]=osl; j.back()["oscillator_strength_velocity"]=osv; } + nlohmann::json j1; j1["cis_excitations"]=j; update_schema(get_calc()->param.prefix()+".calc_info", j1); + // compute the transition densities const vector_real_function_3d bra_oct = get_active_mo_bra(); for (std::size_t i = 0; i < x.size(); ++i) { From a382ba08e86baee6d8b0a4e12302ae00b28cf394 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Sat, 14 Jan 2023 16:54:03 -0500 Subject: [PATCH 0612/1312] BinaryFstreamInputArchive(std:string fname,...) truncated file --- src/madness/world/binary_fstream_archive.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/world/binary_fstream_archive.h b/src/madness/world/binary_fstream_archive.h index 134ca633f78..890d1b1bedf 100644 --- a/src/madness/world/binary_fstream_archive.h +++ b/src/madness/world/binary_fstream_archive.h @@ -123,7 +123,7 @@ namespace madness { /// \param[in] mode I/O attributes for opening the file. BinaryFstreamInputArchive(const std::string name, std::ios_base::openmode mode = std::ios_base::binary | \ - std::ios_base::out | std::ios_base::trunc) + std::ios_base::in) : BinaryFstreamInputArchive(name.c_str(),mode) {} /// Load from the filestream. From d96fd3135ca2c48acdd479c9406c221a8ce34595 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 17 Jan 2023 15:13:21 -0500 Subject: [PATCH 0613/1312] Convergence Criteria based on relative residual --- src/apps/molresponse/FrequencyResponse.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2dc1c27a957..07d6dd32527 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,11 +26,12 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow = 0.59636157; - const double b_pow = 0.16174869; + const double a_pow = 0.790; + const double b_pow = 0.678; const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); + Tensor bsh_relative_residualsX((int(m))); Tensor density_residuals((int(m))); bool static_res = (omega == 0.0); @@ -119,7 +120,11 @@ void FrequencyResponse::iterate(World &world) { double d_residual = density_residuals.max(); auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.X.norm2(); auto rho_norms = norm2s_T(world, rho_omega); + std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), + chi_norms.ptr(), bsh_relative_residualsX.ptr(), + [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); + auto max_relative_bsh = bsh_relative_residualsX.absmax(); max_rotation = 1.0 * max_bsh; Tensor polar; if (compute_y) { @@ -148,6 +153,7 @@ void FrequencyResponse::iterate(World &world) { print("density target : ", density_target); print("d_residual_max target : ", density_target); print("bsh_residual_max : ", max_bsh); + print("bsh_relative_residual_max : ", max_relative_bsh); print("bsh abs target : ", bsh_abs_target); } } @@ -270,7 +276,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator X_space lambda_X = X_space(world, chi.num_states(), chi.num_orbitals()); X_space theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); // We are going to build lambda and theta from individual components - // Just compute theta x and lambda x compoenents here + // Just compute theta x and lambda x components here if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_y); if (r_params.print_level() >= 1) { From 82873352399f186211aea978470188d9b0a3eef8 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Tue, 17 Jan 2023 21:55:28 +0100 Subject: [PATCH 0614/1312] user awareness for the input file --- src/apps/cis/test_callable.py | 2 +- src/apps/cis/test_energy_he.py | 2 +- src/apps/cis/test_symmetry_h2o.py | 2 +- src/apps/moldft/test_energy.py | 2 +- src/apps/nemo/test_energy.py | 2 +- src/apps/nemo/test_localization.py | 2 +- src/madness/chem/QCCalculationParametersBase.cc | 12 ++++++++++++ src/madness/chem/QCCalculationParametersBase.h | 12 +++++++++++- src/madness/chem/commandlineparser.h | 4 +++- 9 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/apps/cis/test_callable.py b/src/apps/cis/test_callable.py index 7dd7e50780a..f579373eeac 100755 --- a/src/apps/cis/test_callable.py +++ b/src/apps/cis/test_callable.py @@ -16,7 +16,7 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --input=input --geometry=he' + global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; excitations=0"' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py index 7c9a4fa9415..3ab9fde2827 100755 --- a/src/apps/cis/test_energy_he.py +++ b/src/apps/cis/test_energy_he.py @@ -16,7 +16,7 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --input=input --geometry=he' + global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; guess_excitations=2; excitations=2"' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments diff --git a/src/apps/cis/test_symmetry_h2o.py b/src/apps/cis/test_symmetry_h2o.py index 0bd15b0c009..3a911efb74b 100755 --- a/src/apps/cis/test_symmetry_h2o.py +++ b/src/apps/cis/test_symmetry_h2o.py @@ -16,7 +16,7 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --input=input --geometry=h2o' + global_arguments=' --geometry=h2o' dft_arguments=' --dft="k=8; localize=canon; prefix='+prefix+'"' other_arguments=' --response="freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' cmd='rm '+outputfile+'; cis '+global_arguments + dft_arguments + other_arguments diff --git a/src/apps/moldft/test_energy.py b/src/apps/moldft/test_energy.py index e97ceecb7b7..a75594ecaff 100755 --- a/src/apps/moldft/test_energy.py +++ b/src/apps/moldft/test_energy.py @@ -16,7 +16,7 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --input=input --geometry=he' + global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments='' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments diff --git a/src/apps/nemo/test_energy.py b/src/apps/nemo/test_energy.py index e97ceecb7b7..d5ef87344db 100755 --- a/src/apps/nemo/test_energy.py +++ b/src/apps/nemo/test_energy.py @@ -16,7 +16,7 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --input=input --geometry=he' + global_arguments='--geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments='' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments diff --git a/src/apps/nemo/test_localization.py b/src/apps/nemo/test_localization.py index f8355ac3223..51b7f916895 100755 --- a/src/apps/nemo/test_localization.py +++ b/src/apps/nemo/test_localization.py @@ -16,7 +16,7 @@ def localizer_run(localizer): referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" - cmd='rm '+outputfile+'; nemo --input=input --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' + cmd='rm '+outputfile+'; nemo --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' print("executing \n ",cmd) output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout print("finished with run1") diff --git a/src/madness/chem/QCCalculationParametersBase.cc b/src/madness/chem/QCCalculationParametersBase.cc index f1856f21e72..505b60b3554 100644 --- a/src/madness/chem/QCCalculationParametersBase.cc +++ b/src/madness/chem/QCCalculationParametersBase.cc @@ -47,6 +47,18 @@ std::string QCCalculationParametersBase::print_to_string(bool non_defaults_only) return ss.str(); } + +bool QCCalculationParametersBase::file_exists(World& world, std::string filename) const { + bool file_exists = false; + if (world.rank() == 0) { + std::ifstream ifs(filename); + if (not ifs.is_open()) file_exists=false; + ifs.close(); + } + world.gop.broadcast_serializable(file_exists, 0); + return file_exists; +} + /// read the parameters from file and broadcast void QCCalculationParametersBase::read_input(World& world, const std::string filename, const std::string tag) { diff --git a/src/madness/chem/QCCalculationParametersBase.h b/src/madness/chem/QCCalculationParametersBase.h index 0a0b50c580a..f560c499b98 100644 --- a/src/madness/chem/QCCalculationParametersBase.h +++ b/src/madness/chem/QCCalculationParametersBase.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -293,7 +294,14 @@ class QCCalculationParametersBase { const commandlineparser& parser, const std::string tag) { try { - read_input(world,parser.value("input"),tag); + // check that user-defined input files actually exist + bool file_ok=true; + if (parser.key_exists("user_defined_input_file")) file_ok=file_exists(world,parser.value("input")); + if (file_ok) read_input(world,parser.value("input"),tag); + else { + std::string msg="could not find user-defined input file: "+parser.value("input")+"\n"; + throw std::invalid_argument(msg); + } } catch (std::invalid_argument& e) { throw; } catch (std::exception& e) { @@ -311,6 +319,8 @@ class QCCalculationParametersBase { void read_commandline_options(World& world, const commandlineparser& parser, const std::string tag); + bool file_exists(World& world, std::string filename) const; + protected: bool print_debug=false; diff --git a/src/madness/chem/commandlineparser.h b/src/madness/chem/commandlineparser.h index e9f32836671..d1d1c5b42f0 100644 --- a/src/madness/chem/commandlineparser.h +++ b/src/madness/chem/commandlineparser.h @@ -25,6 +25,7 @@ struct commandlineparser { commandlineparser(int argc, char **argv) { set_defaults(); std::vector allArgs_raw(argv, argv + argc); + allArgs_raw.erase(allArgs_raw.begin()); // first argument is the name of the binary for (auto &a : allArgs_raw) { // special treatment for the input file: no hyphens a=check_for_input_file(a); @@ -34,6 +35,7 @@ struct commandlineparser { std::stringstream sa(a); sa >> key; val=a.substr(key.size()); + if (key=="input") set_keyval("user_defined_input_file","1"); set_keyval(key,val); } } @@ -65,7 +67,7 @@ struct commandlineparser { public: - /// special option: the input file has no hyphens in front + /// special option: the input file has no hyphens in front and is just a value std::string check_for_input_file(std::string line) { if (line[0]=='-') return line; auto words=split(line,"="); From ae7f6034d098c7a429c08bfd6c0897283e7e1662 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 17 Jan 2023 16:43:24 -0500 Subject: [PATCH 0615/1312] loosen a bit --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 07d6dd32527..ed428a53e56 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow = 0.790; - const double b_pow = 0.678; + const double a_pow = 0.649; + const double b_pow = 0.533; const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); From bf5625224152858118fd8987bb843d909c6949ba Mon Sep 17 00:00:00 2001 From: fbischoff Date: Thu, 19 Jan 2023 23:14:10 +0100 Subject: [PATCH 0616/1312] adding test for oep --- src/apps/oep/CMakeLists.txt | 1 + src/apps/oep/madtest1.oep_calc_info.ref.json | 17 ++++++++ src/apps/oep/test_energy.py | 42 ++++++++++++++++++++ src/madness/chem/oep.cc | 9 +++++ src/madness/chem/oep.h | 5 +++ 5 files changed, 74 insertions(+) create mode 100644 src/apps/oep/madtest1.oep_calc_info.ref.json create mode 100755 src/apps/oep/test_energy.py diff --git a/src/apps/oep/CMakeLists.txt b/src/apps/oep/CMakeLists.txt index a05b36544f5..a795fe3e97c 100644 --- a/src/apps/oep/CMakeLists.txt +++ b/src/apps/oep/CMakeLists.txt @@ -2,5 +2,6 @@ add_mad_executable(oep oep.cc "MADchem") add_dependencies(applications-madness oep) +add_scripted_tests(test_energy.py oep "medium;application") install(TARGETS oep DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/oep/madtest1.oep_calc_info.ref.json b/src/apps/oep/madtest1.oep_calc_info.ref.json new file mode 100644 index 00000000000..b31a3c5697a --- /dev/null +++ b/src/apps/oep/madtest1.oep_calc_info.ref.json @@ -0,0 +1,17 @@ +{ + "driver": "energy", + "model": "oaep", + "return_energy": -14.560947429075917, + "scf_eigenvalues_a": { + "dims": [ + 2 + ], + "size": 2, + "vals": [ + -4.621452195055882, + -0.3231970029561877 + ] + }, + "time": "2023-01-19 23:04:05", + "wall_time": 15.210686922073364 +} \ No newline at end of file diff --git a/src/apps/oep/test_energy.py b/src/apps/oep/test_energy.py new file mode 100755 index 00000000000..e7698cd1490 --- /dev/null +++ b/src/apps/oep/test_energy.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +import argparse + +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # get command line arguments + parser=argparse.ArgumentParser(description='command line arguments for this test case') + # default value will be set by cmake + parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") + args=parser.parse_args() + + # some user output + print("Testing nemo/test_localization") + print(" reference files found in directory:",args.reference_directory) + + prefix='madtest1' + outputfile=prefix+'.oep_calc_info.json' + referencefile=args.reference_directory+"/"+prefix+".oep_calc_info.ref.json" + + # run test + global_arguments=' --geometry=be' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments=' --oep="model=oaep"' + cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + print("finished with run") + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["driver"],1.e-4) + cmp.compare(["model"],1.e-4) + cmp.compare(["return_energy"],1.e-2) + print("final success: ",cmp.success) + + sys.exit(cmp.exitcode()) \ No newline at end of file diff --git a/src/madness/chem/oep.cc b/src/madness/chem/oep.cc index bbb7b4599ed..6a962900ccc 100644 --- a/src/madness/chem/oep.cc +++ b/src/madness/chem/oep.cc @@ -55,6 +55,15 @@ double OEP::solve(const vecfuncT& HF_nemo1) { return energy; } +void OEP::output_calc_info_schema(const double& energy) const { + nlohmann::json j; + j["scf_eigenvalues_a"]=tensor_to_json(calc->aeps); + j["model"]=oep_param.model().back(); + j["driver"]="energy"; + j["return_energy"]=energy; + update_schema(param.prefix()+".oep_calc_info", j); +} + void OEP::analyze() { set_protocol(param.econv()); Tensor Fock; diff --git a/src/madness/chem/oep.h b/src/madness/chem/oep.h index 6fed44e5d62..025798022e2 100644 --- a/src/madness/chem/oep.h +++ b/src/madness/chem/oep.h @@ -200,6 +200,10 @@ class OEP : public Nemo { return value(calc->molecule.get_all_coords()); } + /// update the json file with calculation input and output + void output_calc_info_schema(const double& energy) const; + + virtual double value(const Tensor& x) { reference->value(); set_protocol(param.econv()); @@ -210,6 +214,7 @@ class OEP : public Nemo { if (load_mos) load_restartdata(fock); if (not oep_param.no_compute()) energy=solve(reference->get_calc()->get_amo()); + output_calc_info_schema(energy); return energy; }; From cc4a9904c6448000dba5fa6c5af3e44c9eec4c8e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 19 Jan 2023 17:46:06 -0500 Subject: [PATCH 0617/1312] output scf calc info for dipole --- src/apps/molresponse/testing/runners.hpp | 9 ++++++++- src/madness/chem/SCF.cc | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 1527731a6e4..65e4099bf96 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -441,7 +441,14 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! world.gop.fence(); - if (world.rank() == 0) { ME.output_calc_info_schema(); } + const real_function_3d rho = 2.0 * calc.make_density(world, calc.aocc, calc.amo); + auto dipole_t = calc.dipole(world, rho); + std::map results; + results["scf_energy"] = calc.current_energy; + if (world.rank() == 0) { + calc.output_scf_info_schema(0, results, dipole_t); + ME.output_calc_info_schema(); + } } else { if (world.rank() == 0) { print("Skipping Calculation and printing CALC INFO"); diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 39a863cf804..cff02a6f203 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -140,7 +140,6 @@ tensorT Q2(const tensorT& s) { return Q; } -}// namespace madness void SCF::output_scf_info_schema(const int &iter, const std::map &vals, const tensorT &dipole_T) const { From 07eb507c4cf07bf7ebb0f61e74e9eda509db1fe8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 19 Jan 2023 17:54:34 -0500 Subject: [PATCH 0618/1312] some how i deleted a brace --- src/madness/chem/SCF.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index cff02a6f203..39a863cf804 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -140,6 +140,7 @@ tensorT Q2(const tensorT& s) { return Q; } +}// namespace madness void SCF::output_scf_info_schema(const int &iter, const std::map &vals, const tensorT &dipole_T) const { From c8c4ff178591ce5e9fda6a93b9788e4f500141f1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 19 Jan 2023 17:59:56 -0500 Subject: [PATCH 0619/1312] format scf json --- src/madness/chem/SCF.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 39a863cf804..3a76cdf6eca 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -149,7 +149,7 @@ SCF::output_scf_info_schema(const int &iter, const std::map // TODO (Adrian) possibly read in json from filesystem. // if it exists figure out the size. pushback for each protocol j[0]["scf_iterations"] = iter; - const double thresh = FunctionDefaults<3>::get_thresh(); + const double thresh = FunctionDefaults<4>::get_thresh(); const int k = FunctionDefaults<3>::get_k(); j[0]["scf_threshold"] = thresh; j[0]["scf_k"] = k; @@ -173,7 +173,7 @@ SCF::output_scf_info_schema(const int &iter, const std::map j = j_old; }; std::ofstream ofs(save); - ofs << j; + ofs << std::setw(4) << j; } void scf_data::add_data(std::map values) { From c4244f9e091e9159bad74fb717122ee37e566110 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 20 Jan 2023 22:11:12 +0100 Subject: [PATCH 0620/1312] adding test for znemo --- src/apps/oep/test_energy.py | 2 +- src/apps/znemo/CMakeLists.txt | 1 + src/apps/znemo/madtest1.calc_info.ref.json | 30 ++++++++++++++++ src/apps/znemo/test_energy.py | 42 ++++++++++++++++++++++ src/madness/chem/znemo.cc | 12 +++++++ src/madness/chem/znemo.h | 2 ++ 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 src/apps/znemo/madtest1.calc_info.ref.json create mode 100755 src/apps/znemo/test_energy.py diff --git a/src/apps/oep/test_energy.py b/src/apps/oep/test_energy.py index e7698cd1490..dc5cd5b8c34 100755 --- a/src/apps/oep/test_energy.py +++ b/src/apps/oep/test_energy.py @@ -16,7 +16,7 @@ args=parser.parse_args() # some user output - print("Testing nemo/test_localization") + print("Testing @BINARY@/@TESTCASE") print(" reference files found in directory:",args.reference_directory) prefix='madtest1' diff --git a/src/apps/znemo/CMakeLists.txt b/src/apps/znemo/CMakeLists.txt index e4f7e3f94ad..5c5fb99b413 100644 --- a/src/apps/znemo/CMakeLists.txt +++ b/src/apps/znemo/CMakeLists.txt @@ -2,6 +2,7 @@ add_mad_executable(znemo znemo.cc "MADchem") add_dependencies(applications-madness znemo) +add_scripted_tests(test_energy.py znemo "medium;application") install(TARGETS znemo DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/znemo/madtest1.calc_info.ref.json b/src/apps/znemo/madtest1.calc_info.ref.json new file mode 100644 index 00000000000..2cd7eaf7d8c --- /dev/null +++ b/src/apps/znemo/madtest1.calc_info.ref.json @@ -0,0 +1,30 @@ +{ + "B": [ + 0.0, + 0.0, + -1.0 + ], + "driver": "energy", + "model": "UHF", + "return_energy": -2.650585260662382, + "scf_eigenvalues_a": { + "dims": [ + 1 + ], + "size": 1, + "vals": [ + -1.2986452521862109 + ] + }, + "scf_eigenvalues_b": { + "dims": [ + 1 + ], + "size": 1, + "vals": [ + -0.19209963781869333 + ] + }, + "time": "2023-01-20 22:08:20", + "wall_time": 13.83008599281311 +} \ No newline at end of file diff --git a/src/apps/znemo/test_energy.py b/src/apps/znemo/test_energy.py new file mode 100755 index 00000000000..f2a50fffe26 --- /dev/null +++ b/src/apps/znemo/test_energy.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +import argparse + +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # get command line arguments + parser=argparse.ArgumentParser(description='command line arguments for this test case') + # default value will be set by cmake + parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") + args=parser.parse_args() + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory:",args.reference_directory) + + prefix='madtest1' + outputfile=prefix+'.calc_info.json' + referencefile=args.reference_directory+"/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments=' --complex="physical_B=-1.0" --geometry="no_orient=true; source_name=he"' + cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + print("finished with run") + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["driver"],1.e-4) + cmp.compare(["model"],1.e-4) + cmp.compare(["return_energy"],1.e-2) + print("final success: ",cmp.success) + + sys.exit(cmp.exitcode()) \ No newline at end of file diff --git a/src/madness/chem/znemo.cc b/src/madness/chem/znemo.cc index 15a8462242e..3d20d58fcb8 100644 --- a/src/madness/chem/znemo.cc +++ b/src/madness/chem/znemo.cc @@ -163,10 +163,22 @@ double Znemo::value(const Tensor& x) { save_orbitals(); double energy=analyze(); + output_calc_info_schema(energy); return energy; } +void Znemo::output_calc_info_schema(const double& energy) const { + nlohmann::json j; + j["scf_eigenvalues_a"]=tensor_to_json(aeps); + j["scf_eigenvalues_b"]=tensor_to_json(beps); + j["model"]="UHF"; + j["B"]=this->B; + j["driver"]="energy"; + j["return_energy"]=energy; + update_schema(cparam.prefix()+".calc_info", j); +} + Tensor Znemo::gradient(const Tensor& x) { MADNESS_ASSERT(param.explicit_B()==0.0); diff --git a/src/madness/chem/znemo.h b/src/madness/chem/znemo.h index 0673d3f7242..a1134e08421 100644 --- a/src/madness/chem/znemo.h +++ b/src/madness/chem/znemo.h @@ -177,6 +177,8 @@ class Znemo : public NemoBase, public QCPropertyInterface { /// compute the molecular energy double value(const Tensor& x) override; + void output_calc_info_schema(const double& energy) const; + std::string name() const override {return "znemo";}; bool selftest() override { From 01583f07659d0d40f3a184d66d2f08ff09db2e7b Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sat, 21 Jan 2023 23:04:12 +0100 Subject: [PATCH 0621/1312] adding test for cc2 --- src/apps/cc2/CMakeLists.txt | 3 +++ src/apps/cc2/test_callable.py | 46 +++++++++++++++++++++++++++++++++++ src/apps/znemo/CMakeLists.txt | 5 +++- src/madness/chem/CC2.cc | 11 +++++++++ src/madness/chem/CC2.h | 3 +++ 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100755 src/apps/cc2/test_callable.py diff --git a/src/apps/cc2/CMakeLists.txt b/src/apps/cc2/CMakeLists.txt index 83135e51dc2..050195bacdb 100644 --- a/src/apps/cc2/CMakeLists.txt +++ b/src/apps/cc2/CMakeLists.txt @@ -3,5 +3,8 @@ add_mad_executable(cc2 cc2.cc "MADchem") add_dependencies(applications-madness cc2) +if (ENABLE_GENTENSOR) + add_scripted_tests(test_callable.py cc2 "short;application") # runs he with one frozen orbital.. +endif() install(TARGETS cc2 DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/cc2/test_callable.py b/src/apps/cc2/test_callable.py new file mode 100755 index 00000000000..c735d11a09f --- /dev/null +++ b/src/apps/cc2/test_callable.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +import argparse + +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # get command line arguments + parser=argparse.ArgumentParser(description='command line arguments for this test case') + # default value will be set by cmake + parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") + args=parser.parse_args() + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory:",args.reference_directory) + + prefix='madtest1' + outputfile=prefix+'.calc_info.json' + referencefile=args.reference_directory+"/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'; k=5"' + other_arguments=' --cc2="freeze 1"' + cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + print("finished with run") + print(p.stdout) + exitcode=p.returncode + print("exitcode ",exitcode) + + + # # compare results + # cmp=madjsoncompare(outputfile,referencefile) + # cmp.compare(["driver"],1.e-4) + # cmp.compare(["model"],1.e-4) + # cmp.compare(["return_energy"],1.e-2) + # print("final success: ",cmp.success) + + # sys.exit(cmp.exitcode()) \ No newline at end of file diff --git a/src/apps/znemo/CMakeLists.txt b/src/apps/znemo/CMakeLists.txt index 5c5fb99b413..9a5a1789fa6 100644 --- a/src/apps/znemo/CMakeLists.txt +++ b/src/apps/znemo/CMakeLists.txt @@ -2,7 +2,10 @@ add_mad_executable(znemo znemo.cc "MADchem") add_dependencies(applications-madness znemo) -add_scripted_tests(test_energy.py znemo "medium;application") + +if (!ENABLE_GENTENSOR) + add_scripted_tests(test_energy.py znemo "medium;application") +endif() install(TARGETS znemo DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/madness/chem/CC2.cc b/src/madness/chem/CC2.cc index 14bd7d8fd82..4cb980becfe 100644 --- a/src/madness/chem/CC2.cc +++ b/src/madness/chem/CC2.cc @@ -55,6 +55,7 @@ CC2::solve() { //DEBUG MP2 coupled const double mp2_correlation_energy = solve_mp2_coupled(pairs); + output_calc_info_schema("mp2",mp2_correlation_energy); output.section(assign_name(ctype) + " Calculation Ended !"); if (world.rank() == 0) @@ -399,6 +400,16 @@ CC2::solve() { } +void CC2::output_calc_info_schema(const std::string model, const double& energy) const { + nlohmann::json j; + j["model"]=model; + j["driver"]="energy"; + j["return_energy"]=energy; + j["mp2_correlation_energy"]=energy; + update_schema(nemo->get_param().prefix()+".calc_info", j); +} + + bool CC2::check_core_valence_separation() const { MolecularOrbitals mos(nemo->get_calc()->amo, nemo->get_calc()->aeps, {}, nemo->get_calc()->aocc, {}); diff --git a/src/madness/chem/CC2.h b/src/madness/chem/CC2.h index a979262cc74..620d64d79eb 100644 --- a/src/madness/chem/CC2.h +++ b/src/madness/chem/CC2.h @@ -82,6 +82,9 @@ class CC2 : public OptimizationTargetInterface, public QCPropertyInterface { return 0.0; } + void output_calc_info_schema(const std::string model, const double& energy) const; + + std::string name() const {return "CC2";}; static void help() { From 5543a793ac1cc40d7d3344e1b1f9c41c5cf1881f Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sat, 21 Jan 2023 23:38:09 +0100 Subject: [PATCH 0622/1312] adding test for mp2 --- src/apps/mp2/CMakeLists.txt | 5 +++++ src/apps/mp2/test_callable.py | 36 +++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100755 src/apps/mp2/test_callable.py diff --git a/src/apps/mp2/CMakeLists.txt b/src/apps/mp2/CMakeLists.txt index bf4e2eca397..25c571c78c4 100644 --- a/src/apps/mp2/CMakeLists.txt +++ b/src/apps/mp2/CMakeLists.txt @@ -3,4 +3,9 @@ add_mad_executable(mp2 mp2.cc "MADchem") add_dependencies(applications-madness mp2) +if (ENABLE_GENTENSOR) + add_scripted_tests(test_callable.py mp2 "short;application") +endif() + + install(TARGETS mp2 DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/mp2/test_callable.py b/src/apps/mp2/test_callable.py new file mode 100755 index 00000000000..ca5ca8f800b --- /dev/null +++ b/src/apps/mp2/test_callable.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +import argparse + +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # get command line arguments + parser=argparse.ArgumentParser(description='command line arguments for this test case') + # default value will be set by cmake + parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") + args=parser.parse_args() + + # some user output + print("Testing nemo/test_localization") + print(" reference files found in directory:",args.reference_directory) + + prefix='madtest1' + outputfile=prefix+'.scf_info.json' + referencefile=args.reference_directory+"/"+prefix+".scf_info.ref.json" + + # run test + global_arguments=' --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'; k=5"' + other_arguments=' --mp2="freeze 1"' + cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + print("finished with run") + print(p.stdout) + exitcode=p.returncode + print("exitcode ",exitcode) \ No newline at end of file From bf29139725d7acb6b6aa4987ac32ff4a57826d95 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sat, 21 Jan 2023 23:48:05 +0100 Subject: [PATCH 0623/1312] fix for znemo test --- src/apps/znemo/CMakeLists.txt | 2 +- src/apps/znemo/madtest1.calc_info.ref.json | 10 +++++----- src/apps/znemo/test_energy.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/apps/znemo/CMakeLists.txt b/src/apps/znemo/CMakeLists.txt index 9a5a1789fa6..5828a1e968f 100644 --- a/src/apps/znemo/CMakeLists.txt +++ b/src/apps/znemo/CMakeLists.txt @@ -3,7 +3,7 @@ add_mad_executable(znemo znemo.cc "MADchem") add_dependencies(applications-madness znemo) -if (!ENABLE_GENTENSOR) +if (NOT ENABLE_GENTENSOR) add_scripted_tests(test_energy.py znemo "medium;application") endif() diff --git a/src/apps/znemo/madtest1.calc_info.ref.json b/src/apps/znemo/madtest1.calc_info.ref.json index 2cd7eaf7d8c..6345fa61801 100644 --- a/src/apps/znemo/madtest1.calc_info.ref.json +++ b/src/apps/znemo/madtest1.calc_info.ref.json @@ -6,14 +6,14 @@ ], "driver": "energy", "model": "UHF", - "return_energy": -2.650585260662382, + "return_energy": -2.6727709985264108, "scf_eigenvalues_a": { "dims": [ 1 ], "size": 1, "vals": [ - -1.2986452521862109 + -1.1967516543545087 ] }, "scf_eigenvalues_b": { @@ -22,9 +22,9 @@ ], "size": 1, "vals": [ - -0.19209963781869333 + -0.14163878297274543 ] }, - "time": "2023-01-20 22:08:20", - "wall_time": 13.83008599281311 + "time": "2023-01-21 23:49:19", + "wall_time": 14.747344970703125 } \ No newline at end of file diff --git a/src/apps/znemo/test_energy.py b/src/apps/znemo/test_energy.py index f2a50fffe26..6fc79644371 100755 --- a/src/apps/znemo/test_energy.py +++ b/src/apps/znemo/test_energy.py @@ -27,7 +27,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --complex="physical_B=-1.0" --geometry="no_orient=true; source_name=he"' - cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+' reference.00000 restartaodata; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout print("finished with run") From 4ccd0b56b53af3388bdd84e189dfebfdbadd6fe1 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 11 Jan 2023 10:52:03 +0100 Subject: [PATCH 0624/1312] fit for older python version?? --- src/apps/cc2/test_callable.py | 4 +++- src/apps/cis/test_callable.py | 3 ++- src/apps/cis/test_energy_he.py | 6 ++++-- src/apps/cis/test_symmetry_h2o.py | 5 +++-- src/apps/moldft/test_energy.py | 4 +++- src/apps/mp2/test_callable.py | 3 ++- src/apps/nemo/test_energy.py | 3 ++- src/apps/nemo/test_localization.py | 4 +++- src/apps/oep/test_energy.py | 4 +++- src/apps/znemo/test_energy.py | 3 ++- 10 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/apps/cc2/test_callable.py b/src/apps/cc2/test_callable.py index c735d11a09f..ccc5164d082 100755 --- a/src/apps/cc2/test_callable.py +++ b/src/apps/cc2/test_callable.py @@ -29,7 +29,9 @@ other_arguments=' --cc2="freeze 1"' cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - p=subprocess.run(cmd,shell=True,capture_output=True, text=True) +# p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") print(p.stdout) exitcode=p.returncode diff --git a/src/apps/cis/test_callable.py b/src/apps/cis/test_callable.py index f579373eeac..358799c6e74 100755 --- a/src/apps/cis/test_callable.py +++ b/src/apps/cis/test_callable.py @@ -21,7 +21,8 @@ other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; excitations=0"' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - p=subprocess.run(cmd,shell=True,capture_output=True, text=True) +# p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") print(p.stdout) exitcode=p.returncode diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py index 3ab9fde2827..4ed41252a8d 100755 --- a/src/apps/cis/test_energy_he.py +++ b/src/apps/cis/test_energy_he.py @@ -21,9 +21,11 @@ other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; guess_excitations=2; excitations=2"' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) + print("finished with run") - print(output) + print(p.stdout) # compare results cmp=madjsoncompare(outputfile,referencefile) diff --git a/src/apps/cis/test_symmetry_h2o.py b/src/apps/cis/test_symmetry_h2o.py index 3a911efb74b..df8261985de 100755 --- a/src/apps/cis/test_symmetry_h2o.py +++ b/src/apps/cis/test_symmetry_h2o.py @@ -21,9 +21,10 @@ other_arguments=' --response="freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' cmd='rm '+outputfile+'; cis '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") - print(output) + print(p.stdout) # compare results cmp=madjsoncompare(outputfile,referencefile) diff --git a/src/apps/moldft/test_energy.py b/src/apps/moldft/test_energy.py index a75594ecaff..47df02a7197 100755 --- a/src/apps/moldft/test_energy.py +++ b/src/apps/moldft/test_energy.py @@ -21,7 +21,9 @@ other_arguments='' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - p=subprocess.run(cmd,shell=True,capture_output=True, text=True) +# p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) + print("finished with run") print(p.stdout) exitcode=p.returncode diff --git a/src/apps/mp2/test_callable.py b/src/apps/mp2/test_callable.py index ca5ca8f800b..642b4ef5423 100755 --- a/src/apps/mp2/test_callable.py +++ b/src/apps/mp2/test_callable.py @@ -29,7 +29,8 @@ other_arguments=' --mp2="freeze 1"' cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - p=subprocess.run(cmd,shell=True,capture_output=True, text=True) +# p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") print(p.stdout) exitcode=p.returncode diff --git a/src/apps/nemo/test_energy.py b/src/apps/nemo/test_energy.py index d5ef87344db..223128beca8 100755 --- a/src/apps/nemo/test_energy.py +++ b/src/apps/nemo/test_energy.py @@ -21,7 +21,8 @@ other_arguments='' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - p=subprocess.run(cmd,shell=True,capture_output=True, text=True) +# p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") print(p.stdout) exitcode=p.returncode diff --git a/src/apps/nemo/test_localization.py b/src/apps/nemo/test_localization.py index 51b7f916895..59fcacc8fd0 100755 --- a/src/apps/nemo/test_localization.py +++ b/src/apps/nemo/test_localization.py @@ -18,7 +18,9 @@ def localizer_run(localizer): cmd='rm '+outputfile+'; nemo --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) + print("finished with run1") cmp=madjsoncompare(outputfile,referencefile) diff --git a/src/apps/oep/test_energy.py b/src/apps/oep/test_energy.py index dc5cd5b8c34..b5c80ce108f 100755 --- a/src/apps/oep/test_energy.py +++ b/src/apps/oep/test_energy.py @@ -29,7 +29,9 @@ other_arguments=' --oep="model=oaep"' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) + print("finished with run") # compare results diff --git a/src/apps/znemo/test_energy.py b/src/apps/znemo/test_energy.py index 6fc79644371..b137f931919 100755 --- a/src/apps/znemo/test_energy.py +++ b/src/apps/znemo/test_energy.py @@ -29,7 +29,8 @@ other_arguments=' --complex="physical_B=-1.0" --geometry="no_orient=true; source_name=he"' cmd='rm '+outputfile+' reference.00000 restartaodata; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") # compare results From 0eb4287f785a5993e5f82523b313c353253f59e8 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sun, 22 Jan 2023 22:24:10 +0100 Subject: [PATCH 0625/1312] absolute path for the binaries in scripts --- cmake/modules/AddScriptedTests.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/AddScriptedTests.cmake b/cmake/modules/AddScriptedTests.cmake index 17e750fb753..807fff4d313 100644 --- a/cmake/modules/AddScriptedTests.cmake +++ b/cmake/modules/AddScriptedTests.cmake @@ -33,7 +33,7 @@ macro(add_scripted_tests _testcase_in _binary _labels) endif() # copy the test scripts and replaces the variable to the source directory containing the reference json outputs set(SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}) - set(BINARY ${_binary}) + set(BINARY ${CMAKE_CURRENT_BINARY_DIR}/${_binary}) set(TESTCASE ${_testcase}) configure_file(${_testcase} ${_testcase} @ONLY) From 79e96cd900e42d6accc7c9e38ee7a5b7b7803a8d Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sun, 22 Jan 2023 23:03:33 +0100 Subject: [PATCH 0626/1312] absolute path for the binaries in scripts --- cmake/modules/AddScriptedTests.cmake | 2 +- src/apps/cc2/test_callable.py | 2 +- src/apps/cis/test_callable.py | 2 +- src/apps/cis/test_energy_he.py | 2 +- src/apps/moldft/test_energy.py | 2 +- src/apps/mp2/test_callable.py | 2 +- src/apps/nemo/test_energy.py | 2 +- src/apps/nemo/test_localization.py | 2 +- src/apps/oep/test_energy.py | 2 +- src/apps/znemo/test_energy.py | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cmake/modules/AddScriptedTests.cmake b/cmake/modules/AddScriptedTests.cmake index 807fff4d313..17e750fb753 100644 --- a/cmake/modules/AddScriptedTests.cmake +++ b/cmake/modules/AddScriptedTests.cmake @@ -33,7 +33,7 @@ macro(add_scripted_tests _testcase_in _binary _labels) endif() # copy the test scripts and replaces the variable to the source directory containing the reference json outputs set(SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}) - set(BINARY ${CMAKE_CURRENT_BINARY_DIR}/${_binary}) + set(BINARY ${_binary}) set(TESTCASE ${_testcase}) configure_file(${_testcase} ${_testcase} @ONLY) diff --git a/src/apps/cc2/test_callable.py b/src/apps/cc2/test_callable.py index ccc5164d082..4f0e37a76c8 100755 --- a/src/apps/cc2/test_callable.py +++ b/src/apps/cc2/test_callable.py @@ -27,7 +27,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'; k=5"' other_arguments=' --cc2="freeze 1"' - cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+' reference.00000; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # p=subprocess.run(cmd,shell=True,capture_output=True, text=True) diff --git a/src/apps/cis/test_callable.py b/src/apps/cis/test_callable.py index 358799c6e74..a5fb3dacc4e 100755 --- a/src/apps/cis/test_callable.py +++ b/src/apps/cis/test_callable.py @@ -19,7 +19,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; excitations=0"' - cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # p=subprocess.run(cmd,shell=True,capture_output=True, text=True) p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py index 4ed41252a8d..5f3e5118732 100755 --- a/src/apps/cis/test_energy_he.py +++ b/src/apps/cis/test_energy_he.py @@ -19,7 +19,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; guess_excitations=2; excitations=2"' - cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/moldft/test_energy.py b/src/apps/moldft/test_energy.py index 47df02a7197..a01dd8e7d08 100755 --- a/src/apps/moldft/test_energy.py +++ b/src/apps/moldft/test_energy.py @@ -19,7 +19,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments='' - cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # p=subprocess.run(cmd,shell=True,capture_output=True, text=True) p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/mp2/test_callable.py b/src/apps/mp2/test_callable.py index 642b4ef5423..46bf61e52df 100755 --- a/src/apps/mp2/test_callable.py +++ b/src/apps/mp2/test_callable.py @@ -27,7 +27,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'; k=5"' other_arguments=' --mp2="freeze 1"' - cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+' reference.00000; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # p=subprocess.run(cmd,shell=True,capture_output=True, text=True) p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/nemo/test_energy.py b/src/apps/nemo/test_energy.py index 223128beca8..2159b06911c 100755 --- a/src/apps/nemo/test_energy.py +++ b/src/apps/nemo/test_energy.py @@ -19,7 +19,7 @@ global_arguments='--geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments='' - cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # p=subprocess.run(cmd,shell=True,capture_output=True, text=True) p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/nemo/test_localization.py b/src/apps/nemo/test_localization.py index 59fcacc8fd0..5389e0cb2e0 100755 --- a/src/apps/nemo/test_localization.py +++ b/src/apps/nemo/test_localization.py @@ -16,7 +16,7 @@ def localizer_run(localizer): referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" - cmd='rm '+outputfile+'; nemo --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' + cmd='rm '+outputfile+'; ./@BINARY@ --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' print("executing \n ",cmd) # output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/oep/test_energy.py b/src/apps/oep/test_energy.py index b5c80ce108f..ccab6f73226 100755 --- a/src/apps/oep/test_energy.py +++ b/src/apps/oep/test_energy.py @@ -27,7 +27,7 @@ global_arguments=' --geometry=be' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --oep="model=oaep"' - cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/znemo/test_energy.py b/src/apps/znemo/test_energy.py index b137f931919..8764db25519 100755 --- a/src/apps/znemo/test_energy.py +++ b/src/apps/znemo/test_energy.py @@ -27,7 +27,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --complex="physical_B=-1.0" --geometry="no_orient=true; source_name=he"' - cmd='rm '+outputfile+' reference.00000 restartaodata; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+' reference.00000 restartaodata; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) From 49b9dfa7c4eddf2e398a64f35e92c78e323eefeb Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sun, 22 Jan 2023 23:12:51 +0100 Subject: [PATCH 0627/1312] consistent naming for test target applications --- src/apps/cc2/CMakeLists.txt | 2 +- src/apps/cis/CMakeLists.txt | 6 +++--- src/apps/moldft/CMakeLists.txt | 2 +- src/apps/mp2/CMakeLists.txt | 2 +- src/apps/nemo/CMakeLists.txt | 4 ++-- src/apps/oep/CMakeLists.txt | 2 +- src/apps/znemo/CMakeLists.txt | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/apps/cc2/CMakeLists.txt b/src/apps/cc2/CMakeLists.txt index 050195bacdb..81e63e55c31 100644 --- a/src/apps/cc2/CMakeLists.txt +++ b/src/apps/cc2/CMakeLists.txt @@ -4,7 +4,7 @@ add_mad_executable(cc2 cc2.cc "MADchem") add_dependencies(applications-madness cc2) if (ENABLE_GENTENSOR) - add_scripted_tests(test_callable.py cc2 "short;application") # runs he with one frozen orbital.. + add_scripted_tests(test_callable.py cc2 "short;applications") # runs he with one frozen orbital.. endif() install(TARGETS cc2 DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/cis/CMakeLists.txt b/src/apps/cis/CMakeLists.txt index ca0c01b80ea..909461bcd97 100644 --- a/src/apps/cis/CMakeLists.txt +++ b/src/apps/cis/CMakeLists.txt @@ -3,8 +3,8 @@ add_mad_executable(cis cis.cpp "MADchem") add_dependencies(applications-madness cis) -add_scripted_tests(test_callable.py cis "short;application") -add_scripted_tests(test_energy_he.py cis "medium;application") -add_scripted_tests(test_symmetry_h2o.py cis "long;application") +add_scripted_tests(test_callable.py cis "short;applications") +add_scripted_tests(test_energy_he.py cis "medium;applications") +add_scripted_tests(test_symmetry_h2o.py cis "long;applications") install(TARGETS cis DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index 9a95690fad3..2132a7183e8 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -11,7 +11,7 @@ add_mad_executable(testpg testpg.cc MADchem) add_mad_executable(testperiodicdft testperiodicdft.cc MADchem) -add_scripted_tests(test_energy.py moldft "short;application") +add_scripted_tests(test_energy.py moldft "short;applications") # removed mcpfit since it is likely only of historic interest diff --git a/src/apps/mp2/CMakeLists.txt b/src/apps/mp2/CMakeLists.txt index 25c571c78c4..9a99b2f52c7 100644 --- a/src/apps/mp2/CMakeLists.txt +++ b/src/apps/mp2/CMakeLists.txt @@ -4,7 +4,7 @@ add_mad_executable(mp2 mp2.cc "MADchem") add_dependencies(applications-madness mp2) if (ENABLE_GENTENSOR) - add_scripted_tests(test_callable.py mp2 "short;application") + add_scripted_tests(test_callable.py mp2 "short;applications") endif() diff --git a/src/apps/nemo/CMakeLists.txt b/src/apps/nemo/CMakeLists.txt index 1713a9472c8..34b0ed82d71 100644 --- a/src/apps/nemo/CMakeLists.txt +++ b/src/apps/nemo/CMakeLists.txt @@ -3,7 +3,7 @@ add_mad_executable(nemo nemo.cc "MADchem") add_dependencies(applications-madness nemo) -add_scripted_tests(test_energy.py nemo "short;application") -add_scripted_tests(test_localization.py nemo "long;application") +add_scripted_tests(test_energy.py nemo "short;applications") +add_scripted_tests(test_localization.py nemo "long;applications") install(TARGETS nemo DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/oep/CMakeLists.txt b/src/apps/oep/CMakeLists.txt index a795fe3e97c..cd4a4596445 100644 --- a/src/apps/oep/CMakeLists.txt +++ b/src/apps/oep/CMakeLists.txt @@ -2,6 +2,6 @@ add_mad_executable(oep oep.cc "MADchem") add_dependencies(applications-madness oep) -add_scripted_tests(test_energy.py oep "medium;application") +add_scripted_tests(test_energy.py oep "medium;applications") install(TARGETS oep DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/znemo/CMakeLists.txt b/src/apps/znemo/CMakeLists.txt index 5828a1e968f..0de21c3bff4 100644 --- a/src/apps/znemo/CMakeLists.txt +++ b/src/apps/znemo/CMakeLists.txt @@ -4,7 +4,7 @@ add_mad_executable(znemo znemo.cc "MADchem") add_dependencies(applications-madness znemo) if (NOT ENABLE_GENTENSOR) - add_scripted_tests(test_energy.py znemo "medium;application") + add_scripted_tests(test_energy.py znemo "medium;applications") endif() From bd1ade6d396de96cddb61f7ccebb79f0465082a4 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Mon, 23 Jan 2023 22:33:05 +0100 Subject: [PATCH 0628/1312] fixing cis test --- src/apps/cis/test_energy_he.py | 2 +- src/apps/cis/test_symmetry_h2o.py | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py index 5f3e5118732..d92e3e31326 100755 --- a/src/apps/cis/test_energy_he.py +++ b/src/apps/cis/test_energy_he.py @@ -35,4 +35,4 @@ cmp.compare(["cis_excitations",1,"omega"],1.e-3) print("final success: ",cmp.success) - sys.exit(cmp.exitcode()) \ No newline at end of file + sys.exit(cmp.exitcode()) diff --git a/src/apps/cis/test_symmetry_h2o.py b/src/apps/cis/test_symmetry_h2o.py index df8261985de..2b09384537c 100755 --- a/src/apps/cis/test_symmetry_h2o.py +++ b/src/apps/cis/test_symmetry_h2o.py @@ -16,13 +16,14 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --geometry=h2o' + global_arguments=' --geometry=h2o' dft_arguments=' --dft="k=8; localize=canon; prefix='+prefix+'"' other_arguments=' --response="freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' - cmd='rm '+outputfile+'; cis '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) + print("finished with run") print(p.stdout) @@ -38,11 +39,12 @@ dft_arguments=' --dft="k=8; localize=canon; prefix='+prefix+'; no_compute=1"' other_arguments=' --response="irrep=a2; freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' - cmd='cis '+global_arguments + dft_arguments + other_arguments + cmd='./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") - print(output) + print(p.stdout) # compare results @@ -54,4 +56,4 @@ print("final success: ",cmp.success) - sys.exit(cmp.exitcode()) \ No newline at end of file + sys.exit(cmp.exitcode()) From b38f8f1efed338bdd9825bb9b4cc17185d9d333b Mon Sep 17 00:00:00 2001 From: fbischoff Date: Tue, 24 Jan 2023 22:36:21 +0100 Subject: [PATCH 0629/1312] adding labels short, medium, long, etc to the tests, adding new target check-short --- .github/workflows/cmake.yml | 2 +- CMakeLists.txt | 1 + cmake/modules/AddScriptedTests.cmake | 6 ++++-- cmake/modules/AddUnittests.cmake | 10 ++++++---- src/madness/chem/CMakeLists.txt | 14 ++++++++------ src/madness/misc/CMakeLists.txt | 2 +- src/madness/mra/CMakeLists.txt | 4 ++-- src/madness/tensor/CMakeLists.txt | 4 ++-- src/madness/world/CMakeLists.txt | 2 +- 9 files changed, 26 insertions(+), 19 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index efa4f094dc6..b815f63fa3f 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -102,4 +102,4 @@ jobs: - name: Test working-directory: ${{github.workspace}}/build shell: bash - run: cmake --build . --target check-madness + run: cmake --build . --target check-short-madness diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e8d2b2d7d9..7d0c84d6821 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -673,6 +673,7 @@ if(BUILD_TESTING) add_custom_target_subproject(madness unittests) add_custom_target_subproject(madness scripted_tests) add_custom_target_subproject(madness check COMMAND ${CMAKE_CTEST_COMMAND} -V -R "madness/test/" USES_TERMINAL) # to be GNU compatible + add_custom_target_subproject(madness check-short COMMAND ${CMAKE_CTEST_COMMAND} -L \"short|medium\" -V -R "madness/test/" USES_TERMINAL) # to be GNU compatible add_dependencies(everything unittests) endif() add_subdirectory(src) diff --git a/cmake/modules/AddScriptedTests.cmake b/cmake/modules/AddScriptedTests.cmake index 17e750fb753..32f08b91261 100644 --- a/cmake/modules/AddScriptedTests.cmake +++ b/cmake/modules/AddScriptedTests.cmake @@ -18,8 +18,10 @@ macro(add_scripted_tests _testcase_in _binary _labels) # Add a test that builds the binary add_test(madness/test/${_binary}/build "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${_binary}) - set_tests_properties(madness/test/${_binary}/build - PROPERTIES DEPENDS ${_binary} LABELS "${_labels}") + set_tests_properties(madness/test/${_binary}/build PROPERTIES DEPENDS ${_binary}) + + # make sure that the build step has all labels + set_property(TEST madness/test/${_binary}/build PROPERTY LABELS "${_labels}" APPEND) # Add a test that copies the test scripts and replaces the variable to the source directory # containing the reference json outputs diff --git a/cmake/modules/AddUnittests.cmake b/cmake/modules/AddUnittests.cmake index 30ab8db394f..081b225fe6f 100644 --- a/cmake/modules/AddUnittests.cmake +++ b/cmake/modules/AddUnittests.cmake @@ -1,8 +1,10 @@ -macro(add_unittests _component _sources _libs) +macro(add_unittests _component _sources _libs _labels) # Add targets and for world_unittests - add_custom_target_subproject(madness ${_component}_unittests) - add_dependencies(unittests-madness ${_component}_unittests-madness) + if (NOT TARGET ${_component}_unittests) + add_custom_target_subproject(madness ${_component}_unittests) + add_dependencies(unittests-madness ${_component}_unittests-madness) + endif() # Add a test that builds the unit tests add_test(madness/test/${_component}/build @@ -21,7 +23,7 @@ macro(add_unittests _component _sources _libs) add_test(NAME madness/test/${_component}/${_test}/run COMMAND ${_test}) add_dependencies(${_component}_unittests-madness ${_test}) set_tests_properties(madness/test/${_component}/${_test}/run - PROPERTIES DEPENDS madness/test/${_component}/build) + PROPERTIES DEPENDS madness/test/${_component}/build LABELS "${_labels}") endforeach() diff --git a/src/madness/chem/CMakeLists.txt b/src/madness/chem/CMakeLists.txt index 8589003048b..33a4314b3ed 100644 --- a/src/madness/chem/CMakeLists.txt +++ b/src/madness/chem/CMakeLists.txt @@ -142,15 +142,17 @@ if(BUILD_TESTING) SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # The list of unit test source files - set(CHEM_TEST_SOURCES test_pointgroupsymmetry.cc test_masks_and_boxes.cc test_localizer.cc - test_QCCalculationParametersBase.cc test_qc.cc test_MolecularOrbitals.cc test_BSHApply.cc - test_ccpairfunction.cc) + set(CHEM_TEST_SOURCES_SHORT test_pointgroupsymmetry.cc test_masks_and_boxes.cc + test_QCCalculationParametersBase.cc test_qc.cc test_MolecularOrbitals.cc test_BSHApply.cc) + set(CHEM_TEST_SOURCES_LONG test_localizer.cc test_ccpairfunction.cc) if (LIBXC_FOUND) - list(APPEND CHEM_TEST_SOURCES test_dft.cc test_SCFOperators.cc) + list(APPEND CHEM_TEST_SOURCES_SHORT test_dft.cc ) + list(APPEND CHEM_TEST_SOURCES_LONG test_SCFOperators.cc) endif(LIBXC_FOUND) - add_unittests(chem "${CHEM_TEST_SOURCES}" "MADchem;MADgtest") - + add_unittests(chem "${CHEM_TEST_SOURCES_SHORT}" "MADchem;MADgtest" "unittests;short") + add_unittests(chem "${CHEM_TEST_SOURCES_LONG}" "MADchem;MADgtest" "unittests;long") + # Create other test executables not included in the unit tests set(CHEM_OTHER_TESTS testxc benchmark_exchange_operator) foreach(_test ${CHEM_OTHER_TESTS}) diff --git a/src/madness/misc/CMakeLists.txt b/src/madness/misc/CMakeLists.txt index 9b6811550f6..99f56cdbfd7 100644 --- a/src/madness/misc/CMakeLists.txt +++ b/src/madness/misc/CMakeLists.txt @@ -22,6 +22,6 @@ if(BUILD_TESTING) # The list of unit test source files set(MISC_TEST_SOURCES interp3.cc) - add_unittests(misc "${MISC_TEST_SOURCES}" "MADmisc;MADgtest") + add_unittests(misc "${MISC_TEST_SOURCES}" "MADmisc;MADgtest" "unittests") endif() \ No newline at end of file diff --git a/src/madness/mra/CMakeLists.txt b/src/madness/mra/CMakeLists.txt index e3b9906516c..ec785dd82c2 100644 --- a/src/madness/mra/CMakeLists.txt +++ b/src/madness/mra/CMakeLists.txt @@ -37,10 +37,10 @@ if(BUILD_TESTING) testpdiff.cc testdiff1Db.cc testgconv.cc testopdir.cc testinnerext.cc testgaxpyext.cc testvmra.cc, test_vectormacrotask.cc test_cloud.cc test_macrotaskpartitioner.cc) - add_unittests(mra "${MRA_TEST_SOURCES}" "MADmra;MADgtest") + add_unittests(mra "${MRA_TEST_SOURCES}" "MADmra;MADgtest" "unittests") set(MRA_SEPOP_TEST_SOURCES testsuite.cc testper.cc) - add_unittests(mra_sepop "${MRA_SEPOP_TEST_SOURCES}" "libtest_sepop;MADgtest") + add_unittests(mra_sepop "${MRA_SEPOP_TEST_SOURCES}" "libtest_sepop;MADgtest" "unittests") # Test executables that are not run with unit tests set(MRA_OTHER_TESTS testperiodic testbc testqm test6 diff --git a/src/madness/tensor/CMakeLists.txt b/src/madness/tensor/CMakeLists.txt index 6ec51249deb..3734dd60355 100644 --- a/src/madness/tensor/CMakeLists.txt +++ b/src/madness/tensor/CMakeLists.txt @@ -90,7 +90,7 @@ if(BUILD_TESTING) list(APPEND LINALG_TEST_SOURCES test_gentensor.cc test_lowranktensor.cc) endif() - add_unittests(tensor "${TENSOR_TEST_SOURCES}" "MADtensor;MADgtest") - add_unittests(linalg "${LINALG_TEST_SOURCES}" "MADlinalg;MADgtest") + add_unittests(tensor "${TENSOR_TEST_SOURCES}" "MADtensor;MADgtest" "unittests") + add_unittests(linalg "${LINALG_TEST_SOURCES}" "MADlinalg;MADgtest" "unittests") endif() diff --git a/src/madness/world/CMakeLists.txt b/src/madness/world/CMakeLists.txt index 74b108ffaf3..ced39edf430 100644 --- a/src/madness/world/CMakeLists.txt +++ b/src/madness/world/CMakeLists.txt @@ -97,7 +97,7 @@ if(BUILD_TESTING) test_worldref.cc test_stack.cc test_googletest.cc test_tree.cc ) - add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest") + add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest" "unittests") # add_scripted_tests(test.py test_tree "scripted") # add_scripted_tests(test1.py test_hello "scripted") From 2e54bd52ba3ed287b387b9bca987729edb92d15a Mon Sep 17 00:00:00 2001 From: fbischoff Date: Tue, 24 Jan 2023 23:06:46 +0100 Subject: [PATCH 0630/1312] adding "short" label to all unittests --- cmake/modules/AddUnittests.cmake | 4 +++- src/madness/misc/CMakeLists.txt | 2 +- src/madness/mra/CMakeLists.txt | 4 ++-- src/madness/tensor/CMakeLists.txt | 4 ++-- src/madness/world/CMakeLists.txt | 5 +---- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/cmake/modules/AddUnittests.cmake b/cmake/modules/AddUnittests.cmake index 081b225fe6f..fb56e1fd268 100644 --- a/cmake/modules/AddUnittests.cmake +++ b/cmake/modules/AddUnittests.cmake @@ -9,7 +9,9 @@ macro(add_unittests _component _sources _libs _labels) # Add a test that builds the unit tests add_test(madness/test/${_component}/build "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${_component}_unittests-madness) - + # make sure that the build step has all labels + set_property(TEST madness/test/${_component}/build PROPERTY LABELS "${_labels}" APPEND) + foreach(_source ${_sources}) # Get the test name (the file name of the first source) string(REGEX MATCH "[A-Za-z_][A-Za-z0-9_]*\\.cc" _test_source "${_source}") diff --git a/src/madness/misc/CMakeLists.txt b/src/madness/misc/CMakeLists.txt index 99f56cdbfd7..81f5842b3d3 100644 --- a/src/madness/misc/CMakeLists.txt +++ b/src/madness/misc/CMakeLists.txt @@ -22,6 +22,6 @@ if(BUILD_TESTING) # The list of unit test source files set(MISC_TEST_SOURCES interp3.cc) - add_unittests(misc "${MISC_TEST_SOURCES}" "MADmisc;MADgtest" "unittests") + add_unittests(misc "${MISC_TEST_SOURCES}" "MADmisc;MADgtest" "unittests;short") endif() \ No newline at end of file diff --git a/src/madness/mra/CMakeLists.txt b/src/madness/mra/CMakeLists.txt index ec785dd82c2..e0ec36cb333 100644 --- a/src/madness/mra/CMakeLists.txt +++ b/src/madness/mra/CMakeLists.txt @@ -37,10 +37,10 @@ if(BUILD_TESTING) testpdiff.cc testdiff1Db.cc testgconv.cc testopdir.cc testinnerext.cc testgaxpyext.cc testvmra.cc, test_vectormacrotask.cc test_cloud.cc test_macrotaskpartitioner.cc) - add_unittests(mra "${MRA_TEST_SOURCES}" "MADmra;MADgtest" "unittests") + add_unittests(mra "${MRA_TEST_SOURCES}" "MADmra;MADgtest" "unittests;short") set(MRA_SEPOP_TEST_SOURCES testsuite.cc testper.cc) - add_unittests(mra_sepop "${MRA_SEPOP_TEST_SOURCES}" "libtest_sepop;MADgtest" "unittests") + add_unittests(mra_sepop "${MRA_SEPOP_TEST_SOURCES}" "libtest_sepop;MADgtest" "unittests;short") # Test executables that are not run with unit tests set(MRA_OTHER_TESTS testperiodic testbc testqm test6 diff --git a/src/madness/tensor/CMakeLists.txt b/src/madness/tensor/CMakeLists.txt index 3734dd60355..2747e619609 100644 --- a/src/madness/tensor/CMakeLists.txt +++ b/src/madness/tensor/CMakeLists.txt @@ -90,7 +90,7 @@ if(BUILD_TESTING) list(APPEND LINALG_TEST_SOURCES test_gentensor.cc test_lowranktensor.cc) endif() - add_unittests(tensor "${TENSOR_TEST_SOURCES}" "MADtensor;MADgtest" "unittests") - add_unittests(linalg "${LINALG_TEST_SOURCES}" "MADlinalg;MADgtest" "unittests") + add_unittests(tensor "${TENSOR_TEST_SOURCES}" "MADtensor;MADgtest" "unittests;short") + add_unittests(linalg "${LINALG_TEST_SOURCES}" "MADlinalg;MADgtest" "unittests;short") endif() diff --git a/src/madness/world/CMakeLists.txt b/src/madness/world/CMakeLists.txt index ced39edf430..10e2a3348cc 100644 --- a/src/madness/world/CMakeLists.txt +++ b/src/madness/world/CMakeLists.txt @@ -97,10 +97,7 @@ if(BUILD_TESTING) test_worldref.cc test_stack.cc test_googletest.cc test_tree.cc ) - add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest" "unittests") - -# add_scripted_tests(test.py test_tree "scripted") -# add_scripted_tests(test1.py test_hello "scripted") + add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest" "unittests;short") find_package(CUDA) if (TARGET PaRSEC::parsec AND CUDA_FOUND) From dcb43dc236b9044398baa04c9256c56f44679ab6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 18:49:11 -0500 Subject: [PATCH 0631/1312] typos --- src/apps/molresponse/ResponseBase.cpp | 14 ++++---------- src/apps/molresponse/ResponseBase.hpp | 2 -- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 63405be21de..6c26223aad8 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -955,17 +955,11 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< bool compute_Y) const -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // // std::cout << "MPI BARRIER V0X " << std::endl; - // // world.mpi.Barrier(); - // Start a timer size_t m = X.num_states(); size_t n = X.num_orbitals(); - X_space V0 = X_space(world, m, n); X_space K0 = X_space(world, m, n); - real_function_3d v_nuc, v_j0, v_k0, v_xc; - if (not r_params.store_potential()) { v_nuc = potential_manager->vnuclear(); //v_nuc.truncate(); @@ -1420,7 +1414,7 @@ void ResponseBase::solve(World &world) { for (const auto &iter_thresh: protocol) { // We set the protocol and function defaults here for the given threshold of set_protocol(world, iter_thresh); - if (world.rank() == 0) { print("Succesfully set protocol"); } + if (world.rank() == 0) { print("Successfully set protocol"); } // protocol if (first_protocol) { if (r_params.restart()) { @@ -1431,14 +1425,14 @@ void ResponseBase::solve(World &world) { first_protocol = false; } else { this->initialize(world); - if (world.rank() == 0) { print("Succesfully initialized "); } + if (world.rank() == 0) { print("Successfully initialized "); } } check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); - if (world.rank() == 0) { print("Succesfully check K first initialization "); } + if (world.rank() == 0) { print("Successfully check K first initialization "); } first_protocol = false; } else { check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); - if (world.rank() == 0) { print("Succesfully check K not first initialization "); } + if (world.rank() == 0) { print("Successfully check K not first initialization "); } } protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index d350cf7d88f..e24cfdacdda 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -121,8 +121,6 @@ class ResponseBase { double vtol{}; X_space Chi; - - /// Sets the Function protocol dependent on the truncation threshold. /// Sets the polynomial order of basis functions k /// Then creates shared coulomb operator, gradient operator, ground density From 7054b56a33e396f64c11755d63d7400e4d37343d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 18:49:24 -0500 Subject: [PATCH 0632/1312] remove resonse function solver --- src/apps/molresponse/FrequencyResponse.cpp | 15 +++------------ src/apps/molresponse/FrequencyResponse.hpp | 3 +-- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ed428a53e56..1b6924543a9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -55,8 +55,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } - - // New approach solving single function at a time auto p = compute_y ? 2 : 1; response_function_solver rf_solver; @@ -66,8 +64,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &solver_ij: rf_solver) { solver_ij.set_maxsub(r_params.maxsub()); } } - - // We compute with positive frequencies if (world.rank() == 0) { print("Warning input frequency is assumed to be positive"); @@ -181,7 +177,7 @@ void FrequencyResponse::iterate(World &world) { } auto [new_chi, new_res, new_polar] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, iter, max_rotation, rf_solver); + kain_x_space, iter, max_rotation); v_polar = copy(new_polar); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); @@ -264,8 +260,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &max_rotation, - response_function_solver &solver) + size_t iteration, const double &max_rotation) -> std::tuple> { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -362,11 +357,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { - if (true) { - new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); - } else { - new_chi = new_kain_x_space_update(world, chi, new_chi, solver); - } + new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 47701c743e6..e67d74df024 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -50,8 +50,7 @@ class FrequencyResponse : public ResponseBase { update(World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, - response_solver &kain_x_space, size_t iteration, const double &max_rotation, - response_function_solver &solver); + response_solver &kain_x_space, size_t iteration, const double &max_rotation); X_space new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, response_function_solver &rf_solver); }; From 7c53b7363d1eef90fbd91302553542d0fc0dc421 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 19:12:40 -0500 Subject: [PATCH 0633/1312] some v0 edits --- src/apps/molresponse/FrequencyResponse.cpp | 2 - src/apps/molresponse/ResponseBase.cpp | 44 +++------------------- 2 files changed, 5 insertions(+), 41 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 1b6924543a9..a768df992bf 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -270,8 +270,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto x = chi.copy();// copy chi X_space lambda_X = X_space(world, chi.num_states(), chi.num_orbitals()); X_space theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); - // We are going to build lambda and theta from individual components - // Just compute theta x and lambda x components here if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_y); if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6c26223aad8..3cfcb214b09 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -991,56 +991,27 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // make a zero function v_xc = Function(FunctionFactory(world).fence(false).initial_level(1)); } - // Intermediaries - world.gop.fence(); - - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* - K0 = ground_exchange(phi0_copy, X, compute_Y); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "old K[0]"); - print_inner(world, "new xK0x", Chi_copy, K0); - } - */ - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(ground_orbitals, X, compute_Y); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "new K[0]", "K[0]", iter_timing); - } - if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", X, K0); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - real_function_3d v0 = v_j0 + v_nuc + v_xc; - v0.truncate(); auto c_xc = xcf.hf_exchange_coefficient(); + real_function_3d v0 = v_j0 + v_nuc + (1 - c_xc) * v_xc; + v0.truncate(); double safety = 0.1; double vtol = safety * FunctionDefaults<3>::get_thresh(); - if (compute_Y) { auto x = to_response_matrix(X); auto vx = create_response_matrix(X.num_states(), X.num_orbitals()); - std::transform(x.begin(), x.end(), vx.begin(), - [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); + for (int b = 0; b < m; b++) { vx[b] = mul(world, v0, x[b], false); } world.gop.fence(); V0 = to_X_space(vx); - V0.truncate(); - //V0 = v0 * X; - if (world.rank() == 0) { print("vox: v0=v0*X"); } V0 += -c_xc * K0; - if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } - } else { - - std::transform(X.X.begin(), X.X.end(), V0.X.begin(), - [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); + for (int b = 0; b < m; b++) { V0.X[b] = mul(world, v0, X.X[b], false); } world.gop.fence(); - V0.X.truncate_rf(); - //V0.X = v0 * X.X; - if (world.rank() == 0) { print("vox: v0=v0*X"); } V0.X += -c_xc * K0.X; - - if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } V0.Y = V0.X.copy(); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } @@ -1051,11 +1022,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< return V0; } -// Returns the ground state potential applied to functions f -// (V0 f) V0=(Vnuc+J0-K0+W0) -// J0=J[ground_density] -// K0=K[ground_density]f -// EXC0=W[ground_density] auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) const -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space T0X = X_space(world, x.num_states(), x.num_orbitals()); From ebff73e8abc6e0c49cb5e9fbe399a131e6562197 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 19:25:49 -0500 Subject: [PATCH 0634/1312] some gamma changes --- src/apps/molresponse/FrequencyResponse.cpp | 5 ----- src/apps/molresponse/ResponseBase.cpp | 1 - src/apps/molresponse/global_functions.cc | 1 - 3 files changed, 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index a768df992bf..93e02e9ccfd 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -282,7 +282,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator molresponse::end_timer(world, "compute_TX", "TX", iter_timing); if (r_params.print_level() >= 20) { print_inner(world, "xTx", chi, TOX); } } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space full_E0X(world, chi.num_states(), chi.num_orbitals()); X_space offdiag_E0X(world, chi.num_states(), chi.num_orbitals()); @@ -298,15 +297,11 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator full_E0X.X = x.X * hamiltonian; full_E0X.Y = full_E0X.X.copy(); } - full_E0X.truncate(); - offdiag_E0X.truncate(); if (r_params.print_level() >= 20) { print_inner(world, "E0", chi, offdiag_E0X); print_inner(world, "ED", chi, full_E0X); } } - - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3cfcb214b09..9157f879f21 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -485,7 +485,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // TODO is copy better than adding? probably? // J.Y=j_x+j_y; J.Y = J.X.copy(); - J.truncate(); if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f4df32adf89..d87853ae145 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -372,7 +372,6 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } } - K.truncate(); return K; } From 2fcc15c92c10646f9e378c1a5f3dfa09209ebe1a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 20:25:11 -0500 Subject: [PATCH 0635/1312] revert to using theta_X --- src/apps/molresponse/FrequencyResponse.cpp | 96 ++-------------------- src/apps/molresponse/FrequencyResponse.hpp | 3 +- 2 files changed, 6 insertions(+), 93 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 93e02e9ccfd..b58bdba7674 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -175,10 +175,8 @@ void FrequencyResponse::iterate(World &world) { break; } } - auto [new_chi, new_res, new_polar] = - update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, iter, max_rotation); - v_polar = copy(new_polar); + auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, + omega, kain_x_space, iter, max_rotation); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); if (r_params.print_level() >= 1) { @@ -216,18 +214,11 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { print("computing polarizability:"); } if (r_params.print_level() >= 20) { - auto [eval, evec] = syev(polar); if (world.rank() == 0) { printf("\n--------Response Properties after %d-------------\n", static_cast(iter)); print("polarizability"); print(polar); - print("polarizability eigenvalues"); - print(eval); - print("polarizability eigenvectors"); - print(evec); - print("V polarizability"); - print(v_polar); } } @@ -261,90 +252,14 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, size_t iteration, const double &max_rotation) - -> std::tuple> { + -> std::tuple { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; auto x = chi.copy();// copy chi - X_space lambda_X = X_space(world, chi.num_states(), chi.num_orbitals()); - X_space theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space V0X = compute_V0X(world, chi, xc, compute_y); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); - if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } - } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space TOX = compute_TX(world, chi, compute_y); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_TX", "TX", iter_timing); - if (r_params.print_level() >= 20) { print_inner(world, "xTx", chi, TOX); } - } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space full_E0X(world, chi.num_states(), chi.num_orbitals()); - X_space offdiag_E0X(world, chi.num_states(), chi.num_orbitals()); - if (r_params.localize() != "canon") { - if (compute_y) { - offdiag_E0X.X = x.X * ham_no_diag; - offdiag_E0X.Y = x.Y * ham_no_diag; - full_E0X.X = x.X * hamiltonian; - full_E0X.Y = x.Y * hamiltonian; - } else { - offdiag_E0X.X = x.X * ham_no_diag; - offdiag_E0X.Y = offdiag_E0X.X.copy(); - full_E0X.X = x.X * hamiltonian; - full_E0X.Y = full_E0X.X.copy(); - } - if (r_params.print_level() >= 20) { - print_inner(world, "E0", chi, offdiag_E0X); - print_inner(world, "ED", chi, full_E0X); - } - } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); - } - X_space gamma; - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - if (compute_y) gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); - else - gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); - } - - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - if (compute_y) { - theta_X = (V0X - offdiag_E0X) + gamma; - theta_X.truncate(); - } else { - theta_X.X = (V0X.X - offdiag_E0X.X + gamma.X); - theta_X.X.truncate_rf(); - theta_X.Y = theta_X.X.copy(); - } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); - } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space omega_X = X_space::zero_functions(world, chi.num_states(), chi.num_orbitals()); - if (compute_y) { - omega_X.X = -omega * x.X; - omega_X.Y = omega * x.Y; - lambda_X = TOX + V0X - full_E0X + omega_X + gamma; - lambda_X.truncate(); - } else { - lambda_X.X = TOX.X + V0X.X - full_E0X.X + gamma.X; - lambda_X.X.truncate_rf(); - } - - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "lambda_x"); } - Tensor polar; - if (compute_y) { - polar = 2 * inner(x, lambda_X); - } else { - polar = 4 * response_space_inner(x.X, lambda_X.X); - } + X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); @@ -357,7 +272,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator molresponse::end_timer(world, "update response", "update", iter_timing); } // if not compute y then copy x in to y - return {new_chi, {new_res, bsh}, polar}; + return {new_chi, {new_res, bsh}}; // print x norms } @@ -482,7 +397,6 @@ void FrequencyResponse::frequency_to_json(json &j_mol_in, size_t iter, json j = {}; j["iter"] = iter; j["polar"] = tensor_to_json(polar_ij); - j["v_polar"] = tensor_to_json(v_polar_ij); auto index = j_mol_in["protocol_data"].size() - 1; j_mol_in["protocol_data"][index]["property_data"].push_back(j); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index e67d74df024..db141cbe5d9 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -46,8 +46,7 @@ class FrequencyResponse : public ResponseBase { std::string message); void save(World& world, const std::string& name) override; void load(World& world, const std::string& name) override; - std::tuple> - update(World &world, X_space &chi, XCOperator &xc, + std::tuple update(World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, size_t iteration, const double &max_rotation); From 43d9fdc74fa922f293a2c99269294ca72b3226ad Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 20:33:12 -0500 Subject: [PATCH 0636/1312] tighter convergence parameters --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index b58bdba7674..952e7b634f9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow = 0.649; - const double b_pow = 0.533; + const double a_pow = 0.792; + const double b_pow = 1.078; const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); From 5a5cff2e62fc2b2acbdbf001cea027fcbbdb9829 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 20:51:24 -0500 Subject: [PATCH 0637/1312] remove mask and truncate from PQ --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 952e7b634f9..9c270e72afd 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -95,8 +95,8 @@ void FrequencyResponse::iterate(World &world) { functionT mask; mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); PQ = generator(world, *this); - PQ = PQ * mask; - PQ.truncate(); + //PQ = PQ * mask; + //PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); Chi = mask * Chi; From 1486251540c44e780b717f3ce7a206adba10d194 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 20:57:10 -0500 Subject: [PATCH 0638/1312] remove mask --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9c270e72afd..0e046658c2c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -99,7 +99,7 @@ void FrequencyResponse::iterate(World &world) { //PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); - Chi = mask * Chi; + //Chi = mask * Chi; // Basic output if (r_params.print_level() >= 1) { molresponse::start_timer(world); From 700cb3e94aa5e4a00554661181db376944fc7779 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 21:13:45 -0500 Subject: [PATCH 0639/1312] polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0e046658c2c..369111f1987 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -41,6 +41,7 @@ void FrequencyResponse::iterate(World &world) { r_vector_size = (compute_y) ? 2 * n : n; Tensor v_polar(m, m); + Tensor polar; vecfuncT rho_omega_old(m); // initialize DFT XC functional operator @@ -122,12 +123,6 @@ void FrequencyResponse::iterate(World &world) { auto max_bsh = bsh_residualsX.absmax(); auto max_relative_bsh = bsh_relative_residualsX.absmax(); max_rotation = 1.0 * max_bsh; - Tensor polar; - if (compute_y) { - polar = -2 * inner(Chi, PQ); - } else { - polar = -4 * response_space_inner(Chi.X, PQ.X); - } world.gop.fence(); // Todo add chi norm and chi_x if (world.rank() == 0) { @@ -157,13 +152,11 @@ void FrequencyResponse::iterate(World &world) { ((max_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { converged = true; } - if (converged || iter == r_params.maxiter()) { // if converged print converged if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { print("\nConverged!\n"); } - if (r_params.save()) { molresponse::start_timer(world); save(world, r_params.save_file()); @@ -204,15 +197,13 @@ void FrequencyResponse::iterate(World &world) { auto density_change = madness::sub(world, rho_omega, rho_omega_old, true); density_residuals = norm2s_T(world, density_change); if (world.rank() == 0) { print("computing residuals: density residuals"); } - Tensor polar; + + if (world.rank() == 0) { print("computing polarizability:"); } if (compute_y) { polar = -2 * inner(Chi, PQ); } else { polar = -4 * response_space_inner(Chi.X, PQ.X); } - - if (world.rank() == 0) { print("computing polarizability:"); } - if (r_params.print_level() >= 20) { if (world.rank() == 0) { printf("\n--------Response Properties after %d-------------\n", From 73d6822ecd457e67c89e18fd46781017e295ed32 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 21:48:12 -0500 Subject: [PATCH 0640/1312] maybe this --- src/apps/molresponse/ResponseBase.cpp | 7 ------ src/apps/molresponse/global_functions.cc | 31 ++++++++++++------------ 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 9157f879f21..2c8d5d5a28a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -465,7 +465,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto mul_tol = FunctionDefaults<3>::get_thresh(); // note that x can refer to x or y auto compute_j = [&, &phi0 = phi0](const auto &dx) { - // compute density with response function dx and orbitals phi0 auto rho_x_b = dot(world, dx, phi0); rho_x_b.truncate(); rho_x_b = apply(*shared_coulomb_operator, rho_x_b); @@ -474,24 +473,18 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit }; std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); - // compute j_y = op(rho_y)*phi0 if (world.rank() == 0) { print("compute jX"); } - std::transform(chi_alpha.Y.begin(), chi_alpha.Y.end(), j_y.begin(), compute_j); if (world.rank() == 0) { print("compute jy"); } J.X = j_x + j_y; if (world.rank() == 0) { print("add jx+jy"); } - // TODO is copy better than adding? probably? - // J.Y=j_x+j_y; J.Y = J.X.copy(); if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } - // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { auto rho = transition_density(world, phi0, chi_alpha.X, chi_alpha.X); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index d87853ae145..115fe25485c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -312,49 +312,50 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); - auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); - auto K = X_space::zero_functions(world, num_states, num_orbitals); auto phi_1 = copy(world, phi0, false); - /* - auto phi_2 = copy(world, phi0, false); - auto phi_3 = copy(world, phi0, false); - auto phi_4 = copy(world, phi0, false); - */ - // the question is copying pointers mpi safe Exchange op{}; const Exchange::Algorithm algo = op.small_memory; world.gop.fence(); const double lo = 1.e-10; if (compute_y) { - + auto x = to_response_matrix(chi); + auto x_conjugate = to_conjugate_response_matrix(chi); + auto phi_phi = to_response_vector(phi0); + auto KK = response_matrix(num_states); for (int b = 0; b < num_states; b++) { + Exchange op_1{}; + op_1.set_parameters(x[b], phi_phi, lo); + op_1.set_algorithm(algo); + Exchange op_2{}; + op_2.set_parameters(x_conjugate[b], phi_phi, lo); + op_2.set_algorithm(algo); + auto k1 = op_1(phi_phi); + auto k2 = op_2(phi_phi); + KK[b] = gaxpy_oop(1.0, k1, 1.0, k2, false); + /* Exchange op_1x{}; op_1x.set_parameters(chi.X[b], phi0, lo); op_1x.set_algorithm(algo); - Exchange op_1y{}; op_1y.set_parameters(chi.Y[b], phi0, lo); op_1y.set_algorithm(algo); - Exchange op_2x{}; op_2x.set_parameters(phi0, chi.Y[b], lo); op_2x.set_algorithm(algo); Exchange op_2y{}; op_2y.set_parameters(phi0, chi.X[b], lo); op_2y.set_algorithm(algo); - auto k1x = op_1x(phi_1); auto k2x = op_2x(phi_1); auto k1y = op_1y(phi_1); auto k2y = op_2y(phi_1); - - - world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); + */ + world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { From d4e5dffe8b4728bfd51dcd81347bba84f1637657 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 21:56:39 -0500 Subject: [PATCH 0641/1312] adjust exchange --- src/apps/molresponse/global_functions.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 115fe25485c..2d4babcf817 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -357,6 +357,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons */ world.gop.fence(); } + K = to_X_space(KK); } else { for (int b = 0; b < num_states; b++) { Exchange op_1x{}; From c95b387a067fdd5379c56e0d9b0372b9ba85463a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:02:53 -0500 Subject: [PATCH 0642/1312] debug exchange --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 2d4babcf817..28adaa8cd6c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -330,7 +330,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons op_1.set_parameters(x[b], phi_phi, lo); op_1.set_algorithm(algo); Exchange op_2{}; - op_2.set_parameters(x_conjugate[b], phi_phi, lo); + op_2.set_parameters(phi_phi,x_conjugate[b], lo); op_2.set_algorithm(algo); auto k1 = op_1(phi_phi); auto k2 = op_2(phi_phi); From f70241d9beafb0a7def82d154ab8515727aa1931 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:14:35 -0500 Subject: [PATCH 0643/1312] bring exchange back --- src/apps/molresponse/global_functions.cc | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 28adaa8cd6c..05aa0da6640 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -321,21 +321,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); const double lo = 1.e-10; if (compute_y) { - auto x = to_response_matrix(chi); - auto x_conjugate = to_conjugate_response_matrix(chi); - auto phi_phi = to_response_vector(phi0); - auto KK = response_matrix(num_states); for (int b = 0; b < num_states; b++) { - Exchange op_1{}; - op_1.set_parameters(x[b], phi_phi, lo); - op_1.set_algorithm(algo); - Exchange op_2{}; - op_2.set_parameters(phi_phi,x_conjugate[b], lo); - op_2.set_algorithm(algo); - auto k1 = op_1(phi_phi); - auto k2 = op_2(phi_phi); - KK[b] = gaxpy_oop(1.0, k1, 1.0, k2, false); - /* Exchange op_1x{}; op_1x.set_parameters(chi.X[b], phi0, lo); op_1x.set_algorithm(algo); @@ -354,10 +340,8 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto k2y = op_2y(phi_1); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); - */ world.gop.fence(); } - K = to_X_space(KK); } else { for (int b = 0; b < num_states; b++) { Exchange op_1x{}; From 99b2d48ddc051b31fdae1cfc1be172b08583fcf6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:24:10 -0500 Subject: [PATCH 0644/1312] small changes --- src/apps/molresponse/FrequencyResponse.cpp | 1 - src/apps/molresponse/ResponseBase.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 369111f1987..e6d0dc55724 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -247,7 +247,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; auto x = chi.copy();// copy chi X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2c8d5d5a28a..66623a9c405 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -461,7 +461,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // Create Coulomb potential on ground_orbitals functionT rho_x_b; functionT rho_y_b; - auto mul_tol = FunctionDefaults<3>::get_thresh(); // note that x can refer to x or y auto compute_j = [&, &phi0 = phi0](const auto &dx) { From 206078533c2f582d76ecf3dd0bda82af74f4ba37 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:30:03 -0500 Subject: [PATCH 0645/1312] change J back to old version --- src/apps/molresponse/ResponseBase.cpp | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 66623a9c405..08c2b426c75 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -463,21 +463,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit functionT rho_y_b; auto mul_tol = FunctionDefaults<3>::get_thresh(); // note that x can refer to x or y - auto compute_j = [&, &phi0 = phi0](const auto &dx) { - auto rho_x_b = dot(world, dx, phi0); - rho_x_b.truncate(); - rho_x_b = apply(*shared_coulomb_operator, rho_x_b); - world.gop.fence(); - return mul_sparse(world, rho_x_b, phi0, mul_tol, true); - }; - - std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); - if (world.rank() == 0) { print("compute jX"); } - std::transform(chi_alpha.Y.begin(), chi_alpha.Y.end(), j_y.begin(), compute_j); - if (world.rank() == 0) { print("compute jy"); } - - J.X = j_x + j_y; - if (world.rank() == 0) { print("add jx+jy"); } + auto rho_b = make_density(world, chi_alpha); + int b = 0; + for (const auto &rho_b_i: rho_b) { + auto temp_J = apply(*shared_coulomb_operator, rho_b_i); + J.X[b++] = mul(world, temp_J, phi0); + } J.Y = J.X.copy(); if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); From fb3fca175bed673dde5cba92b7462aba83259c46 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:37:19 -0500 Subject: [PATCH 0646/1312] gamma clean up --- src/apps/molresponse/ResponseBase.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 08c2b426c75..6fbc94775ee 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -498,11 +498,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); - gamma = 2 * J; - if (world.rank() == 0) { print("gamma: 2 * J"); } - gamma += -c_xc * K; - if (world.rank() == 0) { print("gamma: += -c_xc * K"); } - + gamma = 2 * J - c_xc * K + (1.0 - c_xc) * W; if (xcf.hf_exchange_coefficient() != 1.0) { gamma += W; if (world.rank() == 0) { print("gamma: += W"); } @@ -521,7 +517,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } - if (r_params.print_level() >= 20) { molresponse::start_timer(world); print_inner(world, "xJx", chi_alpha, J); @@ -543,7 +538,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - //gamma.truncate(); + gamma.truncate(); return gamma; // Get sizes } From bb2cc33a4d37def60df57d067bea074f2b3823c9 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 11 Jan 2023 10:52:03 +0100 Subject: [PATCH 0647/1312] towards scripted tests --- CMakeLists.txt | 2 ++ cmake/modules/AddScriptedTests.cmake | 38 ++++++++++++++++++++++++++++ src/madness/world/CMakeLists.txt | 5 +++- 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 cmake/modules/AddScriptedTests.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8de4b331188..8e8d2b2d7d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,7 @@ include(CMakeDependentOption) include(AddMADLibrary) include(AddMADExecutable) include(AddUnittests) +include(AddScriptedTests) include(CMakePackageConfigHelpers) include(CopyTargetProperties) include(FeatureSummary) @@ -670,6 +671,7 @@ include(CTest) if(BUILD_TESTING) set(MADNESS_HAS_GOOGLE_TEST 1) add_custom_target_subproject(madness unittests) + add_custom_target_subproject(madness scripted_tests) add_custom_target_subproject(madness check COMMAND ${CMAKE_CTEST_COMMAND} -V -R "madness/test/" USES_TERMINAL) # to be GNU compatible add_dependencies(everything unittests) endif() diff --git a/cmake/modules/AddScriptedTests.cmake b/cmake/modules/AddScriptedTests.cmake new file mode 100644 index 00000000000..ef89ea51116 --- /dev/null +++ b/cmake/modules/AddScriptedTests.cmake @@ -0,0 +1,38 @@ +# macro will build (i.e. copy the test script to the build directory) and execute the script + +# example +# CMakeLists.txt: add_scripted_tests(nemo_test1.py nemo) + + +macro(add_scripted_tests _testcase _binary _labels) + + # Add targets and for scripted tests + add_custom_target_subproject(madness ${_testcase}_scripted_tests) + add_dependencies(scripted_tests-madness ${_testcase}_scripted_tests-madness) + +# Add a test that builds the binary + add_test(madness/test/${_binary}/build + "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${_binary}) + set_tests_properties(madness/test/${_binary}/build + PROPERTIES DEPENDS ${_binary} LABELS scripted_tests) + +# Add a test that copies the test scripts + add_test(madness/test/scripted_tests/${_binary}/${_testcase}/copy + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/${_testcase} + ${CMAKE_CURRENT_BINARY_DIR}/${_testcase}) + set_tests_properties(madness/test/scripted_tests/${_binary}/${_testcase}/copy + PROPERTIES DEPENDS ${_binary} LABELS scripted_tests) + + message(STATUS "testcase: " ${_testcase}) + message(STATUS "binary: " ${_binary}) + message(STATUS "labels: " ${_labels}) + message(STATUS "sourcedir " ${CMAKE_CURRENT_SOURCE_DIR}) + message(STATUS "binarydir " ${CMAKE_CURRENT_BINARY_DIR}) + + # Add the tests (execution and result) and set dependencies + add_test(NAME madness/test/scripted_tests/${_binary}/${_testcase}/run COMMAND ${_testcase}) + set_tests_properties(madness/test/scripted_tests/${_binary}/${_testcase}/run + PROPERTIES LABELS scripted_tests) + +endmacro() \ No newline at end of file diff --git a/src/madness/world/CMakeLists.txt b/src/madness/world/CMakeLists.txt index 99021530618..74b108ffaf3 100644 --- a/src/madness/world/CMakeLists.txt +++ b/src/madness/world/CMakeLists.txt @@ -97,7 +97,10 @@ if(BUILD_TESTING) test_worldref.cc test_stack.cc test_googletest.cc test_tree.cc ) - add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest") + add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest") + +# add_scripted_tests(test.py test_tree "scripted") +# add_scripted_tests(test1.py test_hello "scripted") find_package(CUDA) if (TARGET PaRSEC::parsec AND CUDA_FOUND) From 482e80d7a5bc0f05ea9af4ae3975716f5af71d76 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 11 Jan 2023 23:14:08 +0100 Subject: [PATCH 0648/1312] adding more scripted tests for nemo --- bin/madjsoncompare.py | 51 +++++++++++++++++++ cmake/modules/AddScriptedTests.cmake | 35 ++++++++----- src/apps/nemo/CMakeLists.txt | 3 ++ src/apps/nemo/madtest1.scf_info.ref.json | 1 + src/apps/nemo/madtestboys.scf_info.ref.json | 1 + src/apps/nemo/madtestcanon.scf_info.ref.json | 1 + src/apps/nemo/madtestnew.scf_info.ref.json | 1 + src/apps/nemo/test_energy.py | 42 ++++++++++++++++ src/apps/nemo/test_localization.py | 52 ++++++++++++++++++++ 9 files changed, 175 insertions(+), 12 deletions(-) create mode 100644 bin/madjsoncompare.py create mode 100644 src/apps/nemo/madtest1.scf_info.ref.json create mode 100644 src/apps/nemo/madtestboys.scf_info.ref.json create mode 100644 src/apps/nemo/madtestcanon.scf_info.ref.json create mode 100644 src/apps/nemo/madtestnew.scf_info.ref.json create mode 100755 src/apps/nemo/test_energy.py create mode 100755 src/apps/nemo/test_localization.py diff --git a/bin/madjsoncompare.py b/bin/madjsoncompare.py new file mode 100644 index 00000000000..9f71ccc5bf4 --- /dev/null +++ b/bin/madjsoncompare.py @@ -0,0 +1,51 @@ +import json + +class madjsoncompare: + # """takes two json output files and compares individual keys, accessed by a list of descending keys""" + def __init__(self, file1, file2): + self.file1=file1 + self.file2=file2 + self.success=True + + with open(file1, 'r') as f: + self.data1 = json.load(f) + + with open(file2, 'r') as f: + self.data2 = json.load(f) + + def exitcode(self): + if self.success: + return 0 + else: + return 1 + + def compare(self, subsequentkeys, tolerance): + value1=self.data1 + value2=self.data2 + for i in subsequentkeys: + value1=value1[i] + value2=value2[i] + + # print("type of key/value",type(i),type(value1)) + success=False + diff='is different' + if (type(value1)==float): + diff=abs(value1-value2) + success=diff Date: Fri, 13 Jan 2023 13:03:04 +0100 Subject: [PATCH 0649/1312] json for more applications --- src/madness/chem/CCStructures.h | 2 + .../chem/QCCalculationParametersBase.h | 2 +- src/madness/chem/SCF.cc | 59 +++++++++---------- src/madness/chem/SCF.h | 39 ++---------- src/madness/chem/TDHF.cc | 9 +++ src/madness/chem/nemo.cc | 7 +-- src/madness/tensor/tensor_json.hpp | 32 ++++++++-- 7 files changed, 74 insertions(+), 76 deletions(-) diff --git a/src/madness/chem/CCStructures.h b/src/madness/chem/CCStructures.h index 2f7e0a2f2d4..1f1631b15a6 100644 --- a/src/madness/chem/CCStructures.h +++ b/src/madness/chem/CCStructures.h @@ -672,6 +672,8 @@ struct CC_vecfunction { ktmp.second.plot(msg); } } +public: + NLOHMANN_DEFINE_TYPE_INTRUSIVE(CC_vecfunction, excitation, omega, irrep, current_error) }; diff --git a/src/madness/chem/QCCalculationParametersBase.h b/src/madness/chem/QCCalculationParametersBase.h index 982ea39c55f..0a0b50c580a 100644 --- a/src/madness/chem/QCCalculationParametersBase.h +++ b/src/madness/chem/QCCalculationParametersBase.h @@ -297,7 +297,7 @@ class QCCalculationParametersBase { } catch (std::invalid_argument& e) { throw; } catch (std::exception& e) { - print(e.what()); + madness::print(e.what()); } read_commandline_options(world,parser,tag); } diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 39a863cf804..df92af41627 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -142,38 +142,33 @@ tensorT Q2(const tensorT& s) { }// namespace madness -void -SCF::output_scf_info_schema(const int &iter, const std::map &vals, const tensorT &dipole_T) const { +void SCF::output_calc_info_schema() const { nlohmann::json j = {}; - j.push_back(nlohmann::json()); - // TODO (Adrian) possibly read in json from filesystem. - // if it exists figure out the size. pushback for each protocol - j[0]["scf_iterations"] = iter; - const double thresh = FunctionDefaults<3>::get_thresh(); - const int k = FunctionDefaults<3>::get_k(); - j[0]["scf_threshold"] = thresh; - j[0]["scf_k"] = k; - for (auto const &[key, val]: vals) { - j[0][key] = val; - } - j[0]["scf_dipole_moment"] = tensor_to_json(dipole_T); - int num = 0; - std::string save = param.prefix() + ".scf_info.json"; -#ifdef MADCHEM_HAS_STD_FILESYSTEM - if (std::filesystem::exists(save)) { - std::ifstream ifs(save); -#else - std::ifstream ifs(save); - if (ifs) { -#endif - nlohmann::json j_old; - ifs >> j_old; - print(j_old); - j_old.push_back(j); - j = j_old; - }; - std::ofstream ofs(save); - ofs << j; + vec_pair_ints int_vals; + vec_pair_T double_vals; + vec_pair_tensor_T double_tensor_vals; + + + int_vals.push_back({"calcinfo_nmo", param.nmo_alpha() + param.nmo_beta()}); + int_vals.push_back({"calcinfo_nalpha", param.nalpha()}); + int_vals.push_back({"calcinfo_nbeta", param.nbeta()}); + int_vals.push_back({"calcinfo_natom", molecule.natom()}); + int_vals.push_back({"k", FunctionDefaults<3>::get_k()}); + + to_json(j, int_vals); +// double_vals.push_back({"return_energy", value(molecule.get_all_coords().flat())}); + double_vals.push_back({"return_energy", current_energy}); + to_json(j, double_vals); + double_tensor_vals.push_back({"scf_eigenvalues_a", aeps}); + if (param.nbeta() != 0 && !param.spin_restricted()) { + double_tensor_vals.push_back({"scf_eigenvalues_b", beps}); + } + + to_json(j, double_tensor_vals); + param.to_json(j); + e_data.to_json(j); + + output_schema(param.prefix()+".calc_info", j); } void scf_data::add_data(std::map values) { @@ -199,7 +194,7 @@ scf_data::scf_data() : iter(0) { } -void scf_data::to_json(json &j) { +void scf_data::to_json(json &j) const { ::print("SCF DATA TO JSON"); j["scf_e_data"] = json(); diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index b17437c7d45..1fc07f361eb 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -178,7 +178,7 @@ class MomentFunctor : public FunctionFunctorInterface { scf_data(); - void to_json(json &j); + void to_json(json &j) const; void print_data(); @@ -249,7 +249,7 @@ class SCF { static void print_parameters() { CalculationParameters param; print("default parameters for the moldft program are"); - param.print("dft","end"); + param.print("dft", "end"); print("\n\nthe molecular geometry must be specified in a separate block:"); Molecule::print_parameters(); } @@ -503,11 +503,9 @@ class SCF { // For given protocol, solve the DFT/HF/response equations void solve(World& world); - // - void output_scf_info_schema(const int& iter, const std::map& vals, const tensorT& dipole_T) const; + void output_calc_info_schema() const; }; - // Computes molecular energy as a function of the geometry // This is cludgy ... need better factorization of functionality // between calculation, main program and this ... or just merge it all. @@ -676,36 +674,11 @@ class MolecularEnergy : public OptimizationTargetInterface, public QCPropertyInt gradient = calc.derivatives(world, rho); } - void output_calc_info_schema() { - nlohmann::json j = {}; - vec_pair_ints int_vals; - vec_pair_T double_vals; - vec_pair_tensor_T double_tensor_vals; - - CalculationParameters param = calc.param; - - - - int_vals.push_back({"calcinfo_nmo", param.nmo_alpha() + param.nmo_beta()}); - int_vals.push_back({"calcinfo_nalpha", param.nalpha()}); - int_vals.push_back({"calcinfo_nbeta", param.nbeta()}); - int_vals.push_back({"calcinfo_natom", calc.molecule.natom()}); - int_vals.push_back({"k", FunctionDefaults<3>::get_k()}); - - to_json(j, int_vals); - double_vals.push_back({"return_energy", value(calc.molecule.get_all_coords().flat())}); - to_json(j, double_vals); - double_tensor_vals.push_back({"scf_eigenvalues_a", calc.aeps}); - if (param.nbeta() != 0 && !param.spin_restricted()) { - double_tensor_vals.push_back({"scf_eigenvalues_b", calc.beps}); - } + void output_calc_info_schema() const { + calc.output_calc_info_schema(); + } - to_json(j, double_tensor_vals); - param.to_json(j); - calc.e_data.to_json(j); - output_schema(param.prefix()+".calc_info", j); - } }; } diff --git a/src/madness/chem/TDHF.cc b/src/madness/chem/TDHF.cc index 98924b418bb..db9ddfca0d7 100644 --- a/src/madness/chem/TDHF.cc +++ b/src/madness/chem/TDHF.cc @@ -254,6 +254,8 @@ std::vector TDHF::solve_cis() const { if (converged_roots.size() >= size_t(parameters.excitations())) break; } + + return converged_roots; } @@ -1485,6 +1487,7 @@ double TDHF::oscillator_strength_velocity(const CC_vecfunction &x) const { void TDHF::analyze(const std::vector &x) const { const size_t noct = get_active_mo_ket().size(); + nlohmann::json j; for (const CC_vecfunction &root : x) { @@ -1518,7 +1521,13 @@ void TDHF::analyze(const std::vector &x) const { } } if (world.rank() == 0) print(" "); + j.push_back(root); + j.back()["oscillator_strength_length"]=osl; + j.back()["oscillator_strength_velocity"]=osv; } + nlohmann::json j1; + j1["cis_excitations"]=j; + update_schema(get_calc()->param.prefix()+".calc_info", j1); // compute the transition densities const vector_real_function_3d bra_oct = get_active_mo_bra(); diff --git a/src/madness/chem/nemo.cc b/src/madness/chem/nemo.cc index 2d5bc2a2034..c5268541bda 100644 --- a/src/madness/chem/nemo.cc +++ b/src/madness/chem/nemo.cc @@ -216,10 +216,9 @@ double Nemo::value(const Tensor& x) { if(world.rank()==0) std::cout << "Nemo Orbital Energies: " << calc->aeps << "\n"; - std::map results; - results["scf_energy"]=calc->current_energy; - calc->output_scf_info_schema(0,results,dipole); - return calc->current_energy; + calc->output_calc_info_schema(); + + return calc->current_energy; } diff --git a/src/madness/tensor/tensor_json.hpp b/src/madness/tensor/tensor_json.hpp index 25263b96eb4..4e64f936553 100644 --- a/src/madness/tensor/tensor_json.hpp +++ b/src/madness/tensor/tensor_json.hpp @@ -78,20 +78,40 @@ namespace madness { } template - void output_schema(std::string schema_name, nlohmann::json& j) { - std::ofstream ofs(schema_name + ".json"); + nlohmann::json add_time_tag(const nlohmann::json& j1) { + auto print_time = std::chrono::system_clock::now(); auto in_time_t = std::chrono::system_clock::to_time_t(print_time); std::stringstream ss; ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); - print(ss.str()); - print("printing j", j); - + auto j=j1; j["time"] = ss.str(); j["wall_time"] = wall_time(); + return j; + } + + template + void output_schema(const std::string schema_name, const nlohmann::json& j) { + auto j1= add_time_tag(j); + std::ofstream ofs(schema_name + ".json"); + ofs << std::setw(4) << j1; + } - ofs << std::setw(4) << j; + template + nlohmann::json input_schema(const std::string& schema_name) { + // read old schema + std::ifstream ifs(schema_name+".json"); + nlohmann::json j; + if (ifs.is_open()) j=nlohmann::json::parse(ifs); + return j; + } + + template + void update_schema(const std::string schema_name, const nlohmann::json& jnew) { + auto j=input_schema(schema_name); + j.update(jnew); + output_schema(schema_name,j); } }// namespace madness From 6af2c0a3cef7a2f35ab8bc438f3b4df43ecc5c74 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 13 Jan 2023 22:57:57 +0100 Subject: [PATCH 0650/1312] json for more applications --- cmake/modules/AddScriptedTests.cmake | 6 +- src/apps/cis/CMakeLists.txt | 3 + ...d_cis_test_energy_he.py.calc_info.ref.json | 95 ++++++++++++++++ ...is_test_symmetry_h2o.py.calc_info.ref.json | 91 ++++++++++++++++ ...s_test_symmetry_h2o.py1.calc_info.ref.json | 91 ++++++++++++++++ src/apps/cis/test_callable.py | 36 +++++++ src/apps/cis/test_energy_he.py | 36 +++++++ src/apps/cis/test_symmetry_h2o.py | 56 ++++++++++ src/apps/moldft/CMakeLists.txt | 3 + ...d_moldft_test_energy.py.calc_info.ref.json | 101 ++++++++++++++++++ src/apps/moldft/test_energy.py | 35 ++++++ ...mad_nemo_test_energy.py.calc_info.ref.json | 77 +++++++++++++ src/apps/nemo/madtest1.scf_info.ref.json | 1 - src/apps/nemo/madtestboys.calc_info.ref.json | 81 ++++++++++++++ src/apps/nemo/madtestboys.scf_info.ref.json | 1 - src/apps/nemo/madtestcanon.calc_info.ref.json | 81 ++++++++++++++ src/apps/nemo/madtestcanon.scf_info.ref.json | 1 - src/apps/nemo/madtestnew.calc_info.ref.json | 81 ++++++++++++++ src/apps/nemo/madtestnew.scf_info.ref.json | 1 - src/apps/nemo/test_energy.py | 37 +++---- src/apps/nemo/test_localization.py | 23 ++-- src/madness/chem/SCF.cc | 3 +- src/madness/chem/TDHF.cc | 2 + 23 files changed, 897 insertions(+), 45 deletions(-) create mode 100644 src/apps/cis/mad_cis_test_energy_he.py.calc_info.ref.json create mode 100644 src/apps/cis/mad_cis_test_symmetry_h2o.py.calc_info.ref.json create mode 100644 src/apps/cis/mad_cis_test_symmetry_h2o.py1.calc_info.ref.json create mode 100755 src/apps/cis/test_callable.py create mode 100755 src/apps/cis/test_energy_he.py create mode 100755 src/apps/cis/test_symmetry_h2o.py create mode 100644 src/apps/moldft/mad_moldft_test_energy.py.calc_info.ref.json create mode 100755 src/apps/moldft/test_energy.py create mode 100644 src/apps/nemo/mad_nemo_test_energy.py.calc_info.ref.json delete mode 100644 src/apps/nemo/madtest1.scf_info.ref.json create mode 100644 src/apps/nemo/madtestboys.calc_info.ref.json delete mode 100644 src/apps/nemo/madtestboys.scf_info.ref.json create mode 100644 src/apps/nemo/madtestcanon.calc_info.ref.json delete mode 100644 src/apps/nemo/madtestcanon.scf_info.ref.json create mode 100644 src/apps/nemo/madtestnew.calc_info.ref.json delete mode 100644 src/apps/nemo/madtestnew.scf_info.ref.json diff --git a/cmake/modules/AddScriptedTests.cmake b/cmake/modules/AddScriptedTests.cmake index ca3b52d3131..17e750fb753 100644 --- a/cmake/modules/AddScriptedTests.cmake +++ b/cmake/modules/AddScriptedTests.cmake @@ -12,8 +12,8 @@ macro(add_scripted_tests _testcase_in _binary _labels) set(_testcase ${_testcase_in}) # Add targets and for scripted tests - add_custom_target_subproject(madness ${_testcase}_scripted_tests) - add_dependencies(scripted_tests-madness ${_testcase}_scripted_tests-madness) + add_custom_target_subproject(madness ${_testcase}_${_binary}_scripted_tests) + add_dependencies(scripted_tests-madness ${_testcase}_${_binary}_scripted_tests-madness) # Add a test that builds the binary add_test(madness/test/${_binary}/build @@ -33,6 +33,8 @@ macro(add_scripted_tests _testcase_in _binary _labels) endif() # copy the test scripts and replaces the variable to the source directory containing the reference json outputs set(SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}) + set(BINARY ${_binary}) + set(TESTCASE ${_testcase}) configure_file(${_testcase} ${_testcase} @ONLY) # message(STATUS "testcase: " ${_testcase}) diff --git a/src/apps/cis/CMakeLists.txt b/src/apps/cis/CMakeLists.txt index b2297cf3416..ca0c01b80ea 100644 --- a/src/apps/cis/CMakeLists.txt +++ b/src/apps/cis/CMakeLists.txt @@ -3,5 +3,8 @@ add_mad_executable(cis cis.cpp "MADchem") add_dependencies(applications-madness cis) +add_scripted_tests(test_callable.py cis "short;application") +add_scripted_tests(test_energy_he.py cis "medium;application") +add_scripted_tests(test_symmetry_h2o.py cis "long;application") install(TARGETS cis DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/cis/mad_cis_test_energy_he.py.calc_info.ref.json b/src/apps/cis/mad_cis_test_energy_he.py.calc_info.ref.json new file mode 100644 index 00000000000..ae3c11ce4ea --- /dev/null +++ b/src/apps/cis/mad_cis_test_energy_he.py.calc_info.ref.json @@ -0,0 +1,95 @@ +{ + "calcinfo_nalpha": 1, + "calcinfo_natom": 1, + "calcinfo_nbeta": 1, + "calcinfo_nmo": 2, + "cis_excitations": [ + { + "current_error": 0.42771340146642123, + "excitation": 0, + "irrep": "a", + "omega": 0.8537474375326528, + "oscillator_strength_length": 0.18676996305232113, + "oscillator_strength_velocity": 0.14416397075254817 + }, + { + "current_error": 0.7899482510479806, + "excitation": 1, + "irrep": "a", + "omega": 0.8622170407245322, + "oscillator_strength_length": 1.1708828224761008e-16, + "oscillator_strength_velocity": 8.783950329067414e-17 + } + ], + "k": 6, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 0.0001, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": -1, + "l": 50.0, + "lo": 0.013396, + "loadbalparts": 2, + "maxiter": 1, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 1, + "nbeta": 1, + "nio": 1, + "nmo_alpha": 1, + "nmo_beta": 1, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": 0.0, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 1 + ], + "size": 1, + "vals": [ + -0.9223614119238546 + ] + }, + "time": "2023-01-13 14:06:06", + "wall_time": 7.2820069789886475 +} \ No newline at end of file diff --git a/src/apps/cis/mad_cis_test_symmetry_h2o.py.calc_info.ref.json b/src/apps/cis/mad_cis_test_symmetry_h2o.py.calc_info.ref.json new file mode 100644 index 00000000000..22871df06a5 --- /dev/null +++ b/src/apps/cis/mad_cis_test_symmetry_h2o.py.calc_info.ref.json @@ -0,0 +1,91 @@ +{ + "calcinfo_nalpha": 5, + "calcinfo_natom": 3, + "calcinfo_nbeta": 5, + "calcinfo_nmo": 10, + "cis_excitations": [ + { + "current_error": 0.0013072029534875592, + "excitation": 0, + "irrep": "b1", + "omega": 0.323418449616142, + "oscillator_strength_length": 0.048603656877145775, + "oscillator_strength_velocity": 0.06653531351642708 + } + ], + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.0001, + "derivatives": false, + "dipole": false, + "econv": 1e-05, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": 8, + "l": 51.427, + "lo": 0.001329, + "loadbalparts": 2, + "maxiter": 25, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 5, + "nbeta": 5, + "nio": 1, + "nmo_alpha": 5, + "nmo_beta": 5, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -76.06815242574442, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 5 + ], + "size": 5, + "vals": [ + -20.5603929499122, + -1.3591667875853617, + -0.7302075856187005, + -0.5839695148435231, + -0.5112127229564482 + ] + }, + "time": "2023-01-13 22:39:23", + "wall_time": 114.18017506599426 +} \ No newline at end of file diff --git a/src/apps/cis/mad_cis_test_symmetry_h2o.py1.calc_info.ref.json b/src/apps/cis/mad_cis_test_symmetry_h2o.py1.calc_info.ref.json new file mode 100644 index 00000000000..dc8f236efe5 --- /dev/null +++ b/src/apps/cis/mad_cis_test_symmetry_h2o.py1.calc_info.ref.json @@ -0,0 +1,91 @@ +{ + "calcinfo_nalpha": 5, + "calcinfo_natom": 3, + "calcinfo_nbeta": 5, + "calcinfo_nmo": 10, + "cis_excitations": [ + { + "current_error": 0.0005892647041639927, + "excitation": 0, + "irrep": "a2", + "omega": 0.3842214144996289, + "oscillator_strength_length": 9.857594355145078e-26, + "oscillator_strength_velocity": 1.8716106572289434e-27 + } + ], + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.0001, + "derivatives": false, + "dipole": false, + "econv": 1e-05, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": 8, + "l": 51.427, + "lo": 0.001329, + "loadbalparts": 2, + "maxiter": 25, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 5, + "nbeta": 5, + "nio": 1, + "nmo_alpha": 5, + "nmo_beta": 5, + "no_compute": true, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -76.06797621693613, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 5 + ], + "size": 5, + "vals": [ + -20.560392949912178, + -1.359166787585358, + -0.7302075856186984, + -0.5839695148435157, + -0.5112127229564459 + ] + }, + "time": "2023-01-13 22:49:56", + "wall_time": 90.58036994934082 +} \ No newline at end of file diff --git a/src/apps/cis/test_callable.py b/src/apps/cis/test_callable.py new file mode 100755 index 00000000000..7dd7e50780a --- /dev/null +++ b/src/apps/cis/test_callable.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") + + prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --input=input --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; excitations=0"' + cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + print("finished with run") + print(p.stdout) + exitcode=p.returncode + print("exitcode ",exitcode) + + # compare results + # cmp=madjsoncompare(outputfile,referencefile) + # cmp.compare(["cis_excitations",0,"irrep"],1.0) + # cmp.compare(["cis_excitations",0,"omega"],1.e-3) + # print("final success: ",cmp.success) + + sys.exit(p.returncode) \ No newline at end of file diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py new file mode 100755 index 00000000000..7c9a4fa9415 --- /dev/null +++ b/src/apps/cis/test_energy_he.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") + + prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --input=input --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; guess_excitations=2; excitations=2"' + cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + print("finished with run") + print(output) + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["cis_excitations",0,"irrep"],1.0) + cmp.compare(["cis_excitations",0,"omega"],1.e-3) + cmp.compare(["cis_excitations",1,"irrep"],1.0) + cmp.compare(["cis_excitations",1,"omega"],1.e-3) + print("final success: ",cmp.success) + + sys.exit(cmp.exitcode()) \ No newline at end of file diff --git a/src/apps/cis/test_symmetry_h2o.py b/src/apps/cis/test_symmetry_h2o.py new file mode 100755 index 00000000000..0bd15b0c009 --- /dev/null +++ b/src/apps/cis/test_symmetry_h2o.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") + + prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --input=input --geometry=h2o' + dft_arguments=' --dft="k=8; localize=canon; prefix='+prefix+'"' + other_arguments=' --response="freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' + cmd='rm '+outputfile+'; cis '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + print("finished with run") + print(output) + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["cis_excitations",0,"irrep"],1.0) + cmp.compare(["cis_excitations",0,"omega"],1.e-4) + cmp.compare(["cis_excitations",0,"oscillator_strength_length"],1.e-3) + cmp.compare(["cis_excitations",0,"oscillator_strength_velocity"],1.e-3) + + referencefile="@SRCDIR@/"+prefix+"1.calc_info.ref.json" + + + dft_arguments=' --dft="k=8; localize=canon; prefix='+prefix+'; no_compute=1"' + other_arguments=' --response="irrep=a2; freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' + cmd='cis '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + print("finished with run") + print(output) + + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["cis_excitations",0,"irrep"],1.0) + cmp.compare(["cis_excitations",0,"omega"],1.e-4) + cmp.compare(["cis_excitations",0,"oscillator_strength_length"],1.e-3) + cmp.compare(["cis_excitations",0,"oscillator_strength_velocity"],1.e-3) + print("final success: ",cmp.success) + + + sys.exit(cmp.exitcode()) \ No newline at end of file diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index d98e863f179..9a95690fad3 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -11,5 +11,8 @@ add_mad_executable(testpg testpg.cc MADchem) add_mad_executable(testperiodicdft testperiodicdft.cc MADchem) +add_scripted_tests(test_energy.py moldft "short;application") + + # removed mcpfit since it is likely only of historic interest install(TARGETS moldft DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/moldft/mad_moldft_test_energy.py.calc_info.ref.json b/src/apps/moldft/mad_moldft_test_energy.py.calc_info.ref.json new file mode 100644 index 00000000000..d1e6e1f8147 --- /dev/null +++ b/src/apps/moldft/mad_moldft_test_energy.py.calc_info.ref.json @@ -0,0 +1,101 @@ +{ + "calcinfo_nalpha": 1, + "calcinfo_natom": 1, + "calcinfo_nbeta": 1, + "calcinfo_nmo": 2, + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 0.0001, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": -1, + "l": 50.0, + "lo": 0.013396, + "loadbalparts": 2, + "maxiter": 1, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 1, + "nbeta": 1, + "nio": 1, + "nmo_alpha": 1, + "nmo_beta": 1, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -2.861353410011521, + "scf_e_data": { + "e_coulomb": [ + 2.018645448166965, + 2.04048235799564 + ], + "e_kinetic": [ + 2.7628170728201096, + 2.8227846011865667 + ], + "e_local": [ + 0.0, + 0.0 + ], + "e_nrep": [ + 0.0, + 0.0 + ], + "e_nuclear": [ + -6.626451864301439, + -6.704379191630678 + ], + "e_pcm": [ + 0.0, + 0.0 + ], + "e_tot": [ + -2.8543126357346864, + -2.861353410011521 + ], + "e_xc": [ + -1.0093232924203221, + -1.0202411775630498 + ], + "iterations": 2 + }, + "scf_eigenvalues_a": { + "dims": [ + 1 + ], + "size": 1, + "vals": [ + -0.5563790539362039 + ] + }, + "time": "2023-01-13 23:48:06", + "wall_time": 1.9541189670562744 +} \ No newline at end of file diff --git a/src/apps/moldft/test_energy.py b/src/apps/moldft/test_energy.py new file mode 100755 index 00000000000..e97ceecb7b7 --- /dev/null +++ b/src/apps/moldft/test_energy.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") + + prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --input=input --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments='' + cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + print("finished with run") + print(p.stdout) + exitcode=p.returncode + print("exitcode ",exitcode) + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["return_energy"],1.e-4) + print("final success: ",cmp.success) + + sys.exit(p.returncode + exitcode) \ No newline at end of file diff --git a/src/apps/nemo/mad_nemo_test_energy.py.calc_info.ref.json b/src/apps/nemo/mad_nemo_test_energy.py.calc_info.ref.json new file mode 100644 index 00000000000..802ddfb9468 --- /dev/null +++ b/src/apps/nemo/mad_nemo_test_energy.py.calc_info.ref.json @@ -0,0 +1,77 @@ +{ + "calcinfo_nalpha": 1, + "calcinfo_natom": 1, + "calcinfo_nbeta": 1, + "calcinfo_nmo": 2, + "k": 6, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 0.0001, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": -1, + "l": 50.0, + "lo": 0.013396, + "loadbalparts": 2, + "maxiter": 1, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 1, + "nbeta": 1, + "nio": 1, + "nmo_alpha": 1, + "nmo_beta": 1, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": 0.0, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 1 + ], + "size": 1, + "vals": [ + -0.9223614119238541 + ] + }, + "time": "2023-01-13 23:53:59", + "wall_time": 1.3197541236877441 +} \ No newline at end of file diff --git a/src/apps/nemo/madtest1.scf_info.ref.json b/src/apps/nemo/madtest1.scf_info.ref.json deleted file mode 100644 index d2d89f7187d..00000000000 --- a/src/apps/nemo/madtest1.scf_info.ref.json +++ /dev/null @@ -1 +0,0 @@ -[{"scf_dipole_moment":{"dims":[3],"size":3,"vals":[-7.344069996440976e-12,-7.339122050401424e-12,-7.327683299149134e-12]},"scf_energy":0.0,"scf_iterations":0,"scf_k":6,"scf_threshold":0.0001},[{"scf_dipole_moment":{"dims":[3],"size":3,"vals":[-7.346708892628164e-12,-7.342900079858948e-12,-7.340962009652167e-12]},"scf_energy":0.0,"scf_iterations":0,"scf_k":6,"scf_threshold":0.0001}]] \ No newline at end of file diff --git a/src/apps/nemo/madtestboys.calc_info.ref.json b/src/apps/nemo/madtestboys.calc_info.ref.json new file mode 100644 index 00000000000..4900bcd04e4 --- /dev/null +++ b/src/apps/nemo/madtestboys.calc_info.ref.json @@ -0,0 +1,81 @@ +{ + "calcinfo_nalpha": 5, + "calcinfo_natom": 3, + "calcinfo_nbeta": 5, + "calcinfo_nmo": 10, + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 3e-05, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": 8, + "l": 51.427, + "lo": 0.001329, + "loadbalparts": 2, + "maxiter": 10, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 5, + "nbeta": 5, + "nio": 1, + "nmo_alpha": 5, + "nmo_beta": 5, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -76.06811421364738, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 5 + ], + "size": 5, + "vals": [ + -20.42914360751624, + -0.9328625128954031, + -0.9328626031474729, + -0.7250463973947698, + -0.7250475832515377 + ] + }, + "time": "2023-01-13 23:38:40", + "wall_time": 36.969685792922974 +} \ No newline at end of file diff --git a/src/apps/nemo/madtestboys.scf_info.ref.json b/src/apps/nemo/madtestboys.scf_info.ref.json deleted file mode 100644 index 6113cc622f3..00000000000 --- a/src/apps/nemo/madtestboys.scf_info.ref.json +++ /dev/null @@ -1 +0,0 @@ -[{"scf_dipole_moment":{"dims":[3],"size":3,"vals":[-2.0264160794481233e-09,-2.9052321837075474e-10,-0.7612897120815444]},"scf_energy":-76.06811421354803,"scf_iterations":0,"scf_k":8,"scf_threshold":3e-05}] \ No newline at end of file diff --git a/src/apps/nemo/madtestcanon.calc_info.ref.json b/src/apps/nemo/madtestcanon.calc_info.ref.json new file mode 100644 index 00000000000..60a39ad6e26 --- /dev/null +++ b/src/apps/nemo/madtestcanon.calc_info.ref.json @@ -0,0 +1,81 @@ +{ + "calcinfo_nalpha": 5, + "calcinfo_natom": 3, + "calcinfo_nbeta": 5, + "calcinfo_nmo": 10, + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 3e-05, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": 8, + "l": 51.427, + "lo": 0.001329, + "loadbalparts": 2, + "maxiter": 10, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 5, + "nbeta": 5, + "nio": 1, + "nmo_alpha": 5, + "nmo_beta": 5, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -76.06814005437352, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 5 + ], + "size": 5, + "vals": [ + -20.560378267443163, + -1.3591598586766904, + -0.7301960973271303, + -0.583960354369421, + -0.5112020665001267 + ] + }, + "time": "2023-01-13 23:11:39", + "wall_time": 36.42744588851929 +} \ No newline at end of file diff --git a/src/apps/nemo/madtestcanon.scf_info.ref.json b/src/apps/nemo/madtestcanon.scf_info.ref.json deleted file mode 100644 index 57448464516..00000000000 --- a/src/apps/nemo/madtestcanon.scf_info.ref.json +++ /dev/null @@ -1 +0,0 @@ -[{"scf_dipole_moment":{"dims":[3],"size":3,"vals":[5.860629285294338e-12,4.614213293479703e-14,-0.7610909290281024]},"scf_energy":-76.06814005437353,"scf_iterations":0,"scf_k":8,"scf_threshold":3e-05}] \ No newline at end of file diff --git a/src/apps/nemo/madtestnew.calc_info.ref.json b/src/apps/nemo/madtestnew.calc_info.ref.json new file mode 100644 index 00000000000..1cd539e54a9 --- /dev/null +++ b/src/apps/nemo/madtestnew.calc_info.ref.json @@ -0,0 +1,81 @@ +{ + "calcinfo_nalpha": 5, + "calcinfo_natom": 3, + "calcinfo_nbeta": 5, + "calcinfo_nmo": 10, + "k": 8, + "parameters": { + "charge": 0.0, + "conv_only_dens": false, + "dconv": 0.001, + "derivatives": false, + "dipole": false, + "econv": 3e-05, + "ginitial_hessian": false, + "gmaxiter": 20, + "gopt": false, + "gprec": 0.0001, + "gtest": false, + "gtol": 0.0001, + "gval": 1e-05, + "k": 8, + "l": 51.427, + "lo": 0.001329, + "loadbalparts": 2, + "maxiter": 10, + "maxrotn": 0.25, + "maxsub": 10, + "nalpha": 5, + "nbeta": 5, + "nio": 1, + "nmo_alpha": 5, + "nmo_beta": 5, + "no_compute": false, + "nopen": 0, + "npt_plot": 101, + "nv_factor": 1, + "nvalpha": 0, + "nvbeta": 0, + "orbitalshift": 0.0, + "plotcoul": false, + "plotdens": false, + "plothi": -1, + "plotlo": 0, + "print_level": 3, + "psp_calc": false, + "pure_ae": true, + "restart": false, + "restartao": false, + "save": true, + "smear": 0.0, + "spin_restricted": true, + "vnucextra": 2 + }, + "return_energy": -76.06812003941299, + "scf_e_data": { + "e_coulomb": [], + "e_kinetic": [], + "e_local": [], + "e_nrep": [], + "e_nuclear": [], + "e_pcm": [], + "e_tot": [], + "e_xc": [], + "iterations": 0 + }, + "scf_eigenvalues_a": { + "dims": [ + 5 + ], + "size": 5, + "vals": [ + -20.555091938356124, + -1.0138119526770761, + -1.0138119491001942, + -0.6509448389458057, + -0.5112164209299839 + ] + }, + "time": "2023-01-13 23:42:17", + "wall_time": 36.584208965301514 +} \ No newline at end of file diff --git a/src/apps/nemo/madtestnew.scf_info.ref.json b/src/apps/nemo/madtestnew.scf_info.ref.json deleted file mode 100644 index fb51a0d03eb..00000000000 --- a/src/apps/nemo/madtestnew.scf_info.ref.json +++ /dev/null @@ -1 +0,0 @@ -[{"scf_dipole_moment":{"dims":[3],"size":3,"vals":[1.0102442294823572e-07,9.229512254386729e-11,-0.761167512830669]},"scf_energy":-76.06812003941296,"scf_iterations":0,"scf_k":8,"scf_threshold":3e-05}] \ No newline at end of file diff --git a/src/apps/nemo/test_energy.py b/src/apps/nemo/test_energy.py index 1c48348dc5a..e97ceecb7b7 100755 --- a/src/apps/nemo/test_energy.py +++ b/src/apps/nemo/test_energy.py @@ -2,41 +2,34 @@ import sys import subprocess -import argparse - sys.path.append("@CMAKE_SOURCE_DIR@/bin") from madjsoncompare import madjsoncompare if __name__ == "__main__": - # get command line arguments - parser=argparse.ArgumentParser(description='command line arguments for this test case') - # default value will be set by cmake - parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") - args=parser.parse_args() - # some user output - print("Testing nemo/test_localization") - print(" reference files found in directory:",args.reference_directory) + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") - prefix='madtest1' - outputfile=prefix+'.scf_info.json' - referencefile=args.reference_directory+"/"+prefix+".scf_info.ref.json" + prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - cmd='rm '+outputfile+'; nemo --input=input --geometry=he --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + global_arguments=' --input=input --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments='' + cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,capture_output=True, text=True) print("finished with run") + print(p.stdout) + exitcode=p.returncode + print("exitcode ",exitcode) # compare results cmp=madjsoncompare(outputfile,referencefile) - cmp.compare([0,"scf_k"],1.e-4) - cmp.compare([0,"scf_threshold"],1.e-4) - cmp.compare([0,"scf_energy"],1.e-2) - cmp.compare([0,"scf_energy"],1.e-4) - cmp.compare([0,"scf_dipole_moment","dims"],1.e-4) - cmp.compare([0,"scf_dipole_moment","vals",0],1.e-4) + cmp.compare(["return_energy"],1.e-4) print("final success: ",cmp.success) - sys.exit(cmp.exitcode()) \ No newline at end of file + sys.exit(p.returncode + exitcode) \ No newline at end of file diff --git a/src/apps/nemo/test_localization.py b/src/apps/nemo/test_localization.py index 4a08313c23f..f8355ac3223 100755 --- a/src/apps/nemo/test_localization.py +++ b/src/apps/nemo/test_localization.py @@ -2,7 +2,6 @@ import sys import subprocess -import argparse sys.path.append("@CMAKE_SOURCE_DIR@/bin") from madjsoncompare import madjsoncompare @@ -11,10 +10,10 @@ def localizer_run(localizer): prefix='madtest'+localizer - outputfile=prefix+'.scf_info.json' - refdir=args.reference_directory - referencefile=refdir+"/"+prefix+".scf_info.ref.json" + # prefix='mad_@BINARY@_@TESTCASE@' + outputfile=prefix+'.calc_info.json' + referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" cmd='rm '+outputfile+'; nemo --input=input --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' @@ -23,24 +22,16 @@ def localizer_run(localizer): print("finished with run1") cmp=madjsoncompare(outputfile,referencefile) - cmp.compare([0,"scf_k"],1.e-4) - cmp.compare([0,"scf_threshold"],1.e-4) - cmp.compare([0,"scf_energy"],1.e-2) - cmp.compare([0,"scf_energy"],1.e-4) - cmp.compare([0,"scf_dipole_moment","dims"],1.e-4) - cmp.compare([0,"scf_dipole_moment","vals",0],1.e-4) + cmp.compare(["return_energy"],1.e-4) return cmp.success if __name__ == "__main__": - parser=argparse.ArgumentParser(description='command line arguments for this test case') - # default value will be set by cmake - parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") - args=parser.parse_args() + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory: @SRCDIR@") - print("Testing nemo/test_localization") - print(" reference files found in directory:",args.reference_directory) success=localizer_run('canon') success=localizer_run('boys') and success success=localizer_run('new') and success diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index df92af41627..c4fa21e90e7 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -168,7 +168,8 @@ void SCF::output_calc_info_schema() const { param.to_json(j); e_data.to_json(j); - output_schema(param.prefix()+".calc_info", j); +// output_schema(param.prefix()+".calc_info", j); + update_schema(param.prefix()+".calc_info", j); } void scf_data::add_data(std::map values) { diff --git a/src/madness/chem/TDHF.cc b/src/madness/chem/TDHF.cc index db9ddfca0d7..66b834aee34 100644 --- a/src/madness/chem/TDHF.cc +++ b/src/madness/chem/TDHF.cc @@ -1525,10 +1525,12 @@ void TDHF::analyze(const std::vector &x) const { j.back()["oscillator_strength_length"]=osl; j.back()["oscillator_strength_velocity"]=osv; } + nlohmann::json j1; j1["cis_excitations"]=j; update_schema(get_calc()->param.prefix()+".calc_info", j1); + // compute the transition densities const vector_real_function_3d bra_oct = get_active_mo_bra(); for (std::size_t i = 0; i < x.size(); ++i) { From f21ed72ab9cdc9e23374928fc18d38e576ba68d8 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Tue, 17 Jan 2023 21:55:28 +0100 Subject: [PATCH 0651/1312] user awareness for the input file --- src/apps/cis/test_callable.py | 2 +- src/apps/cis/test_energy_he.py | 2 +- src/apps/cis/test_symmetry_h2o.py | 2 +- src/apps/moldft/test_energy.py | 2 +- src/apps/nemo/test_energy.py | 2 +- src/apps/nemo/test_localization.py | 2 +- src/madness/chem/QCCalculationParametersBase.cc | 12 ++++++++++++ src/madness/chem/QCCalculationParametersBase.h | 12 +++++++++++- src/madness/chem/commandlineparser.h | 4 +++- 9 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/apps/cis/test_callable.py b/src/apps/cis/test_callable.py index 7dd7e50780a..f579373eeac 100755 --- a/src/apps/cis/test_callable.py +++ b/src/apps/cis/test_callable.py @@ -16,7 +16,7 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --input=input --geometry=he' + global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; excitations=0"' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py index 7c9a4fa9415..3ab9fde2827 100755 --- a/src/apps/cis/test_energy_he.py +++ b/src/apps/cis/test_energy_he.py @@ -16,7 +16,7 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --input=input --geometry=he' + global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; guess_excitations=2; excitations=2"' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments diff --git a/src/apps/cis/test_symmetry_h2o.py b/src/apps/cis/test_symmetry_h2o.py index 0bd15b0c009..3a911efb74b 100755 --- a/src/apps/cis/test_symmetry_h2o.py +++ b/src/apps/cis/test_symmetry_h2o.py @@ -16,7 +16,7 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --input=input --geometry=h2o' + global_arguments=' --geometry=h2o' dft_arguments=' --dft="k=8; localize=canon; prefix='+prefix+'"' other_arguments=' --response="freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' cmd='rm '+outputfile+'; cis '+global_arguments + dft_arguments + other_arguments diff --git a/src/apps/moldft/test_energy.py b/src/apps/moldft/test_energy.py index e97ceecb7b7..a75594ecaff 100755 --- a/src/apps/moldft/test_energy.py +++ b/src/apps/moldft/test_energy.py @@ -16,7 +16,7 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --input=input --geometry=he' + global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments='' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments diff --git a/src/apps/nemo/test_energy.py b/src/apps/nemo/test_energy.py index e97ceecb7b7..d5ef87344db 100755 --- a/src/apps/nemo/test_energy.py +++ b/src/apps/nemo/test_energy.py @@ -16,7 +16,7 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --input=input --geometry=he' + global_arguments='--geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments='' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments diff --git a/src/apps/nemo/test_localization.py b/src/apps/nemo/test_localization.py index f8355ac3223..51b7f916895 100755 --- a/src/apps/nemo/test_localization.py +++ b/src/apps/nemo/test_localization.py @@ -16,7 +16,7 @@ def localizer_run(localizer): referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" - cmd='rm '+outputfile+'; nemo --input=input --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' + cmd='rm '+outputfile+'; nemo --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' print("executing \n ",cmd) output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout print("finished with run1") diff --git a/src/madness/chem/QCCalculationParametersBase.cc b/src/madness/chem/QCCalculationParametersBase.cc index f1856f21e72..505b60b3554 100644 --- a/src/madness/chem/QCCalculationParametersBase.cc +++ b/src/madness/chem/QCCalculationParametersBase.cc @@ -47,6 +47,18 @@ std::string QCCalculationParametersBase::print_to_string(bool non_defaults_only) return ss.str(); } + +bool QCCalculationParametersBase::file_exists(World& world, std::string filename) const { + bool file_exists = false; + if (world.rank() == 0) { + std::ifstream ifs(filename); + if (not ifs.is_open()) file_exists=false; + ifs.close(); + } + world.gop.broadcast_serializable(file_exists, 0); + return file_exists; +} + /// read the parameters from file and broadcast void QCCalculationParametersBase::read_input(World& world, const std::string filename, const std::string tag) { diff --git a/src/madness/chem/QCCalculationParametersBase.h b/src/madness/chem/QCCalculationParametersBase.h index 0a0b50c580a..f560c499b98 100644 --- a/src/madness/chem/QCCalculationParametersBase.h +++ b/src/madness/chem/QCCalculationParametersBase.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -293,7 +294,14 @@ class QCCalculationParametersBase { const commandlineparser& parser, const std::string tag) { try { - read_input(world,parser.value("input"),tag); + // check that user-defined input files actually exist + bool file_ok=true; + if (parser.key_exists("user_defined_input_file")) file_ok=file_exists(world,parser.value("input")); + if (file_ok) read_input(world,parser.value("input"),tag); + else { + std::string msg="could not find user-defined input file: "+parser.value("input")+"\n"; + throw std::invalid_argument(msg); + } } catch (std::invalid_argument& e) { throw; } catch (std::exception& e) { @@ -311,6 +319,8 @@ class QCCalculationParametersBase { void read_commandline_options(World& world, const commandlineparser& parser, const std::string tag); + bool file_exists(World& world, std::string filename) const; + protected: bool print_debug=false; diff --git a/src/madness/chem/commandlineparser.h b/src/madness/chem/commandlineparser.h index e9f32836671..d1d1c5b42f0 100644 --- a/src/madness/chem/commandlineparser.h +++ b/src/madness/chem/commandlineparser.h @@ -25,6 +25,7 @@ struct commandlineparser { commandlineparser(int argc, char **argv) { set_defaults(); std::vector allArgs_raw(argv, argv + argc); + allArgs_raw.erase(allArgs_raw.begin()); // first argument is the name of the binary for (auto &a : allArgs_raw) { // special treatment for the input file: no hyphens a=check_for_input_file(a); @@ -34,6 +35,7 @@ struct commandlineparser { std::stringstream sa(a); sa >> key; val=a.substr(key.size()); + if (key=="input") set_keyval("user_defined_input_file","1"); set_keyval(key,val); } } @@ -65,7 +67,7 @@ struct commandlineparser { public: - /// special option: the input file has no hyphens in front + /// special option: the input file has no hyphens in front and is just a value std::string check_for_input_file(std::string line) { if (line[0]=='-') return line; auto words=split(line,"="); From 65187bdc3018def2a8967cc361f04187b450651f Mon Sep 17 00:00:00 2001 From: fbischoff Date: Thu, 19 Jan 2023 23:14:10 +0100 Subject: [PATCH 0652/1312] adding test for oep --- src/apps/oep/CMakeLists.txt | 1 + src/apps/oep/madtest1.oep_calc_info.ref.json | 17 ++++++++ src/apps/oep/test_energy.py | 42 ++++++++++++++++++++ src/madness/chem/oep.cc | 9 +++++ src/madness/chem/oep.h | 5 +++ 5 files changed, 74 insertions(+) create mode 100644 src/apps/oep/madtest1.oep_calc_info.ref.json create mode 100755 src/apps/oep/test_energy.py diff --git a/src/apps/oep/CMakeLists.txt b/src/apps/oep/CMakeLists.txt index a05b36544f5..a795fe3e97c 100644 --- a/src/apps/oep/CMakeLists.txt +++ b/src/apps/oep/CMakeLists.txt @@ -2,5 +2,6 @@ add_mad_executable(oep oep.cc "MADchem") add_dependencies(applications-madness oep) +add_scripted_tests(test_energy.py oep "medium;application") install(TARGETS oep DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/oep/madtest1.oep_calc_info.ref.json b/src/apps/oep/madtest1.oep_calc_info.ref.json new file mode 100644 index 00000000000..b31a3c5697a --- /dev/null +++ b/src/apps/oep/madtest1.oep_calc_info.ref.json @@ -0,0 +1,17 @@ +{ + "driver": "energy", + "model": "oaep", + "return_energy": -14.560947429075917, + "scf_eigenvalues_a": { + "dims": [ + 2 + ], + "size": 2, + "vals": [ + -4.621452195055882, + -0.3231970029561877 + ] + }, + "time": "2023-01-19 23:04:05", + "wall_time": 15.210686922073364 +} \ No newline at end of file diff --git a/src/apps/oep/test_energy.py b/src/apps/oep/test_energy.py new file mode 100755 index 00000000000..e7698cd1490 --- /dev/null +++ b/src/apps/oep/test_energy.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +import argparse + +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # get command line arguments + parser=argparse.ArgumentParser(description='command line arguments for this test case') + # default value will be set by cmake + parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") + args=parser.parse_args() + + # some user output + print("Testing nemo/test_localization") + print(" reference files found in directory:",args.reference_directory) + + prefix='madtest1' + outputfile=prefix+'.oep_calc_info.json' + referencefile=args.reference_directory+"/"+prefix+".oep_calc_info.ref.json" + + # run test + global_arguments=' --geometry=be' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments=' --oep="model=oaep"' + cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + print("finished with run") + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["driver"],1.e-4) + cmp.compare(["model"],1.e-4) + cmp.compare(["return_energy"],1.e-2) + print("final success: ",cmp.success) + + sys.exit(cmp.exitcode()) \ No newline at end of file diff --git a/src/madness/chem/oep.cc b/src/madness/chem/oep.cc index bbb7b4599ed..6a962900ccc 100644 --- a/src/madness/chem/oep.cc +++ b/src/madness/chem/oep.cc @@ -55,6 +55,15 @@ double OEP::solve(const vecfuncT& HF_nemo1) { return energy; } +void OEP::output_calc_info_schema(const double& energy) const { + nlohmann::json j; + j["scf_eigenvalues_a"]=tensor_to_json(calc->aeps); + j["model"]=oep_param.model().back(); + j["driver"]="energy"; + j["return_energy"]=energy; + update_schema(param.prefix()+".oep_calc_info", j); +} + void OEP::analyze() { set_protocol(param.econv()); Tensor Fock; diff --git a/src/madness/chem/oep.h b/src/madness/chem/oep.h index 6fed44e5d62..025798022e2 100644 --- a/src/madness/chem/oep.h +++ b/src/madness/chem/oep.h @@ -200,6 +200,10 @@ class OEP : public Nemo { return value(calc->molecule.get_all_coords()); } + /// update the json file with calculation input and output + void output_calc_info_schema(const double& energy) const; + + virtual double value(const Tensor& x) { reference->value(); set_protocol(param.econv()); @@ -210,6 +214,7 @@ class OEP : public Nemo { if (load_mos) load_restartdata(fock); if (not oep_param.no_compute()) energy=solve(reference->get_calc()->get_amo()); + output_calc_info_schema(energy); return energy; }; From 3d5f8171f3d76b9d6320b77b68052619021aea2c Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 20 Jan 2023 22:11:12 +0100 Subject: [PATCH 0653/1312] adding test for znemo --- src/apps/oep/test_energy.py | 2 +- src/apps/znemo/CMakeLists.txt | 1 + src/apps/znemo/madtest1.calc_info.ref.json | 30 ++++++++++++++++ src/apps/znemo/test_energy.py | 42 ++++++++++++++++++++++ src/madness/chem/znemo.cc | 12 +++++++ src/madness/chem/znemo.h | 2 ++ 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 src/apps/znemo/madtest1.calc_info.ref.json create mode 100755 src/apps/znemo/test_energy.py diff --git a/src/apps/oep/test_energy.py b/src/apps/oep/test_energy.py index e7698cd1490..dc5cd5b8c34 100755 --- a/src/apps/oep/test_energy.py +++ b/src/apps/oep/test_energy.py @@ -16,7 +16,7 @@ args=parser.parse_args() # some user output - print("Testing nemo/test_localization") + print("Testing @BINARY@/@TESTCASE") print(" reference files found in directory:",args.reference_directory) prefix='madtest1' diff --git a/src/apps/znemo/CMakeLists.txt b/src/apps/znemo/CMakeLists.txt index e4f7e3f94ad..5c5fb99b413 100644 --- a/src/apps/znemo/CMakeLists.txt +++ b/src/apps/znemo/CMakeLists.txt @@ -2,6 +2,7 @@ add_mad_executable(znemo znemo.cc "MADchem") add_dependencies(applications-madness znemo) +add_scripted_tests(test_energy.py znemo "medium;application") install(TARGETS znemo DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/znemo/madtest1.calc_info.ref.json b/src/apps/znemo/madtest1.calc_info.ref.json new file mode 100644 index 00000000000..2cd7eaf7d8c --- /dev/null +++ b/src/apps/znemo/madtest1.calc_info.ref.json @@ -0,0 +1,30 @@ +{ + "B": [ + 0.0, + 0.0, + -1.0 + ], + "driver": "energy", + "model": "UHF", + "return_energy": -2.650585260662382, + "scf_eigenvalues_a": { + "dims": [ + 1 + ], + "size": 1, + "vals": [ + -1.2986452521862109 + ] + }, + "scf_eigenvalues_b": { + "dims": [ + 1 + ], + "size": 1, + "vals": [ + -0.19209963781869333 + ] + }, + "time": "2023-01-20 22:08:20", + "wall_time": 13.83008599281311 +} \ No newline at end of file diff --git a/src/apps/znemo/test_energy.py b/src/apps/znemo/test_energy.py new file mode 100755 index 00000000000..f2a50fffe26 --- /dev/null +++ b/src/apps/znemo/test_energy.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +import argparse + +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # get command line arguments + parser=argparse.ArgumentParser(description='command line arguments for this test case') + # default value will be set by cmake + parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") + args=parser.parse_args() + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory:",args.reference_directory) + + prefix='madtest1' + outputfile=prefix+'.calc_info.json' + referencefile=args.reference_directory+"/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + other_arguments=' --complex="physical_B=-1.0" --geometry="no_orient=true; source_name=he"' + cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + print("finished with run") + + # compare results + cmp=madjsoncompare(outputfile,referencefile) + cmp.compare(["driver"],1.e-4) + cmp.compare(["model"],1.e-4) + cmp.compare(["return_energy"],1.e-2) + print("final success: ",cmp.success) + + sys.exit(cmp.exitcode()) \ No newline at end of file diff --git a/src/madness/chem/znemo.cc b/src/madness/chem/znemo.cc index 15a8462242e..3d20d58fcb8 100644 --- a/src/madness/chem/znemo.cc +++ b/src/madness/chem/znemo.cc @@ -163,10 +163,22 @@ double Znemo::value(const Tensor& x) { save_orbitals(); double energy=analyze(); + output_calc_info_schema(energy); return energy; } +void Znemo::output_calc_info_schema(const double& energy) const { + nlohmann::json j; + j["scf_eigenvalues_a"]=tensor_to_json(aeps); + j["scf_eigenvalues_b"]=tensor_to_json(beps); + j["model"]="UHF"; + j["B"]=this->B; + j["driver"]="energy"; + j["return_energy"]=energy; + update_schema(cparam.prefix()+".calc_info", j); +} + Tensor Znemo::gradient(const Tensor& x) { MADNESS_ASSERT(param.explicit_B()==0.0); diff --git a/src/madness/chem/znemo.h b/src/madness/chem/znemo.h index 0673d3f7242..a1134e08421 100644 --- a/src/madness/chem/znemo.h +++ b/src/madness/chem/znemo.h @@ -177,6 +177,8 @@ class Znemo : public NemoBase, public QCPropertyInterface { /// compute the molecular energy double value(const Tensor& x) override; + void output_calc_info_schema(const double& energy) const; + std::string name() const override {return "znemo";}; bool selftest() override { From 8bb26e56be862099780b9ed1ed12137620bf8d03 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sat, 21 Jan 2023 23:04:12 +0100 Subject: [PATCH 0654/1312] adding test for cc2 --- src/apps/cc2/CMakeLists.txt | 3 +++ src/apps/cc2/test_callable.py | 46 +++++++++++++++++++++++++++++++++++ src/apps/znemo/CMakeLists.txt | 5 +++- src/madness/chem/CC2.cc | 11 +++++++++ src/madness/chem/CC2.h | 3 +++ 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100755 src/apps/cc2/test_callable.py diff --git a/src/apps/cc2/CMakeLists.txt b/src/apps/cc2/CMakeLists.txt index 83135e51dc2..050195bacdb 100644 --- a/src/apps/cc2/CMakeLists.txt +++ b/src/apps/cc2/CMakeLists.txt @@ -3,5 +3,8 @@ add_mad_executable(cc2 cc2.cc "MADchem") add_dependencies(applications-madness cc2) +if (ENABLE_GENTENSOR) + add_scripted_tests(test_callable.py cc2 "short;application") # runs he with one frozen orbital.. +endif() install(TARGETS cc2 DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/cc2/test_callable.py b/src/apps/cc2/test_callable.py new file mode 100755 index 00000000000..c735d11a09f --- /dev/null +++ b/src/apps/cc2/test_callable.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +import argparse + +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # get command line arguments + parser=argparse.ArgumentParser(description='command line arguments for this test case') + # default value will be set by cmake + parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") + args=parser.parse_args() + + # some user output + print("Testing @BINARY@/@TESTCASE@") + print(" reference files found in directory:",args.reference_directory) + + prefix='madtest1' + outputfile=prefix+'.calc_info.json' + referencefile=args.reference_directory+"/"+prefix+".calc_info.ref.json" + + # run test + global_arguments=' --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'; k=5"' + other_arguments=' --cc2="freeze 1"' + cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + print("finished with run") + print(p.stdout) + exitcode=p.returncode + print("exitcode ",exitcode) + + + # # compare results + # cmp=madjsoncompare(outputfile,referencefile) + # cmp.compare(["driver"],1.e-4) + # cmp.compare(["model"],1.e-4) + # cmp.compare(["return_energy"],1.e-2) + # print("final success: ",cmp.success) + + # sys.exit(cmp.exitcode()) \ No newline at end of file diff --git a/src/apps/znemo/CMakeLists.txt b/src/apps/znemo/CMakeLists.txt index 5c5fb99b413..9a5a1789fa6 100644 --- a/src/apps/znemo/CMakeLists.txt +++ b/src/apps/znemo/CMakeLists.txt @@ -2,7 +2,10 @@ add_mad_executable(znemo znemo.cc "MADchem") add_dependencies(applications-madness znemo) -add_scripted_tests(test_energy.py znemo "medium;application") + +if (!ENABLE_GENTENSOR) + add_scripted_tests(test_energy.py znemo "medium;application") +endif() install(TARGETS znemo DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/madness/chem/CC2.cc b/src/madness/chem/CC2.cc index 14bd7d8fd82..4cb980becfe 100644 --- a/src/madness/chem/CC2.cc +++ b/src/madness/chem/CC2.cc @@ -55,6 +55,7 @@ CC2::solve() { //DEBUG MP2 coupled const double mp2_correlation_energy = solve_mp2_coupled(pairs); + output_calc_info_schema("mp2",mp2_correlation_energy); output.section(assign_name(ctype) + " Calculation Ended !"); if (world.rank() == 0) @@ -399,6 +400,16 @@ CC2::solve() { } +void CC2::output_calc_info_schema(const std::string model, const double& energy) const { + nlohmann::json j; + j["model"]=model; + j["driver"]="energy"; + j["return_energy"]=energy; + j["mp2_correlation_energy"]=energy; + update_schema(nemo->get_param().prefix()+".calc_info", j); +} + + bool CC2::check_core_valence_separation() const { MolecularOrbitals mos(nemo->get_calc()->amo, nemo->get_calc()->aeps, {}, nemo->get_calc()->aocc, {}); diff --git a/src/madness/chem/CC2.h b/src/madness/chem/CC2.h index a979262cc74..620d64d79eb 100644 --- a/src/madness/chem/CC2.h +++ b/src/madness/chem/CC2.h @@ -82,6 +82,9 @@ class CC2 : public OptimizationTargetInterface, public QCPropertyInterface { return 0.0; } + void output_calc_info_schema(const std::string model, const double& energy) const; + + std::string name() const {return "CC2";}; static void help() { From d7ac628a3f9acfcb3e72ea8f93e30253ce992e02 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sat, 21 Jan 2023 23:38:09 +0100 Subject: [PATCH 0655/1312] adding test for mp2 --- src/apps/mp2/CMakeLists.txt | 5 +++++ src/apps/mp2/test_callable.py | 36 +++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100755 src/apps/mp2/test_callable.py diff --git a/src/apps/mp2/CMakeLists.txt b/src/apps/mp2/CMakeLists.txt index bf4e2eca397..25c571c78c4 100644 --- a/src/apps/mp2/CMakeLists.txt +++ b/src/apps/mp2/CMakeLists.txt @@ -3,4 +3,9 @@ add_mad_executable(mp2 mp2.cc "MADchem") add_dependencies(applications-madness mp2) +if (ENABLE_GENTENSOR) + add_scripted_tests(test_callable.py mp2 "short;application") +endif() + + install(TARGETS mp2 DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/mp2/test_callable.py b/src/apps/mp2/test_callable.py new file mode 100755 index 00000000000..ca5ca8f800b --- /dev/null +++ b/src/apps/mp2/test_callable.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +import sys +import subprocess +import argparse + +sys.path.append("@CMAKE_SOURCE_DIR@/bin") +from madjsoncompare import madjsoncompare + +if __name__ == "__main__": + + # get command line arguments + parser=argparse.ArgumentParser(description='command line arguments for this test case') + # default value will be set by cmake + parser.add_argument("--reference_directory",action="store",default="@SRCDIR@",help="the directory with the reference file in json format") + args=parser.parse_args() + + # some user output + print("Testing nemo/test_localization") + print(" reference files found in directory:",args.reference_directory) + + prefix='madtest1' + outputfile=prefix+'.scf_info.json' + referencefile=args.reference_directory+"/"+prefix+".scf_info.ref.json" + + # run test + global_arguments=' --geometry=he' + dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'; k=5"' + other_arguments=' --mp2="freeze 1"' + cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + print("executing \n ",cmd) + p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + print("finished with run") + print(p.stdout) + exitcode=p.returncode + print("exitcode ",exitcode) \ No newline at end of file From 50069cd5ea3d75d66801bad5edb5608c87bcc4e4 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sat, 21 Jan 2023 23:48:05 +0100 Subject: [PATCH 0656/1312] fix for znemo test --- src/apps/znemo/CMakeLists.txt | 2 +- src/apps/znemo/madtest1.calc_info.ref.json | 10 +++++----- src/apps/znemo/test_energy.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/apps/znemo/CMakeLists.txt b/src/apps/znemo/CMakeLists.txt index 9a5a1789fa6..5828a1e968f 100644 --- a/src/apps/znemo/CMakeLists.txt +++ b/src/apps/znemo/CMakeLists.txt @@ -3,7 +3,7 @@ add_mad_executable(znemo znemo.cc "MADchem") add_dependencies(applications-madness znemo) -if (!ENABLE_GENTENSOR) +if (NOT ENABLE_GENTENSOR) add_scripted_tests(test_energy.py znemo "medium;application") endif() diff --git a/src/apps/znemo/madtest1.calc_info.ref.json b/src/apps/znemo/madtest1.calc_info.ref.json index 2cd7eaf7d8c..6345fa61801 100644 --- a/src/apps/znemo/madtest1.calc_info.ref.json +++ b/src/apps/znemo/madtest1.calc_info.ref.json @@ -6,14 +6,14 @@ ], "driver": "energy", "model": "UHF", - "return_energy": -2.650585260662382, + "return_energy": -2.6727709985264108, "scf_eigenvalues_a": { "dims": [ 1 ], "size": 1, "vals": [ - -1.2986452521862109 + -1.1967516543545087 ] }, "scf_eigenvalues_b": { @@ -22,9 +22,9 @@ ], "size": 1, "vals": [ - -0.19209963781869333 + -0.14163878297274543 ] }, - "time": "2023-01-20 22:08:20", - "wall_time": 13.83008599281311 + "time": "2023-01-21 23:49:19", + "wall_time": 14.747344970703125 } \ No newline at end of file diff --git a/src/apps/znemo/test_energy.py b/src/apps/znemo/test_energy.py index f2a50fffe26..6fc79644371 100755 --- a/src/apps/znemo/test_energy.py +++ b/src/apps/znemo/test_energy.py @@ -27,7 +27,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --complex="physical_B=-1.0" --geometry="no_orient=true; source_name=he"' - cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+' reference.00000 restartaodata; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout print("finished with run") From 71af78e3853ddf53b9aaee8419c60b04baa5f235 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 11 Jan 2023 10:52:03 +0100 Subject: [PATCH 0657/1312] fit for older python version?? --- src/apps/cc2/test_callable.py | 4 +++- src/apps/cis/test_callable.py | 3 ++- src/apps/cis/test_energy_he.py | 6 ++++-- src/apps/cis/test_symmetry_h2o.py | 5 +++-- src/apps/moldft/test_energy.py | 4 +++- src/apps/mp2/test_callable.py | 3 ++- src/apps/nemo/test_energy.py | 3 ++- src/apps/nemo/test_localization.py | 4 +++- src/apps/oep/test_energy.py | 4 +++- src/apps/znemo/test_energy.py | 3 ++- 10 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/apps/cc2/test_callable.py b/src/apps/cc2/test_callable.py index c735d11a09f..ccc5164d082 100755 --- a/src/apps/cc2/test_callable.py +++ b/src/apps/cc2/test_callable.py @@ -29,7 +29,9 @@ other_arguments=' --cc2="freeze 1"' cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - p=subprocess.run(cmd,shell=True,capture_output=True, text=True) +# p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") print(p.stdout) exitcode=p.returncode diff --git a/src/apps/cis/test_callable.py b/src/apps/cis/test_callable.py index f579373eeac..358799c6e74 100755 --- a/src/apps/cis/test_callable.py +++ b/src/apps/cis/test_callable.py @@ -21,7 +21,8 @@ other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; excitations=0"' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - p=subprocess.run(cmd,shell=True,capture_output=True, text=True) +# p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") print(p.stdout) exitcode=p.returncode diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py index 3ab9fde2827..4ed41252a8d 100755 --- a/src/apps/cis/test_energy_he.py +++ b/src/apps/cis/test_energy_he.py @@ -21,9 +21,11 @@ other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; guess_excitations=2; excitations=2"' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) + print("finished with run") - print(output) + print(p.stdout) # compare results cmp=madjsoncompare(outputfile,referencefile) diff --git a/src/apps/cis/test_symmetry_h2o.py b/src/apps/cis/test_symmetry_h2o.py index 3a911efb74b..df8261985de 100755 --- a/src/apps/cis/test_symmetry_h2o.py +++ b/src/apps/cis/test_symmetry_h2o.py @@ -21,9 +21,10 @@ other_arguments=' --response="freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' cmd='rm '+outputfile+'; cis '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") - print(output) + print(p.stdout) # compare results cmp=madjsoncompare(outputfile,referencefile) diff --git a/src/apps/moldft/test_energy.py b/src/apps/moldft/test_energy.py index a75594ecaff..47df02a7197 100755 --- a/src/apps/moldft/test_energy.py +++ b/src/apps/moldft/test_energy.py @@ -21,7 +21,9 @@ other_arguments='' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - p=subprocess.run(cmd,shell=True,capture_output=True, text=True) +# p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) + print("finished with run") print(p.stdout) exitcode=p.returncode diff --git a/src/apps/mp2/test_callable.py b/src/apps/mp2/test_callable.py index ca5ca8f800b..642b4ef5423 100755 --- a/src/apps/mp2/test_callable.py +++ b/src/apps/mp2/test_callable.py @@ -29,7 +29,8 @@ other_arguments=' --mp2="freeze 1"' cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - p=subprocess.run(cmd,shell=True,capture_output=True, text=True) +# p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") print(p.stdout) exitcode=p.returncode diff --git a/src/apps/nemo/test_energy.py b/src/apps/nemo/test_energy.py index d5ef87344db..223128beca8 100755 --- a/src/apps/nemo/test_energy.py +++ b/src/apps/nemo/test_energy.py @@ -21,7 +21,8 @@ other_arguments='' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - p=subprocess.run(cmd,shell=True,capture_output=True, text=True) +# p=subprocess.run(cmd,shell=True,capture_output=True, text=True) + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") print(p.stdout) exitcode=p.returncode diff --git a/src/apps/nemo/test_localization.py b/src/apps/nemo/test_localization.py index 51b7f916895..59fcacc8fd0 100755 --- a/src/apps/nemo/test_localization.py +++ b/src/apps/nemo/test_localization.py @@ -18,7 +18,9 @@ def localizer_run(localizer): cmd='rm '+outputfile+'; nemo --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) + print("finished with run1") cmp=madjsoncompare(outputfile,referencefile) diff --git a/src/apps/oep/test_energy.py b/src/apps/oep/test_energy.py index dc5cd5b8c34..b5c80ce108f 100755 --- a/src/apps/oep/test_energy.py +++ b/src/apps/oep/test_energy.py @@ -29,7 +29,9 @@ other_arguments=' --oep="model=oaep"' cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) + print("finished with run") # compare results diff --git a/src/apps/znemo/test_energy.py b/src/apps/znemo/test_energy.py index 6fc79644371..b137f931919 100755 --- a/src/apps/znemo/test_energy.py +++ b/src/apps/znemo/test_energy.py @@ -29,7 +29,8 @@ other_arguments=' --complex="physical_B=-1.0" --geometry="no_orient=true; source_name=he"' cmd='rm '+outputfile+' reference.00000 restartaodata; @BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") # compare results From 6281ca3f6266db71fb295a49696438f486254704 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sun, 22 Jan 2023 22:24:10 +0100 Subject: [PATCH 0658/1312] absolute path for the binaries in scripts --- cmake/modules/AddScriptedTests.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/AddScriptedTests.cmake b/cmake/modules/AddScriptedTests.cmake index 17e750fb753..807fff4d313 100644 --- a/cmake/modules/AddScriptedTests.cmake +++ b/cmake/modules/AddScriptedTests.cmake @@ -33,7 +33,7 @@ macro(add_scripted_tests _testcase_in _binary _labels) endif() # copy the test scripts and replaces the variable to the source directory containing the reference json outputs set(SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}) - set(BINARY ${_binary}) + set(BINARY ${CMAKE_CURRENT_BINARY_DIR}/${_binary}) set(TESTCASE ${_testcase}) configure_file(${_testcase} ${_testcase} @ONLY) From 3ee6d45695586d9f9f0f45cd54801e4c96531b38 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sun, 22 Jan 2023 23:03:33 +0100 Subject: [PATCH 0659/1312] absolute path for the binaries in scripts --- cmake/modules/AddScriptedTests.cmake | 2 +- src/apps/cc2/test_callable.py | 2 +- src/apps/cis/test_callable.py | 2 +- src/apps/cis/test_energy_he.py | 2 +- src/apps/moldft/test_energy.py | 2 +- src/apps/mp2/test_callable.py | 2 +- src/apps/nemo/test_energy.py | 2 +- src/apps/nemo/test_localization.py | 2 +- src/apps/oep/test_energy.py | 2 +- src/apps/znemo/test_energy.py | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cmake/modules/AddScriptedTests.cmake b/cmake/modules/AddScriptedTests.cmake index 807fff4d313..17e750fb753 100644 --- a/cmake/modules/AddScriptedTests.cmake +++ b/cmake/modules/AddScriptedTests.cmake @@ -33,7 +33,7 @@ macro(add_scripted_tests _testcase_in _binary _labels) endif() # copy the test scripts and replaces the variable to the source directory containing the reference json outputs set(SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}) - set(BINARY ${CMAKE_CURRENT_BINARY_DIR}/${_binary}) + set(BINARY ${_binary}) set(TESTCASE ${_testcase}) configure_file(${_testcase} ${_testcase} @ONLY) diff --git a/src/apps/cc2/test_callable.py b/src/apps/cc2/test_callable.py index ccc5164d082..4f0e37a76c8 100755 --- a/src/apps/cc2/test_callable.py +++ b/src/apps/cc2/test_callable.py @@ -27,7 +27,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'; k=5"' other_arguments=' --cc2="freeze 1"' - cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+' reference.00000; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # p=subprocess.run(cmd,shell=True,capture_output=True, text=True) diff --git a/src/apps/cis/test_callable.py b/src/apps/cis/test_callable.py index 358799c6e74..a5fb3dacc4e 100755 --- a/src/apps/cis/test_callable.py +++ b/src/apps/cis/test_callable.py @@ -19,7 +19,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; excitations=0"' - cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # p=subprocess.run(cmd,shell=True,capture_output=True, text=True) p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py index 4ed41252a8d..5f3e5118732 100755 --- a/src/apps/cis/test_energy_he.py +++ b/src/apps/cis/test_energy_he.py @@ -19,7 +19,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; guess_excitations=2; excitations=2"' - cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/moldft/test_energy.py b/src/apps/moldft/test_energy.py index 47df02a7197..a01dd8e7d08 100755 --- a/src/apps/moldft/test_energy.py +++ b/src/apps/moldft/test_energy.py @@ -19,7 +19,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments='' - cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # p=subprocess.run(cmd,shell=True,capture_output=True, text=True) p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/mp2/test_callable.py b/src/apps/mp2/test_callable.py index 642b4ef5423..46bf61e52df 100755 --- a/src/apps/mp2/test_callable.py +++ b/src/apps/mp2/test_callable.py @@ -27,7 +27,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'; k=5"' other_arguments=' --mp2="freeze 1"' - cmd='rm '+outputfile+' reference.00000; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+' reference.00000; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # p=subprocess.run(cmd,shell=True,capture_output=True, text=True) p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/nemo/test_energy.py b/src/apps/nemo/test_energy.py index 223128beca8..2159b06911c 100755 --- a/src/apps/nemo/test_energy.py +++ b/src/apps/nemo/test_energy.py @@ -19,7 +19,7 @@ global_arguments='--geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments='' - cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # p=subprocess.run(cmd,shell=True,capture_output=True, text=True) p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/nemo/test_localization.py b/src/apps/nemo/test_localization.py index 59fcacc8fd0..5389e0cb2e0 100755 --- a/src/apps/nemo/test_localization.py +++ b/src/apps/nemo/test_localization.py @@ -16,7 +16,7 @@ def localizer_run(localizer): referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" - cmd='rm '+outputfile+'; nemo --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' + cmd='rm '+outputfile+'; ./@BINARY@ --geometry=h2o --dft="maxiter=10; econv=3.e-5; k=8; localize='+localizer+'; dconv=1.e-3; prefix='+prefix+'"' print("executing \n ",cmd) # output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/oep/test_energy.py b/src/apps/oep/test_energy.py index b5c80ce108f..ccab6f73226 100755 --- a/src/apps/oep/test_energy.py +++ b/src/apps/oep/test_energy.py @@ -27,7 +27,7 @@ global_arguments=' --geometry=be' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --oep="model=oaep"' - cmd='rm '+outputfile+'; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) diff --git a/src/apps/znemo/test_energy.py b/src/apps/znemo/test_energy.py index b137f931919..8764db25519 100755 --- a/src/apps/znemo/test_energy.py +++ b/src/apps/znemo/test_energy.py @@ -27,7 +27,7 @@ global_arguments=' --geometry=he' dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --complex="physical_B=-1.0" --geometry="no_orient=true; source_name=he"' - cmd='rm '+outputfile+' reference.00000 restartaodata; @BINARY@ '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+' reference.00000 restartaodata; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) From 37cd678089fcfd547b6d70e4567fa828ff063a4f Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sun, 22 Jan 2023 23:12:51 +0100 Subject: [PATCH 0660/1312] consistent naming for test target applications --- src/apps/cc2/CMakeLists.txt | 2 +- src/apps/cis/CMakeLists.txt | 6 +++--- src/apps/moldft/CMakeLists.txt | 2 +- src/apps/mp2/CMakeLists.txt | 2 +- src/apps/nemo/CMakeLists.txt | 4 ++-- src/apps/oep/CMakeLists.txt | 2 +- src/apps/znemo/CMakeLists.txt | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/apps/cc2/CMakeLists.txt b/src/apps/cc2/CMakeLists.txt index 050195bacdb..81e63e55c31 100644 --- a/src/apps/cc2/CMakeLists.txt +++ b/src/apps/cc2/CMakeLists.txt @@ -4,7 +4,7 @@ add_mad_executable(cc2 cc2.cc "MADchem") add_dependencies(applications-madness cc2) if (ENABLE_GENTENSOR) - add_scripted_tests(test_callable.py cc2 "short;application") # runs he with one frozen orbital.. + add_scripted_tests(test_callable.py cc2 "short;applications") # runs he with one frozen orbital.. endif() install(TARGETS cc2 DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/cis/CMakeLists.txt b/src/apps/cis/CMakeLists.txt index ca0c01b80ea..909461bcd97 100644 --- a/src/apps/cis/CMakeLists.txt +++ b/src/apps/cis/CMakeLists.txt @@ -3,8 +3,8 @@ add_mad_executable(cis cis.cpp "MADchem") add_dependencies(applications-madness cis) -add_scripted_tests(test_callable.py cis "short;application") -add_scripted_tests(test_energy_he.py cis "medium;application") -add_scripted_tests(test_symmetry_h2o.py cis "long;application") +add_scripted_tests(test_callable.py cis "short;applications") +add_scripted_tests(test_energy_he.py cis "medium;applications") +add_scripted_tests(test_symmetry_h2o.py cis "long;applications") install(TARGETS cis DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index 9a95690fad3..2132a7183e8 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -11,7 +11,7 @@ add_mad_executable(testpg testpg.cc MADchem) add_mad_executable(testperiodicdft testperiodicdft.cc MADchem) -add_scripted_tests(test_energy.py moldft "short;application") +add_scripted_tests(test_energy.py moldft "short;applications") # removed mcpfit since it is likely only of historic interest diff --git a/src/apps/mp2/CMakeLists.txt b/src/apps/mp2/CMakeLists.txt index 25c571c78c4..9a99b2f52c7 100644 --- a/src/apps/mp2/CMakeLists.txt +++ b/src/apps/mp2/CMakeLists.txt @@ -4,7 +4,7 @@ add_mad_executable(mp2 mp2.cc "MADchem") add_dependencies(applications-madness mp2) if (ENABLE_GENTENSOR) - add_scripted_tests(test_callable.py mp2 "short;application") + add_scripted_tests(test_callable.py mp2 "short;applications") endif() diff --git a/src/apps/nemo/CMakeLists.txt b/src/apps/nemo/CMakeLists.txt index 1713a9472c8..34b0ed82d71 100644 --- a/src/apps/nemo/CMakeLists.txt +++ b/src/apps/nemo/CMakeLists.txt @@ -3,7 +3,7 @@ add_mad_executable(nemo nemo.cc "MADchem") add_dependencies(applications-madness nemo) -add_scripted_tests(test_energy.py nemo "short;application") -add_scripted_tests(test_localization.py nemo "long;application") +add_scripted_tests(test_energy.py nemo "short;applications") +add_scripted_tests(test_localization.py nemo "long;applications") install(TARGETS nemo DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/oep/CMakeLists.txt b/src/apps/oep/CMakeLists.txt index a795fe3e97c..cd4a4596445 100644 --- a/src/apps/oep/CMakeLists.txt +++ b/src/apps/oep/CMakeLists.txt @@ -2,6 +2,6 @@ add_mad_executable(oep oep.cc "MADchem") add_dependencies(applications-madness oep) -add_scripted_tests(test_energy.py oep "medium;application") +add_scripted_tests(test_energy.py oep "medium;applications") install(TARGETS oep DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/znemo/CMakeLists.txt b/src/apps/znemo/CMakeLists.txt index 5828a1e968f..0de21c3bff4 100644 --- a/src/apps/znemo/CMakeLists.txt +++ b/src/apps/znemo/CMakeLists.txt @@ -4,7 +4,7 @@ add_mad_executable(znemo znemo.cc "MADchem") add_dependencies(applications-madness znemo) if (NOT ENABLE_GENTENSOR) - add_scripted_tests(test_energy.py znemo "medium;application") + add_scripted_tests(test_energy.py znemo "medium;applications") endif() From a7c205b5d515e331c516e1761ffeef9e0e5d0ee9 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Mon, 23 Jan 2023 22:33:05 +0100 Subject: [PATCH 0661/1312] fixing cis test --- src/apps/cis/test_energy_he.py | 2 +- src/apps/cis/test_symmetry_h2o.py | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py index 5f3e5118732..d92e3e31326 100755 --- a/src/apps/cis/test_energy_he.py +++ b/src/apps/cis/test_energy_he.py @@ -35,4 +35,4 @@ cmp.compare(["cis_excitations",1,"omega"],1.e-3) print("final success: ",cmp.success) - sys.exit(cmp.exitcode()) \ No newline at end of file + sys.exit(cmp.exitcode()) diff --git a/src/apps/cis/test_symmetry_h2o.py b/src/apps/cis/test_symmetry_h2o.py index df8261985de..2b09384537c 100755 --- a/src/apps/cis/test_symmetry_h2o.py +++ b/src/apps/cis/test_symmetry_h2o.py @@ -16,13 +16,14 @@ referencefile="@SRCDIR@/"+prefix+".calc_info.ref.json" # run test - global_arguments=' --geometry=h2o' + global_arguments=' --geometry=h2o' dft_arguments=' --dft="k=8; localize=canon; prefix='+prefix+'"' other_arguments=' --response="freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' - cmd='rm '+outputfile+'; cis '+global_arguments + dft_arguments + other_arguments + cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) # output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) + print("finished with run") print(p.stdout) @@ -38,11 +39,12 @@ dft_arguments=' --dft="k=8; localize=canon; prefix='+prefix+'; no_compute=1"' other_arguments=' --response="irrep=a2; freeze=1; thresh=1.e-3; econv=1.e-3; dconv=1.e-2"' - cmd='cis '+global_arguments + dft_arguments + other_arguments + cmd='./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) - output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout +# output=subprocess.run(cmd,shell=True,capture_output=True, text=True).stdout + p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE , universal_newlines=True) print("finished with run") - print(output) + print(p.stdout) # compare results @@ -54,4 +56,4 @@ print("final success: ",cmp.success) - sys.exit(cmp.exitcode()) \ No newline at end of file + sys.exit(cmp.exitcode()) From 29213383ae296684579d57a14cf37d31c69315f6 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Tue, 24 Jan 2023 22:36:21 +0100 Subject: [PATCH 0662/1312] adding labels short, medium, long, etc to the tests, adding new target check-short --- .github/workflows/cmake.yml | 2 +- CMakeLists.txt | 1 + cmake/modules/AddScriptedTests.cmake | 6 ++++-- cmake/modules/AddUnittests.cmake | 10 ++++++---- src/madness/chem/CMakeLists.txt | 14 ++++++++------ src/madness/misc/CMakeLists.txt | 2 +- src/madness/mra/CMakeLists.txt | 4 ++-- src/madness/tensor/CMakeLists.txt | 4 ++-- src/madness/world/CMakeLists.txt | 2 +- 9 files changed, 26 insertions(+), 19 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index efa4f094dc6..b815f63fa3f 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -102,4 +102,4 @@ jobs: - name: Test working-directory: ${{github.workspace}}/build shell: bash - run: cmake --build . --target check-madness + run: cmake --build . --target check-short-madness diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e8d2b2d7d9..7d0c84d6821 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -673,6 +673,7 @@ if(BUILD_TESTING) add_custom_target_subproject(madness unittests) add_custom_target_subproject(madness scripted_tests) add_custom_target_subproject(madness check COMMAND ${CMAKE_CTEST_COMMAND} -V -R "madness/test/" USES_TERMINAL) # to be GNU compatible + add_custom_target_subproject(madness check-short COMMAND ${CMAKE_CTEST_COMMAND} -L \"short|medium\" -V -R "madness/test/" USES_TERMINAL) # to be GNU compatible add_dependencies(everything unittests) endif() add_subdirectory(src) diff --git a/cmake/modules/AddScriptedTests.cmake b/cmake/modules/AddScriptedTests.cmake index 17e750fb753..32f08b91261 100644 --- a/cmake/modules/AddScriptedTests.cmake +++ b/cmake/modules/AddScriptedTests.cmake @@ -18,8 +18,10 @@ macro(add_scripted_tests _testcase_in _binary _labels) # Add a test that builds the binary add_test(madness/test/${_binary}/build "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${_binary}) - set_tests_properties(madness/test/${_binary}/build - PROPERTIES DEPENDS ${_binary} LABELS "${_labels}") + set_tests_properties(madness/test/${_binary}/build PROPERTIES DEPENDS ${_binary}) + + # make sure that the build step has all labels + set_property(TEST madness/test/${_binary}/build PROPERTY LABELS "${_labels}" APPEND) # Add a test that copies the test scripts and replaces the variable to the source directory # containing the reference json outputs diff --git a/cmake/modules/AddUnittests.cmake b/cmake/modules/AddUnittests.cmake index 30ab8db394f..081b225fe6f 100644 --- a/cmake/modules/AddUnittests.cmake +++ b/cmake/modules/AddUnittests.cmake @@ -1,8 +1,10 @@ -macro(add_unittests _component _sources _libs) +macro(add_unittests _component _sources _libs _labels) # Add targets and for world_unittests - add_custom_target_subproject(madness ${_component}_unittests) - add_dependencies(unittests-madness ${_component}_unittests-madness) + if (NOT TARGET ${_component}_unittests) + add_custom_target_subproject(madness ${_component}_unittests) + add_dependencies(unittests-madness ${_component}_unittests-madness) + endif() # Add a test that builds the unit tests add_test(madness/test/${_component}/build @@ -21,7 +23,7 @@ macro(add_unittests _component _sources _libs) add_test(NAME madness/test/${_component}/${_test}/run COMMAND ${_test}) add_dependencies(${_component}_unittests-madness ${_test}) set_tests_properties(madness/test/${_component}/${_test}/run - PROPERTIES DEPENDS madness/test/${_component}/build) + PROPERTIES DEPENDS madness/test/${_component}/build LABELS "${_labels}") endforeach() diff --git a/src/madness/chem/CMakeLists.txt b/src/madness/chem/CMakeLists.txt index 8589003048b..33a4314b3ed 100644 --- a/src/madness/chem/CMakeLists.txt +++ b/src/madness/chem/CMakeLists.txt @@ -142,15 +142,17 @@ if(BUILD_TESTING) SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # The list of unit test source files - set(CHEM_TEST_SOURCES test_pointgroupsymmetry.cc test_masks_and_boxes.cc test_localizer.cc - test_QCCalculationParametersBase.cc test_qc.cc test_MolecularOrbitals.cc test_BSHApply.cc - test_ccpairfunction.cc) + set(CHEM_TEST_SOURCES_SHORT test_pointgroupsymmetry.cc test_masks_and_boxes.cc + test_QCCalculationParametersBase.cc test_qc.cc test_MolecularOrbitals.cc test_BSHApply.cc) + set(CHEM_TEST_SOURCES_LONG test_localizer.cc test_ccpairfunction.cc) if (LIBXC_FOUND) - list(APPEND CHEM_TEST_SOURCES test_dft.cc test_SCFOperators.cc) + list(APPEND CHEM_TEST_SOURCES_SHORT test_dft.cc ) + list(APPEND CHEM_TEST_SOURCES_LONG test_SCFOperators.cc) endif(LIBXC_FOUND) - add_unittests(chem "${CHEM_TEST_SOURCES}" "MADchem;MADgtest") - + add_unittests(chem "${CHEM_TEST_SOURCES_SHORT}" "MADchem;MADgtest" "unittests;short") + add_unittests(chem "${CHEM_TEST_SOURCES_LONG}" "MADchem;MADgtest" "unittests;long") + # Create other test executables not included in the unit tests set(CHEM_OTHER_TESTS testxc benchmark_exchange_operator) foreach(_test ${CHEM_OTHER_TESTS}) diff --git a/src/madness/misc/CMakeLists.txt b/src/madness/misc/CMakeLists.txt index 9b6811550f6..99f56cdbfd7 100644 --- a/src/madness/misc/CMakeLists.txt +++ b/src/madness/misc/CMakeLists.txt @@ -22,6 +22,6 @@ if(BUILD_TESTING) # The list of unit test source files set(MISC_TEST_SOURCES interp3.cc) - add_unittests(misc "${MISC_TEST_SOURCES}" "MADmisc;MADgtest") + add_unittests(misc "${MISC_TEST_SOURCES}" "MADmisc;MADgtest" "unittests") endif() \ No newline at end of file diff --git a/src/madness/mra/CMakeLists.txt b/src/madness/mra/CMakeLists.txt index e3b9906516c..ec785dd82c2 100644 --- a/src/madness/mra/CMakeLists.txt +++ b/src/madness/mra/CMakeLists.txt @@ -37,10 +37,10 @@ if(BUILD_TESTING) testpdiff.cc testdiff1Db.cc testgconv.cc testopdir.cc testinnerext.cc testgaxpyext.cc testvmra.cc, test_vectormacrotask.cc test_cloud.cc test_macrotaskpartitioner.cc) - add_unittests(mra "${MRA_TEST_SOURCES}" "MADmra;MADgtest") + add_unittests(mra "${MRA_TEST_SOURCES}" "MADmra;MADgtest" "unittests") set(MRA_SEPOP_TEST_SOURCES testsuite.cc testper.cc) - add_unittests(mra_sepop "${MRA_SEPOP_TEST_SOURCES}" "libtest_sepop;MADgtest") + add_unittests(mra_sepop "${MRA_SEPOP_TEST_SOURCES}" "libtest_sepop;MADgtest" "unittests") # Test executables that are not run with unit tests set(MRA_OTHER_TESTS testperiodic testbc testqm test6 diff --git a/src/madness/tensor/CMakeLists.txt b/src/madness/tensor/CMakeLists.txt index 6ec51249deb..3734dd60355 100644 --- a/src/madness/tensor/CMakeLists.txt +++ b/src/madness/tensor/CMakeLists.txt @@ -90,7 +90,7 @@ if(BUILD_TESTING) list(APPEND LINALG_TEST_SOURCES test_gentensor.cc test_lowranktensor.cc) endif() - add_unittests(tensor "${TENSOR_TEST_SOURCES}" "MADtensor;MADgtest") - add_unittests(linalg "${LINALG_TEST_SOURCES}" "MADlinalg;MADgtest") + add_unittests(tensor "${TENSOR_TEST_SOURCES}" "MADtensor;MADgtest" "unittests") + add_unittests(linalg "${LINALG_TEST_SOURCES}" "MADlinalg;MADgtest" "unittests") endif() diff --git a/src/madness/world/CMakeLists.txt b/src/madness/world/CMakeLists.txt index 74b108ffaf3..ced39edf430 100644 --- a/src/madness/world/CMakeLists.txt +++ b/src/madness/world/CMakeLists.txt @@ -97,7 +97,7 @@ if(BUILD_TESTING) test_worldref.cc test_stack.cc test_googletest.cc test_tree.cc ) - add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest") + add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest" "unittests") # add_scripted_tests(test.py test_tree "scripted") # add_scripted_tests(test1.py test_hello "scripted") From a2c11377fbdd09e2393e4d35391917b99ac3f27e Mon Sep 17 00:00:00 2001 From: fbischoff Date: Tue, 24 Jan 2023 23:06:46 +0100 Subject: [PATCH 0663/1312] adding "short" label to all unittests --- cmake/modules/AddUnittests.cmake | 4 +++- src/madness/misc/CMakeLists.txt | 2 +- src/madness/mra/CMakeLists.txt | 4 ++-- src/madness/tensor/CMakeLists.txt | 4 ++-- src/madness/world/CMakeLists.txt | 5 +---- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/cmake/modules/AddUnittests.cmake b/cmake/modules/AddUnittests.cmake index 081b225fe6f..fb56e1fd268 100644 --- a/cmake/modules/AddUnittests.cmake +++ b/cmake/modules/AddUnittests.cmake @@ -9,7 +9,9 @@ macro(add_unittests _component _sources _libs _labels) # Add a test that builds the unit tests add_test(madness/test/${_component}/build "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${_component}_unittests-madness) - + # make sure that the build step has all labels + set_property(TEST madness/test/${_component}/build PROPERTY LABELS "${_labels}" APPEND) + foreach(_source ${_sources}) # Get the test name (the file name of the first source) string(REGEX MATCH "[A-Za-z_][A-Za-z0-9_]*\\.cc" _test_source "${_source}") diff --git a/src/madness/misc/CMakeLists.txt b/src/madness/misc/CMakeLists.txt index 99f56cdbfd7..81f5842b3d3 100644 --- a/src/madness/misc/CMakeLists.txt +++ b/src/madness/misc/CMakeLists.txt @@ -22,6 +22,6 @@ if(BUILD_TESTING) # The list of unit test source files set(MISC_TEST_SOURCES interp3.cc) - add_unittests(misc "${MISC_TEST_SOURCES}" "MADmisc;MADgtest" "unittests") + add_unittests(misc "${MISC_TEST_SOURCES}" "MADmisc;MADgtest" "unittests;short") endif() \ No newline at end of file diff --git a/src/madness/mra/CMakeLists.txt b/src/madness/mra/CMakeLists.txt index ec785dd82c2..e0ec36cb333 100644 --- a/src/madness/mra/CMakeLists.txt +++ b/src/madness/mra/CMakeLists.txt @@ -37,10 +37,10 @@ if(BUILD_TESTING) testpdiff.cc testdiff1Db.cc testgconv.cc testopdir.cc testinnerext.cc testgaxpyext.cc testvmra.cc, test_vectormacrotask.cc test_cloud.cc test_macrotaskpartitioner.cc) - add_unittests(mra "${MRA_TEST_SOURCES}" "MADmra;MADgtest" "unittests") + add_unittests(mra "${MRA_TEST_SOURCES}" "MADmra;MADgtest" "unittests;short") set(MRA_SEPOP_TEST_SOURCES testsuite.cc testper.cc) - add_unittests(mra_sepop "${MRA_SEPOP_TEST_SOURCES}" "libtest_sepop;MADgtest" "unittests") + add_unittests(mra_sepop "${MRA_SEPOP_TEST_SOURCES}" "libtest_sepop;MADgtest" "unittests;short") # Test executables that are not run with unit tests set(MRA_OTHER_TESTS testperiodic testbc testqm test6 diff --git a/src/madness/tensor/CMakeLists.txt b/src/madness/tensor/CMakeLists.txt index 3734dd60355..2747e619609 100644 --- a/src/madness/tensor/CMakeLists.txt +++ b/src/madness/tensor/CMakeLists.txt @@ -90,7 +90,7 @@ if(BUILD_TESTING) list(APPEND LINALG_TEST_SOURCES test_gentensor.cc test_lowranktensor.cc) endif() - add_unittests(tensor "${TENSOR_TEST_SOURCES}" "MADtensor;MADgtest" "unittests") - add_unittests(linalg "${LINALG_TEST_SOURCES}" "MADlinalg;MADgtest" "unittests") + add_unittests(tensor "${TENSOR_TEST_SOURCES}" "MADtensor;MADgtest" "unittests;short") + add_unittests(linalg "${LINALG_TEST_SOURCES}" "MADlinalg;MADgtest" "unittests;short") endif() diff --git a/src/madness/world/CMakeLists.txt b/src/madness/world/CMakeLists.txt index ced39edf430..10e2a3348cc 100644 --- a/src/madness/world/CMakeLists.txt +++ b/src/madness/world/CMakeLists.txt @@ -97,10 +97,7 @@ if(BUILD_TESTING) test_worldref.cc test_stack.cc test_googletest.cc test_tree.cc ) - add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest" "unittests") - -# add_scripted_tests(test.py test_tree "scripted") -# add_scripted_tests(test1.py test_hello "scripted") + add_unittests(world "${WORLD_TEST_SOURCES}" "MADworld;MADgtest" "unittests;short") find_package(CUDA) if (TARGET PaRSEC::parsec AND CUDA_FOUND) From 2431b1fe2fba2363284980ba9cff6c07d5467e6b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 4 Feb 2023 14:02:00 -0500 Subject: [PATCH 0664/1312] Remove comments --- src/apps/molresponse/FrequencyResponse.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e6d0dc55724..80e537774e0 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -100,8 +100,6 @@ void FrequencyResponse::iterate(World &world) { //PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); - //Chi = mask * Chi; - // Basic output if (r_params.print_level() >= 1) { molresponse::start_timer(world); if (world.rank() == 0) From 58d9547cdb073b02f7bb18e95980304b49445208 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 4 Feb 2023 14:49:31 -0500 Subject: [PATCH 0665/1312] add output scf_info schema back in --- src/madness/chem/SCF.cc | 32 ++++++++++++++++++++++++++++++++ src/madness/chem/SCF.h | 3 +++ 2 files changed, 35 insertions(+) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index c4fa21e90e7..d3785889781 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -141,6 +141,38 @@ tensorT Q2(const tensorT& s) { } }// namespace madness +void +SCF::output_scf_info_schema(const int &iter, const std::map &vals, const tensorT &dipole_T) const { + nlohmann::json j = {}; + j.push_back(nlohmann::json()); + // if it exists figure out the size. pushback for each protocol + j[0]["scf_iterations"] = iter; + const double thresh = FunctionDefaults<3>::get_thresh(); + const int k = FunctionDefaults<3>::get_k(); + j[0]["scf_threshold"] = thresh; + j[0]["scf_k"] = k; + for (auto const &[key, val]: vals) { + j[0][key] = val; + } + j[0]["scf_dipole_moment"] = tensor_to_json(dipole_T); + int num = 0; + std::string save = param.prefix() + ".scf_info.json"; +#ifdef MADCHEM_HAS_STD_FILESYSTEM + if (std::filesystem::exists(save)) { + std::ifstream ifs(save); +#else + std::ifstream ifs(save); + if (ifs) { +#endif + nlohmann::json j_old; + ifs >> j_old; + print(j_old); + j_old.push_back(j); + j = j_old; + }; + std::ofstream ofs(save); + ofs << std::setw(4) << j; +} void SCF::output_calc_info_schema() const { nlohmann::json j = {}; diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 68f48e29dc3..bb62136c961 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -504,6 +504,9 @@ class SCF { void solve(World& world); void output_calc_info_schema() const; + + void output_scf_info_schema(const int& iter, const std::map& vals, const tensorT& dipole_T) const; + }; // Computes molecular energy as a function of the geometry From df7dae80ef7a94d59eee38d1b0003a1da13e9193 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 4 Feb 2023 15:56:28 -0500 Subject: [PATCH 0666/1312] use the new update function for scf output --- src/madness/chem/SCF.cc | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index d3785889781..7f75d73e96a 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -156,22 +156,7 @@ SCF::output_scf_info_schema(const int &iter, const std::map } j[0]["scf_dipole_moment"] = tensor_to_json(dipole_T); int num = 0; - std::string save = param.prefix() + ".scf_info.json"; -#ifdef MADCHEM_HAS_STD_FILESYSTEM - if (std::filesystem::exists(save)) { - std::ifstream ifs(save); -#else - std::ifstream ifs(save); - if (ifs) { -#endif - nlohmann::json j_old; - ifs >> j_old; - print(j_old); - j_old.push_back(j); - j = j_old; - }; - std::ofstream ofs(save); - ofs << std::setw(4) << j; + update_schema(param.prefix()+".scf_info.json", j); } void SCF::output_calc_info_schema() const { From fa48b88b02475c4135041ccf235899f2d6d91e0c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 4 Feb 2023 16:11:28 -0500 Subject: [PATCH 0667/1312] check if MADCHEM has file system --- src/apps/molresponse/ResponseBase.cpp | 66 ++++++++++++++++++++------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index e976db6b6dd..570b34aaf46 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -4,6 +4,23 @@ #include "ResponseBase.hpp" + +#if defined(__has_include) +#if __has_include() +#define MADCHEM_HAS_STD_FILESYSTEM +// is not reliably usable on Linux with gcc < 9 +#if defined(__GNUC__) +#if __GNUC__ >= 7 && __GNUC__ < 9 +#undef MADCHEM_HAS_STD_FILESYSTEM +#endif +#endif +#if defined(MADCHEM_HAS_STD_FILESYSTEM) + +#include + +#endif +#endif +#endif // Initializes calculation object for both excited state and frequency dependent // Copies both the response and ground state /// Constructs the Base Response @@ -216,7 +233,8 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const auto new_hamiltonian = T + phiVphi; for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) { - for (int64_t j = i + 1; j < new_hamiltonian.dim(1); j++) { + for (int64_t j = i + 1; j < new_hamiltonian.dim(1); j++) + { // print(i, j); // print(xAx(i, j)); // print(xAx(j, i)); @@ -224,7 +242,8 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const } } double traceOfHamiltonian(0); - for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) { + for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) + { traceOfHamiltonian += new_hamiltonian(i, i); } print("Trace of Hamiltonian"); @@ -766,13 +785,15 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - for (size_t b = 0; b < num_states; b++) { + for (size_t b = 0; b < num_states; b++) + { vecfuncT x; x = d_alpha.X[b]; k1_x[b] = newK(x, phi0, vf); } - if (r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) + { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -1236,14 +1257,22 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi } } - void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, const response_space &x_response, const response_space &y_response, ResponseParameters const &responseParameters, GroundStateCalculation const &g_params) { - std::filesystem::create_directories("plots/densities"); - std::filesystem::create_directory("plots/orbitals"); + + + std::string density_dir = "plots/densities"; + std::string orbital_dir = "plots/densities"; +#ifdef MADCHEM_HAS_STD_FILESYSTEM + std::filesystem::create_directories(density_dir); + std::filesystem::create_directory(orbital_dir); +#else + density_dir = ""; + orbital_dir = ""; +#endif // TESTING // get transition density @@ -1265,32 +1294,35 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, plotCoords plt(d, Lp); // plot ground density if (iteration == 1) { - snprintf(plot_name, buffSize, "plots/densities/rho0_%c_0.plt", dir[d]); + auto d_i_path = density_dir + "/rho0_%c_0.plot"; + snprintf(plot_name, buffSize, d_i_path.c_str(), dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, rho0); } for (int i = 0; i < static_cast(n); i++) { // print ground_state // plot gound_orbitals - snprintf(plot_name, buffSize, "plots/orbitals/phi0_%c_0_%d.plt", dir[d], - static_cast(i)); + auto orb_i_path = orbital_dir + "/phi0_%c_0_%d.plt"; + snprintf(plot_name, buffSize, orb_i_path.c_str(), dir[d], static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals[i]); } for (int b = 0; b < static_cast(m); b++) { // plot rho1 direction d state b - snprintf(plot_name, buffSize, "plots/densities/rho1_%c_%d.plt", dir[d], + auto d_ib_path = density_dir + "/rho1_%c_%d.plt"; + snprintf(plot_name, buffSize, d_ib_path.c_str(), dir[d], static_cast(b)); plot_line(plot_name, 5001, plt.lo, plt.hi, rho1[b]); for (int i = 0; i < static_cast(n); i++) { // print ground_state - // plot x function x_dir_b_i__k_iter - snprintf(plot_name, buffSize, "plots/orbitals/phix_%c_%d_%d.plt", dir[d], + auto o_ibx_path = orbital_dir + "plots/orbitals/phix_%c_%d_%d.plt"; + auto o_iby_path = orbital_dir + "plots/orbitals/phiy_%c_%d_%d.plt"; + snprintf(plot_name, buffSize, o_ibx_path.c_str(), dir[d], static_cast(b), static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b][i]); - // plot y functione y_dir_b_i__k_iter - snprintf(plot_name, buffSize, "plots/orbitals/phiy_%c_%d_%d.plt", dir[d], + // plot y function y_dir_b_i__k_iter + snprintf(plot_name, buffSize, o_iby_path.c_str(), dir[d], static_cast(b), static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, y_response[b][i]); } @@ -1301,7 +1333,6 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, // END TESTING } - void PlotGroundDensityVTK(World &world, const ResponseBase &calc) { auto [ground_calc, molecule, r_params] = calc.get_parameter(); @@ -1405,7 +1436,8 @@ void ResponseBase::solve(World &world) { void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::get_thresh(), int k = FunctionDefaults<3>::get_k()) { - if (0 != Chi.X.size()) { + if (0 != Chi.X.size()) + { if (FunctionDefaults<3>::get_k() != Chi.X[0].at(0).k()) { // Project all x components into correct k From b99269ac8c75f4ce02afbd996bc7cb9ea65eb37d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 16:55:24 -0500 Subject: [PATCH 0668/1312] add catch for json --- src/apps/molresponse/testing/mad-freq.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 24ab270755e..dd555401b96 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -73,6 +73,9 @@ auto main(int argc, char *argv[]) -> int { error("caught a Tensor exception"); } catch (const char *s) { print(s); } catch (const std::string &s) { print(s); + } catch (const nlohmann::detail::exception &e) { + std::cout< Date: Mon, 6 Feb 2023 17:10:03 -0500 Subject: [PATCH 0669/1312] debug scf json and make sure is compatible with non std::filesystem --- src/apps/molresponse/ResponseBase.cpp | 50 +++++++++++++++++++----- src/apps/molresponse/testing/runners.hpp | 5 ++- src/madness/chem/SCF.cc | 16 ++++---- src/madness/chem/SCF.h | 3 +- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6fbc94775ee..f20287aeceb 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -5,6 +5,22 @@ #include "ResponseBase.hpp" +#if defined(__has_include) +#if __has_include() +#define MADCHEM_HAS_STD_FILESYSTEM +// is not reliably usable on Linux with gcc < 9 +#if defined(__GNUC__) +#if __GNUC__ >= 7 && __GNUC__ < 9 +#undef MADCHEM_HAS_STD_FILESYSTEM +#endif +#endif +#if defined(MADCHEM_HAS_STD_FILESYSTEM) + +#include + +#endif +#endif +#endif // Initializes calculation object for both excited state and frequency dependent // Copies both the response and ground state /// Constructs the Base Response @@ -1232,8 +1248,19 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, const response_space &y_response, ResponseParameters const &responseParameters, GroundStateCalculation const &g_params) { - std::filesystem::create_directories("plots/densities"); - std::filesystem::create_directory("plots/orbitals"); + + + std::string density_dir = "plots/"; + std::string orbital_dir = "plots/"; +#ifdef MADCHEM_HAS_STD_FILESYSTEM + //density_dir = ""; + //orbital_dir = ""; + std::filesystem::create_directories(density_dir); + std::filesystem::create_directory(orbital_dir); +#else + density_dir = ""; + orbital_dir = ""; +#endif // TESTING // get transition density @@ -1255,32 +1282,35 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, plotCoords plt(d, Lp); // plot ground density if (iteration == 1) { - snprintf(plot_name, buffSize, "plots/densities/rho0_%c_0.plt", dir[d]); + auto d_i_path = density_dir + "rho0_%c_0.plot"; + snprintf(plot_name, buffSize, d_i_path.c_str(), dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, rho0); } for (int i = 0; i < static_cast(n); i++) { // print ground_state // plot gound_orbitals - snprintf(plot_name, buffSize, "plots/orbitals/phi0_%c_0_%d.plt", dir[d], - static_cast(i)); + auto orb_i_path = orbital_dir + "phi0_%c_0_%d.plt"; + snprintf(plot_name, buffSize, orb_i_path.c_str(), dir[d], static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals[i]); } for (int b = 0; b < static_cast(m); b++) { // plot rho1 direction d state b - snprintf(plot_name, buffSize, "plots/densities/rho1_%c_%d.plt", dir[d], + auto d_ib_path = density_dir + "rho1_%c_%d.plt"; + snprintf(plot_name, buffSize, d_ib_path.c_str(), dir[d], static_cast(b)); plot_line(plot_name, 5001, plt.lo, plt.hi, rho1[b]); for (int i = 0; i < static_cast(n); i++) { // print ground_state - // plot x function x_dir_b_i__k_iter - snprintf(plot_name, buffSize, "plots/orbitals/phix_%c_%d_%d.plt", dir[d], + auto o_ibx_path = orbital_dir + "phix_%c_%d_%d.plt"; + auto o_iby_path = orbital_dir + "phiy_%c_%d_%d.plt"; + snprintf(plot_name, buffSize, o_ibx_path.c_str(), dir[d], static_cast(b), static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b][i]); - // plot y functione y_dir_b_i__k_iter - snprintf(plot_name, buffSize, "plots/orbitals/phiy_%c_%d_%d.plt", dir[d], + // plot y function y_dir_b_i__k_iter + snprintf(plot_name, buffSize, o_iby_path.c_str(), dir[d], static_cast(b), static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, y_response[b][i]); } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 65e4099bf96..9edd5febc49 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -445,8 +445,9 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo auto dipole_t = calc.dipole(world, rho); std::map results; results["scf_energy"] = calc.current_energy; + world.gop.fence(); if (world.rank() == 0) { - calc.output_scf_info_schema(0, results, dipole_t); + calc.output_scf_info_schema(results, dipole_t); ME.output_calc_info_schema(); } } else { @@ -522,7 +523,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals", false); + r_params.set_user_defined_value("plot_all_orbitals", true); r_params.set_user_defined_value("plot", true); r_params.set_user_defined_value("print_level", 20); r_params.set_user_defined_value("save", true); diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 7f75d73e96a..2b5be0bcd0b 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -141,22 +141,20 @@ tensorT Q2(const tensorT& s) { } }// namespace madness -void -SCF::output_scf_info_schema(const int &iter, const std::map &vals, const tensorT &dipole_T) const { +void SCF::output_scf_info_schema(const std::map &vals, + const tensorT &dipole_T) const { nlohmann::json j = {}; - j.push_back(nlohmann::json()); // if it exists figure out the size. pushback for each protocol - j[0]["scf_iterations"] = iter; const double thresh = FunctionDefaults<3>::get_thresh(); const int k = FunctionDefaults<3>::get_k(); - j[0]["scf_threshold"] = thresh; - j[0]["scf_k"] = k; + j["scf_threshold"] = thresh; + j["scf_k"] = k; for (auto const &[key, val]: vals) { - j[0][key] = val; + j[key] = val; } - j[0]["scf_dipole_moment"] = tensor_to_json(dipole_T); + j["scf_dipole_moment"] = tensor_to_json(dipole_T); int num = 0; - update_schema(param.prefix()+".scf_info.json", j); + update_schema(param.prefix()+".scf_info", j); } void SCF::output_calc_info_schema() const { diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index bb62136c961..3c222ecb04c 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -505,7 +505,8 @@ class SCF { void output_calc_info_schema() const; - void output_scf_info_schema(const int& iter, const std::map& vals, const tensorT& dipole_T) const; + void output_scf_info_schema(const std::map &vals, + const tensorT &dipole_T) const; }; From 972b0f5058e94521ef6435adb1ea8a6c4ea943f7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:10:19 -0500 Subject: [PATCH 0670/1312] remove the extra catch for json --- src/apps/molresponse/testing/mad-freq.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index dd555401b96..512a906c854 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -63,13 +63,13 @@ auto main(int argc, char *argv[]) -> int { world.gop.fence(); } } catch (const SafeMPI::Exception &e) { - print(e); + print(e.what()); error("caught an MPI exception"); } catch (const madness::MadnessException &e) { print(e); error("caught a MADNESS exception"); } catch (const madness::TensorException &e) { - print(e); + print(e.what()); error("caught a Tensor exception"); } catch (const char *s) { print(s); } catch (const std::string &s) { print(s); @@ -77,8 +77,8 @@ auto main(int argc, char *argv[]) -> int { std::cout< Date: Mon, 6 Feb 2023 17:12:56 -0500 Subject: [PATCH 0671/1312] do not write into root --- src/apps/molresponse/ResponseBase.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 570b34aaf46..a664c057383 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1294,29 +1294,29 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, plotCoords plt(d, Lp); // plot ground density if (iteration == 1) { - auto d_i_path = density_dir + "/rho0_%c_0.plot"; + auto d_i_path = density_dir + "rho0_%c_0.plot"; snprintf(plot_name, buffSize, d_i_path.c_str(), dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, rho0); } for (int i = 0; i < static_cast(n); i++) { // print ground_state // plot gound_orbitals - auto orb_i_path = orbital_dir + "/phi0_%c_0_%d.plt"; + auto orb_i_path = orbital_dir + "phi0_%c_0_%d.plt"; snprintf(plot_name, buffSize, orb_i_path.c_str(), dir[d], static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals[i]); } for (int b = 0; b < static_cast(m); b++) { // plot rho1 direction d state b - auto d_ib_path = density_dir + "/rho1_%c_%d.plt"; + auto d_ib_path = density_dir + "rho1_%c_%d.plt"; snprintf(plot_name, buffSize, d_ib_path.c_str(), dir[d], static_cast(b)); plot_line(plot_name, 5001, plt.lo, plt.hi, rho1[b]); for (int i = 0; i < static_cast(n); i++) { // print ground_state - auto o_ibx_path = orbital_dir + "plots/orbitals/phix_%c_%d_%d.plt"; - auto o_iby_path = orbital_dir + "plots/orbitals/phiy_%c_%d_%d.plt"; + auto o_ibx_path = orbital_dir + "phix_%c_%d_%d.plt"; + auto o_iby_path = orbital_dir + "phiy_%c_%d_%d.plt"; snprintf(plot_name, buffSize, o_ibx_path.c_str(), dir[d], static_cast(b), static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b][i]); From 2d7183cf5d7f4fc4dec0beb94ac14960f931c676 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:30:37 -0500 Subject: [PATCH 0672/1312] catch json exception --- src/apps/molresponse/testing/mad-freq.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 13053fb83d2..8a509efde39 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -71,10 +71,15 @@ auto main(int argc, char *argv[]) -> int { std::cout << e << std::endl; } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { print(s); - } catch (const std::string &s) { print(s); } catch (const std::exception &e) { + } catch (const nlohmann::detail::exception &e) { print(e.what()); + error("Caught JSON exception"); + }catch (const char *s) { + print(s); } catch (const std::filesystem::filesystem_error &ex) { std::cerr << ex.what() << "\n"; + } catch (const std::string &s) { print(s); } catch (const std::exception &e) { + print(e.what()); } catch (...) { error("caught unhandled exception"); } if (world.rank() == 0) { print("Finished All Frequencies"); } From 42a5c06c93d6b14efe0f8afe5d49dd6842cf1984 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:31:09 -0500 Subject: [PATCH 0673/1312] use fstream algorithm --- src/madness/tensor/tensor_json.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/tensor/tensor_json.hpp b/src/madness/tensor/tensor_json.hpp index 4e64f936553..0d0393c7e2a 100644 --- a/src/madness/tensor/tensor_json.hpp +++ b/src/madness/tensor/tensor_json.hpp @@ -6,7 +6,7 @@ #define MADNESS_TENSOR_JSON_H #include -#include +#include // #include "catch.hpp" #include From 15a4be96e3ff1470589d6a1ec980d009415e3539 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:31:35 -0500 Subject: [PATCH 0674/1312] fix the directory name --- src/apps/molresponse/ResponseBase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index a664c057383..c294d04e29e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1264,8 +1264,8 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, GroundStateCalculation const &g_params) { - std::string density_dir = "plots/densities"; - std::string orbital_dir = "plots/densities"; + std::string density_dir = "plots/densities/"; + std::string orbital_dir = "plots/densities/"; #ifdef MADCHEM_HAS_STD_FILESYSTEM std::filesystem::create_directories(density_dir); std::filesystem::create_directory(orbital_dir); From cff175654a82a3a0efa4849a790cfc0b8bef7c28 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:36:36 -0500 Subject: [PATCH 0675/1312] remove some unnecessary catch statements --- src/apps/molresponse/testing/mad-freq.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 8a509efde39..9db082593db 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -74,9 +74,8 @@ auto main(int argc, char *argv[]) -> int { } catch (const nlohmann::detail::exception &e) { print(e.what()); error("Caught JSON exception"); - }catch (const char *s) { - print(s); - } catch (const std::filesystem::filesystem_error &ex) { + } + catch (const std::filesystem::filesystem_error &ex) { std::cerr << ex.what() << "\n"; } catch (const std::string &s) { print(s); } catch (const std::exception &e) { print(e.what()); From 4a250a7f2c9da2ee5aa1f4586aac6e10f8e98c34 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:36:47 -0500 Subject: [PATCH 0676/1312] plot orbitals true for testing --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 59c6046ccb1..257ea95c820 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -512,7 +512,7 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals", false); + r_params.set_user_defined_value("plot_all_orbitals", true); r_params.set_user_defined_value("print_level", 20); r_params.set_user_defined_value("save", true); // set xc, property, frequency,and restart From 10852d18aa3e696436c294681501bebb145a93cc Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:38:57 -0500 Subject: [PATCH 0677/1312] single plot directory --- src/apps/molresponse/ResponseBase.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c294d04e29e..9456bd49842 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1264,14 +1264,11 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, GroundStateCalculation const &g_params) { - std::string density_dir = "plots/densities/"; - std::string orbital_dir = "plots/densities/"; + std::string plot_dir = "plots/"; #ifdef MADCHEM_HAS_STD_FILESYSTEM - std::filesystem::create_directories(density_dir); - std::filesystem::create_directory(orbital_dir); + std::filesystem::create_directories(plot_dir); #else - density_dir = ""; - orbital_dir = ""; + plot_dir = ""; #endif // TESTING @@ -1294,29 +1291,29 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, plotCoords plt(d, Lp); // plot ground density if (iteration == 1) { - auto d_i_path = density_dir + "rho0_%c_0.plot"; + auto d_i_path = plot_dir + "rho0_%c_0.plot"; snprintf(plot_name, buffSize, d_i_path.c_str(), dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, rho0); } for (int i = 0; i < static_cast(n); i++) { // print ground_state // plot gound_orbitals - auto orb_i_path = orbital_dir + "phi0_%c_0_%d.plt"; + auto orb_i_path = plot_dir + "phi0_%c_0_%d.plt"; snprintf(plot_name, buffSize, orb_i_path.c_str(), dir[d], static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals[i]); } for (int b = 0; b < static_cast(m); b++) { // plot rho1 direction d state b - auto d_ib_path = density_dir + "rho1_%c_%d.plt"; + auto d_ib_path = plot_dir + "rho1_%c_%d.plt"; snprintf(plot_name, buffSize, d_ib_path.c_str(), dir[d], static_cast(b)); plot_line(plot_name, 5001, plt.lo, plt.hi, rho1[b]); for (int i = 0; i < static_cast(n); i++) { // print ground_state - auto o_ibx_path = orbital_dir + "phix_%c_%d_%d.plt"; - auto o_iby_path = orbital_dir + "phiy_%c_%d_%d.plt"; + auto o_ibx_path = plot_dir + "phix_%c_%d_%d.plt"; + auto o_iby_path = plot_dir + "phiy_%c_%d_%d.plt"; snprintf(plot_name, buffSize, o_ibx_path.c_str(), dir[d], static_cast(b), static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b][i]); From ee5b92516a32cb5a720dbf5f16fcaa54b3f92680 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:41:32 -0500 Subject: [PATCH 0678/1312] For testing --- src/apps/molresponse/ResponseBase.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 9456bd49842..29d28fc183e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1266,7 +1266,8 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, std::string plot_dir = "plots/"; #ifdef MADCHEM_HAS_STD_FILESYSTEM - std::filesystem::create_directories(plot_dir); + //std::filesystem::create_directories(plot_dir); + plot_dir = ""; #else plot_dir = ""; #endif From 5b65acc02e5f50624647516e1dd2892e64e0708a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:41:59 -0500 Subject: [PATCH 0679/1312] Change it back --- src/apps/molresponse/ResponseBase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 29d28fc183e..c2b6c1f385c 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1266,8 +1266,8 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, std::string plot_dir = "plots/"; #ifdef MADCHEM_HAS_STD_FILESYSTEM - //std::filesystem::create_directories(plot_dir); - plot_dir = ""; + std::filesystem::create_directories(plot_dir); + //plot_dir = ""; #else plot_dir = ""; #endif From ca7fbcd3c597454319d62e566434cec2acab4ff7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 7 Feb 2023 07:40:37 -0500 Subject: [PATCH 0680/1312] Revert "Merge branch 'master' into molresponse_development" This reverts commit 565746919694cf77a8412fea21605d6ac4b2b8e5, reversing changes made to 972b0f5058e94521ef6435adb1ea8a6c4ea943f7. --- src/apps/molresponse/ResponseBase.cpp | 42 ++++++++--------- src/apps/molresponse/testing/runners.hpp | 59 +++++++++++++----------- src/madness/tensor/tensor_json.hpp | 2 +- 3 files changed, 54 insertions(+), 49 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d931c4e30e7..f20287aeceb 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -236,17 +236,12 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const auto new_hamiltonian = T + phiVphi; for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) { - for (int64_t j = i + 1; j < new_hamiltonian.dim(1); j++) - { - // print(i, j); - // print(xAx(i, j)); - // print(xAx(j, i)); + for (int64_t j = i + 1; j < new_hamiltonian.dim(1); j++) { new_hamiltonian(j, i) = new_hamiltonian(i, j); } } double traceOfHamiltonian(0); - for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) - { + for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) { traceOfHamiltonian += new_hamiltonian(i, i); } if (world.rank() == 0) { @@ -780,15 +775,13 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - for (size_t b = 0; b < num_states; b++) - { + for (size_t b = 0; b < num_states; b++) { vecfuncT x; x = d_alpha.X[b]; k1_x[b] = newK(x, phi0, phi0); } - if (r_params.print_level() >= 1) - { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -1249,6 +1242,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi } } + void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, const response_space &x_response, const response_space &y_response, @@ -1256,12 +1250,16 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, GroundStateCalculation const &g_params) { - std::string plot_dir = "plots/"; + std::string density_dir = "plots/"; + std::string orbital_dir = "plots/"; #ifdef MADCHEM_HAS_STD_FILESYSTEM - std::filesystem::create_directories(plot_dir); - //plot_dir = ""; + //density_dir = ""; + //orbital_dir = ""; + std::filesystem::create_directories(density_dir); + std::filesystem::create_directory(orbital_dir); #else - plot_dir = ""; + density_dir = ""; + orbital_dir = ""; #endif // TESTING @@ -1284,29 +1282,29 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, plotCoords plt(d, Lp); // plot ground density if (iteration == 1) { - auto d_i_path = plot_dir + "rho0_%c_0.plot"; + auto d_i_path = density_dir + "rho0_%c_0.plot"; snprintf(plot_name, buffSize, d_i_path.c_str(), dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, rho0); } for (int i = 0; i < static_cast(n); i++) { // print ground_state // plot gound_orbitals - auto orb_i_path = plot_dir + "phi0_%c_0_%d.plt"; + auto orb_i_path = orbital_dir + "phi0_%c_0_%d.plt"; snprintf(plot_name, buffSize, orb_i_path.c_str(), dir[d], static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals[i]); } for (int b = 0; b < static_cast(m); b++) { // plot rho1 direction d state b - auto d_ib_path = plot_dir + "rho1_%c_%d.plt"; + auto d_ib_path = density_dir + "rho1_%c_%d.plt"; snprintf(plot_name, buffSize, d_ib_path.c_str(), dir[d], static_cast(b)); plot_line(plot_name, 5001, plt.lo, plt.hi, rho1[b]); for (int i = 0; i < static_cast(n); i++) { // print ground_state - auto o_ibx_path = plot_dir + "phix_%c_%d_%d.plt"; - auto o_iby_path = plot_dir + "phiy_%c_%d_%d.plt"; + auto o_ibx_path = orbital_dir + "phix_%c_%d_%d.plt"; + auto o_iby_path = orbital_dir + "phiy_%c_%d_%d.plt"; snprintf(plot_name, buffSize, o_ibx_path.c_str(), dir[d], static_cast(b), static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b][i]); @@ -1323,6 +1321,7 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, // END TESTING } + void PlotGroundDensityVTK(World &world, const ResponseBase &calc) { auto [ground_calc, molecule, r_params] = calc.get_parameter(); @@ -1429,8 +1428,7 @@ void ResponseBase::solve(World &world) { void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::get_thresh(), int k = FunctionDefaults<3>::get_k()) { - if (0 != Chi.X.size()) - { + if (0 != Chi.X.size()) { if (FunctionDefaults<3>::get_k() != Chi.X[0].at(0).k()) { // Project all x components into correct k diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index d237074d782..9edd5febc49 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -503,33 +503,40 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, * @param xc * @param frequency */ -void set_frequency_response_parameters(ResponseParameters &r_params, const std::string &property, - const std::string &xc, const double &frequency, - bool high_precision) { - if (high_precision) { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - r_params.set_user_defined_value("dconv", 1e-6); - } else { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-6}); - r_params.set_user_defined_value("dconv", 1e-4); - } - //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(30)); - r_params.set_user_defined_value("maxsub", size_t(5)); - r_params.set_user_defined_value("kain", true); - r_params.set_user_defined_value("omega", frequency); - r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals", false); - r_params.set_user_defined_value("print_level", 20); - r_params.set_user_defined_value("save", true); - // set xc, property, frequency,and restart - r_params.set_user_defined_value("xc", xc); - // Here - if (property == "dipole") { - r_params.set_user_defined_value("dipole", true); - } else if (property == "nuclear") { - r_params.set_user_defined_value("nuclear", true); +void set_frequency_response_parameters(World &world, ResponseParameters &r_params, + const std::string &property, const std::string &xc, + const double &frequency, const std::string &precision) { + if (world.rank() == 0) { + if (precision == "high") { + r_params.set_user_defined_value>("protocol", {1e-6, 1e-7, 1e-8}); + r_params.set_user_defined_value("dconv", 1e-6); + } else if (precision == "low") { + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + r_params.set_user_defined_value("dconv", 1e-4); + } else { + r_params.set_user_defined_value>("protocol", {1e-9}); + r_params.set_user_defined_value("dconv", 1e-7); + } + //r_params.set_user_defined_value("archive", std::string("../restartdata")); + r_params.set_user_defined_value("maxiter", size_t(15)); + r_params.set_user_defined_value("maxsub", size_t(5)); + r_params.set_user_defined_value("kain", true); + r_params.set_user_defined_value("omega", frequency); + r_params.set_user_defined_value("first_order", true); + r_params.set_user_defined_value("plot_all_orbitals", true); + r_params.set_user_defined_value("plot", true); + r_params.set_user_defined_value("print_level", 20); + r_params.set_user_defined_value("save", true); + // set xc, property, frequency,and restart + r_params.set_user_defined_value("xc", xc); + // Here + if (property == "dipole") { + r_params.set_user_defined_value("dipole", true); + } else if (property == "nuclear") { + r_params.set_user_defined_value("nuclear", true); + } } + world.gop.broadcast_serializable(r_params, 0); } /*** diff --git a/src/madness/tensor/tensor_json.hpp b/src/madness/tensor/tensor_json.hpp index 35fdb2d3214..330b0179e76 100644 --- a/src/madness/tensor/tensor_json.hpp +++ b/src/madness/tensor/tensor_json.hpp @@ -6,7 +6,7 @@ #define MADNESS_TENSOR_JSON_H #include -#include +#include // #include "catch.hpp" #include From 1daab7362eca810136a71b1dfcc147d47b613659 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 13:30:28 -0400 Subject: [PATCH 0681/1312] fence after copy --- src/apps/molresponse/response_functions.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index de52c434c00..914f1b7c4a5 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -273,6 +273,7 @@ namespace madness { std::transform(x.begin(), x.end(), result.x.begin(), [&world](auto xi) { return madness::copy(world, xi); }); + world.gop.fence(); return result; From 752d7afe844a0b83be19c4d8f523dd1d24cf234f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 13:43:53 -0400 Subject: [PATCH 0682/1312] world rank 0 does printing --- src/apps/molresponse/testing/runners.hpp | 38 ++++++++++++++++++------ 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 257ea95c820..05df1cf0444 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -416,7 +416,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo CalculationParameters param_calc; json calcInfo; if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { - std::cout<<"Reading Calc Info JSON"<> calcInfo; param_calc.from_json(calcInfo["parameters"]); @@ -428,17 +428,24 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // if parameters are different or if I want to run no matter what run // if I want to restart and if I can. restart - print("param1 != param_calc = ", param1 != param_calc); + if (world.rank() == 0) { + print("param1 != param_calc = ", param1 != param_calc); + } if (tryMOLDFT(param1, param_calc) || try_run) { - print("-------------Running moldft------------"); + if (world.rank() == 0) { + print("-------------Running moldft------------"); + } // if params are different run and if restart exists and if im asking to restar if (std::filesystem::exists(moldftSchema.moldft_restart) && restart) { param1.set_user_defined_value("restart", true); } + world.gop.fence(); + molresponse::write_test_input test_input(param1, "moldft.in", moldftSchema.mol_path);// molecule HF commandlineparser parser; parser.set_keyval("input", test_input.filename()); + world.gop.fence(); SCF calc(world, parser); calc.set_protocol<3>(world, 1e-4); MolecularEnergy ME(world, calc); @@ -763,15 +770,20 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr std::pair success{schema.moldft_path, false}; bool first = true; for (const auto &freq: schema.freq) { - print(success.second); + + if (world.rank() == 0) { + print(success.second); + } std::filesystem::current_path(schema.moldft_path); if (first) { first = false; } else if (success.second) { // if the previous run succeeded then set the restart path - print("restart_path", restart_path); restart_path = success.first; - print("restart_path = success.first", restart_path); + if (world.rank() == 0) { + print("restart_path", restart_path); + print("restart_path = success.first", restart_path); + } } else { throw Response_Convergence_Error{}; } @@ -779,7 +791,9 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr success = RunResponse(world, "response.in", freq, schema.op, schema.xc, schema.moldft_path, restart_path, high_prec); - print("Frequency ", freq, " completed"); + if (world.rank() == 0) { + print("Frequency ", freq, " completed"); + } } } @@ -795,14 +809,20 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, bool high_prec) { if (std::filesystem::is_directory(m_schema.moldft_path)) { - cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; + if(world.rank()==0){ + cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; + } } else {// create the file std::filesystem::create_directory(m_schema.moldft_path); + if(world.rank()==0){ cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" << m_schema.moldft_path << ":\n"; + } } std::filesystem::current_path(m_schema.moldft_path); - cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; + if(world.rank()==0) { + cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; + } runMOLDFT(world, m_schema, try_moldft, restart, high_prec); } From dcaf682a41df757ebd07d77d2141ee2b024b1bac Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 13:44:28 -0400 Subject: [PATCH 0683/1312] add mpi barriers for debugging --- src/apps/molresponse/ResponseBase.cpp | 92 +++++++++++++++------------ 1 file changed, 50 insertions(+), 42 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c2b6c1f385c..7bd7136e34f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -27,12 +27,12 @@ /// \param world /// \param params ResponseBase::ResponseBase(World &world, const CalcParams ¶ms) - : r_params(params.response_parameters), - molecule(params.molecule), - ground_calc(params.ground_calculation), - ground_orbitals(ground_calc.orbitals()), - ground_energies(ground_calc.get_energies()), - Chi(world, r_params.num_states(), r_params.num_orbitals()) { + : r_params(params.response_parameters), + molecule(params.molecule), + ground_calc(params.ground_calculation), + ground_orbitals(ground_calc.orbitals()), + ground_energies(ground_calc.get_energies()), + Chi(world, r_params.num_states(), r_params.num_orbitals()) { // Broadcast to all the other nodes world.gop.broadcast_serializable(r_params, 0); @@ -123,7 +123,7 @@ void ResponseBase::check_k(World &world, double thresh, int k) { /// \param world /// \return auto ResponseBase::ComputeHamiltonianPair(World &world) const --> std::pair, Tensor> { + -> std::pair, Tensor> { // Basic output if (r_params.print_level() >= 1) molresponse::start_timer(world); auto phi = ground_orbitals; @@ -333,7 +333,7 @@ void ResponseBase::load_balance_chi(World &world) { } auto ResponseBase::make_bsh_operators_response(World &world, double &shift, double &omega) const --> std::vector { + -> std::vector { if (r_params.print_level() >= 1) molresponse::start_timer(world); double tol = FunctionDefaults<3>::get_thresh(); @@ -364,10 +364,11 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, const XCOperator &xc, const std::string &calc_type) const -> X_space { - print("before start time ", r_params.print_level()); if (r_params.print_level() >= 1) { molresponse::start_timer(world); - print("------------compute theta x_________"); + if (world.rank() == 0) { + print("------------compute theta x_________"); + } } std::cout << "MPI BARRIER 3 " << std::endl; world.mpi.Barrier(); @@ -903,7 +904,7 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, XCOperator &xc, const std::string &calc_type) const --> std::tuple { + -> std::tuple { // compute bool compute_Y = calc_type == "full"; @@ -961,9 +962,8 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< bool compute_Y) const -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - print("------------compute VO[x]_________"); } - std::cout << "MPI BARRIER " << std::endl; + std::cout << "MPI BARRIER V0X " << std::endl; world.mpi.Barrier(); // Start a timer size_t m = X.num_states(); @@ -1071,6 +1071,8 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } + std::cout << "MPI BARRIER V0X END " << std::endl; + world.mpi.Barrier(); // Basic output // Done @@ -1119,7 +1121,8 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< } auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_space &g_chi, - const std::string &calc_type) -> residuals { + const std::string &calc_type) + -> residuals { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.X.size(); size_t n = chi.X.size_orbitals(); @@ -1155,7 +1158,8 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, NonLinearXsolver &kain_x_space, std::vector &Xvector, - std::vector &Xresidual) -> X_space { + std::vector &Xresidual) + -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); size_t n = chi.num_orbitals(); @@ -1574,7 +1578,7 @@ auto solid_harmonics(World &world, int n) -> std::map, real_fun 1.0 / std::sqrt((l + m + 1) * (l - m + 1)) * ((2 * l + 1) * z * result[std::vector{l, m}] - sqrt((l + m) * (l - m)) * (x * x + y * y + z * z) * - result[std::vector{l - 1, m}]); + result[std::vector{l - 1, m}]); } } @@ -1596,28 +1600,28 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct const response_space &x, const response_space &y) { // Get sizes // Check sizes and then run the algorithm - size_t m = x.size(); - auto xx = x.copy(); - auto yy = y.copy(); - auto phi0 = copy(world, orbitals); + //size_t m = x.size(); + // auto xx = x.copy(); + // auto yy = y.copy(); + // auto phi0 = copy(world, orbitals); + //world.gop.fence(); - xx.truncate_rf(); - yy.truncate_rf(); - truncate(world, phi0); + //xx.truncate_rf(); + // yy.truncate_rf(); + //truncate(world, phi0); + std::vector densities = zero_functions(world, x.size()); // Return container - std::vector densities = zero_functions(world, m); std::transform(x.begin(), x.end(), y.begin(), densities.begin(), - [&world, &phi0](auto x_alpha, auto y_alpha) { - auto dx = dot(world, x_alpha, phi0); + [&world, &orbitals](auto x_alpha, auto y_alpha) { + auto dx = dot(world, x_alpha, orbitals); world.gop.fence(); - auto dy = dot(world, phi0, y_alpha); + auto dy = dot(world, orbitals, y_alpha); return dx + dy; }); - truncate(world, densities); world.gop.fence(); - // Done! + //truncate(world, densities, FunctionDefaults<3>::get_thresh(), true); return densities; } @@ -1631,7 +1635,8 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct * @return */ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &input, - const double load_balance) -> gamma_orbitals { + const double load_balance) + -> gamma_orbitals { auto X = std::get<0>(input); auto psi0 = std::get<1>(input); @@ -1641,18 +1646,21 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu size_t n = X.num_orbitals(); if (world.size() > 1) { - molresponse::start_timer(world); LoadBalanceDeux<3> lb(world); for (unsigned int j = 0; j < n; ++j) { lb.add_tree(psi0[j], lbcost(1.0, 8.0), false); lb.add_tree(vf[j], lbcost(1.0, 8.0), false); } - for (unsigned int i = 0; i < m; ++i) { - for (unsigned int j = 0; j < n; ++j) { - // add a tree for orbitals - lb.add_tree(X.X[i][j], lbcost(1.0, 8.0), false); - lb.add_tree(X.Y[i][j], lbcost(1.0, 8.0), false); + + for (const auto &xi: X.X) { + for (const auto &xij: xi) { + lb.add_tree(xij, lbcost(1.0, 8.0), false); + } + } + for (const auto &yi: X.Y) { + for (const auto &yij: yi) { + lb.add_tree(yij, lbcost(1.0, 8.0), false); } } world.gop.fence(); @@ -1666,8 +1674,6 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu world.gop.fence(); // copy orbitals using new pmap auto X_copy = X.copy(new_process_map, false); - world.gop.fence();// then fence - auto psi0_copy = copy(world, psi0, new_process_map, false); auto vf_copy = copy(world, vf, new_process_map, false); world.gop.fence();// then fence @@ -1696,8 +1702,8 @@ void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, for (int axis = 0; axis < 3; ++axis) { // x y z functionT fdip = factoryT(world) - .functor(functorT(new madness::DipoleFunctor(axis))) - .initial_level(4); + .functor(functorT(new madness::DipoleFunctor(axis))) + .initial_level(4); dip(axis, _) = inner(world, x, mul_sparse(world, fdip, x, vtol)); // - ^2-^2-^2 for (int i = 0; i < nmo1; ++i) rsq(i) -= dip(axis, i) * dip(axis, i); @@ -1724,7 +1730,8 @@ void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, } auto ResponseBase::project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, - const Molecule &mol) -> vecfuncT { + const Molecule &mol) + -> vecfuncT { vecfuncT ao = vecfuncT(aobasis.nbf(mol)); for (int i = 0; i < aobasis.nbf(mol); ++i) { functorT aofunc(new madchem::AtomicBasisFunctor(aobasis.get_atomic_basis_function(mol, i))); @@ -1772,7 +1779,8 @@ void ResponseBase::print_inner(World &world, const std::string &name, const X_sp auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals, - const response_space &x) -> vector_real_function_3d { + const response_space &x) + -> vector_real_function_3d { // Get sizes size_t m = x.size(); From ffa764041131520e3cba441edbabce892a261f85 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 13:47:34 -0400 Subject: [PATCH 0684/1312] add mpi barriers for debugging --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5634da81e12..812d634eb6f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -120,10 +120,12 @@ void FrequencyResponse::iterate(World &world) { auto relative_max_bsh = relative_bsh.absmax(); Tensor polar = -2 * inner(Chi, PQ); + world.gop.fence(); // Todo add chi norm and chi_x function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, xij_norms, xij_res_norms, rho_norms, density_residuals); frequency_to_json(j_molresponse, iter, polar); + world.gop.fence(); if (r_params.print_level() >= 1) { @@ -279,8 +281,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bool compute_y = omega_n != 0.0; // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); + + std::cout << "MPI BARRIER After Theta X " << std::endl; + world.mpi.Barrier(); // compute residual X_space - print("BSH update iter = ", iteration); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); From a5b3b793cbb8588a5c6022793dac1b27d2f32b96 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 17:57:12 -0400 Subject: [PATCH 0685/1312] printing --- src/apps/molresponse/FrequencyResponse.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 812d634eb6f..d45a3692027 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -318,7 +318,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - print("--------------- BSH UPDATE RESPONSE------------------"); + if (world.rank()==0){ + print("--------------- BSH UPDATE RESPONSE------------------"); + } } size_t m = theta_X.X.size(); From e5e2dc2fae844585a001f4ceb3ef195ff5fb08ed Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 17:57:26 -0400 Subject: [PATCH 0686/1312] sleep for debugging --- src/apps/molresponse/testing/mad-freq.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 9db082593db..89d6ea01f14 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -31,6 +31,7 @@ auto main(int argc, char *argv[]) -> int { int result = 0; world.gop.fence(); startup(world, argc, argv); + sleep(10); std::cout.precision(6); From 1104a4ddc9fa3857e4dc02bb7e8187afd4b9f244 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 18:00:59 -0400 Subject: [PATCH 0687/1312] printing for debugging --- src/apps/molresponse/ResponseBase.cpp | 59 +++++++++++++++++++++------ 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7bd7136e34f..a5b801ade39 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -611,13 +611,32 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); + for (const auto &xi: d_alpha.X) { + for (const auto &xij: xi) { + + print("xij", xij.max_depth()," ",(void*)xij.get_impl().get()); + } + } + for (const auto &yi: d_alpha.Y) { + for (const auto &yij: yi) { + print("yij", yij.max_depth()," ",(void*)yij.get_impl().get()); + } + } + + for (const auto &pi: phi0) { + print("orbitals", pi.max_depth()," ",(void*)pi.get_impl().get()); + } + + std::cout << "MPI After Load Balancing " << std::endl; + world.mpi.Barrier(); + size_t num_states = d_alpha.num_states(); size_t num_orbitals = d_alpha.num_orbitals(); // shallow copy if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space gamma(world, num_states, num_orbitals); - // x functions // here I create the orbital products for elctron interaction terms vecfuncT phi_phi; vecfuncT x_phi; @@ -627,6 +646,10 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens X_space J(world, num_states, num_orbitals); X_space KX(world, num_states, num_orbitals); X_space KY(world, num_states, num_orbitals); + + std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; + world.mpi.Barrier(); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } @@ -1601,25 +1624,35 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct // Get sizes // Check sizes and then run the algorithm //size_t m = x.size(); - // auto xx = x.copy(); - // auto yy = y.copy(); - // auto phi0 = copy(world, orbitals); + // auto xx = x.copy(); + // auto yy = y.copy(); + // auto phi0 = copy(world, orbitals); //world.gop.fence(); //xx.truncate_rf(); - // yy.truncate_rf(); + // yy.truncate_rf(); //truncate(world, phi0); - std::vector densities = zero_functions(world, x.size()); + std::vector densities = zero_functions(world, x.size(), true); // Return container + auto compute_density = [&world, &orbitals](const auto& x_alpha,const auto &y_alpha) { + for (const auto &xij: x_alpha) { + print("xij !!", xij.max_depth()," ",(void*)xij.get_impl().get()); + } + auto dx = dot(world, x_alpha, orbitals, true); + for (const auto &yij: y_alpha) { + print("yij !!", yij.max_depth()," ",(void*)yij.get_impl().get()); + } + auto dy = dot(world, orbitals, y_alpha, true); + return dx + dy; + }; + + for (const auto &phi_i: orbitals) { + print("phi_i !!", phi_i.max_depth()," ",(void*)phi_i.get_impl().get()); + } std::transform(x.begin(), x.end(), y.begin(), densities.begin(), - [&world, &orbitals](auto x_alpha, auto y_alpha) { - auto dx = dot(world, x_alpha, orbitals); - world.gop.fence(); - auto dy = dot(world, orbitals, y_alpha); - return dx + dy; - }); + compute_density); world.gop.fence(); //truncate(world, densities, FunctionDefaults<3>::get_thresh(), true); return densities; @@ -1678,7 +1711,7 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu auto vf_copy = copy(world, vf, new_process_map, false); world.gop.fence();// then fence molresponse::end_timer(world, "Gamma Orbital Load Balance"); - return {X_copy, psi0_copy, vf_copy}; + return {X_copy.copy(), copy(world,psi0_copy), copy(world,vf_copy)}; } else { // return a copy with the same process map since we only have one world return {X.copy(), copy(world, psi0), copy(world, vf)}; From ced443704ae73bc08382b7864217511822b58b80 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 18:32:31 -0400 Subject: [PATCH 0688/1312] fence individual copy with pmap --- src/apps/molresponse/ResponseBase.cpp | 113 ++++++++++++-------------- src/apps/molresponse/ResponseBase.hpp | 4 +- 2 files changed, 55 insertions(+), 62 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index a5b801ade39..6cbf9ff8005 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -404,11 +404,11 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (calc_type == "full") { - gamma = compute_gamma_full(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); } else if (calc_type == "static") { - gamma = compute_gamma_static(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); @@ -434,7 +434,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit const XCOperator &xc) const -> X_space { std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); - auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); + auto [d_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); size_t num_states = d_alpha.num_states(); size_t num_orbitals = d_alpha.num_orbitals(); @@ -444,7 +444,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // copy old pmap truncate(world, phi0); - truncate(world, vf); d_alpha.truncate(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -520,11 +519,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit x = d_alpha.X[b]; y = d_alpha.Y[b]; // |x> - KX.X[b] = newK(x, phi0, vf); - KY.X[b] = newK(phi0, y, vf); + KX.X[b] = newK(x, phi0, phi0); + KY.X[b] = newK(phi0, y, phi0); // |y> - KY.Y[b] = newK(y, phi0, vf); - KX.Y[b] = newK(phi0, x, vf); + KY.Y[b] = newK(y, phi0, phi0); + KX.Y[b] = newK(phi0, x, phi0); // |i> } if (r_params.print_level() >= 1) { @@ -588,7 +587,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit d_alpha.clear(); phi0.clear(); - vf.clear(); if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! @@ -601,37 +599,38 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // Get sizes } -auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &density, +auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gammaOrbitals, const XCOperator &xc) const -> X_space { - // X contains the response vector that makes up the response density at a + // X contains the response vector that makes up the response gammaOrbitals at a // given order std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); - auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); + auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); - for (const auto &xi: d_alpha.X) { + + for (const auto &xi: xy.X) { for (const auto &xij: xi) { - print("xij", xij.max_depth()," ",(void*)xij.get_impl().get()); + print("xij", xij.max_depth(), " ", (void *) xij.get_impl().get()); } } - for (const auto &yi: d_alpha.Y) { + for (const auto &yi: xy.Y) { for (const auto &yij: yi) { - print("yij", yij.max_depth()," ",(void*)yij.get_impl().get()); + print("yij", yij.max_depth(), " ", (void *) yij.get_impl().get()); } } for (const auto &pi: phi0) { - print("orbitals", pi.max_depth()," ",(void*)pi.get_impl().get()); + print("orbitals", pi.max_depth(), " ", (void *) pi.get_impl().get()); } std::cout << "MPI After Load Balancing " << std::endl; world.mpi.Barrier(); - size_t num_states = d_alpha.num_states(); - size_t num_orbitals = d_alpha.num_orbitals(); + size_t num_states = xy.num_states(); + size_t num_orbitals = xy.num_orbitals(); // shallow copy if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -657,7 +656,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto rho = transition_density(world, phi0, d_alpha.X, d_alpha.X); + auto rho = transition_density(world, phi0, xy.X, xy.X); // Create Coulomb potential on ground_orbitals auto compute_jx = [&, &phi0 = phi0](auto rho_alpha) { @@ -679,7 +678,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens return mul(world, xc_rho, phi0); }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // for every transition density apply the exchange kernel and multiply the + // for every transition gammaOrbitals apply the exchange kernel and multiply the // vector of orbitals std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); W.Y = W.X.copy(); @@ -693,12 +692,12 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens for (size_t b = 0; b < num_states; b++) { vecfuncT x, y; - x = d_alpha.X[b]; - y = d_alpha.Y[b]; + x = xy.X[b]; + y = xy.Y[b]; // |x> - KX.X[b] = newK(x, phi0, vf); + KX.X[b] = newK(x, phi0, phi0); // |i> - KY.X[b] = newK(phi0, y, vf); + KY.X[b] = newK(phi0, y, phi0); // |y> } @@ -736,9 +735,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens KX.clear(); KY.clear(); W.clear(); - d_alpha.clear(); + xy.clear(); phi0.clear(); - vf.clear(); if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! @@ -758,7 +756,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &dens auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density, const XCOperator &xc) const -> X_space { - auto [d_alpha, phi0, vf] = orbital_load_balance(world, density, r_params.loadbalparts()); + auto [d_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); std::shared_ptr>> oldpmap = FunctionDefaults<3>::get_pmap(); size_t num_states = d_alpha.num_states(); size_t num_orbitals = d_alpha.num_orbitals(); @@ -813,7 +811,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density { vecfuncT x; x = d_alpha.X[b]; - k1_x[b] = newK(x, phi0, vf); + k1_x[b] = newK(x, phi0, phi0); } if (r_params.print_level() >= 1) @@ -855,7 +853,6 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density d_alpha.clear(); phi0.clear(); - vf.clear(); if (world.size() > 1) { FunctionDefaults<3>::set_pmap(oldpmap);// ! DON'T FORGET ! @@ -902,11 +899,11 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator // compute if (calc_type == "full") { - gamma = compute_gamma_full(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); } else if (calc_type == "static") { - gamma = compute_gamma_static(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); } if (r_params.print_level() >= 5) { print(""); @@ -961,11 +958,11 @@ auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, X_space gamma; // compute if (calc_type == "full") { - gamma = compute_gamma_full(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); } else if (calc_type == "static") { - gamma = compute_gamma_static(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals, ground_orbitals}, xc); + gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); } X_space Lambda_X(world, m, n);// = X_space(world, chi.num_states(), chi.num_orbitals()); @@ -1635,21 +1632,20 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct std::vector densities = zero_functions(world, x.size(), true); // Return container - auto compute_density = [&world, &orbitals](const auto& x_alpha,const auto &y_alpha) { - - for (const auto &xij: x_alpha) { - print("xij !!", xij.max_depth()," ",(void*)xij.get_impl().get()); + auto compute_density = [&world, &orbitals](const auto &x_alpha, const auto &y_alpha) { + for (const auto &xij: x_alpha) { + print("xij !!", xij.max_depth(), " ", (void *) xij.get_impl().get()); } auto dx = dot(world, x_alpha, orbitals, true); - for (const auto &yij: y_alpha) { - print("yij !!", yij.max_depth()," ",(void*)yij.get_impl().get()); - } + for (const auto &yij: y_alpha) { + print("yij !!", yij.max_depth(), " ", (void *) yij.get_impl().get()); + } auto dy = dot(world, orbitals, y_alpha, true); return dx + dy; }; for (const auto &phi_i: orbitals) { - print("phi_i !!", phi_i.max_depth()," ",(void*)phi_i.get_impl().get()); + print("phi_i !!", phi_i.max_depth(), " ", (void *) phi_i.get_impl().get()); } std::transform(x.begin(), x.end(), y.begin(), densities.begin(), compute_density); @@ -1667,13 +1663,12 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct * @param load_balance * @return */ -auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &input, +auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &gammaOrbitals, const double load_balance) -> gamma_orbitals { - auto X = std::get<0>(input); - auto psi0 = std::get<1>(input); - auto vf = std::get<2>(input); + auto X = std::get<0>(gammaOrbitals); + auto psi0 = std::get<1>(gammaOrbitals); size_t m = X.num_states(); size_t n = X.num_orbitals(); @@ -1681,11 +1676,10 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu if (world.size() > 1) { molresponse::start_timer(world); LoadBalanceDeux<3> lb(world); - for (unsigned int j = 0; j < n; ++j) { - lb.add_tree(psi0[j], lbcost(1.0, 8.0), false); - lb.add_tree(vf[j], lbcost(1.0, 8.0), false); - } + for (const auto &phi0_i: psi0) { + lb.add_tree(phi0_i, lbcost(1.0, 8.0), false); + } for (const auto &xi: X.X) { for (const auto &xij: xi) { lb.add_tree(xij, lbcost(1.0, 8.0), false); @@ -1698,7 +1692,7 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu } world.gop.fence(); // newpamap is the new pmap just based on the orbitals - std::shared_ptr>> new_process_map = + auto new_process_map = lb.load_balance(load_balance); // default process map // We set the new_process_map @@ -1706,15 +1700,14 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &inpu world.gop.fence(); // copy orbitals using new pmap - auto X_copy = X.copy(new_process_map, false); - auto psi0_copy = copy(world, psi0, new_process_map, false); - auto vf_copy = copy(world, vf, new_process_map, false); - world.gop.fence();// then fence + auto X_copy = X.copy(new_process_map, true); + auto psi0_copy = copy(world, psi0, new_process_map, true); + molresponse::end_timer(world, "Gamma Orbital Load Balance"); - return {X_copy.copy(), copy(world,psi0_copy), copy(world,vf_copy)}; + return {X_copy, psi0_copy}; } else { // return a copy with the same process map since we only have one world - return {X.copy(), copy(world, psi0), copy(world, vf)}; + return {X.copy(), copy(world, psi0)}; } } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 1cea35c9d66..adc8d9d83c2 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -48,7 +48,7 @@ struct residuals { }; -using gamma_orbitals = std::tuple; +using gamma_orbitals = std::tuple; class ResponseBase { public: @@ -385,7 +385,7 @@ class ResponseTester { static X_space compute_gamma_full(World &world, ResponseBase *p, double thresh) { XCOperator xc = p->make_xc_operator(world); X_space gamma = - p->compute_gamma_full(world, {p->Chi, p->ground_orbitals, p->ground_orbitals}, xc); + p->compute_gamma_full(world, {p->Chi, p->ground_orbitals}, xc); return gamma; } From a84d133ca0fff62af1c531900055e0171179c8ec Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 18:34:27 -0400 Subject: [PATCH 0689/1312] comment out debug printing and mpi barriers --- src/apps/molresponse/ResponseBase.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6cbf9ff8005..9cc4c3fac56 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -370,13 +370,13 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, print("------------compute theta x_________"); } } - std::cout << "MPI BARRIER 3 " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER 3 " << std::endl; + // world.mpi.Barrier(); bool compute_Y = calc_type == "full"; X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); - std::cout << "MPI BARRIER 4 " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER 4 " << std::endl; + // world.mpi.Barrier(); // compute if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_Y); @@ -610,6 +610,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); + /* for (const auto &xi: xy.X) { for (const auto &xij: xi) { @@ -625,9 +626,10 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm for (const auto &pi: phi0) { print("orbitals", pi.max_depth(), " ", (void *) pi.get_impl().get()); } + */ - std::cout << "MPI After Load Balancing " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI After Load Balancing " << std::endl; + // world.mpi.Barrier(); size_t num_states = xy.num_states(); size_t num_orbitals = xy.num_orbitals(); @@ -646,8 +648,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm X_space KX(world, num_states, num_orbitals); X_space KY(world, num_states, num_orbitals); - std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; + // world.mpi.Barrier(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); @@ -983,8 +985,9 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - std::cout << "MPI BARRIER V0X " << std::endl; - world.mpi.Barrier(); + + // // std::cout << "MPI BARRIER V0X " << std::endl; + // // world.mpi.Barrier(); // Start a timer size_t m = X.num_states(); size_t n = X.num_orbitals(); @@ -1091,8 +1094,8 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } - std::cout << "MPI BARRIER V0X END " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER V0X END " << std::endl; + // world.mpi.Barrier(); // Basic output // Done From 32073f55ac2f0590cf9e4adfb40561ff032479e0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Sep 2022 20:12:49 -0400 Subject: [PATCH 0690/1312] cleaning up --- src/apps/molresponse/FrequencyResponse.cpp | 18 +- src/apps/molresponse/ResponseBase.cpp | 7 +- .../molresponse/testing/full_excited_test.cpp | 4 +- .../testing/full_frequency_test.cpp | 6 +- .../molresponse/testing/full_ground_test.cpp | 4 +- src/apps/molresponse/testing/mad-excited.cpp | 4 +- src/apps/molresponse/testing/mad-freq.cpp | 16 +- src/apps/molresponse/testing/runners.hpp | 159 +++++++++++------- .../molresponse/testing/test_development.cpp | 4 +- 9 files changed, 136 insertions(+), 86 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d45a3692027..c65ded3c39d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -175,8 +175,8 @@ void FrequencyResponse::iterate(World &world) { } } - std::cout << "MPI BARRIER before update " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER before update " << std::endl; + // world.mpi.Barrier(); auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, x_vectors, x_residuals, iter, max_rotation); @@ -269,21 +269,21 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator size_t iteration, const double &maxrotn) -> std::tuple { - print("before start time ", r_params.print_level()); - std::cout << "MPI BARRIER 2 " << std::endl; - world.mpi.Barrier(); + // print("before start time ", r_params.print_level()); +// std::cout << "MPI BARRIER 2 " << std::endl; + // world.mpi.Barrier(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - std::cout << "MPI BARRIER 3 " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER 3 " << std::endl; + //world.mpi.Barrier(); size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); - std::cout << "MPI BARRIER After Theta X " << std::endl; - world.mpi.Barrier(); + // std::cout << "MPI BARRIER After Theta X " << std::endl; + // world.mpi.Barrier(); // compute residual X_space X_space new_chi = diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 9cc4c3fac56..6681b64560d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1636,20 +1636,25 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct // Return container auto compute_density = [&world, &orbitals](const auto &x_alpha, const auto &y_alpha) { + /* for (const auto &xij: x_alpha) { print("xij !!", xij.max_depth(), " ", (void *) xij.get_impl().get()); } + */ auto dx = dot(world, x_alpha, orbitals, true); + /* for (const auto &yij: y_alpha) { print("yij !!", yij.max_depth(), " ", (void *) yij.get_impl().get()); - } + }*/ auto dy = dot(world, orbitals, y_alpha, true); return dx + dy; }; + /* for (const auto &phi_i: orbitals) { print("phi_i !!", phi_i.max_depth(), " ", (void *) phi_i.get_impl().get()); } + */ std::transform(x.begin(), x.end(), y.begin(), densities.begin(), compute_density); world.gop.fence(); diff --git a/src/apps/molresponse/testing/full_excited_test.cpp b/src/apps/molresponse/testing/full_excited_test.cpp index 57c9167e24e..a86bab3b9df 100644 --- a/src/apps/molresponse/testing/full_excited_test.cpp +++ b/src/apps/molresponse/testing/full_excited_test.cpp @@ -47,7 +47,7 @@ int main(int argc, char *argv[]) { high_prec = false; } - auto schema = runSchema(xc); + auto schema = runSchema(<#initializer #>, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -64,7 +64,7 @@ int main(int argc, char *argv[]) { try { - auto m_schema = moldftSchema(molecule_name, xc, schema); + auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); moldft(world, m_schema, true, false, high_prec); auto excited_schema = excitedSchema(schema, m_schema); diff --git a/src/apps/molresponse/testing/full_frequency_test.cpp b/src/apps/molresponse/testing/full_frequency_test.cpp index 4d11b7aec3a..ef58bf0fe95 100644 --- a/src/apps/molresponse/testing/full_frequency_test.cpp +++ b/src/apps/molresponse/testing/full_frequency_test.cpp @@ -38,7 +38,7 @@ int main(int argc, char *argv[]) { high_prec = false; } - auto schema = runSchema(xc); + auto schema = runSchema(<#initializer #>, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -51,9 +51,9 @@ int main(int argc, char *argv[]) { auto molecule_name = mol_path.path().stem(); try { - auto m_schema = moldftSchema(molecule_name, xc, schema); + auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); moldft(world, m_schema, true, false, high_prec); - auto f_schema = frequencySchema(schema, m_schema, op); + auto f_schema = frequencySchema(<#initializer #>, schema, m_schema, op); runFrequencyTests(world, f_schema, high_prec); } catch (const SafeMPI::Exception &e) { diff --git a/src/apps/molresponse/testing/full_ground_test.cpp b/src/apps/molresponse/testing/full_ground_test.cpp index 5d4f2ca2da9..acf061d94f3 100644 --- a/src/apps/molresponse/testing/full_ground_test.cpp +++ b/src/apps/molresponse/testing/full_ground_test.cpp @@ -39,7 +39,7 @@ int main(int argc, char *argv[]) { startup(world, argc, argv); std::cout.precision(6); - auto schema = runSchema(xc); + auto schema = runSchema(<#initializer #>, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -53,7 +53,7 @@ int main(int argc, char *argv[]) { std::cout << "\n\n----------------------------------------------------\n"; std::cout << "Beginning Tests for Molecule: " << molecule_name << "\n"; try { - auto m_schema = moldftSchema(molecule_name, xc, schema); + auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); m_schema.print(); moldft(world, m_schema, true, true, 0); } catch (const SafeMPI::Exception &e) { diff --git a/src/apps/molresponse/testing/mad-excited.cpp b/src/apps/molresponse/testing/mad-excited.cpp index 9d717fad897..23c1eda8154 100644 --- a/src/apps/molresponse/testing/mad-excited.cpp +++ b/src/apps/molresponse/testing/mad-excited.cpp @@ -53,12 +53,12 @@ auto main(int argc, char *argv[]) -> int { high_prec = false; } - auto schema = runSchema(xc); + auto schema = runSchema(world, xc); auto mol_path = addPath(schema.molecule_path, molecule_name); try { - auto m_schema = moldftSchema(molecule_name, xc, schema); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); moldft(world, m_schema, false, true, high_prec); auto excited_schema = excitedSchema(schema, m_schema); excited_schema.print(); diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 89d6ea01f14..63a9a13843a 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -55,19 +55,19 @@ auto main(int argc, char *argv[]) -> int { } try { - auto schema = runSchema(xc); - auto m_schema = moldftSchema(molecule_name, xc, schema); - auto f_schema = frequencySchema(schema, m_schema, op); - try { - - moldft(world, m_schema, false, false, high_prec); + auto schema = runSchema(world, xc); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); + auto f_schema = frequencySchema(world, schema, m_schema, op); + if (std::filesystem::exists(m_schema.calc_info_json_path) && std::filesystem::exists(m_schema.moldft_restart)) { + // TODO set up to read calc_info json and check if its converged runFrequencyTests(world, f_schema, high_prec); - } catch (MadnessException &madnessException) { - print(madnessException); + } else { + moldft(world, m_schema, true, false, high_prec); runFrequencyTests(world, f_schema, high_prec); } + } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { std::cout << e << std::endl; } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 05df1cf0444..6240b6e80c9 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -46,17 +46,22 @@ struct runSchema { path dalton_excited_json;// path to dalton excited json ResponseDataBase rdb; - explicit runSchema(const std::string &xc) { + explicit runSchema(World &world, const std::string &xc) { root = std::filesystem::current_path();//="/"+molecule_name; molecule_path = root; molecule_path += "/molecules"; xc_path = addPath(root, "/" + xc); + world.gop.fence(); if (std::filesystem::exists(xc_path)) { - std::cout << "XC Directory Exists" << std::endl; + if (world.rank() == 0) { + std::cout << "XC Directory Exists" << std::endl; + } } else { - std::cout << "Creating XC directory" << std::endl; + if (world.rank() == 0) { + std::cout << "Creating XC directory" << std::endl; + } std::filesystem::create_directory(xc_path); } @@ -70,16 +75,24 @@ struct runSchema { if (std::filesystem::exists(freq_json)) { std::ifstream ifs(freq_json); - std::cout << "Trying to read frequency.json" << std::endl; json j_read; ifs >> j_read; - std::cout << "READ IT" << std::endl; rdb.set_data(j_read); + + if (world.rank() == 0) { + std::cout << "Trying to read frequency.json" << std::endl; + std::cout << "READ IT" << std::endl; + } + } else { - std::cout << "did not find frequency.json" << std::endl; + if (world.rank() == 0) { + std::cout << "did not find frequency.json" << std::endl; + } + } + if (world.rank() == 0) { + print(); } - print(); } void print() const { @@ -107,7 +120,7 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(const std::string &molecule_name, const std::string &m_xc, const runSchema &schema) + moldftSchema(World &world, const std::string &molecule_name, const std::string &m_xc, const runSchema &schema) : mol_name(molecule_name), xc(m_xc) { @@ -123,13 +136,18 @@ struct moldftSchema { // read results into json ifs >> moldft_json; // Here are the current answers... check to see if th - std::cout << "Here are the current answers for" << molecule_name - << " check to see if they need to be updated please!" << std::endl; - cout << moldft_path; + world.gop.fence(); + if (world.rank() == 0) { + std::cout << "Here are the current answers for" << molecule_name + << " check to see if they need to be updated please!" << std::endl; + cout << moldft_path; + } } else { - std::cout << " We do not have moldft answers so please run and save the " - "results in the molecule directory" - << std::endl; + if (world.rank() == 0) { + std::cout << " We do not have moldft answers so please run and save the " + "results in the molecule directory" + << std::endl; + } } if (std::filesystem::exists(moldft_restart) && @@ -137,12 +155,17 @@ struct moldftSchema { // if both exist, read the calc_info json std::ifstream ifs(calc_info_json_path); ifs >> calc_info_json; - std::cout << "time: " << calc_info_json["time"] << std::endl; - std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; - std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] - << std::endl; + world.gop.fence(); + if (world.rank() == 0) { + std::cout << "time: " << calc_info_json["time"] << std::endl; + std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; + std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] + << std::endl; + } + } + if (world.rank() == 0) { + print(); } - print(); } void print() const { @@ -165,14 +188,15 @@ struct frequencySchema { const path moldft_path; vector freq; - frequencySchema(const runSchema run_schema, const moldftSchema m_schema, - const std::string r_operator) + frequencySchema(World &world, const runSchema run_schema, const moldftSchema m_schema, const std::string r_operator) : mol_name(m_schema.mol_name), xc(m_schema.xc), op(r_operator), moldft_path(m_schema.moldft_path) { freq = run_schema.rdb.get_frequencies(mol_name, xc, op); - print_schema(); + if (world.rank() == 0) { + print_schema(); + } } void print_schema() { @@ -360,7 +384,6 @@ auto generate_response_frequency_run_path(const std::filesystem::path &moldft_pa auto run_path = moldft_path; run_path += "/"; run_path += std::filesystem::path(run_name); - std::cout << run_path << endl; return run_path; } @@ -377,9 +400,6 @@ auto tryMOLDFT(CalculationParameters &p1, CalculationParameters &p2) -> bool { auto proto1 = p1.get>("protocol"); auto proto2 = p1.get>("protocol"); - std::cout << *(proto2.end() - 1) << std::endl; - std::cout << *(proto1.end() - 1) << std::endl; - return *(proto1.end() - 1) != *(proto2.end() - 1); } @@ -415,13 +435,18 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo CalculationParameters param_calc; json calcInfo; + world.gop.fence(); if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { - std::cout << "Reading Calc Info JSON" << std::endl; + if (world.rank() == 0) { + std::cout << "Reading Calc Info JSON" << std::endl; + } std::ifstream ifs(moldftSchema.calc_info_json_path); ifs >> calcInfo; param_calc.from_json(calcInfo["parameters"]); - print(param1.print_to_string()); - print(param_calc.print_to_string()); + if (world.rank() == 0) { + print(param1.print_to_string()); + print(param_calc.print_to_string()); + } } //If the parameters are exactly equal do not run // If calc info doesn't exist the param_calc will definitely be different @@ -440,11 +465,13 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("restart", true); } world.gop.fence(); - - molresponse::write_test_input test_input(param1, "moldft.in", - moldftSchema.mol_path);// molecule HF + if (world.rank() == 0) { + molresponse::write_test_input test_input(param1, "moldft.in", + moldftSchema.mol_path);// molecule HF + } + world.gop.fence(); commandlineparser parser; - parser.set_keyval("input", test_input.filename()); + parser.set_keyval("input", "moldft.in"); world.gop.fence(); SCF calc(world, parser); calc.set_protocol<3>(world, 1e-4); @@ -453,8 +480,10 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo ME.value(calc.molecule.get_all_coords().flat());// ugh! ME.output_calc_info_schema(); } else { - print("Skipping Calculation and printing CALC INFO"); - std::cout << calcInfo; + if (world.rank() == 0) { + print("Skipping Calculation and printing CALC INFO"); + std::cout << calcInfo; + } } } @@ -541,47 +570,60 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: * @param frequency * @param moldft_path */ -static auto set_frequency_path_and_restart(ResponseParameters ¶meters, - const std::string &property, const double &frequency, - const std::string &xc, - const std::filesystem::path &moldft_path, - std::filesystem::path &restart_path, bool restart) +static auto set_frequency_path_and_restart(World &world, ResponseParameters ¶meters, const std::string &property, const double &frequency, const std::string &xc, const std::filesystem::path &moldft_path, std::filesystem::path &restart_path, bool restart) -> std::filesystem::path { - print("set_frequency_path_and_restart"); - print("restart path", restart_path); + if (world.rank() == 0) { + print("set_frequency_path_and_restart"); + print("restart path", restart_path); + } // change the logic create save path auto frequency_run_path = generate_response_frequency_run_path(moldft_path, property, frequency, xc); - print("frequency run path", frequency_run_path); + if (world.rank() == 0) { + print("frequency run path", frequency_run_path); + } // Crea if (std::filesystem::is_directory(frequency_run_path)) { - cout << "Response directory found " << std::endl; + if (world.rank() == 0) { + cout << "Response directory found " << std::endl; + } } else {// create the file std::filesystem::create_directory(frequency_run_path); - cout << "Creating response_path directory" << std::endl; + if (world.rank() == 0) { + cout << "Creating response_path directory" << std::endl; + } } + world.gop.fence(); std::filesystem::current_path(frequency_run_path); // Calling this function will make the current working directory the // frequency save path auto [save_path, save_string] = generate_frequency_save_path(frequency_run_path); - print("save string", save_string); + if (world.rank() == 0) { + + print("save string", save_string); + } parameters.set_user_defined_value("save", true); parameters.set_user_defined_value("save_file", save_string); + world.gop.fence(); // if restart and restartfile exists go ahead and set the restart file if (restart) { if (std::filesystem::exists(save_path)) { parameters.set_user_defined_value("restart", true); parameters.set_user_defined_value("restart_file", save_string); - print("found save directory... restarting from save_string ", save_string); + if (world.rank() == 0) { + print("found save directory... restarting from save_string ", save_string); + } } else if (std::filesystem::exists(restart_path)) { - print(" restart path", restart_path); + if (world.rank() == 0) { + print(" restart path", restart_path); + } parameters.set_user_defined_value("restart", true); auto split_restart_path = split(restart_path.replace_extension("").string(), '/'); @@ -589,10 +631,13 @@ static auto set_frequency_path_and_restart(ResponseParameters ¶meters, std::string restart_file_short = "../" + split_restart_path[split_restart_path.size() - 2] + "/" + split_restart_path[split_restart_path.size() - 1]; - print("relative restart path", restart_file_short); parameters.set_user_defined_value("restart_file", restart_file_short); - print("found restart directory... restarting from restart_path.string ", - restart_path.string()); + + if (world.rank() == 0) { + print("relative restart path", restart_file_short); + print("found restart directory... restarting from restart_path.string ", + restart_path.string()); + } } else { parameters.set_user_defined_value("restart", false); @@ -623,7 +668,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // Set the response parameters ResponseParameters r_params{}; set_frequency_response_parameters(r_params, property, xc, frequency, highPrecision); - auto save_path = set_frequency_path_and_restart(r_params, property, frequency, xc, moldft_path, + auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, moldft_path, restart_path, true); if (world.rank() == 0) { molresponse::write_response_input(r_params, filename); } @@ -809,18 +854,18 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, bool high_prec) { if (std::filesystem::is_directory(m_schema.moldft_path)) { - if(world.rank()==0){ + if (world.rank() == 0) { cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; } } else {// create the file std::filesystem::create_directory(m_schema.moldft_path); - if(world.rank()==0){ - cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" - << m_schema.moldft_path << ":\n"; + if (world.rank() == 0) { + cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" + << m_schema.moldft_path << ":\n"; } } std::filesystem::current_path(m_schema.moldft_path); - if(world.rank()==0) { + if (world.rank() == 0) { cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; } diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index 498052eb688..3c734f0e3e9 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -39,9 +39,9 @@ int main(int argc, char *argv[]) { // A calculation is defined by a molecule, functional, and operator // xc include (hf/lda) // operators include (excited-state) - auto schema = runSchema(xc); + auto schema = runSchema(<#initializer #>, xc); auto mol_path = addPath(schema.molecule_path, molecule_name); - auto m_schema = moldftSchema(molecule_name, xc, schema); + auto m_schema = moldftSchema(<#initializer#>, molecule_name, xc, schema); auto excited_schema = excitedSchema(schema, m_schema); excited_schema.print(); ResponseParameters r_params{}; From db662d40f4e8ba1c478511eb232361139e913ec8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 8 Sep 2022 09:39:37 -0400 Subject: [PATCH 0691/1312] Fix the stalling --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index c65ded3c39d..dbef82d1901 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -257,8 +257,8 @@ void FrequencyResponse::iterate(World &world) { print(bsh_residualsY); print(" Final density residuals:"); print(density_residuals); - compute_and_print_polarizability(world, Chi, PQ, "Converged"); } + compute_and_print_polarizability(world, Chi, PQ, "Converged"); } auto FrequencyResponse::update(World &world, X_space &chi, XCOperator &xc, diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 6240b6e80c9..03bf3a91cc3 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -687,6 +687,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, rhs_generator = nuclear_generator; } FrequencyResponse calc(world, calc_params, frequency, rhs_generator); + world.gop.fence(); if (world.rank() == 0) { print("\n\n"); print(" MADNESS Time-Dependent Density Functional Theory Response " @@ -699,8 +700,11 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // put the response parameters in a j_molrespone json object calc_params.response_parameters.to_json(calc.j_molresponse); } + world.gop.fence(); // set protocol to the first calc.solve(world); + world.gop.fence(); + // set protocol to the first calc.time_data.to_json(calc.j_molresponse); calc.time_data.print_data(); calc.output_json(); From 6bdc04c4f1f8bebf303a14f5034962076333145b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Sep 2022 14:41:18 -0400 Subject: [PATCH 0692/1312] fixing up with new changes to runner --- src/apps/molresponse/testing/full_excited_test.cpp | 4 ++-- src/apps/molresponse/testing/full_frequency_test.cpp | 6 +++--- src/apps/molresponse/testing/full_ground_test.cpp | 4 ++-- src/apps/molresponse/testing/test_development.cpp | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/testing/full_excited_test.cpp b/src/apps/molresponse/testing/full_excited_test.cpp index a86bab3b9df..34a0e45860a 100644 --- a/src/apps/molresponse/testing/full_excited_test.cpp +++ b/src/apps/molresponse/testing/full_excited_test.cpp @@ -47,7 +47,7 @@ int main(int argc, char *argv[]) { high_prec = false; } - auto schema = runSchema(<#initializer #>, xc); + auto schema = runSchema(world, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -64,7 +64,7 @@ int main(int argc, char *argv[]) { try { - auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); moldft(world, m_schema, true, false, high_prec); auto excited_schema = excitedSchema(schema, m_schema); diff --git a/src/apps/molresponse/testing/full_frequency_test.cpp b/src/apps/molresponse/testing/full_frequency_test.cpp index ef58bf0fe95..f389acd0a91 100644 --- a/src/apps/molresponse/testing/full_frequency_test.cpp +++ b/src/apps/molresponse/testing/full_frequency_test.cpp @@ -38,7 +38,7 @@ int main(int argc, char *argv[]) { high_prec = false; } - auto schema = runSchema(<#initializer #>, xc); + auto schema = runSchema(world, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -51,9 +51,9 @@ int main(int argc, char *argv[]) { auto molecule_name = mol_path.path().stem(); try { - auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); moldft(world, m_schema, true, false, high_prec); - auto f_schema = frequencySchema(<#initializer #>, schema, m_schema, op); + auto f_schema = frequencySchema(world, schema, m_schema, op); runFrequencyTests(world, f_schema, high_prec); } catch (const SafeMPI::Exception &e) { diff --git a/src/apps/molresponse/testing/full_ground_test.cpp b/src/apps/molresponse/testing/full_ground_test.cpp index acf061d94f3..deeef50fea0 100644 --- a/src/apps/molresponse/testing/full_ground_test.cpp +++ b/src/apps/molresponse/testing/full_ground_test.cpp @@ -39,7 +39,7 @@ int main(int argc, char *argv[]) { startup(world, argc, argv); std::cout.precision(6); - auto schema = runSchema(<#initializer #>, xc); + auto schema = runSchema(world, xc); try { if (std::filesystem::is_directory(schema.molecule_path)) { @@ -53,7 +53,7 @@ int main(int argc, char *argv[]) { std::cout << "\n\n----------------------------------------------------\n"; std::cout << "Beginning Tests for Molecule: " << molecule_name << "\n"; try { - auto m_schema = moldftSchema(<#initializer #>, molecule_name, xc, schema); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); m_schema.print(); moldft(world, m_schema, true, true, 0); } catch (const SafeMPI::Exception &e) { diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index 3c734f0e3e9..bc1582f67f7 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -39,9 +39,9 @@ int main(int argc, char *argv[]) { // A calculation is defined by a molecule, functional, and operator // xc include (hf/lda) // operators include (excited-state) - auto schema = runSchema(<#initializer #>, xc); + auto schema = runSchema(world, xc); auto mol_path = addPath(schema.molecule_path, molecule_name); - auto m_schema = moldftSchema(<#initializer#>, molecule_name, xc, schema); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); auto excited_schema = excitedSchema(schema, m_schema); excited_schema.print(); ResponseParameters r_params{}; From b5286c9114722073fca7e35205f5052fe48a296a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Sep 2022 16:54:41 -0400 Subject: [PATCH 0693/1312] generate frequencies based on cc-pVDZ results --- .../testing/response_data_base.hpp | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp index 896694e05e3..3fd59e1d239 100644 --- a/src/apps/molresponse/testing/response_data_base.hpp +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -106,8 +106,7 @@ class ResponseDataBase { } }; -auto generate_dipole_frequencies(std::string molecule_name, std::string xc, - std::string op) -> vector { +auto generate_dipole_frequencies(const std::string &molecule_name, std::string xc) -> vector { if (std::filesystem::exists("molecules/dalton-excited.json")) { std::ifstream ifs("molecules/dalton-excited.json"); @@ -115,13 +114,13 @@ auto generate_dipole_frequencies(std::string molecule_name, std::string xc, json dalton_excited; ifs >> dalton_excited; - ::print("Read Dalton Excited"); - ::print(dalton_excited); + ::print("Read Dalton Excited for ", molecule_name); + ::print(dalton_excited[molecule_name][xc]["excited-state"]["cc-pVTZ"]["response"]["freq"]); std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] - ["aug-cc-pVTZ"]["response"]["freq"]; + ["cc-pVTZ"]["response"]["freq"]; auto omega_max = freq.at(0); omega_max = omega_max / 2.0; - ::print(omega_max); + ::print("max frequency at cc-pVTZ", omega_max); std::vector omegas = {}; int Nsteps = 9; @@ -130,8 +129,11 @@ auto generate_dipole_frequencies(std::string molecule_name, std::string xc, } catch (const json::out_of_range &e) { std::cout << e.what() << std::endl; - return std::vector(0); + return std::vector(1,0); // The molecule file exists in the database therefore it is okay to add to frequency.json + } catch (const json::type_error &e) { + std::cout << e.what() << std::endl; + return std::vector(1,0); } } else { @@ -147,10 +149,10 @@ json generate_response_data(const std::filesystem::path &molecule_path, const st if (mol_path.path().extension() == ".mol") { auto molecule_name = mol_path.path().stem(); data[molecule_name][xc][property] = - generate_dipole_frequencies(molecule_name, xc, property); + generate_dipole_frequencies(molecule_name, xc); } } - std::cout << data << endl; + //std::cout << data << endl; return data; } From 3dd6ac8fddd7243bd9b422ee79b0d022114b34c8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 08:20:07 -0400 Subject: [PATCH 0694/1312] some added fences in compute gamma --- src/apps/molresponse/ResponseBase.cpp | 26 ++++++++++++++++-------- src/apps/molresponse/testing/runners.hpp | 2 +- src/apps/molresponse/x_space.cc | 1 + 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6681b64560d..c6ed8e4b742 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -486,6 +486,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // compute j_x = op(rho_x)*phi0 std::transform(d_alpha.X.begin(), d_alpha.X.end(), j_x.begin(), compute_j); // compute j_y = op(rho_y)*phi0 + std::transform(d_alpha.Y.begin(), d_alpha.Y.end(), j_y.begin(), compute_j); J.X = j_x + j_y; @@ -526,6 +527,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit KX.Y[b] = newK(phi0, x, phi0); // |i> } + world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -556,6 +558,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit gamma.X[i] = projector(gamma.X[i]); gamma.Y[i] = projector(gamma.Y[i]); } + world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); @@ -563,13 +566,18 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); - print_inner(world, "xJx", d_alpha, J); - print_inner(world, "xKXx", d_alpha, KX); - print_inner(world, "xKYx", d_alpha, KY); + if (world.rank() == 0) { + print_inner(world, "xJx", d_alpha, J); + print_inner(world, "xKXx", d_alpha, KX); + print_inner(world, "xKYx", d_alpha, KY); + } X_space K = KX + KY; - print_inner(world, "xKx", d_alpha, KX); - print_inner(world, "xWx", d_alpha, W); - print_inner(world, "xGammax", d_alpha, gamma); + world.gop.fence(); + if (world.rank() == 0) { + print_inner(world, "xKx", d_alpha, KX); + print_inner(world, "xWx", d_alpha, W); + print_inner(world, "xGammax", d_alpha, gamma); + } molresponse::end_timer(world, "Print Expectation Creating Gamma:"); } // put @@ -2156,7 +2164,7 @@ void response_timing::add_data(std::map> void response_timing::to_json(json &j) { - ::print("FREQUENCY TIME DATA TO JSON"); + //::print("FREQUENCY TIME DATA TO JSON"); j["time_data"] = json(); j["time_data"]["iterations"] = iter; @@ -2164,9 +2172,9 @@ void response_timing::to_json(json &j) { j["time_data"]["wall_time"] = json(); for (const auto &e: wall_time_data) { - j["time_data"]["wall_time"][e.first].push_back(e.second); + j["time_data"]["wall_time"][e.first] = e.second; } j["time_data"]["cpu_time"] = json(); - for (const auto &e: cpu_time_data) { j["time_data"]["cpu_time"][e.first].push_back(e.second); } + for (const auto &e: cpu_time_data) { j["time_data"]["cpu_time"][e.first] = e.second; } } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 03bf3a91cc3..b0a2b94a363 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -706,7 +706,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, world.gop.fence(); // set protocol to the first calc.time_data.to_json(calc.j_molresponse); - calc.time_data.print_data(); + //calc.time_data.print_data(); calc.output_json(); return {save_path, calc.j_molresponse["converged"]}; } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 4707fa5101e..0b29c130131 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -16,6 +16,7 @@ namespace madness { [&](const auto& yi) { mi.push_back(copy(yi)); }); b++; } + world.gop.fence(); return mX; } From e5b30b0f2816eb6cf82cc13ccfb67d71bef4243a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 08:24:07 -0400 Subject: [PATCH 0695/1312] only world 0 prints to the json file --- src/apps/molresponse/molresponse.cc | 7 +++++-- src/apps/molresponse/testing/runners.hpp | 6 ++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/molresponse.cc b/src/apps/molresponse/molresponse.cc index bb7133130c6..17db081366a 100644 --- a/src/apps/molresponse/molresponse.cc +++ b/src/apps/molresponse/molresponse.cc @@ -48,7 +48,7 @@ #include static inline int file_exists(const char *inpname) { - struct stat buffer{}; + struct stat buffer {}; size_t rc = stat(inpname, &buffer); return (rc == 0); } @@ -112,7 +112,10 @@ int main(int argc, char **argv) { calc_params.response_parameters.to_json(calc.j_molresponse); // set protocol to the first calc.solve(world); - calc.output_json(); + world.gop.fence(); + if (world.rank() == 0) { + calc.output_json(); + } } else { if (world.rank() == 0) { print("Response not implemented"); } } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index b0a2b94a363..8f7bc1ce788 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -705,9 +705,11 @@ auto RunResponse(World &world, const std::string &filename, double frequency, calc.solve(world); world.gop.fence(); // set protocol to the first - calc.time_data.to_json(calc.j_molresponse); + if(world.rank()==0){ + //calc.time_data.to_json(calc.j_molresponse); + calc.output_json(); + } //calc.time_data.print_data(); - calc.output_json(); return {save_path, calc.j_molresponse["converged"]}; } From 55a37ff85c9c7e06a2d9bbab367025ff0f0f0dcf Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:22:25 -0400 Subject: [PATCH 0696/1312] remove deprecated files --- src/apps/molresponse/CMakeLists.txt | 6 - src/apps/molresponse/Lambda_X.cc | 85 - src/apps/molresponse/TDDFT.cc | 3526 ----------------------- src/apps/molresponse/TDDFT.h | 740 ----- src/apps/molresponse/Theta_X.cc | 103 - src/apps/molresponse/basic_operators.cc | 165 +- src/apps/molresponse/density.cc | 65 - src/apps/molresponse/density.h | 86 - src/apps/molresponse/densityVector.cpp | 542 ---- src/apps/molresponse/densityVector.hpp | 80 - src/apps/molresponse/iter_freq2.cc | 243 -- src/apps/molresponse/iterate_excited.cc | 476 --- src/apps/molresponse/iterate_freq.cc | 302 -- src/apps/molresponse/iterate_gamma.cc | 572 ---- src/apps/molresponse/load_balance.h | 5 - src/apps/molresponse/timer.cc | 25 +- src/apps/molresponse/timer.h | 7 +- 17 files changed, 100 insertions(+), 6928 deletions(-) delete mode 100644 src/apps/molresponse/Lambda_X.cc delete mode 100644 src/apps/molresponse/TDDFT.cc delete mode 100644 src/apps/molresponse/TDDFT.h delete mode 100644 src/apps/molresponse/Theta_X.cc delete mode 100644 src/apps/molresponse/density.cc delete mode 100644 src/apps/molresponse/density.h delete mode 100644 src/apps/molresponse/densityVector.cpp delete mode 100644 src/apps/molresponse/densityVector.hpp delete mode 100644 src/apps/molresponse/iter_freq2.cc delete mode 100644 src/apps/molresponse/iterate_excited.cc delete mode 100644 src/apps/molresponse/iterate_freq.cc delete mode 100644 src/apps/molresponse/iterate_gamma.cc delete mode 100644 src/apps/molresponse/load_balance.h diff --git a/src/apps/molresponse/CMakeLists.txt b/src/apps/molresponse/CMakeLists.txt index c58ab0a5ea6..95acb3f2d4b 100644 --- a/src/apps/molresponse/CMakeLists.txt +++ b/src/apps/molresponse/CMakeLists.txt @@ -18,7 +18,6 @@ set(MOLRESPONSE_HEADERS ResponseBase.hpp ExcitedResponse.hpp FrequencyResponse.hpp - density.h property.h x_space.h global_functions.h @@ -51,7 +50,6 @@ set(R_BASE_HEADERS ResponseBase.hpp ExcitedResponse.hpp FrequencyResponse.hpp - density.h property.h global_functions.h x_space.h @@ -75,10 +73,6 @@ set(RALL_SOURCES basic_operators.cc Plot_VTK.cc response_parameters.cpp - calc_runner.cc - iterate_excited.cc - Lambda_X.cc - Theta_X.cc x_space.cc ) diff --git a/src/apps/molresponse/Lambda_X.cc b/src/apps/molresponse/Lambda_X.cc deleted file mode 100644 index bec73cc4839..00000000000 --- a/src/apps/molresponse/Lambda_X.cc +++ /dev/null @@ -1,85 +0,0 @@ - -#include -#include -#include // The kain solver -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../chem/SCFOperators.h" -#include "../chem/molecule.h" -#include "../chem/xcfunctional.h" -#include "molresponse/TDDFT.h" -#include "molresponse/x_space.h" - -X_space TDDFT::Compute_Lambda_X(World& world, - X_space& Chi, - XCOperator xc, - std::string calc_type) { - // compute - - bool compute_Y = calc_type.compare("full") == 0; - - X_space Lambda_X; // = X_space(world, Chi.num_states(), Chi.num_orbitals()); - X_space F0X = compute_F0X(world, Chi, xc, compute_Y); - X_space Chi_truncated = Chi.copy(); - Chi_truncated.truncate(); - if (r_params.print_level() >= 20) { - print("---------------Lambda ----------------"); - print(""); - print(inner(Chi_truncated, F0X)); - } - // put it all together - - X_space E0X = Chi_truncated.copy(); - E0X.truncate(); - E0X.X = E0X.X * hamiltonian; - - if (compute_Y) { - E0X.Y = E0X.Y * hamiltonian; - } - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi_truncated, E0X)); - } - - // put it all together - X_space gamma; - - // compute - if (calc_type.compare("full") == 0) { - gamma = compute_gamma_full(world, Chi, xc); - } else if (calc_type.compare("static") == 0) { - gamma = compute_gamma_static(world, Chi, xc); - } else { - gamma = compute_gamma_tda(world, Chi, xc); - } - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi_truncated, gamma)); - } - - Lambda_X = (F0X - E0X) + gamma; - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi_truncated, Lambda_X)); - } - Lambda_X.truncate(); - - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi_truncated, Lambda_X)); - } - - return Lambda_X; -} diff --git a/src/apps/molresponse/TDDFT.cc b/src/apps/molresponse/TDDFT.cc deleted file mode 100644 index 4176af9840e..00000000000 --- a/src/apps/molresponse/TDDFT.cc +++ /dev/null @@ -1,3526 +0,0 @@ -/* - * Copyright 2021 Adrian Hurtado - * - * - - * - * Written by: bsundahl and molresponse - * Date: A long time ago... and today - * - */ - -#include "TDDFT.h" - -#include -#include // For easy calculation of (1 - \hat{\rho}^0) -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -using namespace madchem; - -// The TDDFT constructor initializes the preliminary calculation details including -// the Chi vectors and the PQ vectors if they are required -// ground orbitals -// molecule -// We also intialize the molresponse.json file -TDDFT::TDDFT(World &world, density_vector &rho) - : r_params(rho.r_params), - g_params(rho.g_params), - molecule(rho.molecule), - omega(rho.omega), - rho(rho) { - // Start the timer - Chi = rho.Chi; - PQ = rho.PQ; - xcf.initialize(r_params.xc(), !r_params.spinrestricted(), world, r_params.print_level() >= 10); - // - r_params.to_json(j_molresponse); - - ground_orbitals = g_params.orbitals(); - ground_energies = g_params.get_energies(); - - molresponse::start_timer(world); - - // Broadcast to all other nodes - world.gop.broadcast_serializable(r_params, 0); - world.gop.broadcast_serializable(molecule, 0); - - // Read in archive - // Create the projector Qhat to be used in any calculation - - // Set some function defaults - FunctionDefaults<3>::set_cubic_cell(-r_params.L(), r_params.L()); - FunctionDefaults<3>::set_truncate_mode(1); - FunctionDefaults<3>::set_truncate_on_project(true); - - // Create the masking function - mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); - - if (world.size() > 1) { - // Start a timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - if (world.rank() == 0) print("");// Makes it more legible - - LoadBalanceDeux<3> lb(world); - for (unsigned int j = 0; j < r_params.num_orbitals(); j++) { - lb.add_tree(ground_orbitals[j], lbcost(1.0, 8.0), true); - } - FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); - - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Load balancing:"); - } -} - - -// Save the current response calculation -void TDDFT::save(World &world, const std::string &name) { - // Archive to write everything to - archive::ParallelOutputArchive ar(world, name.c_str(), 1); - // Just going to enforce 1 io server - - // Saving, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω - - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; - if (not r_params.tda()) { - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; - } -} - -// Load a response calculation -void TDDFT::load(World &world, const std::string &name) { - // The archive to read from - archive::ParallelInputArchive ar(world, name.c_str()); - - // Reading in, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) - - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω - - Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); - - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; - world.gop.fence(); - - if (not r_params.tda()) { - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; - world.gop.fence(); - } -} - -void TDDFT::initial_load_bal(World &world) { - LoadBalanceDeux<3> lb(world); - real_function_3d vnuc; - vnuc = potential_manager->vnuclear(); - lb.add_tree(vnuc, lbcost(r_params.vnucextra() * 1.0, r_params.vnucextra() * 8.0)); - FunctionDefaults<3>::redistribute(world, lb.load_balance(r_params.loadbalparts())); -} - -void TDDFT::load_balance(World &world, vecfuncT rho_omega, X_space Chi, const X_space &Chi_old) { - molresponse::start_timer(world); - if (world.size() == 1) return; - - LoadBalanceDeux<3> lb(world); - real_function_3d v_nuclear; - v_nuclear = potential_manager->vnuclear(); - lb.add_tree(v_nuclear, - lbcost(r_params.vnucextra() * 1.0, r_params.vnucextra() * 8.0), false); - for (size_t i = 0; i < Chi.X.size(); ++i) { - lb.add_tree(rho_omega[i], lbcost(1.0, 8.0), false); - } - for (size_t i = 0; i < Chi.X.size(); ++i) { - for (size_t j = 0; j < Chi.X.size_orbitals(); ++j) { - lb.add_tree(Chi.X[i][j], lbcost(1.0, 8.0), false); - } - } - if (r_params.omega() != 0) { - for (size_t i = 0; i < Chi.X.size(); ++i) { - for (size_t j = 0; j < Chi.X.size_orbitals(); ++j) { - lb.add_tree(Chi.Y[i][j], lbcost(1.0, 8.0), false); - } - } - } - - world.gop.fence(); - - FunctionDefaults<3>::redistribute( - world, - lb.load_balance(r_params.loadbalparts()));// 6.0 needs retuning after - - world.gop.fence(); - molresponse::end_timer(world, "Load balancing"); - print_meminfo(world.rank(), "Load balancing"); -} - -// compute pmap based on ground and first order orbitals -// set default pmap to new pmap -// make orbital copies using new pmap -void TDDFT::orbital_load_balance(World &world, vecfuncT &psi0, vecfuncT &psi0_copy, X_space &Chi, - X_space &Chi_copy) { - size_t m = r_params.num_states(); - size_t n = r_params.num_orbitals(); - - if (world.size() > 1) { - molresponse::start_timer(world); - LoadBalanceDeux<3> lb(world); - for (unsigned int i = 0; i < m; ++i) { - lb.add_tree(psi0[i], lbcost(1.0, 8.0), false); - for (unsigned int j = 0; j < n; ++j) { - // add a tree for orbitals - lb.add_tree(Chi.X[i][j], lbcost(1.0, 8.0), false); - lb.add_tree(Chi.Y[i][j], lbcost(1.0, 8.0), false); - } - } - - world.gop.fence(); - - // newpamap is the new pmap just based on the orbitals - std::shared_ptr>> new_process_map = - lb.load_balance(r_params.loadbalparts()); - molresponse::end_timer(world, "Gamma compute load_balance_chi"); - // default process map - // We set the new_process_map - molresponse::start_timer(world); - FunctionDefaults<3>::set_pmap(new_process_map);// set default to be new - - world.gop.fence(); - // copy orbitals using new pmap - Chi_copy = Chi.copy(new_process_map, false); - world.gop.fence();// then fence - - psi0_copy = copy(world, ground_orbitals, new_process_map, false); - world.gop.fence();// then fence - molresponse::end_timer(world, "Gamma redist"); - } -} - -// (Each state's norm should be 1, not the -// individual functions norms) -void TDDFT::normalize(World &world, response_space &f) { - // Run over rows - for (unsigned int i = 0; i < f.size(); i++) { - // Get the normalization constant - // (Sum included inside inner) - double norm = inner(f[i], f[i]); - norm = sqrt(norm); - // Doing this to deal with zero functions. - // Maybe not smrt. - if (norm == 0) continue; - - // And scale - f[i] = f[i] * (1.0 / norm); - } -} - -// (Each state's norm should be 1, not the -// individual functions norms) -// non-standard normalization for eigen value problem -void TDDFT::normalize(World &world, response_space &f, response_space &g) { - // Run over rows - for (size_t i = 0; i < f.size(); i++) { - // Get the normalization constant - // (Sum included inside inner) - double normf = inner(f[i], f[i]); - double normg = inner(g[i], g[i]); - double norm = sqrt(normf - normg); - - // Doing this to deal with zero functions. - // Maybe not smrt. - if (norm == 0) continue; - // And scale - scale(world, f[i], (1.0 / norm)); - scale(world, g[i], (1.0 / norm)); - } -} - -void TDDFT::normalize(World &world, X_space &chi) { - // Run over rows - for (size_t i = 0; i < chi.num_states(); i++) { - // Get the normalization constant - // (Sum included inside inner) - double normf = inner(chi.X[i], chi.X[i]); - double normg = inner(chi.Y[i], chi.Y[i]); - double norm = sqrt(normf - normg); - // Doing this to deal with zero functions. - // Maybe not smrt. - if (norm == 0) continue; - chi.X[i] = chi.X[i] * (1.0 / norm); - chi.Y[i] = chi.Y[i] * (1.0 / norm); - } -} - -// Prints norms of the given vector of vector of functions -void TDDFT::print_norms(World &world, response_space f) { - // Container - Tensor norms(f.size(), f[0].size()); - - // Calc the norms - for (unsigned int i = 0; i < f.size(); i++) { - for (unsigned int j = 0; j < f[0].size(); j++) { norms(i, j) = f[i][j].norm2(); } - } - - // Print em in a smart way - if (world.rank() == 0) print(norms); -} - -// Small function to print geometry of a molecule nicely - -// Radial function -static double kronecker(size_t l, size_t n) { - if (l == n) return 1.0; - return 0.0; -} - -// Returns a list of solid harmonics such that: -// solid_harm.size() * num_ground_orbs > 2 * num. resp. components -std::map, real_function_3d> TDDFT::solid_harmonics(World &world, int n) { - // Container to return - std::map, real_function_3d> result; - - // Create the basic x, y, z, constant and zero - real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - real_function_3d c = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); - real_function_3d zero = real_factory_3d(world); - - // Add in first few, since they're simple - // Assuming n >= 1 - result[std::vector{0, 0}] = copy(c); - result[std::vector{0, -1}] = zero; - result[std::vector{0, 1}] = zero; - result[std::vector{-1, 0}] = zero; - - // Generate the solid harmonics recursively from here - for (int l = 0; l < n; l++) { - // Calculate ends of this row first - result[std::vector{l + 1, l + 1}] = - sqrt(pow(2, kronecker(l, 0) * (2 * l) / (2 * l + 1))) * - (x * result[std::vector{l, l}] - - (1 - kronecker(l, 0) * y * result[std::vector{l, -l}])); - result[std::vector{l + 1, -l - 1}] = - sqrt(pow(2, kronecker(l, 0) * (2 * l) / (2 * l + 1))) * - (y * result[std::vector{l, l}] + - (1 - kronecker(l, 0) * x * result[std::vector{l, -l}])); - - // Formula below calls for some functions that don't exist. - // Need zeroes where that would occur - result[std::vector{l + 1, l + 2}] = zero; - result[std::vector{l + 1, -l - 2}] = zero; - - // Run over quantum number m - for (int m = -l; m < l + 1; m++) { - // Calculate remaining terms - result[std::vector{l + 1, m}] = - 1.0 / std::sqrt((l + m + 1) * (l - m + 1)) * - ((2 * l + 1) * z * result[std::vector{l, m}] - - sqrt((l + m) * (l - m)) * (x * x + y * y + z * z) * - result[std::vector{l - 1, m}]); - } - } - - // Get rid of any zero functions we added - for (auto it = result.begin(); it != result.end();) { - if (it->second.norm2() == 0) it = result.erase(it); - else - ++it; - } - - // Also get rid of the constant - result.erase(std::vector{0, 0}); - - // Done - return result; -} - -// Returns a list of solid harmonics such that: -// solid_harm.size() * num_ground_orbs > 2 * num. resp. components -std::map, real_function_3d> TDDFT::simple_spherical_harmonics(World &world, - int n) { - // Container to return - std::map, real_function_3d> result; - - // Create the basic x, y, z, constant and zero - real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - real_function_3d c = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); - real_function_3d zero = real_factory_3d(world); - - real_function_3d rfunc = (x * x + y * y + z * z); - double r = rfunc.norm2(); - - std::vector funcs; - funcs[0] = c; - - funcs[1] = y.scale(1 / r); - funcs[2] = z.scale(1 / r); - funcs[3] = x.scale(1 / r); - - funcs[4] = x * y; - funcs[5] = y * z; - funcs[6] = 2 * z * z - x * x - y * y; - funcs[7] = z * x; - funcs[8] = x * x - y * y; - - funcs[4] = funcs[4].scale(1 / (r * r)); - funcs[5] = funcs[5].scale(1 / (r * r)); - funcs[6] = funcs[6].scale(1 / (r * r)); - funcs[7] = funcs[7].scale(1 / (r * r)); - funcs[8] = funcs[8].scale(1 / (r * r)); - - size_t num = 0; - for (int l = 0; l < n; l++) { - for (int m = -l; m <= l; m++) { - result[vector{l, m}] = funcs[num]; - num += 1; - } - } - - // Done - return result; -} - -// Returns initial guess functions as -// ground MO * solid harmonics -X_space TDDFT::create_trial_functions(World &world, size_t k, - std::vector &orbitals, size_t print_level) { - // Get size - print("In create trial functions"); - size_t n = orbitals.size(); - - // Create solid harmonics such that num. solids * num. orbitals > k. - // The total number of solid harmonics that exist up to level n is - // (n+1)^2 (because we count from zero) - // Always do at least 8 (through the d orbital angular momentum functions, - // minus ) - std::map, real_function_3d> solids = - solid_harmonics(world, std::max(2.0, ceil(sqrt(k / n) - 1))); - - // Useful info. - if (world.rank() == 0) print(" Created", solids.size(), "solid harmonics.\n"); - - // Container to return - response_space trials_X; - - // Counter for number of trials created - size_t count = 0; - - // Multiply each solid harmonic onto a ground state orbital - for (size_t i = 0; i < n; i++) { - // For each solid harmonic - for (const auto &key: solids) { - // Temp zero functions - std::vector temp = - zero_functions_compressed(world, static_cast(n)); - - // Create one non-zero function and add to trials - temp[count % n] = key.second * orbitals[n - count % n - 1]; - trials_X.push_back(temp); - count++; - } - - // Stop when we first get beyond k components - if (count >= k) break; - } - - // Debugging output - if (print_level >= 2) { - if (world.rank() == 0) print(" Norms of guess functions:"); - print_norms(world, trials_X); - } - - // Truncate - madness::truncate(world, trials_X, madness::FunctionDefaults<3>::get_thresh(), true); - - X_space trials(world, count, n); - trials.X = trials_X.copy(); - trials_X.clear(); - - // Done - return trials; -} - -// Returns initial guess functions as -// ground MO * -X_space TDDFT::create_trial_functions2(World &world, std::vector &orbitals, - size_t print_level) { - // Get size - size_t n = orbitals.size(); - size_t directions = 3; - // (n+1)^2 (because we count from zero) - // adsf - // - std::vector xyz = createDipoleFunctionMap(world); - // create 3 x n orbital functions - std::vector> functions; - - print("Debug Norms", xyz[0].norm2()); - print("Debug Norms", xyz[1].norm2()); - print("Debug Norms", xyz[2].norm2()); - - for (size_t d = 0; d < directions; d++) { - vector temp; - for (size_t i = 0; i < n; i++) { - // create x functions then y.. then z .. - temp.push_back(orbitals[i] * xyz[d]); - print("Debug Norms of temp ", i, "=", temp[i].norm2()); - print("Debug Norms of orbitals ", i, "=", orbitals[i].norm2()); - } - // all the x then the y then the z - functions.push_back(temp); - } - print("number of orbitals: ", orbitals.size()); - - // Container to return - size_t count = 0; - - X_space trials(world, 3 * n * n, n); - for (size_t i = 0; i < n; i++) { - for (size_t d = 0; d < directions; d++) { - for (size_t o = 0; o < n; o++) { - // trials[i + j + o][o] = functions[i][j]; - trials.X[count][o] = copy(functions.at(d).at(o)); - count++; - } - } - } - // The above generates response function as follows - // all functions start off as zeros - // 1 [x1 0 0 ] - // 2 [0 x1 0 ] - // 3 [0 0 x1 ] - // 4 [y1 0 0 ] - // 5 [0 y1 0 ] - // 6 [0 0 y1 ] - // 7 [z1 0 0 ] - // 8 [0 z1 0 ] - // 9 [0 0 z1 ] - // 10 [x2 0 0 ] - // 11 [0 x2 0 ] - // 12 [0 0 x2 ] - // 13 [y2 0 0 ] - // 14 [0 y2 0 ] - // 15 [0 0 y2 ] - // 16 [z2 0 0 ] - // 17 [0 z2 0 ] - // 18 [0 0 z2 ] - // 19 [x3 0 0 ] - // 20 [0 x3 0 ] - // 21 [0 0 x3 ] - // 22 [y3 0 0 ] - // 23 [0 y3 0 ] - // 24 [0 0 y3 ] - // 25 [z3 0 0 ] - // 26 [0 z3 0 ] - // 27 [0 0 z3 ] - // for each orbital for each direction - // Counter for number of trials created - // Multiply each solid harmonic onto a ground state orbital - // for each orbital we - - // For each solid harmonic - // Temp zero functions - - // Debugging output - if (print_level >= 2) { - if (world.rank() == 0) print(" Norms of guess functions:"); - print_norms(world, trials.X); - } - - // Truncate - madness::truncate(world, trials.X); - - // Done - return trials; -} - -// Returns a list of solid harmonics such that: -// solid_harm.size() * num_ground_orbs > 2 * num. resp. components -std::vector TDDFT::createDipoleFunctionMap(World &world) { - // Container to return - - // Create the basic x, y, z, constant and zero - real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - - // real_function_3d rfunc = (x * x + y * y + z * z); - // double r = rfunc.norm2(); - - std::vector funcs; - funcs.push_back(x); - funcs.push_back(y); - funcs.push_back(z); - // Done - return funcs; -} - -typedef Tensor tensorT; -typedef Function functionT; -typedef std::shared_ptr> functorT; -typedef FunctionFactory factoryT; - -response_space TDDFT::PropertyRHS(World &world, PropertyBase &p) const { - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - response_space rhs(world, p.num_operators, r_params.num_orbitals()); - - reconstruct(world, ground_orbitals); - QProjector Qhat(world, ground_orbitals); - // Set the dipoles (ground orbitals are probably - // more accurate now, so recalc the dipoles) - // why is it called dipole guess. - // This is just orbitals times dipole operator - std::vector orbitals = ground_orbitals; - - print("num operators ", p.num_operators); - for (size_t i = 0; i < p.num_operators; i++) { - // question here....MolecularDerivativeFunctor takes derivative with - // respect to axis atom and axis - // here we save - // need to project - - rhs[i] = mul(world, p.operator_vector.at(i), ground_orbitals, r_params.lo()); - - truncate(world, rhs[i]); - // rhs[i].truncate_vec(); - - // project rhs vectors for state - rhs[i] = Qhat(rhs[i]); - // truncate(world, rhs[i], true); - for (size_t j = 0; j < orbitals.size(); j++) { - print("RHS norm for after orbital ", j, "Response state ", i, ": ", rhs[i][j].norm2()); - } - - world.gop.fence(); - // core projector contribution - } - - // if (world.rank() ==dipole 0) print("derivatives:\n", r, ru, rc, ra); - molresponse::end_timer(world, "rhs vectors"); - return rhs; -} - -// Calculates ground state coulomb potential -real_function_3d TDDFT::Coulomb(World &world) { - // Coulomb operator - real_convolution_3d op = - CoulombOperator(world, r_params.lo(), FunctionDefaults<3>::get_thresh()); - - // Get density - std::vector vsq = square(world, ground_orbitals); - compress(world, vsq); - real_function_3d rho = real_factory_3d(world); - rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], 1.0, false); } - world.gop.fence(); - vsq.clear(); - - // Apply operator and truncate - rho = apply(op, rho); - rho.truncate(); - - // Done - return rho; -} - -response_space TDDFT::exchange(World &world, response_space &f) { - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - - // Container for results and others - response_space result(world, m, n); - real_function_3d psif = real_function_3d(world); - - // Modified 'small memory' algorithm from SCF.cc - f.reconstruct_rf(); - // K[ground_density]xp=\sum_i |i> - // for each state - // for each occ orbital - // - create the vector of orbital products - // - gaxpy to collect into result - // compute product - - // Run over each excited state - for (size_t k = 0; k < m; k++) { - // And run over each occupied state - for (size_t j = 0; j < n; j++) { - // Get a vector of transition densities - // v[i]= phi[i]*f[k][:] - auto phix = - mul_sparse(world, ground_orbitals[j], f[k], FunctionDefaults<3>::get_thresh()); - // Clean up - truncate(world, phix); - // Apply operator to each member of vector - phix = apply(world, *coulop, phix); - // Clean up - truncate(world, phix); - // Final multiplication of each member of vector by a single function - phix = mul_sparse(world, ground_orbitals[j], phix, FunctionDefaults<3>::get_thresh()); - // Add the vector to result - gaxpy(world, 1.0, result[k], 1.0, phix); - } - } - - // Truncate - madness::truncate(world, result); - - // Done! - return result; -} - -void TDDFT::make_nuclear_potential(World &world) { - molresponse::start_timer(world); - potential_manager = - std::shared_ptr(new PotentialManager(molecule, r_params.core_type())); - potential_manager->make_nuclear_potential(world); -} - -// Returns the ground state potential applied to functions f -// (V0 f) V0=(Vnuc+J0-K0+EXC0) -// J0=J[ground_density] -// K0=K[ground_density]f -// EXC0=EXC[ground_density] - -// result(i,j) = inner(a[i],b[j]).sum() -Tensor TDDFT::expectation(World &world, const response_space &A, const response_space &B) { - // Get sizes - MADNESS_ASSERT(A.size() > 0); - MADNESS_ASSERT(A.size() == B.size()); - MADNESS_ASSERT(A[0].size() > 0); - MADNESS_ASSERT(A[0].size() == B[0].size()); - - size_t dim_1 = A.size(); - size_t dim_2 = A[0].size(); - // Need to take transpose of each input ResponseFunction - response_space A_t(world, dim_2, dim_1); - response_space B_t(world, dim_2, dim_1); - for (size_t i = 0; i < dim_1; i++) { - for (size_t j = 0; j < dim_2; j++) { - A_t[j][i] = A[i][j]; - B_t[j][i] = B[i][j]; - } - } - // Container for result - Tensor result(dim_1, dim_1); - /** - * @brief - * [x1 x2 x3]T[x1 x2 x3] - * - */ - // Run over dimension two - // each vector in orbital has dim_1 response functoins associated - for (size_t p = 0; p < dim_2; p++) { result += matrix_inner(world, A_t[p], B_t[p]); } - - // Done - return result; -} - - -void TDDFT::PrintRFExpectation(World &world, response_space f, response_space g, std::string fname, - std::string gname) { - Tensor t = response_space_inner(f, g); - if (world.rank() == 0) { - print(" Expectation between ", fname, " and ", gname); - print(t); - } -} - -void TDDFT::PrintResponseVectorNorms(World &world, response_space f, std::string fname) { - if (world.rank() == 0) { - print(" Norms of ResVector: ", fname); - print(f.norm2()); - } -} - -// compute rms and maxabsval of vector of doubles -void TDDFT::vector_stats(const std::vector &v, double &rms, double &maxabsval) const { - rms = 0.0; - maxabsval = v[0]; - for (size_t i = 0; i < v.size(); ++i) { - rms += v[i] * v[i]; - maxabsval = std::max(maxabsval, std::abs(v[i])); - } - rms = sqrt(rms / v.size()); -} - -void TDDFT::vector_stats_new(const Tensor v, double &rms, double &maxabsval) const { - rms = 0.0; - for (size_t i = 0; i < v.size(); ++i) { rms += v[i] * v[i]; } - rms = sqrt(rms / v.size()); - maxabsval = v.max(); -} - - -double TDDFT::do_step_restriction(World &world, const vecfuncT &x, vecfuncT &x_new, - std::string spin) const { - std::vector anorm = norm2s(world, sub(world, x, x_new)); - size_t nres = 0; - for (unsigned int i = 0; i < x.size(); ++i) { - print("anorm ", i, " : ", anorm[i]); - if (anorm[i] > r_params.maxrotn()) { - double s = r_params.maxrotn() / anorm[i]; - ++nres; - if (world.rank() == 0) { - if (nres == 1 and (r_params.print_level() > 1)) - printf(" restricting step for %s orbitals:", spin.c_str()); - printf(" %d", i); - } - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - x_new[i].truncate(); - } - } - if (nres > 0 && world.rank() == 0 and (r_params.print_level() > 1)) printf("\n"); - - world.gop.fence(); - double rms, maxval; - vector_stats(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; -} - -double TDDFT::do_step_restriction(World &world, const vecfuncT &x, vecfuncT &x_new, - std::string spin, double maxrotn) const { - Tensor anorm = norm2s_T(world, sub(world, x, x_new)); - print("ANORM", anorm); - print("maxrotn: ", maxrotn); - for (unsigned int i = 0; i < x_new.size(); ++i) { - print("anorm ", i, " : ", anorm[i]); - if (anorm[i] > maxrotn) { - double s = maxrotn / anorm[i]; - /* -if (world.rank() == 0) { -if (nres == 1 and (r_params.print_level() > 1)) printf(" restricting step for -%s orbitals:", spin.c_str()); printf(" %d", i); -} -*/ - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - // x_new[i].truncate(); - } - } - world.gop.fence(); - double rms, maxval; - vector_stats_new(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; -} - -double TDDFT::do_step_restriction(World &world, const vecfuncT &x, const vecfuncT &y, - vecfuncT &x_new, vecfuncT &y_new, std::string spin) const { - // sub(world, x, x_new) - vecfuncT x_diff = sub(world, x, x_new); - vecfuncT y_diff = sub(world, y, y_new); - - // sub(world, x, x_new) - Tensor anorm_x = norm2s_T(world, x_diff); - Tensor anorm_y = norm2s_T(world, y_diff); - Tensor anorm(x.size()); - for (unsigned int i = 0; i < x.size(); ++i) { - anorm[i] = std::sqrt(anorm_x[i] * anorm_x[i] + anorm_y[i] * anorm_y[i]); - } - - for (unsigned int i = 0; i < x.size(); ++i) { - if (anorm[i] > r_params.maxrotn()) { - double s = r_params.maxrotn() / anorm[i]; - size_t nres = 0; - if (world.rank() == 0) { - if (nres == 1 and (r_params.print_level() > 1)) - printf(" restricting step for %s orbitals:", spin.c_str()); - printf(" %d", i); - } - x_new[i].gaxpy(s, x[i], 1.0 - s, false); - y_new[i].gaxpy(s, y[i], 1.0 - s, false); - } - } - - world.gop.fence(); - double rms, maxval; - vector_stats_new(anorm, rms, maxval); - if (world.rank() == 0 and (r_params.print_level() > 1)) - print("Norm of vector changes", spin, ": rms", rms, " max", maxval); - return maxval; -} - -// Construct the Hamiltonian -// Returns the shift needed to make sure that -// -2.0 * (ground_state_energy + excited_state_energy) -// is negative. Please note: The same shift needs to -// be applied to the potential. -Tensor TDDFT::create_shift(World &world, Tensor &ground, Tensor &omega, - size_t print_level, std::string xy) { - // Start a timer - if (print_level >= 1) molresponse::start_timer(world); - - // Get sizes - size_t m = omega.size(); - size_t n = ground.size(); - - // Container to hold shift - Tensor result(m, n); - - // Run over excited components - for (size_t k = 0; k < m; k++) { - // Run over ground components - for (size_t p = 0; p < n; p++) { - if (ground(p) + omega(k) > 0) { - // Calculate the shift needed to get energy to -0.05, - // which was arbitrary (same as moldft) - result(k, p) = -(ground(p) + omega(k) + 0.05); - - // Basic output - if (print_level >= 2) { - if (world.rank() == 0) - printf(" Shift needed for transition from ground orbital %d to " - "response %s state %d\n", - static_cast(p), xy.c_str(), static_cast(k)); - if (world.rank() == 0) print(" Ground energy =", ground(p)); - if (world.rank() == 0) print(" Excited energy =", omega(k)); - if (world.rank() == 0) print(" Shifting by", result(k, p)); - if (world.rank() == 0) print(""); - } - } - } - } - - // End timer - if (print_level >= 1) molresponse::end_timer(world, "Create shift:"); - - // Done - return result; -} - -// Returns the shift needed to make sure that -// (ground_state_energy + excited_state_energy + shift) = target -// Please note: The same shift needs to be applied to the potential. -Tensor TDDFT::create_shift_target(World &world, Tensor &ground, - Tensor &omega, double target, size_t print_level, - std::string xy) { - // Start a timer - if (print_level >= 1) molresponse::start_timer(world); - - // Get sizes - size_t m = omega.size(); - size_t n = ground.size(); - - // Container to hold shift - Tensor result(m, n); - - // Run over excited components - for (size_t k = 0; k < m; k++) { - // Run over ground components - for (size_t p = 0; p < n; p++) { - // Calculate the shift needed to get energy to target - result(k, p) = -(ground(p) + omega(k) - target); - - // Basic output - if (print_level >= 2) { - if (world.rank() == 0) - printf(" Shift needed for transition from ground orbital %d to " - "response %s state %d\n", - static_cast(p), xy.c_str(), static_cast(k)); - if (world.rank() == 0) print(" Ground energy =", ground(p)); - if (world.rank() == 0) print(" Excited energy =", omega(k)); - if (world.rank() == 0) print(" Shifting by", result(k, p)); - if (world.rank() == 0) print(""); - } - } - } - - // End timer - if (print_level >= 1) molresponse::end_timer(world, "Create shift:"); - - // Done - return result; -} - -// Returns the given shift applied to the given potential -response_space TDDFT::apply_shift(World &world, Tensor &shifts, response_space &V, - response_space &f) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from V - size_t n = V[0].size(); - size_t m = V.size(); - - // Container to return - response_space shifted_V(world, m, n); - - // Run over occupied - for (size_t k = 0; k < m; k++) { - // Run over virtual - for (size_t p = 0; p < n; p++) { shifted_V[k][p] = V[k][p] + shifts(k, p) * f[k][p]; } - } - - shifted_V.truncate_rf(); - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply shift:"); - - // Done - return shifted_V; -} - -// Returns the given shift applied to the given potential -response_space TDDFT::apply_shift(World &world, double &shift, response_space &V, - response_space &f) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from V - size_t n = V[0].size(); - size_t m = V.size(); - - // Container to return - response_space shifted_V(world, m, n); - - // Run over occupied - for (size_t k = 0; k < m; k++) { - // Run over virtual - for (size_t p = 0; p < n; p++) { shifted_V[k][p] = V[k][p] + shift * f[k][p]; } - } - - shifted_V.truncate_rf(); - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply shift:"); - - // Done - return shifted_V; -} - -// Function to make a vector of BSH operators using ground and excited -// state energies -std::vector>> TDDFT::create_bsh_operators( - World &world, Tensor &shift, Tensor &ground, Tensor &omega, - double lo, double thresh) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from ground and omega - size_t n = ground.size(); - size_t m = omega.size(); - - // Make the vector - std::vector>> operators; - - // Make a BSH operator for each response function - // Run over excited components - for (size_t k = 0; k < m; k++) { - // Container for intermediary - std::vector> temp(n); - - // Run over occupied components - for (size_t p = 0; p < n; p++) { - double mu = sqrt(-2.0 * (ground(p) + omega(k) + shift(k, p))); - print("res state ", k, " orb ", p, " bsh exponent mu :", mu); - temp[p] = std::shared_ptr>( - BSHOperatorPtr3D(world, mu, lo, thresh)); - } - - // Add intermediary to return container - operators.push_back(temp); - } - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); - - // Done - return operators; -} - -// Function to make a vector of BSH operators using ground and excited -// state energies -std::vector>> -TDDFT::CreateBSHOperatorPropertyVector(World &world, Tensor &shift, Tensor &ground, - Tensor &omega, double lo, double thresh) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from ground and omega - size_t n = ground.size();// number of orbitals - size_t num_states = r_params.num_states(); - size_t num_freq = omega.size();// number of frequency states - // print("num of freq", num_freq); - - // Make the vector - std::vector>> operators; - - // Make a BSH operator for each response function - // Run over excited components - // print("num of states bsh step", num_states); - for (size_t k = 0; k < num_freq; k++) { - // Container for intermediary - std::vector> temp(n); - for (size_t state = 0; state < num_states; state++) { - // Run over occupied components - for (size_t p = 0; p < n; p++) { - temp[p] = std::shared_ptr>(BSHOperatorPtr3D( - world, sqrt(-2.0 * (ground(p) + omega(k) + shift(k, p))), lo, thresh)); - } - operators.push_back(temp); - } - - // Add intermediary to return container - } - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); - - // Done - return operators; -} - -std::vector TDDFT::make_bsh_operators_response(World &world, double &shift, - double &omega) const { - if (r_params.print_level() >= 1) molresponse::start_timer(world); - double tol = FunctionDefaults<3>::get_thresh(); - // Sizes inferred from ground and omega - size_t num_orbitals = ground_energies.size();// number of orbitals - std::vector ops(num_orbitals); - // Run over occupied components - for (size_t p = 0; p < num_orbitals; p++) { - double mu = sqrt(-2.0 * (ground_energies(p) + omega + shift)); - ops[p] = poperatorT(BSHOperatorPtr3D(world, mu, r_params.lo(), tol)); - } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "make bsh operators response"); - } - return ops; - // End timer -} - -// shift -std::vector> TDDFT::CreateBSHOperatorPropertyVector( - World &world, double &shift, Tensor &ground, double &omega, double lo, double eps) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Sizes inferred from ground and omega - size_t num_ground_states = ground.size();// number of orbitals - // print("num of freq", num_freq); - - // Make the vector - std::vector> ghat_operators(num_ground_states); - - // Make a BSH operator for each response function - // Run over excited components - // print("num of states bsh step", num_states); - // Container for intermediary - // Run over occupied components - for (size_t p = 0; p < num_ground_states; p++) { - double mu = sqrt(-2.0 * (ground(p) + omega + shift)); - ghat_operators[p] = std::shared_ptr>( - BSHOperatorPtr3D(world, mu, lo, eps)); - } - // Add intermediary to return container - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Creating BSH ops:"); - - // Done - return ghat_operators; -} - - -void TDDFT::print_residual_norms(World &world, X_space &res, bool compute_y, size_t iteration) { - long m = static_cast(res.num_states()); - - Tensor x_norms(m); - Tensor y_norms(m); - for (long i = 0; i < m; i++) x_norms(i) = norm2(world, res.X[i]); - if (compute_y) { - for (size_t i = 0; i < m; i++) y_norms(i) = norm2(world, res.Y[i]); - } - if (r_params.print_level() >= 0 and world.rank() == 0) { - if (compute_y) { - std::cout << "res " << iteration << " X :"; - for (long i(0); i < m; i++) { std::cout << x_norms[i] << " "; } - std::cout << " Y :"; - for (long i(0); i < m; i++) { std::cout << y_norms[i] << " "; } - std::cout << endl; - } else { - print("resX ", iteration, " :", x_norms); - } - } -} - -X_space TDDFT::bsh_update_response(World &world, X_space &theta_X, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, - QProjector &projector, double &x_shifts) { - size_t m = theta_X.X.size(); - size_t n = theta_X.X.size_orbitals(); - bool compute_y = r_params.omega() != 0.0; - - molresponse::start_timer(world); - - theta_X.X += Chi.X * x_shifts; - theta_X.X += PQ.X; - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - - if (compute_y) { - theta_X.Y += PQ.Y; - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); - } - molresponse::end_timer(world, "Compute residual stuff theta_X"); - - // apply bsh - molresponse::start_timer(world); - X_space bsh_X(world, m, n); - - bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } - molresponse::end_timer(world, "Apply BSH to theta_X"); - - molresponse::start_timer(world); - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); - - if (compute_y) { - for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } - bsh_X.truncate(); - } else { - bsh_X.X.truncate_rf(); - bsh_X.Y = bsh_X.X.copy(); - } - molresponse::end_timer(world, "Project and truncate BSH_X"); - - return bsh_X; -} - -void TDDFT::update_x_space_excited(World &world, X_space &old_Chi, X_space &Chi, - X_space &old_Lambda_X, X_space &res, XCOperator &xc, - QProjector &projector, Tensor &omega, - NonLinearXsolver &kain_x_space, std::vector &Xvector, - std::vector &Xresidual, - Tensor &energy_residuals, Tensor &old_energy, - Tensor &bsh_residualsX, Tensor &bsh_residualsY, - Tensor &S, Tensor &old_S, Tensor &A, - Tensor &old_A, size_t iter, Tensor &maxrotn) { - size_t m = Chi.num_states(); - bool compute_y = not r_params.tda(); - - Tensor x_shifts(m); - Tensor y_shifts(m); - print("Entering Compute Lambda"); - - if (compute_y) { - gram_schmidt(world, Chi.X, Chi.Y); - normalize(world, Chi); - } else { - gram_schmidt(world, Chi.X); - normalize(world, Chi.X); - } - // - X_space Lambda_X = Compute_Lambda_X(world, Chi, xc, r_params.calc_type()); - // This diagonalizes XAX and computes new omegas - // updates Chi - print("omega before transform"); - print(omega); - old_energy = omega; - compute_new_omegas_transform(world, old_Chi, Chi, old_Lambda_X, Lambda_X, omega, old_energy, S, - old_S, A, old_A, energy_residuals, iter); - // now Chi is rotated to new position - // roatate Chi and old Chi saves this value - // old_Chi = Chi.copy(); - - print("omega before transform"); - print(old_energy); - print("omega after transform"); - print(omega); - // Analysis gets messed up if BSH is last thing applied - // so exit early if last iteration - if (iter == r_params.maxiter() - 1) { - print("Reached max iter"); - } else { - X_space theta_X = Compute_Theta_X(world, Chi, xc, r_params.calc_type()); - // Calculates shifts needed for potential / energies - print("BSH update iter = ", iter); - X_space temp = bsh_update_excited(world, omega, theta_X, projector); - - res = compute_residual(world, Chi, temp, bsh_residualsX, bsh_residualsY, - r_params.calc_type()); - // kain if iteration >0 or first run where there should not be a problem - // computed temp and res - if (r_params.kain() && (iter > 0) && true) { - temp = kain_x_space_update(world, Chi, res, kain_x_space, Xvector, Xresidual); - } - if (iter > 0) { x_space_step_restriction(world, Chi, temp, compute_y, maxrotn); } - - temp.X.truncate_rf(); - if (compute_y) temp.Y.truncate_rf(); - Chi = temp.copy(); - // print x norms - } - - // Apply mask - /* -for (size_t i = 0; i < m; i++) Chi.X[i] = mask * Chi.X[i]; -if (not r_params.tda()) { -for (size_t i = 0; i < m; i++) Chi.Y[i] = mask * Chi.Y[i]; -} -*/ -} - -// Load Balancing -void TDDFT::compute_new_omegas_transform(World &world, X_space &old_Chi, X_space &Chi, - X_space &old_Lambda_X, X_space &Lambda_X, - Tensor &omega, Tensor &old_energy, - Tensor &S, Tensor &old_S, - Tensor &A, Tensor &old_A, - Tensor &energy_residuals, size_t iter) { - size_t m = Chi.X.size(); - bool compute_y = not r_params.tda(); - // Basic output - if (r_params.print_level() >= 1 and world.rank() == 0) { - print("Before Deflate"); - print("\n Excitation Energies:"); - print("i=", iter, " roots: ", iter, omega); - } - if (!compute_y) { - deflateTDA(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, old_S, old_A, omega, iter, m); - // Constructing S - // Full TDHF - } else { - deflateFull(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, old_S, old_A, omega, iter, m); - } - - // Basic output - if (r_params.print_level() >= 1 and world.rank() == 0) { - print("After Deflate"); - print("\n Excitation Energies:"); - print("i=", iter, " roots: ", iter, omega); - } - - // Calculate energy residual and update old_energy - energy_residuals = abs(omega - old_energy); -} - -/** - * @brief Computes the BSH Update for an excited state calculation. Passes in - * omega and computes the necessary shifts in the potential, computes BSH - * operators and applys BSH operator - * - * \f$\boldsymbol{\chi}^m=-2 - * \boldsymbol{\hat{G}} * \boldsymbol{\Theta}\boldsymbol{\chi}\f$ - * - * @param world - * @param theta_X - * @param projector - * @param converged - * @return X_space - */ -X_space TDDFT::bsh_update_excited(World &world, const Tensor &omega, X_space &theta_X, - QProjector &projector) { - size_t m = theta_X.num_states(); - size_t n = theta_X.num_orbitals(); - bool compute_y = !r_params.tda(); - Tensor x_shifts(m); - Tensor y_shifts(m); - print("omega before shifts"); - Tensor omega_plus = omega; - Tensor omega_minus = -omega; - print(omega); - x_shifts = create_shift(world, ground_energies, omega_plus, r_params.print_level(), "x"); - // Compute Theta X - // Apply the shifts - theta_X.X = apply_shift(world, x_shifts, theta_X.X, Chi.X); - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - if (compute_y) { - // theta_X.Y = apply_shift(world, y_shifts, theta_X.Y, Chi.Y); - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); - } - // Construct BSH operators - std::vector>> bsh_x_ops = - create_bsh_operators(world, x_shifts, ground_energies, omega_plus, r_params.lo(), - FunctionDefaults<3>::get_thresh()); - std::vector>> bsh_y_ops; - if (compute_y) { - Tensor omega_minus = -omega; - bsh_y_ops = create_bsh_operators(world, y_shifts, ground_energies, omega_minus, - r_params.lo(), FunctionDefaults<3>::get_thresh()); - } - X_space bsh_X(world, m, n); - // Apply BSH and get updated response components - bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); - if (compute_y) { - for (size_t i = 0; i < m; i++) bsh_X.Y[i] = projector(bsh_X.Y[i]); - } - - // Only update non-converged components - for (size_t i = 0; i < m; i++) { - bsh_X.X[i] = bsh_X.X[i]; - bsh_X.X[i] = mask * bsh_X.X[i]; - if (compute_y) { - bsh_X.Y[i] = bsh_X.Y[i]; - bsh_X.Y[i] = mask * bsh_X.Y[i]; - } - } - // Ensure orthogonal guesses - - bsh_X.truncate(); - - return bsh_X; -} - -/** - * @brief Computes the the X_space kain update - * - * @param world - * @param temp - * @param res - * @param kain_x_space - * @param Xvector - * @param Xresidual - * @return X_space - */ -X_space TDDFT::kain_x_space_update(World &world, const X_space &temp, const X_space &res, - NonLinearXsolver &kain_x_space, std::vector &Xvector, - std::vector &Xresidual) { - size_t m = temp.num_states(); - size_t n = temp.num_orbitals(); - X_space kain_update(world, m, n); - molresponse::start_timer(world); - for (size_t b = 0; b < m; b++) { - Xvector[b].X[0] = copy(world, temp.X[b]); - Xvector[b].Y[0] = copy(world, temp.Y[b]); - Xresidual[b].X[0] = copy(world, res.X[b]); - Xresidual[b].Y[0] = copy(world, res.Y[b]); - } - - for (size_t b = 0; b < m; b++) { - // passing xvectors - X_vector kain_X = kain_x_space[b].update(Xvector[b], Xresidual[b], - FunctionDefaults<3>::get_thresh(), 3.0); - // deep copy of vector of functions - kain_update.X[b] = copy(world, kain_X.X[0]); - kain_update.Y[b] = copy(world, kain_X.Y[0]); - } - molresponse::end_timer(world, " KAIN update:"); - return kain_update; -} - -void TDDFT::x_space_step_restriction(World &world, X_space &old_Chi, X_space &temp, bool restrict_y, - Tensor &maxrotn) { - size_t m = old_Chi.num_states(); - molresponse::start_timer(world); - print(maxrotn); - - for (size_t b = 0; b < m; b++) { - if (true) { - // do_step_restriction(world, old_Chi.X[b], temp.X[b], old_Chi.Y[b], - // temp.Y[b], "x and y_response"); if the norm(new-old) > max - do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn[b]); - - do_step_restriction(world, old_Chi.Y[b], temp.Y[b], "y_response", maxrotn[b]); - // do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response"); - // do_step_restriction(world, old_Chi.Y[b], temp.Y[b], "y_response"); - } else { - do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn[b]); - } - } - - molresponse::end_timer(world, " Step Restriction:"); -} - -// Returns the second order update to the energies of the excited components -// Not currently used. -Tensor TDDFT::calculate_energy_update(World &world, response_space &rhs, - response_space &f_residuals, response_space &new_f, - size_t print_level, std::string xy) { - /* - * The correction is: - * \delta \omega^{(k)} = - \frac{ \sum_p\left< \hat{V}^0 x_p^{(k)}(r) - * + (1 - \hat{\rho}^0) \Gamma_p^{(k)}(r)\right| \left. x_p^{(k)} - - * \~{x}_p^{(k)} \right> } { \sum_p \left| \left| \~{x}_p^{(k)} \right| - * \right|^2 } - */ - - // Basic output - if (print_level >= 1) { - if (world.rank() == 0) - printf(" Calculating energy residuals for %s components\n", xy.c_str()); - } - - // Size inferred - size_t m = rhs.size(); - - // Container for updates - Tensor updates(m); - - // Need to run over all functions in rhs and calculate inner products. - // rhs contains the bra in the braket notation above, and f_residuals - // is the ket. - - // Run over excited components - for (size_t k = 0; k < m; k++) { - // vmra.h function, line 627 - // Sum is included inside function call - updates(k) = inner(f_residuals[k], rhs[k]); - - // Normalize update function - // The -1.0 is the leading coefficient in the update formula - // the 1/2 is to undo the scaling of V - updates(k) = -1.0 / 2.0 * updates(k) / inner(new_f[k], new_f[k]); - } - - if (print_level >= 1) { - // Print energy deltas - if (world.rank() == 0) printf(" Energy residuals for %s components:\n", xy.c_str()); - if (world.rank() == 0) print("Er: ", abs(updates)); - } - - // Done? - return updates; -} - -vecfuncT TDDFT::make_density(World &world, X_space &Chi, std::string calc_type) { - molresponse::start_timer(world); - vecfuncT rho_omega; - if (calc_type.compare("full") == 0) { - rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.Y); - } else if (calc_type.compare("static") == 0) { - rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.X); - } else { - rho_omega = transition_densityTDA(world, ground_orbitals, Chi.X); - } - - molresponse::end_timer(world, "Make density omega"); - print_meminfo(world.rank(), "Make density omega"); - world.gop.fence(); - return rho_omega; -} - -// Specialized for response calculations that returns orthonormalized -// functions -response_space TDDFT::gram_schmidt(World &world, response_space &f) { - // Sizes inferred - size_t m = f.size(); - - // Return container - response_space result = f.copy(); - - // Orthogonalize - for (size_t j = 0; j < m; j++) { - // Need to normalize the row - double norm = norm2(world, result[j]); - - // Now scale each entry - scale(world, result[j], 1.0 / norm); - - // Project out from the rest of the vectors - for (size_t k = j + 1; k < m; k++) { - // Temp function to hold the sum - // of inner products - // vmra.h function, line 627 - double temp = inner(result[j], result[k]); - - // Now subtract - gaxpy(world, 1.0, result[k], -temp, result[j]); - } - } - - result.truncate_rf(); - - // Done - return result; -} - -// Specialized for response calculations that returns orthonormalized -// functions -void TDDFT::gram_schmidt(World &world, response_space &f, response_space &g) { - // Sizes inferred - size_t m = f.size(); - - // Orthogonalize - for (size_t j = 0; j < m; j++) { - // Need to normalize the row - double norm = inner(f[j], f[j]) - inner(g[j], g[j]); - - // Now scale each entry - scale(world, f[j], 1.0 / sqrt(norm)); - scale(world, g[j], 1.0 / sqrt(norm)); - - // Project out from the rest of the vectors - for (size_t k = j + 1; k < m; k++) { - // Temp function to hold the sum - // of inner products - // vmra.h function, line 627 - double temp = inner(f[j], f[k]) - inner(g[j], g[k]); - - // Now subtract - gaxpy(world, 1.0, f[k], -temp, f[j]); - gaxpy(world, 1.0, g[k], -temp, g[j]); - } - } - - f.truncate_rf(); - g.truncate_rf(); -} - -// Returns the max norm of the given vector of functions -double TDDFT::calculate_max_residual(World &world, response_space &f) { - // Container for max - double max = 0.0; - - // Run over all functions in f - for (unsigned int i = 0; i < f.size(); i++) { - double temp = 0.0; - - for (unsigned int j = 0; j < f[0].size(); j++) { temp += pow(f[i][j].norm2(), 2); } - - temp = sqrt(temp); - - if (temp > max) max = temp; - } - - // Done - return max; -} - -// Selects the 'active' orbitals from ground state orbitals to be used in -// the calculation (based on energy distance from the HOMO). Function needs -// knowledge of ground_orbitals and g_params.energies. Function sets -// act_orbitals and num_act_orbitals. -void TDDFT::select_active_subspace(World &world) { - // Default output - if (r_params.print_level() >= 0) { - // Set print output to something reasonable - std::cout.precision(2); - std::cout << std::fixed; - - if (world.rank() == 0) - print(" Selecting ground state subspace to excite from for " - "components."); - if (world.rank() == 0) - print(" This is all orbitals between", r_params.e_range_lo(), "and", - r_params.e_range_hi(), "\n"); - - // Reset precision - std::cout.precision(10); - std::cout << std::scientific; - } - - // Determine active orbitals based on energy differences - // from HOMO - for (unsigned int i = 0; i < r_params.num_orbitals(); i++) { - if (r_params.e_range_lo() < g_params.get_energies()(i) and - g_params.get_energies()(i) < r_params.e_range_hi()) { - // This orbital should be active, so add to list - active.push_back(i); - } - } - - // Make sure we have at least one ground state orbital to excite from - MADNESS_ASSERT(active.size() > 0); - - // Now that we know size, allocate act_ground_energies - act_ground_energies = Tensor(active.size()); - - // Now to pull the functions and energies and add to act_orbitals and - // act_ground_energies - for (unsigned int i = 0; i < active.size(); i++) { - act_orbitals.push_back(ground_orbitals[active[i]]); - act_ground_energies(i) = g_params.get_energies()(active[i]);// Put energies on diagonal - } - - // Also set the active size - act_num_orbitals = act_orbitals.size(); - - print("Found", act_num_orbitals, "active orbitals."); -} - -// Selects from a list of functions and energies the k functions with the -// lowest energy -response_space TDDFT::select_functions(World &world, response_space &f, Tensor &energies, - size_t k, size_t print_level) { - // Container for result - response_space answer; - - // Debugging output - if (print_level >= 1) { - if (world.rank() == 0) - print("\n Selecting the", k, "lowest excitation energy components.\n"); - } - - // Get rid of extra functions and save - // the first k - while (f.size() > k) f.pop_back(); - answer = f; - answer.truncate_rf(); - - // Get rid of extra energies and save - // the first k - energies = energies(Slice(0, k - 1)); - - // Basic output - if (print_level >= 1) { - if (world.rank() == 0) print(" The selected components have excitation energies:"); - if (world.rank() == 0) print(energies); - } - - // Done - return answer; -} - -// Calculate the exponentiation of a matrix through first order (I think) -Tensor TDDFT::matrix_exponential(const Tensor &A) { - const double tol = 1e-13; - MADNESS_ASSERT(A.dim((0) == A.dim(1))); - - // Scale A by a power of 2 until it is "small" - double anorm = A.normf(); - size_t n = 0; - double scale = 1.0; - while (anorm * scale > 0.1) { - ++n; - scale *= 0.5; - } - Tensor B = scale * A;// B = A*2^-n - - // Compute exp(B) using Taylor series - Tensor expB = Tensor(2, B.dims()); - for (int64_t i = 0; i < expB.dim(0); ++i) expB(i, i) = 1.0; - - size_t k = 1; - Tensor term = B; - while (term.normf() > tol) { - expB += term; - term = inner(term, B); - ++k; - term.scale(1.0 / k); - } - - // Repeatedly square to recover exp(A) - while (n--) { expB = inner(expB, expB); } - - return expB; -} - -/// compute the unitary transformation that diagonalizes the fock matrix - -/// @param[in] world the world -/// @param[in] overlap the overlap matrix of the orbitals -/// @param[inout] fock the fock matrix; diagonal upon exit -/// @param[out] evals the orbital energies -/// @param[in] thresh_degenerate threshold for orbitals being -/// degenerate -/// @return the unitary matrix U: U^T F U = evals -Tensor TDDFT::get_fock_transformation(World &world, Tensor &overlap, - Tensor &fock, Tensor &evals, - const double thresh_degenerate) { - // Run an SVD on the overlap matrix and ignore values - // less than thresh_degenerate - Tensor r_vecs; - Tensor s_vals; - Tensor l_vecs; - Tensor overlap_copy = copy(overlap); - svd(overlap_copy, l_vecs, s_vals, r_vecs); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print("\n Singular values of overlap matrix:"); - print(s_vals); - print(" Left singular vectors of overlap matrix:"); - print(l_vecs); - } - - // Check how many singular values are less than 10*thresh_degen - size_t num_sv = 0; - for (int64_t i = 0; i < s_vals.dim(0); i++) { - if (s_vals(i) < 10 * thresh_degenerate) { - if (world.rank() == 0 and num_sv == 0) print(""); - if (world.rank() == 0) - printf(" Detected singular value (%.8f) below threshold (%.8f). " - "Reducing subspace size.\n", - s_vals(i), 10 * thresh_degenerate); - num_sv++; - } - if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_sv > 0) print(""); - } - - // Going to use these a lot here, so just calculate them - size_t size_l = s_vals.dim(0); - size_t size_s = size_l - num_sv; - Tensor l_vecs_s(size_l, num_sv); - - // Transform into this smaller space if necessary - if (num_sv > 0) { - // Cut out the singular values that are small - // (singular values come out in descending order) - overlap = Tensor(size_s, size_s); - for (size_t i = 0; i < size_s; i++) overlap(i, i) = s_vals(i); - - // Copy the active vectors to a smaller container - l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Reduced size left singular vectors of overlap matrix:"); - print(l_vecs_s); - } - - // Transform - Tensor work(size_l, size_s); - mxm(size_l, size_s, size_l, work.ptr(), fock.ptr(), l_vecs_s.ptr()); - fock = Tensor(size_s, size_s); - Tensor l_vecs_t = transpose(l_vecs); - mxm(size_s, size_s, size_l, fock.ptr(), l_vecs_t.ptr(), work.ptr()); - } - - // Diagonalize using lapack - Tensor U; - sygv(fock, overlap, 1, U, evals); - - int64_t nmo = fock.dim(0);// NOLINT - - bool switched = true; - while (switched) { - switched = false; - for (int64_t i = 0; i < nmo; i++) { - for (int64_t j = i + 1; j < nmo; j++) { - double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); - double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); - if (snew > sold) { - Tensor tmp = copy(U(_, i)); - U(_, i) = U(_, j); - U(_, j) = tmp; - std::swap(evals[i], evals[j]); - switched = true; - } - } - } - } - - // Fix phases. - for (int64_t i = 0; i < nmo; ++i)// NOLINT - if (U(i, i) < 0.0) U(_, i).scale(-1.0); - - // Rotations between effectively degenerate components confound - // the non-linear equation solver ... undo these rotations - int64_t ilo = 0;// first element of cluster NOLINT - while (ilo < nmo - 1) { - int64_t ihi = ilo;// NOLINT - while (fabs(evals[ilo] - evals[ihi + 1]) < - thresh_degenerate * 100.0 * std::max(fabs(evals[ilo]), 1.0)) { - ++ihi; - if (ihi == nmo - 1) break; - } - int64_t nclus = ihi - ilo + 1;// NOLINT - if (nclus > 1) { - Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); - - // Polar Decomposition - Tensor VH(nclus, nclus); - Tensor W(nclus, nclus); - Tensor sigma(nclus); - - svd(q, W, sigma, VH); - q = transpose(inner(W, VH));// Should be conj. tranpose if complex - U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); - } - ilo = ihi + 1; - } - - fock = 0; - for (unsigned int i = 0; i < nmo; ++i) fock(i, i) = evals(i); - - // If we transformed into the smaller subspace, time to transform back - if (num_sv > 0) { - // Temp. storage - Tensor temp_U(size_l, size_l); - Tensor U2(size_l, size_l); - - // Copy U back to larger size - temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); - for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; - - // Transform back - mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); - - U = copy(U2); - } - - return U; -} - -// Sorts the given Tensor of energies -Tensor TDDFT::sort_eigenvalues(World &world, Tensor &vals, Tensor &vecs) { - // Get relevant sizes - size_t k = vals.size(); - - // Tensor to hold selection order - Tensor selected(k); - - // Copy everything... - std::vector vals_copy; - for (size_t i = 0; i < k; i++) vals_copy.push_back(vals[i]); - Tensor vals_copy2 = copy(vals); - Tensor vecs_copy = copy(vecs); - - // Now sort vals_copy - std::sort(vals_copy.begin(), vals_copy.end()); - - // Now sort the rest of the things, using the sorted energy list - // to find the correct indices - for (size_t i = 0; i < k; i++) { - // Find matching index in sorted vals_copy - size_t j = 0; - while (fabs(vals_copy[i] - vals_copy2[j]) > 1e-8 && j < k) j++; - - // Add in to list which one we're taking - selected(i) = j; - - // Put corresponding things in the correct place - vals(i) = vals_copy[i]; - vecs(_, i) = vecs_copy(_, j); - - // Change the value of vals_copy2[j] to help deal with duplicates? - vals_copy2[j] = 10000.0; - } - - // Done - return selected; -} - -/// diagonalize the fock matrix, taking care of degenerate components - -/// Vpsi is passed in to make sure orbitals and Vpsi are in phase -/// @param[in] world the world -/// @param[in] fock -/// @param[inout] psi the orbitals -/// @param[inout] Vpsi the orbital times the potential -/// @param[inout] gamma the orbital times the perturbed potential -/// @param[out] evals the orbital energies -/// @param[in] overlap the overlap matrix -/// @param[in] thresh threshold for rotation and truncation -Tensor TDDFT::diagonalizeFockMatrix(World &world, X_space &Chi, X_space &Lambda_X, - Tensor &evals, Tensor &A, - Tensor &S, const double thresh) { - // compute the unitary transformation matrix U that diagonalizes - // the fock matrix - Tensor U = get_fock_transformation(world, S, A, evals, thresh); - - // Sort into ascending order - Tensor selected = sort_eigenvalues(world, evals, U); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" U:"); - print(U); - } - - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // transform the orbitals and the potential - // Truncate happens inside here - Chi.X = transform(world, Chi.X, U); - Lambda_X.X = transform(world, Lambda_X.X, U); - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); - - // Normalize x - normalize(world, Chi.X); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Eigenvector coefficients from diagonalization:"); - print(U); - } - - return U; -} - -// Transforms the given matrix of functions according to the give -// transformation matrix. Used to update orbitals / potential -response_space TDDFT::transform(World &world, response_space &f, Tensor &U) { - // Return container - response_space result; - - // Go element by element - for (unsigned int i = 0; i < f.size(); i++) { - // Temp for the result of one row - std::vector temp = - zero_functions_compressed(world, f[0].size()); - - for (unsigned int j = 0; j < f.size(); j++) { gaxpy(world, 1.0, temp, U(j, i), f[j]); } - - // Add to temp to result - result.push_back(temp); - } - - result.truncate_rf(); - - // Done - return result; -} - -// If using a larger subspace to diagonalize in, this will put everything in -// the right spot -/** - * @brief Diagonolize in larger subspace x - * - * @param world - * @param S - * @param A - * @param Current Ax - * @param Last Axold - * @param x_response - * @param old_S - * @param old_A - * @param old_x_response - * @param print_level - */ - -void TDDFT::augment(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &last_Lambda_X, Tensor &S, Tensor &A, - Tensor &old_S, Tensor &old_A, size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - // Get sizes - size_t m = Chi.X.size(); - // Create work space, will overwrite S and A in the end - Tensor temp_S(2 * m, 2 * m); - Tensor temp_A(2 * m, 2 * m); - /** - * @brief Need to create off diagonal blocks of A - * A= - * [xAx xAx_old ] - * [xoldAx xoldAxold] - * - */ - // Calculate correct inner products of upper off diagonal - - Tensor off = response_space_inner(Chi.X, last_Lambda_X.X); - temp_A(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off);// top right - // Now for lower off diagonal - off = response_space_inner(old_Chi.X, Lambda_X.X); - temp_A(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off); // bottom left - temp_A(Slice(0, m - 1), Slice(0, m - 1)) = copy(A); // xAx top left - temp_A(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_A);// xoldAxold bottom right - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" Before symmeterizing A:"); - print(temp_A); - } - // Save temp_A as A_x - // Need to symmeterize A as well (?) - A = 0.5 * (temp_A + transpose(temp_A)); - /** - * @brief Creating S - * S= [ ] - * [ ] - */ - // Now create upper off diagonal block of S - off = expectation(world, Chi.X, old_Chi.X); - // Use slicing to put in correct spot - temp_S(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off);// top right - // Now the lower off diagonal block - // (Go ahead and cheat and use the transpose...) - off = transpose(off);// just transpose - // Use slicing to put in correct spot - temp_S(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off);// bottom right - // Put together the rest of S - temp_S(Slice(0, m - 1), Slice(0, m - 1)) = copy(S); // top left - temp_S(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_S);// - // Save temp_S as S_x - S = copy(temp_S); - // Add in old vectors to current vectors for the appropriate ones - // Augment the vectors step - for (size_t i = 0; i < m; i++) { - Chi.X.push_back(old_Chi.X[i]); - Lambda_X.X.push_back(last_Lambda_X.X[i]); - } - - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print("\n Augmented response matrix:"); - print(A); - } - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" Augmented overlap matrix:"); - print(S); - } - - // SUPER debugging - if (print_level >= 3) { - if (world.rank() == 0) print(" Calculating condition number of aug. response matrix"); - } -} - -// If using a larger subspace to diagonalize in, this will put everything in -// the right spot -void TDDFT::augment_full(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &last_Lambda_X, Tensor &S, Tensor &A, - Tensor &old_S, Tensor &old_A, size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - size_t m = Chi.num_states(); - for (size_t i = 0; i < m; i++) { - Chi.push_back(copy(world, old_Chi.X[i]), copy(world, old_Chi.Y[i])); - Lambda_X.push_back(copy(world, last_Lambda_X.X[i]), copy(world, last_Lambda_X.Y[i])); - } - Tensor temp_A = inner(Chi, Lambda_X); - A = 0.5 * (temp_A + transpose(temp_A)); - S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); - - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print("\n Augmented response matrix:"); - print(A); - } - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" Augmented overlap matrix:"); - print(S); - } - - // SUPER debugging - if (print_level >= 3) { - if (world.rank() == 0) print(" Calculating condition number of aug. response matrix"); - } -} -// If using a larger subspace to diagonalize in, after diagonalization this -// will put everything in the right spot - -void TDDFT::unaugment(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &last_Lambda_X, Tensor &omega, Tensor &S_x, - Tensor &A_x, Tensor &old_S, Tensor &old_A, - size_t num_states, size_t iter, size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - // Note: the eigenvalues and vectors were sorted after diagonalization - // and hence all the functions are sorted in ascending order of energy - - // Quick copy of m lowest eigenvalues - omega = omega(Slice(0, num_states - 1)); - // Pop off the "m" vectors off the back end of appropriate vectors - // (only after first iteration) - if (iter > 0) { - for (size_t i = 0; i < num_states; i++) { - Chi.X.pop_back(); - Lambda_X.X.pop_back(); - } - } - old_Chi.X = Chi.X.copy(); - last_Lambda_X.X = Lambda_X.X.copy(); - - old_S = response_space_inner(Chi.X, Chi.X); - old_A = Tensor(num_states, num_states); - for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Unaug. resp. mat.:"); -} -// If using a larger subspace to diagonalize in, after diagonalization this -// will put everything in the right spot - -void TDDFT::unaugment_full(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &last_Lambda_X, Tensor &omega, Tensor &S_x, - Tensor &A_x, Tensor &old_S, Tensor &old_A, - size_t num_states, size_t iter, size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - - // Note: the eigenvalues and vectors were sorted after diagonalization - // and hence all the functions are sorted in ascending order of energy - - // Quick copy of m lowest eigenvalues - omega = omega(Slice(0, num_states - 1)); - - // Pop off the "m" vectors off the back end of appropriate vectors - // (only after first iteration) - print("Entering Loop to pop_back Chi and LambdaX"); - if (iter > 0) { - for (size_t i = 0; i < num_states; i++) { - print("pop back Chi and LambdaX"); - Chi.pop_back(); - Lambda_X.pop_back(); - } - } - - old_Chi = Chi.copy(); - last_Lambda_X = Lambda_X.copy(); - - old_S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); - old_A = Tensor(num_states, num_states); - for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); - // End the timer - if (print_level >= 1) molresponse::end_timer(world, "Unaug. resp. mat.:"); -} -// Diagonalize the full response matrix, taking care of degenerate -// components Why diagonalization and then transform the x_fe vectors - -Tensor TDDFT::diagonalizeFullResponseMatrix(World &world, X_space &Chi, X_space &Lambda_X, - Tensor &omega, Tensor &S, - Tensor &A, const double thresh, - size_t print_level) { - // compute the unitary transformation matrix U that diagonalizes - // the response matrix - Tensor U = GetFullResponseTransformation(world, S, A, omega, thresh); - - // Sort into ascending order - // Tensor selected = sort_eigenvalues(world, omega, U); - - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - Chi.X = transform(world, Chi.X, U); - Chi.Y = transform(world, Chi.Y, U); - Tensor Sxa, Sya, Sa; - - Sxa = response_space_inner(Chi.X, Chi.X); - Sya = response_space_inner(Chi.Y, Chi.Y); - Sa = Sxa - Sya; - - if (world.rank() == 0 and r_params.print_level() >= 10) { - print("\n After apply transform Overlap Matrix:"); - print(Sxa); - print(Sya); - print(Sa); - } - - Lambda_X.X = transform(world, Lambda_X.X, U); - Lambda_X.Y = transform(world, Lambda_X.Y, U); - // Transform the vectors of functions - // Truncate happens in here - // we do transform here - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); - - // Normalize x and y - normalize(world, Chi); - - // Debugging output - if (world.rank() == 0 and print_level >= 2) { - print(" Eigenvector coefficients from diagonalization:"); - print(U); - } - - // Return the selected functions - return U; -} - -// Similar to what robert did above in "get_fock_transformation" -Tensor TDDFT::GetFullResponseTransformation(World &world, Tensor &S, - Tensor &A, Tensor &evals, - const double thresh_degenerate) { - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - // Get size - size_t m = S.dim(0); - - // Run an SVD on the overlap matrix and ignore values - // less than thresh_degenerate - Tensor r_vecs, s_vals, l_vecs; - Tensor S_copy = copy(S); - /** - * @brief SVD on overlap matrix S - * S=UsVT - * S, U, s , VT - * - */ - svd(S_copy, l_vecs, s_vals, r_vecs); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print("\n Singular values of overlap matrix:"); - print(s_vals); - print(" Left singular vectors of overlap matrix:"); - print(l_vecs); - } - - // Check how many singular values are less than 10*thresh_degen - size_t num_zero = 0; - for (int64_t i = 0; i < s_vals.dim(0); i++) { - if (s_vals(i) < 10 * thresh_degenerate) { - if (world.rank() == 0 and num_zero == 0) print(""); - if (world.rank() == 0) - printf(" Detected singular value (%.8f) below threshold (%.8f). " - "Reducing subspace size.\n", - s_vals(i), 10 * thresh_degenerate); - num_zero++; - } - if (world.rank() == 0 and i == s_vals.dim(0) - 1 and num_zero > 0) print(""); - } - - // Going to use these a lot here, so just calculate them - size_t size_l = s_vals.dim(0); // number of singular values - size_t size_s = size_l - num_zero;// smaller subspace size - /** - * @brief l_vecs_s(m,1) - * - * @return Tensor - */ - Tensor l_vecs_s(size_l, - num_zero);// number of sv by number smaller than thress - Tensor copyA = copy(A); // we copy xAx - - // Transform into this smaller space if necessary - if (num_zero > 0) { - print("num_zero = ", num_zero); - // Cut out the singular values that are small - // (singular values come out in descending order) - - // S(m-sl,m-sl) - S = Tensor(size_s, size_s);// create size of new size - for (size_t i = 0; i < size_s; i++) S(i, i) = s_vals(i); - // Copy the active vectors to a smaller container - // left vectors [m,m-sl] - l_vecs_s = copy(l_vecs(_, Slice(0, size_s - 1))); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Reduced size left singular vectors of overlap matrix:"); - print(l_vecs_s); - } - - // Transform - // Work(m,m-sl) - Tensor work(size_l, size_s); - /* - c(i,j) = c(i,j) + sum(k) a(i,k)*b(k,j) - - where it is assumed that the last index in each array is has unit - stride and the dimensions are as provided. - - 4-way unrolled k loop ... empirically fastest on PIII - compared to 2/3 way unrolling (though not by much). -*/ - // dimi,dimj,dimk,c,a,b - mxm(size_l, size_s, size_l, work.ptr(), A.ptr(), l_vecs_s.ptr()); - // A*left - copyA = Tensor(size_s, size_s); - Tensor l_vecs_t = transpose(l_vecs); - // s s l, copyA=lvect_t*A*left - mxm(size_s, size_s, size_l, copyA.ptr(), l_vecs_t.ptr(), work.ptr()); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Reduced response matrix:"); - print(copyA); - print(" Reduced overlap matrix:"); - print(S); - } - } - // Diagonalize (NOT A SYMMETRIC DIAGONALIZATION!!!!) - // Potentially complex eigenvalues come out of this - Tensor> omega(size_s); - Tensor U(size_s, size_s); - ggevp(world, copyA, S, U, omega); - - // Eigenvectors come out oddly packaged if there are - // complex eigenvalues. - // Currently only supporting real valued eigenvalues - // so throw an error if any imaginary components are - // not zero enough - double max_imag = abs(imag(omega)).max(); - if (world.rank() == 0 and r_params.print_level() >= 2) - print("\n Max imaginary component of eigenvalues:", max_imag, "\n"); - MADNESS_ASSERT(max_imag <= r_params.dconv());// MUST BE REAL! - evals = real(omega); - - // Easier to just resize here - m = evals.dim(0); - - bool switched = true; - while (switched) { - switched = false; - for (size_t i = 0; i < m; i++) { - for (size_t j = i + 1; j < m; j++) { - double sold = U(i, i) * U(i, i) + U(j, j) * U(j, j); - double snew = U(i, j) * U(i, j) + U(j, i) * U(j, i); - if (snew > sold) { - Tensor tmp = copy(U(_, i)); - U(_, i) = U(_, j); - U(_, j) = tmp; - std::swap(evals[i], evals[j]); - switched = true; - } - } - } - } - - // Fix phases. - for (size_t i = 0; i < m; ++i) - if (U(i, i) < 0.0) U(_, i).scale(-1.0); - - // Rotations between effectively degenerate components confound - // the non-linear equation solver ... undo these rotations - size_t ilo = 0;// first element of cluster - while (ilo < m - 1) { - size_t ihi = ilo; - while (fabs(evals[ilo] - evals[ihi + 1]) < - thresh_degenerate * 10.0 * std::max(fabs(evals[ilo]), 1.0)) { - ++ihi; - if (ihi == m - 1) break; - } - int64_t nclus = ihi - ilo + 1; - if (nclus > 1) { - Tensor q = copy(U(Slice(ilo, ihi), Slice(ilo, ihi))); - - // Polar Decomposition - Tensor VH(nclus, nclus); - Tensor W(nclus, nclus); - Tensor sigma(nclus); - - svd(q, W, sigma, VH); - q = transpose(inner(W, VH));// Should be conj. tranpose if complex - U(_, Slice(ilo, ihi)) = inner(U(_, Slice(ilo, ihi)), q); - } - ilo = ihi + 1; - } - - // If we transformed into the smaller subspace, time to transform back - if (num_zero > 0) { - // Temp. storage - Tensor temp_U(size_l, size_l); - Tensor U2(size_l, size_l); - - // Copy U back to larger size - temp_U(Slice(0, size_s - 1), Slice(0, size_s - 1)) = copy(U); - for (size_t i = size_s; i < size_l; i++) temp_U(i, i) = 1.0; - - // Transform U back - mxm(size_l, size_l, size_l, U2.ptr(), l_vecs.ptr(), temp_U.ptr()); - U = copy(U2); - } - - // Sort into ascending order - Tensor selected = sort_eigenvalues(world, evals, U); - - // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Diag. resp. mat."); - - return U; -} - -// Sorts the given tensor of eigenvalues and -// response functions -void TDDFT::sort(World &world, Tensor &vals, response_space &f) { - // Get relevant sizes - size_t k = vals.size(); - - // Copy everything... - response_space f_copy(f); - Tensor vals_copy = copy(vals); - Tensor vals_copy2 = copy(vals); - - // Now sort vals_copy - std::sort(vals_copy.ptr(), vals_copy.ptr() + vals_copy.size()); - - // Now sort the rest of the things, using the sorted energy list - // to find the correct indices - for (size_t i = 0; i < k; i++) { - // Find matching index in sorted vals_copy - size_t j = 0; - while (fabs(vals_copy(i) - vals_copy2(j)) > 1e-8 && j < k) j++; - - // Put corresponding function, difference function, value residual and - // value in the correct place - f[i] = f_copy[j]; - vals(i) = vals_copy(i); - - // Change the value of vals_copy2[j] to help deal with duplicates? - vals_copy2(j) = 10000.0; - } -} - -void TDDFT::sort(World &world, Tensor &vals, X_space &f) { - // Get relevant sizes - size_t k = vals.size(); - - // Copy everything... - X_space f_copy(f); - Tensor vals_copy = copy(vals); - Tensor vals_copy2 = copy(vals); - - // Now sort vals_copy - std::sort(vals_copy.ptr(), vals_copy.ptr() + vals_copy.size()); - - // Now sort the rest of the things, using the sorted energy list - // to find the correct indices - for (size_t i = 0; i < k; i++) { - // Find matching index in sorted vals_copy - size_t j = 0; - while (fabs(vals_copy(i) - vals_copy2(j)) > 1e-8 && j < k) j++; - - // Put corresponding function, difference function, value residual and - // value in the correct place - f.X[i] = f_copy.X[j]; - f.Y[i] = f_copy.Y[j]; - - vals(i) = vals_copy(i); - - // Change the value of vals_copy2[j] to help deal with duplicates? - vals_copy2(j) = 10000.0; - } -} - -/** - * @brief Diagonalize AX=SX omega - * - * @param world - * @param S - * @param old_S - * @param old_A - * @param x_response - * @param old_x_response - * @param ElectronResponses - * @param OldElectronResponses - * @param omega - * @param iteration - * @param m - */ - -void TDDFT::deflateGuesses(World &world, X_space &Chi, X_space &Lambda_X, Tensor &S, - Tensor &omega, size_t &iteration, size_t &m) { - // XX =Omega XAX - S = response_space_inner(Chi.X, Chi.X); - Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Guess Overlap matrix:"); - print(S); - print(" Guess XAX matrix:"); - print(XAX); - } - // Just to be sure dimensions work out, clear omega - omega.clear(); - diagonalizeFockMatrix(world, Chi, Lambda_X, omega, XAX, S, FunctionDefaults<3>::get_thresh()); -} - -void TDDFT::deflateTDA(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &old_Lambda_X, Tensor &S, Tensor old_S, - Tensor old_A, Tensor &omega, size_t &iteration, size_t &m) { - S = response_space_inner(Chi.X, Chi.X); - Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); - - // Debugging output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Overlap matrix:"); - print(S); - } - - // Augment S_x, A_x, x_gamma, x_response, V_x_response and x_gamma - // if using a larger subspace and not iteration zero (TODO ---Gotta - // look at this and make sure it uses my new functions molresponse ) - // by default r_params.larger_subspace() = 0 therefore never uses this - if (iteration < r_params.larger_subspace() and iteration > 0) { - print("Using augmented subspace"); - augment(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, XAX, old_S, old_A, - r_params.print_level()); - } - - // Solve Ax = Sxw - // Just to be sure dimensions work out, clear omega - omega.clear(); - diagonalizeFockMatrix(world, Chi, Lambda_X, omega, XAX, S, FunctionDefaults<3>::get_thresh()); - - // If larger subspace, need to "un-augment" everything - if (iteration < r_params.larger_subspace()) { - print("Unaugmenting subspace"); - unaugment(world, Chi, old_Chi, Lambda_X, old_Lambda_X, omega, S, XAX, old_S, old_A, - r_params.num_states(), iteration, r_params.print_level()); - } -} - -void TDDFT::deflateFull(World &world, X_space &Chi, X_space &old_Chi, X_space &Lambda_X, - X_space &old_Lambda_X, Tensor &S, Tensor old_S, - Tensor old_A, Tensor &omega, size_t &iteration, size_t &m) { - // Debugging output - Tensor A; - - if (iteration < r_params.larger_subspace() and iteration > 0) { - print("Entering Augment Full"); - augment_full(world, Chi, old_Chi, Lambda_X, old_Lambda_X, S, A, old_S, old_A, - r_params.print_level()); - // computes Augments A and S - - } else { - S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); - if (world.rank() == 0 && (r_params.print_level() >= 10)) { - print("\n Overlap Matrix:"); - print(S); - } - X_space Chi_copy = Chi.copy(); - Chi_copy.truncate(); - A = inner(Chi_copy, Lambda_X); - if (world.rank() == 0 && (r_params.print_level() >= 10)) { - print("\n Lambda Matrix:"); - print(A); - } - } - - omega.clear(); - - Tensor U = diagonalizeFullResponseMatrix(world, Chi, Lambda_X, omega, S, A, - FunctionDefaults<3>::get_thresh(), - r_params.print_level()); - - if (iteration < r_params.larger_subspace() and iteration > 0) { - print("Entering Unaugment Full"); - unaugment_full(world, Chi, old_Chi, Lambda_X, old_Lambda_X, omega, S, A, old_S, old_A, - r_params.num_states(), iteration, r_params.print_level()); - } else { - old_Chi = Chi.copy(); - old_Lambda_X = Lambda_X.copy(); - } -} - -// const double thresh, int print_level) { -// Creates the XCOperator object and initializes it with correct -// parameters -XCOperator TDDFT::create_XCOperator(World &world, std::vector orbitals, - std::string xc) { - // First calculate the ground state density - std::vector vsq = square(world, ground_orbitals);// we square each orbital - compress(world, vsq); // compress into multiwavelet representation - real_function_3d rho = real_factory_3d(world);// create function rho - rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], 1.0, false); } - world.gop.fence(); - - // And create the object using r_params.xc() - XCOperator xcop(world, xc, false, rho, - rho);// world,which xc, spin_polarized? ,spinup, spindown - - return xcop; -} - -// Uses an XCOperator to construct v_xc for the ground state -// density Returns d^2/d rho^2 E_xc[rho] -std::vector TDDFT::create_fxc(World &world, - std::vector &orbitals, - response_space &f, response_space &g) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - - // Next need the perturbed density - std::vector drho = transition_density(world, orbitals, f, g); - - // Return container - std::vector vxc; - - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { vxc.push_back(xc.apply_xc_kernel(drho[i])); } - // for each density apply xckernel - - return vxc; -} - -// Uses an XCOperator to construct v_xc for the ground state -// density Returns d^2/d rho^2 E_xc[rho] -std::vector TDDFT::GetWxcOnFDensities( - World &world, const std::vector &orbitals, const response_space &f) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - // Next need the perturbed density - std::vector drhoM = GetTransitionDensities(world, orbitals, f); - // Return container - std::vector Wfxc; - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { Wfxc.push_back(xc.apply_xc_kernel(drhoM[i])); } - // for each density apply xckernel - - return Wfxc; -} - -std::vector TDDFT::GetConjugateWxcOnFDensities( - World &world, const std::vector &orbitals, const response_space &f) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - - // Next need the perturbed density - std::vector drhoM = GetConjugateTransitionDensities(world, orbitals, f); - // Return container - std::vector conjugateWfvxc; - - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { - conjugateWfvxc.push_back(xc.apply_xc_kernel(drhoM[i])); - } - // for each density apply xckernel - - return conjugateWfvxc; -} - -std::vector TDDFT::CreateXCDerivative( - World &world, const std::vector &orbitals, const response_space &f) { - // Create the xcop - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - size_t m = f.size(); // get the number of response functions - size_t n = f[0].size();// get the number of orbitals function - - std::vector drho = zero_functions(world, m); - // Run over virtual... - for (size_t i = 0; i < m; i++) { - // Run over occupied... - for (size_t j = 0; j < n; j++) { - // y functions are zero if TDA is active - drho[i] = drho[i] + orbitals[j] * f[i][j];//+ orbitals[j] * y[i][j]; - } - } - // Return container - std::vector vxc; - - // Finally create the functions we want, one per response state - // (xc_args_prep_response happens inside this call) - for (unsigned int i = 0; i < f.size(); i++) { vxc.push_back(xc.apply_xc_kernel(drho[i])); } - // for each density apply xckernel - - return vxc; -} - -// Iterates the response functions until converged or out of iterations -// - -// Simplified iterate scheme for guesses -// Create and diagonalize the CIS matrix for improved initial guess -response_space TDDFT::diagonalize_CIS_guess(World &world, std::vector &virtuals, - Tensor &omega, - std::vector &orbitals, - Tensor &energies, double lo, double thresh, - size_t print_level) { - // Projecter for removing ground state - QProjector Q(world, orbitals); - - // Diagonalize under ground state hamiltonian a few times - // Create overlap - compress(world, virtuals); - Tensor S = matrix_inner(world, virtuals, virtuals); - - // Create Fock matrix - // -1 suppresses output - Tensor Fmat = CreateGroundHamiltonian(world, virtuals, -1); - - // Diagonalize - Tensor U, evals, dummy(virtuals.size()); - U = get_fock_transformation(world, S, Fmat, evals, thresh); - - // Transform and truncate functions - virtuals = madness::transform(world, virtuals, U); - truncate(world, virtuals, thresh, false); - - // filter out any ground state functions that crept in - std::vector true_virtuals; - for (unsigned int a = 0; a < virtuals.size(); a++) { - if (evals(a) > 0.0) true_virtuals.push_back(virtuals[a]); - } - - // Make sure we still have functions - if (true_virtuals.empty()) - MADNESS_EXCEPTION("Virtuals are empty: Too much overlap with occupied orbitals", 1); - - // Saving new components - virtuals = Q(true_virtuals); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) print(" Remaining virtuals:", virtuals.size()); - - // Now make the CIS matrix (copied from Jakob) - if (world.rank() == 0) print(" Forming CIS matrix for improved initial guess."); - - // Start timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - - size_t I = -1;// combined index from i and a, start is -1 so that - // initial value - // is 0 - size_t J = -1;// combined index from j and b, start is -1 so that - // initial value - // is 0 - - const size_t m = virtuals.size(); - const size_t n = orbitals.size(); - - Tensor MCIS(m * n, m * n); - real_convolution_3d op = CoulombOperator(world, lo, thresh); - - for (size_t i = 0; i < n; i++) { - const real_function_3d brai = orbitals[i]; - const std::vector igv = apply(world, op, virtuals * brai); - const std::vector igm = apply(world, op, orbitals * brai); - - for (size_t a = 0; a < m; a++) { - I++; - J = -1; - for (size_t j = 0; j < n; j++) { - const real_function_3d braj = orbitals[j]; - - for (size_t b = 0; b < m; b++) { - J++; - double diag_element = 0.0; - - if (i == j and a == b) diag_element = Fmat(a, a) - energies(i); - - MCIS(I, J) = diag_element + 2.0 * inner(braj * virtuals[b], igv[a]) - - inner(virtuals[a] * virtuals[b], igm[j]); - } - } - } - } - - // End timer - if (print_level >= 1) molresponse::end_timer(world, "Form CIS matrix:"); - - // Debugging output - if (print_level >= 2 and world.rank() == 0) { - print(" CIS matrix:"); - print(MCIS); - } - - // Diagonalize CIS matrix - syev(MCIS, U, evals); - - // Always print this? - if (world.rank() == 0) { - print(" Initial CIS matrix eigenvalues:"); - print(evals); - } - - // Now construct the initial guess - response_space f(world, U.dim(0), n); - omega = Tensor(U.dim(0)); - - I = -1; - for (size_t i = 0; i < n; i++) { - for (size_t a = 0; a < m; a++) { - I++; - J = -1; - if (evals(I) < 0.0) { - if (world.rank() == 0) print(" Skipping negative root:", evals(I)); - continue; - } - for (size_t j = 0; j < n; j++) { - for (size_t b = 0; b < m; b++) { - J++; - f[I][j] += U(J, I) * virtuals[b]; - omega(I) = evals(I); - } - } - } - } - - f.truncate_rf(); - - // Done. Whew. - return f; -} - -// Simplified iterate scheme for guesses -void TDDFT::iterate_guess(World &world, X_space &guesses) { - // Variables needed to iterate - size_t iteration = 0;// Iteration counter - QProjector projector(world, - ground_orbitals);// Projector to project out ground state - size_t m = r_params.num_states(); // Number of excited states - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - Tensor x_shifts; // Holds the shifted energy values - response_space bsh_resp(world, m, n); // Holds wave function corrections - response_space V; // Holds V^0 applied to response functions - response_space shifted_V;// Holds the shifted V^0 applied to response functions - Tensor S; // Overlap matrix of response components for x states - real_function_3d v_xc; // For TDDFT - - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - // Useful to have - response_space zeros(world, m, n); - - // Now to iterate - while (iteration < r_params.guess_max_iter()) { - // Start a timer for this iteration - molresponse::start_timer(world); - // - size_t N0 = guesses.X.size(); - size_t Ni = N0; - - // No*exp(log(Np/N0)/p*t) to exponential decay - // the number of states down to 2*r_params.states - /* -if (iteration > 1 && r_params.guess_xyz() && Ni > Np) { -Ni = std::ceil(N0 * std::exp(std::log(static_cast(Np) / - static_cast(N0)) / - static_cast(p) * iteration)); -sort(world, omega, guesses.X); -print(omega); -for (size_t i = 0; i < Ni; i++) { -Ni = 0; -if (omega[i] < 1) { -Ni++; -} -} -// this function selects k functions -guesses.X = -select_functions(world, guesses.X, omega, Ni, r_params.print_level()); -} -*/ - - // Basic output - if (r_params.print_level() >= 1) { - if (world.rank() == 0) - printf("\n Guess Iteration %d at time %.1fs\n", static_cast(iteration), - wall_time()); - if (world.rank() == 0) print(" -------------------------------------"); - } - - // Load balance - // Only balancing on x-components. Smart? - if (world.size() > 1 && ((iteration < 2) or (iteration % 5 == 0)) and - - iteration != 0) { - // Start a timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - if (world.rank() == 0) print("");// Makes it more legible - - LoadBalanceDeux<3> lb(world); - for (size_t j = 0; j < n; j++) { - for (size_t k = 0; k < r_params.num_states(); k++) { - lb.add_tree(guesses.X[k][j], lbcost(1.0, 8.0), true); - } - } - FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); - - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Load balancing:"); - } - - // compute rho_omega - rho_omega = transition_densityTDA(world, ground_orbitals, guesses.X); - // Project out ground state - for (size_t i = 0; i < Ni; i++) guesses.X[i] = projector(guesses.X[i]); - - // Truncate before doing expensive things - guesses.X.truncate_rf(); - - // Normalize after projection - if (r_params.tda()) normalize(world, guesses.X); - - // (TODO why not normalize if not tda) - // compute Y = false - X_space Lambda_X = Compute_Lambda_X(world, guesses, xc, "tda"); - - deflateGuesses(world, guesses, Lambda_X, S, omega, iteration, m); - // Debugging output - - // Ensure right number of omegas - if (size_t(omega.dim(0)) != Ni) { - if (world.rank() == 0) - print("\n Adding", Ni - omega.dim(0), - "eigenvalue(s) (counters subspace size " - "reduction in " - "diagonalizatoin)."); - Tensor temp(Ni); - temp(Slice(0, omega.dim(0) - 1)) = omega; - for (size_t i = omega.dim(0); i < Ni; i++) temp[i] = 2.5 * i; - omega = copy(temp); - } - - // Basic output - if (r_params.print_level() >= 1 and world.rank() == 0) { - print("\n Excitation Energies:"); - print("gi=", iteration, " roots: ", omega); - } - - // Only do BSH if not the last iteration - if (iteration + 1 < r_params.guess_max_iter()) { - // Calculates shifts needed for potential / energies - // If none needed, the zero tensor is returned - x_shifts = create_shift(world, ground_energies, omega, r_params.print_level(), "x"); - - X_space theta_X = Compute_Theta_X(world, guesses, xc, "tda"); - theta_X.X = apply_shift(world, x_shifts, theta_X.X, guesses.X); - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - - // Construct BSH operators - std::vector>> bsh_x_operators = - create_bsh_operators(world, x_shifts, ground_energies, omega, r_params.lo(), - FunctionDefaults<3>::get_thresh()); - - // Apply BSH and get updated components - if (r_params.print_level() >= 1) molresponse::start_timer(world); - bsh_resp = apply(world, bsh_x_operators, theta_X.X); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply BSH:"); - - // Project out ground state - for (size_t i = 0; i < Ni; i++) bsh_resp[i] = projector(bsh_resp[i]); - // Save new components - guesses.X = bsh_resp; - // Apply mask - for (size_t i = 0; i < Ni; i++) guesses.X[i] = mask * guesses.X[i]; - } - - // Ensure orthogonal guesses - for (size_t i = 0; i < 2; i++) { - molresponse::start_timer(world); - // Orthog - guesses.X = gram_schmidt(world, guesses.X); - molresponse::end_timer(world, "orthog"); - - molresponse::start_timer(world); - // Normalize - normalize(world, guesses.X); - molresponse::end_timer(world, "normalize"); - } - - // Update counter - iteration += 1; - // Done with the iteration.. truncate - guesses.X.truncate_rf(); - - // Basic output - if (r_params.print_level() >= 1) {// - molresponse::end_timer(world, " This iteration:"); - } - } -}// Done with iterate gues -// Simplified iterate scheme for guesses - -// Adds in random noise to a vector of vector of functions -response_space TDDFT::add_randomness(World &world, response_space &f, double magnitude) { - // Copy input functions - response_space f_copy = f.copy(); - - // Lambda function to add in noise - auto noise = [](const Key<3> &key, Tensor &x) mutable { - Tensor y(x.size()); - y.fillrandom(); - // y.scale(magnitude); - y.scale(1e3); - x = x + y; - // x(0,0,0) += y(0,0,0)-0.5; - }; - // TODO - // Go through each function in f_copy and add in random noise - for (unsigned int i = 0; i < f_copy.size(); i++) { - for (unsigned int j = 0; j < f_copy[0].size(); j++) { - // Add in random noise using rng and a the defined lambda function - f_copy[i][j].unaryop(noise);// not sure how this workes - // i see we pass lambda function noise - } - - // Apply mask to get boundary condition right - f_copy[i] = mask * f_copy[i];// apply mask - } - - // Done - return f_copy; -} - -// Creates the ground state hamiltonian from given functions f -Tensor TDDFT::CreateGroundHamiltonian(World &world, std::vector f, - size_t print_level) { - // Basic output - if (print_level >= 1) molresponse::start_timer(world); - // Get sizes - size_t m = f.size(); - // Debugging - if (print_level > 2) { - Tensor S = matrix_inner(world, f, f); - if (world.rank() == 0) print(" Ground state overlap:"); - if (world.rank() == 0) print(S); - } - // Calculate T - // Make the derivative operators in each direction - real_derivative_3d Dx(world, 0); - real_derivative_3d Dy(world, 1); - real_derivative_3d Dz(world, 2); - - // Apply derivatives once, and take inner products - // according to this formula (faster / less noise): - // < f | \nabla^2 | f > = - < \nabla f | \nabla f > - reconstruct(world, f); - std::vector fx = apply(world, Dx, f); - std::vector fy = apply(world, Dy, f); - std::vector fz = apply(world, Dz, f); - compress(world, fx, false); - compress(world, fy, false); - compress(world, fz, false); - world.gop.fence(); - - // Construct T according to above formula - // Note: No negative as the formula above - // has one as well, so they cancel - Tensor T = 1.0 / 2.0 * - (matrix_inner(world, fx, fx) + matrix_inner(world, fy, fy) + - matrix_inner(world, fz, fz)); - - // Construct V - // v_nuc first - potential_manager->make_nuclear_potential(world); - real_function_3d v_nuc = potential_manager->vnuclear(); - v_nuc.truncate(); - - // V_coul next - // This does not include final multiplication of each orbital - // 2 is from integrating out spin - real_function_3d v_coul = 2.0 * Coulomb(world); - - // Clear old stored potentials - stored_v_coul.clear(); - stored_v_nuc.clear(); - - // If storing potentials, save them here - if (r_params.store_potential()) { - stored_v_nuc = copy(v_nuc); - stored_v_coul = copy(v_coul); - } - - // Sum coulomb (pre multiplied) and v_nuc - // v_nuc comes out negative from potential manager, so add it - real_function_3d v = v_coul + v_nuc; - - // Apply V to f functions - std::vector vf = v * f; - - // Clear stored_potential - stored_potential.clear(); - - // ALWAYS DO THIS FOR THE STORED POTENTIAL!! - // exchange last - // 'small memory' algorithm from SCF.cc - real_convolution_3d op = - CoulombOperator(world, r_params.lo(), FunctionDefaults<3>::get_thresh()); - std::vector Kf = zero_functions_compressed(world, m); - for (size_t i = 0; i < m; ++i) { - std::vector psif = - mul_sparse(world, f[i], f, FunctionDefaults<3>::get_thresh()); - truncate(world, psif); - psif = apply(world, op, psif); - truncate(world, psif); - - // Save the potential here if we are saving it - if (r_params.store_potential()) { stored_potential.push_back(psif); } - - psif = mul_sparse(world, f[i], psif, FunctionDefaults<3>::get_thresh()); - gaxpy(world, 1.0, Kf, 1.0, psif); - } - - // Only use the exchange above if HF: - Tensor V; - real_function_3d v_xc; - - if (r_params.xc() == "hf") { - // Construct V - V = matrix_inner(world, f, vf) - matrix_inner(world, f, Kf); - } else {// DFT - - XCOperator xcop = create_XCOperator(world, f, r_params.xc()); - - real_function_3d v_xc = xcop.make_xc_potential(); - v = v + v_xc; - std::vector vf = v * f; - if ((*xcop.xc).hf_exchange_coefficient() > 0.0) { - // XCOperator has member variable xc, which is an - // xcfunctional which has the hf_exchange_coeff we need here - gaxpy(world, 1.0, vf, -(*xcop.xc).hf_exchange_coefficient(), Kf); - } - V = matrix_inner(world, f, vf); - } - - // Now create the hamiltonian - hamiltonian = T + V; - - for (int64_t i = 0; i < hamiltonian.dim(0); i++) { - for (int64_t j = i + 1; j < hamiltonian.dim(1); j++) { - // print(i, j); - // print(xAx(i, j)); - // print(xAx(j, i)); - hamiltonian(j, i) = hamiltonian(i, j); - } - } - double traceOfHamiltonian(0); - for (int64_t i = 0; i < hamiltonian.dim(0); i++) { traceOfHamiltonian += hamiltonian(i, i); } - print("Trace of Hamiltonian"); - print(traceOfHamiltonian); - // Save a matrix that is - // (T+V) - Lambda * eye - // Copy hamiltonian and zero the diagonal - ham_no_diag = copy(hamiltonian); - for (size_t i = 0; i < m; i++) ham_no_diag(i, i) = 0.0; - - // Debug output - if (print_level >= 2 and world.rank() == 0) { - print(" Ground state hamiltonian:"); - print(hamiltonian); - } - - // End timer - if (print_level >= 1) molresponse::end_timer(world, " Create grnd ham:"); - - return hamiltonian; -} - -functionT TDDFT::make_ground_density(World &world, const vecfuncT &v) { - tensorT occ = g_params.get_occ(); - vecfuncT vsq = square(world, v); - compress(world, vsq); - functionT rho = factoryT(world); - rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], double(1.0), false); } - world.gop.fence(); - vsq.clear(); - return rho; -} - -// Creates the transition densities -std::vector TDDFT::transition_density(World &world, - std::vector &orbitals, - response_space &x, response_space &y) { - // Get sizes - size_t m = x.size(); - - // Return container - std::vector densities = zero_functions(world, m); - x.truncate_rf(); - y.truncate_rf(); - truncate(world, orbitals); - for (size_t b = 0; b < m; b++) { - // Run over occupied... - // y functions are zero if TDA is active - densities[b] = dot(world, x[b], orbitals); - densities[b] += dot(world, orbitals, y[b]); - } - - truncate(world, densities); - world.gop.fence(); - // Done! - return densities; -} - -std::vector TDDFT::transition_densityTDA( - World &world, std::vector const &orbitals, response_space &x) { - // Get sizes - size_t m = x.size(); - // Return container - std::vector densities = zero_functions(world, m); - x.truncate_rf(); - truncate(world, ground_orbitals); - for (size_t b = 0; b < m; b++) { - // y functions are zero if TDA is active - densities[b] = dot(world, x[b], ground_orbitals); - } - - truncate(world, densities); - world.gop.fence(); - // Done! - return densities; -} - -// Creates the transition density -std::vector TDDFT::GetTransitionDensities( - World &world, const std::vector &orbitals, const response_space &f) { - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - // Return container - std::vector densities = zero_functions(world, m); - - // Run over virtual... - for (size_t i = 0; i < m; i++) { - // Run over occupied... - for (size_t j = 0; j < n; j++) { - // y functions are zero if TDA is active - densities[i] = densities[i] + orbitals[j] * f[i][j]; - // densities[i] =densities[i] + orbitals[j] * dagger(f[i][j]);TODO: - // DAGGER - } - } - - // Done! - return densities; -} - -std::vector TDDFT::GetConjugateTransitionDensities( - World &world, const std::vector &orbitals, const response_space &f) { - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - // Return container - std::vector densities = zero_functions(world, m); - // Run over virtual... - for (size_t i = 0; i < m; i++) { - // Run over occupied... - for (size_t j = 0; j < n; j++) { - // y functions are zero if TDA is active - densities[i] = densities[i] + orbitals[j] * f[i][j]; - // densities[i] + orbitals[j] * dagger(f[i][j]) TODO: DAGGER; - } - } - // Done! - return densities; -} - -Tensor TDDFT::polarizability() { return -2 * inner(Chi, PQ); } - -void TDDFT::PrintPolarizabilityAnalysis(World &world, const Tensor polar_tensor) { - // Final polarizability analysis - // diagonalize - Tensor V, epolar; - syev(polar_tensor, V, epolar); - double Dpolar_average = 0.0; - double Dpolar_iso = 0.0; - for (unsigned int i = 0; i < 3; ++i) Dpolar_average = Dpolar_average + epolar[i]; - Dpolar_average = Dpolar_average / 3.0; - Dpolar_iso = sqrt(.5) * sqrt(std::pow(polar_tensor(0, 0) - polar_tensor(1, 1), 2) + - std::pow(polar_tensor(1, 1) - polar_tensor(2, 2), 2) + - std::pow(polar_tensor(2, 2) - polar_tensor(0, 0), 2)); - - if (world.rank() == 0) { - print("\nTotal Dynamic Polarizability Tensor"); - printf("\nFrequency = %.6f a.u.\n\n", omega(0, 0)); - // printf("\nWavelength = %.6f a.u.\n\n", r_params.omega() * ???); - print("Polarizability", "Final"); - print(polar_tensor); - printf("\tEigenvalues = "); - printf("\t %.6f \t %.6f \t %.6f \n", epolar[0], epolar[1], epolar[2]); - printf("\tIsotropic = \t %.6f \n", Dpolar_average); - printf("\tAnisotropic = \t %.6f \n", Dpolar_iso); - printf("\n"); - } -} - - -void TDDFT::compute_and_print_polarizability(World &world, X_space &Chi, X_space &PQ, - std::string message) { - Tensor G = -2 * inner(Chi, PQ); - if (world.rank() == 0) { - print("Polarizability", message); - print(G); - } -} - -void TDDFT::plot_excited_states(World &world, size_t iteration, response_space &x_response, - response_space &y_response, ResponseParameters const &r_params, - GroundStateCalculation const &g_params) { - std::filesystem::create_directories("plots/virtual"); - // num orbitals - size_t n = x_response[0].size(); - size_t m = x_response.size(); - - std::string dir("xyz"); - // for plotname size - size_t buffSize = 500; - char plotname[buffSize]; - double Lp = std::min(r_params.L(), 24.0); - // Doing line plots along each axis - for (int d = 0; d < 3; d++) { - // print ground_state - plotCoords plt(0, Lp); - for (int b = 0; b < static_cast(m); b++) { - for (int i = 0; i < static_cast(n); i++) { - // print ground_state - // plot x function x_dir_b_i__k_iter - snprintf(plotname, buffSize, "plots/virtual/x_direction_%c_res_%d_orb_%d", dir[d], - static_cast(b), static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, x_response[b][i]); - - // plot y functione y_dir_b_i__k_iter - snprintf(plotname, buffSize, "plots/xy/y_direction_%c_res_%d_orb_%d", dir[d], - static_cast(b), static_cast(i)); - plot_line(plotname, 5001, plt.lo, plt.hi, y_response[b][i]); - } - } - } - world.gop.fence(); - - // END TESTING -} - -vecfuncT TDDFT::project_ao_basis(World &world, const AtomicBasisSet &aobasis) { - // Make at_to_bf, at_nbf ... map from atom to first bf on atom, and nbf/atom - std::vector at_to_bf, at_nbf; - aobasis.atoms_to_bfn(molecule, at_to_bf, at_nbf); - - return project_ao_basis_only(world, aobasis, molecule); -} - - -vecfuncT TDDFT::project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, - const Molecule &molecule) { - vecfuncT ao = vecfuncT(aobasis.nbf(molecule)); - for (int i = 0; i < aobasis.nbf(molecule); ++i) { - functorT aofunc(new AtomicBasisFunctor(aobasis.get_atomic_basis_function(molecule, i))); - ao[i] = factoryT(world).functor(aofunc).truncate_on_project().nofence().truncate_mode(1); - } - world.gop.fence(); - truncate(world, ao); - madness::normalize(world, ao); - return ao; -} - - -/// A MADNESS functor to compute either x, y, or z -class DipoleFunctor : public FunctionFunctorInterface { -private: - const int axis; - -public: - DipoleFunctor(int axis) : axis(axis) {} - - double operator()(const coordT &x) const { return x[axis]; } -}; - -/// A MADNESS functor to compute the cartesian moment x^i * y^j * z^k (i, j, k -/// integer and >= 0) -class MomentFunctor : public FunctionFunctorInterface { -private: - const int i, j, k; - -public: - MomentFunctor(int i, int j, int k) : i(i), j(j), k(k) {} - - MomentFunctor(const std::vector &x) : i(x[0]), j(x[1]), k(x[2]) {} - - double operator()(const coordT &r) const { - double xi = 1.0, yj = 1.0, zk = 1.0; - for (int p = 0; p < i; ++p) xi *= r[0]; - for (int p = 0; p < j; ++p) yj *= r[1]; - for (int p = 0; p < k; ++p) zk *= r[2]; - return xi * yj * zk; - } -}; - -void TDDFT::analyze_vectors(World &world, const vecfuncT &x, std::string response_state) { - molresponse::start_timer(world); - AtomicBasisSet sto3g("sto-3g"); - vecfuncT ao = project_ao_basis(world, sto3g); - - tensorT C = matrix_inner(world, ao, x); - int nmo1 = x.size(); - tensorT rsq, dip(3, nmo1); - { - functionT frsq = factoryT(world).f(rsquared).initial_level(4); - // - // - rsq = inner(world, x, mul_sparse(world, frsq, x, vtol)); - for (int axis = 0; axis < 3; ++axis) { - // x y z - functionT fdip = factoryT(world) - .functor(functorT(new madness::DipoleFunctor(axis))) - .initial_level(4); - dip(axis, _) = inner(world, x, mul_sparse(world, fdip, x, vtol)); - // - ^2-^2-^2 - for (int i = 0; i < nmo1; ++i) rsq(i) -= dip(axis, i) * dip(axis, i); - } - } - molresponse::end_timer(world, "Analyze vectors"); - - long nmo = x.size(); - size_t ncoeff = 0; - for (long i = 0; i < nmo; ++i) { - size_t ncoeffi = x[i].size(); - ncoeff += ncoeffi; - if (world.rank() == 0 and (r_params.print_level() > 1)) { - print(response_state + " orbital : ", i); - - printf("ncoeff=%.2e:", (double) ncoeffi); - - printf("center=(%.2f,%.2f,%.2f) : radius=%.2f\n", dip(0, i), dip(1, i), dip(2, i), - sqrt(rsq(i))); - sto3g.print_anal(molecule, C(i, _)); - printf("total number of coefficients = %.8e\n\n", double(ncoeff)); - } - } -} -// Main function, makes sure everything happens in correct order -// compute the frequency response, r_params sets the the calculation type. -// options are dipole,nuclear,order2, order3. Computes the density respone -// No matter the calculation type we do the same iteration. -// The only difference is the number of response states as well as the -// number of right hand side vectors. - -// Exactam eam -// Deuces diff --git a/src/apps/molresponse/TDDFT.h b/src/apps/molresponse/TDDFT.h deleted file mode 100644 index 5c654c15376..00000000000 --- a/src/apps/molresponse/TDDFT.h +++ /dev/null @@ -1,740 +0,0 @@ -// Copyright 2021 Adrian Hurtado - -#ifndef SRC_APPS_MOLRESPONSE_TDDFT_H_ -#define SRC_APPS_MOLRESPONSE_TDDFT_H_ - -#include -#include -#include -#include -#include -#include -#include -#include // The kain solver -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "madness/tensor/tensor_json.hpp" -#include -#include -#include -#include -#include -#include -#include -#include - -// Functor from SCF.cc (it wasn't linking right, no idea why, so just copied and -// renamed here) A copy of a MADNESS functor to compute the cartesian moment x^i -// * y^j * z^k (i, j, k integer and >= 0) -class BS_MomentFunctor : public FunctionFunctorInterface { - private: - const int i, j, k; - - public: - BS_MomentFunctor(int i, int j, int k) : i(i), j(j), k(k) {} - explicit BS_MomentFunctor(const std::vector& x) : i(x[0]), j(x[1]), k(x[2]) {} - double operator()(const Vector& r) const { - double xi = 1.0, yj = 1.0, zk = 1.0; - for (int p = 0; p < i; ++p) xi *= r[0]; - for (int p = 0; p < j; ++p) yj *= r[1]; - for (int p = 0; p < k; ++p) zk *= r[2]; - return xi * yj * zk; - } -}; - -/// an N-dimensional real-valued Gaussian function - -/// the function looks like -/// \[ -/// f(r) = x^i y^j .. z^k exp(-alpha r^2) -/// \] -template -class GaussianGuess : public FunctionFunctorInterface { - typedef Vector coordT; - - public: - /// ctor - - /// @param[in] origin the origin of the Gauss function - /// @param[in] alpha the exponent exp(-alpha r^2) - /// @param[in] ijk the monomial x^i y^j z^k exp(-alpha r^2) (for NDIM) - GaussianGuess(const coordT& origin, const double alpha, const std::vector ijk = std::vector(NDIM)) - : origin(origin), exponent(alpha), ijk(ijk) {} - - coordT origin; - double exponent; ///< exponent of the guess - std::vector ijk; ///< cartesian exponents - - double operator()(const coordT& xyz) const { - double arg = 0.0, prefac = 1.0; - for (std::size_t i = 0; i < NDIM; ++i) { - arg += (xyz[i] - origin[i]) * (xyz[i] - origin[i]); - prefac *= pow(xyz[i], ijk[i]); - } - const double e = exponent * arg; - return prefac * exp(-e); - } -}; - -class ResidualResponseVectors { - public: - response_space x; - response_space y; - ResidualResponseVectors(World& world, size_t m, int n) { - x = response_space(world, m, n); - y = response_space(world, m, n); - } -}; -typedef Vector coordT; -typedef std::shared_ptr> functorT; -typedef Function functionT; -typedef std::vector vecfuncT; -typedef std::pair pairvecfuncT; -typedef Tensor tensorT; -typedef DistributedMatrix distmatT; -typedef FunctionFactory factoryT; -typedef SeparatedConvolution operatorT; -typedef std::shared_ptr poperatorT; -typedef Function, 3> complex_functionT; -typedef Convolution1D complex_operatorT; -typedef std::vector> NonLinearXsolver; - -class TDDFT { - public: - // ResponseParameter object to hold all user input variables - std::shared_ptr potential_manager; - // CalculationParameters param; - functionT mask; - - ResponseParameters r_params; - GroundStateCalculation g_params; - Molecule molecule; - - // Tensors for holding energies - // residuals, and shifts - Tensor omega; // Energies of response functions - Tensor e_residuals; // Residuals of energies - - // Information that is inferred from input file - // Ground state orbitals being used in calculation - std::vector act_orbitals; - std::vector ground_orbitals; - Tensor ground_energies; // Ground state hamiltonian tensor - // Ground state energies being used for calculation - Tensor act_ground_energies; - Tensor hamiltonian; // Ground state hamiltonian tensor - Tensor ham_no_diag; // Ground state ham. without diagonal (Used when - // localized orbitals are given) - std::vector active; // The labels of orbitals selected as "active" - unsigned int act_num_orbitals; // Number of ground state orbitals being used - // in calculation - - // XCfunction object for DFT calculations - XCfunctional xcf; - - // Mask function to handle boundary conditions - - // Functions - real_function_3d stored_v_nuc; // Stored nuclear potential from ground state - real_function_3d stored_v_coul; // Stored coulomb potential from ground state - - X_space Chi; - X_space PQ; - density_vector rho; - functionT rho0; - vecfuncT rho_omega; - - response_space stored_potential; // The ground state potential, stored only - // if store_potential is true (default is - // false). Holds the integrals - // \int dr \frac{\phi_i^\dagger - // phi_j}{\left| r - r' \right|} - PropertyBase p; // for frequency calculations - - - poperatorT coulop; - std::vector> gradop; - double vtol; - nlohmann::json j_molresponse; - - // Member variables - public: - // Collective constructor for response uses contents of file \c filename and - - TDDFT(World& world, density_vector& rho); - // Saves a response calculation - void save(World& world, const std::string & name); - - // Loads a response calculation - void load(World& world, const std::string & name); - // Initial load balance using vnuc - void initial_load_bal(World& world); - void load_balance(World& world, vecfuncT rho_omega, X_space Chi, const X_space& Chi_old); - void orbital_load_balance(World& world, - vecfuncT& psi0, - vecfuncT& psi0_copy, - X_space& Chi, - X_space& Chi_copy); - // Normalizes in the response sense - static void normalize(World& world, response_space& f); - - // Normalizes in the response sense - void normalize(World& world, response_space& f, response_space& g); - // Normalize X_space xx-yy=1 - void normalize(World& world, X_space& chi); - - // Prints norms of the given vector - void print_norms(World& world, response_space function); - - // Returns a set of vector of vector of real_function_3d of proper size, - // initialized to zero - - // Returns a list of solid harmonics - std::map, real_function_3d> solid_harmonics(World& world, int n); - // returns a map of real form spherical harmonics n=level...returns (n+1)^2 - // functions - std::map, real_function_3d> simple_spherical_harmonics(World& world, int n); - // returns a map of real form spherical harmonics n=level...returns (n+1)^2 - // functions - std::vector createDipoleFunctionMap(World& world); - // Returns initial response functions - X_space create_trial_functions(World& world, - size_t k, - std::vector& orbitals, - size_t print_level); - X_space create_trial_functions2(World& world, std::vector& orbitals, size_t print_level); - - response_space PropertyRHS(World& world, PropertyBase& p) const; - // Returns the derivative of the coulomb operator, applied to ground state - // orbitals - - // Returns the diagonal (letter A) elements of response matrix - X_space compute_gamma_full(World& world, X_space& Chi, const XCOperator& xc); - X_space compute_gamma_static(World& world, X_space& Chi, XCOperator xc); - X_space compute_gamma_tda(World& world, X_space& Chi, XCOperator xc); - // Note: No post multiplication involved here - real_function_3d Coulomb(World& world); - - // Returns the result of ground state exchange applied to response functions - response_space exchange(World& world, response_space& f); - - // Returns the ground state potential applied to response functions - void make_nuclear_potential(World& world); - X_space compute_V0X(World& world, X_space& Chi, XCOperator xc, bool compute_Y); - X_space compute_F0X(World& world, X_space& Chi, XCOperator xc, bool compute_Y); - - // Returns a tensor, where entry (i,j) = inner(a[i], b[j]).sum() - Tensor expectation(World& world, const response_space& a, const response_space& b); - void PrintRFExpectation(World& world, - response_space f, - response_space g, - std::string fname, - std::string gname); - void PrintResponseVectorNorms(World& world, response_space f, std::string fname); - - void vector_stats(const std::vector& v, double& rms, double& maxabsval) const; - - void vector_stats_new(const Tensor v, double& rms, double& maxabsval) const; - - double do_step_restriction(World& world, const vecfuncT& x, vecfuncT& x_new, std::string spin) const; - double do_step_restriction(World& world, - const vecfuncT& x, - vecfuncT& x_new, - std::string spin, - double maxrotn) const; - - double do_step_restriction(World& world, - const vecfuncT& x, - const vecfuncT& y, - vecfuncT& x_new, - vecfuncT& y_new, - std::string spin) const; - - X_space Compute_Theta_X(World& world, X_space& Chi, XCOperator xc, std::string calc_type); - X_space Compute_Lambda_X(World& world, X_space& Chi, XCOperator xc, std::string calc_type); - // Returns the hamiltonian matrix, equation 45 from the paper - // -2.0 * (ground_state_energy + excited_state_energy) is positive - Tensor create_shift(World& world, - Tensor& ground, - Tensor& omega, - size_t print_level, - std::string xy); - - // Returns the shift needed for each orbital to make sure - // (ground_state_energy + excited_state_energy + shift) = target - Tensor create_shift_target(World& world, - Tensor& ground, - Tensor& omega, - double target, - size_t print_level, - std::string xy); - - // Returns the given shift applied to the given potentials - response_space apply_shift(World& world, Tensor& shifts, response_space& V, response_space& f); - // single shift value - response_space apply_shift(World& world, double& shift, response_space& V, response_space& f); - - // Returns a vector of BSH operators - std::vector>> create_bsh_operators(World& world, - Tensor& shift, - Tensor& ground, - Tensor& omega, - double lo, - double thresh); - - std::vector make_bsh_operators_response( - World& world, - double& shift, - double& omega) const; // Returns a vector of BSH operators - std::vector>> CreateBSHOperatorPropertyVector( - World& world, - Tensor& shift, - Tensor& ground, - Tensor& omega, - double lo, - double thresh); - // here omega and shifts are doubles - std::vector> CreateBSHOperatorPropertyVector(World& world, - double& shift, - Tensor& ground, - double& omega, - double lo, - double thresh); - - void update_x_space_response(World& world, - X_space& Chi, - X_space& residual, - XCOperator& xc, - std::vector& bsh_x_ops, - std::vector& bsh_y_ops, - QProjector& projector, - double& x_shifts, - double& omega_n, - NonLinearXsolver& kain_x_space, - std::vector Xvector, - std::vector Xresidual, - Tensor& bsh_residualsX, - Tensor& bsh_residualsY, - size_t iteration, - Tensor& maxrotn); - - X_space bsh_update_response(World& world, - X_space& theta_X, - std::vector& bsh_x_ops, - std::vector& bsh_y_ops, - QProjector& projector, - double& x_shifts); - - X_space compute_residual(World& world, - X_space& old_Chi, - X_space& temp, - Tensor& bsh_residualsX, - Tensor& bsh_residualsY, - std::string calc_type); - - void print_residual_norms(World& world, X_space& old_Chi, bool compute_y, size_t iteration); - X_space bsh_update_excited(World& world, - const Tensor& omega, - X_space& theta_X, - QProjector& projector); - - void update_x_space_excited(World& world, - X_space& old_Chi, - X_space& Chi, - X_space& old_Lambda_X, - X_space& residuals, - XCOperator& xc, - QProjector& projector, - Tensor& omega, - NonLinearXsolver& kain_x_space, - std::vector& Xvector, - std::vector& Xresidual, - Tensor& energy_residuals, - Tensor& old_energy, - Tensor& bsh_residualsX, - Tensor& bsh_residualsY, - Tensor& S, - Tensor& old_S, - Tensor& A, - Tensor& old_A, - size_t iteration, - Tensor& maxrotn); - void compute_new_omegas_transform(World& world, - X_space& old_Chi, - X_space& Chi, - X_space& old_Lambda_X, - X_space& Lambda_X, - Tensor& omega, - Tensor& old_energy, - Tensor& S, - Tensor& old_S, - Tensor& A, - Tensor& old_A, - Tensor& energy_residuals, - size_t iteration); - - - X_space kain_x_space_update(World& world, - const X_space& temp, - const X_space& res, - NonLinearXsolver& kain_x_space, - std::vector& Xvector, - std::vector& Xresidual); - void x_space_step_restriction(World& world, - X_space& old_Chi, - X_space& temp, - bool restrict_y, - Tensor& maxrotn); - // Returns the second order update to the energy - Tensor calculate_energy_update(World& world, - response_space& gamma, - response_space& f_residuals, - response_space& new_f, - size_t print_level, - std::string xy); - - // Returns response functions that have been orthonormalized via - // modified Gram-Schmidt. Note: This is specifically designed for - // response functions only - vecfuncT make_density(World& world, X_space& Chi, std::string calc_type); - response_space gram_schmidt(World& world, response_space& f); - - void gram_schmidt(World& world, response_space& f, response_space& g); - - // Returns the max norm of the given vector of functions - double calculate_max_residual(World& world, response_space& f); - - // Selects the 'active' orbitals from ground state orbitals to be used in - // the calculation (based on energy distance from the HOMO.) Function needs - // knowledge of g_params.orbitals and g_params.ground_energies. Function - // sets - void select_active_subspace(World& world); - // Selects from a list of functions and energies the k functions with the - // lowest energy - response_space select_functions(World& world, - response_space& f, - Tensor& energies, - size_t k, - size_t print_level); - - // Calculates the exponentiation of a matrix through first order (I think) - Tensor matrix_exponential(const Tensor& A); - - // Computes the unitary transformation that diagonalizes the fock matrix - Tensor get_fock_transformation(World& world, - Tensor& overlap, - Tensor& fock, - Tensor& evals, - const double thresh_degenerate); - - // Sorts the given Tensor of energies - Tensor sort_eigenvalues(World& world, Tensor& vals, Tensor& vecs); - - // Diagonalizes the fock matrix, taking care of degerate states - - Tensor diagonalizeFockMatrix(World& world, - X_space& Chi, - X_space& Lambda_X, - Tensor& evals, - Tensor& A, - Tensor& S, - const double thresh); - // Transforms the given matrix of functions according to the given - // transformation matrix. Used to update orbitals / potentials - response_space transform(World& world, response_space& f, Tensor& U); - - // If using a larger subspace to diagonalize in, this will put everything in - - void augment(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& last_Lambda_X, - Tensor& S_x, - Tensor& A_x, - Tensor& old_S, - Tensor& old_A, - size_t print_level); - // If using a larger subspace to diagonalize in, this will put everything in - // the right spot - void augment_full(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& last_Lambda_X, - Tensor& S_x, - Tensor& A_x, - Tensor& old_S, - Tensor& old_A, - size_t print_level); - - // If using a larger subspace to diagonalize in, after diagonalization this - // will put everything in the right spot - void unaugment(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& last_Lambda_X, - Tensor& omega, - Tensor& S_x, - Tensor& A_x, - Tensor& old_S, - Tensor& old_A, - size_t num_states, - size_t iter, - size_t print_level); - // If using a larger subspace to diagonalize in, after diagonalization this - // will put everything in the right spot - void unaugment_full(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& last_Lambda_X, - Tensor& omega, - Tensor& S_x, - Tensor& A_x, - Tensor& old_S, - Tensor& old_A, - size_t num_states, - size_t iter, - size_t print_level); - Tensor diagonalizeFullResponseMatrix(World& world, - X_space& Chi, - X_space& Lambda_X, - Tensor& omega, - Tensor& S, - Tensor& A, - const double thresh, - size_t print_level); - - // Similar to what robert did above in "get_fock_transformation" - Tensor GetFullResponseTransformation(World& world, - Tensor& S, - Tensor& A, - Tensor& evals, - const double thresh); - - // Sorts the given Tensor and response functions in place - void sort(World& world, Tensor& vals, response_space& f); - void sort(World& world, Tensor& vals, X_space& f); - - void deflateGuesses(World& world, - X_space& Chi, - X_space& Lambda_X, - Tensor& S, - Tensor& omega, - size_t& iteration, - size_t& m); - void deflateTDA(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& old_Lambda_X, - Tensor& S, - Tensor old_S, - Tensor old_A, - Tensor& omega, - size_t& iteration, - size_t& m); - - void deflateFull(World& world, - X_space& Chi, - X_space& old_Chi, - X_space& Lambda_X, - X_space& old_Lambda_X, - Tensor& S, - Tensor old_S, - Tensor old_A, - Tensor& omega, - size_t& iteration, - size_t& m); - // Creates the XCOperator object and initializes it with correct - // parameters - XCOperator create_XCOperator(World& world, - std::vector orbitals, - std::string xc); - - // Uses an XCOperator to construct v_xc for the ground state - // density Returns d^2/d rho^2 E_xc[rho] - std::vector create_fxc(World& world, - std::vector& orbitals, - response_space& f, - response_space& g); - - std::vector GetWxcOnFDensities(World& world, - const std::vector& orbitals, - const response_space& f); - std::vector GetConjugateWxcOnFDensities(World& world, - const std::vector& orbitals, - const response_space& f); - - std::vector CreateXCDerivative(World& world, - const std::vector& orbitals, - const response_space& f); - - // Iterates the trial functions until covergence or it runs out of - // iterations - void iterate_excited(World& world, X_space& Chi); - - // Uses member variables - void analysis(World& world, X_space& Chi); - - // Simplified iterate scheme for guesses - void iterate_guess(World& world, X_space& guesses); - - // Create and diagonalize the CIS matrix for improved initial guess - response_space diagonalize_CIS_guess(World& world, - std::vector& virtuals, - Tensor& omega, - std::vector& orbitals, - Tensor& energies, - double lo, - double thresh, - size_t print_level); - - // Adds random noise to function f - response_space add_randomness(World& world, response_space& f, double magnitude); - - // Creates the transition density - functionT make_ground_density(World& world, const vecfuncT& v); - // Creates the transition density - std::vector transition_density(World& world, - std::vector& orbitals, - response_space& x, - response_space& y); - std::vector transition_densityTDA(World& world, - std::vector const& orbitals, - response_space& x); - // Get transition density from f and orbitals - std::vector GetTransitionDensities(World& world, - const std::vector& orbitals, - const response_space& f); - - std::vector GetConjugateTransitionDensities(World& world, - const std::vector& orbitals, - const response_space& f); - // Creates the ground state hamiltonian for the orbitals in the active - // subspace (aka the orbitals in tda_act_orbitals) - Tensor CreateGroundHamiltonian(World& world, std::vector f, size_t print_level); - - // Sets the different k/thresh levels - template - void set_protocol(World& world, double thresh); - - // Verifies that correct order of polynomial is in use for all - void check_k(World& world, double thresh, size_t k); - - // Creates random guess functions semi-intelligently(?) - X_space create_random_guess(World& world, - size_t m, - size_t n, - vector_real_function_3d& grounds, - Molecule& molecule); - - // Creates random guess functions semi-intelligently(?) - std::vector create_random_guess(World& world, - size_t m, - std::vector& grounds, - Molecule& molecule); - - // Creates an initial guess using NWChem outputs from a ground state - // calculation Requires: - // 1. nwchem output file (named as "base_name.out") - // 2. nwchem movecs file (named as "base_name.movecs") - X_space create_nwchem_guess(World& world, size_t m); - - // Creates potentials using the ResponsePotential object - // Potentials are modified in place - - - // Solves the response equations for response states - void solve_excited_states(World& world); - - // Iterates the response functions until converged or out of iterations - - void iterate_freq2(World& world); - // Calculates polarizability according to - // alpha_ij(\omega) = -sum_{m occ} + - // - Tensor polarizability(); - void PrintPolarizabilityAnalysis(World& world, const Tensor polar_tensor); - - class plotCoords { - public: - coord_3d lo, hi; - - plotCoords() { - lo[0] = 0.0; - lo[1] = 0.0; - lo[2] = 0.0; - hi[0] = 0.0; - hi[1] = 0.0; - hi[2] = 0.0; - } - plotCoords(size_t direction, double Lp) { - lo[0] = 0.0; - lo[1] = 0.0; - lo[2] = 0.0; - - hi[0] = 0.0; - hi[1] = 0.0; - hi[2] = 0.0; - - lo[direction] = -Lp; - hi[direction] = Lp; - } - }; - plotCoords SetPlotCoord(size_t i, double Lp); - - void PlotGroundandResponseOrbitals(World& world, - size_t iteration, - response_space& x_response, - response_space& y_response, - ResponseParameters const& r_params, - GroundStateCalculation const& g_params); - void compute_and_print_polarizability(World& world, X_space& Chi, X_space& PQ, std::string message); - void plot_excited_states(World& world, - size_t iteration, - response_space& x_response, - response_space& y_response, - ResponseParameters const& r_params, - GroundStateCalculation const& g_params); - // Solves the response equations for the polarizability - void solve_response_states(World& world); - vecfuncT project_ao_basis(World& world, const AtomicBasisSet& aobasis); - - vecfuncT project_ao_basis_only(World& world, const AtomicBasisSet& aobasis, const Molecule& molecule); - void analyze_vectors(World& world, const vecfuncT& x, std::string response_state); - void output_json() const; - void initialize_excited_json(); - static void excited_to_json(nlohmann::json& json, - size_t iter, - const Tensor& tensor, - const Tensor& tensor1, - const Tensor& tensor2, - const Tensor& tensor3); - static void frequency_to_json(nlohmann::json& json, - size_t iter, - const Tensor& tensor, - const Tensor& tensor1, - const Tensor& tensor2, - const Tensor& tensor3); - vecfuncT make_density(World& world); -}; -#endif // SRC_APPS_MOLRESPONSE_TDDFT_H_ - -// Deuces diff --git a/src/apps/molresponse/Theta_X.cc b/src/apps/molresponse/Theta_X.cc deleted file mode 100644 index a5c2e856c54..00000000000 --- a/src/apps/molresponse/Theta_X.cc +++ /dev/null @@ -1,103 +0,0 @@ - - -#include - - -#include - -#include "../chem/SCFOperators.h" -#include "../chem/molecule.h" -#include "../chem/xcfunctional.h" -#include "molresponse/TDDFT.h" - -#include "molresponse/response_functions.h" -#include "molresponse/response_parameters.h" - -#include "molresponse/x_space.h" -using json = nlohmann::json; - - -X_space TDDFT::Compute_Theta_X(World& world, X_space& Chi, XCOperator xc, std::string calc_type) { - bool compute_Y = calc_type.compare("full") == 0; - X_space Theta_X = X_space(world, Chi.num_states(), Chi.num_orbitals()); - // compute - X_space V0X = compute_V0X(world, Chi, xc, compute_Y); - - V0X.truncate(); - if (r_params.print_level() >= 20) { - print("---------------Theta ----------------"); - print(""); - print(inner(Chi, V0X)); - } - - X_space E0X(world, Chi.num_states(), Chi.num_orbitals()); - if (r_params.localize().compare("canon") == 0) { - E0X = Chi.copy(); - E0X.truncate(); - E0X.X = E0X.X * ham_no_diag; - if (compute_Y) { - E0X.Y = E0X.Y * ham_no_diag; - } - - E0X.truncate(); - } - - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi, E0X)); - } - - X_space gamma; - // compute - if (calc_type.compare("full") == 0) { - gamma = compute_gamma_full(world, Chi, xc); - } else if (calc_type.compare("static") == 0) { - gamma = compute_gamma_static(world, Chi, xc); - } else { - gamma = compute_gamma_tda(world, Chi, xc); - } - - Theta_X = (V0X - E0X) + gamma; - Theta_X.truncate(); - - if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi, Theta_X)); - } - - return Theta_X; -} -void TDDFT::output_json() const { - std::ofstream ofs("response.json"); - ofs << j_molresponse; -} -void TDDFT::excited_to_json(json& j_mol_in, - size_t iter, - const Tensor& res_X, - const Tensor& res_Y, - const Tensor& density_res, - const Tensor& omega) { - json j = {}; - j["iter"] = iter; - j["res_X"] = tensor_to_json(res_X); - j["res_Y"] = tensor_to_json(res_Y); - j["density_residuals"] = tensor_to_json(density_res); - j["omega"] = tensor_to_json(omega); - auto index = j_mol_in["protocol_data"].size() - 1; - j_mol_in["protocol_data"][index]["iter_data"].push_back(j); -} -void TDDFT::frequency_to_json(json& j_mol_in, - size_t iter, - const Tensor& res_X, - const Tensor& res_Y, - const Tensor& density_res, - const Tensor& omega) { - json j = {}; - j["iter"] = iter; - j["res_X"] = tensor_to_json(res_X); - j["res_Y"] = tensor_to_json(res_Y); - j["density_residuals"] = tensor_to_json(density_res); - j["polar"] = tensor_to_json(omega); - auto index = j_mol_in["protocol_data"].size() - 1; - j_mol_in["protocol_data"][index]["iter_data"].push_back(j); -} diff --git a/src/apps/molresponse/basic_operators.cc b/src/apps/molresponse/basic_operators.cc index 68dfea263eb..2a906295701 100644 --- a/src/apps/molresponse/basic_operators.cc +++ b/src/apps/molresponse/basic_operators.cc @@ -6,85 +6,90 @@ namespace madness { -// Returns a shallow copy of the transpose of a vector of vector of functions -response_space transpose(response_space &f) { - MADNESS_ASSERT(f.size() > 0); - MADNESS_ASSERT(f[0].size() > 0); - - // Get sizes - size_t m = f.size(); - size_t n = f[0].size(); - - // Return container - response_space g(f[0][0].world(), m, n); - - // Now do shallow copies - for (size_t i = 0; i < m; i++) - for (size_t j = 0; j < n; j++) g[j][i] = f[i][j]; - - // Done - return g; -} - -// Truncate a vector of vector of functions -void truncate(World &world, response_space &v, double tol, bool fence) { - MADNESS_ASSERT(v.size() > 0); - MADNESS_ASSERT(v[0].size() > 0); - - for (unsigned int i = 0; i < v.size(); i++) { - truncate(world, v[i], tol, fence); - } -} - -// Apply a vector of vector of operators to a vector of vector of functions -// g[i][j] = op[i][j](f[i][j]) -response_space apply(World &world, - std::vector>> &op, - response_space &f) { - MADNESS_ASSERT(f.size() > 0); - MADNESS_ASSERT(f.size() == op.size()); - MADNESS_ASSERT(f[0].size() == op[0].size()); - - response_space result(f[0][0].world(), f.size(), f[0].size()); - - for (unsigned int i = 0; i < f.size(); i++) { - // Using vmra.h function, line 889 - result[i] = apply(world, op[i], f[i]); - } - - return result; -} -// Apply a vector of operators to a set of response states -// -response_space apply(World &world, std::vector> &op, response_space &f) { - MADNESS_ASSERT(f.size() > 0); - MADNESS_ASSERT(f[0].size() == op.size()); - - response_space result(f[0][0].world(), f.size(), f[0].size()); - - for (unsigned int i = 0; i < f.size(); i++) { - // Using vmra.h function, line 889 - /// Applies a vector of operators to a vector of functions --- q[i] = - /// apply(op[i],f[i]) - result[i] = apply(world, op, f[i]); - } - - return result; -} - -// Apply the derivative operator to a vector of vector of functions -response_space apply(World &world, real_derivative_3d &op, response_space &f) { - MADNESS_ASSERT(f.size() > 0); - - response_space result; - - for (unsigned int i = 0; i < f.size(); i++) { - std::vector temp = apply(world, op, f[i]); - result.push_back(temp); - } - - return result; -} -} // namespace madness + // Returns a shallow copy of the transpose of a vector of vector of functions + response_space transpose(response_space &f) { + MADNESS_ASSERT(f.size() > 0); + MADNESS_ASSERT(f[0].size() > 0); + + // Get sizes + size_t m = f.size(); + size_t n = f[0].size(); + + // Return container + response_space g(f[0][0].world(), m, n); + + // Now do shallow copies + for (size_t i = 0; i < m; i++) + for (size_t j = 0; j < n; j++) g[j][i] = f[i][j]; + + // Done + return g; + } + + // Truncate a vector of vector of functions + void truncate(World &world, response_space &v, double tol, bool fence) { + MADNESS_ASSERT(v.size() > 0); + MADNESS_ASSERT(v[0].size() > 0); + + for (unsigned int i = 0; i < v.size(); i++) { + truncate(world, v[i], tol, fence); + } + } + + // Apply a vector of vector of operators to a vector of vector of functions + // g[i][j] = op[i][j](f[i][j]) + response_space apply(World &world, + std::vector>> &op, + response_space &f) { + MADNESS_ASSERT(f.size() > 0); + MADNESS_ASSERT(f.size() == op.size()); + MADNESS_ASSERT(f[0].size() == op[0].size()); + + response_space result(f[0][0].world(), f.size(), f[0].size()); + + for (unsigned int i = 0; i < f.size(); i++) { + // Using vmra.h function, line 889 + result[i] = apply(world, op[i], f[i]); + } + + return result; + } + // Apply a vector of operators to a set of response states + // + response_space apply(World &world, std::vector> &op, response_space &f) { + MADNESS_ASSERT(f.size() > 0); + MADNESS_ASSERT(f[0].size() == op.size()); + + response_space result(f[0][0].world(), f.size(), f[0].size()); + + transform(f.begin(), f.end(), result.begin(), [&](const auto &fi) { return apply(world, op, fi); }); + + world.gop.fence(); + /* + for (unsigned int i = 0; i < f.size(); i++) { + // Using vmra.h function, line 889 + /// Applies a vector of operators to a vector of functions --- q[i] = + /// apply(op[i],f[i]) + result[i] = apply(world, op, f[i]); + } + */ + + return result; + } + + // Apply the derivative operator to a vector of vector of functions + response_space apply(World &world, real_derivative_3d &op, response_space &f) { + MADNESS_ASSERT(f.size() > 0); + + response_space result; + + for (unsigned int i = 0; i < f.size(); i++) { + std::vector temp = apply(world, op, f[i]); + result.push_back(temp); + } + + return result; + } +}// namespace madness // Deuces diff --git a/src/apps/molresponse/density.cc b/src/apps/molresponse/density.cc deleted file mode 100644 index 6d636994831..00000000000 --- a/src/apps/molresponse/density.cc +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2021 Adrian Hurtado -#include "molresponse/density.h" - -#include -#include -#include -#include - -#include "../../madness/mra/funcplot.h" -#include "TDDFT.h" -#include "molresponse/global_functions.h" -#include "molresponse/ground_parameters.h" -#include "molresponse/property.h" -#include "molresponse/response_functions.h" -#include "molresponse/response_parameters.h" - -typedef Tensor TensorT; -typedef Function FunctionT; -typedef std::shared_ptr> FunctorT; -typedef FunctionFactory FactoryT; -typedef std::vector VectorFunction3DT; - -density_vector::density_vector(World &world, ResponseParameters &other_rparams, - GroundStateCalculation &other_gparams) - : num_states(other_rparams.num_states()), - num_orbitals(other_rparams.num_orbitals()), - property(), - r_params(other_rparams), // should be a copy - g_params(other_gparams), - Chi(world, num_states, num_orbitals), - PQ(world, num_states, num_orbitals), - orbitals(copy(world, other_gparams.orbitals())), - molecule(other_gparams.molecule()) { - - if (r_params.excited_state()) { - this->omega = Tensor(r_params.num_states()); - } else { - this->omega = Tensor(1); - this->omega(0, 0) = r_params.omega(); - } -} - -// right now everything uses copy - -ResponseParameters density_vector::GetResponseParameters() { return r_params; } - -density_vector set_density_type(World &world, ResponseParameters & R, GroundStateCalculation & G) { - if (R.excited_state()) { - return excited_state_density_vector(world, R, G); - } else if (R.dipole()) - return dipole_density_vector(world, R, G); - else if (R.nuclear()) { - return nuclear_density_vector(world, R, G); - } else if (R.second_order()) { - MADNESS_EXCEPTION("not implemented yet", 0); - return density_vector(world, R, G); - } else if (R.third_order()) { - MADNESS_EXCEPTION("not implemented yet", 0); - return density_vector(world, R, G); - - } else { - MADNESS_EXCEPTION("what is this????", 0); - return density_vector(world, R, G); - } -}; diff --git a/src/apps/molresponse/density.h b/src/apps/molresponse/density.h deleted file mode 100644 index 7a383aadc66..00000000000 --- a/src/apps/molresponse/density.h +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef SRC_APPS_molresponse_DENSITY_H_ -#define SRC_APPS_molresponse_DENSITY_H_ - -#include -#include - -#include -#include -#include -#include - -#include "CalculationParameters.h" -#include "molresponse/ground_parameters.h" -#include "molresponse/property.h" -#include "molresponse/response_parameters.h" -#include "timers.h" -#include "xcfunctional.h" - -typedef Tensor TensorT; -typedef Function FunctionT; -typedef std::shared_ptr> FunctorT; -typedef FunctionFactory FactoryT; -typedef std::vector VectorFunction3DT; - - -// operator used to create it. -// homogeneous sol----x and y functions. -// particular sol --- depends on lower order functions used to create it. -// it also needs a xc functional -// The r_params and Gparmas used to create the density. -// -class density_vector { - protected: - // operator used create first order density - Tensor omega; // frequency or frequencies - const size_t num_states; // number of response states - const size_t num_orbitals; // number of ground state orbitals - const std::string property; // excited state, nuclear,dipole - - const ResponseParameters r_params; // Response Parameters - const GroundStateCalculation g_params; - - PropertyBase property_operator; // dipole, nuclear, or none - X_space Chi; - X_space PQ; - VectorFunction3DT orbitals; - - // first order frequency response densities - VectorFunction3DT rho_omega; // the response density vector - Molecule molecule; - - public: - friend class TDDFT; - // Collective constructor - density_vector(World& world, ResponseParameters& other_rparams, - GroundStateCalculation& other_gparams); - density_vector(const density_vector& other) = default; - - ResponseParameters GetResponseParameters(); -}; - -class dipole_density_vector : public density_vector { - public: - dipole_density_vector(World& world, ResponseParameters R, GroundStateCalculation G) - : density_vector(world, R, G) {} -}; - -class nuclear_density_vector : public density_vector { - public: - nuclear_density_vector(World& world, ResponseParameters R, GroundStateCalculation G) - : density_vector(world, R, G) {} -}; - -class excited_state_density_vector : public density_vector { - public: - excited_state_density_vector(World& world, ResponseParameters R, GroundStateCalculation G) - : density_vector(world, R, G) {} -}; - -density_vector set_density_type(World& world, ResponseParameters & R, GroundStateCalculation& G); -// The TDDFT constructor initializes the preliminary calculation details including -// the Chi vectors and the PQ vectors if they are required -// ground orbitals -// molecule -// We also intialize the molresponse.json file -#endif // SRC_APPS_molresponse_DENSITY_H_ diff --git a/src/apps/molresponse/densityVector.cpp b/src/apps/molresponse/densityVector.cpp deleted file mode 100644 index 45a21462544..00000000000 --- a/src/apps/molresponse/densityVector.cpp +++ /dev/null @@ -1,542 +0,0 @@ -// -// Created by adrianhurtado on 1/24/22. -// - -#include "densityVector.hpp" -#include "../timer.h" - -namespace madness{ - -} - -response_space FrequencySolver::PropertyRHS(World &world, PropertyBase &p) const { - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - } - response_space rhs(world, p.num_operators, r_params.num_orbitals()); - - reconstruct(world, ground_orbitals); - QProjector Qhat(world, ground_orbitals); - // Set the dipoles (ground orbitals are probably - // more accurate now, so recalc the dipoles) - // why is it called dipole guess. - // This is just orbitals times dipole operator - std::vector orbitals = ground_orbitals; - - print("num operators ", p.num_operators); - for (size_t i = 0; i < p.num_operators; i++) { - // question here....MolecularDerivativeFunctor takes derivative with - // respect to axis atom and axis - // here we save - // need to project - - rhs[i] = mul(world, p.operator_vector.at(i), ground_orbitals, r_params.lo()); - - truncate(world, rhs[i]); - // rhs[i].truncate_vec(); - - // project rhs vectors for state - rhs[i] = Qhat(rhs[i]); - // truncate(world, rhs[i], true); - for (size_t j = 0; j < orbitals.size(); j++) { - print("RHS norm for after orbital ", j, "Response state ", i, ": ", rhs[i][j].norm2()); - } - - world.gop.fence(); - // core projector contribution - } - - // if (world.rank() ==dipole 0) print("derivatives:\n", r, ru, rc, ra); - molresponse::end_timer(world, "rhs vectors"); - return rhs; -} -void FrequencySolver::compute(World &world, FrequencyVector& rho) { - molresponse::start_timer(world); - if (r_params.plot_initial()) { - if (world.rank() == 0) print("\n Plotting ground state densities.\n"); - if (r_params.plot_l() > 0.0) - do_vtk_plots(world, - r_params.plot_pts(), - r_params.plot_l(), - 0, - r_params.num_orbitals(), - molecule, - square(world, ground_orbitals), - "ground"); - else - do_vtk_plots(world, - r_params.plot_pts(), - r_params.L() / 2.0, - 0, - r_params.num_orbitals(), - molecule, - square(world, ground_orbitals), - "ground"); - } - // Warm and fuzzy - if (world.rank() == 0) { - print("\n\n Response Calculation"); - print(" ------------------------"); - } - auto protocols=r_params.protocol(); - print(protocols); - for (unsigned int proto = 0; proto < protocols.size(); proto++) { - // Set defaults inside here - // default value of - auto thresh=protocols[proto]; - print(thresh); - set_protocol(world,thresh); - - check_k(world, thresh, FunctionDefaults<3>::get_k()); - // Do something to ensure all functions have same k value - j_molresponse["protocol_data"].push_back({}); - j_molresponse["protocol_data"][proto]["proto"] = thresh;//r_params.protocol()[proto]; - j_molresponse["protocol_data"][proto]["iter_data"]={}; - - if (r_params.dipole()) { - if (world.rank() == 0) print("creating dipole property operator"); - p = DipoleVector(world); - } else if (r_params.nuclear()) { - if (world.rank() == 0) print("creating nuclear property operator"); - p = NuclearVector(world, molecule); - } - if (proto == 0) { - if (r_params.restart()) { - if (world.rank() == 0) print(" Initial guess from file:", r_params.restart_file()); - load(world, r_params.restart_file()); - check_k(world, thresh, FunctionDefaults<3>::get_k()); - - if (r_params.dipole()) { - // set states - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - print("P: ", PQ.X.norm2()); - print("Q: ", PQ.Y.norm2()); - - // set RHS_Vector - } else if (r_params.nuclear()) { - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - - } else if (r_params.order2()) { - // - } else if (r_params.order3()) { - // - } else { - MADNESS_EXCEPTION("not a valid response state ", 0); - } - } else { // Dipole guesses - - if (r_params.dipole()) { - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - // set states - // - print("okay this is not a good idea if it comes up more than once"); - // set RHS_Vector - } else if (r_params.nuclear()) { - PQ.X = PropertyRHS(world, p); - PQ.Y = PQ.X.copy(); - } else if (r_params.order2()) { - // - } else if (r_params.order3()) { - // - } else { - MADNESS_EXCEPTION("not a valid response state ", 0); - } - } - } - // - // Here i should print some information about the calculation we are - // about to do - print("Pre iteration Information"); - print("Number of Response States: ", r_params.num_states()); - print("Number of Ground States: ", r_params.num_orbitals()); - print("k = ", FunctionDefaults<3>::get_k()); - print("protocol threshold = ", FunctionDefaults<3>::get_k()); - - print("Property rhs func k = ", PQ.X[0][0].k()); - print("Property func k thresh= ", PQ.X[0][0].thresh()); - - print("Property rhs func Q k = ", PQ.Y[0][0].k()); - print("Property func Q k thresh = ", PQ.Y[0][0].thresh()); - - print("Property rhs func P norms", PQ.X.norm2()); - print("Property rhs func Q norms", PQ.Y.norm2()); - - if (proto > 0) { - r_params.set_derived_value("first_run", false); - } - // Now actually ready to iterate... - // iterate_freq(world); - iterate(world); - // IterateFrequencyResponse(world, P, Q); - } // end for --finished reponse density - - // Plot the response function if desired - if (r_params.plot()) { - // Need to get densities first - std::vector densities = make_density(world); - - // For the instance where we don't plot all the orbitals - std::vector plot_densities; - for (size_t i : r_params.plot_data()) { - plot_densities.push_back(densities[i]); - } - - // Now plot - if (world.rank() == 0) print("\n Plotting response state densities.\n"); - if (r_params.plot_l() > 0.0) - do_vtk_plots(world, - r_params.plot_pts(), - r_params.plot_l(), - 0, - r_params.plot_data().size(), - molecule, - plot_densities, - "response-state"); - else - do_vtk_plots(world, - r_params.plot_pts(), - r_params.L(), - 0, - r_params.plot_data().size(), - molecule, - plot_densities, - "response-state"); - } - - std::cout.precision(2); - std::cout << std::fixed; - // Get start time - molresponse::end_timer(world, "total:"); -} // end compute frequency response - -void FrequencySolver::iterate(World& world) { - size_t iter; - // Variables needed to iterate - QProjector projector(world, ground_orbitals); - size_t m = r_params.num_states(); // Number of excited states - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - - real_function_3d v_xc; // For TDDFT - bool converged = false; // Converged flag - const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - // m residuals for x and y - Tensor bsh_residualsX(m); - Tensor bsh_residualsY(m); - Tensor density_residuals(m); - - vecfuncT rho_omega_old(m); - - // initialize DFT XC functional operator - XCOperator xc = make_xc_operator(world); - - // create X space residuals - X_space residuals(world, m, n); - X_space old_Chi(world, m, n); - // Create the X space - // vector of Xvectors - std::vector Xvector; - std::vector Xresidual; - for (size_t b = 0; b < m; b++) { - Xvector.emplace_back(Chi, b); - Xresidual.emplace_back(residuals, b); - } - // If DFT, initialize the XCOperator - - // create a std vector of XNONLinearsolvers - NonLinearXsolver kain_x_space; - for (size_t b = 0; b < m; b++) { - kain_x_space.push_back( - XNonlinearSolver(X_space_allocator(world, n), true)); - } - // if kain set the max sub of each of the solvers - if (r_params.kain()){ - for (auto& solver:kain_x_space){ - solver.set_maxsub(r_params.maxsub()); - } - } - // - double omega_n = r_params.omega(); - omega_n = abs(omega_n); - omega[0] = omega_n; - // We compute with positive frequencies - print("Warning input frequency is assumed to be positive"); - print("Computing at positive frequency omega = ", omega_n); - double x_shifts = 0.0; - double y_shifts = 0.0; - // if less negative orbital energy + frequency is positive or greater than 0 - if ((ground_energies[n - 1] + omega_n) >= 0.0) { - // Calculate minimum shift needed such that \eps + \omega + shift < 0 - print("*** we are shifting just so you know!!!"); - x_shifts = -.05 - (omega_n + ground_energies[n - 1]); - } - std::vector bsh_x_ops = make_bsh_operators_response(world, x_shifts, omega_n); - std::vector bsh_y_ops; - - bool static_res = (omega_n == 0.0); - bool compute_y = not static_res; - // Negate omega to make this next set of BSH operators \eps - omega - if (compute_y) { - omega_n = -omega_n; - bsh_y_ops = make_bsh_operators_response(world, y_shifts, omega_n); - omega_n = -omega_n; - } - - Tensor maxrotn(m); - maxrotn.fill(dconv * 100); - - for (iter = 0; iter <= r_params.maxiter(); ++iter) { - // Basic output - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - if (world.rank() == 0) printf("\n Iteration %d at time %.1fs\n", static_cast(iter), wall_time()); - if (world.rank() == 0) print("-------------------------------------------"); - } - if (r_params.print_level() >= 1) { - if (world.rank() == 0) { - print("Chi.x norms at start of iteration: ", iter); - print(Chi.X.norm2()); - print("Chi.y norms at start of iteration ", iter); - print(Chi.Y.norm2()); - } - } - - old_Chi = Chi.copy(); - rho_omega_old = rho_omega; - // compute rho_omega - rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.Y); - // rho_omega = make_density(world, Chi, compute_y); - - if (iter < 2 || (iter % 10) == 0) { - load_balance(world); - } - - // compute density residuals - if (iter > 0) { - density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); - // Take the max between this an a minimum maxrotn step - maxrotn = (bsh_residualsX + bsh_residualsY) / 4; - print("maxrotn", maxrotn); - for (size_t i = 0; i < Chi.num_states(); i++) { - if (maxrotn[i] < r_params.maxrotn()) { - maxrotn[i] = r_params.maxrotn(); - print("less than maxrotn....set to maxrotn"); - } - } - if (world.rank() == 0 and (r_params.print_level() > 1)) { - print("Density residuals"); - print(density_residuals); - print("BSH residuals"); - print("x", bsh_residualsX); - print("y", bsh_residualsY); - print("maxrotn", maxrotn); - } - } - - if (iter > 0) { - if (density_residuals.max() > 2) { - break; - } - double d_residual = density_residuals.max(); - double d_conv = dconv * std::max(size_t(5), molecule.natom()); - // Test convergence and set to true - if ((d_residual < d_conv) and - ((std::max(bsh_residualsX.absmax(), bsh_residualsY.absmax()) < d_conv * 5.0) or - r_params.get("conv_only_dens"))) { - converged = true; - } - - if (converged || iter == r_params.maxiter() - 1) { - // if converged print converged - if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { - print("\nConverged!\n"); - } - - if (r_params.save()) { - molresponse::start_timer(world); - save(world, r_params.save_file()); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Save:"); - } - // Basic output - if (r_params.print_level() >= 1) molresponse::end_timer(world, " This iteration:"); - // plot orbitals - if (r_params.plot_all_orbitals()) { - PlotGroundandResponseOrbitals(world, iter, Chi.X, Chi.Y, r_params, ground_calc); - } - ground_density = make_ground_density(world); - if (r_params.plot()) { - do_vtk_plots(world, 200, r_params.L(), molecule, ground_density, rho_omega, ground_orbitals, Chi); - } - break; - } - } - update_x_space_response(world, - Chi, - residuals, - xc, - bsh_x_ops, - bsh_y_ops, - projector, - x_shifts, - omega_n, - kain_x_space, - Xvector, - Xresidual, - bsh_residualsX, - bsh_residualsY, - iter, - maxrotn); - - Tensor polar = -2 * inner(Chi, PQ); - - frequency_to_json(j_molresponse, iter, bsh_residualsX, bsh_residualsY, density_residuals, polar); - } - - if (world.rank() == 0) print("\n"); - if (world.rank() == 0) print(" Finished Response Calculation "); - if (world.rank() == 0) print(" ------------------------"); - if (world.rank() == 0) print("\n"); - - // Did we converge? - if (iter == r_params.maxiter() && not converged) { - if (world.rank() == 0) print(" Failed to converge. Reason:"); - if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); - if (world.rank() == 0) print(" Running analysis on current values.\n"); - } - if (world.rank() == 0) { - print(" Final energy residuals X:"); - print(bsh_residualsX); - print(" Final energy residuals Y:"); - print(bsh_residualsY); - print(" Final density residuals:"); - print(density_residuals); - compute_and_print_polarizability(world, "Converged"); - } -} - -void FrequencySolver::compute_and_print_polarizability(World &world, std::string message) { - Tensor G = -2 * inner(Chi, PQ); - if (world.rank() == 0) { - print("Polarizability", message); - print(G); - } -} -void FrequencySolver::frequency_to_json(json& j_mol_in, - size_t iter, - const Tensor& res_X, - const Tensor& res_Y, - const Tensor& density_res, - const Tensor& omega) { - json j = {}; - j["iter"] = iter; - j["res_X"] = tensor_to_json(res_X); - j["res_Y"] = tensor_to_json(res_Y); - j["density_residuals"] = tensor_to_json(density_res); - j["polar"] = tensor_to_json(omega); - auto index = j_mol_in["protocol_data"].size() - 1; - j_mol_in["protocol_data"][index]["iter_data"].push_back(j); -} -void FrequencySolver::update_x_space_response(World &world, - X_space &Chi, - X_space &res, - XCOperator &xc, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, - QProjector &projector, - double &x_shifts, - double &omega_n, - NonLinearXsolver &kain_x_space, - std::vector Xvector, - std::vector Xresidual, - Tensor &bsh_residualsX, - Tensor &bsh_residualsY, - size_t iteration, - Tensor &maxrotn) { - size_t m = Chi.num_states(); - bool compute_y = r_params.omega() != 0.0; - // size_t n = Chi.num_orbitals(); - - Tensor errX(m); - Tensor errY(m); - - X_space theta_X = Compute_Theta_X(world, Chi, xc, r_params.calc_type()); - // compute residual X_space - print("BSH update iter = ", iteration); - - X_space temp = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - - res = compute_residual(world, Chi, temp, bsh_residualsX, bsh_residualsY, r_params.calc_type()); - - // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 0)) { - temp = kain_x_space_update(world, Chi, res, kain_x_space, Xvector, Xresidual); - } - - if (iteration > 0) { - x_space_step_restriction(world, Chi, temp, compute_y, maxrotn); - } - // truncate x - temp.X.truncate_rf(); - // truncate y if compute y - if (compute_y) temp.Y.truncate_rf(); - // if not compute y then copy x in to y - if (!compute_y) temp.Y = temp.X.copy(); - Chi = temp.copy(); - // print x norms -} -X_space FrequencySolver::bsh_update_response(World &world, - X_space &theta_X, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, - QProjector &projector, - double &x_shifts) { - size_t m = theta_X.X.size(); - size_t n = theta_X.X.size_orbitals(); - bool compute_y = r_params.omega() != 0.0; - - molresponse::start_timer(world); - - theta_X.X += Chi.X * x_shifts; - theta_X.X += PQ.X; - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - - if (compute_y) { - theta_X.Y += PQ.Y; - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); - } - molresponse::end_timer(world, "Compute residual stuff theta_X"); - - // apply bsh - molresponse::start_timer(world); - X_space bsh_X(world, m, n); - - bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) { - bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - } - molresponse::end_timer(world, "Apply BSH to theta_X"); - - molresponse::start_timer(world); - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); - - if (compute_y) { - for (size_t i = 0; i < m; i++) { - bsh_X.Y[i] = projector(bsh_X.Y[i]); - } - bsh_X.truncate(); - } else { - bsh_X.X.truncate_rf(); - bsh_X.Y = bsh_X.X.copy(); - } - molresponse::end_timer(world, "Project and truncate BSH_X"); - - return bsh_X; -} - - - diff --git a/src/apps/molresponse/densityVector.hpp b/src/apps/molresponse/densityVector.hpp deleted file mode 100644 index 9003a2dec45..00000000000 --- a/src/apps/molresponse/densityVector.hpp +++ /dev/null @@ -1,80 +0,0 @@ -// -// Created by adrianhurtado on 1/24/22. -// - -#ifndef MADNESS_DENSITYVECTOR_HPP -#define MADNESS_DENSITYVECTOR_HPP -#include "molresponse/global_functions.h" -#include "property.h" - -#include "mra.h" -#include "ResponseBase.hpp" - -class DensityVector { - public: - DensityVector() = default; - virtual void compute(World& world) = 0; - virtual ~DensityVector() = default; -}; - -class FrequencyVector; - -class FrequencySolver : public ResponseBase { - public: - virtual ~FrequencySolver() = default; - void compute(World&world,FrequencyVector& density); - private: - PropertyBase p; // for frequency calculations - X_space PQ; - Tensor omega; - response_space PropertyRHS(World& world, PropertyBase& p) const; - void iterate(World& world); - void compute_and_print_polarizability(World& world, std::string message); - void frequency_to_json(json& j_mol_in, - size_t iter, - const Tensor& res_X, - const Tensor& res_Y, - const Tensor& density_res, - const Tensor& omega); - void update_x_space_response(World& world, - X_space& Chi, - X_space& res, - XCOperator& xc, - vector& bsh_x_ops, - vector& bsh_y_ops, - QProjector& projector, - double& x_shifts, - double& omega_n, - NonLinearXsolver& kain_x_space, - vector Xvector, - vector Xresidual, - Tensor& bsh_residualsX, - Tensor& bsh_residualsY, - size_t iteration, - Tensor& maxrotn); - X_space bsh_update_response(World& world, - X_space& theta_X, - vector& bsh_x_ops, - vector& bsh_y_ops, - QProjector& projector, - double& x_shifts); -}; - - -class FrequencyVector : public DensityVector { - public: - FrequencyVector(World& world, std::unique_ptr calc) : computing(std::move(calc)) {} - - protected: - std::unique_ptr computing; - private: - X_space PQ; - Tensor omega; -}; - - - - - - -#endif // MADNESS_DENSITYVECTOR_HPP diff --git a/src/apps/molresponse/iter_freq2.cc b/src/apps/molresponse/iter_freq2.cc deleted file mode 100644 index 28bbca2b984..00000000000 --- a/src/apps/molresponse/iter_freq2.cc +++ /dev/null @@ -1,243 +0,0 @@ - -// Copyright 2021 Adrian Hurtado -#include - -#include -#include -#include -#include -#include - -#include "../chem/NWChem.h" // For nwchem interface -#include "../chem/SCFOperators.h" -#include "../chem/molecule.h" -#include "Plot_VTK.h" -#include "TDDFT.h" -#include "madness/tensor/tensor_json.hpp" -#include "chem/potentialmanager.h" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) -#include "madness/mra/funcdefaults.h" -#include "molresponse/basic_operators.h" -#include "molresponse/density.h" -#include "molresponse/global_functions.h" -#include "molresponse/property.h" -#include "molresponse/response_functions.h" -#include "molresponse/timer.h" - -using json = nlohmann::json; - -json freq_iteration_to_json(int iter, - const Tensor& bsh_residualsX, - const Tensor& bsh_residualsY, - const Tensor& density_residuals, - const Tensor& polar) { - json j_iter = {}; - j_iter["iter"] = iter; - j_iter["bsh_residualsX"] = tensor_to_json(bsh_residualsX); - j_iter["bsh_residualsY"] = tensor_to_json(bsh_residualsY); - j_iter["density_residuals"] = tensor_to_json(density_residuals); - j_iter["polarizability"] = tensor_to_json(polar); - return j_iter; -} - -// Iterate Frequency Response -void TDDFT::iterate_freq2(World& world) { - size_t iter; - // Variables needed to iterate - QProjector projector(world, ground_orbitals); - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - size_t m = r_params.num_states(); // Number of excited states - - real_function_3d v_xc; // For TDDFT - bool converged = false; // Converged flag - const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - // m residuals for x and y - Tensor bsh_residualsX(m); - Tensor bsh_residualsY(m); - Tensor density_residuals(m); - - vecfuncT rho_omega_old(m); - - // initialize DFT XC functional operator - XCOperator xc = create_XCOperator(world, ground_orbitals, r_params.xc()); - - // create X space residuals - X_space residuals(world, m, n); - X_space old_Chi(world, m, n); - // Create the X space - // vector of Xvectors - std::vector Xvector; - std::vector Xresidual; - for (size_t b = 0; b < m; b++) { - Xvector.push_back(X_vector(Chi, b)); - Xresidual.push_back(X_vector(residuals, b)); - } - // If DFT, initialize the XCOperator - - // create a std vector of XNONLinearsolvers - NonLinearXsolver kain_x_space; - for (size_t b = 0; b < m; b++) { - kain_x_space.push_back( - XNonlinearSolver(X_space_allocator(world, n), true)); - } - for (size_t b = 0; b < m; b++) { - if (r_params.kain()) kain_x_space[b].set_maxsub(r_params.maxsub()); - } - // - double omega_n = r_params.omega(); - omega_n = abs(omega_n); - omega[0] = omega_n; - // We compute with positive frequencies - print("Warning input frequency is assumed to be positive"); - print("Computing at positive frequency omega = ", omega_n); - double x_shifts = 0.0; - double y_shifts = 0.0; - // if less negative orbital energy + frequency is positive or greater than 0 - if ((ground_energies[n - 1] + omega_n) >= 0.0) { - // Calculate minimum shift needed such that \eps + \omega + shift < 0 - print("*** we are shifting just so you know!!!"); - x_shifts = -.05 - (omega_n + ground_energies[n - 1]); - } - std::vector bsh_x_ops = make_bsh_operators_response(world, x_shifts, omega_n); - std::vector bsh_y_ops; - - bool static_res = (omega_n == 0.0); - bool compute_y = not static_res; - // Negate omega to make this next set of BSH operators \eps - omega - if (compute_y) { - omega_n = -omega_n; - bsh_y_ops = make_bsh_operators_response(world, y_shifts, omega_n); - omega_n = -omega_n; - } - - Tensor maxrotn(m); - maxrotn.fill(dconv * 100); - - for (iter = 0; iter <= r_params.maxiter(); ++iter) { - // Basic output - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - if (world.rank() == 0) printf("\n Iteration %d at time %.1fs\n", static_cast(iter), wall_time()); - if (world.rank() == 0) print("-------------------------------------------"); - } - if (r_params.print_level() >= 1) { - if (world.rank() == 0) { - print("Chi.x norms at start of iteration: ", iter); - print(Chi.X.norm2()); - print("Chi.y norms at start of iteration ", iter); - print(Chi.Y.norm2()); - } - } - - old_Chi = Chi.copy(); - rho_omega_old = rho_omega; - // compute rho_omega - rho_omega = transition_density(world, ground_orbitals, Chi.X, Chi.Y); - // rho_omega = make_density(world, Chi, compute_y); - - if (iter < 2 || (iter % 10) == 0) { - load_balance(world, rho_omega, Chi, old_Chi); - } - - // compute density residuals - if (iter > 0) { - density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); - // Take the max between this an a minimum maxrotn step - maxrotn = (bsh_residualsX + bsh_residualsY) / 4; - print("maxrotn", maxrotn); - for (size_t i = 0; i < Chi.num_states(); i++) { - if (maxrotn[i] < r_params.maxrotn()) { - maxrotn[i] = r_params.maxrotn(); - print("less than maxrotn....set to maxrotn"); - } - } - if (world.rank() == 0 and (r_params.print_level() > 1)) { - print("Density residuals"); - print(density_residuals); - print("BSH residuals"); - print("x", bsh_residualsX); - print("y", bsh_residualsY); - print("maxrotn", maxrotn); - } - } - - if (iter > 0) { - if (density_residuals.max() > 2) { - break; - } - double d_residual = density_residuals.max(); - double d_conv = dconv * std::max(size_t(5), molecule.natom()); - // Test convergence and set to true - if ((d_residual < d_conv) and - ((std::max(bsh_residualsX.absmax(), bsh_residualsY.absmax()) < d_conv * 5.0) or - r_params.get("conv_only_dens"))) { - converged = true; - } - - if (converged || iter == r_params.maxiter() - 1) { - // if converged print converged - if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { - print("\nConverged!\n"); - } - - if (r_params.save()) { - molresponse::start_timer(world); - save(world, r_params.save_file()); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Save:"); - } - // Basic output - if (r_params.print_level() >= 1) molresponse::end_timer(world, " This iteration:"); - // plot orbitals - if (r_params.plot_all_orbitals()) { - PlotGroundandResponseOrbitals(world, iter, Chi.X, Chi.Y, r_params, g_params); - } - rho0 = make_ground_density(world, ground_orbitals); - if (r_params.plot()) { - do_vtk_plots(world, 200, r_params.L(), molecule, rho0, rho_omega, ground_orbitals, Chi); - } - break; - } - } - update_x_space_response(world, - Chi, - residuals, - xc, - bsh_x_ops, - bsh_y_ops, - projector, - x_shifts, - omega_n, - kain_x_space, - Xvector, - Xresidual, - bsh_residualsX, - bsh_residualsY, - iter, - maxrotn); - - Tensor polar = -2 * inner(Chi, PQ); - - frequency_to_json(j_molresponse, iter, bsh_residualsX, bsh_residualsY, density_residuals, polar); - } - - if (world.rank() == 0) print("\n"); - if (world.rank() == 0) print(" Finished Response Calculation "); - if (world.rank() == 0) print(" ------------------------"); - if (world.rank() == 0) print("\n"); - - // Did we converge? - if (iter == r_params.maxiter() && not converged) { - if (world.rank() == 0) print(" Failed to converge. Reason:"); - if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); - if (world.rank() == 0) print(" Running analysis on current values.\n"); - } - if (world.rank() == 0) { - print(" Final energy residuals X:"); - print(bsh_residualsX); - print(" Final energy residuals Y:"); - print(bsh_residualsY); - print(" Final density residuals:"); - print(density_residuals); - compute_and_print_polarizability(world, Chi, PQ, "Converged"); - } -} diff --git a/src/apps/molresponse/iterate_excited.cc b/src/apps/molresponse/iterate_excited.cc deleted file mode 100644 index 157affb59d6..00000000000 --- a/src/apps/molresponse/iterate_excited.cc +++ /dev/null @@ -1,476 +0,0 @@ -// Copyright 2021 Adrian Hurtado -#include -#include -#include -#include -#include - -#include "../chem/SCFOperators.h" -#include "../chem/molecule.h" -#include "Plot_VTK.h" -#include "TDDFT.h" -#include "madness/tensor/tensor_json.hpp" -#include "madness/chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) -#include "madness/mra/funcdefaults.h" -#include "molresponse/response_functions.h" -#include "molresponse/timer.h" -#include "molresponse/x_space.h" - -nlohmann::json iteration_to_json(int iter, - const Tensor& bsh_residualsX, - const Tensor& bsh_residualsY, - const Tensor& density_residuals, - const Tensor& omega) { - nlohmann::json j_iter = {}; - j_iter["iter"] = iter; - j_iter["bsh_residualsX"] = tensor_to_json(bsh_residualsX); - j_iter["bsh_residualsY"] = tensor_to_json(bsh_residualsY); - j_iter["density_residuals"] = tensor_to_json(density_residuals); - j_iter["omega"] = tensor_to_json(omega); - return j_iter; -} - -void TDDFT::iterate_excited(World& world, X_space& Chi) { - size_t iter; - QProjector projector(world, ground_orbitals); - size_t m = r_params.num_states(); // Number of excited states - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - - const auto dconv = - std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - - Tensor maxrotn(m); - maxrotn.fill(dconv * 100); - - // m residuals for x and y - Tensor bsh_residualsX(m); - Tensor density_residuals(m); - Tensor bsh_residualsY(m); - // saved response densities - vecfuncT rho_omega_old(m); - // initialize DFT XC functional operator - XCOperator xc = - create_XCOperator(world, ground_orbitals, r_params.xc()); - - // create X space residuals - X_space residuals(world, m, n); - X_space old_Chi(world, m, n); - X_space old_Lambda_X(world, m, n); - - // Create the X space - bool converged = false; // Converged flag - // vector of Xvectors - std::vector Xvector; - std::vector Xresidual; - for (size_t b = 0; b < m; b++) { - Xvector.push_back(X_vector(Chi, b)); - Xresidual.push_back(X_vector(residuals, b)); - } - // If DFT, initialize the XCOperator - - NonLinearXsolver kain_x_space; - size_t nkain = m; // (r_params.omega() != 0.0) ? 2 * m : m; - for (size_t b = 0; b < nkain; b++) { - kain_x_space.push_back( - XNonlinearSolver( - X_space_allocator(world, n), false)); - if (r_params.kain()) kain_x_space[b].set_maxsub(r_params.maxsub()); - } - - response_space bsh_x_resp(world, m, n); // Holds wave function corrections - response_space bsh_y_resp(world, m, n); // Holds wave function corrections - - Tensor old_energy(m); // Holds previous iteration's energy - Tensor energy_residuals(m); // Holds energy residuals - // Holds the norms of y function residuals (for convergence) - Tensor x_norms(m); - Tensor y_norms(m); - - response_space x_differences(world, m, n); - response_space y_differences(world, m, n); - - response_space x_residuals(world, m, n); - response_space y_residuals(world, m, n); - - Tensor x_shifts; // Holds the shifted energy values - Tensor y_shifts; // Holds the shifted energy values - - Tensor S; // Overlap matrix of response components for x states - real_function_3d v_xc; // For TDDFT - Tensor old_A; - Tensor A; - Tensor old_S; - - // Now to iterate - for (iter = 0; iter < r_params.maxiter(); ++iter) { - // Start a timer for this iteration - // Basic output - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - if (world.rank() == 0) - printf("\n Iteration %d at time %.1fs\n", - static_cast(iter), - wall_time()); - if (world.rank() == 0) print(" -------------------------------"); - } - - if (r_params.print_level() >= 1) { - if (world.rank() == 0) { - print("Chi.x norms at start of iteration: ", iter); - print(Chi.X.norm2()); - print("Chi.y norms at start of iteration ", iter); - print(Chi.Y.norm2()); - } - } - print("Excited State Frequencies "); - print(omega); - - // rho_omega_old = make_density(world, old_Chi, r_params.calc_type()); - rho_omega_old = rho_omega; - // compute rho_omega - rho_omega = make_density(world, Chi, r_params.calc_type()); - - // Normalize after projection - - if (iter < 2 || (iter % 10) == 0) { - load_balance(world, rho_omega, Chi, old_Chi); - } - - // compute density residuals - if (iter > 0) { - density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); - maxrotn = (bsh_residualsX + bsh_residualsY) / 4; - for (size_t i = 0; i < Chi.num_states(); i++) { - if (maxrotn[i] < r_params.maxrotn()) { - maxrotn[i] = r_params.maxrotn(); - print("less than maxrotn....set to maxrotn"); - } - } - if (world.rank() == 0 and (r_params.print_level() > 2)) { - print("Density residuals"); - print("dres", density_residuals); - print("BSH residuals"); - print("xres", bsh_residualsX); - print("yres", bsh_residualsY); - print("maxrotn", maxrotn); - } - } - - if (iter > 0) { - // Only checking on X components even for full as Y are so small - if (density_residuals.max() > 2) { - break; - } - - double d_residual = density_residuals.max(); - double d_conv = dconv * std::max(size_t(5), molecule.natom()); - - if ((d_residual < d_conv) and - ((std::max(bsh_residualsX.absmax(), bsh_residualsY.absmax()) < - d_conv * 5.0) or - r_params.get("conv_only_dens"))) { - converged = true; - } - if (converged || iter == r_params.maxiter() - 1) { - // if converged print converged - if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { - print("\nConverged!\n"); - } - - if (r_params.save()) { - molresponse::start_timer(world); - save(world, r_params.save_file()); - if (r_params.print_level() >= 1) - molresponse::end_timer(world, "Save:"); - } - // Basic output - if (r_params.print_level() >= 1) - molresponse::end_timer(world, " This iteration:"); - // plot orbitals - if (r_params.plot_all_orbitals()) { - PlotGroundandResponseOrbitals( - world, iter, Chi.X, Chi.Y, r_params, g_params); - } - rho0 = make_ground_density(world, ground_orbitals); - if (r_params.plot()) { - do_vtk_plots(world, - 200, - r_params.L(), - molecule, - rho0, - rho_omega, - ground_orbitals, - Chi); - } - break; - } - } - update_x_space_excited(world, - old_Chi, - Chi, - old_Lambda_X, - residuals, - xc, - projector, - omega, - kain_x_space, - Xvector, - Xresidual, - energy_residuals, - old_energy, - bsh_residualsX, - bsh_residualsY, - S, - old_S, - A, - old_A, - iter, - maxrotn); - - excited_to_json(j_molresponse,iter,bsh_residualsX,bsh_residualsY,density_residuals,omega); - - // Basic output - if (r_params.print_level() >= 1) - molresponse::end_timer(world, " This iteration:"); - } - - if (world.rank() == 0) print("\n"); - if (world.rank() == 0) print(" Finished Excited State Calculation "); - if (world.rank() == 0) print(" ------------------------"); - if (world.rank() == 0) print("\n"); - - // Did we converge? - if (iter == r_params.maxiter() && not converged) { - if (world.rank() == 0) print(" Failed to converge. Reason:"); - if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); - if (world.rank() == 0) print(" Running analysis on current values.\n"); - } - - // Sorstatict - if (!r_params.tda()) { - sort(world, omega, Chi); - } else { - sort(world, omega, Chi.X); - } - - // Print final things - if (world.rank() == 0) { - print(" Final excitation energies:"); - print(omega); - print(" Final energy residuals X:"); - print(bsh_residualsX); - print(" Final energy residuals Y:"); - print(bsh_residualsY); - print(" Final density residuals:"); - print(density_residuals); - - print(" Final X-state response function residuals:"); - print(Chi.X.norm2()); - if (not r_params.tda()) { - if (world.rank() == 0) - print(" Final y-state response function residuals:"); - if (world.rank() == 0) print(Chi.Y.norm2()); - } - } - - analysis(world, Chi); - print("--------------------------------------------------------"); - for (size_t i = 0; i < m; i++) { - std::string x_state = "x_" + std::to_string(i) + "_"; - analyze_vectors(world, Chi.X[i], x_state); - print("--------------------------------------------------------"); - } - if (not r_params.tda()) { - for (size_t i = 0; i < m; i++) { - std::string y_state = "y_" + std::to_string(i) + "_"; - analyze_vectors(world, Chi.Y[i], y_state); - print("--------------------------------------------------------"); - } - } - // append the json to the file - std::ofstream ofs; // open json file in append mode - ofs.open("j_excited.json"); -} - -void TDDFT::analysis(World& world, X_space& Chi) { - // Sizes get used a lot here, so lets get a local copy - size_t n = Chi.X[0].size(); - size_t m = Chi.X.size(); - - // Per response function, want to print the contributions from each - // ground state So print the norm of each function? - Tensor x_norms(m, n); - Tensor y_norms(m, n); - - // Calculate the inner products - for (long i = 0; i < m; i++) { - for (long j = 0; j < n; j++) { - x_norms(i, j) = Chi.X[i][j].norm2(); - - if (not r_params.tda()) y_norms(i, j) = Chi.Y[i][j].norm2(); - } - } - - // 'sort' these inner products within in each row - Tensor cpy = copy(x_norms); - Tensor x_order(m, n); - Tensor y_order(m, n); - for (long i = 0; i < m; i++) { - for (long j = 0; j < n; j++) { - double x = cpy(i, _).max(); - size_t z = 0; - while (x != cpy(i, z)) z++; - cpy(i, z) = -100.0; - x_order(i, j) = z; - - // Also sort y if full response - if (not r_params.tda()) { - y_order(i, j) = z; - } - } - } - - // Need these to calculate dipole/quadrapole - real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); - real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); - real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); - - // Calculate transition dipole moments for each response function - Tensor dipoles(m, 3); - - // Run over each excited state - for (size_t i = 0; i < m; i++) { - // Add in contribution from each ground state - for (size_t j = 0; j < n; j++) { - dipoles(i, 0) += inner(ground_orbitals[j], x * Chi.X[i][j]); - dipoles(i, 1) += inner(ground_orbitals[j], y * Chi.X[i][j]); - dipoles(i, 2) += inner(ground_orbitals[j], z * Chi.X[i][j]); - - if (not r_params.tda()) { - dipoles(i, 0) += inner(ground_orbitals[j], x * Chi.Y[i][j]); - dipoles(i, 1) += inner(ground_orbitals[j], y * Chi.Y[i][j]); - dipoles(i, 2) += inner(ground_orbitals[j], z * Chi.Y[i][j]); - } - } - - // Normalization (negative?) - dipoles(i, 0) *= -sqrt(2.0); - dipoles(i, 1) *= -sqrt(2.0); - dipoles(i, 2) *= -sqrt(2.0); - } - - // Calculate oscillator strength - Tensor oscillator(m); - for (size_t i = 0; i < m; i++) { - oscillator(i) = - 2.0 / 3.0 * - (dipoles(i, 0) * dipoles(i, 0) + dipoles(i, 1) * dipoles(i, 1) + - dipoles(i, 2) * dipoles(i, 2)) * - omega(i); - } - - // Calculate transition quadrapole moments - Tensor quadrupoles(m, 3, 3); - - // Run over each excited state - for (long i = 0; i < m; i++) { - // Add in contribution from each ground state - for (long j = 0; j < n; j++) { - quadrupoles(i, 0, 0) += inner(ground_orbitals[j], x * x * Chi.X[i][j]); - quadrupoles(i, 0, 1) += inner(ground_orbitals[j], x * y * Chi.X[i][j]); - quadrupoles(i, 0, 2) += inner(ground_orbitals[j], x * z * Chi.X[i][j]); - quadrupoles(i, 1, 0) += inner(ground_orbitals[j], y * x * Chi.X[i][j]); - quadrupoles(i, 1, 1) += inner(ground_orbitals[j], y * y * Chi.X[i][j]); - quadrupoles(i, 1, 2) += inner(ground_orbitals[j], y * z * Chi.X[i][j]); - quadrupoles(i, 2, 0) += inner(ground_orbitals[j], z * x * Chi.X[i][j]); - quadrupoles(i, 2, 1) += inner(ground_orbitals[j], z * y * Chi.X[i][j]); - quadrupoles(i, 2, 2) += inner(ground_orbitals[j], z * z * Chi.X[i][j]); - - if (not r_params.tda()) { - quadrupoles(i, 0, 0) += inner(ground_orbitals[j], x * x * Chi.Y[i][j]); - quadrupoles(i, 0, 1) += inner(ground_orbitals[j], x * y * Chi.Y[i][j]); - quadrupoles(i, 0, 2) += inner(ground_orbitals[j], x * z * Chi.Y[i][j]); - quadrupoles(i, 1, 0) += inner(ground_orbitals[j], y * x * Chi.Y[i][j]); - quadrupoles(i, 1, 1) += inner(ground_orbitals[j], y * y * Chi.Y[i][j]); - quadrupoles(i, 1, 2) += inner(ground_orbitals[j], y * z * Chi.Y[i][j]); - quadrupoles(i, 2, 0) += inner(ground_orbitals[j], z * x * Chi.Y[i][j]); - quadrupoles(i, 2, 1) += inner(ground_orbitals[j], z * y * Chi.Y[i][j]); - quadrupoles(i, 2, 2) += inner(ground_orbitals[j], z * z * Chi.Y[i][j]); - } - } - // Normalization - quadrupoles(i, 0, 0) *= sqrt(2.0); - quadrupoles(i, 0, 1) *= sqrt(2.0); - quadrupoles(i, 0, 2) *= sqrt(2.0); - quadrupoles(i, 1, 0) *= sqrt(2.0); - quadrupoles(i, 1, 1) *= sqrt(2.0); - quadrupoles(i, 1, 2) *= sqrt(2.0); - quadrupoles(i, 2, 0) *= sqrt(2.0); - quadrupoles(i, 2, 1) *= sqrt(2.0); - quadrupoles(i, 2, 2) *= sqrt(2.0); - } - - // Now print? - if (world.rank() == 0) { - for (long i = 0; i < m; i++) { - printf(" Response Function %d\t\t%7.8f a.u.", - static_cast(i), - omega(i)); - print("\n --------------------------------------------"); - printf(" Response Function %d\t\t%7.8f eV", - static_cast(i), - omega(i) * 27.2114); - print("\n --------------------------------------------"); - - print("\n Transition Dipole Moments"); - printf(" X: %7.8f Y: %7.8f Z: %7.8f\n", - dipoles(i, 0), - dipoles(i, 1), - dipoles(i, 2)); - - printf("\n Dipole Oscillator Strength: %7.8f\n", oscillator(i)); - - print("\n Transition Quadrupole Moments"); - printf(" %16s %16s %16s\n", "X", "Y", "Z"); - printf(" X %16.8f %16.8f %16.8f\n", - quadrupoles(i, 0, 0), - quadrupoles(i, 0, 1), - quadrupoles(i, 0, 2)); - printf(" Y %16.8f %16.8f %16.8f\n", - quadrupoles(i, 1, 0), - quadrupoles(i, 1, 1), - quadrupoles(i, 1, 2)); - printf(" Z %16.8f %16.8f %16.8f\n", - quadrupoles(i, 2, 0), - quadrupoles(i, 2, 1), - quadrupoles(i, 2, 2)); - - // Print contributions - // Only print the top 5? - if (r_params.tda()) { - print("\n Dominant Contributions:"); - for (long j = 0; j < std::min(size_t(5), n); j++) { - printf(" Occupied %d %7.8f\n", - x_order(i, j), - x_norms(i, x_order(i, j))); - } - - print("\n"); - } else { - print("\n Dominant Contributions:"); - print(" x y"); - for (long j = 0; j < std::min(size_t(5), n); j++) { - printf(" Occupied %d %7.8f %7.8f\n", - x_order(i, j), - x_norms(i, x_order(i, j)), - y_norms(i, y_order(i, j))); - } - - print("\n"); - } - } - } -} diff --git a/src/apps/molresponse/iterate_freq.cc b/src/apps/molresponse/iterate_freq.cc deleted file mode 100644 index f375a31a063..00000000000 --- a/src/apps/molresponse/iterate_freq.cc +++ /dev/null @@ -1,302 +0,0 @@ - - -// Copyright 2021 Adrian Hurtado -#include - -#include -#include -#include -#include -#include - -#include "../chem/NWChem.h" // For nwchem interface -#include "../chem/SCFOperators.h" -#include "../chem/molecule.h" -#include "Plot_VTK.h" -#include "TDDFT.h" -#include "chem/potentialmanager.h" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) -#include "madness/mra/funcdefaults.h" -#include "molresponse/basic_operators.h" -#include "molresponse/density.h" -#include "molresponse/global_functions.h" -#include "molresponse/property.h" -#include "molresponse/response_functions.h" -#include "molresponse/timer.h" - -// Iterate Frequency Response -void TDDFT::iterate_freq(World& world) { - // Variables needed to iterate - size_t iteration = 0; // Iteration counter - QProjector projector(world, ground_orbitals); - size_t n = r_params.num_orbitals(); // Number of ground state orbitals - size_t m = r_params.n_states(); // Number of excited states - - // Holds the norms of y function residuals (for convergence) - Tensor x_norms(m); - Tensor y_norms(m); - // Holds wave function corrections - response_space x_differences(world, m, n); - response_space y_differences(world, m, n); - - response_space x_residuals(world, m, n); - response_space y_residuals(world, m, n); - // response functions - - real_function_3d v_xc; // For TDDFT - bool converged = false; // Converged flag - const double dconv = - std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - - response_space bsh_x_resp(world, m, n); // Holds wave function corrections - response_space bsh_y_resp(world, m, n); // Holds wave function corrections - - // initialize DFT XC functional operator - XCOperator xc = - create_XCOperator(world, ground_orbitals, r_params.xc()); - - /***Create X space and X Vectors for Kain************************************* - * - * - * - * X space refers to X and Y vector spaces |X,Y> - * X vector is a single |X_b,Y_b> b is a single response state - * For kain we need a vector of X_vectors - */ - // create X space residuals - X_space residuals(world, m, n); - X_space old_Chi(world, m, n); - // Create the X space - // vector of Xvectors - std::vector Xvector; - std::vector Xresidual; - for (size_t b = 0; b < m; b++) { - Xvector.push_back(X_vector(Chi, b)); - Xresidual.push_back(X_vector(residuals, b)); - } - // If DFT, initialize the XCOperator - std::vector> - kain_x_space; - size_t nkain = m; // (r_params.omega() != 0.0) ? 2 * m : m; - for (size_t b = 0; b < nkain; b++) { - kain_x_space.push_back( - XNonlinearSolver( - X_space_allocator(world, n), false)); - if (r_params.kain()) kain_x_space[b].set_maxsub(r_params.maxsub()); - } - // - double omega_n = r_params.omega(); - omega_n = abs(omega_n); - omega[0] = omega_n; - // We compute with positive frequencies - print("Warning input frequency is assumed to be positive"); - print("Computing at positive frequency omega = ", omega_n); - double x_shifts{0}; - double y_shifts{0}; - // if less negative orbital energy + frequency is positive or greater than 0 - print("Ground State orbitals"); - print(ground_energies); - if ((ground_energies[n - 1] + omega_n) >= 0.0) { - // Calculate minimum shift needed such that \eps + \omega + shift < 0 - print("*** we are shifting just so you know!!!"); - x_shifts = -(omega_n + ground_energies[n - 1]); - } - // Construct BSH operators - std::vector> bsh_x_operators = - CreateBSHOperatorPropertyVector( - world, x_shifts, ground_energies, omega_n, .001, 1e-6); - std::vector> bsh_y_operators; - - // Negate omega to make this next set of BSH operators \eps - omega - if (omega_n != 0.0) { - omega_n = -omega_n; - bsh_y_operators = CreateBSHOperatorPropertyVector( - world, y_shifts, ground_energies, omega_n, .001, 1e-6); - omega_n = -omega_n; - } - // create couloumb operator - // Now to iterate - // while (iteration < r_params.maxiter() and !converged) { - - for (int iter = 0; iter < r_params.maxiter(); ++iter) { - // Basic output - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - if (world.rank() == 0) - printf("\n Iteration %d at time %.1fs\n", - static_cast(iteration), - wall_time()); - if (world.rank() == 0) print(" -------------------------------"); - } - - // If omega = 0.0, x = y - if (r_params.omega() == 0.0) Chi.Y = Chi.X.copy(); - // Save current to old - // deep copy of response functions - old_Chi = Chi.copy(); - - X_space theta_X = Compute_Theta_X(world, Chi, xc, r_params.calc_type()); - // Apply shifts and rhs - theta_X.X += Chi.X * x_shifts; - theta_X.X += PQ.X; - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); - - if (r_params.omega() != 0.0) { - theta_X.Y += PQ.Y; - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); - } - // Load Balancing - if (world.size() > 1 && (iteration < 2 or iteration % 5 == 0)) { - // Start a timer - if (r_params.print_level() >= 1) molresponse::start_timer(world); - if (world.rank() == 0) print(""); // Makes it more legible - // (TODO Ask Robert about load balancing) - LoadBalanceDeux<3> lb(world); - for (size_t j = 0; j < n; j++) { - for (size_t k = 0; k < r_params.n_states(); k++) { - lb.add_tree(Chi.X[k][j], lbcost(1.0, 8.0), true); - lb.add_tree(theta_X.X[k][j], lbcost(1.0, 8.0), true); - } - } - FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); - if (r_params.print_level() >= 1) - molresponse::end_timer(world, "Load balancing:"); - } - X_space temp(world, m, n); - // Debugging output - if (r_params.print_level() >= 2) { - if (world.rank() == 0) - print(" Norms of RHS x components before application of BSH:"); - print_norms(world, theta_X.X); - - if (r_params.omega() != 0.0) { - if (world.rank() == 0) - print(" Norms of RHS y components before application BSH:"); - print_norms(world, theta_X.Y); - } - } - // apply bsh - bsh_x_resp = apply(world, bsh_x_operators, theta_X.X); - if (r_params.omega() != 0.0) - bsh_y_resp = apply(world, bsh_y_operators, theta_X.Y); - - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_x_resp[i] = projector(bsh_x_resp[i]); - if (not r_params.tda()) { - for (size_t i = 0; i < m; i++) bsh_y_resp[i] = projector(bsh_y_resp[i]); - } - - temp.X = bsh_x_resp.copy(); - if (r_params.omega() != 0.0) { - temp.Y = bsh_y_resp.copy(); - } else { - temp.Y = temp.X.copy(); - } - temp.X.truncate_rf(); - temp.Y.truncate_rf(); - // compute differences - x_differences = old_Chi.X - temp.X; - if (omega_n != 0.0) y_differences = old_Chi.Y - temp.Y; - // Next calculate 2-norm of these vectors of differences - // Remember: the entire vector is one state - for (size_t i = 0; i < m; i++) x_norms(i) = norm2(world, x_differences[i]); - if (omega_n != 0.0) { - for (size_t i = 0; i < m; i++) - y_norms(i) = norm2(world, y_differences[i]); - } - - // Basic output - if (r_params.print_level() >= 0 and world.rank() == 0) { - if (omega_n != 0.0) { - std::cout << "res " << iteration << " X :"; - for (size_t i(0); i < m; i++) { - std::cout << x_norms[i] << " "; - } - std::cout << " Y :"; - for (size_t i(0); i < m; i++) { - std::cout << y_norms[i] << " "; - } - std::cout << endl; - } else { - print("resX ", iteration, " :", x_norms); - } - } - - if (r_params.kain()) { - residuals = X_space(x_differences, y_differences); - // seperate X_space vectors into individual vectors - for (size_t b = 0; b < m; b++) { - Xvector[b] = (X_vector(temp, b)); - Xresidual[b] = (X_vector(residuals, b)); - } - - molresponse::start_timer(world); - for (size_t b = 0; b < nkain; b++) { - X_vector kain_X = kain_x_space[b].update( - Xvector[b], Xresidual[b], FunctionDefaults<3>::get_thresh(), 3.0); - temp.X[b].assign(kain_X.X[0].begin(), kain_X.X[0].end()); - temp.Y[b].assign(kain_X.Y[0].begin(), kain_X.Y[0].end()); - } - molresponse::end_timer(world, " KAIN update:"); - } - if (iteration > 0) { - for (size_t b = 0; b < m; b++) { - do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response"); - if (omega_n != 0.0) { - do_step_restriction(world, old_Chi.Y[b], temp.X[b], "y_response"); - } - } - } - // print x norms - temp.X.truncate_rf(); - if (omega_n == 0.0) temp.Y = temp.X.copy(); - if (omega_n != 0.0) temp.Y.truncate_rf(); - // temp-> Chi - Chi = temp.copy(); - if (r_params.print_level() >= 1) { - print("Chi.x norms in iteration after truncate: ", iteration); - print(Chi.X.norm2()); - - print("Chi.y norms in iteration after truncate: ", iteration); - print(Chi.Y.norm2()); - } - - // Check convergence - if (std::max(x_norms.absmax(), y_norms.absmax()) < dconv and - iteration > 0) { - if (r_params.print_level() >= 1) - molresponse::end_timer(world, "This iteration:"); - if (world.rank() == 0) print("\n Converged!"); - converged = true; - break; - } - // Update counter - iteration += 1; - // X_space PQ(P, rhs_y); - Tensor G = -2 * inner(Chi, PQ); - // Polarizability Tensor - print("Polarizability Tensor"); - print(G); - // Save - if (r_params.save()) { - molresponse::start_timer(world); - save(world, r_params.save_file()); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Save:"); - } - // Basic output - if (r_params.print_level() >= 1) - molresponse::end_timer(world, " This iteration:"); - // plot orbitals - if (r_params.plot_all_orbitals()) { - PlotGroundandResponseOrbitals( - world, iteration, Chi.X, Chi.Y, r_params, g_params); - } - for (size_t b = 0; b < m; b++) { - Xvector[b] = (X_vector(world, 0)); - Xresidual[b] = (X_vector(world, 0)); - } - - } // while converged -} diff --git a/src/apps/molresponse/iterate_gamma.cc b/src/apps/molresponse/iterate_gamma.cc deleted file mode 100644 index 9a021d2e572..00000000000 --- a/src/apps/molresponse/iterate_gamma.cc +++ /dev/null @@ -1,572 +0,0 @@ - - -#include -#include -#include - -#include "../chem/molecule.h" -#include "TDDFT.h" -#include "basic_operators.h" -#include "chem/projector.h" // For easy calculation of (1 - \hat{\rho}^0) -#include "madness/mra/funcdefaults.h" -#include "madness/mra/vmra.h" -#include "molresponse/global_functions.h" -#include "molresponse/response_functions.h" -#include "molresponse/timer.h" -#include "molresponse/x_space.h" - -// compute exchange |i> -vecfuncT K(vecfuncT& ket, vecfuncT& bra, vecfuncT& vf) { - World& world = ket[0].world(); - int n = bra.size(); - int nf = ket.size(); - double tol = FunctionDefaults<3>::get_thresh(); /// Important this is - double mul_tol = 0.0; - const double lo = 1.e-4; - const double econv = FunctionDefaults<3>::get_thresh(); - - std::shared_ptr poisson; - poisson = std::shared_ptr( - CoulombOperatorPtr(world, lo, econv)); - /// consistent with Coulomb - vecfuncT Kf = zero_functions_compressed(world, nf); - - reconstruct(world, bra); - reconstruct(world, ket); - reconstruct(world, vf); - - // i-j sym - for (int i = 0; i < n; ++i) { - // for each |i> - vecfuncT psif = mul_sparse(world, bra[i], vf, mul_tol); /// was vtol - truncate(world, psif); - // apply to vector of products .. ... - psif = apply(world, *poisson.get(), psif); - truncate(world, psif); - // multiply by ket i |i>: |i> |i> |i> - psif = mul_sparse(world, ket[i], psif, mul_tol); /// was vtol - /// Generalized A*X+Y for vectors of functions ---- a[i] = alpha*a[i] + - // 1*Kf+occ[i]*psif - gaxpy(world, double(1.0), Kf, double(1.0), psif); - } - truncate(world, Kf, tol); - return Kf; -} -// sum_i |i> for each p - -X_space TDDFT::compute_gamma_full(World& world, - X_space& Chi, - const XCOperator &xc) { - size_t m = Chi.num_states(); - size_t n = Chi.num_orbitals(); - // copy old pmap - std::shared_ptr>> oldpmap = - FunctionDefaults<3>::get_pmap(); - - X_space Chi_copy = Chi; - vecfuncT phi0_copy = ground_orbitals; - truncate(world, phi0_copy); - Chi_copy.truncate(); - - orbital_load_balance(world, ground_orbitals, phi0_copy, Chi, Chi_copy); - - molresponse::start_timer(world); - X_space gamma(world, m, n); - // x functions - // Two ways single vector or vector vector style - // here I create the orbital products for elctron interaction terms - vecfuncT phi_phi; - vecfuncT x_phi; - vecfuncT y_phi; - functionT temp_J; - - X_space J(world, m, n); - X_space JX(world, m, n); - X_space JY(world, m, n); - X_space W(world, m, n); - X_space KX(world, m, n); - X_space KY(world, m, n); - molresponse::end_timer(world, "Create Zero functions for Gamma calc"); - - // apply the exchange kernel to rho if necessary - molresponse::start_timer(world); - // Create Coulomb potential on ground_orbitals - functionT rho_x_b; - functionT rho_y_b; - - for (size_t b = 0; b < m; b++) { - rho_x_b = dot(world, Chi_copy.X[b], phi0_copy); - rho_y_b = dot(world, Chi_copy.Y[b], phi0_copy); - rho_x_b.truncate(); - rho_y_b.truncate(); - rho_x_b = apply(*coulop, rho_x_b); - rho_y_b = apply(*coulop, rho_y_b); - rho_x_b.truncate(); - rho_y_b.truncate(); - JX.X[b] = JX.Y[b] = mul(world, rho_x_b, phi0_copy); - JY.X[b] = JY.Y[b] = mul(world, rho_y_b, phi0_copy); - } - - J = JX + JY; - molresponse::end_timer(world, "J[omega] phi:"); - - // Create Coulomb potential on ground_orbitals - if (xcf.hf_exchange_coefficient() != 1.0) { - molresponse::start_timer(world); - std::vector Wphi; - for (size_t b = 0; b < m; b++) { - Wphi.push_back(xc.apply_xc_kernel(rho_omega[b])); - W.X[b] = mul(world, Wphi[b], phi0_copy); - } - W.Y = W.X.copy(); - molresponse::end_timer(world, "XC[omega] phi:"); - } - - molresponse::start_timer(world); - for (size_t b = 0; b < m; b++) { - vecfuncT x, y; - x = Chi_copy.X[b]; - y = Chi_copy.Y[b]; - // |x> - KX.X[b] = K(x, phi0_copy, phi0_copy); - KY.X[b] = K(phi0_copy, y, phi0_copy); - // |y> - KY.Y[b] = K(y, phi0_copy, phi0_copy); - KX.Y[b] = K(phi0_copy, x, phi0_copy); - // |i> - } - molresponse::end_timer(world, "K[omega] phi:"); - J.truncate(); - KX.truncate(); - KY.truncate(); - W.truncate(); - // for each response state we compute the Gamma response functions - // trucate all response functions - - // update gamma functions - molresponse::start_timer(world); - gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; - molresponse::end_timer(world, "Add Gamma parts J-K+W :"); - - // project out ground state - molresponse::start_timer(world); - QProjector projector(world, phi0_copy); - for (size_t i = 0; i < m; i++) { - gamma.X[i] = projector(gamma.X[i]); - gamma.Y[i] = projector(gamma.Y[i]); - } - - molresponse::end_timer(world, "Project Gamma:"); - - if (r_params.print_level() >= 10) { - molresponse::start_timer(world); - print("inner "); - print(inner(Chi_copy, JX)); - print("inner "); - print(inner(Chi_copy, JY)); - print("inner "); - print(inner(Chi_copy, J)); - print("inner "); - print(inner(Chi_copy, KX)); - print("inner "); - print(inner(Chi_copy, KY)); - print("inner "); - X_space K = KX + KY; - print(inner(Chi_copy, K)); - print("inner "); - print(inner(Chi_copy, W)); - print("inner "); - print(inner(Chi_copy, gamma)); - - molresponse::end_timer(world, "Print Expectation Creating Gamma:"); - } - // put it all together - // no 2-electron - // End timer - - molresponse::start_timer(world); - J.clear(); - KX.clear(); - KY.clear(); - W.clear(); - Chi_copy.clear(); - - if (world.size() > 1) { - FunctionDefaults<3>::set_pmap(oldpmap); // ! DON'T FORGET ! - } - molresponse::end_timer(world, "Clear functions and set old pmap"); - // Done - world.gop.fence(); - return gamma; - // Get sizes -} - -X_space TDDFT::compute_gamma_static(World& world, - X_space& Chi, - XCOperator xc) { - size_t m = r_params.num_states(); - size_t n = r_params.num_orbitals(); - // shallow copy - std::shared_ptr>> oldpmap = - FunctionDefaults<3>::get_pmap(); - - X_space Chi_copy = Chi; - vecfuncT phi0_copy = ground_orbitals; - - orbital_load_balance(world, ground_orbitals, phi0_copy, Chi, Chi_copy); - - molresponse::start_timer(world); - X_space gamma(world, m, n); - // x functions - // here I create the orbital products for elctron interaction terms - vecfuncT phi_phi; - vecfuncT x_phi; - functionT temp_J; - - X_space W(world, m, n); - X_space J(world, m, n); - X_space KX(world, m, n); - X_space KY(world, m, n); - molresponse::end_timer(world, "Create Zero functions for Gamma calc"); - - // apply the exchange kernel to rho if necessary - molresponse::start_timer(world); - // Create Coulomb potential on ground_orbitals - for (size_t b = 0; b < m; b++) { - temp_J = apply(*coulop, rho_omega[b]); - temp_J.truncate(); - J.X[b] = mul(world, temp_J, phi0_copy); - } - - molresponse::end_timer(world, "J[omega] phi:"); - - // Create Coulomb potential on ground_orbitals - if (xcf.hf_exchange_coefficient() != 1.0) { - molresponse::start_timer(world); - std::vector Wphi; - for (size_t b = 0; b < m; b++) { - Wphi.push_back(xc.apply_xc_kernel(rho_omega[b])); - W.X[b] = mul(world, Wphi[b], phi0_copy); - } - molresponse::end_timer(world, "XC[omega] phi:"); - } - - molresponse::start_timer(world); - - for (size_t b = 0; b < m; b++) { - vecfuncT x, y; - x = Chi_copy.X[b]; - y = Chi_copy.Y[b]; - // |x> - KX.X[b] = K(x, phi0_copy, phi0_copy); - // |i> - KY.X[b] = K(phi0_copy, y, phi0_copy); - // |y> - } - - molresponse::end_timer(world, "K[omega] phi:"); - // for each response state we compute the Gamma response functions - // trucate all response functions - J.truncate(); - KX.truncate(); - KY.truncate(); - W.truncate(); - - molresponse::start_timer(world); - // update gamma functions - gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; - molresponse::end_timer(world, "Add Gamma parts J-K+W :"); - - // project out ground state - molresponse::start_timer(world); - QProjector projector(world, phi0_copy); - for (size_t i = 0; i < m; i++) { - gamma.X[i] = projector(gamma.X[i]); - } - molresponse::end_timer(world, "Project Gamma:"); - - molresponse::start_timer(world); - - J.clear(); - KX.clear(); - KY.clear(); - W.clear(); - Chi_copy.clear(); - - if (world.size() > 1) { - FunctionDefaults<3>::set_pmap(oldpmap); // ! DON'T FORGET ! - } - - molresponse::end_timer(world, "Clear functions and set old pmap"); - // Done - world.gop.fence(); - return gamma; - // Get sizes -} - -X_space TDDFT::compute_gamma_tda(World& world, - X_space& Chi, - XCOperator xc) { - size_t m = Chi.num_states(); - size_t n = Chi.num_orbitals(); - - std::shared_ptr>> oldpmap = - FunctionDefaults<3>::get_pmap(); - - X_space Chi_copy = Chi; - vecfuncT phi0_copy = ground_orbitals; - - orbital_load_balance(world, ground_orbitals, phi0_copy, Chi, Chi_copy); - - molresponse::start_timer(world); - X_space gamma(world, m, n); - // x functions - - vector_real_function_3d phi_phi; - real_function_3d temp_J; - - response_space J(world, m, n); - response_space k1_x(world, m, n); - response_space W(world, m, n); - molresponse::end_timer(world, "Create Zero functions for Gamma calc"); - - molresponse::start_timer(world); - // Create Coulomb potential on ground_orbitals - for (size_t b = 0; b < m; b++) { - temp_J = apply(*coulop, rho_omega[b]); - temp_J.truncate(); - J[b] = mul(world, temp_J, phi0_copy); - } - molresponse::end_timer(world, "J[omega] phi:"); - - // Create Coulomb potential on ground_orbitals - if (xcf.hf_exchange_coefficient() != 1.0) { - molresponse::start_timer(world); - std::vector XC_phi; - for (size_t b = 0; b < m; b++) { - XC_phi.push_back(xc.apply_xc_kernel(rho_omega[b])); - W[b] = mul(world, XC_phi[b], phi0_copy); - } - molresponse::end_timer(world, "XC[omega] phi:"); - } - - molresponse::start_timer(world); - - for (size_t b = 0; b < m; b++) { - vecfuncT x; - x = Chi_copy.X[b]; - k1_x[b] = K(x, phi0_copy, phi0_copy); - } - - molresponse::end_timer(world, "K[omega] phi:"); - - k1_x.truncate_rf(); - J.truncate_rf(); - W.truncate_rf(); - - if (r_params.print_level() >= 2) { - molresponse::start_timer(world); - print("-------------------------Gamma Functions ------------------"); - print("2-Electron Potential for Iteration of x"); - PrintResponseVectorNorms(world, J * 2, "J"); - PrintResponseVectorNorms(world, k1_x, "k1_x"); - molresponse::end_timer(world, "Print Response Vector Norms:"); - } - - molresponse::start_timer(world); - QProjector projector(world, ground_orbitals); - gamma.X = (J * 2) - k1_x * xcf.hf_exchange_coefficient() + W; - molresponse::end_timer(world, "Add Gamma parts J-K+W :"); - - molresponse::start_timer(world); - for (size_t i = 0; i < m; i++) { - gamma.X[i] = projector(gamma.X[i]); - truncate(world, gamma.X[i]); - } - molresponse::end_timer(world, "Project Gamma:"); - - if (r_params.print_level() >= 2) { - print("------------------------ Gamma Functions Norms ------------------"); - print("Gamma X norms"); - print(gamma.X.norm2()); - } - - if (r_params.print_level() >= 2) { - print(""); - PrintRFExpectation(world, Chi_copy.X, gamma.X, "x", "Gamma)"); - } - - molresponse::start_timer(world); - - J.clear(); - k1_x.clear(); - W.clear(); - Chi_copy.clear(); - - if (world.size() > 1) { - FunctionDefaults<3>::set_pmap(oldpmap); // ! DON'T FORGET ! - } - - molresponse::end_timer(world, "Clear functions and set old pmap"); - // Done - world.gop.fence(); - return gamma; -} - -// Returns the ground state potential applied to functions f -// (V0 f) V0=(Vnuc+J0-K0+W0) -// J0=J[ground_density] -// K0=K[ground_density]f -// EXC0=W[ground_density] -X_space TDDFT::compute_V0X(World& world, - X_space& Chi, - XCOperator xc, - bool compute_Y) { - // Start a timer - - size_t m = Chi.num_states(); - size_t n = Chi.num_orbitals(); - - X_space V0 = X_space(world, m, n); - X_space K0 = X_space(world, m, n); - - X_space Chi_copy = Chi; - vecfuncT phi0_copy = ground_orbitals; - Chi_copy.truncate(); - truncate(world, phi0_copy); - // v_nuc first - real_function_3d v_nuc, v_j0, v_k0, v_xc; - - molresponse::start_timer(world); - if (not r_params.store_potential()) { - v_nuc = potential_manager->vnuclear(); - v_nuc.truncate(); - } else { // Already pre-computed - v_nuc = stored_v_nuc; - } - molresponse::end_timer(world, "Nuclear energy"); - // Coulomb Potential J0*f - molresponse::start_timer(world); - if (not r_params.store_potential()) { - // "a" is the core type - // scale rho by 2 TODO - // J^0 x^alpha - v_j0 = apply(*coulop, rho0); - v_j0.scale(2.0); - } else { // Already pre-computed - v_j0 = stored_v_coul; - } - molresponse::end_timer(world, "Coulomb Potential J[ground_density]"); - - if (xcf.hf_exchange_coefficient() != 1.0) { - v_xc = xc.make_xc_potential(); - } else { - // make a zero function - v_xc = Function( - FunctionFactory(world).fence(false).initial_level(1)); - } - - // Intermediaries - - molresponse::start_timer(world); - - // If including any exact HF exchange - if (xcf.hf_exchange_coefficient()) { - for (size_t b = 0; b < m; b++) { - K0.X[b] = K(phi0_copy, phi0_copy, Chi_copy.X[b]); - if (compute_Y) { - K0.Y[b] = K(phi0_copy, phi0_copy, Chi_copy.Y[b]); - } - } - } - if (r_params.print_level() >= 10) { - print("inner "); - print(inner(Chi_copy, K0)); - } - molresponse::end_timer(world, "K[ground_density]"); - // Vnuc+V0+VXC - molresponse::start_timer(world); - real_function_3d v0 = v_j0 + v_nuc + v_xc; - - V0.X = v0 * Chi.X; - V0.X += (-1 * K0.X * xcf.hf_exchange_coefficient()); - - if (compute_Y) { - V0.Y = v0 * Chi.Y; - V0.Y += (-1 * K0.Y * xcf.hf_exchange_coefficient()); - } - if (r_params.print_level() >= 3) { - print("inner "); - print(inner(Chi_copy, V0)); - } - molresponse::end_timer(world, "V0X"); - - // Basic output - - // Done - return V0; -} -// kinetic energy operator on response vector -response_space T(World& world, response_space& f) { - response_space T; // Fock = (T + V) * orbitals - real_derivative_3d Dx(world, 0); - real_derivative_3d Dy(world, 1); - real_derivative_3d Dz(world, 2); - // Apply derivatives to orbitals - f.reconstruct_rf(); - response_space dvx = apply(world, Dx, f); - response_space dvy = apply(world, Dy, f); - response_space dvz = apply(world, Dz, f); - // Apply again for 2nd derivatives - response_space dvx2 = apply(world, Dx, dvx); - response_space dvy2 = apply(world, Dy, dvy); - response_space dvz2 = apply(world, Dz, dvz); - T = (dvx2 + dvy2 + dvz2) * (-0.5); - return T; -} -// Returns the ground state fock operator applied to functions f -X_space TDDFT::compute_F0X(World& world, - X_space& Chi, - XCOperator xc, - bool compute_Y) { - // Debugging output - - molresponse::start_timer(world); - size_t m = Chi.num_states(); - size_t n = Chi.num_orbitals(); - - X_space chi_copy = Chi.copy(); - // chi_copy.truncate(); - X_space F0X = X_space(world, m, n); - X_space T0X = X_space(world, m, n); - T0X.X = T(world, chi_copy.X); - if (compute_Y) { - T0X.Y = T(world, chi_copy.Y); - } - if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, T0X)); - } - - X_space V0X = compute_V0X(world, chi_copy, xc, compute_Y); - if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, V0X)); - } - - F0X = T0X + V0X; - - if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, F0X)); - } - - molresponse::end_timer(world, "F0X:"); - // Done - return F0X; -} - -#pragma clang diagnostic pop \ No newline at end of file diff --git a/src/apps/molresponse/load_balance.h b/src/apps/molresponse/load_balance.h deleted file mode 100644 index bb90c11ea9b..00000000000 --- a/src/apps/molresponse/load_balance.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef SRC_APPS_molresponse_LOAD_BALANCE_H -#define SRC_APPS_molresponse_LOAD_BALANCE_H -#include "TDDFT.h" - -#endif diff --git a/src/apps/molresponse/timer.cc b/src/apps/molresponse/timer.cc index c3ff13c439d..70d5e84cb1a 100644 --- a/src/apps/molresponse/timer.cc +++ b/src/apps/molresponse/timer.cc @@ -5,37 +5,36 @@ #include -#include "TDDFT.h" #include "madness/mra/mra.h" // Needed for timers namespace molresponse { - double pop(std::vector& v) { + double pop(std::vector &v) { double x = v.back(); v.pop_back(); return x; } // Pulled from SCF.cc, starts a timer - void start_timer(World& world) { + void start_timer(madness::World &world) { world.gop.fence(); - ttt.push_back(wall_time()); - sss.push_back(cpu_time()); + ttt.push_back(madness::wall_time()); + sss.push_back(madness::cpu_time()); } // Stops a timer - void end_timer(World& world, const char* msg) { + void end_timer(madness::World &world, const char *msg) { world.gop.fence(); - MADNESS_CHECK(ttt.size() > 0); + MADNESS_CHECK(!ttt.empty()); - double wall = wall_time() - pop(ttt); - double cpu = cpu_time() - pop(sss); + double wall = madness::wall_time() - pop(ttt); + double cpu = madness::cpu_time() - pop(sss); if (world.rank() == 0) printf(" timer: %20.20s %8.2fs %8.2fs\n", msg, cpu, wall); } - void end_timer(World& world, const char* msg, const std::string& key, - std::map>& time) { + void end_timer(madness::World &world, const char *msg, const std::string &key, + std::map> &time) { world.gop.fence(); - double wall = wall_time() - pop(ttt); - double cpu = cpu_time() - pop(sss); + double wall = madness::wall_time() - pop(ttt); + double cpu = madness::cpu_time() - pop(sss); std::pair timings; // first is wall diff --git a/src/apps/molresponse/timer.h b/src/apps/molresponse/timer.h index 1116aa99146..cf377ce57ec 100644 --- a/src/apps/molresponse/timer.h +++ b/src/apps/molresponse/timer.h @@ -4,19 +4,18 @@ #include -#include "TDDFT.h" #include "madness/mra/mra.h" // Needed for timers namespace molresponse { double pop(std::vector& v); // Pulled from SCF.cc, starts a timer static std::vector ttt, sss; -void start_timer(World& world); +void start_timer(madness::World& world); // Stops a timer -void end_timer(World& world, const char* msg); +void end_timer(madness::World& world, const char* msg); -void end_timer(World& world, const char* msg, const std::string& key, +void end_timer(madness::World& world, const char* msg, const std::string& key, std::map>& time); } // namespace molresponse From 44788f16fb501e70c1f8a2d665cb1b25aad8d7d6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:27:37 -0400 Subject: [PATCH 0697/1312] using madness functors and functions --- src/apps/molresponse/global_functions.h | 3 +-- src/apps/molresponse/property.cc | 7 +++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 1291a2b611d..675c45ccac9 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -5,7 +5,6 @@ #include #include -#include "molresponse/density.h" #include "response_parameters.h" struct CalcParams { @@ -47,6 +46,6 @@ response_space T(World &world, response_space &f); vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); -static double rsquared(const coordT &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } +static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } /// Mask function to switch from 0 to 1 smoothly at boundary #endif// SRC_APPS_molresponse_GLOBAL_FUNCTIONS_H_ diff --git a/src/apps/molresponse/property.cc b/src/apps/molresponse/property.cc index cfc57a6d19b..4b02e9e96cf 100644 --- a/src/apps/molresponse/property.cc +++ b/src/apps/molresponse/property.cc @@ -1,7 +1,6 @@ #include "molresponse/property.h" #include -#include #include #include @@ -18,7 +17,7 @@ DipoleVector::DipoleVector(World &world) : PropertyBase() { for (size_t i = 0; i < 3; i++) { std::vector f(3, 0); f[i] = 1; - operator_vector.at(i) = real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(f))); + operator_vector.at(i) = real_factory_3d(world).functor(real_functor_3d(new MomentFunctor(f))); // prsize_t k L truncation print("norm of dipole function ", operator_vector[i].norm2()); } @@ -41,10 +40,10 @@ NuclearVector::NuclearVector(World &world, Molecule &molecule) : PropertyBase() for (size_t axis = 0; axis < 3; ++axis) { // question here....MolecularDerivativeFunctor takes derivative with // respect to axis atom and axis - FunctorT func(new MolecularDerivativeFunctor(molecule, atom, axis)); + functorT func(new MolecularDerivativeFunctor(molecule, atom, axis)); // here we save operator_vector.at(atom * 3 + axis) = - FunctionT(FactoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); + functionT (factoryT (world).functor(func).nofence().truncate_on_project().truncate_mode(0)); // prsize_t k L truncation print("norm of derivative function ", operator_vector[atom * 3 + axis].norm2()); } From e179b7d206ec563b7b0adb3e27e86faed1ab2a79 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:28:08 -0400 Subject: [PATCH 0698/1312] we now shallow copy x_space --- src/apps/molresponse/x_space.cc | 41 +++++----- src/apps/molresponse/x_space.h | 128 ++++++++++++++++++-------------- 2 files changed, 92 insertions(+), 77 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 0b29c130131..a78764010a4 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -6,17 +6,18 @@ #include "response_functions.h" namespace madness { - auto to_response_matrix(const X_space& x) -> response_matrix { - World& world = x.X[0][0].world(); + auto to_response_matrix(const X_space &x) -> response_matrix { auto mX = response_matrix(x.num_states()); int b = 0; - for (auto& mi: mX) { - mi = copy(world, x.X[b]); - std::for_each(x.Y[b].begin(), x.Y[b].end(), - [&](const auto& yi) { mi.push_back(copy(yi)); }); + auto num_orbitals = x.num_orbitals(); + std::for_each(mX.begin(), mX.end(), [&](auto &mi) { + //auto norm_vi = norm2(world, x_vec); + mi = vector_real_function_3d(2 * num_orbitals); + //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } + std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); + std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals); b++; - } - world.gop.fence(); + }); return mX; } @@ -25,24 +26,24 @@ namespace madness { * @param x * @return */ - auto to_flattened_vector(const X_space& x) -> vector_real_function_3d { + auto to_flattened_vector(const X_space &x) -> vector_real_function_3d { - World& world = x.X[0][0].world(); + World &world = x.X[0][0].world(); auto num_orbitals = 2 * x.num_orbitals(); - auto vij = vector_real_function_3d(x.num_states()*num_orbitals); + auto vij = vector_real_function_3d(x.num_states() * num_orbitals); auto mx = to_response_matrix(x); int b = 0; - for (auto& mi: mx) { + for (auto &mi: mx) { std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); b++; } return vij; } - auto to_X_space(const response_matrix& x) -> X_space { + auto to_X_space(const response_matrix &x) -> X_space { - World& world = x[0][0].world(); + World &world = x[0][0].world(); auto num_states = x.size(); auto num_orbitals = size_t(x[0].size() / 2); @@ -64,20 +65,20 @@ namespace madness { return x_space; } - auto transposeResponseMatrix(const response_matrix& x) -> response_matrix { + auto transposeResponseMatrix(const response_matrix &x) -> response_matrix { auto XT = response_matrix(x[0].size()); auto b = 0; - for (auto& xi: XT) { + for (auto &xi: XT) { auto j = 0; xi = vector_real_function_3d(x.size()); - for (auto& xji: xi) { xji = copy(x[j++][b]); } + for (auto &xji: xi) { xji = x[j++][b]; } b++; } return XT; } - auto inner(const X_space& A, const X_space& B) -> Tensor { + auto inner(const X_space &A, const X_space &B) -> Tensor { MADNESS_ASSERT(size_states(A) > 0); MADNESS_ASSERT(size_orbitals(A) > 0); MADNESS_ASSERT(same_size(A, B)); @@ -87,7 +88,7 @@ namespace madness { auto a = to_response_matrix(A); auto b = to_response_matrix(B); - World& world = a[0][0].world(); + World &world = a[0][0].world(); auto a_transpose = transposeResponseMatrix(a); auto b_transpose = transposeResponseMatrix(b); @@ -100,7 +101,7 @@ namespace madness { // Container for result Tensor result(a.size(), a.size()); int p = 0; - std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto& ati) { + std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) { result += matrix_inner(world, ati, b_transpose[p++]); }); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index ea0687cf155..0bae7a2c10f 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -15,9 +15,9 @@ namespace madness { struct X_space; - auto to_response_matrix(const X_space& x) -> response_matrix; - auto to_flattened_vector(const X_space& x) -> vector_real_function_3d; - auto to_X_space(const response_matrix& x) -> X_space; + auto to_response_matrix(const X_space &x) -> response_matrix; + auto to_flattened_vector(const X_space &x) -> vector_real_function_3d; + auto to_X_space(const response_matrix &x) -> X_space; struct X_space { private: size_t n_states; // Num. of resp. states @@ -32,7 +32,7 @@ namespace madness { // default constructor X_space() : n_states(0), n_orbitals(0), X(), Y() {} // Copy constructor - X_space(const X_space& A) + X_space(const X_space &A) : n_states(size_states(A)), n_orbitals(size_orbitals(A)), X(A.X), @@ -49,7 +49,7 @@ namespace madness { /// Works in either basis. Different distributions imply /// asynchronous communication and the optional fence is /// collective. - auto copy(const std::shared_ptr>>& pmap, + auto copy(const std::shared_ptr>> &pmap, bool fence = false) const -> X_space { X_space copyX(X[0][0].world(), n_states, n_orbitals); copyX.X = X.copy(pmap, fence); @@ -57,23 +57,24 @@ namespace madness { return copyX; } // assignment - auto operator=(const X_space& B) -> X_space& { + auto operator=(const X_space &B) -> X_space & { if (this != &B) {// is it the same object? this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - this->X = B.X.copy(); - this->Y = B.Y.copy(); + + this->X = B.X; + this->Y = B.Y; } return *this;// NO SHALLOW COPIES } // Zero Constructor - X_space(World& world, size_t n_states, size_t n_orbitals) + X_space(World &world, size_t n_states, size_t n_orbitals) : n_states(n_states), n_orbitals(n_orbitals), X(world, n_states, n_orbitals), Y(world, n_states, n_orbitals) {} // explicit constructor from 2 resonse_space - explicit X_space(response_space& X, response_space& Y) { + explicit X_space(response_space &X, response_space &Y) { MADNESS_ASSERT(X.size() == Y.size()); MADNESS_ASSERT(X[0].size() == Y[0].size()); this->n_states = X.size(); @@ -85,22 +86,24 @@ namespace madness { X.clear(); Y.clear(); } - auto operator+(const X_space& B) -> X_space { + auto operator+(const X_space &B) -> X_space { MADNESS_ASSERT(same_size(*this, B)); - World& world = this->X[0][0].world(); + World &world = this->X[0][0].world(); auto ax = to_response_matrix(*this); + world.gop.fence(); auto bx = to_response_matrix(B); + world.gop.fence(); response_matrix add_x(num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](auto a, auto b) { return add(world, a, b); }); + [&](const auto &a, const auto &b) { return add(world, a, b); }); return to_X_space(add_x); } - auto operator+=(const X_space& B) -> X_space& { + auto operator+=(const X_space &B) -> X_space & { MADNESS_ASSERT(same_size(*this, B)); this->X += B.X; this->Y += B.Y; @@ -130,10 +133,22 @@ namespace madness { if (n_states == 0) { n_orbitals = 0; } } - friend auto operator+(const X_space& A, const X_space& B) -> X_space { + static X_space zero_functions(World &world, size_t n_states, size_t n_orbitals) { + auto zeros = X_space(world, n_states, n_orbitals); + + for (auto &xi: zeros.X) { + xi = ::madness::zero_functions(world, n_orbitals, true); + } + for (auto &yi: zeros.Y) { + yi = ::madness::zero_functions(world, n_orbitals, true); + } + return zeros; + } + + friend auto operator+(const X_space &A, const X_space &B) -> X_space { MADNESS_ASSERT(same_size(A, B)); - World& world = A.X[0][0].world(); + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions auto ax = to_response_matrix(A); @@ -153,17 +168,17 @@ namespace madness { X_space operator-(const X_space B) { MADNESS_ASSERT(same_size(*this, B)); - World& world = this->X[0][0].world(); + World &world = this->X[0][0].world(); X_space result(world, n_states, n_orbitals); result.X = X - B.X; result.Y = Y - B.Y; return result; } - friend X_space operator-(const X_space& A, const X_space& B) { + friend X_space operator-(const X_space &A, const X_space &B) { MADNESS_ASSERT(same_size(A, B)); - World& world = A.X[0][0].world(); + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions result.X = A.X - B.X; @@ -171,38 +186,38 @@ namespace madness { return result; } - friend X_space operator*(const X_space& A, const double& b) { - World& world = A.X[0][0].world(); + friend X_space operator*(const X_space &A, const double &b) { + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions result.X = A.X * b; result.Y = A.Y * b; return result; } - friend X_space operator*(const double& b, const X_space& A) { - World& world = A.X[0][0].world(); + friend X_space operator*(const double &b, const X_space &A) { + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions result.X = A.X * b; result.Y = A.Y * b; return result; } - X_space operator*(const double& b) { + X_space operator*(const double &b) { this->X *= b; this->Y *= b; return *this; } - friend X_space operator*(const X_space& A, const Function& f) { - World& world = A.X[0][0].world(); + friend X_space operator*(const X_space &A, const Function &f) { + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions result.X = A.X * f; result.Y = A.Y * f; return result; } - friend auto operator*(const Function& f, const X_space& A) -> X_space { - World& world = A.X[0][0].world(); + friend auto operator*(const Function &f, const X_space &A) -> X_space { + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions result.X = A.X * f; @@ -210,11 +225,11 @@ namespace madness { return result; } - friend auto operator*(const X_space& A, const Tensor& b) -> X_space { + friend auto operator*(const X_space &A, const Tensor &b) -> X_space { MADNESS_ASSERT(size_states(A) > 0); MADNESS_ASSERT(size_orbitals(A) > 0); - World& world = A.X[0][0].world(); + World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals); result.X = A.X * b; result.Y = A.Y * b; @@ -227,7 +242,7 @@ namespace madness { * @param B * @return */ - friend auto inner(const X_space& A, const X_space& B) -> Tensor; + friend auto inner(const X_space &A, const X_space &B) -> Tensor; void truncate() { X.truncate_rf(); @@ -235,28 +250,28 @@ namespace madness { } auto norm2s() -> Tensor { - World& world = X[0][0].world(); + World &world = X[0][0].world(); Tensor norms(num_states()); for (size_t b = 0; b < num_states(); b++) { auto xb = madness::copy(world, X[b]); - for (auto& yb: Y[b]) { xb.push_back(madness::copy(yb, true)); } + for (auto &yb: Y[b]) { xb.push_back(madness::copy(yb, true)); } norms[b] = sqrt(inner(xb, xb)); } return norms; } auto component_norm2s() const -> Tensor { - World& world = X[0][0].world(); + World &world = X[0][0].world(); auto rx = to_flattened_vector(*this); auto norms = norm2s_T(world, rx); return norms.reshape(n_states, 2 * n_orbitals); } - friend auto size_states(const X_space& x) -> size_t { return x.n_states; } - friend auto size_orbitals(const X_space& x) -> size_t { return x.n_orbitals; } - friend auto same_size(const X_space& A, const X_space& B) -> bool { + friend auto size_states(const X_space &x) -> size_t { return x.n_states; } + friend auto size_orbitals(const X_space &x) -> size_t { return x.n_orbitals; } + friend auto same_size(const X_space &A, const X_space &B) -> bool { return ((size_states(A) == size_states(B) && size_orbitals(A) == size_orbitals(B))); } }; @@ -265,23 +280,25 @@ namespace madness { // the world object. struct X_vector : public X_space { - X_vector(World& world, size_t n_orbtials) : X_space(world, size_t(1), n_orbtials) {} + X_vector(World &world, size_t n_orbtials) { + this->X_space::zero_functions(world, size_t(1), n_orbtials); + } X_vector(X_space A, size_t b) : X_space(A.X[0][0].world(), size_t(1), A.num_orbitals()) { X[0] = A.X[b]; Y[0] = A.Y[b]; } - friend X_vector operator-(const X_vector& A, const X_vector& B) { + friend X_vector operator-(const X_vector &A, const X_vector &B) { MADNESS_ASSERT(same_size(A, B)); - World& world = A.X[0][0].world(); + World &world = A.X[0][0].world(); X_vector result(world, size_orbitals(A));// create zero_functions result.X = A.X - B.X; result.Y = A.Y - B.Y; return result; } - friend X_vector operator*(const X_vector& A, const double& c) { - World& world = A.X[0][0].world(); + friend X_vector operator*(const X_vector &A, const double &c) { + World &world = A.X[0][0].world(); X_vector result(world, size_orbitals(A));// create zero_functions result.X = A.X * c; result.Y = A.Y * c; @@ -293,7 +310,7 @@ namespace madness { copyX.Y = Y.copy(); return copyX; } - auto operator+=(const X_vector& B) -> X_vector& { + auto operator+=(const X_vector &B) -> X_vector & { MADNESS_ASSERT(same_size(*this, B)); @@ -302,7 +319,7 @@ namespace madness { return *this; } - inline friend auto inner(X_vector& A, X_vector& B) -> double { + inline friend auto inner(X_vector &A, X_vector &B) -> double { MADNESS_ASSERT(size_states(A) == 1); MADNESS_ASSERT(size_orbitals(A) > 0); MADNESS_ASSERT(same_size(A, B)); @@ -311,7 +328,7 @@ namespace madness { Tensor G1(1, 1); Tensor G2(1, 1); - World& world = A.X[0][0].world(); + World &world = A.X[0][0].world(); auto ax = madness::copy(world, A.X[0]); auto ay = madness::copy(world, A.Y[0]); @@ -319,8 +336,8 @@ namespace madness { auto bx = madness::copy(world, B.X[0]); auto by = madness::copy(world, B.Y[0]); - for (auto& ayi: ay) { ax.push_back(madness::copy(ayi)); } - for (auto& byi: by) { bx.push_back(madness::copy(byi)); }; + for (auto &ayi: ay) { ax.push_back(madness::copy(ayi)); } + for (auto &byi: by) { bx.push_back(madness::copy(byi)); }; double result = inner(ax, bx); @@ -328,25 +345,22 @@ namespace madness { } }; // function object with allocator()() - struct X_space_allocator { - World& world; - const size_t n_states; + struct response_matrix_allocator { + World &world; const size_t n_orbtials; - X_space_allocator(World& world, size_t n_orbtials) + response_matrix_allocator(World &world, size_t n_orbtials) : world(world), - n_states(size_t(1)), n_orbtials(n_orbtials) {} // overloading the default constructor () operator - X_vector operator()() { + vector_real_function_3d operator()() { print("allocator called with ", int(n_orbtials), " orbitals"); - // returning constructor of x_vector - return X_vector(world, n_orbtials); + return zero_functions(world, n_orbtials); } // Copy constructor - X_space_allocator operator=(const X_space_allocator& other) { - return X_space_allocator(world, other.n_orbtials); + response_matrix_allocator operator=(const response_matrix_allocator &other) { + return response_matrix_allocator(world, other.n_orbtials); } }; }// namespace madness From 7c710ab6158f8568855cc0e35ab7cb4c921075f9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:28:27 -0400 Subject: [PATCH 0699/1312] remove tddft --- src/apps/molresponse/testing/runners.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 8f7bc1ce788..3c8dcf1e15a 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -8,7 +8,6 @@ #include "ExcitedResponse.hpp" #include "FrequencyResponse.hpp" #include "ResponseExceptions.hpp" -#include "TDDFT.h" #include "madness/chem/SCF.h" #include "madness/tensor/tensor_json.hpp" #include "madness/world/worldmem.h" From 5fd7a5ebff033e2b42e88d4e41a50aad62308775 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:28:56 -0400 Subject: [PATCH 0700/1312] kain now uses a vector of vectors instead of X_vectors --- src/apps/molresponse/ExcitedResponse.cpp | 113 +++++++++++++-------- src/apps/molresponse/ExcitedResponse.hpp | 2 +- src/apps/molresponse/FrequencyResponse.cpp | 28 ++--- src/apps/molresponse/FrequencyResponse.hpp | 4 +- src/apps/molresponse/ResponseBase.cpp | 80 +++++++++------ src/apps/molresponse/ResponseBase.hpp | 8 +- src/apps/molresponse/response_functions.h | 31 +++--- 7 files changed, 157 insertions(+), 109 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index d5f75db9345..b1870ddb1ad 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -93,12 +93,40 @@ void ExcitedResponse::initialize(World &world) { trial.clear(); // Initial guess for y are zero functions } +/// an N-dimensional real-valued Gaussian function + +/// the function looks like +/// \[ +/// f(r) = x^i y^j .. z^k exp(-alpha r^2) +/// \] +template +class GaussianGuess : public FunctionFunctorInterface { + typedef Vector coordT; + +public: + /// ctor + + /// @param[in] origin the origin of the Gauss function + /// @param[in] alpha the exponent exp(-alpha r^2) + /// @param[in] ijk the monomial x^i y^j z^k exp(-alpha r^2) (for NDIM) + GaussianGuess(const coordT &origin, const double alpha, const std::vector ijk = std::vector(NDIM)) + : origin(origin), exponent(alpha), ijk(ijk) {} + + coordT origin; + double exponent; ///< exponent of the guess + std::vector ijk;///< cartesian exponents + + double operator()(const coordT &xyz) const { + double arg = 0.0, prefac = 1.0; + for (std::size_t i = 0; i < NDIM; ++i) { + arg += (xyz[i] - origin[i]) * (xyz[i] - origin[i]); + prefac *= pow(xyz[i], ijk[i]); + } + const double e = exponent * arg; + return prefac * exp(-e); + } +}; -// Creates random guess functions semi-intelligently(?) -/// & creates random guesses for nu -/// \param world -/// \param num_states -/// \return X_space ExcitedResponse::make_random_trial(World &world, size_t m) const { // Basic output if (world.rank() == 0) print(" Using a random guess for initial response functions.\n"); @@ -404,9 +432,9 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { Tensor x_shifts; // Holds the shifted energy values response_space bsh_resp(world, m, n); // Holds wave function corrections response_space V; // Holds V^0 applied to response functions - response_space shifted_V;// Holds the shifted V^0 applied to response functions - Tensor S; // Overlap matrix of response components for x states - real_function_3d v_xc; // For TDDFT + response_space shifted_V; // Holds the shifted V^0 applied to response functions + Tensor S; // Overlap matrix of response components for x states + real_function_3d v_xc; // For TDDFT // Useful to have response_space zeros(world, m, n); @@ -508,7 +536,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { } world.gop.fence(); - if ( r_params.print_level() >= 1) { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "E0mDX", "E0mDX", iter_timing); } X_space theta_X = X_space(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); @@ -539,7 +567,6 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { for (auto &bsh_i: bsh_resp.x) { bsh_i = projector(bsh_i); - } // Save new components guesses.X = bsh_resp; @@ -1808,20 +1835,20 @@ void ExcitedResponse::iterate(World &world) { X_space old_Lambda_X(world, m, n); // vector of Xvectors - std::vector Xvector; - std::vector Xresidual; - for (size_t b = 0; b < m; b++) { - Xvector.emplace_back(Chi, b); - Xresidual.emplace_back(residuals, b); - } + response_matrix x_vectors; + response_matrix x_residuals; + x_vectors = to_response_matrix(Chi); + x_residuals = to_response_matrix(residuals); // If DFT, initialize the XCOperator - NonLinearXsolver kain_x_space; + response_solver kain_x_space; size_t nkain = m;// (r_params.omega() != 0.0) ? 2 * m : m; - for (size_t b = 0; b < nkain; b++) { - kain_x_space.push_back(XNonlinearSolver( - X_space_allocator(world, n), false)); - if (r_params.kain()) kain_x_space[b].set_maxsub(r_params.maxsub()); + for (size_t b = 0; b < m; b++) { + kain_x_space.push_back(XNonlinearSolver( + response_matrix_allocator(world, n), true)); + } + if (r_params.kain()) { + for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } response_space bsh_x_resp(world, m, n);// Holds wave function corrections @@ -1836,8 +1863,6 @@ void ExcitedResponse::iterate(World &world) { response_space x_differences(world, m, n); response_space y_differences(world, m, n); - response_space x_residuals(world, m, n); - response_space y_residuals(world, m, n); Tensor x_shifts;// Holds the shifted energy values Tensor y_shifts;// Holds the shifted energy values @@ -1957,7 +1982,7 @@ void ExcitedResponse::iterate(World &world) { // Followed by step restriction // residual is computed as new_chi-old_chi where both have been previously rotated. auto [new_omega, old_chi, new_chi, new_res] = update( - world, Chi, xc, projector, kain_x_space, Xvector, Xresidual, iter, max_rotation); + world, Chi, xc, projector, kain_x_space, x_vectors, x_residuals, iter, max_rotation); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -2062,10 +2087,10 @@ void ExcitedResponse::iterate(World &world) { } auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator &xc, - QProjector &projector, NonLinearXsolver &kain_x_space, - vector &Xvector, vector &Xresidual, size_t iter, + QProjector &projector, response_solver &kain_x_space, + response_matrix &Xvector, response_matrix &Xresidual, size_t iter, const double &maxrotn) --> std::tuple, X_space, X_space, residuals> { + -> std::tuple, X_space, X_space, residuals> { size_t m = Chi.num_states(); bool compute_y = not r_params.tda(); @@ -2250,11 +2275,11 @@ void ExcitedResponse::analysis(World &world, const X_space &chi) { // Need these to calculate dipole/quadrapole real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_functor_3d(new MomentFunctor(std::vector{1, 0, 0}))); real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_functor_3d(new MomentFunctor(std::vector{0, 1, 0}))); real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + real_functor_3d(new MomentFunctor(std::vector{0, 0, 1}))); // Calculate transition dipole moments for each response function Tensor dipoles(m, 3); @@ -2398,17 +2423,17 @@ void ExcitedResponse::save(World &world, const std::string &name) { // (for i from 0 to m-1 ) // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar & r_params.archive(); - ar & r_params.tda(); - ar & r_params.num_orbitals(); - ar & r_params.num_states(); - ar & omega; + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); + ar ω for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; } } @@ -2432,21 +2457,21 @@ void ExcitedResponse::load(World &world, const std::string &name) { // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar & r_params.archive(); - ar & r_params.tda(); - ar & r_params.num_orbitals(); - ar & r_params.num_states(); - ar & omega; + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); + ar ω Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; world.gop.fence(); if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; world.gop.fence(); } } diff --git a/src/apps/molresponse/ExcitedResponse.hpp b/src/apps/molresponse/ExcitedResponse.hpp index 769263eefd1..60c7294675a 100644 --- a/src/apps/molresponse/ExcitedResponse.hpp +++ b/src/apps/molresponse/ExcitedResponse.hpp @@ -133,7 +133,7 @@ class ExcitedResponse : public ResponseBase { World& world, X_space& chi, X_space& lchi, X_space& v_chi, X_space& gamma_chi); std::tuple, X_space, X_space, residuals> update( World& world, X_space& Chi, XCOperator& xc, QProjector& projector, - NonLinearXsolver& kain_x_space, vector& Xvector, vector& Xresidual, + response_solver &kain_x_space, response_matrix &Xvector, response_matrix &Xresidual, size_t iter, const double& maxrotn); X_space create_response_guess(World& world) const; std::tuple, Tensor, Tensor> reduce_subspace( diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index dbef82d1901..6be3e25826f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -35,20 +35,24 @@ void FrequencyResponse::iterate(World &world) { XCOperator xc = make_xc_operator(world); // create X space residuals - X_space residuals(world, m, n); + X_space residuals=X_space::zero_functions(world, m, n); - std::vector x_vectors; - std::vector x_residuals; + std::vector x_vectors; + std::vector x_residuals; + x_vectors= to_response_matrix(Chi); + x_residuals= to_response_matrix(residuals); + /* for (size_t b = 0; b < m; b++) { x_vectors.emplace_back(Chi, b); x_residuals.emplace_back(residuals, b); } + */ // create a std vector of XNONLinearsolvers - NonLinearXsolver kain_x_space; + response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - X_space_allocator(world, n), true)); + kain_x_space.push_back(XNonlinearSolver( + response_matrix_allocator(world, 2*n), true)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -264,8 +268,8 @@ void FrequencyResponse::iterate(World &world) { auto FrequencyResponse::update(World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, - double &x_shifts, double &omega_n, NonLinearXsolver &kain_x_space, - vector &Xvector, vector &Xresidual, + double &x_shifts, double &omega_n, response_solver &kain_x_space, + response_matrix &Xvector, response_matrix &Xresidual, size_t iteration, const double &maxrotn) -> std::tuple { @@ -455,9 +459,9 @@ auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { for (size_t atom = 0; atom < molecule.natom(); ++atom) { for (size_t axis = 0; axis < 3; ++axis) { - FunctorT func(new madchem::MolecularDerivativeFunctor(molecule, atom, axis)); - nuclear_vector.at(atom * 3 + axis) = FunctionT( - FactoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); + functorT func(new madchem::MolecularDerivativeFunctor(molecule, atom, axis)); + nuclear_vector.at(atom * 3 + axis) = functionT( + factoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); } } PQ.X = vector_to_PQ(world, nuclear_vector, calc.get_orbitals(), r_params.lo()); @@ -474,7 +478,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { std::vector f(3, 0); f[i++] = 1; - d = real_factory_3d(world).functor(real_functor_3d(new BS_MomentFunctor(f))); + d = real_factory_3d(world).functor(real_functor_3d(new MomentFunctor(f))); } //truncate(world, dipole_vectors, true); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals(), r_params.lo()); diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 41a53fff310..efd87eab91a 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -49,8 +49,8 @@ class FrequencyResponse : public ResponseBase { vector& bsh_x_ops, vector& bsh_y_ops, QProjector& projector, double& x_shifts, - double& omega_n, NonLinearXsolver& kain_x_space, - vector& Xvector, vector& Xresidual, + double& omega_n, response_solver &kain_x_space, + response_matrix &Xvector, response_matrix &Xresidual, size_t iteration, const double& maxrotn); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c6ed8e4b742..928b66f7ea9 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -460,9 +460,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit response_space j_x(world, m, n); response_space j_y(world, m, n); - X_space W(world, m, n); - X_space KX(world, m, n); - X_space KY(world, m, n); + X_space W = X_space::zero_functions(world, m, n); + X_space KX = X_space::zero_functions(world, m, n); + X_space KY = X_space::zero_functions(world, m, n); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } @@ -566,18 +566,14 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); - if (world.rank() == 0) { - print_inner(world, "xJx", d_alpha, J); - print_inner(world, "xKXx", d_alpha, KX); - print_inner(world, "xKYx", d_alpha, KY); - } + print_inner(world, "xJx", d_alpha, J); + print_inner(world, "xKXx", d_alpha, KX); + print_inner(world, "xKYx", d_alpha, KY); X_space K = KX + KY; world.gop.fence(); - if (world.rank() == 0) { - print_inner(world, "xKx", d_alpha, KX); - print_inner(world, "xWx", d_alpha, W); - print_inner(world, "xGammax", d_alpha, gamma); - } + print_inner(world, "xKx", d_alpha, KX); + print_inner(world, "xWx", d_alpha, W); + print_inner(world, "xGammax", d_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); } // put @@ -651,10 +647,10 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm vecfuncT x_phi; functionT temp_J; - X_space W(world, num_states, num_orbitals); + X_space W = X_space::zero_functions(world, num_states, num_orbitals); X_space J(world, num_states, num_orbitals); - X_space KX(world, num_states, num_orbitals); - X_space KY(world, num_states, num_orbitals); + X_space KX = X_space::zero_functions(world, num_states, num_orbitals); + X_space KY = X_space::zero_functions(world, num_states, num_orbitals); // std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; // world.mpi.Barrier(); @@ -676,6 +672,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm }; std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); + J.Y = J.X.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); @@ -1187,14 +1184,20 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp } auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, - const X_space &residual_chi, NonLinearXsolver &kain_x_space, - std::vector &Xvector, - std::vector &Xresidual) + const X_space &residual_chi, response_solver &kain_x_space, + response_matrix &Xvector, + response_matrix &Xresidual) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); + + + Xvector = to_response_matrix(chi); + Xresidual = to_response_matrix(residual_chi); + + /* for (size_t b = 0; b < m; b++) { Xvector[b].X[0] = copy(world, chi.X[b]); @@ -1203,15 +1206,27 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, Xresidual[b].X[0] = copy(world, residual_chi.X[b]); Xresidual[b].Y[0] = copy(world, residual_chi.Y[b]); } + */ + response_matrix update(m); + for (auto &update_i: update) { + update_i = vector_real_function_3d(n); + } if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } + int b = 0; + std::transform(Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), [&](auto &xi, auto &ri) { + return kain_x_space[b++].update(xi, ri); + }); + + /* std::for_each(kain_x_space.begin(), kain_x_space.end(), [&](auto &ki) { auto kain_X = ki.update(Xvector[b], Xresidual[b]); - kain_update.X[b] = copy(world, kain_X.X[0]); - kain_update.Y[b] = copy(world, kain_X.Y[0]); + update[b] = copy(world, kain_X); b++; }); + */ + kain_update = to_X_space(update); /* for (size_t b = 0; b < m; b++) { @@ -1440,23 +1455,24 @@ void ResponseBase::solve(World &world) { bool first_protocol = true; for (const auto &iter_thresh: protocol) { // We set the protocol and function defaults here for the given threshold of - // protocol set_protocol(world, iter_thresh); - check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); - protocol_to_json(j_molresponse, iter_thresh); + // protocol if (first_protocol) { if (r_params.restart()) { if (world.rank() == 0) { print(" Restarting from file:", r_params.restart_file()); } load(world, r_params.restart_file()); - check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); first_protocol = false; } else { this->initialize(world); } + check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); first_protocol = false; + } else { + check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); } + protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... this->iterate(world); } @@ -1569,13 +1585,13 @@ auto solid_harmonics(World &world, int n) -> std::map, real_fun // Create the basic x, y, z, constant and zero real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_functor_3d(new MomentFunctor(std::vector{1, 0, 0}))); real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_functor_3d(new MomentFunctor(std::vector{0, 1, 0}))); real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + real_functor_3d(new MomentFunctor(std::vector{0, 0, 1}))); real_function_3d c = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 0}))); + real_functor_3d(new MomentFunctor(std::vector{0, 0, 0}))); real_function_3d zero = real_factory_3d(world); // Add in first few, since they're simple @@ -2056,11 +2072,11 @@ auto make_xyz_functions(World &world) -> vector_real_function_3d { // Create the basic x, y, z, constant and zero real_function_3d x = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{1, 0, 0}))); + real_functor_3d(new MomentFunctor(std::vector{1, 0, 0}))); real_function_3d y = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 1, 0}))); + real_functor_3d(new MomentFunctor(std::vector{0, 1, 0}))); real_function_3d z = real_factory_3d(world).functor( - real_functor_3d(new BS_MomentFunctor(std::vector{0, 0, 1}))); + real_functor_3d(new MomentFunctor(std::vector{0, 0, 1}))); std::vector funcs = {x, y, z}; return funcs; diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index adc8d9d83c2..8ebaa1a0ac5 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -10,8 +10,8 @@ #include #include +#include #include "global_functions.h" -#include "load_balance.h" #include "madness/mra/functypedefs.h" #include "madness/mra/mra.h" #include @@ -25,6 +25,8 @@ using namespace madness; using json=nlohmann::json; +typedef std::vector> response_solver; + class response_timing { std::map> wall_time_data; std::map> cpu_time_data; @@ -197,8 +199,8 @@ class ResponseBase { auto kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, - NonLinearXsolver &kain_x_space, vector &Xvector, - vector &Xresidual) -> X_space; + response_solver &kain_x_space, response_matrix &Xvector, + response_matrix &Xresidual) -> X_space; void x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, bool restrict_y, const double &maxrotn); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 914f1b7c4a5..f8e025faeb6 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -53,9 +53,9 @@ namespace madness { * @param y */ response_space(const response_space &y) - : num_states(y.size()), - num_orbitals(y.size_orbitals()), - x(y.x) {} + : num_states(y.size()), + num_orbitals(y.size_orbitals()), + x(y.x) {} // assignment // Copy assignment should copy the members of y and leave y Unchanged @@ -67,10 +67,10 @@ namespace madness { this->num_orbitals = y.size_orbitals(); this->x = y.x; if (x.size() != num_states) { x.resize(num_states); } - World &world = y[0][0].world(); + //World &world = y[0][0].world(); // print("perhaps this is the problem"); std::transform(y.x.begin(), y.x.end(), x.begin(), - [&](auto yi) { return madness::copy(world, yi); }); + [&](auto yi) { return yi; }); } return *this;// } @@ -87,11 +87,11 @@ namespace madness { * @param num_orbitals */ response_space(World &world, size_t num_states, size_t num_orbitals) - : num_states(num_states), - num_orbitals(num_orbitals), - x(response_matrix(num_states)) { + : num_states(num_states), + num_orbitals(num_orbitals), + x(response_matrix(num_states)) { for (auto &state: x) { - state = zero_functions(world, static_cast(num_orbitals), false); + state = vector_real_function_3d(num_orbitals); } world.gop.fence(); } @@ -102,9 +102,9 @@ namespace madness { * @param x */ explicit response_space(const response_matrix &x) - : num_states(x.size()), - num_orbitals(x[0].size()), - x(x) {} + : num_states(x.size()), + num_orbitals(x[0].size()), + x(x) {} // Determines if two ResponseFunctions are the same size friend bool same_size(const response_space &a, const response_space &b) { @@ -267,19 +267,20 @@ namespace madness { // Returns a deep copy response_space copy() const { - response_space result(x[0][0].world(), num_states, num_orbitals); World &world = x[0][0].world(); + response_space result(world, num_states, num_orbitals); + std::transform(x.begin(), x.end(), result.x.begin(), - [&world](auto xi) { return madness::copy(world, xi); }); + [&world](auto &xi) { return madness::copy(world, xi); }); world.gop.fence(); return result; } - response_space copy(const std::shared_ptr > > &pmap, + response_space copy(const std::shared_ptr>> &pmap, bool fence = false) const { response_space result(x[0][0].world(), num_states, num_orbitals); From 3e102408a1fb6bf28180d3bb7f035325aa09d596 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:40:20 -0400 Subject: [PATCH 0701/1312] Update test development to remove tddft --- src/apps/molresponse/testing/test_development.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index bc1582f67f7..fda4ceff2af 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -7,18 +7,10 @@ #include "ExcitedResponse.hpp" #include "FrequencyResponse.hpp" #include "ResponseExceptions.hpp" -#include "TDDFT.h" -#include "madness/chem/SCF.h" -#include "madness/external/catch/catch.hpp" #include "madness/tensor/tensor_json.hpp" -#include "madness/world/worldmem.h" #include "response_functions.h" #include "response_parameters.h" #include "runners.hpp" -#include "string" -#include "timer.h" -#include "write_test_input.h" -#include "x_space.h" using path = std::filesystem::path; From 2cb3432da345a720a1ece3885ced05f8db59f79b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:40:58 -0400 Subject: [PATCH 0702/1312] Update test_development.cpp --- src/apps/molresponse/testing/test_development.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index fda4ceff2af..a3a4f9b7791 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -2,7 +2,6 @@ // Created by adrianhurtado on 1/1/22. // -#include #include "ExcitedResponse.hpp" #include "FrequencyResponse.hpp" From 7152016d546e8cb4c5bf59099da8a516924932d9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Sep 2022 17:54:12 -0400 Subject: [PATCH 0703/1312] fix to finish building everything --- .../testing/qcschema_json_testing.cpp | 87 ++++++++++--------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/src/apps/molresponse/testing/qcschema_json_testing.cpp b/src/apps/molresponse/testing/qcschema_json_testing.cpp index b8ddffc53c1..7282b28ad49 100644 --- a/src/apps/molresponse/testing/qcschema_json_testing.cpp +++ b/src/apps/molresponse/testing/qcschema_json_testing.cpp @@ -2,11 +2,12 @@ // Created by adrianhurtado on 1/1/22. // -#include "madness/tensor/tensor_json.hpp" #include "madness/external/catch/catch.hpp" +#include "madness/tensor/tensor_json.hpp" #include "response_functions.h" -#include "timer.h" +#include "response_parameters.h" #include "string" +#include "timer.h" #include "x_space.h" unsigned int Factorial(unsigned int number) { @@ -18,26 +19,26 @@ TEST_CASE("X_space", "[copy]") { unsigned int n = 4; int argc = 1; char** argv = nullptr; - initialize(argc, argv); // initializes a world argument with argc and argv + madness::initialize(argc, argv); // initializes a world argument with argc and argv { - World world(SafeMPI::COMM_WORLD); + madness::World world(SafeMPI::COMM_WORLD); startup(world, 1, nullptr, true); // TODO: ask Robert about proper startup and implement molresponse::start_timer(world); - X_space v{world, m, n}; + madness::X_space v{world, m, n}; REQUIRE(v.num_states() == m); // world.gop.fence(); REQUIRE(v.num_orbitals() == n); molresponse::end_timer(world, "basic x space test"); - finalize(); + madness::finalize(); } } TEST_CASE("Json Testing", "Simple JSON") { // create an empty structure (null) - json j; + nlohmann::json j; // add a number that is stored as double (note the implicit conversion of j to // an object) j["pi"] = 3.141; @@ -54,7 +55,7 @@ TEST_CASE("Json Testing", "Simple JSON") { // add another object (using an initializer list of pairs) j["object"] = {{"currency", "USD"}, {"value", 42.99}}; // instead, you could also write (which looks very similar to the JSON above) - json j2 = {{"pi", 3.141}, + nlohmann::json j2 = {{"pi", 3.141}, {"happy", true}, {"name", "Niels"}, {"nothing", nullptr}, @@ -67,7 +68,7 @@ TEST_CASE("Json Testing", "Simple JSON") { } template -bool operator==(const Tensor& a, const Tensor& b) { +bool operator==(const madness::Tensor& a, const madness::Tensor& b) { // check the size if (a.size() != b.size()) { return false; @@ -87,21 +88,21 @@ bool operator==(const Tensor& a, const Tensor& b) { } TEST_CASE("Json Testing 2", "Serialization") { - Tensor a(3, 3); - Tensor b(3, 2, 4); - Tensor c(1, 3); + madness::Tensor a(3, 3); + madness::Tensor b(3, 2, 4); + madness::Tensor c(1, 3); a.fillrandom(); b.fillindex(); c.fill(3); - json j_a = tensor_to_json(a); - json j_b = tensor_to_json(b); - json j_c = tensor_to_json(c); + nlohmann::json j_a = tensor_to_json(a); + nlohmann::json j_b = tensor_to_json(b); + nlohmann::json j_c = tensor_to_json(c); // How can I make this an automatic template function? - auto a_copy = tensor_from_json(j_a); - auto b_copy = tensor_from_json(j_b); - auto c_copy = tensor_from_json(j_c); + auto a_copy = madness::tensor_from_json(j_a); + auto b_copy = madness::tensor_from_json(j_b); + auto c_copy = madness::tensor_from_json(j_c); REQUIRE(a == a_copy); REQUIRE(b == b_copy); @@ -109,20 +110,20 @@ TEST_CASE("Json Testing 2", "Serialization") { } TEST_CASE("Json Testing 3", "Json Tensor Indexing") { - Tensor a(3, 3); - Tensor b(3, 2, 4); - Tensor c(1, 3); + madness::Tensor a(3, 3); + madness::Tensor b(3, 2, 4); + madness::Tensor c(1, 3); a.fillrandom(); b.fillindex(); c.fill(3); - json j = {}; + nlohmann::json j = {}; - json j_a = tensor_to_json(a); - json j_b = tensor_to_json(b); - json j_c = tensor_to_json(c); + nlohmann::json j_a = tensor_to_json(a); + nlohmann::json j_b = tensor_to_json(b); + nlohmann::json j_c = tensor_to_json(c); for (int i = 0; i < 3; i++) { - json j_iter = {}; + nlohmann::json j_iter = {}; j_iter["iter"] = i; j_iter["a"] = j_a; j_iter["b"] = j_b; @@ -131,36 +132,36 @@ TEST_CASE("Json Testing 3", "Json Tensor Indexing") { } std::ofstream ofs("j_iters.json"); - ofs << j << endl; - std::cout << j << endl; + ofs << j << std::endl; + std::cout << j << std::endl; // How can I make this an automatic template function? } TEST_CASE("print_QCSchema Test ", "Json Tensor Indexing") { - vec_pair_ints int_vals; - vec_pair_T double_vals; - vec_pair_tensor_T double_tensor_vals; + madness::vec_pair_ints int_vals; + madness::vec_pair_T double_vals; + madness::vec_pair_tensor_T double_tensor_vals; - json j={}; + nlohmann::json j={}; int_vals.push_back({"a", 4}); int_vals.push_back({"b", 5}); int_vals.push_back({"c", 4}); int_vals.push_back({"d", 6}); - to_json(j,int_vals); + madness::to_json(j,int_vals); double_vals.push_back({"aa", 4}); double_vals.push_back({"bb", 5}); double_vals.push_back({"cc", 4}); double_vals.push_back({"dd", 6}); - to_json(j,double_vals); + madness::to_json(j,double_vals); - Tensor t_a(3, 3); - Tensor t_b(3, 2, 4); - Tensor t_c(1, 3); + madness::Tensor t_a(3, 3); + madness::Tensor t_b(3, 2, 4); + madness::Tensor t_c(1, 3); double_tensor_vals.push_back({"t_a",t_a}); double_tensor_vals.push_back({"t_b",t_b}); @@ -168,27 +169,27 @@ TEST_CASE("print_QCSchema Test ", "Json Tensor Indexing") { to_json(j,double_tensor_vals); - output_schema( "test_schema", j); + madness::output_schema( "test_schema", j); } TEST_CASE("Response Parameters Test ", "Testing parameters to_json") { int argc = 1; char** argv = nullptr; - initialize(argc, argv); // initializes a world argument with argc and argv + madness::initialize(argc, argv); // initializes a world argument with argc and argv { - World world(SafeMPI::COMM_WORLD); + madness::World world(SafeMPI::COMM_WORLD); startup(world, 1, nullptr, true); // TODO: ask Robert about proper startup and implement molresponse::start_timer(world); // Everything goes in here - ResponseParameters r_params; - json j; + madness::ResponseParameters r_params; + nlohmann::json j; r_params.to_json(j); world.gop.fence(); - std::cout< Date: Tue, 13 Sep 2022 19:02:57 -0400 Subject: [PATCH 0704/1312] add fence before computing theta_x --- src/apps/molresponse/ResponseBase.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 928b66f7ea9..ee5ea61d05b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -415,6 +415,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + world.gop.fence(); Theta_X = (V0X - E0X) + gamma; Theta_X.truncate(); // Theta_X.truncate(); From 25c309c8c37a26510c58b6afef552efa03e991b3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 14 Sep 2022 17:51:05 -0400 Subject: [PATCH 0705/1312] printing on rank 0 --- src/apps/molresponse/FrequencyResponse.cpp | 62 +++++++++++----------- src/apps/molresponse/ResponseBase.cpp | 6 ++- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6be3e25826f..776b4aa9ed6 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -35,13 +35,13 @@ void FrequencyResponse::iterate(World &world) { XCOperator xc = make_xc_operator(world); // create X space residuals - X_space residuals=X_space::zero_functions(world, m, n); + X_space residuals = X_space::zero_functions(world, m, n); std::vector x_vectors; std::vector x_residuals; - x_vectors= to_response_matrix(Chi); - x_residuals= to_response_matrix(residuals); + x_vectors = to_response_matrix(Chi); + x_residuals = to_response_matrix(residuals); /* for (size_t b = 0; b < m; b++) { x_vectors.emplace_back(Chi, b); @@ -51,16 +51,18 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, 2*n), true)); + kain_x_space.push_back(XNonlinearSolver( + response_matrix_allocator(world, 2 * n), true)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } // // We compute with positive frequencies - print("Warning input frequency is assumed to be positive"); - print("Computing at positive frequency omega = ", omega); + if (world.rank() == 0) { + print("Warning input frequency is assumed to be positive"); + print("Computing at positive frequency omega = ", omega); + } double x_shifts = 0.0; double y_shifts = 0.0; // if less negative orbital energy + frequency is positive or greater than 0 @@ -179,8 +181,8 @@ void FrequencyResponse::iterate(World &world) { } } - // std::cout << "MPI BARRIER before update " << std::endl; - // world.mpi.Barrier(); + // std::cout << "MPI BARRIER before update " << std::endl; + // world.mpi.Barrier(); auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, x_vectors, x_residuals, iter, max_rotation); @@ -271,14 +273,14 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator double &x_shifts, double &omega_n, response_solver &kain_x_space, response_matrix &Xvector, response_matrix &Xresidual, size_t iteration, const double &maxrotn) --> std::tuple { + -> std::tuple { - // print("before start time ", r_params.print_level()); -// std::cout << "MPI BARRIER 2 " << std::endl; - // world.mpi.Barrier(); + // print("before start time ", r_params.print_level()); + // std::cout << "MPI BARRIER 2 " << std::endl; + // world.mpi.Barrier(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // std::cout << "MPI BARRIER 3 " << std::endl; + // std::cout << "MPI BARRIER 3 " << std::endl; //world.mpi.Barrier(); size_t m = chi.num_states(); @@ -286,8 +288,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); - // std::cout << "MPI BARRIER After Theta X " << std::endl; - // world.mpi.Barrier(); + // std::cout << "MPI BARRIER After Theta X " << std::endl; + // world.mpi.Barrier(); // compute residual X_space X_space new_chi = @@ -319,10 +321,10 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts) --> X_space { + -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank()==0){ + if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } @@ -400,16 +402,16 @@ void FrequencyResponse::save(World &world, const std::string &name) { // (for i from 0 to m-1 ) // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar & r_params.archive(); - ar & r_params.tda(); - ar & r_params.num_orbitals(); - ar & r_params.num_states(); + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; } } @@ -433,20 +435,20 @@ void FrequencyResponse::load(World &world, const std::string &name) { // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar & r_params.archive(); - ar & r_params.tda(); - ar & r_params.num_orbitals(); - ar & r_params.num_states(); + ar &r_params.archive(); + ar &r_params.tda(); + ar &r_params.num_orbitals(); + ar &r_params.num_states(); Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; world.gop.fence(); if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; world.gop.fence(); } } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ee5ea61d05b..9dc6b5cf8c6 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -246,8 +246,10 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const { traceOfHamiltonian += new_hamiltonian(i, i); } - print("Trace of Hamiltonian"); - print(traceOfHamiltonian); + if (world.rank() == 0) { + print("Trace of Hamiltonian"); + print(traceOfHamiltonian); + } // Save a matrix that is // (T+phiVphi) - Lambda * eye // Copy new_hamiltonian and zero the diagonal From 4556cac058d4130e148ba176c6f35ba73a4fb62e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 14 Sep 2022 17:51:20 -0400 Subject: [PATCH 0706/1312] param set on rank 0 --- src/apps/molresponse/testing/runners.hpp | 57 +++++++++++++----------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 3c8dcf1e15a..af78f2afc52 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -415,50 +415,50 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo bool high_prec) { CalculationParameters param1; + json calcInfo; - param1.set_user_defined_value("maxiter", 20); - //param1.set_user_defined_value("Kain", true); + if (world.rank() == 0) { - param1.set_user_defined_value("xc", moldftSchema.xc); - param1.set_user_defined_value("l", 200); + param1.set_user_defined_value("maxiter", 20); + //param1.set_user_defined_value("Kain", true); - if (high_prec) { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - param1.set_user_defined_value("dconv", 1e-6); - } else { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); - param1.set_user_defined_value("dconv", 1e-4); - } + param1.set_user_defined_value("xc", moldftSchema.xc); + param1.set_user_defined_value("l", 200); - param1.set_user_defined_value("localize", "new"); + if (high_prec) { + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + param1.set_user_defined_value("dconv", 1e-6); + } else { + param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); + param1.set_user_defined_value("dconv", 1e-4); + } - CalculationParameters param_calc; - json calcInfo; - world.gop.fence(); - if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { - if (world.rank() == 0) { + param1.set_user_defined_value("localize", "new"); + CalculationParameters param_calc; + if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { std::cout << "Reading Calc Info JSON" << std::endl; - } - std::ifstream ifs(moldftSchema.calc_info_json_path); - ifs >> calcInfo; - param_calc.from_json(calcInfo["parameters"]); - if (world.rank() == 0) { + std::ifstream ifs(moldftSchema.calc_info_json_path); + ifs >> calcInfo; + param_calc.from_json(calcInfo["parameters"]); print(param1.print_to_string()); print(param_calc.print_to_string()); + print("param1 != param_calc = ", param1 != param_calc); } + } + world.gop.broadcast_serializable(param1, 0); + world.gop.broadcast(calcInfo, 0); + //If the parameters are exactly equal do not run // If calc info doesn't exist the param_calc will definitely be different // if parameters are different or if I want to run no matter what run // if I want to restart and if I can. restart - if (world.rank() == 0) { - print("param1 != param_calc = ", param1 != param_calc); - } - if (tryMOLDFT(param1, param_calc) || try_run) { + if (try_run) { if (world.rank() == 0) { print("-------------Running moldft------------"); } + world.gop.fence(); // if params are different run and if restart exists and if im asking to restar if (std::filesystem::exists(moldftSchema.moldft_restart) && restart) { param1.set_user_defined_value("restart", true); @@ -472,8 +472,10 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo commandlineparser parser; parser.set_keyval("input", "moldft.in"); world.gop.fence(); + SCF calc(world, parser); calc.set_protocol<3>(world, 1e-4); + MolecularEnergy ME(world, calc); // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! @@ -704,7 +706,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, calc.solve(world); world.gop.fence(); // set protocol to the first - if(world.rank()==0){ + if (world.rank() == 0) { //calc.time_data.to_json(calc.j_molresponse); calc.output_json(); } @@ -870,6 +872,7 @@ void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, } } std::filesystem::current_path(m_schema.moldft_path); + world.gop.fence(); if (world.rank() == 0) { cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; } From e412b35f67e938a39ce5a11a9408e3b5c09c21d6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 14 Sep 2022 17:55:30 -0400 Subject: [PATCH 0707/1312] fixing mad-freq case --- src/madness/chem/molecule.h | 682 ++++++++++++++++++------------------ 1 file changed, 337 insertions(+), 345 deletions(-) diff --git a/src/madness/chem/molecule.h b/src/madness/chem/molecule.h index f2085fc1786..79801453dc6 100644 --- a/src/madness/chem/molecule.h +++ b/src/madness/chem/molecule.h @@ -36,8 +36,8 @@ /// \brief Declaration of molecule related classes and functions #include -#include -#include +#include +#include #include #include #include @@ -53,474 +53,466 @@ namespace madness { -class World; + class World; -class Atom { -public: - double x, y, z, q; ///< Coordinates and charge in atomic units - unsigned int atomic_number; ///< Atomic number - double mass; ///< Mass - bool pseudo_atom; ///< Indicates if this atom uses a pseudopotential + class Atom { + public: + double x, y, z, q; ///< Coordinates and charge in atomic units + unsigned int atomic_number;///< Atomic number + double mass; ///< Mass + bool pseudo_atom; ///< Indicates if this atom uses a pseudopotential - explicit Atom(double x, double y, double z, double q, unsigned int atomic_number, bool pseudo_atom) + explicit Atom(double x, double y, double z, double q, unsigned int atomic_number, bool pseudo_atom) : x(x), y(y), z(z), q(q), atomic_number(atomic_number), pseudo_atom(pseudo_atom) { - mass= get_atomic_data(atomic_number).mass; + mass = get_atomic_data(atomic_number).mass; - if (mass==-1.0) MADNESS_EXCEPTION("faulty element in Atom",1); + if (mass == -1.0) MADNESS_EXCEPTION("faulty element in Atom", 1); - // unstable elements are indicated by negative masses, the mass - // is taken from the longest-living element - if (mass<0.0) mass*=-1.0; - - } + // unstable elements are indicated by negative masses, the mass + // is taken from the longest-living element + if (mass < 0.0) mass *= -1.0; + } - explicit Atom(double x, double y, double z, double q, unsigned int atomic_number) + explicit Atom(double x, double y, double z, double q, unsigned int atomic_number) : x(x), y(y), z(z), q(q), atomic_number(atomic_number) { - mass= get_atomic_data(atomic_number).mass; - - if (mass==-1.0) MADNESS_EXCEPTION("faulty element in Atom",1); + mass = get_atomic_data(atomic_number).mass; - // unstable elements are indicated by negative masses, the mass - // is taken from the longest-living element - if (mass<0.0) mass*=-1.0; + if (mass == -1.0) MADNESS_EXCEPTION("faulty element in Atom", 1); - pseudo_atom = false; + // unstable elements are indicated by negative masses, the mass + // is taken from the longest-living element + if (mass < 0.0) mass *= -1.0; - } + pseudo_atom = false; + } - Atom(const Atom& a) : x(a.x), y(a.y), z(a.z), q(a.q), - atomic_number(a.atomic_number), mass(a.mass), pseudo_atom(a.pseudo_atom) {} + Atom(const Atom &a) : x(a.x), y(a.y), z(a.z), q(a.q), + atomic_number(a.atomic_number), mass(a.mass), pseudo_atom(a.pseudo_atom) {} - /// Default construct makes a zero charge ghost atom at origin - Atom() : x(0), y(0), z(0), q(0), atomic_number(0), mass(0.0), pseudo_atom(false) {} + /// Default construct makes a zero charge ghost atom at origin + Atom() : x(0), y(0), z(0), q(0), atomic_number(0), mass(0.0), pseudo_atom(false) {} - int get_atomic_number() const {return atomic_number;} + int get_atomic_number() const { return atomic_number; } - madness::Vector get_coords() const { - return madness::Vector{x, y, z}; - } + madness::Vector get_coords() const { + return madness::Vector{x, y, z}; + } - /// return the mass in atomic units (electron mass = 1 a.u.) - double get_mass_in_au() const {return constants::atomic_mass_in_au * mass;} + /// return the mass in atomic units (electron mass = 1 a.u.) + double get_mass_in_au() const { return constants::atomic_mass_in_au * mass; } - template - void serialize(Archive& ar) { - ar & x & y & z & q & atomic_number & mass & pseudo_atom; - } -}; + template + void serialize(Archive &ar) { + ar &x &y &z &q &atomic_number &mass &pseudo_atom; + } + }; -std::ostream& operator<<(std::ostream& s, const Atom& atom); + std::ostream &operator<<(std::ostream &s, const Atom &atom); -class Molecule { -public: - struct GeometryParameters : public QCCalculationParametersBase { - GeometryParameters(const GeometryParameters& other) = default; + class Molecule { + public: + struct GeometryParameters : public QCCalculationParametersBase { + GeometryParameters(const GeometryParameters &other) = default; - GeometryParameters(World& world, const commandlineparser& parser) : GeometryParameters() { - try { - set_global_convenience_options(parser); - read_input_and_commandline_options(world, parser, "geometry"); - set_derived_values(parser); + GeometryParameters(World &world, const commandlineparser &parser) : GeometryParameters() { + try { + set_global_convenience_options(parser); + read_input_and_commandline_options(world, parser, "geometry"); + set_derived_values(parser); - } catch (std::exception& e) { - print("geometry","end"); - throw; -// MADNESS_EXCEPTION("faulty geometry input",1); + } catch (std::exception &e) { + print("geometry", "end"); + throw; + // MADNESS_EXCEPTION("faulty geometry input",1); + } } - } - GeometryParameters() { - ignore_unknown_keys=true; - ignore_unknown_keys_silently=true; - throw_if_datagroup_not_found=true; + GeometryParameters() { + ignore_unknown_keys = true; + ignore_unknown_keys_silently = true; + throw_if_datagroup_not_found = true; -// initialize>("source",{"inputfile"},"where to get the coordinates from: ({inputfile}, {library,xxx}, {xyz,xxx.xyz})"); - initialize("source_type","inputfile","where to get the coordinates from",{"inputfile","xyz","library"}); - initialize("source_name","TBD","name of the geometry from the library or the input file"); - initialize("eprec",1.e-4,"smoothing for the nuclear potential"); - initialize("units","atomic","coordinate units",{"atomic","angstrom","bohr","au"}); - initialize>("field",{0.0,0.0,0.0},"external electric field"); - initialize ("no_orient",false,"if true the molecule coordinates will not be reoriented and/or symmetrized"); - initialize ("symtol",-1.e-2,"distance threshold for determining the symmetry-equivalent atoms; negative: old algorithm"); + // initialize>("source",{"inputfile"},"where to get the coordinates from: ({inputfile}, {library,xxx}, {xyz,xxx.xyz})"); + initialize("source_type", "inputfile", "where to get the coordinates from", {"inputfile", "xyz", "library"}); + initialize("source_name", "TBD", "name of the geometry from the library or the input file"); + initialize("eprec", 1.e-4, "smoothing for the nuclear potential"); + initialize("units", "atomic", "coordinate units", {"atomic", "angstrom", "bohr", "au"}); + initialize>("field", {0.0, 0.0, 0.0}, "external electric field"); + initialize("no_orient", false, "if true the molecule coordinates will not be reoriented and/or symmetrized"); + initialize("symtol", -1.e-2, "distance threshold for determining the symmetry-equivalent atoms; negative: old algorithm"); initialize ("core_type","none","core potential type",{"none","mcp"}); - initialize ("psp_calc",false,"pseudopotential calculation for all atoms"); - initialize ("pure_ae",true,"pure all electron calculation with no pseudo-atoms"); - - } - - void set_global_convenience_options(const commandlineparser& parser) { - - if (parser.key_exists("geometry")) { - set_user_defined_value("source_name",parser.value("geometry")); + initialize("psp_calc", false, "pseudopotential calculation for all atoms"); + initialize("pure_ae", true, "pure all electron calculation with no pseudo-atoms"); } - } - - void set_derived_values(const commandlineparser& parser) { - // check if we use an xyz file, the structure library or the input file - set_derived_value("source_name",parser.value("input")); // will not override user input - std::string src_type= derive_source_type_from_name(source_name(), parser); - set_derived_value("source_type",src_type); - - // check for ambiguities in the derived source type - if (not is_user_defined("source_type")) { - std::ifstream f(source_name().c_str()); - bool found_geometry_file=f.good(); -// bool found_geometry_file=std::filesystem::exists(source_name()); - - bool geometry_found_in_library=true; - try { // check for existence of file and structure in the library - std::ifstream f; - position_stream_in_library(f,source_name()); - } catch(...){ - geometry_found_in_library=false; - } + void set_global_convenience_options(const commandlineparser &parser) { - if (found_geometry_file and geometry_found_in_library) { - madness::print("\n\n"); - madness::print("geometry specification ambiguous: found geometry in the structure library and in a file\n"); - madness::print(" ",get_structure_library_path()); - madness::print(" ",source_name()); - madness::print("\nPlease specify the location of your geometry input by one of the two lines:\n"); - madness::print(" source_type xyz"); - madness::print(" source_type library\n\n"); - MADNESS_EXCEPTION("faulty input\n\n",1); + if (parser.key_exists("geometry")) { + set_user_defined_value("source_name", parser.value("geometry")); } } -// std::vector src=source(); -// -// // some convenience for the user -// -// // if source is the input file provide the name of the input file -// if (src.size()==1 and src[0]=="inputfile") -// set_derived_value("source",std::vector({src[0],parser.value("input")})); -// // if source is not "inputfile" or "library" assume an xyz file -// if (src.size()==1 and src[0]!="inputfile") { -// std::size_t found=src[0].find("xyz"); -// if (found==src[0].size()-3) { // check input file ends with xyz -// set_user_defined_value("source", std::vector({"xyz", src[0]})); -// } else { -// throw std::runtime_error("error in deriving geometry parameters"); -// } -// } - - if (source_type()=="xyz") set_derived_value("units",std::string("angstrom")); - if (units()=="bohr" or units()=="au") set_derived_value("units","atomic"); - } - - std::string source_type() const {return get("source_type");} - std::string source_name() const {return get("source_name");} - std::vector field() const {return get>("field");} - double eprec() const {return get("eprec");} - std::string units() const {return get("units");} - std::string core_type() const {return get("core_type");} - bool psp_calc() const {return get("psp_calc");} - bool pure_ae() const {return get("pure_ae");} - bool no_orient() const {return get("no_orient");} - double symtol() const {return get("symtol");} - - static std::string derive_source_type_from_name(const std::string name, - const commandlineparser& parser) { - if (name==parser.value("input")) return "inputfile"; - std::size_t pos = name.find(".xyz"); - if (pos!=std::string::npos) return "xyz"; - return "library"; - } - - }; - -private: - // If you add more fields don't forget to serialize them - std::vector atoms; - std::vector rcut; // Reciprocal of the smoothing radius - CorePotentialManager core_pot; - madness::Tensor field; - - /// The molecular point group is automatically assigned in the identify_pointgroup function - std::string pointgroup_="c1"; + void set_derived_values(const commandlineparser &parser) { + // check if we use an xyz file, the structure library or the input file + set_derived_value("source_name", parser.value("input"));// will not override user input + std::string src_type = derive_source_type_from_name(source_name(), parser); + set_derived_value("source_type", src_type); + + // check for ambiguities in the derived source type + if (is_user_defined("source_type")) {// TODO breaks if i create molecule and then read and write to param write inputfile and read... runner.hpp + std::ifstream f(source_name().c_str()); + bool found_geometry_file = f.good(); + // bool found_geometry_file=std::filesystem::exists(source_name()); + + bool geometry_found_in_library = true; + try {// check for existence of file and structure in the library + std::ifstream f; + position_stream_in_library(f, source_name()); + } catch (...) { + geometry_found_in_library = false; + } + + if (found_geometry_file and geometry_found_in_library) { + madness::print("\n\n"); + madness::print("geometry specification ambiguous: found geometry in the structure library and in a file\n"); + madness::print(" ", get_structure_library_path()); + madness::print(" ", source_name()); + madness::print("\nPlease specify the location of your geometry input by one of the two lines:\n"); + madness::print(" source_type xyz"); + madness::print(" source_type library\n\n"); + MADNESS_EXCEPTION("faulty input\n\n", 1); + } + } -public: - GeometryParameters parameters; + // std::vector src=source(); + // + // // some convenience for the user + // + // // if source is the input file provide the name of the input file + // if (src.size()==1 and src[0]=="inputfile") + // set_derived_value("source",std::vector({src[0],parser.value("input")})); + // // if source is not "inputfile" or "library" assume an xyz file + // if (src.size()==1 and src[0]!="inputfile") { + // std::size_t found=src[0].find("xyz"); + // if (found==src[0].size()-3) { // check input file ends with xyz + // set_user_defined_value("source", std::vector({"xyz", src[0]})); + // } else { + // throw std::runtime_error("error in deriving geometry parameters"); + // } + // } + + if (source_type() == "xyz") set_derived_value("units", std::string("angstrom")); + if (units() == "bohr" or units() == "au") set_derived_value("units", "atomic"); + } - static void print_parameters(); + std::string source_type() const { return get("source_type"); } + std::string source_name() const { return get("source_name"); } + std::vector field() const { return get>("field"); } + double eprec() const { return get("eprec"); } + std::string units() const { return get("units"); } + std::string core_type() const { return get("core_type"); } + bool psp_calc() const { return get("psp_calc"); } + bool pure_ae() const { return get("pure_ae"); } + bool no_orient() const { return get("no_orient"); } + double symtol() const { return get("symtol"); } + + static std::string derive_source_type_from_name(const std::string name, + const commandlineparser &parser) { + if (name == parser.value("input")) return "inputfile"; + std::size_t pos = name.find(".xyz"); + if (pos != std::string::npos) return "xyz"; + return "library"; + } + }; - std::string get_pointgroup() const {return pointgroup_;} + private: + // If you add more fields don't forget to serialize them + std::vector atoms; + std::vector rcut;// Reciprocal of the smoothing radius + CorePotentialManager core_pot; + madness::Tensor field; -private: + /// The molecular point group is automatically assigned in the identify_pointgroup function + std::string pointgroup_ = "c1"; - void swapaxes(int ix, int iy); + public: + GeometryParameters parameters; - template - bool test_for_op(opT op, const double symtol) const; + static void print_parameters(); - template - void symmetrize_for_op(opT op, const double symtol); + std::string get_pointgroup() const { return pointgroup_; } - template - int find_symmetry_equivalent_atom(int iatom, opT op, const double symtol) const; + private: + void swapaxes(int ix, int iy); - bool test_for_c2(double xaxis, double yaxis, double zaxis, const double symtol) const; + template + bool test_for_op(opT op, const double symtol) const; - bool test_for_sigma(double xaxis, double yaxis, double zaxis, const double symtol) const; + template + void symmetrize_for_op(opT op, const double symtol); - bool test_for_inverse(const double symtol) const; + template + int find_symmetry_equivalent_atom(int iatom, opT op, const double symtol) const; - /// Apply to (x,y,z) a C2 rotation about an axis thru the origin and (xaxis,yaxis,zaxis) - struct apply_c2{ - double xaxis, yaxis, zaxis; - apply_c2(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} - void operator()(double& x, double& y, double& z) const { - double raxissq = xaxis*xaxis + yaxis*yaxis + zaxis*zaxis; - double dx = x*xaxis*xaxis/raxissq; - double dy = y*yaxis*yaxis/raxissq; - double dz = z*zaxis*zaxis/raxissq; - x = 2.0*dx - x; - y = 2.0*dy - y; - z = 2.0*dz - z; - } - }; + bool test_for_c2(double xaxis, double yaxis, double zaxis, const double symtol) const; - /// Apply to (x,y,z) a reflection through a plane containing the origin with normal (xaxis,yaxis,zaxis) - struct apply_sigma{ - double xaxis, yaxis, zaxis; - apply_sigma(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} - void operator()(double& x, double& y, double& z) const { - double raxissq = xaxis * xaxis + yaxis * yaxis + zaxis * zaxis; - double dx = x * xaxis * xaxis / raxissq; - double dy = y * yaxis * yaxis / raxissq; - double dz = z * zaxis * zaxis / raxissq; - - x = x - 2.0 * dx; - y = y - 2.0 * dy; - z = z - 2.0 * dz; - } - }; + bool test_for_sigma(double xaxis, double yaxis, double zaxis, const double symtol) const; - struct apply_inverse{ - double xaxis, yaxis, zaxis; - apply_inverse(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} - void operator()(double& x, double& y, double& z) const { - x = -x; - y = -y; - z = -z; - } - }; + bool test_for_inverse(const double symtol) const; -public: + /// Apply to (x,y,z) a C2 rotation about an axis thru the origin and (xaxis,yaxis,zaxis) + struct apply_c2 { + double xaxis, yaxis, zaxis; + apply_c2(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} + void operator()(double &x, double &y, double &z) const { + double raxissq = xaxis * xaxis + yaxis * yaxis + zaxis * zaxis; + double dx = x * xaxis * xaxis / raxissq; + double dy = y * yaxis * yaxis / raxissq; + double dz = z * zaxis * zaxis / raxissq; + x = 2.0 * dx - x; + y = 2.0 * dy - y; + z = 2.0 * dz - z; + } + }; + + /// Apply to (x,y,z) a reflection through a plane containing the origin with normal (xaxis,yaxis,zaxis) + struct apply_sigma { + double xaxis, yaxis, zaxis; + apply_sigma(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} + void operator()(double &x, double &y, double &z) const { + double raxissq = xaxis * xaxis + yaxis * yaxis + zaxis * zaxis; + double dx = x * xaxis * xaxis / raxissq; + double dy = y * yaxis * yaxis / raxissq; + double dz = z * zaxis * zaxis / raxissq; + + x = x - 2.0 * dx; + y = y - 2.0 * dy; + z = z - 2.0 * dz; + } + }; + + struct apply_inverse { + double xaxis, yaxis, zaxis; + apply_inverse(double xaxis, double yaxis, double zaxis) : xaxis(xaxis), yaxis(yaxis), zaxis(zaxis) {} + void operator()(double &x, double &y, double &z) const { + x = -x; + y = -y; + z = -z; + } + }; - /// Makes a molecule with zero atoms - Molecule() : atoms(), rcut(), core_pot(), field(3L) {}; + public: + /// Makes a molecule with zero atoms + Molecule() : atoms(), rcut(), core_pot(), field(3L){}; - /// makes a molecule from a list of atoms - Molecule(std::vector atoms, double eprec, CorePotentialManager core_pot = {}, madness::Tensor field = madness::Tensor(3L)); + /// makes a molecule from a list of atoms + Molecule(std::vector atoms, double eprec, CorePotentialManager core_pot = {}, madness::Tensor field = madness::Tensor(3L)); - /// makes a molecule using contents of \p parser - Molecule(World& world, const commandlineparser& parser); + /// makes a molecule using contents of \p parser + Molecule(World &world, const commandlineparser &parser); - void get_structure(); + void get_structure(); - void read_structure_from_library(const std::string& name); + void read_structure_from_library(const std::string &name); - static std::istream& position_stream_in_library(std::ifstream& f, const std::string& name); + static std::istream &position_stream_in_library(std::ifstream &f, const std::string &name); - static std::string get_structure_library_path(); + static std::string get_structure_library_path(); - /// print out a Gaussian cubefile header - std::vector cubefile_header() const; + /// print out a Gaussian cubefile header + std::vector cubefile_header() const; - // initializes Molecule using the contents of file \c filename - void read_file(const std::string& filename); + // initializes Molecule using the contents of file \c filename + void read_file(const std::string &filename); - // initializes Molecule using the contents of stream \c f - void read(std::istream& f); + // initializes Molecule using the contents of stream \c f + void read(std::istream &f); - // initializes Molecule using the contents of file \c filenam assuming an xyz file - void read_xyz(const std::string filename); + // initializes Molecule using the contents of file \c filenam assuming an xyz file + void read_xyz(const std::string filename); - void read_core_file(const std::string& filename); + void read_core_file(const std::string &filename); - std::string guess_file() const { return core_pot.guess_file(); }; + std::string guess_file() const { return core_pot.guess_file(); }; - unsigned int n_core_orb_all() const ; + unsigned int n_core_orb_all() const; - unsigned int n_core_orb(unsigned int atn) const { - if (core_pot.is_defined(atn)) - return core_pot.n_core_orb_base(atn); - else - return 0; - }; + unsigned int n_core_orb(unsigned int atn) const { + if (core_pot.is_defined(atn)) + return core_pot.n_core_orb_base(atn); + else + return 0; + }; - unsigned int get_core_l(unsigned int atn, unsigned int c) const { - return core_pot.get_core_l(atn, c); - } + unsigned int get_core_l(unsigned int atn, unsigned int c) const { + return core_pot.get_core_l(atn, c); + } - double get_core_bc(unsigned int atn, unsigned int c) const { - return core_pot.get_core_bc(atn, c); - } + double get_core_bc(unsigned int atn, unsigned int c) const { + return core_pot.get_core_bc(atn, c); + } - double core_eval(int atom, unsigned int core, int m, double x, double y, double z) const; + double core_eval(int atom, unsigned int core, int m, double x, double y, double z) const; - double core_derivative(int atom, int axis, unsigned int core, int m, double x, double y, double z) const; + double core_derivative(int atom, int axis, unsigned int core, int m, double x, double y, double z) const; - bool is_potential_defined(unsigned int atn) const { return core_pot.is_defined(atn); }; + bool is_potential_defined(unsigned int atn) const { return core_pot.is_defined(atn); }; - bool is_potential_defined_atom(int i) const { return core_pot.is_defined(atoms[i].atomic_number); }; + bool is_potential_defined_atom(int i) const { return core_pot.is_defined(atoms[i].atomic_number); }; - void add_atom(double x, double y, double z, double q, int atn); + void add_atom(double x, double y, double z, double q, int atn); - void add_atom(double x, double y, double z, double q, int atn, bool psat); + void add_atom(double x, double y, double z, double q, int atn, bool psat); - size_t natom() const { - return atoms.size(); - }; + size_t natom() const { + return atoms.size(); + }; - void set_atom_charge(unsigned int i, double zeff); + void set_atom_charge(unsigned int i, double zeff); - unsigned int get_atom_charge(unsigned int i) const; + unsigned int get_atom_charge(unsigned int i) const; - unsigned int get_atomic_number(unsigned int i) const; + unsigned int get_atomic_number(unsigned int i) const; - void set_pseudo_atom(unsigned int i, bool psat); + void set_pseudo_atom(unsigned int i, bool psat); - bool get_pseudo_atom(unsigned int i) const; + bool get_pseudo_atom(unsigned int i) const; - void set_atom_coords(unsigned int i, double x, double y, double z); + void set_atom_coords(unsigned int i, double x, double y, double z); - madness::Tensor get_all_coords() const; + madness::Tensor get_all_coords() const; - std::vector< madness::Vector > get_all_coords_vec() const; + std::vector> get_all_coords_vec() const; - std::vector atomic_radii; + std::vector atomic_radii; - void set_all_coords(const madness::Tensor& newcoords); + void set_all_coords(const madness::Tensor &newcoords); - void update_rcut_with_eprec(double value); + void update_rcut_with_eprec(double value); - void set_rcut(double value); + void set_rcut(double value); - std::vector get_rcut() const {return rcut;} + std::vector get_rcut() const { return rcut; } - void set_core_eprec(double value) { - core_pot.set_eprec(value); - } + void set_core_eprec(double value) { + core_pot.set_eprec(value); + } - void set_core_rcut(double value) { - core_pot.set_rcut(value); - } + void set_core_rcut(double value) { + core_pot.set_rcut(value); + } - double get_eprec() const { - return parameters.eprec(); - } + double get_eprec() const { + return parameters.eprec(); + } - double bounding_cube() const; + double bounding_cube() const; - const Atom& get_atom(unsigned int i) const; + const Atom &get_atom(unsigned int i) const; - const std::vector & get_atoms()const{return atoms;} + const std::vector &get_atoms() const { return atoms; } - void print() const; + void print() const; - double inter_atomic_distance(unsigned int i,unsigned int j) const; + double inter_atomic_distance(unsigned int i, unsigned int j) const; - double nuclear_repulsion_energy() const; + double nuclear_repulsion_energy() const; - double nuclear_repulsion_derivative(size_t iatom, int axis) const; + double nuclear_repulsion_derivative(size_t iatom, int axis) const; - /// compute the nuclear-nuclear contribution to the second derivatives + /// compute the nuclear-nuclear contribution to the second derivatives - /// @param[in] iatom the i-th atom (row of the hessian) - /// @param[in] jatom the j-th atom (column of the hessian) - /// @param[in] iaxis the xyz axis of the i-th atom - /// @param[in] jaxis the xyz axis of the j-th atom - /// return the (3*iatom + iaxis, 3*jatom + jaxis) matix element of the hessian - double nuclear_repulsion_second_derivative(int iatom, int jatom, - int iaxis, int jaxis) const; + /// @param[in] iatom the i-th atom (row of the hessian) + /// @param[in] jatom the j-th atom (column of the hessian) + /// @param[in] iaxis the xyz axis of the i-th atom + /// @param[in] jaxis the xyz axis of the j-th atom + /// return the (3*iatom + iaxis, 3*jatom + jaxis) matix element of the hessian + double nuclear_repulsion_second_derivative(int iatom, int jatom, + int iaxis, int jaxis) const; - /// return the hessian matrix of the second derivatives d^2/dxdy V + /// return the hessian matrix of the second derivatives d^2/dxdy V - /// no factor 0.5 included - Tensor nuclear_repulsion_hessian() const; + /// no factor 0.5 included + Tensor nuclear_repulsion_hessian() const; - /// compute the dipole moment of the nuclei + /// compute the dipole moment of the nuclei - /// @param[in] axis the axis (x, y, z) - double nuclear_dipole(int axis) const; + /// @param[in] axis the axis (x, y, z) + double nuclear_dipole(int axis) const; - /// compute the derivative of the nuclear dipole wrt a nuclear displacement + /// compute the derivative of the nuclear dipole wrt a nuclear displacement - /// @param[in] atom the atom which will be displaced - /// @param[in] axis the axis where the atom will be displaced - /// @return a vector which all 3 components of the dipole derivative - Tensor nuclear_dipole_derivative(const int atom, const int axis) const; + /// @param[in] atom the atom which will be displaced + /// @param[in] axis the axis where the atom will be displaced + /// @return a vector which all 3 components of the dipole derivative + Tensor nuclear_dipole_derivative(const int atom, const int axis) const; - double nuclear_charge_density(double x, double y, double z) const; + double nuclear_charge_density(double x, double y, double z) const; - double mol_nuclear_charge_density(double x, double y, double z) const; + double mol_nuclear_charge_density(double x, double y, double z) const; - double smallest_length_scale() const; + double smallest_length_scale() const; - std::string symmetrize_and_identify_point_group(const double symtol); + std::string symmetrize_and_identify_point_group(const double symtol); - /// Moves the center of nuclear charge to the origin - void center(); + /// Moves the center of nuclear charge to the origin + void center(); - /// rotates the molecule and the external field + /// rotates the molecule and the external field - /// @param[in] D the rotation matrix - void rotate(const Tensor& D); + /// @param[in] D the rotation matrix + void rotate(const Tensor &D); - /// translate the molecule - void translate(const Tensor& translation); + /// translate the molecule + void translate(const Tensor &translation); - Tensor center_of_mass() const; + Tensor center_of_mass() const; - /// compute the mass-weighting matrix for the hessian + /// compute the mass-weighting matrix for the hessian - /// use as - /// mass_weighted_hessian=inner(massweights,inner(hessian,massweights)); - Tensor massweights() const { + /// use as + /// mass_weighted_hessian=inner(massweights,inner(hessian,massweights)); + Tensor massweights() const { - Tensor M(3*natom(),3*natom()); - for (size_t i=0; i M(3 * natom(), 3 * natom()); + for (size_t i = 0; i < natom(); i++) { + const double sqrtmass = 1.0 / sqrt(get_atom(i).get_mass_in_au()); + M(3 * i, 3 * i) = sqrtmass; + M(3 * i + 1, 3 * i + 1) = sqrtmass; + M(3 * i + 2, 3 * i + 2) = sqrtmass; + } + return M; } - return M; - } - - Tensor moment_of_inertia() const; + Tensor moment_of_inertia() const; - void orient(bool verbose=false); + void orient(bool verbose = false); - double total_nuclear_charge() const; + double total_nuclear_charge() const; - /// nuclear attraction potential for the whole molecule - double nuclear_attraction_potential(double x, double y, double z) const; + /// nuclear attraction potential for the whole molecule + double nuclear_attraction_potential(double x, double y, double z) const; - /// nuclear attraction potential for a specific atom in the molecule - double atomic_attraction_potential(int iatom, double x, double y, double z) const; + /// nuclear attraction potential for a specific atom in the molecule + double atomic_attraction_potential(int iatom, double x, double y, double z) const; - double molecular_core_potential(double x, double y, double z) const; + double molecular_core_potential(double x, double y, double z) const; - double core_potential_derivative(int atom, int axis, double x, double y, double z) const; + double core_potential_derivative(int atom, int axis, double x, double y, double z) const; - double nuclear_attraction_potential_derivative(int atom, int axis, double x, double y, double z) const; + double nuclear_attraction_potential_derivative(int atom, int axis, double x, double y, double z) const; - double nuclear_attraction_potential_second_derivative(int atom, int iaxis, - int jaxis, double x, double y, double z) const; + double nuclear_attraction_potential_second_derivative(int atom, int iaxis, + int jaxis, double x, double y, double z) const; - template - void serialize(Archive& ar) { - ar & atoms & rcut & core_pot & parameters & pointgroup_ & field; - } -}; + template + void serialize(Archive &ar) { + ar &atoms &rcut &core_pot ¶meters &pointgroup_ &field; + } + }; -} +}// namespace madness #endif From d354248d950c71e16f24c7bbee222c15b019b3ae Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 11:39:32 -0400 Subject: [PATCH 0708/1312] exchange clean up --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/Plot_VTK.cc | 1 - src/apps/molresponse/ResponseBase.cpp | 51 ++++++++++++++++++---- src/apps/molresponse/response_functions.h | 12 ++--- src/apps/molresponse/response_parameters.h | 2 +- src/apps/molresponse/testing/runners.hpp | 4 +- src/apps/molresponse/x_space.cc | 44 +++++++++++++++++++ src/apps/molresponse/x_space.h | 23 ++++++---- 8 files changed, 110 insertions(+), 29 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 776b4aa9ed6..9248482623d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -52,7 +52,7 @@ void FrequencyResponse::iterate(World &world) { response_solver kain_x_space; for (size_t b = 0; b < m; b++) { kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, 2 * n), true)); + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } diff --git a/src/apps/molresponse/Plot_VTK.cc b/src/apps/molresponse/Plot_VTK.cc index 0bc22880647..b6e6d4088c7 100644 --- a/src/apps/molresponse/Plot_VTK.cc +++ b/src/apps/molresponse/Plot_VTK.cc @@ -254,4 +254,3 @@ void do_vtk_plots(World &world, } } // namespace madness -// Dueces diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 9dc6b5cf8c6..8be5241e05c 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -518,18 +518,39 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + auto xy = to_response_matrix(d_alpha); + auto yx = to_conjugate_response_matrix(d_alpha); + + + auto exchange_response = create_response_matrix(m, 2 * n); + auto conjugate_exchange_response = create_response_matrix(m, 2 * n); + + world.gop.fence(); + auto phi0_response = copy(world, phi0); + std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi0_i) { phi0_response.push_back(madness::copy(phi0_i)); }); + std::transform(xy.begin(), xy.end(), exchange_response.begin(), [&](const auto &x) { return newK(x, phi0_response, phi0_response); }); + world.gop.fence(); + std::transform(yx.begin(), yx.end(), conjugate_exchange_response.begin(), [&](const auto &conj_x) { return newK(phi0_response, conj_x, phi0_response); }); + + auto kx = to_X_space(exchange_response); + auto ky = to_X_space(conjugate_exchange_response); + /* for (size_t b = 0; b < m; b++) { vecfuncT x, y; x = d_alpha.X[b]; y = d_alpha.Y[b]; // |x> - KX.X[b] = newK(x, phi0, phi0); KY.X[b] = newK(phi0, y, phi0); + KX.Y[b] = newK(phi0, x, phi0); // |y> + KX.X[b] = newK(x, phi0, phi0); KY.Y[b] = newK(y, phi0, phi0); - KX.Y[b] = newK(phi0, x, phi0); // |i> } + */ + + world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -548,7 +569,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit W.truncate(); */ - gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (kx + ky) * xcf.hf_exchange_coefficient() + W; //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); @@ -570,11 +591,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); print_inner(world, "xJx", d_alpha, J); - print_inner(world, "xKXx", d_alpha, KX); - print_inner(world, "xKYx", d_alpha, KY); - X_space K = KX + KY; + print_inner(world, "xKXx", d_alpha, kx); + print_inner(world, "xKYx", d_alpha, ky); + X_space K = kx + ky; world.gop.fence(); - print_inner(world, "xKx", d_alpha, KX); print_inner(world, "xWx", d_alpha, W); print_inner(world, "xGammax", d_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); @@ -590,6 +610,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit j_y.clear(); KX.clear(); KY.clear(); + kx.clear(); + ky.clear(); W.clear(); d_alpha.clear(); @@ -700,16 +722,27 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + // normal exchange + std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), [&](const auto &xi) { + return newK(xi, phi0, phi0); + }); + // conjugate exchange + std::transform(xy.Y.begin(), xy.Y.end(), KY.X.begin(), [&](const auto &yi) { + return newK(phi0, yi, phi0); + }); + + /* for (size_t b = 0; b < num_states; b++) { vecfuncT x, y; x = xy.X[b]; - y = xy.Y[b]; - // |x> KX.X[b] = newK(x, phi0, phi0); // |i> + y = xy.Y[b]; KY.X[b] = newK(phi0, y, phi0); // |y> } + */ if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index f8e025faeb6..afa5c34269d 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -271,7 +271,6 @@ namespace madness { response_space result(world, num_states, num_orbitals); - std::transform(x.begin(), x.end(), result.x.begin(), [&world](auto &xi) { return madness::copy(world, xi); }); world.gop.fence(); @@ -282,11 +281,12 @@ namespace madness { response_space copy(const std::shared_ptr>> &pmap, bool fence = false) const { - response_space result(x[0][0].world(), num_states, num_orbitals); + auto &world = x[0][0].world(); + response_space result(world, num_states, num_orbitals); + world.gop.fence(); + + std::transform(x.begin(), x.end(), result.x.begin(), [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); - for (size_t i = 0; i < num_states; i++) { - result.x[i] = madness::copy(x[0][0].world(), x[i], pmap, fence); - } return result; } @@ -327,7 +327,7 @@ namespace madness { const auto begin() const { return x.begin(); } - const auto end() const { return x.end(); } + [[nodiscard]] const auto end() const { return x.end(); } size_t size() const { return num_states; } diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index ffd7394d2a5..0aa8231534c 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -25,7 +25,7 @@ namespace madness { ResponseParameters(const ResponseParameters& other) = default; ResponseParameters() { - initialize("archive", "../moldft.restartdata", + initialize("archive", "../mad.restartdata", "file to read ground parameters from"); initialize("nwchem", false, "Using nwchem files for intelligent starting guess"); initialize("nwchem_dir", "none", diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index af78f2afc52..2f4702fe019 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -124,8 +124,8 @@ struct moldftSchema { xc(m_xc) { moldft_path = addPath(schema.xc_path, '/' + mol_name); - moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); - calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); + moldft_restart = addPath(moldft_path, "/mad.restartdata.00000"); + calc_info_json_path = addPath(moldft_path, "/mad.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index a78764010a4..f41ee2faef0 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -6,6 +6,12 @@ #include "response_functions.h" namespace madness { + auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) -> response_matrix { + + auto matrix = response_matrix(num_states); + std::for_each(matrix.begin(), matrix.end(), [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); + return matrix; + } auto to_response_matrix(const X_space &x) -> response_matrix { auto mX = response_matrix(x.num_states()); int b = 0; @@ -21,6 +27,21 @@ namespace madness { return mX; } + auto to_conjugate_response_matrix(const X_space &x) -> response_matrix { + auto mX = response_matrix(x.num_states()); + int b = 0; + auto num_orbitals = x.num_orbitals(); + std::for_each(mX.begin(), mX.end(), [&](auto &mi) { + //auto norm_vi = norm2(world, x_vec); + mi = vector_real_function_3d(2 * num_orbitals); + //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } + std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin()); + std::copy(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals); + b++; + }); + return mX; + } + /** * Flattens all response functions into a single vector of functions * @param x @@ -62,6 +83,29 @@ namespace madness { // if (world.rank() == 0) { print("norms after copy ", norms); } + return x_space; + } + auto to_conjugate_X_space(const response_matrix &x) -> X_space { + + World &world = x[0][0].world(); + + auto num_states = x.size(); + auto num_orbitals = size_t(x[0].size() / 2); + auto x_space = X_space(world, num_states, num_orbitals); + + int b = 0; + std::for_each(x.begin(), x.end(), [&](auto x_vec) { + //auto norm_vi = norm2(world, x_vec); + //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } + std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.Y[b].begin()); + std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.X[b].begin()); + b++; + }); + + // auto norms = x_space.norm2s(); + // if (world.rank() == 0) { print("norms after copy ", norms); } + + return x_space; } diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 0bae7a2c10f..1a598db4d53 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -15,9 +15,12 @@ namespace madness { struct X_space; + auto create_response_matrix(const size_t &num_state, const size_t &num_orbitals) -> response_matrix; auto to_response_matrix(const X_space &x) -> response_matrix; + auto to_conjugate_response_matrix(const X_space &x) -> response_matrix; auto to_flattened_vector(const X_space &x) -> vector_real_function_3d; auto to_X_space(const response_matrix &x) -> X_space; + auto to_conjugate_X_space(const response_matrix &x) -> X_space; struct X_space { private: size_t n_states; // Num. of resp. states @@ -38,10 +41,11 @@ namespace madness { X(A.X), Y(A.Y) {} X_space copy() const { - X_space copyX(X[0][0].world(), n_states, n_orbitals); - copyX.X = X.copy(); - copyX.Y = Y.copy(); - return copyX; + auto &world = X[0][0].world(); + auto m = to_response_matrix(*this); + auto copy_m = create_response_matrix(num_states(), num_orbitals()); + std::transform(m.begin(), m.end(), copy_m.begin(), [&](const auto &mi) { return madness::copy(world, mi, true); }); + return to_X_space(copy_m); } /// Create a new copy of the function with different distribution and optional /// fence @@ -51,10 +55,11 @@ namespace madness { /// collective. auto copy(const std::shared_ptr>> &pmap, bool fence = false) const -> X_space { - X_space copyX(X[0][0].world(), n_states, n_orbitals); - copyX.X = X.copy(pmap, fence); - copyX.Y = Y.copy(pmap, fence); - return copyX; + auto &world = X[0][0].world(); + auto m = to_response_matrix(*this); + auto copy_m = create_response_matrix(num_states(), num_orbitals()); + std::transform(m.begin(), m.end(), copy_m.begin(), [&](const auto &mi) { return madness::copy(world, mi, pmap, true); }); + return to_X_space(copy_m); } // assignment auto operator=(const X_space &B) -> X_space & { @@ -353,7 +358,7 @@ namespace madness { n_orbtials(n_orbtials) {} // overloading the default constructor () operator vector_real_function_3d operator()() { - print("allocator called with ", int(n_orbtials), " orbitals"); + //print("allocator called with ", int(n_orbtials), " orbitals"); // returning constructor of x_vector return zero_functions(world, n_orbtials); } From c19385862644f0fda9090cfd278ca29eee1dc4a1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 11:52:21 -0400 Subject: [PATCH 0709/1312] not sure waht is going on with the param.prefix but back to moldft --- src/apps/molresponse/response_parameters.h | 2 +- src/apps/molresponse/testing/runners.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index 0aa8231534c..ffd7394d2a5 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -25,7 +25,7 @@ namespace madness { ResponseParameters(const ResponseParameters& other) = default; ResponseParameters() { - initialize("archive", "../mad.restartdata", + initialize("archive", "../moldft.restartdata", "file to read ground parameters from"); initialize("nwchem", false, "Using nwchem files for intelligent starting guess"); initialize("nwchem_dir", "none", diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2f4702fe019..af78f2afc52 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -124,8 +124,8 @@ struct moldftSchema { xc(m_xc) { moldft_path = addPath(schema.xc_path, '/' + mol_name); - moldft_restart = addPath(moldft_path, "/mad.restartdata.00000"); - calc_info_json_path = addPath(moldft_path, "/mad.calc_info.json"); + moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); + calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); From 79437343170d69200ad9cdea17ae189c944e8933 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 15:27:07 -0400 Subject: [PATCH 0710/1312] Add a to respone vector function --- src/apps/molresponse/x_space.cc | 8 ++++++++ src/apps/molresponse/x_space.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index f41ee2faef0..38644836494 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -6,6 +6,14 @@ #include "response_functions.h" namespace madness { + auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d { + auto &world = vec[0].world(); + // copy the vector + auto response_vector = copy(world, vec); + // copy the vector + std::for_each(vec.begin(), vec.end(), [&](const auto &phi0_i) { response_vector.push_back(madness::copy(phi0_i)); }); + return response_vector; + } auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) -> response_matrix { auto matrix = response_matrix(num_states); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 1a598db4d53..3372c350197 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -15,6 +15,8 @@ namespace madness { struct X_space; + + auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d; auto create_response_matrix(const size_t &num_state, const size_t &num_orbitals) -> response_matrix; auto to_response_matrix(const X_space &x) -> response_matrix; auto to_conjugate_response_matrix(const X_space &x) -> response_matrix; From ceaf5c07263d2caf418896d761e8160abe5a65d2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 15:27:55 -0400 Subject: [PATCH 0711/1312] using to response vector function in exchange and create density --- src/apps/molresponse/ResponseBase.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 8be5241e05c..03e96f54238 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -297,12 +297,17 @@ auto ResponseBase::make_xc_operator(World &world) const -> XCOperator auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfuncT { - vecfuncT density; + auto density = vector_real_function_3d(chi.num_states()); auto calc_type = r_params.calc_type(); - if (calc_type == "full") { - density = transition_density(world, ground_orbitals, chi.X, chi.Y); - } else if (calc_type == "static") { - density = transition_density(world, ground_orbitals, chi.X, chi.X); + if (calc_type == "full" || "static") { + + auto r_matrix = to_response_matrix(chi); + auto r_phi0 = to_response_vector(ground_orbitals); + + std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), [&](const auto &ri) { + return dot(world, ri, r_phi0); + }); + } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } @@ -527,8 +532,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto conjugate_exchange_response = create_response_matrix(m, 2 * n); world.gop.fence(); - auto phi0_response = copy(world, phi0); - std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi0_i) { phi0_response.push_back(madness::copy(phi0_i)); }); + auto phi0_response = to_response_vector(phi0); std::transform(xy.begin(), xy.end(), exchange_response.begin(), [&](const auto &x) { return newK(x, phi0_response, phi0_response); }); world.gop.fence(); std::transform(yx.begin(), yx.end(), conjugate_exchange_response.begin(), [&](const auto &conj_x) { return newK(phi0_response, conj_x, phi0_response); }); @@ -1679,6 +1683,7 @@ auto solid_harmonics(World &world, int n) -> std::map, real_fun return result; } + vector_real_function_3d transition_density(World &world, const vector_real_function_3d &orbitals, const response_space &x, const response_space &y) { // Get sizes From f481e3543011ddf28631dd29fee7f0f913a947af Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 16:21:16 -0400 Subject: [PATCH 0712/1312] Improving convergence --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9248482623d..03f9c6925cc 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -20,7 +20,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(5 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(50 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 738846e3c54fa8e4cb9e7174b5cccfce6ac318e3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 17:44:09 -0400 Subject: [PATCH 0713/1312] Back to regular exchange --- src/apps/molresponse/ResponseBase.cpp | 32 ++++++++++++++++----------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 03e96f54238..aaa6fe8ed83 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -524,22 +524,31 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + /* auto xy = to_response_matrix(d_alpha); auto yx = to_conjugate_response_matrix(d_alpha); - auto exchange_response = create_response_matrix(m, 2 * n); auto conjugate_exchange_response = create_response_matrix(m, 2 * n); + auto full_exchange = create_response_matrix(m, 2 * n); world.gop.fence(); auto phi0_response = to_response_vector(phi0); - std::transform(xy.begin(), xy.end(), exchange_response.begin(), [&](const auto &x) { return newK(x, phi0_response, phi0_response); }); + std::transform(xy.begin(), xy.end(), exchange_response.begin(), [&](const auto &xy_i) { return newK(xy_i, phi0_response, phi0_response); }); world.gop.fence(); std::transform(yx.begin(), yx.end(), conjugate_exchange_response.begin(), [&](const auto &conj_x) { return newK(phi0_response, conj_x, phi0_response); }); + world.gop.fence(); + + + std::transform(exchange_response.begin(), exchange_response.end(), conjugate_exchange_response.begin(), full_exchange.begin(), [&](const auto &kxi, const auto &kyi) { + return add(world, kxi, kyi); + }); + + auto K = to_X_space(full_exchange); +*/ + world.gop.fence(); + - auto kx = to_X_space(exchange_response); - auto ky = to_X_space(conjugate_exchange_response); - /* for (size_t b = 0; b < m; b++) { vecfuncT x, y; x = d_alpha.X[b]; @@ -552,10 +561,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit KY.Y[b] = newK(y, phi0, phi0); // |i> } - */ - world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -573,7 +580,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit W.truncate(); */ - gamma = (2 * J) - (kx + ky) * xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); @@ -595,9 +602,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); print_inner(world, "xJx", d_alpha, J); - print_inner(world, "xKXx", d_alpha, kx); - print_inner(world, "xKYx", d_alpha, ky); - X_space K = kx + ky; + print_inner(world, "xKXx", d_alpha, KX); + print_inner(world, "xKYx", d_alpha, KY); + X_space K = KX + KY; + print_inner(world, "xKx", d_alpha, K); world.gop.fence(); print_inner(world, "xWx", d_alpha, W); print_inner(world, "xGammax", d_alpha, gamma); @@ -614,8 +622,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit j_y.clear(); KX.clear(); KY.clear(); - kx.clear(); - ky.clear(); W.clear(); d_alpha.clear(); From 212fa1c01e539ffa9e872a3da5c650898a988696 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Sep 2022 18:18:56 -0400 Subject: [PATCH 0714/1312] adding some fences in exchange --- src/apps/molresponse/ResponseBase.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index aaa6fe8ed83..3a28adc2be2 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -381,6 +381,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, // world.mpi.Barrier(); bool compute_Y = calc_type == "full"; X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); + world.gop.fence(); // std::cout << "MPI BARRIER 4 " << std::endl; // world.mpi.Barrier(); @@ -501,6 +502,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // TODO is copy better than adding? probably? // J.Y=j_x+j_y; J.Y = J.X.copy(); + world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); @@ -546,7 +548,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto K = to_X_space(full_exchange); */ - world.gop.fence(); for (size_t b = 0; b < m; b++) { @@ -555,10 +556,15 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit y = d_alpha.Y[b]; // |x> KY.X[b] = newK(phi0, y, phi0); + world.gop.fence(); + KX.Y[b] = newK(phi0, x, phi0); + world.gop.fence(); KX.Y[b] = newK(phi0, x, phi0); // |y> KX.X[b] = newK(x, phi0, phi0); + world.gop.fence(); KY.Y[b] = newK(y, phi0, phi0); + world.gop.fence(); // |i> } @@ -1048,12 +1054,14 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< X_space Chi_copy = X; vecfuncT phi0_copy = madness::copy(world, ground_orbitals); + world.gop.fence(); Chi_copy.truncate(); //Chi_copy.truncate(); truncate(world, phi0_copy); // v_nuc first real_function_3d v_nuc, v_j0, v_k0, v_xc; + world.gop.fence(); if (not r_params.store_potential()) { v_nuc = potential_manager->vnuclear(); From 463a500067639212847b1bc804ea755fdbc5c598 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 18 Sep 2022 13:27:58 -0400 Subject: [PATCH 0715/1312] exchange uses a copy of phi0 with phi0 --- src/apps/molresponse/ResponseBase.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3a28adc2be2..eeea50086d4 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -549,21 +549,23 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto K = to_X_space(full_exchange); */ + auto phi0_c = ::madness::copy(world, phi0); for (size_t b = 0; b < m; b++) { vecfuncT x, y; x = d_alpha.X[b]; y = d_alpha.Y[b]; + world.gop.fence(); // |x> - KY.X[b] = newK(phi0, y, phi0); + KY.X[b] = newK(phi0, y, phi0_c); world.gop.fence(); - KX.Y[b] = newK(phi0, x, phi0); + KX.Y[b] = newK(phi0, x, phi0_c); world.gop.fence(); - KX.Y[b] = newK(phi0, x, phi0); + KX.Y[b] = newK(phi0, x, phi0_c); // |y> - KX.X[b] = newK(x, phi0, phi0); + KX.X[b] = newK(x, phi0, phi0_c); world.gop.fence(); - KY.Y[b] = newK(y, phi0, phi0); + KY.Y[b] = newK(y, phi0, phi0_c); world.gop.fence(); // |i> } From 921d8a23ff340f0aaba2a4d0209484e83748ad6a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 20 Sep 2022 08:34:24 -0400 Subject: [PATCH 0716/1312] new vtk plotting for molresponse --- src/apps/molresponse/FrequencyResponse.cpp | 5 - src/apps/molresponse/Plot_VTK.cc | 622 +++++++++++++-------- src/apps/molresponse/Plot_VTK.h | 45 +- src/apps/molresponse/response_parameters.h | 2 +- 4 files changed, 419 insertions(+), 255 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 03f9c6925cc..a0c953d2ba0 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -172,11 +172,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.plot_all_orbitals()) { plotResponseOrbitals(world, iter, Chi.X, Chi.Y, r_params, ground_calc); } - if (r_params.plot()) { - auto rho0 = make_ground_density(world); - do_vtk_plots(world, 200, r_params.L(), molecule, rho0, rho_omega, - ground_orbitals, Chi); - } break; } } diff --git a/src/apps/molresponse/Plot_VTK.cc b/src/apps/molresponse/Plot_VTK.cc index b6e6d4088c7..109972315bc 100644 --- a/src/apps/molresponse/Plot_VTK.cc +++ b/src/apps/molresponse/Plot_VTK.cc @@ -22,235 +22,399 @@ #include "../chem/molecule.h" namespace madness { -void do_vtk_plots(World &world, - int npt_plot, - double L, - int plotlo, - int plothi, - Molecule molecule, - std::vector densities, - std::string name) { - // Stuff needed to plot - // - std::string vtk_dir = "vtk_plots"; - std::filesystem::create_directories(vtk_dir); - - std::string geo_file; - const char *filename; - Vector points{npt_plot, npt_plot, npt_plot}; - - // Plot the whole box? - Vector box_lo{-L, -L, -L}; - Vector box_hi{L, L, L}; - - // Write an .xyz file with current geometry (to deal with molecular - // reorientations that might occur) - FILE *f = 0; - geo_file = vtk_dir + "/geometry.xyz"; - - f = fopen(geo_file.c_str(), "w"); - - // Write the header - fprintf(f, "%zu", molecule.natom()); - fprintf(f, "\n\n"); - - // Get the data - std::vector> coords = molecule.get_all_coords_vec(); - - // Write the data - size_t Natoms = molecule.natom(); - for (size_t i = 0; i < Natoms; i++) { - std::fprintf(f, - "%5s %16.12f %16.12f %16.12f\n", - atomic_number_to_symbol(molecule.get_atomic_number(i)).c_str(), - coords[i][0], - coords[i][1], - coords[i][2]); - } - - // Clean up - fclose(f); - - std::string response_file; - // Needed to plot the full electron density - real_function_3d rho = real_factory_3d(world); - - // Plot each orbital requested - for (int i = plotlo; i < plothi; i++) { - // Add to total - rho += densities[i]; - - // Create filename in such a way that visit associates them together - response_file = vtk_dir + "/" + name + std::to_string(i) + ".vts"; - filename = response_file.c_str(); - - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(densities[i], - "electrondensity", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); - } - std::string b; - - // Plot the full density - b = vtk_dir + "/" + "total-electrondensity.vts"; - filename = b.c_str(); - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(rho, - "total-electrondensity", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); -} -void do_vtk_plots(World &world, - int npt_plot, - double L, - Molecule molecule, - real_function_3d &rho_0, - std::vector &rho_omega, - std::vector &ground_orbitals, - X_space &Chi) { - std::string vtk_dir = "vtk_plots"; - std::filesystem::create_directories(vtk_dir); - std::string geo_file; - const char *filename; - Vector points{npt_plot, npt_plot, npt_plot}; - // Plot the whole box? - Vector box_lo{-L, -L, -L}; - Vector box_hi{L, L, L}; - // Write an .xyz file with current geometry (to deal with molecular - // reorientations that might occur) - FILE *f = 0; - geo_file = vtk_dir + "/geometry.xyz"; - - f = fopen(geo_file.c_str(), "w"); - // Write the header - fprintf(f, "%zu", molecule.natom()); - fprintf(f, "\n\n"); - // Get the data - std::vector> coords = molecule.get_all_coords_vec(); - // Write the data - size_t Natoms = molecule.natom(); - for (size_t i = 0; i < Natoms; i++) { - std::fprintf(f, - "%5s %16.12f %16.12f %16.12f\n", - atomic_number_to_symbol(molecule.get_atomic_number(i)).c_str(), - coords[i][0], - coords[i][1], - coords[i][2]); - } - // Clean up - fclose(f); - std::string rho0_file = "rho_0.vts"; - filename = rho0_file.c_str(); - - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(rho_0, - "ground_density", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); - // ground orbitals - std::string g_orb_file = "phi_"; - std::string fname; - for (size_t i = 0; i < Chi.num_orbitals(); ++i) { - fname = vtk_dir + "/" + g_orb_file + std::to_string(i) + ".vts"; - filename = fname.c_str(); - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(ground_orbitals[i], - "ground_orbital", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); - } - - std::string x_orb_file = "x_"; - for (size_t i = 0; i < Chi.num_states(); ++i) { - for (size_t j = 0; j < Chi.num_orbitals(); ++j) { - fname = vtk_dir + "/" + x_orb_file + std::to_string(i) + "_" + - std::to_string(j) + ".vts"; - filename = fname.c_str(); - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(Chi.X[i][j], - "x_orbitals", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); + void write_molecules_to_file(const Molecule &molecule, const std::string &geo_file) { + + + FILE *f = nullptr; + f = fopen(geo_file.c_str(), "w"); + // Write the header + fprintf(f, "%zu", molecule.natom()); + fprintf(f, "\n\n"); + // Get the data + auto coords = molecule.get_all_coords_vec(); + + // Write the data + size_t Natoms = molecule.natom(); + for (size_t i = 0; i < Natoms; i++) { + std::fprintf(f, + "%5s %16.12f %16.12f %16.12f\n", + atomic_number_to_symbol(molecule.get_atomic_number(i)).c_str(), + coords[i][0], + coords[i][1], + coords[i][2]); + } + + // Clean up + fclose(f); } - } - std::string y_orb_file = "y_"; - for (size_t i = 0; i < Chi.num_states(); ++i) { - for (size_t j = 0; j < Chi.num_orbitals(); ++j) { - fname = vtk_dir + "/" + y_orb_file + std::to_string(i) + "_" + - std::to_string(j) + ".vts"; - filename = fname.c_str(); - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(Chi.Y[i][j], - "y_orbitals", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); + void do_response_orbital_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const vector_real_function_3d &ground_orbs, const response_matrix &responseMatrix) { + // Stuff needed to plot + // + Vector box_lo{-L/4, -L/4, -L/4}; + Vector box_hi{L/4, L/4, L/4}; + + + std::string vtk_dir = "vtk_plots"; + std::filesystem::create_directories(vtk_dir); + + std::string geo_file; + const char *filename; + + Vector points{npt_plot, npt_plot, npt_plot}; + // Plot the whole box? + + // Write an .xyz file with current geometry (to deal with molecular + // reorientations that might occur) + FILE *f = nullptr; + geo_file = vtk_dir + "/geometry.xyz"; + write_molecules_to_file(molecule, geo_file); + + + std::string response_file; + // Needed to plot the full electron density + real_function_3d rho = real_factory_3d(world); + + int orb_num = 0; + + std::for_each(ground_orbs.begin(), ground_orbs.end(), [&](const auto &phi0_i) { + auto orb_file = vtk_dir + "/phi0_" + std::to_string(orb_num) + ".vts"; + filename = orb_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(phi0_i, + "ground_orbtial", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + orb_num++; + }); + + + auto state_number = 0; + std::for_each(responseMatrix.begin(), responseMatrix.end(), [&](const auto &xy) { + auto num_orbitals = xy.size() / 2; + // plot the x first + auto orb_num = 0; + std::for_each(xy.begin(), xy.begin() + num_orbitals, [&](const auto &xi) { + auto orb_file = vtk_dir + "/" + "x" + std::to_string(state_number) + std::to_string(orb_num) + ".vts"; + filename = orb_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(xi, + "response_x_orbitals", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + orb_num++; + }); + orb_num = 0; + std::for_each(xy.begin() + num_orbitals, xy.end(), [&](const auto &yi) { + auto orb_file = vtk_dir + "/" + "y" + std::to_string(state_number) + std::to_string(orb_num) + ".vts"; + filename = orb_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(yi, + "response_y_orbitals", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + orb_num++; + }); + state_number++; + }); } - } - - std::string rho_1_file = "rho_1_"; - for (size_t i = 0; i < Chi.num_states(); ++i) { - fname = vtk_dir + "/" + rho_1_file + std::to_string(i) + ".vts"; - filename = fname.c_str(); - // VTK plotting stuff - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(rho_omega[i], - "transition_density", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); - } - - // - // - // - // - // -} -} // namespace madness + void do_response_density_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const real_function_3d &ground_density, const vector_real_function_3d &response_density) { + // Stuff needed to plot + // + Vector box_lo{-L/4, -L/4, -L/4}; + Vector box_hi{L/4, L/4, L/4}; + + + std::string vtk_dir = "vtk_plots"; + std::filesystem::create_directories(vtk_dir); + + std::string geo_file; + const char *filename; + + Vector points{npt_plot, npt_plot, npt_plot}; + + std::string response_file; + //***********************************ground density plot + auto density_file = vtk_dir + "/" + "rho0.vts"; + filename = density_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(ground_density, + "ground_density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + //***********************************ground density plot + int state_number = 0; + std::for_each(response_density.begin(), response_density.end(), [&](const auto &rho_i) { + auto density_file = vtk_dir + "/" + "response_rho_" + std::to_string(state_number) + ".vts"; + filename = density_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(rho_i, + "response_density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + auto total_density_i = ground_density + rho_i; + auto total_density_file = vtk_dir + "/" + "total-rho_" + std::to_string(state_number) + ".vts"; + filename = total_density_file.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(total_density_i, + "total_density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + state_number++; + }); + } + void do_vtk_plots(World &world, + int npt_plot, + double L, + int lowest_orbital, + int highest_orbital, + const Molecule &molecule, + std::vector densities, + const std::string &name) { + // Stuff needed to plot + // + Vector box_lo{-L, -L, -L}; + Vector box_hi{L, L, L}; + + + std::string vtk_dir = "vtk_plots"; + std::filesystem::create_directories(vtk_dir); + + std::string geo_file; + const char *filename; + + Vector points{npt_plot, npt_plot, npt_plot}; + // Plot the whole box? + + // Write an .xyz file with current geometry (to deal with molecular + // reorientations that might occur) + FILE *f = nullptr; + + std::string response_file; + // Needed to plot the full electron density + real_function_3d rho = real_factory_3d(world); + + // Plot each orbital requested + for (int i = lowest_orbital; i < highest_orbital; i++) { + // Add to total + rho += densities[i]; + + // Create filename in such a way that visit associates them together + response_file = vtk_dir + "/" + name + std::to_string(i) + ".vts"; + filename = response_file.c_str(); + + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + + // function + // field anem + // world + // file name + // plot lo + // plot hi + // npts + // binary + // plot refile + plotvtk_data(densities[i], + "density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + std::string b; + + // Plot the full density + b = vtk_dir + "/" + "total-electrondensity.vts"; + filename = b.c_str(); + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(rho, + "total-electrondensity", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + void do_vtk_plots(World &world, + int npt_plot, + double L, + Molecule molecule, + real_function_3d &rho_0, + std::vector &rho_omega, + std::vector &ground_orbitals, + X_space &Chi) { + std::string vtk_dir = "vtk_plots"; + std::filesystem::create_directories(vtk_dir); + std::string geo_file; + const char *filename; + Vector points{npt_plot, npt_plot, npt_plot}; + // Plot the whole box? + Vector box_lo{-L, -L, -L}; + Vector box_hi{L, L, L}; + // Write an .xyz file with current geometry (to deal with molecular + // reorientations that might occur) + FILE *f = 0; + geo_file = vtk_dir + "/geometry.xyz"; + + f = fopen(geo_file.c_str(), "w"); + // Write the header + fprintf(f, "%zu", molecule.natom()); + fprintf(f, "\n\n"); + // Get the data + std::vector> coords = molecule.get_all_coords_vec(); + // Write the data + size_t Natoms = molecule.natom(); + for (size_t i = 0; i < Natoms; i++) { + std::fprintf(f, + "%5s %16.12f %16.12f %16.12f\n", + atomic_number_to_symbol(molecule.get_atomic_number(i)).c_str(), + coords[i][0], + coords[i][1], + coords[i][2]); + } + // Clean up + fclose(f); + std::string rho0_file = "rho_0.vts"; + filename = rho0_file.c_str(); + + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(rho_0, + "ground_density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + // ground orbitals + std::string g_orb_file = "phi_"; + std::string fname; + for (size_t i = 0; i < Chi.num_orbitals(); ++i) { + fname = vtk_dir + "/" + g_orb_file + std::to_string(i) + ".vts"; + filename = fname.c_str(); + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(ground_orbitals[i], + "ground_orbital", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + + std::string x_orb_file = "x_"; + for (size_t i = 0; i < Chi.num_states(); ++i) { + for (size_t j = 0; j < Chi.num_orbitals(); ++j) { + fname = vtk_dir + "/" + x_orb_file + std::to_string(i) + "_" + + std::to_string(j) + ".vts"; + filename = fname.c_str(); + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(Chi.X[i][j], + "x_orbitals", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + } + std::string y_orb_file = "y_"; + for (size_t i = 0; i < Chi.num_states(); ++i) { + for (size_t j = 0; j < Chi.num_orbitals(); ++j) { + fname = vtk_dir + "/" + y_orb_file + std::to_string(i) + "_" + + std::to_string(j) + ".vts"; + filename = fname.c_str(); + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(Chi.Y[i][j], + "y_orbitals", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + } + + std::string rho_1_file = "rho_1_"; + for (size_t i = 0; i < Chi.num_states(); ++i) { + fname = vtk_dir + "/" + rho_1_file + std::to_string(i) + ".vts"; + filename = fname.c_str(); + // VTK plotting stuff + plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); + plotvtk_data(rho_omega[i], + "transition_density", + world, + filename, + box_lo, + box_hi, + points, + true, + false); + plotvtk_end<3>(world, filename, true); + } + + // + // + // + // + // + } +}// namespace madness diff --git a/src/apps/molresponse/Plot_VTK.h b/src/apps/molresponse/Plot_VTK.h index c0b53f0cd4a..fe2fdba2be6 100644 --- a/src/apps/molresponse/Plot_VTK.h +++ b/src/apps/molresponse/Plot_VTK.h @@ -23,25 +23,30 @@ #include "../chem/molecule.h" #include "x_space.h" namespace madness { -void do_vtk_plots(World &world, - int npt_plot, - double L, - int plotlo, - int plothi, - Molecule molecule, - std::vector densities, - std::string name); - -void do_vtk_plots(World &world, - int npt_plot, - double L, - Molecule molecule, - real_function_3d &rho_0, - std::vector &rho_omega, - std::vector &ground_orbitals, - X_space &Chi); - -} // namespace madness -#endif // SRC_APPS_molresponse_PLOT_VTK_H_ + + void write_molecules_to_file(const Molecule &molecule, const std::string &geo_file); + void do_response_orbital_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const vector_real_function_3d &ground_orbs, const response_matrix &responseMatrix); + void do_response_density_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const real_function_3d &ground_density, const vector_real_function_3d &response_density); + + void do_vtk_plots(World &world, + int npt_plot, + double L, + int lowest_orbital, + int highest_orbital, + const Molecule &molecule, + std::vector densities, + const std::string &name); + + void do_vtk_plots(World &world, + int npt_plot, + double L, + Molecule molecule, + real_function_3d &rho_0, + std::vector &rho_omega, + std::vector &ground_orbitals, + X_space &Chi); + +}// namespace madness +#endif// SRC_APPS_molresponse_PLOT_VTK_H_ // Dueces diff --git a/src/apps/molresponse/response_parameters.h b/src/apps/molresponse/response_parameters.h index ffd7394d2a5..72da84b1796 100644 --- a/src/apps/molresponse/response_parameters.h +++ b/src/apps/molresponse/response_parameters.h @@ -43,7 +43,7 @@ namespace madness { "lo-hi plot cell (default is all space)"); initialize("core_type", "none", "core potential type", {"none", "mcp"}); initialize("plot_l", -1.0, "Controls the plotting box size"); - initialize("plot_pts", 201, "Controls number of points in plots"); + initialize("plot_pts",51, "Controls number of points in plots"); initialize("plot_all_orbitals", false, "Turn on 2D plotting of response orbitals "); initialize("maxiter", 25, "maximum number of iterations"); From d3caa9e7dbf22fa57af9115066a6dd2559244a5c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Sep 2022 08:15:27 -0400 Subject: [PATCH 0717/1312] Trying Multiworld efficient --- src/apps/molresponse/global_functions.cc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index cf47058b150..2ae7251bd0a 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -73,16 +73,11 @@ auto T(World &world, response_space &f) -> response_space { // compute exchange |i> auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfuncT { World &world = ket[0].world(); - int n = bra.size(); - int nf = ket.size(); - - double tol = FunctionDefaults<3>::get_thresh();/// Important this is - double mul_tol = 1e-7; const double lo = 1.e-10; Exchange op{}; op.set_parameters(bra, ket, lo); - op.set_algorithm(op.small_memory); + op.set_algorithm(op.multiworld_efficient); return op(vf); } // sum_i |i> for each p \ No newline at end of file From fd4de435b59fdbddb333ab082b31480dc0a6aefd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Sep 2022 08:15:42 -0400 Subject: [PATCH 0718/1312] fence after += --- src/apps/molresponse/response_functions.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index afa5c34269d..34775d7515f 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -261,6 +261,7 @@ namespace madness { MADNESS_ASSERT(same_size(*this, b)); World &world = x[0][0].world(); for (size_t i = 0; i < num_states; i++) { this->x[i] = add(world, this->x[i], b[i]); } + world.gop.fence(); return *this; } From 1bf2d9bf5b8dd2ab8c678938d92a703380b923ef Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Sep 2022 08:16:02 -0400 Subject: [PATCH 0719/1312] clean up compute gamma --- src/apps/molresponse/ResponseBase.cpp | 100 +++++++++++--------------- 1 file changed, 43 insertions(+), 57 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index eeea50086d4..d6a15260447 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -443,20 +443,16 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit const XCOperator &xc) const -> X_space { std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); - auto [d_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); - - size_t num_states = d_alpha.num_states(); - size_t num_orbitals = d_alpha.num_orbitals(); + auto [chi_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); - size_t m = d_alpha.num_states(); - size_t n = d_alpha.num_orbitals(); - // copy old pmap + size_t num_states = chi_alpha.num_states(); + size_t num_orbitals = chi_alpha.num_orbitals(); - truncate(world, phi0); - d_alpha.truncate(); + //truncate(world, phi0); + //// chi_alpha.truncate(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space gamma(world, m, n); + // x functions // Two ways single vector or vector vector style // here I create the orbital products for elctron interaction terms @@ -465,13 +461,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit vecfuncT y_phi; functionT temp_J; - X_space J(world, m, n); - response_space j_x(world, m, n); - response_space j_y(world, m, n); + X_space J(world, num_states, num_orbitals); + response_space j_x(world, num_states, num_orbitals); + response_space j_y(world, num_states, num_orbitals); - X_space W = X_space::zero_functions(world, m, n); - X_space KX = X_space::zero_functions(world, m, n); - X_space KY = X_space::zero_functions(world, m, n); + X_space W = X_space::zero_functions(world, num_states, num_orbitals); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } @@ -482,21 +476,22 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit functionT rho_x_b; functionT rho_y_b; + auto mul_tol = FunctionDefaults<3>::get_thresh(); // note that x can refer to x or y - auto compute_j = [&, &phi0 = phi0](auto dx) { + auto compute_j = [&, &phi0 = phi0](const auto &dx) { // compute density with response function dx and orbitals phi0 auto rho_x_b = dot(world, dx, phi0); rho_x_b.truncate(); // apply the coulomb operator to rho_b rho_x_b = apply(*shared_coulomb_operator, rho_x_b); - return mul(world, rho_x_b, phi0); + return mul_sparse(world, rho_x_b, phi0, mul_tol, true); }; // compute j_x = op(rho_x)*phi0 - std::transform(d_alpha.X.begin(), d_alpha.X.end(), j_x.begin(), compute_j); + std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); // compute j_y = op(rho_y)*phi0 - std::transform(d_alpha.Y.begin(), d_alpha.Y.end(), j_y.begin(), compute_j); + std::transform(chi_alpha.Y.begin(), chi_alpha.Y.end(), j_y.begin(), compute_j); J.X = j_x + j_y; // TODO is copy better than adding? probably? @@ -510,7 +505,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { - auto rho = transition_density(world, phi0, d_alpha.X, d_alpha.X); + auto rho = transition_density(world, phi0, chi_alpha.X, chi_alpha.X); auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { auto xc_rho = xc.apply_xc_kernel(rho_alpha); return mul(world, xc_rho, phi0); @@ -527,8 +522,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit /* - auto xy = to_response_matrix(d_alpha); - auto yx = to_conjugate_response_matrix(d_alpha); + auto xy = to_response_matrix(chi_alpha); + auto yx = to_conjugate_response_matrix(chi_alpha); auto exchange_response = create_response_matrix(m, 2 * n); auto conjugate_exchange_response = create_response_matrix(m, 2 * n); @@ -549,12 +544,13 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto K = to_X_space(full_exchange); */ + X_space KX = X_space::zero_functions(world, num_states, num_orbitals); + X_space KY = X_space::zero_functions(world, num_states, num_orbitals); auto phi0_c = ::madness::copy(world, phi0); - - for (size_t b = 0; b < m; b++) { - vecfuncT x, y; - x = d_alpha.X[b]; - y = d_alpha.Y[b]; + vecfuncT x, y; + for (size_t b = 0; b < num_states; b++) { + x = chi_alpha.X[b]; + y = chi_alpha.Y[b]; world.gop.fence(); // |x> KY.X[b] = newK(phi0, y, phi0_c); @@ -588,6 +584,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit W.truncate(); */ + X_space gamma(world, num_states, num_orbitals); gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; //gamma.truncate(); if (r_params.print_level() >= 1) { @@ -597,7 +594,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, phi0); - for (size_t i = 0; i < m; i++) { + for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); gamma.Y[i] = projector(gamma.Y[i]); } @@ -609,14 +606,14 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); - print_inner(world, "xJx", d_alpha, J); - print_inner(world, "xKXx", d_alpha, KX); - print_inner(world, "xKYx", d_alpha, KY); + print_inner(world, "xJx", chi_alpha, J); + print_inner(world, "xKXx", chi_alpha, KX); + print_inner(world, "xKYx", chi_alpha, KY); X_space K = KX + KY; - print_inner(world, "xKx", d_alpha, K); + print_inner(world, "xKx", chi_alpha, K); world.gop.fence(); - print_inner(world, "xWx", d_alpha, W); - print_inner(world, "xGammax", d_alpha, gamma); + print_inner(world, "xWx", chi_alpha, W); + print_inner(world, "xGammax", chi_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); } // put @@ -632,7 +629,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit KY.clear(); W.clear(); - d_alpha.clear(); + chi_alpha.clear(); phi0.clear(); if (world.size() > 1) { @@ -1103,30 +1100,13 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto k = [&](const vector_real_function_3d &xi) { - world.gop.fence(); - return newK(phi0_copy, phi0_copy, xi); - }; - - world.gop.fence(); - // If including any exact HF exchange - /* - if (xcf.hf_exchange_coefficient() != 0.0) { - std::transform(Chi_copy.X.begin(), Chi_copy.X.end(), K0.X.begin(), k); - if (compute_Y) { - std::transform(Chi_copy.Y.begin(), Chi_copy.Y.end(), K0.Y.begin(), k); - } else { - K0.Y = K0.X.copy(); - world.gop.fence(); - } - } - */ + auto phi0_c = copy(world, phi0_copy); int b = 0; - for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_copy, Chi_copy.X[b++]); } + for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } if (compute_Y) { b = 0; - for (auto &k0y: K0.Y) { k0y = newK(phi0_copy, phi0_copy, Chi_copy.Y[b++]); } + for (auto &k0y: K0.Y) { k0y = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); } } else { K0.Y = K0.X.copy(); } @@ -1141,7 +1121,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< //v0.truncate(FunctionDefaults<3>::get_thresh(), true); V0.X = v0 * X.X; - V0.X += (-1 * K0.X * xcf.hf_exchange_coefficient()); + V0.X += -1 * K0.X * xcf.hf_exchange_coefficient(); if (compute_Y) { V0.Y = v0 * X.Y; @@ -1534,6 +1514,12 @@ void ResponseBase::solve(World &world) { } // At this point we should know if calc converged maybe add a flag to response.json which states if it has converged_to_json(j_molresponse); + if (r_params.plot()) { + auto r_matrix = to_response_matrix(Chi); + do_response_orbital_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, ground_orbitals, r_matrix); + auto response_densities = make_density(world, Chi); + do_response_density_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, ground_density, response_densities); + } // Plot the response function if desired From 8896518f28ba24c7fb54feddc2fd920d7061afbe Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Sep 2022 10:33:57 -0400 Subject: [PATCH 0720/1312] adjust print level --- src/apps/molresponse/testing/response_data_base.hpp | 2 +- src/apps/molresponse/testing/runners.hpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp index 3fd59e1d239..0b2b865ee59 100644 --- a/src/apps/molresponse/testing/response_data_base.hpp +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -115,7 +115,7 @@ auto generate_dipole_frequencies(const std::string &molecule_name, std::string x json dalton_excited; ifs >> dalton_excited; ::print("Read Dalton Excited for ", molecule_name); - ::print(dalton_excited[molecule_name][xc]["excited-state"]["cc-pVTZ"]["response"]["freq"]); + ::print(dalton_excited[molecule_name][xc]["excited-state"]["cc-pVDZ"]["response"]["freq"]); std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] ["cc-pVTZ"]["response"]["freq"]; auto omega_max = freq.at(0); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index af78f2afc52..2977740ddb6 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -549,8 +549,9 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals", true); - r_params.set_user_defined_value("print_level", 20); + r_params.set_user_defined_value("plot_all_orbitals", false); + r_params.set_user_defined_value("plot", true); + r_params.set_user_defined_value("print_level", 2); r_params.set_user_defined_value("save", true); // set xc, property, frequency,and restart r_params.set_user_defined_value("xc", xc); @@ -704,6 +705,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, world.gop.fence(); // set protocol to the first calc.solve(world); + // TODO Why would I plot the ground state density here if the protocol or k is world.gop.fence(); // set protocol to the first if (world.rank() == 0) { From 5c931f0c79cb64f14b567cfdc8150c56b83abb94 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 4 Oct 2022 09:49:20 -0400 Subject: [PATCH 0721/1312] use a basic loop in compute density --- src/apps/molresponse/ResponseBase.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d6a15260447..dc1de0c1876 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -272,7 +272,10 @@ auto ResponseBase::make_ground_density(World &world) const -> functionT { compress(world, vsq); functionT rho = factoryT(world); rho.compress(); - for (const auto &phi_squared: vsq) rho.gaxpy(1.0, phi_squared, 1.0, false); + for (unsigned int i = 0; i < vsq.size(); ++i) { + rho.gaxpy(1.0, vsq[i], 1.0, false); + } + //for (const auto &phi_squared: vsq) rho.gaxpy(2.0, phi_squared, 1.0, false); world.gop.fence(); vsq.clear(); return rho; From 3db70101a377f1bd2f1528aa991a543cd84063a5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 4 Oct 2022 09:49:57 -0400 Subject: [PATCH 0722/1312] Change field name to r_density_state number --- src/apps/molresponse/Plot_VTK.cc | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/apps/molresponse/Plot_VTK.cc b/src/apps/molresponse/Plot_VTK.cc index 109972315bc..e32f6115de9 100644 --- a/src/apps/molresponse/Plot_VTK.cc +++ b/src/apps/molresponse/Plot_VTK.cc @@ -50,8 +50,8 @@ namespace madness { void do_response_orbital_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const vector_real_function_3d &ground_orbs, const response_matrix &responseMatrix) { // Stuff needed to plot // - Vector box_lo{-L/4, -L/4, -L/4}; - Vector box_hi{L/4, L/4, L/4}; + Vector box_lo{-L / 4, -L / 4, -L / 4}; + Vector box_hi{L / 4, L / 4, L / 4}; std::string vtk_dir = "vtk_plots"; @@ -138,8 +138,8 @@ namespace madness { void do_response_density_vtk_plots(World &world, int npt_plot, double L, const Molecule &molecule, const real_function_3d &ground_density, const vector_real_function_3d &response_density) { // Stuff needed to plot // - Vector box_lo{-L/4, -L/4, -L/4}; - Vector box_hi{L/4, L/4, L/4}; + Vector box_lo{-L / 4, -L / 4, -L / 4}; + Vector box_hi{L / 4, L / 4, L / 4}; std::string vtk_dir = "vtk_plots"; @@ -171,23 +171,10 @@ namespace madness { std::for_each(response_density.begin(), response_density.end(), [&](const auto &rho_i) { auto density_file = vtk_dir + "/" + "response_rho_" + std::to_string(state_number) + ".vts"; filename = density_file.c_str(); + auto field_name = "r_density_" + std::to_string(state_number); plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); plotvtk_data(rho_i, - "response_density", - world, - filename, - box_lo, - box_hi, - points, - true, - false); - plotvtk_end<3>(world, filename, true); - auto total_density_i = ground_density + rho_i; - auto total_density_file = vtk_dir + "/" + "total-rho_" + std::to_string(state_number) + ".vts"; - filename = total_density_file.c_str(); - plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(total_density_i, - "total_density", + field_name.c_str(), world, filename, box_lo, From f04a6087631bd4bbcdcb5ec46f9ef219d9ff040c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Oct 2022 11:44:51 -0400 Subject: [PATCH 0723/1312] Update printing for calculation init --- src/apps/molresponse/global_functions.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 2ae7251bd0a..dfb6088fdc1 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -44,11 +44,15 @@ auto initialize_calc_params(World &world, const std::string &input_file) -> Calc parser.set_keyval("input", input_file); r_params.read_input_and_commandline_options(world, parser, "response"); GroundStateCalculation ground_calculation{world, r_params.archive()}; - ground_calculation.print_params(); + if (world.rank() == 0) { + ground_calculation.print_params(); + } Molecule molecule = ground_calculation.molecule(); r_params.set_ground_state_calculation_data(ground_calculation); r_params.set_derived_values(world, molecule); - r_params.print(); + if(world.rank()==0){ + r_params.print(); + } return {ground_calculation, molecule, r_params}; } // TODO some operator definitions that I will need to move to a separate file From cba40393a982150efe5853fdb6f3484470487639 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Oct 2022 15:33:26 -0400 Subject: [PATCH 0724/1312] frequency response --- src/apps/molresponse/ResponseBase.cpp | 7 ++++--- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index dc1de0c1876..ca3e8c5125e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -731,6 +731,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // for every transition gammaOrbitals apply the exchange kernel and multiply the // vector of orbitals std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); + W.Y = W.X.copy(); if (r_params.print_level() >= 1) { @@ -1105,6 +1106,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< auto phi0_c = copy(world, phi0_copy); + world.gop.fence(); int b = 0; for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } if (compute_Y) { @@ -1113,8 +1115,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } else { K0.Y = K0.X.copy(); } - - if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } // Vnuc+V0+VXC @@ -1210,7 +1210,8 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp auto res_b_norms = std::vector{}; for (const auto &xij: xi) res_b_norms.push_back(xij.norm2()); world.gop.fence(); - if (world.rank() == 0) { print("||f(x)||_: ", j++, res_b_norms); } + if (world.rank() == 0) { print("||f(x)||_: ", j, res_b_norms); } + j++; } } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2977740ddb6..06ba2f11264 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -540,7 +540,7 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); r_params.set_user_defined_value("dconv", 1e-6); } else { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-6}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); From 75208eff0e10d12c8af59afdf8fa6dd4d762aa8c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 10 Nov 2022 21:13:35 -0500 Subject: [PATCH 0725/1312] response edits --- src/apps/molresponse/FrequencyResponse.cpp | 13 ------------- .../molresponse/testing/generate_frequency_data.cpp | 2 ++ src/apps/molresponse/testing/response_data_base.hpp | 4 ++-- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index a0c953d2ba0..2cb66c9fe1c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -270,23 +270,13 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator size_t iteration, const double &maxrotn) -> std::tuple { - // print("before start time ", r_params.print_level()); - // std::cout << "MPI BARRIER 2 " << std::endl; - // world.mpi.Barrier(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // std::cout << "MPI BARRIER 3 " << std::endl; - //world.mpi.Barrier(); - size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); - // std::cout << "MPI BARRIER After Theta X " << std::endl; - // world.mpi.Barrier(); - // compute residual X_space - X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); @@ -299,9 +289,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x - //new_chi.X.truncate_rf(); - // truncate y if compute y - //if (compute_y) new_chi.Y.truncate_rf(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); diff --git a/src/apps/molresponse/testing/generate_frequency_data.cpp b/src/apps/molresponse/testing/generate_frequency_data.cpp index 9783d7899b2..9a245931f97 100644 --- a/src/apps/molresponse/testing/generate_frequency_data.cpp +++ b/src/apps/molresponse/testing/generate_frequency_data.cpp @@ -54,6 +54,8 @@ int main(int argc, char *argv[]) { ifs >> j_read; std::cout << "READ IT" << std::endl; json data = generate_response_data(molecule_path, xc, op, {0}); + + print(data); j_read.merge_patch(data); // make the keyword and add the data std::ofstream ofs("molecules/frequency.json"); diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp index 0b2b865ee59..6c37e4b4863 100644 --- a/src/apps/molresponse/testing/response_data_base.hpp +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -115,9 +115,9 @@ auto generate_dipole_frequencies(const std::string &molecule_name, std::string x json dalton_excited; ifs >> dalton_excited; ::print("Read Dalton Excited for ", molecule_name); - ::print(dalton_excited[molecule_name][xc]["excited-state"]["cc-pVDZ"]["response"]["freq"]); + ::print(dalton_excited[molecule_name][xc]["excited-state"]["aug-cc-pVTZ"]["response"]["freq"]); std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] - ["cc-pVTZ"]["response"]["freq"]; + ["aug-cc-pVTZ"]["response"]["freq"]; auto omega_max = freq.at(0); omega_max = omega_max / 2.0; ::print("max frequency at cc-pVTZ", omega_max); From 5367839b0a66a6bf445ee6ee0423e08878d06f3c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 10 Nov 2022 21:13:52 -0500 Subject: [PATCH 0726/1312] to_json for molecule --- src/madness/chem/molecule.cc | 20 ++++++++++++++++++++ src/madness/chem/molecule.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/src/madness/chem/molecule.cc b/src/madness/chem/molecule.cc index 448b0960ed1..0a3e86914a4 100644 --- a/src/madness/chem/molecule.cc +++ b/src/madness/chem/molecule.cc @@ -440,6 +440,26 @@ const Atom& Molecule::get_atom(unsigned int i) const { return atoms[i]; } +// Returns molecule in qc-schema format +// symbols (nat,) atom symbols in title case. array[string] +// geometry (3*nat,) vector of xyz coordinates [a0] of the atoms. array[number] +// There are optional parameters yet to be implemented +// https://molssi-qc-schema.readthedocs.io/en/latest/auto_topology.html +nlohmann::json Molecule::to_json() const { + nlohmann::json mol_schema; + mol_schema["symbols"] = {}; + mol_schema["geometry"] = {}; + + get_atomic_data(atoms[0].atomic_number).symbol; + for (size_t i = 0; i < natom(); ++i) { + mol_schema["symbols"].push_back(get_atomic_data(atoms[i].atomic_number).symbol); + mol_schema["geometry"].push_back({atoms[i].x, atoms[i].y, atoms[i].z}); + } + return mol_schema; +} + + + void Molecule::print() const { std::string p =parameters.print_to_string(); std::cout.flush(); diff --git a/src/madness/chem/molecule.h b/src/madness/chem/molecule.h index 79801453dc6..be0e30a5106 100644 --- a/src/madness/chem/molecule.h +++ b/src/madness/chem/molecule.h @@ -511,6 +511,8 @@ namespace madness { void serialize(Archive &ar) { ar &atoms &rcut &core_pot ¶meters &pointgroup_ &field; } + json to_json() const; + json to_json() const; }; }// namespace madness From 194af0012b2815ad815845c94fd88141a634f250 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 10 Nov 2022 21:31:44 -0500 Subject: [PATCH 0727/1312] compile please --- src/madness/chem/molecule.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/madness/chem/molecule.h b/src/madness/chem/molecule.h index be0e30a5106..fd9e0316432 100644 --- a/src/madness/chem/molecule.h +++ b/src/madness/chem/molecule.h @@ -511,8 +511,7 @@ namespace madness { void serialize(Archive &ar) { ar &atoms &rcut &core_pot ¶meters &pointgroup_ &field; } - json to_json() const; - json to_json() const; + [[nodiscard]] json to_json() const; }; }// namespace madness From f97739945b9d3517a75514cf819201ff157c2de7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 10 Nov 2022 21:38:53 -0500 Subject: [PATCH 0728/1312] adding more data to json --- src/apps/molresponse/ResponseBase.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ca3e8c5125e..59f8d90751a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1864,8 +1864,16 @@ void ResponseBase::output_json() { ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); print(ss.str()); - j_molresponse["time"] = ss.str(); - j_molresponse["wall_time"] = wall_time(); + nlohmann::json calc_precision={ }; + calc_precision["dconv"]=r_params.dconv(); + calc_precision["thresh"]=FunctionDefaults<3>::get_thresh(); + calc_precision["k"]=FunctionDefaults<3>::get_k(); + j_molresponse["precision"]=calc_precision; + nlohmann::json timing={ }; + timing["datetime"] = ss.str(); + timing["wall_time"] = wall_time(); + timing["cpu_time"] = cpu_time(); + j_molresponse["time_data"]=timing; std::ofstream ofs("response_base.json"); ofs << std::setw(4) << j_molresponse; } From c974509cb532a504f9525c5b48a01a7c5aa99bab Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 11 Nov 2022 11:52:29 -0500 Subject: [PATCH 0729/1312] switch to small memory algorithm --- src/apps/molresponse/ResponseBase.cpp | 23 ----------------------- src/apps/molresponse/global_functions.cc | 5 +++-- src/apps/molresponse/testing/runners.hpp | 2 +- src/apps/molresponse/x_space.h | 5 +++-- 4 files changed, 7 insertions(+), 28 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 59f8d90751a..85d42a037eb 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -524,29 +524,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* - auto xy = to_response_matrix(chi_alpha); - auto yx = to_conjugate_response_matrix(chi_alpha); - - auto exchange_response = create_response_matrix(m, 2 * n); - auto conjugate_exchange_response = create_response_matrix(m, 2 * n); - auto full_exchange = create_response_matrix(m, 2 * n); - - world.gop.fence(); - auto phi0_response = to_response_vector(phi0); - std::transform(xy.begin(), xy.end(), exchange_response.begin(), [&](const auto &xy_i) { return newK(xy_i, phi0_response, phi0_response); }); - world.gop.fence(); - std::transform(yx.begin(), yx.end(), conjugate_exchange_response.begin(), [&](const auto &conj_x) { return newK(phi0_response, conj_x, phi0_response); }); - world.gop.fence(); - - - std::transform(exchange_response.begin(), exchange_response.end(), conjugate_exchange_response.begin(), full_exchange.begin(), [&](const auto &kxi, const auto &kyi) { - return add(world, kxi, kyi); - }); - - auto K = to_X_space(full_exchange); -*/ - X_space KX = X_space::zero_functions(world, num_states, num_orbitals); X_space KY = X_space::zero_functions(world, num_states, num_orbitals); auto phi0_c = ::madness::copy(world, phi0); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index dfb6088fdc1..b81d6696d90 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -81,7 +81,8 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu Exchange op{}; op.set_parameters(bra, ket, lo); - op.set_algorithm(op.multiworld_efficient); - return op(vf); + op.set_algorithm(op.small_memory); + auto vk=op(vf); + return vk ; } // sum_i |i> for each p \ No newline at end of file diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 06ba2f11264..4498ff8a9c4 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -444,7 +444,6 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo print(param_calc.print_to_string()); print("param1 != param_calc = ", param1 != param_calc); } - } world.gop.broadcast_serializable(param1, 0); world.gop.broadcast(calcInfo, 0); @@ -834,6 +833,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr } else if (success.second) { // if the previous run succeeded then set the restart path restart_path = success.first; + world.gop.fence(); if (world.rank() == 0) { print("restart_path", restart_path); print("restart_path = success.first", restart_path); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 3372c350197..8973ff72e26 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -144,11 +144,12 @@ namespace madness { auto zeros = X_space(world, n_states, n_orbitals); for (auto &xi: zeros.X) { - xi = ::madness::zero_functions(world, n_orbitals, true); + xi = ::madness::zero_functions(world, n_orbitals, false); } for (auto &yi: zeros.Y) { - yi = ::madness::zero_functions(world, n_orbitals, true); + yi = ::madness::zero_functions(world, n_orbitals, false); } + world.gop.fence(); return zeros; } From 435bdb861862fe2306a9c1f66c912a10a193b7d1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 11 Nov 2022 14:09:14 -0500 Subject: [PATCH 0730/1312] back to multiworld efficient --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index b81d6696d90..5d3ad94f81b 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -81,7 +81,7 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu Exchange op{}; op.set_parameters(bra, ket, lo); - op.set_algorithm(op.small_memory); + op.set_algorithm(op.multiworld_efficient); auto vk=op(vf); return vk ; } From 7280823be85c9cade0577eeaeafb5815f02b6dd9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 11 Nov 2022 16:30:38 -0500 Subject: [PATCH 0731/1312] 3 options for precision in mad-freq --- src/apps/molresponse/testing/mad-freq.cpp | 19 ++++++------ src/apps/molresponse/testing/runners.hpp | 35 ++++++++++++++--------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 63a9a13843a..f1fb4a6673f 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -44,14 +44,13 @@ auto main(int argc, char *argv[]) -> int { const std::string molecule_name{argv[1]}; const std::string xc{argv[2]}; const std::string op{argv[3]}; - const std::string is_high_prec{argv[4]}; + const std::string precision{argv[4]}; - bool high_prec; - - if (is_high_prec == "high") { - high_prec = true; - } else { - high_prec = false; + if (precision != "high" && precision != "low" && precision != "super") { + if (world.rank() == 0) { + std::cout << "Set precision to low high super" << std::endl; + } + return 1; } try { @@ -60,11 +59,11 @@ auto main(int argc, char *argv[]) -> int { auto f_schema = frequencySchema(world, schema, m_schema, op); if (std::filesystem::exists(m_schema.calc_info_json_path) && std::filesystem::exists(m_schema.moldft_restart)) { // TODO set up to read calc_info json and check if its converged - runFrequencyTests(world, f_schema, high_prec); + runFrequencyTests(world, f_schema, precision); } else { - moldft(world, m_schema, true, false, high_prec); - runFrequencyTests(world, f_schema, high_prec); + moldft(world, m_schema, true, false, precision); + runFrequencyTests(world, f_schema, precision); } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 4498ff8a9c4..6cdf5f32116 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -412,7 +412,7 @@ auto tryMOLDFT(CalculationParameters &p1, CalculationParameters &p2) -> bool { * @param xc */ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, bool restart, - bool high_prec) { + const std::string &precision) { CalculationParameters param1; json calcInfo; @@ -425,12 +425,15 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("xc", moldftSchema.xc); param1.set_user_defined_value("l", 200); - if (high_prec) { + if (precision == "low") { + param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); + param1.set_user_defined_value("dconv", 1e-4); + } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); param1.set_user_defined_value("dconv", 1e-6); } else { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); - param1.set_user_defined_value("dconv", 1e-4); + param1.set_user_defined_value>("protocol", {1e-9}); + param1.set_user_defined_value("dconv", 1e-7); } param1.set_user_defined_value("localize", "new"); @@ -534,13 +537,16 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, */ void set_frequency_response_parameters(ResponseParameters &r_params, const std::string &property, const std::string &xc, const double &frequency, - bool high_precision) { - if (high_precision) { + const std::string &precision) { + if (precision == "high") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); r_params.set_user_defined_value("dconv", 1e-6); - } else { + } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); + } else { + r_params.set_user_defined_value>("protocol", {1e-9}); + r_params.set_user_defined_value("dconv", 1e-7); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(30)); @@ -664,11 +670,11 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par auto RunResponse(World &world, const std::string &filename, double frequency, const std::string &property, const std::string &xc, const std::filesystem::path &moldft_path, std::filesystem::path restart_path, - bool highPrecision) -> std::pair { + const std::string &precision) -> std::pair { // Set the response parameters ResponseParameters r_params{}; - set_frequency_response_parameters(r_params, property, xc, frequency, highPrecision); + set_frequency_response_parameters(r_params, property, xc, frequency, precision); auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, moldft_path, restart_path, true); @@ -678,7 +684,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, std::ifstream ifs("response_base.json"); json response_base; ifs >> response_base; - if (response_base["converged"]) { return {save_path, true}; } + if (response_base["converged"] && response_base["precision"]["dconv"] == r_params.dconv()) { return {save_path, true}; } } auto calc_params = initialize_calc_params(world, std::string(filename)); RHS_Generator rhs_generator; @@ -814,7 +820,7 @@ auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec * @param xc * @param property */ -void runFrequencyTests(World &world, const frequencySchema &schema, bool high_prec) { +void runFrequencyTests(World &world, const frequencySchema &schema, const std::string &high_prec) { std::filesystem::current_path(schema.moldft_path); // add a restart path @@ -827,6 +833,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr if (world.rank() == 0) { print(success.second); } + std::filesystem::current_path(schema.moldft_path); if (first) { first = false; @@ -858,9 +865,9 @@ void runFrequencyTests(World &world, const frequencySchema &schema, bool high_pr * @param m_schema * @param try_moldft do we try moldft or not... if we try we still may restart * @param restart do we force a restart or not - * @param high_prec high precision or no? + * @param precision high precision or no? */ -void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, bool high_prec) { +void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, const std::string &precision) { if (std::filesystem::is_directory(m_schema.moldft_path)) { if (world.rank() == 0) { @@ -879,7 +886,7 @@ void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; } - runMOLDFT(world, m_schema, try_moldft, restart, high_prec); + runMOLDFT(world, m_schema, try_moldft, restart, precision); } #endif// MADNESS_RUNNERS_HPP From a9460e7f0c9ec8e9fd5572fe3d77887f9d9ccae0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 12 Nov 2022 08:59:15 -0500 Subject: [PATCH 0732/1312] New exchange on ground --- src/apps/molresponse/ResponseBase.cpp | 23 ++++++----- src/apps/molresponse/global_functions.cc | 52 ++++++++++++++++++++++-- src/apps/molresponse/global_functions.h | 1 + src/apps/molresponse/x_space.cc | 5 ++- 4 files changed, 66 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 85d42a037eb..cd21690b3da 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1085,12 +1085,13 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< auto phi0_c = copy(world, phi0_copy); world.gop.fence(); int b = 0; - for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } if (compute_Y) { - b = 0; - for (auto &k0y: K0.Y) { k0y = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); } + auto xX = to_response_matrix(X); + auto kmatrix = ground_exchange(phi0_copy, xX); + K0 = to_X_space(kmatrix); } else { - K0.Y = K0.X.copy(); + K0.X.x = ground_exchange(phi0_copy, Chi_copy.X.x); + K0.Y = K0.X; } if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } @@ -1841,16 +1842,16 @@ void ResponseBase::output_json() { ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); print(ss.str()); - nlohmann::json calc_precision={ }; - calc_precision["dconv"]=r_params.dconv(); - calc_precision["thresh"]=FunctionDefaults<3>::get_thresh(); - calc_precision["k"]=FunctionDefaults<3>::get_k(); - j_molresponse["precision"]=calc_precision; - nlohmann::json timing={ }; + nlohmann::json calc_precision = {}; + calc_precision["dconv"] = r_params.dconv(); + calc_precision["thresh"] = FunctionDefaults<3>::get_thresh(); + calc_precision["k"] = FunctionDefaults<3>::get_k(); + j_molresponse["precision"] = calc_precision; + nlohmann::json timing = {}; timing["datetime"] = ss.str(); timing["wall_time"] = wall_time(); timing["cpu_time"] = cpu_time(); - j_molresponse["time_data"]=timing; + j_molresponse["time_data"] = timing; std::ofstream ofs("response_base.json"); ofs << std::setw(4) << j_molresponse; } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 5d3ad94f81b..f25ce8035d8 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -50,7 +50,7 @@ auto initialize_calc_params(World &world, const std::string &input_file) -> Calc Molecule molecule = ground_calculation.molecule(); r_params.set_ground_state_calculation_data(ground_calculation); r_params.set_derived_values(world, molecule); - if(world.rank()==0){ + if (world.rank() == 0) { r_params.print(); } return {ground_calculation, molecule, r_params}; @@ -74,6 +74,52 @@ auto T(World &world, response_space &f) -> response_space { return T; } +// compute exchange |i> +/** + * Computes ground density exchange on response vectors + * This algorithm places all functions in a single vector, + * computes exchange and returns the result into a response + * matrix + * + * @param v1 + * @param v2 + * @param f + * @return + */ +auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response_matrix { + World &world = phi0[0].world(); + + vecfuncT phi_vect(x.size() * phi0.size()); + vecfuncT x_vect(x.size() * phi0.size()); + + long b = 0; + for (const auto &xi: x) { + auto v0 = madness::copy(world, phi0); + std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { + phi_vect[b] = copy(phi_i); + }); + std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + x_vect[b] = copy(xij); + }); + b++; + } + const double lo = 1.e-10; + + Exchange op{}; + op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); + op.set_algorithm(op.small_memory); + auto exchange_vect = op(x_vect); + + auto exchange_matrix= create_response_matrix(x.size(),phi0.size()); + b=0; + for(auto & xi :exchange_matrix){ + for (auto&xij : xi){ + xij=copy(exchange_vect[b++]); + } + + } + return exchange_matrix; +} // compute exchange |i> auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfuncT { World &world = ket[0].world(); @@ -82,7 +128,7 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu Exchange op{}; op.set_parameters(bra, ket, lo); op.set_algorithm(op.multiworld_efficient); - auto vk=op(vf); - return vk ; + auto vk = op(vf); + return vk; } // sum_i |i> for each p \ No newline at end of file diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 675c45ccac9..e04ab6a16b6 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -44,6 +44,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); +auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response_matrix; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 38644836494..3918f4936f1 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -63,8 +63,11 @@ namespace madness { auto mx = to_response_matrix(x); int b = 0; - for (auto &mi: mx) { + for (const auto &mi: mx) { std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); + std::for_each(mi.begin(), mi.end(),[&](const auto &mix) { + vij[b * num_orbitals] = copy(mix); + }); b++; } return vij; From e7a6b047988c236366c220d98d8a407fa48c1f99 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 12 Nov 2022 09:19:17 -0500 Subject: [PATCH 0733/1312] Fix bug and add timings --- src/apps/molresponse/global_functions.cc | 25 ++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f25ce8035d8..162effc639e 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -93,31 +93,36 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response vecfuncT x_vect(x.size() * phi0.size()); long b = 0; + long n = 0; + molresponse::start_timer(world); for (const auto &xi: x) { - auto v0 = madness::copy(world, phi0); std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { - phi_vect[b] = copy(phi_i); + phi_vect[b++] = copy(phi_i); }); std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - x_vect[b] = copy(xij); + x_vect[n++] = copy(xij); }); - b++; } + world.gop.fence(); + molresponse::end_timer(world,"ground exchange copy"); + molresponse::start_timer(world); const double lo = 1.e-10; Exchange op{}; op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); op.set_algorithm(op.small_memory); auto exchange_vect = op(x_vect); + molresponse::end_timer(world,"ground exchange apply"); + molresponse::start_timer(world); - auto exchange_matrix= create_response_matrix(x.size(),phi0.size()); - b=0; - for(auto & xi :exchange_matrix){ - for (auto&xij : xi){ - xij=copy(exchange_vect[b++]); + auto exchange_matrix = create_response_matrix(x.size(), phi0.size()); + b = 0; + for (auto &xi: exchange_matrix) { + for (auto &xij: xi) { + xij = copy(exchange_vect[b++]); } - } + molresponse::end_timer(world,"ground exchange reorganize"); return exchange_matrix; } // compute exchange |i> From 8eb91ff247dd28844d4d601ecb684ff16c852780 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 17:37:06 -0500 Subject: [PATCH 0734/1312] new exchange --- src/apps/molresponse/ResponseBase.cpp | 4 ++-- src/apps/molresponse/global_functions.cc | 26 ++++++++++++++++-------- src/apps/molresponse/global_functions.h | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index cd21690b3da..0a8e409d7d8 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1087,10 +1087,10 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< int b = 0; if (compute_Y) { auto xX = to_response_matrix(X); - auto kmatrix = ground_exchange(phi0_copy, xX); + auto kmatrix = ground_exchange(phi0_copy, xX, true); K0 = to_X_space(kmatrix); } else { - K0.X.x = ground_exchange(phi0_copy, Chi_copy.X.x); + K0.X.x = ground_exchange(phi0_copy, Chi_copy.X.x, false); K0.Y = K0.X; } if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 162effc639e..82dd58b3c41 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -86,25 +86,35 @@ auto T(World &world, response_space &f) -> response_space { * @param f * @return */ -auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response_matrix { +auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix { World &world = phi0[0].world(); + auto num_orbitals = phi0.size(); + long n{}; + if (compute_y) { + n = 2; + } else { + n = 1; + } + vecfuncT phi_vect(x.size() * n * phi0.size()); + vecfuncT x_vect(x.size() * n * phi0.size()); + - vecfuncT phi_vect(x.size() * phi0.size()); - vecfuncT x_vect(x.size() * phi0.size()); + int orb_i = 0; + std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i % num_orbitals]); }); long b = 0; - long n = 0; + long j = 0; molresponse::start_timer(world); for (const auto &xi: x) { std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { phi_vect[b++] = copy(phi_i); }); std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - x_vect[n++] = copy(xij); + x_vect[j++] = copy(xij); }); } world.gop.fence(); - molresponse::end_timer(world,"ground exchange copy"); + molresponse::end_timer(world, "ground exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; @@ -112,7 +122,7 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); op.set_algorithm(op.small_memory); auto exchange_vect = op(x_vect); - molresponse::end_timer(world,"ground exchange apply"); + molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); auto exchange_matrix = create_response_matrix(x.size(), phi0.size()); @@ -122,7 +132,7 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response xij = copy(exchange_vect[b++]); } } - molresponse::end_timer(world,"ground exchange reorganize"); + molresponse::end_timer(world, "ground exchange reorganize"); return exchange_matrix; } // compute exchange |i> diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index e04ab6a16b6..c344b08c919 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -44,7 +44,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); -auto ground_exchange(const vecfuncT &phi0, const response_matrix &x) -> response_matrix; +auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } From dd57ccfb2f88da9974a5196ca422c33bb824013b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 18:31:09 -0500 Subject: [PATCH 0735/1312] new response exchange --- src/apps/molresponse/ResponseBase.cpp | 71 ++++------------------- src/apps/molresponse/global_functions.cc | 73 ++++++++++++++++++++++++ src/apps/molresponse/global_functions.h | 1 + 3 files changed, 85 insertions(+), 60 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 0a8e409d7d8..29cfd63a684 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -523,38 +523,13 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - X_space KX = X_space::zero_functions(world, num_states, num_orbitals); - X_space KY = X_space::zero_functions(world, num_states, num_orbitals); - auto phi0_c = ::madness::copy(world, phi0); - vecfuncT x, y; - for (size_t b = 0; b < num_states; b++) { - x = chi_alpha.X[b]; - y = chi_alpha.Y[b]; - world.gop.fence(); - // |x> - KY.X[b] = newK(phi0, y, phi0_c); - world.gop.fence(); - KX.Y[b] = newK(phi0, x, phi0_c); - world.gop.fence(); - KX.Y[b] = newK(phi0, x, phi0_c); - // |y> - KX.X[b] = newK(x, phi0, phi0_c); - world.gop.fence(); - KY.Y[b] = newK(y, phi0, phi0_c); - world.gop.fence(); - // |i> - } - - + auto x = to_response_matrix(chi_alpha); + auto x_d = to_conjugate_response_matrix(chi_alpha); + auto hf_exchange_matrix = response_exchange(phi0, x, x_d, false); + auto K = to_X_space(hf_exchange_matrix); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } - - // for each response state we compute the Gamma response functions - // trucate all response functions - - // update gamma functions if (r_params.print_level() >= 1) { molresponse::start_timer(world); } /* @@ -565,7 +540,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit */ X_space gamma(world, num_states, num_orbitals); - gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (K) *xcf.hf_exchange_coefficient() + W; //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); @@ -587,9 +562,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { molresponse::start_timer(world); print_inner(world, "xJx", chi_alpha, J); - print_inner(world, "xKXx", chi_alpha, KX); - print_inner(world, "xKYx", chi_alpha, KY); - X_space K = KX + KY; print_inner(world, "xKx", chi_alpha, K); world.gop.fence(); print_inner(world, "xWx", chi_alpha, W); @@ -605,8 +577,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit J.clear(); j_x.clear(); j_y.clear(); - KX.clear(); - KY.clear(); + K.clear(); W.clear(); chi_alpha.clear(); @@ -669,8 +640,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm X_space W = X_space::zero_functions(world, num_states, num_orbitals); X_space J(world, num_states, num_orbitals); - X_space KX = X_space::zero_functions(world, num_states, num_orbitals); - X_space KY = X_space::zero_functions(world, num_states, num_orbitals); + X_space K = X_space::zero_functions(world, num_states, num_orbitals); // std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; // world.mpi.Barrier(); @@ -717,28 +687,10 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - + K.X.x = response_exchange(phi0, xy.X.x, xy.X.x, true); + K.Y = K.X.copy(); // normal exchange - std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), [&](const auto &xi) { - return newK(xi, phi0, phi0); - }); - // conjugate exchange - std::transform(xy.Y.begin(), xy.Y.end(), KY.X.begin(), [&](const auto &yi) { - return newK(phi0, yi, phi0); - }); - /* - for (size_t b = 0; b < num_states; b++) { - vecfuncT x, y; - x = xy.X[b]; - KX.X[b] = newK(x, phi0, phi0); - // |i> - y = xy.Y[b]; - KY.X[b] = newK(phi0, y, phi0); - // |y> - } - */ if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -754,7 +706,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ // update gamma functions - gamma = (2 * J) - (KX + KY) * xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (K) *xcf.hf_exchange_coefficient() + W; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } @@ -771,8 +723,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::start_timer(world); } J.clear(); - KX.clear(); - KY.clear(); + K.clear(); W.clear(); xy.clear(); phi0.clear(); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 82dd58b3c41..892cb15df3b 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -121,7 +121,9 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool Exchange op{}; op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); op.set_algorithm(op.small_memory); + world.gop.fence(); auto exchange_vect = op(x_vect); + world.gop.fence(); molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); @@ -132,9 +134,80 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool xij = copy(exchange_vect[b++]); } } + world.gop.fence(); molresponse::end_timer(world, "ground exchange reorganize"); return exchange_matrix; } +// compute full response exchange |i> +/** + * Computes ground density exchange on response vectors + * This algorithm places all functions in a single vector, + * computes exchange and returns the result into a response + * matrix + * + * @param v1 + * @param v2 + * @param f + * @return + */ +auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, const bool static_response) -> response_matrix { + World &world = phi0[0].world(); + auto num_orbitals = phi0.size(); + long n{}; + + n = (static_response) ? 1 : 2; + vecfuncT phi_vect(x.size() * n * phi0.size()); + vecfuncT x_vect(x.size() * n * phi0.size()); + vecfuncT xd_vect(x.size() * n * phi0.size()); + int orb_i = 0; + std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i % num_orbitals]); }); + long b = 0; + long j = 0; + molresponse::start_timer(world); + for (const auto &xi: x) { + std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + x_vect[j++] = copy(xij); + }); + } + for (const auto &xi: x_dagger) { + std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + xd_vect[j++] = copy(xij); + }); + } + world.gop.fence(); + molresponse::end_timer(world, "response exchange copy"); + molresponse::start_timer(world); + const double lo = 1.e-10; + auto phi_copy = madness::copy(world, phi_vect); + Exchange kx{}; + kx.set_parameters(x_vect, phi_copy, lo); + kx.set_algorithm(kx.small_memory); + Exchange kxd{}; + kxd.set_parameters(phi_copy, xd_vect, lo); + kxd.set_algorithm(kxd.small_memory); + + world.gop.fence(); + auto exchange_vector = kx(phi_vect); + world.gop.fence(); + auto exchange_conjugate_vector = kxd(phi_vect); + world.gop.fence(); + molresponse::end_timer(world, "response exchange apply"); + molresponse::start_timer(world); + + vecfuncT exchange = exchange_vector + exchange_conjugate_vector; + + + auto exchange_matrix = create_response_matrix(x.size(), n * phi0.size()); + b = 0; + for (auto &xi: exchange_matrix) { + for (auto &xij: xi) { + xij = copy(exchange[b++]); + } + } + world.gop.fence(); + molresponse::end_timer(world, "response exchange reorganize"); + return exchange_matrix; +} // compute exchange |i> auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfuncT { World &world = ket[0].world(); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index c344b08c919..c1f7921e2fc 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -45,6 +45,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); response_space T(World &world, response_space &f); auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix; +auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, bool static_response) -> response_matrix; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } From 9bc39d9053e6da9427cd9bf9dab5fc7dd81c5ef8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 19:02:37 -0500 Subject: [PATCH 0736/1312] unbug static exchange --- src/apps/molresponse/ResponseBase.cpp | 2 +- src/apps/molresponse/global_functions.cc | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 29cfd63a684..96306b4c197 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -687,7 +687,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K.X.x = response_exchange(phi0, xy.X.x, xy.X.x, true); + K.X.x = response_exchange(phi0, xy.X.x, xy.X.copy().x, true); K.Y = K.X.copy(); // normal exchange diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 892cb15df3b..438d541ac12 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -169,6 +169,8 @@ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const res x_vect[j++] = copy(xij); }); } + world.gop.fence(); + j = 0; for (const auto &xi: x_dagger) { std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { xd_vect[j++] = copy(xij); From 962da13048307f87f6cde6195fe2cff8f06493f2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 19:13:08 -0500 Subject: [PATCH 0737/1312] back to multiworld efficient --- src/apps/molresponse/global_functions.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 438d541ac12..c649efe406f 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -120,7 +120,7 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool Exchange op{}; op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); - op.set_algorithm(op.small_memory); + op.set_algorithm(op.multiworld_efficient); world.gop.fence(); auto exchange_vect = op(x_vect); world.gop.fence(); @@ -183,10 +183,10 @@ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const res auto phi_copy = madness::copy(world, phi_vect); Exchange kx{}; kx.set_parameters(x_vect, phi_copy, lo); - kx.set_algorithm(kx.small_memory); + kx.set_algorithm(kx.multiworld_efficient); Exchange kxd{}; kxd.set_parameters(phi_copy, xd_vect, lo); - kxd.set_algorithm(kxd.small_memory); + kxd.set_algorithm(kxd.multiworld_efficient); world.gop.fence(); auto exchange_vector = kx(phi_vect); From 788637ad51622cc9ca8fa49b44ee47fa97850dcd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 19:46:53 -0500 Subject: [PATCH 0738/1312] back to multiworld efficient --- src/apps/molresponse/ResponseBase.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 96306b4c197..e43688c4a37 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -526,7 +526,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto x = to_response_matrix(chi_alpha); auto x_d = to_conjugate_response_matrix(chi_alpha); auto hf_exchange_matrix = response_exchange(phi0, x, x_d, false); + world.gop.fence(); auto K = to_X_space(hf_exchange_matrix); + world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } From ea5f1a4e3e500f1a3705920c49a92348d028c6c9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 21:27:43 -0500 Subject: [PATCH 0739/1312] whoops i didnt copy the ground-state vectors --- src/apps/molresponse/global_functions.cc | 2 +- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index c649efe406f..f6c7dbd1974 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -160,7 +160,7 @@ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const res vecfuncT x_vect(x.size() * n * phi0.size()); vecfuncT xd_vect(x.size() * n * phi0.size()); int orb_i = 0; - std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i % num_orbitals]); }); + std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); long b = 0; long j = 0; molresponse::start_timer(world); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 6cdf5f32116..2fc9b9a8c6f 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -556,7 +556,7 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: r_params.set_user_defined_value("first_order", true); r_params.set_user_defined_value("plot_all_orbitals", false); r_params.set_user_defined_value("plot", true); - r_params.set_user_defined_value("print_level", 2); + r_params.set_user_defined_value("print_level", 20); r_params.set_user_defined_value("save", true); // set xc, property, frequency,and restart r_params.set_user_defined_value("xc", xc); From ca4216d1765eccc07ca37236636327018485bac5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 13 Nov 2022 22:14:18 -0500 Subject: [PATCH 0740/1312] debugging response --- src/apps/molresponse/ResponseBase.cpp | 2 ++ src/apps/molresponse/global_functions.cc | 35 ++++++++++++------------ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index e43688c4a37..40adca7e764 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -525,6 +525,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto x = to_response_matrix(chi_alpha); auto x_d = to_conjugate_response_matrix(chi_alpha); + auto hf_exchange_matrix = response_exchange(phi0, x, x_d, false); world.gop.fence(); auto K = to_X_space(hf_exchange_matrix); @@ -689,6 +690,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + K.X.x = response_exchange(phi0, xy.X.x, xy.X.copy().x, true); K.Y = K.X.copy(); // normal exchange diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f6c7dbd1974..631d6129867 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -152,46 +152,45 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool */ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, const bool static_response) -> response_matrix { World &world = phi0[0].world(); + molresponse::start_timer(world); auto num_orbitals = phi0.size(); long n{}; - n = (static_response) ? 1 : 2; vecfuncT phi_vect(x.size() * n * phi0.size()); vecfuncT x_vect(x.size() * n * phi0.size()); vecfuncT xd_vect(x.size() * n * phi0.size()); int orb_i = 0; - std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); - long b = 0; + for (auto &phi_i: phi_vect) { phi_i = copy(phi0[orb_i++ % num_orbitals]); } long j = 0; - molresponse::start_timer(world); for (const auto &xi: x) { - std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + for (const auto &xij: xi) { x_vect[j++] = copy(xij); - }); + } } world.gop.fence(); j = 0; for (const auto &xi: x_dagger) { - std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + for (const auto &xij: xi) { xd_vect[j++] = copy(xij); - }); + } } world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; - auto phi_copy = madness::copy(world, phi_vect); - Exchange kx{}; - kx.set_parameters(x_vect, phi_copy, lo); - kx.set_algorithm(kx.multiworld_efficient); - Exchange kxd{}; - kxd.set_parameters(phi_copy, xd_vect, lo); - kxd.set_algorithm(kxd.multiworld_efficient); + auto phi_copy1 = madness::copy(world, phi_vect,true); + auto phi_copy2 = madness::copy(world, phi_vect,true); + Exchange x_phi_K{}; + x_phi_K.set_parameters(x_vect, phi_copy1, lo); + x_phi_K.set_algorithm(x_phi_K.multiworld_efficient); + Exchange phi_xd_K{}; + phi_xd_K.set_parameters(phi_copy2, xd_vect, lo); + phi_xd_K.set_algorithm(phi_xd_K.multiworld_efficient); world.gop.fence(); - auto exchange_vector = kx(phi_vect); + auto exchange_vector = x_phi_K(phi_vect); world.gop.fence(); - auto exchange_conjugate_vector = kxd(phi_vect); + auto exchange_conjugate_vector = phi_xd_K(phi_vect); world.gop.fence(); molresponse::end_timer(world, "response exchange apply"); molresponse::start_timer(world); @@ -200,7 +199,7 @@ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const res auto exchange_matrix = create_response_matrix(x.size(), n * phi0.size()); - b = 0; + int b = 0; for (auto &xi: exchange_matrix) { for (auto &xij: xi) { xij = copy(exchange[b++]); From 074aaf254ca63bb3126dfa05eb6296e6152cba6d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 08:00:48 -0500 Subject: [PATCH 0741/1312] make sure i copy correctly --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 631d6129867..ae9f3bc948f 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -100,7 +100,7 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool int orb_i = 0; - std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i % num_orbitals]); }); + std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); long b = 0; long j = 0; From d3b53936f17ccc33628ceb3c67883ab25341ea71 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 08:09:05 -0500 Subject: [PATCH 0742/1312] ground exchange --- src/apps/molresponse/global_functions.cc | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index ae9f3bc948f..b7bbc4ef2d0 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -88,6 +88,7 @@ auto T(World &world, response_space &f) -> response_space { */ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix { World &world = phi0[0].world(); + molresponse::start_timer(world); auto num_orbitals = phi0.size(); long n{}; if (compute_y) { @@ -98,17 +99,10 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool vecfuncT phi_vect(x.size() * n * phi0.size()); vecfuncT x_vect(x.size() * n * phi0.size()); - int orb_i = 0; std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); - - long b = 0; long j = 0; - molresponse::start_timer(world); - for (const auto &xi: x) { - std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { - phi_vect[b++] = copy(phi_i); - }); + for (const auto &xi: x) {// copy the response matrix into a single vector of functions std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { x_vect[j++] = copy(xij); }); @@ -117,18 +111,18 @@ auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool molresponse::end_timer(world, "ground exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; - Exchange op{}; + // Do exchange by creating operator with parameters op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); op.set_algorithm(op.multiworld_efficient); world.gop.fence(); + // apply exchange phi phi x auto exchange_vect = op(x_vect); - world.gop.fence(); molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); - auto exchange_matrix = create_response_matrix(x.size(), phi0.size()); - b = 0; + auto exchange_matrix = create_response_matrix(x.size(), n*phi0.size()); + long b = 0; for (auto &xi: exchange_matrix) { for (auto &xij: xi) { xij = copy(exchange_vect[b++]); From 88f9034c0521b3ccc6354a980809ef7262202048 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 08:50:27 -0500 Subject: [PATCH 0743/1312] ground-exchange rework --- src/apps/molresponse/ResponseBase.cpp | 10 +---- src/apps/molresponse/global_functions.cc | 50 +++++++++++++++-------- src/apps/molresponse/global_functions.h | 2 +- src/apps/molresponse/response_functions.h | 8 ++++ 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 40adca7e764..6dffedb9eb5 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1040,14 +1040,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< auto phi0_c = copy(world, phi0_copy); world.gop.fence(); int b = 0; - if (compute_Y) { - auto xX = to_response_matrix(X); - auto kmatrix = ground_exchange(phi0_copy, xX, true); - K0 = to_X_space(kmatrix); - } else { - K0.X.x = ground_exchange(phi0_copy, Chi_copy.X.x, false); - K0.Y = K0.X; - } + K0 = ground_exchange(phi0_copy, X, compute_Y); if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } // Vnuc+V0+VXC @@ -1065,6 +1058,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } else { V0.Y = V0.X.copy(); } + if (r_params.print_level() >= 20) { print_inner(world, "xV0x", Chi_copy, V0); } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index b7bbc4ef2d0..1ccbfcd716a 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -86,51 +86,65 @@ auto T(World &world, response_space &f) -> response_space { * @param f * @return */ -auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix { +auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); - auto num_orbitals = phi0.size(); + X_space K0 = X_space(world, x.num_states(), x.num_orbitals()); long n{}; + response_matrix xx; + // place all x and y functions into a single response vector if (compute_y) { n = 2; + xx = to_response_matrix(x); + // place all x } else { n = 1; + xx = x.X.x; + // if not compute y we are only working with the x functions } - vecfuncT phi_vect(x.size() * n * phi0.size()); - vecfuncT x_vect(x.size() * n * phi0.size()); - - int orb_i = 0; - std::for_each(phi_vect.begin(), phi_vect.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); - long j = 0; - for (const auto &xi: x) {// copy the response matrix into a single vector of functions + // should have num_states * num_orbitals * n if compute y n=2 else n=1 + vecfuncT x_vector(x.num_states() * n * x.num_orbitals()); + long ij = 0; + for (const auto &xi: xx) {// copy the response matrix into a single vector of functions std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - x_vect[j++] = copy(xij); + x_vector.at(ij++) = copy(xij); }); } + vecfuncT phi_vector(x.num_states() * n * phi0.size()); + int orb_i = 0; + // copy ground-state orbitals into a single long vector + std::for_each(phi_vector.begin(), phi_vector.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; Exchange op{}; // Do exchange by creating operator with parameters - op.set_parameters(phi_vect, madness::copy(world, phi_vect), lo); + op.set_parameters(phi_vector, madness::copy(world, phi_vector), lo); op.set_algorithm(op.multiworld_efficient); world.gop.fence(); // apply exchange phi phi x - auto exchange_vect = op(x_vect); + auto exchange_vector = op(x_vector); molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); - auto exchange_matrix = create_response_matrix(x.size(), n*phi0.size()); - long b = 0; + auto exchange_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); + long b = 0; for (auto &xi: exchange_matrix) { for (auto &xij: xi) { - xij = copy(exchange_vect[b++]); + xij = copy(exchange_vector[b++]); } } + if (compute_y) { + K0 = to_X_space(exchange_matrix); + } else { + K0.X = exchange_matrix; + K0.X = K0.Y.copy(); + } + world.gop.fence(); molresponse::end_timer(world, "ground exchange reorganize"); - return exchange_matrix; + return K0; } // compute full response exchange |i> /** @@ -172,8 +186,8 @@ auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const res molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; - auto phi_copy1 = madness::copy(world, phi_vect,true); - auto phi_copy2 = madness::copy(world, phi_vect,true); + auto phi_copy1 = madness::copy(world, phi_vect, true); + auto phi_copy2 = madness::copy(world, phi_vect, true); Exchange x_phi_K{}; x_phi_K.set_parameters(x_vect, phi_copy1, lo); x_phi_K.set_algorithm(x_phi_K.multiworld_efficient); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index c1f7921e2fc..64f073f32f5 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -44,7 +44,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); -auto ground_exchange(const vecfuncT &phi0, const response_matrix &x, const bool compute_y) -> response_matrix; +auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space; auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, bool static_response) -> response_matrix; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 34775d7515f..a15e757a81e 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -74,6 +74,14 @@ namespace madness { } return *this;// } + + response_space &operator=(const response_matrix &y) { + // + this->num_states = y.size(); + this->num_orbitals = y[0].size(); + this->x = y; + return *this;// + } // Initialize functions to zero // m = number of response states // n = number of ground state orbitals From 2671ffc6fd21dac1b8b6b65731eaaf0f2dfaf67c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 08:57:11 -0500 Subject: [PATCH 0744/1312] Copy correctly --- .gitignore | 1 + src/apps/molresponse/global_functions.cc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e947318afde..bbf33a63d50 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,4 @@ compile_commands.json *.idx .clang-format /cmake-build-debug/.ninja_deps +compile_commands diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 1ccbfcd716a..80ca4ef2e75 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -139,7 +139,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ K0 = to_X_space(exchange_matrix); } else { K0.X = exchange_matrix; - K0.X = K0.Y.copy(); + K0.Y = K0.X.copy(); } world.gop.fence(); From 9313f0144968435af4b9d44c52e5756cb85d1b83 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 10:27:34 -0500 Subject: [PATCH 0745/1312] Re-write full and static response exchange --- src/apps/molresponse/ResponseBase.cpp | 23 +--- src/apps/molresponse/global_functions.cc | 127 +++++++++++------------ src/apps/molresponse/global_functions.h | 2 +- src/apps/molresponse/x_space.cc | 8 +- 4 files changed, 72 insertions(+), 88 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6dffedb9eb5..dd24b2bb221 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -522,28 +522,15 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - auto x = to_response_matrix(chi_alpha); - auto x_d = to_conjugate_response_matrix(chi_alpha); - - auto hf_exchange_matrix = response_exchange(phi0, x, x_d, false); - world.gop.fence(); - auto K = to_X_space(hf_exchange_matrix); - world.gop.fence(); + auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* - J.truncate(); - KX.truncate(); - KY.truncate(); - W.truncate(); - */ X_space gamma(world, num_states, num_orbitals); - gamma = (2 * J) - (K) *xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (K * xcf.hf_exchange_coefficient()) + W; //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); @@ -691,9 +678,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K.X.x = response_exchange(phi0, xy.X.x, xy.X.copy().x, true); - K.Y = K.X.copy(); - // normal exchange + K = response_exchange(phi0, xy, false); if (r_params.print_level() >= 1) { @@ -710,7 +695,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ // update gamma functions - gamma = (2 * J) - (K) *xcf.hf_exchange_coefficient() + W; + gamma = (2 * J) - (K * xcf.hf_exchange_coefficient()) + W; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 80ca4ef2e75..3cc2967ded6 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -2,41 +2,10 @@ #include #include -#include -#include #include "madness/chem/SCFOperators.h" #include "response_parameters.h" -void print_molecule(World &world, const GroundStateCalculation &g_params) { - if (world.rank() == 0) { - // Precision is set to 10 coming in, drop it to 5 - std::cout.precision(5); - std::cout << std::fixed; - - // First get atom - const std::vector atoms = g_params.molecule().get_atoms(); - size_t num_atoms = atoms.size(); - - // Now print - print("\n Geometry Information"); - print(" --------------------\n"); - print(" Units: a.u.\n"); - print(" Atom x y z"); - print("----------------------------------------------------------------"); - for (size_t j = 0; j < num_atoms; j++) { - Vector coords = atoms[j].get_coords(); - std::cout << std::setw(3) << atomic_number_to_symbol(atoms[j].get_atomic_number()); - std::cout << std::setw(18) << std::right << coords[0] << std::setw(18) << coords[1] - << std::setw(18) << coords[2] << endl; - } - print(""); - - // Reset precision - std::cout.precision(10); - std::cout << std::scientific; - } -} auto initialize_calc_params(World &world, const std::string &input_file) -> CalcParams { ResponseParameters r_params{}; @@ -158,64 +127,88 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ * @param f * @return */ -auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, const bool static_response) -> response_matrix { +auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); + X_space K = X_space(world, x.num_states(), x.num_orbitals()); + X_space conjugateK = X_space(world, x.num_states(), x.num_orbitals()); auto num_orbitals = phi0.size(); long n{}; - n = (static_response) ? 1 : 2; - vecfuncT phi_vect(x.size() * n * phi0.size()); - vecfuncT x_vect(x.size() * n * phi0.size()); - vecfuncT xd_vect(x.size() * n * phi0.size()); - int orb_i = 0; - for (auto &phi_i: phi_vect) { phi_i = copy(phi0[orb_i++ % num_orbitals]); } - long j = 0; - for (const auto &xi: x) { - for (const auto &xij: xi) { - x_vect[j++] = copy(xij); - } + response_matrix xx; + response_matrix xx_dagger; + if (compute_y) { + n = 2; + xx = to_response_matrix(x); + xx_dagger = to_conjugate_response_matrix(x); + // place all x + } else { + n = 1; + xx = x.X.x; + xx_dagger = x.X.x; + // if not compute y we are only working with the x functions } - world.gop.fence(); - j = 0; - for (const auto &xi: x_dagger) { - for (const auto &xij: xi) { - xd_vect[j++] = copy(xij); - } + vecfuncT x_vector(x.num_states() * n * x.num_orbitals()); + long ij = 0; + for (const auto &xi: xx) {// copy the response matrix into a single vector of functions + std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { + x_vector.at(ij++) = copy(xij); + }); + } + ij = 0; + vecfuncT x_dagger_vector(x.num_states() * n * x.num_orbitals()); + for (const auto &xdi: xx_dagger) {// copy the response matrix into a single vector of functions + std::for_each(xdi.begin(), xdi.end(), [&](const auto &xdij) { + x_dagger_vector.at(ij++) = copy(xdij); + }); } + vecfuncT phi_vector(x.num_states() * n * phi0.size()); + int orb_i = 0; + // copy ground-state orbitals into a single long vector + std::for_each(phi_vector.begin(), phi_vector.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); const double lo = 1.e-10; - auto phi_copy1 = madness::copy(world, phi_vect, true); - auto phi_copy2 = madness::copy(world, phi_vect, true); - Exchange x_phi_K{}; - x_phi_K.set_parameters(x_vect, phi_copy1, lo); - x_phi_K.set_algorithm(x_phi_K.multiworld_efficient); - Exchange phi_xd_K{}; - phi_xd_K.set_parameters(phi_copy2, xd_vect, lo); - phi_xd_K.set_algorithm(phi_xd_K.multiworld_efficient); - + auto phi_copy1 = madness::copy(world, phi_vector, true); + auto phi_copy2 = madness::copy(world, phi_vector, true); + // We have 2 versions of exchange k(x,phi) phi and k(phi,x) phi + // K1.X = k[x ,phi] phi , K2.X = k[phi,y] phi // if static we only compute the top line + // K1.Y = k[y',phi] phi , K2.Y = k[phi,x] phi + // K=K1+K2 + Exchange K1{}; + K1.set_parameters(x_vector, phi_copy1, lo); + K1.set_algorithm(K1.multiworld_efficient); + Exchange K2{}; + K2.set_parameters(phi_copy2, x_dagger_vector, lo); + K2.set_algorithm(K2.multiworld_efficient); world.gop.fence(); - auto exchange_vector = x_phi_K(phi_vect); + + auto K1_vect = K1(phi_vector); world.gop.fence(); - auto exchange_conjugate_vector = phi_xd_K(phi_vect); + auto K2_vect = K2(phi_vector); world.gop.fence(); molresponse::end_timer(world, "response exchange apply"); molresponse::start_timer(world); + vecfuncT K_vector = K1_vect + K2_vect; + world.gop.fence(); - vecfuncT exchange = exchange_vector + exchange_conjugate_vector; - - - auto exchange_matrix = create_response_matrix(x.size(), n * phi0.size()); - int b = 0; + auto exchange_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); + long b = 0; for (auto &xi: exchange_matrix) { for (auto &xij: xi) { - xij = copy(exchange[b++]); + xij = copy(K_vector[b++]); } } world.gop.fence(); + if (compute_y) { + K = to_X_space(exchange_matrix); + } else { + K.X = exchange_matrix; + K.Y = K.X.copy(); + } + world.gop.fence(); molresponse::end_timer(world, "response exchange reorganize"); - return exchange_matrix; + return K; } // compute exchange |i> auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfuncT { diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 64f073f32f5..6733dc52c68 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -45,7 +45,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); response_space T(World &world, response_space &f); auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space; -auto response_exchange(const vecfuncT &phi0, const response_matrix &x, const response_matrix &x_dagger, bool static_response) -> response_matrix; +auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 3918f4936f1..af39ff02b67 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -21,6 +21,7 @@ namespace madness { return matrix; } auto to_response_matrix(const X_space &x) -> response_matrix { + World &world = x.X[0][0].world(); auto mX = response_matrix(x.num_states()); int b = 0; auto num_orbitals = x.num_orbitals(); @@ -29,13 +30,16 @@ namespace madness { mi = vector_real_function_3d(2 * num_orbitals); //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); + world.gop.fence(); std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals); + world.gop.fence(); b++; }); return mX; } auto to_conjugate_response_matrix(const X_space &x) -> response_matrix { + World &world = x.X[0][0].world(); auto mX = response_matrix(x.num_states()); int b = 0; auto num_orbitals = x.num_orbitals(); @@ -44,7 +48,9 @@ namespace madness { mi = vector_real_function_3d(2 * num_orbitals); //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin()); + world.gop.fence(); std::copy(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals); + world.gop.fence(); b++; }); return mX; @@ -65,7 +71,7 @@ namespace madness { int b = 0; for (const auto &mi: mx) { std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); - std::for_each(mi.begin(), mi.end(),[&](const auto &mix) { + std::for_each(mi.begin(), mi.end(), [&](const auto &mix) { vij[b * num_orbitals] = copy(mix); }); b++; From 8512fa49f5d2e156c99d26570a3ba70970cc69b8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 12:56:20 -0500 Subject: [PATCH 0746/1312] more debugging --- src/apps/molresponse/ResponseBase.cpp | 1 + src/apps/molresponse/global_functions.cc | 65 ++++++++++++------------ 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index dd24b2bb221..e0b5d15d326 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -523,6 +523,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange(phi0, chi_alpha, true); + if (r_params.print_level() >= 20) { print_inner(world, "xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 3cc2967ded6..60744b0aea9 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -79,21 +79,16 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ x_vector.at(ij++) = copy(xij); }); } - vecfuncT phi_vector(x.num_states() * n * phi0.size()); + vecfuncT phi_vector1(x.num_states() * n * phi0.size()); + vecfuncT phi_vector2(x.num_states() * n * phi0.size()); int orb_i = 0; // copy ground-state orbitals into a single long vector - std::for_each(phi_vector.begin(), phi_vector.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); + std::for_each(phi_vector1.begin(), phi_vector1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); + phi_vector2 = madness::copy(world, phi_vector1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); molresponse::start_timer(world); - const double lo = 1.e-10; - Exchange op{}; - // Do exchange by creating operator with parameters - op.set_parameters(phi_vector, madness::copy(world, phi_vector), lo); - op.set_algorithm(op.multiworld_efficient); - world.gop.fence(); - // apply exchange phi phi x - auto exchange_vector = op(x_vector); + auto exchange_vector = newK(phi_vector1, phi_vector2, x_vector); molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); @@ -130,8 +125,9 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); + X_space xK1 = X_space(world, x.num_states(), x.num_orbitals()); + X_space xK2 = X_space(world, x.num_states(), x.num_orbitals()); X_space K = X_space(world, x.num_states(), x.num_orbitals()); - X_space conjugateK = X_space(world, x.num_states(), x.num_orbitals()); auto num_orbitals = phi0.size(); long n{}; response_matrix xx; @@ -166,46 +162,51 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput // copy ground-state orbitals into a single long vector std::for_each(phi_vector.begin(), phi_vector.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); world.gop.fence(); - molresponse::end_timer(world, "response exchange copy"); - molresponse::start_timer(world); - const double lo = 1.e-10; auto phi_copy1 = madness::copy(world, phi_vector, true); auto phi_copy2 = madness::copy(world, phi_vector, true); + molresponse::end_timer(world, "response exchange copy"); + molresponse::start_timer(world); // We have 2 versions of exchange k(x,phi) phi and k(phi,x) phi // K1.X = k[x ,phi] phi , K2.X = k[phi,y] phi // if static we only compute the top line // K1.Y = k[y',phi] phi , K2.Y = k[phi,x] phi // K=K1+K2 - Exchange K1{}; - K1.set_parameters(x_vector, phi_copy1, lo); - K1.set_algorithm(K1.multiworld_efficient); - Exchange K2{}; - K2.set_parameters(phi_copy2, x_dagger_vector, lo); - K2.set_algorithm(K2.multiworld_efficient); - world.gop.fence(); - auto K1_vect = K1(phi_vector); + auto K1_vect = newK(x_vector, phi_copy1, phi_vector); world.gop.fence(); - auto K2_vect = K2(phi_vector); + auto K2_vect = newK(phi_copy2, x_dagger_vector, phi_vector); world.gop.fence(); molresponse::end_timer(world, "response exchange apply"); molresponse::start_timer(world); - vecfuncT K_vector = K1_vect + K2_vect; - world.gop.fence(); - - auto exchange_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); + auto K1_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); + auto K2_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); long b = 0; - for (auto &xi: exchange_matrix) { - for (auto &xij: xi) { - xij = copy(K_vector[b++]); + for (auto &k1i: K1_matrix) { + for (auto &k1ij: k1i) { + k1ij = copy(K1_vect[b++]); + } + } + world.gop.fence(); + b = 0; + for (auto &k2i: K2_matrix) { + for (auto &k2ij: k2i) { + k2ij = copy(K2_vect[b++]); } } world.gop.fence(); if (compute_y) { - K = to_X_space(exchange_matrix); + xK1 = to_X_space(K1_matrix); + xK2 = to_X_space(K2_matrix); + world.gop.fence(); + K = xK1 + xK2; } else { - K.X = exchange_matrix; + xK1.X = K1_matrix; + xK2.X = K2_matrix; + world.gop.fence(); + K.X = xK1.X + xK2.X; K.Y = K.X.copy(); } + + world.gop.fence(); molresponse::end_timer(world, "response exchange reorganize"); return K; From 642f559419830949ece996d5e8345e6a89d76a2d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 14 Nov 2022 15:29:07 -0500 Subject: [PATCH 0747/1312] fstream for ofstream --- src/madness/tensor/tensor_json.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/madness/tensor/tensor_json.hpp b/src/madness/tensor/tensor_json.hpp index 0d0393c7e2a..35fdb2d3214 100644 --- a/src/madness/tensor/tensor_json.hpp +++ b/src/madness/tensor/tensor_json.hpp @@ -9,6 +9,7 @@ #include // #include "catch.hpp" +#include #include //#include "mra.h" From 033f40d145a3139441ca0b0bcc59920cce68de87 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 15 Nov 2022 14:28:27 -0500 Subject: [PATCH 0748/1312] new ground_exchange --- src/apps/molresponse/ResponseBase.cpp | 24 ++++++++++- src/apps/molresponse/global_functions.cc | 54 ++++++++++++++++++++---- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index e0b5d15d326..9ea6a00e776 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -522,6 +522,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 20) { print_inner(world, "xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { @@ -1025,10 +1027,30 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< auto phi0_c = copy(world, phi0_copy); world.gop.fence(); + int b = 0; + for (auto &k0x: K0.X) { + k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); + } + if (compute_Y) { + b = 0; + for (auto &k0x: K0.Y) { + k0x = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); + } + + } else { + K0.Y = K0.X.copy(); + } + if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); + if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]"); } + + if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } // Vnuc+V0+VXC if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 60744b0aea9..ab50ddb20ae 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -7,6 +7,11 @@ #include "response_parameters.h" +static auto set_poisson(World &world, const double lo, const double econv = FunctionDefaults<3>::get_thresh()) { + return std::shared_ptr(CoulombOperatorPtr(world, lo, econv)); +} + + auto initialize_calc_params(World &world, const std::string &input_file) -> CalcParams { ResponseParameters r_params{}; commandlineparser parser; @@ -72,28 +77,59 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ // if not compute y we are only working with the x functions } // should have num_states * num_orbitals * n if compute y n=2 else n=1 - vecfuncT x_vector(x.num_states() * n * x.num_orbitals()); + vecfuncT x_vector(x.num_states() * n * x.num_orbitals() * x.num_orbitals()); long ij = 0; + + + size_t b = 0; for (const auto &xi: xx) {// copy the response matrix into a single vector of functions std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - x_vector.at(ij++) = copy(xij); + auto vect_xij = copy(world, xij, x.num_orbitals(), true); + std::copy(vect_xij.begin(), vect_xij.end(), x_vector.begin() + b * x.num_orbitals());// copy the xij vector n times into a block + b++; }); } - vecfuncT phi_vector1(x.num_states() * n * phi0.size()); - vecfuncT phi_vector2(x.num_states() * n * phi0.size()); + vecfuncT phi1(x.num_orbitals() * x.num_orbitals() * n * x.num_states()); + vecfuncT phi2(x.num_orbitals() * x.num_orbitals() * n * x.num_states()); int orb_i = 0; // copy ground-state orbitals into a single long vector - std::for_each(phi_vector1.begin(), phi_vector1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); - phi_vector2 = madness::copy(world, phi_vector1); + std::for_each(phi1.begin(), phi1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); + phi2 = madness::copy(world, phi1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); molresponse::start_timer(world); - auto exchange_vector = newK(phi_vector1, phi_vector2, x_vector); + reconstruct(world, phi1, false); + reconstruct(world, phi2, false); + reconstruct(world, x_vector, false); + world.gop.fence(); + norm_tree(world, phi1, false); + norm_tree(world, phi2, false); + norm_tree(world, x_vector, false); + world.gop.fence(); + const double lo = 1.0e-10; + auto poisson = set_poisson(world, lo); + auto phiX = mul(world, phi1, x_vector, true); + truncate(world, phiX); + phiX = apply(world, *poisson, phiX); + truncate(world, phiX); + auto phi_phiX = mul(world, phi1, phiX, true); + auto exchange_vector = vecfuncT(x.num_states() * n * x.num_orbitals()); + + b = 0; + for (auto &kij: exchange_vector) { + auto phi_phiX_i = vecfuncT(x.num_orbitals()); + std::copy(phi_phiX.begin() + (b * x.num_orbitals()), phi_phiX.begin() + (b * x.num_orbitals()) + x.num_orbitals(), phi_phiX_i.begin()); + world.gop.fence(); + kij = sum(world, phi_phiX_i, true); + b++; + // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) + } molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); + auto exchange_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); - long b = 0; + b = 0; for (auto &xi: exchange_matrix) { for (auto &xij: xi) { xij = copy(exchange_vector[b++]); @@ -222,4 +258,4 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu auto vk = op(vf); return vk; } -// sum_i |i> for each p \ No newline at end of file +// sum_i |i> for each p From 6396d5caae79f9829c9c790b66a174b0b0374440 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 15 Nov 2022 17:34:37 -0500 Subject: [PATCH 0749/1312] new exchange with old for comparision --- src/apps/molresponse/ResponseBase.cpp | 128 +++++++------ src/apps/molresponse/global_functions.cc | 232 +++++++++++------------ src/apps/molresponse/global_functions.h | 15 +- src/apps/molresponse/x_space.h | 21 +- 4 files changed, 204 insertions(+), 192 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 9ea6a00e776..d55cbd415ef 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -27,10 +27,8 @@ /// \param world /// \param params ResponseBase::ResponseBase(World &world, const CalcParams ¶ms) - : r_params(params.response_parameters), - molecule(params.molecule), - ground_calc(params.ground_calculation), - ground_orbitals(ground_calc.orbitals()), + : r_params(params.response_parameters), molecule(params.molecule), + ground_calc(params.ground_calculation), ground_orbitals(ground_calc.orbitals()), ground_energies(ground_calc.get_energies()), Chi(world, r_params.num_states(), r_params.num_orbitals()) { @@ -272,9 +270,7 @@ auto ResponseBase::make_ground_density(World &world) const -> functionT { compress(world, vsq); functionT rho = factoryT(world); rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { - rho.gaxpy(1.0, vsq[i], 1.0, false); - } + for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], 1.0, false); } //for (const auto &phi_squared: vsq) rho.gaxpy(2.0, phi_squared, 1.0, false); world.gop.fence(); vsq.clear(); @@ -307,9 +303,8 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto r_matrix = to_response_matrix(chi); auto r_phi0 = to_response_vector(ground_orbitals); - std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), [&](const auto &ri) { - return dot(world, ri, r_phi0); - }); + std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), + [&](const auto &ri) { return dot(world, ri, r_phi0); }); } else { density = transition_densityTDA(world, ground_orbitals, chi.X); @@ -376,9 +371,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { - print("------------compute theta x_________"); - } + if (world.rank() == 0) { print("------------compute theta x_________"); } } // std::cout << "MPI BARRIER 3 " << std::endl; // world.mpi.Barrier(); @@ -523,12 +516,34 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space KX = X_space::zero_functions(world, num_states, num_orbitals); + X_space KY = X_space::zero_functions(world, num_states, num_orbitals); + auto phi0_c = madness::copy(world, phi0); + vecfuncT x, y; + for (size_t b = 0; b < num_states; b++) { + x = chi_alpha.X[b]; + y = chi_alpha.Y[b]; - auto K = response_exchange(phi0, chi_alpha, true); - if (r_params.print_level() >= 20) { print_inner(world, "xKx", chi_alpha, K); } + KY.X[b] = newK(phi0, y, phi0_c); + world.gop.fence(); + KX.Y[b] = newK(phi0, x, phi0_c); + world.gop.fence(); + KX.X[b] = newK(x, phi0, phi0_c); + world.gop.fence(); + KY.Y[b] = newK(y, phi0, phi0_c); + world.gop.fence(); + } + auto K = KX + KY; + world.gop.fence(); + if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } + molresponse::start_timer(world); + + K = response_exchange(phi0, chi_alpha, true); + if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -634,6 +649,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm X_space W = X_space::zero_functions(world, num_states, num_orbitals); X_space J(world, num_states, num_orbitals); X_space K = X_space::zero_functions(world, num_states, num_orbitals); + X_space KX = X_space::zero_functions(world, num_states, num_orbitals); + X_space KY = X_space::zero_functions(world, num_states, num_orbitals); // std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; // world.mpi.Barrier(); @@ -681,12 +698,25 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K = response_exchange(phi0, xy, false); + std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), + [&](const auto &xi) { return newK(xi, phi0, phi0); }); + + std::transform(xy.X.begin(), xy.X.end(), KY.X.begin(), + [&](const auto &xi) { return newK(phi0, xi, phi0); }); + K = KX + KY; + world.gop.fence(); + if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); + molresponse::end_timer(world, "old K[omega]", "K[omega]", iter_timing); } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + K = response_exchange(phi0, xy, false); + + if (r_params.print_level() >= 20) { print_inner(world, "new xKx", xy, K); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega"); } // for each response state we compute the Gamma response functions // trucate all response functions if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -962,9 +992,7 @@ auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, // EXC0=W[ground_density] auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator &xc, bool compute_Y) const -> X_space { - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // // std::cout << "MPI BARRIER V0X " << std::endl; // // world.mpi.Barrier(); @@ -1029,14 +1057,10 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< world.gop.fence(); int b = 0; - for (auto &k0x: K0.X) { - k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); - } + for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } if (compute_Y) { b = 0; - for (auto &k0x: K0.Y) { - k0x = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); - } + for (auto &k0x: K0.Y) { k0x = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); } } else { K0.Y = K0.X.copy(); @@ -1123,8 +1147,7 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< } auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_space &g_chi, - const std::string &calc_type) - -> residuals { + const std::string &calc_type) -> residuals { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.X.size(); size_t n = chi.X.size_orbitals(); @@ -1160,8 +1183,7 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, response_solver &kain_x_space, - response_matrix &Xvector, - response_matrix &Xresidual) + response_matrix &Xvector, response_matrix &Xresidual) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); @@ -1183,16 +1205,13 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, } */ response_matrix update(m); - for (auto &update_i: update) { - update_i = vector_real_function_3d(n); - } + for (auto &update_i: update) { update_i = vector_real_function_3d(n); } if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } int b = 0; - std::transform(Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), [&](auto &xi, auto &ri) { - return kain_x_space[b++].update(xi, ri); - }); + std::transform(Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), + [&](auto &xi, auto &ri) { return kain_x_space[b++].update(xi, ri); }); /* std::for_each(kain_x_space.begin(), kain_x_space.end(), [&](auto &ki) { @@ -1455,9 +1474,11 @@ void ResponseBase::solve(World &world) { converged_to_json(j_molresponse); if (r_params.plot()) { auto r_matrix = to_response_matrix(Chi); - do_response_orbital_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, ground_orbitals, r_matrix); + do_response_orbital_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, + ground_orbitals, r_matrix); auto response_densities = make_density(world, Chi); - do_response_density_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, ground_density, response_densities); + do_response_density_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, + ground_density, response_densities); } @@ -1661,8 +1682,7 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct print("phi_i !!", phi_i.max_depth(), " ", (void *) phi_i.get_impl().get()); } */ - std::transform(x.begin(), x.end(), y.begin(), densities.begin(), - compute_density); + std::transform(x.begin(), x.end(), y.begin(), densities.begin(), compute_density); world.gop.fence(); //truncate(world, densities, FunctionDefaults<3>::get_thresh(), true); return densities; @@ -1678,8 +1698,7 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct * @return */ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &gammaOrbitals, - const double load_balance) - -> gamma_orbitals { + const double load_balance) -> gamma_orbitals { auto X = std::get<0>(gammaOrbitals); auto psi0 = std::get<1>(gammaOrbitals); @@ -1691,23 +1710,16 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &gamm molresponse::start_timer(world); LoadBalanceDeux<3> lb(world); - for (const auto &phi0_i: psi0) { - lb.add_tree(phi0_i, lbcost(1.0, 8.0), false); - } + for (const auto &phi0_i: psi0) { lb.add_tree(phi0_i, lbcost(1.0, 8.0), false); } for (const auto &xi: X.X) { - for (const auto &xij: xi) { - lb.add_tree(xij, lbcost(1.0, 8.0), false); - } + for (const auto &xij: xi) { lb.add_tree(xij, lbcost(1.0, 8.0), false); } } for (const auto &yi: X.Y) { - for (const auto &yij: yi) { - lb.add_tree(yij, lbcost(1.0, 8.0), false); - } + for (const auto &yij: yi) { lb.add_tree(yij, lbcost(1.0, 8.0), false); } } world.gop.fence(); // newpamap is the new pmap just based on the orbitals - auto new_process_map = - lb.load_balance(load_balance); + auto new_process_map = lb.load_balance(load_balance); // default process map // We set the new_process_map FunctionDefaults<3>::set_pmap(new_process_map);// set default to be new @@ -1770,8 +1782,7 @@ void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, } auto ResponseBase::project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, - const Molecule &mol) - -> vecfuncT { + const Molecule &mol) -> vecfuncT { vecfuncT ao = vecfuncT(aobasis.nbf(mol)); for (int i = 0; i < aobasis.nbf(mol); ++i) { functorT aofunc(new madchem::AtomicBasisFunctor(aobasis.get_atomic_basis_function(mol, i))); @@ -1827,8 +1838,7 @@ void ResponseBase::print_inner(World &world, const std::string &name, const X_sp auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals, - const response_space &x) - -> vector_real_function_3d { + const response_space &x) -> vector_real_function_3d { // Get sizes size_t m = x.size(); @@ -2177,9 +2187,7 @@ void response_timing::to_json(json &j) { j["time_data"]["wall_time"] = json(); - for (const auto &e: wall_time_data) { - j["time_data"]["wall_time"][e.first] = e.second; - } + for (const auto &e: wall_time_data) { j["time_data"]["wall_time"][e.first] = e.second; } j["time_data"]["cpu_time"] = json(); for (const auto &e: cpu_time_data) { j["time_data"]["cpu_time"][e.first] = e.second; } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index ab50ddb20ae..d12e87a00e7 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -7,7 +7,8 @@ #include "response_parameters.h" -static auto set_poisson(World &world, const double lo, const double econv = FunctionDefaults<3>::get_thresh()) { +static auto set_poisson(World &world, const double lo, + const double econv = FunctionDefaults<3>::get_thresh()) { return std::shared_ptr(CoulombOperatorPtr(world, lo, econv)); } @@ -18,15 +19,11 @@ auto initialize_calc_params(World &world, const std::string &input_file) -> Calc parser.set_keyval("input", input_file); r_params.read_input_and_commandline_options(world, parser, "response"); GroundStateCalculation ground_calculation{world, r_params.archive()}; - if (world.rank() == 0) { - ground_calculation.print_params(); - } + if (world.rank() == 0) { ground_calculation.print_params(); } Molecule molecule = ground_calculation.molecule(); r_params.set_ground_state_calculation_data(ground_calculation); r_params.set_derived_values(world, molecule); - if (world.rank() == 0) { - r_params.print(); - } + if (world.rank() == 0) { r_params.print(); } return {ground_calculation, molecule, r_params}; } // TODO some operator definitions that I will need to move to a separate file @@ -85,7 +82,9 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ for (const auto &xi: xx) {// copy the response matrix into a single vector of functions std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { auto vect_xij = copy(world, xij, x.num_orbitals(), true); - std::copy(vect_xij.begin(), vect_xij.end(), x_vector.begin() + b * x.num_orbitals());// copy the xij vector n times into a block + std::copy(vect_xij.begin(), vect_xij.end(), + x_vector.begin() + + b * x.num_orbitals());// copy the xij vector n times into a block b++; }); } @@ -93,58 +92,12 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ vecfuncT phi2(x.num_orbitals() * x.num_orbitals() * n * x.num_states()); int orb_i = 0; // copy ground-state orbitals into a single long vector - std::for_each(phi1.begin(), phi1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); + std::for_each(phi1.begin(), phi1.end(), + [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); phi2 = madness::copy(world, phi1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); - molresponse::start_timer(world); - reconstruct(world, phi1, false); - reconstruct(world, phi2, false); - reconstruct(world, x_vector, false); - world.gop.fence(); - norm_tree(world, phi1, false); - norm_tree(world, phi2, false); - norm_tree(world, x_vector, false); - world.gop.fence(); - const double lo = 1.0e-10; - auto poisson = set_poisson(world, lo); - auto phiX = mul(world, phi1, x_vector, true); - truncate(world, phiX); - phiX = apply(world, *poisson, phiX); - truncate(world, phiX); - auto phi_phiX = mul(world, phi1, phiX, true); - auto exchange_vector = vecfuncT(x.num_states() * n * x.num_orbitals()); - - b = 0; - for (auto &kij: exchange_vector) { - auto phi_phiX_i = vecfuncT(x.num_orbitals()); - std::copy(phi_phiX.begin() + (b * x.num_orbitals()), phi_phiX.begin() + (b * x.num_orbitals()) + x.num_orbitals(), phi_phiX_i.begin()); - world.gop.fence(); - kij = sum(world, phi_phiX_i, true); - b++; - // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) - } - molresponse::end_timer(world, "ground exchange apply"); - molresponse::start_timer(world); - - - auto exchange_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); - b = 0; - for (auto &xi: exchange_matrix) { - for (auto &xij: xi) { - xij = copy(exchange_vector[b++]); - } - } - if (compute_y) { - K0 = to_X_space(exchange_matrix); - } else { - K0.X = exchange_matrix; - K0.Y = K0.X.copy(); - } - - world.gop.fence(); - molresponse::end_timer(world, "ground exchange reorganize"); - return K0; + return molresponse_exchange(world, phi1, phi2, x_vector, n, x.num_states(), x.num_orbitals()); } // compute full response exchange |i> /** @@ -161,10 +114,12 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); - X_space xK1 = X_space(world, x.num_states(), x.num_orbitals()); - X_space xK2 = X_space(world, x.num_states(), x.num_orbitals()); - X_space K = X_space(world, x.num_states(), x.num_orbitals()); - auto num_orbitals = phi0.size(); + auto num_states = x.num_states(); + auto num_orbitals = x.num_orbitals(); + X_space K1 = X_space(world, num_states, num_orbitals); + X_space K2 = X_space(world, num_states, num_orbitals); + X_space K = X_space(world, num_states, num_orbitals); + long n{}; response_matrix xx; response_matrix xx_dagger; @@ -179,72 +134,65 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput xx_dagger = x.X.x; // if not compute y we are only working with the x functions } - vecfuncT x_vector(x.num_states() * n * x.num_orbitals()); + auto n_exchange = n * num_states * num_orbitals * num_orbitals; + vecfuncT x_vector(n_exchange); long ij = 0; - for (const auto &xi: xx) {// copy the response matrix into a single vector of functions - std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - x_vector.at(ij++) = copy(xij); - }); - } + long x_index = 0; + for (const auto &xi: xx) { // num_states + for (const auto &xij: xi) { //num_orbitals*n + for (int z = 0; z < num_orbitals; z++) {//*num_orbitals + x_index = z + num_orbitals * ij; + x_vector.at(x_index) = copy(xij, false); + } + world.gop.fence(); + ij++; + } + }; ij = 0; - vecfuncT x_dagger_vector(x.num_states() * n * x.num_orbitals()); + x_index = 0; + vecfuncT x_vector_conjugate(n_exchange); for (const auto &xdi: xx_dagger) {// copy the response matrix into a single vector of functions - std::for_each(xdi.begin(), xdi.end(), [&](const auto &xdij) { - x_dagger_vector.at(ij++) = copy(xdij); - }); + for (const auto &xdij: xdi) { + for (int z = 0; z < num_orbitals; z++) { + x_index = z + num_orbitals * ij; + x_vector_conjugate.at(x_index) = copy(xdij, false); + } + world.gop.fence(); + ij++; + } } - vecfuncT phi_vector(x.num_states() * n * phi0.size()); - int orb_i = 0; + vecfuncT phi_right(n_exchange); // copy ground-state orbitals into a single long vector - std::for_each(phi_vector.begin(), phi_vector.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); - world.gop.fence(); - auto phi_copy1 = madness::copy(world, phi_vector, true); - auto phi_copy2 = madness::copy(world, phi_vector, true); - molresponse::end_timer(world, "response exchange copy"); - molresponse::start_timer(world); - // We have 2 versions of exchange k(x,phi) phi and k(phi,x) phi - // K1.X = k[x ,phi] phi , K2.X = k[phi,y] phi // if static we only compute the top line - // K1.Y = k[y',phi] phi , K2.Y = k[phi,x] phi - // K=K1+K2 - - auto K1_vect = newK(x_vector, phi_copy1, phi_vector); - world.gop.fence(); - auto K2_vect = newK(phi_copy2, x_dagger_vector, phi_vector); - world.gop.fence(); - molresponse::end_timer(world, "response exchange apply"); - molresponse::start_timer(world); - auto K1_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); - auto K2_matrix = create_response_matrix(x.num_states(), n * x.num_orbitals()); - long b = 0; - for (auto &k1i: K1_matrix) { - for (auto &k1ij: k1i) { - k1ij = copy(K1_vect[b++]); + long ii = 0; + long z_index = 0; + long bshift = 0; + auto orb_shift = 0; + std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { + orb_shift = n * num_orbitals * ii; + for (long b = 0; b < num_states; b++) { + bshift = b * n * num_orbitals*num_orbitals; + for (long z = 0; z < n * num_orbitals; z++) { + z_index = bshift + orb_shift + z; + phi_right.at(z_index) = copy(phi_i); + } } - } + ii++; + world.gop.fence(); + }); world.gop.fence(); - b = 0; - for (auto &k2i: K2_matrix) { - for (auto &k2ij: k2i) { - k2ij = copy(K2_vect[b++]); - } - } + vecfuncT phi_left(n_exchange); + long orb_i = 0; + for (auto &phi_i: phi_left) { phi_i = copy(phi0[orb_i++ % num_orbitals]); } world.gop.fence(); - if (compute_y) { - xK1 = to_X_space(K1_matrix); - xK2 = to_X_space(K2_matrix); - world.gop.fence(); - K = xK1 + xK2; - } else { - xK1.X = K1_matrix; - xK2.X = K2_matrix; - world.gop.fence(); - K.X = xK1.X + xK2.X; - K.Y = K.X.copy(); - } - + molresponse::end_timer(world, "response exchange copy"); + molresponse::start_timer(world); + K1 = molresponse_exchange(world, x_vector, phi_left, phi_right, n, num_states, num_orbitals); + K2 = molresponse_exchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, + num_orbitals); + K = K1 + K2; world.gop.fence(); - molresponse::end_timer(world, "response exchange reorganize"); + molresponse::end_timer(world, "response exchange K1+K2 "); return K; } // compute exchange |i> @@ -259,3 +207,53 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu return vk; } // sum_i |i> for each p +auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, const vecfuncT &v3, + const int &n, const int &num_states, const int &num_orbitals) -> X_space { + molresponse::start_timer(world); + + reconstruct(world, v1, false); + reconstruct(world, v2, false); + reconstruct(world, v3, false); + world.gop.fence(); + norm_tree(world, v1, false); + norm_tree(world, v2, false); + norm_tree(world, v3, false); + world.gop.fence(); + const double lo = 1.0e-10; + auto poisson = set_poisson(world, lo); + auto v23 = mul(world, v2, v3, true); + truncate(world, v23); + v23 = apply(world, *poisson, v23); + truncate(world, v23); + auto v123 = mul(world, v1, v23, true); + const long n_exchange{num_states * n * num_orbitals}; + auto exchange_vector = vecfuncT(n_exchange); + + long b = 0; + for (auto &kij: exchange_vector) { + auto phi_phiX_i = vecfuncT(num_orbitals); + std::copy(v123.begin() + (b * num_orbitals), + v123.begin() + (b * num_orbitals) + num_orbitals, phi_phiX_i.begin()); + world.gop.fence(); + kij = sum(world, phi_phiX_i, true); + b++; + // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) + } + molresponse::end_timer(world, "ground exchange apply"); + molresponse::start_timer(world); + auto exchange_matrix = create_response_matrix(num_states, n * num_orbitals); + b = 0; + for (auto &xi: exchange_matrix) { + for (auto &xij: xi) { xij = copy(exchange_vector[b++]); } + } + X_space K0 = X_space::zero_functions(world, num_states, num_orbitals); + if (n == 2) { + K0 = to_X_space(exchange_matrix); + } else { + K0.X = exchange_matrix; + } + world.gop.fence(); + molresponse::end_timer(world, "ground exchange reorganize"); + return K0; +} +// sum_i |i> for each p diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 6733dc52c68..87fbbf3ffcd 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -44,10 +44,19 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); -auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space; -auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space; +auto ground_exchange(const vecfuncT &phi0, const X_space &x, + const bool compute_y) -> X_space; +auto response_exchange(const vecfuncT &phi0, const X_space &x, + const bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); -static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } +// compute exchange |i> +auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, + const vecfuncT &v3, const int &n, + const int &num_states, const int &num_orbitals) + -> X_space; +static double rsquared(const coord_3d &r) { + return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; +} /// Mask function to switch from 0 to 1 smoothly at boundary #endif// SRC_APPS_molresponse_GLOBAL_FUNCTIONS_H_ diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 8973ff72e26..8c406b37f02 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -17,7 +17,8 @@ namespace madness { struct X_space; auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d; - auto create_response_matrix(const size_t &num_state, const size_t &num_orbitals) -> response_matrix; + auto create_response_matrix(const size_t &num_state, const size_t &num_orbitals) + -> response_matrix; auto to_response_matrix(const X_space &x) -> response_matrix; auto to_conjugate_response_matrix(const X_space &x) -> response_matrix; auto to_flattened_vector(const X_space &x) -> vector_real_function_3d; @@ -38,15 +39,13 @@ namespace madness { X_space() : n_states(0), n_orbitals(0), X(), Y() {} // Copy constructor X_space(const X_space &A) - : n_states(size_states(A)), - n_orbitals(size_orbitals(A)), - X(A.X), - Y(A.Y) {} + : n_states(size_states(A)), n_orbitals(size_orbitals(A)), X(A.X), Y(A.Y) {} X_space copy() const { auto &world = X[0][0].world(); auto m = to_response_matrix(*this); auto copy_m = create_response_matrix(num_states(), num_orbitals()); - std::transform(m.begin(), m.end(), copy_m.begin(), [&](const auto &mi) { return madness::copy(world, mi, true); }); + std::transform(m.begin(), m.end(), copy_m.begin(), + [&](const auto &mi) { return madness::copy(world, mi, true); }); return to_X_space(copy_m); } /// Create a new copy of the function with different distribution and optional @@ -60,7 +59,8 @@ namespace madness { auto &world = X[0][0].world(); auto m = to_response_matrix(*this); auto copy_m = create_response_matrix(num_states(), num_orbitals()); - std::transform(m.begin(), m.end(), copy_m.begin(), [&](const auto &mi) { return madness::copy(world, mi, pmap, true); }); + std::transform(m.begin(), m.end(), copy_m.begin(), + [&](const auto &mi) { return madness::copy(world, mi, pmap, true); }); return to_X_space(copy_m); } // assignment @@ -76,9 +76,7 @@ namespace madness { } // Zero Constructor X_space(World &world, size_t n_states, size_t n_orbitals) - : n_states(n_states), - n_orbitals(n_orbitals), - X(world, n_states, n_orbitals), + : n_states(n_states), n_orbitals(n_orbitals), X(world, n_states, n_orbitals), Y(world, n_states, n_orbitals) {} // explicit constructor from 2 resonse_space explicit X_space(response_space &X, response_space &Y) { @@ -357,8 +355,7 @@ namespace madness { World &world; const size_t n_orbtials; response_matrix_allocator(World &world, size_t n_orbtials) - : world(world), - n_orbtials(n_orbtials) {} + : world(world), n_orbtials(n_orbtials) {} // overloading the default constructor () operator vector_real_function_3d operator()() { //print("allocator called with ", int(n_orbtials), " orbitals"); From 31fa2507ccae0dfc337d2f2571b0592eb778c589 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 15 Nov 2022 17:50:33 -0500 Subject: [PATCH 0750/1312] truncate after gaxpy --- src/apps/molresponse/global_functions.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index d12e87a00e7..3edb553f1cc 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -170,7 +170,7 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { orb_shift = n * num_orbitals * ii; for (long b = 0; b < num_states; b++) { - bshift = b * n * num_orbitals*num_orbitals; + bshift = b * n * num_orbitals * num_orbitals; for (long z = 0; z < n * num_orbitals; z++) { z_index = bshift + orb_shift + z; phi_right.at(z_index) = copy(phi_i); @@ -239,6 +239,7 @@ auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } + truncate(world, exchange_vector); molresponse::end_timer(world, "ground exchange apply"); molresponse::start_timer(world); auto exchange_matrix = create_response_matrix(num_states, n * num_orbitals); From cd5db86eaf0c75257c083f84000f0e0e6d380f3d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 16 Nov 2022 14:31:17 -0500 Subject: [PATCH 0751/1312] full exchange debugg --- src/apps/molresponse/ResponseBase.cpp | 11 ++- src/apps/molresponse/global_functions.cc | 109 ++++++++++++++--------- 2 files changed, 75 insertions(+), 45 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d55cbd415ef..c049f6721f2 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -535,6 +535,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } auto K = KX + KY; world.gop.fence(); + if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", chi_alpha, KX); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, KY); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -701,11 +703,16 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), [&](const auto &xi) { return newK(xi, phi0, phi0); }); - std::transform(xy.X.begin(), xy.X.end(), KY.X.begin(), - [&](const auto &xi) { return newK(phi0, xi, phi0); }); + std::transform(xy.Y.begin(), xy.Y.end(), KY.X.begin(), + [&](const auto &yi) { return newK(phi0, yi, phi0); }); + + + K = KX + KY; world.gop.fence(); if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", xy, KX); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", xy, KY); } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 3edb553f1cc..1ac35e290ce 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -135,61 +135,84 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput // if not compute y we are only working with the x functions } auto n_exchange = n * num_states * num_orbitals * num_orbitals; - vecfuncT x_vector(n_exchange); - long ij = 0; - long x_index = 0; - for (const auto &xi: xx) { // num_states - for (const auto &xij: xi) { //num_orbitals*n - for (int z = 0; z < num_orbitals; z++) {//*num_orbitals - x_index = z + num_orbitals * ij; - x_vector.at(x_index) = copy(xij, false); + vecfuncT phi_right(n_exchange); + long b_index = 0; + long p_index = 0; + long p = 0; + for (long b = 0; b < num_states; b++) { + b_index = b * num_orbitals * num_orbitals * n; + p = 0; + std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_p) { + p_index = p * num_orbitals * n; + for (long j = 0; j < n * num_orbitals; j++) { + phi_right.at(b_index + p_index + j) = copy(phi_p, false); } - world.gop.fence(); - ij++; + p++; + }); + } + + vecfuncT x_vector(n_exchange); + long b = 0; + for (const auto &xb: xx) {// for each state copy the vector n times + b_index = b * num_orbitals * num_orbitals * n; + for (long pi = 0; pi < num_orbitals; pi++) { + p_index = pi * num_orbitals * n; + std::transform(xb.begin(), xb.end(), x_vector.begin() + b_index + p_index, + [&](const auto &xbi) { return copy(xbi); }); } - }; - ij = 0; - x_index = 0; + b++; + } + b = 0; vecfuncT x_vector_conjugate(n_exchange); - for (const auto &xdi: xx_dagger) {// copy the response matrix into a single vector of functions - for (const auto &xdij: xdi) { - for (int z = 0; z < num_orbitals; z++) { - x_index = z + num_orbitals * ij; - x_vector_conjugate.at(x_index) = copy(xdij, false); - } - world.gop.fence(); - ij++; + for (const auto &xdbi: xx_dagger) {// for each state copy the vector n times + b_index = b * num_orbitals * num_orbitals * n; + for (long p = 0; p < num_orbitals; p++) { + p_index = p * num_orbitals * n; + std::transform(xdbi.begin(), xdbi.end(), x_vector_conjugate.begin() + b_index + p_index, + [&](const auto &xbi) { return copy(xbi, false); }); } + b++; } - vecfuncT phi_right(n_exchange); - // copy ground-state orbitals into a single long vector - long ii = 0; - long z_index = 0; - long bshift = 0; - auto orb_shift = 0; - std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_i) { - orb_shift = n * num_orbitals * ii; - for (long b = 0; b < num_states; b++) { - bshift = b * n * num_orbitals * num_orbitals; - for (long z = 0; z < n * num_orbitals; z++) { - z_index = bshift + orb_shift + z; - phi_right.at(z_index) = copy(phi_i); + vecfuncT phi_left=zero_functions(world,n_exchange); + for (long b = 0; b < num_states; b++) { + b_index = b * num_orbitals * num_orbitals * n; + for (long p = 0; p < n * num_orbitals; p++) { + p_index = p * num_orbitals; + for (int i = 0; i < num_orbitals; i++) { + phi_left[b_index + p_index + i] = copy(phi0[i], false); } } - ii++; - world.gop.fence(); - }); + } + world.gop.fence(); - vecfuncT phi_left(n_exchange); - long orb_i = 0; - for (auto &phi_i: phi_left) { phi_i = copy(phi0[orb_i++ % num_orbitals]); } + auto norm_left = norm2s_T(world, phi_left); + auto norm_right = norm2s_T(world, phi_right); + auto norm_x = norm2s_T(world, x_vector); + auto norm_xd = norm2s_T(world, x_vector_conjugate); + world.gop.fence(); + + if (world.rank() == 0) { + + print("left", norm_left); + print("right", norm_right); + print("x", norm_x); + print("xd", norm_xd); + } + + world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); K1 = molresponse_exchange(world, x_vector, phi_left, phi_right, n, num_states, num_orbitals); + world.gop.fence(); + auto xk1 = inner(x, K1); + if (world.rank() == 0) { print("new xk1", xk1); } K2 = molresponse_exchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, num_orbitals); + auto xk2 = inner(x, K2); + if (world.rank() == 0) { print("new xk2", xk2); } + world.gop.fence(); K = K1 + K2; world.gop.fence(); molresponse::end_timer(world, "response exchange K1+K2 "); @@ -231,9 +254,9 @@ auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, long b = 0; for (auto &kij: exchange_vector) { - auto phi_phiX_i = vecfuncT(num_orbitals); - std::copy(v123.begin() + (b * num_orbitals), - v123.begin() + (b * num_orbitals) + num_orbitals, phi_phiX_i.begin()); + auto phi_phiX_i = vecfuncT(num_orbitals * n); + std::copy(v123.begin() + (b * num_orbitals * n), + v123.begin() + (b * num_orbitals) + num_orbitals * n, phi_phiX_i.begin()); world.gop.fence(); kij = sum(world, phi_phiX_i, true); b++; From 1b13a5a7a6c90342a8396942bb43155266ec9231 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 16 Nov 2022 18:43:12 -0500 Subject: [PATCH 0752/1312] Exchange Response --- src/apps/molresponse/ResponseBase.cpp | 49 ++----- src/apps/molresponse/global_functions.cc | 157 ++++++++++++----------- src/apps/molresponse/global_functions.h | 4 +- 3 files changed, 97 insertions(+), 113 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c049f6721f2..fddaee74789 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -516,27 +516,26 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space KX = X_space::zero_functions(world, num_states, num_orbitals); - X_space KY = X_space::zero_functions(world, num_states, num_orbitals); + X_space K1 = X_space::zero_functions(world, num_states, num_orbitals); + X_space K2 = X_space::zero_functions(world, num_states, num_orbitals); auto phi0_c = madness::copy(world, phi0); vecfuncT x, y; for (size_t b = 0; b < num_states; b++) { x = chi_alpha.X[b]; y = chi_alpha.Y[b]; - - KY.X[b] = newK(phi0, y, phi0_c); + K1.X[b] = newK(x, phi0, phi0_c); world.gop.fence(); - KX.Y[b] = newK(phi0, x, phi0_c); + K1.Y[b] = newK(y, phi0, phi0_c); world.gop.fence(); - KX.X[b] = newK(x, phi0, phi0_c); + K2.X[b] = newK(phi0, y, phi0_c); world.gop.fence(); - KY.Y[b] = newK(y, phi0, phi0_c); + K2.Y[b] = newK(phi0, x, phi0_c); world.gop.fence(); } - auto K = KX + KY; + auto K = K1 + K2; world.gop.fence(); - if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", chi_alpha, KX); } - if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, KY); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", chi_alpha, K1); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, K2); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -544,7 +543,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::start_timer(world); K = response_exchange(phi0, chi_alpha, true); - if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K); } + if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K1); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -615,27 +614,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); - /* - for (const auto &xi: xy.X) { - for (const auto &xij: xi) { - - print("xij", xij.max_depth(), " ", (void *) xij.get_impl().get()); - } - } - for (const auto &yi: xy.Y) { - for (const auto &yij: yi) { - print("yij", yij.max_depth(), " ", (void *) yij.get_impl().get()); - } - } - - for (const auto &pi: phi0) { - print("orbitals", pi.max_depth(), " ", (void *) pi.get_impl().get()); - } - */ - - // std::cout << "MPI After Load Balancing " << std::endl; - // world.mpi.Barrier(); - size_t num_states = xy.num_states(); size_t num_orbitals = xy.num_orbitals(); // shallow copy @@ -707,21 +685,18 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm [&](const auto &yi) { return newK(phi0, yi, phi0); }); - K = KX + KY; world.gop.fence(); - if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } + if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", xy, KX); } if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", xy, KY); } - + if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "old K[omega]", "K[omega]", iter_timing); } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange(phi0, xy, false); - if (r_params.print_level() >= 20) { print_inner(world, "new xKx", xy, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega"); } // for each response state we compute the Gamma response functions diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 1ac35e290ce..8a5944f70f8 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -60,6 +60,8 @@ auto T(World &world, response_space &f) -> response_space { auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_y) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); + auto num_states = x.num_states(); + auto num_orbitals = x.num_orbitals(); X_space K0 = X_space(world, x.num_states(), x.num_orbitals()); long n{}; response_matrix xx; @@ -73,31 +75,34 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ xx = x.X.x; // if not compute y we are only working with the x functions } + auto n_exchange = n * num_states * num_orbitals * num_orbitals; // should have num_states * num_orbitals * n if compute y n=2 else n=1 - vecfuncT x_vector(x.num_states() * n * x.num_orbitals() * x.num_orbitals()); - long ij = 0; - - - size_t b = 0; - for (const auto &xi: xx) {// copy the response matrix into a single vector of functions - std::for_each(xi.begin(), xi.end(), [&](const auto &xij) { - auto vect_xij = copy(world, xij, x.num_orbitals(), true); - std::copy(vect_xij.begin(), vect_xij.end(), - x_vector.begin() + - b * x.num_orbitals());// copy the xij vector n times into a block - b++; + vecfuncT x_vector(n_exchange); + long b_index = 0; + long p_index = 0; + long p = 0; + for (long b = 0; b < num_states; b++) { + b_index = b * num_orbitals * num_orbitals * n; + p = 0; + std::for_each(xx[b].begin(), xx[b].end(), [&](const auto &xb_p) { + p_index = p * num_orbitals; + for (long j = 0; j < num_orbitals; j++) { + x_vector.at(b_index + p_index + j) = copy(xb_p, false); + } + p++; }); } - vecfuncT phi1(x.num_orbitals() * x.num_orbitals() * n * x.num_states()); - vecfuncT phi2(x.num_orbitals() * x.num_orbitals() * n * x.num_states()); + vecfuncT phi1(n_exchange); + vecfuncT phi2(n_exchange); int orb_i = 0; // copy ground-state orbitals into a single long vector std::for_each(phi1.begin(), phi1.end(), - [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % x.num_orbitals()]); }); + [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); + world.gop.fence(); phi2 = madness::copy(world, phi1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); - return molresponse_exchange(world, phi1, phi2, x_vector, n, x.num_states(), x.num_orbitals()); + return molresponse_exchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); } // compute full response exchange |i> /** @@ -120,60 +125,63 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput X_space K2 = X_space(world, num_states, num_orbitals); X_space K = X_space(world, num_states, num_orbitals); - long n{}; - response_matrix xx; - response_matrix xx_dagger; - if (compute_y) { - n = 2; - xx = to_response_matrix(x); - xx_dagger = to_conjugate_response_matrix(x); - // place all x - } else { - n = 1; - xx = x.X.x; - xx_dagger = x.X.x; - // if not compute y we are only working with the x functions - } + long n = compute_y ? 2 : 1; auto n_exchange = n * num_states * num_orbitals * num_orbitals; vecfuncT phi_right(n_exchange); long b_index = 0; long p_index = 0; long p = 0; + // 111 222 333 111 222 333 111 222 333 111 222 333 for (long b = 0; b < num_states; b++) { - b_index = b * num_orbitals * num_orbitals * n; + b_index = n * b * num_orbitals * num_orbitals; p = 0; std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_p) { - p_index = p * num_orbitals * n; - for (long j = 0; j < n * num_orbitals; j++) { + p_index = num_orbitals * p; + for (long j = 0; j < num_orbitals; j++) { phi_right.at(b_index + p_index + j) = copy(phi_p, false); } p++; }); + if (compute_y) { + p = 0; + std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_p) { + p_index = num_orbitals * p; + for (long j = 0; j < num_orbitals; j++) { + phi_right.at(num_orbitals*num_orbitals + b_index + p_index + j) = copy(phi_p, false); + } + p++; + }); + } } vecfuncT x_vector(n_exchange); - long b = 0; - for (const auto &xb: xx) {// for each state copy the vector n times - b_index = b * num_orbitals * num_orbitals * n; - for (long pi = 0; pi < num_orbitals; pi++) { - p_index = pi * num_orbitals * n; - std::transform(xb.begin(), xb.end(), x_vector.begin() + b_index + p_index, - [&](const auto &xbi) { return copy(xbi); }); - } - b++; - } - b = 0; vecfuncT x_vector_conjugate(n_exchange); - for (const auto &xdbi: xx_dagger) {// for each state copy the vector n times + for (long b = 0; b < num_states; b++) {// for each state copy the vector n times b_index = b * num_orbitals * num_orbitals * n; - for (long p = 0; p < num_orbitals; p++) { - p_index = p * num_orbitals * n; - std::transform(xdbi.begin(), xdbi.end(), x_vector_conjugate.begin() + b_index + p_index, + for (long j = 0; j < num_orbitals; j++) { + p_index = j * num_orbitals; + std::transform(x.X[b].begin(), x.X[b].end(), x_vector.begin() + b_index + p_index, + [&](const auto &xbi) { return copy(xbi, false); }); + + std::transform(x.Y[b].begin(), x.Y[b].end(), + x_vector_conjugate.begin() + b_index + p_index, [&](const auto &xbi) { return copy(xbi, false); }); } - b++; + if (compute_y) { + long y_shift = num_orbitals * num_orbitals; + for (long j = 0; j < num_orbitals; j++) { + p_index = j * num_orbitals; + std::transform(x.Y[b].begin(), x.Y[b].end(), + x_vector.begin() + b_index + p_index + y_shift, + [&](const auto &ybi) { return copy(ybi, false); }); + std::transform(x.X[b].begin(), x.X[b].end(), + x_vector_conjugate.begin() + b_index + p_index + y_shift, + [&](const auto &ybi) { return copy(ybi, false); }); + } + } } - vecfuncT phi_left=zero_functions(world,n_exchange); + + vecfuncT phi_left(n_exchange); for (long b = 0; b < num_states; b++) { b_index = b * num_orbitals * num_orbitals * n; for (long p = 0; p < n * num_orbitals; p++) { @@ -192,27 +200,24 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput world.gop.fence(); if (world.rank() == 0) { - print("left", norm_left); print("right", norm_right); print("x", norm_x); print("xd", norm_xd); } - - world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); K1 = molresponse_exchange(world, x_vector, phi_left, phi_right, n, num_states, num_orbitals); world.gop.fence(); - auto xk1 = inner(x, K1); - if (world.rank() == 0) { print("new xk1", xk1); } K2 = molresponse_exchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, num_orbitals); - auto xk2 = inner(x, K2); - if (world.rank() == 0) { print("new xk2", xk2); } world.gop.fence(); + auto xk1 = inner(x, K1); + if (world.rank() == 0) { print("new xk1\n", xk1); } + auto xk2 = inner(x, K2); + if (world.rank() == 0) { print("new xk2\n", xk2); } K = K1 + K2; world.gop.fence(); molresponse::end_timer(world, "response exchange K1+K2 "); @@ -230,33 +235,37 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu return vk; } // sum_i |i> for each p -auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, const vecfuncT &v3, - const int &n, const int &num_states, const int &num_orbitals) -> X_space { +auto molresponse_exchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, + const vecfuncT &fp, const int &n, const int &num_states, + const int &num_orbitals) -> X_space { molresponse::start_timer(world); - - reconstruct(world, v1, false); - reconstruct(world, v2, false); - reconstruct(world, v3, false); + reconstruct(world, ket_i, false); + reconstruct(world, bra_i, false); + reconstruct(world, fp, false); world.gop.fence(); - norm_tree(world, v1, false); - norm_tree(world, v2, false); - norm_tree(world, v3, false); + norm_tree(world, ket_i, false); + norm_tree(world, bra_i, false); + norm_tree(world, fp, false); world.gop.fence(); const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); - auto v23 = mul(world, v2, v3, true); - truncate(world, v23); + auto v23 = mul(world, bra_i, fp, true); + + truncate(world, v23, 0.0, true); v23 = apply(world, *poisson, v23); - truncate(world, v23); - auto v123 = mul(world, v1, v23, true); + world.gop.fence(); + truncate(world, v23, 0.0, true); + auto v123 = mul(world, ket_i, v23, true); + world.gop.fence(); const long n_exchange{num_states * n * num_orbitals}; auto exchange_vector = vecfuncT(n_exchange); - long b = 0; + long b_shift = 0; for (auto &kij: exchange_vector) { - auto phi_phiX_i = vecfuncT(num_orbitals * n); - std::copy(v123.begin() + (b * num_orbitals * n), - v123.begin() + (b * num_orbitals) + num_orbitals * n, phi_phiX_i.begin()); + b_shift = b * num_orbitals; + auto phi_phiX_i = vecfuncT(num_orbitals); + std::copy(v123.begin() + b_shift, v123.begin() + b_shift + num_orbitals, + phi_phiX_i.begin()); world.gop.fence(); kij = sum(world, phi_phiX_i, true); b++; diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 87fbbf3ffcd..4e87c230650 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -51,8 +51,8 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> -auto molresponse_exchange(World &world, const vecfuncT &v1, const vecfuncT &v2, - const vecfuncT &v3, const int &n, +auto molresponse_exchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, + const vecfuncT &fp, const int &n, const int &num_states, const int &num_orbitals) -> X_space; static double rsquared(const coord_3d &r) { From e90af695d89c010088102e08e3476e39f722087a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 09:15:45 -0500 Subject: [PATCH 0753/1312] remove norm printing --- src/apps/molresponse/global_functions.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8a5944f70f8..b543d4d10e1 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -191,8 +191,8 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput } } } - world.gop.fence(); + /* auto norm_left = norm2s_T(world, phi_left); auto norm_right = norm2s_T(world, phi_right); auto norm_x = norm2s_T(world, x_vector); @@ -205,6 +205,7 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput print("x", norm_x); print("xd", norm_xd); } + */ world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); From c8b3d32193b43336878a9aee99e4c208f2515b60 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 13:52:35 -0500 Subject: [PATCH 0754/1312] remove old exchange --- src/apps/molresponse/ResponseBase.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index fddaee74789..e4328e6fa9f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -516,6 +516,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + /* X_space K1 = X_space::zero_functions(world, num_states, num_orbitals); X_space K2 = X_space::zero_functions(world, num_states, num_orbitals); auto phi0_c = madness::copy(world, phi0); @@ -537,19 +538,22 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", chi_alpha, K1); } if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, K2); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } + */ + auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } molresponse::start_timer(world); - K = response_exchange(phi0, chi_alpha, true); - if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K1); } + /* + if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + */ X_space gamma(world, num_states, num_orbitals); - gamma = (2 * J) - (K * xcf.hf_exchange_coefficient()) + W; + gamma = (2 * J) - K * xcf.hf_exchange_coefficient() + W; //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); @@ -676,6 +680,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } } + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), @@ -691,14 +696,16 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", xy, KX); } if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", xy, KY); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "old K[omega]", "K[omega]", iter_timing); } + */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange(phi0, xy, false); if (r_params.print_level() >= 20) { print_inner(world, "new xKx", xy, K); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega"); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); + } // for each response state we compute the Gamma response functions // trucate all response functions if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -710,7 +717,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ // update gamma functions - gamma = (2 * J) - (K * xcf.hf_exchange_coefficient()) + W; + gamma = 2 * J - K * xcf.hf_exchange_coefficient() + W; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } From 6d2763e21e90dc57920dc0c2ebed26760731548e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 14:56:38 -0500 Subject: [PATCH 0755/1312] debugging --- src/apps/molresponse/ResponseBase.cpp | 1 + src/apps/molresponse/ResponseBase.hpp | 2 +- src/apps/molresponse/global_functions.cc | 22 +++------ src/apps/molresponse/x_space.cc | 57 ++++++++---------------- src/apps/molresponse/x_space.h | 3 +- 5 files changed, 28 insertions(+), 57 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index e4328e6fa9f..657f965c611 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -21,6 +21,7 @@ #endif #endif #endif + // Initializes calculation object for both excited state and frequency dependent // Copies both the response and ground state /// Constructs the Base Response diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 8ebaa1a0ac5..d53ce8d2667 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -11,7 +11,7 @@ #include #include -#include "global_functions.h" +#include #include "madness/mra/functypedefs.h" #include "madness/mra/mra.h" #include diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index b543d4d10e1..8a8a2f80856 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -147,7 +147,8 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput std::for_each(phi0.begin(), phi0.end(), [&](const auto &phi_p) { p_index = num_orbitals * p; for (long j = 0; j < num_orbitals; j++) { - phi_right.at(num_orbitals*num_orbitals + b_index + p_index + j) = copy(phi_p, false); + phi_right.at(num_orbitals * num_orbitals + b_index + p_index + j) = + copy(phi_p, false); } p++; }); @@ -192,21 +193,6 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput } } world.gop.fence(); - /* - auto norm_left = norm2s_T(world, phi_left); - auto norm_right = norm2s_T(world, phi_right); - auto norm_x = norm2s_T(world, x_vector); - auto norm_xd = norm2s_T(world, x_vector_conjugate); - world.gop.fence(); - - if (world.rank() == 0) { - print("left", norm_left); - print("right", norm_right); - print("x", norm_x); - print("xd", norm_xd); - } - */ - world.gop.fence(); molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); @@ -215,10 +201,12 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput K2 = molresponse_exchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, num_orbitals); world.gop.fence(); + /* auto xk1 = inner(x, K1); if (world.rank() == 0) { print("new xk1\n", xk1); } auto xk2 = inner(x, K2); if (world.rank() == 0) { print("new xk2\n", xk2); } + */ K = K1 + K2; world.gop.fence(); molresponse::end_timer(world, "response exchange K1+K2 "); @@ -273,7 +261,9 @@ auto molresponse_exchange(World &world, const vecfuncT &ket_i, const vecfuncT &b // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } truncate(world, exchange_vector); + world.gop.fence(); molresponse::end_timer(world, "ground exchange apply"); + molresponse::start_timer(world); auto exchange_matrix = create_response_matrix(num_states, n * num_orbitals); b = 0; diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index af39ff02b67..140ddb4d0c9 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -11,13 +11,17 @@ namespace madness { // copy the vector auto response_vector = copy(world, vec); // copy the vector - std::for_each(vec.begin(), vec.end(), [&](const auto &phi0_i) { response_vector.push_back(madness::copy(phi0_i)); }); + std::for_each(vec.begin(), vec.end(), [&](const auto &phi0_i) { + response_vector.push_back(madness::copy(phi0_i)); + }); return response_vector; } - auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) -> response_matrix { + auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) + -> response_matrix { auto matrix = response_matrix(num_states); - std::for_each(matrix.begin(), matrix.end(), [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); + std::for_each(matrix.begin(), matrix.end(), + [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); return matrix; } auto to_response_matrix(const X_space &x) -> response_matrix { @@ -71,9 +75,8 @@ namespace madness { int b = 0; for (const auto &mi: mx) { std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); - std::for_each(mi.begin(), mi.end(), [&](const auto &mix) { - vij[b * num_orbitals] = copy(mix); - }); + std::for_each(mi.begin(), mi.end(), + [&](const auto &mix) { vij[b * num_orbitals] = copy(mix); }); b++; } return vij; @@ -86,22 +89,19 @@ namespace madness { auto num_states = x.size(); auto num_orbitals = size_t(x[0].size() / 2); auto x_space = X_space(world, num_states, num_orbitals); - int b = 0; - std::for_each(x.begin(), x.end(), [&](auto x_vec) { - //auto norm_vi = norm2(world, x_vec); + for (const auto &x_vec: x) { //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } - std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin()); - std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin()); + std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin(), + [&](const auto &xi) { return copy(xi, false); }); + std::transform(x_vec.begin() + num_orbitals, x_vec.end() + num_orbitals, + x_space.Y[b].begin(), [&](const auto &xi) { return copy(xi, false); }); b++; - }); - - // auto norms = x_space.norm2s(); - // if (world.rank() == 0) { print("norms after copy ", norms); } - - + }; return x_space; } + + auto to_conjugate_X_space(const response_matrix &x) -> X_space { World &world = x[0][0].world(); @@ -144,8 +144,6 @@ namespace madness { MADNESS_ASSERT(size_orbitals(A) > 0); MADNESS_ASSERT(same_size(A, B)); - long size = static_cast(A.n_states); - auto a = to_response_matrix(A); auto b = to_response_matrix(B); @@ -165,26 +163,7 @@ namespace madness { std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) { result += matrix_inner(world, ati, b_transpose[p++]); }); - - /* - * TODO Figure out why this won't work - std::inner_product( - a_transpose.begin(), a_transpose.end(), b_transpose.begin(), result, - [](Tensor a, const Tensor& b) { - print("a", a); - print("b", b); - auto ab = a + b; - print("a + b = ", ab); - return ab; - }, - [&](const auto& ai, const auto& bi) { - auto m = matrix_inner(world, ai, bi); - print("m: ", m); - return m; - }); - */ - - //print("results: ", result); + world.gop.fence(); return result; } }// namespace madness diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 8c406b37f02..b8d9fbd1909 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -103,7 +103,8 @@ namespace madness { response_matrix add_x(num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const auto &a, const auto &b) { return add(world, a, b); }); + [&](const auto &a, const auto &b) { return add(world, a, b, false); }); + world.gop.fence(); return to_X_space(add_x); } From a7be6be127635241827a0cf9e942438a0e79f366 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 14:58:40 -0500 Subject: [PATCH 0756/1312] remove const qualification from function declarations --- src/apps/molresponse/ResponseBase.cpp | 4 +--- src/apps/molresponse/global_functions.h | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 657f965c611..30813dcffe2 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -514,9 +514,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* X_space K1 = X_space::zero_functions(world, num_states, num_orbitals); X_space K2 = X_space::zero_functions(world, num_states, num_orbitals); @@ -540,6 +537,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, K2); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } */ + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 4e87c230650..ae11edc0301 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -45,9 +45,9 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); response_space T(World &world, response_space &f); auto ground_exchange(const vecfuncT &phi0, const X_space &x, - const bool compute_y) -> X_space; + bool compute_y) -> X_space; auto response_exchange(const vecfuncT &phi0, const X_space &x, - const bool compute_y) -> X_space; + bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> From 5d787a72aee089ecaf6204e1d215c5cc640936d3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 15:00:06 -0500 Subject: [PATCH 0757/1312] renaming --- src/apps/molresponse/global_functions.cc | 10 +++++----- src/apps/molresponse/global_functions.h | 17 ++++++----------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8a8a2f80856..90c6b018fd7 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -102,7 +102,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ phi2 = madness::copy(world, phi1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); - return molresponse_exchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); + return molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); } // compute full response exchange |i> /** @@ -196,10 +196,10 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput molresponse::end_timer(world, "response exchange copy"); molresponse::start_timer(world); - K1 = molresponse_exchange(world, x_vector, phi_left, phi_right, n, num_states, num_orbitals); + K1 = molresponseExchange(world, x_vector, phi_left, phi_right, n, num_states, num_orbitals); world.gop.fence(); - K2 = molresponse_exchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, - num_orbitals); + K2 = molresponseExchange(world, phi_left, x_vector_conjugate, phi_right, n, num_states, + num_orbitals); world.gop.fence(); /* auto xk1 = inner(x, K1); @@ -224,7 +224,7 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu return vk; } // sum_i |i> for each p -auto molresponse_exchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, +auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, const vecfuncT &fp, const int &n, const int &num_states, const int &num_orbitals) -> X_space { molresponse::start_timer(world); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index ae11edc0301..4a4727422c5 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -44,19 +44,14 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); -auto ground_exchange(const vecfuncT &phi0, const X_space &x, - bool compute_y) -> X_space; -auto response_exchange(const vecfuncT &phi0, const X_space &x, - bool compute_y) -> X_space; +auto ground_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; +auto response_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); +auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, + const vecfuncT &fp, const int &n, const int &num_states, + const int &num_orbitals) -> X_space; vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> -auto molresponse_exchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, - const vecfuncT &fp, const int &n, - const int &num_states, const int &num_orbitals) - -> X_space; -static double rsquared(const coord_3d &r) { - return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; -} +static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } /// Mask function to switch from 0 to 1 smoothly at boundary #endif// SRC_APPS_molresponse_GLOBAL_FUNCTIONS_H_ From 3678209013ea5419b05b3405160e11f86baca97f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 22:15:38 -0500 Subject: [PATCH 0758/1312] some printing --- src/apps/molresponse/ResponseBase.cpp | 2 ++ src/apps/molresponse/global_functions.cc | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 30813dcffe2..6999a5bc397 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1038,6 +1038,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // Intermediaries world.gop.fence(); + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -1056,6 +1057,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 90c6b018fd7..07aef8438f2 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -225,8 +225,8 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu } // sum_i |i> for each p auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, - const vecfuncT &fp, const int &n, const int &num_states, - const int &num_orbitals) -> X_space { + const vecfuncT &fp, const int &n, const int &num_states, + const int &num_orbitals) -> X_space { molresponse::start_timer(world); reconstruct(world, ket_i, false); reconstruct(world, bra_i, false); @@ -262,7 +262,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br } truncate(world, exchange_vector); world.gop.fence(); - molresponse::end_timer(world, "ground exchange apply"); + molresponse::end_timer(world, "exchange apply"); molresponse::start_timer(world); auto exchange_matrix = create_response_matrix(num_states, n * num_orbitals); From a59da849c2b7b39e9ab86637844dff910ec9ed95 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 22:15:50 -0500 Subject: [PATCH 0759/1312] bug in transform --- src/apps/molresponse/x_space.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 140ddb4d0c9..f5c34de6932 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -94,7 +94,7 @@ namespace madness { //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin(), [&](const auto &xi) { return copy(xi, false); }); - std::transform(x_vec.begin() + num_orbitals, x_vec.end() + num_orbitals, + std::transform(x_vec.begin() + num_orbitals, x_vec.end() , x_space.Y[b].begin(), [&](const auto &xi) { return copy(xi, false); }); b++; }; From 6ff144703d85387279f56c9858058fbfbe83a221 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 22:18:15 -0500 Subject: [PATCH 0760/1312] keep old k0 for comparision --- src/apps/molresponse/ResponseBase.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6999a5bc397..b98b59acb71 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1038,10 +1038,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // Intermediaries world.gop.fence(); - /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - auto phi0_c = copy(world, phi0_copy); world.gop.fence(); @@ -1056,24 +1053,15 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } - - */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]"); } - - if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } - // Vnuc+V0+VXC if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; - - //v0.truncate(FunctionDefaults<3>::get_thresh(), true); - V0.X = v0 * X.X; V0.X += -1 * K0.X * xcf.hf_exchange_coefficient(); - if (compute_Y) { V0.Y = v0 * X.Y; V0.Y += (-1 * K0.Y * xcf.hf_exchange_coefficient()); @@ -1081,17 +1069,10 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< V0.Y = V0.X.copy(); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", Chi_copy, V0); } - - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } - // std::cout << "MPI BARRIER V0X END " << std::endl; - // world.mpi.Barrier(); - // Basic output - - // Done return V0; } From 2a6de1ff07f3e112ea99142cce17efa2d767fc4d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 22:36:48 -0500 Subject: [PATCH 0761/1312] trying to remove std::copy --- src/apps/molresponse/x_space.cc | 34 ++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index f5c34de6932..0c579877b2d 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -32,10 +32,10 @@ namespace madness { std::for_each(mX.begin(), mX.end(), [&](auto &mi) { //auto norm_vi = norm2(world, x_vec); mi = vector_real_function_3d(2 * num_orbitals); - //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } - std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); - world.gop.fence(); - std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals); + std::transform(x.X[b].begin(), x.X[b].end(), mi.begin(), + [&](const auto xbi) { return copy(xbi, false); }); + std::transform(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals, + [&](const auto ybi) { return copy(ybi, false); }); world.gop.fence(); b++; }); @@ -50,10 +50,10 @@ namespace madness { std::for_each(mX.begin(), mX.end(), [&](auto &mi) { //auto norm_vi = norm2(world, x_vec); mi = vector_real_function_3d(2 * num_orbitals); - //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } - std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin()); - world.gop.fence(); - std::copy(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals); + std::transform(x.Y[b].begin(), x.Y[b].end(), mi.begin(), + [&](const auto xbi) { return copy(xbi, false); }); + std::transform(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals, + [&](const auto ybi) { return copy(ybi, false); }); world.gop.fence(); b++; }); @@ -74,9 +74,12 @@ namespace madness { int b = 0; for (const auto &mi: mx) { - std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); + std::transform(mi.begin(), mi.end(), vij.begin() + b * num_orbitals, + [&](const auto mii) { return copy(mii, false); }); + /* std::for_each(mi.begin(), mi.end(), [&](const auto &mix) { vij[b * num_orbitals] = copy(mix); }); + */ b++; } return vij; @@ -94,8 +97,8 @@ namespace madness { //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin(), [&](const auto &xi) { return copy(xi, false); }); - std::transform(x_vec.begin() + num_orbitals, x_vec.end() , - x_space.Y[b].begin(), [&](const auto &xi) { return copy(xi, false); }); + std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin(), + [&](const auto &xi) { return copy(xi, false); }); b++; }; return x_space; @@ -112,12 +115,13 @@ namespace madness { int b = 0; std::for_each(x.begin(), x.end(), [&](auto x_vec) { - //auto norm_vi = norm2(world, x_vec); - //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } - std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.Y[b].begin()); - std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.X[b].begin()); + std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.Y[b].begin(), + [&](const auto &xi) { return copy(xi, false); }); + std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.X[b].begin(), + [&](const auto &xi) { return copy(xi, false); }); b++; }); + world.gop.fence(); // auto norms = x_space.norm2s(); // if (world.rank() == 0) { print("norms after copy ", norms); } From 4eb697466c4efd3f60637738b374c20098cad95c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 17 Nov 2022 22:52:51 -0500 Subject: [PATCH 0762/1312] back to standard copy for shallow copies --- src/apps/molresponse/ResponseBase.cpp | 2 -- src/apps/molresponse/x_space.cc | 38 +++++++++------------------ 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index b98b59acb71..eab351bce53 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -445,8 +445,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit size_t num_states = chi_alpha.num_states(); size_t num_orbitals = chi_alpha.num_orbitals(); - //truncate(world, phi0); - //// chi_alpha.truncate(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 0c579877b2d..c3a6b1d7413 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -24,21 +24,20 @@ namespace madness { [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); return matrix; } + // to response matrix is intended to provide a shallow copy of the response matrix + // to simply reorder the functions auto to_response_matrix(const X_space &x) -> response_matrix { World &world = x.X[0][0].world(); auto mX = response_matrix(x.num_states()); - int b = 0; auto num_orbitals = x.num_orbitals(); + int b = 0; std::for_each(mX.begin(), mX.end(), [&](auto &mi) { - //auto norm_vi = norm2(world, x_vec); mi = vector_real_function_3d(2 * num_orbitals); - std::transform(x.X[b].begin(), x.X[b].end(), mi.begin(), - [&](const auto xbi) { return copy(xbi, false); }); - std::transform(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals, - [&](const auto ybi) { return copy(ybi, false); }); - world.gop.fence(); + std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); // shallow copy + std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals);// shallow copy b++; }); + world.gop.fence(); return mX; } @@ -48,13 +47,9 @@ namespace madness { int b = 0; auto num_orbitals = x.num_orbitals(); std::for_each(mX.begin(), mX.end(), [&](auto &mi) { - //auto norm_vi = norm2(world, x_vec); mi = vector_real_function_3d(2 * num_orbitals); - std::transform(x.Y[b].begin(), x.Y[b].end(), mi.begin(), - [&](const auto xbi) { return copy(xbi, false); }); - std::transform(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals, - [&](const auto ybi) { return copy(ybi, false); }); - world.gop.fence(); + std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin()); // shallow copy + std::copy(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals);// shallow copy b++; }); return mX; @@ -71,15 +66,9 @@ namespace madness { auto num_orbitals = 2 * x.num_orbitals(); auto vij = vector_real_function_3d(x.num_states() * num_orbitals); auto mx = to_response_matrix(x); - int b = 0; for (const auto &mi: mx) { - std::transform(mi.begin(), mi.end(), vij.begin() + b * num_orbitals, - [&](const auto mii) { return copy(mii, false); }); - /* - std::for_each(mi.begin(), mi.end(), - [&](const auto &mix) { vij[b * num_orbitals] = copy(mix); }); - */ + std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); b++; } return vij; @@ -88,19 +77,16 @@ namespace madness { auto to_X_space(const response_matrix &x) -> X_space { World &world = x[0][0].world(); - auto num_states = x.size(); auto num_orbitals = size_t(x[0].size() / 2); auto x_space = X_space(world, num_states, num_orbitals); int b = 0; for (const auto &x_vec: x) { - //if (world.rank() == 0) { print("norm in xvec i", norm_vi); } - std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin(), - [&](const auto &xi) { return copy(xi, false); }); - std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin(), - [&](const auto &xi) { return copy(xi, false); }); + std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin()); + std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin()); b++; }; + world.gop.fence(); return x_space; } From 3ee4b912e97c8d1084567065c260c40a43bee082 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 10:28:41 -0500 Subject: [PATCH 0763/1312] remove old k0 --- src/apps/molresponse/ResponseBase.cpp | 21 ++++----------------- src/apps/molresponse/global_functions.cc | 1 + 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index eab351bce53..75ff7cfaa36 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1036,10 +1036,10 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // Intermediaries world.gop.fence(); + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto phi0_c = copy(world, phi0_copy); world.gop.fence(); - int b = 0; for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } if (compute_Y) { @@ -1050,11 +1050,11 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< K0.Y = K0.X.copy(); } if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); - if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]"); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; @@ -1158,21 +1158,8 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, size_t m = chi.num_states(); size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); - - Xvector = to_response_matrix(chi); Xresidual = to_response_matrix(residual_chi); - - /* - for (size_t b = 0; b < m; b++) { - - Xvector[b].X[0] = copy(world, chi.X[b]); - Xvector[b].Y[0] = copy(world, chi.Y[b]); - - Xresidual[b].X[0] = copy(world, residual_chi.X[b]); - Xresidual[b].Y[0] = copy(world, residual_chi.Y[b]); - } - */ response_matrix update(m); for (auto &update_i: update) { update_i = vector_real_function_3d(n); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 07aef8438f2..673df2d422c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -84,6 +84,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ for (long b = 0; b < num_states; b++) { b_index = b * num_orbitals * num_orbitals * n; p = 0; + // for each function in a response vector copy num orbital times std::for_each(xx[b].begin(), xx[b].end(), [&](const auto &xb_p) { p_index = p * num_orbitals; for (long j = 0; j < num_orbitals; j++) { From d85b412cb92af6eefbc93247cec326acf8cc66a4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 10:48:27 -0500 Subject: [PATCH 0764/1312] some printing to help debugging --- src/apps/molresponse/FrequencyResponse.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2cb66c9fe1c..5b9e7fbcdb9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -315,20 +315,32 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; + theta_X.X += theta_X.X * x_shifts; theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; + if (world.rank() == 0) { + print("--------------- ThetaX.X------------------"); + } + if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } + + if (world.rank() == 0) { + print("--------------- ThetaX.Y------------------"); + } // apply bsh X_space bsh_X(world, m, n); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + if (world.rank() == 0) { + print("--------------- Apply BSH------------------"); + } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -336,6 +348,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } + if (world.rank() == 0) { + print("--------------- Project BSH------------------"); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); From 6b3de594a9161162a9c9e5d49b6c15e79a46f4b5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 12:24:52 -0500 Subject: [PATCH 0765/1312] debugging printing --- src/apps/molresponse/ResponseBase.cpp | 49 +++++++++-------------- src/apps/molresponse/response_functions.h | 25 +++++------- 2 files changed, 27 insertions(+), 47 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 75ff7cfaa36..3878b9c89cc 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -232,8 +232,7 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const auto new_hamiltonian = T + phiVphi; for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) { - for (int64_t j = i + 1; j < new_hamiltonian.dim(1); j++) - { + for (int64_t j = i + 1; j < new_hamiltonian.dim(1); j++) { // print(i, j); // print(xAx(i, j)); // print(xAx(j, i)); @@ -241,8 +240,7 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const } } double traceOfHamiltonian(0); - for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) - { + for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) { traceOfHamiltonian += new_hamiltonian(i, i); } if (world.rank() == 0) { @@ -483,6 +481,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit }; // compute j_x = op(rho_x)*phi0 + std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); // compute j_y = op(rho_y)*phi0 @@ -573,7 +572,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::start_timer(world); print_inner(world, "xJx", chi_alpha, J); print_inner(world, "xKx", chi_alpha, K); - world.gop.fence(); print_inner(world, "xWx", chi_alpha, W); print_inner(world, "xGammax", chi_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); @@ -805,15 +803,13 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - for (size_t b = 0; b < num_states; b++) - { + for (size_t b = 0; b < num_states; b++) { vecfuncT x; x = d_alpha.X[b]; k1_x[b] = newK(x, phi0, phi0); } - if (r_params.print_level() >= 1) - { + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -1257,20 +1253,14 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi } } + void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, const response_space &x_response, const response_space &y_response, ResponseParameters const &responseParameters, GroundStateCalculation const &g_params) { - - - std::string plot_dir = "plots/"; -#ifdef MADCHEM_HAS_STD_FILESYSTEM - std::filesystem::create_directories(plot_dir); - //plot_dir = ""; -#else - plot_dir = ""; -#endif + std::filesystem::create_directories("plots/densities"); + std::filesystem::create_directory("plots/orbitals"); // TESTING // get transition density @@ -1292,35 +1282,32 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, plotCoords plt(d, Lp); // plot ground density if (iteration == 1) { - auto d_i_path = plot_dir + "rho0_%c_0.plot"; - snprintf(plot_name, buffSize, d_i_path.c_str(), dir[d]); + snprintf(plot_name, buffSize, "plots/densities/rho0_%c_0.plt", dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, rho0); } for (int i = 0; i < static_cast(n); i++) { // print ground_state // plot gound_orbitals - auto orb_i_path = plot_dir + "phi0_%c_0_%d.plt"; - snprintf(plot_name, buffSize, orb_i_path.c_str(), dir[d], static_cast(i)); + snprintf(plot_name, buffSize, "plots/orbitals/phi0_%c_0_%d.plt", dir[d], + static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals[i]); } for (int b = 0; b < static_cast(m); b++) { // plot rho1 direction d state b - auto d_ib_path = plot_dir + "rho1_%c_%d.plt"; - snprintf(plot_name, buffSize, d_ib_path.c_str(), dir[d], + snprintf(plot_name, buffSize, "plots/densities/rho1_%c_%d.plt", dir[d], static_cast(b)); plot_line(plot_name, 5001, plt.lo, plt.hi, rho1[b]); for (int i = 0; i < static_cast(n); i++) { // print ground_state - auto o_ibx_path = plot_dir + "phix_%c_%d_%d.plt"; - auto o_iby_path = plot_dir + "phiy_%c_%d_%d.plt"; - snprintf(plot_name, buffSize, o_ibx_path.c_str(), dir[d], + // plot x function x_dir_b_i__k_iter + snprintf(plot_name, buffSize, "plots/orbitals/phix_%c_%d_%d.plt", dir[d], static_cast(b), static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b][i]); - // plot y function y_dir_b_i__k_iter - snprintf(plot_name, buffSize, o_iby_path.c_str(), dir[d], + // plot y functione y_dir_b_i__k_iter + snprintf(plot_name, buffSize, "plots/orbitals/phiy_%c_%d_%d.plt", dir[d], static_cast(b), static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, y_response[b][i]); } @@ -1331,6 +1318,7 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, // END TESTING } + void PlotGroundDensityVTK(World &world, const ResponseBase &calc) { auto [ground_calc, molecule, r_params] = calc.get_parameter(); @@ -1443,8 +1431,7 @@ void ResponseBase::solve(World &world) { void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::get_thresh(), int k = FunctionDefaults<3>::get_k()) { - if (0 != Chi.X.size()) - { + if (0 != Chi.X.size()) { if (FunctionDefaults<3>::get_k() != Chi.X[0].at(0).k()) { // Project all x components into correct k diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index a15e757a81e..75739dc6fcf 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -53,9 +53,7 @@ namespace madness { * @param y */ response_space(const response_space &y) - : num_states(y.size()), - num_orbitals(y.size_orbitals()), - x(y.x) {} + : num_states(y.size()), num_orbitals(y.size_orbitals()), x(y.x) {} // assignment // Copy assignment should copy the members of y and leave y Unchanged @@ -67,10 +65,10 @@ namespace madness { this->num_orbitals = y.size_orbitals(); this->x = y.x; if (x.size() != num_states) { x.resize(num_states); } - //World &world = y[0][0].world(); + World &world = y[0][0].world(); // print("perhaps this is the problem"); std::transform(y.x.begin(), y.x.end(), x.begin(), - [&](auto yi) { return yi; }); + [&](const auto &yi) { return madness::copy(world, yi, false); }); } return *this;// } @@ -95,12 +93,8 @@ namespace madness { * @param num_orbitals */ response_space(World &world, size_t num_states, size_t num_orbitals) - : num_states(num_states), - num_orbitals(num_orbitals), - x(response_matrix(num_states)) { - for (auto &state: x) { - state = vector_real_function_3d(num_orbitals); - } + : num_states(num_states), num_orbitals(num_orbitals), x(response_matrix(num_states)) { + for (auto &state: x) { state = vector_real_function_3d(num_orbitals); } world.gop.fence(); } // Conversion from respones_matrix @@ -110,9 +104,7 @@ namespace madness { * @param x */ explicit response_space(const response_matrix &x) - : num_states(x.size()), - num_orbitals(x[0].size()), - x(x) {} + : num_states(x.size()), num_orbitals(x[0].size()), x(x) {} // Determines if two ResponseFunctions are the same size friend bool same_size(const response_space &a, const response_space &b) { @@ -281,7 +273,7 @@ namespace madness { std::transform(x.begin(), x.end(), result.x.begin(), - [&world](auto &xi) { return madness::copy(world, xi); }); + [&world](auto &xi) { return madness::copy(world, xi, false); }); world.gop.fence(); @@ -294,7 +286,8 @@ namespace madness { response_space result(world, num_states, num_orbitals); world.gop.fence(); - std::transform(x.begin(), x.end(), result.x.begin(), [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); + std::transform(x.begin(), x.end(), result.x.begin(), + [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); return result; From dd42a1d20e8f35d3e34a6242a56792e436234080 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 16:50:02 -0500 Subject: [PATCH 0766/1312] a new assignment operator and rearrange fencing --- src/apps/molresponse/response_functions.h | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 75739dc6fcf..4353ad004da 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -65,10 +65,19 @@ namespace madness { this->num_orbitals = y.size_orbitals(); this->x = y.x; if (x.size() != num_states) { x.resize(num_states); } - World &world = y[0][0].world(); - // print("perhaps this is the problem"); - std::transform(y.x.begin(), y.x.end(), x.begin(), - [&](const auto &yi) { return madness::copy(world, yi, false); }); + // if the functions are initialized then deep copy, + // else shallow copy + // the uninitialized functions. + if (y[0][0].impl_initialized()) { + // print("perhaps this is the problem"); + World &world = y[0][0].world(); + std::transform(y.x.begin(), y.x.end(), x.begin(), + [&](const auto &yi) { return madness::copy(world, yi, false); }); + world.gop.fence(); + } else { + std::transform(y.x.begin(), y.x.end(), x.begin(), + [&](const auto &yi) { return yi; }); + } } return *this;// } @@ -95,7 +104,7 @@ namespace madness { response_space(World &world, size_t num_states, size_t num_orbitals) : num_states(num_states), num_orbitals(num_orbitals), x(response_matrix(num_states)) { for (auto &state: x) { state = vector_real_function_3d(num_orbitals); } - world.gop.fence(); + //world.gop.fence(); } // Conversion from respones_matrix /** From 90ae781620065973953bc1d9d4f5cf473f5f8621 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 18:01:38 -0500 Subject: [PATCH 0767/1312] more printing to investigate hangs --- src/apps/molresponse/FrequencyResponse.cpp | 27 ++++++------------ src/apps/molresponse/ResponseBase.cpp | 33 ++++++++++++++++------ 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5b9e7fbcdb9..2381236deed 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -51,8 +51,9 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + kain_x_space.push_back( + XNonlinearSolver( + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -246,7 +247,7 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) print("\n"); // Did we converge? - if (iter == r_params.maxiter() && not converged) { + if (iter == r_params.maxiter() - 1 && not converged) { if (world.rank() == 0) print(" Failed to converge. Reason:"); if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); if (world.rank() == 0) print(" Running analysis on current values.\n"); @@ -306,9 +307,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { - print("--------------- BSH UPDATE RESPONSE------------------"); - } + if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } size_t m = theta_X.X.size(); @@ -320,27 +319,21 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; - if (world.rank() == 0) { - print("--------------- ThetaX.X------------------"); - } + if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } - if (world.rank() == 0) { - print("--------------- ThetaX.Y------------------"); - } + if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } // apply bsh X_space bsh_X(world, m, n); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } - if (world.rank() == 0) { - print("--------------- Apply BSH------------------"); - } + if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -348,9 +341,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0) { - print("--------------- Project BSH------------------"); - } + if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3878b9c89cc..f50b532cb73 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -58,11 +58,14 @@ void ResponseBase::check_k(World &world, double thresh, int k) { bool redo = false; // Verify ground state orbitals have correct k if (FunctionDefaults<3>::get_k() != ground_orbitals[0].k()) { + if (world.rank() == 0 && r_params.print_level() > 20) { print("check k ground-orbitals"); } // Re-read orbitals from the archive (assuming // the archive has orbitals stored at a higher // k value than what was previously computed ground_calc.read(world); - reconstruct(world, ground_orbitals); + reconstruct(world, ground_orbitals, true); + + if (world.rank() == 0 && r_params.print_level() > 20) { print("check k reconstruct"); } // Reset correct k (its set in g_params.read) FunctionDefaults<3>::set_k(k); // Project each ground state to correct k @@ -70,11 +73,20 @@ void ResponseBase::check_k(World &world, double thresh, int k) { orbital = project(orbital, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); + if (world.rank() == 0 && r_params.print_level() > 20) { + print("check k project ground-orbitals"); + } // Clean up a bit - truncate(world, ground_orbitals); + truncate(world, ground_orbitals, true); + if (world.rank() == 0 && r_params.print_level() > 20) { + print("check k truncate ground-orbitals"); + } // Now that ground orbitals have correct k lets make the ground density // again ground_density = make_ground_density(world); + if (world.rank() == 0 && r_params.print_level() > 20) { + print("check k make-density ground-orbitals"); + } // Ground state orbitals changed, clear old hamiltonian redo = true; } @@ -84,6 +96,9 @@ void ResponseBase::check_k(World &world, double thresh, int k) { // TODO this doesn't seem right... hamiltonian = HAM; ham_no_diag = HAM_NO_DIAG; + if (world.rank() == 0 && r_params.print_level() > 20) { + print("check k computeHamiltonianPair "); + } } // If we stored the potential, check that too @@ -91,7 +106,7 @@ void ResponseBase::check_k(World &world, double thresh, int k) { if (FunctionDefaults<3>::get_k() != stored_potential[0][0].k()) { // Project the potential into correct k for (auto &potential_vector: stored_potential) { - reconstruct(world, potential_vector); + reconstruct(world, potential_vector, true); for (auto &vi: potential_vector) { vi = project(vi, FunctionDefaults<3>::get_k(), thresh, false); } @@ -99,13 +114,13 @@ void ResponseBase::check_k(World &world, double thresh, int k) { } } if (FunctionDefaults<3>::get_k() != stored_v_coul.k()) - stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, false); + stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, true); if (FunctionDefaults<3>::get_k() != stored_v_nuc.k()) - stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, false); + stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, true); } // Don't forget the mask function as well if (FunctionDefaults<3>::get_k() != mask.k()) { - mask = project(mask, FunctionDefaults<3>::get_k(), thresh, false); + mask = project(mask, FunctionDefaults<3>::get_k(), thresh, true); } ::check_k(world, Chi, thresh, k); @@ -158,6 +173,7 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const Tensor T = 1.0 / 2.0 * (matrix_inner(world, fx, fx) + matrix_inner(world, fy, fy) + matrix_inner(world, fz, fz)); + world.gop.fence(); // Construct phiVphi // v_nuc first @@ -208,6 +224,7 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const if (r_params.store_potential()) { stored_potential.push_back(psif); } psif = mul_sparse(world, phi_i, psif, FunctionDefaults<3>::get_thresh()); gaxpy(world, 1.0, Kphi, 1.0, psif); + world.gop.fence(); } // Only use the exchange above if HF: Tensor phiVphi; @@ -1436,14 +1453,14 @@ void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::ge // Project all x components into correct k for (auto &xi: Chi.X) { - reconstruct(world, xi); + reconstruct(world, xi, true); for (auto &xij: xi) { xij = project(xij, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); } for (auto &yi: Chi.Y) { - reconstruct(world, yi); + reconstruct(world, yi, true); for (auto &yij: yi) { yij = project(yij, FunctionDefaults<3>::get_k(), thresh, false); } From 019b6730ee3fd9c0ed0bd8f5da70a3e233a1d02c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 18:43:55 -0500 Subject: [PATCH 0768/1312] Revert "more printing to investigate hangs" This reverts commit 987a65564bbef04795470ac1aba18471bd6c76ac. --- src/apps/molresponse/FrequencyResponse.cpp | 27 ++++++++++++------ src/apps/molresponse/ResponseBase.cpp | 33 ++++++---------------- 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2381236deed..5b9e7fbcdb9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -51,9 +51,8 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back( - XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + kain_x_space.push_back(XNonlinearSolver( + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -247,7 +246,7 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) print("\n"); // Did we converge? - if (iter == r_params.maxiter() - 1 && not converged) { + if (iter == r_params.maxiter() && not converged) { if (world.rank() == 0) print(" Failed to converge. Reason:"); if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); if (world.rank() == 0) print(" Running analysis on current values.\n"); @@ -307,7 +306,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } + if (world.rank() == 0) { + print("--------------- BSH UPDATE RESPONSE------------------"); + } } size_t m = theta_X.X.size(); @@ -319,21 +320,27 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; - if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } + if (world.rank() == 0) { + print("--------------- ThetaX.X------------------"); + } if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } - if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } + if (world.rank() == 0) { + print("--------------- ThetaX.Y------------------"); + } // apply bsh X_space bsh_X(world, m, n); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } - if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } + if (world.rank() == 0) { + print("--------------- Apply BSH------------------"); + } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -341,7 +348,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0) { print("--------------- Project BSH------------------"); } + if (world.rank() == 0) { + print("--------------- Project BSH------------------"); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f50b532cb73..3878b9c89cc 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -58,14 +58,11 @@ void ResponseBase::check_k(World &world, double thresh, int k) { bool redo = false; // Verify ground state orbitals have correct k if (FunctionDefaults<3>::get_k() != ground_orbitals[0].k()) { - if (world.rank() == 0 && r_params.print_level() > 20) { print("check k ground-orbitals"); } // Re-read orbitals from the archive (assuming // the archive has orbitals stored at a higher // k value than what was previously computed ground_calc.read(world); - reconstruct(world, ground_orbitals, true); - - if (world.rank() == 0 && r_params.print_level() > 20) { print("check k reconstruct"); } + reconstruct(world, ground_orbitals); // Reset correct k (its set in g_params.read) FunctionDefaults<3>::set_k(k); // Project each ground state to correct k @@ -73,20 +70,11 @@ void ResponseBase::check_k(World &world, double thresh, int k) { orbital = project(orbital, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); - if (world.rank() == 0 && r_params.print_level() > 20) { - print("check k project ground-orbitals"); - } // Clean up a bit - truncate(world, ground_orbitals, true); - if (world.rank() == 0 && r_params.print_level() > 20) { - print("check k truncate ground-orbitals"); - } + truncate(world, ground_orbitals); // Now that ground orbitals have correct k lets make the ground density // again ground_density = make_ground_density(world); - if (world.rank() == 0 && r_params.print_level() > 20) { - print("check k make-density ground-orbitals"); - } // Ground state orbitals changed, clear old hamiltonian redo = true; } @@ -96,9 +84,6 @@ void ResponseBase::check_k(World &world, double thresh, int k) { // TODO this doesn't seem right... hamiltonian = HAM; ham_no_diag = HAM_NO_DIAG; - if (world.rank() == 0 && r_params.print_level() > 20) { - print("check k computeHamiltonianPair "); - } } // If we stored the potential, check that too @@ -106,7 +91,7 @@ void ResponseBase::check_k(World &world, double thresh, int k) { if (FunctionDefaults<3>::get_k() != stored_potential[0][0].k()) { // Project the potential into correct k for (auto &potential_vector: stored_potential) { - reconstruct(world, potential_vector, true); + reconstruct(world, potential_vector); for (auto &vi: potential_vector) { vi = project(vi, FunctionDefaults<3>::get_k(), thresh, false); } @@ -114,13 +99,13 @@ void ResponseBase::check_k(World &world, double thresh, int k) { } } if (FunctionDefaults<3>::get_k() != stored_v_coul.k()) - stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, true); + stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, false); if (FunctionDefaults<3>::get_k() != stored_v_nuc.k()) - stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, true); + stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, false); } // Don't forget the mask function as well if (FunctionDefaults<3>::get_k() != mask.k()) { - mask = project(mask, FunctionDefaults<3>::get_k(), thresh, true); + mask = project(mask, FunctionDefaults<3>::get_k(), thresh, false); } ::check_k(world, Chi, thresh, k); @@ -173,7 +158,6 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const Tensor T = 1.0 / 2.0 * (matrix_inner(world, fx, fx) + matrix_inner(world, fy, fy) + matrix_inner(world, fz, fz)); - world.gop.fence(); // Construct phiVphi // v_nuc first @@ -224,7 +208,6 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const if (r_params.store_potential()) { stored_potential.push_back(psif); } psif = mul_sparse(world, phi_i, psif, FunctionDefaults<3>::get_thresh()); gaxpy(world, 1.0, Kphi, 1.0, psif); - world.gop.fence(); } // Only use the exchange above if HF: Tensor phiVphi; @@ -1453,14 +1436,14 @@ void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::ge // Project all x components into correct k for (auto &xi: Chi.X) { - reconstruct(world, xi, true); + reconstruct(world, xi); for (auto &xij: xi) { xij = project(xij, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); } for (auto &yi: Chi.Y) { - reconstruct(world, yi, true); + reconstruct(world, yi); for (auto &yij: yi) { yij = project(yij, FunctionDefaults<3>::get_k(), thresh, false); } From 0474b1ef3828effea7f87b2d0ec1e00a01a3a170 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 18 Nov 2022 18:48:27 -0500 Subject: [PATCH 0769/1312] some printing between protocols --- src/apps/molresponse/ResponseBase.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3878b9c89cc..9f44b5d605f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1394,6 +1394,7 @@ void ResponseBase::solve(World &world) { for (const auto &iter_thresh: protocol) { // We set the protocol and function defaults here for the given threshold of set_protocol(world, iter_thresh); + if (world.rank() == 0) { print("Succesfully set protocol"); } // protocol if (first_protocol) { if (r_params.restart()) { @@ -1404,11 +1405,14 @@ void ResponseBase::solve(World &world) { first_protocol = false; } else { this->initialize(world); + if (world.rank() == 0) { print("Succesfully initialized "); } } check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); + if (world.rank() == 0) { print("Succesfully check K first initialization "); } first_protocol = false; } else { check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); + if (world.rank() == 0) { print("Succesfully check K not first initialization "); } } protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... From b97d05025528dc0b4d94b712c524d59278385091 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 14:52:00 -0500 Subject: [PATCH 0770/1312] lambda reference bug --- src/apps/molresponse/response_functions.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 4353ad004da..e5b1a7315e8 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -360,13 +360,13 @@ namespace madness { void compress_rf() { //for (size_t k = 0; k < num_states; k++) { compress(x[0][0].world(), x[k], true); } auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto xi) { compress(world, xi, true); }); + std::for_each(x.begin(), x.end(), [&](auto& xi) { compress(world, xi, true); }); } void reconstruct_rf() { //for (size_t k = 0; k < num_states; k++) { reconstruct(x[0][0].world(), x[k], true); } auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto xi) { reconstruct(world, xi, true); }); + std::for_each(x.begin(), x.end(), [&](auto& xi) { reconstruct(world, xi, true); }); } void truncate_rf() { @@ -380,7 +380,7 @@ namespace madness { void truncate_rf(double tol) { auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto xi) { truncate(world, xi, tol, true); }); + std::for_each(x.begin(), x.end(), [&](auto& xi) { truncate(world, xi, tol, true); }); /* for (size_t k = 0; k < num_states; k++) { truncate(x[0][0].world(), x[k], tol, true); } */ From 8bba236063ec95f7f3a563e39fb4c0762ca9f25e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 15:01:36 -0500 Subject: [PATCH 0771/1312] using basic vmra funcrtions --- src/apps/molresponse/response_functions.h | 48 ++++++----------------- src/apps/molresponse/x_space.h | 6 +-- 2 files changed, 12 insertions(+), 42 deletions(-) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index e5b1a7315e8..d217dab27d1 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -151,12 +151,9 @@ namespace madness { response_space operator+(const response_space &rhs_y) const { MADNESS_ASSERT(size() > 0); MADNESS_ASSERT(same_size(*this, rhs_y));// assert that same size - World &world = this->x[0][0].world(); - response_space result(world, num_states, num_orbitals);// create zero_functions - - for (size_t i = 0; i < num_states; i++) { result[i] = add(world, x[i], rhs_y[i]); } + for (size_t i = 0; i < num_states; i++) { result[i] = x[i] + rhs_y[i]; } return result; } /* @@ -175,14 +172,9 @@ namespace madness { response_space operator-(const response_space &rhs_y) const { MADNESS_ASSERT(size() > 0); MADNESS_ASSERT(same_size(*this, rhs_y));// assert that same size - World &world = this->x[0][0].world(); - response_space result(world, num_states, num_orbitals);// create zero_functions - - for (size_t i = 0; i < num_states; i++) { - result[i] = sub(world, x[i], rhs_y[i], false); - } + for (size_t i = 0; i < num_states; i++) { result[i] = x[i] - rhs_y[i]; } return result; } @@ -196,26 +188,20 @@ namespace madness { friend response_space operator*(response_space y, double a) { World &world = y.x.at(0).at(0).world(); response_space result = y.copy();// deep copy - for (unsigned int i = 0; i < y.num_states; i++) { madness::scale(world, result[i], a); } - return result; } friend response_space operator*(double a, response_space y) { World &world = y.x.at(0).at(0).world(); response_space result = y.copy();// deep copy - for (unsigned int i = 0; i < y.num_states; i++) { madness::scale(world, result[i], a); } - return result; } response_space &operator*=(double a) { World &world = this->x[0][0].world(); - for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a); } - return *this; } @@ -224,12 +210,10 @@ namespace madness { friend response_space operator*(const response_space &a, const Function &f) { World &world = a.x.at(0).at(0).world(); response_space result(world, a.num_states, a.num_orbitals);// create zero_functions - for (unsigned int i = 0; i < a.num_states; i++) { // Using vmra.h funciton - result[i] = mul(f.world(), f, a[i]); + result[i] = a[i] * f; } - return result; } @@ -243,11 +227,7 @@ namespace madness { response_space operator*(const Function &f) { World &world = x[0][0].world(); response_space result(world, num_states, num_orbitals);// create zero_functions - - for (size_t i = 0; i < num_states; i++) { - // Using vmra.h funciton - result[i] = mul(f.world(), f, x[i]); - } + for (size_t i = 0; i < num_states; i++) { result[i] = x[i] * f; } return result; } @@ -257,11 +237,9 @@ namespace madness { MADNESS_ASSERT(!a[0].empty()); World &world = a[0][0].world(); response_space result(world, a.num_states, a.num_orbitals); - for (unsigned int i = 0; i < a.size(); i++) { result[i] = transform(world, a[i], b, false); } - return result; } @@ -269,18 +247,14 @@ namespace madness { response_space &operator+=(const response_space &b) { MADNESS_ASSERT(same_size(*this, b)); World &world = x[0][0].world(); - for (size_t i = 0; i < num_states; i++) { this->x[i] = add(world, this->x[i], b[i]); } - world.gop.fence(); - + for (size_t i = 0; i < num_states; i++) { this->x[i] += b[i]; } return *this; } // Returns a deep copy - response_space copy() const { + [[nodiscard]] response_space copy() const { World &world = x[0][0].world(); response_space result(world, num_states, num_orbitals); - - std::transform(x.begin(), x.end(), result.x.begin(), [&world](auto &xi) { return madness::copy(world, xi, false); }); world.gop.fence(); @@ -289,8 +263,8 @@ namespace madness { return result; } - response_space copy(const std::shared_ptr>> &pmap, - bool fence = false) const { + [[nodiscard]] response_space copy(const std::shared_ptr>> &pmap, + bool fence = false) const { auto &world = x[0][0].world(); response_space result(world, num_states, num_orbitals); world.gop.fence(); @@ -360,13 +334,13 @@ namespace madness { void compress_rf() { //for (size_t k = 0; k < num_states; k++) { compress(x[0][0].world(), x[k], true); } auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto& xi) { compress(world, xi, true); }); + std::for_each(x.begin(), x.end(), [&](auto &xi) { compress(world, xi, true); }); } void reconstruct_rf() { //for (size_t k = 0; k < num_states; k++) { reconstruct(x[0][0].world(), x[k], true); } auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto& xi) { reconstruct(world, xi, true); }); + std::for_each(x.begin(), x.end(), [&](auto &xi) { reconstruct(world, xi, true); }); } void truncate_rf() { @@ -380,7 +354,7 @@ namespace madness { void truncate_rf(double tol) { auto &world = x[0][0].world(); - std::for_each(x.begin(), x.end(), [&](auto& xi) { truncate(world, xi, tol, true); }); + std::for_each(x.begin(), x.end(), [&](auto &xi) { truncate(world, xi, tol, true); }); /* for (size_t k = 0; k < num_states; k++) { truncate(x[0][0].world(), x[k], tol, true); } */ diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index b8d9fbd1909..04986e45873 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -94,18 +94,14 @@ namespace madness { auto operator+(const X_space &B) -> X_space { MADNESS_ASSERT(same_size(*this, B)); World &world = this->X[0][0].world(); - auto ax = to_response_matrix(*this); world.gop.fence(); auto bx = to_response_matrix(B); world.gop.fence(); - response_matrix add_x(num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const auto &a, const auto &b) { return add(world, a, b, false); }); - world.gop.fence(); - + [&](const auto &a, const auto &b) { return a + b; }); return to_X_space(add_x); } From dd35919192bb62c99d3ece59b4a44f39fbed7951 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 15:24:18 -0500 Subject: [PATCH 0772/1312] some more clean up --- src/apps/molresponse/response_functions.h | 13 ------------- src/apps/molresponse/x_space.h | 21 +++++---------------- 2 files changed, 5 insertions(+), 29 deletions(-) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index d217dab27d1..2d35f4f9be9 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -65,19 +65,6 @@ namespace madness { this->num_orbitals = y.size_orbitals(); this->x = y.x; if (x.size() != num_states) { x.resize(num_states); } - // if the functions are initialized then deep copy, - // else shallow copy - // the uninitialized functions. - if (y[0][0].impl_initialized()) { - // print("perhaps this is the problem"); - World &world = y[0][0].world(); - std::transform(y.x.begin(), y.x.end(), x.begin(), - [&](const auto &yi) { return madness::copy(world, yi, false); }); - world.gop.fence(); - } else { - std::transform(y.x.begin(), y.x.end(), x.begin(), - [&](const auto &yi) { return yi; }); - } } return *this;// } diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 04986e45873..cfc01ef37ec 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -95,11 +95,8 @@ namespace madness { MADNESS_ASSERT(same_size(*this, B)); World &world = this->X[0][0].world(); auto ax = to_response_matrix(*this); - world.gop.fence(); auto bx = to_response_matrix(B); - world.gop.fence(); response_matrix add_x(num_states()); - std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), [&](const auto &a, const auto &b) { return a + b; }); return to_X_space(add_x); @@ -107,8 +104,10 @@ namespace madness { auto operator+=(const X_space &B) -> X_space & { MADNESS_ASSERT(same_size(*this, B)); - this->X += B.X; - this->Y += B.Y; + auto ax = to_response_matrix(*this); + auto bx = to_response_matrix(B); + int b = 0; + std::for_each(ax.begin(), ax.end(), [&](auto &a) { a += bx[b++]; }); return *this; } @@ -137,7 +136,6 @@ namespace madness { static X_space zero_functions(World &world, size_t n_states, size_t n_orbitals) { auto zeros = X_space(world, n_states, n_orbitals); - for (auto &xi: zeros.X) { xi = ::madness::zero_functions(world, n_orbitals, false); } @@ -150,23 +148,14 @@ namespace madness { friend auto operator+(const X_space &A, const X_space &B) -> X_space { MADNESS_ASSERT(same_size(A, B)); - World &world = A.X[0][0].world(); X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - auto ax = to_response_matrix(A); auto bx = to_response_matrix(B); - response_matrix add_x(A.num_states()); - std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](auto a, auto b) { return add(world, a, b); }); - + [&](auto a, auto b) { return a + b; }); return to_X_space(add_x); - - result.X = A.X + B.X; - result.Y = A.Y + B.Y; - return result; } X_space operator-(const X_space B) { From a952e438cc721262f53f4f8f3644dfc909bc93ee Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 16:17:44 -0500 Subject: [PATCH 0773/1312] modify convergence and add some printing --- src/apps/molresponse/FrequencyResponse.cpp | 31 ++++++++-------------- src/apps/molresponse/global_functions.cc | 18 ++++++------- src/apps/molresponse/testing/runners.hpp | 2 +- src/madness/mra/vmra.h | 1 - 4 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5b9e7fbcdb9..46b97e5eb45 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -18,9 +18,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(75 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(50 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(10 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -51,8 +51,9 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + kain_x_space.push_back( + XNonlinearSolver( + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -283,7 +284,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 0)) { + if (r_params.kain() && (iteration > 3)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); } @@ -306,9 +307,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { - print("--------------- BSH UPDATE RESPONSE------------------"); - } + if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } size_t m = theta_X.X.size(); @@ -320,27 +319,21 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; - if (world.rank() == 0) { - print("--------------- ThetaX.X------------------"); - } + if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } - if (world.rank() == 0) { - print("--------------- ThetaX.Y------------------"); - } + if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } // apply bsh X_space bsh_X(world, m, n); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } - if (world.rank() == 0) { - print("--------------- Apply BSH------------------"); - } + if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -348,9 +341,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0) { - print("--------------- Project BSH------------------"); - } + if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 673df2d422c..3f8981e1689 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -84,14 +84,13 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ for (long b = 0; b < num_states; b++) { b_index = b * num_orbitals * num_orbitals * n; p = 0; - // for each function in a response vector copy num orbital times - std::for_each(xx[b].begin(), xx[b].end(), [&](const auto &xb_p) { + for (const auto &xb_p: xx[b]) { p_index = p * num_orbitals; for (long j = 0; j < num_orbitals; j++) { x_vector.at(b_index + p_index + j) = copy(xb_p, false); } p++; - }); + } } vecfuncT phi1(n_exchange); vecfuncT phi2(n_exchange); @@ -100,8 +99,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ std::for_each(phi1.begin(), phi1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); world.gop.fence(); - phi2 = madness::copy(world, phi1); - world.gop.fence(); + phi2 = madness::copy(world, phi1, true); molresponse::end_timer(world, "ground exchange copy"); return molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); } @@ -233,20 +231,20 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br reconstruct(world, bra_i, false); reconstruct(world, fp, false); world.gop.fence(); + if (world.rank() == 0) { print("exchange reconstruct"); } norm_tree(world, ket_i, false); norm_tree(world, bra_i, false); norm_tree(world, fp, false); world.gop.fence(); + if (world.rank() == 0) { print("exchange norm true"); } const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); auto v23 = mul(world, bra_i, fp, true); - truncate(world, v23, 0.0, true); v23 = apply(world, *poisson, v23); - world.gop.fence(); truncate(world, v23, 0.0, true); auto v123 = mul(world, ket_i, v23, true); - world.gop.fence(); + if (world.rank() == 0) { print("exchange finish apply"); } const long n_exchange{num_states * n * num_orbitals}; auto exchange_vector = vecfuncT(n_exchange); long b = 0; @@ -261,8 +259,8 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } - truncate(world, exchange_vector); - world.gop.fence(); + if (world.rank() == 0) { print("exchange finish sum"); } + truncate(world, exchange_vector, true); molresponse::end_timer(world, "exchange apply"); molresponse::start_timer(world); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2fc9b9a8c6f..0d2c38bba42 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -550,7 +550,7 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: } //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(30)); - r_params.set_user_defined_value("maxsub", size_t(5)); + r_params.set_user_defined_value("maxsub", size_t(7)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index 23c16efb55b..47df33a3a81 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -1347,7 +1347,6 @@ namespace madness { for (unsigned int i=0; i Date: Mon, 21 Nov 2022 16:32:34 -0500 Subject: [PATCH 0774/1312] revert exchange copy function --- src/apps/molresponse/global_functions.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 3f8981e1689..d80c0e3c946 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -84,13 +84,14 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ for (long b = 0; b < num_states; b++) { b_index = b * num_orbitals * num_orbitals * n; p = 0; - for (const auto &xb_p: xx[b]) { + // for each function in a response vector copy num orbital times + std::for_each(xx[b].begin(), xx[b].end(), [&](const auto &xb_p) { p_index = p * num_orbitals; for (long j = 0; j < num_orbitals; j++) { x_vector.at(b_index + p_index + j) = copy(xb_p, false); } p++; - } + }); } vecfuncT phi1(n_exchange); vecfuncT phi2(n_exchange); @@ -236,7 +237,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br norm_tree(world, bra_i, false); norm_tree(world, fp, false); world.gop.fence(); - if (world.rank() == 0) { print("exchange norm true"); } + if (world.rank() == 0) { print("exchange norm tree"); } const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); auto v23 = mul(world, bra_i, fp, true); From d0e432bd17017d8cd269b8e520c754e1a1aef798 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 16:46:06 -0500 Subject: [PATCH 0775/1312] back to 0 for sub --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 46b97e5eb45..a28ad700c24 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -284,7 +284,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 3)) { + if (r_params.kain() && (iteration > 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); } From 124b8074789440f037d55d1c10a5e75aa72c0f72 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 17:30:25 -0500 Subject: [PATCH 0776/1312] revert --- src/apps/molresponse/FrequencyResponse.cpp | 29 ++++++++++++++-------- src/apps/molresponse/global_functions.cc | 12 +++++---- src/apps/molresponse/response_functions.h | 7 ------ src/apps/molresponse/testing/runners.hpp | 2 +- src/madness/mra/vmra.h | 1 + 5 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index a28ad700c24..5b9e7fbcdb9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -18,9 +18,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(75 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(10 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(50 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -51,9 +51,8 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back( - XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + kain_x_space.push_back(XNonlinearSolver( + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -307,7 +306,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } + if (world.rank() == 0) { + print("--------------- BSH UPDATE RESPONSE------------------"); + } } size_t m = theta_X.X.size(); @@ -319,21 +320,27 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; - if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } + if (world.rank() == 0) { + print("--------------- ThetaX.X------------------"); + } if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } - if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } + if (world.rank() == 0) { + print("--------------- ThetaX.Y------------------"); + } // apply bsh X_space bsh_X(world, m, n); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } - if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } + if (world.rank() == 0) { + print("--------------- Apply BSH------------------"); + } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -341,7 +348,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0) { print("--------------- Project BSH------------------"); } + if (world.rank() == 0) { + print("--------------- Project BSH------------------"); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index d80c0e3c946..53da0d1e5f5 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -100,7 +100,8 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ std::for_each(phi1.begin(), phi1.end(), [&](auto &phi_i) { phi_i = copy(phi0[orb_i++ % num_orbitals]); }); world.gop.fence(); - phi2 = madness::copy(world, phi1, true); + phi2 = madness::copy(world, phi1); + world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); return molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); } @@ -232,7 +233,6 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br reconstruct(world, bra_i, false); reconstruct(world, fp, false); world.gop.fence(); - if (world.rank() == 0) { print("exchange reconstruct"); } norm_tree(world, ket_i, false); norm_tree(world, bra_i, false); norm_tree(world, fp, false); @@ -241,11 +241,13 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); auto v23 = mul(world, bra_i, fp, true); + truncate(world, v23, 0.0, true); v23 = apply(world, *poisson, v23); + world.gop.fence(); truncate(world, v23, 0.0, true); auto v123 = mul(world, ket_i, v23, true); - if (world.rank() == 0) { print("exchange finish apply"); } + world.gop.fence(); const long n_exchange{num_states * n * num_orbitals}; auto exchange_vector = vecfuncT(n_exchange); long b = 0; @@ -260,8 +262,8 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } - if (world.rank() == 0) { print("exchange finish sum"); } - truncate(world, exchange_vector, true); + truncate(world, exchange_vector); + world.gop.fence(); molresponse::end_timer(world, "exchange apply"); molresponse::start_timer(world); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 2d35f4f9be9..2aad44007e7 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -198,7 +198,6 @@ namespace madness { World &world = a.x.at(0).at(0).world(); response_space result(world, a.num_states, a.num_orbitals);// create zero_functions for (unsigned int i = 0; i < a.num_states; i++) { - // Using vmra.h funciton result[i] = a[i] * f; } return result; @@ -215,7 +214,6 @@ namespace madness { World &world = x[0][0].world(); response_space result(world, num_states, num_orbitals);// create zero_functions for (size_t i = 0; i < num_states; i++) { result[i] = x[i] * f; } - return result; } @@ -245,8 +243,6 @@ namespace madness { std::transform(x.begin(), x.end(), result.x.begin(), [&world](auto &xi) { return madness::copy(world, xi, false); }); world.gop.fence(); - - return result; } @@ -255,11 +251,8 @@ namespace madness { auto &world = x[0][0].world(); response_space result(world, num_states, num_orbitals); world.gop.fence(); - std::transform(x.begin(), x.end(), result.x.begin(), [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); - - return result; } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 0d2c38bba42..2fc9b9a8c6f 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -550,7 +550,7 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: } //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(30)); - r_params.set_user_defined_value("maxsub", size_t(7)); + r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index 47df33a3a81..23c16efb55b 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -1347,6 +1347,7 @@ namespace madness { for (unsigned int i=0; i Date: Mon, 21 Nov 2022 17:47:42 -0500 Subject: [PATCH 0777/1312] edit convergence --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5b9e7fbcdb9..0bb2dec1311 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -18,9 +18,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(50 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(50 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(10 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -283,7 +283,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 0)) { + if (r_params.kain() && (iteration > 3)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); } From ff0fc4961858d99082d46041129018319e854961 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 18:03:26 -0500 Subject: [PATCH 0778/1312] revert the thresholds again --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0bb2dec1311..6a842c9e1a7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -18,9 +18,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(50 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(10 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(40 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From b1357c27dc7348015ebcbbda3d8c22ecf5051cdf Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 18:09:20 -0500 Subject: [PATCH 0779/1312] printing for exchange debugging --- src/apps/molresponse/global_functions.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 53da0d1e5f5..52f21baa845 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -103,7 +103,9 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ phi2 = madness::copy(world, phi1); world.gop.fence(); molresponse::end_timer(world, "ground exchange copy"); - return molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); + auto K = molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); + if (world.rank() == 0) { print("made it out of molresponseExchange"); } + return K } // compute full response exchange |i> /** @@ -232,6 +234,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br reconstruct(world, ket_i, false); reconstruct(world, bra_i, false); reconstruct(world, fp, false); + if (world.rank() == 0) { print("exchange reconstruct tree"); } world.gop.fence(); norm_tree(world, ket_i, false); norm_tree(world, bra_i, false); @@ -241,13 +244,15 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); auto v23 = mul(world, bra_i, fp, true); - + if (world.rank() == 0) { print("multiply v23"); } truncate(world, v23, 0.0, true); + if (world.rank() == 0) { print("truncate v23"); } v23 = apply(world, *poisson, v23); - world.gop.fence(); + if (world.rank() == 0) { print("apply v23"); } truncate(world, v23, 0.0, true); + if (world.rank() == 0) { print("truncate after apply v23"); } auto v123 = mul(world, ket_i, v23, true); - world.gop.fence(); + if (world.rank() == 0) { print("multiply apply v123"); } const long n_exchange{num_states * n * num_orbitals}; auto exchange_vector = vecfuncT(n_exchange); long b = 0; @@ -262,6 +267,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } + molresponse::end_timer(world, "exchange sum"); truncate(world, exchange_vector); world.gop.fence(); molresponse::end_timer(world, "exchange apply"); From cbe243ba697ff16321c5e8af22f3cb1f996d1e0e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 18:10:10 -0500 Subject: [PATCH 0780/1312] a ; --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 52f21baa845..96f57367bc2 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -105,7 +105,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ molresponse::end_timer(world, "ground exchange copy"); auto K = molresponseExchange(world, phi1, phi2, x_vector, n, num_states, num_orbitals); if (world.rank() == 0) { print("made it out of molresponseExchange"); } - return K + return K; } // compute full response exchange |i> /** From 225dd6b3fbb13f5fbfc0047328b62e9ada4628c5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 19:20:10 -0500 Subject: [PATCH 0781/1312] why did i add an extra timer --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 96f57367bc2..8917e383082 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -267,7 +267,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } - molresponse::end_timer(world, "exchange sum"); + if (world.rank() == 0) print("exchange sum"); truncate(world, exchange_vector); world.gop.fence(); molresponse::end_timer(world, "exchange apply"); From c96fc7411f46f26e7068d4c5a0f437e306641a56 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 20:35:22 -0500 Subject: [PATCH 0782/1312] printing for exchange debugging --- src/apps/molresponse/global_functions.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8917e383082..4cbee181bc3 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -243,7 +243,10 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br if (world.rank() == 0) { print("exchange norm tree"); } const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); + world.gop.fence(); + if (world.rank() == 0) { print("multiply v23"); } auto v23 = mul(world, bra_i, fp, true); + //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } truncate(world, v23, 0.0, true); if (world.rank() == 0) { print("truncate v23"); } From fdbe2f4f42c93bea8a32b7b1149a763f0e5435b6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 21:45:53 -0500 Subject: [PATCH 0783/1312] more printing --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 4cbee181bc3..a1b8d926cc2 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -244,7 +244,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br const double lo = 1.0e-10; auto poisson = set_poisson(world, lo); world.gop.fence(); - if (world.rank() == 0) { print("multiply v23"); } + if (world.rank() == 0) { print("create poisson v23"); } auto v23 = mul(world, bra_i, fp, true); //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } From 8a7c7b6b92c4ae18b7e87d60c34faa29c6dc0cd4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 21:46:14 -0500 Subject: [PATCH 0784/1312] some x space improvements and fix multiply bug --- src/apps/molresponse/x_space.h | 86 ++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index cfc01ef37ec..d09c44c75c2 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -40,7 +40,7 @@ namespace madness { // Copy constructor X_space(const X_space &A) : n_states(size_states(A)), n_orbitals(size_orbitals(A)), X(A.X), Y(A.Y) {} - X_space copy() const { + [[nodiscard]] X_space copy() const { auto &world = X[0][0].world(); auto m = to_response_matrix(*this); auto copy_m = create_response_matrix(num_states(), num_orbitals()); @@ -54,7 +54,7 @@ namespace madness { /// Works in either basis. Different distributions imply /// asynchronous communication and the optional fence is /// collective. - auto copy(const std::shared_ptr>> &pmap, + [[nodiscard]] auto copy(const std::shared_ptr>> &pmap, bool fence = false) const -> X_space { auto &world = X[0][0].world(); auto m = to_response_matrix(*this); @@ -158,63 +158,67 @@ namespace madness { return to_X_space(add_x); } - X_space operator-(const X_space B) { + // C=this-B + X_space operator-(const X_space &B) { MADNESS_ASSERT(same_size(*this, B)); - World &world = this->X[0][0].world(); - X_space result(world, n_states, n_orbitals); - result.X = X - B.X; - result.Y = Y - B.Y; - return result; + + auto ax = to_response_matrix(*this); + auto bx = to_response_matrix(B); + + response_matrix result(B.num_states()); + std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), + [&](auto a, auto b) { return a - b; }); + return to_X_space(result); } friend X_space operator-(const X_space &A, const X_space &B) { MADNESS_ASSERT(same_size(A, B)); - World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions + auto ax = to_response_matrix(A); + auto bx = to_response_matrix(B); - result.X = A.X - B.X; - result.Y = A.Y - B.Y; - return result; + response_matrix result(B.num_states()); + std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), + [&](auto a, auto b) { return a - b; }); + return to_X_space(result); } - friend X_space operator*(const X_space &A, const double &b) { - World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - - result.X = A.X * b; - result.Y = A.Y * b; - return result; - } + friend X_space operator*(const X_space &A, const double &b) { return b * A; } friend X_space operator*(const double &b, const X_space &A) { World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - - result.X = A.X * b; - result.Y = A.Y * b; - return result; - } - X_space operator*(const double &b) { - this->X *= b; - this->Y *= b; - return *this; + auto r = A.copy(); + auto rX = to_response_matrix(r);// create zero_functions + int i = 0; + for (const auto &ri: rX) { rX[i++] = ri * b; } + return r; + } + // + // C=2*a + // + X_space operator*(const double &b) const { + auto r = this->copy(); + auto rX = to_response_matrix(r);// create zero_functions + int i = 0; + for (const auto &ri: rX) { rX[i++] = ri * b; } + return r; } friend X_space operator*(const X_space &A, const Function &f) { World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - - result.X = A.X * f; - result.Y = A.Y * f; - return result; + X_space result(world, A.n_states, A.n_orbitals); // create zero_functions + auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions + auto ax = to_response_matrix(A); + int i = 0; + for (const auto &ai: ax) { rX[i++] = ai * f; } + return to_X_space(rX); } friend auto operator*(const Function &f, const X_space &A) -> X_space { World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - - result.X = A.X * f; - result.Y = A.Y * f; - return result; + auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions + auto ax = to_response_matrix(A); + int i = 0; + for (const auto &ai: ax) { rX[i++] = f * ai; } + return to_X_space(rX); } friend auto operator*(const X_space &A, const Tensor &b) -> X_space { From ff3e7f3287ad0b110cf4fdefd1d4fa57758b10ca Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 21:51:58 -0500 Subject: [PATCH 0785/1312] remove the ambiguous nightmare --- src/apps/molresponse/x_space.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index d09c44c75c2..9e07c3ede4e 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -55,7 +55,7 @@ namespace madness { /// asynchronous communication and the optional fence is /// collective. [[nodiscard]] auto copy(const std::shared_ptr>> &pmap, - bool fence = false) const -> X_space { + bool fence = false) const -> X_space { auto &world = X[0][0].world(); auto m = to_response_matrix(*this); auto copy_m = create_response_matrix(num_states(), num_orbitals()); @@ -195,6 +195,7 @@ namespace madness { // // C=2*a // + /* X_space operator*(const double &b) const { auto r = this->copy(); auto rX = to_response_matrix(r);// create zero_functions @@ -202,6 +203,7 @@ namespace madness { for (const auto &ri: rX) { rX[i++] = ri * b; } return r; } + */ friend X_space operator*(const X_space &A, const Function &f) { World &world = A.X[0][0].world(); From 5a1351e58df293899d88e52cf0a841acd0dfcb6d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 22:17:18 -0500 Subject: [PATCH 0786/1312] trust the copy --- src/apps/molresponse/x_space.cc | 2 -- src/apps/molresponse/x_space.h | 23 ++++++++++++----------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index c3a6b1d7413..de95c487ebe 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -27,7 +27,6 @@ namespace madness { // to response matrix is intended to provide a shallow copy of the response matrix // to simply reorder the functions auto to_response_matrix(const X_space &x) -> response_matrix { - World &world = x.X[0][0].world(); auto mX = response_matrix(x.num_states()); auto num_orbitals = x.num_orbitals(); int b = 0; @@ -37,7 +36,6 @@ namespace madness { std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals);// shallow copy b++; }); - world.gop.fence(); return mX; } diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 9e07c3ede4e..8152739fd21 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -154,12 +154,12 @@ namespace madness { auto bx = to_response_matrix(B); response_matrix add_x(A.num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](auto a, auto b) { return a + b; }); + [&](const auto &a, const auto &b) { return a + b; }); return to_X_space(add_x); } // C=this-B - X_space operator-(const X_space &B) { + X_space operator-(const X_space &B) const { MADNESS_ASSERT(same_size(*this, B)); auto ax = to_response_matrix(*this); @@ -167,7 +167,7 @@ namespace madness { response_matrix result(B.num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), - [&](auto a, auto b) { return a - b; }); + [&](const auto &a, const auto &b) { return a - b; }); return to_X_space(result); } @@ -176,21 +176,20 @@ namespace madness { auto ax = to_response_matrix(A); auto bx = to_response_matrix(B); - response_matrix result(B.num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), - [&](auto a, auto b) { return a - b; }); + [&](const auto &a, const auto &b) { return a - b; }); return to_X_space(result); } friend X_space operator*(const X_space &A, const double &b) { return b * A; } friend X_space operator*(const double &b, const X_space &A) { World &world = A.X[0][0].world(); - auto r = A.copy(); - auto rX = to_response_matrix(r);// create zero_functions + auto rX = response_matrix(A.n_states);// create zero_functions + auto ax = to_response_matrix(A); // create zero_functions int i = 0; for (const auto &ri: rX) { rX[i++] = ri * b; } - return r; + return to_X_space(rX); } // // C=2*a @@ -207,7 +206,6 @@ namespace madness { friend X_space operator*(const X_space &A, const Function &f) { World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals); // create zero_functions auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions auto ax = to_response_matrix(A); int i = 0; @@ -243,8 +241,11 @@ namespace madness { friend auto inner(const X_space &A, const X_space &B) -> Tensor; void truncate() { - X.truncate_rf(); - Y.truncate_rf(); + auto rx = to_response_matrix(*this); + auto &world = rx[0][0].world(); + std::for_each(rx.begin(), rx.end(), [&](auto &xi) { + madness::truncate(world, xi, FunctionDefaults<3>::get_thresh(), true); + }); } auto norm2s() -> Tensor { From 946b763f8cb99f82f68a4f94dc38327567ea6d98 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 22:17:33 -0500 Subject: [PATCH 0787/1312] trust the copy --- src/apps/molresponse/x_space.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index de95c487ebe..a62f08a409d 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -84,7 +84,6 @@ namespace madness { std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin()); b++; }; - world.gop.fence(); return x_space; } From eb74e85c1c47fa44b59386e52148a6ea64ce6f0e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 22:19:10 -0500 Subject: [PATCH 0788/1312] ambiguous overload --- src/apps/molresponse/x_space.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 8152739fd21..1dcd50d8e78 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -158,6 +158,7 @@ namespace madness { return to_X_space(add_x); } + /* // C=this-B X_space operator-(const X_space &B) const { MADNESS_ASSERT(same_size(*this, B)); @@ -170,6 +171,7 @@ namespace madness { [&](const auto &a, const auto &b) { return a - b; }); return to_X_space(result); } + */ friend X_space operator-(const X_space &A, const X_space &B) { MADNESS_ASSERT(same_size(A, B)); From 387a734b9f0deccb5bf5c050ed31e1ee39cf9fdb Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 21 Nov 2022 22:29:12 -0500 Subject: [PATCH 0789/1312] multiply bug --- src/apps/molresponse/x_space.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 1dcd50d8e78..e06eb7d7f7b 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -190,7 +190,7 @@ namespace madness { auto rX = response_matrix(A.n_states);// create zero_functions auto ax = to_response_matrix(A); // create zero_functions int i = 0; - for (const auto &ri: rX) { rX[i++] = ri * b; } + for (const auto &ai: ax) { rX[i++] = ai * b; } return to_X_space(rX); } // From e20e502b86e4a427efa3d9fe2a6798cae2963318 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 09:07:54 -0500 Subject: [PATCH 0790/1312] operations before apply bsh --- src/apps/molresponse/FrequencyResponse.cpp | 40 ++++++++++------------ src/apps/molresponse/response_functions.h | 20 +++++++---- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6a842c9e1a7..086dfebf3a2 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -51,8 +51,9 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + kain_x_space.push_back( + XNonlinearSolver( + response_matrix_allocator(world, 2 * n), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -306,41 +307,40 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { - print("--------------- BSH UPDATE RESPONSE------------------"); - } + if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } size_t m = theta_X.X.size(); size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; - - theta_X.X += theta_X.X * x_shifts; theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; - - if (world.rank() == 0) { - print("--------------- ThetaX.X------------------"); - } + world.gop.fence(); + if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } + world.gop.fence(); - if (world.rank() == 0) { - print("--------------- ThetaX.Y------------------"); - } + if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } // apply bsh X_space bsh_X(world, m, n); - + bsh_x_ops.insert(bsh_x_ops.end(), std::make_move_iterator(bsh_y_ops.begin()), + std::make_move_iterator(bsh_y_ops.end())); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } + if (compute_y) { + auto VX = to_response_matrix(bsh_X); + std::copy() bsh_x_ops for (const auto &vxb: VX) { apply(world, bsh_x_ops, vxb); } - if (world.rank() == 0) { - print("--------------- Apply BSH------------------"); + + bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + + if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { @@ -348,9 +348,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { bsh_X.Y = bsh_X.X.copy(); } - if (world.rank() == 0) { - print("--------------- Project BSH------------------"); - } + if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 2aad44007e7..c9b395b9ab5 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -175,20 +175,27 @@ namespace madness { friend response_space operator*(response_space y, double a) { World &world = y.x.at(0).at(0).world(); response_space result = y.copy();// deep copy - for (unsigned int i = 0; i < y.num_states; i++) { madness::scale(world, result[i], a); } + for (unsigned int i = 0; i < y.num_states; i++) { + madness::scale(world, result[i], a, false); + } + world.gop.fence(); return result; } friend response_space operator*(double a, response_space y) { World &world = y.x.at(0).at(0).world(); response_space result = y.copy();// deep copy - for (unsigned int i = 0; i < y.num_states; i++) { madness::scale(world, result[i], a); } + for (unsigned int i = 0; i < y.num_states; i++) { + madness::scale(world, result[i], a, false); + } + world.gop.fence(); return result; } response_space &operator*=(double a) { World &world = this->x[0][0].world(); - for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a); } + for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a,false); } + world.gop.fence(); return *this; } @@ -197,9 +204,7 @@ namespace madness { friend response_space operator*(const response_space &a, const Function &f) { World &world = a.x.at(0).at(0).world(); response_space result(world, a.num_states, a.num_orbitals);// create zero_functions - for (unsigned int i = 0; i < a.num_states; i++) { - result[i] = a[i] * f; - } + for (unsigned int i = 0; i < a.num_states; i++) { result[i] = a[i] * f; } return result; } @@ -231,8 +236,9 @@ namespace madness { // KAIN must have this response_space &operator+=(const response_space &b) { MADNESS_ASSERT(same_size(*this, b)); - World &world = x[0][0].world(); + auto &world = x[0][0].world(); for (size_t i = 0; i < num_states; i++) { this->x[i] += b[i]; } + world.gop.fence(); return *this; } From da31c49b29d3f3b056d4e2f7f808396eed5239e7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 09:47:56 -0500 Subject: [PATCH 0791/1312] fix bshy --- src/apps/molresponse/FrequencyResponse.cpp | 8 +------- src/apps/molresponse/global_functions.cc | 2 ++ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 086dfebf3a2..4b0dda98249 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -332,13 +332,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, std::make_move_iterator(bsh_y_ops.end())); bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } - if (compute_y) { - auto VX = to_response_matrix(bsh_X); - std::copy() bsh_x_ops for (const auto &vxb: VX) { apply(world, bsh_x_ops, vxb); } - - - bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - } + if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index a1b8d926cc2..65f85f12434 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -157,6 +157,7 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput }); } } + world.gop.fence(); vecfuncT x_vector(n_exchange); vecfuncT x_vector_conjugate(n_exchange); @@ -184,6 +185,7 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput } } } + world.gop.fence(); vecfuncT phi_left(n_exchange); for (long b = 0; b < num_states; b++) { From 2a05fff7867fb515096d48608b02fb1baa3b3e71 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 10:14:16 -0500 Subject: [PATCH 0792/1312] debug apply step --- src/apps/molresponse/FrequencyResponse.cpp | 2 ++ src/madness/mra/vmra.h | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 4b0dda98249..3a04bf5eae5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -328,8 +328,10 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } // apply bsh X_space bsh_X(world, m, n); + /* bsh_x_ops.insert(bsh_x_ops.end(), std::make_move_iterator(bsh_y_ops.begin()), std::make_move_iterator(bsh_y_ops.end())); + */ bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index 23c16efb55b..b23953cbe77 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -777,7 +777,7 @@ namespace madness { Tensor< TENSOR_RESULT_TYPE(T,R) > matrix_inner(World& world, const std::vector< Function >& f, const std::vector< Function >& g, - bool sym=false) + bool sym=false) { world.gop.fence(); compress(world, f); @@ -823,7 +823,7 @@ namespace madness { if (sym) r(j,i) = conj(r(i,j)); } } - + // for (long i=n-1; i>=0; --i) { // long jtop = m; // if (sym) jtop = i+1; @@ -1603,7 +1603,7 @@ namespace madness { return result; } - // BLM first derivative + // BLM first derivative template std::vector > grad_ble_one(const Function& f, bool refine=false, bool fence=true) { @@ -1645,7 +1645,7 @@ namespace madness { return result; } - // Bspline first derivative + // Bspline first derivative template std::vector > grad_bspline_one(const Function& f, bool refine=false, bool fence=true) { From b64ca18ed2c39f5e3597a07377d039f51cd209ab Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 10:34:03 -0500 Subject: [PATCH 0793/1312] tighten convergence --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3a04bf5eae5..ce2b7ef1277 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -20,7 +20,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(40 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(20 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -284,7 +284,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 3)) { + if (r_params.kain() && (iteration > 2)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); } From b677a470b4e768659bd891b086e8d037d8394979 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 11:16:38 -0500 Subject: [PATCH 0794/1312] remove fence from within loop and add it at the end --- src/apps/molresponse/global_functions.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 65f85f12434..80992eebe3a 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -267,11 +267,11 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto phi_phiX_i = vecfuncT(num_orbitals); std::copy(v123.begin() + b_shift, v123.begin() + b_shift + num_orbitals, phi_phiX_i.begin()); - world.gop.fence(); - kij = sum(world, phi_phiX_i, true); + kij = sum(world, phi_phiX_i, false); b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } + world.gop.fence(); if (world.rank() == 0) print("exchange sum"); truncate(world, exchange_vector); world.gop.fence(); From 17b0cd9aeaddc2ddbc7b098a05f069319efbe835 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 13:30:19 -0500 Subject: [PATCH 0795/1312] help compiler with type --- src/apps/molresponse/ResponseBase.cpp | 11 ++--------- src/apps/molresponse/x_space.h | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 9f44b5d605f..723d3de4f41 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -418,8 +418,8 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - world.gop.fence(); Theta_X = (V0X - E0X) + gamma; + world.gop.fence(); Theta_X.truncate(); // Theta_X.truncate(); if (r_params.print_level() >= 1) { @@ -608,7 +608,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // X contains the response vector that makes up the response gammaOrbitals at a // given order - std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); + auto old_pmap = FunctionDefaults<3>::get_pmap(); auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); @@ -657,19 +657,14 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } - // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { auto xc_rho = xc.apply_xc_kernel(rho_alpha); return mul(world, xc_rho, phi0); }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // for every transition gammaOrbitals apply the exchange kernel and multiply the - // vector of orbitals std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); - W.Y = W.X.copy(); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } @@ -727,7 +722,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - J.clear(); K.clear(); W.clear(); @@ -744,7 +738,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } // Done // gamma.truncate(); - world.gop.fence(); return gamma; // Get sizes } diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index e06eb7d7f7b..6f66a63c446 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -98,7 +98,7 @@ namespace madness { auto bx = to_response_matrix(B); response_matrix add_x(num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const auto &a, const auto &b) { return a + b; }); + [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { return a + b; }); return to_X_space(add_x); } From 890b04ceaa92f01e4e108cb3f07964bab205be03 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 13:46:30 -0500 Subject: [PATCH 0796/1312] You gaxpy with false fence --- src/apps/molresponse/x_space.h | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 6f66a63c446..41870320728 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -98,7 +98,10 @@ namespace madness { auto bx = to_response_matrix(B); response_matrix add_x(num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { return a + b; }); + [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { + return gaxpy_oop(1.0, a, 1.0, b, false); + }); + world.gop.fence(); return to_X_space(add_x); } @@ -106,12 +109,15 @@ namespace madness { MADNESS_ASSERT(same_size(*this, B)); auto ax = to_response_matrix(*this); auto bx = to_response_matrix(B); + auto &world = ax[0][0].world(); int b = 0; - std::for_each(ax.begin(), ax.end(), [&](auto &a) { a += bx[b++]; }); + std::for_each(ax.begin(), ax.end(), + [&](auto &a) { gaxpy(world, 1.0, a, 1.0, bx[b++], false); }); + world.gop.fence(); return *this; } - void push_back(vector_real_function_3d x, vector_real_function_3d y) { + void push_back(const vector_real_function_3d &x, const vector_real_function_3d &y) { if (n_orbitals > 0) { MADNESS_ASSERT(n_orbitals == x.size()); MADNESS_ASSERT(n_orbitals == y.size()); @@ -154,7 +160,10 @@ namespace madness { auto bx = to_response_matrix(B); response_matrix add_x(A.num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const auto &a, const auto &b) { return a + b; }); + [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { + return gaxpy_oop(1.0, a, 1.0, b, false); + }); + world.gop.fence(); return to_X_space(add_x); } @@ -175,12 +184,14 @@ namespace madness { friend X_space operator-(const X_space &A, const X_space &B) { MADNESS_ASSERT(same_size(A, B)); - auto ax = to_response_matrix(A); auto bx = to_response_matrix(B); response_matrix result(B.num_states()); std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), - [&](const auto &a, const auto &b) { return a - b; }); + [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { + return gaxpy_oop(1.0, a, -1.0, b, false); + }); + ax[0][0].world().gop.fence(); return to_X_space(result); } @@ -246,8 +257,9 @@ namespace madness { auto rx = to_response_matrix(*this); auto &world = rx[0][0].world(); std::for_each(rx.begin(), rx.end(), [&](auto &xi) { - madness::truncate(world, xi, FunctionDefaults<3>::get_thresh(), true); + madness::truncate(world, xi, FunctionDefaults<3>::get_thresh(), false); }); + world.gop.fence(); } auto norm2s() -> Tensor { From b13558e0b31fa685883bcac29c9574c63154b0de Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 14:23:46 -0500 Subject: [PATCH 0797/1312] set tol to Function default not 0.0 in exchange --- src/apps/molresponse/global_functions.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 80992eebe3a..69a31814105 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -238,23 +238,25 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br reconstruct(world, fp, false); if (world.rank() == 0) { print("exchange reconstruct tree"); } world.gop.fence(); + /* norm_tree(world, ket_i, false); norm_tree(world, bra_i, false); norm_tree(world, fp, false); - world.gop.fence(); + */ if (world.rank() == 0) { print("exchange norm tree"); } const double lo = 1.0e-10; + auto tol = FunctionDefaults<3>::get_thresh(); auto poisson = set_poisson(world, lo); world.gop.fence(); if (world.rank() == 0) { print("create poisson v23"); } auto v23 = mul(world, bra_i, fp, true); //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } - truncate(world, v23, 0.0, true); + truncate(world, v23, tol, true); if (world.rank() == 0) { print("truncate v23"); } v23 = apply(world, *poisson, v23); if (world.rank() == 0) { print("apply v23"); } - truncate(world, v23, 0.0, true); + truncate(world, v23, tol, true); if (world.rank() == 0) { print("truncate after apply v23"); } auto v123 = mul(world, ket_i, v23, true); if (world.rank() == 0) { print("multiply apply v123"); } @@ -273,8 +275,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br } world.gop.fence(); if (world.rank() == 0) print("exchange sum"); - truncate(world, exchange_vector); - world.gop.fence(); + truncate(world, exchange_vector, tol, true); molresponse::end_timer(world, "exchange apply"); molresponse::start_timer(world); From 4f6ef482b060f02f6d9441834ed0d9f62553b6e6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 22 Nov 2022 15:18:43 -0500 Subject: [PATCH 0798/1312] compute gamma full --- src/apps/molresponse/ResponseBase.cpp | 11 ++++------- src/apps/molresponse/x_space.cc | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 723d3de4f41..6f85c0edbc2 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -560,10 +560,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit QProjector projector(world, phi0); for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); - gamma.Y[i] = projector(gamma.Y[i]); } world.gop.fence(); - + for (size_t i = 0; i < num_states; i++) { + gamma.Y[i] = projector(gamma.Y[i]); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -587,16 +588,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit j_y.clear(); K.clear(); W.clear(); - chi_alpha.clear(); phi0.clear(); - + molresponse::end_timer(world, "Clear functions and set old pmap"); if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - molresponse::end_timer(world, "Clear functions and set old pmap"); - // Done - world.gop.fence(); //gamma.truncate(); return gamma; // Get sizes diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index a62f08a409d..17f8896a607 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -149,8 +149,8 @@ namespace madness { int p = 0; std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) { result += matrix_inner(world, ati, b_transpose[p++]); + world.gop.fence(); }); - world.gop.fence(); return result; } }// namespace madness From e6c1b951fa137e57035b1b7841b393ad2bca4266 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 12:59:41 -0500 Subject: [PATCH 0799/1312] fence the sum in exchange --- src/apps/molresponse/global_functions.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 69a31814105..f3d88f57848 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -269,11 +269,10 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto phi_phiX_i = vecfuncT(num_orbitals); std::copy(v123.begin() + b_shift, v123.begin() + b_shift + num_orbitals, phi_phiX_i.begin()); - kij = sum(world, phi_phiX_i, false); + kij = sum(world, phi_phiX_i, true); b++; // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } - world.gop.fence(); if (world.rank() == 0) print("exchange sum"); truncate(world, exchange_vector, tol, true); molresponse::end_timer(world, "exchange apply"); From cd00ef3625e33c4af3f368773371576f997da063 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 13:26:44 -0500 Subject: [PATCH 0800/1312] new iterator sum using gaxpy --- src/apps/molresponse/global_functions.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f3d88f57848..188ddb38160 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -264,15 +264,17 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto exchange_vector = vecfuncT(n_exchange); long b = 0; long b_shift = 0; + compress(world, v123); for (auto &kij: exchange_vector) { b_shift = b * num_orbitals; auto phi_phiX_i = vecfuncT(num_orbitals); - std::copy(v123.begin() + b_shift, v123.begin() + b_shift + num_orbitals, - phi_phiX_i.begin()); - kij = sum(world, phi_phiX_i, true); + // this right here is a sketch of how sums with iterators could work + kij = FunctionFactory(world).compressed(); + std::for_each(v123.begin() + b_shift, v23.begin() + b_shift + num_orbitals, + [&](const auto &v123_i) { kij.gaxpy(1.0, v123_i, 1.0, false); }); b++; - // option to use inner product kij=std::inner_product(phi_phiX.begin()+(b*x.num_orbitals()),phi_phiX.begin()+(b*x.num_orbitals(),) } + world.gop.fence(); if (world.rank() == 0) print("exchange sum"); truncate(world, exchange_vector, tol, true); molresponse::end_timer(world, "exchange apply"); From 3197033d0c069705a97f9a119efccd1951af0ec2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 13:34:11 -0500 Subject: [PATCH 0801/1312] fix the bug --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 188ddb38160..553b675bae1 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -270,7 +270,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto phi_phiX_i = vecfuncT(num_orbitals); // this right here is a sketch of how sums with iterators could work kij = FunctionFactory(world).compressed(); - std::for_each(v123.begin() + b_shift, v23.begin() + b_shift + num_orbitals, + std::for_each(v123.begin() + b_shift, v123.begin() + b_shift + num_orbitals, [&](const auto &v123_i) { kij.gaxpy(1.0, v123_i, 1.0, false); }); b++; } From 9ef1359021c7dfe86e6c5e9509d00876ce72127e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 14:27:28 -0500 Subject: [PATCH 0802/1312] density changes --- src/apps/molresponse/FrequencyResponse.cpp | 14 -------- src/apps/molresponse/ResponseBase.cpp | 40 ++++------------------ src/apps/molresponse/x_space.cc | 8 ++--- 3 files changed, 10 insertions(+), 52 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ce2b7ef1277..26236367b6f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -196,29 +196,15 @@ void FrequencyResponse::iterate(World &world) { } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - bsh_residualsX = copy(new_res.residual_norms); bsh_residualsY = copy(new_res.residual_norms); Chi = new_chi.copy(); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - xij_res_norms = new_res.residual.component_norm2s(); xij_norms = Chi.component_norm2s(); - density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); - /* - max_rotation = (bsh_residualsX + bsh_residualsY) ; - for (size_t i = 0; i < Chi.num_states(); i++) { - if (max_rotation[i] < r_params.max_rotation()) { - max_rotation[i] = r_params.max_rotation(); - print("less than max_rotation....set to max_rotation"); - } - } - */ - Tensor polar = -2 * inner(Chi, PQ); if (r_params.print_level() >= 20) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6f85c0edbc2..ee361627c10 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -298,18 +298,14 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto density = vector_real_function_3d(chi.num_states()); auto calc_type = r_params.calc_type(); if (calc_type == "full" || "static") { - auto r_matrix = to_response_matrix(chi); auto r_phi0 = to_response_vector(ground_orbitals); - std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), - [&](const auto &ri) { return dot(world, ri, r_phi0); }); - + [&](const auto &ri) { return dot(world, ri, r_phi0,true); }); } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } truncate(world, density); - world.gop.fence(); return density; } @@ -558,13 +554,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, phi0); - for (size_t i = 0; i < num_states; i++) { - gamma.X[i] = projector(gamma.X[i]); - } + for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } world.gop.fence(); - for (size_t i = 0; i < num_states; i++) { - gamma.Y[i] = projector(gamma.Y[i]); - } + for (size_t i = 0; i < num_states; i++) { gamma.Y[i] = projector(gamma.Y[i]); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -1147,32 +1139,12 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, Xvector = to_response_matrix(chi); Xresidual = to_response_matrix(residual_chi); response_matrix update(m); - for (auto &update_i: update) { update_i = vector_real_function_3d(n); } - if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } - int b = 0; - std::transform(Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), - [&](auto &xi, auto &ri) { return kain_x_space[b++].update(xi, ri); }); - - /* - std::for_each(kain_x_space.begin(), kain_x_space.end(), [&](auto &ki) { - auto kain_X = ki.update(Xvector[b], Xresidual[b]); - update[b] = copy(world, kain_X); - b++; - }); - */ + std::transform( + Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), + [&](const auto &xi, const auto &ri) { return kain_x_space[b++].update(xi, ri); }); kain_update = to_X_space(update); - - /* - for (size_t b = 0; b < m; b++) { - // passing xvectors - X_vector kain_X = kain_x_space[b].update(Xvector[b], Xresidual[b]); - // deep copy of vector of functions - kain_update.X[b] = copy(world, kain_X.X[0]); - kain_update.Y[b] = copy(world, kain_X.Y[0]); - } - */ if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 17f8896a607..a69b443c6de 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -10,10 +10,10 @@ namespace madness { auto &world = vec[0].world(); // copy the vector auto response_vector = copy(world, vec); - // copy the vector - std::for_each(vec.begin(), vec.end(), [&](const auto &phi0_i) { - response_vector.push_back(madness::copy(phi0_i)); + std::for_each(vec.begin(), vec.end(), [&](const real_function_3d &phi0_i) { + response_vector.push_back(madness::copy(phi0_i,false)); }); + world.gop.fence(); return response_vector; } auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) @@ -30,7 +30,7 @@ namespace madness { auto mX = response_matrix(x.num_states()); auto num_orbitals = x.num_orbitals(); int b = 0; - std::for_each(mX.begin(), mX.end(), [&](auto &mi) { + std::for_each(mX.begin(), mX.end(), [&](vector_real_function_3d &mi) { mi = vector_real_function_3d(2 * num_orbitals); std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); // shallow copy std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals);// shallow copy From 214463c49510faf6ee9c205fbc251db45d148676 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 14:51:56 -0500 Subject: [PATCH 0803/1312] Some printing for debugging --- src/apps/molresponse/ResponseBase.cpp | 6 +++++- src/apps/molresponse/x_space.cc | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ee361627c10..2e37dcff2fb 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -299,13 +299,17 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto calc_type = r_params.calc_type(); if (calc_type == "full" || "static") { auto r_matrix = to_response_matrix(chi); + if (world.rank() == 0) { print("make density: to response matrix"); } auto r_phi0 = to_response_vector(ground_orbitals); + if (world.rank() == 0) { print("make density: to response vector"); } std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), - [&](const auto &ri) { return dot(world, ri, r_phi0,true); }); + [&](const auto &ri) { return dot(world, ri, r_phi0, true); }); } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } + if (world.rank() == 0) { print("make density: made density"); } truncate(world, density); + if (world.rank() == 0) { print("make density: truncate"); } return density; } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index a69b443c6de..fb355cb654a 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -11,7 +11,7 @@ namespace madness { // copy the vector auto response_vector = copy(world, vec); std::for_each(vec.begin(), vec.end(), [&](const real_function_3d &phi0_i) { - response_vector.push_back(madness::copy(phi0_i,false)); + response_vector.push_back(madness::copy(phi0_i,true)); }); world.gop.fence(); return response_vector; From a544c79fd1cb3d6df36f5616a8a525861844e0f3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 16:33:19 -0500 Subject: [PATCH 0804/1312] separate the gamma additions for debugging --- src/apps/molresponse/ResponseBase.cpp | 19 ++++++++----------- src/apps/molresponse/x_space.h | 19 +++++++------------ 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2e37dcff2fb..0f2dafa737e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -540,21 +540,18 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } molresponse::start_timer(world); - - /* - if (r_params.print_level() >= 20) { print_inner(world, "new xKx", chi_alpha, K); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - */ - - X_space gamma(world, num_states, num_orbitals); - gamma = (2 * J) - K * xcf.hf_exchange_coefficient() + W; + auto c_xc = xcf.hf_exchange_coefficient(); + gamma = 2 * J; + if (world.rank() == 0) { print("gamma: 2 * J"); } + gamma += -c_xc * K; + if (world.rank() == 0) { print("gamma: += -c_xc * K"); } + gamma += W; + if (world.rank() == 0) { print("gamma: += W"); } //gamma.truncate(); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); + molresponse::end_timer(world, "gamma add", "gamma_truncate_add", iter_timing); } - // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, phi0); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 41870320728..b1da4b425eb 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -195,8 +195,7 @@ namespace madness { return to_X_space(result); } - friend X_space operator*(const X_space &A, const double &b) { return b * A; } - friend X_space operator*(const double &b, const X_space &A) { + friend X_space operator*(const X_space &A, const double &b) { World &world = A.X[0][0].world(); auto rX = response_matrix(A.n_states);// create zero_functions auto ax = to_response_matrix(A); // create zero_functions @@ -204,18 +203,14 @@ namespace madness { for (const auto &ai: ax) { rX[i++] = ai * b; } return to_X_space(rX); } - // - // C=2*a - // - /* - X_space operator*(const double &b) const { - auto r = this->copy(); - auto rX = to_response_matrix(r);// create zero_functions + friend X_space operator*(const double &b, const X_space &A) { + World &world = A.X[0][0].world(); + auto rX = response_matrix(A.n_states);// create zero_functions + auto ax = to_response_matrix(A); // create zero_functions int i = 0; - for (const auto &ri: rX) { rX[i++] = ri * b; } - return r; + for (const auto &ai: ax) { rX[i++] = b * ai; } + return to_X_space(rX); } - */ friend X_space operator*(const X_space &A, const Function &f) { World &world = A.X[0][0].world(); From 18f08e69e7328e313631a9b7388c334496ce9c34 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 17:00:40 -0500 Subject: [PATCH 0805/1312] debugging --- src/apps/molresponse/ResponseBase.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 0f2dafa737e..93dc25fce7b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -60,9 +60,13 @@ void ResponseBase::check_k(World &world, double thresh, int k) { if (FunctionDefaults<3>::get_k() != ground_orbitals[0].k()) { // Re-read orbitals from the archive (assuming // the archive has orbitals stored at a higher + if (world.rank() == 0) { print("check k: ground orbitals"); } // k value than what was previously computed ground_calc.read(world); + if (world.rank() == 0) { print("check k: read ground orbitals"); } + // k value than what was previously computed reconstruct(world, ground_orbitals); + if (world.rank() == 0) { print("check k: reconstruct ground orbitals"); } // Reset correct k (its set in g_params.read) FunctionDefaults<3>::set_k(k); // Project each ground state to correct k @@ -70,17 +74,22 @@ void ResponseBase::check_k(World &world, double thresh, int k) { orbital = project(orbital, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); + if (world.rank() == 0) { print("check k: project ground orbitals"); } // Clean up a bit truncate(world, ground_orbitals); + if (world.rank() == 0) { print("check k: truncate ground orbitals"); } // Now that ground orbitals have correct k lets make the ground density // again ground_density = make_ground_density(world); + if (world.rank() == 0) { print("check k: make ground density"); } // Ground state orbitals changed, clear old hamiltonian redo = true; } // Recalculate ground state hamiltonian here if (redo or !hamiltonian.has_data()) { + if (world.rank() == 0) { print("check k: re-do hamiltonian"); } auto [HAM, HAM_NO_DIAG] = ComputeHamiltonianPair(world); + if (world.rank() == 0) { print("check k: output hamiltonian"); } // TODO this doesn't seem right... hamiltonian = HAM; ham_no_diag = HAM_NO_DIAG; @@ -106,8 +115,10 @@ void ResponseBase::check_k(World &world, double thresh, int k) { // Don't forget the mask function as well if (FunctionDefaults<3>::get_k() != mask.k()) { mask = project(mask, FunctionDefaults<3>::get_k(), thresh, false); + if (world.rank() == 0) { print("check k: project mask"); } } ::check_k(world, Chi, thresh, k); + if (world.rank() == 0) { print("check k: project Chi"); } // Make sure everything is done before leaving world.gop.fence(); @@ -265,11 +276,11 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const auto ResponseBase::make_ground_density(World &world) const -> functionT { - std::vector vsq = square(world, ground_orbitals); + auto vsq = square(world, ground_orbitals); compress(world, vsq); functionT rho = factoryT(world); rho.compress(); - for (unsigned int i = 0; i < vsq.size(); ++i) { rho.gaxpy(1.0, vsq[i], 1.0, false); } + for (const auto &vsq_i: vsq) { rho.gaxpy(1.0, vsq_i, 1.0, false); } //for (const auto &phi_squared: vsq) rho.gaxpy(2.0, phi_squared, 1.0, false); world.gop.fence(); vsq.clear(); From 73051c64c666a9652c0e03a7cbfe9357846243dd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 17:32:01 -0500 Subject: [PATCH 0806/1312] v0x debugging --- src/apps/molresponse/ResponseBase.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 93dc25fce7b..0c74d395364 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1048,12 +1048,19 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; - V0.X = v0 * X.X; - V0.X += -1 * K0.X * xcf.hf_exchange_coefficient(); + auto c_xc = xcf.hf_exchange_coefficient(); if (compute_Y) { - V0.Y = v0 * X.Y; - V0.Y += (-1 * K0.Y * xcf.hf_exchange_coefficient()); + + V0 = v0 * X; + if (world.rank() == 0) { print("vox: v0=v0*X"); } + V0 += -c_xc * K0; + if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } + } else { + V0.X = v0 * X.X; + if (world.rank() == 0) { print("vox: v0=v0*X"); } + V0.X += -c_xc * K0.X; + if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } V0.Y = V0.X.copy(); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", Chi_copy, V0); } From b3c2aea280b1f9f0cf548c17423abc6dae10faf7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 17:39:29 -0500 Subject: [PATCH 0807/1312] some fencing in the read operation --- src/apps/molresponse/ground_parameters.h | 51 +++++++++++++----------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/apps/molresponse/ground_parameters.h b/src/apps/molresponse/ground_parameters.h index d60c1fae7bc..9e64a80f4da 100644 --- a/src/apps/molresponse/ground_parameters.h +++ b/src/apps/molresponse/ground_parameters.h @@ -8,11 +8,11 @@ #include -#include "madness/chem/NWChem.h"// For nwchem interface -#include "madness/chem/SCFOperators.h" #include "../chem/molecule.h" #include "Plot_VTK.h" #include "basic_operators.h" +#include "madness/chem/NWChem.h"// For nwchem interface +#include "madness/chem/SCFOperators.h" #include "madness/chem/pointgroupsymmetry.h" #include "madness/chem/potentialmanager.h" #include "madness/chem/projector.h"// For easy calculation of (1 - \hat{\rho}^0) @@ -25,24 +25,24 @@ using namespace madness; class GroundStateCalculation { // Ground state parameters that are read in from archive std::string inFile{"../moldft.restartdata"};///< Name of input archive to read in ground state - bool spinrestricted{true}; ///< Indicates if ground state calc. was open or closed + bool spinrestricted{true};///< Indicates if ground state calc. was open or closed ///< shell - unsigned int num_orbitals{}; ///< Number of orbitals in ground state - Tensor energies{}; ///< Energy of ground state orbitals - Tensor occ{}; ///< Occupancy of ground state orbitals - double L{}; ///< Box size of ground state - response calcluation is in same box - int k{}; ///< Order of polynomial used in ground state - Molecule molecule_in{};///< The molecule used in ground state calculation + unsigned int num_orbitals{};///< Number of orbitals in ground state + Tensor energies{}; ///< Energy of ground state orbitals + Tensor occ{}; ///< Occupancy of ground state orbitals + double L{}; ///< Box size of ground state - response calcluation is in same box + int k{}; ///< Order of polynomial used in ground state + Molecule molecule_in{}; ///< The molecule used in ground state calculation std::vector g_orbitals{};///< The ground state orbitals std::string xc{}; ///< Name of xc functional used in ground state - std::string localize_method{}; ///< Name of xc functional used in ground state + std::string localize_method{}; ///< Name of xc functional used in ground state // Default constructor public: explicit GroundStateCalculation(World &world) { read(world); } explicit GroundStateCalculation(World &world, const std::string &input_file) - : inFile{input_file} { + : inFile{input_file} { read(world); } @@ -79,18 +79,18 @@ class GroundStateCalculation { std::vector dummy2; archive::ParallelInputArchive input(world, inFile.c_str()); - input & dummyversion; - input & dummy1; // double - input & spinrestricted;// bool - input & L; // double box size - input & k; // int wavelet order - input & molecule_in; // Molecule - input & xc; // std:string xc functional - input & localize_method;// std:string localize method - input & num_orbitals; // int - input & energies; // Tensor orbital energies - input & occ; // Tensor orbital occupations - input & dummy2; // std::vector sets of orbitals(?) + input &dummyversion; + input &dummy1; // double + input &spinrestricted; // bool + input &L; // double box size + input &k; // int wavelet order + input &molecule_in; // Molecule + input &xc; // std:string xc functional + input &localize_method;// std:string localize method + input &num_orbitals; // int + input &energies; // Tensor orbital energies + input &occ; // Tensor orbital occupations + input &dummy2; // std::vector sets of orbitals(?) // Check that order is positive and less than 30 if (k < 1 or k > 30) { @@ -105,13 +105,16 @@ class GroundStateCalculation { FunctionDefaults<3>::set_k(k); // Possible to call this function multiple times now // Do this to ensure everything works. + world.gop.fence(); g_orbitals.clear(); + world.gop.fence(); // Read in ground state orbitals for (unsigned int i = 0; i < num_orbitals; i++) { real_function_3d reader; - input & reader; + input &reader; g_orbitals.push_back(reader); } + world.gop.fence(); //projector_irrep c2v("c2v"); //g_orbitals = c2v(g_orbitals); // Clean up From 940fb88f9b028c203d74c036c1d1985eb8168046 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 18:05:30 -0500 Subject: [PATCH 0808/1312] more printing --- src/apps/molresponse/FrequencyResponse.cpp | 8 ++++++++ src/apps/molresponse/x_space.h | 3 +-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 26236367b6f..649ef687f99 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -197,15 +197,23 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bsh_residualsX = copy(new_res.residual_norms); + if (world.rank() == 0) { print("copy tensors: bshX"); } bsh_residualsY = copy(new_res.residual_norms); + if (world.rank() == 0) { print("copy tensors: bshY"); } Chi = new_chi.copy(); + if (world.rank() == 0) { print("copy chi:"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } + xij_res_norms = new_res.residual.component_norm2s(); + if (world.rank() == 0) { print("computing residuals: xij residuals"); } xij_norms = Chi.component_norm2s(); + if (world.rank() == 0) { print("computing chi norms: xij residuals"); } density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); + if (world.rank() == 0) { print("computing residuals: density residuals"); } Tensor polar = -2 * inner(Chi, PQ); + if (world.rank() == 0) { print("computing polarizability:"); } if (r_params.print_level() >= 20) { auto [eval, evec] = syev(polar); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index b1da4b425eb..43a4e5185ea 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -269,9 +269,8 @@ namespace madness { return norms; } - auto component_norm2s() const -> Tensor { + [[nodiscard]] auto component_norm2s() const -> Tensor { World &world = X[0][0].world(); - auto rx = to_flattened_vector(*this); auto norms = norm2s_T(world, rx); return norms.reshape(n_states, 2 * n_orbitals); From 1b624ac7ddfae222dfef70b9d146440c13361f6d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 23 Nov 2022 18:57:48 -0500 Subject: [PATCH 0809/1312] curious if this will improve convergence by not truncating small coefficients before applying in exchange --- src/apps/molresponse/global_functions.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 553b675bae1..1565902ea43 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -252,7 +252,8 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto v23 = mul(world, bra_i, fp, true); //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } - truncate(world, v23, tol, true); + //truncate(world, v23, tol, true); + // truncate if (world.rank() == 0) { print("truncate v23"); } v23 = apply(world, *poisson, v23); if (world.rank() == 0) { print("apply v23"); } From 3d3afaaaeac4e9b3fbbb0b67fac676598ef55a80 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 28 Nov 2022 14:23:56 -0500 Subject: [PATCH 0810/1312] Re-writing using scale --- src/apps/molresponse/x_space.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 43a4e5185ea..6e0f65e235d 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -208,7 +208,12 @@ namespace madness { auto rX = response_matrix(A.n_states);// create zero_functions auto ax = to_response_matrix(A); // create zero_functions int i = 0; - for (const auto &ai: ax) { rX[i++] = b * ai; } + for (const vector_real_function_3d &ai: ax) { + rX[i] = madness::copy(world, ai, true); + scale(world, rX[i], b, false); + } + // b* ai is bugged. scale does not fence + world.gop.fence(); return to_X_space(rX); } From 262cbfe986c3968f8cd9acde55d9da28de3bef9c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 28 Nov 2022 14:26:54 -0500 Subject: [PATCH 0811/1312] Re-writing using scale --- src/apps/molresponse/x_space.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 6e0f65e235d..61ea89959c3 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -200,7 +200,11 @@ namespace madness { auto rX = response_matrix(A.n_states);// create zero_functions auto ax = to_response_matrix(A); // create zero_functions int i = 0; - for (const auto &ai: ax) { rX[i++] = ai * b; } + for (const vector_real_function_3d &ai: ax) { + rX[i] = madness::copy(world, ai, true); + scale(world, rX[i], b, false); + i++; + } return to_X_space(rX); } friend X_space operator*(const double &b, const X_space &A) { @@ -211,6 +215,7 @@ namespace madness { for (const vector_real_function_3d &ai: ax) { rX[i] = madness::copy(world, ai, true); scale(world, rX[i], b, false); + i++; } // b* ai is bugged. scale does not fence world.gop.fence(); From 5114d25c12d6d2dbde459225bf61c17f815f093b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 28 Nov 2022 17:14:41 -0500 Subject: [PATCH 0812/1312] slightly faster --- src/apps/molresponse/x_space.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 61ea89959c3..7bda5b527b7 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -66,11 +66,14 @@ namespace madness { // assignment auto operator=(const X_space &B) -> X_space & { if (this != &B) {// is it the same object? + this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - this->X = B.X; - this->Y = B.Y; + auto xf = to_response_matrix(*this); + auto xb = to_response_matrix(B); + + xf = xb; } return *this;// NO SHALLOW COPIES } @@ -227,7 +230,8 @@ namespace madness { auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions auto ax = to_response_matrix(A); int i = 0; - for (const auto &ai: ax) { rX[i++] = ai * f; } + for (const auto &ai: ax) { rX[i++] = mul(world, f, ai, false); } + world.gop.fence(); return to_X_space(rX); } friend auto operator*(const Function &f, const X_space &A) -> X_space { @@ -235,7 +239,8 @@ namespace madness { auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions auto ax = to_response_matrix(A); int i = 0; - for (const auto &ai: ax) { rX[i++] = f * ai; } + for (const auto &ai: ax) { rX[i++] = mul(world, f, ai, false); } + world.gop.fence(); return to_X_space(rX); } From 505b52e356e60d809a74210ae70e8eec552a9417 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 28 Nov 2022 17:20:18 -0500 Subject: [PATCH 0813/1312] let me not break everything --- src/apps/molresponse/x_space.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 7bda5b527b7..6b9bacb2822 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -70,10 +70,8 @@ namespace madness { this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - auto xf = to_response_matrix(*this); - auto xb = to_response_matrix(B); - - xf = xb; + this->X = B.X; + this->Y = B.Y; } return *this;// NO SHALLOW COPIES } From ea74f489df79cb92cf5582e025d4f8bf78952d59 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 28 Nov 2022 17:24:27 -0500 Subject: [PATCH 0814/1312] make sure i return this by this from response matrix assignment --- src/apps/molresponse/x_space.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 6b9bacb2822..75a65c9730e 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -70,8 +70,10 @@ namespace madness { this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - this->X = B.X; - this->Y = B.Y; + auto xf = to_response_matrix(*this); + auto xb = to_response_matrix(B); + xf = xb; + *this = to_X_space(xf); } return *this;// NO SHALLOW COPIES } From 592595195d4ba6b16236859816a8f7967ad36007 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 10:22:19 -0500 Subject: [PATCH 0815/1312] Truncate 100x more than than function default --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 1565902ea43..8ded34c8fe4 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -252,7 +252,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto v23 = mul(world, bra_i, fp, true); //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } - //truncate(world, v23, tol, true); + truncate(world, v23, 0.01 * tol, true); // truncate if (world.rank() == 0) { print("truncate v23"); } v23 = apply(world, *poisson, v23); From 77c6ebcca6077962a4f4b009f3a7b7978ec9a09b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 10:32:01 -0500 Subject: [PATCH 0816/1312] mostly formatting --- src/apps/molresponse/testing/runners.hpp | 108 ++++++++--------------- 1 file changed, 37 insertions(+), 71 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2fc9b9a8c6f..f2134490fb2 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -30,7 +30,6 @@ auto split(const std::string &s, char delim) -> vector { } auto addPath(const path &root, const std::string &branch) -> path { - path p_branch = root; p_branch += branch; return p_branch; @@ -46,21 +45,15 @@ struct runSchema { ResponseDataBase rdb; explicit runSchema(World &world, const std::string &xc) { - root = std::filesystem::current_path();//="/"+molecule_name; molecule_path = root; molecule_path += "/molecules"; - xc_path = addPath(root, "/" + xc); world.gop.fence(); if (std::filesystem::exists(xc_path)) { - if (world.rank() == 0) { - std::cout << "XC Directory Exists" << std::endl; - } + if (world.rank() == 0) { std::cout << "XC Directory Exists" << std::endl; } } else { - if (world.rank() == 0) { - std::cout << "Creating XC directory" << std::endl; - } + if (world.rank() == 0) { std::cout << "Creating XC directory" << std::endl; } std::filesystem::create_directory(xc_path); } @@ -68,34 +61,23 @@ struct runSchema { freq_json = addPath(molecule_path, "/frequency.json"); dalton_excited_json = addPath(molecule_path, "/dalton-excited.json"); dalton_dipole_json = addPath(molecule_path, "/dalton-dipole.json"); - rdb = ResponseDataBase(); - - if (std::filesystem::exists(freq_json)) { std::ifstream ifs(freq_json); json j_read; ifs >> j_read; rdb.set_data(j_read); - - if (world.rank() == 0) { std::cout << "Trying to read frequency.json" << std::endl; std::cout << "READ IT" << std::endl; } - } else { - if (world.rank() == 0) { - std::cout << "did not find frequency.json" << std::endl; - } - } - if (world.rank() == 0) { - print(); + if (world.rank() == 0) { std::cout << "did not find frequency.json" << std::endl; } } + if (world.rank() == 0) { print(); } } void print() const { - ::print("------------Database Runner---------------"); ::print("Root: ", root); ::print("Molecule Directory: ", molecule_path); @@ -119,9 +101,9 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(World &world, const std::string &molecule_name, const std::string &m_xc, const runSchema &schema) - : mol_name(molecule_name), - xc(m_xc) { + moldftSchema(World &world, const std::string &molecule_name, const std::string &m_xc, + const runSchema &schema) + : mol_name(molecule_name), xc(m_xc) { moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); @@ -157,14 +139,13 @@ struct moldftSchema { world.gop.fence(); if (world.rank() == 0) { std::cout << "time: " << calc_info_json["time"] << std::endl; - std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; + std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] + << std::endl; std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] << std::endl; } } - if (world.rank() == 0) { - print(); - } + if (world.rank() == 0) { print(); } } void print() const { @@ -187,15 +168,12 @@ struct frequencySchema { const path moldft_path; vector freq; - frequencySchema(World &world, const runSchema run_schema, const moldftSchema m_schema, const std::string r_operator) - : mol_name(m_schema.mol_name), - xc(m_schema.xc), - op(r_operator), + frequencySchema(World &world, const runSchema run_schema, const moldftSchema m_schema, + const std::string r_operator) + : mol_name(m_schema.mol_name), xc(m_schema.xc), op(r_operator), moldft_path(m_schema.moldft_path) { freq = run_schema.rdb.get_frequencies(mol_name, xc, op); - if (world.rank() == 0) { - print_schema(); - } + if (world.rank() == 0) { print_schema(); } } void print_schema() { @@ -266,8 +244,8 @@ std::filesystem::path generate_excited_run_path(const std::filesystem::path &mol * @param excited_state restart path * @return */ -std::pair generate_excited_save_path( - const std::filesystem::path &excited_run_path) { +std::pair +generate_excited_save_path(const std::filesystem::path &excited_run_path) { auto save_path = std::filesystem::path(excited_run_path); std::string save_string = "restart_excited"; @@ -457,9 +435,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // if parameters are different or if I want to run no matter what run // if I want to restart and if I can. restart if (try_run) { - if (world.rank() == 0) { - print("-------------Running moldft------------"); - } + if (world.rank() == 0) { print("-------------Running moldft------------"); } world.gop.fence(); // if params are different run and if restart exists and if im asking to restar if (std::filesystem::exists(moldftSchema.moldft_restart) && restart) { @@ -577,7 +553,11 @@ void set_frequency_response_parameters(ResponseParameters &r_params, const std:: * @param frequency * @param moldft_path */ -static auto set_frequency_path_and_restart(World &world, ResponseParameters ¶meters, const std::string &property, const double &frequency, const std::string &xc, const std::filesystem::path &moldft_path, std::filesystem::path &restart_path, bool restart) +static auto set_frequency_path_and_restart(World &world, ResponseParameters ¶meters, + const std::string &property, const double &frequency, + const std::string &xc, + const std::filesystem::path &moldft_path, + std::filesystem::path &restart_path, bool restart) -> std::filesystem::path { if (world.rank() == 0) { @@ -589,19 +569,13 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par // change the logic create save path auto frequency_run_path = generate_response_frequency_run_path(moldft_path, property, frequency, xc); - if (world.rank() == 0) { - print("frequency run path", frequency_run_path); - } + if (world.rank() == 0) { print("frequency run path", frequency_run_path); } // Crea if (std::filesystem::is_directory(frequency_run_path)) { - if (world.rank() == 0) { - cout << "Response directory found " << std::endl; - } + if (world.rank() == 0) { cout << "Response directory found " << std::endl; } } else {// create the file std::filesystem::create_directory(frequency_run_path); - if (world.rank() == 0) { - cout << "Creating response_path directory" << std::endl; - } + if (world.rank() == 0) { cout << "Creating response_path directory" << std::endl; } } world.gop.fence(); @@ -609,10 +583,7 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par // Calling this function will make the current working directory the // frequency save path auto [save_path, save_string] = generate_frequency_save_path(frequency_run_path); - if (world.rank() == 0) { - - print("save string", save_string); - } + if (world.rank() == 0) { print("save string", save_string); } parameters.set_user_defined_value("save", true); parameters.set_user_defined_value("save_file", save_string); @@ -628,9 +599,7 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par } } else if (std::filesystem::exists(restart_path)) { - if (world.rank() == 0) { - print(" restart path", restart_path); - } + if (world.rank() == 0) { print(" restart path", restart_path); } parameters.set_user_defined_value("restart", true); auto split_restart_path = split(restart_path.replace_extension("").string(), '/'); @@ -675,8 +644,8 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // Set the response parameters ResponseParameters r_params{}; set_frequency_response_parameters(r_params, property, xc, frequency, precision); - auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, moldft_path, - restart_path, true); + auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, + moldft_path, restart_path, true); if (world.rank() == 0) { molresponse::write_response_input(r_params, filename); } // if rbase exists and converged I just return save path and true @@ -684,7 +653,9 @@ auto RunResponse(World &world, const std::string &filename, double frequency, std::ifstream ifs("response_base.json"); json response_base; ifs >> response_base; - if (response_base["converged"] && response_base["precision"]["dconv"] == r_params.dconv()) { return {save_path, true}; } + if (response_base["converged"] && response_base["precision"]["dconv"] == r_params.dconv()) { + return {save_path, true}; + } } auto calc_params = initialize_calc_params(world, std::string(filename)); RHS_Generator rhs_generator; @@ -830,9 +801,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s bool first = true; for (const auto &freq: schema.freq) { - if (world.rank() == 0) { - print(success.second); - } + if (world.rank() == 0) { print(success.second); } std::filesystem::current_path(schema.moldft_path); if (first) { @@ -852,9 +821,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s success = RunResponse(world, "response.in", freq, schema.op, schema.xc, schema.moldft_path, restart_path, high_prec); - if (world.rank() == 0) { - print("Frequency ", freq, " completed"); - } + if (world.rank() == 0) { print("Frequency ", freq, " completed"); } } } @@ -867,12 +834,11 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s * @param restart do we force a restart or not * @param precision high precision or no? */ -void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, const std::string &precision) { +void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, + const std::string &precision) { if (std::filesystem::is_directory(m_schema.moldft_path)) { - if (world.rank() == 0) { - cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; - } + if (world.rank() == 0) { cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; } } else {// create the file std::filesystem::create_directory(m_schema.moldft_path); if (world.rank() == 0) { From 2f9017a5b7f42ae1a7646fded1c645227f5b8093 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 10:51:19 -0500 Subject: [PATCH 0817/1312] fix the recursive assignment call --- src/apps/molresponse/x_space.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 75a65c9730e..9c73b28df3b 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -69,11 +69,8 @@ namespace madness { this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - - auto xf = to_response_matrix(*this); - auto xb = to_response_matrix(B); - xf = xb; - *this = to_X_space(xf); + this->X = B.X; + this->Y = B.X; } return *this;// NO SHALLOW COPIES } From 7ecdcd3fe07a7e9d7bb3a4986d3908f209d3415e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 10:51:36 -0500 Subject: [PATCH 0818/1312] formatting and debugging changes --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++++- src/apps/molresponse/ResponseBase.cpp | 3 --- src/apps/molresponse/global_functions.cc | 1 + src/apps/molresponse/testing/mad-freq.cpp | 16 ++++----------- src/apps/molresponse/testing/runners.hpp | 23 ++++------------------ 5 files changed, 14 insertions(+), 35 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 649ef687f99..6ee74deb334 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -7,7 +7,10 @@ #include "property.h" -void FrequencyResponse::initialize(World &world) { Chi = PQ.copy(); } +void FrequencyResponse::initialize(World &world) { + if (world.rank() == 0) { print("FrequencyResponse::initialize()"); } + Chi = PQ.copy(); +} void FrequencyResponse::iterate(World &world) { size_t iter; @@ -402,6 +405,7 @@ void FrequencyResponse::save(World &world, const std::string &name) { // Load a response calculation void FrequencyResponse::load(World &world, const std::string &name) { + if (world.rank() == 0) { print("FrequencyResponse::load() -state"); } // The archive to read from archive::ParallelInputArchive ar(world, name.c_str()); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 0c74d395364..4315fc2d3fa 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1363,9 +1363,6 @@ void ResponseBase::solve(World &world) { // Plotting input orbitals if (r_params.plot_initial()) { PlotGroundDensityVTK(world, *this); } - // TODO Why would I plot the ground state density here if the protocol or k is - // not set yet? Warm and fuzzy - // Ready to iterate! const auto protocol = r_params.protocol(); if (world.rank() == 0) { print("Response State Calculation for the following protocols"); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8ded34c8fe4..80fa0b35382 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -24,6 +24,7 @@ auto initialize_calc_params(World &world, const std::string &input_file) -> Calc r_params.set_ground_state_calculation_data(ground_calculation); r_params.set_derived_values(world, molecule); if (world.rank() == 0) { r_params.print(); } + world.gop.fence(); return {ground_calculation, molecule, r_params}; } // TODO some operator definitions that I will need to move to a separate file diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index f1fb4a6673f..11171d78c7b 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -31,37 +31,29 @@ auto main(int argc, char *argv[]) -> int { int result = 0; world.gop.fence(); startup(world, argc, argv); - sleep(10); - + sleep(5); std::cout.precision(6); - if (argc != 5) { - std::cout << "Wrong number of inputs" << std::endl; return 1; } - const std::string molecule_name{argv[1]}; const std::string xc{argv[2]}; const std::string op{argv[3]}; const std::string precision{argv[4]}; - if (precision != "high" && precision != "low" && precision != "super") { - if (world.rank() == 0) { - std::cout << "Set precision to low high super" << std::endl; - } + if (world.rank() == 0) { std::cout << "Set precision to low high super" << std::endl; } return 1; } try { - auto schema = runSchema(world, xc); auto m_schema = moldftSchema(world, molecule_name, xc, schema); auto f_schema = frequencySchema(world, schema, m_schema, op); - if (std::filesystem::exists(m_schema.calc_info_json_path) && std::filesystem::exists(m_schema.moldft_restart)) { + if (std::filesystem::exists(m_schema.calc_info_json_path) && + std::filesystem::exists(m_schema.moldft_restart)) { // TODO set up to read calc_info json and check if its converged runFrequencyTests(world, f_schema, precision); } else { - moldft(world, m_schema, true, false, precision); runFrequencyTests(world, f_schema, precision); } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index f2134490fb2..f12ca3799da 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -104,14 +104,11 @@ struct moldftSchema { moldftSchema(World &world, const std::string &molecule_name, const std::string &m_xc, const runSchema &schema) : mol_name(molecule_name), xc(m_xc) { - moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); - moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); - if (std::filesystem::exists(moldft_json_path)) { std::ifstream ifs(moldft_json_path); // read results into json @@ -137,13 +134,10 @@ struct moldftSchema { std::ifstream ifs(calc_info_json_path); ifs >> calc_info_json; world.gop.fence(); - if (world.rank() == 0) { - std::cout << "time: " << calc_info_json["time"] << std::endl; - std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] - << std::endl; - std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] - << std::endl; - } + std::cout << "time: " << calc_info_json["time"] << std::endl; + std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; + std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] + << std::endl; } if (world.rank() == 0) { print(); } } @@ -640,13 +634,11 @@ auto RunResponse(World &world, const std::string &filename, double frequency, const std::string &property, const std::string &xc, const std::filesystem::path &moldft_path, std::filesystem::path restart_path, const std::string &precision) -> std::pair { - // Set the response parameters ResponseParameters r_params{}; set_frequency_response_parameters(r_params, property, xc, frequency, precision); auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, moldft_path, restart_path, true); - if (world.rank() == 0) { molresponse::write_response_input(r_params, filename); } // if rbase exists and converged I just return save path and true if (std::filesystem::exists("response_base.json")) { @@ -678,8 +670,6 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // put the response parameters in a j_molrespone json object calc_params.response_parameters.to_json(calc.j_molresponse); } - world.gop.fence(); - // set protocol to the first calc.solve(world); // TODO Why would I plot the ground state density here if the protocol or k is world.gop.fence(); @@ -792,7 +782,6 @@ auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec * @param property */ void runFrequencyTests(World &world, const frequencySchema &schema, const std::string &high_prec) { - std::filesystem::current_path(schema.moldft_path); // add a restart path auto restart_path = addPath(schema.moldft_path, "/" + schema.op + "_0-000000.00000/restart_" + @@ -800,9 +789,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s std::pair success{schema.moldft_path, false}; bool first = true; for (const auto &freq: schema.freq) { - if (world.rank() == 0) { print(success.second); } - std::filesystem::current_path(schema.moldft_path); if (first) { first = false; @@ -817,10 +804,8 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s } else { throw Response_Convergence_Error{}; } - success = RunResponse(world, "response.in", freq, schema.op, schema.xc, schema.moldft_path, restart_path, high_prec); - if (world.rank() == 0) { print("Frequency ", freq, " completed"); } } } From b53066069a03655995424546aa66d0268113b77b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 13:42:00 -0500 Subject: [PATCH 0819/1312] fix some bugs --- src/apps/molresponse/FrequencyResponse.cpp | 4 ---- src/apps/molresponse/FrequencyResponse.hpp | 2 +- src/apps/molresponse/x_space.h | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6ee74deb334..bbba59d2c52 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -481,14 +481,10 @@ auto vector_to_PQ(World &world, const vector_real_function_3d &p, const vector_real_function_3d &ground_orbitals, double lo) -> response_space { response_space rhs(world, p.size(), ground_orbitals.size()); - reconstruct(world, ground_orbitals); - QProjector Qhat(world, ground_orbitals); - std::vector orbitals = copy(world, ground_orbitals); truncate(world, orbitals); - auto f = [&](auto property) { auto phat_phi = mul(world, property, orbitals, lo); // rhs[i].truncate_vec(); diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index efd87eab91a..939db5f21fa 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -25,7 +25,7 @@ class FrequencyResponse : public ResponseBase { : ResponseBase(world, params), omega{frequency}, generator{std::move(rhs)}, - PQ{std::move(generator(world, *this))} {} + PQ{generator(world, *this)} {} void initialize(World& world) override; private: diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 9c73b28df3b..54f48724417 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -70,7 +70,7 @@ namespace madness { this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); this->X = B.X; - this->Y = B.X; + this->Y = B.Y; } return *this;// NO SHALLOW COPIES } From ce1c1b8194ad601b0cc3a5f81c613f758d53d898 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 16:47:45 -0500 Subject: [PATCH 0820/1312] remove printing of ground-state overlap matrix --- src/apps/molresponse/ResponseBase.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 4315fc2d3fa..facabe786c2 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -140,12 +140,6 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const // Get sizes auto num_orbitals = phi.size(); // Debugging - if (r_params.print_level() > 2) { - Tensor S = matrix_inner(world, phi, phi); - if (world.rank() == 0) print(" Ground state overlap:"); - if (world.rank() == 0) print(S); - } - // Calculate T // Make the derivative operators in each direction real_derivative_3d Dx(world, 0); real_derivative_3d Dy(world, 1); @@ -244,9 +238,6 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const for (int64_t i = 0; i < new_hamiltonian.dim(0); i++) { for (int64_t j = i + 1; j < new_hamiltonian.dim(1); j++) { - // print(i, j); - // print(xAx(i, j)); - // print(xAx(j, i)); new_hamiltonian(j, i) = new_hamiltonian(i, j); } } @@ -264,11 +255,6 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const auto new_hamiltonian_no_diag = copy(new_hamiltonian); for (size_t i = 0; i < num_orbitals; i++) new_hamiltonian_no_diag(long(i), long(i)) = 0.0; - // Debug output - if (r_params.print_level() >= 2 and world.rank() == 0) { - print(" Ground state new_hamiltonian:"); - print(new_hamiltonian); - } // End timer if (r_params.print_level() >= 1) molresponse::end_timer(world, " Create grnd ham:"); return {new_hamiltonian, new_hamiltonian_no_diag}; From dc3087dfaac41db6f87da9894fade095e7399624 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 17:01:22 -0500 Subject: [PATCH 0821/1312] normal truncation in exchange --- src/apps/molresponse/FrequencyResponse.cpp | 7 ------- src/apps/molresponse/global_functions.cc | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bbba59d2c52..6597f6e6b70 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -86,10 +86,8 @@ void FrequencyResponse::iterate(World &world) { bsh_y_ops = make_bsh_operators_response(world, y_shifts, omega); omega = -omega; } - vector_real_function_3d rho_omega = make_density(world, Chi); converged = false;// Converged flag - auto thresh = FunctionDefaults<3>::get_thresh(); auto max_rotation = .5; if (thresh >= 1e-2) { @@ -111,9 +109,7 @@ void FrequencyResponse::iterate(World &world) { printf("\n Iteration %d at time %.1fs\n", static_cast(iter), wall_time()); if (world.rank() == 0) print("-------------------------------------------"); } - if (iter < 2 || (iter % 10) == 0) { load_balance_chi(world); } - if (iter > 0) { if (density_residuals.max() > 2) { break; } double d_residual = density_residuals.max(); @@ -121,14 +117,11 @@ void FrequencyResponse::iterate(World &world) { auto chi_norms = Chi.norm2s(); auto relative_bsh = copy(bsh_residualsX); auto rho_norms = norm2s_T(world, rho_omega); - std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); - auto max_bsh = bsh_residualsX.absmax(); auto relative_max_bsh = relative_bsh.absmax(); - Tensor polar = -2 * inner(Chi, PQ); world.gop.fence(); // Todo add chi norm and chi_x diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 80fa0b35382..d1f9eb5033f 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -253,7 +253,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br auto v23 = mul(world, bra_i, fp, true); //mul(world, bra_i, fp, true); if (world.rank() == 0) { print("multiply v23"); } - truncate(world, v23, 0.01 * tol, true); + truncate(world, v23, tol, true); // truncate if (world.rank() == 0) { print("truncate v23"); } v23 = apply(world, *poisson, v23); From f22695ae187828ecebdc45e9c3d4cabbd7c557d0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 17:09:25 -0500 Subject: [PATCH 0822/1312] remove norm printing --- src/apps/molresponse/ResponseBase.cpp | 19 ------------------- src/apps/molresponse/x_space.h | 10 ++++------ 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index facabe786c2..65f0acf1e11 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1105,27 +1105,8 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp size_t n = chi.X.size_orbitals(); // compute residual X_space res(world, m, n); - //res.X = old_Chi.X - temp.X; res = g_chi - chi; - auto residual_norms = res.norm2s(); - if (world.rank() == 0 and (r_params.print_level() > 1)) { - print("||f(x)||_2 = : ", residual_norms); - } - - if (r_params.print_level() >= 5) { - int j = 0; - auto res_vec = to_response_matrix(res); - for (const auto &xi: res_vec) { - auto res_b_norms = std::vector{}; - for (const auto &xij: xi) res_b_norms.push_back(xij.norm2()); - world.gop.fence(); - if (world.rank() == 0) { print("||f(x)||_: ", j, res_b_norms); } - j++; - } - } - - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); } diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 54f48724417..c66ff068f21 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -271,13 +271,11 @@ namespace madness { auto norm2s() -> Tensor { World &world = X[0][0].world(); - Tensor norms(num_states()); - for (size_t b = 0; b < num_states(); b++) { - auto xb = madness::copy(world, X[b]); - for (auto &yb: Y[b]) { xb.push_back(madness::copy(yb, true)); } - norms[b] = sqrt(inner(xb, xb)); - } + auto x = to_response_matrix(*this); + int b = 0; + for (const auto &xb: x) { norms[b++] = norm2(world, xb); } + world.gop.fence(); return norms; } From 78808c87ebf542e985ad36b8eeee01fc5a67d476 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 17:17:12 -0500 Subject: [PATCH 0823/1312] re-write kain without using standard transform --- src/apps/molresponse/ResponseBase.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 65f0acf1e11..54d7c0672b5 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1116,20 +1116,24 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, response_solver &kain_x_space, - response_matrix &Xvector, response_matrix &Xresidual) + response_matrix &x_vectors, response_matrix &x_residuals) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); - Xvector = to_response_matrix(chi); - Xresidual = to_response_matrix(residual_chi); + x_vectors = to_response_matrix(chi); + x_residuals = to_response_matrix(residual_chi); response_matrix update(m); if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } int b = 0; - std::transform( - Xvector.begin(), Xvector.end(), Xresidual.begin(), update.begin(), - [&](const auto &xi, const auto &ri) { return kain_x_space[b++].update(xi, ri); }); + for (auto &kain_xb: kain_x_space) { + const auto &xi = x_vectors[b]; + const auto &ri = x_vectors[b]; + update[b] = kain_xb.update(xi, ri); + b++; + } + world.gop.fence(); kain_update = to_X_space(update); if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } if (r_params.print_level() >= 1) { From 846009e000ad355ed293627e6c97481ba3c89cab Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 18:16:33 -0500 Subject: [PATCH 0824/1312] some changes to kain --- src/apps/molresponse/ExcitedResponse.cpp | 3 +-- src/apps/molresponse/FrequencyResponse.cpp | 13 +++---------- src/apps/molresponse/FrequencyResponse.hpp | 13 ++++++------- src/apps/molresponse/ResponseBase.cpp | 11 ++++------- src/apps/molresponse/ResponseBase.hpp | 3 +-- 5 files changed, 15 insertions(+), 28 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index b1870ddb1ad..a2882b5e68e 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -2155,8 +2155,7 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & // kain if iteration >0 or first run where there should not be a problem // computed new_chi and res if (r_params.kain() && (iter > 0) && true) { - new_chi = - kain_x_space_update(world, rotated_chi, new_res, kain_x_space, Xvector, Xresidual); + new_chi = kain_x_space_update(world, rotated_chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, rotated_chi, new_chi, compute_y, maxrotn); } diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6597f6e6b70..f10efb2cc64 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -40,11 +40,6 @@ void FrequencyResponse::iterate(World &world) { // create X space residuals X_space residuals = X_space::zero_functions(world, m, n); - std::vector x_vectors; - std::vector x_residuals; - - x_vectors = to_response_matrix(Chi); - x_residuals = to_response_matrix(residuals); /* for (size_t b = 0; b < m; b++) { x_vectors.emplace_back(Chi, b); @@ -175,9 +170,8 @@ void FrequencyResponse::iterate(World &world) { // std::cout << "MPI BARRIER before update " << std::endl; // world.mpi.Barrier(); - auto [new_chi, new_res] = - update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, x_vectors, x_residuals, iter, max_rotation); + auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, + omega, kain_x_space, iter, max_rotation); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -257,7 +251,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - response_matrix &Xvector, response_matrix &Xresidual, size_t iteration, const double &maxrotn) -> std::tuple { @@ -275,7 +268,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp if (r_params.kain() && (iteration > 2)) { - new_chi = kain_x_space_update(world, chi, new_res, kain_x_space, Xvector, Xresidual); + new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 939db5f21fa..ae1cc1108bd 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -45,13 +45,12 @@ class FrequencyResponse : public ResponseBase { std::string message); void save(World& world, const std::string& name) override; void load(World& world, const std::string& name) override; - std::tuple update(World& world, X_space& chi, XCOperator& xc, - vector& bsh_x_ops, - vector& bsh_y_ops, - QProjector& projector, double& x_shifts, - double& omega_n, response_solver &kain_x_space, - response_matrix &Xvector, response_matrix &Xresidual, - size_t iteration, const double& maxrotn); + std::tuple update(World &world, X_space &chi, XCOperator &xc, + std::vector &bsh_x_ops, + std::vector &bsh_y_ops, + QProjector &projector, double &x_shifts, + double &omega_n, response_solver &kain_x_space, + size_t iteration, const double &maxrotn); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 54d7c0672b5..c9033a3a433 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1115,22 +1115,19 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp } auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, - const X_space &residual_chi, response_solver &kain_x_space, - response_matrix &x_vectors, response_matrix &x_residuals) + const X_space &residual_chi, response_solver &kain_x_space) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); - x_vectors = to_response_matrix(chi); - x_residuals = to_response_matrix(residual_chi); response_matrix update(m); + auto x_vectors = to_response_matrix(chi); + auto x_residuals = to_response_matrix(residual_chi); if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } int b = 0; for (auto &kain_xb: kain_x_space) { - const auto &xi = x_vectors[b]; - const auto &ri = x_vectors[b]; - update[b] = kain_xb.update(xi, ri); + update[b] = kain_xb.update(x_vectors[b], x_residuals[b]); b++; } world.gop.fence(); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index d53ce8d2667..3ffb2d699d0 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -199,8 +199,7 @@ class ResponseBase { auto kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, - response_solver &kain_x_space, response_matrix &Xvector, - response_matrix &Xresidual) -> X_space; + response_solver &kain_x_space) -> X_space; void x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, bool restrict_y, const double &maxrotn); From 375f40b8e4a8175820d983a7132e4777b05e3dca Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 19:04:42 -0500 Subject: [PATCH 0825/1312] something is wrong with moldft call --- src/apps/molresponse/testing/mad-freq.cpp | 1 + src/apps/molresponse/testing/runners.hpp | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 11171d78c7b..8a6b54448c9 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -49,6 +49,7 @@ auto main(int argc, char *argv[]) -> int { auto schema = runSchema(world, xc); auto m_schema = moldftSchema(world, molecule_name, xc, schema); auto f_schema = frequencySchema(world, schema, m_schema, op); + world.gop.fence(); if (std::filesystem::exists(m_schema.calc_info_json_path) && std::filesystem::exists(m_schema.moldft_restart)) { // TODO set up to read calc_info json and check if its converged diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index f12ca3799da..b02d7dc7e78 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -134,10 +134,14 @@ struct moldftSchema { std::ifstream ifs(calc_info_json_path); ifs >> calc_info_json; world.gop.fence(); - std::cout << "time: " << calc_info_json["time"] << std::endl; - std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; - std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] - << std::endl; + if (world.rank() == 0) { + + std::cout << "time: " << calc_info_json["time"] << std::endl; + std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] + << std::endl; + std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] + << std::endl; + } } if (world.rank() == 0) { print(); } } @@ -407,7 +411,6 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value>("protocol", {1e-9}); param1.set_user_defined_value("dconv", 1e-7); } - param1.set_user_defined_value("localize", "new"); CalculationParameters param_calc; if (std::filesystem::exists(moldftSchema.calc_info_json_path)) { @@ -446,8 +449,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo world.gop.fence(); SCF calc(world, parser); - calc.set_protocol<3>(world, 1e-4); - + //calc.set_protocol<3>(world, 1e-4); MolecularEnergy ME(world, calc); // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! @@ -670,6 +672,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // put the response parameters in a j_molrespone json object calc_params.response_parameters.to_json(calc.j_molresponse); } + world.gop.fence(); calc.solve(world); // TODO Why would I plot the ground state density here if the protocol or k is world.gop.fence(); From 488c829f74d7f62873a9a8019f72299bb516f7b4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 29 Nov 2022 19:36:31 -0500 Subject: [PATCH 0826/1312] add everything I need to make moldft work --- src/apps/molresponse/testing/runners.hpp | 28 ++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index b02d7dc7e78..fa2018961fc 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -433,7 +433,6 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // if I want to restart and if I can. restart if (try_run) { if (world.rank() == 0) { print("-------------Running moldft------------"); } - world.gop.fence(); // if params are different run and if restart exists and if im asking to restar if (std::filesystem::exists(moldftSchema.moldft_restart) && restart) { param1.set_user_defined_value("restart", true); @@ -446,13 +445,38 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo world.gop.fence(); commandlineparser parser; parser.set_keyval("input", "moldft.in"); - world.gop.fence(); + if (world.rank() == 0) print("input filename: ", parser.value("input")); + + + print_meminfo(world.rank(), "startup"); + FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); + + std::cout.precision(6); SCF calc(world, parser); + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Hartree-Fock and Density Functional Theory Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc.molecule.print(); + print("\n"); + calc.param.print("dft"); + } + if (world.size() > 1) { + calc.set_protocol<3>(world, 1e-4); + calc.make_nuclear_potential(world); + calc.initial_load_bal(world); + } +//vama + calc.set_protocol<3>(world, calc.param.protocol()[0]); //calc.set_protocol<3>(world, 1e-4); + world.gop.fence(); MolecularEnergy ME(world, calc); + world.gop.fence(); // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! + world.gop.fence(); ME.output_calc_info_schema(); } else { if (world.rank() == 0) { From 22defadbcf4269ac79051978f5efe63bbb642b88 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 15:39:22 -0500 Subject: [PATCH 0827/1312] some mad-frequency clean up --- src/apps/molresponse/FrequencyResponse.cpp | 7 -- src/apps/molresponse/testing/mad-freq.cpp | 101 ++++++++++++--------- 2 files changed, 56 insertions(+), 52 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f10efb2cc64..ed4b17946f8 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -167,13 +167,8 @@ void FrequencyResponse::iterate(World &world) { break; } } - - // std::cout << "MPI BARRIER before update " << std::endl; - // world.mpi.Barrier(); auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation); - - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); if (r_params.print_level() >= 1) { @@ -184,7 +179,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make_density_new", "make_density_new", iter_timing); } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bsh_residualsX = copy(new_res.residual_norms); if (world.rank() == 0) { print("copy tensors: bshX"); } @@ -195,7 +189,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - xij_res_norms = new_res.residual.component_norm2s(); if (world.rank() == 0) { print("computing residuals: xij residuals"); } xij_norms = Chi.component_norm2s(); diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 8a6b54448c9..cfce7992bb2 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -27,43 +27,52 @@ using namespace madness; auto main(int argc, char *argv[]) -> int { - World &world = madness::initialize(argc, argv); - int result = 0; - world.gop.fence(); - startup(world, argc, argv); - sleep(5); - std::cout.precision(6); - if (argc != 5) { - std::cout << "Wrong number of inputs" << std::endl; - return 1; - } - const std::string molecule_name{argv[1]}; - const std::string xc{argv[2]}; - const std::string op{argv[3]}; - const std::string precision{argv[4]}; - if (precision != "high" && precision != "low" && precision != "super") { - if (world.rank() == 0) { std::cout << "Set precision to low high super" << std::endl; } - return 1; - } - try { - auto schema = runSchema(world, xc); - auto m_schema = moldftSchema(world, molecule_name, xc, schema); - auto f_schema = frequencySchema(world, schema, m_schema, op); - world.gop.fence(); - if (std::filesystem::exists(m_schema.calc_info_json_path) && - std::filesystem::exists(m_schema.moldft_restart)) { - // TODO set up to read calc_info json and check if its converged - runFrequencyTests(world, f_schema, precision); - } else { - moldft(world, m_schema, true, false, precision); - runFrequencyTests(world, f_schema, precision); - } + madness::initialize(argc, argv); - } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { - std::cout << e << std::endl; - } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { - print(s); + { + World world(SafeMPI::COMM_WORLD); + startup(world, argc, argv, true); + + try { + sleep(5); + std::cout.precision(6); + if (argc != 5) { + std::cout << "Wrong number of inputs" << std::endl; + return 1; + } + const std::string molecule_name{argv[1]}; + const std::string xc{argv[2]}; + const std::string op{argv[3]}; + const std::string precision{argv[4]}; + if (precision != "high" && precision != "low" && precision != "super") { + if (world.rank() == 0) { + std::cout << "Set precision to low high super" << std::endl; + } + return 1; + } + auto schema = runSchema(world, xc); + auto m_schema = moldftSchema(world, molecule_name, xc, schema); + auto f_schema = frequencySchema(world, schema, m_schema, op); + world.gop.fence(); + if (std::filesystem::exists(m_schema.calc_info_json_path) && + std::filesystem::exists(m_schema.moldft_restart)) { + runFrequencyTests(world, f_schema, precision); + } else { + moldft(world, m_schema, true, false, precision); + runFrequencyTests(world, f_schema, precision); + } + } catch (const SafeMPI::Exception &e) { + print(e); + error("caught an MPI exception"); + } catch (const madness::MadnessException &e) { + print(e); + error("caught a MADNESS exception"); + } catch (const madness::TensorException &e) { + print(e); + error("caught a Tensor exception"); + } catch (const char *s) { print(s); } catch (const std::string &s) { + print(s); } catch (const nlohmann::detail::exception &e) { print(e.what()); error("Caught JSON exception"); @@ -71,14 +80,16 @@ auto main(int argc, char *argv[]) -> int { catch (const std::filesystem::filesystem_error &ex) { std::cerr << ex.what() << "\n"; } catch (const std::string &s) { print(s); } catch (const std::exception &e) { - print(e.what()); - } catch (...) { error("caught unhandled exception"); } - - if (world.rank() == 0) { print("Finished All Frequencies"); } - - return result; - - // print_meminfo(world.rank(), "startup"); - // std::cout.precision(6); - // print_stats(world); + } catch (const std::exception &e) { + error("caught an STL exception"); + print(e.what()); + } catch (...) { error("caught unhandled exception"); } + // Nearly all memory will be freed at this point + world.gop.fence(); + world.gop.fence(); + print_stats(world); + if (world.rank() == 0) { print("Finished All Frequencies"); } + } + finalize(); + return 0; } From 19fd590364d18fc3f457a589c7ee910d719f6517 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 16:06:12 -0500 Subject: [PATCH 0828/1312] new rhs set up --- src/apps/molresponse/FrequencyResponse.cpp | 25 +++++++++------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ed4b17946f8..37e8430679c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -445,7 +445,6 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { vector_real_function_3d dipole_vectors(3); size_t i = 0; for (auto &d: dipole_vectors) { - std::vector f(3, 0); f[i++] = 1; d = real_factory_3d(world).functor(real_functor_3d(new MomentFunctor(f))); @@ -456,24 +455,20 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { return PQ; } -auto vector_to_PQ(World &world, const vector_real_function_3d &p, +auto vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, const vector_real_function_3d &ground_orbitals, double lo) -> response_space { - response_space rhs(world, p.size(), ground_orbitals.size()); + response_space rhs(world, rhs_operators.size(), ground_orbitals.size()); reconstruct(world, ground_orbitals); QProjector Qhat(world, ground_orbitals); - std::vector orbitals = copy(world, ground_orbitals); - truncate(world, orbitals); - auto f = [&](auto property) { - auto phat_phi = mul(world, property, orbitals, lo); - // rhs[i].truncate_vec(); - // project rhs vectors for state - phat_phi = Qhat(phat_phi); - truncate(world, phat_phi); - world.gop.fence(); - return phat_phi; - }; - std::transform(p.begin(), p.end(), rhs.begin(), f); + int b = 0; + for (const functionT &pi: rhs_operators) { + auto op_phi = mul(world, pi, ground_orbitals, lo); + op_phi = Qhat(op_phi); + truncate(world, op_phi, true); + rhs[b] = op_phi; + b++; + } return rhs; } // From 30b4b9aae60dd62299a344651d0c758fd4b50c95 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 16:17:32 -0500 Subject: [PATCH 0829/1312] not sure how i maintain accuracy if I never change PQ through the iterations --- src/apps/molresponse/FrequencyResponse.cpp | 3 ++- src/apps/molresponse/testing/runners.hpp | 6 ++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 37e8430679c..c25048fb957 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -94,7 +94,7 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-8) { max_rotation = .05; } - + PQ = generator(world, *this); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); // Basic output @@ -450,6 +450,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { d = real_factory_3d(world).functor(real_functor_3d(new MomentFunctor(f))); } //truncate(world, dipole_vectors, true); + world.gop.fence(); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals(), r_params.lo()); PQ.Y = PQ.X; return PQ; diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index fa2018961fc..a64d5cf917b 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -682,8 +682,9 @@ auto RunResponse(World &world, const std::string &filename, double frequency, } else { rhs_generator = nuclear_generator; } + + FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); FrequencyResponse calc(world, calc_params, frequency, rhs_generator); - world.gop.fence(); if (world.rank() == 0) { print("\n\n"); print(" MADNESS Time-Dependent Density Functional Theory Response " @@ -696,9 +697,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, // put the response parameters in a j_molrespone json object calc_params.response_parameters.to_json(calc.j_molresponse); } - world.gop.fence(); calc.solve(world); - // TODO Why would I plot the ground state density here if the protocol or k is world.gop.fence(); // set protocol to the first if (world.rank() == 0) { @@ -823,7 +822,6 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s } else if (success.second) { // if the previous run succeeded then set the restart path restart_path = success.first; - world.gop.fence(); if (world.rank() == 0) { print("restart_path", restart_path); print("restart_path = success.first", restart_path); From b85703a81995ebd39004288baa757da5c8378dd7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 16:30:57 -0500 Subject: [PATCH 0830/1312] I thought I was using lo but It was acting as a bool --- src/apps/molresponse/FrequencyResponse.cpp | 8 ++++---- src/apps/molresponse/FrequencyResponse.hpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index c25048fb957..426e338024e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -434,7 +434,7 @@ auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { factoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); } } - PQ.X = vector_to_PQ(world, nuclear_vector, calc.get_orbitals(), r_params.lo()); + PQ.X = vector_to_PQ(world, nuclear_vector, calc.get_orbitals()); PQ.Y = PQ.X; return PQ; } @@ -451,20 +451,20 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { } //truncate(world, dipole_vectors, true); world.gop.fence(); - PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals(), r_params.lo()); + PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); PQ.Y = PQ.X; return PQ; } auto vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, - const vector_real_function_3d &ground_orbitals, double lo) -> response_space { + const vector_real_function_3d &ground_orbitals) -> response_space { response_space rhs(world, rhs_operators.size(), ground_orbitals.size()); reconstruct(world, ground_orbitals); QProjector Qhat(world, ground_orbitals); int b = 0; for (const functionT &pi: rhs_operators) { - auto op_phi = mul(world, pi, ground_orbitals, lo); + auto op_phi = mul(world, pi, ground_orbitals, true); op_phi = Qhat(op_phi); truncate(world, op_phi, true); rhs[b] = op_phi; diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index ae1cc1108bd..9226a1ff8ba 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -12,8 +12,8 @@ class FrequencyResponse; using RHS_Generator = std::function; -response_space vector_to_PQ(World& world, const vector_real_function_3d& p, - const vector_real_function_3d& ground_orbitals, double lo); +response_space vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, + const vector_real_function_3d &ground_orbitals); X_space nuclear_generator(World& world, FrequencyResponse& calc); X_space dipole_generator(World& world, FrequencyResponse& calc); //using RHS_Generator = std::function; From 985d250372a14558505eed905254ed9a4c6e1cf9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 16:44:16 -0500 Subject: [PATCH 0831/1312] some clean up of the runner. modify params for restart and brodacast --- src/apps/molresponse/testing/runners.hpp | 78 +++++++++--------------- 1 file changed, 28 insertions(+), 50 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index a64d5cf917b..0d214de41ac 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -450,7 +450,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo print_meminfo(world.rank(), "startup"); - FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); + FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap>(world))); std::cout.precision(6); SCF calc(world, parser); @@ -468,7 +468,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo calc.make_nuclear_potential(world); calc.initial_load_bal(world); } -//vama + //vama calc.set_protocol<3>(world, calc.param.protocol()[0]); //calc.set_protocol<3>(world, 1e-4); world.gop.fence(); @@ -580,15 +580,13 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par std::filesystem::path &restart_path, bool restart) -> std::filesystem::path { - if (world.rank() == 0) { - print("set_frequency_path_and_restart"); - print("restart path", restart_path); - } + if (world.rank() == 0) { print("restart path", restart_path); } // change the logic create save path auto frequency_run_path = generate_response_frequency_run_path(moldft_path, property, frequency, xc); + world.gop.fence(); if (world.rank() == 0) { print("frequency run path", frequency_run_path); } // Crea if (std::filesystem::is_directory(frequency_run_path)) { @@ -597,51 +595,34 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par std::filesystem::create_directory(frequency_run_path); if (world.rank() == 0) { cout << "Creating response_path directory" << std::endl; } } - world.gop.fence(); - std::filesystem::current_path(frequency_run_path); - // Calling this function will make the current working directory the // frequency save path auto [save_path, save_string] = generate_frequency_save_path(frequency_run_path); - if (world.rank() == 0) { print("save string", save_string); } - - parameters.set_user_defined_value("save", true); - parameters.set_user_defined_value("save_file", save_string); - world.gop.fence(); - // if restart and restartfile exists go ahead and set the restart file - if (restart) { - if (std::filesystem::exists(save_path)) { - - parameters.set_user_defined_value("restart", true); - parameters.set_user_defined_value("restart_file", save_string); - if (world.rank() == 0) { - print("found save directory... restarting from save_string ", save_string); - } - } else if (std::filesystem::exists(restart_path)) { - - if (world.rank() == 0) { print(" restart path", restart_path); } - parameters.set_user_defined_value("restart", true); - - auto split_restart_path = split(restart_path.replace_extension("").string(), '/'); - - std::string restart_file_short = - "../" + split_restart_path[split_restart_path.size() - 2] + "/" + - split_restart_path[split_restart_path.size() - 1]; - parameters.set_user_defined_value("restart_file", restart_file_short); - - if (world.rank() == 0) { - print("relative restart path", restart_file_short); - print("found restart directory... restarting from restart_path.string ", - restart_path.string()); - } - - } else { - parameters.set_user_defined_value("restart", false); + if (world.rank() == 0) { + parameters.set_user_defined_value("save", true); + parameters.set_user_defined_value("save_file", save_string); + if (restart) {//if we are trying a restart calculation + if (std::filesystem::exists(save_path)) { + //if the save path exists then we know we can + // restart from the previous save + parameters.set_user_defined_value("restart", true); + parameters.set_user_defined_value("restart_file", save_string); + } else if (std::filesystem::exists(restart_path)) { + parameters.set_user_defined_value("restart", true); + auto split_restart_path = split(restart_path.replace_extension("").string(), '/'); + std::string restart_file_short = + "../" + split_restart_path[split_restart_path.size() - 2] + "/" + + split_restart_path[split_restart_path.size() - 1]; + parameters.set_user_defined_value("restart_file", restart_file_short); + // Then we restart from the previous file instead + } else { + parameters.set_user_defined_value("restart", false); + }; // neither file exists therefore you need to start from fresh } - } else { - parameters.set_user_defined_value("restart", false); } + world.gop.broadcast_serializable(parameters, 0); + // if restart and restartfile exists go ahead and set the restart file return save_path; } @@ -683,7 +664,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, rhs_generator = nuclear_generator; } - FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap >(world))); + FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap>(world))); FrequencyResponse calc(world, calc_params, frequency, rhs_generator); if (world.rank() == 0) { print("\n\n"); @@ -822,10 +803,7 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s } else if (success.second) { // if the previous run succeeded then set the restart path restart_path = success.first; - if (world.rank() == 0) { - print("restart_path", restart_path); - print("restart_path = success.first", restart_path); - } + if (world.rank() == 0) { print("restart_path", restart_path); } } else { throw Response_Convergence_Error{}; } From 8a597b07b85a5d56ae128820c136debb3afa1bc0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 16:52:51 -0500 Subject: [PATCH 0832/1312] some more clean up --- src/apps/molresponse/FrequencyResponse.cpp | 5 ++--- src/apps/molresponse/testing/response_data_base.hpp | 12 ------------ 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 426e338024e..8a705bb3e31 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -427,8 +427,8 @@ auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { auto num_operators = size_t(molecule.natom() * 3); auto nuclear_vector = vecfuncT(num_operators); - for (size_t atom = 0; atom < molecule.natom(); ++atom) { - for (size_t axis = 0; axis < 3; ++axis) { + for (long atom = 0; atom < molecule.natom(); ++atom) { + for (long axis = 0; axis < 3; ++axis) { functorT func(new madchem::MolecularDerivativeFunctor(molecule, atom, axis)); nuclear_vector.at(atom * 3 + axis) = functionT( factoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); @@ -458,7 +458,6 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { auto vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, const vector_real_function_3d &ground_orbitals) -> response_space { - response_space rhs(world, rhs_operators.size(), ground_orbitals.size()); reconstruct(world, ground_orbitals); QProjector Qhat(world, ground_orbitals); diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp index 6c37e4b4863..3fec7c5585a 100644 --- a/src/apps/molresponse/testing/response_data_base.hpp +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -54,44 +54,32 @@ class ResponseDataBase { } void add_default_molecule(const json &response_keywords) { - const std::string molecule_name = response_keywords["molecule"]; const std::string xc = response_keywords["xc"]; const std::string op = response_keywords["operator"]; json j_add; if (op == "excited-state") { - j_add[molecule_name][xc][op] = 8; - - } else if (op == "dipole") { - if (std::filesystem::exists("molecules/dalton-excited.json")) { std::ifstream ifs("molecules/dalton-excited.json"); try { - json dalton_excited; ifs >> dalton_excited; ::print("Read Dalton Excited"); ::print(dalton_excited); - - std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] ["aug-cc-pVTZ"]["response"]["freq"]; auto omega_max = freq.at(0); omega_max = omega_max / 2.0; ::print(omega_max); - std::vector omegas = {0, omega_max / 8.0, omega_max / 4.0, omega_max / 2.0, omega_max}; j_add[molecule_name][xc][op] = omegas; - - } catch (const json::out_of_range &e) { std::cout << e.what() << std::endl; // The molecule file exists in the database therefore it is okay to add to frequency.json } - } else { std::cout << " did not find dipole-excited.json" << std::endl; j_add[molecule_name][xc][op] = {0}; From 9938de4770c1af3b991d1d5fff122f8582c9b340 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 17:14:48 -0500 Subject: [PATCH 0833/1312] some more clean up --- src/apps/molresponse/FrequencyResponse.cpp | 49 +++------------------- 1 file changed, 6 insertions(+), 43 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8a705bb3e31..fcc3ea08e29 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -332,7 +332,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, void FrequencyResponse::frequency_to_json(json &j_mol_in, size_t iter, const Tensor &polar_ij) { json j = {}; - j["iter"] = iter; j["polar"] = tensor_to_json(polar_ij); auto index = j_mol_in["protocol_data"].size() - 1; @@ -349,26 +348,9 @@ void FrequencyResponse::compute_and_print_polarizability(World &world, X_space & } void FrequencyResponse::save(World &world, const std::string &name) { - - // Archive to write everything to archive::ParallelOutputArchive ar(world, name.c_str(), 1); - // Just going to enforce 1 io server - - // Saving, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) + ar &r_params.archive(); ar &r_params.tda(); ar &r_params.num_orbitals(); @@ -387,33 +369,14 @@ void FrequencyResponse::load(World &world, const std::string &name) { if (world.rank() == 0) { print("FrequencyResponse::load() -state"); } // The archive to read from archive::ParallelInputArchive ar(world, name.c_str()); - - // Reading in, in this order; - // string ground-state archive name (garch_name) - // bool TDA flag - // size_t number of ground state orbitals (n) - // size_t number of excited state orbitals (m) - // Tensor energies of m x-components - // for i from 0 to m-1 - // for j from 0 to n-1 - // Function x_response[i][j] - // (If TDA flag == True) - // (Tensor energies of m y-components ) - // (for i from 0 to m-1 ) - // ( for j from 0 to n-1 ) - // ( Function y_response[i][j] ) - ar &r_params.archive(); ar &r_params.tda(); ar &r_params.num_orbitals(); ar &r_params.num_states(); - Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); - for (size_t i = 0; i < r_params.num_states(); i++) for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; world.gop.fence(); - if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; @@ -459,14 +422,14 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { auto vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, const vector_real_function_3d &ground_orbitals) -> response_space { response_space rhs(world, rhs_operators.size(), ground_orbitals.size()); - reconstruct(world, ground_orbitals); - QProjector Qhat(world, ground_orbitals); + auto orbitals = copy(world, ground_orbitals); + reconstruct(world, orbitals); + truncate(world, orbitals); + QProjector Qhat(world, orbitals); int b = 0; for (const functionT &pi: rhs_operators) { auto op_phi = mul(world, pi, ground_orbitals, true); - op_phi = Qhat(op_phi); - truncate(world, op_phi, true); - rhs[b] = op_phi; + rhs[b] = Qhat(op_phi); b++; } return rhs; From 8d1e52880dea42ab4dc89781ee463ee0d7eca617 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 17:17:28 -0500 Subject: [PATCH 0834/1312] PQ printing --- src/apps/molresponse/FrequencyResponse.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index fcc3ea08e29..3499b4a30a1 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -416,6 +416,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { world.gop.fence(); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); PQ.Y = PQ.X; + if (world.rank() == 0) { print("Made new PQ"); } return PQ; } From e0f4749a2a653264e0296025f73e913f079e0cd0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 18:07:07 -0500 Subject: [PATCH 0835/1312] clang-tidy --- src/apps/molresponse/testing/mad-freq.cpp | 1 - src/apps/molresponse/testing/runners.hpp | 191 ++++++++---------- .../molresponse/testing/test_development.cpp | 2 +- 3 files changed, 88 insertions(+), 106 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index cfce7992bb2..36695d19388 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -54,7 +54,6 @@ auto main(int argc, char *argv[]) -> int { auto schema = runSchema(world, xc); auto m_schema = moldftSchema(world, molecule_name, xc, schema); auto f_schema = frequencySchema(world, schema, m_schema, op); - world.gop.fence(); if (std::filesystem::exists(m_schema.calc_info_json_path) && std::filesystem::exists(m_schema.moldft_restart)) { runFrequencyTests(world, f_schema, precision); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 0d214de41ac..b3550cdf307 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -5,6 +5,8 @@ #ifndef MADNESS_RUNNERS_HPP #define MADNESS_RUNNERS_HPP +#include + #include "ExcitedResponse.hpp" #include "FrequencyResponse.hpp" #include "ResponseExceptions.hpp" @@ -53,27 +55,29 @@ struct runSchema { if (std::filesystem::exists(xc_path)) { if (world.rank() == 0) { std::cout << "XC Directory Exists" << std::endl; } } else { - if (world.rank() == 0) { std::cout << "Creating XC directory" << std::endl; } - std::filesystem::create_directory(xc_path); + if (world.rank() == 0) { + std::cout << "Creating XC directory" << std::endl; + std::filesystem::create_directory(xc_path); + } } - // Get the database where the calculation will be run from freq_json = addPath(molecule_path, "/frequency.json"); dalton_excited_json = addPath(molecule_path, "/dalton-excited.json"); dalton_dipole_json = addPath(molecule_path, "/dalton-dipole.json"); rdb = ResponseDataBase(); - if (std::filesystem::exists(freq_json)) { - std::ifstream ifs(freq_json); - json j_read; - ifs >> j_read; - rdb.set_data(j_read); - if (world.rank() == 0) { - std::cout << "Trying to read frequency.json" << std::endl; + if (world.rank() == 0) { + std::cout << "Trying to read frequency.json" << std::endl; + if (std::filesystem::exists(freq_json)) { + std::ifstream ifs(freq_json); + json j_read; + ifs >> j_read; + rdb.set_data(j_read); std::cout << "READ IT" << std::endl; + } else { + std::cout << "did not find frequency.json" << std::endl; } - } else { - if (world.rank() == 0) { std::cout << "did not find frequency.json" << std::endl; } } + world.gop.broadcast(rdb, 0); if (world.rank() == 0) { print(); } } @@ -101,41 +105,34 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(World &world, const std::string &molecule_name, const std::string &m_xc, + moldftSchema(World &world, const std::string &molecule_name, std::string m_xc, const runSchema &schema) - : mol_name(molecule_name), xc(m_xc) { + : mol_name(molecule_name), xc(std::move(m_xc)) { moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); - if (std::filesystem::exists(moldft_json_path)) { - std::ifstream ifs(moldft_json_path); - // read results into json - ifs >> moldft_json; - // Here are the current answers... check to see if th - world.gop.fence(); - if (world.rank() == 0) { + if (world.rank() == 0) { + if (std::filesystem::exists(moldft_json_path)) { + std::ifstream ifs(moldft_json_path); + ifs >> moldft_json; std::cout << "Here are the current answers for" << molecule_name << " check to see if they need to be updated please!" << std::endl; cout << moldft_path; - } - } else { - if (world.rank() == 0) { + } else { std::cout << " We do not have moldft answers so please run and save the " "results in the molecule directory" << std::endl; } } - - if (std::filesystem::exists(moldft_restart) && - std::filesystem::exists(calc_info_json_path)) { - // if both exist, read the calc_info json - std::ifstream ifs(calc_info_json_path); - ifs >> calc_info_json; - world.gop.fence(); - if (world.rank() == 0) { - + world.gop.broadcast(moldft_json, 0); + if (world.rank() == 0) { + if (std::filesystem::exists(moldft_restart) && + std::filesystem::exists(calc_info_json_path)) { + // if both exist, read the calc_info json + std::ifstream ifs(calc_info_json_path); + ifs >> calc_info_json; std::cout << "time: " << calc_info_json["time"] << std::endl; std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; @@ -143,6 +140,7 @@ struct moldftSchema { << std::endl; } } + world.gop.broadcast(calc_info_json, 0); if (world.rank() == 0) { print(); } } @@ -166,13 +164,8 @@ struct frequencySchema { const path moldft_path; vector freq; - frequencySchema(World &world, const runSchema run_schema, const moldftSchema m_schema, - const std::string r_operator) - : mol_name(m_schema.mol_name), xc(m_schema.xc), op(r_operator), - moldft_path(m_schema.moldft_path) { - freq = run_schema.rdb.get_frequencies(mol_name, xc, op); - if (world.rank() == 0) { print_schema(); } - } + frequencySchema(World &world, const runSchema &run_schema, const moldftSchema& m_schema, + std::string r_operator); void print_schema() { print("Frequency Calculation"); @@ -183,6 +176,16 @@ struct frequencySchema { print("Frequencies : ", freq); } }; +frequencySchema::frequencySchema(World &world, const runSchema &run_schema, + const moldftSchema &m_schema, std::string r_operator) + : mol_name(m_schema.mol_name), xc(m_schema.xc), op(std::move(r_operator)), + moldft_path(m_schema.moldft_path) { + if (world.rank() == 0) { + freq = run_schema.rdb.get_frequencies(mol_name, xc, op); + print_schema(); + } + world.gop.broadcast_serializable(freq, 0); +} /** * Sets the excited state data found in the response_data_base class @@ -274,7 +277,7 @@ struct excitedSchema { rb_json = addPath(excited_state_run_path, "/response_base.json"); } - void print() { + void print() const { ::print("xc: ", xc); ::print("num states: ", num_states); @@ -351,7 +354,7 @@ auto generate_response_frequency_run_path(const std::filesystem::path &moldft_pa const std::string &property, const double &frequency, const std::string &xc) -> std::filesystem::path { std::string s_frequency = std::to_string(frequency); - auto sp = s_frequency.find("."); + auto sp = s_frequency.find('.'); s_frequency = s_frequency.replace(sp, sp, "-"); std::string run_name = property + "_" + xc + "_" + s_frequency; // set r_params to restart true if restart file exist @@ -362,22 +365,6 @@ auto generate_response_frequency_run_path(const std::filesystem::path &moldft_pa return run_path; } -/** - * Reads in current parameters and found parameters from calc_info.json and determines whether we should restart the calculation - * @param p1 - * @param p2 - * @return - */ -auto tryMOLDFT(CalculationParameters &p1, CalculationParameters &p2) -> bool { - - // first get the last protocol - - auto proto1 = p1.get>("protocol"); - auto proto2 = p1.get>("protocol"); - - return *(proto1.end() - 1) != *(proto2.end() - 1); -} - /** * Runs moldft in the path provided. Also generates the moldft input file_name * in the directory provided. @@ -394,10 +381,8 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo json calcInfo; if (world.rank() == 0) { - param1.set_user_defined_value("maxiter", 20); //param1.set_user_defined_value("Kain", true); - param1.set_user_defined_value("xc", moldftSchema.xc); param1.set_user_defined_value("l", 200); @@ -509,7 +494,7 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(15)); r_params.set_user_defined_value("maxsub", size_t(10)); - // if its too large then bad guess is very strong + // if it's too large then bad guess is very strong r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("plot_all_orbitals", false); r_params.set_user_defined_value("save", true); @@ -531,37 +516,40 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, * @param xc * @param frequency */ -void set_frequency_response_parameters(ResponseParameters &r_params, const std::string &property, - const std::string &xc, const double &frequency, - const std::string &precision) { - if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - r_params.set_user_defined_value("dconv", 1e-6); - } else if (precision == "low") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); - r_params.set_user_defined_value("dconv", 1e-4); - } else { - r_params.set_user_defined_value>("protocol", {1e-9}); - r_params.set_user_defined_value("dconv", 1e-7); - } - //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(30)); - r_params.set_user_defined_value("maxsub", size_t(5)); - r_params.set_user_defined_value("kain", true); - r_params.set_user_defined_value("omega", frequency); - r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals", false); - r_params.set_user_defined_value("plot", true); - r_params.set_user_defined_value("print_level", 20); - r_params.set_user_defined_value("save", true); - // set xc, property, frequency,and restart - r_params.set_user_defined_value("xc", xc); - // Here - if (property == "dipole") { - r_params.set_user_defined_value("dipole", true); - } else if (property == "nuclear") { - r_params.set_user_defined_value("nuclear", true); +void set_frequency_response_parameters(World &world, ResponseParameters &r_params, + const std::string &property, const std::string &xc, + const double &frequency, const std::string &precision) { + if (world.rank() == 0) { + if (precision == "high") { + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value("dconv", 1e-6); + } else if (precision == "low") { + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); + r_params.set_user_defined_value("dconv", 1e-4); + } else { + r_params.set_user_defined_value>("protocol", {1e-9}); + r_params.set_user_defined_value("dconv", 1e-7); + } + //r_params.set_user_defined_value("archive", std::string("../restartdata")); + r_params.set_user_defined_value("maxiter", size_t(30)); + r_params.set_user_defined_value("maxsub", size_t(5)); + r_params.set_user_defined_value("kain", true); + r_params.set_user_defined_value("omega", frequency); + r_params.set_user_defined_value("first_order", true); + r_params.set_user_defined_value("plot_all_orbitals", false); + r_params.set_user_defined_value("plot", true); + r_params.set_user_defined_value("print_level", 20); + r_params.set_user_defined_value("save", true); + // set xc, property, frequency,and restart + r_params.set_user_defined_value("xc", xc); + // Here + if (property == "dipole") { + r_params.set_user_defined_value("dipole", true); + } else if (property == "nuclear") { + r_params.set_user_defined_value("nuclear", true); + } } + world.gop.broadcast_serializable(r_params, 0); } /*** @@ -617,7 +605,7 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par // Then we restart from the previous file instead } else { parameters.set_user_defined_value("restart", false); - }; + } // neither file exists therefore you need to start from fresh } } @@ -643,7 +631,7 @@ auto RunResponse(World &world, const std::string &filename, double frequency, const std::string &precision) -> std::pair { // Set the response parameters ResponseParameters r_params{}; - set_frequency_response_parameters(r_params, property, xc, frequency, precision); + set_frequency_response_parameters(world, r_params, property, xc, frequency, precision); auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, moldft_path, restart_path, true); if (world.rank() == 0) { molresponse::write_response_input(r_params, filename); } @@ -663,7 +651,6 @@ auto RunResponse(World &world, const std::string &filename, double frequency, } else { rhs_generator = nuclear_generator; } - FunctionDefaults<3>::set_pmap(pmapT(new LevelPmap>(world))); FrequencyResponse calc(world, calc_params, frequency, rhs_generator); if (world.rank() == 0) { @@ -724,8 +711,7 @@ static void set_and_write_restart_excited_parameters(ResponseParameters ¶met * @param frequency * @param moldft_path */ -static void create_excited_paths(ResponseParameters ¶meters, excitedSchema &schema, - bool restart) { +static void create_excited_paths(ResponseParameters ¶meters, excitedSchema &schema) { if (std::filesystem::is_directory(schema.excited_state_run_path)) { cout << "Response directory found " << std::endl; @@ -753,7 +739,7 @@ auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec ResponseParameters r_params{}; set_excited_parameters(r_params, schema.xc, schema.num_states, high_prec); - create_excited_paths(r_params, schema, restart); + create_excited_paths(r_params, schema); std::filesystem::current_path(schema.excited_state_run_path); set_and_write_restart_excited_parameters(r_params, schema, restart); @@ -828,18 +814,15 @@ void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, if (std::filesystem::is_directory(m_schema.moldft_path)) { if (world.rank() == 0) { cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; } } else {// create the file - std::filesystem::create_directory(m_schema.moldft_path); - if (world.rank() == 0) { - cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" - << m_schema.moldft_path << ":\n"; - } + if (world.rank() == 0) { std::filesystem::create_directory(m_schema.moldft_path); } + cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" + << m_schema.moldft_path << ":\n"; + world.gop.fence(); } std::filesystem::current_path(m_schema.moldft_path); - world.gop.fence(); if (world.rank() == 0) { cout << "Entering : " << m_schema.moldft_path << " to run MOLDFT \n\n"; } - runMOLDFT(world, m_schema, try_moldft, restart, precision); } diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index a3a4f9b7791..96ca7f864c5 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -37,7 +37,7 @@ int main(int argc, char *argv[]) { excited_schema.print(); ResponseParameters r_params{}; set_excited_parameters(r_params, excited_schema.xc, excited_schema.num_states, false); - create_excited_paths(r_params, excited_schema, false); + create_excited_paths(r_params, excited_schema); std::filesystem::current_path(excited_schema.excited_state_run_path); set_and_write_restart_excited_parameters(r_params, excited_schema, false); auto xc_path = create_xc_path_and_directory(root, xc); From e743f19f539b37fb4522382803d7d434f5ab369f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 18:07:34 -0500 Subject: [PATCH 0836/1312] unused library --- src/apps/molresponse/testing/mad-freq.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 36695d19388..d2f46042829 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -10,7 +10,6 @@ #if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) #include -#include #include static inline int file_exists(const char *input_name) { From 9bcc76bfbda7873bde8d83979596f8318b9ea22a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 21:23:19 -0500 Subject: [PATCH 0837/1312] I don't think I need to bsh residuals to converge so tightly --- src/apps/molresponse/testing/mad-freq.cpp | 4 ++-- src/apps/molresponse/testing/runners.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index d2f46042829..0791d0d75b5 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -59,6 +59,8 @@ auto main(int argc, char *argv[]) -> int { } else { moldft(world, m_schema, true, false, precision); runFrequencyTests(world, f_schema, precision); + world.gop.fence(); + world.gop.fence(); } } catch (const SafeMPI::Exception &e) { print(e); @@ -83,8 +85,6 @@ auto main(int argc, char *argv[]) -> int { print(e.what()); } catch (...) { error("caught unhandled exception"); } // Nearly all memory will be freed at this point - world.gop.fence(); - world.gop.fence(); print_stats(world); if (world.rank() == 0) { print("Finished All Frequencies"); } } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index b3550cdf307..292fe95937e 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -485,7 +485,7 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, if (high_prec) { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); r_params.set_user_defined_value("dconv", 1e-6); } else { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); @@ -521,7 +521,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); From 09f45b15725a6e48128294a2787e8cf3f64e92c1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 21:54:59 -0500 Subject: [PATCH 0838/1312] loosening convergence threshold on relative bsh residuals --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- src/apps/molresponse/testing/runners.hpp | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3499b4a30a1..fd1281855b8 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,9 +21,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(10 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(20 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 292fe95937e..8d0100f2f75 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -409,7 +409,6 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo } } world.gop.broadcast_serializable(param1, 0); - world.gop.broadcast(calcInfo, 0); //If the parameters are exactly equal do not run // If calc info doesn't exist the param_calc will definitely be different From f84fee3ad5285eee8f94c82e8449d5879f20e93f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 22:27:44 -0500 Subject: [PATCH 0839/1312] loosening convergence threshold on relative bsh residuals --- src/apps/molresponse/testing/runners.hpp | 42 +++++++++--------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 8d0100f2f75..8cae8fef032 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -105,34 +105,25 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(World &world, const std::string &molecule_name, std::string m_xc, + moldftSchema(World &world, std::string molecule_name, std::string m_xc, const runSchema &schema) - : mol_name(molecule_name), xc(std::move(m_xc)) { + : mol_name(std::move(molecule_name)), xc(std::move(m_xc)) { moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); - if (world.rank() == 0) { - if (std::filesystem::exists(moldft_json_path)) { - std::ifstream ifs(moldft_json_path); - ifs >> moldft_json; - std::cout << "Here are the current answers for" << molecule_name - << " check to see if they need to be updated please!" << std::endl; - cout << moldft_path; - } else { - std::cout << " We do not have moldft answers so please run and save the " - "results in the molecule directory" - << std::endl; - } + if (std::filesystem::exists(moldft_json_path)) { + std::ifstream ifs(moldft_json_path); + ifs >> moldft_json; } - world.gop.broadcast(moldft_json, 0); - if (world.rank() == 0) { - if (std::filesystem::exists(moldft_restart) && - std::filesystem::exists(calc_info_json_path)) { - // if both exist, read the calc_info json - std::ifstream ifs(calc_info_json_path); - ifs >> calc_info_json; + if (std::filesystem::exists(moldft_restart) && + std::filesystem::exists(calc_info_json_path)) { + // if both exist, read the calc_info json + std::ifstream ifs(calc_info_json_path); + ifs >> calc_info_json; + if (world.rank() == 0) { + std::cout << "time: " << calc_info_json["time"] << std::endl; std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] << std::endl; @@ -140,7 +131,6 @@ struct moldftSchema { << std::endl; } } - world.gop.broadcast(calc_info_json, 0); if (world.rank() == 0) { print(); } } @@ -164,8 +154,8 @@ struct frequencySchema { const path moldft_path; vector freq; - frequencySchema(World &world, const runSchema &run_schema, const moldftSchema& m_schema, - std::string r_operator); + frequencySchema(World &world, const runSchema &run_schema, const moldftSchema &m_schema, + std::string r_operator); void print_schema() { print("Frequency Calculation"); @@ -178,8 +168,8 @@ struct frequencySchema { }; frequencySchema::frequencySchema(World &world, const runSchema &run_schema, const moldftSchema &m_schema, std::string r_operator) - : mol_name(m_schema.mol_name), xc(m_schema.xc), op(std::move(r_operator)), - moldft_path(m_schema.moldft_path) { + : mol_name(m_schema.mol_name), xc(m_schema.xc), op(std::move(r_operator)), + moldft_path(m_schema.moldft_path) { if (world.rank() == 0) { freq = run_schema.rdb.get_frequencies(mol_name, xc, op); print_schema(); From 49005166c5da6dd172a5fe73db55ff2b0387af77 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 22:41:56 -0500 Subject: [PATCH 0840/1312] 100*thresh for dconv --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 22 +++++++--------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index fd1281855b8..85e56a1e9ea 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,7 +21,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(10 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = std::max(500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 8cae8fef032..1af7d9e7fe0 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -65,19 +65,12 @@ struct runSchema { dalton_excited_json = addPath(molecule_path, "/dalton-excited.json"); dalton_dipole_json = addPath(molecule_path, "/dalton-dipole.json"); rdb = ResponseDataBase(); - if (world.rank() == 0) { - std::cout << "Trying to read frequency.json" << std::endl; - if (std::filesystem::exists(freq_json)) { - std::ifstream ifs(freq_json); - json j_read; - ifs >> j_read; - rdb.set_data(j_read); - std::cout << "READ IT" << std::endl; - } else { - std::cout << "did not find frequency.json" << std::endl; - } + if (std::filesystem::exists(freq_json)) { + std::ifstream ifs(freq_json); + json j_read; + ifs >> j_read; + rdb.set_data(j_read); } - world.gop.broadcast(rdb, 0); if (world.rank() == 0) { print(); } } @@ -105,8 +98,7 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(World &world, std::string molecule_name, std::string m_xc, - const runSchema &schema) + moldftSchema(World &world, std::string molecule_name, std::string m_xc, const runSchema &schema) : mol_name(std::move(molecule_name)), xc(std::move(m_xc)) { moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); @@ -510,7 +502,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); From 0d89dc469a94a782e7bc9add44acfaf4018b4924 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 1 Dec 2022 23:27:27 -0500 Subject: [PATCH 0841/1312] 100*thresh for dconv --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 85e56a1e9ea..2e42d4a5dba 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 02546cf2b2c7c197c3a4ca1cd599c85e65320a75 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 12:13:26 -0500 Subject: [PATCH 0842/1312] new step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 59 +++++++--------------- 2 files changed, 18 insertions(+), 43 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2e42d4a5dba..6052e41faf2 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(1500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c9033a3a433..64f4fd83152 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1147,56 +1147,31 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (r_params.print_level() >= 1) { molresponse::start_timer(world); } print(maxrotn); auto diff = temp - old_Chi; - diff.truncate(); + auto m_old = to_response_matrix(old_Chi); + auto m_new = to_response_matrix(temp); + auto m_diff = to_response_matrix(diff); if (world.rank() == 0) { print("----------------Start Step Restriction -----------------"); } for (size_t b = 0; b < m; b++) { - if (true) { - - auto x_copy = copy(world, old_Chi.X[b]); - auto y_copy = copy(world, old_Chi.Y[b]); - - auto x_diff = copy(world, diff.X[b]); - auto y_diff = copy(world, diff.Y[b]); - - - //auto sq_diff_x = square(world, diff.X[b], true); - //auto sq_diff_y = square(world, diff.Y[b], true); - - for (auto &dy: y_diff) { x_diff.push_back(dy); } - for (auto &y: y_copy) { x_copy.push_back(y); } - - auto norm_X = sqrt(inner(x_copy, x_copy)); - auto norm_xb = sqrt(inner(x_diff, x_diff)); - - auto max_step = maxrotn * norm_X; - - + auto step_size = norm2(world, m_diff[b]); + auto norm_xb = norm2(world, m_old[b]); + auto max_step = maxrotn * norm_xb; + if (world.rank() == 0) { + print("---------------- step restriction :", b, " ------------------"); + if (world.rank() == 0) { print("X[b]: ", norm_xb); } + if (world.rank() == 0) { print("deltaX[b]: ", step_size); } + if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } + } + if (step_size > max_step) { + double s = max_step / step_size; if (world.rank() == 0) { - print("---------------- step restriction :", b, " ------------------"); + if (r_params.print_level() > 1) + print(" restricting step for response-state: ", b, " step size", s); } - - if (norm_xb > max_step) { - if (world.rank() == 0) { print("X[b]: ", norm_X); } - if (world.rank() == 0) { print("deltaX[b]: ", norm_xb); } - if (world.rank() == 0) { print("max_rotation: ", maxrotn); } - if (world.rank() == 0) { - print("max_step = max_rotation*norm_X: ", maxrotn * norm_X); - } - double s = max_step / norm_xb; - if (world.rank() == 0) { - if (r_params.print_level() > 1) - print(" restricting step for response-state: ", b, " step size", s); - } - gaxpy(world, s, temp.X[b], (1.0 - s), old_Chi.X[b], true); - gaxpy(world, s, temp.Y[b], (1.0 - s), old_Chi.Y[b], true); - } - } else { - //do_step_restriction(world, old_Chi.X[b], temp.X[b], "x_response", maxrotn); + gaxpy(world, s, m_new[b], (1.0 - s), m_old[b], false); } } if (world.rank() == 0) { print("----------------End Step Restriction -----------------"); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "x_space_restriction", "x_space_restriction", iter_timing); } From dbbfc73c5b38a4b3364aec0080b1d370f632adac Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 12:15:43 -0500 Subject: [PATCH 0843/1312] only gamma +=W if c_xc != 1 --- src/apps/molresponse/ResponseBase.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 64f4fd83152..8e0fbe412bc 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -444,7 +444,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // x functions - // Two ways single vector or vector vector style // here I create the orbital products for elctron interaction terms vecfuncT phi_phi; vecfuncT x_phi; @@ -543,8 +542,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.rank() == 0) { print("gamma: 2 * J"); } gamma += -c_xc * K; if (world.rank() == 0) { print("gamma: += -c_xc * K"); } - gamma += W; - if (world.rank() == 0) { print("gamma: += W"); } + + if (xcf.hf_exchange_coefficient() != 1.0) { + gamma += W; + if (world.rank() == 0) { print("gamma: += W"); } + } //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma add", "gamma_truncate_add", iter_timing); From 1e5147495c27b63fe3211cd9d0027a1d3f76defb Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 12:17:15 -0500 Subject: [PATCH 0844/1312] deleting some comments --- src/apps/molresponse/ResponseBase.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 8e0fbe412bc..21bd3f9e7f4 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -569,10 +569,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit print_inner(world, "xGammax", chi_alpha, gamma); molresponse::end_timer(world, "Print Expectation Creating Gamma:"); } - // put - // put it all together - // no 2-electron - // End timer molresponse::start_timer(world); J.clear(); From 7defa5419ea66fafa01eb15487d45b64d0d1bf40 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 12:20:12 -0500 Subject: [PATCH 0845/1312] turn on step restriction with kain --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6052e41faf2..fb9417817c6 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -262,9 +262,9 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp if (r_params.kain() && (iteration > 2)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } - if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x if (r_params.print_level() >= 1) { From 88355196590507ca785e5a7e32e4f223d57581e5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 14:12:52 -0500 Subject: [PATCH 0846/1312] loosen density convergence --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index fb9417817c6..816e42bec8e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,9 +21,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(250 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(1500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From e04c3d8d8ca6c2e9aae33f4b33728a6e29ebbbfd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 14:30:02 -0500 Subject: [PATCH 0847/1312] limit the number of kain iterations --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 816e42bec8e..e8276750682 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -260,7 +260,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 2)) { + if (r_params.kain() && (iteration > 2 && iteration < 8)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From 62473b04b2b5fc942678afa1ddc1f8cf72995fa8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 14:56:42 -0500 Subject: [PATCH 0848/1312] include kain one iteration earlier --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e8276750682..472f0aea8d5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -260,7 +260,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 2 && iteration < 8)) { + if (r_params.kain() && (iteration > 1 && iteration < 6)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From 6922a9c67c10d53b6ad232f7097aead3fe593017 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 2 Dec 2022 15:05:52 -0500 Subject: [PATCH 0849/1312] seperate step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 472f0aea8d5..46bb09aa3dd 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -260,8 +260,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 1 && iteration < 6)) { + if (r_params.kain() && (iteration > 1 && iteration < 10)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + } + if (r_params.kain() && (iteration > 7)) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From 85a3706490f29fd1197974ac8652e3958a6de727 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 14:02:09 -0500 Subject: [PATCH 0850/1312] re-implement multiworld exchange --- src/apps/molresponse/ResponseBase.cpp | 3 ++ src/apps/molresponse/global_functions.cc | 55 ++++++++++++++++++++++++ src/apps/molresponse/global_functions.h | 1 + 3 files changed, 59 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 21bd3f9e7f4..50b8937cd8a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -535,6 +535,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + K = response_exchange_multiworld(phi0, chi_alpha, true); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega] multiworld"); } molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index d1f9eb5033f..70eb9d1594c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -297,4 +297,59 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br molresponse::end_timer(world, "ground exchange reorganize"); return K0; } +/** + * Computes ground density exchange on response vectors + * This algorithm places all functions in a single vector, + * computes exchange and returns the result into a response + * matrix + * + * @param v1 + * @param v2 + * @param f + * @return + */ +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool compute_y) + -> X_space { + World &world = phi0[0].world(); + molresponse::start_timer(world); + + auto num_states = chi.num_states(); + auto num_orbitals = chi.num_orbitals(); + + response_matrix K1 = response_matrix(num_states); + response_matrix K2 = response_matrix(num_states); + response_matrix K = response_matrix(num_states); + + // [x,y] [phi,phi] + auto x_vec = to_response_matrix(chi); + // [y_dag,x_dag] [phi,phi] + auto conjugate_x = to_conjugate_response_matrix(chi); + //phi phi + + vecfuncT response_phi(2 * num_orbitals); + int i = 0; + std::for_each(response_phi.begin(), response_phi.end(), + [&](auto &phi) { phi = phi0[i++ % num_orbitals]; }); + // the question is copying pointers mpi safe + auto phi0_1 = copy(world, response_phi, false); + auto phi0_2 = copy(world, response_phi, false); + world.gop.fence(); + const double lo = 1.e-10; + int b = 0; + for (auto &ki: K) { + Exchange op_1{}; + op_1.set_parameters(x_vec[b], response_phi, lo); + op_1.set_algorithm(op_1.multiworld_efficient); + Exchange op_2{}; + op_2.set_parameters(response_phi, conjugate_x[b], lo); + op_2.set_algorithm(op_2.multiworld_efficient); + auto k1_b = op_1(phi0_1); + auto k2_b = op_2(phi0_2); + ki = gaxpy_oop(1.0, k1_b, 1.0, k2_b, false); + b++; + } + world.gop.fence(); + + return to_X_space(K); +} // sum_i |i> for each p diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 4a4727422c5..8d945fdd1b9 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -50,6 +50,7 @@ vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, const vecfuncT &fp, const int &n, const int &num_states, const int &num_orbitals) -> X_space; +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool compute_y) -> X_space; vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } From 31eae6f2b41d49f56a1bb3e47cb00d664834dfc4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 14:06:22 -0500 Subject: [PATCH 0851/1312] with printing for testing --- src/apps/molresponse/ResponseBase.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 50b8937cd8a..adcc533b2e6 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -534,10 +534,13 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); + print_inner(world, "old xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, chi_alpha, true); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega] multiworld"); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega] multiworld"); + print_inner(world, "new xKx", chi_alpha, K); + } molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); From ba294c10f252e972288235a5fc9b61f065bf4435 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 15:01:08 -0500 Subject: [PATCH 0852/1312] new exchange --- src/apps/molresponse/global_functions.cc | 61 +++++++++++++----------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 70eb9d1594c..99129715420 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -316,40 +316,43 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); - response_matrix K1 = response_matrix(num_states); - response_matrix K2 = response_matrix(num_states); - response_matrix K = response_matrix(num_states); + auto K = X_space(world, num_states, num_orbitals); - // [x,y] [phi,phi] - auto x_vec = to_response_matrix(chi); - // [y_dag,x_dag] [phi,phi] - auto conjugate_x = to_conjugate_response_matrix(chi); - //phi phi - - vecfuncT response_phi(2 * num_orbitals); - int i = 0; - std::for_each(response_phi.begin(), response_phi.end(), - [&](auto &phi) { phi = phi0[i++ % num_orbitals]; }); + auto phi_1 = copy(world, phi0, false); + auto phi_2 = copy(world, phi0, false); + auto phi_3 = copy(world, phi0, false); + auto phi_4 = copy(world, phi0, false); // the question is copying pointers mpi safe - auto phi0_1 = copy(world, response_phi, false); - auto phi0_2 = copy(world, response_phi, false); world.gop.fence(); const double lo = 1.e-10; - int b = 0; - for (auto &ki: K) { - Exchange op_1{}; - op_1.set_parameters(x_vec[b], response_phi, lo); - op_1.set_algorithm(op_1.multiworld_efficient); - Exchange op_2{}; - op_2.set_parameters(response_phi, conjugate_x[b], lo); - op_2.set_algorithm(op_2.multiworld_efficient); - auto k1_b = op_1(phi0_1); - auto k2_b = op_2(phi0_2); - ki = gaxpy_oop(1.0, k1_b, 1.0, k2_b, false); - b++; + for (int b = 0; b < num_states; b++) { + Exchange op_1x{}; + op_1x.set_parameters(chi.X[b], phi0, lo); + op_1x.set_algorithm(op_1x.small_memory); + + Exchange op_1y{}; + op_1y.set_parameters(chi.Y[b], phi0, lo); + op_1y.set_algorithm(op_1y.small_memory); + + Exchange op_2x{}; + op_2x.set_parameters(phi0, chi.Y[b], lo); + op_2x.set_algorithm(op_2x.small_memory); + Exchange op_2y{}; + op_2y.set_parameters(phi0, chi.X[b], lo); + op_2y.set_algorithm(op_2y.small_memory); + + auto k1x = op_1x(phi_1); + auto k2x = op_2x(phi_1); + + auto k1y = op_1y(phi_1); + auto k2y = op_2y(phi_1); + + + world.gop.fence(); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); + K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); } world.gop.fence(); - - return to_X_space(K); + return K; } // sum_i |i> for each p From a3ffb9febe2ae8f504a9d7fbf999ebd7ff85e512 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 15:29:22 -0500 Subject: [PATCH 0853/1312] try copy algo and set with copy --- src/apps/molresponse/global_functions.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 99129715420..8c2fe6bba0b 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -317,29 +317,30 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_orbitals = chi.num_orbitals(); auto K = X_space(world, num_states, num_orbitals); - auto phi_1 = copy(world, phi0, false); auto phi_2 = copy(world, phi0, false); auto phi_3 = copy(world, phi0, false); auto phi_4 = copy(world, phi0, false); // the question is copying pointers mpi safe + world.gop.fence(); const double lo = 1.e-10; for (int b = 0; b < num_states; b++) { Exchange op_1x{}; + auto algo=op_1x.small_memory; op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(op_1x.small_memory); + op_1x.set_algorithm(algo); Exchange op_1y{}; op_1y.set_parameters(chi.Y[b], phi0, lo); - op_1y.set_algorithm(op_1y.small_memory); + op_1y.set_algorithm(algo); Exchange op_2x{}; op_2x.set_parameters(phi0, chi.Y[b], lo); - op_2x.set_algorithm(op_2x.small_memory); + op_2x.set_algorithm(algo); Exchange op_2y{}; op_2y.set_parameters(phi0, chi.X[b], lo); - op_2y.set_algorithm(op_2y.small_memory); + op_2y.set_algorithm(algo); auto k1x = op_1x(phi_1); auto k2x = op_2x(phi_1); From a0714df8fd892aebe14b9f451cafd14860c34d49 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 15:31:38 -0500 Subject: [PATCH 0854/1312] try multiworld efficient --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8c2fe6bba0b..617d055fc1a 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -327,7 +327,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons const double lo = 1.e-10; for (int b = 0; b < num_states; b++) { Exchange op_1x{}; - auto algo=op_1x.small_memory; + auto algo=op_1x.multiworld_efficient; op_1x.set_parameters(chi.X[b], phi0, lo); op_1x.set_algorithm(algo); From 0c10c62ed14ad1ba092429148d29f770baf0bc28 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 15:45:37 -0500 Subject: [PATCH 0855/1312] implement new static exchange --- src/apps/molresponse/global_functions.cc | 59 +++++++++++++++++++++--- src/apps/molresponse/global_functions.h | 3 +- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 617d055fc1a..2e42985d2b7 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -308,8 +308,8 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br * @param f * @return */ -auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool compute_y) - -> X_space { +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, + const Exchange::Algorithm algo) -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); @@ -327,7 +327,6 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons const double lo = 1.e-10; for (int b = 0; b < num_states; b++) { Exchange op_1x{}; - auto algo=op_1x.multiworld_efficient; op_1x.set_parameters(chi.X[b], phi0, lo); op_1x.set_algorithm(algo); @@ -343,10 +342,10 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons op_2y.set_algorithm(algo); auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_1); + auto k2x = op_2x(phi_2); - auto k1y = op_1y(phi_1); - auto k2y = op_2y(phi_1); + auto k1y = op_1y(phi_3); + auto k2y = op_2y(phi_4); world.gop.fence(); @@ -356,4 +355,52 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); return K; } + +/** + * Computes ground density exchange on response vectors + * This algorithm places all functions in a single vector, + * computes exchange and returns the result into a response + * matrix + * + * @param v1 + * @param v2 + * @param f + * @return + */ +auto response_exchange_multiworld_static(const vecfuncT &phi0, const X_space &chi, + Exchange::Algorithm algo) -> X_space { + World &world = phi0[0].world(); + molresponse::start_timer(world); + + auto num_states = chi.num_states(); + auto num_orbitals = chi.num_orbitals(); + + auto K = X_space(world, num_states, num_orbitals); + auto phi_1 = copy(world, phi0, false); + auto phi_2 = copy(world, phi0, false); + // the question is copying pointers mpi safe + + world.gop.fence(); + const double lo = 1.e-10; + for (int b = 0; b < num_states; b++) { + Exchange op_1x{}; + op_1x.set_parameters(chi.X[b], phi0, lo); + op_1x.set_algorithm(algo); + + + Exchange op_2x{}; + op_2x.set_parameters(phi0, chi.X[b], lo); + op_2x.set_algorithm(algo); + + auto k1x = op_1x(phi_1); + auto k2x = op_2x(phi_2); + + + world.gop.fence(); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); + K.Y[b] = copy(world, K.X[b], false); + } + world.gop.fence(); + return K; +} // sum_i |i> for each p diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 8d945fdd1b9..36c95fac2c4 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -50,7 +50,8 @@ vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, const vecfuncT &fp, const int &n, const int &num_states, const int &num_orbitals) -> X_space; -auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool compute_y) -> X_space; +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, + const Exchange::Algorithm algo) -> X_space; vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } From d060a8367a003b10968b32ee9e68b75e6a0e37db Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:19:43 -0500 Subject: [PATCH 0856/1312] implement new exchange with comparision --- src/apps/molresponse/ResponseBase.cpp | 19 +++- src/apps/molresponse/global_functions.cc | 116 ++++++++++++++--------- src/apps/molresponse/global_functions.h | 5 +- 3 files changed, 88 insertions(+), 52 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index adcc533b2e6..f7794e3003a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -534,11 +534,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto K = response_exchange(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); - print_inner(world, "old xKx", chi_alpha, K); + print_inner(world, "old xKx", chi_alpha, K); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, chi_alpha, true); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega] multiworld"); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "K[omega] multiworld"); print_inner(world, "new xKx", chi_alpha, K); } molresponse::start_timer(world); @@ -683,10 +684,14 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange(phi0, xy, false); - if (r_params.print_level() >= 20) { print_inner(world, "new xKx", xy, K); } + if (r_params.print_level() >= 20) { print_inner(world, "old static KX", xy, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + K = response_exchange_multiworld(phi0, xy, false); + if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } // for each response state we compute the Gamma response functions // trucate all response functions if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -1033,7 +1038,13 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "old K[0]"); } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + K0 = ground_exchange_multiworld(phi0_copy, X, compute_Y); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "new K[0]", "K[0]", iter_timing); + } if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 2e42985d2b7..e5f6415fa41 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -308,8 +308,8 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br * @param f * @return */ -auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, - const Exchange::Algorithm algo) -> X_space { +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool &compute_y) + -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); @@ -322,40 +322,63 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, auto phi_3 = copy(world, phi0, false); auto phi_4 = copy(world, phi0, false); // the question is copying pointers mpi safe - + Exchange op{}; + const Exchange::Algorithm algo = op.multiworld_efficient; world.gop.fence(); const double lo = 1.e-10; - for (int b = 0; b < num_states; b++) { - Exchange op_1x{}; - op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(algo); + if (compute_y) { + + for (int b = 0; b < num_states; b++) { + Exchange op_1x{}; + op_1x.set_parameters(chi.X[b], phi0, lo); + op_1x.set_algorithm(algo); + + Exchange op_1y{}; + op_1y.set_parameters(chi.Y[b], phi0, lo); + op_1y.set_algorithm(algo); + + Exchange op_2x{}; + op_2x.set_parameters(phi0, chi.Y[b], lo); + op_2x.set_algorithm(algo); + Exchange op_2y{}; + op_2y.set_parameters(phi0, chi.X[b], lo); + op_2y.set_algorithm(algo); + + auto k1x = op_1x(phi_1); + auto k2x = op_2x(phi_2); - Exchange op_1y{}; - op_1y.set_parameters(chi.Y[b], phi0, lo); - op_1y.set_algorithm(algo); + auto k1y = op_1y(phi_3); + auto k2y = op_2y(phi_4); - Exchange op_2x{}; - op_2x.set_parameters(phi0, chi.Y[b], lo); - op_2x.set_algorithm(algo); - Exchange op_2y{}; - op_2y.set_parameters(phi0, chi.X[b], lo); - op_2y.set_algorithm(algo); - auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_2); + world.gop.fence(); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); + K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); + } + } else { + for (int b = 0; b < num_states; b++) { + Exchange op_1x{}; + op_1x.set_parameters(chi.X[b], phi0, lo); + op_1x.set_algorithm(algo); - auto k1y = op_1y(phi_3); - auto k2y = op_2y(phi_4); + Exchange op_2x{}; + op_2x.set_parameters(phi0, chi.X[b], lo); + op_2x.set_algorithm(algo); + auto k1x = op_1x(phi_1); + auto k2x = op_2x(phi_2); + world.gop.fence(); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); + } world.gop.fence(); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); - K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); + K.Y = K.X.copy(); } world.gop.fence(); return K; } +// sum_i |i> for each p /** * Computes ground density exchange on response vectors * This algorithm places all functions in a single vector, @@ -367,40 +390,41 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, * @param f * @return */ -auto response_exchange_multiworld_static(const vecfuncT &phi0, const X_space &chi, - Exchange::Algorithm algo) -> X_space { +auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool &compute_y) + -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); - auto K = X_space(world, num_states, num_orbitals); - auto phi_1 = copy(world, phi0, false); - auto phi_2 = copy(world, phi0, false); + auto K0 = X_space(world, num_states, num_orbitals); // the question is copying pointers mpi safe - + Exchange op{}; + const Exchange::Algorithm algo = op.multiworld_efficient; world.gop.fence(); const double lo = 1.e-10; - for (int b = 0; b < num_states; b++) { - Exchange op_1x{}; - op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(algo); - - - Exchange op_2x{}; - op_2x.set_parameters(phi0, chi.X[b], lo); - op_2x.set_algorithm(algo); - - auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_2); - - + if (compute_y) { + for (int b = 0; b < num_states; b++) { + Exchange op_0x{}; + op_0x.set_parameters(phi0, phi0, lo); + op_0x.set_algorithm(algo); + Exchange op_0y{}; + op_0y.set_parameters(phi0, phi0, lo); + op_0y.set_algorithm(algo); + K0.X[b] = op_0x(chi.X[b]); + K0.Y[b] = op_0y(chi.Y[b]); + } + } else { + for (int b = 0; b < num_states; b++) { + Exchange op_0x{}; + op_0x.set_parameters(phi0, phi0, lo); + op_0x.set_algorithm(algo); + K0.X[b] = op_0x(chi.X[b]); + } world.gop.fence(); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); - K.Y[b] = copy(world, K.X[b], false); + K0.X = K0.Y.copy(); } world.gop.fence(); - return K; + return K0; } -// sum_i |i> for each p diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 36c95fac2c4..fc34b48a106 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -45,13 +45,14 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); response_space T(World &world, response_space &f); auto ground_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; +auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &x, const bool& compute_y) -> X_space; auto response_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &bra_i, const vecfuncT &fp, const int &n, const int &num_states, const int &num_orbitals) -> X_space; -auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, - const Exchange::Algorithm algo) -> X_space; +auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const bool &compute_y) + -> X_space; vecfuncT newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf); // compute exchange |i> static double rsquared(const coord_3d &r) { return r[0] * r[0] + r[1] * r[1] + r[2] * r[2]; } From 71527b92539995d0bfca1c603bba305ee2ebf942 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:24:05 -0500 Subject: [PATCH 0857/1312] print the comparisons for kO --- src/apps/molresponse/ResponseBase.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f7794e3003a..34d0bf27f10 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1038,15 +1038,18 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange(phi0_copy, X, compute_Y); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "old K[0]"); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "old K[0]"); + print_inner(world, "new xK0x", Chi_copy, K0); + } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(phi0_copy, X, compute_Y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]", "K[0]", iter_timing); + print_inner(world, "new xK0x", Chi_copy, K0); } - if (r_params.print_level() >= 20) { print_inner(world, "xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; auto c_xc = xcf.hf_exchange_coefficient(); From ee5bfe0598dbc7ec13093cbd581e255396aa63c1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:30:23 -0500 Subject: [PATCH 0858/1312] multiworld efficient is still kinda slow --- src/apps/molresponse/global_functions.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index e5f6415fa41..a65c51ffe7e 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -323,7 +323,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto phi_4 = copy(world, phi0, false); // the question is copying pointers mpi safe Exchange op{}; - const Exchange::Algorithm algo = op.multiworld_efficient; + const Exchange::Algorithm algo = op.small_memory; world.gop.fence(); const double lo = 1.e-10; if (compute_y) { @@ -401,7 +401,7 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const auto K0 = X_space(world, num_states, num_orbitals); // the question is copying pointers mpi safe Exchange op{}; - const Exchange::Algorithm algo = op.multiworld_efficient; + const Exchange::Algorithm algo = op.small_memory; world.gop.fence(); const double lo = 1.e-10; if (compute_y) { From 350e265ed388d0f8b42a12fe82d8e2e113449f20 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:35:30 -0500 Subject: [PATCH 0859/1312] blatant bug --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index a65c51ffe7e..5eef987be39 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -423,7 +423,7 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const K0.X[b] = op_0x(chi.X[b]); } world.gop.fence(); - K0.X = K0.Y.copy(); + K0.Y = K0.X.copy(); } world.gop.fence(); return K0; From 902232f27d2a5365dbe230eae2abac6abe264d72 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:43:29 -0500 Subject: [PATCH 0860/1312] no need to copy K.X into K.Y for static int --- src/apps/molresponse/global_functions.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 5eef987be39..0c91c1303f1 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -371,8 +371,6 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); } - world.gop.fence(); - K.Y = K.X.copy(); } world.gop.fence(); return K; @@ -422,8 +420,6 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0x.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); } - world.gop.fence(); - K0.Y = K0.X.copy(); } world.gop.fence(); return K0; From c63c13e7cdc224ab48d2a3b18757e3bbb74345e7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:49:38 -0500 Subject: [PATCH 0861/1312] initialize K to zero functions --- src/apps/molresponse/global_functions.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 0c91c1303f1..f9b655d1b5c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -63,7 +63,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ molresponse::start_timer(world); auto num_states = x.num_states(); auto num_orbitals = x.num_orbitals(); - X_space K0 = X_space(world, x.num_states(), x.num_orbitals()); + X_space K0 = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); long n{}; response_matrix xx; // place all x and y functions into a single response vector @@ -396,7 +396,7 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); - auto K0 = X_space(world, num_states, num_orbitals); + auto K0 = X_space::zero_functions(world, num_states, num_orbitals); // the question is copying pointers mpi safe Exchange op{}; const Exchange::Algorithm algo = op.small_memory; From e687c3b6bf4df120814964d76a3cf7e2ea5d989e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 16:52:04 -0500 Subject: [PATCH 0862/1312] initialize K to zero functions --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f9b655d1b5c..eec1d6e2db7 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -316,7 +316,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); - auto K = X_space(world, num_states, num_orbitals); + auto K = X_space::zero_functions(world, num_states, num_orbitals); auto phi_1 = copy(world, phi0, false); auto phi_2 = copy(world, phi0, false); auto phi_3 = copy(world, phi0, false); From b03146ade8c607e74fd91b2a3f57440d7c01e1ae Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 17:13:08 -0500 Subject: [PATCH 0863/1312] remove the large memory exchange algorithm --- src/apps/molresponse/ResponseBase.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 34d0bf27f10..3dd4f660d7d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -531,17 +531,19 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto K = response_exchange(phi0, chi_alpha, true); + auto K = response_exchange_multiworld(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); - print_inner(world, "old xKx", chi_alpha, K); } + if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K = response_exchange_multiworld(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { + K = response_exchange(phi0, chi_alpha, true); molresponse::end_timer(world, "K[omega] multiworld"); print_inner(world, "new xKx", chi_alpha, K); } + */ molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); @@ -683,15 +685,18 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K = response_exchange(phi0, xy, false); - if (r_params.print_level() >= 20) { print_inner(world, "old static KX", xy, K); } + K = response_exchange_multiworld(phi0, xy, false); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } + if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } + + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K = response_exchange_multiworld(phi0, xy, false); + K = response_exchange(phi0, xy, false); if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } + */ // for each response state we compute the Gamma response functions // trucate all response functions if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -1037,18 +1042,20 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + /* K0 = ground_exchange(phi0_copy, X, compute_Y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "old K[0]"); print_inner(world, "new xK0x", Chi_copy, K0); } + */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(phi0_copy, X, compute_Y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]", "K[0]", iter_timing); - print_inner(world, "new xK0x", Chi_copy, K0); } + if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; From 4469bfac96d2967792c3424eaad1e2be1d23dbb3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 17:21:58 -0500 Subject: [PATCH 0864/1312] tighten dconv --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 46bb09aa3dd..e74a0c65d05 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,7 +21,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(250 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y From c0a6afcc53b4006d73f62b31c004eb79ead29e07 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 17:50:43 -0500 Subject: [PATCH 0865/1312] new j --- src/apps/molresponse/ResponseBase.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3dd4f660d7d..bac37bbca8f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -638,13 +638,19 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm auto rho = transition_density(world, phi0, xy.X, xy.X); // Create Coulomb potential on ground_orbitals + /* auto compute_jx = [&, &phi0 = phi0](auto rho_alpha) { auto temp_J = apply(*shared_coulomb_operator, rho_alpha); - temp_J.truncate(); return mul(world, temp_J, phi0); }; + */ - std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); + int b = 0; + for (const auto rho_b: rho) { + auto temp_J = apply(*shared_coulomb_operator, rho_b); + J.X[b++] = mul(world, temp_J, phi0); + } + //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); J.Y = J.X.copy(); if (r_params.print_level() >= 1) { From 2d91ac8868dcaea075c14532a1d76b22788918ac Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 17:54:02 -0500 Subject: [PATCH 0866/1312] relocate some fencing in exchange --- src/apps/molresponse/global_functions.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index eec1d6e2db7..15665018ef6 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -354,6 +354,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); + world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { @@ -369,10 +370,9 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto k2x = op_2x(phi_2); world.gop.fence(); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } } - world.gop.fence(); return K; } @@ -412,6 +412,7 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0y.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); K0.Y[b] = op_0y(chi.Y[b]); + world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { @@ -419,8 +420,8 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0x.set_parameters(phi0, phi0, lo); op_0x.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); + world.gop.fence(); } } - world.gop.fence(); return K0; } From bcc980866e5b2ad01ab34f07e9743f74d4239b6b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 17:58:27 -0500 Subject: [PATCH 0867/1312] kain update --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e74a0c65d05..61d20657b93 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -260,7 +260,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 1 && iteration < 10)) { + if (r_params.kain() && (iteration > 2 && iteration < 7)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (r_params.kain() && (iteration > 7)) { From dffb51dec761cf1266a4bae4c5f01573ffd40179 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 18:32:44 -0500 Subject: [PATCH 0868/1312] idk --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 61d20657b93..e5c92ef7f86 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(750 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index bac37bbca8f..76fa4526e58 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -635,7 +635,12 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto rho = transition_density(world, phi0, xy.X, xy.X); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + auto rho = make_density(world, xy); + //auto rho = transition_density(world, phi0, xy.X, xy.X); + + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute density J[omega]"); } + // Create Coulomb potential on ground_orbitals /* @@ -1560,6 +1565,7 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct //truncate(world, phi0); std::vector densities = zero_functions(world, x.size(), true); + // Return container auto compute_density = [&world, &orbitals](const auto &x_alpha, const auto &y_alpha) { /* From cab2ded9dffebbb6f4d4e86f5df56c444b2d99d6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 18:40:38 -0500 Subject: [PATCH 0869/1312] tighten bsh --- src/apps/molresponse/FrequencyResponse.cpp | 5 +++-- src/apps/molresponse/ResponseBase.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e5c92ef7f86..cd36c35e0cf 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(750 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(250 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -260,7 +260,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); // kain update with temp adjusts temp - if (r_params.kain() && (iteration > 2 && iteration < 7)) { + //&& iteration < 7 + if (r_params.kain() && (iteration > 2 )) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (r_params.kain() && (iteration > 7)) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 76fa4526e58..3a35c206f51 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1191,7 +1191,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, m_diff[b]); auto norm_xb = norm2(world, m_old[b]); - auto max_step = maxrotn * norm_xb; + auto max_step = 0.01*maxrotn * norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } From fb807b9fd292bbd2a16d0edc5d5e4ff26990363e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 20:48:20 -0500 Subject: [PATCH 0870/1312] changes to make_density --- src/apps/molresponse/ResponseBase.cpp | 10 +++++++--- src/apps/molresponse/x_space.cc | 9 +++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3a35c206f51..eaaf8aa2a09 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -299,8 +299,12 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu if (world.rank() == 0) { print("make density: to response matrix"); } auto r_phi0 = to_response_vector(ground_orbitals); if (world.rank() == 0) { print("make density: to response vector"); } - std::transform(r_matrix.begin(), r_matrix.end(), density.begin(), - [&](const auto &ri) { return dot(world, ri, r_phi0, true); }); + int b = 0; + for (auto &rho_b: density) { + rho_b = dot(world, r_matrix[b], r_phi0); + b++; + } + } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } @@ -1191,7 +1195,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, m_diff[b]); auto norm_xb = norm2(world, m_old[b]); - auto max_step = 0.01*maxrotn * norm_xb; + auto max_step = 0.01 * maxrotn * norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index fb355cb654a..80baab00e06 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -9,10 +9,11 @@ namespace madness { auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d { auto &world = vec[0].world(); // copy the vector - auto response_vector = copy(world, vec); - std::for_each(vec.begin(), vec.end(), [&](const real_function_3d &phi0_i) { - response_vector.push_back(madness::copy(phi0_i,true)); - }); + auto response_vector = vector_real_function_3d(vec.size()); + auto n = vec.size(); + + int i = 0; + for (auto &r0i: response_vector) { r0i = copy(vec[i++ % n], false); } world.gop.fence(); return response_vector; } From d9cde673cbfc0c53575589a9c8a7bd3b7fa2fd6b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 20:56:20 -0500 Subject: [PATCH 0871/1312] changes to make_density --- src/apps/molresponse/FrequencyResponse.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index cd36c35e0cf..0216e42101f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,9 +21,9 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(100 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double conv_den = std::max(250 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); const double relative_max_target = - std::max(250 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -88,11 +88,11 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = .25; + max_rotation = .025; } else if (thresh >= 1e-6) { - max_rotation = .1; + max_rotation = .01; } else if (thresh >= 1e-8) { - max_rotation = .05; + max_rotation = .005; } PQ = generator(world, *this); for (iter = 0; iter < r_params.maxiter(); ++iter) { From 27b69dc2170cb4c3538dc65bea43b47f7dec3a8b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 21:11:27 -0500 Subject: [PATCH 0872/1312] changes to make_density --- src/apps/molresponse/x_space.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 80baab00e06..36ca05b8a1f 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -13,9 +13,10 @@ namespace madness { auto n = vec.size(); int i = 0; - for (auto &r0i: response_vector) { r0i = copy(vec[i++ % n], false); } + for (auto &r0i: response_vector) { r0i = vec[i++ % n]; } + auto copy_vec = copy(world, response_vector); world.gop.fence(); - return response_vector; + return copy_vec; } auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) -> response_matrix { From fad500b40b1f001943d3cd09b035fa81de95002a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 3 Dec 2022 21:17:20 -0500 Subject: [PATCH 0873/1312] need to copy it twice --- src/apps/molresponse/x_space.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 36ca05b8a1f..7a6809ac318 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -9,7 +9,7 @@ namespace madness { auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d { auto &world = vec[0].world(); // copy the vector - auto response_vector = vector_real_function_3d(vec.size()); + auto response_vector = vector_real_function_3d(2*vec.size()); auto n = vec.size(); int i = 0; From 70e9480901ba6700d3deb857bcb39de4f2998b29 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 4 Dec 2022 22:50:21 -0500 Subject: [PATCH 0874/1312] remove fence from exchange application --- src/apps/molresponse/global_functions.cc | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 15665018ef6..e48e9e2a5ce 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -318,9 +318,11 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto K = X_space::zero_functions(world, num_states, num_orbitals); auto phi_1 = copy(world, phi0, false); + /* auto phi_2 = copy(world, phi0, false); auto phi_3 = copy(world, phi0, false); auto phi_4 = copy(world, phi0, false); + */ // the question is copying pointers mpi safe Exchange op{}; const Exchange::Algorithm algo = op.small_memory; @@ -345,16 +347,14 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons op_2y.set_algorithm(algo); auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_2); - - auto k1y = op_1y(phi_3); - auto k2y = op_2y(phi_4); + auto k2x = op_2x(phi_1); + auto k1y = op_1y(phi_1); + auto k2y = op_2y(phi_1); world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); - world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { @@ -367,9 +367,8 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons op_2x.set_algorithm(algo); auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_2); + auto k2x = op_2x(phi_1); - world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } } @@ -412,7 +411,6 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0y.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); K0.Y[b] = op_0y(chi.Y[b]); - world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { @@ -420,7 +418,6 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0x.set_parameters(phi0, phi0, lo); op_0x.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); - world.gop.fence(); } } return K0; From a55f2b22e6a0edbb98538e293cd10f73b88c7616 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 4 Dec 2022 23:33:10 -0500 Subject: [PATCH 0875/1312] use the same convergence criteria as moldft --- src/apps/molresponse/FrequencyResponse.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0216e42101f..08b7512ac09 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,9 +21,8 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double conv_den = std::max(250 * FunctionDefaults<3>::get_thresh(), r_params.dconv()); - const double relative_max_target = - std::max(2500 * FunctionDefaults<3>::get_thresh(), 5 * r_params.dconv()); + const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); + const double relative_max_target = 5 * dconv; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -139,14 +138,15 @@ void FrequencyResponse::iterate(World &world) { print("r_params.dconv(): ", r_params.dconv()); print("max rotation: ", max_rotation); print("d_residual_max : ", d_residual); - print("d_residual_max target : ", conv_den); + print("d_residual_max target : ", dconv); print("bsh_residual_max : ", max_bsh); print("relative_bsh_residual_max : ", relative_max_bsh); print("relative_bsh_residual_max target : ", relative_max_target); } } - if ((d_residual < conv_den) and ((relative_max_bsh < relative_max_target) or - r_params.get("conv_only_dens"))) { + if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and + ((relative_max_bsh < relative_max_target) or + r_params.get("conv_only_dens"))) { converged = true; } @@ -261,7 +261,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2 )) { + if (r_params.kain() && (iteration > 2)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (r_params.kain() && (iteration > 7)) { From 18790cd45b50ac02f24c48065ddcc3b97aba106a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 08:40:38 -0500 Subject: [PATCH 0876/1312] low high criteria --- src/apps/molresponse/testing/runners.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 1af7d9e7fe0..8e7648bc9ff 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -372,7 +372,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); param1.set_user_defined_value("dconv", 1e-6); } else { param1.set_user_defined_value>("protocol", {1e-9}); @@ -502,8 +502,8 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - r_params.set_user_defined_value("dconv", 1e-6); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + r_params.set_user_defined_value("dconv", 1e-7); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); From 2f6e2b32429d621055e1267a743240d877a97470 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 08:43:34 -0500 Subject: [PATCH 0877/1312] turn off step restriction for now --- src/apps/molresponse/FrequencyResponse.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 08b7512ac09..20994ed3112 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -261,12 +261,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2)) { + if (r_params.kain() && (iteration > 2) && (iteration < 10)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (r_params.kain() && (iteration > 7)) { - x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); - } + if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From 40d4c9faf17e6c98ec4b7a6172957c34ea626615 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 08:57:26 -0500 Subject: [PATCH 0878/1312] change moldft settings --- src/apps/molresponse/testing/runners.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 8e7648bc9ff..e565db222f1 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -373,10 +373,10 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); - param1.set_user_defined_value("dconv", 1e-6); + param1.set_user_defined_value("dconv", 1e-5); } else { - param1.set_user_defined_value>("protocol", {1e-9}); - param1.set_user_defined_value("dconv", 1e-7); + param1.set_user_defined_value>("protocol", {1e-8}); + param1.set_user_defined_value("dconv", 1e-6); } param1.set_user_defined_value("localize", "new"); CalculationParameters param_calc; From 2f42c51e57d3f7de5dda80b80cf00afeee8f7eb7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 09:15:11 -0500 Subject: [PATCH 0879/1312] keep kain on --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 20994ed3112..828184059ce 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -261,7 +261,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2) && (iteration < 10)) { + if (r_params.kain() && (iteration > 2) ) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index e565db222f1..2a88eb477bb 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -443,7 +443,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! world.gop.fence(); - ME.output_calc_info_schema(); + if (world.rank() == 0) { ME.output_calc_info_schema(); } } else { if (world.rank() == 0) { print("Skipping Calculation and printing CALC INFO"); @@ -795,9 +795,11 @@ void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, if (std::filesystem::is_directory(m_schema.moldft_path)) { if (world.rank() == 0) { cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; } } else {// create the file - if (world.rank() == 0) { std::filesystem::create_directory(m_schema.moldft_path); } - cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" - << m_schema.moldft_path << ":\n"; + if (world.rank() == 0) { + std::filesystem::create_directory(m_schema.moldft_path); + cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" + << m_schema.moldft_path << ":\n"; + } world.gop.fence(); } std::filesystem::current_path(m_schema.moldft_path); From bb9a5f0931e7055441d368b7956273f5085e661d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 09:31:19 -0500 Subject: [PATCH 0880/1312] keep kain on --- src/apps/molresponse/FrequencyResponse.cpp | 12 ++++++------ src/apps/molresponse/ResponseBase.cpp | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 828184059ce..554a3cfab3d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -87,11 +87,11 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = .025; + max_rotation = thresh * 10000; } else if (thresh >= 1e-6) { - max_rotation = .01; - } else if (thresh >= 1e-8) { - max_rotation = .005; + max_rotation = thresh * 1000; + } else if (thresh >= 1e-7) { + max_rotation = thresh * 100; } PQ = generator(world, *this); for (iter = 0; iter < r_params.maxiter(); ++iter) { @@ -261,10 +261,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2) ) { + if (r_params.kain() && (iteration > 2)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index eaaf8aa2a09..f317dfe3e5d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1195,7 +1195,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, m_diff[b]); auto norm_xb = norm2(world, m_old[b]); - auto max_step = 0.01 * maxrotn * norm_xb; + auto max_step = maxrotn * norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } @@ -1203,7 +1203,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } if (step_size > max_step) { - double s = max_step / step_size; + double s = max_step; if (world.rank() == 0) { if (r_params.print_level() > 1) print(" restricting step for response-state: ", b, " step size", s); From e4809c95649fc1c8687e50d8848842801a5d5b78 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 13:08:51 -0500 Subject: [PATCH 0881/1312] lets try this for step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 554a3cfab3d..f2c142f4ecb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -91,7 +91,7 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-6) { max_rotation = thresh * 1000; } else if (thresh >= 1e-7) { - max_rotation = thresh * 100; + max_rotation = thresh * 10; } PQ = generator(world, *this); for (iter = 0; iter < r_params.maxiter(); ++iter) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f317dfe3e5d..22aeb42669a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1203,7 +1203,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } if (step_size > max_step) { - double s = max_step; + double s = max_step / step_size; if (world.rank() == 0) { if (r_params.print_level() > 1) print(" restricting step for response-state: ", b, " step size", s); From a34f6f62c90808085be67ead8a869f512249bac9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 13:34:07 -0500 Subject: [PATCH 0882/1312] spelling --- src/madness/mra/mra.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/mra/mra.h b/src/madness/mra/mra.h index 9fab680c1d6..ded03a6cf16 100644 --- a/src/madness/mra/mra.h +++ b/src/madness/mra/mra.h @@ -594,7 +594,7 @@ namespace madness { /// If the function is not initialized, it just returns. /// /// Returns this for chaining. - /// @param[in] tol Tolerance for truncating the coefficients. Default 0.0 means use the implimentation's member value \c thresh instead. + /// @param[in] tol Tolerance for truncating the coefficients. Default 0.0 means use the implementation's member value \c thresh instead. /// @param[in] fence Do fence Function& truncate(double tol = 0.0, bool fence = true) { PROFILE_MEMBER_FUNC(Function); From da4b1a59704252258ab9db712fe77d0283f0a22d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 14:03:54 -0500 Subject: [PATCH 0883/1312] compute the potential with vtol=.1*thresh --- src/apps/molresponse/ResponseBase.cpp | 59 ++++++++++--------------- src/apps/molresponse/basic_operators.cc | 11 +++-- 2 files changed, 28 insertions(+), 42 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 22aeb42669a..66a3d149bcc 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -994,17 +994,8 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< X_space V0 = X_space(world, m, n); X_space K0 = X_space(world, m, n); - X_space Chi_copy = X; - vecfuncT phi0_copy = madness::copy(world, ground_orbitals); - world.gop.fence(); - Chi_copy.truncate(); - //Chi_copy.truncate(); - truncate(world, phi0_copy); - // v_nuc first real_function_3d v_nuc, v_j0, v_k0, v_xc; - world.gop.fence(); - if (not r_params.store_potential()) { v_nuc = potential_manager->vnuclear(); //v_nuc.truncate(); @@ -1016,12 +1007,12 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } // Coulomb Potential J0*f if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (not r_params.store_potential()) { - // "a" is the core type - // scale rho by 2 TODO // J^0 x^alpha - v_j0 = apply(*shared_coulomb_operator, ground_density); - v_j0.scale(2.0); + v_j0 = apply(*shared_coulomb_operator, ground_density, true); + v_j0.scale(2.0, true); + v_j0.truncate(0.0, true); } else {// Already pre-computed v_j0 = stored_v_coul; } @@ -1037,25 +1028,9 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // make a zero function v_xc = Function(FunctionFactory(world).fence(false).initial_level(1)); } - // Intermediaries world.gop.fence(); - /* - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto phi0_c = copy(world, phi0_copy); - world.gop.fence(); - int b = 0; - for (auto &k0x: K0.X) { k0x = newK(phi0_copy, phi0_c, Chi_copy.X[b++]); } - if (compute_Y) { - b = 0; - for (auto &k0x: K0.Y) { k0x = newK(phi0_copy, phi0_c, Chi_copy.Y[b++]); } - - } else { - K0.Y = K0.X.copy(); - } - if (r_params.print_level() >= 20) { print_inner(world, "old xK0x", Chi_copy, K0); } - */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } /* K0 = ground_exchange(phi0_copy, X, compute_Y); @@ -1066,34 +1041,46 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K0 = ground_exchange_multiworld(phi0_copy, X, compute_Y); + K0 = ground_exchange_multiworld(ground_orbitals, X, compute_Y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[0]", "K[0]", iter_timing); } - if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", Chi_copy, K0); } + if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", X, K0); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; auto c_xc = xcf.hf_exchange_coefficient(); - if (compute_Y) { + double safety = 0.1; + double vtol = safety * FunctionDefaults<3>::get_thresh(); - V0 = v0 * X; + if (compute_Y) { + auto x = to_response_matrix(X); + auto vx = create_response_matrix(X.num_states(), X.num_orbitals()); + std::transform(x.begin(), x.end(), vx.begin(), + [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); + world.gop.fence(); + V0 = to_X_space(vx); + //V0 = v0 * X; if (world.rank() == 0) { print("vox: v0=v0*X"); } V0 += -c_xc * K0; if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } } else { - V0.X = v0 * X.X; + + std::transform(X.X.begin(), X.X.end(), V0.X.begin(), + [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); + world.gop.fence(); + //V0.X = v0 * X.X; if (world.rank() == 0) { print("vox: v0=v0*X"); } V0.X += -c_xc * K0.X; if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } V0.Y = V0.X.copy(); } - if (r_params.print_level() >= 20) { print_inner(world, "xV0x", Chi_copy, V0); } + if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } - + V0.truncate();// we are removing noise here return V0; } diff --git a/src/apps/molresponse/basic_operators.cc b/src/apps/molresponse/basic_operators.cc index 2a906295701..78070f92586 100644 --- a/src/apps/molresponse/basic_operators.cc +++ b/src/apps/molresponse/basic_operators.cc @@ -31,9 +31,7 @@ namespace madness { MADNESS_ASSERT(v.size() > 0); MADNESS_ASSERT(v[0].size() > 0); - for (unsigned int i = 0; i < v.size(); i++) { - truncate(world, v[i], tol, fence); - } + for (unsigned int i = 0; i < v.size(); i++) { truncate(world, v[i], tol, fence); } } // Apply a vector of vector of operators to a vector of vector of functions @@ -56,13 +54,14 @@ namespace madness { } // Apply a vector of operators to a set of response states // - response_space apply(World &world, std::vector> &op, response_space &f) { + response_space apply(World &world, std::vector> &op, + response_space &f) { MADNESS_ASSERT(f.size() > 0); MADNESS_ASSERT(f[0].size() == op.size()); response_space result(f[0][0].world(), f.size(), f[0].size()); - - transform(f.begin(), f.end(), result.begin(), [&](const auto &fi) { return apply(world, op, fi); }); + int i = 0; + for (auto &fi: f.x) { result.x[i++] = apply(world, op, fi); } world.gop.fence(); /* From 81f91e3db6d91aee8c8f3912be699503808c5eb0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 14:12:11 -0500 Subject: [PATCH 0884/1312] truncate before application --- src/apps/molresponse/FrequencyResponse.cpp | 2 ++ src/apps/molresponse/ResponseBase.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f2c142f4ecb..3826672a61b 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -300,6 +300,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; } + theta_X.truncate(); world.gop.fence(); if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } @@ -326,6 +327,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); } + bsh_X.truncate(); return bsh_X; } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 66a3d149bcc..11154f05dfe 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -491,6 +491,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // TODO is copy better than adding? probably? // J.Y=j_x+j_y; J.Y = J.X.copy(); + J.truncate(); + if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); if (r_params.print_level() >= 1) { From 64d7e7f884f485225a3bcb74ece5409ba5b53762 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 15:02:57 -0500 Subject: [PATCH 0885/1312] loosen convergence criteria --- src/apps/molresponse/FrequencyResponse.cpp | 7 ++++--- src/apps/molresponse/ResponseBase.cpp | 5 ++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3826672a61b..8ecedaf1808 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,7 +22,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - const double relative_max_target = 5 * dconv; + const double relative_max_target = 50 * dconv; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -89,11 +89,12 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-4) { max_rotation = thresh * 10000; } else if (thresh >= 1e-6) { - max_rotation = thresh * 1000; + max_rotation = thresh * 10; } else if (thresh >= 1e-7) { max_rotation = thresh * 10; } PQ = generator(world, *this); + PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); // Basic output @@ -138,7 +139,7 @@ void FrequencyResponse::iterate(World &world) { print("r_params.dconv(): ", r_params.dconv()); print("max rotation: ", max_rotation); print("d_residual_max : ", d_residual); - print("d_residual_max target : ", dconv); + print("d_residual_max target : ", dconv * 5.0); print("bsh_residual_max : ", max_bsh); print("relative_bsh_residual_max : ", relative_max_bsh); print("relative_bsh_residual_max target : ", relative_max_target); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 11154f05dfe..ff27030f1cf 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -404,8 +404,6 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } X_space gamma; - // compute - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (calc_type == "full") { gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); @@ -755,6 +753,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm iter_timing); } // Done + gamma.truncate(); // gamma.truncate(); return gamma; // Get sizes @@ -1014,7 +1013,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // J^0 x^alpha v_j0 = apply(*shared_coulomb_operator, ground_density, true); v_j0.scale(2.0, true); - v_j0.truncate(0.0, true); } else {// Already pre-computed v_j0 = stored_v_coul; } @@ -1051,6 +1049,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::start_timer(world); } real_function_3d v0 = v_j0 + v_nuc + v_xc; + v0.truncate(); auto c_xc = xcf.hf_exchange_coefficient(); double safety = 0.1; double vtol = safety * FunctionDefaults<3>::get_thresh(); From 6d58bf43f05a94b68a599ba5cf95e4ad673665bb Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:15:47 -0500 Subject: [PATCH 0886/1312] remove projector --- src/apps/molresponse/FrequencyResponse.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8ecedaf1808..9eeb32b6d6a 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -317,12 +317,14 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state + /* for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } } else { bsh_X.Y = bsh_X.X.copy(); } + */ if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { From 59a4e695a6078a37a317b6f642acd09246642ee8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:17:22 -0500 Subject: [PATCH 0887/1312] loosen it more --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9eeb32b6d6a..b50a3953384 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,7 +22,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - const double relative_max_target = 50 * dconv; + const double relative_max_target = 100 * dconv; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -145,7 +145,7 @@ void FrequencyResponse::iterate(World &world) { print("relative_bsh_residual_max target : ", relative_max_target); } } - if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and + if ((d_residual < dconv * std::max(size_t(10), molecule.natom())) and ((relative_max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { converged = true; From 5dfba239260afdb19c5ec8946752008b4b904963 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:22:15 -0500 Subject: [PATCH 0888/1312] make sure to copy --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index b50a3953384..ce111f17c78 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -313,7 +313,11 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, */ bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } - if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + if (compute_y) { + bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); + } else { + bsh_X.Y = bsh_X.X.copy(); + } if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state From 6f1d46895c5e218d0f94e857e8ea3abd41b02977 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:37:36 -0500 Subject: [PATCH 0889/1312] increase max_rotation --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ce111f17c78..e65cec36439 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -89,9 +89,9 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-4) { max_rotation = thresh * 10000; } else if (thresh >= 1e-6) { - max_rotation = thresh * 10; + max_rotation = thresh * 100; } else if (thresh >= 1e-7) { - max_rotation = thresh * 10; + max_rotation = thresh * 100; } PQ = generator(world, *this); PQ.truncate(); From 71048e0762cdea2313b421e0e6118a802c5dd3cd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:50:06 -0500 Subject: [PATCH 0890/1312] max_rotation --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e65cec36439..18b3372ef80 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -89,9 +89,9 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-4) { max_rotation = thresh * 10000; } else if (thresh >= 1e-6) { - max_rotation = thresh * 100; + max_rotation = thresh * 1000; } else if (thresh >= 1e-7) { - max_rotation = thresh * 100; + max_rotation = thresh * 1000; } PQ = generator(world, *this); PQ.truncate(); From 83c76d6feda4e76e3609be952d175d32c9639ab3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:51:28 -0500 Subject: [PATCH 0891/1312] change step restriction --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ff27030f1cf..2f5210a3bea 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1183,7 +1183,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, m_diff[b]); auto norm_xb = norm2(world, m_old[b]); - auto max_step = maxrotn * norm_xb; + auto max_step = maxrotn;//* norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } From 578d3c4e5e5ee610b61d16dd30f76497bcc210f8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 16:59:17 -0500 Subject: [PATCH 0892/1312] turn off step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 18b3372ef80..6fba1311634 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -265,7 +265,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From e63276a281ec48c6229c7d772b193f7a3ab981ab Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:01:14 -0500 Subject: [PATCH 0893/1312] loosen it again --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6fba1311634..5043beb81c0 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,8 +21,8 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double dconv = std::max(FunctionDefaults<3>::get_thresh(), r_params.dconv()); - const double relative_max_target = 100 * dconv; + const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 + const double relative_max_target = 5 * dconv; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 98309b7a0fa1112c174e828682bcd4d8d9062fe0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:09:46 -0500 Subject: [PATCH 0894/1312] tighten relative max target --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5043beb81c0..cf2100683be 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,7 +22,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 5 * dconv; + const double relative_max_target = 15 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 014b60d44fa50beca8abd3fe56a45ac27e1bda6d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:16:43 -0500 Subject: [PATCH 0895/1312] 90* thresh relative --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index cf2100683be..399797cc615 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,7 +22,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 15 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 90 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 726506d4e9ea7a40c0a47325d1a4352390553185 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:18:21 -0500 Subject: [PATCH 0896/1312] max rotation --- src/apps/molresponse/FrequencyResponse.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 399797cc615..75049112969 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,7 +21,8 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum - const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 + const double dconv = + std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 const double relative_max_target = 90 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); @@ -89,9 +90,9 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-4) { max_rotation = thresh * 10000; } else if (thresh >= 1e-6) { - max_rotation = thresh * 1000; + max_rotation = .025; } else if (thresh >= 1e-7) { - max_rotation = thresh * 1000; + max_rotation = .01; } PQ = generator(world, *this); PQ.truncate(); From 32f6cd9e75f222da4cffd98f6886de1b5fef7e41 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:20:18 -0500 Subject: [PATCH 0897/1312] kain update every other --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 75049112969..654f28e2948 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -263,7 +263,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2)) { + if (r_params.kain() && (iteration > 2) & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From 8ae87bd45879898a09f493766e1e5c3eabcf654d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:36:39 -0500 Subject: [PATCH 0898/1312] project out ground-state from bsh residuals --- src/apps/molresponse/FrequencyResponse.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 654f28e2948..2df476ee8bb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,7 +22,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = - std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 + std::max(FunctionDefaults<3>::get_thresh() * 90, r_params.dconv());//.01 .0001 .1e-5 const double relative_max_target = 90 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); @@ -314,22 +314,16 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, */ bsh_X.X = apply(world, bsh_x_ops, theta_X.X); if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } - if (compute_y) { - bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); - } else { - bsh_X.Y = bsh_X.X.copy(); - } + if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state - /* for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } } else { bsh_X.Y = bsh_X.X.copy(); } - */ if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { From de748f90be6162d3cd7cb99e04539446bcb1a838 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:57:40 -0500 Subject: [PATCH 0899/1312] tighten up the residuals --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2df476ee8bb..aec3d519c84 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -22,8 +22,8 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc;// For TDDFT // the Final protocol should be equal to dconv at the minimum const double dconv = - std::max(FunctionDefaults<3>::get_thresh() * 90, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 90 * FunctionDefaults<3>::get_thresh(); + std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 + const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -146,7 +146,7 @@ void FrequencyResponse::iterate(World &world) { print("relative_bsh_residual_max target : ", relative_max_target); } } - if ((d_residual < dconv * std::max(size_t(10), molecule.natom())) and + if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and ((relative_max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { converged = true; From 071ec7be2129950ef9fbddbf9185b1beeea8b834 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 17:59:06 -0500 Subject: [PATCH 0900/1312] back to the original settings --- src/apps/molresponse/testing/runners.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2a88eb477bb..fbdef1ec759 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -372,8 +372,8 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); - param1.set_user_defined_value("dconv", 1e-5); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + param1.set_user_defined_value("dconv", 1e-6); } else { param1.set_user_defined_value>("protocol", {1e-8}); param1.set_user_defined_value("dconv", 1e-6); From a7e02bdd38318c99aedf8b09c9282923170233c4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 18:00:33 -0500 Subject: [PATCH 0901/1312] back to the original settings --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index aec3d519c84..905635cc340 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 250 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index fbdef1ec759..058dedcb6e6 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -502,8 +502,8 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); - r_params.set_user_defined_value("dconv", 1e-7); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); From 1be8e54505ea79baf25add5d5f3e2b2c3dc57a73 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 22:31:51 -0500 Subject: [PATCH 0902/1312] back to the original settings --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 905635cc340..aec3d519c84 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 250 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From d2a60818badde3a5e972f6ac91060f9dafa91085 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 22:35:57 -0500 Subject: [PATCH 0903/1312] tighten the relative residuals --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index aec3d519c84..36d94a71b18 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -263,7 +263,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2) & (iteration % 2 == 0)) { + if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From 92500f62dddbc2ec1867c2760d7414d243330e21 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 22:51:39 -0500 Subject: [PATCH 0904/1312] make sure we know when we break --- src/apps/molresponse/FrequencyResponse.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 36d94a71b18..eb1a729355e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -107,7 +107,10 @@ void FrequencyResponse::iterate(World &world) { } if (iter < 2 || (iter % 10) == 0) { load_balance_chi(world); } if (iter > 0) { - if (density_residuals.max() > 2) { break; } + if (density_residuals.max() > 20) { + if (world.rank() == 0) { print("d-residual > 20...break"); } + break; + } double d_residual = density_residuals.max(); // Test convergence and set to true auto chi_norms = Chi.norm2s(); @@ -152,7 +155,7 @@ void FrequencyResponse::iterate(World &world) { converged = true; } - if (converged || iter == r_params.maxiter() - 1) { + if (converged || iter == r_params.maxiter()) { // if converged print converged if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { print("\nConverged!\n"); @@ -229,7 +232,6 @@ void FrequencyResponse::iterate(World &world) { if (iter == r_params.maxiter() && not converged) { if (world.rank() == 0) print(" Failed to converge. Reason:"); if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); - if (world.rank() == 0) print(" Running analysis on current values.\n"); } if (world.rank() == 0) { print(" Final energy residuals X:"); From 3a1cc4ec7a38fe2e204fb6c18abd9d26802f9933 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 22:53:16 -0500 Subject: [PATCH 0905/1312] add some step restriction to bigger steps --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index eb1a729355e..27be9e3a4ea 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -88,7 +88,7 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = thresh * 10000; + max_rotation = 10; } else if (thresh >= 1e-6) { max_rotation = .025; } else if (thresh >= 1e-7) { From 2221906c9694abe3b78ccf443cd91b5ad478f01b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 22:53:58 -0500 Subject: [PATCH 0906/1312] add step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 27be9e3a4ea..62e17bd5fb8 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -268,7 +268,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From efb2dd7176cbae783776d4fa786a31e156414744 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:16:31 -0500 Subject: [PATCH 0907/1312] lets max rotation pretty strick unless dx > 10% of ||x|| --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 62e17bd5fb8..d6231a29b81 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -90,7 +90,7 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-4) { max_rotation = 10; } else if (thresh >= 1e-6) { - max_rotation = .025; + max_rotation = 10 * relative_max_target; } else if (thresh >= 1e-7) { max_rotation = .01; } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2f5210a3bea..1719ea3d31b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1183,14 +1183,15 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, m_diff[b]); auto norm_xb = norm2(world, m_old[b]); - auto max_step = maxrotn;//* norm_xb; + auto max_step = maxrotn;//norm;//* norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step) { + if (step_size > max_step && step_size < .1 * norm_xb) { + // and if the step size is less thant 10% the vector norm double s = max_step / step_size; if (world.rank() == 0) { if (r_params.print_level() > 1) From ca802c86c40678f361f4be946c253a88b9b367a2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:22:52 -0500 Subject: [PATCH 0908/1312] step restriction with kain --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d6231a29b81..96161cbedf2 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -268,7 +268,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From e12962f9a5fbcdf84eb838529a6cbc990207bba0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:26:40 -0500 Subject: [PATCH 0909/1312] 10*relative Max rotation --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 96161cbedf2..546c6a3d8fb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -88,7 +88,7 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 10; + max_rotation = 10 * relative_max_target; } else if (thresh >= 1e-6) { max_rotation = 10 * relative_max_target; } else if (thresh >= 1e-7) { From b263763b585edb5c51eacca6ba8839e6cb5d121b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:33:35 -0500 Subject: [PATCH 0910/1312] if stepsize is greater than 10% --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 1719ea3d31b..634dc226464 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1190,7 +1190,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step && step_size < .1 * norm_xb) { + if (step_size > max_step && step_size > .01 * norm_xb) { // and if the step size is less thant 10% the vector norm double s = max_step / step_size; if (world.rank() == 0) { From 05c0d041e586d2fba9dc7beb8b58c2c2e923e723 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:37:34 -0500 Subject: [PATCH 0911/1312] if stepsize is less than than 10% --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 634dc226464..296963b25f9 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1190,7 +1190,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step && step_size > .01 * norm_xb) { + if (step_size > max_step && step_size < .01 * norm_xb) { // and if the step size is less thant 10% the vector norm double s = max_step / step_size; if (world.rank() == 0) { From 113dc8b3026900d82463923e53f743f9a4591373 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:49:39 -0500 Subject: [PATCH 0912/1312] restrict if we are close --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 296963b25f9..ad91bc89820 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1190,7 +1190,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step && step_size < .01 * norm_xb) { + if (step_size > max_step && step_size < 700 * FunctionDefaults<3>::get_thresh()) { // and if the step size is less thant 10% the vector norm double s = max_step / step_size; if (world.rank() == 0) { From c4e0adea710991a2e8493637a64b45af92d6ac1c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 5 Dec 2022 23:54:03 -0500 Subject: [PATCH 0913/1312] add another protocol guarantee accuracy --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 546c6a3d8fb..f9188c7ff30 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 100 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 058dedcb6e6..9196aa5e011 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -505,14 +505,14 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); r_params.set_user_defined_value("dconv", 1e-4); } else { r_params.set_user_defined_value>("protocol", {1e-9}); r_params.set_user_defined_value("dconv", 1e-7); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(30)); + r_params.set_user_defined_value("maxiter", size_t(15)); r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); From ccffa79fcc6ff51f14e78c59198ae50514b609e5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 00:13:21 -0500 Subject: [PATCH 0914/1312] tighten moldft for Be --- src/apps/molresponse/testing/runners.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 9196aa5e011..e7e8c80209a 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -369,8 +369,8 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("l", 200); if (precision == "low") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); - param1.set_user_defined_value("dconv", 1e-4); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + param1.set_user_defined_value("dconv", 1e-5); } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); param1.set_user_defined_value("dconv", 1e-6); From bec8c827d4896ebddf88b2ea5040058a0ef0c214 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 07:56:49 -0500 Subject: [PATCH 0915/1312] tighten step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f9188c7ff30..546c6a3d8fb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 100 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 60ec5802ffe6116db1d0c3392e46e704a1f8bd52 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 08:12:40 -0500 Subject: [PATCH 0916/1312] i tighted the bsh residual in last commit --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 546c6a3d8fb..57298cc4c39 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 25 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 200 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -88,9 +88,9 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 10 * relative_max_target; + max_rotation = 2 * relative_max_target; } else if (thresh >= 1e-6) { - max_rotation = 10 * relative_max_target; + max_rotation = 2 * relative_max_target; } else if (thresh >= 1e-7) { max_rotation = .01; } From c331f235d6df6226208ebc1482b0aba5b5e36cf8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 08:31:13 -0500 Subject: [PATCH 0917/1312] just a little tighter --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 57298cc4c39..08a5812d63f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 200 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 150 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From b8d8b1bc22833d2858e9757f728248b9b2d778f7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 08:31:32 -0500 Subject: [PATCH 0918/1312] just a little tighter --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 08a5812d63f..3b8539b773e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -88,9 +88,9 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 2 * relative_max_target; + max_rotation = 1.5 * relative_max_target; } else if (thresh >= 1e-6) { - max_rotation = 2 * relative_max_target; + max_rotation = 1.5 * relative_max_target; } else if (thresh >= 1e-7) { max_rotation = .01; } From bc8753166120f4abf1c0f809ac389addd12fa338 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 08:59:15 -0500 Subject: [PATCH 0919/1312] just a little tighter --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3b8539b773e..ec4ccb019bf 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -88,9 +88,9 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 1.5 * relative_max_target; + max_rotation = 10 * relative_max_target; } else if (thresh >= 1e-6) { - max_rotation = 1.5 * relative_max_target; + max_rotation = 10 * relative_max_target; } else if (thresh >= 1e-7) { max_rotation = .01; } From c3aa73888b2137457d9f862474acd19987d31804 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 6 Dec 2022 13:56:05 -0500 Subject: [PATCH 0920/1312] just a little tighter --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ad91bc89820..302db05cb9e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1190,7 +1190,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step && step_size < 700 * FunctionDefaults<3>::get_thresh()) { + if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { // and if the step size is less thant 10% the vector norm double s = max_step / step_size; if (world.rank() == 0) { From c348332e446d3bab8b3065e40eab2446081c1445 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Dec 2022 16:57:17 -0500 Subject: [PATCH 0921/1312] just a little tighter --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ec4ccb019bf..cb7359af616 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 150 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 350 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -88,9 +88,9 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 10 * relative_max_target; + max_rotation = 2 * relative_max_target; } else if (thresh >= 1e-6) { - max_rotation = 10 * relative_max_target; + max_rotation = 2 * relative_max_target; } else if (thresh >= 1e-7) { max_rotation = .01; } From adeef79278530afda65d1061a90940572e4eef07 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Dec 2022 17:52:43 -0500 Subject: [PATCH 0922/1312] Convergence standards --- src/apps/molresponse/FrequencyResponse.cpp | 10 ---------- src/apps/molresponse/testing/runners.hpp | 4 ++-- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index cb7359af616..05a90adb09f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -33,19 +33,10 @@ void FrequencyResponse::iterate(World &world) { Tensor xij_res_norms(m, 2 * n); vecfuncT rho_omega_old(m); - // initialize DFT XC functional operator XCOperator xc = make_xc_operator(world); - // create X space residuals X_space residuals = X_space::zero_functions(world, m, n); - - /* - for (size_t b = 0; b < m; b++) { - x_vectors.emplace_back(Chi, b); - x_residuals.emplace_back(residuals, b); - } - */ // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { @@ -56,7 +47,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } - // // We compute with positive frequencies if (world.rank() == 0) { print("Warning input frequency is assumed to be positive"); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index e7e8c80209a..9196aa5e011 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -369,8 +369,8 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("l", 200); if (precision == "low") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); - param1.set_user_defined_value("dconv", 1e-5); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); + param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); param1.set_user_defined_value("dconv", 1e-6); From d6cd32358ff85c0c75149c9584659b00c6e441f0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 7 Dec 2022 23:03:24 -0500 Subject: [PATCH 0923/1312] remove step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 05a90adb09f..8981f3f5d3c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -258,7 +258,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From 2e2a449cb8aa6bb4e69965f00a7a0b7406173e5f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 8 Dec 2022 10:03:36 -0500 Subject: [PATCH 0924/1312] try masking --- src/apps/molresponse/FrequencyResponse.cpp | 7 +++++++ src/apps/molresponse/global_functions.h | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8981f3f5d3c..4c8973665a6 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -12,6 +12,7 @@ void FrequencyResponse::initialize(World &world) { Chi = PQ.copy(); } + void FrequencyResponse::iterate(World &world) { size_t iter; // Variables needed to iterate @@ -84,10 +85,16 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-7) { max_rotation = .01; } + + + functionT mask; + mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); PQ = generator(world, *this); + PQ = PQ * mask; PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); + Chi = mask * Chi; // Basic output if (r_params.print_level() >= 1) { molresponse::start_timer(world); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index fc34b48a106..d66ac5c20c0 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -7,6 +7,10 @@ #include "response_parameters.h" + + + + struct CalcParams { GroundStateCalculation ground_calculation; Molecule molecule; From ba80b020d659f79c2ce39b658223fda163c75303 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 14:10:47 -0500 Subject: [PATCH 0925/1312] try masking --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 4c8973665a6..1e49793e124 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -265,7 +265,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } // truncate x From d36817105bffe731006948fdb3a5105a28652eb1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 15:26:14 -0500 Subject: [PATCH 0926/1312] use absolute bsh residual --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 1e49793e124..85fca4b4477 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -147,7 +147,7 @@ void FrequencyResponse::iterate(World &world) { } } if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and - ((relative_max_bsh < relative_max_target) or + ((max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { converged = true; } From 0eaf77f51c939ffb60b2e5bc9b1c2fd669f97a40 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 15:30:22 -0500 Subject: [PATCH 0927/1312] scale max_bsh relative to bsh_residual --- src/apps/molresponse/FrequencyResponse.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 85fca4b4477..8fa4cb8ebb2 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 350 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 500 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -75,6 +75,7 @@ void FrequencyResponse::iterate(World &world) { vector_real_function_3d rho_omega = make_density(world, Chi); converged = false;// Converged flag auto thresh = FunctionDefaults<3>::get_thresh(); + auto max_rotation = .5; if (thresh >= 1e-2) { max_rotation = 2; @@ -86,7 +87,6 @@ void FrequencyResponse::iterate(World &world) { max_rotation = .01; } - functionT mask; mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); PQ = generator(world, *this); @@ -117,6 +117,7 @@ void FrequencyResponse::iterate(World &world) { chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); + max_rotation = 2 * max_bsh; auto relative_max_bsh = relative_bsh.absmax(); Tensor polar = -2 * inner(Chi, PQ); world.gop.fence(); @@ -147,8 +148,7 @@ void FrequencyResponse::iterate(World &world) { } } if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and - ((max_bsh < relative_max_target) or - r_params.get("conv_only_dens"))) { + ((max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { converged = true; } From 8cafe0d1e4edbd8a8df4d97cf6e776b25eeb484a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 16:02:35 -0500 Subject: [PATCH 0928/1312] tighter step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8fa4cb8ebb2..46a281cf1ec 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -117,7 +117,7 @@ void FrequencyResponse::iterate(World &world) { chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); - max_rotation = 2 * max_bsh; + max_rotation = 1.00 * max_bsh; auto relative_max_bsh = relative_bsh.absmax(); Tensor polar = -2 * inner(Chi, PQ); world.gop.fence(); From 149c5882c69da95e1896c76804a04ab6c0db2639 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 16:19:48 -0500 Subject: [PATCH 0929/1312] tighter step restriction --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 46a281cf1ec..515af025bd5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 500 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 1000 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 0faab3711a0165f6b9d61d90325f4d03c464e05c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 16:28:32 -0500 Subject: [PATCH 0930/1312] loosen step bsh convergence keep density --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 515af025bd5..ee968163a2f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 1000 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 1500 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 91b98534fe44ae14e3e6a739178009288c0ed593 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 9 Dec 2022 16:46:57 -0500 Subject: [PATCH 0931/1312] loosen step bsh convergence keep density --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ee968163a2f..7f9ae5f9dba 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 1500 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 3000 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From d4cedc3d8c6ae5d252220fb9ea9977216ea55612 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 09:39:39 -0500 Subject: [PATCH 0932/1312] Increase the max iterations --- src/apps/molresponse/testing/runners.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 9196aa5e011..170bcd371c1 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -512,8 +512,8 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("dconv", 1e-7); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(15)); - r_params.set_user_defined_value("maxsub", size_t(5)); + r_params.set_user_defined_value("maxiter", size_t(20)); + r_params.set_user_defined_value("maxsub", size_t(10)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); From ba94a05fed4e4b2745465f908b4f42adb1afeb01 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 11:30:29 -0500 Subject: [PATCH 0933/1312] tighten bsh --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 7f9ae5f9dba..e89a74a7b09 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 3000 * FunctionDefaults<3>::get_thresh(); + const double relative_max_target = 100 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 3ac2d33e6451422f574238b79e419e84f2a493f5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 14:57:30 -0500 Subject: [PATCH 0934/1312] Changing bsh name, loosen target, step restrict*.9 --- src/apps/molresponse/FrequencyResponse.cpp | 12 ++++++------ src/apps/molresponse/ResponseBase.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e89a74a7b09..99ece1db95b 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double relative_max_target = 100 * FunctionDefaults<3>::get_thresh(); + const double bsh_abs_target = 950 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -80,9 +80,9 @@ void FrequencyResponse::iterate(World &world) { if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 2 * relative_max_target; + max_rotation = 2 * bsh_abs_target; } else if (thresh >= 1e-6) { - max_rotation = 2 * relative_max_target; + max_rotation = 2 * bsh_abs_target; } else if (thresh >= 1e-7) { max_rotation = .01; } @@ -142,13 +142,13 @@ void FrequencyResponse::iterate(World &world) { print("max rotation: ", max_rotation); print("d_residual_max : ", d_residual); print("d_residual_max target : ", dconv * 5.0); + print("relative residual", relative_max_bsh); print("bsh_residual_max : ", max_bsh); - print("relative_bsh_residual_max : ", relative_max_bsh); - print("relative_bsh_residual_max target : ", relative_max_target); + print("bsh abs target : ", bsh_abs_target); } } if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and - ((max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { + ((max_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { converged = true; } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 302db05cb9e..5bac0f1fdc7 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1192,7 +1192,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi } if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { // and if the step size is less thant 10% the vector norm - double s = max_step / step_size; + double s = .80 * max_step / step_size; if (world.rank() == 0) { if (r_params.print_level() > 1) print(" restricting step for response-state: ", b, " step size", s); From 6d3616ceae957a93fb3bb7cac6314c891462cae9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:17:14 -0500 Subject: [PATCH 0935/1312] implement polarizability --- src/apps/molresponse/ResponseBase.cpp | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 5bac0f1fdc7..d68666f28ca 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -417,6 +417,9 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + // Right here I can compute the polarizability before I try a KAIN UPDATE or step restriction + + Theta_X = (V0X - E0X) + gamma; world.gop.fence(); Theta_X.truncate(); @@ -428,6 +431,33 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); } + // construct lhs for 2nd order property + X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); + auto chi_copy = chi.copy(); + T0X.X = T(world, chi_copy.X); + if (compute_Y) { T0X.Y = T(world, chi_copy.Y); } + if (r_params.print_level() >= 20) { + print("_________________compute F0X _______________________"); + print("inner "); + print(inner(chi_copy, T0X)); + } + + auto diag_E0X = chi.copy(); + if (r_params.localize() != "canon") { + auto diag_only = hamiltonian - ham_no_diag; + diag_E0X.X = E0X.X * diag_only; + if (compute_Y) { E0X.Y = E0X.Y * diag_only; } + if (r_params.print_level() >= 20) { print_inner(world, "xE0_diagx", chi, E0X); } + } + auto omega = r_params.omega(); + + auto V_X = Theta_X.copy(); + V_X += T0X; + V_X = V_X - omega * chi; + V_X = V_X - diag_E0X; + + Tensor polar = -2 * inner(chi, V_X); + print("new polarizability", polar); return Theta_X; } From dc737d604926184c1fd96b62b367faace56c6574 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:18:32 -0500 Subject: [PATCH 0936/1312] pass reference --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d68666f28ca..2706610551a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -685,7 +685,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ int b = 0; - for (const auto rho_b: rho) { + for (const auto& rho_b: rho) { auto temp_J = apply(*shared_coulomb_operator, rho_b); J.X[b++] = mul(world, temp_J, phi0); } From 3bd27b4568191591e738335229ca4d03d9c30350 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:23:11 -0500 Subject: [PATCH 0937/1312] pass reference --- src/apps/molresponse/ResponseBase.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2706610551a..1cecfd0125c 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -435,7 +435,11 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); auto chi_copy = chi.copy(); T0X.X = T(world, chi_copy.X); - if (compute_Y) { T0X.Y = T(world, chi_copy.Y); } + if (compute_Y) { + T0X.Y = T(world, chi_copy.Y); + } else { + TOX.Y = TOX.X.copy(); + } if (r_params.print_level() >= 20) { print("_________________compute F0X _______________________"); print("inner "); @@ -685,7 +689,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ int b = 0; - for (const auto& rho_b: rho) { + for (const auto &rho_b: rho) { auto temp_J = apply(*shared_coulomb_operator, rho_b); J.X[b++] = mul(world, temp_J, phi0); } From 67a47858e3b75a1c05587ef9e87b4c095eccd556 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:23:32 -0500 Subject: [PATCH 0938/1312] copy TX.X --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 1cecfd0125c..3d7fd1ca86f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -438,7 +438,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (compute_Y) { T0X.Y = T(world, chi_copy.Y); } else { - TOX.Y = TOX.X.copy(); + T0X.Y = T0X.X.copy(); } if (r_params.print_level() >= 20) { print("_________________compute F0X _______________________"); From 42e0cdd14b3abcb0eed3c8f116d4b918cb61f958 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:26:05 -0500 Subject: [PATCH 0939/1312] if rank==0 --- src/apps/molresponse/ResponseBase.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3d7fd1ca86f..71852d8fe5b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -440,11 +440,6 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } else { T0X.Y = T0X.X.copy(); } - if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, T0X)); - } auto diag_E0X = chi.copy(); if (r_params.localize() != "canon") { @@ -461,7 +456,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, V_X = V_X - diag_E0X; Tensor polar = -2 * inner(chi, V_X); - print("new polarizability", polar); + if (world.rank() == 0) { print("new polarizability", polar); } return Theta_X; } From 92a2101d29fa42386af56effb3815a4b4417d206 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:58:09 -0500 Subject: [PATCH 0940/1312] moving polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 35 ++++++++++++++++++++++ src/apps/molresponse/ResponseBase.cpp | 25 ---------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 99ece1db95b..bc87a06464d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -291,6 +291,41 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, size_t m = theta_X.X.size(); size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; + // construct lhs for 2nd order property + X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); + auto chi_copy = chi.copy(); + T0X.X = T(world, chi_copy.X); + if (compute_y) { + T0X.Y = T(world, chi_copy.Y); + } else { + T0X.Y = T0X.X.copy(); + } + + auto diag_E0X = chi_copy.copy(); + if (r_params.localize() != "canon") { + auto diag_only = hamiltonian - ham_no_diag; + diag_E0X.X = diag_E0X.X * diag_only; + if (compute_y) { + diag_E0X.Y = diag_E0X.Y * diag_only; + } else { + diag_E0X.Y = diag_E0X.X; + } + } + auto omega = r_params.omega(); + + auto V_X = theta_X.copy(); + V_X += T0X; + V_X.X = V_X.X - omega * chi_copy.X; + if (compute_y) { + V_X.Y = V_X.X + omega * chi_copy.X; + } else { + V_X.Y = V_X.X.copy(); + } + V_X = V_X - diag_E0X; + auto polar = inner(chi_copy, V_X); + + if (world.rank() == 0) { print("new polarizability\n", polar); } + theta_X.X += theta_X.X * x_shifts; theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 71852d8fe5b..a43b5eaf143 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -431,32 +431,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); } - // construct lhs for 2nd order property - X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); - auto chi_copy = chi.copy(); - T0X.X = T(world, chi_copy.X); - if (compute_Y) { - T0X.Y = T(world, chi_copy.Y); - } else { - T0X.Y = T0X.X.copy(); - } - - auto diag_E0X = chi.copy(); - if (r_params.localize() != "canon") { - auto diag_only = hamiltonian - ham_no_diag; - diag_E0X.X = E0X.X * diag_only; - if (compute_Y) { E0X.Y = E0X.Y * diag_only; } - if (r_params.print_level() >= 20) { print_inner(world, "xE0_diagx", chi, E0X); } - } - auto omega = r_params.omega(); - - auto V_X = Theta_X.copy(); - V_X += T0X; - V_X = V_X - omega * chi; - V_X = V_X - diag_E0X; - Tensor polar = -2 * inner(chi, V_X); - if (world.rank() == 0) { print("new polarizability", polar); } return Theta_X; } From d3a770f507bae33afd4896084db140ec0df94701 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 16:58:39 -0500 Subject: [PATCH 0941/1312] bug --- src/apps/molresponse/ResponseBase.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index a43b5eaf143..631536affdb 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -431,7 +431,6 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); } - Tensor polar = -2 * inner(chi, V_X); return Theta_X; } From 71069cedbc636cffe2ffd4cbb93495615957482b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 17:00:31 -0500 Subject: [PATCH 0942/1312] move it into polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 66 +++++++++++----------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bc87a06464d..f4b6d5f7d18 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -255,6 +255,39 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); + X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); + auto chi_copy = chi.copy(); + T0X.X = T(world, chi_copy.X); + if (compute_y) { + T0X.Y = T(world, chi_copy.Y); + } else { + T0X.Y = T0X.X.copy(); + } + + auto diag_E0X = chi_copy.copy(); + if (r_params.localize() != "canon") { + auto diag_only = hamiltonian - ham_no_diag; + diag_E0X.X = diag_E0X.X * diag_only; + if (compute_y) { + diag_E0X.Y = diag_E0X.Y * diag_only; + } else { + diag_E0X.Y = diag_E0X.X; + } + } + auto omega = r_params.omega(); + + auto V_X = theta_X.copy(); + V_X += T0X; + V_X.X = V_X.X - omega * chi_copy.X; + if (compute_y) { + V_X.Y = V_X.X + omega * chi_copy.X; + } else { + V_X.Y = V_X.X.copy(); + } + V_X = V_X - diag_E0X; + auto polar = inner(chi_copy, V_X); + + if (world.rank() == 0) { print("new polarizability\n", polar); } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); @@ -292,39 +325,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; // construct lhs for 2nd order property - X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); - auto chi_copy = chi.copy(); - T0X.X = T(world, chi_copy.X); - if (compute_y) { - T0X.Y = T(world, chi_copy.Y); - } else { - T0X.Y = T0X.X.copy(); - } - - auto diag_E0X = chi_copy.copy(); - if (r_params.localize() != "canon") { - auto diag_only = hamiltonian - ham_no_diag; - diag_E0X.X = diag_E0X.X * diag_only; - if (compute_y) { - diag_E0X.Y = diag_E0X.Y * diag_only; - } else { - diag_E0X.Y = diag_E0X.X; - } - } - auto omega = r_params.omega(); - - auto V_X = theta_X.copy(); - V_X += T0X; - V_X.X = V_X.X - omega * chi_copy.X; - if (compute_y) { - V_X.Y = V_X.X + omega * chi_copy.X; - } else { - V_X.Y = V_X.X.copy(); - } - V_X = V_X - diag_E0X; - auto polar = inner(chi_copy, V_X); - - if (world.rank() == 0) { print("new polarizability\n", polar); } theta_X.X += theta_X.X * x_shifts; theta_X.X += PQ.X; From 8309ca6d9cdee2eaa4293a3b34e22f7a51fb77d2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 17:04:03 -0500 Subject: [PATCH 0943/1312] move it into polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f4b6d5f7d18..14657cf4785 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -285,7 +285,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator V_X.Y = V_X.X.copy(); } V_X = V_X - diag_E0X; - auto polar = inner(chi_copy, V_X); + auto polar = 2*inner(chi_copy, V_X); if (world.rank() == 0) { print("new polarizability\n", polar); } X_space new_chi = From 52be8d138c89a94cb7b05b1b0f7bcb21031915b5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 12 Dec 2022 17:15:25 -0500 Subject: [PATCH 0944/1312] adding new polar to compare to --- src/apps/molresponse/FrequencyResponse.cpp | 19 ++++++++++++------- src/apps/molresponse/FrequencyResponse.hpp | 6 ++++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 14657cf4785..6379677fc5f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -32,6 +32,7 @@ void FrequencyResponse::iterate(World &world) { Tensor xij_norms(m, 2 * n); Tensor xij_res_norms(m, 2 * n); + Tensor v_polar(m, m); vecfuncT rho_omega_old(m); // initialize DFT XC functional operator @@ -124,7 +125,7 @@ void FrequencyResponse::iterate(World &world) { // Todo add chi norm and chi_x function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, xij_norms, xij_res_norms, rho_norms, density_residuals); - frequency_to_json(j_molresponse, iter, polar); + frequency_to_json(j_molresponse, iter, polar, v_polar); world.gop.fence(); if (r_params.print_level() >= 1) { @@ -169,8 +170,10 @@ void FrequencyResponse::iterate(World &world) { break; } } - auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, - omega, kain_x_space, iter, max_rotation); + auto [new_chi, new_res, new_polar] = + update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, + kain_x_space, iter, max_rotation); + v_polar = copy(new_polar); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); if (r_params.print_level() >= 1) { @@ -246,7 +249,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, size_t iteration, const double &maxrotn) - -> std::tuple { + -> std::tuple> { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -285,7 +288,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator V_X.Y = V_X.X.copy(); } V_X = V_X - diag_E0X; - auto polar = 2*inner(chi_copy, V_X); + auto polar = 2 * inner(chi_copy, V_X); if (world.rank() == 0) { print("new polarizability\n", polar); } X_space new_chi = @@ -306,7 +309,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator molresponse::end_timer(world, "update response", "update", iter_timing); } // if not compute y then copy x in to y - return {new_chi, {new_res, bsh}}; + return {new_chi, {new_res, bsh}, polar}; // print x norms } @@ -369,10 +372,12 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } void FrequencyResponse::frequency_to_json(json &j_mol_in, size_t iter, - const Tensor &polar_ij) { + const Tensor &polar_ij, + const Tensor &v_polar_ij) { json j = {}; j["iter"] = iter; j["polar"] = tensor_to_json(polar_ij); + j["v_polar"] = tensor_to_json(v_polar_ij); auto index = j_mol_in["protocol_data"].size() - 1; j_mol_in["protocol_data"][index]["property_data"].push_back(j); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 9226a1ff8ba..1ab8e94466a 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -40,12 +40,14 @@ class FrequencyResponse : public ResponseBase { X_space bsh_update_response(World& world, X_space& theta_X, vector& bsh_x_ops, vector& bsh_y_ops, QProjector& projector, double& x_shifts); - static void frequency_to_json(json& j_mol_in, size_t iter, const Tensor& polar_ij); + static void frequency_to_json(json &j_mol_in, size_t iter, const Tensor &polar_ij, + const Tensor &v_polar_ij); static void compute_and_print_polarizability(World& world, X_space& Chi, X_space& pq, std::string message); void save(World& world, const std::string& name) override; void load(World& world, const std::string& name) override; - std::tuple update(World &world, X_space &chi, XCOperator &xc, + std::tuple> + update(World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, From e61013c5da055a4f3763cc4a5b666fac8678a0b9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 13 Dec 2022 10:53:55 -0500 Subject: [PATCH 0945/1312] loosen bsh --- src/apps/molresponse/FrequencyResponse.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6379677fc5f..02837211983 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 950 * FunctionDefaults<3>::get_thresh(); + const double bsh_abs_target = 1150 * FunctionDefaults<3>::get_thresh(); // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -214,6 +214,8 @@ void FrequencyResponse::iterate(World &world) { print(eval); print("polarizability eigenvectors"); print(evec); + print("V polarizability"); + print(v_polar); } } @@ -288,9 +290,9 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator V_X.Y = V_X.X.copy(); } V_X = V_X - diag_E0X; + V_X.truncate(); auto polar = 2 * inner(chi_copy, V_X); - if (world.rank() == 0) { print("new polarizability\n", polar); } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); From 33f951e1eba391e4c398f3ce2bd04b249facf6be Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 14 Dec 2022 12:02:12 -0500 Subject: [PATCH 0946/1312] turn off kain after some iterations --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 02837211983..bb80c2d6ce9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -300,7 +300,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { + if (r_params.kain() && (iteration > 2) && (iteration < 8)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } From 0ed3a2c4c3ab78f977d81f75e147eab3de3a8b3d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 09:57:51 -0500 Subject: [PATCH 0947/1312] recompute --- src/apps/molresponse/FrequencyResponse.cpp | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bb80c2d6ce9..74b4578597e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -260,8 +260,23 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // size_t n = Chi.num_orbitals(); X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); + X_space new_chi = + bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); + + auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); + + // kain update with temp adjusts temp + //&& iteration < 7 + if (r_params.kain() && (iteration > 2) && (iteration < 8)) {// & (iteration % 2 == 0)) { + new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + } + if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + + X_space new_theta_X = compute_theta_X(world, new_chi, xc, r_params.calc_type()); + // truncate x + X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); - auto chi_copy = chi.copy(); + auto chi_copy = new_chi.copy(); T0X.X = T(world, chi_copy.X); if (compute_y) { T0X.Y = T(world, chi_copy.Y); @@ -292,21 +307,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator V_X = V_X - diag_E0X; V_X.truncate(); auto polar = 2 * inner(chi_copy, V_X); - - X_space new_chi = - bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - - auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); - - // kain update with temp adjusts temp - //&& iteration < 7 - if (r_params.kain() && (iteration > 2) && (iteration < 8)) {// & (iteration % 2 == 0)) { - new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); - } - if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } - - // truncate x - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } From fb55325e805d1d69463c1bbe0684c665718c1193 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 10:10:14 -0500 Subject: [PATCH 0948/1312] recompute vpolarizability --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 74b4578597e..80417fa2008 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -296,7 +296,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } auto omega = r_params.omega(); - auto V_X = theta_X.copy(); + auto V_X = new_theta_X.copy(); V_X += T0X; V_X.X = V_X.X - omega * chi_copy.X; if (compute_y) { From ea113228f698e18eb7e064ef0f13c85e6a92ec53 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 12:10:41 -0500 Subject: [PATCH 0949/1312] Use Theta X --- src/apps/molresponse/FrequencyResponse.cpp | 34 ++++------------------ 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 80417fa2008..5dd42b6a953 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -272,41 +272,19 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } - X_space new_theta_X = compute_theta_X(world, new_chi, xc, r_params.calc_type()); + X_space lambda_X = compute_lambda_X(world, new_chi, xc, r_params.calc_type()); // truncate x - X_space T0X = X_space(world, chi.num_states(), chi.num_orbitals()); auto chi_copy = new_chi.copy(); - T0X.X = T(world, chi_copy.X); - if (compute_y) { - T0X.Y = T(world, chi_copy.Y); - } else { - T0X.Y = T0X.X.copy(); - } - - auto diag_E0X = chi_copy.copy(); - if (r_params.localize() != "canon") { - auto diag_only = hamiltonian - ham_no_diag; - diag_E0X.X = diag_E0X.X * diag_only; - if (compute_y) { - diag_E0X.Y = diag_E0X.Y * diag_only; - } else { - diag_E0X.Y = diag_E0X.X; - } - } auto omega = r_params.omega(); - - auto V_X = new_theta_X.copy(); - V_X += T0X; - V_X.X = V_X.X - omega * chi_copy.X; + lambda_X.X = lambda_X.X - omega * chi_copy.X; if (compute_y) { - V_X.Y = V_X.X + omega * chi_copy.X; + lambda_X.Y = lambda_X.X + omega * chi_copy.X; } else { - V_X.Y = V_X.X.copy(); + lambda_X.Y = lambda_X.X.copy(); } - V_X = V_X - diag_E0X; - V_X.truncate(); - auto polar = 2 * inner(chi_copy, V_X); + lambda_X.truncate(); + auto polar = 2 * inner(chi_copy, lambda_X); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } From 0a129d5b15e2886ebb87b39cb83027b031a3d0ce Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 12:25:22 -0500 Subject: [PATCH 0950/1312] make lambda_function printing mpi safe --- src/apps/molresponse/ResponseBase.cpp | 69 ++++++++++++++++----------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 631536affdb..464bb344b53 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -884,12 +884,6 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator X_space F0X = compute_F0X(world, chi, xc, compute_Y); X_space Chi_truncated = chi.copy(); Chi_truncated.truncate(); - if (r_params.print_level() >= 5) { - print("---------------Lambda ----------------"); - print(""); - print(inner(Chi_truncated, F0X)); - } - // put it all together X_space E0X = Chi_truncated.copy(); E0X.truncate(); @@ -897,13 +891,14 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator if (compute_Y) { E0X.Y = E0X.Y * hamiltonian; } if (r_params.print_level() >= 20) { - print(""); - print(inner(Chi_truncated, E0X)); + auto e0_mx = inner(Chi_truncated, E0X); + if (world.rank() == 0) { + print(""); + print(e0_mx); + } } - // put it all together X_space gamma; - // compute if (calc_type == "full") { gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); @@ -912,17 +907,22 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator } else { gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); } - if (r_params.print_level() >= 5) { - print(""); - print(inner(Chi_truncated, gamma)); + if (r_params.print_level() >= 20) { + auto gamma_mx = inner(Chi_truncated, gamma); + if (world.rank() == 0) { + print(""); + print(gamma_mx); + } } Lambda_X = (F0X - E0X) + gamma; Lambda_X.truncate(); - - if (r_params.print_level() >= 5) { - print(""); - print(inner(Chi_truncated, Lambda_X)); + if (r_params.print_level() >= 20) { + auto lambda_mx = inner(Chi_truncated, Lambda_X); + if (world.rank() == 0) { + print(""); + print(lambda_mx); + } } return Lambda_X; @@ -1102,26 +1102,37 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< X_space F0X = X_space(world, m, n); X_space T0X = X_space(world, m, n); T0X.X = T(world, chi_copy.X); - if (compute_Y) { T0X.Y = T(world, chi_copy.Y); } + if (compute_Y) { + T0X.Y = T(world, chi_copy.Y); + } else { + T0X.Y = T0X.X.copy(); + } if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, T0X)); + auto tx_m = inner(chi_copy, T0X); + if (world.rank() == 0) { + print("_________________compute F0X _______________________"); + print("inner "); + print(tx_m); + } } X_space V0X = compute_V0X(world, chi_copy, xc, compute_Y); if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, V0X)); + auto vxm = inner(chi_copy, V0X); + if (world.rank() == 0) { + print("_________________compute F0X _______________________"); + print("inner "); + print(vxm); + } } - F0X = T0X + V0X; - if (r_params.print_level() >= 20) { - print("_________________compute F0X _______________________"); - print("inner "); - print(inner(chi_copy, F0X)); + auto fxm = inner(chi_copy, F0X); + if (world.rank() == 0) { + print("_________________compute F0X _______________________"); + print("inner "); + print(fxm); + } } molresponse::end_timer(world, "F0X:"); From 30c06cbab67379ca52d71dc65c70499504a2158b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 12:31:48 -0500 Subject: [PATCH 0951/1312] whoops! take the inner with new_chi --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5dd42b6a953..aa65254a9be 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -284,7 +284,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator lambda_X.Y = lambda_X.X.copy(); } lambda_X.truncate(); - auto polar = 2 * inner(chi_copy, lambda_X); + auto polar = 2 * inner(new_chi, lambda_X); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } From 489e5fc9cd49c9213a6c1dbdad6f37b65cc0137a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 15 Dec 2022 13:10:51 -0500 Subject: [PATCH 0952/1312] Lets not truncate --- src/apps/molresponse/FrequencyResponse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index aa65254a9be..12a9b9dfb3d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -346,7 +346,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); } - bsh_X.truncate(); return bsh_X; } From 1d16de998ad772861ec4a70f4be5f8285251c7b0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 10:48:36 -0500 Subject: [PATCH 0953/1312] Make a compute T0X vector function --- src/apps/molresponse/FrequencyResponse.cpp | 69 ++++++++++++++++++++-- src/apps/molresponse/FrequencyResponse.hpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 55 +++++++++++++++++ src/apps/molresponse/ResponseBase.hpp | 1 + 4 files changed, 120 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 12a9b9dfb3d..da46d943962 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -250,14 +250,71 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &maxrotn) + size_t iteration, const double &max_rotation) -> std::tuple> { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; - // size_t n = Chi.num_orbitals(); + auto x = chi.copy();// copy chi + X_space V0X = compute_V0X(world, x, xc, compute_y); + X_space TOX = compute_TX(world, x, compute_y); + + + // Just compute theta x and lambda x compoenents here + X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); + world.gop.fence(); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space V0X = compute_V0X(world, chi, xc, compute_y); + //V0X.truncate(); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); + } + if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space E0X(world, chi.num_states(), chi.num_orbitals()); + if (r_params.localize() != "canon") { + E0X = chi.copy(); + E0X.X = E0X.X * ham_no_diag; + if (compute_Y) { E0X.Y = E0X.Y * ham_no_diag; } + if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } + } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); + } + + X_space gamma; + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + if (calc_type == "full") { + gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); + } else if (calc_type == "static") { + gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); + } else { + gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); + } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); + } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + // Right here I can compute the polarizability before I try a KAIN UPDATE or step restriction + + + Theta_X = (V0X - E0X) + gamma; + world.gop.fence(); + Theta_X.truncate(); + // Theta_X.truncate(); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); + } + if (r_params.print_level() >= 20) { print_inner(world, "xThetax", chi, Theta_X); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); + } + + X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); X_space new_chi = @@ -270,16 +327,16 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 2) && (iteration < 8)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, maxrotn); } + if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } X_space lambda_X = compute_lambda_X(world, new_chi, xc, r_params.calc_type()); // truncate x auto chi_copy = new_chi.copy(); - auto omega = r_params.omega(); - lambda_X.X = lambda_X.X - omega * chi_copy.X; + auto omega_a = r_params.omega(); + lambda_X.X = lambda_X.X - omega_a * chi_copy.X; if (compute_y) { - lambda_X.Y = lambda_X.X + omega * chi_copy.X; + lambda_X.Y = lambda_X.X + omega_a * chi_copy.X; } else { lambda_X.Y = lambda_X.X.copy(); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 1ab8e94466a..250b90385f5 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -52,7 +52,7 @@ class FrequencyResponse : public ResponseBase { std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &maxrotn); + size_t iteration, const double &max_rotation); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 464bb344b53..9e139132f5f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1088,6 +1088,61 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< return V0; } +// Returns the ground state potential applied to functions f +// (V0 f) V0=(Vnuc+J0-K0+W0) +// J0=J[ground_density] +// K0=K[ground_density]f +// EXC0=W[ground_density] +auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) const -> X_space { + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + X_space T0X = X_space(world, x.num_states(), x.num_orbitals()); + + real_derivative_3d Dx(world, 0); + real_derivative_3d Dy(world, 1); + real_derivative_3d Dz(world, 2); + + if (compute_Y) { + auto t_xx = create_response_matrix(x.num_states(), x.num_orbitals()); + auto xx = to_response_matrix(x); + int b = 0; + for (const auto xi: xx) { + vecfuncT dvx = apply(world, Dx, xi, false); + vecfuncT dvy = apply(world, Dy, xi, false); + vecfuncT dvz = apply(world, Dz, xi, false); + world.gop.fence(); + compress(world, dvx, false); + compress(world, dvy, false); + compress(world, dvz, false); + world.gop.fence(); + vecfuncT dvx2 = apply(world, Dx, dvx, false); + vecfuncT dvy2 = apply(world, Dy, dvy, false); + vecfuncT dvz2 = apply(world, Dz, dvz, false); + world.gop.fence(); + t_xx[b++] = (dvx2 + dvy2 + dvz2) * (-0.5); + } + T0X = to_X_space(t_xx); + } else { + int b = 0; + for (const auto xi: x.X) { + vecfuncT dvx = apply(world, Dx, xi, false); + vecfuncT dvy = apply(world, Dy, xi, false); + vecfuncT dvz = apply(world, Dz, xi, false); + world.gop.fence(); + compress(world, dvx, false); + compress(world, dvy, false); + compress(world, dvz, false); + world.gop.fence(); + vecfuncT dvx2 = apply(world, Dx, dvx, false); + vecfuncT dvy2 = apply(world, Dy, dvy, false); + vecfuncT dvz2 = apply(world, Dz, dvz, false); + world.gop.fence(); + T0X.X[b++] = (dvx2 + dvy2 + dvz2) * (-0.5); + } + T0X.Y = T0X.X.copy(); + } + return T0X; +} // Returns the ground state fock operator applied to functions f auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator &xc, bool compute_Y) const -> X_space { diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 3ffb2d699d0..42a211a17c7 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -294,6 +294,7 @@ class ResponseBase { const Tensor &xij_norms, const Tensor &xij_res_norms, const Tensor &rho_norms, const Tensor &rho_res_norms); + X_space compute_TX(World &world, const X_space &X, bool compute_Y) const; }; From b8ca2e739639a2f5d7522f5b3860cfb0982277f7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 11:20:11 -0500 Subject: [PATCH 0954/1312] reorganize frequency update to also compute the variational polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 93 ++++++++++------------ 1 file changed, 41 insertions(+), 52 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index da46d943962..5fbd1581dd3 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -258,90 +258,79 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; auto x = chi.copy();// copy chi - X_space V0X = compute_V0X(world, x, xc, compute_y); - X_space TOX = compute_TX(world, x, compute_y); - + X_space lambda_X = X_space(world, chi.num_states(), chi.num_orbitals()); + X_space theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); + // We are going to build lambda and theta from individual components // Just compute theta x and lambda x compoenents here - X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); - world.gop.fence(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space V0X = compute_V0X(world, chi, xc, compute_y); - //V0X.truncate(); + X_space V0X = compute_V0X(world, x, xc, compute_y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); + if (r_params.print_level() >= 20 && world.rank() == 0) { + print_inner(world, "xV0x", chi, V0X); + } + } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + X_space TOX = compute_TX(world, x, compute_y); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute_TX", "TX", iter_timing); + if (r_params.print_level() >= 20 && world.rank() == 0) { + print_inner(world, "xTx", chi, TOX); + } } - if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space E0X(world, chi.num_states(), chi.num_orbitals()); + X_space full_E0X(world, chi.num_states(), chi.num_orbitals()); + X_space offdiag_E0X(world, chi.num_states(), chi.num_orbitals()); if (r_params.localize() != "canon") { - E0X = chi.copy(); - E0X.X = E0X.X * ham_no_diag; - if (compute_Y) { E0X.Y = E0X.Y * ham_no_diag; } - if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } + if (compute_y) { + offdiag_E0X.X = x.X * ham_no_diag; + offdiag_E0X.Y = x.Y * ham_no_diag; + full_E0X.X = x.X * hamiltonian; + full_E0X.Y = x.Y * hamiltonian; + } else { + offdiag_E0X.X = offdiag_E0X.X * ham_no_diag; + offdiag_E0X.Y = offdiag_E0X.X.copy(); + full_E0X.X = full_E0X.X * hamiltonian; + full_E0X.Y = full_E0X.X.copy(); + } } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } - + X_space omega_X = X_space::zero_functions(world, chi.num_states(), chi.num_orbitals()); + if (compute_y) { + omega_X.X = -omega * x.X; + omega_X.Y = omega * x.Y; + } X_space gamma; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - if (calc_type == "full") { - gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); - } else if (calc_type == "static") { + if (compute_y) gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); + else gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); - } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); - } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // Right here I can compute the polarizability before I try a KAIN UPDATE or step restriction - - - Theta_X = (V0X - E0X) + gamma; - world.gop.fence(); - Theta_X.truncate(); - // Theta_X.truncate(); + theta_X = (V0X - offdiag_E0X) + gamma; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); } - if (r_params.print_level() >= 20) { print_inner(world, "xThetax", chi, Theta_X); } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); - } - - - X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); - + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + theta_X = (TOX + V0X - full_E0X) + gamma; + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "lambda_x"); } + auto polar = 2 * inner(x, lambda_X); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); - - // kain update with temp adjusts temp //&& iteration < 7 - if (r_params.kain() && (iteration > 2) && (iteration < 8)) {// & (iteration % 2 == 0)) { + if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } - X_space lambda_X = compute_lambda_X(world, new_chi, xc, r_params.calc_type()); - // truncate x - - auto chi_copy = new_chi.copy(); - auto omega_a = r_params.omega(); - lambda_X.X = lambda_X.X - omega_a * chi_copy.X; - if (compute_y) { - lambda_X.Y = lambda_X.X + omega_a * chi_copy.X; - } else { - lambda_X.Y = lambda_X.X.copy(); - } - lambda_X.truncate(); - auto polar = 2 * inner(new_chi, lambda_X); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } From 946d976b73c0fb8cbea8470fe944d9a102d51c91 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 11:41:12 -0500 Subject: [PATCH 0955/1312] Try this new convergence threshhold --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5fbd1581dd3..bc24b0e9c61 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 1150 * FunctionDefaults<3>::get_thresh(); + const double bsh_abs_target = 50.5 * FunctionDefaults<3>::get_thresh() + 4.493e-6; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 4391f44c4bbe3b08b8c590f2e2ade34c2c32359c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 12:08:17 -0500 Subject: [PATCH 0956/1312] debug the new implementation for update --- src/apps/molresponse/FrequencyResponse.cpp | 18 +++++++----------- src/apps/molresponse/ResponseBase.cpp | 5 ++--- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bc24b0e9c61..c96999f5f3b 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -264,20 +264,16 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // Just compute theta x and lambda x compoenents here if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space V0X = compute_V0X(world, x, xc, compute_y); + X_space V0X = compute_V0X(world, chi, xc, compute_y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); - if (r_params.print_level() >= 20 && world.rank() == 0) { - print_inner(world, "xV0x", chi, V0X); - } + if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space TOX = compute_TX(world, x, compute_y); + X_space TOX = compute_TX(world, chi, compute_y); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_TX", "TX", iter_timing); - if (r_params.print_level() >= 20 && world.rank() == 0) { - print_inner(world, "xTx", chi, TOX); - } + if (r_params.print_level() >= 20) { print_inner(world, "xTx", chi, TOX); } } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -290,9 +286,9 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator full_E0X.X = x.X * hamiltonian; full_E0X.Y = x.Y * hamiltonian; } else { - offdiag_E0X.X = offdiag_E0X.X * ham_no_diag; + offdiag_E0X.X = x.X * ham_no_diag; offdiag_E0X.Y = offdiag_E0X.X.copy(); - full_E0X.X = full_E0X.X * hamiltonian; + full_E0X.X = x.X * hamiltonian; full_E0X.Y = full_E0X.X.copy(); } } @@ -319,7 +315,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - theta_X = (TOX + V0X - full_E0X) + gamma; + lambda_X = (TOX + V0X - full_E0X+omega_X) + gamma; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "lambda_x"); } auto polar = 2 * inner(x, lambda_X); X_space new_chi = diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 9e139132f5f..73a7769cc13 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1095,7 +1095,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // EXC0=W[ground_density] auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) const -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space T0X = X_space(world, x.num_states(), x.num_orbitals()); real_derivative_3d Dx(world, 0); @@ -1106,7 +1105,7 @@ auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) co auto t_xx = create_response_matrix(x.num_states(), x.num_orbitals()); auto xx = to_response_matrix(x); int b = 0; - for (const auto xi: xx) { + for (const auto &xi: xx) { vecfuncT dvx = apply(world, Dx, xi, false); vecfuncT dvy = apply(world, Dy, xi, false); vecfuncT dvz = apply(world, Dz, xi, false); @@ -1124,7 +1123,7 @@ auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) co T0X = to_X_space(t_xx); } else { int b = 0; - for (const auto xi: x.X) { + for (const auto &xi: x.X) { vecfuncT dvx = apply(world, Dx, xi, false); vecfuncT dvy = apply(world, Dy, xi, false); vecfuncT dvz = apply(world, Dz, xi, false); From a2e72fd7b592384d865aa1c4ed60033976b1f894 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 15:41:59 -0500 Subject: [PATCH 0957/1312] truncate at each step --- src/apps/molresponse/FrequencyResponse.cpp | 17 +++++++++++------ src/apps/molresponse/ResponseBase.cpp | 3 +++ src/apps/molresponse/global_functions.cc | 3 +++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index c96999f5f3b..689eb20301b 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -292,14 +292,11 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator full_E0X.Y = full_E0X.X.copy(); } } + full_E0X.truncate(); + offdiag_E0X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } - X_space omega_X = X_space::zero_functions(world, chi.num_states(), chi.num_orbitals()); - if (compute_y) { - omega_X.X = -omega * x.X; - omega_X.Y = omega * x.Y; - } X_space gamma; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (compute_y) gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); @@ -311,11 +308,18 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.print_level() >= 1) { molresponse::start_timer(world); } theta_X = (V0X - offdiag_E0X) + gamma; + theta_X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - lambda_X = (TOX + V0X - full_E0X+omega_X) + gamma; + X_space omega_X = X_space::zero_functions(world, chi.num_states(), chi.num_orbitals()); + if (compute_y) { + omega_X.X = -omega * x.X; + omega_X.Y = omega * x.Y; + } + lambda_X = TOX + V0X - full_E0X + omega_X + gamma; + lambda_X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "lambda_x"); } auto polar = 2 * inner(x, lambda_X); X_space new_chi = @@ -389,6 +393,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); } + bsh_X.truncate(); return bsh_X; } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 73a7769cc13..9f9ba068ed6 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1064,6 +1064,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); world.gop.fence(); V0 = to_X_space(vx); + V0.truncate(); //V0 = v0 * X; if (world.rank() == 0) { print("vox: v0=v0*X"); } V0 += -c_xc * K0; @@ -1074,9 +1075,11 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< std::transform(X.X.begin(), X.X.end(), V0.X.begin(), [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); world.gop.fence(); + V0.X.truncate_rf(); //V0.X = v0 * X.X; if (world.rank() == 0) { print("vox: v0=v0*X"); } V0.X += -c_xc * K0.X; + if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } V0.Y = V0.X.copy(); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index e48e9e2a5ce..f4df32adf89 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -372,6 +372,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } } + K.truncate(); return K; } @@ -419,6 +420,8 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const op_0x.set_algorithm(algo); K0.X[b] = op_0x(chi.X[b]); } + K0.Y = K0.X.copy(); } + K0.truncate(); return K0; } From 16a98b39b610edbce4ca244410724845be017b20 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 15:57:45 -0500 Subject: [PATCH 0958/1312] remember to truncate static --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 689eb20301b..cb3ab47c3c7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -118,7 +118,7 @@ void FrequencyResponse::iterate(World &world) { chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); - max_rotation = 1.00 * max_bsh; + max_rotation = 1.50 * max_bsh; auto relative_max_bsh = relative_bsh.absmax(); Tensor polar = -2 * inner(Chi, PQ); world.gop.fence(); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 9f9ba068ed6..f969d64bf71 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -663,6 +663,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm J.X[b++] = mul(world, temp_J, phi0); } //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); + J.X.truncate_rf(); J.Y = J.X.copy(); if (r_params.print_level() >= 1) { @@ -682,6 +683,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } } + /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -730,6 +732,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } + gamma.truncate(); // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } From c5926f58cf0603efd01a50e888b0231626820747 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 16:13:00 -0500 Subject: [PATCH 0959/1312] remember to truncate static --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index cb3ab47c3c7..072298ea435 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 50.5 * FunctionDefaults<3>::get_thresh() + 4.493e-6; + const double bsh_abs_target = 575.75 * FunctionDefaults<3>::get_thresh() - 5.5e-4; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 244b77022be9749d6ea5c7a37d5397ff21b80da9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 16:43:35 -0500 Subject: [PATCH 0960/1312] bug in convergence --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 072298ea435..9667e0dbb1d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 575.75 * FunctionDefaults<3>::get_thresh() - 5.5e-4; + const double bsh_abs_target = 575.75 * FunctionDefaults<3>::get_thresh() + 2.0e-5; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); From 7610e5b743b735d3bc7472ad3d219def1a76b867 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 16 Dec 2022 17:11:12 -0500 Subject: [PATCH 0961/1312] reduce max sub and max iters --- src/apps/molresponse/testing/runners.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 170bcd371c1..60a661b7bc8 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -512,8 +512,8 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("dconv", 1e-7); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(20)); - r_params.set_user_defined_value("maxsub", size_t(10)); + r_params.set_user_defined_value("maxiter", size_t(10)); + r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); From 272e162124fe39f34f3db1ff36cc20c161f332e9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 19 Dec 2022 10:48:32 -0500 Subject: [PATCH 0962/1312] increase max iter to 15 --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 60a661b7bc8..9196aa5e011 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -512,7 +512,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("dconv", 1e-7); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(10)); + r_params.set_user_defined_value("maxiter", size_t(15)); r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); From e88d6a4b266170565db6e33ff963bda1ee17da92 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 19 Dec 2022 12:24:34 -0500 Subject: [PATCH 0963/1312] reduce computation for static case --- src/apps/molresponse/FrequencyResponse.cpp | 84 ++++++------ src/apps/molresponse/ResponseBase.cpp | 148 +++++++++++---------- src/apps/molresponse/ResponseBase.hpp | 4 +- src/apps/molresponse/response_functions.h | 7 +- 4 files changed, 133 insertions(+), 110 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9667e0dbb1d..cd860e3d5b7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -30,8 +30,14 @@ void FrequencyResponse::iterate(World &world) { Tensor bsh_residualsY((int(m))); Tensor density_residuals((int(m))); - Tensor xij_norms(m, 2 * n); - Tensor xij_res_norms(m, 2 * n); + bool static_res = (omega == 0.0); + bool compute_y = not static_res; + int r_vector_size; + + r_vector_size = (compute_y) ? 2 * n : n; + + Tensor xij_norms(m, r_vector_size); + Tensor xij_res_norms(m, r_vector_size); Tensor v_polar(m, m); vecfuncT rho_omega_old(m); @@ -44,7 +50,7 @@ void FrequencyResponse::iterate(World &world) { for (size_t b = 0; b < m; b++) { kain_x_space.push_back( XNonlinearSolver( - response_matrix_allocator(world, 2 * n), false)); + response_matrix_allocator(world, r_vector_size), false)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -64,19 +70,10 @@ void FrequencyResponse::iterate(World &world) { } auto bsh_x_ops = make_bsh_operators_response(world, x_shifts, omega); std::vector bsh_y_ops; - - bool static_res = (omega == 0.0); - bool compute_y = not static_res; - // Negate omega to make this next set of BSH operators \eps - omega - if (compute_y) { - omega = -omega; - bsh_y_ops = make_bsh_operators_response(world, y_shifts, omega); - omega = -omega; - } + bsh_y_ops = (compute_y) ? make_bsh_operators_response(world, y_shifts, -omega) : bsh_x_ops; vector_real_function_3d rho_omega = make_density(world, Chi); converged = false;// Converged flag auto thresh = FunctionDefaults<3>::get_thresh(); - auto max_rotation = .5; if (thresh >= 1e-2) { max_rotation = 2; @@ -87,7 +84,6 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-7) { max_rotation = .01; } - functionT mask; mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); PQ = generator(world, *this); @@ -123,13 +119,12 @@ void FrequencyResponse::iterate(World &world) { Tensor polar = -2 * inner(Chi, PQ); world.gop.fence(); // Todo add chi norm and chi_x - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, - xij_norms, xij_res_norms, rho_norms, density_residuals); - frequency_to_json(j_molresponse, iter, polar, v_polar); - world.gop.fence(); - + if (world.rank() == 0) { + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, + xij_norms, xij_res_norms, rho_norms, density_residuals); + frequency_to_json(j_molresponse, iter, polar, v_polar); + } if (r_params.print_level() >= 1) { - if (world.rank() == 0) { print("thresh: ", FunctionDefaults<3>::get_thresh()); print("k: ", FunctionDefaults<3>::get_k()); @@ -187,8 +182,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bsh_residualsX = copy(new_res.residual_norms); if (world.rank() == 0) { print("copy tensors: bshX"); } - bsh_residualsY = copy(new_res.residual_norms); - if (world.rank() == 0) { print("copy tensors: bshY"); } Chi = new_chi.copy(); if (world.rank() == 0) { print("copy chi:"); } if (r_params.print_level() >= 1) { @@ -291,9 +284,9 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator full_E0X.X = x.X * hamiltonian; full_E0X.Y = full_E0X.X.copy(); } + full_E0X.truncate(); + offdiag_E0X.truncate(); } - full_E0X.truncate(); - offdiag_E0X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } @@ -307,8 +300,14 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - theta_X = (V0X - offdiag_E0X) + gamma; - theta_X.truncate(); + if (compute_y) { + theta_X = (V0X - offdiag_E0X) + gamma; + theta_X.truncate(); + } else { + theta_X.X = (V0X.X - offdiag_E0X.X + gamma.X); + theta_X.X.truncate_rf(); + theta_X.Y = theta_X.X.copy(); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); } @@ -317,11 +316,20 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (compute_y) { omega_X.X = -omega * x.X; omega_X.Y = omega * x.Y; + lambda_X = TOX + V0X - full_E0X + omega_X + gamma; + lambda_X.truncate(); + } else { + lambda_X.X = TOX.X + V0X.X - full_E0X.X + gamma.X; + lambda_X.X.truncate_rf(); } - lambda_X = TOX + V0X - full_E0X + omega_X + gamma; - lambda_X.truncate(); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "lambda_x"); } - auto polar = 2 * inner(x, lambda_X); + Tensor polar; + if (compute_y) { + polar = 2 * inner(x, lambda_X); + } else { + polar = 4 * response_space_inner(x.X, lambda_X.X); + } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); @@ -359,16 +367,14 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, theta_X.X += PQ.X; theta_X.X = theta_X.X * -2; world.gop.fence(); - if (world.rank() == 0) { print("--------------- ThetaX.X------------------"); } - if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; + theta_X.truncate(); + } else { + theta_X.X.truncate_rf(); } - theta_X.truncate(); world.gop.fence(); - - if (world.rank() == 0) { print("--------------- ThetaX.Y------------------"); } // apply bsh X_space bsh_X(world, m, n); /* @@ -384,16 +390,16 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); if (compute_y) { for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } - } else { - bsh_X.Y = bsh_X.X.copy(); } if (world.rank() == 0) { print("--------------- Project BSH------------------"); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); } - - bsh_X.truncate(); + if (compute_y) { + bsh_X.truncate(); + } else { + bsh_X.X.truncate_rf(); + } return bsh_X; } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f969d64bf71..8daafabb86c 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -337,7 +337,8 @@ void ResponseBase::load_balance_chi(World &world) { molresponse::end_timer(world, "Load balancing"); } -auto ResponseBase::make_bsh_operators_response(World &world, double &shift, double &omega) const +auto ResponseBase::make_bsh_operators_response(World &world, double &shift, + const double omega) const -> std::vector { if (r_params.print_level() >= 1) molresponse::start_timer(world); @@ -514,43 +515,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - /* - X_space K1 = X_space::zero_functions(world, num_states, num_orbitals); - X_space K2 = X_space::zero_functions(world, num_states, num_orbitals); - auto phi0_c = madness::copy(world, phi0); - vecfuncT x, y; - for (size_t b = 0; b < num_states; b++) { - x = chi_alpha.X[b]; - y = chi_alpha.Y[b]; - K1.X[b] = newK(x, phi0, phi0_c); - world.gop.fence(); - K1.Y[b] = newK(y, phi0, phi0_c); - world.gop.fence(); - K2.X[b] = newK(phi0, y, phi0_c); - world.gop.fence(); - K2.Y[b] = newK(phi0, x, phi0_c); - world.gop.fence(); - } - auto K = K1 + K2; - world.gop.fence(); - if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", chi_alpha, K1); } - if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", chi_alpha, K2); } - if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } - */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } - /* - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - if (r_params.print_level() >= 1) { - K = response_exchange(phi0, chi_alpha, true); - molresponse::end_timer(world, "K[omega] multiworld"); - print_inner(world, "new xKx", chi_alpha, K); - } - */ molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); @@ -570,9 +540,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, phi0); - for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } - world.gop.fence(); - for (size_t i = 0; i < num_states; i++) { gamma.Y[i] = projector(gamma.Y[i]); } + for (size_t i = 0; i < num_states; i++) { + gamma.X[i] = projector(gamma.X[i]); + gamma.Y[i] = projector(gamma.Y[i]); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -1205,10 +1176,17 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.X.size(); size_t n = chi.X.size_orbitals(); + bool compute_y = r_params.omega() != 0.0; // compute residual + Tensor residual_norms; X_space res(world, m, n); - res = g_chi - chi; - auto residual_norms = res.norm2s(); + if (compute_y) { + res = g_chi - chi; + residual_norms = res.norm2s(); + } else { + res.X = g_chi.X - chi.X; + residual_norms = res.X.norm2(); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); } @@ -1224,16 +1202,26 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, size_t n = chi.num_orbitals(); X_space kain_update(world, m, n); response_matrix update(m); - auto x_vectors = to_response_matrix(chi); - auto x_residuals = to_response_matrix(residual_chi); + + bool compute_y = r_params.omega() != 0.0; if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } - int b = 0; - for (auto &kain_xb: kain_x_space) { - update[b] = kain_xb.update(x_vectors[b], x_residuals[b]); - b++; + if (compute_y) { + auto x_vectors = to_response_matrix(chi); + auto x_residuals = to_response_matrix(residual_chi); + int b = 0; + for (auto &kain_xb: kain_x_space) { + update[b] = kain_xb.update(x_vectors[b], x_residuals[b]); + b++; + } + world.gop.fence(); + kain_update = to_X_space(update); + } else { + int b = 0; + for (auto &kain_xb: kain_x_space) { + kain_update.X[b] = kain_xb.update(chi.X[b], residual_chi.X[b]); + b++; + } } - world.gop.fence(); - kain_update = to_X_space(update); if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); @@ -1242,36 +1230,62 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, } void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, - bool restrict_y, const double &maxrotn) { + bool restrict_y, const double &max_bsh_rotation) { size_t m = old_Chi.num_states(); size_t n = old_Chi.num_orbitals(); - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - print(maxrotn); - auto diff = temp - old_Chi; - auto m_old = to_response_matrix(old_Chi); - auto m_new = to_response_matrix(temp); - auto m_diff = to_response_matrix(diff); + bool compute_y = r_params.omega() != 0.0; + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + print(max_bsh_rotation); if (world.rank() == 0) { print("----------------Start Step Restriction -----------------"); } - for (size_t b = 0; b < m; b++) { - auto step_size = norm2(world, m_diff[b]); - auto norm_xb = norm2(world, m_old[b]); - auto max_step = maxrotn;//norm;//* norm_xb; - if (world.rank() == 0) { - print("---------------- step restriction :", b, " ------------------"); - if (world.rank() == 0) { print("X[b]: ", norm_xb); } - if (world.rank() == 0) { print("deltaX[b]: ", step_size); } - if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } + if (compute_y) { + auto diff = temp - old_Chi; + auto m_old = to_response_matrix(old_Chi); + auto m_new = to_response_matrix(temp); + auto m_diff = to_response_matrix(diff); + + for (size_t b = 0; b < m; b++) { + auto step_size = norm2(world, m_diff[b]); + auto norm_xb = norm2(world, m_old[b]); + auto max_step = max_bsh_rotation;//norm;//* norm_xb; + if (world.rank() == 0) { + print("---------------- step restriction :", b, " ------------------"); + if (world.rank() == 0) { print("X[b]: ", norm_xb); } + if (world.rank() == 0) { print("deltaX[b]: ", step_size); } + if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } + } + if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { + // and if the step size is less thant 10% the vector norm + double s = .80 * max_step / step_size; + if (world.rank() == 0) { + if (r_params.print_level() > 1) + print(" restricting step for response-state: ", b, " step size", s); + } + gaxpy(world, s, m_new[b], (1.0 - s), m_old[b], false); + } } - if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { - // and if the step size is less thant 10% the vector norm - double s = .80 * max_step / step_size; + } else { + auto diff = temp.X - old_Chi.X; + for (size_t b = 0; b < m; b++) { + auto step_size = norm2(world, diff[b]); + auto norm_xb = norm2(world, old_Chi.X[b]); + auto max_step = max_bsh_rotation;//norm;//* norm_xb; if (world.rank() == 0) { - if (r_params.print_level() > 1) - print(" restricting step for response-state: ", b, " step size", s); + print("---------------- step restriction :", b, " ------------------"); + if (world.rank() == 0) { print("X[b]: ", norm_xb); } + if (world.rank() == 0) { print("deltaX[b]: ", step_size); } + if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } + } + if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { + // and if the step size is less thant 10% the vector norm + double s = .80 * max_step / step_size; + if (world.rank() == 0) { + if (r_params.print_level() > 1) + print(" restricting step for response-state: ", b, " step size", s); + } + gaxpy(world, s, temp.X[b], (1.0 - s), old_Chi.X[b], false); } - gaxpy(world, s, m_new[b], (1.0 - s), m_old[b], false); } } if (world.rank() == 0) { print("----------------End Step Restriction -----------------"); } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 42a211a17c7..e7b163c5812 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -194,7 +194,7 @@ class ResponseBase { void load_balance_chi(World &world); - auto make_bsh_operators_response(World &world, double &shift, double &omega) const + auto make_bsh_operators_response(World &world, double &shift, const double omega) const -> vector; @@ -202,7 +202,7 @@ class ResponseBase { response_solver &kain_x_space) -> X_space; void x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, - bool restrict_y, const double &maxrotn); + bool restrict_y, const double &max_bsh_rotation); void plotResponseOrbitals(World &world, size_t iteration, const response_space &x_response, const response_space &y_response, diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index c9b395b9ab5..db7a61e8e95 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -161,7 +161,10 @@ namespace madness { MADNESS_ASSERT(same_size(*this, rhs_y));// assert that same size World &world = this->x[0][0].world(); response_space result(world, num_states, num_orbitals);// create zero_functions - for (size_t i = 0; i < num_states; i++) { result[i] = x[i] - rhs_y[i]; } + for (size_t i = 0; i < num_states; i++) { + result[i] = gaxpy_oop(1.0, x[i], -1.0, rhs_y[i], false); + } + world.gop.fence(); return result; } @@ -194,7 +197,7 @@ namespace madness { response_space &operator*=(double a) { World &world = this->x[0][0].world(); - for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a,false); } + for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a, false); } world.gop.fence(); return *this; } From 7354eb4c572b6a4c265d6bf5f734ddcde5f3677c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 19 Dec 2022 12:45:11 -0500 Subject: [PATCH 0964/1312] some debugging --- src/apps/molresponse/FrequencyResponse.cpp | 27 +++++++++++++++------- src/apps/molresponse/ResponseBase.cpp | 10 +++++++- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index cd860e3d5b7..b456d201ee2 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -107,16 +107,21 @@ void FrequencyResponse::iterate(World &world) { } double d_residual = density_residuals.max(); // Test convergence and set to true - auto chi_norms = Chi.norm2s(); + auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.X.norm2(); auto relative_bsh = copy(bsh_residualsX); auto rho_norms = norm2s_T(world, rho_omega); std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); - max_rotation = 1.50 * max_bsh; + max_rotation = .95 * max_bsh; auto relative_max_bsh = relative_bsh.absmax(); - Tensor polar = -2 * inner(Chi, PQ); + Tensor polar; + if (compute_y) { + polar = -2 * inner(Chi, PQ); + } else { + polar = -4 * response_space_inner(Chi.X, PQ.X); + } world.gop.fence(); // Todo add chi norm and chi_x if (world.rank() == 0) { @@ -182,18 +187,24 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bsh_residualsX = copy(new_res.residual_norms); if (world.rank() == 0) { print("copy tensors: bshX"); } - Chi = new_chi.copy(); + if (compute_y) { + Chi = new_chi.copy(); + } else { + Chi.X = new_chi.X.copy(); + } if (world.rank() == 0) { print("copy chi:"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - xij_res_norms = new_res.residual.component_norm2s(); - if (world.rank() == 0) { print("computing residuals: xij residuals"); } - xij_norms = Chi.component_norm2s(); if (world.rank() == 0) { print("computing chi norms: xij residuals"); } density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); if (world.rank() == 0) { print("computing residuals: density residuals"); } - Tensor polar = -2 * inner(Chi, PQ); + Tensor polar; + if (compute_y) { + polar = -2 * inner(Chi, PQ); + } else { + polar = -4 * response_space_inner(Chi.X, PQ.X); + } if (world.rank() == 0) { print("computing polarizability:"); } if (r_params.print_level() >= 20) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 8daafabb86c..e205734655b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -294,7 +294,7 @@ auto ResponseBase::make_xc_operator(World &world) const -> XCOperator auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfuncT { auto density = vector_real_function_3d(chi.num_states()); auto calc_type = r_params.calc_type(); - if (calc_type == "full" || "static") { + if (calc_type == "full") { auto r_matrix = to_response_matrix(chi); if (world.rank() == 0) { print("make density: to response matrix"); } auto r_phi0 = to_response_vector(ground_orbitals); @@ -305,6 +305,14 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu b++; } + } else if (calc_type == "static") { + int b = 0; + for (auto &rho_b: density) { + rho_b = 2 * dot(world, chi.X[b], ground_orbitals); + b++; + } + + } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } From 2979eaadf61dc088d349da81deff43fb7ace69b7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 19 Dec 2022 16:58:05 -0500 Subject: [PATCH 0965/1312] some function copying to get the residuals --- src/apps/molresponse/FrequencyResponse.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index b456d201ee2..1dfebdd03e1 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -48,9 +48,7 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back( - XNonlinearSolver( - response_matrix_allocator(world, r_vector_size), false)); + kain_x_space.emplace_back(response_matrix_allocator(world, r_vector_size), false); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -197,7 +195,19 @@ void FrequencyResponse::iterate(World &world) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } if (world.rank() == 0) { print("computing chi norms: xij residuals"); } - density_residuals = norm2s_T(world, (rho_omega - rho_omega_old)); + + if (compute_y) { + xij_res_norms = new_res.residual.component_norm2s(); + xij_norms = Chi.component_norm2s(); + } else { + // TODO this is a waste but needs to be done for the analysis scripts to work. Let's remove it later + new_res.residual.Y = new_res.residual.X; + Chi.Y = Chi.X; + xij_res_norms = new_res.residual.component_norm2s(); + xij_norms = Chi.component_norm2s(); + } + auto density_change = madness::sub(world, rho_omega, rho_omega_old, true); + density_residuals = norm2s_T(world, density_change); if (world.rank() == 0) { print("computing residuals: density residuals"); } Tensor polar; if (compute_y) { From 42e01bc272ff35d899b29689ddb5c53d28dadf3a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 20 Dec 2022 10:54:53 -0500 Subject: [PATCH 0966/1312] tighten the convergence settings --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/examples/newsolver.cc | 76 +++++++++++----------- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 1dfebdd03e1..93e395ae298 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,7 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 575.75 * FunctionDefaults<3>::get_thresh() + 2.0e-5; + const double bsh_abs_target = 191.91 * FunctionDefaults<3>::get_thresh() + 8.0e-6; // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/examples/newsolver.cc b/src/examples/newsolver.cc index dc9c8624b66..375ec3e57e4 100644 --- a/src/examples/newsolver.cc +++ b/src/examples/newsolver.cc @@ -1,14 +1,16 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES +//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include using namespace madness; -static const double R = 1.4; // bond length -static const double L = 64.0*R; // box size +static const double R = 1.401042956; // bond length +static const double L = 400.00; // box size static const long k = 8; // wavelet order -static const double thresh = 1e-5; // precision +static const double thresh = 1e-6; // precision +static const double conv_ground_state = 1e-6; // precision +static const double conv_response = 1e-1; // precision static double guess(const coord_3d& r) { const double x=r[0], y=r[1], z=r[2]; @@ -18,18 +20,18 @@ static double guess(const coord_3d& r) { static double V(const coord_3d& r) { const double x=r[0], y=r[1], z=r[2]; - return -1.0/sqrt(x*x+y*y+(z-R/2)*(z-R/2)+1e-8)+ - -1.0/sqrt(x*x+y*y+(z+R/2)*(z+R/2)+1e-8); + return -1.0/sqrt(x*x+y*y+(z-R/2)*(z-R/2)+1e-12)+ + -1.0/sqrt(x*x+y*y+(z+R/2)*(z+R/2)+1e-12); } double rifunction(const coord_3d& r) { return r[2]; //z } -double iterate_ground(World& world, NonlinearSolver& solver, - real_function_3d& V, real_function_3d& psi, +double iterate_ground(World& world, NonlinearSolver& solver, + real_function_3d& V, real_function_3d& psi, double& eps) { - real_convolution_3d op = BSHOperator3D(world, sqrt(-2*eps), 0.001, 1e-6); + real_convolution_3d op = BSHOperator3D(world, sqrt(-2*eps), 0.00001, thresh); real_function_3d Vpsi = (V*psi); Vpsi.scale(-2.0).truncate(); real_function_3d tmp = op(Vpsi).truncate(); @@ -46,14 +48,14 @@ double iterate_ground(World& world, NonlinearSolver& solver, return rnorm; } -double iterate_excite(World& world, NonlinearSolver& solver, - real_function_3d& V, real_function_3d& psi, - real_function_3d& dpsi, double& eps, +double iterate_excite(World& world, NonlinearSolver& solver, + real_function_3d& V, real_function_3d& psi, + real_function_3d& dpsi, double& eps, real_function_3d& ri) { - real_convolution_3d du = CoulombOperator(world, 0.001, 1e-6); + real_convolution_3d du = CoulombOperator(world, 0.00001, thresh); real_function_3d Vdpsi = (V*dpsi); real_function_3d rhs = Vdpsi + (psi*2*du(psi*dpsi)) + (ri*psi); - real_convolution_3d op = BSHOperator3D(world, sqrt(-2*eps), 0.001, 1e-6); + real_convolution_3d op = BSHOperator3D(world, sqrt(-2*eps), 0.00001, thresh); rhs.scale(-2.0).truncate(); real_function_3d r = op(rhs) - dpsi; @@ -71,7 +73,7 @@ double iterate_excite(World& world, NonlinearSolver& solver, struct F { real_function_3d x, y; - F(const real_function_3d& x, const real_function_3d& y) + F(const real_function_3d& x, const real_function_3d& y) : x(x), y(y) {} @@ -124,27 +126,27 @@ double iterate_xy(World& world, solverT& solver, const real_function_3d& V, const real_function_3d& psi, double& eps, const real_function_3d& ri, real_function_3d& x, real_function_3d& y, const double omega) { - real_convolution_3d gOpx = BSHOperator3D(world, sqrt(-2*(eps+omega)), 0.001, 1e-6); - real_convolution_3d gOpy = BSHOperator3D(world, sqrt(-2*(eps-omega)), 0.001, 1e-6); - real_convolution_3d uop = CoulombOperator(world, 0.001, 1e-6); + real_convolution_3d gOpx = BSHOperator3D(world, sqrt(-2*(eps+omega)), 0.00001, thresh); + real_convolution_3d gOpy = BSHOperator3D(world, sqrt(-2*(eps-omega)), 0.00001, thresh); + real_convolution_3d uop = CoulombOperator(world, 0.00001, thresh); real_function_3d gp2 = uop(y*psi); real_function_3d gp3 = uop(x*psi); real_function_3d pp = (gp3 + gp2 + ri) * psi; - + real_function_3d xrhs = V*x + pp; xrhs.scale(-2.0).truncate(); real_function_3d new_x = gOpx(xrhs).truncate(); new_x = new_x - inner(psi,new_x)*psi; double xerr = (x - new_x).norm2(); - + real_function_3d yrhs = V*y + pp; yrhs.scale(-2.0).truncate(); real_function_3d new_y = gOpy(yrhs).truncate(); new_y = new_y - inner(psi,new_y)*psi; double yerr = (y - new_y).norm2(); - + F xy = solver.update(F(x,y), F(new_x-x, new_y-y)); - + x = xy.x.truncate(); y = xy.y.truncate(); print("dynamic", xerr, yerr); @@ -155,7 +157,7 @@ double iterate_xy(World& world, solverT& solver, const real_function_3d& V, int main(int argc, char** argv) { initialize(argc, argv); World world(SafeMPI::COMM_WORLD); - + startup(world,argc,argv); std::cout.precision(6); @@ -163,24 +165,24 @@ int main(int argc, char** argv) { FunctionDefaults<3>::set_thresh(thresh); FunctionDefaults<3>::set_refine(true); FunctionDefaults<3>::set_initial_level(5); - FunctionDefaults<3>::set_truncate_mode(1); + FunctionDefaults<3>::set_truncate_mode(1); FunctionDefaults<3>::set_cubic_cell(-L/2, L/2); - + if (world.rank() == 0) print("\n Solving for the HF wave function\n"); real_function_3d Vnuc = real_factory_3d(world).f(V); real_function_3d psi = real_factory_3d(world).f(guess); psi.truncate(); psi.scale(1.0/psi.norm2()); - real_convolution_3d op = CoulombOperator(world, 0.001, 1e-6); + real_convolution_3d op = CoulombOperator(world, 0.00001, thresh); double eps = -0.6; { NonlinearSolver solver; - for (int iter=0; iter<10; iter++) { + for (int iter=0; iter<20; iter++) { real_function_3d rho = square(psi).truncate(); real_function_3d potential = Vnuc + op(rho).truncate(); double err = iterate_ground(world, solver, potential, psi, eps); - if (err < thresh) break; + if (err < conv_ground_state) break; } } double kinetic_energy = 0.0; @@ -194,7 +196,7 @@ int main(int argc, char** argv) { double two_electron_energy = inner(op(rho),rho); // = double nuclear_attraction_energy = 2.0*inner(Vnuc,rho); // = double nuclear_repulsion_energy = 1.0/R; - double total_energy = kinetic_energy + two_electron_energy + + double total_energy = kinetic_energy + two_electron_energy + nuclear_attraction_energy + nuclear_repulsion_energy; double virial = (nuclear_attraction_energy + two_electron_energy + nuclear_repulsion_energy) / kinetic_energy; @@ -222,7 +224,7 @@ int main(int argc, char** argv) { NonlinearSolver solver; for(int iter=1; iter<=20; iter++) { double err = iterate_excite(world, solver, potential, psi, dpsi, eps, ri); - if (err < 10*thresh) break; + if (err < conv_response) break; } } @@ -257,10 +259,10 @@ int main(int argc, char** argv) { print("< dpsi | r | psi > ",ans5); print(""); print(" < 1 | V - E1 | 0 > =", d2Ea); - print("-< 0 | H0 - E0 | 0 > =", d2Eb); + print("-< 1 | H0 - E0 | 1 > =", d2Eb); print("variational estimate =", 2*d2Ea - d2Eb); } - + // For first frequency use zero as the initial guess but at subsequent // frequencies use the previous solution as the guess. real_function_3d x = real_factory_3d(world); //zero @@ -270,15 +272,15 @@ int main(int argc, char** argv) { if (world.rank() == 0) print("\nSolving for the dynamic response function with omega =", omega,"\n"); XNonlinearSolver solver = XNonlinearSolver(allocator(world)); - + for(int iter=1; iter<=20; iter++) { double err = iterate_xy(world, solver, potential, psi, eps, ri, x, y, omega); - if (err < 10*thresh) break; + if (err < conv_response) break; } real_function_3d drho = (x*psi)+(psi*y); - double alpha_dynamic = -2*inner(ri,drho); - if (world.rank() == 0) + double alpha_dynamic = -2*inner(ri,drho); + if (world.rank() == 0) print("\nalpha_dynamic omega = ",omega," alpha = ",alpha_dynamic); char fname[32]; @@ -289,7 +291,7 @@ int main(int argc, char** argv) { sprintf(fname,"drho_%6.4f.dat", omega); plot_line(fname, 1001, {0.0,0.0,-20.0}, {0.0,0.0,20.0}, drho); } - + finalize(); return 0; } From b29ec5abd9559169dd1057fd03c00f9fea213fcd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 13:46:03 -0500 Subject: [PATCH 0967/1312] bsh_target_power_rule --- src/apps/molresponse/FrequencyResponse.cpp | 5 ++++- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 93e395ae298..0f9c5c79865 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -24,7 +24,10 @@ void FrequencyResponse::iterate(World &world) { // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 - const double bsh_abs_target = 191.91 * FunctionDefaults<3>::get_thresh() + 8.0e-6; + auto thresh = FunctionDefaults<3>::get_thresh(); + const double a_pow = 0.69441118; + const double b_pow = 0.85986518; + const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow); //thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 9196aa5e011..ed0137e89cf 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -369,7 +369,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("l", 200); if (precision == "low") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); From 2bfcc5c3de53d31937d87fe55067af5bf907d28f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 13:48:27 -0500 Subject: [PATCH 0968/1312] debug --- src/apps/molresponse/FrequencyResponse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0f9c5c79865..983f8bafee6 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -74,7 +74,6 @@ void FrequencyResponse::iterate(World &world) { bsh_y_ops = (compute_y) ? make_bsh_operators_response(world, y_shifts, -omega) : bsh_x_ops; vector_real_function_3d rho_omega = make_density(world, Chi); converged = false;// Converged flag - auto thresh = FunctionDefaults<3>::get_thresh(); auto max_rotation = .5; if (thresh >= 1e-2) { max_rotation = 2; From 71f600201ad39ab7c1ca60c0a96fed3786890936 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 17:51:06 -0500 Subject: [PATCH 0969/1312] Testing new convergence settings --- src/apps/molresponse/FrequencyResponse.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 983f8bafee6..989f8d69666 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -25,9 +25,9 @@ void FrequencyResponse::iterate(World &world) { const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); - const double a_pow = 0.69441118; - const double b_pow = 0.85986518; - const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow); //thresh^a*10^b + const double a_pow = 0.70466272; + const double b_pow = 0.81457002; + const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); Tensor bsh_residualsY((int(m))); @@ -114,7 +114,7 @@ void FrequencyResponse::iterate(World &world) { chi_norms.ptr(), relative_bsh.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); - max_rotation = .95 * max_bsh; + max_rotation = 1.0 * max_bsh; auto relative_max_bsh = relative_bsh.absmax(); Tensor polar; if (compute_y) { @@ -357,10 +357,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (r_params.kain() && (iteration > 2)) {// & (iteration % 2 == 0)) { + if (r_params.kain() && (iteration > 0)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 2) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } + if (iteration > 0) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); From 27f9cd46082676bdc544e513ca234d14d56e5b9c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 18:16:51 -0500 Subject: [PATCH 0970/1312] loosen 2nd protocol --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 989f8d69666..b60236ac88d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -25,8 +25,8 @@ void FrequencyResponse::iterate(World &world) { const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); - const double a_pow = 0.70466272; - const double b_pow = 0.81457002; + const double a_pow = 0.59636157; + const double b_pow = 0.16174869; const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); From 6f6c050c2f12b09554025fcf133b68140a48d09a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 20:29:48 -0500 Subject: [PATCH 0971/1312] kain at 3 restrict at 5 --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index b60236ac88d..4d0e5367924 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -357,10 +357,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (r_params.kain() && (iteration > 0)) {// & (iteration % 2 == 0)) { + if (r_params.kain() && (iteration > 3)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 0) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } + if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); From 1c97203cc35523e0fa329c2ddd843c7fa992f5b0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 21:01:41 -0500 Subject: [PATCH 0972/1312] kain at 3 restrict at 3 step restrict with kain --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 4d0e5367924..8113bb52097 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -360,7 +360,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.kain() && (iteration > 3)) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 5) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } + if (iteration > 3) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); From d5c5debe49e97ba1c8b5d260d5390e403cfca9d3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 21 Dec 2022 22:00:48 -0500 Subject: [PATCH 0973/1312] Test without Kain or steprestriction --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8113bb52097..3d1c6f735df 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -357,10 +357,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (r_params.kain() && (iteration > 3)) {// & (iteration % 2 == 0)) { + if (false) {// & (iteration % 2 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - if (iteration > 3) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } + if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); From bed7e0223e23af20a9f46a1cb050d6f01db6f0a3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 12:11:10 -0500 Subject: [PATCH 0974/1312] remove the relative residual --- src/apps/molresponse/ExcitedResponse.cpp | 4 ++-- src/apps/molresponse/FrequencyResponse.cpp | 19 +++++++++---------- src/apps/molresponse/ResponseBase.cpp | 2 -- src/apps/molresponse/ResponseBase.hpp | 5 ++--- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index a2882b5e68e..c483a3b0ccd 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -1917,8 +1917,8 @@ void ExcitedResponse::iterate(World &world) { auto relative_max_bsh = relative_bsh.absmax(); - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, - xij_norms, xij_res_norms, rho_norms, density_residuals); + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, xij_norms, + xij_res_norms, rho_norms, density_residuals); excited_to_json(j_molresponse, iter, omega); diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3d1c6f735df..5c7672cf8fb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -108,14 +108,9 @@ void FrequencyResponse::iterate(World &world) { double d_residual = density_residuals.max(); // Test convergence and set to true auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.X.norm2(); - auto relative_bsh = copy(bsh_residualsX); auto rho_norms = norm2s_T(world, rho_omega); - std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), - chi_norms.ptr(), relative_bsh.ptr(), - [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); max_rotation = 1.0 * max_bsh; - auto relative_max_bsh = relative_bsh.absmax(); Tensor polar; if (compute_y) { polar = -2 * inner(Chi, PQ); @@ -125,8 +120,8 @@ void FrequencyResponse::iterate(World &world) { world.gop.fence(); // Todo add chi norm and chi_x if (world.rank() == 0) { - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, relative_bsh, - xij_norms, xij_res_norms, rho_norms, density_residuals); + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, xij_norms, + xij_res_norms, rho_norms, density_residuals); frequency_to_json(j_molresponse, iter, polar, v_polar); } if (r_params.print_level() >= 1) { @@ -138,12 +133,10 @@ void FrequencyResponse::iterate(World &world) { print("xij residual norms: \n", xij_res_norms); print("Chi_X: ", chi_norms); print("bsh_residuals : ", bsh_residualsX); - print("relative_bsh : ", relative_bsh); print("r_params.dconv(): ", r_params.dconv()); print("max rotation: ", max_rotation); print("d_residual_max : ", d_residual); print("d_residual_max target : ", dconv * 5.0); - print("relative residual", relative_max_bsh); print("bsh_residual_max : ", max_bsh); print("bsh abs target : ", bsh_abs_target); } @@ -309,7 +302,13 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } full_E0X.truncate(); offdiag_E0X.truncate(); + if (r_params.print_level() >= 20) { + print_inner(world, "E0", chi, offdiag_E0X); + print_inner(world, "ED", chi, full_E0X); + } } + + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } @@ -357,7 +356,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (false) {// & (iteration % 2 == 0)) { + if (false) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index e205734655b..969671521f0 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1401,7 +1401,6 @@ void protocol_to_json(json &j, const double proto) { void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, const Tensor &x_abs_norms, - const Tensor &x_rel_norms, const Tensor &xij_norms, const Tensor &xij_abs_norms, const Tensor &rho_norms, @@ -1412,7 +1411,6 @@ void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, const Tens j["x_norms"] = tensor_to_json(x_norms); j["x_abs_error"] = tensor_to_json(x_abs_norms); - j["x_rel_error"] = tensor_to_json(x_rel_norms); j["xij_norms"] = tensor_to_json(xij_norms); j["xij_abs_error"] = tensor_to_json(xij_abs_norms); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index e7b163c5812..644ed516f41 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -290,9 +290,8 @@ class ResponseBase { const X_space &right); void function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, - const Tensor &x_abs_norms, const Tensor &x_rel_norms, - const Tensor &xij_norms, const Tensor &xij_res_norms, - const Tensor &rho_norms, + const Tensor &x_abs_norms, const Tensor &xij_norms, + const Tensor &xij_res_norms, const Tensor &rho_norms, const Tensor &rho_res_norms); X_space compute_TX(World &world, const X_space &X, bool compute_Y) const; }; From 04ad8f49556a9cbdaba30fa46d3e58695ed023d3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 12:14:20 -0500 Subject: [PATCH 0975/1312] Turn on kain after 3 iterations --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5c7672cf8fb..862c2df651c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -356,7 +356,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (false) {// & (iteration % 3 == 0)) { + if (iteration >= 3) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } From bdb9335bdb6172471fee7cf48299dbeb9b14bb25 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 13:36:19 -0500 Subject: [PATCH 0976/1312] remove xij residuals --- src/apps/molresponse/ExcitedResponse.cpp | 4 +- src/apps/molresponse/FrequencyResponse.cpp | 50 +++++++++++----------- src/apps/molresponse/ResponseBase.cpp | 5 --- src/apps/molresponse/ResponseBase.hpp | 9 ++-- src/apps/molresponse/x_space.h | 12 ++++++ 5 files changed, 45 insertions(+), 35 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index c483a3b0ccd..4c817a9628d 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -1917,8 +1917,8 @@ void ExcitedResponse::iterate(World &world) { auto relative_max_bsh = relative_bsh.absmax(); - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, xij_norms, - xij_res_norms, rho_norms, density_residuals); + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, rho_norms, + density_residuals); excited_to_json(j_molresponse, iter, omega); diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 862c2df651c..02328ab87e4 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -9,7 +9,7 @@ void FrequencyResponse::initialize(World &world) { if (world.rank() == 0) { print("FrequencyResponse::initialize()"); } - Chi = PQ.copy(); + Chi = generator(world, *this); } @@ -25,12 +25,12 @@ void FrequencyResponse::iterate(World &world) { const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); + auto density_target = dconv * std::max(size_t(5), molecule.natom()); const double a_pow = 0.59636157; const double b_pow = 0.16174869; const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); - Tensor bsh_residualsY((int(m))); Tensor density_residuals((int(m))); bool static_res = (omega == 0.0); @@ -39,8 +39,6 @@ void FrequencyResponse::iterate(World &world) { r_vector_size = (compute_y) ? 2 * n : n; - Tensor xij_norms(m, r_vector_size); - Tensor xij_res_norms(m, r_vector_size); Tensor v_polar(m, m); vecfuncT rho_omega_old(m); @@ -56,6 +54,18 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } + + + // New approach solving single function at a time + response_function_solver rf_solver; + for (size_t b = 0; b < m * n; b++) { + rf_solver.emplace_back(response_function_allocator(world), false); + } + if (r_params.kain()) { + for (auto &solver_ij: rf_solver) { solver_ij.set_maxsub(r_params.maxsub()); } + } + + // We compute with positive frequencies if (world.rank() == 0) { print("Warning input frequency is assumed to be positive"); @@ -106,7 +116,6 @@ void FrequencyResponse::iterate(World &world) { break; } double d_residual = density_residuals.max(); - // Test convergence and set to true auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.X.norm2(); auto rho_norms = norm2s_T(world, rho_omega); auto max_bsh = bsh_residualsX.absmax(); @@ -120,8 +129,8 @@ void FrequencyResponse::iterate(World &world) { world.gop.fence(); // Todo add chi norm and chi_x if (world.rank() == 0) { - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, xij_norms, - xij_res_norms, rho_norms, density_residuals); + function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, rho_norms, + density_residuals); frequency_to_json(j_molresponse, iter, polar, v_polar); } if (r_params.print_level() >= 1) { @@ -129,19 +138,19 @@ void FrequencyResponse::iterate(World &world) { print("thresh: ", FunctionDefaults<3>::get_thresh()); print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); - print("xij norms: \n", xij_norms); - print("xij residual norms: \n", xij_res_norms); print("Chi_X: ", chi_norms); - print("bsh_residuals : ", bsh_residualsX); - print("r_params.dconv(): ", r_params.dconv()); print("max rotation: ", max_rotation); + print("r_params.dconv(): ", r_params.dconv()); + print("density target : ", density_target); + print("d_residuals : ", density_residuals); print("d_residual_max : ", d_residual); print("d_residual_max target : ", dconv * 5.0); + print("bsh_residuals : ", bsh_residualsX); print("bsh_residual_max : ", max_bsh); print("bsh abs target : ", bsh_abs_target); } } - if ((d_residual < dconv * std::max(size_t(5), molecule.natom())) and + if ((d_residual < density_target) and ((max_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { converged = true; } @@ -191,16 +200,6 @@ void FrequencyResponse::iterate(World &world) { } if (world.rank() == 0) { print("computing chi norms: xij residuals"); } - if (compute_y) { - xij_res_norms = new_res.residual.component_norm2s(); - xij_norms = Chi.component_norm2s(); - } else { - // TODO this is a waste but needs to be done for the analysis scripts to work. Let's remove it later - new_res.residual.Y = new_res.residual.X; - Chi.Y = Chi.X; - xij_res_norms = new_res.residual.component_norm2s(); - xij_norms = Chi.component_norm2s(); - } auto density_change = madness::sub(world, rho_omega, rho_omega_old, true); density_residuals = norm2s_T(world, density_change); if (world.rank() == 0) { print("computing residuals: density residuals"); } @@ -210,6 +209,8 @@ void FrequencyResponse::iterate(World &world) { } else { polar = -4 * response_space_inner(Chi.X, PQ.X); } + + auto v_polar2 = 2 * polar - v_polar; if (world.rank() == 0) { print("computing polarizability:"); } if (r_params.print_level() >= 20) { @@ -225,6 +226,8 @@ void FrequencyResponse::iterate(World &world) { print(evec); print("V polarizability"); print(v_polar); + print("V polarizability 2"); + print(v_polar2); } } @@ -247,8 +250,6 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { print(" Final energy residuals X:"); print(bsh_residualsX); - print(" Final energy residuals Y:"); - print(bsh_residualsY); print(" Final density residuals:"); print(density_residuals); } @@ -270,7 +271,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator X_space lambda_X = X_space(world, chi.num_states(), chi.num_orbitals()); X_space theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); // We are going to build lambda and theta from individual components - // Just compute theta x and lambda x compoenents here if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_y); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 969671521f0..120906046b5 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1401,8 +1401,6 @@ void protocol_to_json(json &j, const double proto) { void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, const Tensor &x_abs_norms, - const Tensor &xij_norms, - const Tensor &xij_abs_norms, const Tensor &rho_norms, const Tensor &rho_abs_norms) { json j = {}; @@ -1412,9 +1410,6 @@ void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, const Tens j["x_norms"] = tensor_to_json(x_norms); j["x_abs_error"] = tensor_to_json(x_abs_norms); - j["xij_norms"] = tensor_to_json(xij_norms); - j["xij_abs_error"] = tensor_to_json(xij_abs_norms); - j["rho_norms"] = tensor_to_json(rho_norms); j["rho_abs_error"] = tensor_to_json(rho_abs_norms); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 644ed516f41..d350cf7d88f 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -25,7 +25,10 @@ using namespace madness; using json=nlohmann::json; -typedef std::vector> response_solver; +typedef std::vector> + response_solver; +typedef std::vector> + response_function_solver; class response_timing { std::map> wall_time_data; @@ -290,8 +293,8 @@ class ResponseBase { const X_space &right); void function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, - const Tensor &x_abs_norms, const Tensor &xij_norms, - const Tensor &xij_res_norms, const Tensor &rho_norms, + const Tensor &x_abs_norms, + const Tensor &rho_norms, const Tensor &rho_res_norms); X_space compute_TX(World &world, const X_space &X, bool compute_Y) const; }; diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index c66ff068f21..f4d9400a10c 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -379,6 +379,18 @@ namespace madness { return response_matrix_allocator(world, other.n_orbtials); } }; + + struct response_function_allocator { + World &world; + response_function_allocator(World &world) : world(world) {} + // overloading the default constructor () operator + real_function_3d operator()() { + return real_function_3d(real_factory_3d(world).fence(true)); + } + response_function_allocator operator=(const response_function_allocator &other) { + return response_function_allocator(world); + } + }; }// namespace madness #endif// SRC_APPS_MOLRESPONSE_X_SPACE_H_ From 2d31f83f76fdc7f80a03458840d832672f9d2ce3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 13:41:39 -0500 Subject: [PATCH 0977/1312] new solver --- src/apps/molresponse/FrequencyResponse.cpp | 5 +++-- src/apps/molresponse/FrequencyResponse.hpp | 9 ++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 02328ab87e4..bd7751d584d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -174,7 +174,7 @@ void FrequencyResponse::iterate(World &world) { } auto [new_chi, new_res, new_polar] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, iter, max_rotation); + kain_x_space, iter, max_rotation, response_function_solver()); v_polar = copy(new_polar); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); @@ -260,7 +260,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &max_rotation) + size_t iteration, const double &max_rotation, + response_function_solver &solver) -> std::tuple> { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 250b90385f5..abbf619a49d 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -48,11 +48,10 @@ class FrequencyResponse : public ResponseBase { void load(World& world, const std::string& name) override; std::tuple> update(World &world, X_space &chi, XCOperator &xc, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, - QProjector &projector, double &x_shifts, - double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &max_rotation); + std::vector &bsh_x_ops, std::vector &bsh_y_ops, + QProjector &projector, double &x_shifts, double &omega_n, + response_solver &kain_x_space, size_t iteration, const double &max_rotation, + response_function_solver &solver); }; From 377565d5be34cef6fd08b4a324e69d6ab6b5f8ff Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 14:26:22 -0500 Subject: [PATCH 0978/1312] new kain solver.....now test on small collection --- src/apps/molresponse/FrequencyResponse.cpp | 72 ++++++++++++++++++++-- src/apps/molresponse/FrequencyResponse.hpp | 2 + src/apps/molresponse/ResponseBase.cpp | 1 + 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bd7751d584d..d751bac5226 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -9,7 +9,7 @@ void FrequencyResponse::initialize(World &world) { if (world.rank() == 0) { print("FrequencyResponse::initialize()"); } - Chi = generator(world, *this); + Chi = PQ.copy(); } @@ -174,7 +174,7 @@ void FrequencyResponse::iterate(World &world) { } auto [new_chi, new_res, new_polar] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, iter, max_rotation, response_function_solver()); + kain_x_space, iter, max_rotation, rf_solver); v_polar = copy(new_polar); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); @@ -357,8 +357,12 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (iteration >= 3) {// & (iteration % 3 == 0)) { - new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + if (iteration >= 0) {// & (iteration % 3 == 0)) { + if (false) { + new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + } else { + new_chi = new_kain_x_space_update(world, chi, new_chi, solver); + } } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } @@ -371,6 +375,64 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // print x norms } +auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, + response_function_solver &rf_solver) -> X_space { + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + bool compute_y = omega != 0.0; + + size_t m = x.num_states(); + size_t n = x.num_orbitals(); + size_t p = compute_y ? 2 : 1; + + + X_space kain_update(world, m, n); + // step 1 is to place all functions into a single vector + + if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } + + vector_real_function_3d vect_x(m * n * p); + vector_real_function_3d vect_fx(m * n * p); + vector_real_function_3d vect_rx(m * n * p); + + int orb_x; + int orb_y; + for (int i = 0; i < m; i++) { + orb_x = i * p * n; + for (int j = 0; j < n; j++) { + vect_x[orb_x + j] = x.X[i][j]; + vect_fx[orb_x + j] = fx.X[i][j]; + } + if (compute_y) { + orb_y = i * p * n + n; + for (int j = 0; j < n; j++) { + vect_x[orb_y + j] = x.Y[i][j]; + vect_fx[orb_y + j] = fx.Y[i][j]; + } + } + } + vect_rx = sub(world, vect_fx, vect_x); + + for (int i = 0; i < m; i++) { + orb_x = i * p * n; + for (int j = 0; j < n; j++) { + kain_update.X[i][j] = + rf_solver[orb_x + j].update(vect_x[orb_x + j], vect_rx[orb_x + j]); + } + if (compute_y) { + orb_y = i * p * n + n; + for (int j = 0; j < n; j++) { + kain_update.Y[i][j] = + rf_solver[orb_y + j].update(vect_x[orb_y + j], vect_rx[orb_y + j]); + } + } + } + if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); + } + return kain_update; +} auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, std::vector &bsh_x_ops, std::vector &bsh_y_ops, @@ -514,7 +576,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { //truncate(world, dipole_vectors, true); world.gop.fence(); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); - PQ.Y = PQ.X; + PQ.Y = PQ.X.copy(); if (world.rank() == 0) { print("Made new PQ"); } return PQ; } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index abbf619a49d..47701c743e6 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -52,6 +52,8 @@ class FrequencyResponse : public ResponseBase { QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, size_t iteration, const double &max_rotation, response_function_solver &solver); + X_space new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, + response_function_solver &rf_solver); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 120906046b5..c6e931b32ce 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1237,6 +1237,7 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, return kain_update; } + void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, bool restrict_y, const double &max_bsh_rotation) { size_t m = old_Chi.num_states(); From f04c75252645ec77647423b0a999f791d0ed052e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 14:32:24 -0500 Subject: [PATCH 0979/1312] new kain solver.....now test on small collection --- src/apps/molresponse/FrequencyResponse.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d751bac5226..d445693d2ae 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -135,17 +135,17 @@ void FrequencyResponse::iterate(World &world) { } if (r_params.print_level() >= 1) { if (world.rank() == 0) { + print("r_params.dconv(): ", r_params.dconv()); print("thresh: ", FunctionDefaults<3>::get_thresh()); print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); print("Chi_X: ", chi_norms); print("max rotation: ", max_rotation); - print("r_params.dconv(): ", r_params.dconv()); - print("density target : ", density_target); print("d_residuals : ", density_residuals); - print("d_residual_max : ", d_residual); - print("d_residual_max target : ", dconv * 5.0); print("bsh_residuals : ", bsh_residualsX); + print("d_residual_max : ", d_residual); + print("density target : ", density_target); + print("d_residual_max target : ",density_target); print("bsh_residual_max : ", max_bsh); print("bsh abs target : ", bsh_abs_target); } From ae9357131a542dae3ff41fd9948bc25555e4cbd1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 14:35:51 -0500 Subject: [PATCH 0980/1312] remove the 2nd version of polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d445693d2ae..c41cf256a9c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -210,7 +210,6 @@ void FrequencyResponse::iterate(World &world) { polar = -4 * response_space_inner(Chi.X, PQ.X); } - auto v_polar2 = 2 * polar - v_polar; if (world.rank() == 0) { print("computing polarizability:"); } if (r_params.print_level() >= 20) { @@ -226,8 +225,6 @@ void FrequencyResponse::iterate(World &world) { print(evec); print("V polarizability"); print(v_polar); - print("V polarizability 2"); - print(v_polar2); } } From 07664d7eb47de7f9e5200113fd4c20753d00fcbb Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 14:48:16 -0500 Subject: [PATCH 0981/1312] ensure enough function allocation for y updates --- src/apps/molresponse/FrequencyResponse.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index c41cf256a9c..09805e2925d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -57,8 +57,9 @@ void FrequencyResponse::iterate(World &world) { // New approach solving single function at a time + auto p = compute_y ? 2 : 1; response_function_solver rf_solver; - for (size_t b = 0; b < m * n; b++) { + for (size_t b = 0; b < m * n * p; b++) { rf_solver.emplace_back(response_function_allocator(world), false); } if (r_params.kain()) { @@ -145,7 +146,7 @@ void FrequencyResponse::iterate(World &world) { print("bsh_residuals : ", bsh_residualsX); print("d_residual_max : ", d_residual); print("density target : ", density_target); - print("d_residual_max target : ",density_target); + print("d_residual_max target : ", density_target); print("bsh_residual_max : ", max_bsh); print("bsh abs target : ", bsh_abs_target); } From cb444ada7cdd0b8fa98c346ee0c8853d34822f44 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 15:04:36 -0500 Subject: [PATCH 0982/1312] make sure we copy x --- src/apps/molresponse/FrequencyResponse.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 09805e2925d..f9ae48d6db5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -363,7 +363,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } - + if (~compute_y) { new_chi.Y = new_chi.X.copy(); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } @@ -410,6 +410,7 @@ auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, } } vect_rx = sub(world, vect_fx, vect_x); + truncate(world, vect_rx); for (int i = 0; i < m; i++) { orb_x = i * p * n; @@ -574,6 +575,7 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { //truncate(world, dipole_vectors, true); world.gop.fence(); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); + ; PQ.Y = PQ.X.copy(); if (world.rank() == 0) { print("Made new PQ"); } return PQ; From 27fad9474d48fff9f269d2b180bbde1a9d58980d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 15:39:05 -0500 Subject: [PATCH 0983/1312] switch it back to xvector kain just truncate residual first --- src/apps/molresponse/FrequencyResponse.cpp | 7 +++---- src/apps/molresponse/ResponseBase.cpp | 2 ++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f9ae48d6db5..d96e5f55156 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -356,7 +356,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 if (iteration >= 0) {// & (iteration % 3 == 0)) { - if (false) { + if (true) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } else { new_chi = new_kain_x_space_update(world, chi, new_chi, solver); @@ -402,7 +402,7 @@ auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, vect_fx[orb_x + j] = fx.X[i][j]; } if (compute_y) { - orb_y = i * p * n + n; + orb_y = orb_x + n; for (int j = 0; j < n; j++) { vect_x[orb_y + j] = x.Y[i][j]; vect_fx[orb_y + j] = fx.Y[i][j]; @@ -419,7 +419,7 @@ auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, rf_solver[orb_x + j].update(vect_x[orb_x + j], vect_rx[orb_x + j]); } if (compute_y) { - orb_y = i * p * n + n; + orb_y = orb_x + n; for (int j = 0; j < n; j++) { kain_update.Y[i][j] = rf_solver[orb_y + j].update(vect_x[orb_y + j], vect_rx[orb_y + j]); @@ -575,7 +575,6 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { //truncate(world, dipole_vectors, true); world.gop.fence(); PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); - ; PQ.Y = PQ.X.copy(); if (world.rank() == 0) { print("Made new PQ"); } return PQ; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c6e931b32ce..5071af7f563 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1190,9 +1190,11 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp X_space res(world, m, n); if (compute_y) { res = g_chi - chi; + res.truncate(); residual_norms = res.norm2s(); } else { res.X = g_chi.X - chi.X; + res.X.truncate_rf(); residual_norms = res.X.norm2(); } if (r_params.print_level() >= 1) { From 1298eddc6dc7ae7e9fdf0fbf127c376dfb967ecb Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:01:49 -0500 Subject: [PATCH 0984/1312] do not truncate after computing residual --- src/apps/molresponse/ResponseBase.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 5071af7f563..c6e931b32ce 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1190,11 +1190,9 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp X_space res(world, m, n); if (compute_y) { res = g_chi - chi; - res.truncate(); residual_norms = res.norm2s(); } else { res.X = g_chi.X - chi.X; - res.X.truncate_rf(); residual_norms = res.X.norm2(); } if (r_params.print_level() >= 1) { From 1b9b33cb43e112dd693d69b5f423304d35fa8c7c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:08:43 -0500 Subject: [PATCH 0985/1312] put the truncation back in --- src/apps/molresponse/ResponseBase.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c6e931b32ce..5071af7f563 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1190,9 +1190,11 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp X_space res(world, m, n); if (compute_y) { res = g_chi - chi; + res.truncate(); residual_norms = res.norm2s(); } else { res.X = g_chi.X - chi.X; + res.X.truncate_rf(); residual_norms = res.X.norm2(); } if (r_params.print_level() >= 1) { From ca4c03e2ab37619b496c826e95d9d35eac14a2bf Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:10:09 -0500 Subject: [PATCH 0986/1312] put the truncation back in --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d96e5f55156..28ab3a89b4d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -355,7 +355,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (iteration >= 0) {// & (iteration % 3 == 0)) { + if (iteration > 3) {// & (iteration % 3 == 0)) { if (true) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } else { From f5ff9214568ba5f0f7e7a5f7b4647b62f8c9eced Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:15:59 -0500 Subject: [PATCH 0987/1312] make it's this line --- src/apps/molresponse/FrequencyResponse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 28ab3a89b4d..16710708cea 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -363,7 +363,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } - if (~compute_y) { new_chi.Y = new_chi.X.copy(); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } From d08e64eb84a3efe565018a62e74e62e3ab9e9253 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:20:02 -0500 Subject: [PATCH 0988/1312] okay this fixed it --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 16710708cea..536fe9aad1c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -355,7 +355,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 - if (iteration > 3) {// & (iteration % 3 == 0)) { + if (iteration > 0) {// & (iteration % 3 == 0)) { if (true) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } else { From dcc076fa780e0879ba0573bcbe0312d9a5167efe Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:25:32 -0500 Subject: [PATCH 0989/1312] last try with the new solver --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 536fe9aad1c..9f86731e8bc 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -356,7 +356,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { - if (true) { + if (false) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } else { new_chi = new_kain_x_space_update(world, chi, new_chi, solver); From a1245df41b5210bd3e175d7016df2c8c9ce9306b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 22 Dec 2022 16:28:06 -0500 Subject: [PATCH 0990/1312] revert it back to old kain solver --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9f86731e8bc..536fe9aad1c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -356,7 +356,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { - if (false) { + if (true) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } else { new_chi = new_kain_x_space_update(world, chi, new_chi, solver); From af2e5bc21b4d380e30126a4ac5ac628ef6acaa00 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 6 Jan 2023 10:32:41 -0500 Subject: [PATCH 0991/1312] high starts at 1e-6 and ends at 1e-8 in three stages --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index ed0137e89cf..3788d026c28 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -502,7 +502,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value>("protocol", {1e-6, 1e-7, 1e-8}); r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); From 5e2fa29ec71e1683ea6504c0783c3c3fb099ec3c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 6 Jan 2023 13:19:07 -0500 Subject: [PATCH 0992/1312] match moldft and response convergence settings --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 3788d026c28..26a617db60a 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -372,7 +372,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + param1.set_user_defined_value>("protocol", {1e-6, 1e-7, 1e-8}); param1.set_user_defined_value("dconv", 1e-6); } else { param1.set_user_defined_value>("protocol", {1e-8}); From 038398ce6b7cc4f584ae68269f1a6a5d2b178b89 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 6 Jan 2023 13:19:23 -0500 Subject: [PATCH 0993/1312] output json after each stage --- src/apps/molresponse/ResponseBase.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 5071af7f563..60cbdca8c42 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1459,6 +1459,10 @@ void ResponseBase::solve(World &world) { protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... this->iterate(world); + if (world.rank() == 0) { + //calc.time_data.to_json(calc.j_molresponse); + this->output_json(); + } } // At this point we should know if calc converged maybe add a flag to response.json which states if it has converged_to_json(j_molresponse); From b9b0b2acfe909fe98d1e0b6ed92e977ca07663ad Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 6 Jan 2023 17:27:23 -0500 Subject: [PATCH 0994/1312] this change is not compatible --- src/apps/molresponse/ResponseBase.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 60cbdca8c42..5071af7f563 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1459,10 +1459,6 @@ void ResponseBase::solve(World &world) { protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... this->iterate(world); - if (world.rank() == 0) { - //calc.time_data.to_json(calc.j_molresponse); - this->output_json(); - } } // At this point we should know if calc converged maybe add a flag to response.json which states if it has converged_to_json(j_molresponse); From 9d46c442c5558df91cd7c516e10e8dfbfc1f95a8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 11 Jan 2023 12:19:39 -0500 Subject: [PATCH 0995/1312] only break if we should be closer to convergence --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 12 +++++------- src/apps/molresponse/testing/test_development.cpp | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 536fe9aad1c..2dc1c27a957 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -112,7 +112,7 @@ void FrequencyResponse::iterate(World &world) { } if (iter < 2 || (iter % 10) == 0) { load_balance_chi(world); } if (iter > 0) { - if (density_residuals.max() > 20) { + if (density_residuals.max() > 20 && iter > 5) { if (world.rank() == 0) { print("d-residual > 20...break"); } break; } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 26a617db60a..1527731a6e4 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -180,7 +180,6 @@ frequencySchema::frequencySchema(World &world, const runSchema &run_schema, * @return */ size_t set_excited_states(const ResponseDataBase &response_data_base, - const std::filesystem::path &molecule_path, const std::string &molecule_name, const std::string &xc) { const std::string property = "excited-state"; @@ -208,7 +207,7 @@ size_t set_excited_states(const ResponseDataBase &response_data_base, * @return */ std::filesystem::path generate_excited_run_path(const std::filesystem::path &moldft_path, - const size_t &num_states, const std::string &xc) { + const size_t &num_states) { std::string s_num_states = std::to_string(num_states); std::string run_name = "excited-" + s_num_states; // set r_params to restart true if restart file exist @@ -250,9 +249,8 @@ struct excitedSchema { excitedSchema(const runSchema &run_schema, const moldftSchema &m_schema) : xc(m_schema.xc) { - num_states = - set_excited_states(run_schema.rdb, run_schema.molecule_path, m_schema.mol_name, xc); - excited_state_run_path = generate_excited_run_path(m_schema.moldft_path, num_states, xc); + num_states = set_excited_states(run_schema.rdb, m_schema.mol_name, xc); + excited_state_run_path = generate_excited_run_path(m_schema.moldft_path, num_states); auto [sp, s] = generate_excited_save_path(excited_state_run_path); save_path = sp; save_string = s; @@ -692,7 +690,7 @@ static void set_and_write_restart_excited_parameters(ResponseParameters ¶met * @param frequency * @param moldft_path */ -static void create_excited_paths(ResponseParameters ¶meters, excitedSchema &schema) { +static void create_excited_paths(excitedSchema &schema) { if (std::filesystem::is_directory(schema.excited_state_run_path)) { cout << "Response directory found " << std::endl; @@ -720,7 +718,7 @@ auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec ResponseParameters r_params{}; set_excited_parameters(r_params, schema.xc, schema.num_states, high_prec); - create_excited_paths(r_params, schema); + create_excited_paths(schema); std::filesystem::current_path(schema.excited_state_run_path); set_and_write_restart_excited_parameters(r_params, schema, restart); diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index 96ca7f864c5..722b178f1d3 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -37,7 +37,7 @@ int main(int argc, char *argv[]) { excited_schema.print(); ResponseParameters r_params{}; set_excited_parameters(r_params, excited_schema.xc, excited_schema.num_states, false); - create_excited_paths(r_params, excited_schema); + create_excited_paths(excited_schema); std::filesystem::current_path(excited_schema.excited_state_run_path); set_and_write_restart_excited_parameters(r_params, excited_schema, false); auto xc_path = create_xc_path_and_directory(root, xc); From 3cb15fa372f5bea48b18445c910c50fa883b43a7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 17 Jan 2023 15:13:21 -0500 Subject: [PATCH 0996/1312] Convergence Criteria based on relative residual --- src/apps/molresponse/FrequencyResponse.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2dc1c27a957..07d6dd32527 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,11 +26,12 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow = 0.59636157; - const double b_pow = 0.16174869; + const double a_pow = 0.790; + const double b_pow = 0.678; const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); + Tensor bsh_relative_residualsX((int(m))); Tensor density_residuals((int(m))); bool static_res = (omega == 0.0); @@ -119,7 +120,11 @@ void FrequencyResponse::iterate(World &world) { double d_residual = density_residuals.max(); auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.X.norm2(); auto rho_norms = norm2s_T(world, rho_omega); + std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), + chi_norms.ptr(), bsh_relative_residualsX.ptr(), + [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); auto max_bsh = bsh_residualsX.absmax(); + auto max_relative_bsh = bsh_relative_residualsX.absmax(); max_rotation = 1.0 * max_bsh; Tensor polar; if (compute_y) { @@ -148,6 +153,7 @@ void FrequencyResponse::iterate(World &world) { print("density target : ", density_target); print("d_residual_max target : ", density_target); print("bsh_residual_max : ", max_bsh); + print("bsh_relative_residual_max : ", max_relative_bsh); print("bsh abs target : ", bsh_abs_target); } } @@ -270,7 +276,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator X_space lambda_X = X_space(world, chi.num_states(), chi.num_orbitals()); X_space theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); // We are going to build lambda and theta from individual components - // Just compute theta x and lambda x compoenents here + // Just compute theta x and lambda x components here if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_y); if (r_params.print_level() >= 1) { From 7d3443ce06f2336ae021ad51cb61d3f2598b6544 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 17 Jan 2023 16:43:24 -0500 Subject: [PATCH 0997/1312] loosen a bit --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 07d6dd32527..ed428a53e56 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow = 0.790; - const double b_pow = 0.678; + const double a_pow = 0.649; + const double b_pow = 0.533; const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); From e39f36108656ebbd075a8955a53b68726fe86457 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 19 Jan 2023 17:46:06 -0500 Subject: [PATCH 0998/1312] output scf calc info for dipole --- src/apps/molresponse/testing/runners.hpp | 9 ++++++++- src/madness/chem/SCF.cc | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 1527731a6e4..65e4099bf96 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -441,7 +441,14 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! world.gop.fence(); - if (world.rank() == 0) { ME.output_calc_info_schema(); } + const real_function_3d rho = 2.0 * calc.make_density(world, calc.aocc, calc.amo); + auto dipole_t = calc.dipole(world, rho); + std::map results; + results["scf_energy"] = calc.current_energy; + if (world.rank() == 0) { + calc.output_scf_info_schema(0, results, dipole_t); + ME.output_calc_info_schema(); + } } else { if (world.rank() == 0) { print("Skipping Calculation and printing CALC INFO"); diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index c4fa21e90e7..c0dc44ecfb3 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -140,7 +140,6 @@ tensorT Q2(const tensorT& s) { return Q; } -}// namespace madness void SCF::output_calc_info_schema() const { nlohmann::json j = {}; From 6266b3e36f0d676407957537706bb037d43dabd9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 19 Jan 2023 17:54:34 -0500 Subject: [PATCH 0999/1312] some how i deleted a brace --- src/madness/chem/SCF.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index c0dc44ecfb3..c4fa21e90e7 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -140,6 +140,7 @@ tensorT Q2(const tensorT& s) { return Q; } +}// namespace madness void SCF::output_calc_info_schema() const { nlohmann::json j = {}; From 0ae77f043a4cb7b53d70326d59ab1fad4af9942d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 18:49:11 -0500 Subject: [PATCH 1000/1312] typos --- src/apps/molresponse/ResponseBase.cpp | 14 ++++---------- src/apps/molresponse/ResponseBase.hpp | 2 -- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 5071af7f563..c747eb43fcd 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -971,17 +971,11 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< bool compute_Y) const -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // // std::cout << "MPI BARRIER V0X " << std::endl; - // // world.mpi.Barrier(); - // Start a timer size_t m = X.num_states(); size_t n = X.num_orbitals(); - X_space V0 = X_space(world, m, n); X_space K0 = X_space(world, m, n); - real_function_3d v_nuc, v_j0, v_k0, v_xc; - if (not r_params.store_potential()) { v_nuc = potential_manager->vnuclear(); //v_nuc.truncate(); @@ -1436,7 +1430,7 @@ void ResponseBase::solve(World &world) { for (const auto &iter_thresh: protocol) { // We set the protocol and function defaults here for the given threshold of set_protocol(world, iter_thresh); - if (world.rank() == 0) { print("Succesfully set protocol"); } + if (world.rank() == 0) { print("Successfully set protocol"); } // protocol if (first_protocol) { if (r_params.restart()) { @@ -1447,14 +1441,14 @@ void ResponseBase::solve(World &world) { first_protocol = false; } else { this->initialize(world); - if (world.rank() == 0) { print("Succesfully initialized "); } + if (world.rank() == 0) { print("Successfully initialized "); } } check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); - if (world.rank() == 0) { print("Succesfully check K first initialization "); } + if (world.rank() == 0) { print("Successfully check K first initialization "); } first_protocol = false; } else { check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); - if (world.rank() == 0) { print("Succesfully check K not first initialization "); } + if (world.rank() == 0) { print("Successfully check K not first initialization "); } } protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index d350cf7d88f..e24cfdacdda 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -121,8 +121,6 @@ class ResponseBase { double vtol{}; X_space Chi; - - /// Sets the Function protocol dependent on the truncation threshold. /// Sets the polynomial order of basis functions k /// Then creates shared coulomb operator, gradient operator, ground density From 2eee31c7f1564918670b21f3805ba0198c360b9d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 18:49:24 -0500 Subject: [PATCH 1001/1312] remove resonse function solver --- src/apps/molresponse/FrequencyResponse.cpp | 15 +++------------ src/apps/molresponse/FrequencyResponse.hpp | 3 +-- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ed428a53e56..1b6924543a9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -55,8 +55,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } - - // New approach solving single function at a time auto p = compute_y ? 2 : 1; response_function_solver rf_solver; @@ -66,8 +64,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &solver_ij: rf_solver) { solver_ij.set_maxsub(r_params.maxsub()); } } - - // We compute with positive frequencies if (world.rank() == 0) { print("Warning input frequency is assumed to be positive"); @@ -181,7 +177,7 @@ void FrequencyResponse::iterate(World &world) { } auto [new_chi, new_res, new_polar] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, iter, max_rotation, rf_solver); + kain_x_space, iter, max_rotation); v_polar = copy(new_polar); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); @@ -264,8 +260,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &max_rotation, - response_function_solver &solver) + size_t iteration, const double &max_rotation) -> std::tuple> { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -362,11 +357,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { - if (true) { - new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); - } else { - new_chi = new_kain_x_space_update(world, chi, new_chi, solver); - } + new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 47701c743e6..e67d74df024 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -50,8 +50,7 @@ class FrequencyResponse : public ResponseBase { update(World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, - response_solver &kain_x_space, size_t iteration, const double &max_rotation, - response_function_solver &solver); + response_solver &kain_x_space, size_t iteration, const double &max_rotation); X_space new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, response_function_solver &rf_solver); }; From 002e27a479fa0b9d345b9008965ac9e9c66e04fd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 19:12:40 -0500 Subject: [PATCH 1002/1312] some v0 edits --- src/apps/molresponse/FrequencyResponse.cpp | 2 - src/apps/molresponse/ResponseBase.cpp | 44 +++------------------- 2 files changed, 5 insertions(+), 41 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 1b6924543a9..a768df992bf 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -270,8 +270,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator auto x = chi.copy();// copy chi X_space lambda_X = X_space(world, chi.num_states(), chi.num_orbitals()); X_space theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); - // We are going to build lambda and theta from individual components - // Just compute theta x and lambda x components here if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_y); if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c747eb43fcd..f0540b14e64 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1007,56 +1007,27 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // make a zero function v_xc = Function(FunctionFactory(world).fence(false).initial_level(1)); } - // Intermediaries - world.gop.fence(); - - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* - K0 = ground_exchange(phi0_copy, X, compute_Y); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "old K[0]"); - print_inner(world, "new xK0x", Chi_copy, K0); - } - */ - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(ground_orbitals, X, compute_Y); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "new K[0]", "K[0]", iter_timing); - } - if (r_params.print_level() >= 20) { print_inner(world, "new xK0x", X, K0); } + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - real_function_3d v0 = v_j0 + v_nuc + v_xc; - v0.truncate(); auto c_xc = xcf.hf_exchange_coefficient(); + real_function_3d v0 = v_j0 + v_nuc + (1 - c_xc) * v_xc; + v0.truncate(); double safety = 0.1; double vtol = safety * FunctionDefaults<3>::get_thresh(); - if (compute_Y) { auto x = to_response_matrix(X); auto vx = create_response_matrix(X.num_states(), X.num_orbitals()); - std::transform(x.begin(), x.end(), vx.begin(), - [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); + for (int b = 0; b < m; b++) { vx[b] = mul(world, v0, x[b], false); } world.gop.fence(); V0 = to_X_space(vx); - V0.truncate(); - //V0 = v0 * X; - if (world.rank() == 0) { print("vox: v0=v0*X"); } V0 += -c_xc * K0; - if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } - } else { - - std::transform(X.X.begin(), X.X.end(), V0.X.begin(), - [&](const auto &xi) { return mul_sparse(world, v0, xi, vtol, false); }); + for (int b = 0; b < m; b++) { V0.X[b] = mul(world, v0, X.X[b], false); } world.gop.fence(); - V0.X.truncate_rf(); - //V0.X = v0 * X.X; - if (world.rank() == 0) { print("vox: v0=v0*X"); } V0.X += -c_xc * K0.X; - - if (world.rank() == 0) { print("vox: v0+=c_xc*K0"); } V0.Y = V0.X.copy(); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } @@ -1067,11 +1038,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< return V0; } -// Returns the ground state potential applied to functions f -// (V0 f) V0=(Vnuc+J0-K0+W0) -// J0=J[ground_density] -// K0=K[ground_density]f -// EXC0=W[ground_density] auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) const -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space T0X = X_space(world, x.num_states(), x.num_orbitals()); From d7889ca7557c997bc8621db675ab1f97eedf7670 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 19:25:49 -0500 Subject: [PATCH 1003/1312] some gamma changes --- src/apps/molresponse/FrequencyResponse.cpp | 5 ----- src/apps/molresponse/ResponseBase.cpp | 1 - src/apps/molresponse/global_functions.cc | 1 - 3 files changed, 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index a768df992bf..93e02e9ccfd 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -282,7 +282,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator molresponse::end_timer(world, "compute_TX", "TX", iter_timing); if (r_params.print_level() >= 20) { print_inner(world, "xTx", chi, TOX); } } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space full_E0X(world, chi.num_states(), chi.num_orbitals()); X_space offdiag_E0X(world, chi.num_states(), chi.num_orbitals()); @@ -298,15 +297,11 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator full_E0X.X = x.X * hamiltonian; full_E0X.Y = full_E0X.X.copy(); } - full_E0X.truncate(); - offdiag_E0X.truncate(); if (r_params.print_level() >= 20) { print_inner(world, "E0", chi, offdiag_E0X); print_inner(world, "ED", chi, full_E0X); } } - - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f0540b14e64..949f5ae44e6 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -501,7 +501,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // TODO is copy better than adding? probably? // J.Y=j_x+j_y; J.Y = J.X.copy(); - J.truncate(); if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f4df32adf89..d87853ae145 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -372,7 +372,6 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } } - K.truncate(); return K; } From 8c2453b8cceb51e91ecc81676bea01b90464249c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 20:25:11 -0500 Subject: [PATCH 1004/1312] revert to using theta_X --- src/apps/molresponse/FrequencyResponse.cpp | 96 ++-------------------- src/apps/molresponse/FrequencyResponse.hpp | 3 +- 2 files changed, 6 insertions(+), 93 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 93e02e9ccfd..b58bdba7674 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -175,10 +175,8 @@ void FrequencyResponse::iterate(World &world) { break; } } - auto [new_chi, new_res, new_polar] = - update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, iter, max_rotation); - v_polar = copy(new_polar); + auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, + omega, kain_x_space, iter, max_rotation); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, Chi); if (r_params.print_level() >= 1) { @@ -216,18 +214,11 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { print("computing polarizability:"); } if (r_params.print_level() >= 20) { - auto [eval, evec] = syev(polar); if (world.rank() == 0) { printf("\n--------Response Properties after %d-------------\n", static_cast(iter)); print("polarizability"); print(polar); - print("polarizability eigenvalues"); - print(eval); - print("polarizability eigenvectors"); - print(evec); - print("V polarizability"); - print(v_polar); } } @@ -261,90 +252,14 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, size_t iteration, const double &max_rotation) - -> std::tuple> { + -> std::tuple { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; auto x = chi.copy();// copy chi - X_space lambda_X = X_space(world, chi.num_states(), chi.num_orbitals()); - X_space theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space V0X = compute_V0X(world, chi, xc, compute_y); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); - if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } - } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space TOX = compute_TX(world, chi, compute_y); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_TX", "TX", iter_timing); - if (r_params.print_level() >= 20) { print_inner(world, "xTx", chi, TOX); } - } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space full_E0X(world, chi.num_states(), chi.num_orbitals()); - X_space offdiag_E0X(world, chi.num_states(), chi.num_orbitals()); - if (r_params.localize() != "canon") { - if (compute_y) { - offdiag_E0X.X = x.X * ham_no_diag; - offdiag_E0X.Y = x.Y * ham_no_diag; - full_E0X.X = x.X * hamiltonian; - full_E0X.Y = x.Y * hamiltonian; - } else { - offdiag_E0X.X = x.X * ham_no_diag; - offdiag_E0X.Y = offdiag_E0X.X.copy(); - full_E0X.X = x.X * hamiltonian; - full_E0X.Y = full_E0X.X.copy(); - } - if (r_params.print_level() >= 20) { - print_inner(world, "E0", chi, offdiag_E0X); - print_inner(world, "ED", chi, full_E0X); - } - } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); - } - X_space gamma; - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - if (compute_y) gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); - else - gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); - } - - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - if (compute_y) { - theta_X = (V0X - offdiag_E0X) + gamma; - theta_X.truncate(); - } else { - theta_X.X = (V0X.X - offdiag_E0X.X + gamma.X); - theta_X.X.truncate_rf(); - theta_X.Y = theta_X.X.copy(); - } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); - } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space omega_X = X_space::zero_functions(world, chi.num_states(), chi.num_orbitals()); - if (compute_y) { - omega_X.X = -omega * x.X; - omega_X.Y = omega * x.Y; - lambda_X = TOX + V0X - full_E0X + omega_X + gamma; - lambda_X.truncate(); - } else { - lambda_X.X = TOX.X + V0X.X - full_E0X.X + gamma.X; - lambda_X.X.truncate_rf(); - } - - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "lambda_x"); } - Tensor polar; - if (compute_y) { - polar = 2 * inner(x, lambda_X); - } else { - polar = 4 * response_space_inner(x.X, lambda_X.X); - } + X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); @@ -357,7 +272,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator molresponse::end_timer(world, "update response", "update", iter_timing); } // if not compute y then copy x in to y - return {new_chi, {new_res, bsh}, polar}; + return {new_chi, {new_res, bsh}}; // print x norms } @@ -482,7 +397,6 @@ void FrequencyResponse::frequency_to_json(json &j_mol_in, size_t iter, json j = {}; j["iter"] = iter; j["polar"] = tensor_to_json(polar_ij); - j["v_polar"] = tensor_to_json(v_polar_ij); auto index = j_mol_in["protocol_data"].size() - 1; j_mol_in["protocol_data"][index]["property_data"].push_back(j); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index e67d74df024..db141cbe5d9 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -46,8 +46,7 @@ class FrequencyResponse : public ResponseBase { std::string message); void save(World& world, const std::string& name) override; void load(World& world, const std::string& name) override; - std::tuple> - update(World &world, X_space &chi, XCOperator &xc, + std::tuple update(World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, size_t iteration, const double &max_rotation); From 5cf436e0042ca1317f8e4d20ae1b6388a3515557 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 20:33:12 -0500 Subject: [PATCH 1005/1312] tighter convergence parameters --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index b58bdba7674..952e7b634f9 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow = 0.649; - const double b_pow = 0.533; + const double a_pow = 0.792; + const double b_pow = 1.078; const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); From c47af74dc2fa63f7893547fbba2d0b28828530e3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 20:51:24 -0500 Subject: [PATCH 1006/1312] remove mask and truncate from PQ --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 952e7b634f9..9c270e72afd 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -95,8 +95,8 @@ void FrequencyResponse::iterate(World &world) { functionT mask; mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); PQ = generator(world, *this); - PQ = PQ * mask; - PQ.truncate(); + //PQ = PQ * mask; + //PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); Chi = mask * Chi; From 82e1df75abd90c6843e91c97c2e65bbf81eb7ee3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 20:57:10 -0500 Subject: [PATCH 1007/1312] remove mask --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9c270e72afd..0e046658c2c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -99,7 +99,7 @@ void FrequencyResponse::iterate(World &world) { //PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); - Chi = mask * Chi; + //Chi = mask * Chi; // Basic output if (r_params.print_level() >= 1) { molresponse::start_timer(world); From 9da402953c900adf42d140908a19b64c4bc85b1c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 21:13:45 -0500 Subject: [PATCH 1008/1312] polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0e046658c2c..369111f1987 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -41,6 +41,7 @@ void FrequencyResponse::iterate(World &world) { r_vector_size = (compute_y) ? 2 * n : n; Tensor v_polar(m, m); + Tensor polar; vecfuncT rho_omega_old(m); // initialize DFT XC functional operator @@ -122,12 +123,6 @@ void FrequencyResponse::iterate(World &world) { auto max_bsh = bsh_residualsX.absmax(); auto max_relative_bsh = bsh_relative_residualsX.absmax(); max_rotation = 1.0 * max_bsh; - Tensor polar; - if (compute_y) { - polar = -2 * inner(Chi, PQ); - } else { - polar = -4 * response_space_inner(Chi.X, PQ.X); - } world.gop.fence(); // Todo add chi norm and chi_x if (world.rank() == 0) { @@ -157,13 +152,11 @@ void FrequencyResponse::iterate(World &world) { ((max_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { converged = true; } - if (converged || iter == r_params.maxiter()) { // if converged print converged if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { print("\nConverged!\n"); } - if (r_params.save()) { molresponse::start_timer(world); save(world, r_params.save_file()); @@ -204,15 +197,13 @@ void FrequencyResponse::iterate(World &world) { auto density_change = madness::sub(world, rho_omega, rho_omega_old, true); density_residuals = norm2s_T(world, density_change); if (world.rank() == 0) { print("computing residuals: density residuals"); } - Tensor polar; + + if (world.rank() == 0) { print("computing polarizability:"); } if (compute_y) { polar = -2 * inner(Chi, PQ); } else { polar = -4 * response_space_inner(Chi.X, PQ.X); } - - if (world.rank() == 0) { print("computing polarizability:"); } - if (r_params.print_level() >= 20) { if (world.rank() == 0) { printf("\n--------Response Properties after %d-------------\n", From 4d60bec3a6cbb3737136f60022fb9b3fd0d1b085 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 21:48:12 -0500 Subject: [PATCH 1009/1312] maybe this --- src/apps/molresponse/ResponseBase.cpp | 9 ++----- src/apps/molresponse/global_functions.cc | 31 ++++++++++++------------ 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 949f5ae44e6..fc2fbd68d1d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -482,7 +482,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto mul_tol = FunctionDefaults<3>::get_thresh(); // note that x can refer to x or y auto compute_j = [&, &phi0 = phi0](const auto &dx) { - // compute density with response function dx and orbitals phi0 auto rho_x_b = dot(world, dx, phi0); rho_x_b.truncate(); // apply the coulomb operator to rho_b @@ -493,21 +492,17 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // compute j_x = op(rho_x)*phi0 std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); - // compute j_y = op(rho_y)*phi0 - + if (world.rank() == 0) { print("compute jX"); } std::transform(chi_alpha.Y.begin(), chi_alpha.Y.end(), j_y.begin(), compute_j); J.X = j_x + j_y; - // TODO is copy better than adding? probably? - // J.Y=j_x+j_y; + if (world.rank() == 0) { print("add jx+jy"); } J.Y = J.X.copy(); if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } - // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { auto rho = transition_density(world, phi0, chi_alpha.X, chi_alpha.X); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index d87853ae145..115fe25485c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -312,49 +312,50 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons -> X_space { World &world = phi0[0].world(); molresponse::start_timer(world); - auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); - auto K = X_space::zero_functions(world, num_states, num_orbitals); auto phi_1 = copy(world, phi0, false); - /* - auto phi_2 = copy(world, phi0, false); - auto phi_3 = copy(world, phi0, false); - auto phi_4 = copy(world, phi0, false); - */ - // the question is copying pointers mpi safe Exchange op{}; const Exchange::Algorithm algo = op.small_memory; world.gop.fence(); const double lo = 1.e-10; if (compute_y) { - + auto x = to_response_matrix(chi); + auto x_conjugate = to_conjugate_response_matrix(chi); + auto phi_phi = to_response_vector(phi0); + auto KK = response_matrix(num_states); for (int b = 0; b < num_states; b++) { + Exchange op_1{}; + op_1.set_parameters(x[b], phi_phi, lo); + op_1.set_algorithm(algo); + Exchange op_2{}; + op_2.set_parameters(x_conjugate[b], phi_phi, lo); + op_2.set_algorithm(algo); + auto k1 = op_1(phi_phi); + auto k2 = op_2(phi_phi); + KK[b] = gaxpy_oop(1.0, k1, 1.0, k2, false); + /* Exchange op_1x{}; op_1x.set_parameters(chi.X[b], phi0, lo); op_1x.set_algorithm(algo); - Exchange op_1y{}; op_1y.set_parameters(chi.Y[b], phi0, lo); op_1y.set_algorithm(algo); - Exchange op_2x{}; op_2x.set_parameters(phi0, chi.Y[b], lo); op_2x.set_algorithm(algo); Exchange op_2y{}; op_2y.set_parameters(phi0, chi.X[b], lo); op_2y.set_algorithm(algo); - auto k1x = op_1x(phi_1); auto k2x = op_2x(phi_1); auto k1y = op_1y(phi_1); auto k2y = op_2y(phi_1); - - - world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); + */ + world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { From ad65d23c0f29fb6c73a01cc9d7783923591f739b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 21:56:39 -0500 Subject: [PATCH 1010/1312] adjust exchange --- src/apps/molresponse/global_functions.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 115fe25485c..2d4babcf817 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -357,6 +357,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons */ world.gop.fence(); } + K = to_X_space(KK); } else { for (int b = 0; b < num_states; b++) { Exchange op_1x{}; From 0f12ad1f0d118ea49addbc5a16346d1981c5c3f7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:02:53 -0500 Subject: [PATCH 1011/1312] debug exchange --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 2d4babcf817..28adaa8cd6c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -330,7 +330,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons op_1.set_parameters(x[b], phi_phi, lo); op_1.set_algorithm(algo); Exchange op_2{}; - op_2.set_parameters(x_conjugate[b], phi_phi, lo); + op_2.set_parameters(phi_phi,x_conjugate[b], lo); op_2.set_algorithm(algo); auto k1 = op_1(phi_phi); auto k2 = op_2(phi_phi); From 40c22de0f2afddd54050c001f1cfd22dacd69ad8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:14:35 -0500 Subject: [PATCH 1012/1312] bring exchange back --- src/apps/molresponse/global_functions.cc | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 28adaa8cd6c..05aa0da6640 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -321,21 +321,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); const double lo = 1.e-10; if (compute_y) { - auto x = to_response_matrix(chi); - auto x_conjugate = to_conjugate_response_matrix(chi); - auto phi_phi = to_response_vector(phi0); - auto KK = response_matrix(num_states); for (int b = 0; b < num_states; b++) { - Exchange op_1{}; - op_1.set_parameters(x[b], phi_phi, lo); - op_1.set_algorithm(algo); - Exchange op_2{}; - op_2.set_parameters(phi_phi,x_conjugate[b], lo); - op_2.set_algorithm(algo); - auto k1 = op_1(phi_phi); - auto k2 = op_2(phi_phi); - KK[b] = gaxpy_oop(1.0, k1, 1.0, k2, false); - /* Exchange op_1x{}; op_1x.set_parameters(chi.X[b], phi0, lo); op_1x.set_algorithm(algo); @@ -354,10 +340,8 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto k2y = op_2y(phi_1); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); - */ world.gop.fence(); } - K = to_X_space(KK); } else { for (int b = 0; b < num_states; b++) { Exchange op_1x{}; From 8c19f89d0769eda3b4d2f68fc41c3555a669ec66 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:24:10 -0500 Subject: [PATCH 1013/1312] small changes --- src/apps/molresponse/FrequencyResponse.cpp | 1 - src/apps/molresponse/ResponseBase.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 369111f1987..e6d0dc55724 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -247,7 +247,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - size_t m = chi.num_states(); bool compute_y = omega_n != 0.0; auto x = chi.copy();// copy chi X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index fc2fbd68d1d..81f96b36c29 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -478,7 +478,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // Create Coulomb potential on ground_orbitals functionT rho_x_b; functionT rho_y_b; - auto mul_tol = FunctionDefaults<3>::get_thresh(); // note that x can refer to x or y auto compute_j = [&, &phi0 = phi0](const auto &dx) { From 661a4fa9a1b3c66295b57e0ef54ae97a7c3841c7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:37:19 -0500 Subject: [PATCH 1014/1312] gamma clean up --- src/apps/molresponse/ResponseBase.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index a023c34bdc1..d37f0ea34f6 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -533,11 +533,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); - gamma = 2 * J; - if (world.rank() == 0) { print("gamma: 2 * J"); } - gamma += -c_xc * K; - if (world.rank() == 0) { print("gamma: += -c_xc * K"); } - + gamma = 2 * J - c_xc * K + (1.0 - c_xc) * W; if (xcf.hf_exchange_coefficient() != 1.0) { gamma += W; if (world.rank() == 0) { print("gamma: += W"); } @@ -556,7 +552,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } - if (r_params.print_level() >= 20) { molresponse::start_timer(world); print_inner(world, "xJx", chi_alpha, J); @@ -578,7 +573,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - //gamma.truncate(); + gamma.truncate(); return gamma; // Get sizes } From 12047621ed2980969ef4aee065630482381dcd9c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 4 Feb 2023 14:02:00 -0500 Subject: [PATCH 1015/1312] Remove comments --- src/apps/molresponse/FrequencyResponse.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e6d0dc55724..80e537774e0 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -100,8 +100,6 @@ void FrequencyResponse::iterate(World &world) { //PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); - //Chi = mask * Chi; - // Basic output if (r_params.print_level() >= 1) { molresponse::start_timer(world); if (world.rank() == 0) From 11367af4476071d25ed32e63c115afc8d8c52c8d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 4 Feb 2023 14:49:31 -0500 Subject: [PATCH 1016/1312] add output scf_info schema back in --- src/madness/chem/SCF.cc | 32 ++++++++++++++++++++++++++++++++ src/madness/chem/SCF.h | 3 +++ 2 files changed, 35 insertions(+) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index c4fa21e90e7..d3785889781 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -141,6 +141,38 @@ tensorT Q2(const tensorT& s) { } }// namespace madness +void +SCF::output_scf_info_schema(const int &iter, const std::map &vals, const tensorT &dipole_T) const { + nlohmann::json j = {}; + j.push_back(nlohmann::json()); + // if it exists figure out the size. pushback for each protocol + j[0]["scf_iterations"] = iter; + const double thresh = FunctionDefaults<3>::get_thresh(); + const int k = FunctionDefaults<3>::get_k(); + j[0]["scf_threshold"] = thresh; + j[0]["scf_k"] = k; + for (auto const &[key, val]: vals) { + j[0][key] = val; + } + j[0]["scf_dipole_moment"] = tensor_to_json(dipole_T); + int num = 0; + std::string save = param.prefix() + ".scf_info.json"; +#ifdef MADCHEM_HAS_STD_FILESYSTEM + if (std::filesystem::exists(save)) { + std::ifstream ifs(save); +#else + std::ifstream ifs(save); + if (ifs) { +#endif + nlohmann::json j_old; + ifs >> j_old; + print(j_old); + j_old.push_back(j); + j = j_old; + }; + std::ofstream ofs(save); + ofs << std::setw(4) << j; +} void SCF::output_calc_info_schema() const { nlohmann::json j = {}; diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 1fc07f361eb..34fc1c29a8f 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -504,6 +504,9 @@ class SCF { void solve(World& world); void output_calc_info_schema() const; + + void output_scf_info_schema(const int& iter, const std::map& vals, const tensorT& dipole_T) const; + }; // Computes molecular energy as a function of the geometry From de77a268c57f7d9e7b06096838f8f682e324b147 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 4 Feb 2023 15:56:28 -0500 Subject: [PATCH 1017/1312] use the new update function for scf output --- src/madness/chem/SCF.cc | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index d3785889781..7f75d73e96a 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -156,22 +156,7 @@ SCF::output_scf_info_schema(const int &iter, const std::map } j[0]["scf_dipole_moment"] = tensor_to_json(dipole_T); int num = 0; - std::string save = param.prefix() + ".scf_info.json"; -#ifdef MADCHEM_HAS_STD_FILESYSTEM - if (std::filesystem::exists(save)) { - std::ifstream ifs(save); -#else - std::ifstream ifs(save); - if (ifs) { -#endif - nlohmann::json j_old; - ifs >> j_old; - print(j_old); - j_old.push_back(j); - j = j_old; - }; - std::ofstream ofs(save); - ofs << std::setw(4) << j; + update_schema(param.prefix()+".scf_info.json", j); } void SCF::output_calc_info_schema() const { From cf5aba8f3e20c4f99d7aeb353fd3bd2e1f14d3d5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:30:03 -0500 Subject: [PATCH 1018/1312] change J back to old version --- src/apps/molresponse/ResponseBase.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 81f96b36c29..a023c34bdc1 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -480,6 +480,14 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit functionT rho_y_b; auto mul_tol = FunctionDefaults<3>::get_thresh(); // note that x can refer to x or y + /* + auto rho_b = make_density(world, chi_alpha); + int b = 0; + for (const auto &rho_b_i: rho_b) { + auto temp_J = apply(*shared_coulomb_operator, rho_b_i); + J.X[b++] = mul(world, temp_J, phi0); + } + */ auto compute_j = [&, &phi0 = phi0](const auto &dx) { auto rho_x_b = dot(world, dx, phi0); rho_x_b.truncate(); From 85118d81c7bea8b2b5022eb5e079bcdc6427a579 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:10:03 -0500 Subject: [PATCH 1019/1312] debug scf json and make sure is compatible with non std::filesystem --- src/apps/molresponse/testing/runners.hpp | 5 +++-- src/madness/chem/SCF.cc | 16 +++++++--------- src/madness/chem/SCF.h | 3 ++- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 65e4099bf96..9edd5febc49 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -445,8 +445,9 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo auto dipole_t = calc.dipole(world, rho); std::map results; results["scf_energy"] = calc.current_energy; + world.gop.fence(); if (world.rank() == 0) { - calc.output_scf_info_schema(0, results, dipole_t); + calc.output_scf_info_schema(results, dipole_t); ME.output_calc_info_schema(); } } else { @@ -522,7 +523,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals", false); + r_params.set_user_defined_value("plot_all_orbitals", true); r_params.set_user_defined_value("plot", true); r_params.set_user_defined_value("print_level", 20); r_params.set_user_defined_value("save", true); diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 7f75d73e96a..2b5be0bcd0b 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -141,22 +141,20 @@ tensorT Q2(const tensorT& s) { } }// namespace madness -void -SCF::output_scf_info_schema(const int &iter, const std::map &vals, const tensorT &dipole_T) const { +void SCF::output_scf_info_schema(const std::map &vals, + const tensorT &dipole_T) const { nlohmann::json j = {}; - j.push_back(nlohmann::json()); // if it exists figure out the size. pushback for each protocol - j[0]["scf_iterations"] = iter; const double thresh = FunctionDefaults<3>::get_thresh(); const int k = FunctionDefaults<3>::get_k(); - j[0]["scf_threshold"] = thresh; - j[0]["scf_k"] = k; + j["scf_threshold"] = thresh; + j["scf_k"] = k; for (auto const &[key, val]: vals) { - j[0][key] = val; + j[key] = val; } - j[0]["scf_dipole_moment"] = tensor_to_json(dipole_T); + j["scf_dipole_moment"] = tensor_to_json(dipole_T); int num = 0; - update_schema(param.prefix()+".scf_info.json", j); + update_schema(param.prefix()+".scf_info", j); } void SCF::output_calc_info_schema() const { diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 34fc1c29a8f..dea9589ffe2 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -505,7 +505,8 @@ class SCF { void output_calc_info_schema() const; - void output_scf_info_schema(const int& iter, const std::map& vals, const tensorT& dipole_T) const; + void output_scf_info_schema(const std::map &vals, + const tensorT &dipole_T) const; }; From 01e0cec02441dc722fc2273fc2aacba5f71f06f8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Feb 2023 17:10:19 -0500 Subject: [PATCH 1020/1312] remove the extra catch for json --- src/apps/molresponse/testing/mad-freq.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 0791d0d75b5..7cad7ee5670 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -63,13 +63,13 @@ auto main(int argc, char *argv[]) -> int { world.gop.fence(); } } catch (const SafeMPI::Exception &e) { - print(e); + print(e.what()); error("caught an MPI exception"); } catch (const madness::MadnessException &e) { print(e); error("caught a MADNESS exception"); } catch (const madness::TensorException &e) { - print(e); + print(e.what()); error("caught a Tensor exception"); } catch (const char *s) { print(s); } catch (const std::string &s) { print(s); @@ -81,8 +81,8 @@ auto main(int argc, char *argv[]) -> int { std::cerr << ex.what() << "\n"; } catch (const std::string &s) { print(s); } catch (const std::exception &e) { } catch (const std::exception &e) { - error("caught an STL exception"); print(e.what()); + error("caught an STL exception"); } catch (...) { error("caught unhandled exception"); } // Nearly all memory will be freed at this point print_stats(world); From e7a4e013e0813b36b5ff7e943bde1905b120710e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 15:53:09 -0500 Subject: [PATCH 1021/1312] adjusting the catch statements --- src/apps/molresponse/testing/mad-freq.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 7cad7ee5670..feebf2c7e2b 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -71,15 +71,11 @@ auto main(int argc, char *argv[]) -> int { } catch (const madness::TensorException &e) { print(e.what()); error("caught a Tensor exception"); - } catch (const char *s) { print(s); } catch (const std::string &s) { - print(s); - } catch (const nlohmann::detail::exception &e) { - print(e.what()); - error("Caught JSON exception"); - } - catch (const std::filesystem::filesystem_error &ex) { - std::cerr << ex.what() << "\n"; - } catch (const std::string &s) { print(s); } catch (const std::exception &e) { + } catch (const nlohmann::detail::exception &e) { + print(e.what()); + error("Caught JSON exception"); + } catch (const std::filesystem::filesystem_error &ex) { + std::cerr << ex.what() << "\n"; } catch (const std::exception &e) { print(e.what()); error("caught an STL exception"); From fd020f62cc7a72a43c91e0243773764f16d71b71 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 17:36:53 -0500 Subject: [PATCH 1022/1312] rewrite exchange --- src/apps/molresponse/global_functions.cc | 51 ++++++++++++++---------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 05aa0da6640..f6c97cc511e 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -317,29 +317,40 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto K = X_space::zero_functions(world, num_states, num_orbitals); auto phi_1 = copy(world, phi0, false); Exchange op{}; - const Exchange::Algorithm algo = op.small_memory; + const Exchange::Algorithm algo = op.multiworld_efficient; world.gop.fence(); const double lo = 1.e-10; + vector_real_function_3d k1x,k1y,k2x,k2y; + if (compute_y) { for (int b = 0; b < num_states; b++) { - Exchange op_1x{}; - op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(algo); - Exchange op_1y{}; - op_1y.set_parameters(chi.Y[b], phi0, lo); - op_1y.set_algorithm(algo); - Exchange op_2x{}; - op_2x.set_parameters(phi0, chi.Y[b], lo); - op_2x.set_algorithm(algo); - Exchange op_2y{}; - op_2y.set_parameters(phi0, chi.X[b], lo); - op_2y.set_algorithm(algo); - auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_1); - auto k1y = op_1y(phi_1); - auto k2y = op_2y(phi_1); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); - K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); + + + Exchange kxx{}; + kxx.set_parameters(chi.X[b], phi0, lo); + kxx.set_algorithm(algo); + + Exchange kxy{}; + kxy.set_parameters(phi0, chi.Y[b], lo); + kxy.set_algorithm(algo); + + Exchange kyx{}; + kyx.set_parameters(phi0, chi.X[b], lo); + kyx.set_algorithm(algo); + + Exchange kyy{}; + kyy.set_parameters(chi.Y[b], phi0, lo); + kyy.set_algorithm(algo); + + k1x=kxx(phi0); + k1y=kxy(phi0); + + k2x=kyx(phi0); + k2y=kyy(phi0); + + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); + K.Y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); + world.gop.fence(); } } else { @@ -353,7 +364,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons op_2x.set_algorithm(algo); auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_1); + auto k1y = op_2x(phi_1); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } From 47525dbbf910b033c90e8f7d9ace2f67f7fbf090 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 17:37:03 -0500 Subject: [PATCH 1023/1312] remove unused code --- src/apps/molresponse/FrequencyResponse.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 80e537774e0..86b851558e4 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -56,15 +56,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } - // New approach solving single function at a time - auto p = compute_y ? 2 : 1; - response_function_solver rf_solver; - for (size_t b = 0; b < m * n * p; b++) { - rf_solver.emplace_back(response_function_allocator(world), false); - } - if (r_params.kain()) { - for (auto &solver_ij: rf_solver) { solver_ij.set_maxsub(r_params.maxsub()); } - } // We compute with positive frequencies if (world.rank() == 0) { print("Warning input frequency is assumed to be positive"); From 92b9d43d64021bc226dc817403d10d5960f9d628 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 17:37:27 -0500 Subject: [PATCH 1024/1312] revert to old form of J operator --- src/apps/molresponse/ResponseBase.cpp | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d37f0ea34f6..99c4ed7cd7b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -479,34 +479,17 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit functionT rho_x_b; functionT rho_y_b; auto mul_tol = FunctionDefaults<3>::get_thresh(); - // note that x can refer to x or y - /* auto rho_b = make_density(world, chi_alpha); int b = 0; for (const auto &rho_b_i: rho_b) { auto temp_J = apply(*shared_coulomb_operator, rho_b_i); J.X[b++] = mul(world, temp_J, phi0); } - */ - auto compute_j = [&, &phi0 = phi0](const auto &dx) { - auto rho_x_b = dot(world, dx, phi0); - rho_x_b.truncate(); - // apply the coulomb operator to rho_b - rho_x_b = apply(*shared_coulomb_operator, rho_x_b); - return mul_sparse(world, rho_x_b, phi0, mul_tol, true); - }; - - // compute j_x = op(rho_x)*phi0 - - std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); - if (world.rank() == 0) { print("compute jX"); } - std::transform(chi_alpha.Y.begin(), chi_alpha.Y.end(), j_y.begin(), compute_j); - - J.X = j_x + j_y; - if (world.rank() == 0) { print("add jx+jy"); } + world.gop.fence(); J.Y = J.X.copy(); if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } @@ -525,7 +508,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + auto K = response_exchange_multiworld(phi0, chi_alpha, true); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } From dde49d9932bdd950cac5706ef987495eab34e166 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 17:42:42 -0500 Subject: [PATCH 1025/1312] Do not truncate the residual --- src/apps/molresponse/ResponseBase.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 99c4ed7cd7b..9a26e99b02e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1131,11 +1131,9 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp X_space res(world, m, n); if (compute_y) { res = g_chi - chi; - res.truncate(); residual_norms = res.norm2s(); } else { res.X = g_chi.X - chi.X; - res.X.truncate_rf(); residual_norms = res.X.norm2(); } if (r_params.print_level() >= 1) { From 1ccbbe85e437516b9657b8c07df566fbe0ecfd31 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 17:43:45 -0500 Subject: [PATCH 1026/1312] remove truncate before bsh apply --- src/apps/molresponse/FrequencyResponse.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 86b851558e4..7f058a1fa34 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -324,7 +324,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, molresponse::start_timer(world); if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } - size_t m = theta_X.X.size(); size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; @@ -337,9 +336,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; - theta_X.truncate(); - } else { - theta_X.X.truncate_rf(); } world.gop.fence(); // apply bsh From ed3251920ed432b83cd61a2f8f1cee07ca08e51c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 17:51:05 -0500 Subject: [PATCH 1027/1312] converge tighter is relative residual --- src/apps/molresponse/FrequencyResponse.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 7f058a1fa34..f3e9e17a2d7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,10 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow = 0.792; - const double b_pow = 1.078; + const double a_pow = 1.035; + const double b_pow = 2.121; +// Last attempt 1.035 2.121 + const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); From e014dd1b55496dca3b2c3430a6684bcb34063d54 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 18:51:32 -0500 Subject: [PATCH 1028/1312] remove some truncates --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f3e9e17a2d7..0e50ce78709 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -20,7 +20,7 @@ void FrequencyResponse::iterate(World &world) { size_t n = r_params.num_orbitals();// Number of ground state orbitals size_t m = r_params.num_states(); // Number of excited states - real_function_3d v_xc;// For TDDFT + real_function_3d v_xc; // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 9a26e99b02e..d012601cd65 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -995,7 +995,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto c_xc = xcf.hf_exchange_coefficient(); real_function_3d v0 = v_j0 + v_nuc + (1 - c_xc) * v_xc; - v0.truncate(); double safety = 0.1; double vtol = safety * FunctionDefaults<3>::get_thresh(); if (compute_Y) { @@ -1015,7 +1014,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } - V0.truncate();// we are removing noise here return V0; } From 9b89cbd99bbc95827eebbb114fca6f8ff74855c9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 18:57:50 -0500 Subject: [PATCH 1029/1312] remove truncate --- src/apps/molresponse/ResponseBase.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d012601cd65..cfa81650b87 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -355,7 +355,6 @@ auto ResponseBase::make_bsh_operators_response(World &world, double &shift, size_t num_orbitals = ground_energies.size();// number of orbitals std::vector ops(num_orbitals); // Run over occupied components - int p = 0; std::for_each(ops.begin(), ops.end(), [&](auto &operator_p) { double mu = sqrt(-2.0 * (ground_energies(p++) + omega + shift)); @@ -558,7 +557,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - gamma.truncate(); return gamma; // Get sizes } From 4339d690e9455d19781cc4b9cf215d3c1781f784 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 19:08:13 -0500 Subject: [PATCH 1030/1312] Loosen the convergence criteria --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0e50ce78709..8a72ed0da5f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow = 1.035; - const double b_pow = 2.121; + const double a_pow {0.792}; + const double b_pow {1.078}; // Last attempt 1.035 2.121 const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b From 1440f224acfcea276a3fc43f7a7ff6d834601e0e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 17:37:03 -0500 Subject: [PATCH 1031/1312] remove unused code revert to old form of J operator Do not truncate the residual remove truncate before bsh apply converge tighter is relative residual remove some truncates remove truncate Checking exchange and convergence --- src/apps/molresponse/FrequencyResponse.cpp | 21 ++++------------ src/apps/molresponse/ResponseBase.cpp | 29 +++------------------- 2 files changed, 9 insertions(+), 41 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 80e537774e0..8a72ed0da5f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -20,14 +20,16 @@ void FrequencyResponse::iterate(World &world) { size_t n = r_params.num_orbitals();// Number of ground state orbitals size_t m = r_params.num_states(); // Number of excited states - real_function_3d v_xc;// For TDDFT + real_function_3d v_xc; // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow = 0.792; - const double b_pow = 1.078; + const double a_pow {0.792}; + const double b_pow {1.078}; +// Last attempt 1.035 2.121 + const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); @@ -56,15 +58,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } - // New approach solving single function at a time - auto p = compute_y ? 2 : 1; - response_function_solver rf_solver; - for (size_t b = 0; b < m * n * p; b++) { - rf_solver.emplace_back(response_function_allocator(world), false); - } - if (r_params.kain()) { - for (auto &solver_ij: rf_solver) { solver_ij.set_maxsub(r_params.maxsub()); } - } // We compute with positive frequencies if (world.rank() == 0) { print("Warning input frequency is assumed to be positive"); @@ -333,7 +326,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, molresponse::start_timer(world); if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } - size_t m = theta_X.X.size(); size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; @@ -346,9 +338,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; - theta_X.truncate(); - } else { - theta_X.X.truncate_rf(); } world.gop.fence(); // apply bsh diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d37f0ea34f6..cfa81650b87 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -355,7 +355,6 @@ auto ResponseBase::make_bsh_operators_response(World &world, double &shift, size_t num_orbitals = ground_energies.size();// number of orbitals std::vector ops(num_orbitals); // Run over occupied components - int p = 0; std::for_each(ops.begin(), ops.end(), [&](auto &operator_p) { double mu = sqrt(-2.0 * (ground_energies(p++) + omega + shift)); @@ -479,34 +478,17 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit functionT rho_x_b; functionT rho_y_b; auto mul_tol = FunctionDefaults<3>::get_thresh(); - // note that x can refer to x or y - /* auto rho_b = make_density(world, chi_alpha); int b = 0; for (const auto &rho_b_i: rho_b) { auto temp_J = apply(*shared_coulomb_operator, rho_b_i); J.X[b++] = mul(world, temp_J, phi0); } - */ - auto compute_j = [&, &phi0 = phi0](const auto &dx) { - auto rho_x_b = dot(world, dx, phi0); - rho_x_b.truncate(); - // apply the coulomb operator to rho_b - rho_x_b = apply(*shared_coulomb_operator, rho_x_b); - return mul_sparse(world, rho_x_b, phi0, mul_tol, true); - }; - - // compute j_x = op(rho_x)*phi0 - - std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); - if (world.rank() == 0) { print("compute jX"); } - std::transform(chi_alpha.Y.begin(), chi_alpha.Y.end(), j_y.begin(), compute_j); - - J.X = j_x + j_y; - if (world.rank() == 0) { print("add jx+jy"); } + world.gop.fence(); J.Y = J.X.copy(); if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } @@ -525,7 +507,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + auto K = response_exchange_multiworld(phi0, chi_alpha, true); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -573,7 +557,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - gamma.truncate(); return gamma; // Get sizes } @@ -1010,7 +993,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto c_xc = xcf.hf_exchange_coefficient(); real_function_3d v0 = v_j0 + v_nuc + (1 - c_xc) * v_xc; - v0.truncate(); double safety = 0.1; double vtol = safety * FunctionDefaults<3>::get_thresh(); if (compute_Y) { @@ -1030,7 +1012,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } - V0.truncate();// we are removing noise here return V0; } @@ -1146,11 +1127,9 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp X_space res(world, m, n); if (compute_y) { res = g_chi - chi; - res.truncate(); residual_norms = res.norm2s(); } else { res.X = g_chi.X - chi.X; - res.X.truncate_rf(); residual_norms = res.X.norm2(); } if (r_params.print_level() >= 1) { From 5eb99320eae3a309f3e17da0d100d531b9321aec Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 24 Jan 2023 22:37:19 -0500 Subject: [PATCH 1032/1312] parent cf5aba8f3e20c4f99d7aeb353fd3bd2e1f14d3d5 author Adrian Hurtado 1674617839 -0500 committer Adrian Hurtado 1675905722 -0500 SQUASH Current Changes Remove comments add output scf_info schema back in use the new update function for scf output debug scf json and make sure is compatible with non std::filesystem remove the extra catch for json adjusting the catch statements rewrite exchange remove unused code revert to old form of J operator Do not truncate the residual remove truncate before bsh apply converge tighter is relative residual remove some truncates remove truncate Checking exchange and convergence remove unused code revert to old form of J operator Do not truncate the residual remove truncate before bsh apply remove some truncates remove truncate Loosen the convergence criteria --- src/apps/molresponse/FrequencyResponse.cpp | 23 +++------- src/apps/molresponse/ResponseBase.cpp | 36 +++------------ src/apps/molresponse/global_functions.cc | 51 +++++++++++++--------- src/apps/molresponse/testing/mad-freq.cpp | 20 ++++----- src/apps/molresponse/testing/runners.hpp | 5 ++- src/madness/chem/SCF.cc | 15 +++++++ src/madness/chem/SCF.h | 4 ++ 7 files changed, 71 insertions(+), 83 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e6d0dc55724..8a72ed0da5f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -20,14 +20,16 @@ void FrequencyResponse::iterate(World &world) { size_t n = r_params.num_orbitals();// Number of ground state orbitals size_t m = r_params.num_states(); // Number of excited states - real_function_3d v_xc;// For TDDFT + real_function_3d v_xc; // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow = 0.792; - const double b_pow = 1.078; + const double a_pow {0.792}; + const double b_pow {1.078}; +// Last attempt 1.035 2.121 + const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y Tensor bsh_residualsX((int(m))); @@ -56,15 +58,6 @@ void FrequencyResponse::iterate(World &world) { if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } } - // New approach solving single function at a time - auto p = compute_y ? 2 : 1; - response_function_solver rf_solver; - for (size_t b = 0; b < m * n * p; b++) { - rf_solver.emplace_back(response_function_allocator(world), false); - } - if (r_params.kain()) { - for (auto &solver_ij: rf_solver) { solver_ij.set_maxsub(r_params.maxsub()); } - } // We compute with positive frequencies if (world.rank() == 0) { print("Warning input frequency is assumed to be positive"); @@ -100,8 +93,6 @@ void FrequencyResponse::iterate(World &world) { //PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); - //Chi = mask * Chi; - // Basic output if (r_params.print_level() >= 1) { molresponse::start_timer(world); if (world.rank() == 0) @@ -335,7 +326,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, molresponse::start_timer(world); if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } - size_t m = theta_X.X.size(); size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; @@ -348,9 +338,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; - theta_X.truncate(); - } else { - theta_X.X.truncate_rf(); } world.gop.fence(); // apply bsh diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index a023c34bdc1..cfa81650b87 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -355,7 +355,6 @@ auto ResponseBase::make_bsh_operators_response(World &world, double &shift, size_t num_orbitals = ground_energies.size();// number of orbitals std::vector ops(num_orbitals); // Run over occupied components - int p = 0; std::for_each(ops.begin(), ops.end(), [&](auto &operator_p) { double mu = sqrt(-2.0 * (ground_energies(p++) + omega + shift)); @@ -479,34 +478,17 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit functionT rho_x_b; functionT rho_y_b; auto mul_tol = FunctionDefaults<3>::get_thresh(); - // note that x can refer to x or y - /* auto rho_b = make_density(world, chi_alpha); int b = 0; for (const auto &rho_b_i: rho_b) { auto temp_J = apply(*shared_coulomb_operator, rho_b_i); J.X[b++] = mul(world, temp_J, phi0); } - */ - auto compute_j = [&, &phi0 = phi0](const auto &dx) { - auto rho_x_b = dot(world, dx, phi0); - rho_x_b.truncate(); - // apply the coulomb operator to rho_b - rho_x_b = apply(*shared_coulomb_operator, rho_x_b); - return mul_sparse(world, rho_x_b, phi0, mul_tol, true); - }; - - // compute j_x = op(rho_x)*phi0 - - std::transform(chi_alpha.X.begin(), chi_alpha.X.end(), j_x.begin(), compute_j); - if (world.rank() == 0) { print("compute jX"); } - std::transform(chi_alpha.Y.begin(), chi_alpha.Y.end(), j_y.begin(), compute_j); - - J.X = j_x + j_y; - if (world.rank() == 0) { print("add jx+jy"); } + world.gop.fence(); J.Y = J.X.copy(); if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } @@ -525,7 +507,9 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + auto K = response_exchange_multiworld(phi0, chi_alpha, true); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -533,11 +517,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); - gamma = 2 * J; - if (world.rank() == 0) { print("gamma: 2 * J"); } - gamma += -c_xc * K; - if (world.rank() == 0) { print("gamma: += -c_xc * K"); } - + gamma = 2 * J - c_xc * K + (1.0 - c_xc) * W; if (xcf.hf_exchange_coefficient() != 1.0) { gamma += W; if (world.rank() == 0) { print("gamma: += W"); } @@ -556,7 +536,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } - if (r_params.print_level() >= 20) { molresponse::start_timer(world); print_inner(world, "xJx", chi_alpha, J); @@ -578,7 +557,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - //gamma.truncate(); return gamma; // Get sizes } @@ -1015,7 +993,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto c_xc = xcf.hf_exchange_coefficient(); real_function_3d v0 = v_j0 + v_nuc + (1 - c_xc) * v_xc; - v0.truncate(); double safety = 0.1; double vtol = safety * FunctionDefaults<3>::get_thresh(); if (compute_Y) { @@ -1035,7 +1012,6 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 1) { molresponse::end_timer(world, "V0_add", "V0_add", iter_timing); } - V0.truncate();// we are removing noise here return V0; } @@ -1151,11 +1127,9 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp X_space res(world, m, n); if (compute_y) { res = g_chi - chi; - res.truncate(); residual_norms = res.norm2s(); } else { res.X = g_chi.X - chi.X; - res.X.truncate_rf(); residual_norms = res.X.norm2(); } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 05aa0da6640..f6c97cc511e 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -317,29 +317,40 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto K = X_space::zero_functions(world, num_states, num_orbitals); auto phi_1 = copy(world, phi0, false); Exchange op{}; - const Exchange::Algorithm algo = op.small_memory; + const Exchange::Algorithm algo = op.multiworld_efficient; world.gop.fence(); const double lo = 1.e-10; + vector_real_function_3d k1x,k1y,k2x,k2y; + if (compute_y) { for (int b = 0; b < num_states; b++) { - Exchange op_1x{}; - op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(algo); - Exchange op_1y{}; - op_1y.set_parameters(chi.Y[b], phi0, lo); - op_1y.set_algorithm(algo); - Exchange op_2x{}; - op_2x.set_parameters(phi0, chi.Y[b], lo); - op_2x.set_algorithm(algo); - Exchange op_2y{}; - op_2y.set_parameters(phi0, chi.X[b], lo); - op_2y.set_algorithm(algo); - auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_1); - auto k1y = op_1y(phi_1); - auto k2y = op_2y(phi_1); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); - K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); + + + Exchange kxx{}; + kxx.set_parameters(chi.X[b], phi0, lo); + kxx.set_algorithm(algo); + + Exchange kxy{}; + kxy.set_parameters(phi0, chi.Y[b], lo); + kxy.set_algorithm(algo); + + Exchange kyx{}; + kyx.set_parameters(phi0, chi.X[b], lo); + kyx.set_algorithm(algo); + + Exchange kyy{}; + kyy.set_parameters(chi.Y[b], phi0, lo); + kyy.set_algorithm(algo); + + k1x=kxx(phi0); + k1y=kxy(phi0); + + k2x=kyx(phi0); + k2y=kyy(phi0); + + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); + K.Y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); + world.gop.fence(); } } else { @@ -353,7 +364,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons op_2x.set_algorithm(algo); auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_1); + auto k1y = op_2x(phi_1); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } diff --git a/src/apps/molresponse/testing/mad-freq.cpp b/src/apps/molresponse/testing/mad-freq.cpp index 0791d0d75b5..feebf2c7e2b 100644 --- a/src/apps/molresponse/testing/mad-freq.cpp +++ b/src/apps/molresponse/testing/mad-freq.cpp @@ -63,26 +63,22 @@ auto main(int argc, char *argv[]) -> int { world.gop.fence(); } } catch (const SafeMPI::Exception &e) { - print(e); + print(e.what()); error("caught an MPI exception"); } catch (const madness::MadnessException &e) { print(e); error("caught a MADNESS exception"); } catch (const madness::TensorException &e) { - print(e); + print(e.what()); error("caught a Tensor exception"); - } catch (const char *s) { print(s); } catch (const std::string &s) { - print(s); - } catch (const nlohmann::detail::exception &e) { - print(e.what()); - error("Caught JSON exception"); - } - catch (const std::filesystem::filesystem_error &ex) { - std::cerr << ex.what() << "\n"; - } catch (const std::string &s) { print(s); } catch (const std::exception &e) { + } catch (const nlohmann::detail::exception &e) { + print(e.what()); + error("Caught JSON exception"); + } catch (const std::filesystem::filesystem_error &ex) { + std::cerr << ex.what() << "\n"; } catch (const std::exception &e) { - error("caught an STL exception"); print(e.what()); + error("caught an STL exception"); } catch (...) { error("caught unhandled exception"); } // Nearly all memory will be freed at this point print_stats(world); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 65e4099bf96..9edd5febc49 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -445,8 +445,9 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo auto dipole_t = calc.dipole(world, rho); std::map results; results["scf_energy"] = calc.current_energy; + world.gop.fence(); if (world.rank() == 0) { - calc.output_scf_info_schema(0, results, dipole_t); + calc.output_scf_info_schema(results, dipole_t); ME.output_calc_info_schema(); } } else { @@ -522,7 +523,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals", false); + r_params.set_user_defined_value("plot_all_orbitals", true); r_params.set_user_defined_value("plot", true); r_params.set_user_defined_value("print_level", 20); r_params.set_user_defined_value("save", true); diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index c4fa21e90e7..2b5be0bcd0b 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -141,6 +141,21 @@ tensorT Q2(const tensorT& s) { } }// namespace madness +void SCF::output_scf_info_schema(const std::map &vals, + const tensorT &dipole_T) const { + nlohmann::json j = {}; + // if it exists figure out the size. pushback for each protocol + const double thresh = FunctionDefaults<3>::get_thresh(); + const int k = FunctionDefaults<3>::get_k(); + j["scf_threshold"] = thresh; + j["scf_k"] = k; + for (auto const &[key, val]: vals) { + j[key] = val; + } + j["scf_dipole_moment"] = tensor_to_json(dipole_T); + int num = 0; + update_schema(param.prefix()+".scf_info", j); +} void SCF::output_calc_info_schema() const { nlohmann::json j = {}; diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 1fc07f361eb..dea9589ffe2 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -504,6 +504,10 @@ class SCF { void solve(World& world); void output_calc_info_schema() const; + + void output_scf_info_schema(const std::map &vals, + const tensorT &dipole_T) const; + }; // Computes molecular energy as a function of the geometry From 1fbc523548d1e802b123403ac6d8d64cb02f2b1a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 20:36:26 -0500 Subject: [PATCH 1033/1312] formatting --- src/apps/molresponse/x_space.cc | 83 ++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 7a6809ac318..4b376ecb487 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -1,57 +1,65 @@ // Copyright 2021 Adrian Hurtado - #include "x_space.h" #include "response_functions.h" -namespace madness { - auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d { +namespace madness +{ + auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d + { auto &world = vec[0].world(); // copy the vector - auto response_vector = vector_real_function_3d(2*vec.size()); + auto response_vector = vector_real_function_3d(2 * vec.size()); auto n = vec.size(); int i = 0; - for (auto &r0i: response_vector) { r0i = vec[i++ % n]; } + for (auto &r0i : response_vector) + { + r0i = vec[i++ % n]; + } auto copy_vec = copy(world, response_vector); world.gop.fence(); return copy_vec; } auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) - -> response_matrix { + -> response_matrix + { auto matrix = response_matrix(num_states); std::for_each(matrix.begin(), matrix.end(), - [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); + [&](auto &xi) + { xi = vector_real_function_3d(num_orbitals); }); return matrix; } // to response matrix is intended to provide a shallow copy of the response matrix // to simply reorder the functions - auto to_response_matrix(const X_space &x) -> response_matrix { + auto to_response_matrix(const X_space &x) -> response_matrix + { auto mX = response_matrix(x.num_states()); auto num_orbitals = x.num_orbitals(); int b = 0; - std::for_each(mX.begin(), mX.end(), [&](vector_real_function_3d &mi) { + std::for_each(mX.begin(), mX.end(), [&](vector_real_function_3d &mi) + { mi = vector_real_function_3d(2 * num_orbitals); std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); // shallow copy std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals);// shallow copy - b++; - }); + b++; }); return mX; } - auto to_conjugate_response_matrix(const X_space &x) -> response_matrix { + auto to_conjugate_response_matrix(const X_space &x) -> response_matrix + { World &world = x.X[0][0].world(); auto mX = response_matrix(x.num_states()); int b = 0; auto num_orbitals = x.num_orbitals(); - std::for_each(mX.begin(), mX.end(), [&](auto &mi) { + std::for_each(mX.begin(), mX.end(), [&](auto &mi) + { mi = vector_real_function_3d(2 * num_orbitals); std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin()); // shallow copy std::copy(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals);// shallow copy - b++; - }); + b++; }); return mX; } @@ -60,28 +68,32 @@ namespace madness { * @param x * @return */ - auto to_flattened_vector(const X_space &x) -> vector_real_function_3d { + auto to_flattened_vector(const X_space &x) -> vector_real_function_3d + { World &world = x.X[0][0].world(); auto num_orbitals = 2 * x.num_orbitals(); auto vij = vector_real_function_3d(x.num_states() * num_orbitals); auto mx = to_response_matrix(x); int b = 0; - for (const auto &mi: mx) { + for (const auto &mi : mx) + { std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); b++; } return vij; } - auto to_X_space(const response_matrix &x) -> X_space { + auto to_X_space(const response_matrix &x) -> X_space + { World &world = x[0][0].world(); auto num_states = x.size(); auto num_orbitals = size_t(x[0].size() / 2); auto x_space = X_space(world, num_states, num_orbitals); int b = 0; - for (const auto &x_vec: x) { + for (const auto &x_vec : x) + { std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin()); std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin()); b++; @@ -89,8 +101,8 @@ namespace madness { return x_space; } - - auto to_conjugate_X_space(const response_matrix &x) -> X_space { + auto to_conjugate_X_space(const response_matrix &x) -> X_space + { World &world = x[0][0].world(); @@ -99,36 +111,41 @@ namespace madness { auto x_space = X_space(world, num_states, num_orbitals); int b = 0; - std::for_each(x.begin(), x.end(), [&](auto x_vec) { + std::for_each(x.begin(), x.end(), [&](auto x_vec) + { std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.Y[b].begin(), [&](const auto &xi) { return copy(xi, false); }); std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.X[b].begin(), [&](const auto &xi) { return copy(xi, false); }); - b++; - }); + b++; }); world.gop.fence(); // auto norms = x_space.norm2s(); // if (world.rank() == 0) { print("norms after copy ", norms); } - return x_space; } - auto transposeResponseMatrix(const response_matrix &x) -> response_matrix { + auto transposeResponseMatrix(const response_matrix &x) -> response_matrix + { auto XT = response_matrix(x[0].size()); auto b = 0; - for (auto &xi: XT) { + for (auto &xi : XT) + { auto j = 0; xi = vector_real_function_3d(x.size()); - for (auto &xji: xi) { xji = x[j++][b]; } + for (auto &xji : xi) + { + xji = x[j++][b]; + } b++; } return XT; } - auto inner(const X_space &A, const X_space &B) -> Tensor { + auto inner(const X_space &A, const X_space &B) -> Tensor + { MADNESS_ASSERT(size_states(A) > 0); MADNESS_ASSERT(size_orbitals(A) > 0); MADNESS_ASSERT(same_size(A, B)); @@ -149,10 +166,10 @@ namespace madness { // Container for result Tensor result(a.size(), a.size()); int p = 0; - std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) { + std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) + { result += matrix_inner(world, ati, b_transpose[p++]); - world.gop.fence(); - }); + world.gop.fence(); }); return result; } -}// namespace madness +} // namespace madness From 10ff3c79dd14417872c8d5ea7a34ea3ea50be42c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 20:42:23 -0500 Subject: [PATCH 1034/1312] Some comments --- src/apps/molresponse/x_space.cc | 34 +++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 4b376ecb487..73ef1c4487b 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -6,6 +6,12 @@ namespace madness { + /** + * @phi -> [phi conjugate(phi)] + * + * @param vec + * @return vector_real_function_3d + */ auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d { auto &world = vec[0].world(); @@ -22,6 +28,14 @@ namespace madness world.gop.fence(); return copy_vec; } + + /** + * @brief Create a response matrix object + * + * @param num_states + * @param num_orbitals + * @return response_matrix + */ auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) -> response_matrix { @@ -32,8 +46,13 @@ namespace madness { xi = vector_real_function_3d(num_orbitals); }); return matrix; } - // to response matrix is intended to provide a shallow copy of the response matrix - // to simply reorder the functions + +/** + * @ Converts Xspace object to response_matrix object + * + * @param x + * @return response_matrix + */ auto to_response_matrix(const X_space &x) -> response_matrix { auto mX = response_matrix(x.num_states()); @@ -64,7 +83,7 @@ namespace madness } /** - * Flattens all response functions into a single vector of functions + * @brief Flattens all response functions into a single vector of functions * @param x * @return */ @@ -101,6 +120,12 @@ namespace madness return x_space; } +/** + * @brief response_matrix [x,y] -> Xspace X.x=y X.y=conjugate(x) + * + * @param x + * @return X_space + */ auto to_conjugate_X_space(const response_matrix &x) -> X_space { @@ -120,9 +145,6 @@ namespace madness b++; }); world.gop.fence(); - // auto norms = x_space.norm2s(); - // if (world.rank() == 0) { print("norms after copy ", norms); } - return x_space; } From 88d3491d0f4060d28b64e4931a6073881b8b6e13 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 8 Feb 2023 20:44:12 -0500 Subject: [PATCH 1035/1312] more comments --- src/apps/molresponse/x_space.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 73ef1c4487b..86ebee20e33 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -166,6 +166,16 @@ namespace madness } return XT; } + + /** + * @brief Computes the matrix elements between two response spaces + * + * cij=inner(ai,bj) + * + * @param A + * @param B + * @return Tensor + */ auto inner(const X_space &A, const X_space &B) -> Tensor { MADNESS_ASSERT(size_states(A) > 0); From be91ab219ad1c2738c8ca359c18a45bc27b2de24 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 12 Feb 2023 15:16:28 -0500 Subject: [PATCH 1036/1312] fix and clean up exchange --- src/apps/molresponse/global_functions.cc | 61 +++++++++++------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index f6c97cc511e..8738cbd14f1 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -315,38 +315,34 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); auto K = X_space::zero_functions(world, num_states, num_orbitals); - auto phi_1 = copy(world, phi0, false); - Exchange op{}; - const Exchange::Algorithm algo = op.multiworld_efficient; world.gop.fence(); const double lo = 1.e-10; - vector_real_function_3d k1x,k1y,k2x,k2y; - - if (compute_y) { - for (int b = 0; b < num_states; b++) { + vector_real_function_3d k1x, k1y, k2x, k2y; + auto make_k = [=](const auto &ket, const auto &bra) { + Exchange k{}; + k.set_parameters(bra, ket, lo); + k.set_algorithm(k.multiworld_efficient); + return k; + }; - Exchange kxx{}; - kxx.set_parameters(chi.X[b], phi0, lo); - kxx.set_algorithm(algo); + if (compute_y) { + for (int b = 0; b < num_states; b++) { - Exchange kxy{}; - kxy.set_parameters(phi0, chi.Y[b], lo); - kxy.set_algorithm(algo); + auto x = chi.X[b]; + auto y = chi.Y[b]; - Exchange kyx{}; - kyx.set_parameters(phi0, chi.X[b], lo); - kyx.set_algorithm(algo); + auto K1X = make_k(x, phi0); + auto K1Y = make_k(phi0, y); - Exchange kyy{}; - kyy.set_parameters(chi.Y[b], phi0, lo); - kyy.set_algorithm(algo); + auto K2X = make_k(y, phi0); + auto K2Y = make_k(phi0, x); - k1x=kxx(phi0); - k1y=kxy(phi0); - - k2x=kyx(phi0); - k2y=kyy(phi0); + k1x = K1X(phi0); + k1y = K1Y(phi0); + k2x = K2X(phi0); + k2y = K2Y(phi0); + world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); K.Y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); @@ -355,18 +351,17 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons } } else { for (int b = 0; b < num_states; b++) { - Exchange op_1x{}; - op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(algo); - Exchange op_2x{}; - op_2x.set_parameters(phi0, chi.X[b], lo); - op_2x.set_algorithm(algo); + auto x = chi.X[b]; + auto y = chi.X[b]; + + auto K1X = make_k(x, phi0); + auto K1Y = make_k(phi0, y); - auto k1x = op_1x(phi_1); - auto k1y = op_2x(phi_1); + k1x = K1X(phi0); + k1y = K1Y(phi0); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, true); } } return K; From b955a2088521402edd5020715555a8853e2f560c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 12 Feb 2023 15:29:41 -0500 Subject: [PATCH 1037/1312] fix plots --- src/apps/molresponse/ResponseBase.cpp | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f20287aeceb..261eb073a2b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1250,21 +1250,13 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, GroundStateCalculation const &g_params) { - std::string density_dir = "plots/"; - std::string orbital_dir = "plots/"; + std::string plot_dir = "plots/"; #ifdef MADCHEM_HAS_STD_FILESYSTEM - //density_dir = ""; - //orbital_dir = ""; - std::filesystem::create_directories(density_dir); - std::filesystem::create_directory(orbital_dir); + std::filesystem::create_directory(plot_dir); #else density_dir = ""; orbital_dir = ""; #endif - - // TESTING - // get transition density - // num orbitals size_t n = x_response[0].size(); size_t m = x_response.size(); @@ -1282,29 +1274,29 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, plotCoords plt(d, Lp); // plot ground density if (iteration == 1) { - auto d_i_path = density_dir + "rho0_%c_0.plot"; + auto d_i_path = plot_dir + "rho0_%c_0.plot"; snprintf(plot_name, buffSize, d_i_path.c_str(), dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, rho0); } for (int i = 0; i < static_cast(n); i++) { // print ground_state // plot gound_orbitals - auto orb_i_path = orbital_dir + "phi0_%c_0_%d.plt"; + auto orb_i_path = plot_dir + "phi0_%c_0_%d.plt"; snprintf(plot_name, buffSize, orb_i_path.c_str(), dir[d], static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals[i]); } for (int b = 0; b < static_cast(m); b++) { // plot rho1 direction d state b - auto d_ib_path = density_dir + "rho1_%c_%d.plt"; + auto d_ib_path = plot_dir + "rho1_%c_%d.plt"; snprintf(plot_name, buffSize, d_ib_path.c_str(), dir[d], static_cast(b)); plot_line(plot_name, 5001, plt.lo, plt.hi, rho1[b]); for (int i = 0; i < static_cast(n); i++) { // print ground_state - auto o_ibx_path = orbital_dir + "phix_%c_%d_%d.plt"; - auto o_iby_path = orbital_dir + "phiy_%c_%d_%d.plt"; + auto o_ibx_path = plot_dir + "phix_%c_%d_%d.plt"; + auto o_iby_path = plot_dir + "phiy_%c_%d_%d.plt"; snprintf(plot_name, buffSize, o_ibx_path.c_str(), dir[d], static_cast(b), static_cast(i)); plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b][i]); From 81c9022fad1fbe4e7137d849c1d397e95c469133 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 12 Feb 2023 15:46:31 -0500 Subject: [PATCH 1038/1312] fix and clean exchange --- src/apps/molresponse/global_functions.cc | 60 ++++++++++++------------ 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 05aa0da6640..9ba8c5ffda4 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -315,45 +315,47 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); auto K = X_space::zero_functions(world, num_states, num_orbitals); - auto phi_1 = copy(world, phi0, false); - Exchange op{}; - const Exchange::Algorithm algo = op.small_memory; - world.gop.fence(); const double lo = 1.e-10; + + auto make_k=[&](const auto & ket,const auto & bra){ + Exchange k{}; + k.set_parameters(bra,ket,lo); + k.set_algorithm(k.multiworld_efficient); + return k; + }; + + vecfuncT k1x,k2x,k1y,k2y; + if (compute_y) { for (int b = 0; b < num_states; b++) { - Exchange op_1x{}; - op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(algo); - Exchange op_1y{}; - op_1y.set_parameters(chi.Y[b], phi0, lo); - op_1y.set_algorithm(algo); - Exchange op_2x{}; - op_2x.set_parameters(phi0, chi.Y[b], lo); - op_2x.set_algorithm(algo); - Exchange op_2y{}; - op_2y.set_parameters(phi0, chi.X[b], lo); - op_2y.set_algorithm(algo); - auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_1); - auto k1y = op_1y(phi_1); - auto k2y = op_2y(phi_1); + auto x=chi.X[b]; + auto y=chi.Y[b]; + + auto K1x = make_k(x,phi0); + auto K2x = make_k(phi0,y); + + auto K1y = make_k(y,phi0); + auto K2y = make_k(phi0,x); + + k1x=K1x(phi0); + k2x=K2x(phi0); + + k1y=K2x(phi0); + k2y=K2y(phi0); + K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, false); K.Y[b] = gaxpy_oop(1.0, k1y, 1.0, k2y, false); world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { - Exchange op_1x{}; - op_1x.set_parameters(chi.X[b], phi0, lo); - op_1x.set_algorithm(algo); - - Exchange op_2x{}; - op_2x.set_parameters(phi0, chi.X[b], lo); - op_2x.set_algorithm(algo); + auto x=chi.X[b]; + auto y=chi.X[b]; + auto K1x = make_k(x,phi0); + auto K2x = make_k(phi0,y); - auto k1x = op_1x(phi_1); - auto k2x = op_2x(phi_1); + k1x=K1x(phi0); + k2x=K2x(phi0); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k2x, true); } From 70faf30560a860388188a831e34d025b62a2869f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 12 Feb 2023 15:51:44 -0500 Subject: [PATCH 1039/1312] emplace back makes sense here --- src/madness/chem/SCF.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 2b5be0bcd0b..2a70737833a 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -164,19 +164,19 @@ void SCF::output_calc_info_schema() const { vec_pair_tensor_T double_tensor_vals; - int_vals.push_back({"calcinfo_nmo", param.nmo_alpha() + param.nmo_beta()}); - int_vals.push_back({"calcinfo_nalpha", param.nalpha()}); - int_vals.push_back({"calcinfo_nbeta", param.nbeta()}); - int_vals.push_back({"calcinfo_natom", molecule.natom()}); - int_vals.push_back({"k", FunctionDefaults<3>::get_k()}); + int_vals.emplace_back("calcinfo_nmo", param.nmo_alpha() + param.nmo_beta()); + int_vals.emplace_back("calcinfo_nalpha", param.nalpha()); + int_vals.emplace_back("calcinfo_nbeta", param.nbeta()); + int_vals.emplace_back("calcinfo_natom", molecule.natom()); + int_vals.emplace_back("k", FunctionDefaults<3>::get_k()); to_json(j, int_vals); // double_vals.push_back({"return_energy", value(molecule.get_all_coords().flat())}); - double_vals.push_back({"return_energy", current_energy}); + double_vals.emplace_back("return_energy", current_energy); to_json(j, double_vals); - double_tensor_vals.push_back({"scf_eigenvalues_a", aeps}); + double_tensor_vals.emplace_back("scf_eigenvalues_a", aeps); if (param.nbeta() != 0 && !param.spin_restricted()) { - double_tensor_vals.push_back({"scf_eigenvalues_b", beps}); + double_tensor_vals.emplace_back("scf_eigenvalues_b", beps); } to_json(j, double_tensor_vals); From 587db6f1149e92d2b26fdabe5bd490507091566c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 13 Feb 2023 12:16:11 -0500 Subject: [PATCH 1040/1312] make sure both ground and response are using the same version of hfxc --- src/apps/molresponse/global_functions.cc | 28 +++++++++--------------- src/apps/molresponse/global_functions.h | 1 + 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 9ba8c5ffda4..6c737acea28 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -297,6 +297,13 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br molresponse::end_timer(world, "ground exchange reorganize"); return K0; } +auto make_k(const vecfuncT &ket, const vecfuncT &bra) { + const double lo = 1.e-10; + Exchange k{}; + k.set_parameters(bra,ket,lo); + k.set_algorithm(k.multiworld_efficient); + return k; +}; /** * Computes ground density exchange on response vectors * This algorithm places all functions in a single vector, @@ -315,15 +322,6 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); auto K = X_space::zero_functions(world, num_states, num_orbitals); - const double lo = 1.e-10; - - auto make_k=[&](const auto & ket,const auto & bra){ - Exchange k{}; - k.set_parameters(bra,ket,lo); - k.set_algorithm(k.multiworld_efficient); - return k; - }; - vecfuncT k1x,k2x,k1y,k2y; if (compute_y) { @@ -391,20 +389,14 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const const double lo = 1.e-10; if (compute_y) { for (int b = 0; b < num_states; b++) { - Exchange op_0x{}; - op_0x.set_parameters(phi0, phi0, lo); - op_0x.set_algorithm(algo); - Exchange op_0y{}; - op_0y.set_parameters(phi0, phi0, lo); - op_0y.set_algorithm(algo); + auto op_0x= make_k(phi0,phi0); + auto op_0y= make_k(phi0,phi0); K0.X[b] = op_0x(chi.X[b]); K0.Y[b] = op_0y(chi.Y[b]); } } else { for (int b = 0; b < num_states; b++) { - Exchange op_0x{}; - op_0x.set_parameters(phi0, phi0, lo); - op_0x.set_algorithm(algo); + auto op_0x= make_k(phi0,phi0); K0.X[b] = op_0x(chi.X[b]); } K0.Y = K0.X.copy(); diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index d66ac5c20c0..7f9d76e241a 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -49,6 +49,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); response_space T(World &world, response_space &f); auto ground_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; +auto make_k(const vecfuncT & ket,const vecfuncT & bra); auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &x, const bool& compute_y) -> X_space; auto response_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); From 74b6b0e089d179bd0432ce70a2425b833b80cbb0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 13 Feb 2023 15:40:05 -0500 Subject: [PATCH 1041/1312] clean exchange --- src/apps/molresponse/ResponseBase.cpp | 5 ----- src/apps/molresponse/global_functions.cc | 8 +------- src/apps/molresponse/global_functions.h | 2 +- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 261eb073a2b..1efe5d18ce8 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -585,11 +585,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm X_space W = X_space::zero_functions(world, num_states, num_orbitals); X_space J(world, num_states, num_orbitals); X_space K = X_space::zero_functions(world, num_states, num_orbitals); - X_space KX = X_space::zero_functions(world, num_states, num_orbitals); - X_space KY = X_space::zero_functions(world, num_states, num_orbitals); - - // std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; - // world.mpi.Barrier(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 6c737acea28..19ee5155644 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -297,7 +297,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br molresponse::end_timer(world, "ground exchange reorganize"); return K0; } -auto make_k(const vecfuncT &ket, const vecfuncT &bra) { +auto make_k(const vecfuncT &ket, const vecfuncT &bra)-> Exchange { const double lo = 1.e-10; Exchange k{}; k.set_parameters(bra,ket,lo); @@ -382,11 +382,6 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const auto num_orbitals = chi.num_orbitals(); auto K0 = X_space::zero_functions(world, num_states, num_orbitals); - // the question is copying pointers mpi safe - Exchange op{}; - const Exchange::Algorithm algo = op.small_memory; - world.gop.fence(); - const double lo = 1.e-10; if (compute_y) { for (int b = 0; b < num_states; b++) { auto op_0x= make_k(phi0,phi0); @@ -401,6 +396,5 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const } K0.Y = K0.X.copy(); } - K0.truncate(); return K0; } diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index 7f9d76e241a..9bcb04d75be 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -49,7 +49,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); response_space T(World &world, response_space &f); auto ground_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; -auto make_k(const vecfuncT & ket,const vecfuncT & bra); +auto make_k(const vecfuncT & ket,const vecfuncT & bra)->Exchange; auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &x, const bool& compute_y) -> X_space; auto response_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; vecfuncT K(vecfuncT &ket, vecfuncT &bra, vecfuncT &vf); From 06afe0e59988e35fb938766f2656a372beee79b6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 13 Feb 2023 15:46:35 -0500 Subject: [PATCH 1042/1312] clean exchange --- src/apps/molresponse/ResponseBase.cpp | 61 ++------------------------- 1 file changed, 4 insertions(+), 57 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 1efe5d18ce8..d1898fba6dc 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -466,8 +466,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit X_space J(world, num_states, num_orbitals); response_space j_x(world, num_states, num_orbitals); response_space j_y(world, num_states, num_orbitals); - X_space W = X_space::zero_functions(world, num_states, num_orbitals); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } @@ -477,7 +477,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // Create Coulomb potential on ground_orbitals functionT rho_x_b; functionT rho_y_b; - auto mul_tol = FunctionDefaults<3>::get_thresh(); + auto mul_tol = FunctionDefaults<3>::get_thresh()*.1; // note that x can refer to x or y auto rho_b = make_density(world, chi_alpha); int b = 0; @@ -510,13 +510,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } - if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); - gamma = 2 * J - c_xc * K + (1.0 - c_xc) * W; + gamma = 2 * J - c_xc * K; if (xcf.hf_exchange_coefficient() != 1.0) { - gamma += W; + gamma = gamma+(1.0-c_xc)* W; if (world.rank() == 0) { print("gamma: += W"); } } //gamma.truncate(); @@ -554,7 +553,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - gamma.truncate(); return gamma; // Get sizes } @@ -599,22 +597,11 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute density J[omega]"); } - // Create Coulomb potential on ground_orbitals - - /* - auto compute_jx = [&, &phi0 = phi0](auto rho_alpha) { - auto temp_J = apply(*shared_coulomb_operator, rho_alpha); - return mul(world, temp_J, phi0); - }; - */ - int b = 0; for (const auto &rho_b: rho) { auto temp_J = apply(*shared_coulomb_operator, rho_b); J.X[b++] = mul(world, temp_J, phi0); } - //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); - J.X.truncate_rf(); J.Y = J.X.copy(); if (r_params.print_level() >= 1) { @@ -635,55 +622,17 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } - /* - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), - [&](const auto &xi) { return newK(xi, phi0, phi0); }); - - std::transform(xy.Y.begin(), xy.Y.end(), KY.X.begin(), - [&](const auto &yi) { return newK(phi0, yi, phi0); }); - - - K = KX + KY; - world.gop.fence(); - - if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", xy, KX); } - if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", xy, KY); } - if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "old K[omega]", "K[omega]", iter_timing); - } - */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, xy, false); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } - if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } - /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K = response_exchange(phi0, xy, false); - if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } - */ - // for each response state we compute the Gamma response functions - // trucate all response functions - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* - J.truncate(); - KX.truncate(); - KY.truncate(); - W.truncate(); - */ - - // update gamma functions gamma = 2 * J - K * xcf.hf_exchange_coefficient() + W; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } - gamma.truncate(); // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -700,11 +649,9 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm W.clear(); xy.clear(); phi0.clear(); - if (world.size() > 1) { FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_clear_functions", "gamma_clear_functions", iter_timing); From d498b184fc41afdcd084f68268b6ded116afec30 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 18 Feb 2023 15:23:44 -0500 Subject: [PATCH 1043/1312] use multiworld for everthig --- src/apps/molresponse/global_functions.cc | 32 ++++++++---------------- src/apps/molresponse/global_functions.h | 1 + 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 8738cbd14f1..b09c70bd84c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -297,6 +297,12 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br molresponse::end_timer(world, "ground exchange reorganize"); return K0; } +auto make_k(const vecfuncT &ket, const vecfuncT &bra) {const double lo = 1.e-10; + Exchange k{}; + k.set_parameters(bra, ket, lo); + k.set_algorithm(k.multiworld_efficient); + return k; +}; /** * Computes ground density exchange on response vectors * This algorithm places all functions in a single vector, @@ -316,15 +322,8 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_orbitals = chi.num_orbitals(); auto K = X_space::zero_functions(world, num_states, num_orbitals); world.gop.fence(); - const double lo = 1.e-10; vector_real_function_3d k1x, k1y, k2x, k2y; - auto make_k = [=](const auto &ket, const auto &bra) { - Exchange k{}; - k.set_parameters(bra, ket, lo); - k.set_algorithm(k.multiworld_efficient); - return k; - }; if (compute_y) { for (int b = 0; b < num_states; b++) { @@ -389,27 +388,16 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const auto K0 = X_space::zero_functions(world, num_states, num_orbitals); // the question is copying pointers mpi safe - Exchange op{}; - const Exchange::Algorithm algo = op.small_memory; world.gop.fence(); - const double lo = 1.e-10; + auto k0=make_k(phi0,phi0); if (compute_y) { for (int b = 0; b < num_states; b++) { - Exchange op_0x{}; - op_0x.set_parameters(phi0, phi0, lo); - op_0x.set_algorithm(algo); - Exchange op_0y{}; - op_0y.set_parameters(phi0, phi0, lo); - op_0y.set_algorithm(algo); - K0.X[b] = op_0x(chi.X[b]); - K0.Y[b] = op_0y(chi.Y[b]); + K0.X[b] = k0(chi.X[b]); + K0.Y[b] = k0(chi.Y[b]); } } else { for (int b = 0; b < num_states; b++) { - Exchange op_0x{}; - op_0x.set_parameters(phi0, phi0, lo); - op_0x.set_algorithm(algo); - K0.X[b] = op_0x(chi.X[b]); + K0.X[b] = k0(chi.X[b]); } K0.Y = K0.X.copy(); } diff --git a/src/apps/molresponse/global_functions.h b/src/apps/molresponse/global_functions.h index d66ac5c20c0..5af6a33cd4c 100644 --- a/src/apps/molresponse/global_functions.h +++ b/src/apps/molresponse/global_functions.h @@ -48,6 +48,7 @@ CalcParams initialize_calc_params(World &world, const std::string &input_file); // kinetic energy operator on response vector response_space T(World &world, response_space &f); +auto make_k (const vecfuncT &ket, const vecfuncT &bra); auto ground_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &x, const bool& compute_y) -> X_space; auto response_exchange(const vecfuncT &phi0, const X_space &x, bool compute_y) -> X_space; From 35e627b074ea7e9aa3a2ed1b7df66096df628ca8 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Mon, 20 Feb 2023 22:51:11 +0100 Subject: [PATCH 1044/1312] Update cmake.yml remove legacyTBB from the build matrix --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 48a0597e5a1..e8543aedef5 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -14,7 +14,7 @@ jobs: matrix: build_type : [ Release, Debug ] os : [ macos-latest, ubuntu-20.04 ] - task_backend : [Threads, OneTBB, LegacyTBB, PaRSEC] # OneTBB and LegacyTBB control which version of TBB to install + task_backend : [Threads, OneTBB, PaRSEC] # OneTBB and LegacyTBB control which version of TBB to install include: - os: ubuntu-20.04 cxx: /usr/bin/g++-9 From 7110c5a297511338dc98703ba39938d36b9223a1 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 21 Feb 2023 17:49:05 -0500 Subject: [PATCH 1045/1312] loosen convergence --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 8a72ed0da5f..6ca321f7042 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow {0.792}; - const double b_pow {1.078}; + const double a_pow {1.052}; + const double b_pow {3.078}; // Last attempt 1.035 2.121 const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b From dec328ddfea922034a03651eaf3d88c05190ad11 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 22 Feb 2023 10:17:57 -0500 Subject: [PATCH 1046/1312] loosen convergence --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6ca321f7042..069c87bcae0 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow {1.052}; - const double b_pow {3.078}; + const double a_pow {0.649}; + const double b_pow {0.533}; // Last attempt 1.035 2.121 const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b From 7308e43255d29d3a85c0ea3361c708fca6bd0313 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 28 Feb 2023 18:17:27 -0500 Subject: [PATCH 1047/1312] Loosen convergence criteria through out and pint polar residual --- src/apps/molresponse/FrequencyResponse.cpp | 11 ++++++++--- src/apps/molresponse/global_functions.cc | 2 ++ src/apps/molresponse/testing/runners.hpp | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 069c87bcae0..7bba367df48 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -25,9 +25,9 @@ void FrequencyResponse::iterate(World &world) { const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); - auto density_target = dconv * std::max(size_t(5), molecule.natom()); - const double a_pow {0.649}; - const double b_pow {0.533}; + auto density_target = dconv * std::max(size_t(5.0), molecule.natom()); + const double a_pow {0.655}; + const double b_pow {0.519}; // Last attempt 1.035 2.121 const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b @@ -44,6 +44,7 @@ void FrequencyResponse::iterate(World &world) { Tensor v_polar(m, m); Tensor polar; + Tensor res_polar; vecfuncT rho_omega_old(m); // initialize DFT XC functional operator @@ -192,8 +193,10 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { print("computing polarizability:"); } if (compute_y) { polar = -2 * inner(Chi, PQ); + res_polar = -2 * inner(new_res.residual, PQ); } else { polar = -4 * response_space_inner(Chi.X, PQ.X); + res_polar = -2 * inner(new_res.residual.X, PQ.X); } if (r_params.print_level() >= 20) { if (world.rank() == 0) { @@ -201,6 +204,8 @@ void FrequencyResponse::iterate(World &world) { static_cast(iter)); print("polarizability"); print(polar); + print("res polarizability"); + print(res_polar); } } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index b09c70bd84c..b7d4e53ca80 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -341,10 +341,12 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons k1y = K1Y(phi0); k2x = K2X(phi0); k2y = K2Y(phi0); + world.gop.fence(); K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); K.Y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); + K.Y[b][0].print_info(); world.gop.fence(); } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 9edd5febc49..6f2b118317b 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -509,13 +509,13 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param if (world.rank() == 0) { if (precision == "high") { r_params.set_user_defined_value>("protocol", {1e-6, 1e-7, 1e-8}); - r_params.set_user_defined_value("dconv", 1e-6); + r_params.set_user_defined_value("dconv", 1e-5); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); r_params.set_user_defined_value("dconv", 1e-4); } else { r_params.set_user_defined_value>("protocol", {1e-9}); - r_params.set_user_defined_value("dconv", 1e-7); + r_params.set_user_defined_value("dconv", 1e-6); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(15)); From 06d08b9ccb5a0c49bc381134653000ba7b3a159f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 28 Feb 2023 18:24:13 -0500 Subject: [PATCH 1048/1312] fix printing residual polar --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 7bba367df48..58b3da924d7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -196,7 +196,7 @@ void FrequencyResponse::iterate(World &world) { res_polar = -2 * inner(new_res.residual, PQ); } else { polar = -4 * response_space_inner(Chi.X, PQ.X); - res_polar = -2 * inner(new_res.residual.X, PQ.X); + res_polar = -2 * response_space_inner(new_res.residual.X, PQ.X); } if (r_params.print_level() >= 20) { if (world.rank() == 0) { From 9aceb4ad70b0c1615c6cdbb9db51e97d55324f42 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 28 Feb 2023 18:32:20 -0500 Subject: [PATCH 1049/1312] print output residual polar --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 58b3da924d7..5f7896d7281 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -120,7 +120,7 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, rho_norms, density_residuals); - frequency_to_json(j_molresponse, iter, polar, v_polar); + frequency_to_json(j_molresponse, iter, polar, res_polar); } if (r_params.print_level() >= 1) { if (world.rank() == 0) { From a435816f297d2f4b5c8e5b4bbe65595dcebb2962 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 07:27:14 -0500 Subject: [PATCH 1050/1312] try truncating potentials before adding --- src/apps/molresponse/FrequencyResponse.cpp | 16 ++++++++++++--- src/apps/molresponse/ResponseBase.cpp | 24 +++++++++++++++++----- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5f7896d7281..6a2b54f4256 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,9 +26,9 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5.0), molecule.natom()); - const double a_pow {0.655}; - const double b_pow {0.519}; -// Last attempt 1.035 2.121 + const double a_pow{0.655}; + const double b_pow{0.519}; + // Last attempt 1.035 2.121 const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y @@ -335,6 +335,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, size_t n = theta_X.X.size_orbitals(); bool compute_y = omega != 0.0; // construct lhs for 2nd order property + PQ.truncate(); theta_X.X += theta_X.X * x_shifts; theta_X.X += PQ.X; @@ -343,6 +344,9 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (compute_y) { theta_X.Y += PQ.Y; theta_X.Y = theta_X.Y * -2; + theta_X.truncate(); + } else { + theta_X.X.truncate_rf(); } world.gop.fence(); // apply bsh @@ -355,6 +359,12 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + if (compute_y) { + bsh_X.truncate(); + } else { + bsh_X.X.truncate_rf(); + } + if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index cfa81650b87..65872784f93 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -404,7 +404,12 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.localize() != "canon") { E0X = chi.copy(); E0X.X = E0X.X * ham_no_diag; - if (compute_Y) { E0X.Y = E0X.Y * ham_no_diag; } + if (compute_Y) { + E0X.Y = E0X.Y * ham_no_diag; + E0X.truncate(); + } else { + E0X.X.truncate_rf(); + } if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } } if (r_params.print_level() >= 1) { @@ -430,7 +435,6 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, Theta_X = (V0X - E0X) + gamma; world.gop.fence(); - Theta_X.truncate(); // Theta_X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); @@ -484,6 +488,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto temp_J = apply(*shared_coulomb_operator, rho_b_i); J.X[b++] = mul(world, temp_J, phi0); } + J.X.truncate_rf(); world.gop.fence(); J.Y = J.X.copy(); if (world.rank() == 0) { print("copy JX into JY"); } @@ -517,11 +522,13 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); - gamma = 2 * J - c_xc * K + (1.0 - c_xc) * W; + gamma = 2 * J - c_xc * K; + if (xcf.hf_exchange_coefficient() != 1.0) { - gamma += W; + gamma += (1.0 - c_xc) * W; if (world.rank() == 0) { print("gamma: += W"); } } + gamma.truncate(); //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma add", "gamma_truncate_add", iter_timing); @@ -533,6 +540,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit gamma.X[i] = projector(gamma.X[i]); gamma.Y[i] = projector(gamma.Y[i]); } + gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -957,6 +965,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< real_function_3d v_nuc, v_j0, v_k0, v_xc; if (not r_params.store_potential()) { v_nuc = potential_manager->vnuclear(); + v_nuc.truncate(FunctionDefaults<3>::get_thresh(), true); //v_nuc.truncate(); } else {// Already pre-computed v_nuc = stored_v_nuc; @@ -971,6 +980,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< // J^0 x^alpha v_j0 = apply(*shared_coulomb_operator, ground_density, true); v_j0.scale(2.0, true); + v_j0.truncate(FunctionDefaults<3>::get_thresh(), true); } else {// Already pre-computed v_j0 = stored_v_coul; } @@ -1001,12 +1011,16 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< for (int b = 0; b < m; b++) { vx[b] = mul(world, v0, x[b], false); } world.gop.fence(); V0 = to_X_space(vx); + V0.truncate(); V0 += -c_xc * K0; + V0.truncate(); } else { for (int b = 0; b < m; b++) { V0.X[b] = mul(world, v0, X.X[b], false); } + V0.X.truncate_rf(); world.gop.fence(); V0.X += -c_xc * K0.X; V0.Y = V0.X.copy(); + V0.X.truncate_rf(); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } if (r_params.print_level() >= 1) { @@ -1201,7 +1215,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (world.rank() == 0) { print("deltaX[b]: ", step_size); } if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } } - if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { + if (step_size > max_step && step_size < 25) { // and if the step size is less thant 10% the vector norm double s = .80 * max_step / step_size; if (world.rank() == 0) { From 89da9562e83d2d5705b72699d914c100c3f1b64e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 07:28:05 -0500 Subject: [PATCH 1051/1312] increase maxiter --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 6f2b118317b..dfbc08472bf 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -518,7 +518,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("dconv", 1e-6); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(15)); + r_params.set_user_defined_value("maxiter", size_t(20)); r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); From e952160ce17c48c9d971c376815ec004e81a33e2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 12:09:06 -0500 Subject: [PATCH 1052/1312] lets just try the large_memory algorithm --- src/apps/molresponse/global_functions.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index b7d4e53ca80..2067a942c5a 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -297,10 +297,11 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br molresponse::end_timer(world, "ground exchange reorganize"); return K0; } -auto make_k(const vecfuncT &ket, const vecfuncT &bra) {const double lo = 1.e-10; +auto make_k(const vecfuncT &ket, const vecfuncT &bra) { + const double lo = 1.e-10; Exchange k{}; k.set_parameters(bra, ket, lo); - k.set_algorithm(k.multiworld_efficient); + k.set_algorithm(k.large_memory); return k; }; /** @@ -391,16 +392,14 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const auto K0 = X_space::zero_functions(world, num_states, num_orbitals); // the question is copying pointers mpi safe world.gop.fence(); - auto k0=make_k(phi0,phi0); + auto k0 = make_k(phi0, phi0); if (compute_y) { for (int b = 0; b < num_states; b++) { K0.X[b] = k0(chi.X[b]); K0.Y[b] = k0(chi.Y[b]); } } else { - for (int b = 0; b < num_states; b++) { - K0.X[b] = k0(chi.X[b]); - } + for (int b = 0; b < num_states; b++) { K0.X[b] = k0(chi.X[b]); } K0.Y = K0.X.copy(); } K0.truncate(); From daaaaf844848be039e8d086d95dc1f0a05de3478 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 12:20:55 -0500 Subject: [PATCH 1053/1312] print residual polar data --- src/apps/molresponse/FrequencyResponse.cpp | 3 ++- src/apps/molresponse/FrequencyResponse.hpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 6a2b54f4256..27355e8a3cc 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -385,10 +385,11 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, void FrequencyResponse::frequency_to_json(json &j_mol_in, size_t iter, const Tensor &polar_ij, - const Tensor &v_polar_ij) { + const Tensor &res_polar_ij) { json j = {}; j["iter"] = iter; j["polar"] = tensor_to_json(polar_ij); + j["res_polar"] = tensor_to_json(res_polar_ij); auto index = j_mol_in["protocol_data"].size() - 1; j_mol_in["protocol_data"][index]["property_data"].push_back(j); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index db141cbe5d9..bc0a0cd8954 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -41,7 +41,7 @@ class FrequencyResponse : public ResponseBase { vector& bsh_y_ops, QProjector& projector, double& x_shifts); static void frequency_to_json(json &j_mol_in, size_t iter, const Tensor &polar_ij, - const Tensor &v_polar_ij); + const Tensor &res_polar_ij); static void compute_and_print_polarizability(World& world, X_space& Chi, X_space& pq, std::string message); void save(World& world, const std::string& name) override; From 270eaef76906dfc05ab7482a6d4c9472f7a8b4a4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 16:54:07 -0500 Subject: [PATCH 1054/1312] function_data class to print norms of response vectors per iteration --- src/apps/molresponse/FrequencyResponse.cpp | 11 +++ src/apps/molresponse/ResponseBase.cpp | 84 ++++++++++++++++++++++ src/apps/molresponse/ResponseBase.hpp | 16 ++++- 3 files changed, 110 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 27355e8a3cc..c8e86086e17 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -94,6 +94,7 @@ void FrequencyResponse::iterate(World &world) { //PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); + iter_function_data.clear(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); if (world.rank() == 0) @@ -188,15 +189,20 @@ void FrequencyResponse::iterate(World &world) { auto density_change = madness::sub(world, rho_omega, rho_omega_old, true); density_residuals = norm2s_T(world, density_change); + iter_function_data["d"] = density_residuals; if (world.rank() == 0) { print("computing residuals: density residuals"); } if (world.rank() == 0) { print("computing polarizability:"); } if (compute_y) { polar = -2 * inner(Chi, PQ); res_polar = -2 * inner(new_res.residual, PQ); + inner_to_json(world, "alpha", Chi, PQ, iter_function_data); + inner_to_json(world, "ralpha", new_res.residual, PQ, iter_function_data); } else { polar = -4 * response_space_inner(Chi.X, PQ.X); res_polar = -2 * response_space_inner(new_res.residual.X, PQ.X); + inner_to_json(world, "alpha", Chi, PQ, iter_function_data); + inner_to_json(world, "ralpha", new_res.residual, PQ, iter_function_data); } if (r_params.print_level() >= 20) { if (world.rank() == 0) { @@ -213,6 +219,7 @@ void FrequencyResponse::iterate(World &world) { molresponse::end_timer(world, "Iteration Timing", "iter_total", iter_timing); } time_data.add_data(iter_timing); + function_data.add_data(iter_function_data); } if (world.rank() == 0) print("\n"); @@ -248,10 +255,14 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); + + inner_to_json(world, "x_new", new_chi, new_chi, iter_function_data); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); + inner_to_json(world, "rx", new_res, new_res, iter_function_data); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + inner_to_json(world, "x_update", new_chi, new_chi, iter_function_data); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 65872784f93..f4d778f9f4d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -410,6 +410,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } else { E0X.X.truncate_rf(); } + inner_to_json(world, "E0", chi, E0X, iter_function_data); if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } } if (r_params.print_level() >= 1) { @@ -428,12 +429,15 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); } + inner_to_json(world, "gamma_x", chi, gamma, iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // Right here I can compute the polarizability before I try a KAIN UPDATE or step restriction Theta_X = (V0X - E0X) + gamma; + + inner_to_json(world, "theta_x", chi, Theta_X, iter_function_data); world.gop.fence(); // Theta_X.truncate(); if (r_params.print_level() >= 1) { @@ -494,6 +498,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); + inner_to_json(world, "j1", chi_alpha, J, iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } @@ -511,10 +516,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } + inner_to_json(world, "w1", chi_alpha, W, iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); + inner_to_json(world, "k1", chi_alpha, K, iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -635,6 +642,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } + inner_to_json(world, "j1", xy, J, iter_function_data); if (xcf.hf_exchange_coefficient() != 1.0) { auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { @@ -648,6 +656,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } + inner_to_json(world, "w1", xy, W, iter_function_data); /* @@ -672,6 +681,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, xy, false); + inner_to_json(world, "k1", xy, K, iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -998,8 +1008,10 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(ground_orbitals, X, compute_Y); + inner_to_json(world, "k0", X, V0, iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto c_xc = xcf.hf_exchange_coefficient(); real_function_3d v0 = v_j0 + v_nuc + (1 - c_xc) * v_xc; @@ -1012,15 +1024,21 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< world.gop.fence(); V0 = to_X_space(vx); V0.truncate(); + inner_to_json(world, "v0_local", X, V0, iter_function_data); V0 += -c_xc * K0; V0.truncate(); + inner_to_json(world, "v0", X, V0, iter_function_data); } else { for (int b = 0; b < m; b++) { V0.X[b] = mul(world, v0, X.X[b], false); } V0.X.truncate_rf(); + inner_to_json(world, "v0_local", X, V0, iter_function_data); + world.gop.fence(); + V0.X += -c_xc * K0.X; V0.Y = V0.X.copy(); V0.X.truncate_rf(); + inner_to_json(world, "v0", X, V0, iter_function_data); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } if (r_params.print_level() >= 1) { @@ -1742,6 +1760,7 @@ auto ResponseBase::project_ao_basis(World &world, const AtomicBasisSet &aobasis) } void ResponseBase::output_json() { + function_data.to_json(j_molresponse); time_data.to_json(j_molresponse); auto print_time = std::chrono::system_clock::now(); auto in_time_t = std::chrono::system_clock::to_time_t(print_time); @@ -2131,3 +2150,68 @@ void response_timing::to_json(json &j) { j["time_data"]["cpu_time"] = json(); for (const auto &e: cpu_time_data) { j["time_data"]["cpu_time"][e.first] = e.second; } } +/** + * add the pair of s wall_time and cpu_time to the time_data and wall_data maps + * + * values.first=wall_time + * values.second=cpu_time + * @param values + */ +void response_data::add_data(std::map> values) { + // print("ADDING DATA"); + iter++; + std::for_each(function_data.begin(), function_data.end(), [&values](auto &v) { + v.second.push_back(values[v.first]);// .first to get first value of pair wall_time + }); +} + +void response_data::to_json(json &j) { + + //::print("FREQUENCY TIME DATA TO JSON"); + + j["response_data"] = json(); + j["response_data"]["iterations"] = iter; + + + j["response_data"]["data"] = json(); + for (const auto &e: function_data) { + j["response_data"]["data"][e.first] = {}; + for (const auto &fi: e.second) { + j["response_data"]["data"][e.first].push_back(tensor_to_json(fi)); + } + } +} + +response_data::response_data() : iter(0) { + + function_data.insert({"v0_local", std::vector>(0)}); + function_data.insert({"k0", std::vector>(0)}); + function_data.insert({"v0", std::vector>(0)}); + function_data.insert({"E0", std::vector>(0)}); + + + function_data.insert({"j1", std::vector>(0)}); + function_data.insert({"k1", std::vector>(0)}); + function_data.insert({"w1", std::vector>(0)}); + function_data.insert({"gamma_x", std::vector>(0)}); + function_data.insert({"theta_x", std::vector>(0)}); + + function_data.insert({"x_new", std::vector>(0)}); + function_data.insert({"x_update", std::vector>(0)}); + + function_data.insert({"x", std::vector>(0)}); + function_data.insert({"rx", std::vector>(0)}); + + function_data.insert({"alpha", std::vector>(0)}); + function_data.insert({"r_alpha", std::vector>(0)}); + + function_data.insert({"d", std::vector>(0)}); +} + +void inner_to_json(World &world, const std::string &name, const X_space &left, const X_space &right, + std::map> &data) { + auto m_val = inner(left, right); + world.gop.fence(); + + data[name] = m_val; +} diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index e24cfdacdda..05e352cf50e 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -44,6 +44,17 @@ class response_timing { void add_data(std::map> values); }; +class response_data { + std::map>> function_data; + int iter; + +public: + response_data(); + + void to_json(json &j); + + void add_data(std::map> values); +}; class ResponseTester; @@ -76,7 +87,9 @@ class ResponseBase { json j_molresponse{}; response_timing time_data; + response_data function_data; mutable std::map> iter_timing; + mutable std::map> iter_function_data; protected: // Given molecule returns the nuclear potential of the molecule @@ -374,7 +387,8 @@ auto transform(World &world, const X_space &x, const Tensor &U) -> X_spa // result(i,j) = inner(a[i],b[j]).sum() auto expectation(World &world, const response_space &A, const response_space &B) -> Tensor; - +void inner_to_json(World &world, const std::string &name, const X_space &left, + const X_space &right, std::map> &data); class ResponseTester { public: From e82501893ca287479a9d268ac61b8922a65f76fa Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 16:56:50 -0500 Subject: [PATCH 1055/1312] bug --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f4d778f9f4d..2c58b3dbe25 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1008,7 +1008,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(ground_orbitals, X, compute_Y); - inner_to_json(world, "k0", X, V0, iter_function_data); + inner_to_json(world, "k0", X, K0, iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } From e94cca164953478e5e432f90e4af505ce186f1cc Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 18:08:43 -0500 Subject: [PATCH 1056/1312] merge all of the tensor in the vectors into one --- src/apps/molresponse/ResponseBase.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2c58b3dbe25..9769c62bd4f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -2174,11 +2174,21 @@ void response_data::to_json(json &j) { j["response_data"]["data"] = json(); - for (const auto &e: function_data) { - j["response_data"]["data"][e.first] = {}; - for (const auto &fi: e.second) { - j["response_data"]["data"][e.first].push_back(tensor_to_json(fi)); + + auto merge_tensors = [](std::vector> f) { + long m = f.size(); + long n = f[0].size(); + + Tensor new_tensor(m, n); + long i = 0; + for (const auto &ti: f) { + new_tensor(i, _) = ti;// Copy all data from b to a } + return new_tensor; + }; + for (const auto &e: function_data) { + auto m_t = merge_tensors(e.second); + j["response_data"]["data"][e.first].push_back(tensor_to_json(m_t)); } } From 3f12db9dd1aa5c4381e6ad0290f57a8364998026 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 18:15:37 -0500 Subject: [PATCH 1057/1312] converge the relative residual --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index c8e86086e17..af908c1fefe 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -138,11 +138,11 @@ void FrequencyResponse::iterate(World &world) { print("d_residual_max target : ", density_target); print("bsh_residual_max : ", max_bsh); print("bsh_relative_residual_max : ", max_relative_bsh); - print("bsh abs target : ", bsh_abs_target); + print("bsh relative residual target : ", bsh_abs_target); } } if ((d_residual < density_target) and - ((max_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { + ((max_relative_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { converged = true; } if (converged || iter == r_params.maxiter()) { From cfa64b8ca90564f7af0d2bbf2f59dfbabc2662b8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 19:13:14 -0500 Subject: [PATCH 1058/1312] fix the new output --- src/apps/molresponse/ResponseBase.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 9769c62bd4f..bdf4ad51403 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -2179,10 +2179,11 @@ void response_data::to_json(json &j) { long m = f.size(); long n = f[0].size(); - Tensor new_tensor(m, n); + Tensor new_tensor(m , n); long i = 0; for (const auto &ti: f) { - new_tensor(i, _) = ti;// Copy all data from b to a + std::copy(ti.ptr(), ti.ptr() + n, new_tensor.ptr() + (i * n)); + i++; } return new_tensor; }; From 85e99bd61705c726bcfadde9db29eedab92c5a27 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 20:22:38 -0500 Subject: [PATCH 1059/1312] using the strategy design pattern to simplify inner --- src/apps/molresponse/FrequencyResponse.cpp | 28 ++++---- src/apps/molresponse/FrequencyResponse.hpp | 48 +++++++------ src/apps/molresponse/ResponseBase.cpp | 35 +++++----- src/apps/molresponse/ResponseBase.hpp | 79 ++++++++++++++++++---- 4 files changed, 123 insertions(+), 67 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index af908c1fefe..3c04c4b728d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -16,7 +16,7 @@ void FrequencyResponse::initialize(World &world) { void FrequencyResponse::iterate(World &world) { size_t iter; // Variables needed to iterate - QProjector projector(world, ground_orbitals); + madness::QProjector projector(world, ground_orbitals); size_t n = r_params.num_orbitals();// Number of ground state orbitals size_t m = r_params.num_states(); // Number of excited states @@ -40,6 +40,7 @@ void FrequencyResponse::iterate(World &world) { bool compute_y = not static_res; int r_vector_size; + r_vector_size = (compute_y) ? 2 * n : n; Tensor v_polar(m, m); @@ -109,7 +110,7 @@ void FrequencyResponse::iterate(World &world) { } double d_residual = density_residuals.max(); auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.X.norm2(); - auto rho_norms = norm2s_T(world, rho_omega); + auto rho_norms = madness::norm2s_T(world, rho_omega); std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), chi_norms.ptr(), bsh_relative_residualsX.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); @@ -193,17 +194,11 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { print("computing residuals: density residuals"); } if (world.rank() == 0) { print("computing polarizability:"); } - if (compute_y) { - polar = -2 * inner(Chi, PQ); - res_polar = -2 * inner(new_res.residual, PQ); - inner_to_json(world, "alpha", Chi, PQ, iter_function_data); - inner_to_json(world, "ralpha", new_res.residual, PQ, iter_function_data); - } else { - polar = -4 * response_space_inner(Chi.X, PQ.X); - res_polar = -2 * response_space_inner(new_res.residual.X, PQ.X); - inner_to_json(world, "alpha", Chi, PQ, iter_function_data); - inner_to_json(world, "ralpha", new_res.residual, PQ, iter_function_data); - } + polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); + res_polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); + + inner_to_json(world, "alpha", polar, iter_function_data); + inner_to_json(world, "ralpha", res_polar, iter_function_data); if (r_params.print_level() >= 20) { if (world.rank() == 0) { printf("\n--------Response Properties after %d-------------\n", @@ -256,13 +251,14 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - inner_to_json(world, "x_new", new_chi, new_chi, iter_function_data); + inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); - inner_to_json(world, "rx", new_res, new_res, iter_function_data); + inner_to_json(world, "rx", response_context.inner(new_res, new_res), iter_function_data); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); - inner_to_json(world, "x_update", new_chi, new_chi, iter_function_data); + inner_to_json(world, "x_update", response_context.inner(new_res, new_res), + iter_function_data); } if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index bc0a0cd8954..81b3672573c 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -10,46 +10,52 @@ class FrequencyResponse; -using RHS_Generator = std::function; +using RHS_Generator = std::function; response_space vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, const vector_real_function_3d &ground_orbitals); -X_space nuclear_generator(World& world, FrequencyResponse& calc); -X_space dipole_generator(World& world, FrequencyResponse& calc); +X_space nuclear_generator(World &world, FrequencyResponse &calc); +X_space dipole_generator(World &world, FrequencyResponse &calc); //using RHS_Generator = std::function; class FrequencyResponse : public ResponseBase { public: - FrequencyResponse(World& world, const CalcParams& params, double frequency, RHS_Generator rhs) - : ResponseBase(world, params), - omega{frequency}, - generator{std::move(rhs)}, - PQ{generator(world, *this)} {} - void initialize(World& world) override; + FrequencyResponse(World &world, const CalcParams ¶ms, double frequency, RHS_Generator rhs) + : ResponseBase(world, params), omega{frequency}, generator{std::move(rhs)}, + PQ{generator(world, *this)} { + if (omega == 0.0) { + response_context.set_strategy(std::unique_ptr()); + } else { + response_context.set_strategy(std::unique_ptr()); + } + } + void initialize(World &world) override; private: double omega; RHS_Generator generator; X_space PQ; - void iterate(World& world) override; - void check_k(World& world, double thresh, int k) override { + void iterate(World &world) override; + void check_k(World &world, double thresh, int k) override { ResponseBase::check_k(world, thresh, k); ::check_k(world, PQ, thresh, k); } - X_space bsh_update_response(World& world, X_space& theta_X, vector& bsh_x_ops, - vector& bsh_y_ops, QProjector& projector, - double& x_shifts); + X_space bsh_update_response(World &world, X_space &theta_X, vector &bsh_x_ops, + vector &bsh_y_ops, QProjector &projector, + double &x_shifts); static void frequency_to_json(json &j_mol_in, size_t iter, const Tensor &polar_ij, const Tensor &res_polar_ij); - static void compute_and_print_polarizability(World& world, X_space& Chi, X_space& pq, - std::string message); - void save(World& world, const std::string& name) override; - void load(World& world, const std::string& name) override; + static void compute_and_print_polarizability(World &world, X_space &Chi, X_space &pq, + std::string message); + void save(World &world, const std::string &name) override; + void load(World &world, const std::string &name) override; std::tuple update(World &world, X_space &chi, XCOperator &xc, - std::vector &bsh_x_ops, std::vector &bsh_y_ops, - QProjector &projector, double &x_shifts, double &omega_n, - response_solver &kain_x_space, size_t iteration, const double &max_rotation); + std::vector &bsh_x_ops, + std::vector &bsh_y_ops, + QProjector &projector, double &x_shifts, + double &omega_n, response_solver &kain_x_space, + size_t iteration, const double &max_rotation); X_space new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, response_function_solver &rf_solver); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index bdf4ad51403..db2f38452f8 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -410,7 +410,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, } else { E0X.X.truncate_rf(); } - inner_to_json(world, "E0", chi, E0X, iter_function_data); + inner_to_json(world, "E0", response_context.inner(chi, E0X), iter_function_data); if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } } if (r_params.print_level() >= 1) { @@ -429,7 +429,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); } - inner_to_json(world, "gamma_x", chi, gamma, iter_function_data); + inner_to_json(world, "gamma_x", response_context.inner(chi,gamma), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // Right here I can compute the polarizability before I try a KAIN UPDATE or step restriction @@ -437,7 +437,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, Theta_X = (V0X - E0X) + gamma; - inner_to_json(world, "theta_x", chi, Theta_X, iter_function_data); + inner_to_json(world, "theta_x", response_context.inner(chi,Theta_X), iter_function_data); world.gop.fence(); // Theta_X.truncate(); if (r_params.print_level() >= 1) { @@ -498,7 +498,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); - inner_to_json(world, "j1", chi_alpha, J, iter_function_data); + inner_to_json(world, "j1", response_context.inner(chi_alpha,J), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } @@ -516,12 +516,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - inner_to_json(world, "w1", chi_alpha, W, iter_function_data); + inner_to_json(world, "w1", response_context.inner(chi_alpha,W), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); - inner_to_json(world, "k1", chi_alpha, K, iter_function_data); + inner_to_json(world, "k1", response_context.inner(chi_alpha,K), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -642,7 +642,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } - inner_to_json(world, "j1", xy, J, iter_function_data); + inner_to_json(world, "j1", response_context.inner(xy,J), iter_function_data); if (xcf.hf_exchange_coefficient() != 1.0) { auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { @@ -656,7 +656,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - inner_to_json(world, "w1", xy, W, iter_function_data); + inner_to_json(world, "w1", response_context.inner(xy,W), iter_function_data); /* @@ -681,7 +681,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, xy, false); - inner_to_json(world, "k1", xy, K, iter_function_data); + inner_to_json(world, "k1", response_context.inner(xy,K), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -1008,7 +1008,7 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(ground_orbitals, X, compute_Y); - inner_to_json(world, "k0", X, K0, iter_function_data); + inner_to_json(world, "k0", response_context.inner(X, K0), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } @@ -1024,21 +1024,21 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< world.gop.fence(); V0 = to_X_space(vx); V0.truncate(); - inner_to_json(world, "v0_local", X, V0, iter_function_data); + inner_to_json(world, "v0_local", response_context.inner(X, V0), iter_function_data); V0 += -c_xc * K0; V0.truncate(); - inner_to_json(world, "v0", X, V0, iter_function_data); + inner_to_json(world, "v0", response_context.inner(X, V0), iter_function_data); } else { for (int b = 0; b < m; b++) { V0.X[b] = mul(world, v0, X.X[b], false); } V0.X.truncate_rf(); - inner_to_json(world, "v0_local", X, V0, iter_function_data); + inner_to_json(world, "v0_local", response_context.inner(X, V0), iter_function_data); world.gop.fence(); V0.X += -c_xc * K0.X; V0.Y = V0.X.copy(); V0.X.truncate_rf(); - inner_to_json(world, "v0", X, V0, iter_function_data); + inner_to_json(world, "v0", response_context.inner(X, V0), iter_function_data); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } if (r_params.print_level() >= 1) { @@ -2179,7 +2179,7 @@ void response_data::to_json(json &j) { long m = f.size(); long n = f[0].size(); - Tensor new_tensor(m , n); + Tensor new_tensor(m, n); long i = 0; for (const auto &ti: f) { std::copy(ti.ptr(), ti.ptr() + n, new_tensor.ptr() + (i * n)); @@ -2219,10 +2219,9 @@ response_data::response_data() : iter(0) { function_data.insert({"d", std::vector>(0)}); } -void inner_to_json(World &world, const std::string &name, const X_space &left, const X_space &right, + +void inner_to_json(World &world, const std::string &name, const Tensor &m_val, std::map> &data) { - auto m_val = inner(left, right); - world.gop.fence(); data[name] = m_val; } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 05e352cf50e..a350773a1a9 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -23,8 +23,61 @@ using namespace madness; -using json=nlohmann::json; +using json = nlohmann::json; +class inner_strategy { + +public: + virtual ~inner_strategy() = default; + [[nodiscard]] virtual Tensor compute_inner(const X_space &x, + const X_space &y) const = 0; +}; + +class Context { + +private: + std::unique_ptr strategy_; + +public: + explicit Context(std::unique_ptr &&strategy = {}) + : strategy_(std::move(strategy)) {} + void set_strategy(std::unique_ptr &&strategy) { + strategy_ = std::move(strategy); + } + void print_inner(const X_space &x, const X_space &y) const { + if (strategy_) { + std::cout << "Context: Computing inner using the strategy (not sure how it'll do it)\n"; + auto result = strategy_->compute_inner(x, y); + std::cout << result << "\n"; + } else { + std::cout << "Context: Strategy isn't set\n"; + } + } + + [[nodiscard]] Tensor inner(const X_space &x, const X_space &y) const { + if (strategy_) { + return strategy_->compute_inner(x, y); + } else { + throw madness::MadnessException("Inner product Stratgey isn't set", + "Need to set a strategy", 2, 455, "inner", + "ResponseBase.hpp"); + } + } +}; + +class full_inner_product : public inner_strategy { +public: + Tensor compute_inner(const X_space &x, const X_space &y) const override { + return inner(x, y); + } +}; + +class static_inner_product : public inner_strategy { +public: + Tensor compute_inner(const X_space &x, const X_space &y) const override { + return response_space_inner(x.X, y.X); + } +}; typedef std::vector> response_solver; typedef std::vector> @@ -101,6 +154,7 @@ class ResponseBase { XCfunctional xcf; real_function_3d mask; + Context response_context; std::shared_ptr potential_manager; // shared pointers to Operators @@ -209,7 +263,7 @@ class ResponseBase { void load_balance_chi(World &world); auto make_bsh_operators_response(World &world, double &shift, const double omega) const - -> vector; + -> vector; auto kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, @@ -224,7 +278,7 @@ class ResponseBase { const GroundStateCalculation &g_params); static auto orbital_load_balance(World &world, const gamma_orbitals &, double load_balance) - -> gamma_orbitals; + -> gamma_orbitals; auto compute_gamma_tda(World &world, const gamma_orbitals &density, const XCOperator &xc) const -> X_space; @@ -262,10 +316,11 @@ class ResponseBase { auto compute_response_potentials(World &world, const X_space &chi, XCOperator &xc, const std::string &calc_type) const - -> std::tuple; + -> std::tuple; // compute exchange |i> - auto exchangeHF(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) const -> vecfuncT { + auto exchangeHF(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) const + -> vecfuncT { World &world = ket[0].world(); auto n = bra.size(); auto nf = ket.size(); @@ -304,8 +359,7 @@ class ResponseBase { const X_space &right); void function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, - const Tensor &x_abs_norms, - const Tensor &rho_norms, + const Tensor &x_abs_norms, const Tensor &rho_norms, const Tensor &rho_res_norms); X_space compute_TX(World &world, const X_space &X, bool compute_Y) const; }; @@ -375,7 +429,7 @@ auto gram_schmidt(World &world, const response_space &f) -> response_space; /// \return auto transition_density(World &world, const vector_real_function_3d &orbitals, const response_space &x, const response_space &y) --> vector_real_function_3d; + -> vector_real_function_3d; auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals, const response_space &x) -> vector_real_function_3d; @@ -387,8 +441,8 @@ auto transform(World &world, const X_space &x, const Tensor &U) -> X_spa // result(i,j) = inner(a[i],b[j]).sum() auto expectation(World &world, const response_space &A, const response_space &B) -> Tensor; -void inner_to_json(World &world, const std::string &name, const X_space &left, - const X_space &right, std::map> &data); +void inner_to_json(World &world, const std::string &name, const Tensor &m_val, + std::map> &data); class ResponseTester { public: @@ -400,8 +454,7 @@ class ResponseTester { static X_space compute_gamma_full(World &world, ResponseBase *p, double thresh) { XCOperator xc = p->make_xc_operator(world); - X_space gamma = - p->compute_gamma_full(world, {p->Chi, p->ground_orbitals}, xc); + X_space gamma = p->compute_gamma_full(world, {p->Chi, p->ground_orbitals}, xc); return gamma; } @@ -419,4 +472,6 @@ class ResponseTester { } }; + + #endif// MADNESS_RESPONSEBASE_HPP From 2df25e392d77b5fd371ae2eb26d11a49eaaf2d56 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 1 Mar 2023 20:30:46 -0500 Subject: [PATCH 1060/1312] I need to make the ptrs of course --- src/apps/molresponse/FrequencyResponse.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 81b3672573c..db6531529ef 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -25,9 +25,9 @@ class FrequencyResponse : public ResponseBase { : ResponseBase(world, params), omega{frequency}, generator{std::move(rhs)}, PQ{generator(world, *this)} { if (omega == 0.0) { - response_context.set_strategy(std::unique_ptr()); + response_context.set_strategy(std::make_unique()); } else { - response_context.set_strategy(std::unique_ptr()); + response_context.set_strategy(std::make_unique()); } } void initialize(World &world) override; From 04d85583caa5b6a3f31dcdb3054574aa246aeb8b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 2 Mar 2023 12:16:40 -0500 Subject: [PATCH 1061/1312] make sure I get inner_to_json in the right spots --- src/apps/molresponse/FrequencyResponse.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 3c04c4b728d..a8a1d7f1b84 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -130,15 +130,15 @@ void FrequencyResponse::iterate(World &world) { print("thresh: ", FunctionDefaults<3>::get_thresh()); print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); - print("Chi_X: ", chi_norms); + print("||X||: ", chi_norms); print("max rotation: ", max_rotation); - print("d_residuals : ", density_residuals); - print("bsh_residuals : ", bsh_residualsX); - print("d_residual_max : ", d_residual); + print("density changes : ", density_residuals); + print("max density change : ", d_residual); print("density target : ", density_target); - print("d_residual_max target : ", density_target); - print("bsh_residual_max : ", max_bsh); - print("bsh_relative_residual_max : ", max_relative_bsh); + print("bsh residuals : ", bsh_residualsX); + print("relative bsh residuals : ", bsh_relative_residualsX); + print("max bsh residual : ", max_bsh); + print("max relative bsh residual : ", max_relative_bsh); print("bsh relative residual target : ", bsh_abs_target); } } @@ -162,6 +162,7 @@ void FrequencyResponse::iterate(World &world) { break; } } + inner_to_json(world, "x", response_context.inner(Chi, Chi), iter_function_data); auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -198,7 +199,7 @@ void FrequencyResponse::iterate(World &world) { res_polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); inner_to_json(world, "alpha", polar, iter_function_data); - inner_to_json(world, "ralpha", res_polar, iter_function_data); + inner_to_json(world, "r_alpha", res_polar, iter_function_data); if (r_params.print_level() >= 20) { if (world.rank() == 0) { printf("\n--------Response Properties after %d-------------\n", @@ -257,9 +258,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); - inner_to_json(world, "x_update", response_context.inner(new_res, new_res), - iter_function_data); } + inner_to_json(world, "x_update", response_context.inner(new_chi, new_chi), iter_function_data); if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); From 9433920dad7690bd41eb7e3fe1ba5163cd58ecd9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 2 Mar 2023 12:48:15 -0500 Subject: [PATCH 1062/1312] some clean up --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index a8a1d7f1b84..85ce2479b74 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -234,7 +234,7 @@ void FrequencyResponse::iterate(World &world) { print(" Final density residuals:"); print(density_residuals); } - compute_and_print_polarizability(world, Chi, PQ, "Converged"); +//compute_and_print_polarizability(world, Chi, PQ, "Converged"); } auto FrequencyResponse::update(World &world, X_space &chi, XCOperator &xc, From 141ec5e5935ce3ae090918bf025ad74b414dac7b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 2 Mar 2023 12:51:35 -0500 Subject: [PATCH 1063/1312] Tighten up convergence --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 85ce2479b74..ac21806bcf3 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5.0), molecule.natom()); - const double a_pow{0.655}; - const double b_pow{0.519}; + const double a_pow{0.50167}; + const double b_pow{-0.99330}; // Last attempt 1.035 2.121 const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b From ae8187780b6abf3260462dabdc9a930b9feafb4b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 2 Mar 2023 15:14:28 -0500 Subject: [PATCH 1064/1312] different exchange --- src/apps/molresponse/ResponseBase.cpp | 20 +++++++++++--------- src/apps/molresponse/global_functions.cc | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index db2f38452f8..f3223797bee 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -429,7 +429,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); } - inner_to_json(world, "gamma_x", response_context.inner(chi,gamma), iter_function_data); + inner_to_json(world, "gamma_x", response_context.inner(chi, gamma), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // Right here I can compute the polarizability before I try a KAIN UPDATE or step restriction @@ -437,7 +437,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, Theta_X = (V0X - E0X) + gamma; - inner_to_json(world, "theta_x", response_context.inner(chi,Theta_X), iter_function_data); + inner_to_json(world, "theta_x", response_context.inner(chi, Theta_X), iter_function_data); world.gop.fence(); // Theta_X.truncate(); if (r_params.print_level() >= 1) { @@ -498,7 +498,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); - inner_to_json(world, "j1", response_context.inner(chi_alpha,J), iter_function_data); + inner_to_json(world, "j1", response_context.inner(chi_alpha, J), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } @@ -516,12 +516,14 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - inner_to_json(world, "w1", response_context.inner(chi_alpha,W), iter_function_data); + inner_to_json(world, "w1", response_context.inner(chi_alpha, W), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto K = response_exchange_multiworld(phi0, chi_alpha, true); + //auto K = response_exchange_multiworld(phi0, chi_alpha, true); + auto K = response_exchange(phi0, chi_alpha, true); - inner_to_json(world, "k1", response_context.inner(chi_alpha,K), iter_function_data); + + inner_to_json(world, "k1", response_context.inner(chi_alpha, K), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } @@ -642,7 +644,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } - inner_to_json(world, "j1", response_context.inner(xy,J), iter_function_data); + inner_to_json(world, "j1", response_context.inner(xy, J), iter_function_data); if (xcf.hf_exchange_coefficient() != 1.0) { auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { @@ -656,7 +658,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - inner_to_json(world, "w1", response_context.inner(xy,W), iter_function_data); + inner_to_json(world, "w1", response_context.inner(xy, W), iter_function_data); /* @@ -681,7 +683,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, xy, false); - inner_to_json(world, "k1", response_context.inner(xy,K), iter_function_data); + inner_to_json(world, "k1", response_context.inner(xy, K), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 2067a942c5a..937ee1c2818 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -301,7 +301,7 @@ auto make_k(const vecfuncT &ket, const vecfuncT &bra) { const double lo = 1.e-10; Exchange k{}; k.set_parameters(bra, ket, lo); - k.set_algorithm(k.large_memory); + k.set_algorithm(k.small_memory); return k; }; /** From eeea2f6b7a062b55171b61f2550dc3e8cadf74f7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 2 Mar 2023 16:33:20 -0500 Subject: [PATCH 1065/1312] multiworld efficient --- src/apps/molresponse/ResponseBase.cpp | 4 ++-- src/apps/molresponse/global_functions.cc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f3223797bee..c202062f6ca 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -519,8 +519,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit inner_to_json(world, "w1", response_context.inner(chi_alpha, W), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - //auto K = response_exchange_multiworld(phi0, chi_alpha, true); - auto K = response_exchange(phi0, chi_alpha, true); + auto K = response_exchange_multiworld(phi0, chi_alpha, true); + //auto K = response_exchange(phi0, chi_alpha, true); inner_to_json(world, "k1", response_context.inner(chi_alpha, K), iter_function_data); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 937ee1c2818..85850fd98c5 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -301,7 +301,7 @@ auto make_k(const vecfuncT &ket, const vecfuncT &bra) { const double lo = 1.e-10; Exchange k{}; k.set_parameters(bra, ket, lo); - k.set_algorithm(k.small_memory); + k.set_algorithm(k.multiworld_efficient); return k; }; /** From 0fde00a4e176157fcf57b57f5f940c2a20680799 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 2 Mar 2023 17:18:29 -0500 Subject: [PATCH 1066/1312] remove projecting gamma for a test --- src/apps/molresponse/ResponseBase.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c202062f6ca..e570ca454d5 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -312,7 +312,6 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu b++; } - } else { density = transition_densityTDA(world, ground_orbitals, chi.X); } @@ -429,6 +428,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); } + inner_to_json(world, "gamma_x", response_context.inner(chi, gamma), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -544,12 +544,14 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + /* QProjector projector(world, phi0); for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); gamma.Y[i] = projector(gamma.Y[i]); } gamma.truncate(); + */ if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } From 01ebf998567a1a03e228c5a3e38a601fbffb0a0c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 2 Mar 2023 17:19:39 -0500 Subject: [PATCH 1067/1312] remove projecting gamma for a test --- src/apps/molresponse/ResponseBase.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index e570ca454d5..03164b8d232 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -716,9 +716,12 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + /* QProjector projector(world, phi0); for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } + */ gamma.Y = gamma.X.copy(); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } From 71bab35643a969ff1cd54d40434732b6e38e8b23 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 2 Mar 2023 18:08:28 -0500 Subject: [PATCH 1068/1312] do not truncate nearly as much --- src/apps/molresponse/ResponseBase.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 03164b8d232..ccf582924a6 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -300,8 +300,10 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto r_phi0 = to_response_vector(ground_orbitals); if (world.rank() == 0) { print("make density: to response vector"); } int b = 0; + auto x = to_response_matrix(chi); + auto phiphi = to_response_vector(ground_orbitals); for (auto &rho_b: density) { - rho_b = dot(world, r_matrix[b], r_phi0); + rho_b = dot(world, x[b], phiphi); b++; } @@ -640,7 +642,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm J.X[b++] = mul(world, temp_J, phi0); } //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); - J.X.truncate_rf(); + //J.X.truncate_rf(); J.Y = J.X.copy(); if (r_params.print_level() >= 1) { @@ -712,7 +714,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } - gamma.truncate(); // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -742,7 +743,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm iter_timing); } // Done - gamma.truncate(); // gamma.truncate(); return gamma; // Get sizes From 00388e85f03e8cfbb63d2f403bb6b5fe67a9ca02 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 5 Mar 2023 20:37:58 -0500 Subject: [PATCH 1069/1312] add projection back in --- src/apps/molresponse/FrequencyResponse.cpp | 8 ++++---- src/apps/molresponse/ResponseBase.cpp | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ac21806bcf3..53750ed95fb 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -88,11 +88,11 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-7) { max_rotation = .01; } - functionT mask; - mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); - PQ = generator(world, *this); + // functionT mask; + // mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); //PQ = PQ * mask; - //PQ.truncate(); + PQ = generator(world, *this); + PQ.truncate(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); iter_function_data.clear(); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ccf582924a6..48b71f6186b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -546,14 +546,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* QProjector projector(world, phi0); for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); gamma.Y[i] = projector(gamma.Y[i]); } gamma.truncate(); - */ if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -717,10 +715,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* QProjector projector(world, phi0); for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } - */ gamma.Y = gamma.X.copy(); if (r_params.print_level() >= 1) { From 2392d89e8b714d77bdbe27a971c511e4728b0357 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 5 Mar 2023 20:48:02 -0500 Subject: [PATCH 1070/1312] switch back to 2 protocols --- src/apps/molresponse/testing/runners.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index dfbc08472bf..b94608d69f7 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -367,10 +367,10 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("l", 200); if (precision == "low") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { - param1.set_user_defined_value>("protocol", {1e-6, 1e-7, 1e-8}); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); param1.set_user_defined_value("dconv", 1e-6); } else { param1.set_user_defined_value>("protocol", {1e-8}); @@ -508,17 +508,17 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-6, 1e-7, 1e-8}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); r_params.set_user_defined_value("dconv", 1e-5); } else if (precision == "low") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); } else { r_params.set_user_defined_value>("protocol", {1e-9}); r_params.set_user_defined_value("dconv", 1e-6); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(20)); + r_params.set_user_defined_value("maxiter", size_t(25)); r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); From f34e415314b563ca86715389bca1c7da30fdd425 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 5 Mar 2023 20:55:05 -0500 Subject: [PATCH 1071/1312] Tighter convergence conditions --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 53750ed95fb..079f3ecb29d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5.0), molecule.natom()); - const double a_pow{0.50167}; - const double b_pow{-0.99330}; + const double a_pow{0.65205}; + const double b_pow{-0.39180}; // Last attempt 1.035 2.121 const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b From 96c78261377a1e12b299ef70541c4fe87f697606 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Mar 2023 16:09:14 -0500 Subject: [PATCH 1072/1312] adjust inner data --- src/apps/molresponse/FrequencyResponse.cpp | 12 +++--- src/apps/molresponse/ResponseBase.cpp | 44 +++++++++++++--------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 079f3ecb29d..28e72a49d66 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -88,8 +88,8 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-7) { max_rotation = .01; } - // functionT mask; - // mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); + // functionT mask; + // mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); //PQ = PQ * mask; PQ = generator(world, *this); PQ.truncate(); @@ -192,11 +192,13 @@ void FrequencyResponse::iterate(World &world) { auto density_change = madness::sub(world, rho_omega, rho_omega_old, true); density_residuals = norm2s_T(world, density_change); iter_function_data["d"] = density_residuals; + auto dnorm = norm2s_T(world, rho_omega); + iter_function_data["r_d"] = dnorm; if (world.rank() == 0) { print("computing residuals: density residuals"); } if (world.rank() == 0) { print("computing polarizability:"); } polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); - res_polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); + res_polar = ((compute_y) ? -2 : -4) * response_context.inner(new_res.residual, PQ); inner_to_json(world, "alpha", polar, iter_function_data); inner_to_json(world, "r_alpha", res_polar, iter_function_data); @@ -234,7 +236,7 @@ void FrequencyResponse::iterate(World &world) { print(" Final density residuals:"); print(density_residuals); } -//compute_and_print_polarizability(world, Chi, PQ, "Converged"); + //compute_and_print_polarizability(world, Chi, PQ, "Converged"); } auto FrequencyResponse::update(World &world, X_space &chi, XCOperator &xc, @@ -254,7 +256,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); - inner_to_json(world, "rx", response_context.inner(new_res, new_res), iter_function_data); + inner_to_json(world, "r_x", response_context.inner(new_res, new_res), iter_function_data); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 48b71f6186b..409dff86ba0 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -518,7 +518,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - inner_to_json(world, "w1", response_context.inner(chi_alpha, W), iter_function_data); + inner_to_json(world, "v1_xc", response_context.inner(chi_alpha, W), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); @@ -640,7 +640,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm J.X[b++] = mul(world, temp_J, phi0); } //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); - //J.X.truncate_rf(); + J.X.truncate_rf(); J.Y = J.X.copy(); if (r_params.print_level() >= 1) { @@ -660,7 +660,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } } - inner_to_json(world, "w1", response_context.inner(xy, W), iter_function_data); + inner_to_json(world, "v1_xc", response_context.inner(xy, W), iter_function_data); /* @@ -709,6 +709,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // update gamma functions gamma = 2 * J - K * xcf.hf_exchange_coefficient() + W; + inner_to_json(world, "gamma_x_beforeQ", response_context.inner(xy, gamma), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } @@ -739,7 +740,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm iter_timing); } // Done - // gamma.truncate(); + gamma.truncate(); return gamma; // Get sizes } @@ -1011,7 +1012,13 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(ground_orbitals, X, compute_Y); - inner_to_json(world, "k0", response_context.inner(X, K0), iter_function_data); + if (r_params.print_level() >= 15) { + + inner_to_json(world, "v0_nuc", response_context.inner(X, v_nuc * X), iter_function_data); + inner_to_json(world, "j0", response_context.inner(X, v_j0 * X), iter_function_data); + inner_to_json(world, "k0", response_context.inner(X, K0), iter_function_data); + inner_to_json(world, "v0_xc", response_context.inner(X, v_xc * X), iter_function_data); + } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } @@ -1019,29 +1026,25 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< auto c_xc = xcf.hf_exchange_coefficient(); real_function_3d v0 = v_j0 + v_nuc + (1 - c_xc) * v_xc; double safety = 0.1; - double vtol = safety * FunctionDefaults<3>::get_thresh(); + double v_tol = safety * FunctionDefaults<3>::get_thresh(); if (compute_Y) { auto x = to_response_matrix(X); auto vx = create_response_matrix(X.num_states(), X.num_orbitals()); - for (int b = 0; b < m; b++) { vx[b] = mul(world, v0, x[b], false); } + for (int b = 0; b < m; b++) { vx[b] = mul_sparse(world, v0, x[b], v_tol, false); } world.gop.fence(); V0 = to_X_space(vx); V0.truncate(); - inner_to_json(world, "v0_local", response_context.inner(X, V0), iter_function_data); V0 += -c_xc * K0; V0.truncate(); - inner_to_json(world, "v0", response_context.inner(X, V0), iter_function_data); + inner_to_json(world, "V0", response_context.inner(X, V0), iter_function_data); } else { - for (int b = 0; b < m; b++) { V0.X[b] = mul(world, v0, X.X[b], false); } + for (int b = 0; b < m; b++) { V0.X[b] = mul_sparse(world, v0, X.X[b], v_tol, false); } V0.X.truncate_rf(); - inner_to_json(world, "v0_local", response_context.inner(X, V0), iter_function_data); - world.gop.fence(); - V0.X += -c_xc * K0.X; V0.Y = V0.X.copy(); V0.X.truncate_rf(); - inner_to_json(world, "v0", response_context.inner(X, V0), iter_function_data); + inner_to_json(world, "V0", response_context.inner(X, V0), iter_function_data); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } if (r_params.print_level() >= 1) { @@ -2198,28 +2201,33 @@ void response_data::to_json(json &j) { response_data::response_data() : iter(0) { - function_data.insert({"v0_local", std::vector>(0)}); - function_data.insert({"k0", std::vector>(0)}); function_data.insert({"v0", std::vector>(0)}); + function_data.insert({"v0_nuc", std::vector>(0)}); function_data.insert({"E0", std::vector>(0)}); + function_data.insert({"j0", std::vector>(0)}); + function_data.insert({"k0", std::vector>(0)}); + function_data.insert({"v0_xc", std::vector>(0)}); function_data.insert({"j1", std::vector>(0)}); function_data.insert({"k1", std::vector>(0)}); - function_data.insert({"w1", std::vector>(0)}); + function_data.insert({"v1_xc", std::vector>(0)}); + function_data.insert({"gamma_x", std::vector>(0)}); + function_data.insert({"gamma_x_beforeQ", std::vector>(0)}); function_data.insert({"theta_x", std::vector>(0)}); function_data.insert({"x_new", std::vector>(0)}); function_data.insert({"x_update", std::vector>(0)}); function_data.insert({"x", std::vector>(0)}); - function_data.insert({"rx", std::vector>(0)}); + function_data.insert({"r_x", std::vector>(0)}); function_data.insert({"alpha", std::vector>(0)}); function_data.insert({"r_alpha", std::vector>(0)}); function_data.insert({"d", std::vector>(0)}); + function_data.insert({"r_d", std::vector>(0)}); } From 37398b6fb09dd8260b9d971ac527b2d1d86c4a0f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Mar 2023 18:03:25 -0500 Subject: [PATCH 1073/1312] loosen criteria --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- src/apps/molresponse/ResponseBase.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 28e72a49d66..ed83f759d61 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5.0), molecule.natom()); - const double a_pow{0.65205}; - const double b_pow{-0.39180}; + const double a_pow{0.602}; + const double b_pow{0.314}; // Last attempt 1.035 2.121 const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 409dff86ba0..6990218a167 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -621,6 +621,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto rho = make_density(world, xy); + //auto rho = transition_density(world, phi0, xy.X, xy.X); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute density J[omega]"); } @@ -1432,6 +1433,7 @@ void ResponseBase::solve(World &world) { protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... this->iterate(world); + } // At this point we should know if calc converged maybe add a flag to response.json which states if it has converged_to_json(j_molresponse); From 76540b4824138ddb00e1fb70edb4e4dfe230cec6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 6 Mar 2023 18:04:54 -0500 Subject: [PATCH 1074/1312] Use the right words --- src/apps/molresponse/FrequencyResponse.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ed83f759d61..18deddb6c22 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -137,13 +137,13 @@ void FrequencyResponse::iterate(World &world) { print("density target : ", density_target); print("bsh residuals : ", bsh_residualsX); print("relative bsh residuals : ", bsh_relative_residualsX); - print("max bsh residual : ", max_bsh); print("max relative bsh residual : ", max_relative_bsh); - print("bsh relative residual target : ", bsh_abs_target); + print("max bsh residual : ", max_bsh); + print("bsh residual target : ", bsh_abs_target); } } if ((d_residual < density_target) and - ((max_relative_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { + ((max_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { converged = true; } if (converged || iter == r_params.maxiter()) { From 130d8431a0f52c5f99a28fe6f159017030a6999f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 7 Mar 2023 09:47:10 -0500 Subject: [PATCH 1075/1312] tighten high-precision --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index b94608d69f7..bd14b4f28d0 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -509,7 +509,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param if (world.rank() == 0) { if (precision == "high") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - r_params.set_user_defined_value("dconv", 1e-5); + r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); From 9471ee25124d4b7fccf7856c662cfecf21165b49 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 7 Mar 2023 10:14:34 -0500 Subject: [PATCH 1076/1312] project at every step of the way --- src/apps/molresponse/ResponseBase.cpp | 32 ++++++++++----------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6990218a167..b5de2311cbd 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -460,6 +460,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto [chi_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); + QProjector projector(world, phi0); + size_t num_states = chi_alpha.num_states(); size_t num_orbitals = chi_alpha.num_orbitals(); @@ -494,9 +496,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto temp_J = apply(*shared_coulomb_operator, rho_b_i); J.X[b++] = mul(world, temp_J, phi0); } - J.X.truncate_rf(); + std::transform(J.X.begin(), J.X.end(), J.X.begin(),[&](auto &jxi) { return projector(jxi); }); world.gop.fence(); J.Y = J.X.copy(); + + if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); @@ -513,6 +517,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); + std::transform(W.X.begin(), W.X.end(), W.X.begin(),[&](auto &wxi) { return projector(jxi); }); W.Y = W.X.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); @@ -522,6 +527,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); + std::transform(K.X.begin(), K.X.end(), K.X.begin(),[&](auto &kxi) { return projector(kxi); }); + std::transform(K.Y.begin(), K.Y.end(), K.Y.begin(),[&](auto &kyi) { return projector(kyi); }); //auto K = response_exchange(phi0, chi_alpha, true); @@ -546,12 +553,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - QProjector projector(world, phi0); - for (size_t i = 0; i < num_states; i++) { - gamma.X[i] = projector(gamma.X[i]); - gamma.Y[i] = projector(gamma.Y[i]); - } - gamma.truncate(); + + std::transform(gamma.X.begin(), gamma.X.end(), gamma.X.begin(),[&](auto &gxi) { return projector(gxi); }); + std::transform(gamma.Y.begin(), gamma.Y.end(), gamma.Y.begin(),[&](auto &gyi) { return projector(gyi); }); + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); } @@ -582,7 +587,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gammaOrbitals, const XCOperator &xc) const -> X_space { - // X contains the response vector that makes up the response gammaOrbitals at a // given order @@ -748,7 +752,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density, const XCOperator &xc) const -> X_space { - auto [d_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); std::shared_ptr>> oldpmap = FunctionDefaults<3>::get_pmap(); size_t num_states = d_alpha.num_states(); @@ -1346,7 +1349,6 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, void PlotGroundDensityVTK(World &world, const ResponseBase &calc) { - auto [ground_calc, molecule, r_params] = calc.get_parameter(); auto ground_orbitals = calc.get_orbitals(); @@ -1433,7 +1435,6 @@ void ResponseBase::solve(World &world) { protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... this->iterate(world); - } // At this point we should know if calc converged maybe add a flag to response.json which states if it has converged_to_json(j_molresponse); @@ -1664,7 +1665,6 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct */ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &gammaOrbitals, const double load_balance) -> gamma_orbitals { - auto X = std::get<0>(gammaOrbitals); auto psi0 = std::get<1>(gammaOrbitals); @@ -1805,7 +1805,6 @@ void ResponseBase::print_inner(World &world, const std::string &name, const X_sp auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals, const response_space &x) -> vector_real_function_3d { - // Get sizes size_t m = x.size(); @@ -1894,7 +1893,6 @@ auto expectation(World &world, const response_space &A, const response_space &B) } void print_norms(World &world, const response_space &f) { - print(f[0].size()); Tensor norms(f.size() * f[0].size()); // Calc the norms @@ -2051,7 +2049,6 @@ auto make_xyz_functions(World &world) -> vector_real_function_3d { // Here i should print some information about the calculation we are // about to do response_timing::response_timing() : iter(0) { - wall_time_data.insert({"iter_total", std::vector(0)}); wall_time_data.insert({"update", std::vector(0)}); wall_time_data.insert({"compute_V0X", std::vector(0)}); @@ -2118,7 +2115,6 @@ response_timing::response_timing() : iter(0) { } void response_timing::print_data() { - for (const auto &[key, value]: wall_time_data) { print(key, " : ", value); } for (const auto &[key, value]: cpu_time_data) { print(key, " : ", value); } } @@ -2145,7 +2141,6 @@ void response_timing::add_data(std::map> } void response_timing::to_json(json &j) { - //::print("FREQUENCY TIME DATA TO JSON"); j["time_data"] = json(); @@ -2174,7 +2169,6 @@ void response_data::add_data(std::map> values) { } void response_data::to_json(json &j) { - //::print("FREQUENCY TIME DATA TO JSON"); j["response_data"] = json(); @@ -2202,7 +2196,6 @@ void response_data::to_json(json &j) { } response_data::response_data() : iter(0) { - function_data.insert({"v0", std::vector>(0)}); function_data.insert({"v0_nuc", std::vector>(0)}); function_data.insert({"E0", std::vector>(0)}); @@ -2235,6 +2228,5 @@ response_data::response_data() : iter(0) { void inner_to_json(World &world, const std::string &name, const Tensor &m_val, std::map> &data) { - data[name] = m_val; } From be03796c1242bf28ab3dfe77f3aaba1ee2186919 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 7 Mar 2023 10:14:58 -0500 Subject: [PATCH 1077/1312] project at every step of the way --- src/apps/molresponse/ResponseBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index b5de2311cbd..130cf4f6a6b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -517,7 +517,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); - std::transform(W.X.begin(), W.X.end(), W.X.begin(),[&](auto &wxi) { return projector(jxi); }); + std::transform(W.X.begin(), W.X.end(), W.X.begin(),[&](auto &wxi) { return projector(wxi); }); W.Y = W.X.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); From ac061faac7e3814c83bd444fe5796a65b6e69bdb Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 7 Mar 2023 10:37:39 -0500 Subject: [PATCH 1078/1312] fix the printing of d and r_d --- src/apps/molresponse/FrequencyResponse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 18deddb6c22..bddc61ca9a5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -191,9 +191,9 @@ void FrequencyResponse::iterate(World &world) { auto density_change = madness::sub(world, rho_omega, rho_omega_old, true); density_residuals = norm2s_T(world, density_change); - iter_function_data["d"] = density_residuals; + iter_function_data["r_d"] = density_residuals; auto dnorm = norm2s_T(world, rho_omega); - iter_function_data["r_d"] = dnorm; + iter_function_data["d"] = dnorm; if (world.rank() == 0) { print("computing residuals: density residuals"); } if (world.rank() == 0) { print("computing polarizability:"); } From d96c91cfe0652d33aa3e39dcb51fc047b8a82a47 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 7 Mar 2023 11:39:49 -0500 Subject: [PATCH 1079/1312] truncate ground density --- src/apps/molresponse/ResponseBase.cpp | 1 + src/apps/molresponse/ResponseBase.hpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 130cf4f6a6b..de6676c1d58 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -81,6 +81,7 @@ void ResponseBase::check_k(World &world, double thresh, int k) { // Now that ground orbitals have correct k lets make the ground density // again ground_density = make_ground_density(world); + ground_density.truncate(FunctionDefaults<3>::get_thresh()); if (world.rank() == 0) { print("check k: make ground density"); } // Ground state orbitals changed, clear old hamiltonian redo = true; diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index a350773a1a9..4ed29908c7f 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -235,7 +235,9 @@ class ResponseBase { // GaussianConvolution1DCache::map.clear();//(TODO:molresponse-What // Create the masking function mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); + ground_density = make_ground_density(world); + ground_density.truncate(FunctionDefaults<3>::get_thresh()); // Basic print if (world.rank() == 0) { print("\nSolving NDIM=", 3, " with thresh", thresh, " k", From 23321f1653d15662083dc48987b56c86452d0466 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 7 Mar 2023 12:34:13 -0500 Subject: [PATCH 1080/1312] truncate response density --- src/apps/molresponse/ResponseBase.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index de6676c1d58..205edc07836 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -295,6 +295,7 @@ auto ResponseBase::make_xc_operator(World &world) const -> XCOperator auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfuncT { auto density = vector_real_function_3d(chi.num_states()); auto calc_type = r_params.calc_type(); + auto thresh=FunctionDefaults<3>::get_thresh(); if (calc_type == "full") { auto r_matrix = to_response_matrix(chi); if (world.rank() == 0) { print("make density: to response matrix"); } @@ -304,7 +305,9 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto x = to_response_matrix(chi); auto phiphi = to_response_vector(ground_orbitals); for (auto &rho_b: density) { - rho_b = dot(world, x[b], phiphi); + auto x_phi= mul(world,x[b],phiphi,false); + world.gop.fence(); + rho_b =sum(world,x_phi); b++; } @@ -319,7 +322,7 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu density = transition_densityTDA(world, ground_orbitals, chi.X); } if (world.rank() == 0) { print("make density: made density"); } - truncate(world, density); + truncate(world, density,thresh); if (world.rank() == 0) { print("make density: truncate"); } return density; } From a6dd95f6188c0c174b9478c742daf39dcc61ff33 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 7 Mar 2023 12:48:17 -0500 Subject: [PATCH 1081/1312] project each gamma static piece --- src/apps/molresponse/ResponseBase.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 205edc07836..8393ef55ff1 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -550,7 +550,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit gamma += (1.0 - c_xc) * W; if (world.rank() == 0) { print("gamma: += W"); } } - gamma.truncate(); //gamma.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma add", "gamma_truncate_add", iter_timing); @@ -595,8 +594,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // given order auto old_pmap = FunctionDefaults<3>::get_pmap(); - auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); + QProjector projector(world, phi0); size_t num_states = xy.num_states(); @@ -649,7 +648,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm J.X[b++] = mul(world, temp_J, phi0); } //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); - J.X.truncate_rf(); + std::transform(J.X.begin(), J.X.end(), J.X.begin(),[&](auto &jxi) { return projector(jxi); }); J.Y = J.X.copy(); if (r_params.print_level() >= 1) { @@ -664,6 +663,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); + std::transform(W.X.begin(), W.X.end(), W.X.begin(),[&](auto &wxi) { return projector(wxi); }); W.Y = W.X.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); @@ -694,6 +694,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, xy, false); + std::transform(K.X.begin(), K.X.end(), K.X.begin(),[&](auto &kxi) { return projector(kxi); }); inner_to_json(world, "k1", response_context.inner(xy, K), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -725,8 +726,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - QProjector projector(world, phi0); - for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } + //for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } + std::transform(gamma.X.begin(), gamma.X.end(), gamma.X.begin(),[&](auto &gxi) { return projector(gxi); }); gamma.Y = gamma.X.copy(); if (r_params.print_level() >= 1) { From 32ffc1af64e1543b3d63ef51a391d227816480f9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 9 Mar 2023 11:34:00 -0500 Subject: [PATCH 1082/1312] increase kain to 10 to see if we see the same convergence pattern --- src/apps/molresponse/ResponseBase.cpp | 8 ++++---- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 8393ef55ff1..5a7943aa8a3 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -314,7 +314,10 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu } else if (calc_type == "static") { int b = 0; for (auto &rho_b: density) { - rho_b = 2 * dot(world, chi.X[b], ground_orbitals); + auto xb=chi.X[b]; + auto x_phi= mul(world,xb,ground_orbitals,false); + world.gop.fence(); + rho_b =2*sum(world,x_phi); b++; } @@ -590,8 +593,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gammaOrbitals, const XCOperator &xc) const -> X_space { - // X contains the response vector that makes up the response gammaOrbitals at a - // given order auto old_pmap = FunctionDefaults<3>::get_pmap(); auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); @@ -750,7 +751,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm iter_timing); } // Done - gamma.truncate(); return gamma; // Get sizes } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index bd14b4f28d0..1c81f7c82f9 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -519,7 +519,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param } //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(25)); - r_params.set_user_defined_value("maxsub", size_t(5)); + r_params.set_user_defined_value("maxsub", size_t(10)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); From c8607c9f3854c4b1ca2aaa934054bf5b934c9f6a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 13 Mar 2023 21:32:48 -0400 Subject: [PATCH 1083/1312] Create a testing script for development --- src/apps/molresponse/FrequencyResponse.hpp | 3 +- src/apps/molresponse/ResponseBase.hpp | 3 +- src/apps/molresponse/testing/CMakeLists.txt | 1 + .../molresponse/testing/database_testing.cpp | 194 ------------------ .../molresponse/testing/x_space_testing.cpp | 65 ++++++ src/apps/molresponse/x_space.h | 1 + 6 files changed, 71 insertions(+), 196 deletions(-) delete mode 100644 src/apps/molresponse/testing/database_testing.cpp create mode 100644 src/apps/molresponse/testing/x_space_testing.cpp diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index db6531529ef..dcc5428c1a9 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -32,6 +32,8 @@ class FrequencyResponse : public ResponseBase { } void initialize(World &world) override; + void load(World &world, const std::string &name) override; + private: double omega; RHS_Generator generator; @@ -49,7 +51,6 @@ class FrequencyResponse : public ResponseBase { static void compute_and_print_polarizability(World &world, X_space &Chi, X_space &pq, std::string message); void save(World &world, const std::string &name) override; - void load(World &world, const std::string &name) override; std::tuple update(World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, std::vector &bsh_y_ops, diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 4ed29908c7f..f04b9324ef4 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -136,6 +136,8 @@ class ResponseBase { auto get_orbitals() const -> vector_real_function_3d { return ground_orbitals; } + auto get_chi() const->X_space{return Chi;} ; + void output_json(); json j_molresponse{}; @@ -475,5 +477,4 @@ class ResponseTester { }; - #endif// MADNESS_RESPONSEBASE_HPP diff --git a/src/apps/molresponse/testing/CMakeLists.txt b/src/apps/molresponse/testing/CMakeLists.txt index d1c6b0f3469..9d9e2e05def 100644 --- a/src/apps/molresponse/testing/CMakeLists.txt +++ b/src/apps/molresponse/testing/CMakeLists.txt @@ -27,3 +27,4 @@ add_mad_executable(test-dev "test_development.cpp" "MADall_response;MADchem") #a dd_mad_executable(database-test "database_testing.cpp" "MADall_response;MADchem") # add_mad_executable(mad-excited-symmetry-adapted "mad-excited-symmetry-adapted.cpp" "MADall_response;MADchem") add_mad_executable(test_schema_json "madness_catch_main.cc;qcschema_json_testing.cpp" "MADresponse;MADchem" ,) +add_mad_executable(test_x_space "x_space_testing.cpp" "MADresponse;MADchem" ,) diff --git a/src/apps/molresponse/testing/database_testing.cpp b/src/apps/molresponse/testing/database_testing.cpp deleted file mode 100644 index 0ce2cb78d1e..00000000000 --- a/src/apps/molresponse/testing/database_testing.cpp +++ /dev/null @@ -1,194 +0,0 @@ -// -// Created by adrianhurtado on 1/1/22. -// -#define CATCH_CONFIG_RUNNER - -#include "ExcitedResponse.hpp" -#include -#include "response_parameters.h" -#include "FrequencyResponse.hpp" -#include "ResponseExceptions.hpp" -#include "TDDFT.h" -#include "madness/chem/SCF.h" -#include "madness/external/catch/catch.hpp" -#include "madness/tensor/tensor_json.hpp" -#include "madness/world/worldmem.h" -#include "response_functions.h" -#include "runners.hpp" -#include "string" -#include "timer.h" -#include "write_test_input.h" -#include "x_space.h" - - -using path = std::filesystem::path; - -int main(int argc, char *argv[]) { - World &world = madness::initialize(argc, argv); - int result = 0; - world.gop.fence(); - startup(world, argc, argv); - { result = Catch::Session().run(argc, argv); } - - return result; - - // print_meminfo(world.rank(), "startup"); - // std::cout.precision(6); - // print_stats(world); -} - -TEST_CASE("Run ground and excited-state") { - // Set up the run directories - using namespace madness; - - World &world = World::get_default(); - - std::cout.precision(6); - - auto root = std::filesystem::current_path();//="/"+molecule_name; - auto molecule_path = root; - molecule_path += "/molecules"; - - const std::string molecule_name = "Be"; - const std::string xc = "lda"; - const std::string op = "excited-state"; - // A calculation is defined by a molecule, functional, and operator - // xc include (hf/lda) - // operators include (excited-state) - json response_keyword = {{"molecule", molecule_name}, {"xc", xc}, {"operator", op}}; - - auto xc_path = create_xc_path_and_directory(root, xc); - addResponseKeyWord(response_keyword); -} - -TEST_CASE("Create Excited Json") { - // Set up the run directories - using namespace madness; - - World &world = World::get_default(); - - std::cout.precision(6); - - auto root = std::filesystem::current_path();//="/"+molecule_name; - auto molecule_path = root; - molecule_path += "/molecules"; - - const std::string xc = "hf"; - const auto ops = vector{"excited-state"}; - // A calculation is defined by a molecule, functional, and operator - // xc include (hf/lda) - // operators include (excited-state) - // A calculation is defined by a molecule, functional, and operator - // xc include (hf/lda) - for (const auto &op: ops) { - for (const std::filesystem::directory_entry &mol_path: - std::filesystem::directory_iterator(molecule_path)) { - auto molecule_name = mol_path.path().stem(); - json response_keyword = {{"molecule", molecule_name}, {"xc", xc}, {"operator", op}}; - addResponseKeyWord(response_keyword); - } - } -} - -TEST_CASE("Create Dipole Json") { - // Set up the run directories - using namespace madness; - - World &world = World::get_default(); - - std::cout.precision(6); - - auto root = std::filesystem::current_path();//="/"+molecule_name; - auto molecule_path = root; - molecule_path += "/molecules"; - - const std::string xc = "hf"; - const auto ops = vector{"dipole"}; - // A calculation is defined by a molecule, functional, and operator - // xc include (hf/lda) - // operators include (excited-state) - // A calculation is defined by a molecule, functional, and operator - // xc include (hf/lda) - for (const auto &op: ops) { - for (const std::filesystem::directory_entry &mol_path: - std::filesystem::directory_iterator(molecule_path)) { - auto molecule_name = mol_path.path().stem(); - json response_keyword = {{"molecule", molecule_name}, {"xc", xc}, {"operator", op}}; - addResponseKeyWord(response_keyword); - } - } -} - -TEST_CASE("response parameters json") { - // Set up the run directories - - World &world = World::get_default(); - int result = 0; - world.gop.fence(); - - std::cout.precision(6); - - const std::string molecule_name{"Be"}; - const std::string xc{"hf"}; - const std::string op = "excited-state"; - - auto schema = runSchema(xc); - auto m_schema = moldftSchema(molecule_name, xc, schema); - auto e_schema = excitedSchema(schema, m_schema); - - ResponseParameters original{}; - ResponseParameters params{}; - print("--------------------------default parameters----------------------\n", params.print_to_string()); - - std::ifstream ifs(e_schema.rb_json); - json rb; - ifs >> rb; - - from_json(rb["response_parameters"], params); - - CHECK(original!=params); - CHECK(original==original); - -} - - -TEST_CASE("Run if moldft json ==") { - // Set up the run directories - - World &world = World::get_default(); - int result = 0; - world.gop.fence(); - - std::cout.precision(6); - - const std::string molecule_name{"Be"}; - const std::string xc{"hf"}; - const std::string op = "excited-state"; - - auto schema = runSchema(xc); - auto m_schema = moldftSchema(molecule_name, xc, schema); - - moldft(world, m_schema, false, false, 0); - -} - - -TEST_CASE("Symmetry Tests") { - // Set up the run directories - - World &world = World::get_default(); - int result = 0; - world.gop.fence(); - - std::cout.precision(6); - - const std::string molecule_name{"Be"}; - const std::string xc{"hf"}; - const std::string op = "excited-state"; - - projector_irrep p{}; - - print(p.get_pointgroup()); - - -} diff --git a/src/apps/molresponse/testing/x_space_testing.cpp b/src/apps/molresponse/testing/x_space_testing.cpp new file mode 100644 index 00000000000..5959887eb81 --- /dev/null +++ b/src/apps/molresponse/testing/x_space_testing.cpp @@ -0,0 +1,65 @@ +// +// Created by adrianhurtado on 1/1/22. +// +#define CATCH_CONFIG_RUNNER + +#include "ExcitedResponse.hpp" +#include "FrequencyResponse.hpp" +#include "ResponseExceptions.hpp" +#include "madness/external/catch/catch.hpp" +#include "madness/tensor/tensor_json.hpp" +#include "response_functions.h" +#include "string" +#include "x_space.h" + + +using path = std::filesystem::path; + +int main(int argc, char *argv[]) { + World &world = madness::initialize(argc, argv); + int result = 0; + world.gop.fence(); + startup(world, argc, argv); + { result = Catch::Session().run(argc, argv); } + + return result; + + // print_meminfo(world.rank(), "startup"); + // std::cout.precision(6); + // print_stats(world); +} + +TEST_CASE("Testing New X SPACE") { + // Set up the run directories + using namespace madness; + + World &world = World::get_default(); + + std::cout.precision(6); + std::string filename = "response.in"; + std::string load_x = "restart_dipole_hf_0-000000.000000"; + double frequency = 0.0; + std::string property = "dipole"; + + auto calc_params = initialize_calc_params(world, std::string(filename)); + + RHS_Generator rhs_generator; + if (property == "dipole") { + rhs_generator = dipole_generator; + } else { + rhs_generator = nuclear_generator; + } + FrequencyResponse calc(world, calc_params, frequency, rhs_generator); + calc.load(world, load_x); + auto x = calc.get_chi(); + + auto m = x.num_states(); + x.active.resize(m); + int i = 0; + for (auto &ai: x.active) { ai = i++; } + print(x.active); + + + // A calculation is defined by a molecule, functional, and operator + // xc inclu +} diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index f4d9400a10c..948fb7be4c4 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -31,6 +31,7 @@ namespace madness { public: response_space X, Y; + std::list active; public: size_t num_states() const { return n_states; } From 51bb5ab6650d0387420149f358853a17a4d33f31 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 14 Mar 2023 21:06:28 -0400 Subject: [PATCH 1084/1312] new x space development part 1 --- src/apps/molresponse/ExcitedResponse.cpp | 264 +++++++------- src/apps/molresponse/FrequencyResponse.cpp | 64 ++-- src/apps/molresponse/FrequencyResponse.hpp | 17 +- src/apps/molresponse/Plot_VTK.cc | 4 +- src/apps/molresponse/ResponseBase.cpp | 148 ++++---- src/apps/molresponse/ResponseBase.hpp | 6 +- src/apps/molresponse/global_functions.cc | 36 +- .../molresponse/testing/x_space_testing.cpp | 67 +++- src/apps/molresponse/x_space.cc | 20 +- src/apps/molresponse/x_space.h | 334 ++++++++++-------- 10 files changed, 522 insertions(+), 438 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index 4c817a9628d..762a8d02128 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -20,13 +20,13 @@ void ExcitedResponse::initialize(World &world) { } else { auto temp_trial = create_virtual_ao_guess(world); if (temp_trial.num_states() >= 2 * r_params.num_states()) { - std::copy(temp_trial.X.begin(), temp_trial.X.begin() + 2 * r_params.num_states(), - trial.X.begin()); + std::copy(temp_trial.x.begin(), temp_trial.x.begin() + 2 * r_params.num_states(), + trial.x.begin()); } else if (temp_trial.num_states() >= r_params.num_states()) { trial = X_space(world, temp_trial.num_states(), r_params.num_orbitals()); - std::copy(temp_trial.X.begin(), temp_trial.X.begin() + temp_trial.num_states(), - trial.X.begin()); + std::copy(temp_trial.x.begin(), temp_trial.x.begin() + temp_trial.num_states(), + trial.x.begin()); } else { MADNESS_EXCEPTION("guess virtual ao did not produce enough states for calculation", 1); @@ -42,7 +42,7 @@ void ExcitedResponse::initialize(World &world) { LoadBalanceDeux<3> lb(world); for (size_t j = 0; j < r_params.num_states(); j++) { for (size_t k = 0; k < r_params.num_orbitals(); k++) { - lb.add_tree(trial.X[j][k], lbcost(1.0, 8.0), true); + lb.add_tree(trial.x[j][k], lbcost(1.0, 8.0), true); } } for (size_t j = 0; j < r_params.num_orbitals(); j++) { @@ -55,18 +55,18 @@ void ExcitedResponse::initialize(World &world) { // Project out ground state from guesses QProjector projector(world, ground_orbitals); - for (unsigned int i = 0; i < trial.X.size(); i++) trial.X[i] = projector(trial.X[i]); + for (unsigned int i = 0; i < trial.x.size(); i++) trial.x[i] = projector(trial.x[i]); // Ensure orthogonal guesses for (size_t i = 0; i < 2; i++) { molresponse::start_timer(world); // Orthog - trial.X = gram_schmidt(world, trial.X); + trial.x = gram_schmidt(world, trial.x); molresponse::end_timer(world, "orthog"); molresponse::start_timer(world); // Normalize - normalize(world, trial.X); + normalize(world, trial.x); molresponse::end_timer(world, "normalize"); } @@ -76,7 +76,7 @@ void ExcitedResponse::initialize(World &world) { "guess.\n"); iterate_trial(world, trial); // Sort - sort(world, omega, trial.X); + sort(world, omega, trial.x); // Basic output if (r_params.num_orbitals() >= 1 and world.rank() == 0) { print("\n Final initial guess excitation energies:"); @@ -84,8 +84,8 @@ void ExcitedResponse::initialize(World &world) { } // Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); // Select lowest energy functions from guess - Chi.X = select_functions(world, trial.X, omega, r_params.num_states(), r_params.num_orbitals()); - Chi.Y = response_space(world, r_params.num_states(), r_params.num_orbitals()); + Chi.x = select_functions(world, trial.x, omega, r_params.num_states(), r_params.num_orbitals()); + Chi.y = response_space(world, r_params.num_states(), r_params.num_orbitals()); // save the guesses at the very least world.gop.fence(); save(world, "guess_restart"); @@ -133,8 +133,8 @@ X_space ExcitedResponse::make_random_trial(World &world, size_t m) const { size_t n = r_params.num_orbitals(); // Create empty container and add in randomness X_space f(world, m, n); - f.X = add_randomness(world, f.X, 1e3);// noise all over the world - f.X = mask * f.X; // make sure you mask after you add noise to the world + f.x = add_randomness(world, f.x, 1e3);// noise all over the world + f.x = mask * f.x; // make sure you mask after you add noise to the world // Create and apply a centered gaussian on each atom so that the // randomness is localized around the atoms @@ -148,10 +148,10 @@ X_space ExcitedResponse::make_random_trial(World &world, size_t m) const { // Project out groundstate from guesses QProjector projector(world, ground_orbitals); - for (unsigned int i = 0; i < f.num_states(); i++) f.X[i] = projector(f.X[i]); + for (unsigned int i = 0; i < f.num_states(); i++) f.x[i] = projector(f.x[i]); // Normalize - normalize(world, f.X); + normalize(world, f.x); return f; } @@ -256,7 +256,7 @@ X_space ExcitedResponse::make_nwchem_trial(World &world, size_t m) const { X_space rand = make_random_trial(world, m - n); // Add to vector of functions - for (unsigned int i = 0; i < rand.num_states(); i++) f.push_back(rand.X[i]); + for (unsigned int i = 0; i < rand.num_states(); i++) f.push_back(rand.x[i]); } // Project out groundstate from guesses @@ -268,7 +268,7 @@ X_space ExcitedResponse::make_nwchem_trial(World &world, size_t m) const { normalize(world, f); X_space trial(world, f.size(), n); - trial.X = f; + trial.x = f; return trial; } @@ -330,7 +330,7 @@ X_space ExcitedResponse::create_trial_functions(World &world, size_t k) const { madness::truncate(world, trials_X, madness::FunctionDefaults<3>::get_thresh(), true); X_space trials(world, count, n); - trials.X = trials_X.copy(); + trials.x = trials_X.copy(); trials_X.clear(); // Done @@ -366,7 +366,7 @@ X_space ExcitedResponse::create_trial_functions2(World &world) const { for (size_t d = 0; d < directions; d++) { for (size_t o = 0; o < n; o++) { // trials[i + j + o][o] = functions[i][j]; - trials.X[count][o] = copy(functions.at(d).at(o)); + trials.x[count][o] = copy(functions.at(d).at(o)); count++; } } @@ -411,11 +411,11 @@ X_space ExcitedResponse::create_trial_functions2(World &world) const { // Debugging output if (r_params.print_level() >= 2) { if (world.rank() == 0) print(" Norms of guess functions:"); - print_norms(world, trials.X); + print_norms(world, trials.x); } // Truncate - madness::truncate(world, trials.X); + madness::truncate(world, trials.x); // Done return trials; @@ -444,7 +444,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { // Start a timer for this iteration molresponse::start_timer(world); // - size_t N0 = guesses.X.size(); + size_t N0 = guesses.x.size(); size_t Ni = N0; // Basic output @@ -467,7 +467,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { LoadBalanceDeux<3> lb(world); for (size_t j = 0; j < n; j++) { for (size_t k = 0; k < r_params.num_states(); k++) { - lb.add_tree(guesses.X[k][j], lbcost(1.0, 8.0), true); + lb.add_tree(guesses.x[k][j], lbcost(1.0, 8.0), true); } } FunctionDefaults<3>::redistribute(world, lb.load_balance(2)); @@ -476,18 +476,18 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { } // compute rho_omega - auto rho_omega = transition_densityTDA(world, ground_orbitals, guesses.X); + auto rho_omega = transition_densityTDA(world, ground_orbitals, guesses.x); // Project out ground state - for (size_t i = 0; i < Ni; i++) guesses.X[i] = projector(guesses.X[i]); + for (size_t i = 0; i < Ni; i++) guesses.x[i] = projector(guesses.x[i]); // Truncate before doing expensive things - guesses.X.truncate_rf(); + guesses.x.truncate_rf(); // Normalize after projection - if (r_params.tda()) normalize(world, guesses.X); + if (r_params.tda()) normalize(world, guesses.x); // (TODO why not normalize if not tda) - // compute Y = false + // compute y = false auto xc = make_xc_operator(world); auto [temp_Lambda_X, temp_V0X, temp_gamma] = compute_response_potentials(world, guesses, xc, "tda"); @@ -532,7 +532,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { X_space E0X(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); if (r_params.localize() != "canon") { E0X = rotated_chi.copy(); - E0X.X = E0X.X * ham_no_diag; + E0X.x = E0X.x * ham_no_diag; } world.gop.fence(); @@ -544,9 +544,9 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { theta_X = rotated_v_x - E0X + rotated_gamma_x; - theta_X.X = apply_shift(world, x_shifts, theta_X.X, guesses.X); - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); + theta_X.x = apply_shift(world, x_shifts, theta_X.x, guesses.x); + theta_X.x = theta_X.x * -2; + theta_X.x.truncate_rf(); print("BARRIER before create BSH"); world.mpi.Barrier(); @@ -559,7 +559,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { world.mpi.Barrier(); // Apply BSH and get updated components if (r_params.print_level() >= 1) molresponse::start_timer(world); - bsh_resp = apply(world, bsh_x_operators, theta_X.X); + bsh_resp = apply(world, bsh_x_operators, theta_X.x); if (r_params.print_level() >= 1) molresponse::end_timer(world, "Apply BSH:"); // Project out ground state @@ -569,28 +569,28 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { bsh_i = projector(bsh_i); } // Save new components - guesses.X = bsh_resp; + guesses.x = bsh_resp; // Apply mask - for (size_t i = 0; i < Ni; i++) guesses.X[i] = mask * guesses.X[i]; + for (size_t i = 0; i < Ni; i++) guesses.x[i] = mask * guesses.x[i]; } // Ensure orthogonal guesses for (size_t i = 0; i < 2; i++) { molresponse::start_timer(world); // Orthog - guesses.X = gram_schmidt(world, guesses.X); + guesses.x = gram_schmidt(world, guesses.x); molresponse::end_timer(world, "orthog"); molresponse::start_timer(world); // Normalize - normalize(world, guesses.X); + normalize(world, guesses.x); molresponse::end_timer(world, "normalize"); } // Update counter iteration += 1; // Done with the iteration.. truncate - guesses.X.truncate_rf(); + guesses.x.truncate_rf(); // Basic output if (r_params.print_level() >= 1) {// @@ -620,8 +620,8 @@ void ExcitedResponse::deflateGuesses(World &world, X_space &Chi, X_space &Lambda Tensor &S, Tensor &frequencies, size_t &iteration, size_t &m) const { // XX =Omega XAX - S = response_space_inner(Chi.X, Chi.X); - Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); + S = response_space_inner(Chi.x, Chi.x); + Tensor XAX = response_space_inner(Chi.x, Lambda_X.x); // Debugging output if (r_params.print_level() >= 2 and world.rank() == 0) { @@ -640,8 +640,8 @@ void ExcitedResponse::deflateTDA(World &world, X_space &Chi, X_space &old_Chi, X X_space &old_Lambda_X, Tensor &S, Tensor old_S, Tensor old_A, Tensor &omega, size_t &iteration, size_t &m) { - S = response_space_inner(Chi.X, Chi.X); - Tensor XAX = response_space_inner(Chi.X, Lambda_X.X); + S = response_space_inner(Chi.x, Chi.x); + Tensor XAX = response_space_inner(Chi.x, Lambda_X.x); // Debugging output if (r_params.print_level() >= 2 and world.rank() == 0) { @@ -686,7 +686,7 @@ void ExcitedResponse::deflateFull(World &world, X_space &Chi, X_space &old_Chi, // computes Augments A and S } else { - S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); + S = response_space_inner(Chi.x, Chi.x) - response_space_inner(Chi.y, Chi.y); if (world.rank() == 0 && (r_params.print_level() >= 10)) { print("\n Overlap Matrix:"); print(S); @@ -730,8 +730,8 @@ ExcitedResponse::rotate_excited_space(World &world, X_space &chi, X_space &lchi, X_space l_copy = lchi.copy(); - Tensor S = response_space_inner(chi_copy.X, chi_copy.X) - - response_space_inner(chi_copy.Y, chi_copy.Y); + Tensor S = response_space_inner(chi_copy.x, chi_copy.x) - + response_space_inner(chi_copy.y, chi_copy.y); if (world.rank() == 0) { auto sm = S - transpose(S); @@ -988,7 +988,7 @@ void ExcitedResponse::augment(World &world, X_space &Chi, X_space &old_Chi, X_sp if (print_level >= 1) molresponse::start_timer(world); // Get sizes - size_t m = Chi.X.size(); + size_t m = Chi.x.size(); // Create work space, will overwrite S and A in the end Tensor temp_S(2 * m, 2 * m); Tensor temp_A(2 * m, 2 * m); @@ -1001,10 +1001,10 @@ void ExcitedResponse::augment(World &world, X_space &Chi, X_space &old_Chi, X_sp */ // Calculate correct inner products of upper off diagonal - Tensor off = response_space_inner(Chi.X, last_Lambda_X.X); + Tensor off = response_space_inner(Chi.x, last_Lambda_X.x); temp_A(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off);// top right // Now for lower off diagonal - off = response_space_inner(old_Chi.X, Lambda_X.X); + off = response_space_inner(old_Chi.x, Lambda_X.x); temp_A(Slice(m, 2 * m - 1), Slice(0, m - 1)) = copy(off); // bottom left temp_A(Slice(0, m - 1), Slice(0, m - 1)) = copy(A); // xAx top left temp_A(Slice(m, 2 * m - 1), Slice(m, 2 * m - 1)) = copy(old_A);// xoldAxold bottom right @@ -1022,7 +1022,7 @@ void ExcitedResponse::augment(World &world, X_space &Chi, X_space &old_Chi, X_sp * [ ] */ // Now create upper off diagonal block of S - off = expectation(world, Chi.X, old_Chi.X); + off = expectation(world, Chi.x, old_Chi.x); // Use slicing to put in correct spot temp_S(Slice(0, m - 1), Slice(m, 2 * m - 1)) = copy(off);// top right // Now the lower off diagonal block @@ -1038,8 +1038,8 @@ void ExcitedResponse::augment(World &world, X_space &Chi, X_space &old_Chi, X_sp // Add in old vectors to current vectors for the appropriate ones // Augment the vectors step for (size_t i = 0; i < m; i++) { - Chi.X.push_back(old_Chi.X[i]); - Lambda_X.X.push_back(last_Lambda_X.X[i]); + Chi.x.push_back(old_Chi.x[i]); + Lambda_X.x.push_back(last_Lambda_X.x[i]); } // End the timer @@ -1074,12 +1074,12 @@ void ExcitedResponse::augment_full(World &world, X_space &Chi, X_space &old_Chi, size_t m = Chi.num_states(); for (size_t i = 0; i < m; i++) { - Chi.push_back(copy(world, old_Chi.X[i]), copy(world, old_Chi.Y[i])); - Lambda_X.push_back(copy(world, last_Lambda_X.X[i]), copy(world, last_Lambda_X.Y[i])); + Chi.push_back(copy(world, old_Chi.x[i]), copy(world, old_Chi.y[i])); + Lambda_X.push_back(copy(world, last_Lambda_X.x[i]), copy(world, last_Lambda_X.y[i])); } Tensor temp_A = inner(Chi, Lambda_X); A = 0.5 * (temp_A + transpose(temp_A)); - S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); + S = response_space_inner(Chi.x, Chi.x) - response_space_inner(Chi.y, Chi.y); // End the timer if (print_level >= 1) molresponse::end_timer(world, "Aug. resp. matrix:"); @@ -1120,14 +1120,14 @@ void ExcitedResponse::unaugment(World &world, X_space &Chi, X_space &old_Chi, X_ // (only after first iteration) if (iter > 0) { for (size_t i = 0; i < num_states; i++) { - Chi.X.pop_back(); - Lambda_X.X.pop_back(); + Chi.x.pop_back(); + Lambda_X.x.pop_back(); } } - old_Chi.X = Chi.X.copy(); - last_Lambda_X.X = Lambda_X.X.copy(); + old_Chi.x = Chi.x.copy(); + last_Lambda_X.x = Lambda_X.x.copy(); - old_S = response_space_inner(Chi.X, Chi.X); + old_S = response_space_inner(Chi.x, Chi.x); old_A = Tensor(num_states, num_states); for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); // End the timer @@ -1165,7 +1165,7 @@ void ExcitedResponse::unaugment_full(World &world, X_space &Chi, X_space &old_Ch old_Chi = Chi.copy(); last_Lambda_X = Lambda_X.copy(); - old_S = response_space_inner(Chi.X, Chi.X) - response_space_inner(Chi.Y, Chi.Y); + old_S = response_space_inner(Chi.x, Chi.x) - response_space_inner(Chi.y, Chi.y); old_A = Tensor(num_states, num_states); for (size_t i = 0; i < num_states; i++) old_A(i, i) = omega(i); // End the timer @@ -1193,8 +1193,8 @@ std::tuple ExcitedResponse::rotate_excited_v if (r_params.print_level() >= 10) { Tensor S; - S = response_space_inner(rotated_chi.X, rotated_chi.X) - - response_space_inner(rotated_chi.Y, rotated_chi.Y); + S = response_space_inner(rotated_chi.x, rotated_chi.x) - + response_space_inner(rotated_chi.y, rotated_chi.y); if (world.rank() == 0) { print("\n After apply transform Overlap Matrix:"); print(S); @@ -1224,12 +1224,12 @@ Tensor ExcitedResponse::diagonalizeFullResponseMatrix( // Start timer if (r_params.print_level() >= 1) molresponse::start_timer(world); - Chi.X = transform(world, Chi.X, U); - Chi.Y = transform(world, Chi.Y, U); + Chi.x = transform(world, Chi.x, U); + Chi.y = transform(world, Chi.y, U); Tensor Sxa, Sya, Sa; - Sxa = response_space_inner(Chi.X, Chi.X); - Sya = response_space_inner(Chi.Y, Chi.Y); + Sxa = response_space_inner(Chi.x, Chi.x); + Sya = response_space_inner(Chi.y, Chi.y); Sa = Sxa - Sya; if (world.rank() == 0 and r_params.print_level() >= 10) { @@ -1239,8 +1239,8 @@ Tensor ExcitedResponse::diagonalizeFullResponseMatrix( print(Sa); } - Lambda_X.X = transform(world, Lambda_X.X, U); - Lambda_X.Y = transform(world, Lambda_X.Y, U); + Lambda_X.x = transform(world, Lambda_X.x, U); + Lambda_X.y = transform(world, Lambda_X.y, U); // Transform the vectors of functions // Truncate happens in here // we do transform here @@ -1480,14 +1480,14 @@ Tensor ExcitedResponse::diagonalizeFockMatrix(World &world, X_space &Chi // transform the orbitals and the potential // Truncate happens inside here - Chi.X = transform(world, Chi.X, U); - Lambda_X.X = transform(world, Lambda_X.X, U); + Chi.x = transform(world, Chi.x, U); + Lambda_X.x = transform(world, Lambda_X.x, U); // End timer if (r_params.print_level() >= 1) molresponse::end_timer(world, "Transform orbs.:"); // Normalize x - normalize(world, Chi.X); + normalize(world, Chi.x); // Debugging output if (r_params.print_level() >= 2 and world.rank() == 0) { @@ -1899,7 +1899,7 @@ void ExcitedResponse::iterate(World &world) { if (iter < 2 || (iter % 10) == 0) { load_balance_chi(world); } if (iter > 0) { - // Only checking on X components even for full as Y are so small + // Only checking on X components even for full as y are so small if (density_residuals.max() > 2) { break; } if (density_residuals.max() > 2) { break; } @@ -1963,7 +1963,7 @@ void ExcitedResponse::iterate(World &world) { if (r_params.print_level() >= 1) molresponse::end_timer(world, " This iteration:"); // plot orbitals if (r_params.plot_all_orbitals()) { - plotResponseOrbitals(world, iter, Chi.X, Chi.Y, r_params, ground_calc); + plotResponseOrbitals(world, iter, Chi.x, Chi.y, r_params, ground_calc); } auto rho0 = make_ground_density(world); if (r_params.plot()) { @@ -2062,7 +2062,7 @@ void ExcitedResponse::iterate(World &world) { print(omega); print(" Final energy residuals X:"); print(bsh_residualsX); - print(" Final energy residuals Y:"); + print(" Final energy residuals y:"); print(bsh_residualsY); print(" Final density residuals:"); print(density_residuals); @@ -2079,7 +2079,7 @@ void ExcitedResponse::iterate(World &world) { if (not r_params.tda()) { for (size_t i = 0; i < m; i++) { std::string y_state = "y_" + std::to_string(i) + "_"; - analyze_vectors(world, Chi.Y[i], y_state); + analyze_vectors(world, Chi.y[i], y_state); print("--------------------------------------------------------"); } } @@ -2100,7 +2100,7 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & /* if (compute_y) { - gram_schmidt(world, Chi.X, Chi.Y); + gram_schmidt(world, Chi.X, Chi.y); normalize(world, Chi); } else { gram_schmidt(world, Chi.X); @@ -2129,8 +2129,8 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & X_space rotated_EOX(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); if (r_params.localize() != "canon") { rotated_EOX = rotated_chi.copy(); - rotated_EOX.X = rotated_EOX.X * ham_no_diag; - if (compute_y) { rotated_EOX.Y = rotated_EOX.Y * ham_no_diag; } + rotated_EOX.x = rotated_EOX.x * ham_no_diag; + if (compute_y) { rotated_EOX.y = rotated_EOX.y * ham_no_diag; } if (r_params.print_level() >= 10) { print(""); print(inner(rotated_chi, rotated_EOX)); @@ -2162,11 +2162,11 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & if (compute_y) normalize(world, new_chi); else - normalize(world, new_chi.X); + normalize(world, new_chi.x); - new_chi.X.truncate_rf(); - if (compute_y) new_chi.Y.truncate_rf(); + new_chi.x.truncate_rf(); + if (compute_y) new_chi.y.truncate_rf(); return {new_omega, rotated_chi, new_chi, {new_res, bsh}}; } @@ -2184,14 +2184,14 @@ auto ExcitedResponse::bsh_update_excited(World &world, const Tensor &ome x_shifts = create_shift(world, ground_energies, omega_plus, "x"); // Compute Theta X // Apply the shifts - theta_X.X = apply_shift(world, x_shifts, theta_X.X, Chi.X); - theta_X.X = theta_X.X * -2; - theta_X.X.truncate_rf(); + theta_X.x = apply_shift(world, x_shifts, theta_X.x, Chi.x); + theta_X.x = theta_X.x * -2; + theta_X.x.truncate_rf(); if (compute_y) { - // theta_X.Y = apply_shift(world, y_shifts, theta_X.Y, Chi.Y); - theta_X.Y = theta_X.Y * -2; - theta_X.Y.truncate_rf(); + // theta_X.y = apply_shift(world, y_shifts, theta_X.y, Chi.y); + theta_X.y = theta_X.y * -2; + theta_X.y.truncate_rf(); } // Construct BSH operators std::vector>> bsh_x_ops = @@ -2206,13 +2206,13 @@ auto ExcitedResponse::bsh_update_excited(World &world, const Tensor &ome } X_space bsh_X(world, m, n); // Apply BSH and get updated response components - bsh_X.X = apply(world, bsh_x_ops, theta_X.X); - if (compute_y) bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); + bsh_X.x = apply(world, bsh_x_ops, theta_X.x); + if (compute_y) bsh_X.y = apply(world, bsh_y_ops, theta_X.y); // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); + for (size_t i = 0; i < m; i++) bsh_X.x[i] = projector(bsh_X.x[i]); if (compute_y) { - for (size_t i = 0; i < m; i++) bsh_X.Y[i] = projector(bsh_X.Y[i]); + for (size_t i = 0; i < m; i++) bsh_X.y[i] = projector(bsh_X.y[i]); } // Only update non-converged components @@ -2221,14 +2221,14 @@ auto ExcitedResponse::bsh_update_excited(World &world, const Tensor &ome bsh_X.X[i] = bsh_X.X[i]; bsh_X.X[i] = mask * bsh_X.X[i]; if (compute_y) { - bsh_X.Y[i] = bsh_X.Y[i]; - bsh_X.Y[i] = mask * bsh_X.Y[i]; + bsh_X.y[i] = bsh_X.y[i]; + bsh_X.y[i] = mask * bsh_X.y[i]; } } */ if (compute_y) normalize(world, bsh_X); - else { normalize(world, bsh_X.X); } + else { normalize(world, bsh_X.x); } // Ensure orthogonal rguesses //bsh_X.truncate(); @@ -2238,8 +2238,8 @@ auto ExcitedResponse::bsh_update_excited(World &world, const Tensor &ome void ExcitedResponse::analysis(World &world, const X_space &chi) { // Sizes get used a lot here, so lets get a local copy - size_t n = chi.X[0].size(); - size_t m = chi.X.size(); + size_t n = chi.x[0].size(); + size_t m = chi.x.size(); // Per response function, want to print the contributions from each // ground state So print the norm of each function? @@ -2249,9 +2249,9 @@ void ExcitedResponse::analysis(World &world, const X_space &chi) { // Calculate the inner products for (long i = 0; i < m; i++) { for (long j = 0; j < n; j++) { - x_norms(i, j) = chi.X[i][j].norm2(); + x_norms(i, j) = chi.x[i][j].norm2(); - if (not r_params.tda()) y_norms(i, j) = chi.Y[i][j].norm2(); + if (not r_params.tda()) y_norms(i, j) = chi.y[i][j].norm2(); } } @@ -2287,14 +2287,14 @@ void ExcitedResponse::analysis(World &world, const X_space &chi) { for (size_t i = 0; i < m; i++) { // Add in contribution from each ground state for (size_t j = 0; j < n; j++) { - dipoles(i, 0) += inner(ground_orbitals[j], x * chi.X[i][j]); - dipoles(i, 1) += inner(ground_orbitals[j], y * chi.X[i][j]); - dipoles(i, 2) += inner(ground_orbitals[j], z * chi.X[i][j]); + dipoles(i, 0) += inner(ground_orbitals[j], x * chi.x[i][j]); + dipoles(i, 1) += inner(ground_orbitals[j], y * chi.x[i][j]); + dipoles(i, 2) += inner(ground_orbitals[j], z * chi.x[i][j]); if (not r_params.tda()) { - dipoles(i, 0) += inner(ground_orbitals[j], x * chi.Y[i][j]); - dipoles(i, 1) += inner(ground_orbitals[j], y * chi.Y[i][j]); - dipoles(i, 2) += inner(ground_orbitals[j], z * chi.Y[i][j]); + dipoles(i, 0) += inner(ground_orbitals[j], x * chi.y[i][j]); + dipoles(i, 1) += inner(ground_orbitals[j], y * chi.y[i][j]); + dipoles(i, 2) += inner(ground_orbitals[j], z * chi.y[i][j]); } } @@ -2320,26 +2320,26 @@ void ExcitedResponse::analysis(World &world, const X_space &chi) { for (long i = 0; i < m; i++) { // Add in contribution from each ground state for (long j = 0; j < n; j++) { - quadrupoles(i, 0, 0) += inner(ground_orbitals[j], x * x * chi.X[i][j]); - quadrupoles(i, 0, 1) += inner(ground_orbitals[j], x * y * chi.X[i][j]); - quadrupoles(i, 0, 2) += inner(ground_orbitals[j], x * z * chi.X[i][j]); - quadrupoles(i, 1, 0) += inner(ground_orbitals[j], y * x * chi.X[i][j]); - quadrupoles(i, 1, 1) += inner(ground_orbitals[j], y * y * chi.X[i][j]); - quadrupoles(i, 1, 2) += inner(ground_orbitals[j], y * z * chi.X[i][j]); - quadrupoles(i, 2, 0) += inner(ground_orbitals[j], z * x * chi.X[i][j]); - quadrupoles(i, 2, 1) += inner(ground_orbitals[j], z * y * chi.X[i][j]); - quadrupoles(i, 2, 2) += inner(ground_orbitals[j], z * z * chi.X[i][j]); + quadrupoles(i, 0, 0) += inner(ground_orbitals[j], x * x * chi.x[i][j]); + quadrupoles(i, 0, 1) += inner(ground_orbitals[j], x * y * chi.x[i][j]); + quadrupoles(i, 0, 2) += inner(ground_orbitals[j], x * z * chi.x[i][j]); + quadrupoles(i, 1, 0) += inner(ground_orbitals[j], y * x * chi.x[i][j]); + quadrupoles(i, 1, 1) += inner(ground_orbitals[j], y * y * chi.x[i][j]); + quadrupoles(i, 1, 2) += inner(ground_orbitals[j], y * z * chi.x[i][j]); + quadrupoles(i, 2, 0) += inner(ground_orbitals[j], z * x * chi.x[i][j]); + quadrupoles(i, 2, 1) += inner(ground_orbitals[j], z * y * chi.x[i][j]); + quadrupoles(i, 2, 2) += inner(ground_orbitals[j], z * z * chi.x[i][j]); if (not r_params.tda()) { - quadrupoles(i, 0, 0) += inner(ground_orbitals[j], x * x * chi.Y[i][j]); - quadrupoles(i, 0, 1) += inner(ground_orbitals[j], x * y * chi.Y[i][j]); - quadrupoles(i, 0, 2) += inner(ground_orbitals[j], x * z * chi.Y[i][j]); - quadrupoles(i, 1, 0) += inner(ground_orbitals[j], y * x * chi.Y[i][j]); - quadrupoles(i, 1, 1) += inner(ground_orbitals[j], y * y * chi.Y[i][j]); - quadrupoles(i, 1, 2) += inner(ground_orbitals[j], y * z * chi.Y[i][j]); - quadrupoles(i, 2, 0) += inner(ground_orbitals[j], z * x * chi.Y[i][j]); - quadrupoles(i, 2, 1) += inner(ground_orbitals[j], z * y * chi.Y[i][j]); - quadrupoles(i, 2, 2) += inner(ground_orbitals[j], z * z * chi.Y[i][j]); + quadrupoles(i, 0, 0) += inner(ground_orbitals[j], x * x * chi.y[i][j]); + quadrupoles(i, 0, 1) += inner(ground_orbitals[j], x * y * chi.y[i][j]); + quadrupoles(i, 0, 2) += inner(ground_orbitals[j], x * z * chi.y[i][j]); + quadrupoles(i, 1, 0) += inner(ground_orbitals[j], y * x * chi.y[i][j]); + quadrupoles(i, 1, 1) += inner(ground_orbitals[j], y * y * chi.y[i][j]); + quadrupoles(i, 1, 2) += inner(ground_orbitals[j], y * z * chi.y[i][j]); + quadrupoles(i, 2, 0) += inner(ground_orbitals[j], z * x * chi.y[i][j]); + quadrupoles(i, 2, 1) += inner(ground_orbitals[j], z * y * chi.y[i][j]); + quadrupoles(i, 2, 2) += inner(ground_orbitals[j], z * z * chi.y[i][j]); } } // Normalization @@ -2363,16 +2363,16 @@ void ExcitedResponse::analysis(World &world, const X_space &chi) { print("\n --------------------------------------------"); print("\n Transition Dipole Moments"); - printf(" X: %7.8f Y: %7.8f Z: %7.8f\n", dipoles(i, 0), dipoles(i, 1), + printf(" X: %7.8f y: %7.8f Z: %7.8f\n", dipoles(i, 0), dipoles(i, 1), dipoles(i, 2)); printf("\n Dipole Oscillator Strength: %7.8f\n", oscillator(i)); print("\n Transition Quadrupole Moments"); - printf(" %16s %16s %16s\n", "X", "Y", "Z"); + printf(" %16s %16s %16s\n", "X", "y", "Z"); printf(" X %16.8f %16.8f %16.8f\n", quadrupoles(i, 0, 0), quadrupoles(i, 0, 1), quadrupoles(i, 0, 2)); - printf(" Y %16.8f %16.8f %16.8f\n", quadrupoles(i, 1, 0), quadrupoles(i, 1, 1), + printf(" y %16.8f %16.8f %16.8f\n", quadrupoles(i, 1, 0), quadrupoles(i, 1, 1), quadrupoles(i, 1, 2)); printf(" Z %16.8f %16.8f %16.8f\n", quadrupoles(i, 2, 0), quadrupoles(i, 2, 1), quadrupoles(i, 2, 2)); @@ -2429,10 +2429,10 @@ void ExcitedResponse::save(World &world, const std::string &name) { ar ω for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.x[i][j]; if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.y[i][j]; } } @@ -2465,12 +2465,12 @@ void ExcitedResponse::load(World &world, const std::string &name) { Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.x[i][j]; world.gop.fence(); if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.y[i][j]; world.gop.fence(); } } @@ -2617,7 +2617,7 @@ X_space ExcitedResponse::create_virtual_ao_guess(World &world) const { // add the virtual orbital in location j // therefore there should be a total of num_virt*num_ground_orbitals std::for_each(phi_a.begin(), phi_a.end(), [&](const auto virt) { - for (int j = 0; j < no; j++) { x_guess.X[k++][j] = copy(virt); } + for (int j = 0; j < no; j++) { x_guess.x[k++][j] = copy(virt); } }); world.gop.fence(); return x_guess; @@ -2849,7 +2849,7 @@ X_space ExcitedResponse::create_response_guess(World &world) const { for (int i = 0; i < t; i++) { auto xt = copy(X(_, i)); auto mt = xt.reshape(xao.size(), no); - x_guess.X[i] = transform(world, phi_a, mt); + x_guess.x[i] = transform(world, phi_a, mt); // new size is xt column size } return x_guess; @@ -3085,7 +3085,7 @@ X_space ExcitedTester::test_ao_guess(World &world, ExcitedResponse &calc) { for (int i = 0; i < t; i++) { auto xt = copy(X(_, i)); auto mt = xt.reshape(xao.size(), no); - x_guess.X[i] = transform(world, phi_a, mt); + x_guess.x[i] = transform(world, phi_a, mt); // new size is xt column size } diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index bddc61ca9a5..78b80850b67 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -93,6 +93,8 @@ void FrequencyResponse::iterate(World &world) { //PQ = PQ * mask; PQ = generator(world, *this); PQ.truncate(); + // vector converged(Chi.num_states(),false); + for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); iter_function_data.clear(); @@ -109,7 +111,7 @@ void FrequencyResponse::iterate(World &world) { break; } double d_residual = density_residuals.max(); - auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.X.norm2(); + auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.x.norm2(); auto rho_norms = madness::norm2s_T(world, rho_omega); std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), chi_norms.ptr(), bsh_relative_residualsX.ptr(), @@ -157,7 +159,7 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) molresponse::end_timer(world, "Save:"); } if (r_params.plot_all_orbitals()) { - plotResponseOrbitals(world, iter, Chi.X, Chi.Y, r_params, ground_calc); + plotResponseOrbitals(world, iter, Chi.x, Chi.y, r_params, ground_calc); } break; } @@ -181,7 +183,7 @@ void FrequencyResponse::iterate(World &world) { if (compute_y) { Chi = new_chi.copy(); } else { - Chi.X = new_chi.X.copy(); + Chi.x = new_chi.x.copy(); } if (world.rank() == 0) { print("copy chi:"); } if (r_params.print_level() >= 1) { @@ -297,14 +299,14 @@ auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, for (int i = 0; i < m; i++) { orb_x = i * p * n; for (int j = 0; j < n; j++) { - vect_x[orb_x + j] = x.X[i][j]; - vect_fx[orb_x + j] = fx.X[i][j]; + vect_x[orb_x + j] = x.x[i][j]; + vect_fx[orb_x + j] = fx.x[i][j]; } if (compute_y) { orb_y = orb_x + n; for (int j = 0; j < n; j++) { - vect_x[orb_y + j] = x.Y[i][j]; - vect_fx[orb_y + j] = fx.Y[i][j]; + vect_x[orb_y + j] = x.y[i][j]; + vect_fx[orb_y + j] = fx.y[i][j]; } } } @@ -314,13 +316,13 @@ auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, for (int i = 0; i < m; i++) { orb_x = i * p * n; for (int j = 0; j < n; j++) { - kain_update.X[i][j] = + kain_update.x[i][j] = rf_solver[orb_x + j].update(vect_x[orb_x + j], vect_rx[orb_x + j]); } if (compute_y) { orb_y = orb_x + n; for (int j = 0; j < n; j++) { - kain_update.Y[i][j] = + kain_update.y[i][j] = rf_solver[orb_y + j].update(vect_x[orb_y + j], vect_rx[orb_y + j]); } } @@ -340,22 +342,22 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, molresponse::start_timer(world); if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } - size_t m = theta_X.X.size(); - size_t n = theta_X.X.size_orbitals(); + size_t m = theta_X.x.size(); + size_t n = theta_X.x.size_orbitals(); bool compute_y = omega != 0.0; // construct lhs for 2nd order property PQ.truncate(); - theta_X.X += theta_X.X * x_shifts; - theta_X.X += PQ.X; - theta_X.X = theta_X.X * -2; + theta_X.x += theta_X.x * x_shifts; + theta_X.x += PQ.x; + theta_X.x = theta_X.x * -2; world.gop.fence(); if (compute_y) { - theta_X.Y += PQ.Y; - theta_X.Y = theta_X.Y * -2; + theta_X.y += PQ.y; + theta_X.y = theta_X.y * -2; theta_X.truncate(); } else { - theta_X.X.truncate_rf(); + theta_X.x.truncate_rf(); } world.gop.fence(); // apply bsh @@ -364,21 +366,21 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, bsh_x_ops.insert(bsh_x_ops.end(), std::make_move_iterator(bsh_y_ops.begin()), std::make_move_iterator(bsh_y_ops.end())); */ - bsh_X.X = apply(world, bsh_x_ops, theta_X.X); + bsh_X.x = apply(world, bsh_x_ops, theta_X.x); if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } - if (compute_y) { bsh_X.Y = apply(world, bsh_y_ops, theta_X.Y); } + if (compute_y) { bsh_X.y = apply(world, bsh_y_ops, theta_X.y); } if (compute_y) { bsh_X.truncate(); } else { - bsh_X.X.truncate_rf(); + bsh_X.x.truncate_rf(); } if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.X[i] = projector(bsh_X.X[i]); + for (size_t i = 0; i < m; i++) bsh_X.x[i] = projector(bsh_X.x[i]); if (compute_y) { - for (size_t i = 0; i < m; i++) { bsh_X.Y[i] = projector(bsh_X.Y[i]); } + for (size_t i = 0; i < m; i++) { bsh_X.y[i] = projector(bsh_X.y[i]); } } if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { @@ -387,7 +389,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, if (compute_y) { bsh_X.truncate(); } else { - bsh_X.X.truncate_rf(); + bsh_X.x.truncate_rf(); } return bsh_X; } @@ -422,10 +424,10 @@ void FrequencyResponse::save(World &world, const std::string &name) { ar &r_params.num_states(); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.x[i][j]; if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.y[i][j]; } } @@ -440,11 +442,11 @@ void FrequencyResponse::load(World &world, const std::string &name) { ar &r_params.num_states(); Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.X[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.x[i][j]; world.gop.fence(); if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.Y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.y[i][j]; world.gop.fence(); } } @@ -462,8 +464,8 @@ auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { factoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); } } - PQ.X = vector_to_PQ(world, nuclear_vector, calc.get_orbitals()); - PQ.Y = PQ.X; + PQ.x = vector_to_PQ(world, nuclear_vector, calc.get_orbitals()); + PQ.y = PQ.x; return PQ; } @@ -479,8 +481,8 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { } //truncate(world, dipole_vectors, true); world.gop.fence(); - PQ.X = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); - PQ.Y = PQ.X.copy(); + PQ.x = vector_to_PQ(world, dipole_vectors, calc.get_orbitals()); + PQ.y = PQ.x.copy(); if (world.rank() == 0) { print("Made new PQ"); } return PQ; } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index dcc5428c1a9..afce38b285d 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -22,27 +22,30 @@ class FrequencyResponse : public ResponseBase { public: FrequencyResponse(World &world, const CalcParams ¶ms, double frequency, RHS_Generator rhs) - : ResponseBase(world, params), omega{frequency}, generator{std::move(rhs)}, - PQ{generator(world, *this)} { + : ResponseBase(world, params), omega{frequency}, generator{std::move(rhs)}, PQ{} { if (omega == 0.0) { response_context.set_strategy(std::make_unique()); } else { response_context.set_strategy(std::make_unique()); } + PQ = generator(world, *this); } void initialize(World &world) override; void load(World &world, const std::string &name) override; -private: - double omega; - RHS_Generator generator; - X_space PQ; - void iterate(World &world) override; void check_k(World &world, double thresh, int k) override { ResponseBase::check_k(world, thresh, k); ::check_k(world, PQ, thresh, k); } + + X_space PQ; + + RHS_Generator generator; + +private: + double omega; + void iterate(World &world) override; X_space bsh_update_response(World &world, X_space &theta_X, vector &bsh_x_ops, vector &bsh_y_ops, QProjector &projector, double &x_shifts); diff --git a/src/apps/molresponse/Plot_VTK.cc b/src/apps/molresponse/Plot_VTK.cc index e32f6115de9..a519e8a6c57 100644 --- a/src/apps/molresponse/Plot_VTK.cc +++ b/src/apps/molresponse/Plot_VTK.cc @@ -347,7 +347,7 @@ namespace madness { filename = fname.c_str(); // VTK plotting stuff plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(Chi.X[i][j], + plotvtk_data(Chi.x[i][j], "x_orbitals", world, filename, @@ -367,7 +367,7 @@ namespace madness { filename = fname.c_str(); // VTK plotting stuff plotvtk_begin<3>(world, filename, box_lo, box_hi, points, true); - plotvtk_data(Chi.Y[i][j], + plotvtk_data(Chi.y[i][j], "y_orbitals", world, filename, diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 5a7943aa8a3..7879bc5a1d0 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -314,7 +314,7 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu } else if (calc_type == "static") { int b = 0; for (auto &rho_b: density) { - auto xb=chi.X[b]; + auto xb=chi.x[b]; auto x_phi= mul(world,xb,ground_orbitals,false); world.gop.fence(); rho_b =2*sum(world,x_phi); @@ -322,7 +322,7 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu } } else { - density = transition_densityTDA(world, ground_orbitals, chi.X); + density = transition_densityTDA(world, ground_orbitals, chi.x); } if (world.rank() == 0) { print("make density: made density"); } truncate(world, density,thresh); @@ -337,11 +337,11 @@ void ResponseBase::load_balance_chi(World &world) { LoadBalanceDeux<3> lb(world); real_function_3d v_nuclear; v_nuclear = potential_manager->vnuclear(); - for (auto &xi: Chi.X) { + for (auto &xi: Chi.x) { for (auto &xij: xi) { lb.add_tree(xij, lbcost(1.0, 8.0), false); } } if (r_params.omega() != 0) { - for (auto &yi: Chi.Y) { + for (auto &yi: Chi.y) { for (auto &yij: yi) { lb.add_tree(yij, lbcost(1.0, 8.0), false); } } } @@ -411,12 +411,12 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, X_space E0X(world, chi.num_states(), chi.num_orbitals()); if (r_params.localize() != "canon") { E0X = chi.copy(); - E0X.X = E0X.X * ham_no_diag; + E0X.x = E0X.x * ham_no_diag; if (compute_Y) { - E0X.Y = E0X.Y * ham_no_diag; + E0X.y = E0X.y * ham_no_diag; E0X.truncate(); } else { - E0X.X.truncate_rf(); + E0X.x.truncate_rf(); } inner_to_json(world, "E0", response_context.inner(chi, E0X), iter_function_data); if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } @@ -501,11 +501,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit int b = 0; for (const auto &rho_b_i: rho_b) { auto temp_J = apply(*shared_coulomb_operator, rho_b_i); - J.X[b++] = mul(world, temp_J, phi0); + J.x[b++] = mul(world, temp_J, phi0); } - std::transform(J.X.begin(), J.X.end(), J.X.begin(),[&](auto &jxi) { return projector(jxi); }); + std::transform(J.x.begin(), J.x.end(), J.x.begin(),[&](auto &jxi) { return projector(jxi); }); world.gop.fence(); - J.Y = J.X.copy(); + J.y = J.x.copy(); if (world.rank() == 0) { print("copy JX into JY"); } @@ -517,15 +517,15 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { - auto rho = transition_density(world, phi0, chi_alpha.X, chi_alpha.X); + auto rho = transition_density(world, phi0, chi_alpha.x, chi_alpha.x); auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { auto xc_rho = xc.apply_xc_kernel(rho_alpha); return mul(world, xc_rho, phi0); }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); - std::transform(W.X.begin(), W.X.end(), W.X.begin(),[&](auto &wxi) { return projector(wxi); }); - W.Y = W.X.copy(); + std::transform(rho.begin(), rho.end(), W.x.begin(), compute_wx); + std::transform(W.x.begin(), W.x.end(), W.x.begin(),[&](auto &wxi) { return projector(wxi); }); + W.y = W.x.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } @@ -534,8 +534,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); - std::transform(K.X.begin(), K.X.end(), K.X.begin(),[&](auto &kxi) { return projector(kxi); }); - std::transform(K.Y.begin(), K.Y.end(), K.Y.begin(),[&](auto &kyi) { return projector(kyi); }); + std::transform(K.x.begin(), K.x.end(), K.x.begin(),[&](auto &kxi) { return projector(kxi); }); + std::transform(K.y.begin(), K.y.end(), K.y.begin(),[&](auto &kyi) { return projector(kyi); }); //auto K = response_exchange(phi0, chi_alpha, true); @@ -560,8 +560,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - std::transform(gamma.X.begin(), gamma.X.end(), gamma.X.begin(),[&](auto &gxi) { return projector(gxi); }); - std::transform(gamma.Y.begin(), gamma.Y.end(), gamma.Y.begin(),[&](auto &gyi) { return projector(gyi); }); + std::transform(gamma.x.begin(), gamma.x.end(), gamma.x.begin(),[&](auto &gxi) { return projector(gxi); }); + std::transform(gamma.y.begin(), gamma.y.end(), gamma.y.begin(),[&](auto &gyi) { return projector(gyi); }); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); @@ -646,11 +646,11 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm int b = 0; for (const auto &rho_b: rho) { auto temp_J = apply(*shared_coulomb_operator, rho_b); - J.X[b++] = mul(world, temp_J, phi0); + J.x[b++] = mul(world, temp_J, phi0); } //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); - std::transform(J.X.begin(), J.X.end(), J.X.begin(),[&](auto &jxi) { return projector(jxi); }); - J.Y = J.X.copy(); + std::transform(J.x.begin(), J.x.end(), J.x.begin(),[&](auto &jxi) { return projector(jxi); }); + J.y = J.x.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); @@ -663,9 +663,9 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm return mul(world, xc_rho, phi0); }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - std::transform(rho.begin(), rho.end(), W.X.begin(), compute_wx); - std::transform(W.X.begin(), W.X.end(), W.X.begin(),[&](auto &wxi) { return projector(wxi); }); - W.Y = W.X.copy(); + std::transform(rho.begin(), rho.end(), W.x.begin(), compute_wx); + std::transform(W.x.begin(), W.x.end(), W.x.begin(),[&](auto &wxi) { return projector(wxi); }); + W.y = W.x.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } @@ -679,7 +679,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), [&](const auto &xi) { return newK(xi, phi0, phi0); }); - std::transform(xy.Y.begin(), xy.Y.end(), KY.X.begin(), + std::transform(xy.y.begin(), xy.y.end(), KY.X.begin(), [&](const auto &yi) { return newK(phi0, yi, phi0); }); @@ -695,7 +695,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, xy, false); - std::transform(K.X.begin(), K.X.end(), K.X.begin(),[&](auto &kxi) { return projector(kxi); }); + std::transform(K.x.begin(), K.x.end(), K.x.begin(),[&](auto &kxi) { return projector(kxi); }); inner_to_json(world, "k1", response_context.inner(xy, K), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -728,8 +728,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } //for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } - std::transform(gamma.X.begin(), gamma.X.end(), gamma.X.begin(),[&](auto &gxi) { return projector(gxi); }); - gamma.Y = gamma.X.copy(); + std::transform(gamma.x.begin(), gamma.x.end(), gamma.x.begin(),[&](auto &gxi) { return projector(gxi); }); + gamma.y = gamma.x.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); @@ -776,7 +776,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto rho = transition_densityTDA(world, phi0, d_alpha.X); + auto rho = transition_densityTDA(world, phi0, d_alpha.x); auto compute_jx = [&, &phi0 = phi0](auto rho_alpha) { auto temp_J = apply(*shared_coulomb_operator, rho_alpha); @@ -810,7 +810,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density for (size_t b = 0; b < num_states; b++) { vecfuncT x; - x = d_alpha.X[b]; + x = d_alpha.x[b]; k1_x[b] = newK(x, phi0, phi0); } @@ -823,7 +823,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density J.truncate_rf(); W.truncate_rf(); - gamma.X = (J * 2) - k1_x * xcf.hf_exchange_coefficient() + W; + gamma.x = (J * 2) - k1_x * xcf.hf_exchange_coefficient() + W; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } @@ -831,8 +831,8 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density if (r_params.print_level() >= 1) { molresponse::start_timer(world); } QProjector projector(world, ground_orbitals); for (size_t i = 0; i < num_states; i++) { - gamma.X[i] = projector(gamma.X[i]); - truncate(world, gamma.X[i]); + gamma.x[i] = projector(gamma.x[i]); + truncate(world, gamma.x[i]); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); @@ -841,7 +841,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density if (r_params.print_level() >= 20) { print("------------------------ Gamma Functions Norms ------------------"); print("Gamma X norms"); - print(gamma.X.norm2()); + print(gamma.x.norm2()); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -879,9 +879,9 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator X_space E0X = Chi_truncated.copy(); E0X.truncate(); - E0X.X = E0X.X * hamiltonian; + E0X.x = E0X.x * hamiltonian; - if (compute_Y) { E0X.Y = E0X.Y * hamiltonian; } + if (compute_Y) { E0X.y = E0X.y * hamiltonian; } if (r_params.print_level() >= 20) { auto e0_mx = inner(Chi_truncated, E0X); if (world.rank() == 0) { @@ -935,8 +935,8 @@ auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, molresponse::start_timer(world); X_space T0X = X_space(world, m, n); - T0X.X = T(world, chi_copy.X); - if (compute_Y) { T0X.Y = T(world, chi_copy.Y); } + T0X.x = T(world, chi_copy.x); + if (compute_Y) { T0X.y = T(world, chi_copy.y); } if (r_params.print_level() >= 20) { print("inner "); print(inner(chi_copy, T0X)); @@ -946,8 +946,8 @@ auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, molresponse::start_timer(world); X_space E0X = chi_copy.copy(); - E0X.X = E0X.X * hamiltonian; - if (compute_Y) { E0X.Y = E0X.Y * hamiltonian; } + E0X.x = E0X.x * hamiltonian; + if (compute_Y) { E0X.y = E0X.y * hamiltonian; } molresponse::end_timer(world, "E0X", "E0X", iter_timing); @@ -1047,12 +1047,12 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< V0.truncate(); inner_to_json(world, "V0", response_context.inner(X, V0), iter_function_data); } else { - for (int b = 0; b < m; b++) { V0.X[b] = mul_sparse(world, v0, X.X[b], v_tol, false); } - V0.X.truncate_rf(); + for (int b = 0; b < m; b++) { V0.x[b] = mul_sparse(world, v0, X.x[b], v_tol, false); } + V0.x.truncate_rf(); world.gop.fence(); - V0.X += -c_xc * K0.X; - V0.Y = V0.X.copy(); - V0.X.truncate_rf(); + V0.x += -c_xc * K0.x; + V0.y = V0.x.copy(); + V0.x.truncate_rf(); inner_to_json(world, "V0", response_context.inner(X, V0), iter_function_data); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } @@ -1092,7 +1092,7 @@ auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) co T0X = to_X_space(t_xx); } else { int b = 0; - for (const auto &xi: x.X) { + for (const auto &xi: x.x) { vecfuncT dvx = apply(world, Dx, xi, false); vecfuncT dvy = apply(world, Dy, xi, false); vecfuncT dvz = apply(world, Dz, xi, false); @@ -1105,9 +1105,9 @@ auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) co vecfuncT dvy2 = apply(world, Dy, dvy, false); vecfuncT dvz2 = apply(world, Dz, dvz, false); world.gop.fence(); - T0X.X[b++] = (dvx2 + dvy2 + dvz2) * (-0.5); + T0X.x[b++] = (dvx2 + dvy2 + dvz2) * (-0.5); } - T0X.Y = T0X.X.copy(); + T0X.y = T0X.x.copy(); } return T0X; } @@ -1124,11 +1124,11 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< // chi_copy.truncate(); X_space F0X = X_space(world, m, n); X_space T0X = X_space(world, m, n); - T0X.X = T(world, chi_copy.X); + T0X.x = T(world, chi_copy.x); if (compute_Y) { - T0X.Y = T(world, chi_copy.Y); + T0X.y = T(world, chi_copy.y); } else { - T0X.Y = T0X.X.copy(); + T0X.y = T0X.x.copy(); } if (r_params.print_level() >= 20) { auto tx_m = inner(chi_copy, T0X); @@ -1166,8 +1166,8 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_space &g_chi, const std::string &calc_type) -> residuals { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - size_t m = chi.X.size(); - size_t n = chi.X.size_orbitals(); + size_t m = chi.x.size(); + size_t n = chi.x.size_orbitals(); bool compute_y = r_params.omega() != 0.0; // compute residual Tensor residual_norms; @@ -1176,8 +1176,8 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp res = g_chi - chi; residual_norms = res.norm2s(); } else { - res.X = g_chi.X - chi.X; - residual_norms = res.X.norm2(); + res.x = g_chi.x - chi.x; + residual_norms = res.x.norm2(); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); @@ -1210,7 +1210,7 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, } else { int b = 0; for (auto &kain_xb: kain_x_space) { - kain_update.X[b] = kain_xb.update(chi.X[b], residual_chi.X[b]); + kain_update.x[b] = kain_xb.update(chi.x[b], residual_chi.x[b]); b++; } } @@ -1259,10 +1259,10 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi } } } else { - auto diff = temp.X - old_Chi.X; + auto diff = temp.x - old_Chi.x; for (size_t b = 0; b < m; b++) { auto step_size = norm2(world, diff[b]); - auto norm_xb = norm2(world, old_Chi.X[b]); + auto norm_xb = norm2(world, old_Chi.x[b]); auto max_step = max_bsh_rotation;//norm;//* norm_xb; if (world.rank() == 0) { print("---------------- step restriction :", b, " ------------------"); @@ -1277,7 +1277,7 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (r_params.print_level() > 1) print(" restricting step for response-state: ", b, " step size", s); } - gaxpy(world, s, temp.X[b], (1.0 - s), old_Chi.X[b], false); + gaxpy(world, s, temp.x[b], (1.0 - s), old_Chi.x[b], false); } } } @@ -1458,18 +1458,18 @@ void ResponseBase::solve(World &world) { void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::get_thresh(), int k = FunctionDefaults<3>::get_k()) { - if (0 != Chi.X.size()) { - if (FunctionDefaults<3>::get_k() != Chi.X[0].at(0).k()) { + if (0 != Chi.x.size()) { + if (FunctionDefaults<3>::get_k() != Chi.x[0].at(0).k()) { // Project all x components into correct k - for (auto &xi: Chi.X) { + for (auto &xi: Chi.x) { reconstruct(world, xi); for (auto &xij: xi) { xij = project(xij, FunctionDefaults<3>::get_k(), thresh, false); } world.gop.fence(); } - for (auto &yi: Chi.Y) { + for (auto &yi: Chi.y) { reconstruct(world, yi); for (auto &yij: yi) { yij = project(yij, FunctionDefaults<3>::get_k(), thresh, false); @@ -1540,14 +1540,14 @@ void normalize(World &world, X_space &Chi) { for (size_t i = 0; i < Chi.num_states(); i++) { // Get the normalization constant // (Sum included inside inner) - double norm_x = inner(Chi.X[i], Chi.X[i]); - double norm_y = inner(Chi.Y[i], Chi.Y[i]); + double norm_x = inner(Chi.x[i], Chi.x[i]); + double norm_y = inner(Chi.y[i], Chi.y[i]); double norm = sqrt(norm_x - norm_y); // Doing this to deal with zero functions. // Maybe not smrt. if (norm == 0) continue; - Chi.X[i] = Chi.X[i] * (1.0 / norm); - Chi.Y[i] = Chi.Y[i] * (1.0 / norm); + Chi.x[i] = Chi.x[i] * (1.0 / norm); + Chi.y[i] = Chi.y[i] * (1.0 / norm); } } @@ -1681,10 +1681,10 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &gamm LoadBalanceDeux<3> lb(world); for (const auto &phi0_i: psi0) { lb.add_tree(phi0_i, lbcost(1.0, 8.0), false); } - for (const auto &xi: X.X) { + for (const auto &xi: X.x) { for (const auto &xij: xi) { lb.add_tree(xij, lbcost(1.0, 8.0), false); } } - for (const auto &yi: X.Y) { + for (const auto &yi: X.y) { for (const auto &yij: yi) { lb.add_tree(yij, lbcost(1.0, 8.0), false); } } world.gop.fence(); @@ -1778,7 +1778,7 @@ void ResponseBase::output_json() { auto print_time = std::chrono::system_clock::now(); auto in_time_t = std::chrono::system_clock::to_time_t(print_time); std::stringstream ss; - ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X"); + ss << std::put_time(std::localtime(&in_time_t), "%y-%m-%d %X"); print(ss.str()); nlohmann::json calc_precision = {}; @@ -1860,8 +1860,8 @@ auto transform(World &world, const X_space &x, const Tensor &U) -> X_spa // Return container X_space result(world, x.num_states(), x.num_orbitals()); - result.X = transform(world, x.X, U); - result.Y = transform(world, x.Y, U); + result.x = transform(world, x.x, U); + result.y = transform(world, x.y, U); // Done return result; } @@ -1994,8 +1994,8 @@ void sort(World &world, Tensor &vals, X_space &f) { // Put corresponding function, difference function, value residual and // value in the correct place - f.X[i] = f_copy.X[j]; - f.Y[i] = f_copy.Y[j]; + f.x[i] = f_copy.x[j]; + f.y[i] = f_copy.y[j]; vals(i) = vals_copy(i); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index f04b9324ef4..fb2d14dae0f 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -75,7 +75,7 @@ class full_inner_product : public inner_strategy { class static_inner_product : public inner_strategy { public: Tensor compute_inner(const X_space &x, const X_space &y) const override { - return response_space_inner(x.X, y.X); + return response_space_inner(x.x, y.x); } }; typedef std::vector> @@ -136,7 +136,7 @@ class ResponseBase { auto get_orbitals() const -> vector_real_function_3d { return ground_orbitals; } - auto get_chi() const->X_space{return Chi;} ; + auto get_chi() const->X_space{return Chi.copy();} ; void output_json(); @@ -351,7 +351,7 @@ class ResponseBase { truncate(world, psi_f, tol, true); // multiply by ket i |i>: |i> |i> |i> psi_f = mul_sparse(world, ket[i], psi_f, mul_tol, true);/// was vtol - /// Generalized A*X+Y for vectors of functions ---- a[i] = alpha*a[i] + + /// Generalized A*X+y for vectors of functions ---- a[i] = alpha*a[i] + // 1*Kf+occ[i]*psi_f gaxpy(world, double(1.0), Kf, double(1.0), psi_f); } diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 85850fd98c5..a891295e8ca 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -73,7 +73,7 @@ auto ground_exchange(const vecfuncT &phi0, const X_space &x, const bool compute_ // place all x } else { n = 1; - xx = x.X.x; + xx = x.x.x; // if not compute y we are only working with the x functions } auto n_exchange = n * num_states * num_orbitals * num_orbitals; @@ -166,10 +166,10 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput b_index = b * num_orbitals * num_orbitals * n; for (long j = 0; j < num_orbitals; j++) { p_index = j * num_orbitals; - std::transform(x.X[b].begin(), x.X[b].end(), x_vector.begin() + b_index + p_index, + std::transform(x.x[b].begin(), x.x[b].end(), x_vector.begin() + b_index + p_index, [&](const auto &xbi) { return copy(xbi, false); }); - std::transform(x.Y[b].begin(), x.Y[b].end(), + std::transform(x.y[b].begin(), x.y[b].end(), x_vector_conjugate.begin() + b_index + p_index, [&](const auto &xbi) { return copy(xbi, false); }); } @@ -177,10 +177,10 @@ auto response_exchange(const vecfuncT &phi0, const X_space &x, const bool comput long y_shift = num_orbitals * num_orbitals; for (long j = 0; j < num_orbitals; j++) { p_index = j * num_orbitals; - std::transform(x.Y[b].begin(), x.Y[b].end(), + std::transform(x.y[b].begin(), x.y[b].end(), x_vector.begin() + b_index + p_index + y_shift, [&](const auto &ybi) { return copy(ybi, false); }); - std::transform(x.X[b].begin(), x.X[b].end(), + std::transform(x.x[b].begin(), x.x[b].end(), x_vector_conjugate.begin() + b_index + p_index + y_shift, [&](const auto &ybi) { return copy(ybi, false); }); } @@ -291,7 +291,7 @@ auto molresponseExchange(World &world, const vecfuncT &ket_i, const vecfuncT &br if (n == 2) { K0 = to_X_space(exchange_matrix); } else { - K0.X = exchange_matrix; + K0.x = exchange_matrix; } world.gop.fence(); molresponse::end_timer(world, "ground exchange reorganize"); @@ -329,8 +329,8 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons if (compute_y) { for (int b = 0; b < num_states; b++) { - auto x = chi.X[b]; - auto y = chi.Y[b]; + auto x = chi.x[b]; + auto y = chi.y[b]; auto K1X = make_k(x, phi0); auto K1Y = make_k(phi0, y); @@ -345,17 +345,17 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); - K.Y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); - K.Y[b][0].print_info(); + K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); + K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); + K.y[b][0].print_info(); world.gop.fence(); } } else { for (int b = 0; b < num_states; b++) { - auto x = chi.X[b]; - auto y = chi.X[b]; + auto x = chi.x[b]; + auto y = chi.x[b]; auto K1X = make_k(x, phi0); auto K1Y = make_k(phi0, y); @@ -363,7 +363,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons k1x = K1X(phi0); k1y = K1Y(phi0); - K.X[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, true); + K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, true); } } return K; @@ -395,12 +395,12 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const auto k0 = make_k(phi0, phi0); if (compute_y) { for (int b = 0; b < num_states; b++) { - K0.X[b] = k0(chi.X[b]); - K0.Y[b] = k0(chi.Y[b]); + K0.x[b] = k0(chi.x[b]); + K0.y[b] = k0(chi.y[b]); } } else { - for (int b = 0; b < num_states; b++) { K0.X[b] = k0(chi.X[b]); } - K0.Y = K0.X.copy(); + for (int b = 0; b < num_states; b++) { K0.x[b] = k0(chi.x[b]); } + K0.y = K0.x.copy(); } K0.truncate(); return K0; diff --git a/src/apps/molresponse/testing/x_space_testing.cpp b/src/apps/molresponse/testing/x_space_testing.cpp index 5959887eb81..23b8de5e270 100644 --- a/src/apps/molresponse/testing/x_space_testing.cpp +++ b/src/apps/molresponse/testing/x_space_testing.cpp @@ -37,11 +37,11 @@ TEST_CASE("Testing New X SPACE") { std::cout.precision(6); std::string filename = "response.in"; - std::string load_x = "restart_dipole_hf_0-000000.000000"; double frequency = 0.0; std::string property = "dipole"; auto calc_params = initialize_calc_params(world, std::string(filename)); + print(calc_params.response_parameters.restart_file()); RHS_Generator rhs_generator; if (property == "dipole") { @@ -50,16 +50,71 @@ TEST_CASE("Testing New X SPACE") { rhs_generator = nuclear_generator; } FrequencyResponse calc(world, calc_params, frequency, rhs_generator); - calc.load(world, load_x); + calc.load(world, calc_params.response_parameters.save_file()); auto x = calc.get_chi(); + print(x.num_states()); + print(x.num_orbitals()); + //calc.check_k(world,1e-4,7); + + auto PQ = calc.generator(world, calc); + PQ.truncate(); + - auto m = x.num_states(); - x.active.resize(m); int i = 0; for (auto &ai: x.active) { ai = i++; } print(x.active); + auto pn = PQ.norm2s(); + auto xn = x.norm2s(); + + auto add = x + PQ; + print("x: ", xn); + print("p: ", pn); + print("x+p", add.norm2s()); + + vector converged{1, 0, 0}; + int b = 0; + x.active.remove_if([&](auto x) { return converged[b++]; }); + b = 0; + + print("x active", x.active); + auto add_1 = x + PQ; + print("x+p after remove", add_1.norm2s()); + x.reset_active(); + auto add_2 = x + PQ; + auto norm2 = add_2.norm2s(); + print("x+p after reset", add_2.norm2s()); + CHECK(add_2.norm2s()[0] != add_1.norm2s()[0]); + + b = 0; + x.active.remove_if([&](auto x) { return converged[b++]; }); + x += PQ + x; + print("x+=pQ ", x.norm2s()); + x = x - PQ; + print("x=x-PQ ", x.norm2s()); - // A calculation is defined by a molecule, functional, and operator - // xc inclu + auto base = {1e-3, 1e-5, 1e-4}; + vector> ri(base.size()); + + std::transform(base.begin(), base.end(), ri.begin(), [](auto vi) { + return std::pair{vi, vi * 5}; + }); + + std::pair threshold{1e-3, 5e-4}; + + std::transform(ri.begin(), ri.end(), converged.begin(), [&](auto &resi) { + if (resi.first < threshold.first && resi.second < threshold.second) { + return true; + } else { + return false; + } + }); + x.reset_active(); + print(converged); + b = 0; + x.active.remove_if([&](auto x) { return converged[b++]; }); + print(x.norm2s()); + print((x + PQ).norm2s()); } + + diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 86ebee20e33..c56038d5ed7 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -61,23 +61,23 @@ namespace madness std::for_each(mX.begin(), mX.end(), [&](vector_real_function_3d &mi) { mi = vector_real_function_3d(2 * num_orbitals); - std::copy(x.X[b].begin(), x.X[b].end(), mi.begin()); // shallow copy - std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin() + num_orbitals);// shallow copy + std::copy(x.x[b].begin(), x.x[b].end(), mi.begin()); // shallow copy + std::copy(x.y[b].begin(), x.y[b].end(), mi.begin() + num_orbitals);// shallow copy b++; }); return mX; } auto to_conjugate_response_matrix(const X_space &x) -> response_matrix { - World &world = x.X[0][0].world(); + World &world = x.x[0][0].world(); auto mX = response_matrix(x.num_states()); int b = 0; auto num_orbitals = x.num_orbitals(); std::for_each(mX.begin(), mX.end(), [&](auto &mi) { mi = vector_real_function_3d(2 * num_orbitals); - std::copy(x.Y[b].begin(), x.Y[b].end(), mi.begin()); // shallow copy - std::copy(x.X[b].begin(), x.X[b].end(), mi.begin() + num_orbitals);// shallow copy + std::copy(x.y[b].begin(), x.y[b].end(), mi.begin()); // shallow copy + std::copy(x.x[b].begin(), x.x[b].end(), mi.begin() + num_orbitals);// shallow copy b++; }); return mX; } @@ -90,7 +90,7 @@ namespace madness auto to_flattened_vector(const X_space &x) -> vector_real_function_3d { - World &world = x.X[0][0].world(); + World &world = x.x[0][0].world(); auto num_orbitals = 2 * x.num_orbitals(); auto vij = vector_real_function_3d(x.num_states() * num_orbitals); auto mx = to_response_matrix(x); @@ -113,8 +113,8 @@ namespace madness int b = 0; for (const auto &x_vec : x) { - std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.X[b].begin()); - std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.Y[b].begin()); + std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.x[b].begin()); + std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.y[b].begin()); b++; }; return x_space; @@ -138,9 +138,9 @@ namespace madness int b = 0; std::for_each(x.begin(), x.end(), [&](auto x_vec) { - std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.Y[b].begin(), + std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.y[b].begin(), [&](const auto &xi) { return copy(xi, false); }); - std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.X[b].begin(), + std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.x[b].begin(), [&](const auto &xi) { return copy(xi, false); }); b++; }); world.gop.fence(); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 948fb7be4c4..57251907e96 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -13,7 +13,11 @@ #include "molresponse/response_functions.h" + namespace madness { + + typedef std::vector response_matrix; + struct X_space; auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d; @@ -30,24 +34,38 @@ namespace madness { size_t n_orbitals;// Num. of ground states public: - response_space X, Y; + response_space x, y; std::list active; public: - size_t num_states() const { return n_states; } - size_t num_orbitals() const { return n_orbitals; } + [[nodiscard]] size_t num_states() const { return n_states; } + [[nodiscard]] size_t num_orbitals() const { return n_orbitals; } // default constructor - X_space() : n_states(0), n_orbitals(0), X(), Y() {} + X_space() : n_states(0), n_orbitals(0), x(), y(), active(0) {} // Copy constructor + void reset_active() { + active.resize(n_states); + size_t i{0}; + for (auto &ai: active) { ai = i++; } + } X_space(const X_space &A) - : n_states(size_states(A)), n_orbitals(size_orbitals(A)), X(A.X), Y(A.Y) {} + : n_states(size_states(A)), n_orbitals(size_orbitals(A)), x(A.x), y(A.y), + active(A.active) {} [[nodiscard]] X_space copy() const { - auto &world = X[0][0].world(); - auto m = to_response_matrix(*this); - auto copy_m = create_response_matrix(num_states(), num_orbitals()); - std::transform(m.begin(), m.end(), copy_m.begin(), - [&](const auto &mi) { return madness::copy(world, mi, true); }); - return to_X_space(copy_m); + auto &world = x[0][0].world(); + + auto new_x = X_space(*this);// copy + response_matrix copy_x(n_states); + response_matrix copy_y(n_states); + + std::transform(x.begin(), x.end(), copy_x.begin(), + [&](const auto &xi) { return madness::copy(world, xi, true); }); + std::transform(y.begin(), y.end(), copy_y.begin(), + [&](const auto &xi) { return madness::copy(world, xi, true); }); + new_x.x = copy_x; + new_x.x = copy_y; + + return new_x; } /// Create a new copy of the function with different distribution and optional /// fence @@ -55,14 +73,20 @@ namespace madness { /// Works in either basis. Different distributions imply /// asynchronous communication and the optional fence is /// collective. - [[nodiscard]] auto copy(const std::shared_ptr>> &pmap, + [[nodiscard]] auto copy(const std::shared_ptr>> &p_map, bool fence = false) const -> X_space { - auto &world = X[0][0].world(); - auto m = to_response_matrix(*this); - auto copy_m = create_response_matrix(num_states(), num_orbitals()); - std::transform(m.begin(), m.end(), copy_m.begin(), - [&](const auto &mi) { return madness::copy(world, mi, pmap, true); }); - return to_X_space(copy_m); + auto &world = x[0][0].world(); + auto new_x = X_space(*this);// copy + response_matrix copy_x(n_states); + response_matrix copy_y(n_states); + + std::transform(x.begin(), x.end(), copy_x.begin(), + [&](const auto &xi) { return madness::copy(world, xi, p_map, true); }); + std::transform(y.begin(), y.end(), copy_y.begin(), + [&](const auto &xi) { return madness::copy(world, xi, p_map, true); }); + new_x.x = copy_x; + new_x.x = copy_y; + return new_x; } // assignment auto operator=(const X_space &B) -> X_space & { @@ -70,55 +94,57 @@ namespace madness { this->n_states = B.num_states(); this->n_orbitals = B.num_orbitals(); - this->X = B.X; - this->Y = B.Y; + this->x = B.x; + this->y = B.y; + this->active = B.active; } return *this;// NO SHALLOW COPIES } // Zero Constructor X_space(World &world, size_t n_states, size_t n_orbitals) - : n_states(n_states), n_orbitals(n_orbitals), X(world, n_states, n_orbitals), - Y(world, n_states, n_orbitals) {} - // explicit constructor from 2 resonse_space - explicit X_space(response_space &X, response_space &Y) { - MADNESS_ASSERT(X.size() == Y.size()); - MADNESS_ASSERT(X[0].size() == Y[0].size()); - this->n_states = X.size(); - this->n_orbitals = X[0].size(); - this->X = X.copy(); - this->Y = Y.copy(); + : n_states(n_states), n_orbitals(n_orbitals), x(world, n_states, n_orbitals), + y(world, n_states, n_orbitals), active(n_states) { + reset_active(); } void clear() { - X.clear(); - Y.clear(); + x.clear(); + y.clear(); } auto operator+(const X_space &B) -> X_space { MADNESS_ASSERT(same_size(*this, B)); - World &world = this->X[0][0].world(); - auto ax = to_response_matrix(*this); - auto bx = to_response_matrix(B); - response_matrix add_x(num_states()); - std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { - return gaxpy_oop(1.0, a, 1.0, b, false); - }); + World &world = this->x[0][0].world(); + X_space add_x = this->copy(); + + for (const auto &i: active) { + auto ax = add_x.x[i]; + auto bx = B.x[i]; + auto ay = add_x.y[i]; + auto by = B.y[i]; + add_x.x[i] = gaxpy_oop(1.0, ax, 1.0, bx, false); + add_x.y[i] = gaxpy_oop(1.0, ay, 1.0, by, false); + } world.gop.fence(); - return to_X_space(add_x); + + return add_x; } auto operator+=(const X_space &B) -> X_space & { MADNESS_ASSERT(same_size(*this, B)); - auto ax = to_response_matrix(*this); - auto bx = to_response_matrix(B); - auto &world = ax[0][0].world(); + auto &world = this->x[0][0].world(); int b = 0; - std::for_each(ax.begin(), ax.end(), - [&](auto &a) { gaxpy(world, 1.0, a, 1.0, bx[b++], false); }); + for (const auto &i: active) { + auto ax = this->x[i]; + auto bx = B.x[i]; + auto ay = this->y[i]; + auto by = B.y[i]; + gaxpy(world, 1.0, ax, 1.0, bx, false); + gaxpy(world, 1.0, ay, 1.0, by, false); + } world.gop.fence(); return *this; } - void push_back(const vector_real_function_3d &x, const vector_real_function_3d &y) { + void push_back(const vector_real_function_3d &vx, const vector_real_function_3d &vy) { if (n_orbitals > 0) { MADNESS_ASSERT(n_orbitals == x.size()); MADNESS_ASSERT(n_orbitals == y.size()); @@ -128,128 +154,128 @@ namespace madness { } MADNESS_ASSERT(x.size() == num_orbitals()); MADNESS_ASSERT(y.size() == num_orbitals()); - + active.push_back(active.back() + 1); n_states++; - X.push_back(x); - Y.push_back(y); + x.push_back(vx); + y.push_back(vy); // Be smart with g_states } void pop_back() { - X.pop_back(); - Y.pop_back(); + x.pop_back(); + y.pop_back(); + active.pop_back(); n_states--; if (n_states == 0) { n_orbitals = 0; } } static X_space zero_functions(World &world, size_t n_states, size_t n_orbitals) { auto zeros = X_space(world, n_states, n_orbitals); - for (auto &xi: zeros.X) { + for (auto &xi: zeros.x) { xi = ::madness::zero_functions(world, n_orbitals, false); } - for (auto &yi: zeros.Y) { + for (auto &yi: zeros.y) { yi = ::madness::zero_functions(world, n_orbitals, false); } world.gop.fence(); return zeros; } + friend auto inplace_apply(X_space &A, + const std::function &func) { + for (auto &i: A.active) { + func(A.x[i]); + func(A.y[i]); + } + } - friend auto operator+(const X_space &A, const X_space &B) -> X_space { - MADNESS_ASSERT(same_size(A, B)); - World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals);// create zero_functions - auto ax = to_response_matrix(A); - auto bx = to_response_matrix(B); - response_matrix add_x(A.num_states()); - std::transform(ax.begin(), ax.end(), bx.begin(), add_x.begin(), - [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { - return gaxpy_oop(1.0, a, 1.0, b, false); - }); - world.gop.fence(); - return to_X_space(add_x); + friend auto + oop_apply(const X_space &A, + const std::function + &func) { + auto result = A.copy(); + for (auto &i: result.active) { + result.x[i] = func(A.x[i]); + result.y[i] = func(A.y[i]); + } + return result; } - /* - // C=this-B - X_space operator-(const X_space &B) const { - MADNESS_ASSERT(same_size(*this, B)); + friend auto + binary_apply(const X_space &A, X_space const &B, + const std::function &func) + -> X_space { + MADNESS_ASSERT(same_size(A, B)); + + X_space result = A.copy();// create zero_functions + auto &world = result.x[0][0].world(); - auto ax = to_response_matrix(*this); - auto bx = to_response_matrix(B); + for (const auto &i: result.active) { + auto ax = result.x[i]; + auto bx = B.x[i]; + auto ay = result.y[i]; + auto by = B.y[i]; + result.x[i] = func(ax, bx); + result.y[i] = func(ay, by); + } + world.gop.fence(); + return result; + } - response_matrix result(B.num_states()); - std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), - [&](const auto &a, const auto &b) { return a - b; }); - return to_X_space(result); + friend auto operator+(const X_space &A, const X_space &B) -> X_space { + MADNESS_ASSERT(same_size(A, B)); + MADNESS_ASSERT(same_size(A, B)); + return binary_apply(A, B, [](const auto &a, const auto &b) { + return gaxpy_oop(1.0, a, 1.0, b, false); + }); } - */ + friend X_space operator-(const X_space &A, const X_space &B) { MADNESS_ASSERT(same_size(A, B)); - auto ax = to_response_matrix(A); - auto bx = to_response_matrix(B); - response_matrix result(B.num_states()); - std::transform(ax.begin(), ax.end(), bx.begin(), result.begin(), - [&](const vector_real_function_3d &a, const vector_real_function_3d &b) { - return gaxpy_oop(1.0, a, -1.0, b, false); - }); - ax[0][0].world().gop.fence(); - return to_X_space(result); + return binary_apply(A, B, [](const auto &a, const auto &b) { + return gaxpy_oop(1.0, a, -1.0, b, false); + }); } friend X_space operator*(const X_space &A, const double &b) { - World &world = A.X[0][0].world(); - auto rX = response_matrix(A.n_states);// create zero_functions - auto ax = to_response_matrix(A); // create zero_functions - int i = 0; - for (const vector_real_function_3d &ai: ax) { - rX[i] = madness::copy(world, ai, true); - scale(world, rX[i], b, false); - i++; - } - return to_X_space(rX); + World &world = A.x[0][0].world(); + auto result = A.copy(); + auto scale_a = [&](vector_real_function_3d &vec_ai) { scale(world, vec_ai, b, false); }; + inplace_apply(result, scale_a); + return result; } friend X_space operator*(const double &b, const X_space &A) { - World &world = A.X[0][0].world(); - auto rX = response_matrix(A.n_states);// create zero_functions - auto ax = to_response_matrix(A); // create zero_functions - int i = 0; - for (const vector_real_function_3d &ai: ax) { - rX[i] = madness::copy(world, ai, true); - scale(world, rX[i], b, false); - i++; - } - // b* ai is bugged. scale does not fence - world.gop.fence(); - return to_X_space(rX); + World &world = A.x[0][0].world(); + auto result = A.copy(); + auto scale_a = [&](vector_real_function_3d &vec_ai) { scale(world, vec_ai, b, false); }; + inplace_apply(result, scale_a); + return result; } friend X_space operator*(const X_space &A, const Function &f) { - World &world = A.X[0][0].world(); - auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions - auto ax = to_response_matrix(A); - int i = 0; - for (const auto &ai: ax) { rX[i++] = mul(world, f, ai, false); } - world.gop.fence(); - return to_X_space(rX); + World &world = A.x[0][0].world(); + auto mul_f = [&](const vector_real_function_3d &vec_ai) { + return mul(world, f, vec_ai, false); + }; + auto result = oop_apply(A, mul_f); + return result; } friend auto operator*(const Function &f, const X_space &A) -> X_space { - World &world = A.X[0][0].world(); - auto rX = create_response_matrix(A.n_states, A.n_orbitals);// create zero_functions - auto ax = to_response_matrix(A); - int i = 0; - for (const auto &ai: ax) { rX[i++] = mul(world, f, ai, false); } - world.gop.fence(); - return to_X_space(rX); + World &world = A.x[0][0].world(); + auto mul_f = [&](const vector_real_function_3d &vec_ai) { + return mul(world, f, vec_ai, false); + }; + auto result = oop_apply(A, mul_f); + return result; } friend auto operator*(const X_space &A, const Tensor &b) -> X_space { MADNESS_ASSERT(size_states(A) > 0); MADNESS_ASSERT(size_orbitals(A) > 0); - World &world = A.X[0][0].world(); - X_space result(world, A.n_states, A.n_orbitals); - result.X = A.X * b; - result.Y = A.Y * b; + World &world = A.x[0][0].world(); + auto transform_ai = [&](auto &ai) { return transform(world, ai, b, false); }; + auto result = oop_apply(A, transform_ai); return result; } @@ -264,15 +290,16 @@ namespace madness { void truncate() { auto rx = to_response_matrix(*this); auto &world = rx[0][0].world(); - std::for_each(rx.begin(), rx.end(), [&](auto &xi) { - madness::truncate(world, xi, FunctionDefaults<3>::get_thresh(), false); - }); - world.gop.fence(); + auto truncate_i = [&](auto &fi) { + madness::truncate(world, fi, FunctionDefaults<3>::get_thresh(), false); + }; + inplace_apply(*this, truncate_i); } auto norm2s() -> Tensor { - World &world = X[0][0].world(); + World &world = x[0][0].world(); Tensor norms(num_states()); + auto x = to_response_matrix(*this); int b = 0; for (const auto &xb: x) { norms[b++] = norm2(world, xb); } @@ -281,7 +308,7 @@ namespace madness { } [[nodiscard]] auto component_norm2s() const -> Tensor { - World &world = X[0][0].world(); + World &world = x[0][0].world(); auto rx = to_flattened_vector(*this); auto norms = norm2s_T(world, rx); return norms.reshape(n_states, 2 * n_orbitals); @@ -302,39 +329,36 @@ namespace madness { this->X_space::zero_functions(world, size_t(1), n_orbtials); } - X_vector(X_space A, size_t b) : X_space(A.X[0][0].world(), size_t(1), A.num_orbitals()) { - X[0] = A.X[b]; - Y[0] = A.Y[b]; + X_vector(X_space A, size_t b) : X_space(A.x[0][0].world(), size_t(1), A.num_orbitals()) { + x[0] = A.x[b]; + y[0] = A.y[b]; } friend X_vector operator-(const X_vector &A, const X_vector &B) { MADNESS_ASSERT(same_size(A, B)); - World &world = A.X[0][0].world(); + World &world = A.x[0][0].world(); X_vector result(world, size_orbitals(A));// create zero_functions - result.X = A.X - B.X; - result.Y = A.Y - B.Y; + result.x = A.x - B.x; + result.y = A.y - B.y; return result; } friend X_vector operator*(const X_vector &A, const double &c) { - World &world = A.X[0][0].world(); + World &world = A.x[0][0].world(); X_vector result(world, size_orbitals(A));// create zero_functions - result.X = A.X * c; - result.Y = A.Y * c; + result.x = A.x * c; + result.y = A.y * c; return result; } X_vector copy() const { - X_vector copyX(X[0][0].world(), X.num_orbitals); - copyX.X = X.copy(); - copyX.Y = Y.copy(); + X_vector copyX(x[0][0].world(), x.num_orbitals); + copyX.x = x.copy(); + copyX.y = y.copy(); return copyX; } auto operator+=(const X_vector &B) -> X_vector & { MADNESS_ASSERT(same_size(*this, B)); - - - this->X += B.X; - this->Y += B.Y; - + this->x += B.x; + this->y += B.y; return *this; } inline friend auto inner(X_vector &A, X_vector &B) -> double { @@ -346,13 +370,13 @@ namespace madness { Tensor G1(1, 1); Tensor G2(1, 1); - World &world = A.X[0][0].world(); + World &world = A.x[0][0].world(); - auto ax = madness::copy(world, A.X[0]); - auto ay = madness::copy(world, A.Y[0]); + auto ax = madness::copy(world, A.x[0]); + auto ay = madness::copy(world, A.y[0]); - auto bx = madness::copy(world, B.X[0]); - auto by = madness::copy(world, B.Y[0]); + auto bx = madness::copy(world, B.x[0]); + auto by = madness::copy(world, B.y[0]); for (auto &ayi: ay) { ax.push_back(madness::copy(ayi)); } for (auto &byi: by) { bx.push_back(madness::copy(byi)); }; From 64f8383816d8ef191bc1cd2bc65671f4fccbc738 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 14:39:56 -0400 Subject: [PATCH 1085/1312] response_space active change --- src/apps/molresponse/FrequencyResponse.cpp | 29 ++- src/apps/molresponse/ResponseBase.hpp | 5 +- src/apps/molresponse/response_functions.h | 235 ++++++++++-------- .../molresponse/testing/x_space_testing.cpp | 39 +++ src/apps/molresponse/x_space.h | 123 +++++---- 5 files changed, 257 insertions(+), 174 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 78b80850b67..0c966627ad3 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -93,7 +93,9 @@ void FrequencyResponse::iterate(World &world) { //PQ = PQ * mask; PQ = generator(world, *this); PQ.truncate(); - // vector converged(Chi.num_states(),false); + vector converged(Chi.num_states(), false); + bool all_done = false; + Chi.reset_active(); for (iter = 0; iter < r_params.maxiter(); ++iter) { iter_timing.clear(); @@ -144,13 +146,26 @@ void FrequencyResponse::iterate(World &world) { print("bsh residual target : ", bsh_abs_target); } } - if ((d_residual < density_target) and - ((max_bsh < bsh_abs_target) or r_params.get("conv_only_dens"))) { - converged = true; + auto check_convergence = [&](auto &ri, auto &di) { + return ri < max_relative_bsh && di < density_target; + }; + std::transform(bsh_relative_residualsX.ptr(), bsh_residualsX.ptr() + m, + density_residuals.ptr(), converged.begin(), check_convergence); + + int b = 0; + Chi.active.remove_if([&](auto x) { return converged[b++]; }); + world.gop.fence(); + + if (world.rank() == 0) { + print("converged", converged); + print("active", Chi.active); } - if (converged || iter == r_params.maxiter()) { + + all_done = std::all_of(converged.begin(), converged.end(), [](auto ci) { return ci; }); + + if (all_done || iter == r_params.maxiter()) { // if converged print converged - if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { + if (world.rank() == 0 && all_done and (r_params.print_level() > 1)) { print("\nConverged!\n"); } if (r_params.save()) { @@ -228,7 +243,7 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) print("\n"); // Did we converge? - if (iter == r_params.maxiter() && not converged) { + if (iter == r_params.maxiter() && not all_done) { if (world.rank() == 0) print(" Failed to converge. Reason:"); if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index fb2d14dae0f..108dc744363 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -74,7 +74,7 @@ class full_inner_product : public inner_strategy { class static_inner_product : public inner_strategy { public: - Tensor compute_inner(const X_space &x, const X_space &y) const override { + [[nodiscard]] Tensor compute_inner(const X_space &x, const X_space &y) const override { return response_space_inner(x.x, y.x); } }; @@ -146,6 +146,8 @@ class ResponseBase { mutable std::map> iter_timing; mutable std::map> iter_function_data; + Context response_context; + protected: // Given molecule returns the nuclear potential of the molecule ResponseParameters r_params; @@ -156,7 +158,6 @@ class ResponseBase { XCfunctional xcf; real_function_3d mask; - Context response_context; std::shared_ptr potential_manager; // shared pointers to Operators diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index db7a61e8e95..f2fcfabebda 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -33,6 +33,7 @@ namespace madness { size_t num_states; // Num. of resp. states size_t num_orbitals;// Num. of ground states response_matrix x; + std::list active; // Member functions public: @@ -42,7 +43,13 @@ namespace madness { * num_orbitals(0) * x() default constructor of std::vector */ - response_space() : num_states(0), num_orbitals(0), x() {} + response_space() : num_states(0), num_orbitals(0), x(), active(0) {} + + void reset_active() { + active.resize(num_states); + size_t i{0}; + for (auto &ai: active) { ai = i++; } + } // Copy constructor /** @@ -53,7 +60,7 @@ namespace madness { * @param y */ response_space(const response_space &y) - : num_states(y.size()), num_orbitals(y.size_orbitals()), x(y.x) {} + : num_states(y.size()), num_orbitals(y.size_orbitals()), x(y.x), active(y.active) {} // assignment // Copy assignment should copy the members of y and leave y Unchanged @@ -64,6 +71,7 @@ namespace madness { this->num_states = y.size(); this->num_orbitals = y.size_orbitals(); this->x = y.x; + this->active = y.active; if (x.size() != num_states) { x.resize(num_states); } } return *this;// @@ -89,8 +97,10 @@ namespace madness { * @param num_orbitals */ response_space(World &world, size_t num_states, size_t num_orbitals) - : num_states(num_states), num_orbitals(num_orbitals), x(response_matrix(num_states)) { + : num_states(num_states), num_orbitals(num_orbitals), x(response_matrix(num_states)), + active(num_states) { for (auto &state: x) { state = vector_real_function_3d(num_orbitals); } + reset_active(); //world.gop.fence(); } // Conversion from respones_matrix @@ -100,105 +110,134 @@ namespace madness { * @param x */ explicit response_space(const response_matrix &x) - : num_states(x.size()), num_orbitals(x[0].size()), x(x) {} + : num_states(x.size()), num_orbitals(x[0].size()), x(x), active(num_states) { + reset_active(); + } // Determines if two ResponseFunctions are the same size friend bool same_size(const response_space &a, const response_space &b) { return ((a.size() == b.size()) && (a.size_orbitals() == b.size_orbitals())); } + // Returns a deep copy + [[nodiscard]] response_space copy() const { + World &world = x[0][0].world(); + response_space result(world, num_states, num_orbitals); + std::transform(x.begin(), x.end(), result.x.begin(), + [&world](auto &xi) { return madness::copy(world, xi, false); }); + world.gop.fence(); + return result; + } + [[nodiscard]] response_space copy(const std::shared_ptr>> &pmap, + bool fence = false) const { + auto &world = x[0][0].world(); + response_space result(world, num_states, num_orbitals); + world.gop.fence(); + std::transform(x.begin(), x.end(), result.x.begin(), + [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); + return result; + } - // 1D accessor for x - // std::vector> &operator[](int64_t i) { return x[i]; } - /** - * @brief access vector of functions with std::vector.at() - * - * @param i - * @return vector_real_function_3d& - */ vector_real_function_3d &operator[](size_t i) { return x.at(i); } - - /** - * @brief access vector of functions const - * - * @param i - * @return const vector_real_function_3d& - */ const vector_real_function_3d &operator[](size_t i) const { return x.at(i); } - // KAIN must have this - // element wise addition. we add each vector separately - // addition c = this.x+b - // we need a new function - /** - * @brief elementwise addition of response_space - * - * @param rhs_y - * @return response_space - */ + friend auto + inplace_unary_apply(response_space &A, + const std::function &func) { + auto &world = A.x[0][0].world(); + for (auto &i: A.active) { func(A.x[i]); } + world.gop.fence(); + } + + friend auto oop_unary_apply( + const response_space &A, + const std::function &func) + -> response_space { + auto result = A.copy(); + auto &world = result.x[0][0].world(); + for (auto &i: result.active) { result.x[i] = func(A.x[i]); } + world.gop.fence(); + return result; + } + + friend auto + binary_apply(const response_space &A, const response_space &B, + const std::function &func) + -> response_space { + MADNESS_ASSERT(same_size(A, B)); + + response_space result = A.copy();// create zero_functions + auto &world = result.x[0][0].world(); + + for (const auto &i: result.active) { + auto ax = result.x[i]; + auto bx = B.x[i]; + result.x[i] = func(ax, bx); + } + world.gop.fence(); + return result; + } + + template + friend auto binary_inplace(response_space &A, const response_space &B, const T &func) { + MADNESS_ASSERT(same_size(A, B)); + auto &world = A.x[0][0].world(); + for (const auto &i: A.active) { + auto ax = A.x[i]; + auto bx = B.x[i]; + func(ax, bx); + } + world.gop.fence(); + + return A; + } + response_space operator+(const response_space &rhs_y) const { + MADNESS_ASSERT(size() > 0); MADNESS_ASSERT(same_size(*this, rhs_y));// assert that same size - World &world = this->x[0][0].world(); - response_space result(world, num_states, num_orbitals);// create zero_functions - for (size_t i = 0; i < num_states; i++) { result[i] = x[i] + rhs_y[i]; } + + auto result = binary_apply(*this, rhs_y, [&](auto xi, auto vi) { + return gaxpy_oop(1.0, xi, 1.0, vi, false); + }); return result; } - /* - friend response_space operator+(const response_space& a, - const response_space& b) { - return a.operator+(b); - } - */ - /** - * @brief elementwise subtraction of response space - * - * @param rhs_y - * @return response_space - */ response_space operator-(const response_space &rhs_y) const { MADNESS_ASSERT(size() > 0); MADNESS_ASSERT(same_size(*this, rhs_y));// assert that same size - World &world = this->x[0][0].world(); - response_space result(world, num_states, num_orbitals);// create zero_functions - for (size_t i = 0; i < num_states; i++) { - result[i] = gaxpy_oop(1.0, x[i], -1.0, rhs_y[i], false); - } - world.gop.fence(); + auto result = binary_apply(*this, rhs_y, [&](auto xi, auto vi) { + return gaxpy_oop(1.0, xi, -1.0, vi, false); + }); return result; } - /** - * @brief multiplication by scalar - * - * @param y - * @param a - * @return response_space - */ - friend response_space operator*(response_space y, double a) { + friend response_space operator*(const response_space &y, double a) { World &world = y.x.at(0).at(0).world(); - response_space result = y.copy();// deep copy - for (unsigned int i = 0; i < y.num_states; i++) { - madness::scale(world, result[i], a, false); - } - world.gop.fence(); + auto multiply_scalar = [&](vector_real_function_3d &vi) { + madness::scale(world, vi, a, false); + }; + auto result = y.copy(); + inplace_unary_apply(result, multiply_scalar); return result; } - friend response_space operator*(double a, response_space y) { + friend response_space operator*(double a, response_space &y) { World &world = y.x.at(0).at(0).world(); - response_space result = y.copy();// deep copy - for (unsigned int i = 0; i < y.num_states; i++) { - madness::scale(world, result[i], a, false); - } - world.gop.fence(); + auto multiply_scalar = [&](vector_real_function_3d &vi) { + madness::scale(world, vi, a, false); + }; + auto result = y.copy(); + inplace_unary_apply(result, multiply_scalar); return result; } response_space &operator*=(double a) { World &world = this->x[0][0].world(); - for (size_t i = 0; i < num_states; i++) { madness::scale(world, this->x[i], a, false); } - world.gop.fence(); + auto multiply_scalar = [&](vector_real_function_3d &vi) { + madness::scale(world, vi, a, false); + }; + inplace_unary_apply(*this, multiply_scalar); return *this; } @@ -206,9 +245,10 @@ namespace madness { // g[i][j] = x[i][j] * f friend response_space operator*(const response_space &a, const Function &f) { World &world = a.x.at(0).at(0).world(); - response_space result(world, a.num_states, a.num_orbitals);// create zero_functions - for (unsigned int i = 0; i < a.num_states; i++) { result[i] = a[i] * f; } - return result; + auto multiply_scalar_function = [&](const vector_real_function_3d &vi) { + return mul(world, f, vi, false); + }; + return oop_unary_apply(a, multiply_scalar_function); } // Scaling all internal functions by an external function @@ -220,51 +260,42 @@ namespace madness { response_space operator*(const Function &f) { World &world = x[0][0].world(); - response_space result(world, num_states, num_orbitals);// create zero_functions - for (size_t i = 0; i < num_states; i++) { result[i] = x[i] * f; } - return result; + + auto multiply_scalar_function = [&](const vector_real_function_3d &vi) { + return mul(world, f, vi, false); + }; + + return oop_unary_apply(*this, multiply_scalar_function); } friend response_space operator*(const response_space &a, const Tensor &b) { MADNESS_ASSERT(a.size() > 0); MADNESS_ASSERT(!a[0].empty()); World &world = a[0][0].world(); - response_space result(world, a.num_states, a.num_orbitals); - for (unsigned int i = 0; i < a.size(); i++) { - result[i] = transform(world, a[i], b, false); - } - return result; + + auto response_transform = [&](const vector_real_function_3d &vi) { + return transform(world, vi, b, false); + }; + return oop_unary_apply(a, response_transform); } // KAIN must have this response_space &operator+=(const response_space &b) { MADNESS_ASSERT(same_size(*this, b)); auto &world = x[0][0].world(); - for (size_t i = 0; i < num_states; i++) { this->x[i] += b[i]; } - world.gop.fence(); + + auto a_plus_equal_b = [&](vector_real_function_3d &a, + const vector_real_function_3d &g) { + gaxpy(world, 1.0, a, 1.0, g, false); + }; + binary_inplace(*this, b, a_plus_equal_b); return *this; - } - // Returns a deep copy - [[nodiscard]] response_space copy() const { - World &world = x[0][0].world(); - response_space result(world, num_states, num_orbitals); - std::transform(x.begin(), x.end(), result.x.begin(), - [&world](auto &xi) { return madness::copy(world, xi, false); }); - world.gop.fence(); - return result; - } - [[nodiscard]] response_space copy(const std::shared_ptr>> &pmap, - bool fence = false) const { - auto &world = x[0][0].world(); - response_space result(world, num_states, num_orbitals); - world.gop.fence(); - std::transform(x.begin(), x.end(), result.x.begin(), - [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); - return result; + return *this; } + // Mimicking std::vector with these 4 void push_back(const vector_real_function_3d &f) { x.push_back(f); diff --git a/src/apps/molresponse/testing/x_space_testing.cpp b/src/apps/molresponse/testing/x_space_testing.cpp index 23b8de5e270..b7f47f09c30 100644 --- a/src/apps/molresponse/testing/x_space_testing.cpp +++ b/src/apps/molresponse/testing/x_space_testing.cpp @@ -117,4 +117,43 @@ TEST_CASE("Testing New X SPACE") { print((x + PQ).norm2s()); } +TEST_CASE("Testing xspace zero functions") { + // Set up the run directories + using namespace madness; + + World &world = World::get_default(); + + std::cout.precision(6); + std::string filename = "response.in"; + double frequency = 0.0; + std::string property = "dipole"; + + auto calc_params = initialize_calc_params(world, std::string(filename)); + print(calc_params.response_parameters.restart_file()); + + RHS_Generator rhs_generator; + if (property == "dipole") { + rhs_generator = dipole_generator; + } else { + rhs_generator = nuclear_generator; + } + FrequencyResponse calc(world, calc_params, frequency, rhs_generator); + calc.load(world, calc_params.response_parameters.save_file()); + auto x = calc.get_chi(); + + auto y = x.copy(); + auto z = y; + auto zeros=X_space::zero_functions(world,x.num_states(),x.num_states()); + + print(y.norm2s()); + print(x.norm2s()); + print(z.norm2s()); + print(zeros.norm2s()); + + auto xy=calc.response_context.inner(x,y); + print(xy); + + + +} diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 57251907e96..f31bbdb1681 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -55,15 +55,11 @@ namespace madness { auto &world = x[0][0].world(); auto new_x = X_space(*this);// copy - response_matrix copy_x(n_states); - response_matrix copy_y(n_states); - std::transform(x.begin(), x.end(), copy_x.begin(), + std::transform(x.begin(), x.end(), new_x.x.begin(), [&](const auto &xi) { return madness::copy(world, xi, true); }); - std::transform(y.begin(), y.end(), copy_y.begin(), + std::transform(y.begin(), y.end(), new_x.y.begin(), [&](const auto &xi) { return madness::copy(world, xi, true); }); - new_x.x = copy_x; - new_x.x = copy_y; return new_x; } @@ -77,15 +73,11 @@ namespace madness { bool fence = false) const -> X_space { auto &world = x[0][0].world(); auto new_x = X_space(*this);// copy - response_matrix copy_x(n_states); - response_matrix copy_y(n_states); - std::transform(x.begin(), x.end(), copy_x.begin(), + std::transform(x.begin(), x.end(), new_x.x.begin(), [&](const auto &xi) { return madness::copy(world, xi, p_map, true); }); - std::transform(y.begin(), y.end(), copy_y.begin(), + std::transform(y.begin(), y.end(), new_x.y.begin(), [&](const auto &xi) { return madness::copy(world, xi, p_map, true); }); - new_x.x = copy_x; - new_x.x = copy_y; return new_x; } // assignment @@ -109,41 +101,8 @@ namespace madness { void clear() { x.clear(); y.clear(); + active.clear(); } - auto operator+(const X_space &B) -> X_space { - MADNESS_ASSERT(same_size(*this, B)); - World &world = this->x[0][0].world(); - X_space add_x = this->copy(); - - for (const auto &i: active) { - auto ax = add_x.x[i]; - auto bx = B.x[i]; - auto ay = add_x.y[i]; - auto by = B.y[i]; - add_x.x[i] = gaxpy_oop(1.0, ax, 1.0, bx, false); - add_x.y[i] = gaxpy_oop(1.0, ay, 1.0, by, false); - } - world.gop.fence(); - - return add_x; - } - - auto operator+=(const X_space &B) -> X_space & { - MADNESS_ASSERT(same_size(*this, B)); - auto &world = this->x[0][0].world(); - int b = 0; - for (const auto &i: active) { - auto ax = this->x[i]; - auto bx = B.x[i]; - auto ay = this->y[i]; - auto by = B.y[i]; - gaxpy(world, 1.0, ax, 1.0, bx, false); - gaxpy(world, 1.0, ay, 1.0, by, false); - } - world.gop.fence(); - return *this; - } - void push_back(const vector_real_function_3d &vx, const vector_real_function_3d &vy) { if (n_orbitals > 0) { MADNESS_ASSERT(n_orbitals == x.size()); @@ -168,39 +127,34 @@ namespace madness { if (n_states == 0) { n_orbitals = 0; } } - static X_space zero_functions(World &world, size_t n_states, size_t n_orbitals) { - auto zeros = X_space(world, n_states, n_orbitals); - for (auto &xi: zeros.x) { - xi = ::madness::zero_functions(world, n_orbitals, false); - } - for (auto &yi: zeros.y) { - yi = ::madness::zero_functions(world, n_orbitals, false); - } - world.gop.fence(); - return zeros; - } + friend auto inplace_apply(X_space &A, - const std::function &func) { + const std::function &func) + -> void { + auto &world = A.x[0][0].world(); for (auto &i: A.active) { func(A.x[i]); func(A.y[i]); } + world.gop.fence(); } - friend auto - oop_apply(const X_space &A, - const std::function - &func) { + friend auto oop_apply( + const X_space &A, + const std::function &func) + -> X_space { + auto &world = A.x[0][0].world(); auto result = A.copy(); for (auto &i: result.active) { result.x[i] = func(A.x[i]); result.y[i] = func(A.y[i]); } + world.gop.fence(); return result; } friend auto - binary_apply(const X_space &A, X_space const &B, + binary_apply(const X_space &A, const X_space &B, const std::function &func) -> X_space { @@ -221,6 +175,49 @@ namespace madness { return result; } + static X_space zero_functions(World &world, size_t n_states, size_t n_orbitals) { + auto zeros = X_space(world, n_states, n_orbitals); + for (int i = 0; i < zeros.num_states(); i++) { + zeros.x[i] = ::madness::zero_functions(world, n_orbitals, false); + zeros.y[i] = ::madness::zero_functions(world, n_orbitals, false); + } + world.gop.fence(); + return zeros; + } + auto operator+(const X_space &B) -> X_space { + MADNESS_ASSERT(same_size(*this, B)); + World &world = this->x[0][0].world(); + X_space add_x = this->copy(); + + for (const auto &i: active) { + auto ax = add_x.x[i]; + auto bx = B.x[i]; + auto ay = add_x.y[i]; + auto by = B.y[i]; + add_x.x[i] = gaxpy_oop(1.0, ax, 1.0, bx, false); + add_x.y[i] = gaxpy_oop(1.0, ay, 1.0, by, false); + } + world.gop.fence(); + + return add_x; + } + + auto operator+=(const X_space &B) -> X_space & { + MADNESS_ASSERT(same_size(*this, B)); + auto &world = this->x[0][0].world(); + for (const auto &i: active) { + auto ax = this->x[i]; + auto bx = B.x[i]; + auto ay = this->y[i]; + auto by = B.y[i]; + gaxpy(world, 1.0, ax, 1.0, bx, false); + gaxpy(world, 1.0, ay, 1.0, by, false); + } + world.gop.fence(); + return *this; + } + + friend auto operator+(const X_space &A, const X_space &B) -> X_space { MADNESS_ASSERT(same_size(A, B)); MADNESS_ASSERT(same_size(A, B)); From 81ad88d85ff458f2a55c4b8f24b0852584471d99 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 14:52:59 -0400 Subject: [PATCH 1086/1312] bsh_target --- src/apps/molresponse/FrequencyResponse.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0c966627ad3..f4aecc604d7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -147,10 +147,11 @@ void FrequencyResponse::iterate(World &world) { } } auto check_convergence = [&](auto &ri, auto &di) { - return ri < max_relative_bsh && di < density_target; + return ri < bsh_abs_target && di < density_target; }; - std::transform(bsh_relative_residualsX.ptr(), bsh_residualsX.ptr() + m, - density_residuals.ptr(), converged.begin(), check_convergence); + std::transform(bsh_relative_residualsX.ptr(), + bsh_residualsX.ptr() + bsh_residualsX.size(), density_residuals.ptr(), + converged.begin(), check_convergence); int b = 0; Chi.active.remove_if([&](auto x) { return converged[b++]; }); From 02afcc51b822885bf18cceeb7cdb3934479676ad Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 14:59:52 -0400 Subject: [PATCH 1087/1312] use copy constructor to copy and then deep copy vecfuncs --- src/apps/molresponse/response_functions.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index f2fcfabebda..32f07335a52 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -121,7 +121,7 @@ namespace madness { // Returns a deep copy [[nodiscard]] response_space copy() const { World &world = x[0][0].world(); - response_space result(world, num_states, num_orbitals); + response_space result(*this); std::transform(x.begin(), x.end(), result.x.begin(), [&world](auto &xi) { return madness::copy(world, xi, false); }); world.gop.fence(); @@ -130,10 +130,10 @@ namespace madness { [[nodiscard]] response_space copy(const std::shared_ptr>> &pmap, bool fence = false) const { auto &world = x[0][0].world(); - response_space result(world, num_states, num_orbitals); - world.gop.fence(); + response_space result(*this); std::transform(x.begin(), x.end(), result.x.begin(), [&](const auto &xi) { return madness::copy(world, xi, pmap, fence); }); + world.gop.fence(); return result; } From f8e7cd0432996218b93657cddc5481bc77d28994 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 15:18:26 -0400 Subject: [PATCH 1088/1312] faster copying --- src/apps/molresponse/FrequencyResponse.cpp | 6 ++++++ src/apps/molresponse/x_space.h | 21 ++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f4aecc604d7..62d4a9970d6 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -198,8 +198,10 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { print("copy tensors: bshX"); } if (compute_y) { Chi = new_chi.copy(); + print("after y copy", response_context.inner(Chi, Chi)); } else { Chi.x = new_chi.x.copy(); + print("after static copy \n", response_context.inner(Chi, Chi)); } if (world.rank() == 0) { print("copy chi:"); } if (r_params.print_level() >= 1) { @@ -269,8 +271,10 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bool compute_y = omega_n != 0.0; auto x = chi.copy();// copy chi X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); + print(response_context.inner(theta_X, theta_X)); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); + print(response_context.inner(new_chi, new_chi)); inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); @@ -278,12 +282,14 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); + print(response_context.inner(new_chi, new_chi)); } inner_to_json(world, "x_update", response_context.inner(new_chi, new_chi), iter_function_data); if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } + // if not compute y then copy x in to y return {new_chi, {new_res, bsh}}; diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index f31bbdb1681..4a606364f24 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -53,13 +53,12 @@ namespace madness { active(A.active) {} [[nodiscard]] X_space copy() const { auto &world = x[0][0].world(); - auto new_x = X_space(*this);// copy - - std::transform(x.begin(), x.end(), new_x.x.begin(), - [&](const auto &xi) { return madness::copy(world, xi, true); }); - std::transform(y.begin(), y.end(), new_x.y.begin(), - [&](const auto &xi) { return madness::copy(world, xi, true); }); + for (int i = 0; i < new_x.num_states(); i++) { + new_x.x[i] = madness::copy(world, x[i], false); + new_x.y[i] = madness::copy(world, x[i], false); + } + world.gop.fence(); return new_x; } @@ -73,11 +72,11 @@ namespace madness { bool fence = false) const -> X_space { auto &world = x[0][0].world(); auto new_x = X_space(*this);// copy - - std::transform(x.begin(), x.end(), new_x.x.begin(), - [&](const auto &xi) { return madness::copy(world, xi, p_map, true); }); - std::transform(y.begin(), y.end(), new_x.y.begin(), - [&](const auto &xi) { return madness::copy(world, xi, p_map, true); }); + for (int i = 0; i < new_x.num_states(); i++) { + new_x.x[i] = madness::copy(world, x[i], p_map, false); + new_x.y[i] = madness::copy(world, x[i], p_map, false); + } + world.gop.fence(); return new_x; } // assignment From 74dc7998915cb744236f7d75e9a767a53428142a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 15:59:20 -0400 Subject: [PATCH 1089/1312] formatting --- src/apps/molresponse/ResponseBase.hpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 108dc744363..684e3b9e5df 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -23,14 +23,12 @@ using namespace madness; -using json = nlohmann::json; class inner_strategy { public: virtual ~inner_strategy() = default; - [[nodiscard]] virtual Tensor compute_inner(const X_space &x, - const X_space &y) const = 0; + virtual Tensor compute_inner(const X_space &x, const X_space &y) const = 0; }; class Context { @@ -40,7 +38,7 @@ class Context { public: explicit Context(std::unique_ptr &&strategy = {}) - : strategy_(std::move(strategy)) {} + : strategy_(std::move(strategy)) {} void set_strategy(std::unique_ptr &&strategy) { strategy_ = std::move(strategy); } @@ -54,7 +52,7 @@ class Context { } } - [[nodiscard]] Tensor inner(const X_space &x, const X_space &y) const { + Tensor inner(const X_space &x, const X_space &y) const { if (strategy_) { return strategy_->compute_inner(x, y); } else { @@ -136,7 +134,7 @@ class ResponseBase { auto get_orbitals() const -> vector_real_function_3d { return ground_orbitals; } - auto get_chi() const->X_space{return Chi.copy();} ; + auto get_chi() const -> X_space { return Chi.copy(); }; void output_json(); From fc63b710e6285301f349399b82e951fb7fdca432 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 17:25:48 -0400 Subject: [PATCH 1090/1312] ground exchange --- src/apps/molresponse/ExcitedResponse.cpp | 10 +-- src/apps/molresponse/FrequencyResponse.cpp | 58 ++++++---------- src/apps/molresponse/ResponseBase.cpp | 54 ++++++++------- src/apps/molresponse/ResponseBase.hpp | 2 +- src/apps/molresponse/global_functions.cc | 8 +-- src/apps/molresponse/x_space.h | 80 +++++++++++----------- 6 files changed, 98 insertions(+), 114 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index 762a8d02128..0ff865b4f19 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -1876,7 +1876,7 @@ void ExcitedResponse::iterate(World &world) { vector_real_function_3d rho_omega = make_density(world, Chi); // Create the X space - converged = false;// Converged flag + all_done = false;// Converged flag // Now to iterate for (iter = 0; iter < r_params.maxiter(); ++iter) { @@ -1944,13 +1944,13 @@ void ExcitedResponse::iterate(World &world) { } if ((d_residual < conv_den) and ((relative_max_bsh < relative_max_target) or r_params.get("conv_only_dens"))) { - converged = true; + all_done = true; } - if (converged || iter == r_params.maxiter() - 1) { + if (all_done || iter == r_params.maxiter() - 1) { // if converged print converged - if (world.rank() == 0 && converged and (r_params.print_level() > 1)) { + if (world.rank() == 0 && all_done and (r_params.print_level() > 1)) { print("\nConverged!\n"); } @@ -2042,7 +2042,7 @@ void ExcitedResponse::iterate(World &world) { if (world.rank() == 0) print("\n"); // Did we converge? - if (iter == r_params.maxiter() && not converged) { + if (iter == r_params.maxiter() && not all_done) { if (world.rank() == 0) print(" Failed to converge. Reason:"); if (world.rank() == 0) print("\n *** Ran out of iterations ***\n"); if (world.rank() == 0) print(" Running analysis on current values.\n"); diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 62d4a9970d6..4b1adbd116e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -30,15 +30,16 @@ void FrequencyResponse::iterate(World &world) { const double b_pow{0.314}; // Last attempt 1.035 2.121 - const double bsh_abs_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b + const double x_relative_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y - Tensor bsh_residualsX((int(m))); - Tensor bsh_relative_residualsX((int(m))); + Tensor x_residuals((int(m))); + Tensor x_relative_residuals((int(m))); Tensor density_residuals((int(m))); bool static_res = (omega == 0.0); bool compute_y = not static_res; int r_vector_size; + all_done = false; r_vector_size = (compute_y) ? 2 * n : n; @@ -77,14 +78,13 @@ void FrequencyResponse::iterate(World &world) { std::vector bsh_y_ops; bsh_y_ops = (compute_y) ? make_bsh_operators_response(world, y_shifts, -omega) : bsh_x_ops; vector_real_function_3d rho_omega = make_density(world, Chi); - converged = false;// Converged flag auto max_rotation = .5; if (thresh >= 1e-2) { max_rotation = 2; } else if (thresh >= 1e-4) { - max_rotation = 2 * bsh_abs_target; + max_rotation = 2 * x_relative_target; } else if (thresh >= 1e-6) { - max_rotation = 2 * bsh_abs_target; + max_rotation = 2 * x_relative_target; } else if (thresh >= 1e-7) { max_rotation = .01; } @@ -93,8 +93,8 @@ void FrequencyResponse::iterate(World &world) { //PQ = PQ * mask; PQ = generator(world, *this); PQ.truncate(); + vector converged(Chi.num_states(), false); - bool all_done = false; Chi.reset_active(); for (iter = 0; iter < r_params.maxiter(); ++iter) { @@ -112,19 +112,14 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { print("d-residual > 20...break"); } break; } - double d_residual = density_residuals.max(); auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.x.norm2(); auto rho_norms = madness::norm2s_T(world, rho_omega); - std::transform(bsh_residualsX.ptr(), bsh_residualsX.ptr() + bsh_residualsX.size(), - chi_norms.ptr(), bsh_relative_residualsX.ptr(), + std::transform(x_residuals.ptr(), x_residuals.ptr() + x_residuals.size(), + chi_norms.ptr(), x_relative_residuals.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); - auto max_bsh = bsh_residualsX.absmax(); - auto max_relative_bsh = bsh_relative_residualsX.absmax(); - max_rotation = 1.0 * max_bsh; - world.gop.fence(); // Todo add chi norm and chi_x if (world.rank() == 0) { - function_data_to_json(j_molresponse, iter, chi_norms, bsh_residualsX, rho_norms, + function_data_to_json(j_molresponse, iter, chi_norms, x_residuals, rho_norms, density_residuals); frequency_to_json(j_molresponse, iter, polar, res_polar); } @@ -137,32 +132,26 @@ void FrequencyResponse::iterate(World &world) { print("||X||: ", chi_norms); print("max rotation: ", max_rotation); print("density changes : ", density_residuals); - print("max density change : ", d_residual); print("density target : ", density_target); - print("bsh residuals : ", bsh_residualsX); - print("relative bsh residuals : ", bsh_relative_residualsX); - print("max relative bsh residual : ", max_relative_bsh); - print("max bsh residual : ", max_bsh); - print("bsh residual target : ", bsh_abs_target); + print("bsh residuals : ", x_residuals); + print("relative bsh residuals : ", x_relative_residuals); + print("bsh residual target : ", x_relative_target); } } auto check_convergence = [&](auto &ri, auto &di) { - return ri < bsh_abs_target && di < density_target; + print(ri, di); + return ((ri < x_relative_target) && (di < density_target)); }; - std::transform(bsh_relative_residualsX.ptr(), - bsh_residualsX.ptr() + bsh_residualsX.size(), density_residuals.ptr(), - converged.begin(), check_convergence); - + std::transform(x_relative_residuals.ptr(), x_relative_residuals.ptr() + m, + density_residuals.ptr(), converged.begin(), check_convergence); int b = 0; Chi.active.remove_if([&](auto x) { return converged[b++]; }); - world.gop.fence(); - if (world.rank() == 0) { print("converged", converged); print("active", Chi.active); } - - all_done = std::all_of(converged.begin(), converged.end(), [](auto ci) { return ci; }); + all_done = std::all_of(converged.begin(), converged.end(), + [](const auto &ci) { return ci; }); if (all_done || iter == r_params.maxiter()) { // if converged print converged @@ -194,14 +183,12 @@ void FrequencyResponse::iterate(World &world) { molresponse::end_timer(world, "make_density_new", "make_density_new", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - bsh_residualsX = copy(new_res.residual_norms); + x_residuals = copy(new_res.residual_norms); if (world.rank() == 0) { print("copy tensors: bshX"); } if (compute_y) { Chi = new_chi.copy(); - print("after y copy", response_context.inner(Chi, Chi)); } else { Chi.x = new_chi.x.copy(); - print("after static copy \n", response_context.inner(Chi, Chi)); } if (world.rank() == 0) { print("copy chi:"); } if (r_params.print_level() >= 1) { @@ -252,7 +239,7 @@ void FrequencyResponse::iterate(World &world) { } if (world.rank() == 0) { print(" Final energy residuals X:"); - print(bsh_residualsX); + print(x_residuals); print(" Final density residuals:"); print(density_residuals); } @@ -271,10 +258,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator bool compute_y = omega_n != 0.0; auto x = chi.copy();// copy chi X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); - print(response_context.inner(theta_X, theta_X)); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - print(response_context.inner(new_chi, new_chi)); inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); @@ -282,7 +267,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); - print(response_context.inner(new_chi, new_chi)); } inner_to_json(world, "x_update", response_context.inner(new_chi, new_chi), iter_function_data); if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7879bc5a1d0..6bc2db896ce 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -295,7 +295,7 @@ auto ResponseBase::make_xc_operator(World &world) const -> XCOperator auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfuncT { auto density = vector_real_function_3d(chi.num_states()); auto calc_type = r_params.calc_type(); - auto thresh=FunctionDefaults<3>::get_thresh(); + auto thresh = FunctionDefaults<3>::get_thresh(); if (calc_type == "full") { auto r_matrix = to_response_matrix(chi); if (world.rank() == 0) { print("make density: to response matrix"); } @@ -305,19 +305,19 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto x = to_response_matrix(chi); auto phiphi = to_response_vector(ground_orbitals); for (auto &rho_b: density) { - auto x_phi= mul(world,x[b],phiphi,false); + auto x_phi = mul(world, x[b], phiphi, false); world.gop.fence(); - rho_b =sum(world,x_phi); + rho_b = sum(world, x_phi); b++; } } else if (calc_type == "static") { int b = 0; for (auto &rho_b: density) { - auto xb=chi.x[b]; - auto x_phi= mul(world,xb,ground_orbitals,false); + auto xb = chi.x[b]; + auto x_phi = mul(world, xb, ground_orbitals, false); world.gop.fence(); - rho_b =2*sum(world,x_phi); + rho_b = 2 * sum(world, x_phi); b++; } @@ -325,7 +325,7 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu density = transition_densityTDA(world, ground_orbitals, chi.x); } if (world.rank() == 0) { print("make density: made density"); } - truncate(world, density,thresh); + truncate(world, density, thresh); if (world.rank() == 0) { print("make density: truncate"); } return density; } @@ -503,7 +503,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto temp_J = apply(*shared_coulomb_operator, rho_b_i); J.x[b++] = mul(world, temp_J, phi0); } - std::transform(J.x.begin(), J.x.end(), J.x.begin(),[&](auto &jxi) { return projector(jxi); }); + std::transform(J.x.begin(), J.x.end(), J.x.begin(), [&](auto &jxi) { return projector(jxi); }); world.gop.fence(); J.y = J.x.copy(); @@ -524,7 +524,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } std::transform(rho.begin(), rho.end(), W.x.begin(), compute_wx); - std::transform(W.x.begin(), W.x.end(), W.x.begin(),[&](auto &wxi) { return projector(wxi); }); + std::transform(W.x.begin(), W.x.end(), W.x.begin(), + [&](auto &wxi) { return projector(wxi); }); W.y = W.x.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); @@ -534,8 +535,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); - std::transform(K.x.begin(), K.x.end(), K.x.begin(),[&](auto &kxi) { return projector(kxi); }); - std::transform(K.y.begin(), K.y.end(), K.y.begin(),[&](auto &kyi) { return projector(kyi); }); + std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); + std::transform(K.y.begin(), K.y.end(), K.y.begin(), [&](auto &kyi) { return projector(kyi); }); //auto K = response_exchange(phi0, chi_alpha, true); @@ -560,8 +561,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - std::transform(gamma.x.begin(), gamma.x.end(), gamma.x.begin(),[&](auto &gxi) { return projector(gxi); }); - std::transform(gamma.y.begin(), gamma.y.end(), gamma.y.begin(),[&](auto &gyi) { return projector(gyi); }); + std::transform(gamma.x.begin(), gamma.x.end(), gamma.x.begin(), + [&](auto &gxi) { return projector(gxi); }); + std::transform(gamma.y.begin(), gamma.y.end(), gamma.y.begin(), + [&](auto &gyi) { return projector(gyi); }); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); @@ -649,7 +652,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm J.x[b++] = mul(world, temp_J, phi0); } //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); - std::transform(J.x.begin(), J.x.end(), J.x.begin(),[&](auto &jxi) { return projector(jxi); }); + std::transform(J.x.begin(), J.x.end(), J.x.begin(), [&](auto &jxi) { return projector(jxi); }); J.y = J.x.copy(); if (r_params.print_level() >= 1) { @@ -664,7 +667,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } std::transform(rho.begin(), rho.end(), W.x.begin(), compute_wx); - std::transform(W.x.begin(), W.x.end(), W.x.begin(),[&](auto &wxi) { return projector(wxi); }); + std::transform(W.x.begin(), W.x.end(), W.x.begin(), + [&](auto &wxi) { return projector(wxi); }); W.y = W.x.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); @@ -695,7 +699,7 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, xy, false); - std::transform(K.x.begin(), K.x.end(), K.x.begin(),[&](auto &kxi) { return projector(kxi); }); + std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); inner_to_json(world, "k1", response_context.inner(xy, K), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); @@ -728,7 +732,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } //for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } - std::transform(gamma.x.begin(), gamma.x.end(), gamma.x.begin(),[&](auto &gxi) { return projector(gxi); }); + std::transform(gamma.x.begin(), gamma.x.end(), gamma.x.begin(), + [&](auto &gxi) { return projector(gxi); }); gamma.y = gamma.x.copy(); if (r_params.print_level() >= 1) { @@ -1192,7 +1197,7 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); size_t n = chi.num_orbitals(); - X_space kain_update(world, m, n); + X_space kain_update = chi.copy(); response_matrix update(m); bool compute_y = r_params.omega() != 0.0; @@ -1201,17 +1206,14 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, auto x_vectors = to_response_matrix(chi); auto x_residuals = to_response_matrix(residual_chi); int b = 0; - for (auto &kain_xb: kain_x_space) { - update[b] = kain_xb.update(x_vectors[b], x_residuals[b]); - b++; + for (const auto &i: Chi.active) { + update[i] = kain_x_space[i].update(x_vectors[i], x_residuals[i]); } - world.gop.fence(); kain_update = to_X_space(update); } else { int b = 0; - for (auto &kain_xb: kain_x_space) { - kain_update.x[b] = kain_xb.update(chi.x[b], residual_chi.x[b]); - b++; + for (const auto &i: Chi.active) { + kain_update.x[i] = kain_x_space[i].update(chi.x[i], residual_chi.x[i]); } } if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } @@ -1795,7 +1797,7 @@ void ResponseBase::output_json() { ofs << std::setw(4) << j_molresponse; } -void ResponseBase::converged_to_json(json &j) { j["converged"] = converged; } +void ResponseBase::converged_to_json(json &j) { j["converged"] = all_done; } void ResponseBase::print_inner(World &world, const std::string &name, const X_space &left, const X_space &right) { diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 684e3b9e5df..aa581296a86 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -151,7 +151,7 @@ class ResponseBase { ResponseParameters r_params; Molecule molecule; GroundStateCalculation ground_calc; - bool converged = false; + bool all_done = false; XCfunctional xcf; diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index a891295e8ca..bd22a795157 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -394,12 +394,12 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const world.gop.fence(); auto k0 = make_k(phi0, phi0); if (compute_y) { - for (int b = 0; b < num_states; b++) { - K0.x[b] = k0(chi.x[b]); - K0.y[b] = k0(chi.y[b]); + for (const auto &i: chi.active) { + K0.x[i] = k0(chi.x[i]); + K0.y[i] = k0(chi.y[i]); } } else { - for (int b = 0; b < num_states; b++) { K0.x[b] = k0(chi.x[b]); } + for (const auto &i: chi.active) { K0.x[i] = k0(chi.x[i]); } K0.y = K0.x.copy(); } K0.truncate(); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 4a606364f24..9fd9a3ad2d2 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -152,11 +152,8 @@ namespace madness { return result; } - friend auto - binary_apply(const X_space &A, const X_space &B, - const std::function &func) - -> X_space { + template + friend auto binary_apply(const X_space &A, const X_space &B, T &func) -> X_space { MADNESS_ASSERT(same_size(A, B)); X_space result = A.copy();// create zero_functions @@ -165,8 +162,10 @@ namespace madness { for (const auto &i: result.active) { auto ax = result.x[i]; auto bx = B.x[i]; + auto ay = result.y[i]; auto by = B.y[i]; + result.x[i] = func(ax, bx); result.y[i] = func(ay, by); } @@ -174,6 +173,25 @@ namespace madness { return result; } + template + friend auto binary_inplace(X_space &A, const X_space &B, const T &func) { + MADNESS_ASSERT(same_size(A, B)); + auto &world = A.x[0][0].world(); + for (const auto &i: A.active) { + auto ax = A.x[i]; + auto ay = A.y[i]; + + auto bx = B.x[i]; + auto by = B.y[i]; + + func(ax, bx); + func(ay, by); + } + world.gop.fence(); + + return A; + } + static X_space zero_functions(World &world, size_t n_states, size_t n_orbitals) { auto zeros = X_space(world, n_states, n_orbitals); for (int i = 0; i < zeros.num_states(); i++) { @@ -183,54 +201,38 @@ namespace madness { world.gop.fence(); return zeros; } - auto operator+(const X_space &B) -> X_space { + auto operator+(const X_space &B) const -> X_space { MADNESS_ASSERT(same_size(*this, B)); - World &world = this->x[0][0].world(); - X_space add_x = this->copy(); - - for (const auto &i: active) { - auto ax = add_x.x[i]; - auto bx = B.x[i]; - auto ay = add_x.y[i]; - auto by = B.y[i]; - add_x.x[i] = gaxpy_oop(1.0, ax, 1.0, bx, false); - add_x.y[i] = gaxpy_oop(1.0, ay, 1.0, by, false); - } - world.gop.fence(); - - return add_x; + auto add_ab = [&](const auto &a, const auto &b) { + return gaxpy_oop(1.0, a, 1.0, b, false); + }; + return binary_apply(*this, B, add_ab); } auto operator+=(const X_space &B) -> X_space & { MADNESS_ASSERT(same_size(*this, B)); auto &world = this->x[0][0].world(); - for (const auto &i: active) { - auto ax = this->x[i]; - auto bx = B.x[i]; - auto ay = this->y[i]; - auto by = B.y[i]; - gaxpy(world, 1.0, ax, 1.0, bx, false); - gaxpy(world, 1.0, ay, 1.0, by, false); - } - world.gop.fence(); + auto add_inplace = [&](auto &a, const auto &b) { gaxpy(world, 1.0, a, 1.0, b, false); }; + binary_inplace(*this, B, add_inplace); return *this; } friend auto operator+(const X_space &A, const X_space &B) -> X_space { MADNESS_ASSERT(same_size(A, B)); - MADNESS_ASSERT(same_size(A, B)); - return binary_apply(A, B, [](const auto &a, const auto &b) { + auto add_ab = [&](const auto &a, const auto &b) { return gaxpy_oop(1.0, a, 1.0, b, false); - }); + }; + return binary_apply(A, B, add_ab); } friend X_space operator-(const X_space &A, const X_space &B) { MADNESS_ASSERT(same_size(A, B)); - return binary_apply(A, B, [](const auto &a, const auto &b) { + auto sub_ab = [&](const auto &a, const auto &b) { return gaxpy_oop(1.0, a, -1.0, b, false); - }); + }; + return binary_apply(A, B, sub_ab); } friend X_space operator*(const X_space &A, const double &b) { @@ -253,16 +255,14 @@ namespace madness { auto mul_f = [&](const vector_real_function_3d &vec_ai) { return mul(world, f, vec_ai, false); }; - auto result = oop_apply(A, mul_f); - return result; + return oop_apply(A, mul_f); } friend auto operator*(const Function &f, const X_space &A) -> X_space { World &world = A.x[0][0].world(); auto mul_f = [&](const vector_real_function_3d &vec_ai) { return mul(world, f, vec_ai, false); }; - auto result = oop_apply(A, mul_f); - return result; + return oop_apply(A, mul_f); } friend auto operator*(const X_space &A, const Tensor &b) -> X_space { @@ -271,9 +271,7 @@ namespace madness { World &world = A.x[0][0].world(); auto transform_ai = [&](auto &ai) { return transform(world, ai, b, false); }; - auto result = oop_apply(A, transform_ai); - - return result; + return oop_apply(A, transform_ai); } /*** * From 6dfe4e03bd4e4a032fee165a2f167baa9961e0b7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 17:33:02 -0400 Subject: [PATCH 1091/1312] get rid of one add function to remove ambigious --- src/apps/molresponse/x_space.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 9fd9a3ad2d2..a8c6f5a92db 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -201,13 +201,6 @@ namespace madness { world.gop.fence(); return zeros; } - auto operator+(const X_space &B) const -> X_space { - MADNESS_ASSERT(same_size(*this, B)); - auto add_ab = [&](const auto &a, const auto &b) { - return gaxpy_oop(1.0, a, 1.0, b, false); - }; - return binary_apply(*this, B, add_ab); - } auto operator+=(const X_space &B) -> X_space & { MADNESS_ASSERT(same_size(*this, B)); From 6e5e155515b075c6b3e8f9164147c9e253ddb8b7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 17:33:19 -0400 Subject: [PATCH 1092/1312] change v0 --- src/apps/molresponse/ResponseBase.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6bc2db896ce..2c636edbdce 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1042,22 +1042,16 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< double safety = 0.1; double v_tol = safety * FunctionDefaults<3>::get_thresh(); if (compute_Y) { - auto x = to_response_matrix(X); - auto vx = create_response_matrix(X.num_states(), X.num_orbitals()); - for (int b = 0; b < m; b++) { vx[b] = mul_sparse(world, v0, x[b], v_tol, false); } - world.gop.fence(); - V0 = to_X_space(vx); - V0.truncate(); + V0 = X * v0; V0 += -c_xc * K0; V0.truncate(); inner_to_json(world, "V0", response_context.inner(X, V0), iter_function_data); } else { - for (int b = 0; b < m; b++) { V0.x[b] = mul_sparse(world, v0, X.x[b], v_tol, false); } - V0.x.truncate_rf(); - world.gop.fence(); + V0 = X.copy(); + V0.x = v0 * V0.x; V0.x += -c_xc * K0.x; - V0.y = V0.x.copy(); V0.x.truncate_rf(); + V0.y = V0.x.copy(); inner_to_json(world, "V0", response_context.inner(X, V0), iter_function_data); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } From 36cf8c617c15382da7f5368eb4413bc4870d3666 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 17:47:08 -0400 Subject: [PATCH 1093/1312] chnage e0x --- src/apps/molresponse/ResponseBase.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2c636edbdce..1023ca0d92d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -410,12 +410,10 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space E0X(world, chi.num_states(), chi.num_orbitals()); if (r_params.localize() != "canon") { - E0X = chi.copy(); - E0X.x = E0X.x * ham_no_diag; if (compute_Y) { - E0X.y = E0X.y * ham_no_diag; - E0X.truncate(); + E0X = chi * ham_no_diag; } else { + E0X.x = chi.x * ham_no_diag; E0X.x.truncate_rf(); } inner_to_json(world, "E0", response_context.inner(chi, E0X), iter_function_data); From 2095c45ea8ee8b3cda51454819779ddb1f3b0d75 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 17:55:29 -0400 Subject: [PATCH 1094/1312] fix e0 --- src/apps/molresponse/ResponseBase.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 1023ca0d92d..2ba05fd3d3d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -414,6 +414,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, E0X = chi * ham_no_diag; } else { E0X.x = chi.x * ham_no_diag; + E0X.y = E0X.x.copy(); E0X.x.truncate_rf(); } inner_to_json(world, "E0", response_context.inner(chi, E0X), iter_function_data); From 834b77be9c4d95df785ecfdfd20d769e68f58403 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 18:54:43 -0400 Subject: [PATCH 1095/1312] vector of coulomb operators --- src/apps/molresponse/ResponseBase.cpp | 29 ++++++++++++------------ src/apps/molresponse/ResponseBase.hpp | 7 +++++- src/apps/molresponse/global_functions.cc | 1 + 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2ba05fd3d3d..393fd367082 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -465,15 +465,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); auto [chi_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); - QProjector projector(world, phi0); - size_t num_states = chi_alpha.num_states(); size_t num_orbitals = chi_alpha.num_orbitals(); - - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // x functions // here I create the orbital products for elctron interaction terms vecfuncT phi_phi; @@ -489,27 +484,29 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } - + auto apply_projector = [&](auto &xi) { return projector(xi); }; // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // Create Coulomb potential on ground_orbitals functionT rho_x_b; functionT rho_y_b; auto mul_tol = FunctionDefaults<3>::get_thresh(); + auto rho_b = make_density(world, chi_alpha); + + std::vector *> pis; int b = 0; - for (const auto &rho_b_i: rho_b) { - auto temp_J = apply(*shared_coulomb_operator, rho_b_i); - J.x[b++] = mul(world, temp_J, phi0); + for (const auto &i: chi_alpha.active) { + auto temp_J = apply(*coul_ops[i], rho_b[i]); + J.x[i] = mul(world, temp_J, phi0, false); } - std::transform(J.x.begin(), J.x.end(), J.x.begin(), [&](auto &jxi) { return projector(jxi); }); world.gop.fence(); + J.x.truncate_rf(); + J.x = oop_unary_apply(J.x, apply_projector); J.y = J.x.copy(); - - + // std::transform(J.x.begin(), J.x.end(), J.x.begin(), [&](auto &jxi) { return projector(jxi); }); if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); - inner_to_json(world, "j1", response_context.inner(chi_alpha, J), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); @@ -534,8 +531,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); - std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); - std::transform(K.y.begin(), K.y.end(), K.y.begin(), [&](auto &kyi) { return projector(kyi); }); + + K = oop_apply(K, apply_projector); + // std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); + // std::transform(K.y.begin(), K.y.end(), K.y.begin(), [&](auto &kyi) { return projector(kyi); }); //auto K = response_exchange(phi0, chi_alpha, true); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index aa581296a86..5bf1f7f2c6d 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -160,8 +160,8 @@ class ResponseBase { std::shared_ptr potential_manager; // shared pointers to Operators poperatorT shared_coulomb_operator;// shared pointer to seperated convolution operator + std::vector coul_ops; std::vector> gradop; - // Stored functions mutable real_function_3d stored_v_nuc; // Stored nuclear potential from ground state mutable real_function_3d stored_v_coul;// Stored coulomb potential from ground state @@ -230,6 +230,11 @@ class ResponseBase { double safety = 0.1; vtol = FunctionDefaults<3>::get_thresh() * safety; shared_coulomb_operator = poperatorT(CoulombOperatorPtr(world, r_params.lo(), thresh)); + coul_ops.clear(); + for (int i = 0; i < r_params.num_states(); i++) { + coul_ops.push_back(poperatorT( + CoulombOperatorPtr(world, r_params.lo(), FunctionDefaults<3>::get_thresh()))); + } gradop = gradient_operator(world); potential_manager = std::make_shared(molecule, "a"); potential_manager->make_nuclear_potential(world); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index bd22a795157..194f5b113ba 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -354,6 +354,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons } else { for (int b = 0; b < num_states; b++) { + auto x = chi.x[b]; auto y = chi.x[b]; From 6c00ba6f78f59190636f36ab64d6240b2ddaa21b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 19:07:16 -0400 Subject: [PATCH 1096/1312] some exchange changes --- src/apps/molresponse/ResponseBase.cpp | 8 ++++++-- src/apps/molresponse/global_functions.cc | 20 +++----------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 393fd367082..79325c0a775 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -474,7 +474,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit vecfuncT phi_phi; vecfuncT x_phi; vecfuncT y_phi; - functionT temp_J; X_space J(world, num_states, num_orbitals); response_space j_x(world, num_states, num_orbitals); @@ -496,8 +495,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit std::vector *> pis; int b = 0; + functionT temp_J; for (const auto &i: chi_alpha.active) { - auto temp_J = apply(*coul_ops[i], rho_b[i]); + temp_J = apply(*coul_ops[i], rho_b[i]); + temp_J.truncate(FunctionDefaults<3>::get_thresh()); J.x[i] = mul(world, temp_J, phi0, false); } world.gop.fence(); @@ -559,10 +560,13 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + gamma = oop_apply(gamma, apply_projector); + /* std::transform(gamma.x.begin(), gamma.x.end(), gamma.x.begin(), [&](auto &gxi) { return projector(gxi); }); std::transform(gamma.y.begin(), gamma.y.end(), gamma.y.begin(), [&](auto &gyi) { return projector(gyi); }); + */ if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 194f5b113ba..c2e4ea693cf 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -324,46 +324,32 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto K = X_space::zero_functions(world, num_states, num_orbitals); world.gop.fence(); vector_real_function_3d k1x, k1y, k2x, k2y; - - if (compute_y) { - for (int b = 0; b < num_states; b++) { - + for (const auto &b: chi.active) { auto x = chi.x[b]; auto y = chi.y[b]; - auto K1X = make_k(x, phi0); - auto K1Y = make_k(phi0, y); - auto K2X = make_k(y, phi0); + auto K1Y = make_k(phi0, y); auto K2Y = make_k(phi0, x); - k1x = K1X(phi0); k1y = K1Y(phi0); k2x = K2X(phi0); k2y = K2Y(phi0); - world.gop.fence(); - K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); K.y[b][0].print_info(); - world.gop.fence(); } } else { - for (int b = 0; b < num_states; b++) { - - + for (const auto &b: chi.active) { auto x = chi.x[b]; auto y = chi.x[b]; - auto K1X = make_k(x, phi0); auto K1Y = make_k(phi0, y); - k1x = K1X(phi0); k1y = K1Y(phi0); - K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, true); } } From 0411351688d00e19262ccd8e6c0f00027d321c9f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 19:33:53 -0400 Subject: [PATCH 1097/1312] some bsh changes --- src/apps/molresponse/FrequencyResponse.cpp | 25 +++++++++++----------- src/apps/molresponse/basic_operators.cc | 7 ++---- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 4b1adbd116e..0899162db0c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -351,27 +351,26 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, size_t m = theta_X.x.size(); size_t n = theta_X.x.size_orbitals(); bool compute_y = omega != 0.0; - // construct lhs for 2nd order property - PQ.truncate(); - theta_X.x += theta_X.x * x_shifts; - theta_X.x += PQ.x; - theta_X.x = theta_X.x * -2; - world.gop.fence(); if (compute_y) { - theta_X.y += PQ.y; - theta_X.y = theta_X.y * -2; + theta_X += theta_X * x_shifts; + theta_X += PQ; + theta_X = -2 * theta_X; theta_X.truncate(); } else { + theta_X.x += theta_X.x * x_shifts; + theta_X.x += PQ.x; + theta_X.x = theta_X.x * -2; theta_X.x.truncate_rf(); } - world.gop.fence(); // apply bsh X_space bsh_X(world, m, n); + bsh_X.active = theta_X.active; /* bsh_x_ops.insert(bsh_x_ops.end(), std::make_move_iterator(bsh_y_ops.begin()), std::make_move_iterator(bsh_y_ops.end())); */ + bsh_X.x = apply(world, bsh_x_ops, theta_X.x); if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } if (compute_y) { bsh_X.y = apply(world, bsh_y_ops, theta_X.y); } @@ -383,10 +382,12 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } - // Project out ground state - for (size_t i = 0; i < m; i++) bsh_X.x[i] = projector(bsh_X.x[i]); + + auto apply_projector = [&](auto &xi) { return projector(xi); }; if (compute_y) { - for (size_t i = 0; i < m; i++) { bsh_X.y[i] = projector(bsh_X.y[i]); } + bsh_X = oop_apply(bsh_X, apply_projector); + } else { + for (const auto &i: bsh_X.active) bsh_X.x[i] = projector(bsh_X.x[i]); } if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/basic_operators.cc b/src/apps/molresponse/basic_operators.cc index 78070f92586..40806ce0fe1 100644 --- a/src/apps/molresponse/basic_operators.cc +++ b/src/apps/molresponse/basic_operators.cc @@ -58,11 +58,8 @@ namespace madness { response_space &f) { MADNESS_ASSERT(f.size() > 0); MADNESS_ASSERT(f[0].size() == op.size()); - - response_space result(f[0][0].world(), f.size(), f[0].size()); - int i = 0; - for (auto &fi: f.x) { result.x[i++] = apply(world, op, fi); } - + response_space result = f.copy(); + for (const auto &i: f.active) { result.x[i] = apply(world, op, f[i]); } world.gop.fence(); /* for (unsigned int i = 0; i < f.size(); i++) { From 95993b37aef36756f339c371b8e7caa80a1dff72 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 19:36:41 -0400 Subject: [PATCH 1098/1312] apply active to res --- src/apps/molresponse/ResponseBase.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 79325c0a775..58a63c44ad0 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1173,6 +1173,7 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp // compute residual Tensor residual_norms; X_space res(world, m, n); + res.active = chi.active; if (compute_y) { res = g_chi - chi; residual_norms = res.norm2s(); From 994a13de7181a2389464e1990cdb817baa8dc617 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 15 Mar 2023 20:06:06 -0400 Subject: [PATCH 1099/1312] add set_active() function and apply them --- src/apps/molresponse/FrequencyResponse.cpp | 3 +- src/apps/molresponse/ResponseBase.cpp | 83 ++-------------------- src/apps/molresponse/global_functions.cc | 1 + src/apps/molresponse/x_space.h | 5 ++ 4 files changed, 11 insertions(+), 81 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0899162db0c..d151b3ed0c3 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -255,7 +255,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - bool compute_y = omega_n != 0.0; auto x = chi.copy();// copy chi X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); X_space new_chi = @@ -269,7 +268,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } inner_to_json(world, "x_update", response_context.inner(new_chi, new_chi), iter_function_data); - if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } + // if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 58a63c44ad0..d286005d1d4 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -393,20 +393,13 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, // world.mpi.Barrier(); bool compute_Y = calc_type == "full"; X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); - world.gop.fence(); - - // std::cout << "MPI BARRIER 4 " << std::endl; - // world.mpi.Barrier(); - // compute if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_Y); //V0X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); } - if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space E0X(world, chi.num_states(), chi.num_orbitals()); if (r_params.localize() != "canon") { @@ -440,9 +433,6 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, inner_to_json(world, "gamma_x", response_context.inner(chi, gamma), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // Right here I can compute the polarizability before I try a KAIN UPDATE or step restriction - - Theta_X = (V0X - E0X) + gamma; inner_to_json(world, "theta_x", response_context.inner(chi, Theta_X), iter_function_data); @@ -602,66 +592,39 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm auto old_pmap = FunctionDefaults<3>::get_pmap(); auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); QProjector projector(world, phi0); - - size_t num_states = xy.num_states(); size_t num_orbitals = xy.num_orbitals(); - // shallow copy - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - X_space gamma(world, num_states, num_orbitals); // here I create the orbital products for elctron interaction terms vecfuncT phi_phi; vecfuncT x_phi; functionT temp_J; - X_space W = X_space::zero_functions(world, num_states, num_orbitals); X_space J(world, num_states, num_orbitals); X_space K = X_space::zero_functions(world, num_states, num_orbitals); X_space KX = X_space::zero_functions(world, num_states, num_orbitals); X_space KY = X_space::zero_functions(world, num_states, num_orbitals); - - // std::cout << "MPI BARRIER After create Zero functions gamma " << std::endl; - // world.mpi.Barrier(); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); } - // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto rho = make_density(world, xy); - - //auto rho = transition_density(world, phi0, xy.X, xy.X); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute density J[omega]"); } - - // Create Coulomb potential on ground_orbitals - - /* - auto compute_jx = [&, &phi0 = phi0](auto rho_alpha) { - auto temp_J = apply(*shared_coulomb_operator, rho_alpha); - return mul(world, temp_J, phi0); - }; - */ - int b = 0; for (const auto &rho_b: rho) { auto temp_J = apply(*shared_coulomb_operator, rho_b); J.x[b++] = mul(world, temp_J, phi0); } - //std::transform(rho.begin(), rho.end(), J.X.begin(), compute_jx); std::transform(J.x.begin(), J.x.end(), J.x.begin(), [&](auto &jxi) { return projector(jxi); }); J.y = J.x.copy(); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } inner_to_json(world, "j1", response_context.inner(xy, J), iter_function_data); - if (xcf.hf_exchange_coefficient() != 1.0) { auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { auto xc_rho = xc.apply_xc_kernel(rho_alpha); @@ -677,28 +640,6 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } } inner_to_json(world, "v1_xc", response_context.inner(xy, W), iter_function_data); - - - /* - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - std::transform(xy.X.begin(), xy.X.end(), KX.X.begin(), - [&](const auto &xi) { return newK(xi, phi0, phi0); }); - - std::transform(xy.y.begin(), xy.y.end(), KY.X.begin(), - [&](const auto &yi) { return newK(phi0, yi, phi0); }); - - - K = KX + KY; - world.gop.fence(); - - if (r_params.print_level() >= 20) { print_inner(world, "old xK1x", xy, KX); } - if (r_params.print_level() >= 20) { print_inner(world, "old xK2x", xy, KY); } - if (r_params.print_level() >= 20) { print_inner(world, "old xKx", xy, K); } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "old K[omega]", "K[omega]", iter_timing); - } - */ if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, xy, false); std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); @@ -707,30 +648,12 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } - - /* if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - K = response_exchange(phi0, xy, false); - if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "new K[omega]"); } - */ - // for each response state we compute the Gamma response functions - // trucate all response functions - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - /* - J.truncate(); - KX.truncate(); - KY.truncate(); - W.truncate(); - */ - - // update gamma functions gamma = 2 * J - K * xcf.hf_exchange_coefficient() + W; inner_to_json(world, "gamma_x_beforeQ", response_context.inner(xy, gamma), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); } - // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } //for (size_t i = 0; i < num_states; i++) { gamma.X[i] = projector(gamma.X[i]); } @@ -990,8 +913,10 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< size_t m = X.num_states(); size_t n = X.num_orbitals(); - X_space V0 = X_space(world, m, n); - X_space K0 = X_space(world, m, n); + X_space V0 = X_space::zero_functions(world, m, n); + V0.set_active(X.active); + X_space K0 = X_space::zero_functions(world, m, n); + K0.set_active(X.active); real_function_3d v_nuc, v_j0, v_k0, v_xc; if (not r_params.store_potential()) { v_nuc = potential_manager->vnuclear(); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index c2e4ea693cf..587da06330c 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -377,6 +377,7 @@ auto ground_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, const auto num_orbitals = chi.num_orbitals(); auto K0 = X_space::zero_functions(world, num_states, num_orbitals); + K0.set_active(chi.active); // the question is copying pointers mpi safe world.gop.fence(); auto k0 = make_k(phi0, phi0); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index a8c6f5a92db..28aaf07ea92 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -48,6 +48,11 @@ namespace madness { size_t i{0}; for (auto &ai: active) { ai = i++; } } + void set_active(const std::list& new_active) { + active = new_active; + x.active = new_active; + y.active = new_active; + } X_space(const X_space &A) : n_states(size_states(A)), n_orbitals(size_orbitals(A)), x(A.x), y(A.y), active(A.active) {} From 5f790158aa8a8751862c24ce363a5b8752daf505 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 16 Mar 2023 12:32:41 -0400 Subject: [PATCH 1100/1312] fix copy bug --- src/apps/molresponse/FrequencyResponse.cpp | 14 ++++++++++++-- src/apps/molresponse/ResponseBase.cpp | 12 ++++++++---- src/apps/molresponse/global_functions.cc | 16 +++++++++++++++- src/apps/molresponse/response_functions.h | 2 +- src/apps/molresponse/testing/runners.hpp | 2 +- src/apps/molresponse/x_space.h | 8 +++++--- 6 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d151b3ed0c3..0aa68df8662 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -98,6 +98,8 @@ void FrequencyResponse::iterate(World &world) { Chi.reset_active(); for (iter = 0; iter < r_params.maxiter(); ++iter) { + auto checkx = Chi.norm2s(); + if (world.rank() == 0) { print("At the start of iterate x", checkx); } iter_timing.clear(); iter_function_data.clear(); if (r_params.print_level() >= 1) { @@ -136,10 +138,11 @@ void FrequencyResponse::iterate(World &world) { print("bsh residuals : ", x_residuals); print("relative bsh residuals : ", x_relative_residuals); print("bsh residual target : ", x_relative_target); + print("targets : x", x_relative_target, " d", density_target); } } auto check_convergence = [&](auto &ri, auto &di) { - print(ri, di); + if (world.rank() == 0) { print(ri, di); } return ((ri < x_relative_target) && (di < density_target)); }; std::transform(x_relative_residuals.ptr(), x_relative_residuals.ptr() + m, @@ -170,6 +173,8 @@ void FrequencyResponse::iterate(World &world) { } } inner_to_json(world, "x", response_context.inner(Chi, Chi), iter_function_data); + checkx = Chi.norm2s(); + if (world.rank() == 0) { print("Right before update x", checkx); } auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -256,11 +261,16 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto x = chi.copy();// copy chi - X_space theta_X = compute_theta_X(world, chi, xc, r_params.calc_type()); + auto checkx = x.norm2s(); + if (world.rank() == 0) { print("Right after chi.copy() ", checkx); } + X_space theta_X = compute_theta_X(world, x, xc, r_params.calc_type()); + checkx = x.norm2s(); + if (world.rank() == 0) { print("Right after compute_theta ", checkx); } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); + auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); inner_to_json(world, "r_x", response_context.inner(new_res, new_res), iter_function_data); //&& iteration < 7 diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d286005d1d4..27ca053809d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -420,6 +420,10 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, X_space gamma; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (calc_type == "full") { + if (world.rank() == 0) { print("entering gamma"); } + auto checkx = chi.norm2s(); + if (world.rank() == 0) { print("checking x", checkx); } + gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); } else if (calc_type == "static") { gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); @@ -522,11 +526,11 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); + // auto K = response_exchange(phi0, chi_alpha, true); K = oop_apply(K, apply_projector); // std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); // std::transform(K.y.begin(), K.y.end(), K.y.begin(), [&](auto &kyi) { return projector(kyi); }); - //auto K = response_exchange(phi0, chi_alpha, true); inner_to_json(world, "k1", response_context.inner(chi_alpha, K), iter_function_data); @@ -972,14 +976,14 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< V0 = X * v0; V0 += -c_xc * K0; V0.truncate(); - inner_to_json(world, "V0", response_context.inner(X, V0), iter_function_data); + inner_to_json(world, "v0", response_context.inner(X, V0), iter_function_data); } else { V0 = X.copy(); V0.x = v0 * V0.x; V0.x += -c_xc * K0.x; V0.x.truncate_rf(); V0.y = V0.x.copy(); - inner_to_json(world, "V0", response_context.inner(X, V0), iter_function_data); + inner_to_json(world, "v0", response_context.inner(X, V0), iter_function_data); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } if (r_params.print_level() >= 1) { @@ -1098,7 +1102,7 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp // compute residual Tensor residual_norms; X_space res(world, m, n); - res.active = chi.active; + res.set_active(chi.active); if (compute_y) { res = g_chi - chi; residual_norms = res.norm2s(); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 587da06330c..68a41224504 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -322,9 +322,21 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons auto num_states = chi.num_states(); auto num_orbitals = chi.num_orbitals(); auto K = X_space::zero_functions(world, num_states, num_orbitals); - world.gop.fence(); vector_real_function_3d k1x, k1y, k2x, k2y; + if (compute_y) { + + auto K1 = oop_apply(chi, [&](const vector_real_function_3d &xi) { + auto K1X = make_k(xi, phi0); + return K1X(phi0); + }); + auto K2 = oop_apply(chi, [&](const vector_real_function_3d &xi) { + auto K1X = make_k(phi0, xi); + return K1X(phi0); + }); + K = K1 + K2; + + /* for (const auto &b: chi.active) { auto x = chi.x[b]; auto y = chi.y[b]; @@ -341,7 +353,9 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); K.y[b][0].print_info(); world.gop.fence(); + } + */ } else { for (const auto &b: chi.active) { auto x = chi.x[b]; diff --git a/src/apps/molresponse/response_functions.h b/src/apps/molresponse/response_functions.h index 32f07335a52..288af213cf4 100644 --- a/src/apps/molresponse/response_functions.h +++ b/src/apps/molresponse/response_functions.h @@ -123,7 +123,7 @@ namespace madness { World &world = x[0][0].world(); response_space result(*this); std::transform(x.begin(), x.end(), result.x.begin(), - [&world](auto &xi) { return madness::copy(world, xi, false); }); + [&world](const vector_real_function_3d &xi) { return madness::copy(world, xi, false); }); world.gop.fence(); return result; } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 1c81f7c82f9..6e074fc9a90 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -518,7 +518,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("dconv", 1e-6); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(25)); + r_params.set_user_defined_value("maxiter", size_t(2)); r_params.set_user_defined_value("maxsub", size_t(10)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 28aaf07ea92..f4751172779 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -48,7 +48,7 @@ namespace madness { size_t i{0}; for (auto &ai: active) { ai = i++; } } - void set_active(const std::list& new_active) { + void set_active(const std::list &new_active) { active = new_active; x.active = new_active; y.active = new_active; @@ -61,7 +61,7 @@ namespace madness { auto new_x = X_space(*this);// copy for (int i = 0; i < new_x.num_states(); i++) { new_x.x[i] = madness::copy(world, x[i], false); - new_x.y[i] = madness::copy(world, x[i], false); + new_x.y[i] = madness::copy(world, y[i], false); } world.gop.fence(); @@ -149,7 +149,9 @@ namespace madness { -> X_space { auto &world = A.x[0][0].world(); auto result = A.copy(); + if (world.rank() == 0) { print("oop_apply"); } for (auto &i: result.active) { + if (world.rank() == 0) { print("oop_apply", i); } result.x[i] = func(A.x[i]); result.y[i] = func(A.y[i]); } @@ -288,7 +290,7 @@ namespace madness { inplace_apply(*this, truncate_i); } - auto norm2s() -> Tensor { + auto norm2s() const -> Tensor { World &world = x[0][0].world(); Tensor norms(num_states()); From 6102d7a4aedc05a34f0d1bc8ba6881effb78124d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 16 Mar 2023 12:52:26 -0400 Subject: [PATCH 1101/1312] fix exchange --- src/apps/molresponse/global_functions.cc | 4 ++-- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 68a41224504..e98f423191f 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -326,6 +326,7 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons if (compute_y) { + /* auto K1 = oop_apply(chi, [&](const vector_real_function_3d &xi) { auto K1X = make_k(xi, phi0); return K1X(phi0); @@ -335,8 +336,8 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons return K1X(phi0); }); K = K1 + K2; + */ - /* for (const auto &b: chi.active) { auto x = chi.x[b]; auto y = chi.y[b]; @@ -355,7 +356,6 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); } - */ } else { for (const auto &b: chi.active) { auto x = chi.x[b]; diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 6e074fc9a90..44d5b417b21 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -518,7 +518,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("dconv", 1e-6); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(2)); + r_params.set_user_defined_value("maxiter", size_t(20)); r_params.set_user_defined_value("maxsub", size_t(10)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); From 2fd3678e0168784c6490183d2e334bf13340329c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 16 Mar 2023 16:21:23 -0400 Subject: [PATCH 1102/1312] it works! --- src/apps/molresponse/FrequencyResponse.cpp | 28 ++++++++--- src/apps/molresponse/ResponseBase.cpp | 55 +++++++++++++++------- src/apps/molresponse/ResponseBase.hpp | 1 + 3 files changed, 61 insertions(+), 23 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 0aa68df8662..e27fa2d7ab5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -35,6 +35,7 @@ void FrequencyResponse::iterate(World &world) { Tensor x_residuals((int(m))); Tensor x_relative_residuals((int(m))); Tensor density_residuals((int(m))); + Tensor density_residuals_old((int(m))); bool static_res = (omega == 0.0); bool compute_y = not static_res; @@ -96,6 +97,7 @@ void FrequencyResponse::iterate(World &world) { vector converged(Chi.num_states(), false); Chi.reset_active(); + rho_omega= make_density(world,Chi); for (iter = 0; iter < r_params.maxiter(); ++iter) { auto checkx = Chi.norm2s(); @@ -145,10 +147,17 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { print(ri, di); } return ((ri < x_relative_target) && (di < density_target)); }; - std::transform(x_relative_residuals.ptr(), x_relative_residuals.ptr() + m, - density_residuals.ptr(), converged.begin(), check_convergence); + + for (const auto &b: Chi.active) { + converged[b] = check_convergence(x_relative_residuals[b], density_residuals[b]); + } int b = 0; - Chi.active.remove_if([&](auto x) { return converged[b++]; }); + auto remove_converged = [&]() { + Chi.reset_active(); + Chi.active.remove_if([&](auto x) { return converged[b++]; }); + }; + remove_converged(); + if (world.rank() == 0) { print("converged", converged); print("active", Chi.active); @@ -178,12 +187,12 @@ void FrequencyResponse::iterate(World &world) { auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - rho_omega_old = make_density(world, Chi); + rho_omega_old = rho_omega; if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make_density_old", "make_density_old", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - rho_omega = make_density(world, new_chi); + rho_omega = update_density(world, new_chi, rho_omega_old); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make_density_new", "make_density_new", iter_timing); } @@ -200,9 +209,12 @@ void FrequencyResponse::iterate(World &world) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } if (world.rank() == 0) { print("computing chi norms: xij residuals"); } + density_residuals = density_residuals_old; + for (const auto &b: Chi.active) { + density_residuals[b] = (rho_omega[b] - rho_omega_old[b]).norm2(); + } + density_residuals_old = copy(density_residuals); - auto density_change = madness::sub(world, rho_omega, rho_omega_old, true); - density_residuals = norm2s_T(world, density_change); iter_function_data["r_d"] = density_residuals; auto dnorm = norm2s_T(world, rho_omega); iter_function_data["d"] = dnorm; @@ -232,6 +244,8 @@ void FrequencyResponse::iterate(World &world) { function_data.add_data(iter_function_data); } + Chi.reset_active(); + if (world.rank() == 0) print("\n"); if (world.rank() == 0) print(" Finished Response Calculation "); if (world.rank() == 0) print(" ------------------------"); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 27ca053809d..92b58bf1a56 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -291,24 +291,45 @@ auto ResponseBase::make_xc_operator(World &world) const -> XCOperator return {world, r_params.xc(), false, ground_density, ground_density}; } +auto ResponseBase::update_density(World &world, const X_space &chi, + const vecfuncT &old_density) const -> vecfuncT { + auto density = copy(world, old_density); + auto calc_type = r_params.calc_type(); + auto thresh = FunctionDefaults<3>::get_thresh(); + if (calc_type == "full") { + for (const auto &b: chi.active) { + auto x_phi = mul(world, chi.x[b], ground_orbitals, false); + auto y_phi = mul(world, chi.y[b], ground_orbitals, false); + world.gop.fence(); + density[b] = sum(world, x_phi) + sum(world, y_phi); + } + + } else if (calc_type == "static") { + for (const auto &b: chi.active) { + auto x_phi = mul(world, chi.x[b], ground_orbitals, false); + world.gop.fence(); + density[b] = 2 * sum(world, x_phi); + } + } else { + density = transition_densityTDA(world, ground_orbitals, chi.x); + } + if (world.rank() == 0) { print("make density: made density"); } + truncate(world, density, thresh); + if (world.rank() == 0) { print("make density: truncate"); } + return density; +} auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfuncT { auto density = vector_real_function_3d(chi.num_states()); auto calc_type = r_params.calc_type(); auto thresh = FunctionDefaults<3>::get_thresh(); if (calc_type == "full") { - auto r_matrix = to_response_matrix(chi); - if (world.rank() == 0) { print("make density: to response matrix"); } - auto r_phi0 = to_response_vector(ground_orbitals); - if (world.rank() == 0) { print("make density: to response vector"); } - int b = 0; - auto x = to_response_matrix(chi); - auto phiphi = to_response_vector(ground_orbitals); - for (auto &rho_b: density) { - auto x_phi = mul(world, x[b], phiphi, false); + + for (const auto &b: chi.active) { + auto x_phi = mul(world, chi.x[b], ground_orbitals, false); + auto y_phi = mul(world, chi.y[b], ground_orbitals, false); world.gop.fence(); - rho_b = sum(world, x_phi); - b++; + density[b] = sum(world, x_phi) + sum(world, y_phi); } } else if (calc_type == "static") { @@ -469,7 +490,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit vecfuncT x_phi; vecfuncT y_phi; - X_space J(world, num_states, num_orbitals); + X_space J = X_space::zero_functions(world, num_states, num_orbitals); response_space j_x(world, num_states, num_orbitals); response_space j_y(world, num_states, num_orbitals); @@ -1101,7 +1122,7 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp bool compute_y = r_params.omega() != 0.0; // compute residual Tensor residual_norms; - X_space res(world, m, n); + X_space res = X_space::zero_functions(world, m, n); res.set_active(chi.active); if (compute_y) { res = g_chi - chi; @@ -1109,6 +1130,7 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp } else { res.x = g_chi.x - chi.x; residual_norms = res.x.norm2(); + if (world.rank() == 0) { print("printing residual norms", residual_norms); } } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); @@ -1133,9 +1155,10 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, auto x_residuals = to_response_matrix(residual_chi); int b = 0; for (const auto &i: Chi.active) { - update[i] = kain_x_space[i].update(x_vectors[i], x_residuals[i]); - } - kain_update = to_X_space(update); + auto temp = kain_x_space[i].update(x_vectors[i], x_residuals[i]); + std::copy(temp.begin(), temp.begin() + n, kain_update.x[i].begin()); + std::copy(temp.begin() + n, temp.end(), kain_update.y[i].begin()); + }; } else { int b = 0; for (const auto &i: Chi.active) { diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 5bf1f7f2c6d..a4a43b1b607 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -370,6 +370,7 @@ class ResponseBase { const Tensor &x_abs_norms, const Tensor &rho_norms, const Tensor &rho_res_norms); X_space compute_TX(World &world, const X_space &X, bool compute_Y) const; + vecfuncT update_density(World &world, const X_space &chi, const vecfuncT &old_density) const; }; From 1e979fcfc5d1211e5e8d8119928738e39caab01a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 16 Mar 2023 17:17:41 -0400 Subject: [PATCH 1103/1312] remove unnecessary printing --- src/apps/molresponse/FrequencyResponse.cpp | 14 ++++---------- src/apps/molresponse/ResponseBase.cpp | 8 ++++---- src/apps/molresponse/x_space.h | 4 ++-- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e27fa2d7ab5..b142bd7ec83 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -134,12 +134,6 @@ void FrequencyResponse::iterate(World &world) { print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); print("||X||: ", chi_norms); - print("max rotation: ", max_rotation); - print("density changes : ", density_residuals); - print("density target : ", density_target); - print("bsh residuals : ", x_residuals); - print("relative bsh residuals : ", x_relative_residuals); - print("bsh residual target : ", x_relative_target); print("targets : x", x_relative_target, " d", density_target); } } @@ -275,11 +269,11 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto x = chi.copy();// copy chi - auto checkx = x.norm2s(); - if (world.rank() == 0) { print("Right after chi.copy() ", checkx); } +// auto checkx = x.norm2s(); + // if (world.rank() == 0) { print("Right after chi.copy() ", checkx); } X_space theta_X = compute_theta_X(world, x, xc, r_params.calc_type()); - checkx = x.norm2s(); - if (world.rank() == 0) { print("Right after compute_theta ", checkx); } + // checkx = x.norm2s(); + // if (world.rank() == 0) { print("Right after compute_theta ", checkx); } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 92b58bf1a56..0e05e976062 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -441,9 +441,9 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, X_space gamma; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (calc_type == "full") { - if (world.rank() == 0) { print("entering gamma"); } - auto checkx = chi.norm2s(); - if (world.rank() == 0) { print("checking x", checkx); } + // if (world.rank() == 0) { print("entering gamma"); } + // auto checkx = chi.norm2s(); + // if (world.rank() == 0) { print("checking x", checkx); } gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); } else if (calc_type == "static") { @@ -1130,7 +1130,7 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp } else { res.x = g_chi.x - chi.x; residual_norms = res.x.norm2(); - if (world.rank() == 0) { print("printing residual norms", residual_norms); } + // if (world.rank() == 0) { print("printing residual norms", residual_norms); } } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index f4751172779..ddecb201d6f 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -149,9 +149,9 @@ namespace madness { -> X_space { auto &world = A.x[0][0].world(); auto result = A.copy(); - if (world.rank() == 0) { print("oop_apply"); } + // if (world.rank() == 0) { print("oop_apply"); } for (auto &i: result.active) { - if (world.rank() == 0) { print("oop_apply", i); } + // if (world.rank() == 0) { print("oop_apply", i); } result.x[i] = func(A.x[i]); result.y[i] = func(A.y[i]); } From 12bbec0656a8fa151b19a52be759fef222015d32 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 18 Mar 2023 21:48:38 -0400 Subject: [PATCH 1104/1312] remove unnecessary printing --- src/apps/molresponse/FrequencyResponse.cpp | 14 +++++++------- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index b142bd7ec83..1dae3fd4c41 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -97,11 +97,11 @@ void FrequencyResponse::iterate(World &world) { vector converged(Chi.num_states(), false); Chi.reset_active(); - rho_omega= make_density(world,Chi); + rho_omega = make_density(world, Chi); for (iter = 0; iter < r_params.maxiter(); ++iter) { auto checkx = Chi.norm2s(); - if (world.rank() == 0) { print("At the start of iterate x", checkx); } + //if (world.rank() == 0) { print("At the start of iterate x", checkx); } iter_timing.clear(); iter_function_data.clear(); if (r_params.print_level() >= 1) { @@ -177,7 +177,7 @@ void FrequencyResponse::iterate(World &world) { } inner_to_json(world, "x", response_context.inner(Chi, Chi), iter_function_data); checkx = Chi.norm2s(); - if (world.rank() == 0) { print("Right before update x", checkx); } + //if (world.rank() == 0) { print("Right before update x", checkx); } auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -269,11 +269,11 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto x = chi.copy();// copy chi -// auto checkx = x.norm2s(); - // if (world.rank() == 0) { print("Right after chi.copy() ", checkx); } + // auto checkx = x.norm2s(); + // if (world.rank() == 0) { print("Right after chi.copy() ", checkx); } X_space theta_X = compute_theta_X(world, x, xc, r_params.calc_type()); - // checkx = x.norm2s(); - // if (world.rank() == 0) { print("Right after compute_theta ", checkx); } + // checkx = x.norm2s(); + // if (world.rank() == 0) { print("Right after compute_theta ", checkx); } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 44d5b417b21..2c71caed37d 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -525,7 +525,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("first_order", true); r_params.set_user_defined_value("plot_all_orbitals", true); r_params.set_user_defined_value("plot", true); - r_params.set_user_defined_value("print_level", 20); + r_params.set_user_defined_value("print_level", 5); r_params.set_user_defined_value("save", true); // set xc, property, frequency,and restart r_params.set_user_defined_value("xc", xc); From 64077654ae048f7464ebd62fe7273059a5be775e Mon Sep 17 00:00:00 2001 From: Thomas Herault Date: Wed, 22 Mar 2023 11:23:03 -0400 Subject: [PATCH 1105/1312] Fix typo in PaRSEC task backend: was using the input parameter instead of the computed value for the number of threads, defaulting to -1 if MADNESS was initialized without specifying a number of threads, even if MAD_NUM_THREADS was set --- src/madness/world/thread.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/world/thread.cc b/src/madness/world/thread.cc index 201e0a27366..513a2744483 100644 --- a/src/madness/world/thread.cc +++ b/src/madness/world/thread.cc @@ -362,7 +362,7 @@ namespace madness { MADNESS_EXCEPTION("pthread_setspecific failed", rc); #if HAVE_PARSEC assert(nullptr == parsec_runtime); - parsec_runtime = new ParsecRuntime(nthread); + parsec_runtime = new ParsecRuntime(nthreads); #elif HAVE_INTEL_TBB // #if HAVE_INTEL_TBB From b2cfe752dd8abd98683ec1bd3891035ee610d86e Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 14 Feb 2023 15:13:55 -0500 Subject: [PATCH 1106/1312] merge master into ccresponse --- src/madness/chem/exchangeoperator.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/madness/chem/exchangeoperator.h b/src/madness/chem/exchangeoperator.h index 0bf8534a506..f9270c9926c 100644 --- a/src/madness/chem/exchangeoperator.h +++ b/src/madness/chem/exchangeoperator.h @@ -301,6 +301,16 @@ class Exchange::ExchangeImpl { }; +//extern template +//class Exchange::ExchangeImpl; +//extern template +//class Exchange::ExchangeImpl::MacroTaskExchangeSimple::MacroTaskPartitionerExchange; +// +//extern template +//class Exchange::ExchangeImpl; +//extern template +//class Exchange::ExchangeImpl::MacroTaskExchangeSimple::MacroTaskPartitionerExchange; + } /* namespace madness */ #endif /* SRC_APPS_CHEM_EXCHANGEOPERATOR_H_ */ From e09abe015ec5dc8334b97fbbfd3d3631e027585e Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Wed, 22 Mar 2023 20:16:54 -0400 Subject: [PATCH 1107/1312] amend a630bf3f to only limit MAD_NUM_THREADS to 64 when using native thread pool --- src/madness/world/thread.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/madness/world/thread.cc b/src/madness/world/thread.cc index 513a2744483..fad745efb83 100644 --- a/src/madness/world/thread.cc +++ b/src/madness/world/thread.cc @@ -353,8 +353,6 @@ namespace madness { instance_ptr = this; if (nthreads < 0) nthreads = default_nthread(); MADNESS_ASSERT(nthreads >=0); - if (nthreads>64) - MADNESS_EXCEPTION("\n\nno more than 64 threads in MADNESS:\nexport MAD_NUM_THREADS = 64\n",1); const int rc = pthread_setspecific(ThreadBase::thread_key, static_cast(&main_thread)); @@ -378,6 +376,9 @@ namespace madness { tbb_arena = std::make_unique(num_tbb_threads); #else + if (nthreads>64) + MADNESS_EXCEPTION("When configured with MADNESS_TASK_BACKEND=Pthreads MAD_NUM_THREADS cannot exceed 64",1); + try { if (nthreads > 0) threads = new ThreadPoolThread[nthreads]; From 68187dea0c12fbcc39cc245eb1deb0910844804b Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Wed, 22 Mar 2023 20:18:04 -0400 Subject: [PATCH 1108/1312] amends https://github.com/m-a-d-n-e-s-s/madness/pull/463 to set the number of threads correctly when using PaRSEC backend --- src/madness/world/thread.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/madness/world/thread.cc b/src/madness/world/thread.cc index fad745efb83..739a2abcd00 100644 --- a/src/madness/world/thread.cc +++ b/src/madness/world/thread.cc @@ -359,8 +359,9 @@ namespace madness { if(rc != 0) MADNESS_EXCEPTION("pthread_setspecific failed", rc); #if HAVE_PARSEC - assert(nullptr == parsec_runtime); - parsec_runtime = new ParsecRuntime(nthreads); + MADNESS_ASSERT(nullptr == parsec_runtime); + const int num_parsec_threads = nthreads + 1; + parsec_runtime = new ParsecRuntime(num_parsec_threads); #elif HAVE_INTEL_TBB // #if HAVE_INTEL_TBB From 91fff76deba20c751d0646c54f2f1c1e07bd6156 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 23 Mar 2023 07:44:15 -0400 Subject: [PATCH 1109/1312] amends b2cfe752dd8abd98683ec1bd3891035ee610d86e --- src/madness/chem/exchangeoperator.h | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/madness/chem/exchangeoperator.h b/src/madness/chem/exchangeoperator.h index f9270c9926c..0bf8534a506 100644 --- a/src/madness/chem/exchangeoperator.h +++ b/src/madness/chem/exchangeoperator.h @@ -301,16 +301,6 @@ class Exchange::ExchangeImpl { }; -//extern template -//class Exchange::ExchangeImpl; -//extern template -//class Exchange::ExchangeImpl::MacroTaskExchangeSimple::MacroTaskPartitionerExchange; -// -//extern template -//class Exchange::ExchangeImpl; -//extern template -//class Exchange::ExchangeImpl::MacroTaskExchangeSimple::MacroTaskPartitionerExchange; - } /* namespace madness */ #endif /* SRC_APPS_CHEM_EXCHANGEOPERATOR_H_ */ From 0ed41fa2ba9b6bfdc97d6787e60a694352841868 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 24 Mar 2023 19:51:12 +0100 Subject: [PATCH 1110/1312] fixed broken build --- src/apps/cis/CMakeLists.txt | 8 +++++--- src/apps/moldft/CMakeLists.txt | 4 +++- src/apps/nemo/CMakeLists.txt | 6 ++++-- src/apps/oep/CMakeLists.txt | 5 ++++- src/apps/znemo/CMakeLists.txt | 4 +++- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/apps/cis/CMakeLists.txt b/src/apps/cis/CMakeLists.txt index 909461bcd97..74bfe56c623 100644 --- a/src/apps/cis/CMakeLists.txt +++ b/src/apps/cis/CMakeLists.txt @@ -3,8 +3,10 @@ add_mad_executable(cis cis.cpp "MADchem") add_dependencies(applications-madness cis) -add_scripted_tests(test_callable.py cis "short;applications") -add_scripted_tests(test_energy_he.py cis "medium;applications") -add_scripted_tests(test_symmetry_h2o.py cis "long;applications") +if(BUILD_TESTING) + add_scripted_tests(test_callable.py cis "short;applications") + add_scripted_tests(test_energy_he.py cis "medium;applications") + add_scripted_tests(test_symmetry_h2o.py cis "long;applications") +endif() install(TARGETS cis DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index 2132a7183e8..2d445131b7a 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -11,7 +11,9 @@ add_mad_executable(testpg testpg.cc MADchem) add_mad_executable(testperiodicdft testperiodicdft.cc MADchem) -add_scripted_tests(test_energy.py moldft "short;applications") +if(BUILD_TESTING) + add_scripted_tests(test_energy.py moldft "short;applications") +endif() # removed mcpfit since it is likely only of historic interest diff --git a/src/apps/nemo/CMakeLists.txt b/src/apps/nemo/CMakeLists.txt index 34b0ed82d71..aac1f2f5504 100644 --- a/src/apps/nemo/CMakeLists.txt +++ b/src/apps/nemo/CMakeLists.txt @@ -3,7 +3,9 @@ add_mad_executable(nemo nemo.cc "MADchem") add_dependencies(applications-madness nemo) -add_scripted_tests(test_energy.py nemo "short;applications") -add_scripted_tests(test_localization.py nemo "long;applications") +if(BUILD_TESTING) + add_scripted_tests(test_energy.py nemo "short;applications") + add_scripted_tests(test_localization.py nemo "long;applications") +endif() install(TARGETS nemo DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/oep/CMakeLists.txt b/src/apps/oep/CMakeLists.txt index cd4a4596445..63fa7dddc0b 100644 --- a/src/apps/oep/CMakeLists.txt +++ b/src/apps/oep/CMakeLists.txt @@ -2,6 +2,9 @@ add_mad_executable(oep oep.cc "MADchem") add_dependencies(applications-madness oep) -add_scripted_tests(test_energy.py oep "medium;applications") + +if(BUILD_TESTING) + add_scripted_tests(test_energy.py oep "medium;applications") +endif() install(TARGETS oep DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/znemo/CMakeLists.txt b/src/apps/znemo/CMakeLists.txt index 0de21c3bff4..ca66e8ac4e0 100644 --- a/src/apps/znemo/CMakeLists.txt +++ b/src/apps/znemo/CMakeLists.txt @@ -3,8 +3,10 @@ add_mad_executable(znemo znemo.cc "MADchem") add_dependencies(applications-madness znemo) -if (NOT ENABLE_GENTENSOR) +if(BUILD_TESTING) + if (NOT ENABLE_GENTENSOR) add_scripted_tests(test_energy.py znemo "medium;applications") + endif() endif() From 8a80b2c1a401924a3ea87b8c23499f0fe02d4f4e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 3 Apr 2023 15:02:37 -0400 Subject: [PATCH 1111/1312] Switch max sub to 5 --- src/apps/molresponse/ResponseBase.cpp | 6 ------ src/apps/molresponse/testing/runners.hpp | 3 ++- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 0e05e976062..66ccd694418 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -389,12 +389,6 @@ auto ResponseBase::make_bsh_operators_response(World &world, double &shift, double mu = sqrt(-2.0 * (ground_energies(p++) + omega + shift)); operator_p = poperatorT(BSHOperatorPtr3D(world, mu, r_params.lo(), tol)); }); - /* - for (size_t p = 0; p < num_orbitals; p++) { - double mu = sqrt(-2.0 * (ground_energies(p) + omega + shift)); - ops[p] = poperatorT(BSHOperatorPtr3D(world, mu, r_params.lo(), tol)); - } - */ if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make bsh operators response"); } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 2c71caed37d..9037eab32fa 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -519,13 +519,14 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param } //r_params.set_user_defined_value("archive", std::string("../restartdata")); r_params.set_user_defined_value("maxiter", size_t(20)); - r_params.set_user_defined_value("maxsub", size_t(10)); + r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); r_params.set_user_defined_value("plot_all_orbitals", true); r_params.set_user_defined_value("plot", true); r_params.set_user_defined_value("print_level", 5); + r_params.set_user_defined_value("guess_xyz", false); r_params.set_user_defined_value("save", true); // set xc, property, frequency,and restart r_params.set_user_defined_value("xc", xc); From ad852ea282962c3463fc57b76df65fe9b525fd7d Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 4 Apr 2023 16:05:41 -0400 Subject: [PATCH 1112/1312] Update README.md Test equations --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1b1ff0ccfc0..b7695b8e6d3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ MADNESS ======= +$$H \PSI = E \PSI $$ + Multiresolution Adaptive Numerical Environment for Scientific Simulation # Summary From 718919c795ed8e9f957750c64a862fff0884b273 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 4 Apr 2023 16:06:28 -0400 Subject: [PATCH 1113/1312] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b7695b8e6d3..9695c7bf77e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ MADNESS ======= -$$H \PSI = E \PSI $$ +$$H \Psi = E \Psi $$ Multiresolution Adaptive Numerical Environment for Scientific Simulation From c336c107c168872d7155c9470c72703ba59fd526 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 4 Apr 2023 16:25:45 -0400 Subject: [PATCH 1114/1312] getting the tutorial started --- doc/tutorial/TODO.md | 2 ++ doc/tutorial/tutorial.md | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 doc/tutorial/TODO.md create mode 100644 doc/tutorial/tutorial.md diff --git a/doc/tutorial/TODO.md b/doc/tutorial/TODO.md new file mode 100644 index 00000000000..a3e2205ae05 --- /dev/null +++ b/doc/tutorial/TODO.md @@ -0,0 +1,2 @@ +# To do list for completing the tutorial + diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md new file mode 100644 index 00000000000..d926971560c --- /dev/null +++ b/doc/tutorial/tutorial.md @@ -0,0 +1,9 @@ +# MADNESS tutorial + +This tutorial covers +* downloading, building, and installing MADNESS; +* a brief overview of the MADNESS parallel runtime; +* developing new applicaations using the numerical and chemistry APIS; +* running MADNESS applications in parallel; and +* using the MADNESS chemistry applications + From bb2cd867778ec79b4ac78593edfe1998ef03ea75 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 4 Apr 2023 16:42:39 -0400 Subject: [PATCH 1115/1312] experimenting --- doc/tutorial/tutorial.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index d926971560c..5aef8a9fe91 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -1,9 +1,24 @@ # MADNESS tutorial This tutorial covers -* downloading, building, and installing MADNESS; -* a brief overview of the MADNESS parallel runtime; -* developing new applicaations using the numerical and chemistry APIS; +* downloading, building and installing MADNESS; +* an overview of the MADNESS parallel runtime sufficient to develop and run numerical applications; +* developing new applications using the numerical and chemistry APIS; * running MADNESS applications in parallel; and -* using the MADNESS chemistry applications +* using the MADNESS chemistry applications. + +## Downloading + +From github --- how + +## Building and installing + +Reference materials +* [MADNESS ReadTheDocs](https://madness.readthedocs.io/en/latest/INSTALL.html) +* [Cmake](https://cmake.org/) + + + + + From 8dcbd1076f4891f3965b836de18f155c9b2f0ce1 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 4 Apr 2023 17:04:46 -0400 Subject: [PATCH 1116/1312] fixed some truly ancient bugs in longfloat in order to extract 220 --- src/madness/mra/tools/longfloat.py | 220 ++++++++++++++++------------ src/madness/mra/tools/quadrature.py | 63 ++++++-- 2 files changed, 176 insertions(+), 107 deletions(-) diff --git a/src/madness/mra/tools/longfloat.py b/src/madness/mra/tools/longfloat.py index 6100977dcc2..945dec2b596 100644 --- a/src/madness/mra/tools/longfloat.py +++ b/src/madness/mra/tools/longfloat.py @@ -444,6 +444,18 @@ def __coerce__(self, other): return (self,value) + # def __shift(value, shift): + # vabs = abs(value) + # vsgn = 1 + # if value < 0: vsgn = -1 + + # if shift < 0: + # value = value >> abs(shift) + # else: + # value = value << shift + + # return value + def __float__(self): # If the mantissa is too long then the standard conversion # of long to float does not work. Ugh. @@ -509,29 +521,37 @@ def __str__(self): tmp = longfloat(x) tmp.exponent = 0 tmp = tmp*tenr10 + #print "tmp", repr(tmp) # Shift the mantissa to zero the remaining exponent etmp = tmp.exponent mtmp = tmp.mantissa m10 = tmp.mantissa + #print "m10.a", m10 if etmp > 0: m10 = m10 << etmp elif etmp < 0: # Cannot just shift ... must round correctly. # Examine the last bit discarded etmp = abs(etmp) - m10 = m10 >> (etmp-1) - if (m10 & 1): - m10 = m10 + 2 - m10 = m10 >> 1 + mabs = abs(m10) + msgn = 1 + if m10<0: msgn = -1 + + mabs = mabs >> (etmp-1) + if (mabs & 1): + mabs = mabs + 2 + mabs = mabs >> 1 + m10 = msgn * mabs + #print "m10.b", m10 # Now we have e10 and m10 # Count the no. of decimal figures in m10 so that we can # have one significant figure before the decimal point strm = str(abs(m10)) n10 = len(strm) - 2 - e10 = e10 + n10 + e10 = e10 + n10 + 1 ############ RJH 2/10/23 # Finally can generate the result signm = '+' @@ -1284,50 +1304,62 @@ def truncate(self): Truncates self to the required number of significant binary digits. ''' nchopped = self.__nbits_in_mantissa() - longfloat.nbits - if nchopped > 0: - round = (self.mantissa > 0) and ((self.mantissa >> (nchopped-1)) & 1L) - self.mantissa = self.mantissa >> nchopped - if round: self.mantissa = self.mantissa + 1 + if self.mantissa == 0: + self.exponent = 0 + + if self.mantissa != 0 and nchopped > 0: + signm = 1 + if self.mantissa<0: signm = -1 + absm = abs(self.mantissa) + round = (absm >> (nchopped-1)) & 1L + + absm = absm >> nchopped + if round: + absm = absm + 1 + + self.mantissa = signm * absm self.exponent = self.exponent + nchopped - if not self.mantissa: self.exponent = 0 - def other_truncate(self, nbits=None): - ''' - Truncates self to the required number of significant binary digits. - ''' - if nbits == None: - nbits = self.nbits + # def other_truncate(self, nbits=None): + # ''' + # Truncates self to the required number of significant binary digits. + # ''' + # if nbits == None: + # nbits = self.nbits - eold = e = self.exponent - m = self.mantissa - - k = nbits # Multiplications typically double the no. of bits - test = (1L << nbits)-1 # The biggest permisible mantissa - - flag = (abs(m) > test) - while flag: - mk = m >> k - flag2 = (abs(mk) > test) - if (k == 1) or flag2: - m = mk - flag = flag2 - e = e + k - if k > 1: - k = k >> 1 - else: - k = k >> 1 - - if self.debug: - print 'longfloat: truncate: nbits lost =', e - eold - if m == 0L: e = 0 - - # Comment out the next three lines to stop rounding - if (e-eold): - if (self.mantissa >> (e-eold-1)) & 1: - m = m + 1 - - self.exponent = e - self.mantissa = m + # eold = e = self.exponent + # m = self.mantissa + + # k = nbits # Multiplications typically double the no. of bits + # test = (1L << nbits)-1 # The biggest permisible mantissa + + # flag = (abs(m) > test) + # while flag: + # mk = m >> k + # flag2 = (abs(mk) > test) + # if (k == 1) or flag2: + # m = mk + # flag = flag2 + # e = e + k + # if k > 1: + # k = k >> 1 + # else: + # k = k >> 1 + + # if self.debug: + # print 'longfloat: truncate: nbits lost =', e - eold + # if m == 0L: e = 0 + + # # Comment out the next five lines to stop rounding + # if (e-eold): + # if (self.mantissa >> (e-eold-1)) & 1: + # if m > 0: + # m = m + 1 + # else: + # m = m - 1 + + # self.exponent = e + # self.mantissa = m def __div__(self, other): return self*other.reciprocal() @@ -1337,11 +1369,12 @@ def __rdiv__(self,other): def __mp_do_test(test_nbits,ntest=10,ntime=10): - from whrandom import random, seed + from random import random, seed from sys import exit from time import clock - seed((3*test_nbits-1)%256,(5*test_nbits-2)%256,(7*test_nbits-3)%256) + #seed((3*test_nbits-1)%256,(5*test_nbits-2)%256,(7*test_nbits-3)%256) + seed(777*test_nbits) savenbits = longfloat.nbits longfloat.nbits = test_nbits @@ -1596,60 +1629,61 @@ def nbits(eps): print ' restored longfloat.nbits ', savenbits if __name__ == "__main__": + print ' HI' + __mp_do_test(104,ntest=3,ntime=3) + __mp_do_test(208,ntest=3,ntime=3) + __mp_do_test(500) + #__mp_do_test(1000) + from time import clock I = interpolators() -## print ' EXP ' -## vv = I.exp(longfloat(0.25)) -## start = clock() -## for i in range(10): -## vv = I.exp(longfloat(0.25)) -## used = (clock() - start)/10 -## print ' NEW ', used -## start = clock() -## for i in range(10): -## vv = longfloat(0.25).exp() -## used = (clock() - start)/10 -## print ' OLD ', used - ## print ' SIN ' -## print I.sin(0.25,1e-16) -## print sin(0.25) -## print ' COS ' -## print I.cos(0.25,1e-16) -## print cos(0.25) + print ' EXP ' + vv = I.exp(longfloat(0.25)) + start = clock() + for i in range(10): + vv = I.exp(longfloat(0.25)) + used = (clock() - start)/10 + print ' NEW ', used + start = clock() + for i in range(10): + vv = longfloat(0.25).exp() + used = (clock() - start)/10 + print ' OLD ', used + print ' SIN ' + print I.sin(0.25,1e-16) + print sin(0.25) + print ' COS ' + print I.cos(0.25,1e-16) + print cos(0.25) print ' LOG ' print I.log(longfloat(0.9)) print longfloat(0.9).log() q = longfloat(0.72) I.log(q) -## start = clock() -## for i in range(10): -## vv = I.log(q) -## used = (clock() - start)/10 -## print ' NEW ', used -## start = clock() -## for i in range(10): -## vv = q.log() -## used = (clock() - start)/10 -## print ' OLD ', used + start = clock() + for i in range(10): + vv = I.log(q) + used = (clock() - start)/10 + print ' NEW ', used + start = clock() + for i in range(10): + vv = q.log() + used = (clock() - start)/10 + print ' OLD ', used import profile profile.run('for i in range(100): q.reciprocal()') -## print ' ASIN by inversion' -## print I.invert(0.25,I.sindsin,0.3,1e-16) -## print asin(0.25) -## print ' ACOS by inversion' -## print I.invert(0.25,I.cosdcos,1.1,1e-16) -## print acos(0.25) -## print ' EXP=ALOG by inversion' -## print I.invert(0.25,I.logdlog,1.0,1e-16) -## print exp(0.25) -## print ' LOG=AEXP by inversion' -## print I.invert(1.35,I.expdexp,0.2,1e-16) -## print log(1.35) - #print ' HI' - #__mp_do_test(104,ntest=3,ntime=3) - #__mp_do_test(208,ntest=3,ntime=3) - #__mp_do_test(500) - #__mp_do_test(1000) + print ' ASIN by inversion' + print I.invert(0.25,I.sindsin,0.3,1e-16) + print asin(0.25) + print ' ACOS by inversion' + print I.invert(0.25,I.cosdcos,1.1,1e-16) + print acos(0.25) + print ' EXP=ALOG by inversion' + print I.invert(0.25,I.logdlog,1.0,1e-16) + print exp(0.25) + print ' LOG=AEXP by inversion' + print I.invert(1.35,I.expdexp,0.2,1e-16) + print log(1.35) else: #print ' reimported mp' pass diff --git a/src/madness/mra/tools/quadrature.py b/src/madness/mra/tools/quadrature.py index e3b04d8bb86..3df05fe3638 100644 --- a/src/madness/mra/tools/quadrature.py +++ b/src/madness/mra/tools/quadrature.py @@ -7,6 +7,7 @@ def __init__(self, order, region=[-1.,1.], rule='GaussLegendre', self.uselongfloat = uselongfloat if uselongfloat: + longfloat.nbits += 30 region = [longfloat(region[0]),longfloat(region[1])] self.order = order @@ -31,6 +32,11 @@ def __init__(self, order, region=[-1.,1.], rule='GaussLegendre', self.x = x self.w = w + if uselongfloat: + longfloat.nbits -= 30 + for i in range(self.order): + self.x[i].truncate() + self.w[i].truncate() def __pn(self, n,x): ''' @@ -133,6 +139,16 @@ def __grule(self): roots[k] = x weights[k] = w + nhalf = (n-1)/2+1 + if (n%2) == 1 and n>1: + roots[nhalf-1] = 0 + for i in range(nhalf): + j = n - i - 1 + roots[j] = 0.5 * (roots[j] - roots[i]) + roots[i] = -roots[j] + weights[i] = weights[j] = 0.5 * (weights[j] + weights[i]) + #print i,j,str(roots[i]+roots[j]),str(weights[i]-weights[j]) + return (roots,weights) def __factorial(self,n): @@ -335,7 +351,7 @@ def weights(self): def QuadratureTest(uselongfloat=0): ''' Test the Gauss-Legendre quadrature on [0.5,1] ''' maxmaxerr = 0.0 - for order in range(1,20): + for order in range(1,121): q = Quadrature(order,[0.5,1.0],uselongfloat=uselongfloat) maxerr = 0.0 for power in range(2*order): @@ -362,7 +378,7 @@ def QuadratureTest2(uselongfloat=0): two = longfloat(2) rootpi = two.pi().sqrt() - for order in range(2,24): + for order in range(2,121): q = Quadrature(order,rule="GaussHermite", uselongfloat=uselongfloat) maxerr = 0.0 @@ -382,18 +398,37 @@ def QuadratureTest2(uselongfloat=0): if __name__ == '__main__': - - q = Quadrature(7,(0.0,1.0),rule='GaussLegendre') - print q.points() - print q.weights() - stop - - print ' \n\n Testing quadrature with default floats \n' - QuadratureTest() - - print ' \n\n Testing quadrature with long floats \n' - QuadratureTest(uselongfloat=1) + longfloat.nbits = 220 # sufficient for quad-double representation + #print(longfloat.nbits) + #npt = 7 + #q = Quadrature(7,(-1.0,1.0),rule='GaussLegendre',uselongfloat=1) + #pts = q.points() + #wts = q.weights() + #for i in range(npt): + # print i, str(pts[i]), str(wts[i]) + ##print q.points() + ##print q.weights() + ##stop + + #print ' \n\n Testing quadrature with default floats \n' + #QuadratureTest() + + #print ' \n\n Testing quadrature with long floats \n' + #QuadratureTest(uselongfloat=1) + #stop #QuadratureTest2() - #QuadratureTest2(1) + #QuadratureTest2(uselongfloat=1) + + for npt in range(121): + print "%3d"%npt + q = Quadrature(npt,(-1,1),rule='GaussLegendre',uselongfloat=1) + pts = q.points() + wts = q.weights() + sumw = 0 + for i in range(npt): + sumw += wts[i] + #print(repr(pts[i])) + print "%4d %72s %72s" % (i, str(pts[i]), str(wts[i])) + #print "sumw", str(sumw) From e1b7288bc6ddf95e02dc726c1528fe4b56e66566 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 4 Apr 2023 17:22:00 -0400 Subject: [PATCH 1117/1312] see if this improves out of phase density issue --- src/apps/molresponse/FrequencyResponse.cpp | 50 +++++++++++++--------- src/apps/molresponse/FrequencyResponse.hpp | 12 +++--- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 1dae3fd4c41..4766c46de61 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -118,6 +118,7 @@ void FrequencyResponse::iterate(World &world) { } auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.x.norm2(); auto rho_norms = madness::norm2s_T(world, rho_omega); + std::transform(x_residuals.ptr(), x_residuals.ptr() + x_residuals.size(), chi_norms.ptr(), x_relative_residuals.ptr(), [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); @@ -158,7 +159,6 @@ void FrequencyResponse::iterate(World &world) { } all_done = std::all_of(converged.begin(), converged.end(), [](const auto &ci) { return ci; }); - if (all_done || iter == r_params.maxiter()) { // if converged print converged if (world.rank() == 0 && all_done and (r_params.print_level() > 1)) { @@ -177,9 +177,15 @@ void FrequencyResponse::iterate(World &world) { } inner_to_json(world, "x", response_context.inner(Chi, Chi), iter_function_data); checkx = Chi.norm2s(); - //if (world.rank() == 0) { print("Right before update x", checkx); } - auto [new_chi, new_res] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, - omega, kain_x_space, iter, max_rotation); + auto [new_chi, new_res, new_rho] = + update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, + kain_x_space, iter, max_rotation, rho_omega); + // Here we have computed the new response orbitals and the residuals + // Now we need to compute the new density and the new density residuals + // Instead, update should also update the density + // compute rho after bsh update to compute residual, update density after kain to keep + // consistent with kain orbitals + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = rho_omega; if (r_params.print_level() >= 1) { @@ -204,8 +210,9 @@ void FrequencyResponse::iterate(World &world) { } if (world.rank() == 0) { print("computing chi norms: xij residuals"); } density_residuals = density_residuals_old; + // compute density residuals for (const auto &b: Chi.active) { - density_residuals[b] = (rho_omega[b] - rho_omega_old[b]).norm2(); + density_residuals[b] = (rho_omega_old[b] - new_rho[b]).norm2(); } density_residuals_old = copy(density_residuals); @@ -263,8 +270,9 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &max_rotation) - -> std::tuple { + size_t iteration, const double &max_rotation, + const vector_real_function_3d &rho_old) + -> std::tuple { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -277,6 +285,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); + auto new_rho = update_density(world, new_chi, rho_old); + inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); @@ -292,7 +302,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator } // if not compute y then copy x in to y - return {new_chi, {new_res, bsh}}; + return {new_chi, {new_res, bsh}, new_rho}; // print x norms } @@ -442,16 +452,16 @@ void FrequencyResponse::save(World &world, const std::string &name) { // Archive to write everything to archive::ParallelOutputArchive ar(world, name.c_str(), 1); - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); + ar & r_params.archive(); + ar & r_params.tda(); + ar & r_params.num_orbitals(); + ar & r_params.num_states(); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.x[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.x[i][j]; if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.y[i][j]; } } @@ -460,17 +470,17 @@ void FrequencyResponse::load(World &world, const std::string &name) { if (world.rank() == 0) { print("FrequencyResponse::load() -state"); } // The archive to read from archive::ParallelInputArchive ar(world, name.c_str()); - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); + ar & r_params.archive(); + ar & r_params.tda(); + ar & r_params.num_orbitals(); + ar & r_params.num_states(); Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.x[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.x[i][j]; world.gop.fence(); if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.y[i][j]; world.gop.fence(); } } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index afce38b285d..d5111ae4487 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -54,12 +54,12 @@ class FrequencyResponse : public ResponseBase { static void compute_and_print_polarizability(World &world, X_space &Chi, X_space &pq, std::string message); void save(World &world, const std::string &name) override; - std::tuple update(World &world, X_space &chi, XCOperator &xc, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, - QProjector &projector, double &x_shifts, - double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &max_rotation); + std::tuple + update(World &world, X_space &chi, XCOperator &xc, + std::vector &bsh_x_ops, std::vector &bsh_y_ops, + QProjector &projector, double &x_shifts, double &omega_n, + response_solver &kain_x_space, size_t iteration, const double &max_rotation, + const vector_real_function_3d &rho_old); X_space new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, response_function_solver &rf_solver); }; From 65bc63632a71b8ff58e6649ef10c55bb2d1767bd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 4 Apr 2023 18:05:59 -0400 Subject: [PATCH 1118/1312] do not plot all orbitals by default --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 9037eab32fa..66d8c251a30 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -523,7 +523,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals", true); + r_params.set_user_defined_value("plot_all_orbitals", false); r_params.set_user_defined_value("plot", true); r_params.set_user_defined_value("print_level", 5); r_params.set_user_defined_value("guess_xyz", false); From 44a441d3ef948b057b4bdc6678d548492aae9ef8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 4 Apr 2023 18:40:58 -0400 Subject: [PATCH 1119/1312] truncate after multiple and before add in density --- src/apps/molresponse/ResponseBase.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 66ccd694418..eb036abb93d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -297,10 +297,16 @@ auto ResponseBase::update_density(World &world, const X_space &chi, auto calc_type = r_params.calc_type(); auto thresh = FunctionDefaults<3>::get_thresh(); if (calc_type == "full") { + functionT rhox = factoryT(world); + functionT rhoy = factoryT(world); for (const auto &b: chi.active) { + + auto x_phi = mul(world, chi.x[b], ground_orbitals, false); auto y_phi = mul(world, chi.y[b], ground_orbitals, false); world.gop.fence(); + truncate(world, x_phi, thresh); + truncate(world, x_phi, thresh); density[b] = sum(world, x_phi) + sum(world, y_phi); } @@ -308,6 +314,7 @@ auto ResponseBase::update_density(World &world, const X_space &chi, for (const auto &b: chi.active) { auto x_phi = mul(world, chi.x[b], ground_orbitals, false); world.gop.fence(); + truncate(world, x_phi, thresh); density[b] = 2 * sum(world, x_phi); } } else { From 4674caa7b584e7d61a901ad44798459e449fff49 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 4 Apr 2023 19:29:32 -0400 Subject: [PATCH 1120/1312] trunchate chi before making density --- src/apps/molresponse/ResponseBase.cpp | 20 +++++++++++--------- src/apps/molresponse/testing/runners.hpp | 2 +- src/apps/molresponse/x_space.h | 9 +++++++++ 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index eb036abb93d..7d0efbcc808 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -296,14 +296,16 @@ auto ResponseBase::update_density(World &world, const X_space &chi, auto density = copy(world, old_density); auto calc_type = r_params.calc_type(); auto thresh = FunctionDefaults<3>::get_thresh(); + auto chi_copy = chi.copy(); + chi_copy.truncate(thresh); if (calc_type == "full") { functionT rhox = factoryT(world); functionT rhoy = factoryT(world); - for (const auto &b: chi.active) { + for (const auto &b: chi_copy.active) { - auto x_phi = mul(world, chi.x[b], ground_orbitals, false); - auto y_phi = mul(world, chi.y[b], ground_orbitals, false); + auto x_phi = mul(world, chi_copy.x[b], ground_orbitals, false); + auto y_phi = mul(world, chi_copy.y[b], ground_orbitals, false); world.gop.fence(); truncate(world, x_phi, thresh); truncate(world, x_phi, thresh); @@ -311,8 +313,8 @@ auto ResponseBase::update_density(World &world, const X_space &chi, } } else if (calc_type == "static") { - for (const auto &b: chi.active) { - auto x_phi = mul(world, chi.x[b], ground_orbitals, false); + for (const auto &b: chi_copy.active) { + auto x_phi = mul(world, chi_copy.x[b], ground_orbitals, false); world.gop.fence(); truncate(world, x_phi, thresh); density[b] = 2 * sum(world, x_phi); @@ -442,9 +444,9 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, X_space gamma; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (calc_type == "full") { - // if (world.rank() == 0) { print("entering gamma"); } - // auto checkx = chi.norm2s(); - // if (world.rank() == 0) { print("checking x", checkx); } + // if (world.rank() == 0) { print("entering gamma"); } + // auto checkx = chi.norm2s(); + // if (world.rank() == 0) { print("checking x", checkx); } gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); } else if (calc_type == "static") { @@ -1131,7 +1133,7 @@ auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_sp } else { res.x = g_chi.x - chi.x; residual_norms = res.x.norm2(); - // if (world.rank() == 0) { print("printing residual norms", residual_norms); } + // if (world.rank() == 0) { print("printing residual norms", residual_norms); } } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 66d8c251a30..1043a55a340 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -518,7 +518,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("dconv", 1e-6); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); - r_params.set_user_defined_value("maxiter", size_t(20)); + r_params.set_user_defined_value("maxiter", size_t(25)); r_params.set_user_defined_value("maxsub", size_t(5)); r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index ddecb201d6f..94d4c9f2123 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -290,6 +290,15 @@ namespace madness { inplace_apply(*this, truncate_i); } + void truncate(double thresh) { + auto rx = to_response_matrix(*this); + auto &world = rx[0][0].world(); + auto truncate_i = [&](auto &fi) { + madness::truncate(world, fi, thresh, false); + }; + inplace_apply(*this, truncate_i); + } + auto norm2s() const -> Tensor { World &world = x[0][0].world(); Tensor norms(num_states()); From db6e1d69c5c339d732e50736a7b8e06bd7669211 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 5 Apr 2023 13:29:40 -0400 Subject: [PATCH 1121/1312] fix make_density --- src/apps/molresponse/FrequencyResponse.cpp | 3 --- src/apps/molresponse/ResponseBase.cpp | 5 ++++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 4766c46de61..1613a1bee45 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -89,9 +89,6 @@ void FrequencyResponse::iterate(World &world) { } else if (thresh >= 1e-7) { max_rotation = .01; } - // functionT mask; - // mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); - //PQ = PQ * mask; PQ = generator(world, *this); PQ.truncate(); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7d0efbcc808..d70420d8df9 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -308,7 +308,7 @@ auto ResponseBase::update_density(World &world, const X_space &chi, auto y_phi = mul(world, chi_copy.y[b], ground_orbitals, false); world.gop.fence(); truncate(world, x_phi, thresh); - truncate(world, x_phi, thresh); + truncate(world, y_phi, thresh); density[b] = sum(world, x_phi) + sum(world, y_phi); } @@ -338,6 +338,8 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto x_phi = mul(world, chi.x[b], ground_orbitals, false); auto y_phi = mul(world, chi.y[b], ground_orbitals, false); world.gop.fence(); + truncate(world, x_phi, thresh); + truncate(world, y_phi, thresh); density[b] = sum(world, x_phi) + sum(world, y_phi); } @@ -347,6 +349,7 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto xb = chi.x[b]; auto x_phi = mul(world, xb, ground_orbitals, false); world.gop.fence(); + truncate(world, x_phi, thresh); rho_b = 2 * sum(world, x_phi); b++; } From 24d963e3defb6d38f502e190af79c457b01ceb21 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 5 Apr 2023 14:48:41 -0400 Subject: [PATCH 1122/1312] residual stays the stay across iterations after they have converged --- src/apps/molresponse/ExcitedResponse.cpp | 3 ++- src/apps/molresponse/FrequencyResponse.cpp | 3 ++- src/apps/molresponse/ResponseBase.cpp | 12 +++++++----- src/apps/molresponse/ResponseBase.hpp | 5 +++-- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index 0ff865b4f19..e2c049a4f7b 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -2151,7 +2151,8 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & print("BSH update iter = ", iter); X_space new_chi = bsh_update_excited(world, new_omega, theta_X, projector); //res = Chi - new_chi; - auto [new_res, bsh] = compute_residual(world, rotated_chi, new_chi, r_params.calc_type()); + auto [new_res, bsh] = + update_residual(world, rotated_chi, new_chi, r_params.calc_type(), <#initializer #>); // kain if iteration >0 or first run where there should not be a problem // computed new_chi and res if (r_params.kain() && (iter > 0) && true) { diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 1613a1bee45..1da4537ab35 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -286,7 +286,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); - auto [new_res, bsh] = compute_residual(world, chi, new_chi, r_params.calc_type()); + auto [new_res, bsh] = + update_residual(world, chi, new_chi, r_params.calc_type(), <#initializer #>); inner_to_json(world, "r_x", response_context.inner(new_res, new_res), iter_function_data); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index d70420d8df9..cc9bac5753b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1120,22 +1120,24 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< return F0X; } -auto ResponseBase::compute_residual(World &world, const X_space &chi, const X_space &g_chi, - const std::string &calc_type) -> residuals { +auto ResponseBase::update_residual(World &world, const X_space &chi, const X_space &g_chi, + const std::string &calc_type, + const Tensor &old_residuals) -> residuals { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.x.size(); size_t n = chi.x.size_orbitals(); bool compute_y = r_params.omega() != 0.0; // compute residual - Tensor residual_norms; + Tensor residual_norms = copy(old_residuals); X_space res = X_space::zero_functions(world, m, n); res.set_active(chi.active); if (compute_y) { res = g_chi - chi; - residual_norms = res.norm2s(); + auto rx = to_response_matrix(res); + for (const auto &b: chi.active) { residual_norms(b) = norm2(world, rx[b]); } } else { res.x = g_chi.x - chi.x; - residual_norms = res.x.norm2(); + for (const auto &b: chi.active) { residual_norms(b) = norm2(world, res.x[b]); } // if (world.rank() == 0) { print("printing residual norms", residual_norms); } } if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index a4a43b1b607..7a511b8aa80 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -319,8 +319,9 @@ class ResponseBase { void converged_to_json(json &j); - auto compute_residual(World &world, const X_space &chi, const X_space &g_chi, - const std::string &calc_type) -> residuals; + auto update_residual(World &world, const X_space &chi, const X_space &g_chi, + const std::string &calc_type, const Tensor &old_residuals) + -> residuals; auto compute_response_potentials(World &world, const X_space &chi, XCOperator &xc, const std::string &calc_type) const From 55eed74ee932e0c7489e265c6e5484f23f3f28a0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 5 Apr 2023 14:54:34 -0400 Subject: [PATCH 1123/1312] residual stays the stay across iterations after they have converged --- src/apps/molresponse/FrequencyResponse.cpp | 7 ++++--- src/apps/molresponse/FrequencyResponse.hpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 1da4537ab35..4c12e85f33f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -176,7 +176,7 @@ void FrequencyResponse::iterate(World &world) { checkx = Chi.norm2s(); auto [new_chi, new_res, new_rho] = update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, iter, max_rotation, rho_omega); + kain_x_space, iter, max_rotation, rho_omega, x_residuals); // Here we have computed the new response orbitals and the residuals // Now we need to compute the new density and the new density residuals // Instead, update should also update the density @@ -268,7 +268,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, size_t iteration, const double &max_rotation, - const vector_real_function_3d &rho_old) + const vector_real_function_3d &rho_old, + const Tensor &old_residuals) -> std::tuple { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -287,7 +288,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); auto [new_res, bsh] = - update_residual(world, chi, new_chi, r_params.calc_type(), <#initializer #>); + update_residual(world, chi, new_chi, r_params.calc_type(), old_residuals); inner_to_json(world, "r_x", response_context.inner(new_res, new_res), iter_function_data); //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index d5111ae4487..e9dc53e1ac9 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -59,7 +59,7 @@ class FrequencyResponse : public ResponseBase { std::vector &bsh_x_ops, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, double &omega_n, response_solver &kain_x_space, size_t iteration, const double &max_rotation, - const vector_real_function_3d &rho_old); + const vector_real_function_3d &rho_old, const Tensor &old_residuals); X_space new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, response_function_solver &rf_solver); }; From 829a1c9fd465976e02d5c0d70e9358d507a59278 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 5 Apr 2023 16:41:05 -0400 Subject: [PATCH 1124/1312] residual stays the stay across iterations after they have converged --- src/apps/molresponse/ExcitedResponse.cpp | 9 +++++---- src/apps/molresponse/ExcitedResponse.hpp | 8 ++++---- src/apps/molresponse/FrequencyResponse.cpp | 10 ++++------ src/apps/molresponse/ResponseBase.cpp | 14 +++++++------- src/apps/molresponse/x_space.h | 2 +- 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index e2c049a4f7b..b58a44084cd 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -1981,8 +1981,9 @@ void ExcitedResponse::iterate(World &world) { // The residual is then used to update KAIN // Followed by step restriction // residual is computed as new_chi-old_chi where both have been previously rotated. - auto [new_omega, old_chi, new_chi, new_res] = update( - world, Chi, xc, projector, kain_x_space, x_vectors, x_residuals, iter, max_rotation); + auto [new_omega, old_chi, new_chi, new_res] = + update(world, Chi, xc, projector, kain_x_space, x_vectors, x_residuals, iter, + max_rotation, Tensor()); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -2089,7 +2090,7 @@ void ExcitedResponse::iterate(World &world) { auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator &xc, QProjector &projector, response_solver &kain_x_space, response_matrix &Xvector, response_matrix &Xresidual, size_t iter, - const double &maxrotn) + const double &maxrotn, const Tensor old_residuals) -> std::tuple, X_space, X_space, residuals> { size_t m = Chi.num_states(); bool compute_y = not r_params.tda(); @@ -2152,7 +2153,7 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & X_space new_chi = bsh_update_excited(world, new_omega, theta_X, projector); //res = Chi - new_chi; auto [new_res, bsh] = - update_residual(world, rotated_chi, new_chi, r_params.calc_type(), <#initializer #>); + update_residual(world, rotated_chi, new_chi, r_params.calc_type(), old_residuals); // kain if iteration >0 or first run where there should not be a problem // computed new_chi and res if (r_params.kain() && (iter > 0) && true) { diff --git a/src/apps/molresponse/ExcitedResponse.hpp b/src/apps/molresponse/ExcitedResponse.hpp index 60c7294675a..28b3340811e 100644 --- a/src/apps/molresponse/ExcitedResponse.hpp +++ b/src/apps/molresponse/ExcitedResponse.hpp @@ -131,10 +131,10 @@ class ExcitedResponse : public ResponseBase { const X_space& v0_chi, const X_space& gamma_chi); std::tuple, X_space, X_space, X_space, X_space> rotate_excited_space( World& world, X_space& chi, X_space& lchi, X_space& v_chi, X_space& gamma_chi); - std::tuple, X_space, X_space, residuals> update( - World& world, X_space& Chi, XCOperator& xc, QProjector& projector, - response_solver &kain_x_space, response_matrix &Xvector, response_matrix &Xresidual, - size_t iter, const double& maxrotn); + std::tuple, X_space, X_space, residuals> + update(World &world, X_space &Chi, XCOperator &xc, QProjector &projector, + response_solver &kain_x_space, response_matrix &Xvector, response_matrix &Xresidual, + size_t iter, const double &maxrotn, const Tensor old_residuals); X_space create_response_guess(World& world) const; std::tuple, Tensor, Tensor> reduce_subspace( World& world, Tensor& S, Tensor& A, const double thresh_degenerate); diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 4c12e85f33f..93de39cfebc 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,9 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5.0), molecule.natom()); - const double a_pow{0.602}; - const double b_pow{0.314}; - // Last attempt 1.035 2.121 + const double a_pow{0.5}; + const double b_pow{-0.30103}; const double x_relative_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y @@ -132,11 +131,11 @@ void FrequencyResponse::iterate(World &world) { print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); print("||X||: ", chi_norms); - print("targets : x", x_relative_target, " d", density_target); + print("targets : ||x||", x_relative_target, " ||delta_rho||", density_target); } } auto check_convergence = [&](auto &ri, auto &di) { - if (world.rank() == 0) { print(ri, di); } + if (world.rank() == 0) { print(" ",ri, di); } return ((ri < x_relative_target) && (di < density_target)); }; @@ -278,7 +277,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // auto checkx = x.norm2s(); // if (world.rank() == 0) { print("Right after chi.copy() ", checkx); } X_space theta_X = compute_theta_X(world, x, xc, r_params.calc_type()); - // checkx = x.norm2s(); // if (world.rank() == 0) { print("Right after compute_theta ", checkx); } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index cc9bac5753b..c482b4d864e 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -296,9 +296,9 @@ auto ResponseBase::update_density(World &world, const X_space &chi, auto density = copy(world, old_density); auto calc_type = r_params.calc_type(); auto thresh = FunctionDefaults<3>::get_thresh(); - auto chi_copy = chi.copy(); - chi_copy.truncate(thresh); if (calc_type == "full") { + auto chi_copy = chi.copy(); + chi_copy.truncate(thresh); functionT rhox = factoryT(world); functionT rhoy = factoryT(world); for (const auto &b: chi_copy.active) { @@ -313,8 +313,11 @@ auto ResponseBase::update_density(World &world, const X_space &chi, } } else if (calc_type == "static") { - for (const auto &b: chi_copy.active) { - auto x_phi = mul(world, chi_copy.x[b], ground_orbitals, false); + + auto chi_x_copy = chi.x.copy(); + chi_x_copy.truncate_rf(thresh); + for (const auto &b: chi.active) { + auto x_phi = mul(world, chi_x_copy.x[b], ground_orbitals, false); world.gop.fence(); truncate(world, x_phi, thresh); density[b] = 2 * sum(world, x_phi); @@ -322,9 +325,7 @@ auto ResponseBase::update_density(World &world, const X_space &chi, } else { density = transition_densityTDA(world, ground_orbitals, chi.x); } - if (world.rank() == 0) { print("make density: made density"); } truncate(world, density, thresh); - if (world.rank() == 0) { print("make density: truncate"); } return density; } @@ -527,7 +528,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit J.x = oop_unary_apply(J.x, apply_projector); J.y = J.x.copy(); // std::transform(J.x.begin(), J.x.end(), J.x.begin(), [&](auto &jxi) { return projector(jxi); }); - if (world.rank() == 0) { print("copy JX into JY"); } world.gop.fence(); inner_to_json(world, "j1", response_context.inner(chi_alpha, J), iter_function_data); if (r_params.print_level() >= 1) { diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 94d4c9f2123..012e7b6abbf 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -59,7 +59,7 @@ namespace madness { [[nodiscard]] X_space copy() const { auto &world = x[0][0].world(); auto new_x = X_space(*this);// copy - for (int i = 0; i < new_x.num_states(); i++) { + for (const auto &i: active) { new_x.x[i] = madness::copy(world, x[i], false); new_x.y[i] = madness::copy(world, y[i], false); } From fbc2b8c454ae8428fe350b9077d2f6aacebdfc32 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 5 Apr 2023 17:20:10 -0400 Subject: [PATCH 1125/1312] clean up --- src/apps/molresponse/ExcitedResponse.cpp | 93 +++++++++++----------- src/apps/molresponse/ExcitedResponse.hpp | 8 +- src/apps/molresponse/FrequencyResponse.cpp | 46 ++++------- src/apps/molresponse/FrequencyResponse.hpp | 11 +-- src/apps/molresponse/ResponseBase.cpp | 6 +- src/apps/molresponse/ResponseBase.hpp | 4 +- src/apps/molresponse/testing/runners.hpp | 2 +- 7 files changed, 81 insertions(+), 89 deletions(-) diff --git a/src/apps/molresponse/ExcitedResponse.cpp b/src/apps/molresponse/ExcitedResponse.cpp index b58a44084cd..a4c00c856ed 100644 --- a/src/apps/molresponse/ExcitedResponse.cpp +++ b/src/apps/molresponse/ExcitedResponse.cpp @@ -109,7 +109,8 @@ class GaussianGuess : public FunctionFunctorInterface { /// @param[in] origin the origin of the Gauss function /// @param[in] alpha the exponent exp(-alpha r^2) /// @param[in] ijk the monomial x^i y^j z^k exp(-alpha r^2) (for NDIM) - GaussianGuess(const coordT &origin, const double alpha, const std::vector ijk = std::vector(NDIM)) + GaussianGuess(const coordT &origin, const double alpha, + const std::vector ijk = std::vector(NDIM)) : origin(origin), exponent(alpha), ijk(ijk) {} coordT origin; @@ -432,9 +433,9 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { Tensor x_shifts; // Holds the shifted energy values response_space bsh_resp(world, m, n); // Holds wave function corrections response_space V; // Holds V^0 applied to response functions - response_space shifted_V; // Holds the shifted V^0 applied to response functions - Tensor S; // Overlap matrix of response components for x states - real_function_3d v_xc; // For TDDFT + response_space shifted_V;// Holds the shifted V^0 applied to response functions + Tensor S; // Overlap matrix of response components for x states + real_function_3d v_xc; // For TDDFT // Useful to have response_space zeros(world, m, n); @@ -526,9 +527,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { x_shifts = create_shift(world, ground_energies, omega, "x"); - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space E0X(world, rotated_chi.num_states(), rotated_chi.num_orbitals()); if (r_params.localize() != "canon") { E0X = rotated_chi.copy(); @@ -565,9 +564,7 @@ void ExcitedResponse::iterate_trial(World &world, X_space &guesses) { // Project out ground state //for (size_t i = 0; i < Ni; i++) bsh_resp[i] = projector(bsh_resp[i]); - for (auto &bsh_i: bsh_resp.x) { - bsh_i = projector(bsh_i); - } + for (auto &bsh_i: bsh_resp.x) { bsh_i = projector(bsh_i); } // Save new components guesses.x = bsh_resp; // Apply mask @@ -769,8 +766,9 @@ ExcitedResponse::rotate_excited_space(World &world, X_space &chi, X_space &lchi, return {new_omega, rotated_chi, rotated_l_chi, rotated_v_chi, rotated_gamma_chi}; } -std::tuple, Tensor, Tensor> ExcitedResponse::reduce_subspace( - World &world, Tensor &S, Tensor &A, const double thresh_degenerate) { +std::tuple, Tensor, Tensor> +ExcitedResponse::reduce_subspace(World &world, Tensor &S, Tensor &A, + const double thresh_degenerate) { // Get size @@ -855,8 +853,9 @@ std::tuple, Tensor, Tensor> ExcitedResponse::redu return {l_vecs, S, copyA}; } -std::pair, Tensor> ExcitedResponse::excited_eig( - World &world, Tensor &S, Tensor &A, const double thresh_degenerate) { +std::pair, Tensor> +ExcitedResponse::excited_eig(World &world, Tensor &S, Tensor &A, + const double thresh_degenerate) { // Start timer if (r_params.print_level() >= 1) molresponse::start_timer(world); auto size_l = S.dim(0); @@ -1175,9 +1174,10 @@ void ExcitedResponse::unaugment_full(World &world, X_space &Chi, X_space &old_Ch // components Why diagonalization and then transform the x_fe vectors -std::tuple ExcitedResponse::rotate_excited_vectors( - World &world, const Tensor &U, const X_space &chi, const X_space &l_chi, - const X_space &v0_chi, const X_space &gamma_chi) { +std::tuple +ExcitedResponse::rotate_excited_vectors(World &world, const Tensor &U, const X_space &chi, + const X_space &l_chi, const X_space &v0_chi, + const X_space &gamma_chi) { // compute the unitary transformation matrix U that diagonalizes // the response matrix @@ -1844,8 +1844,9 @@ void ExcitedResponse::iterate(World &world) { response_solver kain_x_space; size_t nkain = m;// (r_params.omega() != 0.0) ? 2 * m : m; for (size_t b = 0; b < m; b++) { - kain_x_space.push_back(XNonlinearSolver( - response_matrix_allocator(world, n), true)); + kain_x_space.push_back( + XNonlinearSolver( + response_matrix_allocator(world, n), true)); } if (r_params.kain()) { for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } @@ -1982,9 +1983,10 @@ void ExcitedResponse::iterate(World &world) { // Followed by step restriction // residual is computed as new_chi-old_chi where both have been previously rotated. auto [new_omega, old_chi, new_chi, new_res] = - update(world, Chi, xc, projector, kain_x_space, x_vectors, x_residuals, iter, - max_rotation, Tensor()); + update_response(world, Chi, xc, projector, kain_x_space, x_vectors, x_residuals, + iter, max_rotation, Tensor(), residuals); + residuals = new_res.residual.copy(); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega_old = make_density(world, old_chi); @@ -2087,10 +2089,12 @@ void ExcitedResponse::iterate(World &world) { */ } -auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator &xc, - QProjector &projector, response_solver &kain_x_space, - response_matrix &Xvector, response_matrix &Xresidual, size_t iter, - const double &maxrotn, const Tensor old_residuals) +auto ExcitedResponse::update_response(World &world, X_space &Chi, XCOperator &xc, + QProjector &projector, + response_solver &kain_x_space, response_matrix &Xvector, + response_matrix &Xresidual, size_t iter, + const double &maxrotn, const Tensor old_residuals, + const X_space &xres_old) -> std::tuple, X_space, X_space, residuals> { size_t m = Chi.num_states(); bool compute_y = not r_params.tda(); @@ -2152,8 +2156,8 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & print("BSH update iter = ", iter); X_space new_chi = bsh_update_excited(world, new_omega, theta_X, projector); //res = Chi - new_chi; - auto [new_res, bsh] = - update_residual(world, rotated_chi, new_chi, r_params.calc_type(), old_residuals); + auto [new_res, bsh] = update_residual(world, rotated_chi, new_chi, r_params.calc_type(), + old_residuals, xres_old); // kain if iteration >0 or first run where there should not be a problem // computed new_chi and res if (r_params.kain() && (iter > 0) && true) { @@ -2174,7 +2178,8 @@ auto ExcitedResponse::update(World &world, X_space &Chi, XCOperator & } auto ExcitedResponse::bsh_update_excited(World &world, const Tensor &omega, - X_space &theta_X, QProjector &projector) -> X_space { + X_space &theta_X, QProjector &projector) + -> X_space { size_t m = theta_X.num_states(); size_t n = theta_X.num_orbitals(); bool compute_y = !r_params.tda(); @@ -2424,17 +2429,17 @@ void ExcitedResponse::save(World &world, const std::string &name) { // (for i from 0 to m-1 ) // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω + ar & r_params.archive(); + ar & r_params.tda(); + ar & r_params.num_orbitals(); + ar & r_params.num_states(); + ar & omega; for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.x[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.x[i][j]; if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.y[i][j]; } } @@ -2458,21 +2463,21 @@ void ExcitedResponse::load(World &world, const std::string &name) { // ( for j from 0 to n-1 ) // ( Function y_response[i][j] ) - ar &r_params.archive(); - ar &r_params.tda(); - ar &r_params.num_orbitals(); - ar &r_params.num_states(); - ar ω + ar & r_params.archive(); + ar & r_params.tda(); + ar & r_params.num_orbitals(); + ar & r_params.num_states(); + ar & omega; Chi = X_space(world, r_params.num_states(), r_params.num_orbitals()); for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.x[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.x[i][j]; world.gop.fence(); if (not r_params.tda()) { for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar &Chi.y[i][j]; + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.y[i][j]; world.gop.fence(); } } @@ -2486,9 +2491,7 @@ X_space ExcitedResponse::create_virtual_ao_guess(World &world) const { auto phi_0 = copy(world, ground_orbitals); auto ao_basis_set = AtomicBasisSet{"aug-cc-pvdz"}; - if (world.rank() == 0) { - ao_basis_set.print(molecule); - } + if (world.rank() == 0) { ao_basis_set.print(molecule); } vecfuncT ao_vec = vecfuncT(ao_basis_set.nbf(molecule)); diff --git a/src/apps/molresponse/ExcitedResponse.hpp b/src/apps/molresponse/ExcitedResponse.hpp index 28b3340811e..08df86ffd12 100644 --- a/src/apps/molresponse/ExcitedResponse.hpp +++ b/src/apps/molresponse/ExcitedResponse.hpp @@ -132,9 +132,11 @@ class ExcitedResponse : public ResponseBase { std::tuple, X_space, X_space, X_space, X_space> rotate_excited_space( World& world, X_space& chi, X_space& lchi, X_space& v_chi, X_space& gamma_chi); std::tuple, X_space, X_space, residuals> - update(World &world, X_space &Chi, XCOperator &xc, QProjector &projector, - response_solver &kain_x_space, response_matrix &Xvector, response_matrix &Xresidual, - size_t iter, const double &maxrotn, const Tensor old_residuals); + update_response(World &world, X_space &Chi, XCOperator &xc, + QProjector &projector, response_solver &kain_x_space, + response_matrix &Xvector, response_matrix &Xresidual, size_t iter, + const double &maxrotn, const Tensor old_residuals, + const X_space &xres_old); X_space create_response_guess(World& world) const; std::tuple, Tensor, Tensor> reduce_subspace( World& world, Tensor& S, Tensor& A, const double thresh_degenerate); diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 93de39cfebc..003aa71c697 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -23,7 +23,7 @@ void FrequencyResponse::iterate(World &world) { real_function_3d v_xc; // the Final protocol should be equal to dconv at the minimum const double dconv = - std::max(FunctionDefaults<3>::get_thresh() * 100, r_params.dconv());//.01 .0001 .1e-5 + std::max(FunctionDefaults<3>::get_thresh() * 10, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5.0), molecule.natom()); const double a_pow{0.5}; @@ -131,11 +131,12 @@ void FrequencyResponse::iterate(World &world) { print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); print("||X||: ", chi_norms); - print("targets : ||x||", x_relative_target, " ||delta_rho||", density_target); + print("targets : ||x||", x_relative_target, " ||delta_rho||", + density_target); } } auto check_convergence = [&](auto &ri, auto &di) { - if (world.rank() == 0) { print(" ",ri, di); } + if (world.rank() == 0) { print(" ", ri, " ", di); } return ((ri < x_relative_target) && (di < density_target)); }; @@ -173,9 +174,9 @@ void FrequencyResponse::iterate(World &world) { } inner_to_json(world, "x", response_context.inner(Chi, Chi), iter_function_data); checkx = Chi.norm2s(); - auto [new_chi, new_res, new_rho] = - update(world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, - kain_x_space, iter, max_rotation, rho_omega, x_residuals); + auto [new_chi, new_res, new_rho] = update_response( + world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, + iter, max_rotation, rho_omega, x_residuals, residuals); // Here we have computed the new response orbitals and the residuals // Now we need to compute the new density and the new density residuals // Instead, update should also update the density @@ -194,30 +195,24 @@ void FrequencyResponse::iterate(World &world) { } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } x_residuals = copy(new_res.residual_norms); - if (world.rank() == 0) { print("copy tensors: bshX"); } + residuals = new_res.residual.copy(); if (compute_y) { Chi = new_chi.copy(); } else { Chi.x = new_chi.x.copy(); } - if (world.rank() == 0) { print("copy chi:"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - if (world.rank() == 0) { print("computing chi norms: xij residuals"); } density_residuals = density_residuals_old; // compute density residuals for (const auto &b: Chi.active) { density_residuals[b] = (rho_omega_old[b] - new_rho[b]).norm2(); } density_residuals_old = copy(density_residuals); - iter_function_data["r_d"] = density_residuals; auto dnorm = norm2s_T(world, rho_omega); iter_function_data["d"] = dnorm; - if (world.rank() == 0) { print("computing residuals: density residuals"); } - - if (world.rank() == 0) { print("computing polarizability:"); } polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); res_polar = ((compute_y) ? -2 : -4) * response_context.inner(new_res.residual, PQ); @@ -262,13 +257,12 @@ void FrequencyResponse::iterate(World &world) { //compute_and_print_polarizability(world, Chi, PQ, "Converged"); } -auto FrequencyResponse::update(World &world, X_space &chi, XCOperator &xc, - std::vector &bsh_x_ops, - std::vector &bsh_y_ops, QProjector &projector, - double &x_shifts, double &omega_n, response_solver &kain_x_space, - size_t iteration, const double &max_rotation, - const vector_real_function_3d &rho_old, - const Tensor &old_residuals) +auto FrequencyResponse::update_response( + World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, + std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, + double &omega_n, response_solver &kain_x_space, size_t iteration, + const double &max_rotation, const vector_real_function_3d &rho_old, + const Tensor &old_residuals, const X_space &xres_old) -> std::tuple { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -277,7 +271,6 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator // auto checkx = x.norm2s(); // if (world.rank() == 0) { print("Right after chi.copy() ", checkx); } X_space theta_X = compute_theta_X(world, x, xc, r_params.calc_type()); - // if (world.rank() == 0) { print("Right after compute_theta ", checkx); } X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); @@ -286,9 +279,8 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); auto [new_res, bsh] = - update_residual(world, chi, new_chi, r_params.calc_type(), old_residuals); + update_residual(world, chi, new_chi, r_params.calc_type(), old_residuals, xres_old); inner_to_json(world, "r_x", response_context.inner(new_res, new_res), iter_function_data); - //&& iteration < 7 if (iteration > 0) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } @@ -297,11 +289,7 @@ auto FrequencyResponse::update(World &world, X_space &chi, XCOperator if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } - - // if not compute y then copy x in to y return {new_chi, {new_res, bsh}, new_rho}; - - // print x norms } auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, @@ -370,7 +358,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { print("--------------- BSH UPDATE RESPONSE------------------"); } } size_t m = theta_X.x.size(); size_t n = theta_X.x.size_orbitals(); @@ -396,7 +383,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, */ bsh_X.x = apply(world, bsh_x_ops, theta_X.x); - if (world.rank() == 0) { print("--------------- Apply BSH X ------------------"); } if (compute_y) { bsh_X.y = apply(world, bsh_y_ops, theta_X.y); } if (compute_y) { @@ -405,7 +391,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, bsh_X.x.truncate_rf(); } - if (world.rank() == 0) { print("--------------- Apply BSH------------------"); } auto apply_projector = [&](auto &xi) { return projector(xi); }; if (compute_y) { @@ -413,7 +398,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, } else { for (const auto &i: bsh_X.active) bsh_X.x[i] = projector(bsh_X.x[i]); } - if (world.rank() == 0) { print("--------------- Project BSH------------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "bsh_update", "bsh_update", iter_timing); } diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index e9dc53e1ac9..5f680378390 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -55,11 +55,12 @@ class FrequencyResponse : public ResponseBase { std::string message); void save(World &world, const std::string &name) override; std::tuple - update(World &world, X_space &chi, XCOperator &xc, - std::vector &bsh_x_ops, std::vector &bsh_y_ops, - QProjector &projector, double &x_shifts, double &omega_n, - response_solver &kain_x_space, size_t iteration, const double &max_rotation, - const vector_real_function_3d &rho_old, const Tensor &old_residuals); + update_response(World &world, X_space &chi, XCOperator &xc, + std::vector &bsh_x_ops, std::vector &bsh_y_ops, + QProjector &projector, double &x_shifts, double &omega_n, + response_solver &kain_x_space, size_t iteration, const double &max_rotation, + const vector_real_function_3d &rho_old, const Tensor &old_residuals, + const X_space &xres_old); X_space new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, response_function_solver &rf_solver); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index c482b4d864e..df36fc38696 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -296,6 +296,7 @@ auto ResponseBase::update_density(World &world, const X_space &chi, auto density = copy(world, old_density); auto calc_type = r_params.calc_type(); auto thresh = FunctionDefaults<3>::get_thresh(); + if (calc_type == "full") { auto chi_copy = chi.copy(); chi_copy.truncate(thresh); @@ -1122,14 +1123,15 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< auto ResponseBase::update_residual(World &world, const X_space &chi, const X_space &g_chi, const std::string &calc_type, - const Tensor &old_residuals) -> residuals { + const Tensor &old_residuals, const X_space &xres_old) + -> residuals { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.x.size(); size_t n = chi.x.size_orbitals(); bool compute_y = r_params.omega() != 0.0; // compute residual Tensor residual_norms = copy(old_residuals); - X_space res = X_space::zero_functions(world, m, n); + X_space res = xres_old.copy(); res.set_active(chi.active); if (compute_y) { res = g_chi - chi; diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 7a511b8aa80..3ba602e7041 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -320,8 +320,8 @@ class ResponseBase { void converged_to_json(json &j); auto update_residual(World &world, const X_space &chi, const X_space &g_chi, - const std::string &calc_type, const Tensor &old_residuals) - -> residuals; + const std::string &calc_type, const Tensor &old_residuals, + const X_space &xres_old) -> residuals; auto compute_response_potentials(World &world, const X_space &chi, XCOperator &xc, const std::string &calc_type) const diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 1043a55a340..467b576f4a6 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -509,7 +509,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param if (world.rank() == 0) { if (precision == "high") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - r_params.set_user_defined_value("dconv", 1e-6); + r_params.set_user_defined_value("dconv", 5e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); From d7c67a4ec0474460c7a834230c5a1644b847b999 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 5 Apr 2023 17:41:56 -0400 Subject: [PATCH 1126/1312] convergence april --- src/apps/molresponse/FrequencyResponse.cpp | 7 +++---- src/apps/molresponse/ResponseBase.cpp | 6 ------ src/apps/molresponse/global_functions.cc | 1 - src/apps/molresponse/testing/runners.hpp | 2 +- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 003aa71c697..1289059a8f7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -26,8 +26,8 @@ void FrequencyResponse::iterate(World &world) { std::max(FunctionDefaults<3>::get_thresh() * 10, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5.0), molecule.natom()); - const double a_pow{0.5}; - const double b_pow{-0.30103}; + const double a_pow{0.50209}; + const double b_pow{-0.99162}; const double x_relative_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b // m residuals for x and y @@ -204,7 +204,7 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - density_residuals = density_residuals_old; + density_residuals = copy(density_residuals_old); // compute density residuals for (const auto &b: Chi.active) { density_residuals[b] = (rho_omega_old[b] - new_rho[b]).norm2(); @@ -306,7 +306,6 @@ auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, X_space kain_update(world, m, n); // step 1 is to place all functions into a single vector - if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } vector_real_function_3d vect_x(m * n * p); vector_real_function_3d vect_fx(m * n * p); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index df36fc38696..6b8f0cf7a0b 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -359,9 +359,7 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu } else { density = transition_densityTDA(world, ground_orbitals, chi.x); } - if (world.rank() == 0) { print("make density: made density"); } truncate(world, density, thresh); - if (world.rank() == 0) { print("make density: truncate"); } return density; } @@ -416,7 +414,6 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, if (r_params.print_level() >= 1) { molresponse::start_timer(world); - if (world.rank() == 0) { print("------------compute theta x_________"); } } // std::cout << "MPI BARRIER 3 " << std::endl; // world.mpi.Barrier(); @@ -1159,7 +1156,6 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, response_matrix update(m); bool compute_y = r_params.omega() != 0.0; - if (world.rank() == 0) { print("----------------Start Kain Update -----------------"); } if (compute_y) { auto x_vectors = to_response_matrix(chi); auto x_residuals = to_response_matrix(residual_chi); @@ -1175,7 +1171,6 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, kain_update.x[i] = kain_x_space[i].update(chi.x[i], residual_chi.x[i]); } } - if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); } @@ -1192,7 +1187,6 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi if (r_params.print_level() >= 1) { molresponse::start_timer(world); } print(max_bsh_rotation); - if (world.rank() == 0) { print("----------------Start Step Restriction -----------------"); } if (compute_y) { auto diff = temp - old_Chi; auto m_old = to_response_matrix(old_Chi); diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index e98f423191f..e04ea8e2772 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -352,7 +352,6 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons world.gop.fence(); K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); - K.y[b][0].print_info(); world.gop.fence(); } diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 467b576f4a6..1043a55a340 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -509,7 +509,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param if (world.rank() == 0) { if (precision == "high") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - r_params.set_user_defined_value("dconv", 5e-6); + r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); From 4f470a14cd9e534dd41ee053300e6a339fa511a5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 6 Apr 2023 10:02:09 -0400 Subject: [PATCH 1127/1312] add a plotline function taking in a vector of functions --- src/madness/mra/funcplot.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/madness/mra/funcplot.h b/src/madness/mra/funcplot.h index 527194e8e4b..cb7eed3c225 100644 --- a/src/madness/mra/funcplot.h +++ b/src/madness/mra/funcplot.h @@ -540,6 +540,32 @@ namespace madness { } world.gop.fence(); } + /// The ordinate is distance from lo + template + void plot_line(const char* filename, int npt, const Vector& lo, const Vector& hi, + const std::vector>& vf) { + typedef Vector coordT; + coordT h = (hi - lo)*(1.0/(npt-1)); + double sum = 0.0; + for (std::size_t i=0; i& f){f.reconstruct();}); + if (world.rank() == 0) { + FILE* file = fopen(filename,"w"); + if(!file) + MADNESS_EXCEPTION("plot_line: failed to open the plot file", 0); + for (int i=0; i& f){ plot_line_print_value(file, f.eval(r));}); + fprintf(file,"\n"); + } + fclose(file); + } + world.gop.fence(); + } template void plot_plane(World& world, const Function& function, From cdd84e9384d54cbc3fcaa942b885481c7518cfc9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 6 Apr 2023 10:02:30 -0400 Subject: [PATCH 1128/1312] plot orbitals --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 1043a55a340..bf96e836ef2 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -523,7 +523,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals", false); + r_params.set_user_defined_value("plot_all_orbitals",true); r_params.set_user_defined_value("plot", true); r_params.set_user_defined_value("print_level", 5); r_params.set_user_defined_value("guess_xyz", false); From 9cf98f176f85b2c110344c7e133a847ab9371dbe Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 6 Apr 2023 10:02:58 -0400 Subject: [PATCH 1129/1312] re-write plot orbitals to plot a vector of functions in a single file --- src/apps/molresponse/ResponseBase.cpp | 39 +++++++++------------------ 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6b8f0cf7a0b..13de214508a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -412,9 +412,7 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, const XCOperator &xc, const std::string &calc_type) const -> X_space { - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // std::cout << "MPI BARRIER 3 " << std::endl; // world.mpi.Barrier(); bool compute_Y = calc_type == "full"; @@ -1274,36 +1272,23 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, snprintf(plot_name, buffSize, "plots/densities/rho0_%c_0.plt", dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, rho0); } - for (int i = 0; i < static_cast(n); i++) { - // print ground_state - // plot gound_orbitals - snprintf(plot_name, buffSize, "plots/orbitals/phi0_%c_0_%d.plt", dir[d], - static_cast(i)); - plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals[i]); - } + // plot ground orbitals and transition densities in xyz directions + snprintf(plot_name, buffSize, "plots/orbitals/phi0_%c_0.plt", dir[d]); + plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals); + snprintf(plot_name, buffSize, "plots/densities/rho1_%d.plt", dir[d]); + plot_line(plot_name, 5001, plt.lo, plt.hi, rho1); for (int b = 0; b < static_cast(m); b++) { - // plot rho1 direction d state b - snprintf(plot_name, buffSize, "plots/densities/rho1_%c_%d.plt", dir[d], + // plot x and y transition orbitals + snprintf(plot_name, buffSize, "plots/orbitals/phix_%c_%d.plt", dir[d], static_cast(b)); - plot_line(plot_name, 5001, plt.lo, plt.hi, rho1[b]); - - for (int i = 0; i < static_cast(n); i++) { - // print ground_state - // plot x function x_dir_b_i__k_iter - snprintf(plot_name, buffSize, "plots/orbitals/phix_%c_%d_%d.plt", dir[d], - static_cast(b), static_cast(i)); - plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b][i]); - - // plot y functione y_dir_b_i__k_iter - snprintf(plot_name, buffSize, "plots/orbitals/phiy_%c_%d_%d.plt", dir[d], - static_cast(b), static_cast(i)); - plot_line(plot_name, 5001, plt.lo, plt.hi, y_response[b][i]); - } + plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b]); + snprintf(plot_name, buffSize, "plots/orbitals/phiy_%c_%d.plt", dir[d], + static_cast(b)); + plot_line(plot_name, 5001, plt.lo, plt.hi, y_response[b]); } } world.gop.fence(); - // END TESTING } From 776ce5f936001f7cce2d832b7a2464131dc1065c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 6 Apr 2023 10:04:13 -0400 Subject: [PATCH 1130/1312] testing box size 50 --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index bf96e836ef2..f30eea2d10c 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -364,7 +364,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("maxiter", 20); //param1.set_user_defined_value("Kain", true); param1.set_user_defined_value("xc", moldftSchema.xc); - param1.set_user_defined_value("l", 200); + param1.set_user_defined_value("l", 50); if (precision == "low") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); From 3990dbebb9a2d0705bc7e08784a8586559c2406d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 6 Apr 2023 10:16:12 -0400 Subject: [PATCH 1131/1312] plot line not vtk --- src/apps/molresponse/ResponseBase.cpp | 6 +++--- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 13de214508a..3923ee46d02 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -548,8 +548,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit inner_to_json(world, "v1_xc", response_context.inner(chi_alpha, W), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto K = response_exchange_multiworld(phi0, chi_alpha, true); - // auto K = response_exchange(phi0, chi_alpha, true); + //auto K = response_exchange_multiworld(phi0, chi_alpha, true); + auto K = response_exchange(phi0, chi_alpha, true); K = oop_apply(K, apply_projector); // std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); @@ -1275,7 +1275,7 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, // plot ground orbitals and transition densities in xyz directions snprintf(plot_name, buffSize, "plots/orbitals/phi0_%c_0.plt", dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, ground_orbitals); - snprintf(plot_name, buffSize, "plots/densities/rho1_%d.plt", dir[d]); + snprintf(plot_name, buffSize, "plots/densities/rho1_%c.plt", dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, rho1); for (int b = 0; b < static_cast(m); b++) { diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index f30eea2d10c..ba44cf8211f 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -524,7 +524,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); r_params.set_user_defined_value("plot_all_orbitals",true); - r_params.set_user_defined_value("plot", true); + r_params.set_user_defined_value("plot", false); r_params.set_user_defined_value("print_level", 5); r_params.set_user_defined_value("guess_xyz", false); r_params.set_user_defined_value("save", true); From 6856ae7e4827dfa02dde1d15c5f20765f26307ef Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 6 Apr 2023 10:22:19 -0400 Subject: [PATCH 1132/1312] mask again --- src/apps/molresponse/FrequencyResponse.cpp | 7 ++++--- src/apps/molresponse/ResponseBase.cpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 1289059a8f7..88a9e95e0dd 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -90,12 +90,15 @@ void FrequencyResponse::iterate(World &world) { } PQ = generator(world, *this); PQ.truncate(); + PQ = PQ * mask; + vector converged(Chi.num_states(), false); Chi.reset_active(); rho_omega = make_density(world, Chi); for (iter = 0; iter < r_params.maxiter(); ++iter) { + Chi = Chi * mask; auto checkx = Chi.norm2s(); //if (world.rank() == 0) { print("At the start of iterate x", checkx); } iter_timing.clear(); @@ -355,9 +358,7 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, std::vector &bsh_y_ops, QProjector &projector, double &x_shifts) -> X_space { - if (r_params.print_level() >= 1) { - molresponse::start_timer(world); - } + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = theta_X.x.size(); size_t n = theta_X.x.size_orbitals(); bool compute_y = omega != 0.0; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 3923ee46d02..012732524dd 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -113,7 +113,7 @@ void ResponseBase::check_k(World &world, double thresh, int k) { if (FunctionDefaults<3>::get_k() != stored_v_nuc.k()) stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, false); } - // Don't forget the mask function as well + // project the mask if (FunctionDefaults<3>::get_k() != mask.k()) { mask = project(mask, FunctionDefaults<3>::get_k(), thresh, false); if (world.rank() == 0) { print("check k: project mask"); } From 51a38e5d017d4d393fbcd6aa03c59494e76a5f4f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 6 Apr 2023 11:18:26 -0400 Subject: [PATCH 1133/1312] Use small_memory algorithm --- src/apps/molresponse/FrequencyResponse.cpp | 12 ++---------- src/apps/molresponse/ResponseBase.cpp | 15 ++++++++++----- src/apps/molresponse/ResponseBase.hpp | 4 ++++ src/apps/molresponse/global_functions.cc | 15 +-------------- 4 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 88a9e95e0dd..7ca70f6a4b8 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,7 +21,6 @@ void FrequencyResponse::iterate(World &world) { size_t m = r_params.num_states(); // Number of excited states real_function_3d v_xc; - // the Final protocol should be equal to dconv at the minimum const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 10, r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); @@ -40,10 +39,7 @@ void FrequencyResponse::iterate(World &world) { bool compute_y = not static_res; int r_vector_size; all_done = false; - - r_vector_size = (compute_y) ? 2 * n : n; - Tensor v_polar(m, m); Tensor polar; Tensor res_polar; @@ -92,7 +88,6 @@ void FrequencyResponse::iterate(World &world) { PQ.truncate(); PQ = PQ * mask; - vector converged(Chi.num_states(), false); Chi.reset_active(); rho_omega = make_density(world, Chi); @@ -208,7 +203,6 @@ void FrequencyResponse::iterate(World &world) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } density_residuals = copy(density_residuals_old); - // compute density residuals for (const auto &b: Chi.active) { density_residuals[b] = (rho_omega_old[b] - new_rho[b]).norm2(); } @@ -218,7 +212,6 @@ void FrequencyResponse::iterate(World &world) { iter_function_data["d"] = dnorm; polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); res_polar = ((compute_y) ? -2 : -4) * response_context.inner(new_res.residual, PQ); - inner_to_json(world, "alpha", polar, iter_function_data); inner_to_json(world, "r_alpha", res_polar, iter_function_data); if (r_params.print_level() >= 20) { @@ -231,16 +224,15 @@ void FrequencyResponse::iterate(World &world) { print(res_polar); } } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "Iteration Timing", "iter_total", iter_timing); } time_data.add_data(iter_timing); function_data.add_data(iter_function_data); } - + function_data.add_convergence_targets(FunctionDefaults<3>::get_thresh(), density_target, + x_relative_target); Chi.reset_active(); - if (world.rank() == 0) print("\n"); if (world.rank() == 0) print(" Finished Response Calculation "); if (world.rank() == 0) print(" ------------------------"); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 012732524dd..149ef28665d 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -548,8 +548,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit inner_to_json(world, "v1_xc", response_context.inner(chi_alpha, W), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - //auto K = response_exchange_multiworld(phi0, chi_alpha, true); - auto K = response_exchange(phi0, chi_alpha, true); + auto K = response_exchange_multiworld(phi0, chi_alpha, true); + //auto K = response_exchange(phi0, chi_alpha, true); K = oop_apply(K, apply_projector); // std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); @@ -2090,11 +2090,8 @@ void response_timing::to_json(json &j) { j["time_data"] = json(); j["time_data"]["iterations"] = iter; - - j["time_data"]["wall_time"] = json(); for (const auto &e: wall_time_data) { j["time_data"]["wall_time"][e.first] = e.second; } - j["time_data"]["cpu_time"] = json(); for (const auto &e: cpu_time_data) { j["time_data"]["cpu_time"][e.first] = e.second; } } @@ -2112,12 +2109,20 @@ void response_data::add_data(std::map> values) { v.second.push_back(values[v.first]);// .first to get first value of pair wall_time }); } +void response_data::add_convergence_targets(double p_thresh, double p_density_target, double p_bsh_target) { + this->thresh.push_back(p_thresh); + this->density_target.push_back(p_density_target); + this->bsh_target.push_back(p_bsh_target); +} void response_data::to_json(json &j) { //::print("FREQUENCY TIME DATA TO JSON"); j["response_data"] = json(); j["response_data"]["iterations"] = iter; + j["response_data"]["thresh"] = thresh; + j["response_data"]["density_target"] = density_target; + j["response_data"]["bsh_target"] = bsh_target; j["response_data"]["data"] = json(); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 3ba602e7041..cdcd87d41dc 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -98,6 +98,9 @@ class response_timing { class response_data { std::map>> function_data; int iter; + std::vector thresh; + std::vector density_target; + std::vector bsh_target; public: response_data(); @@ -105,6 +108,7 @@ class response_data { void to_json(json &j); void add_data(std::map> values); + void add_convergence_targets(double p_thresh, double p_density_target, double p_bsh_target); }; class ResponseTester; diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index e04ea8e2772..4a01ed756ba 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -301,7 +301,7 @@ auto make_k(const vecfuncT &ket, const vecfuncT &bra) { const double lo = 1.e-10; Exchange k{}; k.set_parameters(bra, ket, lo); - k.set_algorithm(k.multiworld_efficient); + k.set_algorithm(k.small_memory); return k; }; /** @@ -325,19 +325,6 @@ auto response_exchange_multiworld(const vecfuncT &phi0, const X_space &chi, cons vector_real_function_3d k1x, k1y, k2x, k2y; if (compute_y) { - - /* - auto K1 = oop_apply(chi, [&](const vector_real_function_3d &xi) { - auto K1X = make_k(xi, phi0); - return K1X(phi0); - }); - auto K2 = oop_apply(chi, [&](const vector_real_function_3d &xi) { - auto K1X = make_k(phi0, xi); - return K1X(phi0); - }); - K = K1 + K2; - */ - for (const auto &b: chi.active) { auto x = chi.x[b]; auto y = chi.y[b]; From 8d5630896762ce3dd95cdb629741fe9cf54d88d0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 6 Apr 2023 13:07:52 -0400 Subject: [PATCH 1134/1312] Fix the printing --- src/apps/molresponse/FrequencyResponse.cpp | 16 ++++++---------- src/apps/molresponse/ResponseBase.cpp | 20 ++++++++++++++------ 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 7ca70f6a4b8..d857c237591 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -29,8 +29,6 @@ void FrequencyResponse::iterate(World &world) { const double b_pow{-0.99162}; const double x_relative_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b - // m residuals for x and y - Tensor x_residuals((int(m))); Tensor x_relative_residuals((int(m))); Tensor density_residuals((int(m))); Tensor density_residuals_old((int(m))); @@ -113,12 +111,9 @@ void FrequencyResponse::iterate(World &world) { auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.x.norm2(); auto rho_norms = madness::norm2s_T(world, rho_omega); - std::transform(x_residuals.ptr(), x_residuals.ptr() + x_residuals.size(), - chi_norms.ptr(), x_relative_residuals.ptr(), - [](auto bsh, auto norm_chi) { return bsh / norm_chi; }); // Todo add chi norm and chi_x if (world.rank() == 0) { - function_data_to_json(j_molresponse, iter, chi_norms, x_residuals, rho_norms, + function_data_to_json(j_molresponse, iter, chi_norms, x_relative_residuals, rho_norms, density_residuals); frequency_to_json(j_molresponse, iter, polar, res_polar); } @@ -174,7 +169,7 @@ void FrequencyResponse::iterate(World &world) { checkx = Chi.norm2s(); auto [new_chi, new_res, new_rho] = update_response( world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, - iter, max_rotation, rho_omega, x_residuals, residuals); + iter, max_rotation, rho_omega, x_relative_residuals, residuals); // Here we have computed the new response orbitals and the residuals // Now we need to compute the new density and the new density residuals // Instead, update should also update the density @@ -192,7 +187,7 @@ void FrequencyResponse::iterate(World &world) { molresponse::end_timer(world, "make_density_new", "make_density_new", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - x_residuals = copy(new_res.residual_norms); + x_relative_residuals = copy(new_res.residual_norms); residuals = new_res.residual.copy(); if (compute_y) { Chi = new_chi.copy(); @@ -208,6 +203,7 @@ void FrequencyResponse::iterate(World &world) { } density_residuals_old = copy(density_residuals); iter_function_data["r_d"] = density_residuals; + iter_function_data["x_relative_residuals"] = x_relative_residuals; auto dnorm = norm2s_T(world, rho_omega); iter_function_data["d"] = dnorm; polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); @@ -245,7 +241,7 @@ void FrequencyResponse::iterate(World &world) { } if (world.rank() == 0) { print(" Final energy residuals X:"); - print(x_residuals); + print(x_relative_residuals); print(" Final density residuals:"); print(density_residuals); } @@ -276,7 +272,7 @@ auto FrequencyResponse::update_response( auto [new_res, bsh] = update_residual(world, chi, new_chi, r_params.calc_type(), old_residuals, xres_old); inner_to_json(world, "r_x", response_context.inner(new_res, new_res), iter_function_data); - if (iteration > 0) {// & (iteration % 3 == 0)) { + if (iteration >= 0) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } inner_to_json(world, "x_update", response_context.inner(new_chi, new_chi), iter_function_data); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 149ef28665d..ce1d21ba69c 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -549,7 +549,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); - //auto K = response_exchange(phi0, chi_alpha, true); + //auto K = response_exchange(phi0, chi_alpha, true); K = oop_apply(K, apply_projector); // std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); @@ -1129,12 +1129,17 @@ auto ResponseBase::update_residual(World &world, const X_space &chi, const X_spa X_space res = xres_old.copy(); res.set_active(chi.active); if (compute_y) { - res = g_chi - chi; + res = chi - g_chi; auto rx = to_response_matrix(res); - for (const auto &b: chi.active) { residual_norms(b) = norm2(world, rx[b]); } + auto gx = to_response_matrix(g_chi); + for (const auto &b: chi.active) { + residual_norms(b) = norm2(world, rx[b]) / norm2(world, gx[b]); + } } else { - res.x = g_chi.x - chi.x; - for (const auto &b: chi.active) { residual_norms(b) = norm2(world, res.x[b]); } + res.x = chi.x - g_chi.x; + for (const auto &b: chi.active) { + residual_norms(b) = norm2(world, res.x[b]) / norm2(world, g_chi.x[b]); + } // if (world.rank() == 0) { print("printing residual norms", residual_norms); } } if (r_params.print_level() >= 1) { @@ -2109,7 +2114,8 @@ void response_data::add_data(std::map> values) { v.second.push_back(values[v.first]);// .first to get first value of pair wall_time }); } -void response_data::add_convergence_targets(double p_thresh, double p_density_target, double p_bsh_target) { +void response_data::add_convergence_targets(double p_thresh, double p_density_target, + double p_bsh_target) { this->thresh.push_back(p_thresh); this->density_target.push_back(p_density_target); this->bsh_target.push_back(p_bsh_target); @@ -2173,6 +2179,8 @@ response_data::response_data() : iter(0) { function_data.insert({"d", std::vector>(0)}); function_data.insert({"r_d", std::vector>(0)}); + function_data.insert({"r_d", std::vector>(0)}); + function_data.insert({"x_relative_residuals", std::vector>(0)}); } From fbf3c2d39d4c56898f070cd3497a92a3e535c5f8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Thu, 6 Apr 2023 13:24:45 -0400 Subject: [PATCH 1135/1312] lower the high protocol --- src/apps/molresponse/testing/runners.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index ba44cf8211f..c4c8ebf97da 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -370,8 +370,8 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - param1.set_user_defined_value("dconv", 1e-6); + param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + param1.set_user_defined_value("dconv", 1e-5); } else { param1.set_user_defined_value>("protocol", {1e-8}); param1.set_user_defined_value("dconv", 1e-6); @@ -509,7 +509,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param if (world.rank() == 0) { if (precision == "high") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); - r_params.set_user_defined_value("dconv", 1e-6); + r_params.set_user_defined_value("dconv", 1e-5); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); From bbfb0eb05c460e0dfb0c3f8c519c0d023d90bdfc Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 09:14:26 -0400 Subject: [PATCH 1136/1312] lower the high protocol --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index c4c8ebf97da..6acdd92a999 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -508,7 +508,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param const double &frequency, const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-8}); + r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); r_params.set_user_defined_value("dconv", 1e-5); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); From 7572c9dcc8d2ecfb90dfeb1a1e25a6d6284acc2f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 09:28:22 -0400 Subject: [PATCH 1137/1312] l is too small? --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 6acdd92a999..ef207236d14 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -364,7 +364,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("maxiter", 20); //param1.set_user_defined_value("Kain", true); param1.set_user_defined_value("xc", moldftSchema.xc); - param1.set_user_defined_value("l", 50); + param1.set_user_defined_value("l", 100); if (precision == "low") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); From b52645f776b6b2e5111fb967ea045d480f79b33e Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 10:18:24 -0400 Subject: [PATCH 1138/1312] l=200 --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index ef207236d14..f9cd6cbc2ad 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -364,7 +364,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("maxiter", 20); //param1.set_user_defined_value("Kain", true); param1.set_user_defined_value("xc", moldftSchema.xc); - param1.set_user_defined_value("l", 100); + param1.set_user_defined_value("l", 200); if (precision == "low") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); From b5a3eff46bd886f1e89167f405b67f8ef8003180 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 10:34:08 -0400 Subject: [PATCH 1139/1312] DO NOT MASK THE POTENTIAL --- src/apps/molresponse/FrequencyResponse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index d857c237591..dfccbdce89b 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -84,7 +84,6 @@ void FrequencyResponse::iterate(World &world) { } PQ = generator(world, *this); PQ.truncate(); - PQ = PQ * mask; vector converged(Chi.num_states(), false); Chi.reset_active(); From 50770be3746054d5797e461a2e513d4cf6364f82 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 10:34:27 -0400 Subject: [PATCH 1140/1312] Try 50 --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index f9cd6cbc2ad..6acdd92a999 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -364,7 +364,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("maxiter", 20); //param1.set_user_defined_value("Kain", true); param1.set_user_defined_value("xc", moldftSchema.xc); - param1.set_user_defined_value("l", 200); + param1.set_user_defined_value("l", 50); if (precision == "low") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); From bc76da5061c20838b3bcd40c9a948a5c23300713 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 10:54:29 -0400 Subject: [PATCH 1141/1312] Back to 200 --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 6acdd92a999..f9cd6cbc2ad 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -364,7 +364,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("maxiter", 20); //param1.set_user_defined_value("Kain", true); param1.set_user_defined_value("xc", moldftSchema.xc); - param1.set_user_defined_value("l", 50); + param1.set_user_defined_value("l", 200); if (precision == "low") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); From 1fb14c59883636027b3fb535fe2d31dd5fd905d9 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 13:07:54 -0400 Subject: [PATCH 1142/1312] try multiworld --- src/apps/molresponse/global_functions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index 4a01ed756ba..aecdd1988d9 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -301,7 +301,7 @@ auto make_k(const vecfuncT &ket, const vecfuncT &bra) { const double lo = 1.e-10; Exchange k{}; k.set_parameters(bra, ket, lo); - k.set_algorithm(k.small_memory); + k.set_algorithm(k.multiworld_efficient); return k; }; /** From c0da86c72a3f170639b8553acf608227a9ec638d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 13:43:44 -0400 Subject: [PATCH 1143/1312] project gamma after adding --- src/apps/molresponse/ResponseBase.cpp | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ce1d21ba69c..ef932c0d2ea 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -514,6 +514,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit std::vector *> pis; int b = 0; functionT temp_J; + // apply coulomb operator to each active response state and multiply by phi0 for (const auto &i: chi_alpha.active) { temp_J = apply(*coul_ops[i], rho_b[i]); temp_J.truncate(FunctionDefaults<3>::get_thresh()); @@ -521,9 +522,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } world.gop.fence(); J.x.truncate_rf(); - J.x = oop_unary_apply(J.x, apply_projector); + //J.x = oop_unary_apply(J.x, apply_projector); J.y = J.x.copy(); - // std::transform(J.x.begin(), J.x.end(), J.x.begin(), [&](auto &jxi) { return projector(jxi); }); world.gop.fence(); inner_to_json(world, "j1", response_context.inner(chi_alpha, J), iter_function_data); if (r_params.print_level() >= 1) { @@ -549,12 +549,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_exchange_multiworld(phi0, chi_alpha, true); - //auto K = response_exchange(phi0, chi_alpha, true); - - K = oop_apply(K, apply_projector); - // std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); - // std::transform(K.y.begin(), K.y.end(), K.y.begin(), [&](auto &kyi) { return projector(kyi); }); - + //K = oop_apply(K, apply_projector); inner_to_json(world, "k1", response_context.inner(chi_alpha, K), iter_function_data); if (r_params.print_level() >= 1) { @@ -578,12 +573,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit if (r_params.print_level() >= 1) { molresponse::start_timer(world); } gamma = oop_apply(gamma, apply_projector); - /* - std::transform(gamma.x.begin(), gamma.x.end(), gamma.x.begin(), - [&](auto &gxi) { return projector(gxi); }); - std::transform(gamma.y.begin(), gamma.y.end(), gamma.y.begin(), - [&](auto &gyi) { return projector(gyi); }); - */ if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); From 0b5584580b393c9fcfd379d6e9c4d81f0ba986fc Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 13:48:52 -0400 Subject: [PATCH 1144/1312] remove mask --- src/apps/molresponse/FrequencyResponse.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index dfccbdce89b..a1a2d7554c8 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -90,8 +90,6 @@ void FrequencyResponse::iterate(World &world) { rho_omega = make_density(world, Chi); for (iter = 0; iter < r_params.maxiter(); ++iter) { - Chi = Chi * mask; - auto checkx = Chi.norm2s(); //if (world.rank() == 0) { print("At the start of iterate x", checkx); } iter_timing.clear(); iter_function_data.clear(); @@ -165,7 +163,6 @@ void FrequencyResponse::iterate(World &world) { } } inner_to_json(world, "x", response_context.inner(Chi, Chi), iter_function_data); - checkx = Chi.norm2s(); auto [new_chi, new_res, new_rho] = update_response( world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation, rho_omega, x_relative_residuals, residuals); From 7fee2607a6074e623d59f64e249eddae71947c1f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 14:00:10 -0400 Subject: [PATCH 1145/1312] remove extra truncation --- src/apps/molresponse/ResponseBase.cpp | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ef932c0d2ea..666f2e5b7c6 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -298,29 +298,21 @@ auto ResponseBase::update_density(World &world, const X_space &chi, auto thresh = FunctionDefaults<3>::get_thresh(); if (calc_type == "full") { - auto chi_copy = chi.copy(); - chi_copy.truncate(thresh); functionT rhox = factoryT(world); functionT rhoy = factoryT(world); - for (const auto &b: chi_copy.active) { + for (const auto &b: chi.active) { - auto x_phi = mul(world, chi_copy.x[b], ground_orbitals, false); - auto y_phi = mul(world, chi_copy.y[b], ground_orbitals, false); + auto x_phi = mul(world, chi.x[b], ground_orbitals, false); + auto y_phi = mul(world, chi.y[b], ground_orbitals, false); world.gop.fence(); - truncate(world, x_phi, thresh); - truncate(world, y_phi, thresh); density[b] = sum(world, x_phi) + sum(world, y_phi); } } else if (calc_type == "static") { - - auto chi_x_copy = chi.x.copy(); - chi_x_copy.truncate_rf(thresh); for (const auto &b: chi.active) { - auto x_phi = mul(world, chi_x_copy.x[b], ground_orbitals, false); + auto x_phi = mul(world, chi.x[b], ground_orbitals, false); world.gop.fence(); - truncate(world, x_phi, thresh); density[b] = 2 * sum(world, x_phi); } } else { @@ -340,8 +332,6 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto x_phi = mul(world, chi.x[b], ground_orbitals, false); auto y_phi = mul(world, chi.y[b], ground_orbitals, false); world.gop.fence(); - truncate(world, x_phi, thresh); - truncate(world, y_phi, thresh); density[b] = sum(world, x_phi) + sum(world, y_phi); } @@ -351,7 +341,6 @@ auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfu auto xb = chi.x[b]; auto x_phi = mul(world, xb, ground_orbitals, false); world.gop.fence(); - truncate(world, x_phi, thresh); rho_b = 2 * sum(world, x_phi); b++; } From 27a8de49faa9ec1455f18240f6a0fab928cda3f5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 14:03:50 -0400 Subject: [PATCH 1146/1312] always print the polarizability --- src/apps/molresponse/FrequencyResponse.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index a1a2d7554c8..db95a485f11 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -121,6 +121,7 @@ void FrequencyResponse::iterate(World &world) { print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); print("||X||: ", chi_norms); + print("polarizability: ", polar.flat()); print("targets : ||x||", x_relative_target, " ||delta_rho||", density_target); } From 259ba218f1fa7c5914d7941f0515a6bede635381 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 14:07:11 -0400 Subject: [PATCH 1147/1312] do not flatten --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index db95a485f11..ac3ed098f46 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -121,7 +121,7 @@ void FrequencyResponse::iterate(World &world) { print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); print("||X||: ", chi_norms); - print("polarizability: ", polar.flat()); + print("polarizability: ", polar); print("targets : ||x||", x_relative_target, " ||delta_rho||", density_target); } From 1a2514e93a487d4fbf56767072772b7897f7c34f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Fri, 7 Apr 2023 15:01:28 -0400 Subject: [PATCH 1148/1312] update --- src/apps/molresponse/FrequencyResponse.cpp | 12 +++--------- src/apps/molresponse/ResponseBase.cpp | 3 --- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ac3ed098f46..73a00700608 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -110,8 +110,8 @@ void FrequencyResponse::iterate(World &world) { // Todo add chi norm and chi_x if (world.rank() == 0) { - function_data_to_json(j_molresponse, iter, chi_norms, x_relative_residuals, rho_norms, - density_residuals); + function_data_to_json(j_molresponse, iter, chi_norms, x_relative_residuals, + rho_norms, density_residuals); frequency_to_json(j_molresponse, iter, polar, res_polar); } if (r_params.print_level() >= 1) { @@ -121,7 +121,7 @@ void FrequencyResponse::iterate(World &world) { print("k: ", FunctionDefaults<3>::get_k()); print("Chi Norms at start of iteration: ", iter); print("||X||: ", chi_norms); - print("polarizability: ", polar); + print("polarizability: \n", polar); print("targets : ||x||", x_relative_target, " ||delta_rho||", density_target); } @@ -362,11 +362,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, // apply bsh X_space bsh_X(world, m, n); bsh_X.active = theta_X.active; - /* - bsh_x_ops.insert(bsh_x_ops.end(), std::make_move_iterator(bsh_y_ops.begin()), - std::make_move_iterator(bsh_y_ops.end())); - */ - bsh_X.x = apply(world, bsh_x_ops, theta_X.x); if (compute_y) { bsh_X.y = apply(world, bsh_y_ops, theta_X.y); } @@ -376,7 +371,6 @@ auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, bsh_X.x.truncate_rf(); } - auto apply_projector = [&](auto &xi) { return projector(xi); }; if (compute_y) { bsh_X = oop_apply(bsh_X, apply_projector); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 666f2e5b7c6..f1f173bb4d2 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -1118,7 +1118,6 @@ auto ResponseBase::update_residual(World &world, const X_space &chi, const X_spa for (const auto &b: chi.active) { residual_norms(b) = norm2(world, res.x[b]) / norm2(world, g_chi.x[b]); } - // if (world.rank() == 0) { print("printing residual norms", residual_norms); } } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); @@ -1140,14 +1139,12 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, if (compute_y) { auto x_vectors = to_response_matrix(chi); auto x_residuals = to_response_matrix(residual_chi); - int b = 0; for (const auto &i: Chi.active) { auto temp = kain_x_space[i].update(x_vectors[i], x_residuals[i]); std::copy(temp.begin(), temp.begin() + n, kain_update.x[i].begin()); std::copy(temp.begin() + n, temp.end(), kain_update.y[i].begin()); }; } else { - int b = 0; for (const auto &i: Chi.active) { kain_update.x[i] = kain_x_space[i].update(chi.x[i], residual_chi.x[i]); } From e327301ff87e5ed10a77e11dde99470b34a203c4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 8 Apr 2023 09:54:06 -0400 Subject: [PATCH 1149/1312] increase print level for debugging --- src/apps/molresponse/testing/runners.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index f9cd6cbc2ad..5e6a3e43aab 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -525,7 +525,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("first_order", true); r_params.set_user_defined_value("plot_all_orbitals",true); r_params.set_user_defined_value("plot", false); - r_params.set_user_defined_value("print_level", 5); + r_params.set_user_defined_value("print_level", 20); r_params.set_user_defined_value("guess_xyz", false); r_params.set_user_defined_value("save", true); // set xc, property, frequency,and restart From 248b8a86d7ce674c5d6c78a1081be55f62d73dc5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sat, 8 Apr 2023 10:00:43 -0400 Subject: [PATCH 1150/1312] print k0 --- src/apps/molresponse/ResponseBase.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f1f173bb4d2..248b233720f 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -958,6 +958,15 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(ground_orbitals, X, compute_Y); + + if (r_params.print_level() >= 20) { + auto xk0x = response_context.inner(X, K0); + if (world.rank() == 0) { + print("inner "); + print(xk0x); + } + } + if (r_params.print_level() >= 15) { inner_to_json(world, "v0_nuc", response_context.inner(X, v_nuc * X), iter_function_data); From 6b6fddc957cad80064dae813bb13aefe9eda8ba2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Sun, 9 Apr 2023 14:38:02 -0400 Subject: [PATCH 1151/1312] some useful printing --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 73a00700608..69706158ee7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -211,7 +211,7 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { printf("\n--------Response Properties after %d-------------\n", static_cast(iter)); - print("polarizability"); + print("polarizability at omega =", omega); print(polar); print("res polarizability"); print(res_polar); From 5fe995f7f0bbe4442cc9db915ec68bac548ff7aa Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 13:02:48 -0400 Subject: [PATCH 1152/1312] if not active should be a zero function --- src/apps/molresponse/ResponseBase.cpp | 4 ++++ src/apps/molresponse/x_space.h | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 248b233720f..ebdf2e91991 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -920,8 +920,12 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< size_t n = X.num_orbitals(); X_space V0 = X_space::zero_functions(world, m, n); V0.set_active(X.active); + + X_space K0 = X_space::zero_functions(world, m, n); K0.set_active(X.active); + + real_function_3d v_nuc, v_j0, v_k0, v_xc; if (not r_params.store_potential()) { v_nuc = potential_manager->vnuclear(); diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 012e7b6abbf..e2cbcf12529 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -143,12 +143,18 @@ namespace madness { world.gop.fence(); } + /** + * @brief Apply a function to the X_space + * @param A + * @param func + * @return + */ friend auto oop_apply( const X_space &A, const std::function &func) -> X_space { auto &world = A.x[0][0].world(); - auto result = A.copy(); + auto result = X_space::zero_functions(world, A.num_states(), A.num_orbitals()); // if (world.rank() == 0) { print("oop_apply"); } for (auto &i: result.active) { // if (world.rank() == 0) { print("oop_apply", i); } From 8f844a1be6a4269282a63cfef2f71d914270ffc0 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 13:15:29 -0400 Subject: [PATCH 1153/1312] load balancing --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 8 +- src/apps/molresponse/x_space.cc | 89 ++++++++-------------- 3 files changed, 36 insertions(+), 63 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 69706158ee7..72fe466e82e 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -99,7 +99,7 @@ void FrequencyResponse::iterate(World &world) { printf("\n Iteration %d at time %.1fs\n", static_cast(iter), wall_time()); if (world.rank() == 0) print("-------------------------------------------"); } - if (iter < 2 || (iter % 10) == 0) { load_balance_chi(world); } + if (iter < 2 || (iter % 5) == 0) { load_balance_chi(world); } if (iter > 0) { if (density_residuals.max() > 20 && iter > 5) { if (world.rank() == 0) { print("d-residual > 20...break"); } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index ebdf2e91991..523d279bcb3 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -359,12 +359,12 @@ void ResponseBase::load_balance_chi(World &world) { LoadBalanceDeux<3> lb(world); real_function_3d v_nuclear; v_nuclear = potential_manager->vnuclear(); - for (auto &xi: Chi.x) { - for (auto &xij: xi) { lb.add_tree(xij, lbcost(1.0, 8.0), false); } + for (auto &b: Chi.active) { + for (auto &xij: Chi.x[b]) { lb.add_tree(xij, lbcost(1.0, 8.0), false); } } if (r_params.omega() != 0) { - for (auto &yi: Chi.y) { - for (auto &yij: yi) { lb.add_tree(yij, lbcost(1.0, 8.0), false); } + for (auto &b: Chi.active) { + for (auto &yij: Chi.y[b]) { lb.add_tree(yij, lbcost(1.0, 8.0), false); } } } world.gop.fence(); diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index c56038d5ed7..3c568f18cfc 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -4,26 +4,21 @@ #include "response_functions.h" -namespace madness -{ +namespace madness { /** * @phi -> [phi conjugate(phi)] * * @param vec * @return vector_real_function_3d */ - auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d - { + auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d { auto &world = vec[0].world(); // copy the vector auto response_vector = vector_real_function_3d(2 * vec.size()); auto n = vec.size(); int i = 0; - for (auto &r0i : response_vector) - { - r0i = vec[i++ % n]; - } + for (auto &r0i: response_vector) { r0i = vec[i++ % n]; } auto copy_vec = copy(world, response_vector); world.gop.fence(); return copy_vec; @@ -37,48 +32,44 @@ namespace madness * @return response_matrix */ auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) - -> response_matrix - { + -> response_matrix { auto matrix = response_matrix(num_states); std::for_each(matrix.begin(), matrix.end(), - [&](auto &xi) - { xi = vector_real_function_3d(num_orbitals); }); + [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); return matrix; } -/** + /** * @ Converts Xspace object to response_matrix object * * @param x * @return response_matrix */ - auto to_response_matrix(const X_space &x) -> response_matrix - { + auto to_response_matrix(const X_space &x) -> response_matrix { auto mX = response_matrix(x.num_states()); auto num_orbitals = x.num_orbitals(); int b = 0; - std::for_each(mX.begin(), mX.end(), [&](vector_real_function_3d &mi) - { + std::for_each(mX.begin(), mX.end(), [&](vector_real_function_3d &mi) { mi = vector_real_function_3d(2 * num_orbitals); std::copy(x.x[b].begin(), x.x[b].end(), mi.begin()); // shallow copy std::copy(x.y[b].begin(), x.y[b].end(), mi.begin() + num_orbitals);// shallow copy - b++; }); + b++; + }); return mX; } - auto to_conjugate_response_matrix(const X_space &x) -> response_matrix - { + auto to_conjugate_response_matrix(const X_space &x) -> response_matrix { World &world = x.x[0][0].world(); auto mX = response_matrix(x.num_states()); int b = 0; auto num_orbitals = x.num_orbitals(); - std::for_each(mX.begin(), mX.end(), [&](auto &mi) - { + std::for_each(mX.begin(), mX.end(), [&](auto &mi) { mi = vector_real_function_3d(2 * num_orbitals); std::copy(x.y[b].begin(), x.y[b].end(), mi.begin()); // shallow copy std::copy(x.x[b].begin(), x.x[b].end(), mi.begin() + num_orbitals);// shallow copy - b++; }); + b++; + }); return mX; } @@ -87,32 +78,28 @@ namespace madness * @param x * @return */ - auto to_flattened_vector(const X_space &x) -> vector_real_function_3d - { + auto to_flattened_vector(const X_space &x) -> vector_real_function_3d { World &world = x.x[0][0].world(); auto num_orbitals = 2 * x.num_orbitals(); auto vij = vector_real_function_3d(x.num_states() * num_orbitals); auto mx = to_response_matrix(x); int b = 0; - for (const auto &mi : mx) - { + for (const auto &mi: mx) { std::copy(mi.begin(), mi.end(), vij.begin() + b * num_orbitals); b++; } return vij; } - auto to_X_space(const response_matrix &x) -> X_space - { + auto to_X_space(const response_matrix &x) -> X_space { World &world = x[0][0].world(); auto num_states = x.size(); auto num_orbitals = size_t(x[0].size() / 2); auto x_space = X_space(world, num_states, num_orbitals); int b = 0; - for (const auto &x_vec : x) - { + for (const auto &x_vec: x) { std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.x[b].begin()); std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.y[b].begin()); b++; @@ -120,14 +107,13 @@ namespace madness return x_space; } -/** + /** * @brief response_matrix [x,y] -> Xspace X.x=y X.y=conjugate(x) * * @param x * @return X_space */ - auto to_conjugate_X_space(const response_matrix &x) -> X_space - { + auto to_conjugate_X_space(const response_matrix &x) -> X_space { World &world = x[0][0].world(); @@ -136,32 +122,27 @@ namespace madness auto x_space = X_space(world, num_states, num_orbitals); int b = 0; - std::for_each(x.begin(), x.end(), [&](auto x_vec) - { + std::for_each(x.begin(), x.end(), [&](auto x_vec) { std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.y[b].begin(), [&](const auto &xi) { return copy(xi, false); }); std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.x[b].begin(), [&](const auto &xi) { return copy(xi, false); }); - b++; }); + b++; + }); world.gop.fence(); return x_space; } - auto transposeResponseMatrix(const response_matrix &x) -> response_matrix - { + auto transposeResponseMatrix(const response_matrix &x) -> response_matrix { auto XT = response_matrix(x[0].size()); auto b = 0; - for (auto &xi : XT) - { + for (auto &xi: XT) { auto j = 0; xi = vector_real_function_3d(x.size()); - for (auto &xji : xi) - { - xji = x[j++][b]; - } + for (auto &xji: xi) { xji = x[j++][b]; } b++; } return XT; @@ -176,8 +157,7 @@ namespace madness * @param B * @return Tensor */ - auto inner(const X_space &A, const X_space &B) -> Tensor - { + auto inner(const X_space &A, const X_space &B) -> Tensor { MADNESS_ASSERT(size_states(A) > 0); MADNESS_ASSERT(size_orbitals(A) > 0); MADNESS_ASSERT(same_size(A, B)); @@ -189,19 +169,12 @@ namespace madness auto a_transpose = transposeResponseMatrix(a); auto b_transpose = transposeResponseMatrix(b); - /* - std::for_each(a_transpose.begin(), a_transpose.end(), - [&](const auto& ai) { print(norm2(world, ai)); }); - std::for_each(b_transpose.begin(), b_transpose.end(), - [&](const auto& ai) { print(norm2(world, ai)); }); - */ - // Container for result Tensor result(a.size(), a.size()); int p = 0; - std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) - { + std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) { result += matrix_inner(world, ati, b_transpose[p++]); - world.gop.fence(); }); + world.gop.fence(); + }); return result; } -} // namespace madness +}// namespace madness From 96abc55e9fda6bc61734c55f9aa57fb7672e018b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 13:22:29 -0400 Subject: [PATCH 1154/1312] mutiply inner by 2 for static case --- src/apps/molresponse/FrequencyResponse.cpp | 17 +++++++---------- src/apps/molresponse/x_space.cc | 4 +++- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 72fe466e82e..e459f024434 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -163,7 +163,8 @@ void FrequencyResponse::iterate(World &world) { break; } } - inner_to_json(world, "x", response_context.inner(Chi, Chi), iter_function_data); + auto x_inner = ((compute_y) ? 2 : 1) * response_context.inner(Chi, Chi); + inner_to_json(world, "x", x_inner, iter_function_data); auto [new_chi, new_res, new_rho] = update_response( world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation, rho_omega, x_relative_residuals, residuals); @@ -419,10 +420,8 @@ void FrequencyResponse::save(World &world, const std::string &name) { for (size_t i = 0; i < r_params.num_states(); i++) for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.x[i][j]; - if (not r_params.tda()) { - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.y[i][j]; - } + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.y[i][j]; } // Load a response calculation @@ -438,11 +437,9 @@ void FrequencyResponse::load(World &world, const std::string &name) { for (size_t i = 0; i < r_params.num_states(); i++) for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.x[i][j]; world.gop.fence(); - if (not r_params.tda()) { - for (size_t i = 0; i < r_params.num_states(); i++) - for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.y[i][j]; - world.gop.fence(); - } + for (size_t i = 0; i < r_params.num_states(); i++) + for (size_t j = 0; j < r_params.num_orbitals(); j++) ar & Chi.y[i][j]; + world.gop.fence(); } auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 3c568f18cfc..18c1447be5e 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -164,11 +164,13 @@ namespace madness { auto a = to_response_matrix(A); auto b = to_response_matrix(B); - World &world = a[0][0].world(); + world.gop.fence(); + auto a_transpose = transposeResponseMatrix(a); auto b_transpose = transposeResponseMatrix(b); + world.gop.fence(); Tensor result(a.size(), a.size()); int p = 0; std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) { From 031b4587b654517fe7ccde01bb96214d36bf542f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 15:34:05 -0400 Subject: [PATCH 1155/1312] j1 bug --- src/apps/molresponse/ResponseBase.cpp | 11 +++-- src/apps/molresponse/ResponseBase.hpp | 68 ++++++++++++++++++++++++--- 2 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 523d279bcb3..2547026f640 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -472,6 +472,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); auto [chi_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); + QProjector projector(world, phi0); size_t num_states = chi_alpha.num_states(); size_t num_orbitals = chi_alpha.num_orbitals(); @@ -500,14 +501,15 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto rho_b = make_density(world, chi_alpha); + std::vector *> pis; int b = 0; - functionT temp_J; + vecfuncT temp_J(num_states); // apply coulomb operator to each active response state and multiply by phi0 for (const auto &i: chi_alpha.active) { - temp_J = apply(*coul_ops[i], rho_b[i]); - temp_J.truncate(FunctionDefaults<3>::get_thresh()); - J.x[i] = mul(world, temp_J, phi0, false); + temp_J[i] = apply(*coul_ops[i], rho_b[i]); + temp_J[i].truncate(FunctionDefaults<3>::get_thresh()); + J.x[i] = mul(world, temp_J[i], phi0, false); } world.gop.fence(); J.x.truncate_rf(); @@ -591,6 +593,7 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit // Get sizes } + auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gammaOrbitals, const XCOperator &xc) const -> X_space { diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index cdcd87d41dc..066be37b46a 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -24,6 +24,44 @@ using namespace madness; +class J1Strategy { +public: + virtual ~J1Strategy() = default; + virtual X_space compute_J1(World &world, const X_space &x, const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0, + const poperatorT &coulomb_ops) const = 0; +}; + +class J1StrategyFull : public J1Strategy { +public: + X_space compute_J1(World &world, const X_space &x, const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0, + const poperatorT &coulomb_ops) const override { + + X_space J = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + functionT temp_J; + for (const auto &b: x.active) { + temp_J = apply(*coulomb_ops, rho1[b]); + J.x[b] = mul(world, temp_J, phi0, false); + } + world.gop.fence(); + J.y = J.x.copy(); + return J; + } +}; + + +class J1StrategyStatic : public J1Strategy { +public: + X_space compute_J1(World &world, const X_space &x, const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0, + const poperatorT &coulomb_ops) const override { + + return X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + } +}; + + class inner_strategy { public: @@ -34,18 +72,22 @@ class inner_strategy { class Context { private: - std::unique_ptr strategy_; + std::unique_ptr inner_strategy_; + std::unique_ptr j1_strategy_; public: + explicit Context(std::unique_ptr &&innerStrategy = {}, + std::unique_ptr &&j1Strategy = {}) + : inner_strategy_(std::move(innerStrategy)), j1_strategy_(std::move(j1Strategy)) {} explicit Context(std::unique_ptr &&strategy = {}) - : strategy_(std::move(strategy)) {} + : inner_strategy_(std::move(strategy)) {} void set_strategy(std::unique_ptr &&strategy) { - strategy_ = std::move(strategy); + inner_strategy_ = std::move(strategy); } void print_inner(const X_space &x, const X_space &y) const { - if (strategy_) { + if (inner_strategy_) { std::cout << "Context: Computing inner using the strategy (not sure how it'll do it)\n"; - auto result = strategy_->compute_inner(x, y); + auto result = inner_strategy_->compute_inner(x, y); std::cout << result << "\n"; } else { std::cout << "Context: Strategy isn't set\n"; @@ -53,14 +95,26 @@ class Context { } Tensor inner(const X_space &x, const X_space &y) const { - if (strategy_) { - return strategy_->compute_inner(x, y); + if (inner_strategy_) { + return inner_strategy_->compute_inner(x, y); } else { throw madness::MadnessException("Inner product Stratgey isn't set", "Need to set a strategy", 2, 455, "inner", "ResponseBase.hpp"); } } + + X_space compute_j1(World &world, const X_space &x, const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0, const poperatorT &coulomb_ops) const { + if (j1_strategy_) { + return j1_strategy_->compute_J1(world, x, rho1, phi0, coulomb_ops); + } else { + throw madness::MadnessException("Compute J1 Stratgey isn't set", + "Need to set a strategy", 2, 455, "inner", + "ResponseBase.hpp"); + } + } + }; class full_inner_product : public inner_strategy { From f8dc098d4d97a99b4ff6e9946b466dbebee6df7a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 15:55:08 -0400 Subject: [PATCH 1156/1312] add j1 strategy --- src/apps/molresponse/FrequencyResponse.hpp | 4 ++-- src/apps/molresponse/ResponseBase.hpp | 26 +++++++++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index 5f680378390..a89790fa0ca 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -24,9 +24,9 @@ class FrequencyResponse : public ResponseBase { FrequencyResponse(World &world, const CalcParams ¶ms, double frequency, RHS_Generator rhs) : ResponseBase(world, params), omega{frequency}, generator{std::move(rhs)}, PQ{} { if (omega == 0.0) { - response_context.set_strategy(std::make_unique()); + response_context.set_strategy(std::make_unique(),std::make_unique()); } else { - response_context.set_strategy(std::make_unique()); + response_context.set_strategy(std::make_unique(),std::make_unique()); } PQ = generator(world, *this); } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 066be37b46a..754f70bbd72 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -51,16 +51,31 @@ class J1StrategyFull : public J1Strategy { }; -class J1StrategyStatic : public J1Strategy { +class J1StrategyStable : public J1Strategy { public: X_space compute_J1(World &world, const X_space &x, const vector_real_function_3d &rho1, const vector_real_function_3d &phi0, const poperatorT &coulomb_ops) const override { - return X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + X_space J = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + functionT temp_J; + for (const auto &b: x.active) { + temp_J = apply(*coulomb_ops, rho1[b]); + J.x[b] = mul(world, temp_J, phi0, false); + } + world.gop.fence(); + J.y = J.x.copy(); + return J; } }; +class K1Strategy { +public: + virtual ~K1Strategy() = default; + virtual X_space compute_J1(World &world, const X_space &x, const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0, + const poperatorT &coulomb_ops) const = 0; +}; class inner_strategy { @@ -79,10 +94,10 @@ class Context { explicit Context(std::unique_ptr &&innerStrategy = {}, std::unique_ptr &&j1Strategy = {}) : inner_strategy_(std::move(innerStrategy)), j1_strategy_(std::move(j1Strategy)) {} - explicit Context(std::unique_ptr &&strategy = {}) - : inner_strategy_(std::move(strategy)) {} - void set_strategy(std::unique_ptr &&strategy) { + void set_strategy(std::unique_ptr &&strategy, + std::unique_ptr &&j1Strategy) { inner_strategy_ = std::move(strategy); + j1_strategy_ = std::move(j1Strategy); } void print_inner(const X_space &x, const X_space &y) const { if (inner_strategy_) { @@ -114,7 +129,6 @@ class Context { "ResponseBase.hpp"); } } - }; class full_inner_product : public inner_strategy { From e314f04b6033add2e831b838c722e1e3f1e73b83 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 16:00:13 -0400 Subject: [PATCH 1157/1312] fix includes --- src/apps/molresponse/ResponseBase.hpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 754f70bbd72..6b8b49c14e7 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -10,11 +10,11 @@ #include #include -#include -#include +#include "global_functions.h" +#include "madness/chem/SCF.h" #include "madness/mra/functypedefs.h" #include "madness/mra/mra.h" -#include +#include "madness/mra/nonlinsol.h" #include "madness/tensor/tensor.h" #include "madness/tensor/tensor_json.hpp" #include "timer.h" @@ -72,9 +72,20 @@ class J1StrategyStable : public J1Strategy { class K1Strategy { public: virtual ~K1Strategy() = default; - virtual X_space compute_J1(World &world, const X_space &x, const vector_real_function_3d &rho1, - const vector_real_function_3d &phi0, - const poperatorT &coulomb_ops) const = 0; + virtual X_space compute_K1(World &world, const X_space &x, const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0) const = 0; +}; + +class K1StrategyFull : public K1Strategy { +public: + X_space compute_K1(World &world, const X_space &x, const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0) const override { + + X_space K = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + + + return K; + } }; class inner_strategy { From 0d72bf86be5df2db6de49e3ba08f0de97d86aedd Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 16:29:00 -0400 Subject: [PATCH 1158/1312] use new response --- src/apps/molresponse/FrequencyResponse.hpp | 8 +- src/apps/molresponse/ResponseBase.cpp | 28 +------ src/apps/molresponse/ResponseBase.hpp | 87 ++++++++++++++++++---- 3 files changed, 81 insertions(+), 42 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index a89790fa0ca..f38e4cca113 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -24,9 +24,13 @@ class FrequencyResponse : public ResponseBase { FrequencyResponse(World &world, const CalcParams ¶ms, double frequency, RHS_Generator rhs) : ResponseBase(world, params), omega{frequency}, generator{std::move(rhs)}, PQ{} { if (omega == 0.0) { - response_context.set_strategy(std::make_unique(),std::make_unique()); + response_context.set_strategy(std::make_unique(), + std::make_unique(), + std::make_unique()); } else { - response_context.set_strategy(std::make_unique(),std::make_unique()); + response_context.set_strategy(std::make_unique(), + std::make_unique(), + std::make_unique()); } PQ = generator(world, *this); } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 2547026f640..f41b0df388c 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -483,9 +483,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit vecfuncT x_phi; vecfuncT y_phi; - X_space J = X_space::zero_functions(world, num_states, num_orbitals); - response_space j_x(world, num_states, num_orbitals); - response_space j_y(world, num_states, num_orbitals); X_space W = X_space::zero_functions(world, num_states, num_orbitals); if (r_params.print_level() >= 1) { @@ -494,28 +491,12 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit auto apply_projector = [&](auto &xi) { return projector(xi); }; // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // Create Coulomb potential on ground_orbitals - functionT rho_x_b; - functionT rho_y_b; - auto mul_tol = FunctionDefaults<3>::get_thresh(); auto rho_b = make_density(world, chi_alpha); + auto J = response_context.compute_j1(world, chi_alpha, rho_b, phi0, shared_coulomb_operator); - - std::vector *> pis; - int b = 0; - vecfuncT temp_J(num_states); - // apply coulomb operator to each active response state and multiply by phi0 - for (const auto &i: chi_alpha.active) { - temp_J[i] = apply(*coul_ops[i], rho_b[i]); - temp_J[i].truncate(FunctionDefaults<3>::get_thresh()); - J.x[i] = mul(world, temp_J[i], phi0, false); - } - world.gop.fence(); - J.x.truncate_rf(); - //J.x = oop_unary_apply(J.x, apply_projector); - J.y = J.x.copy(); world.gop.fence(); + inner_to_json(world, "j1", response_context.inner(chi_alpha, J), iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); @@ -539,7 +520,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit inner_to_json(world, "v1_xc", response_context.inner(chi_alpha, W), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto K = response_exchange_multiworld(phi0, chi_alpha, true); + // auto K = response_exchange_multiworld(phi0, chi_alpha, true); + auto K = response_context.compute_k1(world, chi_alpha, phi0); //K = oop_apply(K, apply_projector); inner_to_json(world, "k1", response_context.inner(chi_alpha, K), iter_function_data); @@ -579,8 +561,6 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit molresponse::start_timer(world); J.clear(); - j_x.clear(); - j_y.clear(); K.clear(); W.clear(); chi_alpha.clear(); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 6b8b49c14e7..2718056760a 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -72,18 +72,67 @@ class J1StrategyStable : public J1Strategy { class K1Strategy { public: virtual ~K1Strategy() = default; - virtual X_space compute_K1(World &world, const X_space &x, const vector_real_function_3d &rho1, + virtual X_space compute_K1(World &world, const X_space &x, const vector_real_function_3d &phi0) const = 0; + + static auto make_k(const vecfuncT &ket, const vecfuncT &bra) { + const double lo = 1.e-10; + Exchange k{}; + k.set_parameters(bra, ket, lo); + k.set_algorithm(k.multiworld_efficient); + return k; + }; }; class K1StrategyFull : public K1Strategy { public: - X_space compute_K1(World &world, const X_space &x, const vector_real_function_3d &rho1, + X_space compute_K1(World &world, const X_space &x, const vector_real_function_3d &phi0) const override { X_space K = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + vector_real_function_3d k1x, k1y, k2x, k2y; + + for (const auto &b: x.active) { + auto xb = x.x[b]; + auto yb = x.y[b]; + auto K1X = make_k(xb, phi0); + auto K2X = make_k(yb, phi0); + auto K1Y = make_k(phi0, yb); + auto K2Y = make_k(phi0, xb); + k1x = K1X(phi0); + k1y = K1Y(phi0); + k2x = K2X(phi0); + k2y = K2Y(phi0); + world.gop.fence(); + K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); + K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); + world.gop.fence(); + } + return K; + } +}; + +class K1StrategyStatic : public K1Strategy { +public: + X_space compute_K1(World &world, const X_space &x, + const vector_real_function_3d &phi0) const override { + X_space K = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + vector_real_function_3d k1x, k1y, k2x, k2y; + vector_real_function_3d xb; + vector_real_function_3d yb; + Exchange K1X{}; + Exchange K1Y{}; + for (const auto &b: x.active) { + xb = x.x[b]; + yb = x.x[b]; + K1X = make_k(xb, phi0); + K1Y = make_k(phi0, yb); + k1x = K1X(phi0); + k1y = K1Y(phi0); + K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, true); + } return K; } }; @@ -100,31 +149,27 @@ class Context { private: std::unique_ptr inner_strategy_; std::unique_ptr j1_strategy_; + std::unique_ptr k1_strategy_; public: explicit Context(std::unique_ptr &&innerStrategy = {}, - std::unique_ptr &&j1Strategy = {}) - : inner_strategy_(std::move(innerStrategy)), j1_strategy_(std::move(j1Strategy)) {} + std::unique_ptr &&j1Strategy = {}, + std::unique_ptr &&k1Strategy = {}) + : inner_strategy_(std::move(innerStrategy)), j1_strategy_(std::move(j1Strategy)), + k1_strategy_(std::move(k1Strategy)) {} void set_strategy(std::unique_ptr &&strategy, - std::unique_ptr &&j1Strategy) { + std::unique_ptr &&j1Strategy, + std::unique_ptr &&K1Strategy) { inner_strategy_ = std::move(strategy); j1_strategy_ = std::move(j1Strategy); - } - void print_inner(const X_space &x, const X_space &y) const { - if (inner_strategy_) { - std::cout << "Context: Computing inner using the strategy (not sure how it'll do it)\n"; - auto result = inner_strategy_->compute_inner(x, y); - std::cout << result << "\n"; - } else { - std::cout << "Context: Strategy isn't set\n"; - } + k1_strategy_ = std::move(K1Strategy); } Tensor inner(const X_space &x, const X_space &y) const { if (inner_strategy_) { return inner_strategy_->compute_inner(x, y); } else { - throw madness::MadnessException("Inner product Stratgey isn't set", + throw madness::MadnessException("Inner product Strategy isn't set", "Need to set a strategy", 2, 455, "inner", "ResponseBase.hpp"); } @@ -135,7 +180,17 @@ class Context { if (j1_strategy_) { return j1_strategy_->compute_J1(world, x, rho1, phi0, coulomb_ops); } else { - throw madness::MadnessException("Compute J1 Stratgey isn't set", + throw madness::MadnessException("Compute J1 Strategy isn't set", + "Need to set a strategy", 2, 455, "inner", + "ResponseBase.hpp"); + } + } + + X_space compute_k1(World &world, const X_space &x, const vector_real_function_3d &phi0) const { + if (k1_strategy_) { + return k1_strategy_->compute_K1(world, x, phi0); + } else { + throw madness::MadnessException("Compute K1 Strategy isn't set", "Need to set a strategy", 2, 455, "inner", "ResponseBase.hpp"); } From e6e3d388a292e28058abbc05ee80a0c7f2cb8f30 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 16:50:13 -0400 Subject: [PATCH 1159/1312] w1 strategy --- .clang-tidy | 148 ++++++++++++ src/apps/molresponse/FrequencyResponse.hpp | 55 +++-- src/apps/molresponse/ResponseBase.cpp | 117 ++++++++- src/apps/molresponse/ResponseBase.hpp | 263 ++++++++++++++------- 4 files changed, 476 insertions(+), 107 deletions(-) create mode 100644 .clang-tidy diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 00000000000..d6370b7f304 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,148 @@ +# Generated from CLion Inspection settings +--- +Checks: '-*, +bugprone-argument-comment, +bugprone-assert-side-effect, +bugprone-bad-signal-to-kill-thread, +bugprone-branch-clone, +bugprone-copy-constructor-init, +bugprone-dangling-handle, +bugprone-dynamic-static-initializers, +bugprone-fold-init-type, +bugprone-forward-declaration-namespace, +bugprone-forwarding-reference-overload, +bugprone-inaccurate-erase, +bugprone-incorrect-roundings, +bugprone-integer-division, +bugprone-lambda-function-name, +bugprone-macro-parentheses, +bugprone-macro-repeated-side-effects, +bugprone-misplaced-operator-in-strlen-in-alloc, +bugprone-misplaced-pointer-arithmetic-in-alloc, +bugprone-misplaced-widening-cast, +bugprone-move-forwarding-reference, +bugprone-multiple-statement-macro, +bugprone-no-escape, +bugprone-not-null-terminated-result, +bugprone-parent-virtual-call, +bugprone-posix-return, +bugprone-reserved-identifier, +bugprone-sizeof-container, +bugprone-sizeof-expression, +bugprone-spuriously-wake-up-functions, +bugprone-string-constructor, +bugprone-string-integer-assignment, +bugprone-string-literal-with-embedded-nul, +bugprone-suspicious-enum-usage, +bugprone-suspicious-include, +bugprone-suspicious-memset-usage, +bugprone-suspicious-missing-comma, +bugprone-suspicious-semicolon, +bugprone-suspicious-string-compare, +bugprone-suspicious-memory-comparison, +bugprone-suspicious-realloc-usage, +bugprone-swapped-arguments, +bugprone-terminating-continue, +bugprone-throw-keyword-missing, +bugprone-too-small-loop-variable, +bugprone-undefined-memory-manipulation, +bugprone-undelegated-constructor, +bugprone-unhandled-self-assignment, +bugprone-unused-raii, +bugprone-unused-return-value, +bugprone-use-after-move, +bugprone-virtual-near-miss, +cert-dcl21-cpp, +cert-dcl58-cpp, +cert-err34-c, +cert-err52-cpp, +cert-err60-cpp, +cert-flp30-c, +cert-msc50-cpp, +cert-msc51-cpp, +cert-str34-c, +cppcoreguidelines-interfaces-global-init, +cppcoreguidelines-narrowing-conversions, +cppcoreguidelines-pro-type-member-init, +cppcoreguidelines-pro-type-static-cast-downcast, +cppcoreguidelines-slicing, +google-default-arguments, +google-explicit-constructor, +google-runtime-operator, +hicpp-exception-baseclass, +hicpp-multiway-paths-covered, +misc-misplaced-const, +misc-new-delete-overloads, +misc-no-recursion, +misc-non-copyable-objects, +misc-throw-by-value-catch-by-reference, +misc-unconventional-assign-operator, +misc-uniqueptr-reset-release, +modernize-avoid-bind, +modernize-concat-nested-namespaces, +modernize-deprecated-headers, +modernize-deprecated-ios-base-aliases, +modernize-loop-convert, +modernize-make-shared, +modernize-make-unique, +modernize-pass-by-value, +modernize-raw-string-literal, +modernize-redundant-void-arg, +modernize-replace-auto-ptr, +modernize-replace-disallow-copy-and-assign-macro, +modernize-replace-random-shuffle, +modernize-return-braced-init-list, +modernize-shrink-to-fit, +modernize-unary-static-assert, +modernize-use-auto, +modernize-use-bool-literals, +modernize-use-emplace, +modernize-use-equals-default, +modernize-use-equals-delete, +modernize-use-nodiscard, +modernize-use-noexcept, +modernize-use-nullptr, +modernize-use-override, +modernize-use-transparent-functors, +modernize-use-uncaught-exceptions, +mpi-buffer-deref, +mpi-type-mismatch, +openmp-use-default-none, +performance-faster-string-find, +performance-for-range-copy, +performance-implicit-conversion-in-loop, +performance-inefficient-algorithm, +performance-inefficient-string-concatenation, +performance-inefficient-vector-operation, +performance-move-const-arg, +performance-move-constructor-init, +performance-no-automatic-move, +performance-noexcept-move-constructor, +performance-trivially-destructible, +performance-type-promotion-in-math-fn, +performance-unnecessary-copy-initialization, +performance-unnecessary-value-param, +portability-simd-intrinsics, +readability-avoid-const-params-in-decls, +readability-const-return-type, +readability-container-size-empty, +readability-convert-member-functions-to-static, +readability-delete-null-pointer, +readability-deleted-default, +readability-inconsistent-declaration-parameter-name, +readability-make-member-function-const, +readability-misleading-indentation, +readability-misplaced-array-index, +readability-non-const-parameter, +readability-redundant-control-flow, +readability-redundant-declaration, +readability-redundant-function-ptr-dereference, +readability-redundant-smartptr-get, +readability-redundant-string-cstr, +readability-redundant-string-init, +readability-simplify-subscript-expr, +readability-static-accessed-through-instance, +readability-static-definition-in-anonymous-namespace, +readability-string-compare, +readability-uniqueptr-delete-release, +readability-use-anyofallof' \ No newline at end of file diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index f38e4cca113..ca0f5643143 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -12,7 +12,8 @@ class FrequencyResponse; using RHS_Generator = std::function; -response_space vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, +response_space vector_to_PQ(World &world, + const vector_real_function_3d &rhs_operators, const vector_real_function_3d &ground_orbitals); X_space nuclear_generator(World &world, FrequencyResponse &calc); X_space dipole_generator(World &world, FrequencyResponse &calc); @@ -21,16 +22,22 @@ X_space dipole_generator(World &world, FrequencyResponse &calc); class FrequencyResponse : public ResponseBase { public: - FrequencyResponse(World &world, const CalcParams ¶ms, double frequency, RHS_Generator rhs) - : ResponseBase(world, params), omega{frequency}, generator{std::move(rhs)}, PQ{} { + FrequencyResponse(World &world, const CalcParams ¶ms, double frequency, + RHS_Generator rhs) + : ResponseBase(world, params), omega{frequency}, + generator{std::move(rhs)}, PQ{} { if (omega == 0.0) { - response_context.set_strategy(std::make_unique(), - std::make_unique(), - std::make_unique()); + response_context.set_strategy( + std::make_unique(), + std::make_unique(), + std::make_unique(), + std::make_unique()); } else { - response_context.set_strategy(std::make_unique(), - std::make_unique(), - std::make_unique()); + response_context.set_strategy( + std::make_unique(), + std::make_unique(), + std::make_unique()), + std::make_unique()); } PQ = generator(world, *this); } @@ -50,22 +57,28 @@ class FrequencyResponse : public ResponseBase { private: double omega; void iterate(World &world) override; - X_space bsh_update_response(World &world, X_space &theta_X, vector &bsh_x_ops, - vector &bsh_y_ops, QProjector &projector, + X_space bsh_update_response(World &world, X_space &theta_X, + vector &bsh_x_ops, + vector &bsh_y_ops, + QProjector &projector, double &x_shifts); - static void frequency_to_json(json &j_mol_in, size_t iter, const Tensor &polar_ij, + static void frequency_to_json(json &j_mol_in, size_t iter, + const Tensor &polar_ij, const Tensor &res_polar_ij); - static void compute_and_print_polarizability(World &world, X_space &Chi, X_space &pq, + static void compute_and_print_polarizability(World &world, X_space &Chi, + X_space &pq, std::string message); void save(World &world, const std::string &name) override; - std::tuple - update_response(World &world, X_space &chi, XCOperator &xc, - std::vector &bsh_x_ops, std::vector &bsh_y_ops, - QProjector &projector, double &x_shifts, double &omega_n, - response_solver &kain_x_space, size_t iteration, const double &max_rotation, - const vector_real_function_3d &rho_old, const Tensor &old_residuals, - const X_space &xres_old); - X_space new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, + std::tuple update_response( + World &world, X_space &chi, XCOperator &xc, + std::vector &bsh_x_ops, + std::vector &bsh_y_ops, + QProjector &projector, double &x_shifts, double &omega_n, + response_solver &kain_x_space, size_t iteration, + const double &max_rotation, const vector_real_function_3d &rho_old, + const Tensor &old_residuals, const X_space &xres_old); + X_space new_kain_x_space_update(World &world, const X_space &x, + const X_space &fx, response_function_solver &rf_solver); }; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f41b0df388c..6d6668a020a 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -397,6 +397,115 @@ auto ResponseBase::make_bsh_operators_response(World &world, double &shift, // End timer } + +auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, + const XCOperator &xc) const -> X_space { + std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); + + auto [chi_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); + + QProjector projector(world, phi0); + size_t num_states = chi_alpha.num_states(); + size_t num_orbitals = chi_alpha.num_orbitals(); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + // x functions + // here I create the orbital products for elctron interaction terms + vecfuncT phi_phi; + vecfuncT x_phi; + vecfuncT y_phi; + + + X_space W = X_space::zero_functions(world, num_states, num_orbitals); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); + } + auto apply_projector = [&](auto &xi) { return projector(xi); }; + // apply the exchange kernel to rho if necessary + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + auto rho_b = make_density(world, chi_alpha); + auto J = response_context.compute_j1(world, chi_alpha, rho_b, phi0, shared_coulomb_operator); + + world.gop.fence(); + + inner_to_json(world, "j1", response_context.inner(chi_alpha, J), iter_function_data); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); + } + // Create Coulomb potential on ground_orbitals + if (xcf.hf_exchange_coefficient() != 1.0) { + auto rho = transition_density(world, phi0, chi_alpha.x, chi_alpha.x); + auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { + auto xc_rho = xc.apply_xc_kernel(rho_alpha); + return mul(world, xc_rho, phi0); + }; + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + std::transform(rho.begin(), rho.end(), W.x.begin(), compute_wx); + std::transform(W.x.begin(), W.x.end(), W.x.begin(), + [&](auto &wxi) { return projector(wxi); }); + W.y = W.x.copy(); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); + } + } + inner_to_json(world, "v1_xc", response_context.inner(chi_alpha, W), iter_function_data); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + // auto K = response_exchange_multiworld(phi0, chi_alpha, true); + auto K = response_context.compute_k1(world, chi_alpha, phi0); + //K = oop_apply(K, apply_projector); + + inner_to_json(world, "k1", response_context.inner(chi_alpha, K), iter_function_data); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); + } + if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } + molresponse::start_timer(world); + X_space gamma(world, num_states, num_orbitals); + auto c_xc = xcf.hf_exchange_coefficient(); + gamma = 2 * J - c_xc * K; + + if (xcf.hf_exchange_coefficient() != 1.0) { + gamma += (1.0 - c_xc) * W; + if (world.rank() == 0) { print("gamma: += W"); } + } + //gamma.truncate(); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma add", "gamma_truncate_add", iter_timing); + } + // project out ground state + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + + gamma = oop_apply(gamma, apply_projector); + + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); + } + if (r_params.print_level() >= 20) { + molresponse::start_timer(world); + print_inner(world, "xJx", chi_alpha, J); + print_inner(world, "xKx", chi_alpha, K); + print_inner(world, "xWx", chi_alpha, W); + print_inner(world, "xGammax", chi_alpha, gamma); + molresponse::end_timer(world, "Print Expectation Creating Gamma:"); + } + + molresponse::start_timer(world); + J.clear(); + K.clear(); + W.clear(); + chi_alpha.clear(); + phi0.clear(); + molresponse::end_timer(world, "Clear functions and set old pmap"); + if (world.size() > 1) { + FunctionDefaults<3>::set_pmap(old_pmap);// ! DON'T FORGET ! + } + return gamma; + // Get sizes +} + + + auto ResponseBase::compute_theta_X(World &world, const X_space &chi, const XCOperator &xc, const std::string &calc_type) const -> X_space { @@ -503,16 +612,10 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { - auto rho = transition_density(world, phi0, chi_alpha.x, chi_alpha.x); - auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { - auto xc_rho = xc.apply_xc_kernel(rho_alpha); - return mul(world, xc_rho, phi0); - }; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - std::transform(rho.begin(), rho.end(), W.x.begin(), compute_wx); + W= response_context.compute_v1_xc(world, chi_alpha, phi0, xc); std::transform(W.x.begin(), W.x.end(), W.x.begin(), [&](auto &wxi) { return projector(wxi); }); - W.y = W.x.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 2718056760a..22bc11a426c 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -23,22 +23,55 @@ using namespace madness; +class VXC1Strategy { +public: + virtual ~VXC1Strategy() = default; + virtual X_space compute_VXC1(World &world, const X_space &x, + const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0, + const XCOperator &xc) const = 0; +}; + +class VXC1StrategyStandard : public VXC1Strategy { + +public: + X_space compute_VXC1(World &world, const X_space &x, + const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0, + const XCOperator &xc) const override { + + X_space W = X_space::zero_functions(world, x.num_states(), + x.num_orbitals()); + + auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { + auto xc_rho = xc.apply_xc_kernel(rho_alpha); + return mul(world, xc_rho, phi0); + }; + std::transform(rho1.begin(), rho1.end(), W.x.begin(), compute_wx); + W.y = W.x.copy(); + return W; + } +}; + class J1Strategy { public: virtual ~J1Strategy() = default; - virtual X_space compute_J1(World &world, const X_space &x, const vector_real_function_3d &rho1, + virtual X_space compute_J1(World &world, const X_space &x, + const vector_real_function_3d &rho1, const vector_real_function_3d &phi0, const poperatorT &coulomb_ops) const = 0; }; class J1StrategyFull : public J1Strategy { public: - X_space compute_J1(World &world, const X_space &x, const vector_real_function_3d &rho1, + X_space compute_J1(World &world, const X_space &x, + const vector_real_function_3d &rho1, const vector_real_function_3d &phi0, const poperatorT &coulomb_ops) const override { - X_space J = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + X_space J = X_space::zero_functions(world, x.num_states(), + x.num_orbitals()); functionT temp_J; for (const auto &b: x.active) { temp_J = apply(*coulomb_ops, rho1[b]); @@ -53,11 +86,13 @@ class J1StrategyFull : public J1Strategy { class J1StrategyStable : public J1Strategy { public: - X_space compute_J1(World &world, const X_space &x, const vector_real_function_3d &rho1, + X_space compute_J1(World &world, const X_space &x, + const vector_real_function_3d &rho1, const vector_real_function_3d &phi0, const poperatorT &coulomb_ops) const override { - X_space J = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + X_space J = X_space::zero_functions(world, x.num_states(), + x.num_orbitals()); functionT temp_J; for (const auto &b: x.active) { temp_J = apply(*coulomb_ops, rho1[b]); @@ -89,7 +124,8 @@ class K1StrategyFull : public K1Strategy { X_space compute_K1(World &world, const X_space &x, const vector_real_function_3d &phi0) const override { - X_space K = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + X_space K = X_space::zero_functions(world, x.num_states(), + x.num_orbitals()); vector_real_function_3d k1x, k1y, k2x, k2y; for (const auto &b: x.active) { @@ -117,7 +153,8 @@ class K1StrategyStatic : public K1Strategy { public: X_space compute_K1(World &world, const X_space &x, const vector_real_function_3d &phi0) const override { - X_space K = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + X_space K = X_space::zero_functions(world, x.num_states(), + x.num_orbitals()); vector_real_function_3d k1x, k1y, k2x, k2y; vector_real_function_3d xb; vector_real_function_3d yb; @@ -141,7 +178,8 @@ class inner_strategy { public: virtual ~inner_strategy() = default; - virtual Tensor compute_inner(const X_space &x, const X_space &y) const = 0; + virtual Tensor compute_inner(const X_space &x, + const X_space &y) const = 0; }; class Context { @@ -150,69 +188,96 @@ class Context { std::unique_ptr inner_strategy_; std::unique_ptr j1_strategy_; std::unique_ptr k1_strategy_; + std::unique_ptr vxc1_strategy_; public: explicit Context(std::unique_ptr &&innerStrategy = {}, std::unique_ptr &&j1Strategy = {}, - std::unique_ptr &&k1Strategy = {}) - : inner_strategy_(std::move(innerStrategy)), j1_strategy_(std::move(j1Strategy)), - k1_strategy_(std::move(k1Strategy)) {} + std::unique_ptr &&k1Strategy = {}, + std::unique_ptr &&vxc1trategy = {}) + : inner_strategy_(std::move(innerStrategy)), + j1_strategy_(std::move(j1Strategy)), + k1_strategy_(std::move(k1Strategy)), + vxc1_strategy_(std::move(vxc1trategy)) {} void set_strategy(std::unique_ptr &&strategy, std::unique_ptr &&j1Strategy, - std::unique_ptr &&K1Strategy) { + std::unique_ptr &&K1Strategy, + std::unique_ptr &&vxc1Strategy) { inner_strategy_ = std::move(strategy); j1_strategy_ = std::move(j1Strategy); k1_strategy_ = std::move(K1Strategy); + vxc1_strategy_ = std::move(vxc1Strategy); } - Tensor inner(const X_space &x, const X_space &y) const { + [[nodiscard]] Tensor inner(const X_space &x, + const X_space &y) const { if (inner_strategy_) { return inner_strategy_->compute_inner(x, y); } else { throw madness::MadnessException("Inner product Strategy isn't set", - "Need to set a strategy", 2, 455, "inner", - "ResponseBase.hpp"); + "Need to set a strategy", 2, 455, + "inner", "ResponseBase.hpp"); } } - X_space compute_j1(World &world, const X_space &x, const vector_real_function_3d &rho1, - const vector_real_function_3d &phi0, const poperatorT &coulomb_ops) const { + X_space compute_j1(World &world, const X_space &x, + const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0, + const poperatorT &coulomb_ops) const { if (j1_strategy_) { return j1_strategy_->compute_J1(world, x, rho1, phi0, coulomb_ops); } else { throw madness::MadnessException("Compute J1 Strategy isn't set", - "Need to set a strategy", 2, 455, "inner", - "ResponseBase.hpp"); + "Need to set a strategy", 2, 455, + "inner", "ResponseBase.hpp"); } } - X_space compute_k1(World &world, const X_space &x, const vector_real_function_3d &phi0) const { + X_space compute_k1(World &world, const X_space &x, + const vector_real_function_3d &phi0) const { if (k1_strategy_) { return k1_strategy_->compute_K1(world, x, phi0); } else { throw madness::MadnessException("Compute K1 Strategy isn't set", - "Need to set a strategy", 2, 455, "inner", - "ResponseBase.hpp"); + "Need to set a strategy", 2, 455, + "inner", "ResponseBase.hpp"); + } + } + X_space compute_VXC1(World &world, const X_space &x, + const vector_real_function_3d &rho1, + const vector_real_function_3d &phi0, + const XCOperator &xc) const { + if (vxc1_strategy_) { + return vxc1_strategy_->compute_VXC1(world, x, rho1, phi0, xc); + } else { + throw madness::MadnessException("Compute VXC1 Strategy isn't set", + "Need to set a strategy", 2, 455, + "inner", "ResponseBase.hpp"); } } }; + class full_inner_product : public inner_strategy { public: - Tensor compute_inner(const X_space &x, const X_space &y) const override { + Tensor compute_inner(const X_space &x, + const X_space &y) const override { return inner(x, y); } }; class static_inner_product : public inner_strategy { public: - [[nodiscard]] Tensor compute_inner(const X_space &x, const X_space &y) const override { + [[nodiscard]] Tensor + compute_inner(const X_space &x, const X_space &y) const override { return response_space_inner(x.x, y.x); } }; -typedef std::vector> +typedef std::vector> response_solver; -typedef std::vector> +typedef std::vector< + XNonlinearSolver> response_function_solver; class response_timing { @@ -242,7 +307,8 @@ class response_data { void to_json(json &j); void add_data(std::map> values); - void add_convergence_targets(double p_thresh, double p_density_target, double p_bsh_target); + void add_convergence_targets(double p_thresh, double p_density_target, + double p_bsh_target); }; class ResponseTester; @@ -268,9 +334,13 @@ class ResponseBase { virtual void iterate(World &world) = 0; //virtual void iterate(); - auto get_parameter() const -> CalcParams { return {ground_calc, molecule, r_params}; } + auto get_parameter() const -> CalcParams { + return {ground_calc, molecule, r_params}; + } - auto get_orbitals() const -> vector_real_function_3d { return ground_orbitals; } + auto get_orbitals() const -> vector_real_function_3d { + return ground_orbitals; + } auto get_chi() const -> X_space { return Chi.copy(); }; @@ -297,12 +367,15 @@ class ResponseBase { std::shared_ptr potential_manager; // shared pointers to Operators - poperatorT shared_coulomb_operator;// shared pointer to seperated convolution operator + poperatorT + shared_coulomb_operator;// shared pointer to seperated convolution operator std::vector coul_ops; std::vector> gradop; // Stored functions - mutable real_function_3d stored_v_nuc; // Stored nuclear potential from ground state - mutable real_function_3d stored_v_coul;// Stored coulomb potential from ground state + mutable real_function_3d + stored_v_nuc;// Stored nuclear potential from ground state + mutable real_function_3d + stored_v_coul;// Stored coulomb potential from ground state // Ground state orbitals and energies vector_real_function_3d ground_orbitals{}; @@ -321,7 +394,8 @@ class ResponseBase { functionT ground_density;// ground state density - mutable response_space stored_potential;// The ground state potential, stored only + mutable response_space + stored_potential;// The ground state potential, stored only // if store_potential is true (default is double vtol{}; @@ -367,26 +441,28 @@ class ResponseBase { double safety = 0.1; vtol = FunctionDefaults<3>::get_thresh() * safety; - shared_coulomb_operator = poperatorT(CoulombOperatorPtr(world, r_params.lo(), thresh)); + shared_coulomb_operator = + poperatorT(CoulombOperatorPtr(world, r_params.lo(), thresh)); coul_ops.clear(); for (int i = 0; i < r_params.num_states(); i++) { - coul_ops.push_back(poperatorT( - CoulombOperatorPtr(world, r_params.lo(), FunctionDefaults<3>::get_thresh()))); + coul_ops.push_back(poperatorT(CoulombOperatorPtr( + world, r_params.lo(), FunctionDefaults<3>::get_thresh()))); } gradop = gradient_operator(world); potential_manager = std::make_shared(molecule, "a"); potential_manager->make_nuclear_potential(world); // GaussianConvolution1DCache::map.clear();//(TODO:molresponse-What // Create the masking function - mask = real_function_3d(real_factory_3d(world).f(mask3).initial_level(4).norefine()); + mask = real_function_3d( + real_factory_3d(world).f(mask3).initial_level(4).norefine()); ground_density = make_ground_density(world); ground_density.truncate(FunctionDefaults<3>::get_thresh()); // Basic print if (world.rank() == 0) { print("\nSolving NDIM=", 3, " with thresh", thresh, " k", - FunctionDefaults<3>::get_k(), " dconv", std::max(thresh, r_params.dconv()), - "\n"); + FunctionDefaults<3>::get_k(), " dconv", + std::max(thresh, r_params.dconv()), "\n"); } } @@ -394,7 +470,8 @@ class ResponseBase { auto make_ground_density(World &world) const -> functionT; - auto ComputeHamiltonianPair(World &world) const -> std::pair, Tensor>; + auto ComputeHamiltonianPair(World &world) const + -> std::pair, Tensor>; auto Coulomb(World &world) const -> real_function_3d; @@ -408,23 +485,27 @@ class ResponseBase { void load_balance_chi(World &world); - auto make_bsh_operators_response(World &world, double &shift, const double omega) const + auto make_bsh_operators_response(World &world, double &shift, + const double omega) const -> vector; - auto kain_x_space_update(World &world, const X_space &chi, const X_space &residual_chi, + auto kain_x_space_update(World &world, const X_space &chi, + const X_space &residual_chi, response_solver &kain_x_space) -> X_space; - void x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, - bool restrict_y, const double &max_bsh_rotation); + void x_space_step_restriction(World &world, const X_space &old_Chi, + X_space &temp, bool restrict_y, + const double &max_bsh_rotation); - void plotResponseOrbitals(World &world, size_t iteration, const response_space &x_response, + void plotResponseOrbitals(World &world, size_t iteration, + const response_space &x_response, const response_space &y_response, const ResponseParameters &responseParameters, const GroundStateCalculation &g_params); - static auto orbital_load_balance(World &world, const gamma_orbitals &, double load_balance) - -> gamma_orbitals; + static auto orbital_load_balance(World &world, const gamma_orbitals &, + double load_balance) -> gamma_orbitals; auto compute_gamma_tda(World &world, const gamma_orbitals &density, const XCOperator &xc) const -> X_space; @@ -435,39 +516,48 @@ class ResponseBase { auto compute_gamma_full(World &world, const gamma_orbitals &, const XCOperator &xc) const -> X_space; - auto compute_V0X(World &world, const X_space &X, const XCOperator &xc, - bool compute_Y) const -> X_space; + auto compute_V0X(World &world, const X_space &X, + const XCOperator &xc, bool compute_Y) const + -> X_space; - auto compute_lambda_X(World &world, const X_space &chi, XCOperator &xc, + auto compute_lambda_X(World &world, const X_space &chi, + XCOperator &xc, const std::string &calc_type) const -> X_space; - auto compute_theta_X(World &world, const X_space &chi, const XCOperator &xc, + auto compute_theta_X(World &world, const X_space &chi, + const XCOperator &xc, const std::string &calc_type) const -> X_space; - auto compute_F0X(World &world, const X_space &X, const XCOperator &xc, - bool compute_Y) const -> X_space; + auto compute_F0X(World &world, const X_space &X, + const XCOperator &xc, bool compute_Y) const + -> X_space; - void analyze_vectors(World &world, const vecfuncT &x, const std::string &response_state); + void analyze_vectors(World &world, const vecfuncT &x, + const std::string &response_state); - auto project_ao_basis(World &world, const AtomicBasisSet &aobasis) -> vecfuncT; + auto project_ao_basis(World &world, const AtomicBasisSet &aobasis) + -> vecfuncT; - static auto project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, + static auto project_ao_basis_only(World &world, + const AtomicBasisSet &aobasis, const Molecule &mol) -> vecfuncT; void converged_to_json(json &j); auto update_residual(World &world, const X_space &chi, const X_space &g_chi, - const std::string &calc_type, const Tensor &old_residuals, + const std::string &calc_type, + const Tensor &old_residuals, const X_space &xres_old) -> residuals; - auto compute_response_potentials(World &world, const X_space &chi, XCOperator &xc, + auto compute_response_potentials(World &world, const X_space &chi, + XCOperator &xc, const std::string &calc_type) const -> std::tuple; // compute exchange |i> - auto exchangeHF(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) const - -> vecfuncT { + auto exchangeHF(const vecfuncT &ket, const vecfuncT &bra, + const vecfuncT &vf) const -> vecfuncT { World &world = ket[0].world(); auto n = bra.size(); auto nf = ket.size(); @@ -487,7 +577,8 @@ class ResponseBase { // i-j sym for (int i = 0; i < n; ++i) { // for each |i> - vecfuncT psi_f = mul_sparse(world, bra[i], vf, mul_tol, true);/// was vtol + vecfuncT psi_f = + mul_sparse(world, bra[i], vf, mul_tol, true);/// was vtol truncate(world, psi_f, tol, true); // apply to vector of products .. ... psi_f = apply(world, *shared_coulomb_operator, psi_f); @@ -502,14 +593,17 @@ class ResponseBase { return Kf; } - static void print_inner(World &world, const std::string &name, const X_space &left, - const X_space &right); + static void print_inner(World &world, const std::string &name, + const X_space &left, const X_space &right); - void function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, - const Tensor &x_abs_norms, const Tensor &rho_norms, + void function_data_to_json(json &j_mol_in, size_t iter, + const Tensor &x_norms, + const Tensor &x_abs_norms, + const Tensor &rho_norms, const Tensor &rho_res_norms); X_space compute_TX(World &world, const X_space &X, bool compute_Y) const; - vecfuncT update_density(World &world, const X_space &chi, const vecfuncT &old_density) const; + vecfuncT update_density(World &world, const X_space &chi, + const vecfuncT &old_density) const; }; @@ -524,7 +618,8 @@ class ResponseBase { void check_k(World &world, X_space &Chi, double thresh, int k); -auto add_randomness(World &world, const response_space &f, double magnitude) -> response_space; +auto add_randomness(World &world, const response_space &f, double magnitude) + -> response_space; void normalize(World &world, response_space &f); @@ -536,7 +631,8 @@ static auto kronecker(size_t l, size_t n) -> double { return 0.0; } -auto solid_harmonics(World &world, int n) -> std::map, real_function_3d>; +auto solid_harmonics(World &world, int n) + -> std::map, real_function_3d>; /*** * @brief Prints the norms of the functions of a response space @@ -554,8 +650,8 @@ auto make_xyz_functions(World &world) -> vector_real_function_3d; // Selects from a list of functions and energies the k functions with the // lowest energy -auto select_functions(World &world, response_space f, Tensor &energies, size_t k, - size_t print_level) -> response_space; +auto select_functions(World &world, response_space f, Tensor &energies, + size_t k, size_t print_level) -> response_space; // Sorts the given tensor of eigenvalues and // response functions @@ -579,17 +675,22 @@ auto transition_density(World &world, const vector_real_function_3d &orbitals, const response_space &x, const response_space &y) -> vector_real_function_3d; -auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals, +auto transition_densityTDA(World &world, + const vector_real_function_3d &orbitals, const response_space &x) -> vector_real_function_3d; -auto transform(World &world, const response_space &f, const Tensor &U) -> response_space; +auto transform(World &world, const response_space &f, const Tensor &U) + -> response_space; -auto transform(World &world, const X_space &x, const Tensor &U) -> X_space; +auto transform(World &world, const X_space &x, const Tensor &U) + -> X_space; // result(i,j) = inner(a[i],b[j]).sum() -auto expectation(World &world, const response_space &A, const response_space &B) -> Tensor; +auto expectation(World &world, const response_space &A, const response_space &B) + -> Tensor; -void inner_to_json(World &world, const std::string &name, const Tensor &m_val, +void inner_to_json(World &world, const std::string &name, + const Tensor &m_val, std::map> &data); class ResponseTester { @@ -600,19 +701,23 @@ class ResponseTester { p->check_k(world, thresh, FunctionDefaults<3>::get_k()); } - static X_space compute_gamma_full(World &world, ResponseBase *p, double thresh) { + static X_space compute_gamma_full(World &world, ResponseBase *p, + double thresh) { XCOperator xc = p->make_xc_operator(world); - X_space gamma = p->compute_gamma_full(world, {p->Chi, p->ground_orbitals}, xc); + X_space gamma = + p->compute_gamma_full(world, {p->Chi, p->ground_orbitals}, xc); return gamma; } X_space compute_lambda_X(World &world, ResponseBase *p, double thresh) { XCOperator xc = p->make_xc_operator(world); - X_space gamma = p->compute_lambda_X(world, p->Chi, xc, p->r_params.calc_type()); + X_space gamma = + p->compute_lambda_X(world, p->Chi, xc, p->r_params.calc_type()); return gamma; } - std::pair compute_VFOX(World &world, ResponseBase *p, bool compute_y) { + std::pair compute_VFOX(World &world, ResponseBase *p, + bool compute_y) { XCOperator xc = p->make_xc_operator(world); X_space V = p->compute_V0X(world, p->Chi, xc, compute_y); X_space F = p->compute_F0X(world, p->Chi, xc, compute_y); From a2a9d2aaf01a27d3f835395a5f9ffc5913d57df4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 17:02:15 -0400 Subject: [PATCH 1160/1312] finish unified compute_gamma --- src/apps/molresponse/FrequencyResponse.hpp | 2 +- src/apps/molresponse/ResponseBase.cpp | 653 +++++++++++++-------- src/apps/molresponse/ResponseBase.hpp | 2 + 3 files changed, 409 insertions(+), 248 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index ca0f5643143..d688b9c6b7d 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -36,7 +36,7 @@ class FrequencyResponse : public ResponseBase { response_context.set_strategy( std::make_unique(), std::make_unique(), - std::make_unique()), + std::make_unique(), std::make_unique()); } PQ = generator(world, *this); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 6d6668a020a..02e82882100 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -29,7 +29,8 @@ /// \param params ResponseBase::ResponseBase(World &world, const CalcParams ¶ms) : r_params(params.response_parameters), molecule(params.molecule), - ground_calc(params.ground_calculation), ground_orbitals(ground_calc.orbitals()), + ground_calc(params.ground_calculation), + ground_orbitals(ground_calc.orbitals()), ground_energies(ground_calc.get_energies()), Chi(world, r_params.num_states(), r_params.num_orbitals()) { @@ -37,7 +38,8 @@ ResponseBase::ResponseBase(World &world, const CalcParams ¶ms) world.gop.broadcast_serializable(r_params, 0); world.gop.broadcast_serializable(ground_energies, 0); world.gop.broadcast_serializable(molecule, 0); - xcf.initialize(r_params.xc(), !r_params.spinrestricted(), world, r_params.print_level() >= 3); + xcf.initialize(r_params.xc(), !r_params.spinrestricted(), world, + r_params.print_level() >= 3); r_params.to_json(j_molresponse); // Set the Box Size and Truncate Mode @@ -66,12 +68,15 @@ void ResponseBase::check_k(World &world, double thresh, int k) { if (world.rank() == 0) { print("check k: read ground orbitals"); } // k value than what was previously computed reconstruct(world, ground_orbitals); - if (world.rank() == 0) { print("check k: reconstruct ground orbitals"); } + if (world.rank() == 0) { + print("check k: reconstruct ground orbitals"); + } // Reset correct k (its set in g_params.read) FunctionDefaults<3>::set_k(k); // Project each ground state to correct k for (auto &orbital: ground_orbitals) { - orbital = project(orbital, FunctionDefaults<3>::get_k(), thresh, false); + orbital = project(orbital, FunctionDefaults<3>::get_k(), thresh, + false); } world.gop.fence(); if (world.rank() == 0) { print("check k: project ground orbitals"); } @@ -103,15 +108,18 @@ void ResponseBase::check_k(World &world, double thresh, int k) { for (auto &potential_vector: stored_potential) { reconstruct(world, potential_vector); for (auto &vi: potential_vector) { - vi = project(vi, FunctionDefaults<3>::get_k(), thresh, false); + vi = project(vi, FunctionDefaults<3>::get_k(), thresh, + false); } world.gop.fence(); } } if (FunctionDefaults<3>::get_k() != stored_v_coul.k()) - stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), thresh, false); + stored_v_coul = project(stored_v_coul, FunctionDefaults<3>::get_k(), + thresh, false); if (FunctionDefaults<3>::get_k() != stored_v_nuc.k()) - stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), thresh, false); + stored_v_nuc = project(stored_v_nuc, FunctionDefaults<3>::get_k(), + thresh, false); } // project the mask if (FunctionDefaults<3>::get_k() != mask.k()) { @@ -161,9 +169,10 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const // Construct T according to above formula // Note: No negative as the formula above // has one as well, so they cancel - Tensor T = 1.0 / 2.0 * - (matrix_inner(world, fx, fx) + matrix_inner(world, fy, fy) + - matrix_inner(world, fz, fz)); + Tensor T = + 1.0 / 2.0 * + (matrix_inner(world, fx, fx) + matrix_inner(world, fy, fy) + + matrix_inner(world, fz, fz)); // Construct phiVphi // v_nuc first @@ -206,20 +215,23 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const for (const auto &phi_i: phi) { /// Multiplies a function against a vector of functions using sparsity of a /// and v[i] --- q[i] = a * v[i] - auto psif = mul_sparse(world, phi_i, phi, FunctionDefaults<3>::get_thresh()); + auto psif = mul_sparse(world, phi_i, phi, + FunctionDefaults<3>::get_thresh()); truncate(world, psif); psif = apply(world, *op, psif); truncate(world, psif); // Save the potential here if we are saving it if (r_params.store_potential()) { stored_potential.push_back(psif); } - psif = mul_sparse(world, phi_i, psif, FunctionDefaults<3>::get_thresh()); + psif = mul_sparse(world, phi_i, psif, + FunctionDefaults<3>::get_thresh()); gaxpy(world, 1.0, Kphi, 1.0, psif); } // Only use the exchange above if HF: Tensor phiVphi; if (r_params.xc() == "hf") { // Construct phiVphi - phiVphi = matrix_inner(world, phi, v_phi0) - matrix_inner(world, phi, Kphi); + phiVphi = matrix_inner(world, phi, v_phi0) - + matrix_inner(world, phi, Kphi); } else {// DFT XCOperator xcop = make_xc_operator(world); @@ -254,10 +266,12 @@ auto ResponseBase::ComputeHamiltonianPair(World &world) const // (T+phiVphi) - Lambda * eye // Copy new_hamiltonian and zero the diagonal auto new_hamiltonian_no_diag = copy(new_hamiltonian); - for (size_t i = 0; i < num_orbitals; i++) new_hamiltonian_no_diag(long(i), long(i)) = 0.0; + for (size_t i = 0; i < num_orbitals; i++) + new_hamiltonian_no_diag(long(i), long(i)) = 0.0; // End timer - if (r_params.print_level() >= 1) molresponse::end_timer(world, " Create grnd ham:"); + if (r_params.print_level() >= 1) + molresponse::end_timer(world, " Create grnd ham:"); return {new_hamiltonian, new_hamiltonian_no_diag}; } @@ -287,12 +301,14 @@ auto ResponseBase::Coulomb(World &world) const -> real_function_3d { // TODO Create apply_operator(f) generalized function in place of coulomb -auto ResponseBase::make_xc_operator(World &world) const -> XCOperator { +auto ResponseBase::make_xc_operator(World &world) const + -> XCOperator { return {world, r_params.xc(), false, ground_density, ground_density}; } auto ResponseBase::update_density(World &world, const X_space &chi, - const vecfuncT &old_density) const -> vecfuncT { + const vecfuncT &old_density) const + -> vecfuncT { auto density = copy(world, old_density); auto calc_type = r_params.calc_type(); auto thresh = FunctionDefaults<3>::get_thresh(); @@ -322,7 +338,8 @@ auto ResponseBase::update_density(World &world, const X_space &chi, return density; } -auto ResponseBase::make_density(World &world, const X_space &chi) const -> vecfuncT { +auto ResponseBase::make_density(World &world, const X_space &chi) const + -> vecfuncT { auto density = vector_real_function_3d(chi.num_states()); auto calc_type = r_params.calc_type(); auto thresh = FunctionDefaults<3>::get_thresh(); @@ -360,17 +377,22 @@ void ResponseBase::load_balance_chi(World &world) { real_function_3d v_nuclear; v_nuclear = potential_manager->vnuclear(); for (auto &b: Chi.active) { - for (auto &xij: Chi.x[b]) { lb.add_tree(xij, lbcost(1.0, 8.0), false); } + for (auto &xij: Chi.x[b]) { + lb.add_tree(xij, lbcost(1.0, 8.0), false); + } } if (r_params.omega() != 0) { for (auto &b: Chi.active) { - for (auto &yij: Chi.y[b]) { lb.add_tree(yij, lbcost(1.0, 8.0), false); } + for (auto &yij: Chi.y[b]) { + lb.add_tree(yij, lbcost(1.0, 8.0), false); + } } } world.gop.fence(); FunctionDefaults<3>::redistribute( world, - lb.load_balance(r_params.loadbalparts()));// 6.0 needs retuning after + lb.load_balance( + r_params.loadbalparts()));// 6.0 needs retuning after world.gop.fence(); molresponse::end_timer(world, "Load balancing"); } @@ -388,7 +410,8 @@ auto ResponseBase::make_bsh_operators_response(World &world, double &shift, int p = 0; std::for_each(ops.begin(), ops.end(), [&](auto &operator_p) { double mu = sqrt(-2.0 * (ground_energies(p++) + omega + shift)); - operator_p = poperatorT(BSHOperatorPtr3D(world, mu, r_params.lo(), tol)); + operator_p = + poperatorT(BSHOperatorPtr3D(world, mu, r_params.lo(), tol)); }); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "make bsh operators response"); @@ -399,79 +422,71 @@ auto ResponseBase::make_bsh_operators_response(World &world, double &shift, auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, - const XCOperator &xc) const -> X_space { - std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); - - auto [chi_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); + const XCOperator &xc) const + -> X_space { + std::shared_ptr>> old_pmap = + FunctionDefaults<3>::get_pmap(); + auto c_xc = xcf.hf_exchange_coefficient(); + auto [chi_alpha, phi0] = + orbital_load_balance(world, density, r_params.loadbalparts()); QProjector projector(world, phi0); - size_t num_states = chi_alpha.num_states(); - size_t num_orbitals = chi_alpha.num_orbitals(); - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // x functions - // here I create the orbital products for elctron interaction terms - vecfuncT phi_phi; - vecfuncT x_phi; - vecfuncT y_phi; + X_space W = X_space::zero_functions(world, chi_alpha.num_states(), + chi_alpha.num_orbitals()); - X_space W = X_space::zero_functions(world, num_states, num_orbitals); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); - } auto apply_projector = [&](auto &xi) { return projector(xi); }; // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto rho_b = make_density(world, chi_alpha); - auto J = response_context.compute_j1(world, chi_alpha, rho_b, phi0, shared_coulomb_operator); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "gamma_make_density"); + } - world.gop.fence(); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + auto J = response_context.compute_j1(world, chi_alpha, rho_b, phi0, + shared_coulomb_operator); - inner_to_json(world, "j1", response_context.inner(chi_alpha, J), iter_function_data); + world.gop.fence(); + inner_to_json(world, "j1", response_context.inner(chi_alpha, J), + iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } // Create Coulomb potential on ground_orbitals - if (xcf.hf_exchange_coefficient() != 1.0) { - auto rho = transition_density(world, phi0, chi_alpha.x, chi_alpha.x); - auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { - auto xc_rho = xc.apply_xc_kernel(rho_alpha); - return mul(world, xc_rho, phi0); - }; - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - std::transform(rho.begin(), rho.end(), W.x.begin(), compute_wx); - std::transform(W.x.begin(), W.x.end(), W.x.begin(), - [&](auto &wxi) { return projector(wxi); }); - W.y = W.x.copy(); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); - } - } - inner_to_json(world, "v1_xc", response_context.inner(chi_alpha, W), iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - // auto K = response_exchange_multiworld(phi0, chi_alpha, true); auto K = response_context.compute_k1(world, chi_alpha, phi0); - //K = oop_apply(K, apply_projector); - - inner_to_json(world, "k1", response_context.inner(chi_alpha, K), iter_function_data); + inner_to_json(world, "k1", response_context.inner(chi_alpha, K), + iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } - if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } + // auto K = response_exchange_multiworld(phi0, chi_alpha, true); + //K = oop_apply(K, apply_projector); + if (r_params.print_level() >= 20) { + print_inner(world, "old xKx", chi_alpha, K); + } molresponse::start_timer(world); - X_space gamma(world, num_states, num_orbitals); - auto c_xc = xcf.hf_exchange_coefficient(); + X_space gamma = X_space::zero_functions(world, chi_alpha.num_states(), + chi_alpha.num_orbitals()); gamma = 2 * J - c_xc * K; - if (xcf.hf_exchange_coefficient() != 1.0) { + if (c_xc != 1.0) { + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + W = response_context.compute_VXC1(world, chi_alpha, rho_b, phi0, xc); + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "XC[omega]", "XC[omega]", + iter_timing); + } + inner_to_json(world, "v1_xc", response_context.inner(chi_alpha, W), + iter_function_data); + gamma += (1.0 - c_xc) * W; - if (world.rank() == 0) { print("gamma: += W"); } } //gamma.truncate(); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma add", "gamma_truncate_add", iter_timing); + molresponse::end_timer(world, "gamma add", "gamma_truncate_add", + iter_timing); } // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -479,7 +494,8 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, gamma = oop_apply(gamma, apply_projector); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); + molresponse::end_timer(world, "gamma_project", "gamma_project", + iter_timing); } if (r_params.print_level() >= 20) { molresponse::start_timer(world); @@ -505,10 +521,10 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, } - auto ResponseBase::compute_theta_X(World &world, const X_space &chi, const XCOperator &xc, - const std::string &calc_type) const -> X_space { + const std::string &calc_type) const + -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } // std::cout << "MPI BARRIER 3 " << std::endl; @@ -519,7 +535,8 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, X_space V0X = compute_V0X(world, chi, xc, compute_Y); //V0X.truncate(); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); + molresponse::end_timer(world, "compute_V0X", "compute_V0X", + iter_timing); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", chi, V0X); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -532,55 +549,66 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, E0X.y = E0X.x.copy(); E0X.x.truncate_rf(); } - inner_to_json(world, "E0", response_context.inner(chi, E0X), iter_function_data); - if (r_params.print_level() >= 20) { print_inner(world, "xE0x", chi, E0X); } + inner_to_json(world, "E0", response_context.inner(chi, E0X), + iter_function_data); + if (r_params.print_level() >= 20) { + print_inner(world, "xE0x", chi, E0X); + } } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); + molresponse::end_timer(world, "compute_E0X", "compute_E0X", + iter_timing); } X_space gamma; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - if (calc_type == "full") { - // if (world.rank() == 0) { print("entering gamma"); } - // auto checkx = chi.norm2s(); - // if (world.rank() == 0) { print("checking x", checkx); } - - gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); - } else if (calc_type == "static") { - gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); + if (calc_type != "tda") { + gamma = compute_gamma(world, {chi, ground_orbitals}, xc); } else { gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); } + + if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_compute", "gamma_compute", iter_timing); + molresponse::end_timer(world, "gamma_compute", "gamma_compute", + iter_timing); } - inner_to_json(world, "gamma_x", response_context.inner(chi, gamma), iter_function_data); + inner_to_json(world, "gamma_x", response_context.inner(chi, gamma), + iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } Theta_X = (V0X - E0X) + gamma; - inner_to_json(world, "theta_x", response_context.inner(chi, Theta_X), iter_function_data); + inner_to_json(world, "theta_x", response_context.inner(chi, Theta_X), + iter_function_data); world.gop.fence(); // Theta_X.truncate(); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_ThetaX_add", "compute_ThetaX_add", iter_timing); + molresponse::end_timer(world, "compute_ThetaX_add", + "compute_ThetaX_add", iter_timing); + } + if (r_params.print_level() >= 20) { + print_inner(world, "xThetax", chi, Theta_X); } - if (r_params.print_level() >= 20) { print_inner(world, "xThetax", chi, Theta_X); } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", iter_timing); + molresponse::end_timer(world, "compute_ThetaX", "compute_ThetaX", + iter_timing); } return Theta_X; } -auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &density, - const XCOperator &xc) const -> X_space { - std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); +auto ResponseBase::compute_gamma_full(World &world, + const gamma_orbitals &density, + const XCOperator &xc) const + -> X_space { + std::shared_ptr>> old_pmap = + FunctionDefaults<3>::get_pmap(); - auto [chi_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); + auto [chi_alpha, phi0] = + orbital_load_balance(world, density, r_params.loadbalparts()); QProjector projector(world, phi0); size_t num_states = chi_alpha.num_states(); @@ -595,43 +623,46 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit X_space W = X_space::zero_functions(world, num_states, num_orbitals); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); + molresponse::end_timer(world, "gamma_zero_functions", + "gamma_zero_functions", iter_timing); } auto apply_projector = [&](auto &xi) { return projector(xi); }; // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto rho_b = make_density(world, chi_alpha); - auto J = response_context.compute_j1(world, chi_alpha, rho_b, phi0, shared_coulomb_operator); + auto J = response_context.compute_j1(world, chi_alpha, rho_b, phi0, + shared_coulomb_operator); world.gop.fence(); - inner_to_json(world, "j1", response_context.inner(chi_alpha, J), iter_function_data); + inner_to_json(world, "j1", response_context.inner(chi_alpha, J), + iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } // Create Coulomb potential on ground_orbitals if (xcf.hf_exchange_coefficient() != 1.0) { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - W= response_context.compute_v1_xc(world, chi_alpha, phi0, xc); - std::transform(W.x.begin(), W.x.end(), W.x.begin(), - [&](auto &wxi) { return projector(wxi); }); + W = response_context.compute_VXC1(world, chi_alpha, rho_b, phi0, xc); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); + molresponse::end_timer(world, "XC[omega]", "XC[omega]", + iter_timing); } } - inner_to_json(world, "v1_xc", response_context.inner(chi_alpha, W), iter_function_data); - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + inner_to_json(world, "v1_xc", response_context.inner(chi_alpha, W), + iter_function_data); - // auto K = response_exchange_multiworld(phi0, chi_alpha, true); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto K = response_context.compute_k1(world, chi_alpha, phi0); - //K = oop_apply(K, apply_projector); - - inner_to_json(world, "k1", response_context.inner(chi_alpha, K), iter_function_data); + inner_to_json(world, "k1", response_context.inner(chi_alpha, K), + iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } - if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } + if (r_params.print_level() >= 20) { + print_inner(world, "old xKx", chi_alpha, K); + } molresponse::start_timer(world); X_space gamma(world, num_states, num_orbitals); auto c_xc = xcf.hf_exchange_coefficient(); @@ -643,7 +674,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } //gamma.truncate(); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma add", "gamma_truncate_add", iter_timing); + molresponse::end_timer(world, "gamma add", "gamma_truncate_add", + iter_timing); } // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -651,7 +683,8 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit gamma = oop_apply(gamma, apply_projector); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); + molresponse::end_timer(world, "gamma_project", "gamma_project", + iter_timing); } if (r_params.print_level() >= 20) { molresponse::start_timer(world); @@ -677,11 +710,14 @@ auto ResponseBase::compute_gamma_full(World &world, const gamma_orbitals &densit } -auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gammaOrbitals, - const XCOperator &xc) const -> X_space { +auto ResponseBase::compute_gamma_static(World &world, + const gamma_orbitals &gammaOrbitals, + const XCOperator &xc) const + -> X_space { auto old_pmap = FunctionDefaults<3>::get_pmap(); - auto [xy, phi0] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); + auto [xy, phi0] = + orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); QProjector projector(world, phi0); size_t num_states = xy.num_states(); size_t num_orbitals = xy.num_orbitals(); @@ -697,25 +733,30 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm X_space KX = X_space::zero_functions(world, num_states, num_orbitals); X_space KY = X_space::zero_functions(world, num_states, num_orbitals); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); + molresponse::end_timer(world, "gamma_zero_functions", + "gamma_zero_functions", iter_timing); } // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto rho = make_density(world, xy); - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute density J[omega]"); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "compute density J[omega]"); + } int b = 0; for (const auto &rho_b: rho) { auto temp_J = apply(*shared_coulomb_operator, rho_b); J.x[b++] = mul(world, temp_J, phi0); } - std::transform(J.x.begin(), J.x.end(), J.x.begin(), [&](auto &jxi) { return projector(jxi); }); + std::transform(J.x.begin(), J.x.end(), J.x.begin(), + [&](auto &jxi) { return projector(jxi); }); J.y = J.x.copy(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[omega]", "J[omega]", iter_timing); } - inner_to_json(world, "j1", response_context.inner(xy, J), iter_function_data); + inner_to_json(world, "j1", response_context.inner(xy, J), + iter_function_data); if (xcf.hf_exchange_coefficient() != 1.0) { auto compute_wx = [&, &phi0 = phi0](auto rho_alpha) { auto xc_rho = xc.apply_xc_kernel(rho_alpha); @@ -727,23 +768,31 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm [&](auto &wxi) { return projector(wxi); }); W.y = W.x.copy(); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); + molresponse::end_timer(world, "XC[omega]", "XC[omega]", + iter_timing); } } - inner_to_json(world, "v1_xc", response_context.inner(xy, W), iter_function_data); + inner_to_json(world, "v1_xc", response_context.inner(xy, W), + iter_function_data); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K = response_exchange_multiworld(phi0, xy, false); - std::transform(K.x.begin(), K.x.end(), K.x.begin(), [&](auto &kxi) { return projector(kxi); }); - inner_to_json(world, "k1", response_context.inner(xy, K), iter_function_data); + std::transform(K.x.begin(), K.x.end(), K.x.begin(), + [&](auto &kxi) { return projector(kxi); }); + inner_to_json(world, "k1", response_context.inner(xy, K), + iter_function_data); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } - if (r_params.print_level() >= 20) { print_inner(world, "new static KX", xy, K); } + if (r_params.print_level() >= 20) { + print_inner(world, "new static KX", xy, K); + } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } gamma = 2 * J - K * xcf.hf_exchange_coefficient() + W; - inner_to_json(world, "gamma_x_beforeQ", response_context.inner(xy, gamma), iter_function_data); + inner_to_json(world, "gamma_x_beforeQ", response_context.inner(xy, gamma), + iter_function_data); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); + molresponse::end_timer(world, "gamma_truncate_add", + "gamma_truncate_add", iter_timing); } // project out ground state if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -753,7 +802,8 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm gamma.y = gamma.x.copy(); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); + molresponse::end_timer(world, "gamma_project", "gamma_project", + iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -768,18 +818,22 @@ auto ResponseBase::compute_gamma_static(World &world, const gamma_orbitals &gamm } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_clear_functions", "gamma_clear_functions", - iter_timing); + molresponse::end_timer(world, "gamma_clear_functions", + "gamma_clear_functions", iter_timing); } // Done return gamma; // Get sizes } -auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density, - const XCOperator &xc) const -> X_space { - auto [d_alpha, phi0] = orbital_load_balance(world, density, r_params.loadbalparts()); - std::shared_ptr>> oldpmap = FunctionDefaults<3>::get_pmap(); +auto ResponseBase::compute_gamma_tda(World &world, + const gamma_orbitals &density, + const XCOperator &xc) const + -> X_space { + auto [d_alpha, phi0] = + orbital_load_balance(world, density, r_params.loadbalparts()); + std::shared_ptr>> oldpmap = + FunctionDefaults<3>::get_pmap(); size_t num_states = d_alpha.num_states(); size_t num_orbitals = d_alpha.num_orbitals(); @@ -792,7 +846,8 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density response_space k1_x(world, num_states, num_orbitals); response_space W(world, num_states, num_orbitals); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_zero_functions", "gamma_zero_functions", iter_timing); + molresponse::end_timer(world, "gamma_zero_functions", + "gamma_zero_functions", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -823,7 +878,8 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density W = W.copy(); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); + molresponse::end_timer(world, "XC[omega]", "XC[omega]", + iter_timing); } } @@ -846,7 +902,8 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density gamma.x = (J * 2) - k1_x * xcf.hf_exchange_coefficient() + W; if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_truncate_add", "gamma_truncate_add", iter_timing); + molresponse::end_timer(world, "gamma_truncate_add", + "gamma_truncate_add", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -856,11 +913,13 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density truncate(world, gamma.x[i]); } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_project", "gamma_project", iter_timing); + molresponse::end_timer(world, "gamma_project", "gamma_project", + iter_timing); } if (r_params.print_level() >= 20) { - print("------------------------ Gamma Functions Norms ------------------"); + print("------------------------ Gamma Functions Norms " + "------------------"); print("Gamma X norms"); print(gamma.x.norm2()); } @@ -879,16 +938,18 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "gamma_clear_functions", "gamma_clear_functions", - iter_timing); + molresponse::end_timer(world, "gamma_clear_functions", + "gamma_clear_functions", iter_timing); } // Done world.gop.fence(); return gamma; } -auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator &xc, - const std::string &calc_type) const -> X_space { +auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, + XCOperator &xc, + const std::string &calc_type) const + -> X_space { // compute bool compute_Y = calc_type == "full"; @@ -941,9 +1002,9 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, XCOperator return Lambda_X; } -auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, - XCOperator &xc, - const std::string &calc_type) const +auto ResponseBase::compute_response_potentials( + World &world, const X_space &chi, XCOperator &xc, + const std::string &calc_type) const -> std::tuple { // compute bool compute_Y = calc_type == "full"; @@ -985,7 +1046,9 @@ auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); } - X_space Lambda_X(world, m, n);// = X_space(world, chi.num_states(), chi.num_orbitals()); + X_space Lambda_X( + world, m, + n);// = X_space(world, chi.num_states(), chi.num_orbitals()); Lambda_X = (T0X + V0X - E0X) + gamma; @@ -998,7 +1061,8 @@ auto ResponseBase::compute_response_potentials(World &world, const X_space &chi, // J0=J[ground_density] // K0=K[ground_density]f // EXC0=W[ground_density] -auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator &xc, +auto ResponseBase::compute_V0X(World &world, const X_space &X, + const XCOperator &xc, bool compute_Y) const -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -1034,7 +1098,9 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } else {// Already pre-computed v_j0 = stored_v_coul; } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "J[0]", "J[0]", iter_timing); } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "J[0]", "J[0]", iter_timing); + } if (xcf.hf_exchange_coefficient() != 1.0) { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -1044,7 +1110,9 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< } } else { // make a zero function - v_xc = Function(FunctionFactory(world).fence(false).initial_level(1)); + v_xc = Function( + FunctionFactory(world).fence(false).initial_level( + 1)); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } K0 = ground_exchange_multiworld(ground_orbitals, X, compute_Y); @@ -1059,12 +1127,18 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< if (r_params.print_level() >= 15) { - inner_to_json(world, "v0_nuc", response_context.inner(X, v_nuc * X), iter_function_data); - inner_to_json(world, "j0", response_context.inner(X, v_j0 * X), iter_function_data); - inner_to_json(world, "k0", response_context.inner(X, K0), iter_function_data); - inner_to_json(world, "v0_xc", response_context.inner(X, v_xc * X), iter_function_data); + inner_to_json(world, "v0_nuc", response_context.inner(X, v_nuc * X), + iter_function_data); + inner_to_json(world, "j0", response_context.inner(X, v_j0 * X), + iter_function_data); + inner_to_json(world, "k0", response_context.inner(X, K0), + iter_function_data); + inner_to_json(world, "v0_xc", response_context.inner(X, v_xc * X), + iter_function_data); + } + if (r_params.print_level() >= 1) { + molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } - if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[0]", "K[0]", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } @@ -1076,14 +1150,16 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< V0 = X * v0; V0 += -c_xc * K0; V0.truncate(); - inner_to_json(world, "v0", response_context.inner(X, V0), iter_function_data); + inner_to_json(world, "v0", response_context.inner(X, V0), + iter_function_data); } else { V0 = X.copy(); V0.x = v0 * V0.x; V0.x += -c_xc * K0.x; V0.x.truncate_rf(); V0.y = V0.x.copy(); - inner_to_json(world, "v0", response_context.inner(X, V0), iter_function_data); + inner_to_json(world, "v0", response_context.inner(X, V0), + iter_function_data); } if (r_params.print_level() >= 20) { print_inner(world, "xV0x", X, V0); } if (r_params.print_level() >= 1) { @@ -1092,7 +1168,8 @@ auto ResponseBase::compute_V0X(World &world, const X_space &X, const XCOperator< return V0; } -auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) const -> X_space { +auto ResponseBase::compute_TX(World &world, const X_space &x, + bool compute_Y) const -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space T0X = X_space(world, x.num_states(), x.num_orbitals()); @@ -1142,7 +1219,8 @@ auto ResponseBase::compute_TX(World &world, const X_space &x, bool compute_Y) co return T0X; } // Returns the ground state fock operator applied to functions f -auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator &xc, +auto ResponseBase::compute_F0X(World &world, const X_space &X, + const XCOperator &xc, bool compute_Y) const -> X_space { // Debugging output @@ -1193,10 +1271,11 @@ auto ResponseBase::compute_F0X(World &world, const X_space &X, const XCOperator< return F0X; } -auto ResponseBase::update_residual(World &world, const X_space &chi, const X_space &g_chi, +auto ResponseBase::update_residual(World &world, const X_space &chi, + const X_space &g_chi, const std::string &calc_type, - const Tensor &old_residuals, const X_space &xres_old) - -> residuals { + const Tensor &old_residuals, + const X_space &xres_old) -> residuals { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.x.size(); size_t n = chi.x.size_orbitals(); @@ -1215,18 +1294,21 @@ auto ResponseBase::update_residual(World &world, const X_space &chi, const X_spa } else { res.x = chi.x - g_chi.x; for (const auto &b: chi.active) { - residual_norms(b) = norm2(world, res.x[b]) / norm2(world, g_chi.x[b]); + residual_norms(b) = + norm2(world, res.x[b]) / norm2(world, g_chi.x[b]); } } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "compute_bsh_residual", "compute_bsh_residual", iter_timing); + molresponse::end_timer(world, "compute_bsh_residual", + "compute_bsh_residual", iter_timing); } // Next calculate 2-norm of these vectors of differences return {res, residual_norms}; } auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, - const X_space &residual_chi, response_solver &kain_x_space) + const X_space &residual_chi, + response_solver &kain_x_space) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = chi.num_states(); @@ -1245,18 +1327,22 @@ auto ResponseBase::kain_x_space_update(World &world, const X_space &chi, }; } else { for (const auto &i: Chi.active) { - kain_update.x[i] = kain_x_space[i].update(chi.x[i], residual_chi.x[i]); + kain_update.x[i] = + kain_x_space[i].update(chi.x[i], residual_chi.x[i]); } } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); + molresponse::end_timer(world, "kain_x_update", "kain_x_update", + iter_timing); } return kain_update; } -void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi, X_space &temp, - bool restrict_y, const double &max_bsh_rotation) { +void ResponseBase::x_space_step_restriction(World &world, + const X_space &old_Chi, + X_space &temp, bool restrict_y, + const double &max_bsh_rotation) { size_t m = old_Chi.num_states(); size_t n = old_Chi.num_orbitals(); @@ -1275,17 +1361,21 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi auto norm_xb = norm2(world, m_old[b]); auto max_step = max_bsh_rotation;//norm;//* norm_xb; if (world.rank() == 0) { - print("---------------- step restriction :", b, " ------------------"); + print("---------------- step restriction :", b, + " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } if (world.rank() == 0) { print("deltaX[b]: ", step_size); } - if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } + if (world.rank() == 0) { + print("max_step = max_rotation*norm_X: ", max_step); + } } if (step_size > max_step && step_size < 25) { // and if the step size is less thant 10% the vector norm double s = .80 * max_step / step_size; if (world.rank() == 0) { if (r_params.print_level() > 1) - print(" restricting step for response-state: ", b, " step size", s); + print(" restricting step for response-state: ", b, + " step size", s); } gaxpy(world, s, m_new[b], (1.0 - s), m_old[b], false); } @@ -1297,34 +1387,42 @@ void ResponseBase::x_space_step_restriction(World &world, const X_space &old_Chi auto norm_xb = norm2(world, old_Chi.x[b]); auto max_step = max_bsh_rotation;//norm;//* norm_xb; if (world.rank() == 0) { - print("---------------- step restriction :", b, " ------------------"); + print("---------------- step restriction :", b, + " ------------------"); if (world.rank() == 0) { print("X[b]: ", norm_xb); } if (world.rank() == 0) { print("deltaX[b]: ", step_size); } - if (world.rank() == 0) { print("max_step = max_rotation*norm_X: ", max_step); } + if (world.rank() == 0) { + print("max_step = max_rotation*norm_X: ", max_step); + } } - if (step_size > max_step && step_size < 10000 * FunctionDefaults<3>::get_thresh()) { + if (step_size > max_step && + step_size < 10000 * FunctionDefaults<3>::get_thresh()) { // and if the step size is less thant 10% the vector norm double s = .80 * max_step / step_size; if (world.rank() == 0) { if (r_params.print_level() > 1) - print(" restricting step for response-state: ", b, " step size", s); + print(" restricting step for response-state: ", b, + " step size", s); } gaxpy(world, s, temp.x[b], (1.0 - s), old_Chi.x[b], false); } } } - if (world.rank() == 0) { print("----------------End Step Restriction -----------------"); } + if (world.rank() == 0) { + print("----------------End Step Restriction -----------------"); + } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "x_space_restriction", "x_space_restriction", iter_timing); + molresponse::end_timer(world, "x_space_restriction", + "x_space_restriction", iter_timing); } } -void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, - const response_space &x_response, - const response_space &y_response, - ResponseParameters const &responseParameters, - GroundStateCalculation const &g_params) { +void ResponseBase::plotResponseOrbitals( + World &world, size_t iteration, const response_space &x_response, + const response_space &y_response, + ResponseParameters const &responseParameters, + GroundStateCalculation const &g_params) { std::filesystem::create_directories("plots/densities"); std::filesystem::create_directory("plots/orbitals"); @@ -1348,7 +1446,8 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, plotCoords plt(d, Lp); // plot ground density if (iteration == 1) { - snprintf(plot_name, buffSize, "plots/densities/rho0_%c_0.plt", dir[d]); + snprintf(plot_name, buffSize, "plots/densities/rho0_%c_0.plt", + dir[d]); plot_line(plot_name, 5001, plt.lo, plt.hi, rho0); } // plot ground orbitals and transition densities in xyz directions @@ -1359,11 +1458,11 @@ void ResponseBase::plotResponseOrbitals(World &world, size_t iteration, for (int b = 0; b < static_cast(m); b++) { // plot x and y transition orbitals - snprintf(plot_name, buffSize, "plots/orbitals/phix_%c_%d.plt", dir[d], - static_cast(b)); + snprintf(plot_name, buffSize, "plots/orbitals/phix_%c_%d.plt", + dir[d], static_cast(b)); plot_line(plot_name, 5001, plt.lo, plt.hi, x_response[b]); - snprintf(plot_name, buffSize, "plots/orbitals/phiy_%c_%d.plt", dir[d], - static_cast(b)); + snprintf(plot_name, buffSize, "plots/orbitals/phiy_%c_%d.plt", + dir[d], static_cast(b)); plot_line(plot_name, 5001, plt.lo, plt.hi, y_response[b]); } } @@ -1380,12 +1479,12 @@ void PlotGroundDensityVTK(World &world, const ResponseBase &calc) { if (world.rank() == 0) print("\n Plotting ground state densities.\n"); if (r_params.plot_l() > 0.0) do_vtk_plots(world, int(r_params.plot_pts()), r_params.plot_l(), 0, - int(r_params.num_orbitals()), molecule, square(world, ground_orbitals), - "ground"); + int(r_params.num_orbitals()), molecule, + square(world, ground_orbitals), "ground"); else do_vtk_plots(world, int(r_params.plot_pts()), r_params.L() / 2.0, 0, - int(r_params.num_orbitals()), molecule, square(world, ground_orbitals), - "ground"); + int(r_params.num_orbitals()), molecule, + square(world, ground_orbitals), "ground"); } } @@ -1402,7 +1501,8 @@ void protocol_to_json(json &j, const double proto) { j["protocol_data"][proto_index]["iter_data"] = {}; } -void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, const Tensor &x_norms, +void ResponseBase::function_data_to_json(json &j_mol_in, size_t iter, + const Tensor &x_norms, const Tensor &x_abs_norms, const Tensor &rho_norms, const Tensor &rho_abs_norms) { @@ -1450,11 +1550,15 @@ void ResponseBase::solve(World &world) { if (world.rank() == 0) { print("Successfully initialized "); } } check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); - if (world.rank() == 0) { print("Successfully check K first initialization "); } + if (world.rank() == 0) { + print("Successfully check K first initialization "); + } first_protocol = false; } else { check_k(world, iter_thresh, FunctionDefaults<3>::get_k()); - if (world.rank() == 0) { print("Successfully check K not first initialization "); } + if (world.rank() == 0) { + print("Successfully check K not first initialization "); + } } protocol_to_json(j_molresponse, iter_thresh); // Now actually ready to iterate... @@ -1464,18 +1568,20 @@ void ResponseBase::solve(World &world) { converged_to_json(j_molresponse); if (r_params.plot()) { auto r_matrix = to_response_matrix(Chi); - do_response_orbital_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, - ground_orbitals, r_matrix); + do_response_orbital_vtk_plots(world, r_params.plot_pts(), r_params.L(), + molecule, ground_orbitals, r_matrix); auto response_densities = make_density(world, Chi); - do_response_density_vtk_plots(world, r_params.plot_pts(), r_params.L(), molecule, - ground_density, response_densities); + do_response_density_vtk_plots(world, r_params.plot_pts(), r_params.L(), + molecule, ground_density, + response_densities); } // Plot the response function if desired } -void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::get_thresh(), +void check_k(World &world, X_space &Chi, + double thresh = FunctionDefaults<3>::get_thresh(), int k = FunctionDefaults<3>::get_k()) { if (0 != Chi.x.size()) { if (FunctionDefaults<3>::get_k() != Chi.x[0].at(0).k()) { @@ -1484,14 +1590,16 @@ void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::ge for (auto &xi: Chi.x) { reconstruct(world, xi); for (auto &xij: xi) { - xij = project(xij, FunctionDefaults<3>::get_k(), thresh, false); + xij = project(xij, FunctionDefaults<3>::get_k(), thresh, + false); } world.gop.fence(); } for (auto &yi: Chi.y) { reconstruct(world, yi); for (auto &yij: yi) { - yij = project(yij, FunctionDefaults<3>::get_k(), thresh, false); + yij = project(yij, FunctionDefaults<3>::get_k(), thresh, + false); } world.gop.fence(); } @@ -1508,7 +1616,8 @@ void check_k(World &world, X_space &Chi, double thresh = FunctionDefaults<3>::ge /// \param f /// \param magnitude /// \return -auto add_randomness(World &world, const response_space &f, double magnitude) -> response_space { +auto add_randomness(World &world, const response_space &f, double magnitude) + -> response_space { // Copy input functions response_space f_copy = f.copy(); @@ -1570,7 +1679,8 @@ void normalize(World &world, X_space &Chi) { } } -auto solid_harmonics(World &world, int n) -> std::map, real_function_3d> { +auto solid_harmonics(World &world, int n) + -> std::map, real_function_3d> { // Container to return std::map, real_function_3d> result; @@ -1635,8 +1745,9 @@ auto solid_harmonics(World &world, int n) -> std::map, real_fun } -vector_real_function_3d transition_density(World &world, const vector_real_function_3d &orbitals, - const response_space &x, const response_space &y) { +vector_real_function_3d +transition_density(World &world, const vector_real_function_3d &orbitals, + const response_space &x, const response_space &y) { // Get sizes // Check sizes and then run the algorithm //size_t m = x.size(); @@ -1648,11 +1759,13 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct //xx.truncate_rf(); // yy.truncate_rf(); //truncate(world, phi0); - std::vector densities = zero_functions(world, x.size(), true); + std::vector densities = + zero_functions(world, x.size(), true); // Return container - auto compute_density = [&world, &orbitals](const auto &x_alpha, const auto &y_alpha) { + auto compute_density = [&world, &orbitals](const auto &x_alpha, + const auto &y_alpha) { /* for (const auto &xij: x_alpha) { print("xij !!", xij.max_depth(), " ", (void *) xij.get_impl().get()); @@ -1672,7 +1785,8 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct print("phi_i !!", phi_i.max_depth(), " ", (void *) phi_i.get_impl().get()); } */ - std::transform(x.begin(), x.end(), y.begin(), densities.begin(), compute_density); + std::transform(x.begin(), x.end(), y.begin(), densities.begin(), + compute_density); world.gop.fence(); //truncate(world, densities, FunctionDefaults<3>::get_thresh(), true); return densities; @@ -1687,8 +1801,10 @@ vector_real_function_3d transition_density(World &world, const vector_real_funct * @param load_balance * @return */ -auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &gammaOrbitals, - const double load_balance) -> gamma_orbitals { +auto ResponseBase::orbital_load_balance(World &world, + const gamma_orbitals &gammaOrbitals, + const double load_balance) + -> gamma_orbitals { auto X = std::get<0>(gammaOrbitals); auto psi0 = std::get<1>(gammaOrbitals); @@ -1699,12 +1815,18 @@ auto ResponseBase::orbital_load_balance(World &world, const gamma_orbitals &gamm molresponse::start_timer(world); LoadBalanceDeux<3> lb(world); - for (const auto &phi0_i: psi0) { lb.add_tree(phi0_i, lbcost(1.0, 8.0), false); } + for (const auto &phi0_i: psi0) { + lb.add_tree(phi0_i, lbcost(1.0, 8.0), false); + } for (const auto &xi: X.x) { - for (const auto &xij: xi) { lb.add_tree(xij, lbcost(1.0, 8.0), false); } + for (const auto &xij: xi) { + lb.add_tree(xij, lbcost(1.0, 8.0), false); + } } for (const auto &yi: X.y) { - for (const auto &yij: yi) { lb.add_tree(yij, lbcost(1.0, 8.0), false); } + for (const auto &yij: yi) { + lb.add_tree(yij, lbcost(1.0, 8.0), false); + } } world.gop.fence(); // newpamap is the new pmap just based on the orbitals @@ -1742,12 +1864,14 @@ void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, rsq = inner(world, x, mul_sparse(world, frsq, x, vtol)); for (int axis = 0; axis < 3; ++axis) { // x y z - functionT fdip = factoryT(world) - .functor(functorT(new madness::DipoleFunctor(axis))) - .initial_level(4); + functionT fdip = + factoryT(world) + .functor(functorT(new madness::DipoleFunctor(axis))) + .initial_level(4); dip(axis, _) = inner(world, x, mul_sparse(world, fdip, x, vtol)); // - ^2-^2-^2 - for (int i = 0; i < nmo1; ++i) rsq(i) -= dip(axis, i) * dip(axis, i); + for (int i = 0; i < nmo1; ++i) + rsq(i) -= dip(axis, i) * dip(axis, i); } } molresponse::end_timer(world, "Analyze vectors"); @@ -1762,20 +1886,26 @@ void ResponseBase::analyze_vectors(World &world, const vecfuncT &x, printf("ncoeff=%.2e:", (double) ncoeffi); - printf("center=(%.2f,%.2f,%.2f) : radius=%.2f\n", dip(0, i), dip(1, i), dip(2, i), - sqrt(rsq(i))); + printf("center=(%.2f,%.2f,%.2f) : radius=%.2f\n", dip(0, i), + dip(1, i), dip(2, i), sqrt(rsq(i))); sto3g.print_anal(molecule, C(i, _)); printf("total number of coefficients = %.8e\n\n", double(ncoeff)); } } } -auto ResponseBase::project_ao_basis_only(World &world, const AtomicBasisSet &aobasis, +auto ResponseBase::project_ao_basis_only(World &world, + const AtomicBasisSet &aobasis, const Molecule &mol) -> vecfuncT { vecfuncT ao = vecfuncT(aobasis.nbf(mol)); for (int i = 0; i < aobasis.nbf(mol); ++i) { - functorT aofunc(new madchem::AtomicBasisFunctor(aobasis.get_atomic_basis_function(mol, i))); - ao[i] = factoryT(world).functor(aofunc).truncate_on_project().nofence().truncate_mode(1); + functorT aofunc(new madchem::AtomicBasisFunctor( + aobasis.get_atomic_basis_function(mol, i))); + ao[i] = factoryT(world) + .functor(aofunc) + .truncate_on_project() + .nofence() + .truncate_mode(1); } world.gop.fence(); truncate(world, ao); @@ -1783,7 +1913,8 @@ auto ResponseBase::project_ao_basis_only(World &world, const AtomicBasisSet &aob return ao; } -auto ResponseBase::project_ao_basis(World &world, const AtomicBasisSet &aobasis) -> vecfuncT { +auto ResponseBase::project_ao_basis(World &world, const AtomicBasisSet &aobasis) + -> vecfuncT { // Make at_to_bf, at_nbf ... map from atom to first bf on atom, and nbf/atom std::vector at_to_bf, at_nbf; aobasis.atoms_to_bfn(molecule, at_to_bf, at_nbf); @@ -1816,8 +1947,8 @@ void ResponseBase::output_json() { void ResponseBase::converged_to_json(json &j) { j["converged"] = all_done; } -void ResponseBase::print_inner(World &world, const std::string &name, const X_space &left, - const X_space &right) { +void ResponseBase::print_inner(World &world, const std::string &name, + const X_space &left, const X_space &right) { auto m_val = inner(left, right); world.gop.fence(); if (world.rank() == 0) { @@ -1827,7 +1958,8 @@ void ResponseBase::print_inner(World &world, const std::string &name, const X_sp } -auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals, +auto transition_densityTDA(World &world, + const vector_real_function_3d &orbitals, const response_space &x) -> vector_real_function_3d { // Get sizes size_t m = x.size(); @@ -1838,7 +1970,8 @@ auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals xx.truncate_rf(); truncate(world, phi0); - std::vector densities = zero_functions(world, m); + std::vector densities = + zero_functions(world, m); // dot xi with phi0 auto f = [&world, &phi0](auto xi) { return dot(world, xi, phi0); }; @@ -1853,7 +1986,8 @@ auto transition_densityTDA(World &world, const vector_real_function_3d &orbitals // Transforms the given matrix of functions according to the give // transformation matrix. Used to update orbitals / potential -response_space transform(World &world, const response_space &f, const Tensor &U) { +response_space transform(World &world, const response_space &f, + const Tensor &U) { // Return container response_space result; @@ -1863,7 +1997,9 @@ response_space transform(World &world, const response_space &f, const Tensor temp = zero_functions_compressed(world, f[0].size()); - for (unsigned int j = 0; j < f.size(); j++) { gaxpy(world, 1.0, temp, U(j, i), f[j]); } + for (unsigned int j = 0; j < f.size(); j++) { + gaxpy(world, 1.0, temp, U(j, i), f[j]); + } // Add to temp to result result.push_back(temp); @@ -1875,7 +2011,8 @@ response_space transform(World &world, const response_space &f, const Tensor &U) -> X_space { +auto transform(World &world, const X_space &x, const Tensor &U) + -> X_space { // Return container X_space result(world, x.num_states(), x.num_orbitals()); @@ -1885,7 +2022,8 @@ auto transform(World &world, const X_space &x, const Tensor &U) -> X_spa return result; } -auto expectation(World &world, const response_space &A, const response_space &B) -> Tensor { +auto expectation(World &world, const response_space &A, const response_space &B) + -> Tensor { // Get sizes MADNESS_ASSERT(!A[0].empty()); MADNESS_ASSERT(A[0].size() == B[0].size()); @@ -1910,7 +2048,9 @@ auto expectation(World &world, const response_space &A, const response_space &B) */ // Run over dimension two // each vector in orbital has dim_1 response functoins associated - for (size_t p = 0; p < dim_2; p++) { result += matrix_inner(world, A_t[p], B_t[p]); } + for (size_t p = 0; p < dim_2; p++) { + result += matrix_inner(world, A_t[p], B_t[p]); + } // Done return result; @@ -1930,7 +2070,8 @@ void print_norms(World &world, const response_space &f) { if (world.rank() == 0) print(norms); } -response_space select_functions(World &world, response_space f, Tensor &energies, size_t k, +response_space select_functions(World &world, response_space f, + Tensor &energies, size_t k, size_t print_level) { // Container for result response_space answer; @@ -1938,7 +2079,8 @@ response_space select_functions(World &world, response_space f, Tensor & // Debugging output if (print_level >= 1) { if (world.rank() == 0) - print("\n Selecting the", k, "lowest excitation energy components.\n"); + print("\n Selecting the", k, + "lowest excitation energy components.\n"); } // Get rid of extra functions and save @@ -1953,7 +2095,8 @@ response_space select_functions(World &world, response_space f, Tensor & // Basic output if (print_level >= 1) { - if (world.rank() == 0) print(" The selected components have excitation energies:"); + if (world.rank() == 0) + print(" The selected components have excitation energies:"); if (world.rank() == 0) print(energies); } @@ -2103,7 +2246,8 @@ response_timing::response_timing() : iter(0) { wall_time_data.insert({"E0X", std::vector(0)}); wall_time_data.insert({"E0mDX", std::vector(0)}); wall_time_data.insert({"subspace_reduce", std::vector(0)}); - wall_time_data.insert({"diagonalize_response_matrix", std::vector(0)}); + wall_time_data.insert( + {"diagonalize_response_matrix", std::vector(0)}); cpu_time_data.insert({"iter_total", std::vector(0)}); cpu_time_data.insert({"update", std::vector(0)}); @@ -2135,7 +2279,8 @@ response_timing::response_timing() : iter(0) { cpu_time_data.insert({"E0X", std::vector(0)}); cpu_time_data.insert({"E0mDX", std::vector(0)}); cpu_time_data.insert({"subspace_reduce", std::vector(0)}); - cpu_time_data.insert({"diagonalize_response_matrix", std::vector(0)}); + cpu_time_data.insert( + {"diagonalize_response_matrix", std::vector(0)}); } void response_timing::print_data() { @@ -2150,17 +2295,23 @@ void response_timing::print_data() { * values.second=cpu_time * @param values */ -void response_timing::add_data(std::map> values) { +void response_timing::add_data( + std::map> values) { // print("ADDING DATA"); iter++; - std::for_each(wall_time_data.begin(), wall_time_data.end(), [&values](auto &v) { - // print(v.first, " : ", values[v.first]); - v.second.push_back(values[v.first].first);// .first to get first value of pair wall_time - }); + std::for_each( + wall_time_data.begin(), wall_time_data.end(), [&values](auto &v) { + // print(v.first, " : ", values[v.first]); + v.second.push_back( + values[v.first] + .first);// .first to get first value of pair wall_time + }); std::for_each(cpu_time_data.begin(), cpu_time_data.end(), [&values](auto &v) { //print(v.first, " : ", values[v.first]); - v.second.push_back(values[v.first].second);// .first to get first value of pair wall_time + v.second.push_back( + values[v.first] + .second);// .first to get first value of pair wall_time }); } @@ -2170,9 +2321,13 @@ void response_timing::to_json(json &j) { j["time_data"] = json(); j["time_data"]["iterations"] = iter; j["time_data"]["wall_time"] = json(); - for (const auto &e: wall_time_data) { j["time_data"]["wall_time"][e.first] = e.second; } + for (const auto &e: wall_time_data) { + j["time_data"]["wall_time"][e.first] = e.second; + } j["time_data"]["cpu_time"] = json(); - for (const auto &e: cpu_time_data) { j["time_data"]["cpu_time"][e.first] = e.second; } + for (const auto &e: cpu_time_data) { + j["time_data"]["cpu_time"][e.first] = e.second; + } } /** * add the pair of s wall_time and cpu_time to the time_data and wall_data maps @@ -2185,10 +2340,12 @@ void response_data::add_data(std::map> values) { // print("ADDING DATA"); iter++; std::for_each(function_data.begin(), function_data.end(), [&values](auto &v) { - v.second.push_back(values[v.first]);// .first to get first value of pair wall_time + v.second.push_back( + values[v.first]);// .first to get first value of pair wall_time }); } -void response_data::add_convergence_targets(double p_thresh, double p_density_target, +void response_data::add_convergence_targets(double p_thresh, + double p_density_target, double p_bsh_target) { this->thresh.push_back(p_thresh); this->density_target.push_back(p_density_target); @@ -2254,11 +2411,13 @@ response_data::response_data() : iter(0) { function_data.insert({"d", std::vector>(0)}); function_data.insert({"r_d", std::vector>(0)}); function_data.insert({"r_d", std::vector>(0)}); - function_data.insert({"x_relative_residuals", std::vector>(0)}); + function_data.insert( + {"x_relative_residuals", std::vector>(0)}); } -void inner_to_json(World &world, const std::string &name, const Tensor &m_val, +void inner_to_json(World &world, const std::string &name, + const Tensor &m_val, std::map> &data) { data[name] = m_val; } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 22bc11a426c..d4048a087f9 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -515,6 +515,8 @@ class ResponseBase { auto compute_gamma_full(World &world, const gamma_orbitals &, const XCOperator &xc) const -> X_space; + auto compute_gamma(World &world, const gamma_orbitals &, + const XCOperator &xc) const -> X_space; auto compute_V0X(World &world, const X_space &X, const XCOperator &xc, bool compute_Y) const From a4f4f17e7bffb881d10f430e6b5b3c2f0715482d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 18:33:46 -0400 Subject: [PATCH 1161/1312] working on exchange again --- src/apps/molresponse/ResponseBase.hpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index d4048a087f9..2317995fd75 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -127,14 +127,17 @@ class K1StrategyFull : public K1Strategy { X_space K = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); vector_real_function_3d k1x, k1y, k2x, k2y; + vector_real_function_3d xb; + vector_real_function_3d yb; + Exchange K1X, K2X, K1Y, K2Y; for (const auto &b: x.active) { - auto xb = x.x[b]; - auto yb = x.y[b]; - auto K1X = make_k(xb, phi0); - auto K2X = make_k(yb, phi0); - auto K1Y = make_k(phi0, yb); - auto K2Y = make_k(phi0, xb); + xb = x.x[b]; + yb = x.y[b]; + K1X = make_k(xb, phi0); + K2X = make_k(yb, phi0); + K1Y = make_k(phi0, yb); + K2Y = make_k(phi0, xb); k1x = K1X(phi0); k1y = K1Y(phi0); k2x = K2X(phi0); From 3a5e14bdcb80849f885e3b3b9c5ece039b12e282 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 20:52:09 -0400 Subject: [PATCH 1162/1312] make density --- src/apps/molresponse/FrequencyResponse.cpp | 164 +++++++++++++-------- src/apps/molresponse/FrequencyResponse.hpp | 6 +- src/apps/molresponse/ResponseBase.cpp | 2 - src/apps/molresponse/ResponseBase.hpp | 113 ++++++++++++-- src/apps/molresponse/x_space.cc | 2 +- 5 files changed, 210 insertions(+), 77 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index e459f024434..2c7a03fd6d3 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -21,14 +21,15 @@ void FrequencyResponse::iterate(World &world) { size_t m = r_params.num_states(); // Number of excited states real_function_3d v_xc; - const double dconv = - std::max(FunctionDefaults<3>::get_thresh() * 10, r_params.dconv());//.01 .0001 .1e-5 + const double dconv = std::max(FunctionDefaults<3>::get_thresh() * 10, + r_params.dconv());//.01 .0001 .1e-5 auto thresh = FunctionDefaults<3>::get_thresh(); auto density_target = dconv * std::max(size_t(5.0), molecule.natom()); const double a_pow{0.50209}; const double b_pow{-0.99162}; - const double x_relative_target = pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b + const double x_relative_target = + pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b Tensor x_relative_residuals((int(m))); Tensor density_residuals((int(m))); Tensor density_residuals_old((int(m))); @@ -50,10 +51,13 @@ void FrequencyResponse::iterate(World &world) { // create a std vector of XNONLinearsolvers response_solver kain_x_space; for (size_t b = 0; b < m; b++) { - kain_x_space.emplace_back(response_matrix_allocator(world, r_vector_size), false); + kain_x_space.emplace_back( + response_matrix_allocator(world, r_vector_size), false); } if (r_params.kain()) { - for (auto &kain_space_b: kain_x_space) { kain_space_b.set_maxsub(r_params.maxsub()); } + for (auto &kain_space_b: kain_x_space) { + kain_space_b.set_maxsub(r_params.maxsub()); + } } // We compute with positive frequencies if (world.rank() == 0) { @@ -70,8 +74,9 @@ void FrequencyResponse::iterate(World &world) { } auto bsh_x_ops = make_bsh_operators_response(world, x_shifts, omega); std::vector bsh_y_ops; - bsh_y_ops = (compute_y) ? make_bsh_operators_response(world, y_shifts, -omega) : bsh_x_ops; - vector_real_function_3d rho_omega = make_density(world, Chi); + bsh_y_ops = (compute_y) + ? make_bsh_operators_response(world, y_shifts, -omega) + : bsh_x_ops; auto max_rotation = .5; if (thresh >= 1e-2) { max_rotation = 2; @@ -83,11 +88,13 @@ void FrequencyResponse::iterate(World &world) { max_rotation = .01; } PQ = generator(world, *this); - PQ.truncate(); vector converged(Chi.num_states(), false); Chi.reset_active(); - rho_omega = make_density(world, Chi); + // make density for the first time + auto rho_omega = response_context.compute_density( + world, Chi, ground_orbitals, + vector_real_function_3d(Chi.num_states()), false); for (iter = 0; iter < r_params.maxiter(); ++iter) { //if (world.rank() == 0) { print("At the start of iterate x", checkx); } @@ -96,8 +103,10 @@ void FrequencyResponse::iterate(World &world) { if (r_params.print_level() >= 1) { molresponse::start_timer(world); if (world.rank() == 0) - printf("\n Iteration %d at time %.1fs\n", static_cast(iter), wall_time()); - if (world.rank() == 0) print("-------------------------------------------"); + printf("\n Iteration %d at time %.1fs\n", + static_cast(iter), wall_time()); + if (world.rank() == 0) + print("-------------------------------------------"); } if (iter < 2 || (iter % 5) == 0) { load_balance_chi(world); } if (iter > 0) { @@ -110,8 +119,9 @@ void FrequencyResponse::iterate(World &world) { // Todo add chi norm and chi_x if (world.rank() == 0) { - function_data_to_json(j_molresponse, iter, chi_norms, x_relative_residuals, - rho_norms, density_residuals); + function_data_to_json(j_molresponse, iter, chi_norms, + x_relative_residuals, rho_norms, + density_residuals); frequency_to_json(j_molresponse, iter, polar, res_polar); } if (r_params.print_level() >= 1) { @@ -122,17 +132,20 @@ void FrequencyResponse::iterate(World &world) { print("Chi Norms at start of iteration: ", iter); print("||X||: ", chi_norms); print("polarizability: \n", polar); - print("targets : ||x||", x_relative_target, " ||delta_rho||", - density_target); + print("targets : ||x||", x_relative_target, + " ||delta_rho||", density_target); } } auto check_convergence = [&](auto &ri, auto &di) { - if (world.rank() == 0) { print(" ", ri, " ", di); } + if (world.rank() == 0) { + print(" ", ri, " ", di); + } return ((ri < x_relative_target) && (di < density_target)); }; for (const auto &b: Chi.active) { - converged[b] = check_convergence(x_relative_residuals[b], density_residuals[b]); + converged[b] = check_convergence(x_relative_residuals[b], + density_residuals[b]); } int b = 0; auto remove_converged = [&]() { @@ -149,16 +162,19 @@ void FrequencyResponse::iterate(World &world) { [](const auto &ci) { return ci; }); if (all_done || iter == r_params.maxiter()) { // if converged print converged - if (world.rank() == 0 && all_done and (r_params.print_level() > 1)) { + if (world.rank() == 0 && all_done and + (r_params.print_level() > 1)) { print("\nConverged!\n"); } if (r_params.save()) { molresponse::start_timer(world); save(world, r_params.save_file()); - if (r_params.print_level() >= 1) molresponse::end_timer(world, "Save:"); + if (r_params.print_level() >= 1) + molresponse::end_timer(world, "Save:"); } if (r_params.plot_all_orbitals()) { - plotResponseOrbitals(world, iter, Chi.x, Chi.y, r_params, ground_calc); + plotResponseOrbitals(world, iter, Chi.x, Chi.y, r_params, + ground_calc); } break; } @@ -166,8 +182,9 @@ void FrequencyResponse::iterate(World &world) { auto x_inner = ((compute_y) ? 2 : 1) * response_context.inner(Chi, Chi); inner_to_json(world, "x", x_inner, iter_function_data); auto [new_chi, new_res, new_rho] = update_response( - world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, - iter, max_rotation, rho_omega, x_relative_residuals, residuals); + world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, + omega, kain_x_space, iter, max_rotation, rho_omega, + x_relative_residuals, residuals); // Here we have computed the new response orbitals and the residuals // Now we need to compute the new density and the new density residuals // Instead, update should also update the density @@ -175,14 +192,20 @@ void FrequencyResponse::iterate(World &world) { // consistent with kain orbitals if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - rho_omega_old = rho_omega; + rho_omega_old = copy(world, rho_omega); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "make_density_old", "make_density_old", iter_timing); + molresponse::end_timer(world, "make_density_old", + "make_density_old", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - rho_omega = update_density(world, new_chi, rho_omega_old); + + rho_omega = response_context.compute_density( + world, Chi, ground_orbitals, rho_omega_old, true); + + //rho_omega = update_density(world, new_chi, rho_omega_old); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "make_density_new", "make_density_new", iter_timing); + molresponse::end_timer(world, "make_density_new", + "make_density_new", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } x_relative_residuals = copy(new_res.residual_norms); @@ -193,7 +216,8 @@ void FrequencyResponse::iterate(World &world) { Chi.x = new_chi.x.copy(); } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); + molresponse::end_timer(world, "copy_response_data", + "copy_response_data", iter_timing); } density_residuals = copy(density_residuals_old); for (const auto &b: Chi.active) { @@ -205,7 +229,8 @@ void FrequencyResponse::iterate(World &world) { auto dnorm = norm2s_T(world, rho_omega); iter_function_data["d"] = dnorm; polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); - res_polar = ((compute_y) ? -2 : -4) * response_context.inner(new_res.residual, PQ); + res_polar = ((compute_y) ? -2 : -4) * + response_context.inner(new_res.residual, PQ); inner_to_json(world, "alpha", polar, iter_function_data); inner_to_json(world, "r_alpha", res_polar, iter_function_data); if (r_params.print_level() >= 20) { @@ -219,13 +244,14 @@ void FrequencyResponse::iterate(World &world) { } } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "Iteration Timing", "iter_total", iter_timing); + molresponse::end_timer(world, "Iteration Timing", "iter_total", + iter_timing); } time_data.add_data(iter_timing); function_data.add_data(iter_function_data); } - function_data.add_convergence_targets(FunctionDefaults<3>::get_thresh(), density_target, - x_relative_target); + function_data.add_convergence_targets(FunctionDefaults<3>::get_thresh(), + density_target, x_relative_target); Chi.reset_active(); if (world.rank() == 0) print("\n"); if (world.rank() == 0) print(" Finished Response Calculation "); @@ -247,9 +273,10 @@ void FrequencyResponse::iterate(World &world) { } auto FrequencyResponse::update_response( - World &world, X_space &chi, XCOperator &xc, std::vector &bsh_x_ops, - std::vector &bsh_y_ops, QProjector &projector, double &x_shifts, - double &omega_n, response_solver &kain_x_space, size_t iteration, + World &world, X_space &chi, XCOperator &xc, + std::vector &bsh_x_ops, std::vector &bsh_y_ops, + QProjector &projector, double &x_shifts, double &omega_n, + response_solver &kain_x_space, size_t iteration, const double &max_rotation, const vector_real_function_3d &rho_old, const Tensor &old_residuals, const X_space &xres_old) -> std::tuple { @@ -258,22 +285,28 @@ auto FrequencyResponse::update_response( auto x = chi.copy();// copy chi // auto checkx = x.norm2s(); - // if (world.rank() == 0) { print("Right after chi.copy() ", checkx); } + // if (world.rank() == 0) { print("Right after chi.copy() ", checkx); } X_space theta_X = compute_theta_X(world, x, xc, r_params.calc_type()); - X_space new_chi = - bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); + X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, + projector, x_shifts); + + //auto new_rho = update_density(world, new_chi, rho_old); - auto new_rho = update_density(world, new_chi, rho_old); + auto new_rho = response_context.compute_density( + world, new_chi, ground_orbitals, rho_old, true); - inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); + inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), + iter_function_data); - auto [new_res, bsh] = - update_residual(world, chi, new_chi, r_params.calc_type(), old_residuals, xres_old); - inner_to_json(world, "r_x", response_context.inner(new_res, new_res), iter_function_data); + auto [new_res, bsh] = update_residual( + world, chi, new_chi, r_params.calc_type(), old_residuals, xres_old); + inner_to_json(world, "r_x", response_context.inner(new_res, new_res), + iter_function_data); if (iteration >= 0) {// & (iteration % 3 == 0)) { new_chi = kain_x_space_update(world, chi, new_res, kain_x_space); } - inner_to_json(world, "x_update", response_context.inner(new_chi, new_chi), iter_function_data); + inner_to_json(world, "x_update", response_context.inner(new_chi, new_chi), + iter_function_data); // if (false) { x_space_step_restriction(world, chi, new_chi, compute_y, max_rotation); } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); @@ -281,8 +314,9 @@ auto FrequencyResponse::update_response( return {new_chi, {new_res, bsh}, new_rho}; } -auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, const X_space &fx, - response_function_solver &rf_solver) -> X_space { +auto FrequencyResponse::new_kain_x_space_update( + World &world, const X_space &x, const X_space &fx, + response_function_solver &rf_solver) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } bool compute_y = omega != 0.0; @@ -322,28 +356,31 @@ auto FrequencyResponse::new_kain_x_space_update(World &world, const X_space &x, for (int i = 0; i < m; i++) { orb_x = i * p * n; for (int j = 0; j < n; j++) { - kain_update.x[i][j] = - rf_solver[orb_x + j].update(vect_x[orb_x + j], vect_rx[orb_x + j]); + kain_update.x[i][j] = rf_solver[orb_x + j].update( + vect_x[orb_x + j], vect_rx[orb_x + j]); } if (compute_y) { orb_y = orb_x + n; for (int j = 0; j < n; j++) { - kain_update.y[i][j] = - rf_solver[orb_y + j].update(vect_x[orb_y + j], vect_rx[orb_y + j]); + kain_update.y[i][j] = rf_solver[orb_y + j].update( + vect_x[orb_y + j], vect_rx[orb_y + j]); } } } - if (world.rank() == 0) { print("----------------End Kain Update -----------------"); } + if (world.rank() == 0) { + print("----------------End Kain Update -----------------"); + } if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "kain_x_update", "kain_x_update", iter_timing); + molresponse::end_timer(world, "kain_x_update", "kain_x_update", + iter_timing); } return kain_update; } auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, std::vector &bsh_x_ops, std::vector &bsh_y_ops, - QProjector &projector, double &x_shifts) - -> X_space { + QProjector &projector, + double &x_shifts) -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } size_t m = theta_X.x.size(); size_t n = theta_X.x.size_orbitals(); @@ -400,7 +437,9 @@ void FrequencyResponse::frequency_to_json(json &j_mol_in, size_t iter, j_mol_in["protocol_data"][index]["property_data"].push_back(j); } -void FrequencyResponse::compute_and_print_polarizability(World &world, X_space &Chi, X_space &pq, +void FrequencyResponse::compute_and_print_polarizability(World &world, + X_space &Chi, + X_space &pq, std::string message) { Tensor G = -2 * inner(Chi, pq); if (world.rank() == 0) { @@ -450,9 +489,14 @@ auto nuclear_generator(World &world, FrequencyResponse &calc) -> X_space { for (long atom = 0; atom < molecule.natom(); ++atom) { for (long axis = 0; axis < 3; ++axis) { - functorT func(new madchem::MolecularDerivativeFunctor(molecule, atom, axis)); - nuclear_vector.at(atom * 3 + axis) = functionT( - factoryT(world).functor(func).nofence().truncate_on_project().truncate_mode(0)); + functorT func(new madchem::MolecularDerivativeFunctor(molecule, + atom, axis)); + nuclear_vector.at(atom * 3 + axis) = + functionT(factoryT(world) + .functor(func) + .nofence() + .truncate_on_project() + .truncate_mode(0)); } } PQ.x = vector_to_PQ(world, nuclear_vector, calc.get_orbitals()); @@ -468,7 +512,8 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { for (auto &d: dipole_vectors) { std::vector f(3, 0); f[i++] = 1; - d = real_factory_3d(world).functor(real_functor_3d(new MomentFunctor(f))); + d = real_factory_3d(world).functor( + real_functor_3d(new MomentFunctor(f))); } //truncate(world, dipole_vectors, true); world.gop.fence(); @@ -479,7 +524,8 @@ auto dipole_generator(World &world, FrequencyResponse &calc) -> X_space { } auto vector_to_PQ(World &world, const vector_real_function_3d &rhs_operators, - const vector_real_function_3d &ground_orbitals) -> response_space { + const vector_real_function_3d &ground_orbitals) + -> response_space { response_space rhs(world, rhs_operators.size(), ground_orbitals.size()); auto orbitals = copy(world, ground_orbitals); reconstruct(world, orbitals); diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index d688b9c6b7d..ad86bfca9bd 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -31,13 +31,15 @@ class FrequencyResponse : public ResponseBase { std::make_unique(), std::make_unique(), std::make_unique(), - std::make_unique()); + std::make_unique(), + std::make_unique()); } else { response_context.set_strategy( std::make_unique(), std::make_unique(), std::make_unique(), - std::make_unique()); + std::make_unique(), + std::make_unique()); } PQ = generator(world, *this); } diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 02e82882100..69f864a5753 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -461,8 +461,6 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, if (r_params.print_level() >= 1) { molresponse::end_timer(world, "K[omega]", "K[omega]", iter_timing); } - // auto K = response_exchange_multiworld(phi0, chi_alpha, true); - //K = oop_apply(K, apply_projector); if (r_params.print_level() >= 20) { print_inner(world, "old xKx", chi_alpha, K); } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 2317995fd75..1e287789b25 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -23,6 +23,71 @@ using namespace madness; +class ComputeDensityStrategy { +public: + virtual ~ComputeDensityStrategy() = default; + virtual vector_real_function_3d + compute_density(World &world, const X_space &x, + const vector_real_function_3d &phi0, + const vector_real_function_3d &rho1, bool update) const = 0; +}; + +class StaticDensityStrategy : public ComputeDensityStrategy { +public: + vector_real_function_3d compute_density(World &world, const X_space &x, + const vector_real_function_3d &phi0, + const vector_real_function_3d &rho1, + bool update) const override { + + vector_real_function_3d rho_new; + if (update) { + rho_new = copy(world, rho1); + } else { + rho_new = zero_functions(world, x.num_states()); + } + vector_real_function_3d x_phi, y_phi; + + for (const auto &b: x.active) { + + x_phi = mul(world, x.x[b], phi0, false); + + world.gop.fence(); + rho_new[b] = 2 * sum(world, x_phi); + world.gop.fence(); + } + truncate(world, rho_new); + return rho_new; + } +}; +class FullDensityStrategy : public ComputeDensityStrategy { +public: + vector_real_function_3d compute_density(World &world, const X_space &x, + const vector_real_function_3d &phi0, + const vector_real_function_3d &rho1, + bool update) const override { + vector_real_function_3d rho_new; + if (update) { + rho_new = copy(world, rho1); + } else { + rho_new = zero_functions(world, x.num_states()); + } + vector_real_function_3d x_phi, y_phi; + + for (const auto &b: x.active) { + + x_phi = mul(world, x.x[b], phi0, false); + y_phi = mul(world, x.y[b], phi0, false); + + world.gop.fence(); + rho_new[b] = sum(world, x_phi); + rho_new[b] += sum(world, y_phi); + world.gop.fence(); + } + truncate(world, rho_new); + return rho_new; + } +}; + class VXC1Strategy { public: virtual ~VXC1Strategy() = default; @@ -181,8 +246,8 @@ class inner_strategy { public: virtual ~inner_strategy() = default; - virtual Tensor compute_inner(const X_space &x, - const X_space &y) const = 0; + [[nodiscard]] virtual Tensor + compute_inner(const X_space &x, const X_space &y) const = 0; }; class Context { @@ -192,24 +257,31 @@ class Context { std::unique_ptr j1_strategy_; std::unique_ptr k1_strategy_; std::unique_ptr vxc1_strategy_; + std::unique_ptr density_strategy_; public: - explicit Context(std::unique_ptr &&innerStrategy = {}, - std::unique_ptr &&j1Strategy = {}, - std::unique_ptr &&k1Strategy = {}, - std::unique_ptr &&vxc1trategy = {}) + explicit Context( + std::unique_ptr &&innerStrategy = {}, + std::unique_ptr &&j1Strategy = {}, + std::unique_ptr &&k1Strategy = {}, + std::unique_ptr &&vxc1trategy = {}, + std::unique_ptr &&densityStrategy = {}) : inner_strategy_(std::move(innerStrategy)), j1_strategy_(std::move(j1Strategy)), k1_strategy_(std::move(k1Strategy)), - vxc1_strategy_(std::move(vxc1trategy)) {} - void set_strategy(std::unique_ptr &&strategy, - std::unique_ptr &&j1Strategy, - std::unique_ptr &&K1Strategy, - std::unique_ptr &&vxc1Strategy) { + vxc1_strategy_(std::move(vxc1trategy)), + density_strategy_(std::move(densityStrategy)) {} + void + set_strategy(std::unique_ptr &&strategy, + std::unique_ptr &&j1Strategy, + std::unique_ptr &&K1Strategy, + std::unique_ptr &&vxc1Strategy, + std::unique_ptr &&densityStrategy) { inner_strategy_ = std::move(strategy); j1_strategy_ = std::move(j1Strategy); k1_strategy_ = std::move(K1Strategy); vxc1_strategy_ = std::move(vxc1Strategy); + density_strategy_ = std::move(densityStrategy); } [[nodiscard]] Tensor inner(const X_space &x, @@ -258,13 +330,28 @@ class Context { "inner", "ResponseBase.hpp"); } } + + vector_real_function_3d compute_density(World &world, const X_space &x, + const vector_real_function_3d &phi0, + const vector_real_function_3d &rho1, + bool update) const { + if (density_strategy_) { + return density_strategy_->compute_density(world, x, phi0, rho1, + update); + } else { + throw madness::MadnessException( + "Compute Density Strategy isn't set", + "Need to set a strategy", 2, 455, "inner", + "ResponseBase.hpp"); + } + } }; class full_inner_product : public inner_strategy { public: - Tensor compute_inner(const X_space &x, - const X_space &y) const override { + [[nodiscard]] Tensor + compute_inner(const X_space &x, const X_space &y) const override { return inner(x, y); } }; diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 18c1447be5e..93920b68c22 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -167,9 +167,9 @@ namespace madness { World &world = a[0][0].world(); world.gop.fence(); - auto a_transpose = transposeResponseMatrix(a); auto b_transpose = transposeResponseMatrix(b); + world.gop.fence(); Tensor result(a.size(), a.size()); int p = 0; From d978567f0c11397dd0028242de161ef0eff0a624 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 20:57:54 -0400 Subject: [PATCH 1163/1312] use make density in gamma --- src/apps/molresponse/ResponseBase.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 69f864a5753..506169eaa64 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -438,7 +438,12 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, auto apply_projector = [&](auto &xi) { return projector(xi); }; // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto rho_b = make_density(world, chi_alpha); + // auto rho_b = make_density(world, chi_alpha); + + auto rho_b = response_context.compute_density( + world, Chi, ground_orbitals, vector_real_function_3d(), false); + + if (r_params.print_level() >= 1) { molresponse::end_timer(world, "gamma_make_density"); } From d0ca07cc8490fba0523e467bf5dfddd69615d048 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 21:33:22 -0400 Subject: [PATCH 1164/1312] output density norms --- src/apps/molresponse/FrequencyResponse.cpp | 3 +++ src/apps/molresponse/ResponseBase.cpp | 1 + src/apps/molresponse/ResponseBase.hpp | 6 ++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2c7a03fd6d3..2aaaac8e28c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -181,6 +181,9 @@ void FrequencyResponse::iterate(World &world) { } auto x_inner = ((compute_y) ? 2 : 1) * response_context.inner(Chi, Chi); inner_to_json(world, "x", x_inner, iter_function_data); + + auto rho_omega_norm = ((compute_y) ? 2 : 1) * norm2s_T(world, rho_omega); + inner_to_json(world, "density_norms", rho_omega_norm, iter_function_data); auto [new_chi, new_res, new_rho] = update_response( world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation, rho_omega, diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 506169eaa64..7b2d97278cc 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -2412,6 +2412,7 @@ response_data::response_data() : iter(0) { function_data.insert({"r_alpha", std::vector>(0)}); function_data.insert({"d", std::vector>(0)}); + function_data.insert({"density_norms", std::vector>(0)}); function_data.insert({"r_d", std::vector>(0)}); function_data.insert({"r_d", std::vector>(0)}); function_data.insert( diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 1e287789b25..25e224a8173 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -161,7 +161,7 @@ class J1StrategyStable : public J1Strategy { functionT temp_J; for (const auto &b: x.active) { temp_J = apply(*coulomb_ops, rho1[b]); - J.x[b] = mul(world, temp_J, phi0, false); + J.x[b] = mul(world, temp_J, phi0, true); } world.gop.fence(); J.y = J.x.copy(); @@ -199,9 +199,11 @@ class K1StrategyFull : public K1Strategy { for (const auto &b: x.active) { xb = x.x[b]; yb = x.y[b]; + K1X = make_k(xb, phi0); - K2X = make_k(yb, phi0); K1Y = make_k(phi0, yb); + + K2X = make_k(yb, phi0); K2Y = make_k(phi0, xb); k1x = K1X(phi0); k1y = K1Y(phi0); From be9dec956e59bcf1297acf2ba46a4a0c8b0e0b1f Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 21:33:46 -0400 Subject: [PATCH 1165/1312] output density norms --- src/apps/molresponse/FrequencyResponse.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2aaaac8e28c..4d5c26d2b05 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -182,8 +182,9 @@ void FrequencyResponse::iterate(World &world) { auto x_inner = ((compute_y) ? 2 : 1) * response_context.inner(Chi, Chi); inner_to_json(world, "x", x_inner, iter_function_data); - auto rho_omega_norm = ((compute_y) ? 2 : 1) * norm2s_T(world, rho_omega); - inner_to_json(world, "density_norms", rho_omega_norm, iter_function_data); + auto rho_omega_norm = norm2s_T(world, rho_omega); + inner_to_json(world, "density_norms", rho_omega_norm, + iter_function_data); auto [new_chi, new_res, new_rho] = update_response( world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation, rho_omega, From 4954723a233eac1d0bac9d3200074abbad1ab9d8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Mon, 10 Apr 2023 21:36:42 -0400 Subject: [PATCH 1166/1312] output density norms --- src/apps/molresponse/ResponseBase.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 25e224a8173..8b7d9a831c3 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -79,8 +79,8 @@ class FullDensityStrategy : public ComputeDensityStrategy { y_phi = mul(world, x.y[b], phi0, false); world.gop.fence(); - rho_new[b] = sum(world, x_phi); - rho_new[b] += sum(world, y_phi); + rho_new[b] = sum(world, x_phi,true); + rho_new[b] += sum(world, y_phi,true); world.gop.fence(); } truncate(world, rho_new); From 23206eb75e269235b92596e81570b8c99d974d4d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 08:58:41 -0400 Subject: [PATCH 1167/1312] fence multiply in density --- src/apps/molresponse/ResponseBase.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 8b7d9a831c3..d358d27bc00 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -75,8 +75,8 @@ class FullDensityStrategy : public ComputeDensityStrategy { for (const auto &b: x.active) { - x_phi = mul(world, x.x[b], phi0, false); - y_phi = mul(world, x.y[b], phi0, false); + x_phi = mul(world, x.x[b], phi0, true); + y_phi = mul(world, x.y[b], phi0, true); world.gop.fence(); rho_new[b] = sum(world, x_phi,true); From bd18e1710b90f7f3f211d35bb2c9d7e06df6da38 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 13:34:33 -0400 Subject: [PATCH 1168/1312] fence where i can --- src/apps/molresponse/FrequencyResponse.cpp | 6 +- src/apps/molresponse/ResponseBase.cpp | 8 +- src/apps/molresponse/ResponseBase.hpp | 26 ++--- src/apps/molresponse/x_space.h | 110 +++++++++++++-------- 4 files changed, 86 insertions(+), 64 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 4d5c26d2b05..10225180c06 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -287,15 +287,11 @@ auto FrequencyResponse::update_response( if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto x = chi.copy();// copy chi - // auto checkx = x.norm2s(); - // if (world.rank() == 0) { print("Right after chi.copy() ", checkx); } + auto x = chi.copy(); X_space theta_X = compute_theta_X(world, x, xc, r_params.calc_type()); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - //auto new_rho = update_density(world, new_chi, rho_old); - auto new_rho = response_context.compute_density( world, new_chi, ground_orbitals, rho_old, true); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7b2d97278cc..fe937aad6b8 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -441,7 +441,7 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, // auto rho_b = make_density(world, chi_alpha); auto rho_b = response_context.compute_density( - world, Chi, ground_orbitals, vector_real_function_3d(), false); + world, chi_alpha, ground_orbitals, vector_real_function_3d(), false); if (r_params.print_level() >= 1) { @@ -451,8 +451,6 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto J = response_context.compute_j1(world, chi_alpha, rho_b, phi0, shared_coulomb_operator); - - world.gop.fence(); inner_to_json(world, "j1", response_context.inner(chi_alpha, J), iter_function_data); if (r_params.print_level() >= 1) { @@ -530,13 +528,10 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, -> X_space { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // std::cout << "MPI BARRIER 3 " << std::endl; - // world.mpi.Barrier(); bool compute_Y = calc_type == "full"; X_space Theta_X = X_space(world, chi.num_states(), chi.num_orbitals()); if (r_params.print_level() >= 1) { molresponse::start_timer(world); } X_space V0X = compute_V0X(world, chi, xc, compute_Y); - //V0X.truncate(); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "compute_V0X", "compute_V0X", iter_timing); @@ -562,7 +557,6 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, molresponse::end_timer(world, "compute_E0X", "compute_E0X", iter_timing); } - X_space gamma; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (calc_type != "tda") { diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index d358d27bc00..afff8f964a7 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -79,8 +79,8 @@ class FullDensityStrategy : public ComputeDensityStrategy { y_phi = mul(world, x.y[b], phi0, true); world.gop.fence(); - rho_new[b] = sum(world, x_phi,true); - rho_new[b] += sum(world, y_phi,true); + rho_new[b] = sum(world, x_phi, true); + rho_new[b] += sum(world, y_phi, true); world.gop.fence(); } truncate(world, rho_new); @@ -137,12 +137,11 @@ class J1StrategyFull : public J1Strategy { X_space J = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); - functionT temp_J; + vector_real_function_3d temp_J(3); for (const auto &b: x.active) { - temp_J = apply(*coulomb_ops, rho1[b]); - J.x[b] = mul(world, temp_J, phi0, false); + temp_J[b] = apply(*coulomb_ops, rho1[b]); + J.x[b] = mul(world, temp_J[b], phi0, true); } - world.gop.fence(); J.y = J.x.copy(); return J; } @@ -158,12 +157,11 @@ class J1StrategyStable : public J1Strategy { X_space J = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); - functionT temp_J; + vector_real_function_3d temp_J(3); for (const auto &b: x.active) { - temp_J = apply(*coulomb_ops, rho1[b]); - J.x[b] = mul(world, temp_J, phi0, true); + temp_J[b] = apply(*coulomb_ops, rho1[b]); + J.x[b] = mul(world, temp_J[b], phi0, true); } - world.gop.fence(); J.y = J.x.copy(); return J; } @@ -202,16 +200,18 @@ class K1StrategyFull : public K1Strategy { K1X = make_k(xb, phi0); K1Y = make_k(phi0, yb); - K2X = make_k(yb, phi0); K2Y = make_k(phi0, xb); + + world.gop.fence(); + k1x = K1X(phi0); k1y = K1Y(phi0); k2x = K2X(phi0); k2y = K2Y(phi0); world.gop.fence(); - K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); - K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); + K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, true); + K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, true); world.gop.fence(); } return K; diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index e2cbcf12529..636fd82f56c 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -20,9 +20,10 @@ namespace madness { struct X_space; - auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d; - auto create_response_matrix(const size_t &num_state, const size_t &num_orbitals) - -> response_matrix; + auto to_response_vector(const vector_real_function_3d &vec) + -> vector_real_function_3d; + auto create_response_matrix(const size_t &num_state, + const size_t &num_orbitals) -> response_matrix; auto to_response_matrix(const X_space &x) -> response_matrix; auto to_conjugate_response_matrix(const X_space &x) -> response_matrix; auto to_flattened_vector(const X_space &x) -> vector_real_function_3d; @@ -54,8 +55,8 @@ namespace madness { y.active = new_active; } X_space(const X_space &A) - : n_states(size_states(A)), n_orbitals(size_orbitals(A)), x(A.x), y(A.y), - active(A.active) {} + : n_states(size_states(A)), n_orbitals(size_orbitals(A)), x(A.x), + y(A.y), active(A.active) {} [[nodiscard]] X_space copy() const { auto &world = x[0][0].world(); auto new_x = X_space(*this);// copy @@ -73,8 +74,9 @@ namespace madness { /// Works in either basis. Different distributions imply /// asynchronous communication and the optional fence is /// collective. - [[nodiscard]] auto copy(const std::shared_ptr>> &p_map, - bool fence = false) const -> X_space { + [[nodiscard]] auto + copy(const std::shared_ptr>> &p_map, + bool fence = false) const -> X_space { auto &world = x[0][0].world(); auto new_x = X_space(*this);// copy for (int i = 0; i < new_x.num_states(); i++) { @@ -98,8 +100,9 @@ namespace madness { } // Zero Constructor X_space(World &world, size_t n_states, size_t n_orbitals) - : n_states(n_states), n_orbitals(n_orbitals), x(world, n_states, n_orbitals), - y(world, n_states, n_orbitals), active(n_states) { + : n_states(n_states), n_orbitals(n_orbitals), + x(world, n_states, n_orbitals), y(world, n_states, n_orbitals), + active(n_states) { reset_active(); } void clear() { @@ -107,7 +110,8 @@ namespace madness { y.clear(); active.clear(); } - void push_back(const vector_real_function_3d &vx, const vector_real_function_3d &vy) { + void push_back(const vector_real_function_3d &vx, + const vector_real_function_3d &vy) { if (n_orbitals > 0) { MADNESS_ASSERT(n_orbitals == x.size()); MADNESS_ASSERT(n_orbitals == y.size()); @@ -132,8 +136,9 @@ namespace madness { } - friend auto inplace_apply(X_space &A, - const std::function &func) + friend auto inplace_apply( + X_space &A, + const std::function &func) -> void { auto &world = A.x[0][0].world(); for (auto &i: A.active) { @@ -149,16 +154,18 @@ namespace madness { * @param func * @return */ - friend auto oop_apply( - const X_space &A, - const std::function &func) + friend auto oop_apply(const X_space &A, + const std::function &func) -> X_space { auto &world = A.x[0][0].world(); - auto result = X_space::zero_functions(world, A.num_states(), A.num_orbitals()); - // if (world.rank() == 0) { print("oop_apply"); } + auto result = X_space::zero_functions(world, A.num_states(), + A.num_orbitals()); + // if (world.rank() == 0) { print("oop_apply"); } for (auto &i: result.active) { - // if (world.rank() == 0) { print("oop_apply", i); } + // if (world.rank() == 0) { print("oop_apply", i); } result.x[i] = func(A.x[i]); + world.gop.fence(); result.y[i] = func(A.y[i]); } world.gop.fence(); @@ -166,7 +173,8 @@ namespace madness { } template - friend auto binary_apply(const X_space &A, const X_space &B, T &func) -> X_space { + friend auto binary_apply(const X_space &A, const X_space &B, T &func) + -> X_space { MADNESS_ASSERT(same_size(A, B)); X_space result = A.copy();// create zero_functions @@ -187,7 +195,8 @@ namespace madness { } template - friend auto binary_inplace(X_space &A, const X_space &B, const T &func) { + friend auto binary_inplace(X_space &A, const X_space &B, + const T &func) { MADNESS_ASSERT(same_size(A, B)); auto &world = A.x[0][0].world(); for (const auto &i: A.active) { @@ -205,11 +214,14 @@ namespace madness { return A; } - static X_space zero_functions(World &world, size_t n_states, size_t n_orbitals) { + static X_space zero_functions(World &world, size_t n_states, + size_t n_orbitals) { auto zeros = X_space(world, n_states, n_orbitals); for (int i = 0; i < zeros.num_states(); i++) { - zeros.x[i] = ::madness::zero_functions(world, n_orbitals, false); - zeros.y[i] = ::madness::zero_functions(world, n_orbitals, false); + zeros.x[i] = ::madness::zero_functions( + world, n_orbitals, false); + zeros.y[i] = ::madness::zero_functions( + world, n_orbitals, false); } world.gop.fence(); return zeros; @@ -218,7 +230,9 @@ namespace madness { auto operator+=(const X_space &B) -> X_space & { MADNESS_ASSERT(same_size(*this, B)); auto &world = this->x[0][0].world(); - auto add_inplace = [&](auto &a, const auto &b) { gaxpy(world, 1.0, a, 1.0, b, false); }; + auto add_inplace = [&](auto &a, const auto &b) { + gaxpy(world, 1.0, a, 1.0, b, false); + }; binary_inplace(*this, B, add_inplace); return *this; } @@ -244,26 +258,32 @@ namespace madness { friend X_space operator*(const X_space &A, const double &b) { World &world = A.x[0][0].world(); auto result = A.copy(); - auto scale_a = [&](vector_real_function_3d &vec_ai) { scale(world, vec_ai, b, false); }; + auto scale_a = [&](vector_real_function_3d &vec_ai) { + scale(world, vec_ai, b, false); + }; inplace_apply(result, scale_a); return result; } friend X_space operator*(const double &b, const X_space &A) { World &world = A.x[0][0].world(); auto result = A.copy(); - auto scale_a = [&](vector_real_function_3d &vec_ai) { scale(world, vec_ai, b, false); }; + auto scale_a = [&](vector_real_function_3d &vec_ai) { + scale(world, vec_ai, b, false); + }; inplace_apply(result, scale_a); return result; } - friend X_space operator*(const X_space &A, const Function &f) { + friend X_space operator*(const X_space &A, + const Function &f) { World &world = A.x[0][0].world(); auto mul_f = [&](const vector_real_function_3d &vec_ai) { return mul(world, f, vec_ai, false); }; return oop_apply(A, mul_f); } - friend auto operator*(const Function &f, const X_space &A) -> X_space { + friend auto operator*(const Function &f, const X_space &A) + -> X_space { World &world = A.x[0][0].world(); auto mul_f = [&](const vector_real_function_3d &vec_ai) { return mul(world, f, vec_ai, false); @@ -271,12 +291,15 @@ namespace madness { return oop_apply(A, mul_f); } - friend auto operator*(const X_space &A, const Tensor &b) -> X_space { + friend auto operator*(const X_space &A, const Tensor &b) + -> X_space { MADNESS_ASSERT(size_states(A) > 0); MADNESS_ASSERT(size_orbitals(A) > 0); World &world = A.x[0][0].world(); - auto transform_ai = [&](auto &ai) { return transform(world, ai, b, false); }; + auto transform_ai = [&](auto &ai) { + return transform(world, ai, b, false); + }; return oop_apply(A, transform_ai); } /*** @@ -291,7 +314,8 @@ namespace madness { auto rx = to_response_matrix(*this); auto &world = rx[0][0].world(); auto truncate_i = [&](auto &fi) { - madness::truncate(world, fi, FunctionDefaults<3>::get_thresh(), false); + madness::truncate(world, fi, FunctionDefaults<3>::get_thresh(), + false); }; inplace_apply(*this, truncate_i); } @@ -300,12 +324,12 @@ namespace madness { auto rx = to_response_matrix(*this); auto &world = rx[0][0].world(); auto truncate_i = [&](auto &fi) { - madness::truncate(world, fi, thresh, false); + madness::truncate(world, fi, thresh, false); }; inplace_apply(*this, truncate_i); } - auto norm2s() const -> Tensor { + auto norm2s() const -> Tensor { World &world = x[0][0].world(); Tensor norms(num_states()); @@ -323,10 +347,15 @@ namespace madness { return norms.reshape(n_states, 2 * n_orbitals); } - friend auto size_states(const X_space &x) -> size_t { return x.n_states; } - friend auto size_orbitals(const X_space &x) -> size_t { return x.n_orbitals; } + friend auto size_states(const X_space &x) -> size_t { + return x.n_states; + } + friend auto size_orbitals(const X_space &x) -> size_t { + return x.n_orbitals; + } friend auto same_size(const X_space &A, const X_space &B) -> bool { - return ((size_states(A) == size_states(B) && size_orbitals(A) == size_orbitals(B))); + return ((size_states(A) == size_states(B) && + size_orbitals(A) == size_orbitals(B))); } }; @@ -338,7 +367,8 @@ namespace madness { this->X_space::zero_functions(world, size_t(1), n_orbtials); } - X_vector(X_space A, size_t b) : X_space(A.x[0][0].world(), size_t(1), A.num_orbitals()) { + X_vector(X_space A, size_t b) + : X_space(A.x[0][0].world(), size_t(1), A.num_orbitals()) { x[0] = A.x[b]; y[0] = A.y[b]; } @@ -409,7 +439,8 @@ namespace madness { } // Copy constructor - response_matrix_allocator operator=(const response_matrix_allocator &other) { + response_matrix_allocator + operator=(const response_matrix_allocator &other) { return response_matrix_allocator(world, other.n_orbtials); } }; @@ -421,7 +452,8 @@ namespace madness { real_function_3d operator()() { return real_function_3d(real_factory_3d(world).fence(true)); } - response_function_allocator operator=(const response_function_allocator &other) { + response_function_allocator + operator=(const response_function_allocator &other) { return response_function_allocator(world); } }; From 26560e92efec8f4c1a1672db089fa7fa040abb3c Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 13:46:31 -0400 Subject: [PATCH 1169/1312] try a simplified version of inner --- src/apps/molresponse/x_space.cc | 45 ++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index 93920b68c22..d08cac5fb84 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -11,7 +11,8 @@ namespace madness { * @param vec * @return vector_real_function_3d */ - auto to_response_vector(const vector_real_function_3d &vec) -> vector_real_function_3d { + auto to_response_vector(const vector_real_function_3d &vec) + -> vector_real_function_3d { auto &world = vec[0].world(); // copy the vector auto response_vector = vector_real_function_3d(2 * vec.size()); @@ -31,12 +32,13 @@ namespace madness { * @param num_orbitals * @return response_matrix */ - auto create_response_matrix(const size_t &num_states, const size_t &num_orbitals) - -> response_matrix { + auto create_response_matrix(const size_t &num_states, + const size_t &num_orbitals) -> response_matrix { auto matrix = response_matrix(num_states); - std::for_each(matrix.begin(), matrix.end(), - [&](auto &xi) { xi = vector_real_function_3d(num_orbitals); }); + std::for_each(matrix.begin(), matrix.end(), [&](auto &xi) { + xi = vector_real_function_3d(num_orbitals); + }); return matrix; } @@ -52,8 +54,9 @@ namespace madness { int b = 0; std::for_each(mX.begin(), mX.end(), [&](vector_real_function_3d &mi) { mi = vector_real_function_3d(2 * num_orbitals); - std::copy(x.x[b].begin(), x.x[b].end(), mi.begin()); // shallow copy - std::copy(x.y[b].begin(), x.y[b].end(), mi.begin() + num_orbitals);// shallow copy + std::copy(x.x[b].begin(), x.x[b].end(), mi.begin());// shallow copy + std::copy(x.y[b].begin(), x.y[b].end(), + mi.begin() + num_orbitals);// shallow copy b++; }); return mX; @@ -66,8 +69,9 @@ namespace madness { auto num_orbitals = x.num_orbitals(); std::for_each(mX.begin(), mX.end(), [&](auto &mi) { mi = vector_real_function_3d(2 * num_orbitals); - std::copy(x.y[b].begin(), x.y[b].end(), mi.begin()); // shallow copy - std::copy(x.x[b].begin(), x.x[b].end(), mi.begin() + num_orbitals);// shallow copy + std::copy(x.y[b].begin(), x.y[b].end(), mi.begin());// shallow copy + std::copy(x.x[b].begin(), x.x[b].end(), + mi.begin() + num_orbitals);// shallow copy b++; }); return mX; @@ -100,8 +104,10 @@ namespace madness { auto x_space = X_space(world, num_states, num_orbitals); int b = 0; for (const auto &x_vec: x) { - std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.x[b].begin()); - std::copy(x_vec.begin() + num_orbitals, x_vec.end(), x_space.y[b].begin()); + std::copy(x_vec.begin(), x_vec.begin() + num_orbitals, + x_space.x[b].begin()); + std::copy(x_vec.begin() + num_orbitals, x_vec.end(), + x_space.y[b].begin()); b++; }; return x_space; @@ -123,9 +129,11 @@ namespace madness { int b = 0; std::for_each(x.begin(), x.end(), [&](auto x_vec) { - std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, x_space.y[b].begin(), + std::transform(x_vec.begin(), x_vec.begin() + num_orbitals, + x_space.y[b].begin(), [&](const auto &xi) { return copy(xi, false); }); - std::transform(x_vec.begin() + num_orbitals, x_vec.end(), x_space.x[b].begin(), + std::transform(x_vec.begin() + num_orbitals, x_vec.end(), + x_space.x[b].begin(), [&](const auto &xi) { return copy(xi, false); }); b++; }); @@ -162,6 +170,8 @@ namespace madness { MADNESS_ASSERT(size_orbitals(A) > 0); MADNESS_ASSERT(same_size(A, B)); + return response_space_inner(A.x, B.x) + response_space_inner(A.y, B.y); + auto a = to_response_matrix(A); auto b = to_response_matrix(B); World &world = a[0][0].world(); @@ -173,10 +183,11 @@ namespace madness { world.gop.fence(); Tensor result(a.size(), a.size()); int p = 0; - std::for_each(a_transpose.begin(), a_transpose.end(), [&](const auto &ati) { - result += matrix_inner(world, ati, b_transpose[p++]); - world.gop.fence(); - }); + std::for_each(a_transpose.begin(), a_transpose.end(), + [&](const auto &ati) { + result += matrix_inner(world, ati, b_transpose[p++]); + world.gop.fence(); + }); return result; } }// namespace madness From da970fc165fa456c89a6cb9da7c1f36bd566f769 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 13:59:51 -0400 Subject: [PATCH 1170/1312] do not recompute density for gamma --- src/apps/molresponse/FrequencyResponse.cpp | 3 +- src/apps/molresponse/ResponseBase.cpp | 49 +++++++++++++--------- src/apps/molresponse/ResponseBase.hpp | 7 ++-- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 10225180c06..9dbbf5dcf27 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -288,7 +288,8 @@ auto FrequencyResponse::update_response( if (r_params.print_level() >= 1) { molresponse::start_timer(world); } auto x = chi.copy(); - X_space theta_X = compute_theta_X(world, x, xc, r_params.calc_type()); + X_space theta_X = + compute_theta_X(world, x, rho_old, xc, r_params.calc_type()); X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index fe937aad6b8..7a7926407ca 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -428,7 +428,7 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, FunctionDefaults<3>::get_pmap(); auto c_xc = xcf.hf_exchange_coefficient(); - auto [chi_alpha, phi0] = + auto [chi_alpha, phi0, rho1] = orbital_load_balance(world, density, r_params.loadbalparts()); QProjector projector(world, phi0); @@ -438,10 +438,6 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, auto apply_projector = [&](auto &xi) { return projector(xi); }; // apply the exchange kernel to rho if necessary if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // auto rho_b = make_density(world, chi_alpha); - - auto rho_b = response_context.compute_density( - world, chi_alpha, ground_orbitals, vector_real_function_3d(), false); if (r_params.print_level() >= 1) { @@ -449,7 +445,7 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - auto J = response_context.compute_j1(world, chi_alpha, rho_b, phi0, + auto J = response_context.compute_j1(world, chi_alpha, rho1, phi0, shared_coulomb_operator); inner_to_json(world, "j1", response_context.inner(chi_alpha, J), iter_function_data); @@ -474,7 +470,7 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, if (c_xc != 1.0) { if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - W = response_context.compute_VXC1(world, chi_alpha, rho_b, phi0, xc); + W = response_context.compute_VXC1(world, chi_alpha, rho1, phi0, xc); if (r_params.print_level() >= 1) { molresponse::end_timer(world, "XC[omega]", "XC[omega]", iter_timing); @@ -523,6 +519,7 @@ auto ResponseBase::compute_gamma(World &world, const gamma_orbitals &density, auto ResponseBase::compute_theta_X(World &world, const X_space &chi, + const vector_real_function_3d &rho1, const XCOperator &xc, const std::string &calc_type) const -> X_space { @@ -560,9 +557,9 @@ auto ResponseBase::compute_theta_X(World &world, const X_space &chi, X_space gamma; if (r_params.print_level() >= 1) { molresponse::start_timer(world); } if (calc_type != "tda") { - gamma = compute_gamma(world, {chi, ground_orbitals}, xc); + gamma = compute_gamma(world, {chi, ground_orbitals, rho1}, xc); } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); + gamma = compute_gamma_tda(world, {chi, ground_orbitals, rho1}, xc); } @@ -604,7 +601,7 @@ auto ResponseBase::compute_gamma_full(World &world, std::shared_ptr>> old_pmap = FunctionDefaults<3>::get_pmap(); - auto [chi_alpha, phi0] = + auto [chi_alpha, phi0, rho1] = orbital_load_balance(world, density, r_params.loadbalparts()); QProjector projector(world, phi0); @@ -713,7 +710,7 @@ auto ResponseBase::compute_gamma_static(World &world, -> X_space { auto old_pmap = FunctionDefaults<3>::get_pmap(); - auto [xy, phi0] = + auto [xy, phi0, rho1] = orbital_load_balance(world, gammaOrbitals, r_params.loadbalparts()); QProjector projector(world, phi0); size_t num_states = xy.num_states(); @@ -827,7 +824,7 @@ auto ResponseBase::compute_gamma_tda(World &world, const gamma_orbitals &density, const XCOperator &xc) const -> X_space { - auto [d_alpha, phi0] = + auto [d_alpha, phi0, rho1] = orbital_load_balance(world, density, r_params.loadbalparts()); std::shared_ptr>> oldpmap = FunctionDefaults<3>::get_pmap(); @@ -972,11 +969,14 @@ auto ResponseBase::compute_lambda_X(World &world, const X_space &chi, X_space gamma; // compute if (calc_type == "full") { - gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); + gamma = compute_gamma_full( + world, {chi, ground_orbitals, vector_real_function_3d{}}, xc); } else if (calc_type == "static") { - gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); + gamma = compute_gamma_static( + world, {chi, ground_orbitals, vector_real_function_3d{}}, xc); } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); + gamma = compute_gamma_tda( + world, {chi, ground_orbitals, vector_real_function_3d{}}, xc); } if (r_params.print_level() >= 20) { auto gamma_mx = inner(Chi_truncated, gamma); @@ -1036,11 +1036,14 @@ auto ResponseBase::compute_response_potentials( X_space gamma; // compute if (calc_type == "full") { - gamma = compute_gamma_full(world, {chi, ground_orbitals}, xc); + gamma = compute_gamma_full( + world, {chi, ground_orbitals, vector_real_function_3d{}}, xc); } else if (calc_type == "static") { - gamma = compute_gamma_static(world, {chi, ground_orbitals}, xc); + gamma = compute_gamma_static( + world, {chi, ground_orbitals, vector_real_function_3d{}}, xc); } else { - gamma = compute_gamma_tda(world, {chi, ground_orbitals}, xc); + gamma = compute_gamma_tda( + world, {chi, ground_orbitals, vector_real_function_3d{}}, xc); } X_space Lambda_X( @@ -1804,6 +1807,7 @@ auto ResponseBase::orbital_load_balance(World &world, -> gamma_orbitals { auto X = std::get<0>(gammaOrbitals); auto psi0 = std::get<1>(gammaOrbitals); + auto rho1 = std::get<2>(gammaOrbitals); size_t m = X.num_states(); size_t n = X.num_orbitals(); @@ -1815,6 +1819,10 @@ auto ResponseBase::orbital_load_balance(World &world, for (const auto &phi0_i: psi0) { lb.add_tree(phi0_i, lbcost(1.0, 8.0), false); } + + for (const auto &rho1_i: rho1) { + lb.add_tree(rho1_i, lbcost(1.0, 8.0), false); + } for (const auto &xi: X.x) { for (const auto &xij: xi) { lb.add_tree(xij, lbcost(1.0, 8.0), false); @@ -1836,12 +1844,13 @@ auto ResponseBase::orbital_load_balance(World &world, // copy orbitals using new pmap auto X_copy = X.copy(new_process_map, true); auto psi0_copy = copy(world, psi0, new_process_map, true); + auto rho1_copy = copy(world, rho1, new_process_map, true); molresponse::end_timer(world, "Gamma Orbital Load Balance"); - return {X_copy, psi0_copy}; + return {X_copy, psi0_copy, rho1_copy}; } else { // return a copy with the same process map since we only have one world - return {X.copy(), copy(world, psi0)}; + return {X.copy(), copy(world, psi0), copy(world, rho1)}; } } diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index afff8f964a7..7f396df831e 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -411,7 +411,7 @@ struct residuals { }; -using gamma_orbitals = std::tuple; +using gamma_orbitals = std::tuple; class ResponseBase { public: @@ -619,6 +619,7 @@ class ResponseBase { const std::string &calc_type) const -> X_space; auto compute_theta_X(World &world, const X_space &chi, + const vector_real_function_3d &rho1, const XCOperator &xc, const std::string &calc_type) const -> X_space; @@ -798,9 +799,7 @@ class ResponseTester { static X_space compute_gamma_full(World &world, ResponseBase *p, double thresh) { XCOperator xc = p->make_xc_operator(world); - X_space gamma = - p->compute_gamma_full(world, {p->Chi, p->ground_orbitals}, xc); - return gamma; + return X_space{}; } X_space compute_lambda_X(World &world, ResponseBase *p, double thresh) { From c6d90c301bd677ec165e091378c6ced3f81762d3 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 14:12:18 -0400 Subject: [PATCH 1171/1312] turn the inner back --- src/apps/molresponse/x_space.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/x_space.cc b/src/apps/molresponse/x_space.cc index d08cac5fb84..fa52a49dc35 100644 --- a/src/apps/molresponse/x_space.cc +++ b/src/apps/molresponse/x_space.cc @@ -170,7 +170,7 @@ namespace madness { MADNESS_ASSERT(size_orbitals(A) > 0); MADNESS_ASSERT(same_size(A, B)); - return response_space_inner(A.x, B.x) + response_space_inner(A.y, B.y); + // return response_space_inner(A.x, B.x) + response_space_inner(A.y, B.y); auto a = to_response_matrix(A); auto b = to_response_matrix(B); From 3fb0699e007e22d5a41cba5d77370285fe217ea2 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 14:23:12 -0400 Subject: [PATCH 1172/1312] clean up iteration --- src/apps/molresponse/FrequencyResponse.cpp | 41 ++++++++++------------ 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 9dbbf5dcf27..2fb593be87d 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -189,47 +189,44 @@ void FrequencyResponse::iterate(World &world) { world, Chi, xc, bsh_x_ops, bsh_y_ops, projector, x_shifts, omega, kain_x_space, iter, max_rotation, rho_omega, x_relative_residuals, residuals); - // Here we have computed the new response orbitals and the residuals - // Now we need to compute the new density and the new density residuals - // Instead, update should also update the density - // compute rho after bsh update to compute residual, update density after kain to keep - // consistent with kain orbitals - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - rho_omega_old = copy(world, rho_omega); - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "make_density_old", - "make_density_old", iter_timing); + // first thing we should do is update the density residuals + // drho = rho(x)-rho(g(x)) + // new_rho= rho(g(x)) + for (const auto &b: Chi.active) { + density_residuals[b] = (rho_omega[b] - new_rho[b]).norm2(); } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + // Now we should update the orbitals and density + // x= x+deltax + // rho = rho(x+delta x) + if (compute_y) { + Chi = new_chi.copy(); + } else { + Chi.x = new_chi.x.copy(); + } + + if (r_params.print_level() >= 1) { molresponse::start_timer(world); } rho_omega = response_context.compute_density( - world, Chi, ground_orbitals, rho_omega_old, true); + world, Chi, ground_orbitals, rho_omega, true); - //rho_omega = update_density(world, new_chi, rho_omega_old); if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "make_density_new", - "make_density_new", iter_timing); + molresponse::end_timer(world, "make_density_old", + "make_density_old", iter_timing); } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } x_relative_residuals = copy(new_res.residual_norms); residuals = new_res.residual.copy(); - if (compute_y) { - Chi = new_chi.copy(); - } else { - Chi.x = new_chi.x.copy(); - } if (r_params.print_level() >= 1) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - density_residuals = copy(density_residuals_old); for (const auto &b: Chi.active) { density_residuals[b] = (rho_omega_old[b] - new_rho[b]).norm2(); } - density_residuals_old = copy(density_residuals); iter_function_data["r_d"] = density_residuals; iter_function_data["x_relative_residuals"] = x_relative_residuals; + auto dnorm = norm2s_T(world, rho_omega); iter_function_data["d"] = dnorm; polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); From 66848e1269299295db165f9e060e8e7d8921a954 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 14:28:58 -0400 Subject: [PATCH 1173/1312] fix density residual bug --- src/apps/molresponse/FrequencyResponse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 2fb593be87d..5b5708df861 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -222,7 +222,7 @@ void FrequencyResponse::iterate(World &world) { "copy_response_data", iter_timing); } for (const auto &b: Chi.active) { - density_residuals[b] = (rho_omega_old[b] - new_rho[b]).norm2(); + density_residuals[b] = (rho_omega[b] - new_rho[b]).norm2(); } iter_function_data["r_d"] = density_residuals; iter_function_data["x_relative_residuals"] = x_relative_residuals; From 934ead85bc84d76eb43c7c81e62e7d83de999af8 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 11 Apr 2023 15:27:48 -0400 Subject: [PATCH 1174/1312] Update tutorial.md --- doc/tutorial/tutorial.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index 5aef8a9fe91..eedeae7f545 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -18,6 +18,7 @@ Reference materials * [Cmake](https://cmake.org/) +$$H \Psi = E \psi$$ From 032c13c8517721c347ea577bd05806cc17666765 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 11 Apr 2023 15:31:20 -0400 Subject: [PATCH 1175/1312] Update tutorial.md --- doc/tutorial/tutorial.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index eedeae7f545..ce79f4a6d00 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -1,11 +1,11 @@ # MADNESS tutorial This tutorial covers -* downloading, building and installing MADNESS; -* an overview of the MADNESS parallel runtime sufficient to develop and run numerical applications; -* developing new applications using the numerical and chemistry APIS; -* running MADNESS applications in parallel; and -* using the MADNESS chemistry applications. +* downloading, building and installing MADNESS; [RJH] +* an overview of the MADNESS parallel runtime sufficient to develop and run numerical applications; [RJH] +* developing new applications using the numerical and chemistry APIS; [All of us] +* running MADNESS applications in parallel using threads + MPI; and [Hannes] +* using the MADNESS chemistry applications. [Florian, Hannes, Adrian] ## Downloading From 56849026accfbf84319e83112016e7f00ab1f676 Mon Sep 17 00:00:00 2001 From: hborchert <94846710+hborchert@users.noreply.github.com> Date: Tue, 11 Apr 2023 15:37:15 -0400 Subject: [PATCH 1176/1312] Update tutorial.md --- doc/tutorial/tutorial.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index ce79f4a6d00..5c6a863fd62 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -6,6 +6,7 @@ This tutorial covers * developing new applications using the numerical and chemistry APIS; [All of us] * running MADNESS applications in parallel using threads + MPI; and [Hannes] * using the MADNESS chemistry applications. [Florian, Hannes, Adrian] +* test Hannes ## Downloading From 9cf76d8787174e8f7e5966fc7c25e33530e648a1 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 11 Apr 2023 15:47:08 -0400 Subject: [PATCH 1177/1312] Update tutorial.md --- doc/tutorial/tutorial.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index 5c6a863fd62..05a27037d1e 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -4,8 +4,22 @@ This tutorial covers * downloading, building and installing MADNESS; [RJH] * an overview of the MADNESS parallel runtime sufficient to develop and run numerical applications; [RJH] * developing new applications using the numerical and chemistry APIS; [All of us] -* running MADNESS applications in parallel using threads + MPI; and [Hannes] + - overview of basic concepts and the numerical API [RJH] + - hello world in the numerical API [RJH] + - overview of the chemistry API [Florian] + - a simple Hartree-Fock program +* running MADNESS applications in parallel using threads + MPI [Hannes]; and + - basic concepts + - environment variables + - single process + - MPI + - Tips, tricks, and pitfalls + - binding process+threads to sockets + - avoid fast malloc libraries if using MPI * using the MADNESS chemistry applications. [Florian, Hannes, Adrian] + - moldft + - molresponse + - all the other codes * test Hannes ## Downloading From 93fe8a7927ed2086e46e93299268e45c90022935 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 16:32:49 -0400 Subject: [PATCH 1178/1312] remove vector of shared pointers --- src/apps/molresponse/FrequencyResponse.cpp | 62 ---------------------- src/apps/molresponse/FrequencyResponse.hpp | 3 -- src/apps/molresponse/ResponseBase.hpp | 9 +--- 3 files changed, 2 insertions(+), 72 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 5b5708df861..031a975b46f 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -312,68 +312,6 @@ auto FrequencyResponse::update_response( return {new_chi, {new_res, bsh}, new_rho}; } -auto FrequencyResponse::new_kain_x_space_update( - World &world, const X_space &x, const X_space &fx, - response_function_solver &rf_solver) -> X_space { - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - - bool compute_y = omega != 0.0; - - size_t m = x.num_states(); - size_t n = x.num_orbitals(); - size_t p = compute_y ? 2 : 1; - - - X_space kain_update(world, m, n); - // step 1 is to place all functions into a single vector - - - vector_real_function_3d vect_x(m * n * p); - vector_real_function_3d vect_fx(m * n * p); - vector_real_function_3d vect_rx(m * n * p); - - int orb_x; - int orb_y; - for (int i = 0; i < m; i++) { - orb_x = i * p * n; - for (int j = 0; j < n; j++) { - vect_x[orb_x + j] = x.x[i][j]; - vect_fx[orb_x + j] = fx.x[i][j]; - } - if (compute_y) { - orb_y = orb_x + n; - for (int j = 0; j < n; j++) { - vect_x[orb_y + j] = x.y[i][j]; - vect_fx[orb_y + j] = fx.y[i][j]; - } - } - } - vect_rx = sub(world, vect_fx, vect_x); - truncate(world, vect_rx); - - for (int i = 0; i < m; i++) { - orb_x = i * p * n; - for (int j = 0; j < n; j++) { - kain_update.x[i][j] = rf_solver[orb_x + j].update( - vect_x[orb_x + j], vect_rx[orb_x + j]); - } - if (compute_y) { - orb_y = orb_x + n; - for (int j = 0; j < n; j++) { - kain_update.y[i][j] = rf_solver[orb_y + j].update( - vect_x[orb_y + j], vect_rx[orb_y + j]); - } - } - } - if (world.rank() == 0) { - print("----------------End Kain Update -----------------"); - } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "kain_x_update", "kain_x_update", - iter_timing); - } - return kain_update; -} auto FrequencyResponse::bsh_update_response(World &world, X_space &theta_X, std::vector &bsh_x_ops, std::vector &bsh_y_ops, diff --git a/src/apps/molresponse/FrequencyResponse.hpp b/src/apps/molresponse/FrequencyResponse.hpp index ad86bfca9bd..baa0018dadb 100644 --- a/src/apps/molresponse/FrequencyResponse.hpp +++ b/src/apps/molresponse/FrequencyResponse.hpp @@ -79,9 +79,6 @@ class FrequencyResponse : public ResponseBase { response_solver &kain_x_space, size_t iteration, const double &max_rotation, const vector_real_function_3d &rho_old, const Tensor &old_residuals, const X_space &xres_old); - X_space new_kain_x_space_update(World &world, const X_space &x, - const X_space &fx, - response_function_solver &rf_solver); }; diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 7f396df831e..245ec1d94e7 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -411,7 +411,8 @@ struct residuals { }; -using gamma_orbitals = std::tuple; +using gamma_orbitals = + std::tuple; class ResponseBase { public: @@ -461,7 +462,6 @@ class ResponseBase { // shared pointers to Operators poperatorT shared_coulomb_operator;// shared pointer to seperated convolution operator - std::vector coul_ops; std::vector> gradop; // Stored functions mutable real_function_3d @@ -535,11 +535,6 @@ class ResponseBase { vtol = FunctionDefaults<3>::get_thresh() * safety; shared_coulomb_operator = poperatorT(CoulombOperatorPtr(world, r_params.lo(), thresh)); - coul_ops.clear(); - for (int i = 0; i < r_params.num_states(); i++) { - coul_ops.push_back(poperatorT(CoulombOperatorPtr( - world, r_params.lo(), FunctionDefaults<3>::get_thresh()))); - } gradop = gradient_operator(world); potential_manager = std::make_shared(molecule, "a"); potential_manager->make_nuclear_potential(world); From e986575a31da793b63030c277b9905ae6d10fc73 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 16:45:30 -0400 Subject: [PATCH 1179/1312] small change to compute j1 --- src/apps/molresponse/ResponseBase.hpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 245ec1d94e7..87087bd4092 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -157,10 +157,9 @@ class J1StrategyStable : public J1Strategy { X_space J = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); - vector_real_function_3d temp_J(3); for (const auto &b: x.active) { - temp_J[b] = apply(*coulomb_ops, rho1[b]); - J.x[b] = mul(world, temp_J[b], phi0, true); + auto temp_J = apply(*coulomb_ops, rho1[b]); + J.x[b] = mul(world, temp_J, phi0, true); } J.y = J.x.copy(); return J; From 46974d9772b0c84fa8490c3b3b82f53861c9f93d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 17:05:40 -0400 Subject: [PATCH 1180/1312] this might change something --- src/apps/molresponse/ResponseBase.hpp | 4 ++++ src/apps/molresponse/x_space.h | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 87087bd4092..a09afd6137f 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -157,6 +157,7 @@ class J1StrategyStable : public J1Strategy { X_space J = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); + if (world.rank() == 0) { print("J1StrategyStable"); } for (const auto &b: x.active) { auto temp_J = apply(*coulomb_ops, rho1[b]); J.x[b] = mul(world, temp_J, phi0, true); @@ -192,6 +193,7 @@ class K1StrategyFull : public K1Strategy { vector_real_function_3d xb; vector_real_function_3d yb; Exchange K1X, K2X, K1Y, K2Y; + if (world.rank() == 0) { print("K1StrategyFull"); } for (const auto &b: x.active) { xb = x.x[b]; @@ -230,6 +232,8 @@ class K1StrategyStatic : public K1Strategy { Exchange K1X{}; Exchange K1Y{}; + if (world.rank() == 0) { print("K1StrategyStatic"); } + for (const auto &b: x.active) { xb = x.x[b]; yb = x.x[b]; diff --git a/src/apps/molresponse/x_space.h b/src/apps/molresponse/x_space.h index 636fd82f56c..ba151a04bc9 100644 --- a/src/apps/molresponse/x_space.h +++ b/src/apps/molresponse/x_space.h @@ -81,7 +81,7 @@ namespace madness { auto new_x = X_space(*this);// copy for (int i = 0; i < new_x.num_states(); i++) { new_x.x[i] = madness::copy(world, x[i], p_map, false); - new_x.y[i] = madness::copy(world, x[i], p_map, false); + new_x.y[i] = madness::copy(world, y[i], p_map, false); } world.gop.fence(); return new_x; @@ -165,7 +165,6 @@ namespace madness { for (auto &i: result.active) { // if (world.rank() == 0) { print("oop_apply", i); } result.x[i] = func(A.x[i]); - world.gop.fence(); result.y[i] = func(A.y[i]); } world.gop.fence(); @@ -177,14 +176,15 @@ namespace madness { -> X_space { MADNESS_ASSERT(same_size(A, B)); - X_space result = A.copy();// create zero_functions - auto &world = result.x[0][0].world(); + auto &world = A.x[0][0].world(); + X_space result = X_space::zero_functions(world, A.num_states(), + A.num_orbitals()); for (const auto &i: result.active) { - auto ax = result.x[i]; + auto ax = A.x[i]; auto bx = B.x[i]; - auto ay = result.y[i]; + auto ay = A.y[i]; auto by = B.y[i]; result.x[i] = func(ax, bx); From 723ae850159815b53a9c128d04cd34cd9a960869 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 21:39:58 -0400 Subject: [PATCH 1181/1312] fix the residual --- src/apps/molresponse/FrequencyResponse.cpp | 3 --- src/apps/molresponse/ResponseBase.hpp | 13 ++++++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 031a975b46f..542b9cdaf94 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -221,9 +221,6 @@ void FrequencyResponse::iterate(World &world) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - for (const auto &b: Chi.active) { - density_residuals[b] = (rho_omega[b] - new_rho[b]).norm2(); - } iter_function_data["r_d"] = density_residuals; iter_function_data["x_relative_residuals"] = x_relative_residuals; diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index a09afd6137f..d041f137502 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -75,8 +75,8 @@ class FullDensityStrategy : public ComputeDensityStrategy { for (const auto &b: x.active) { - x_phi = mul(world, x.x[b], phi0, true); - y_phi = mul(world, x.y[b], phi0, true); + x_phi = mul(world, x.x[b], phi0, false); + y_phi = mul(world, x.y[b], phi0, false); world.gop.fence(); rho_new[b] = sum(world, x_phi, true); @@ -140,7 +140,7 @@ class J1StrategyFull : public J1Strategy { vector_real_function_3d temp_J(3); for (const auto &b: x.active) { temp_J[b] = apply(*coulomb_ops, rho1[b]); - J.x[b] = mul(world, temp_J[b], phi0, true); + J.x[b] = mul(world, temp_J[b], phi0, false); } J.y = J.x.copy(); return J; @@ -160,7 +160,11 @@ class J1StrategyStable : public J1Strategy { if (world.rank() == 0) { print("J1StrategyStable"); } for (const auto &b: x.active) { auto temp_J = apply(*coulomb_ops, rho1[b]); - J.x[b] = mul(world, temp_J, phi0, true); + if (true) { + auto norm = temp_J.norm2(); + if (world.rank() == 0) print("norm of temp_J:", norm); + } + J.x[b] = mul(world, temp_J, phi0, false); } J.y = J.x.copy(); return J; @@ -210,7 +214,6 @@ class K1StrategyFull : public K1Strategy { k1y = K1Y(phi0); k2x = K2X(phi0); k2y = K2Y(phi0); - world.gop.fence(); K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, true); K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, true); world.gop.fence(); From f5d78776db2b2b1770858284096140ffad0a81f8 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 21:57:16 -0400 Subject: [PATCH 1182/1312] fix k1 --- src/apps/molresponse/ResponseBase.hpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index d041f137502..b61b30bdfa5 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -158,14 +158,16 @@ class J1StrategyStable : public J1Strategy { X_space J = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); if (world.rank() == 0) { print("J1StrategyStable"); } + vector_real_function_3d temp_J(3); for (const auto &b: x.active) { - auto temp_J = apply(*coulomb_ops, rho1[b]); + temp_J[b] = apply(*coulomb_ops, rho1[b]); if (true) { - auto norm = temp_J.norm2(); + auto norm = temp_J[b].norm2(); if (world.rank() == 0) print("norm of temp_J:", norm); } - J.x[b] = mul(world, temp_J, phi0, false); + J.x[b] = mul(world, temp_J[b], phi0, false); } + world.gop.fence(); J.y = J.x.copy(); return J; } @@ -214,10 +216,11 @@ class K1StrategyFull : public K1Strategy { k1y = K1Y(phi0); k2x = K2X(phi0); k2y = K2Y(phi0); - K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, true); - K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, true); world.gop.fence(); + K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); + K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); } + world.gop.fence(); return K; } }; From 0faa03728d6db88c09e6b8c7b04339d0fddd0ae4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 22:14:25 -0400 Subject: [PATCH 1183/1312] new implementation of k1 --- src/apps/molresponse/ResponseBase.hpp | 74 +++++++++++++++++---------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index b61b30bdfa5..4c0cc1403e0 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -193,32 +193,47 @@ class K1StrategyFull : public K1Strategy { X_space compute_K1(World &world, const X_space &x, const vector_real_function_3d &phi0) const override { - X_space K = X_space::zero_functions(world, x.num_states(), - x.num_orbitals()); + auto K = X_space::zero_functions(world, x.num_states(), + x.num_orbitals()); vector_real_function_3d k1x, k1y, k2x, k2y; vector_real_function_3d xb; vector_real_function_3d yb; Exchange K1X, K2X, K1Y, K2Y; if (world.rank() == 0) { print("K1StrategyFull"); } - for (const auto &b: x.active) { - xb = x.x[b]; - yb = x.y[b]; + auto k1x_temp = + create_response_matrix(x.num_states(), x.num_orbitals()); + auto k1y_temp = + create_response_matrix(x.num_states(), x.num_orbitals()); + auto k2x_temp = + create_response_matrix(x.num_states(), x.num_orbitals()); + auto k2y_temp = + create_response_matrix(x.num_states(), x.num_orbitals()); - K1X = make_k(xb, phi0); - K1Y = make_k(phi0, yb); - K2X = make_k(yb, phi0); - K2Y = make_k(phi0, xb); + std::vector> K1Xs(x.num_states()); + std::vector> K1Ys(x.num_states()); + std::vector> K2Xs(x.num_states()); + std::vector> K2Ys(x.num_states()); - world.gop.fence(); - k1x = K1X(phi0); - k1y = K1Y(phi0); - k2x = K2X(phi0); - k2y = K2Y(phi0); - world.gop.fence(); - K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, false); - K.y[b] = gaxpy_oop(1.0, k2x, 1.0, k2y, false); + for (const auto &b: x.active) { + K1Xs[b] = make_k(x.x[b], phi0); + K1Ys[b] = make_k(phi0, x.y[b]); + K2Xs[b] = make_k(x.y[b], phi0); + K2Ys[b] = make_k(phi0, x.x[b]); + } + world.gop.fence(); + + for (const auto &b: x.active) { + k1x_temp[b] = K1Xs[b](phi0); + k1y_temp[b] = K1Ys[b](phi0); + k2x_temp[b] = K2Xs[b](phi0); + k2y_temp[b] = K2Ys[b](phi0); + } + world.gop.fence(); + for (const auto &b: x.active) { + K.x[b] = gaxpy_oop(1.0, k1x_temp[b], 1.0, k1y_temp[b], false); + K.y[b] = gaxpy_oop(1.0, k2x_temp[b], 1.0, k2y_temp[b], false); } world.gop.fence(); return K; @@ -233,22 +248,29 @@ class K1StrategyStatic : public K1Strategy { X_space K = X_space::zero_functions(world, x.num_states(), x.num_orbitals()); vector_real_function_3d k1x, k1y, k2x, k2y; - vector_real_function_3d xb; - vector_real_function_3d yb; Exchange K1X{}; Exchange K1Y{}; if (world.rank() == 0) { print("K1StrategyStatic"); } + auto k1_temp = create_response_matrix(x.num_states(), x.num_orbitals()); + auto k2_temp = create_response_matrix(x.num_states(), x.num_orbitals()); + std::vector> K1Xs(x.num_states()); + std::vector> K1Ys(x.num_states()); for (const auto &b: x.active) { - xb = x.x[b]; - yb = x.x[b]; - K1X = make_k(xb, phi0); - K1Y = make_k(phi0, yb); - k1x = K1X(phi0); - k1y = K1Y(phi0); - K.x[b] = gaxpy_oop(1.0, k1x, 1.0, k1y, true); + K1Xs[b] = make_k(x.x[b], phi0); + K1Ys[b] = make_k(phi0, x.x[b]); } + world.gop.fence(); + for (const auto &b: x.active) { + k1_temp[b] = K1Xs[b](phi0); + k2_temp[b] = K1Ys[b](phi0); + } + world.gop.fence(); + for (const auto &b: x.active) { + K.x[b] = gaxpy_oop(1.0, k1_temp[b], 1.0, k2_temp[b], false); + } + world.gop.fence(); return K; } }; From 3fc15051f3fa596543224a49b185cd8628e515b5 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 11 Apr 2023 22:28:52 -0400 Subject: [PATCH 1184/1312] change it back --- src/apps/molresponse/ResponseBase.hpp | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 4c0cc1403e0..91e37235dc1 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -215,23 +215,18 @@ class K1StrategyFull : public K1Strategy { std::vector> K2Xs(x.num_states()); std::vector> K2Ys(x.num_states()); - for (const auto &b: x.active) { K1Xs[b] = make_k(x.x[b], phi0); K1Ys[b] = make_k(phi0, x.y[b]); K2Xs[b] = make_k(x.y[b], phi0); K2Ys[b] = make_k(phi0, x.x[b]); - } - world.gop.fence(); + world.gop.fence(); - for (const auto &b: x.active) { k1x_temp[b] = K1Xs[b](phi0); k1y_temp[b] = K1Ys[b](phi0); k2x_temp[b] = K2Xs[b](phi0); k2y_temp[b] = K2Ys[b](phi0); - } - world.gop.fence(); - for (const auto &b: x.active) { + world.gop.fence(); K.x[b] = gaxpy_oop(1.0, k1x_temp[b], 1.0, k1y_temp[b], false); K.y[b] = gaxpy_oop(1.0, k2x_temp[b], 1.0, k2y_temp[b], false); } @@ -260,14 +255,8 @@ class K1StrategyStatic : public K1Strategy { for (const auto &b: x.active) { K1Xs[b] = make_k(x.x[b], phi0); K1Ys[b] = make_k(phi0, x.x[b]); - } - world.gop.fence(); - for (const auto &b: x.active) { k1_temp[b] = K1Xs[b](phi0); k2_temp[b] = K1Ys[b](phi0); - } - world.gop.fence(); - for (const auto &b: x.active) { K.x[b] = gaxpy_oop(1.0, k1_temp[b], 1.0, k2_temp[b], false); } world.gop.fence(); From 3f008cde80e5a3c78921fda72858ff5f9b434ca4 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 12 Apr 2023 07:57:28 -0400 Subject: [PATCH 1185/1312] try density this way --- src/apps/molresponse/FrequencyResponse.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 542b9cdaf94..dd1def36c9c 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -287,8 +287,6 @@ auto FrequencyResponse::update_response( X_space new_chi = bsh_update_response(world, theta_X, bsh_x_ops, bsh_y_ops, projector, x_shifts); - auto new_rho = response_context.compute_density( - world, new_chi, ground_orbitals, rho_old, true); inner_to_json(world, "x_new", response_context.inner(new_chi, new_chi), iter_function_data); @@ -306,6 +304,10 @@ auto FrequencyResponse::update_response( if (r_params.print_level() >= 1) { molresponse::end_timer(world, "update response", "update", iter_timing); } + + auto new_rho = response_context.compute_density( + world, new_chi, ground_orbitals, rho_old, true); + return {new_chi, {new_res, bsh}, new_rho}; } From 1adba01caeee956eea7c2dfada443687b4f92434 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 12 Apr 2023 15:25:54 +0200 Subject: [PATCH 1186/1312] change sprintf to snprintf --- src/madness/chem/MolecularOrbitals.h | 5 +++-- src/madness/chem/SCF.cc | 7 ++++--- src/madness/chem/molecularbasis.cc | 16 +++++++++++----- src/madness/misc/gprofexit.cc | 7 ++++--- src/madness/world/archive.h | 5 +++-- src/madness/world/parallel_archive.h | 15 +++++++++------ src/madness/world/redirectio.cc | 9 +++++---- src/madness/world/text_fstream_archive.cc | 20 +++++++++++--------- src/madness/world/text_fstream_archive.h | 19 +++++++++++-------- src/madness/world/thread.h | 5 +++-- 10 files changed, 64 insertions(+), 44 deletions(-) diff --git a/src/madness/chem/MolecularOrbitals.h b/src/madness/chem/MolecularOrbitals.h index 173239ee989..1b281c5f4b0 100644 --- a/src/madness/chem/MolecularOrbitals.h +++ b/src/madness/chem/MolecularOrbitals.h @@ -179,8 +179,9 @@ class MolecularOrbitals : public archive::ParallelSerializableObject { print("orbital # irrep energy occupation localize_set"); for (int i=mo.size()-1; i>=0; --i) { // double n=get_mos()[i].norm2(); - char buf[1024]; - sprintf(buf,"%5d %10s %12.8f %6.2f %8d", i, irreps[i].c_str(),get_eps()[i], + std::size_t bufsize=1024; + char buf[bufsize]; + snprintf(buf,bufsize,"%5d %10s %12.8f %6.2f %8d", i, irreps[i].c_str(),get_eps()[i], get_occ()[i],get_localize_sets()[i]); cout << std::string(buf) <("plotlo"); i <= param.get("plothi"); ++i) { - char fname[256]; + std::size_t bufsize=256; + char fname[bufsize]; if (i < param.nalpha()) { - sprintf(fname, "amo-%5.5d.dx", i); + snprintf(fname,bufsize, "amo-%5.5d.dx", i); plotdx(amo[i], fname, param.plot_cell(), npt, true); } if (!param.spin_restricted() && i < param.nbeta()) { - sprintf(fname, "bmo-%5.5d.dx", i); + snprintf(fname,bufsize, "bmo-%5.5d.dx", i); plotdx(bmo[i], fname, param.plot_cell(), npt, true); } } diff --git a/src/madness/chem/molecularbasis.cc b/src/madness/chem/molecularbasis.cc index d18df1a3b19..0472abcbfba 100644 --- a/src/madness/chem/molecularbasis.cc +++ b/src/madness/chem/molecularbasis.cc @@ -38,17 +38,23 @@ namespace madness { std::ostream& operator<<(std::ostream& s, const ContractedGaussianShell& c) { static const char* tag[] = {"s","p","d","f","g"}; - char buf[32768]; + std::size_t bufsize=32768; + char buf[bufsize]; char* p = buf; const std::vector& coeff = c.get_coeff(); const std::vector& expnt = c.get_expnt(); - p += sprintf(p,"%s [",tag[c.angular_momentum()]); + p += snprintf(p,bufsize,"%s [",tag[c.angular_momentum()]); + bufsize-=5; for (int i=0; i0; --p) { while (access("gmon.out",F_OK)) usleep(1000); - sprintf(buf,"gmon.out.%d",id+1); + snprintf(buf,bufsize,"gmon.out.%d",id+1); if (rename("gmon.out",buf)) fprintf(stderr,"gprofexit: failed renaming gmon.out to %s", buf); } } else if ((id+1) < nproc) { // Wait for process id+1 to commence writing - sprintf(buf,"gmon.out.%d",id+1); + snprintf(buf,bufsize,"gmon.out.%d",id+1); while (access(buf,F_OK)) usleep(10000); } } diff --git a/src/madness/world/archive.h b/src/madness/world/archive.h index 7977bfd94c2..162d52b144f 100644 --- a/src/madness/world/archive.h +++ b/src/madness/world/archive.h @@ -514,8 +514,9 @@ namespace madness { unsigned char cookie; ar.load(&cookie, 1); // cannot use >> if (cookie != ck) { - char msg[255]; - std::sprintf(msg,"InputArchive type mismatch: expected cookie " + const std::size_t bufsize=255; + char msg[bufsize]; + std::snprintf(msg,bufsize,"InputArchive type mismatch: expected cookie " "%u (%s) but got %u (%s) instead", ck, archive_type_names[ck], cookie,archive_type_names[cookie]); diff --git a/src/madness/world/parallel_archive.h b/src/madness/world/parallel_archive.h index 24d329b9d1b..f7d7bb2608e 100644 --- a/src/madness/world/parallel_archive.h +++ b/src/madness/world/parallel_archive.h @@ -169,9 +169,10 @@ namespace madness { MADNESS_ASSERT(filename); MADNESS_ASSERT(strlen(filename)-1::value || std::is_same::value, bool> exists(World& world, const char* filename) { - char buf[256]; + std::size_t bufsize=256; + char buf[bufsize]; MADNESS_ASSERT(strlen(filename)+7 <= sizeof(buf)); - sprintf(buf, "%s.%5.5d", filename, world.rank()); + snprintf(buf,bufsize, "%s.%5.5d", filename, world.rank()); bool status; if (world.rank() == 0) status = (access(buf, F_OK|R_OK) == 0); @@ -265,10 +267,11 @@ namespace madness { void> remove(World& world, const char* filename) { if (world.rank() == 0) { - char buf[268]; + std::size_t bufsize=268; + char buf[bufsize]; MADNESS_ASSERT(strlen(filename)+7 <= sizeof(buf)); for (ProcessID p=0; p" << std::endl; - sprintf(tag,"", + snprintf(tag,bufsize,"", ARCHIVE_MAJOR_VERSION, ARCHIVE_MINOR_VERSION); os << tag << std::endl; os << "" << std::endl; for (int i=0; i<256; ++i) { - sprintf(tag,"%d \"%s\"",i,archive_type_names[i]); + snprintf(tag,bufsize,"%d \"%s\"",i,archive_type_names[i]); store(tag,strlen(tag)); // Must use store to escape characters } os << "" << std::endl; @@ -139,12 +140,13 @@ namespace madness { void TextFstreamInputArchive::open(const char* filename, std::ios_base::openmode mode) { is.open(filename, mode); - char buf[256]; - is.getline(buf,256); // skip xml header - is.getline(buf,256); + std::size_t bufsize=256; + char buf[bufsize]; + is.getline(buf,bufsize); // skip xml header + is.getline(buf,bufsize); - char tag[256]; - sprintf(tag,"", + char tag[bufsize]; + snprintf(tag,bufsize,"", ARCHIVE_MAJOR_VERSION, ARCHIVE_MINOR_VERSION); if (strcmp(buf,tag)) { std::cout << "TextFstreamInputArchive: not an archive/bad version?" << std::endl; @@ -154,7 +156,7 @@ namespace madness { } // For now just skip over typemap - for (int i=0; i<258; ++i) is.getline(buf,256); + for (int i=0; i<258; ++i) is.getline(buf,bufsize); } } diff --git a/src/madness/world/text_fstream_archive.h b/src/madness/world/text_fstream_archive.h index 737b5209c91..4f8a24acfe7 100644 --- a/src/madness/world/text_fstream_archive.h +++ b/src/madness/world/text_fstream_archive.h @@ -73,9 +73,10 @@ namespace madness { /// \tparam T The type of data to be stored between the tags. template void store_start_tag() const { - char tag[256]; + std::size_t bufsize=256; + char tag[bufsize]; unsigned char cookie = archive_typeinfo::cookie; - sprintf(tag,"", cookie); + snprintf(tag,bufsize,"", cookie); os << tag << std::endl; MAD_ARCHIVE_DEBUG(std::cout << "textarchive: tag = " << tag << std::endl); } @@ -85,9 +86,10 @@ namespace madness { /// \tparam T The type of data to be stored between the tags. template void store_end_tag() const { - char tag[256]; + std::size_t bufsize=256; + char tag[bufsize]; unsigned char cookie = archive_typeinfo::cookie; - sprintf(tag,"",cookie); + snprintf(tag,bufsize,"",cookie); os << tag << std::endl; } @@ -171,13 +173,14 @@ namespace madness { /// expected type. template void check_start_tag(bool end=false) const { - char tag[256], ftag[256]; - is.getline(ftag,256); + std::size_t bufsize=256; + char tag[bufsize], ftag[bufsize]; + is.getline(ftag,bufsize); unsigned char cookie = archive_typeinfo::cookie; if (end) - sprintf(tag,"",cookie); + snprintf(tag,bufsize,"",cookie); else - sprintf(tag,"",cookie); + snprintf(tag,bufsize,"",cookie); if (strcmp(tag,ftag) != 0) { std::cout << "TextFstreamInputArchive: type mismatch: expected=" << tag diff --git a/src/madness/world/thread.h b/src/madness/world/thread.h index b5962e3f485..9330da6c87f 100644 --- a/src/madness/world/thread.h +++ b/src/madness/world/thread.h @@ -1417,8 +1417,9 @@ namespace madness { if(((current_time - start) > timeout) && (timeout > 1.0)) { // Check for timeout std::cerr << "!!MADNESS: Hung queue?" << std::endl; if (counter++ > 3) { - char errstr[256]; - sprintf(errstr, "ThreadPool::await() timed out after %.1lf seconds", timeout); + const long bufsize=256; + char errstr[bufsize]; + snprintf(errstr,bufsize, "ThreadPool::await() timed out after %.1lf seconds", timeout); throw madness::MadnessException(errstr, 0, 1, __LINE__, __FUNCTION__, __FILE__); From 2c8aed38228245b2899da5a339b901a8ef2a024a Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 12 Apr 2023 12:00:25 -0400 Subject: [PATCH 1187/1312] box size --- src/apps/molresponse/FrequencyResponse.cpp | 15 ++++++++------- src/apps/molresponse/testing/runners.hpp | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index dd1def36c9c..f96a975195b 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -206,14 +206,15 @@ void FrequencyResponse::iterate(World &world) { Chi.x = new_chi.x.copy(); } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - rho_omega = response_context.compute_density( - world, Chi, ground_orbitals, rho_omega, true); + // if (r_params.print_level() >= 1) { molresponse::start_timer(world); } + // rho_omega = response_context.compute_density( + // world, Chi, ground_orbitals, rho_omega, true); + + // if (r_params.print_level() >= 1) { + // molresponse::end_timer(world, "make_density_old", + // "make_density_old", iter_timing); + // } - if (r_params.print_level() >= 1) { - molresponse::end_timer(world, "make_density_old", - "make_density_old", iter_timing); - } if (r_params.print_level() >= 1) { molresponse::start_timer(world); } x_relative_residuals = copy(new_res.residual_norms); residuals = new_res.residual.copy(); diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 5e6a3e43aab..1da370dc1a0 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -364,7 +364,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("maxiter", 20); //param1.set_user_defined_value("Kain", true); param1.set_user_defined_value("xc", moldftSchema.xc); - param1.set_user_defined_value("l", 200); + param1.set_user_defined_value("l", 50); if (precision == "low") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); From 843262c5457763de25791d8cccd70385d15c7f00 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 12 Apr 2023 12:15:38 -0400 Subject: [PATCH 1188/1312] copy rho --- src/apps/molresponse/FrequencyResponse.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index f96a975195b..590143af1ce 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -196,6 +196,8 @@ void FrequencyResponse::iterate(World &world) { for (const auto &b: Chi.active) { density_residuals[b] = (rho_omega[b] - new_rho[b]).norm2(); } + + rho_omega = copy(world, new_rho); // Now we should update the orbitals and density // x= x+deltax // rho = rho(x+delta x) From 14609bbd4e78d41cccd9379d82778c60e6f44180 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 12 Apr 2023 15:44:49 -0400 Subject: [PATCH 1189/1312] density residual printing --- src/apps/molresponse/FrequencyResponse.cpp | 9 --------- src/apps/molresponse/ResponseBase.cpp | 1 - 2 files changed, 10 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 590143af1ce..ac56bb45994 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -208,15 +208,6 @@ void FrequencyResponse::iterate(World &world) { Chi.x = new_chi.x.copy(); } - // if (r_params.print_level() >= 1) { molresponse::start_timer(world); } - // rho_omega = response_context.compute_density( - // world, Chi, ground_orbitals, rho_omega, true); - - // if (r_params.print_level() >= 1) { - // molresponse::end_timer(world, "make_density_old", - // "make_density_old", iter_timing); - // } - if (r_params.print_level() >= 1) { molresponse::start_timer(world); } x_relative_residuals = copy(new_res.residual_norms); residuals = new_res.residual.copy(); diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index 7a7926407ca..f0dcb361234 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -2417,7 +2417,6 @@ response_data::response_data() : iter(0) { function_data.insert({"d", std::vector>(0)}); function_data.insert({"density_norms", std::vector>(0)}); function_data.insert({"r_d", std::vector>(0)}); - function_data.insert({"r_d", std::vector>(0)}); function_data.insert( {"x_relative_residuals", std::vector>(0)}); } From f67ce0457650372bb83116f826e3a66254c09424 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 12 Apr 2023 16:08:15 -0400 Subject: [PATCH 1190/1312] try to fix printing of d residual --- src/apps/molresponse/FrequencyResponse.cpp | 12 +++++++++--- src/apps/molresponse/ResponseBase.hpp | 6 ++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index ac56bb45994..7b0e7dfa0a5 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -158,6 +158,7 @@ void FrequencyResponse::iterate(World &world) { print("converged", converged); print("active", Chi.active); } + b = 0; all_done = std::all_of(converged.begin(), converged.end(), [](const auto &ci) { return ci; }); if (all_done || iter == r_params.maxiter()) { @@ -190,14 +191,20 @@ void FrequencyResponse::iterate(World &world) { omega, kain_x_space, iter, max_rotation, rho_omega, x_relative_residuals, residuals); + auto old_rho = copy(world, rho_omega); + rho_omega = copy(world, new_rho); // first thing we should do is update the density residuals // drho = rho(x)-rho(g(x)) // new_rho= rho(g(x)) + for (const auto &b: Chi.active) { - density_residuals[b] = (rho_omega[b] - new_rho[b]).norm2(); + auto drho_b = rho_omega[b] - old_rho[b]; + auto drho_b_norm = drho_b.norm2(); + world.gop.fence(); + density_residuals[b] = drho_b_norm; } + iter_function_data["r_d"] = density_residuals; - rho_omega = copy(world, new_rho); // Now we should update the orbitals and density // x= x+deltax // rho = rho(x+delta x) @@ -215,7 +222,6 @@ void FrequencyResponse::iterate(World &world) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - iter_function_data["r_d"] = density_residuals; iter_function_data["x_relative_residuals"] = x_relative_residuals; auto dnorm = norm2s_T(world, rho_omega); diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 91e37235dc1..630b163d6a5 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -49,12 +49,10 @@ class StaticDensityStrategy : public ComputeDensityStrategy { for (const auto &b: x.active) { - x_phi = mul(world, x.x[b], phi0, false); - - world.gop.fence(); + x_phi = mul(world, x.x[b], phi0, true); rho_new[b] = 2 * sum(world, x_phi); - world.gop.fence(); } + world.gop.fence(); truncate(world, rho_new); return rho_new; } From 7b9c1e46f56650c4bd9505dd3e7ce4b8e193e7d7 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 12 Apr 2023 16:42:29 -0400 Subject: [PATCH 1191/1312] fence --- src/apps/molresponse/FrequencyResponse.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 7b0e7dfa0a5..b357a620482 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -203,6 +203,7 @@ void FrequencyResponse::iterate(World &world) { world.gop.fence(); density_residuals[b] = drho_b_norm; } + world.gop.fence(); iter_function_data["r_d"] = density_residuals; // Now we should update the orbitals and density From 6bd4a98d5d9c98d4fc4e38edd55dcc1d1652ca15 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 12 Apr 2023 16:55:06 -0400 Subject: [PATCH 1192/1312] try this --- src/apps/molresponse/FrequencyResponse.cpp | 7 ++++++- src/apps/molresponse/ResponseBase.cpp | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index b357a620482..c9f0e9acc49 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -100,6 +100,7 @@ void FrequencyResponse::iterate(World &world) { //if (world.rank() == 0) { print("At the start of iterate x", checkx); } iter_timing.clear(); iter_function_data.clear(); + if (r_params.print_level() >= 1) { molresponse::start_timer(world); if (world.rank() == 0) @@ -204,6 +205,9 @@ void FrequencyResponse::iterate(World &world) { density_residuals[b] = drho_b_norm; } world.gop.fence(); + inner_to_json(world, "density_residuals", density_residuals, + iter_function_data); + iter_function_data["r_d"] = density_residuals; // Now we should update the orbitals and density @@ -223,7 +227,8 @@ void FrequencyResponse::iterate(World &world) { molresponse::end_timer(world, "copy_response_data", "copy_response_data", iter_timing); } - iter_function_data["x_relative_residuals"] = x_relative_residuals; + inner_to_json(world, "x_relative_residuals", x_relative_residuals, + iter_function_data); auto dnorm = norm2s_T(world, rho_omega); iter_function_data["d"] = dnorm; diff --git a/src/apps/molresponse/ResponseBase.cpp b/src/apps/molresponse/ResponseBase.cpp index f0dcb361234..0ebf9b514b3 100644 --- a/src/apps/molresponse/ResponseBase.cpp +++ b/src/apps/molresponse/ResponseBase.cpp @@ -2413,6 +2413,7 @@ response_data::response_data() : iter(0) { function_data.insert({"alpha", std::vector>(0)}); function_data.insert({"r_alpha", std::vector>(0)}); + function_data.insert({"density_residuals", std::vector>(0)}); function_data.insert({"d", std::vector>(0)}); function_data.insert({"density_norms", std::vector>(0)}); From 9bd3ac974148c94e147fb00e9597ffb8dd3fb442 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 12 Apr 2023 17:04:57 -0400 Subject: [PATCH 1193/1312] try moving density residual --- src/apps/molresponse/FrequencyResponse.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index c9f0e9acc49..578aafe10cc 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -115,6 +115,9 @@ void FrequencyResponse::iterate(World &world) { if (world.rank() == 0) { print("d-residual > 20...break"); } break; } + + inner_to_json(world, "density_residuals", density_residuals, + iter_function_data); auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.x.norm2(); auto rho_norms = madness::norm2s_T(world, rho_omega); @@ -205,8 +208,6 @@ void FrequencyResponse::iterate(World &world) { density_residuals[b] = drho_b_norm; } world.gop.fence(); - inner_to_json(world, "density_residuals", density_residuals, - iter_function_data); iter_function_data["r_d"] = density_residuals; From 0e06f9e46dfd27ee7ba2c828647556685f1f5d1b Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 12 Apr 2023 18:23:24 -0400 Subject: [PATCH 1194/1312] can't trust the value unless I copy it --- src/apps/molresponse/FrequencyResponse.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/apps/molresponse/FrequencyResponse.cpp b/src/apps/molresponse/FrequencyResponse.cpp index 578aafe10cc..931afd040f7 100644 --- a/src/apps/molresponse/FrequencyResponse.cpp +++ b/src/apps/molresponse/FrequencyResponse.cpp @@ -32,7 +32,6 @@ void FrequencyResponse::iterate(World &world) { pow(thresh, a_pow) * pow(10, b_pow);//thresh^a*10^b Tensor x_relative_residuals((int(m))); Tensor density_residuals((int(m))); - Tensor density_residuals_old((int(m))); bool static_res = (omega == 0.0); bool compute_y = not static_res; @@ -116,8 +115,6 @@ void FrequencyResponse::iterate(World &world) { break; } - inner_to_json(world, "density_residuals", density_residuals, - iter_function_data); auto chi_norms = (compute_y) ? Chi.norm2s() : Chi.x.norm2(); auto rho_norms = madness::norm2s_T(world, rho_omega); @@ -209,7 +206,8 @@ void FrequencyResponse::iterate(World &world) { } world.gop.fence(); - iter_function_data["r_d"] = density_residuals; + auto old_density_residual = copy(density_residuals); + iter_function_data["r_d"] = old_density_residual; // Now we should update the orbitals and density // x= x+deltax @@ -231,6 +229,9 @@ void FrequencyResponse::iterate(World &world) { inner_to_json(world, "x_relative_residuals", x_relative_residuals, iter_function_data); + inner_to_json(world, "density_residuals", old_density_residual, + iter_function_data); + auto dnorm = norm2s_T(world, rho_omega); iter_function_data["d"] = dnorm; polar = ((compute_y) ? -2 : -4) * response_context.inner(Chi, PQ); From 2a670c632266d618b88afee0eb9c138f88c0cd8d Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Wed, 12 Apr 2023 22:27:25 -0400 Subject: [PATCH 1195/1312] tighten the density convergence threshold --- src/apps/molresponse/testing/runners.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 1da370dc1a0..fedadf4786f 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -371,7 +371,7 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); - param1.set_user_defined_value("dconv", 1e-5); + param1.set_user_defined_value("dconv", 1e-6); } else { param1.set_user_defined_value>("protocol", {1e-8}); param1.set_user_defined_value("dconv", 1e-6); @@ -509,7 +509,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param if (world.rank() == 0) { if (precision == "high") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); - r_params.set_user_defined_value("dconv", 1e-5); + r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); From d47f9d76bbe10aa2c031a0a2de88753ea96b7cf9 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sun, 16 Apr 2023 22:41:17 +0200 Subject: [PATCH 1196/1312] usability improvements --- src/madness/chem/CCPotentials.cc | 2 +- src/madness/chem/nemo.cc | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/madness/chem/CCPotentials.cc b/src/madness/chem/CCPotentials.cc index e7a9ab31bd4..e6f76d3b160 100644 --- a/src/madness/chem/CCPotentials.cc +++ b/src/madness/chem/CCPotentials.cc @@ -808,7 +808,7 @@ CCPotentials::update_pair_mp2_macrotask(World& world, const CCPair& pair, const if (parameters.debug())unew.print_size("truncated-unew"); timer_mp2.info(); - const real_function_6d residue = pair.function() - unew; + const real_function_6d residue = (pair.function() - unew).truncate(); return residue; } diff --git a/src/madness/chem/nemo.cc b/src/madness/chem/nemo.cc index c5268541bda..11bb0f8ca36 100644 --- a/src/madness/chem/nemo.cc +++ b/src/madness/chem/nemo.cc @@ -146,6 +146,7 @@ Nemo::Nemo(World& world, const commandlineparser &parser) : symmetry_projector=projector_irrep(param.pointgroup()) .set_ordering("keep").set_verbosity(0).set_orthonormalize_irreps(true);; if (symmetry_projector.get_verbosity()>1) symmetry_projector.print_character_table(); + calc->param=param; }; From 3f3730e0804492d600bf1c0d0d6ed3eaa8b45618 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Mon, 17 Apr 2023 09:41:30 +0200 Subject: [PATCH 1197/1312] fixed failing test --- src/apps/cis/test_energy_he.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/cis/test_energy_he.py b/src/apps/cis/test_energy_he.py index d92e3e31326..1b0c673cf98 100755 --- a/src/apps/cis/test_energy_he.py +++ b/src/apps/cis/test_energy_he.py @@ -17,7 +17,7 @@ # run test global_arguments=' --geometry=he' - dft_arguments=' --dft="maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' + dft_arguments=' --dft="k=6; maxiter=1; econv=1.e-4; dconv=1.e-3; prefix='+prefix+'"' other_arguments=' --response="thresh=1.e-3; maxiter=10; guess_maxiter=0; econv=1; dconv=1; guess_excitation_operators=dipole+; guess_excitations=2; excitations=2"' cmd='rm '+outputfile+'; ./@BINARY@ '+global_arguments + dft_arguments + other_arguments print("executing \n ",cmd) From 3b22feb8e57c3278cccf8873d66bb40f96b32253 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 18 Apr 2023 07:16:53 -0400 Subject: [PATCH 1198/1312] remove unused header file --- src/apps/molresponse/testing/generate_frequency_data.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/apps/molresponse/testing/generate_frequency_data.cpp b/src/apps/molresponse/testing/generate_frequency_data.cpp index 9a245931f97..f7c6e0a5aab 100644 --- a/src/apps/molresponse/testing/generate_frequency_data.cpp +++ b/src/apps/molresponse/testing/generate_frequency_data.cpp @@ -13,7 +13,6 @@ #if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) #include -#include static inline int file_exists(const char *input_name) { struct stat buffer {}; From ee47465bdd993e6f587ef99bb171b601e0d17c85 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 18 Apr 2023 07:23:52 -0400 Subject: [PATCH 1199/1312] call it molecules --- .../molresponse/testing/full_excited_test.cpp | 4 ++-- .../testing/full_frequency_test.cpp | 4 ++-- .../molresponse/testing/full_ground_test.cpp | 4 ++-- src/apps/molresponse/testing/mad-excited.cpp | 2 +- src/apps/molresponse/testing/runners.hpp | 19 ++++++++++--------- .../molresponse/testing/test_development.cpp | 2 +- 6 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/apps/molresponse/testing/full_excited_test.cpp b/src/apps/molresponse/testing/full_excited_test.cpp index 34a0e45860a..b88414f66c9 100644 --- a/src/apps/molresponse/testing/full_excited_test.cpp +++ b/src/apps/molresponse/testing/full_excited_test.cpp @@ -50,10 +50,10 @@ int main(int argc, char *argv[]) { auto schema = runSchema(world, xc); try { - if (std::filesystem::is_directory(schema.molecule_path)) { + if (std::filesystem::is_directory(schema.molecules)) { // for every molecule within the molecule path for (const std::filesystem::directory_entry &mol_path: - std::filesystem::directory_iterator(schema.molecule_path)) { + std::filesystem::directory_iterator(schema.molecules)) { std::filesystem::current_path(schema.xc_path); diff --git a/src/apps/molresponse/testing/full_frequency_test.cpp b/src/apps/molresponse/testing/full_frequency_test.cpp index f389acd0a91..13d14f598f0 100644 --- a/src/apps/molresponse/testing/full_frequency_test.cpp +++ b/src/apps/molresponse/testing/full_frequency_test.cpp @@ -41,9 +41,9 @@ int main(int argc, char *argv[]) { auto schema = runSchema(world, xc); try { - if (std::filesystem::is_directory(schema.molecule_path)) { + if (std::filesystem::is_directory(schema.molecules)) { for (const std::filesystem::directory_entry &mol_path: - std::filesystem::directory_iterator(schema.molecule_path)) { + std::filesystem::directory_iterator(schema.molecules)) { std::filesystem::current_path(schema.xc_path); if (mol_path.path().extension() == ".mol") { diff --git a/src/apps/molresponse/testing/full_ground_test.cpp b/src/apps/molresponse/testing/full_ground_test.cpp index deeef50fea0..a7d03f7dbbb 100644 --- a/src/apps/molresponse/testing/full_ground_test.cpp +++ b/src/apps/molresponse/testing/full_ground_test.cpp @@ -42,10 +42,10 @@ int main(int argc, char *argv[]) { auto schema = runSchema(world, xc); try { - if (std::filesystem::is_directory(schema.molecule_path)) { + if (std::filesystem::is_directory(schema.molecules)) { // for every molecule within the molecule path for (const std::filesystem::directory_entry &mol_path: - std::filesystem::directory_iterator(schema.molecule_path)) { + std::filesystem::directory_iterator(schema.molecules)) { std::filesystem::current_path(schema.xc_path); if (mol_path.path().extension() == ".mol") { diff --git a/src/apps/molresponse/testing/mad-excited.cpp b/src/apps/molresponse/testing/mad-excited.cpp index 23c1eda8154..0b3a89e9a89 100644 --- a/src/apps/molresponse/testing/mad-excited.cpp +++ b/src/apps/molresponse/testing/mad-excited.cpp @@ -54,7 +54,7 @@ auto main(int argc, char *argv[]) -> int { } auto schema = runSchema(world, xc); - auto mol_path = addPath(schema.molecule_path, molecule_name); + auto mol_path = addPath(schema.molecules, molecule_name); try { diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index fedadf4786f..33af7c0dcc2 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -39,7 +39,8 @@ auto addPath(const path &root, const std::string &branch) -> path { struct runSchema { path root; // root directory - path molecule_path; // molecule directory + path json_database; // json database + path molecules; // molecule directory path xc_path; // create xc path path freq_json; // path to freq_json path dalton_dipole_json; // path to dalton to dipole json @@ -48,8 +49,8 @@ struct runSchema { explicit runSchema(World &world, const std::string &xc) { root = std::filesystem::current_path();//="/"+molecule_name; - molecule_path = root; - molecule_path += "/molecules"; + molecules = root; + molecules += "/molecules"; xc_path = addPath(root, "/" + xc); world.gop.fence(); if (std::filesystem::exists(xc_path)) { @@ -61,9 +62,9 @@ struct runSchema { } } // Get the database where the calculation will be run from - freq_json = addPath(molecule_path, "/frequency.json"); - dalton_excited_json = addPath(molecule_path, "/dalton-excited.json"); - dalton_dipole_json = addPath(molecule_path, "/dalton-dipole.json"); + freq_json = addPath(molecules, "/frequency.json"); + dalton_excited_json = addPath(molecules, "/dalton-excited.json"); + dalton_dipole_json = addPath(molecules, "/dalton-dipole.json"); rdb = ResponseDataBase(); if (std::filesystem::exists(freq_json)) { std::ifstream ifs(freq_json); @@ -77,7 +78,7 @@ struct runSchema { void print() const { ::print("------------Database Runner---------------"); ::print("Root: ", root); - ::print("Molecule Directory: ", molecule_path); + ::print("Molecule Directory: ", molecules); ::print("XC Path: ", xc_path); ::print("Freq Json Path: ", freq_json); ::print("Dalton Dipole Json Path: ", dalton_dipole_json); @@ -103,8 +104,8 @@ struct moldftSchema { moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); calc_info_json_path = addPath(moldft_path, "/moldft.calc_info.json"); - mol_path = addPath(schema.molecule_path, "/" + mol_name + ".mol"); - moldft_json_path = addPath(schema.molecule_path, "/moldft.json"); + mol_path = addPath(schema.molecules, "/" + mol_name + ".mol"); + moldft_json_path = addPath(schema.molecules, "/moldft.json"); if (std::filesystem::exists(moldft_json_path)) { std::ifstream ifs(moldft_json_path); ifs >> moldft_json; diff --git a/src/apps/molresponse/testing/test_development.cpp b/src/apps/molresponse/testing/test_development.cpp index 722b178f1d3..e4111ba9fcc 100644 --- a/src/apps/molresponse/testing/test_development.cpp +++ b/src/apps/molresponse/testing/test_development.cpp @@ -31,7 +31,7 @@ int main(int argc, char *argv[]) { // xc include (hf/lda) // operators include (excited-state) auto schema = runSchema(world, xc); - auto mol_path = addPath(schema.molecule_path, molecule_name); + auto mol_path = addPath(schema.molecules, molecule_name); auto m_schema = moldftSchema(world, molecule_name, xc, schema); auto excited_schema = excitedSchema(schema, m_schema); excited_schema.print(); From c41eb5c0565ada5f0b7a8072afa215d90bc97ea6 Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 18 Apr 2023 07:36:07 -0400 Subject: [PATCH 1200/1312] all future databases rely on definition of json_data directory --- src/apps/molresponse/testing/runners.hpp | 221 ++++++++++++++--------- 1 file changed, 135 insertions(+), 86 deletions(-) diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index 33af7c0dcc2..bbd4821932f 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -40,37 +40,40 @@ auto addPath(const path &root, const std::string &branch) -> path { struct runSchema { path root; // root directory path json_database; // json database - path molecules; // molecule directory + path molecules; // molecule directory path xc_path; // create xc path path freq_json; // path to freq_json path dalton_dipole_json; // path to dalton to dipole json path dalton_excited_json;// path to dalton excited json - ResponseDataBase rdb; + ResponseDataBase freq_json_data; explicit runSchema(World &world, const std::string &xc) { root = std::filesystem::current_path();//="/"+molecule_name; - molecules = root; - molecules += "/molecules"; - xc_path = addPath(root, "/" + xc); + molecules = root.append("molecules"); + xc_path = root.append(xc); + json_database=root.append("json_data"); + + freq_json =json_database.append("frequency.json"); + dalton_dipole_json = json_database.append("dalton-dipole.json"); + dalton_excited_json = json_database.append("dalton-excited.json"); + world.gop.fence(); if (std::filesystem::exists(xc_path)) { - if (world.rank() == 0) { std::cout << "XC Directory Exists" << std::endl; } + if (world.rank() == 0) { ::print(xc, " Directory Exists"); } } else { if (world.rank() == 0) { - std::cout << "Creating XC directory" << std::endl; + ::print("Creating ", xc, " directory"); std::filesystem::create_directory(xc_path); } } // Get the database where the calculation will be run from - freq_json = addPath(molecules, "/frequency.json"); - dalton_excited_json = addPath(molecules, "/dalton-excited.json"); - dalton_dipole_json = addPath(molecules, "/dalton-dipole.json"); - rdb = ResponseDataBase(); + + freq_json_data = ResponseDataBase(); if (std::filesystem::exists(freq_json)) { std::ifstream ifs(freq_json); json j_read; ifs >> j_read; - rdb.set_data(j_read); + freq_json_data.set_data(j_read); } if (world.rank() == 0) { print(); } } @@ -99,7 +102,8 @@ struct moldftSchema { std::string mol_name; std::string xc; - moldftSchema(World &world, std::string molecule_name, std::string m_xc, const runSchema &schema) + moldftSchema(World &world, std::string molecule_name, std::string m_xc, + const runSchema &schema) : mol_name(std::move(molecule_name)), xc(std::move(m_xc)) { moldft_path = addPath(schema.xc_path, '/' + mol_name); moldft_restart = addPath(moldft_path, "/moldft.restartdata.00000"); @@ -118,10 +122,10 @@ struct moldftSchema { if (world.rank() == 0) { std::cout << "time: " << calc_info_json["time"] << std::endl; - std::cout << "MOLDFT return energy: " << calc_info_json["return_energy"] - << std::endl; - std::cout << "MOLDFT return energy answer: " << moldft_json["return_energy"] - << std::endl; + std::cout << "MOLDFT return energy: " + << calc_info_json["return_energy"] << std::endl; + std::cout << "MOLDFT return energy answer: " + << moldft_json["return_energy"] << std::endl; } } if (world.rank() == 0) { print(); } @@ -147,8 +151,8 @@ struct frequencySchema { const path moldft_path; vector freq; - frequencySchema(World &world, const runSchema &run_schema, const moldftSchema &m_schema, - std::string r_operator); + frequencySchema(World &world, const runSchema &run_schema, + const moldftSchema &m_schema, std::string r_operator); void print_schema() { print("Frequency Calculation"); @@ -160,11 +164,12 @@ struct frequencySchema { } }; frequencySchema::frequencySchema(World &world, const runSchema &run_schema, - const moldftSchema &m_schema, std::string r_operator) + const moldftSchema &m_schema, + std::string r_operator) : mol_name(m_schema.mol_name), xc(m_schema.xc), op(std::move(r_operator)), moldft_path(m_schema.moldft_path) { if (world.rank() == 0) { - freq = run_schema.rdb.get_frequencies(mol_name, xc, op); + freq = run_schema.freq_json_data.get_frequencies(mol_name, xc, op); print_schema(); } world.gop.broadcast_serializable(freq, 0); @@ -181,7 +186,8 @@ frequencySchema::frequencySchema(World &world, const runSchema &run_schema, * @return */ size_t set_excited_states(const ResponseDataBase &response_data_base, - const std::string &molecule_name, const std::string &xc) { + const std::string &molecule_name, + const std::string &xc) { const std::string property = "excited-state"; @@ -189,8 +195,8 @@ size_t set_excited_states(const ResponseDataBase &response_data_base, return response_data_base.get_num_states(molecule_name, xc, property); } catch (json::exception &e) { std::cout << e.what() << std::endl; - std::cout << "did not find the frequency data for [" << molecule_name << "][" << xc << "][" - << property << "]\n"; + std::cout << "did not find the frequency data for [" << molecule_name + << "][" << xc << "][" << property << "]\n"; return 4; } } @@ -207,8 +213,9 @@ size_t set_excited_states(const ResponseDataBase &response_data_base, * @param xc * @return */ -std::filesystem::path generate_excited_run_path(const std::filesystem::path &moldft_path, - const size_t &num_states) { +std::filesystem::path +generate_excited_run_path(const std::filesystem::path &moldft_path, + const size_t &num_states) { std::string s_num_states = std::to_string(num_states); std::string run_name = "excited-" + s_num_states; // set r_params to restart true if restart file exist @@ -249,9 +256,11 @@ struct excitedSchema { path rb_json; - excitedSchema(const runSchema &run_schema, const moldftSchema &m_schema) : xc(m_schema.xc) { - num_states = set_excited_states(run_schema.rdb, m_schema.mol_name, xc); - excited_state_run_path = generate_excited_run_path(m_schema.moldft_path, num_states); + excitedSchema(const runSchema &run_schema, const moldftSchema &m_schema) + : xc(m_schema.xc) { + num_states = set_excited_states(run_schema.freq_json_data, m_schema.mol_name, xc); + excited_state_run_path = + generate_excited_run_path(m_schema.moldft_path, num_states); auto [sp, s] = generate_excited_save_path(excited_state_run_path); save_path = sp; save_string = s; @@ -279,8 +288,9 @@ struct excitedSchema { * @param xc * @return xc_path */ -std::filesystem::path create_xc_path_and_directory(const std::filesystem::path &root, - const std::string &xc) { +std::filesystem::path +create_xc_path_and_directory(const std::filesystem::path &root, + const std::string &xc) { // copy construct the root path auto xc_path = std::filesystem::path(root); @@ -306,7 +316,8 @@ std::filesystem::path create_xc_path_and_directory(const std::filesystem::path & * @param frequency_run_path * @return */ -auto generate_frequency_save_path(const std::filesystem::path &frequency_run_path) +auto generate_frequency_save_path( + const std::filesystem::path &frequency_run_path) -> std::pair { auto save_path = std::filesystem::path(frequency_run_path); @@ -331,9 +342,10 @@ auto generate_frequency_save_path(const std::filesystem::path &frequency_run_pat * @param xc * @return */ -auto generate_response_frequency_run_path(const std::filesystem::path &moldft_path, - const std::string &property, const double &frequency, - const std::string &xc) -> std::filesystem::path { +auto generate_response_frequency_run_path( + const std::filesystem::path &moldft_path, const std::string &property, + const double &frequency, const std::string &xc) + -> std::filesystem::path { std::string s_frequency = std::to_string(frequency); auto sp = s_frequency.find('.'); s_frequency = s_frequency.replace(sp, sp, "-"); @@ -355,8 +367,8 @@ auto generate_response_frequency_run_path(const std::filesystem::path &moldft_pa * @param moldft_filename * @param xc */ -void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, bool restart, - const std::string &precision) { +void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, + bool restart, const std::string &precision) { CalculationParameters param1; json calcInfo; @@ -368,10 +380,12 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo param1.set_user_defined_value("l", 50); if (precision == "low") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6}); + param1.set_user_defined_value>("protocol", + {1e-4, 1e-6}); param1.set_user_defined_value("dconv", 1e-4); } else if (precision == "high") { - param1.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + param1.set_user_defined_value>("protocol", + {1e-4, 1e-6, 1e-7}); param1.set_user_defined_value("dconv", 1e-6); } else { param1.set_user_defined_value>("protocol", {1e-8}); @@ -397,15 +411,18 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // if parameters are different or if I want to run no matter what run // if I want to restart and if I can. restart if (try_run) { - if (world.rank() == 0) { print("-------------Running moldft------------"); } + if (world.rank() == 0) { + print("-------------Running moldft------------"); + } // if params are different run and if restart exists and if im asking to restar if (std::filesystem::exists(moldftSchema.moldft_restart) && restart) { param1.set_user_defined_value("restart", true); } world.gop.fence(); if (world.rank() == 0) { - molresponse::write_test_input test_input(param1, "moldft.in", - moldftSchema.mol_path);// molecule HF + molresponse::write_test_input test_input( + param1, "moldft.in", + moldftSchema.mol_path);// molecule HF } world.gop.fence(); commandlineparser parser; @@ -421,8 +438,10 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo SCF calc(world, parser); if (world.rank() == 0) { print("\n\n"); - print(" MADNESS Hartree-Fock and Density Functional Theory Program"); - print(" ----------------------------------------------------------\n"); + print(" MADNESS Hartree-Fock and Density Functional Theory " + "Program"); + print(" ----------------------------------------------------------" + "\n"); print("\n"); calc.molecule.print(); print("\n"); @@ -442,7 +461,8 @@ void runMOLDFT(World &world, const moldftSchema &moldftSchema, bool try_run, boo // double energy=ME.value(calc.molecule.get_all_coords().flat()); // ugh! ME.value(calc.molecule.get_all_coords().flat());// ugh! world.gop.fence(); - const real_function_3d rho = 2.0 * calc.make_density(world, calc.aocc, calc.amo); + const real_function_3d rho = + 2.0 * calc.make_density(world, calc.aocc, calc.amo); auto dipole_t = calc.dipole(world, rho); std::map results; results["scf_energy"] = calc.current_energy; @@ -473,10 +493,12 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, if (high_prec) { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + r_params.set_user_defined_value>("protocol", + {1e-4, 1e-6, 1e-7}); r_params.set_user_defined_value("dconv", 1e-6); } else { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); + r_params.set_user_defined_value>("protocol", + {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); } //r_params.set_user_defined_value("archive", std::string("../restartdata")); @@ -504,15 +526,20 @@ void set_excited_parameters(ResponseParameters &r_params, const std::string &xc, * @param xc * @param frequency */ -void set_frequency_response_parameters(World &world, ResponseParameters &r_params, - const std::string &property, const std::string &xc, - const double &frequency, const std::string &precision) { +void set_frequency_response_parameters(World &world, + ResponseParameters &r_params, + const std::string &property, + const std::string &xc, + const double &frequency, + const std::string &precision) { if (world.rank() == 0) { if (precision == "high") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6, 1e-7}); + r_params.set_user_defined_value>("protocol", + {1e-4, 1e-6, 1e-7}); r_params.set_user_defined_value("dconv", 1e-6); } else if (precision == "low") { - r_params.set_user_defined_value>("protocol", {1e-4, 1e-6}); + r_params.set_user_defined_value>("protocol", + {1e-4, 1e-6}); r_params.set_user_defined_value("dconv", 1e-4); } else { r_params.set_user_defined_value>("protocol", {1e-9}); @@ -524,7 +551,7 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param r_params.set_user_defined_value("kain", true); r_params.set_user_defined_value("omega", frequency); r_params.set_user_defined_value("first_order", true); - r_params.set_user_defined_value("plot_all_orbitals",true); + r_params.set_user_defined_value("plot_all_orbitals", true); r_params.set_user_defined_value("plot", false); r_params.set_user_defined_value("print_level", 20); r_params.set_user_defined_value("guess_xyz", false); @@ -550,31 +577,37 @@ void set_frequency_response_parameters(World &world, ResponseParameters &r_param * @param frequency * @param moldft_path */ -static auto set_frequency_path_and_restart(World &world, ResponseParameters ¶meters, - const std::string &property, const double &frequency, - const std::string &xc, - const std::filesystem::path &moldft_path, - std::filesystem::path &restart_path, bool restart) - -> std::filesystem::path { +static auto +set_frequency_path_and_restart(World &world, ResponseParameters ¶meters, + const std::string &property, + const double &frequency, const std::string &xc, + const std::filesystem::path &moldft_path, + std::filesystem::path &restart_path, + bool restart) -> std::filesystem::path { if (world.rank() == 0) { print("restart path", restart_path); } // change the logic create save path - auto frequency_run_path = - generate_response_frequency_run_path(moldft_path, property, frequency, xc); + auto frequency_run_path = generate_response_frequency_run_path( + moldft_path, property, frequency, xc); world.gop.fence(); if (world.rank() == 0) { print("frequency run path", frequency_run_path); } // Crea if (std::filesystem::is_directory(frequency_run_path)) { - if (world.rank() == 0) { cout << "Response directory found " << std::endl; } + if (world.rank() == 0) { + cout << "Response directory found " << std::endl; + } } else {// create the file std::filesystem::create_directory(frequency_run_path); - if (world.rank() == 0) { cout << "Creating response_path directory" << std::endl; } + if (world.rank() == 0) { + cout << "Creating response_path directory" << std::endl; + } } std::filesystem::current_path(frequency_run_path); // frequency save path - auto [save_path, save_string] = generate_frequency_save_path(frequency_run_path); + auto [save_path, save_string] = + generate_frequency_save_path(frequency_run_path); if (world.rank() == 0) { parameters.set_user_defined_value("save", true); parameters.set_user_defined_value("save_file", save_string); @@ -586,11 +619,14 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par parameters.set_user_defined_value("restart_file", save_string); } else if (std::filesystem::exists(restart_path)) { parameters.set_user_defined_value("restart", true); - auto split_restart_path = split(restart_path.replace_extension("").string(), '/'); + auto split_restart_path = + split(restart_path.replace_extension("").string(), '/'); std::string restart_file_short = - "../" + split_restart_path[split_restart_path.size() - 2] + "/" + - split_restart_path[split_restart_path.size() - 1]; - parameters.set_user_defined_value("restart_file", restart_file_short); + "../" + + split_restart_path[split_restart_path.size() - 2] + + "/" + split_restart_path[split_restart_path.size() - 1]; + parameters.set_user_defined_value("restart_file", + restart_file_short); // Then we restart from the previous file instead } else { parameters.set_user_defined_value("restart", false); @@ -616,20 +652,27 @@ static auto set_frequency_path_and_restart(World &world, ResponseParameters &par */ auto RunResponse(World &world, const std::string &filename, double frequency, const std::string &property, const std::string &xc, - const std::filesystem::path &moldft_path, std::filesystem::path restart_path, - const std::string &precision) -> std::pair { + const std::filesystem::path &moldft_path, + std::filesystem::path restart_path, + const std::string &precision) + -> std::pair { // Set the response parameters ResponseParameters r_params{}; - set_frequency_response_parameters(world, r_params, property, xc, frequency, precision); - auto save_path = set_frequency_path_and_restart(world, r_params, property, frequency, xc, - moldft_path, restart_path, true); - if (world.rank() == 0) { molresponse::write_response_input(r_params, filename); } + set_frequency_response_parameters(world, r_params, property, xc, frequency, + precision); + auto save_path = + set_frequency_path_and_restart(world, r_params, property, frequency, + xc, moldft_path, restart_path, true); + if (world.rank() == 0) { + molresponse::write_response_input(r_params, filename); + } // if rbase exists and converged I just return save path and true if (std::filesystem::exists("response_base.json")) { std::ifstream ifs("response_base.json"); json response_base; ifs >> response_base; - if (response_base["converged"] && response_base["precision"]["dconv"] == r_params.dconv()) { + if (response_base["converged"] && + response_base["precision"]["dconv"] == r_params.dconv()) { return {save_path, true}; } } @@ -674,8 +717,9 @@ auto RunResponse(World &world, const std::string &filename, double frequency, * @param frequency * @param moldft_path */ -static void set_and_write_restart_excited_parameters(ResponseParameters ¶meters, - excitedSchema &schema, bool restart) { +static void +set_and_write_restart_excited_parameters(ResponseParameters ¶meters, + excitedSchema &schema, bool restart) { parameters.set_user_defined_value("save", true); parameters.set_user_defined_value("save_file", schema.save_string); @@ -721,7 +765,8 @@ static void create_excited_paths(excitedSchema &schema) { * @param restart_path * @return */ -auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec) -> bool { +auto runExcited(World &world, excitedSchema schema, bool restart, + bool high_prec) -> bool { // Set the response parameters @@ -763,11 +808,13 @@ auto runExcited(World &world, excitedSchema schema, bool restart, bool high_prec * @param xc * @param property */ -void runFrequencyTests(World &world, const frequencySchema &schema, const std::string &high_prec) { +void runFrequencyTests(World &world, const frequencySchema &schema, + const std::string &high_prec) { std::filesystem::current_path(schema.moldft_path); // add a restart path - auto restart_path = addPath(schema.moldft_path, "/" + schema.op + "_0-000000.00000/restart_" + - schema.op + "_0-000000.00000"); + auto restart_path = addPath(schema.moldft_path, + "/" + schema.op + "_0-000000.00000/restart_" + + schema.op + "_0-000000.00000"); std::pair success{schema.moldft_path, false}; bool first = true; for (const auto &freq: schema.freq) { @@ -782,8 +829,8 @@ void runFrequencyTests(World &world, const frequencySchema &schema, const std::s } else { throw Response_Convergence_Error{}; } - success = RunResponse(world, "response.in", freq, schema.op, schema.xc, schema.moldft_path, - restart_path, high_prec); + success = RunResponse(world, "response.in", freq, schema.op, schema.xc, + schema.moldft_path, restart_path, high_prec); if (world.rank() == 0) { print("Frequency ", freq, " completed"); } } } @@ -801,12 +848,14 @@ void moldft(World &world, moldftSchema &m_schema, bool try_moldft, bool restart, const std::string &precision) { if (std::filesystem::is_directory(m_schema.moldft_path)) { - if (world.rank() == 0) { cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; } + if (world.rank() == 0) { + cout << "MOLDFT directory found " << m_schema.mol_path << "\n"; + } } else {// create the file if (world.rank() == 0) { std::filesystem::create_directory(m_schema.moldft_path); - cout << "Creating MOLDFT directory for " << m_schema.mol_name << ":/" - << m_schema.moldft_path << ":\n"; + cout << "Creating MOLDFT directory for " << m_schema.mol_name + << ":/" << m_schema.moldft_path << ":\n"; } world.gop.fence(); } From 28c393acf2f8aadf360384dbb54f1552a94a5056 Mon Sep 17 00:00:00 2001 From: hborchert <94846710+hborchert@users.noreply.github.com> Date: Tue, 18 Apr 2023 15:04:42 -0400 Subject: [PATCH 1201/1312] Update tutorial.md --- doc/tutorial/tutorial.md | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index 05a27037d1e..f29a706b89a 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -20,7 +20,6 @@ This tutorial covers - moldft - molresponse - all the other codes -* test Hannes ## Downloading From 97ee7ebbf9ae2ab5c4ba922a7b6163214e0b5213 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 18 Apr 2023 15:25:22 -0400 Subject: [PATCH 1202/1312] amends https://github.com/m-a-d-n-e-s-s/madness/commit/0ed41fa2ba9b6bfdc97d6787e60a694352841868 --- src/apps/cc2/CMakeLists.txt | 4 ++-- src/apps/cis/CMakeLists.txt | 2 +- src/apps/mp2/CMakeLists.txt | 7 +++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/apps/cc2/CMakeLists.txt b/src/apps/cc2/CMakeLists.txt index 81e63e55c31..370b4b7875e 100644 --- a/src/apps/cc2/CMakeLists.txt +++ b/src/apps/cc2/CMakeLists.txt @@ -1,9 +1,9 @@ -# src/apps/moldft +# src/apps/cc2 add_mad_executable(cc2 cc2.cc "MADchem") add_dependencies(applications-madness cc2) -if (ENABLE_GENTENSOR) +if (ENABLE_GENTENSOR AND BUILD_TESTING) add_scripted_tests(test_callable.py cc2 "short;applications") # runs he with one frozen orbital.. endif() diff --git a/src/apps/cis/CMakeLists.txt b/src/apps/cis/CMakeLists.txt index 74bfe56c623..4e3bb523be6 100644 --- a/src/apps/cis/CMakeLists.txt +++ b/src/apps/cis/CMakeLists.txt @@ -1,4 +1,4 @@ -# src/apps/moldft +# src/apps/cis add_mad_executable(cis cis.cpp "MADchem") add_dependencies(applications-madness cis) diff --git a/src/apps/mp2/CMakeLists.txt b/src/apps/mp2/CMakeLists.txt index 9a99b2f52c7..a9c911e5e5a 100644 --- a/src/apps/mp2/CMakeLists.txt +++ b/src/apps/mp2/CMakeLists.txt @@ -1,11 +1,10 @@ -# src/apps/moldft +# src/apps/mp2 add_mad_executable(mp2 mp2.cc "MADchem") add_dependencies(applications-madness mp2) -if (ENABLE_GENTENSOR) - add_scripted_tests(test_callable.py mp2 "short;applications") +if (ENABLE_GENTENSOR AND BUILD_TESTING) + add_scripted_tests(test_callable.py mp2 "short;applications") endif() - install(TARGETS mp2 DESTINATION "${MADNESS_INSTALL_BINDIR}") From 81b8be263941f20f94894233d2fcfa1ab316b323 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 18 Apr 2023 15:26:13 -0400 Subject: [PATCH 1203/1312] use FindOrFetch scripts from the MADNESS tree --- external/parsec.cmake | 2 +- src/madness/world/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/external/parsec.cmake b/external/parsec.cmake index 69be27c04dd..3720256428b 100644 --- a/external/parsec.cmake +++ b/external/parsec.cmake @@ -1,5 +1,5 @@ if(ENABLE_PARSEC) - include(FindOrFetchPARSEC) + include(${PROJECT_SOURCE_DIR}/cmake/modules/FindOrFetchPARSEC.cmake) if(TARGET PaRSEC::parsec) set(HAVE_PARSEC 1) diff --git a/src/madness/world/CMakeLists.txt b/src/madness/world/CMakeLists.txt index 10e2a3348cc..3a73c93bc39 100644 --- a/src/madness/world/CMakeLists.txt +++ b/src/madness/world/CMakeLists.txt @@ -40,7 +40,7 @@ set(targetname MADworld) # N.B. If cereal is fetched it will be part of cereal export set if(MADNESS_ENABLE_CEREAL) - include(FindOrFetchCereal) + include(${PROJECT_SOURCE_DIR}/cmake/modules/FindOrFetchCereal.cmake) target_link_libraries(${targetname} PUBLIC cereal) target_compile_definitions(${targetname} PUBLIC MADNESS_HAS_CEREAL) endif() From dc3294160209cbd683bfb57cb2b933bd5f86e07e Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Tue, 18 Apr 2023 15:26:30 -0400 Subject: [PATCH 1204/1312] teach MADNESS how to serialize std::optional --- src/madness/world/archive.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/madness/world/archive.h b/src/madness/world/archive.h index 162d52b144f..66caffd7f83 100644 --- a/src/madness/world/archive.h +++ b/src/madness/world/archive.h @@ -51,6 +51,7 @@ #include #include #include +#include #include #include //#include @@ -1321,6 +1322,34 @@ namespace madness { } }; + /// Serialize (deserialize) an std::optional. + + /// \tparam Archive The archive type. + /// \tparam T The data type stored in the optional object + template + struct ArchiveSerializeImpl< Archive, std::optional, std::enable_if_t> > { + /// Serialize the \c std::optional. + + /// \param[in] ar The archive. + /// \param[in,out] t The \c optional. + static inline void serialize(const Archive& ar, std::optional& t) { + MAD_ARCHIVE_DEBUG(std::cout << "(de)serialize std::optional" << std::endl); + if constexpr (is_output_archive_v) { // serialize + ar & t.has_value(); + if (t.has_value()) + ar & t.value(); + } else { + bool has_value; + ar & has_value; + if (has_value) { + T value; + ar & value; + t = std::move(value); + } + } + } + }; + namespace { template From ad927a0fe7ac91903a0c9bd482cfafe79849b9ea Mon Sep 17 00:00:00 2001 From: Adrian Hurtado Date: Tue, 18 Apr 2023 20:32:10 -0400 Subject: [PATCH 1205/1312] compatible with qrp --- .../testing/response_data_base.hpp | 40 ++++++++++++------- src/apps/molresponse/testing/runners.hpp | 15 +++---- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/apps/molresponse/testing/response_data_base.hpp b/src/apps/molresponse/testing/response_data_base.hpp index 3fec7c5585a..b7f8097d692 100644 --- a/src/apps/molresponse/testing/response_data_base.hpp +++ b/src/apps/molresponse/testing/response_data_base.hpp @@ -19,6 +19,7 @@ class ResponseDataBase { json retrieve_data(const std::string &molecule, const std::string &xc, const std::string &property) const { + ::print(j); return j.at(molecule).at(xc).at(property); } @@ -48,7 +49,8 @@ class ResponseDataBase { return retrieve_data(molecule, xc, property).get(); } - std::vector get_frequencies(const std::string &molecule, const std::string &xc, + std::vector get_frequencies(const std::string &molecule, + const std::string &xc, const std::string &property) const { return retrieve_data(molecule, xc, property).get>(); } @@ -68,12 +70,14 @@ class ResponseDataBase { ifs >> dalton_excited; ::print("Read Dalton Excited"); ::print(dalton_excited); - std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] - ["aug-cc-pVTZ"]["response"]["freq"]; + std::vector freq = + dalton_excited[molecule_name][xc]["excited-state"] + ["aug-cc-pVTZ"]["response"]["freq"]; auto omega_max = freq.at(0); omega_max = omega_max / 2.0; ::print(omega_max); - std::vector omegas = {0, omega_max / 8.0, omega_max / 4.0, + std::vector omegas = {0, omega_max / 8.0, + omega_max / 4.0, omega_max / 2.0, omega_max}; j_add[molecule_name][xc][op] = omegas; } catch (const json::out_of_range &e) { @@ -94,7 +98,8 @@ class ResponseDataBase { } }; -auto generate_dipole_frequencies(const std::string &molecule_name, std::string xc) -> vector { +auto generate_dipole_frequencies(const std::string &molecule_name, + std::string xc) -> vector { if (std::filesystem::exists("molecules/dalton-excited.json")) { std::ifstream ifs("molecules/dalton-excited.json"); @@ -103,25 +108,29 @@ auto generate_dipole_frequencies(const std::string &molecule_name, std::string x json dalton_excited; ifs >> dalton_excited; ::print("Read Dalton Excited for ", molecule_name); - ::print(dalton_excited[molecule_name][xc]["excited-state"]["aug-cc-pVTZ"]["response"]["freq"]); - std::vector freq = dalton_excited[molecule_name][xc]["excited-state"] - ["aug-cc-pVTZ"]["response"]["freq"]; + ::print(dalton_excited[molecule_name][xc]["excited-state"] + ["aug-cc-pVTZ"]["response"]["freq"]); + std::vector freq = + dalton_excited[molecule_name][xc]["excited-state"] + ["aug-cc-pVTZ"]["response"]["freq"]; auto omega_max = freq.at(0); omega_max = omega_max / 2.0; ::print("max frequency at cc-pVTZ", omega_max); std::vector omegas = {}; int Nsteps = 9; - for (int i = 0; i < Nsteps; i++) { omegas.push_back(omega_max * (double) i / 8.0); } + for (int i = 0; i < Nsteps; i++) { + omegas.push_back(omega_max * (double) i / 8.0); + } return omegas; } catch (const json::out_of_range &e) { std::cout << e.what() << std::endl; - return std::vector(1,0); + return std::vector(1, 0); // The molecule file exists in the database therefore it is okay to add to frequency.json } catch (const json::type_error &e) { std::cout << e.what() << std::endl; - return std::vector(1,0); + return std::vector(1, 0); } } else { @@ -129,8 +138,9 @@ auto generate_dipole_frequencies(const std::string &molecule_name, std::string x return {0}; } } -json generate_response_data(const std::filesystem::path &molecule_path, const std::string &xc, - const std::string &property, const vector &freq) { +json generate_response_data(const std::filesystem::path &molecule_path, + const std::string &xc, const std::string &property, + const vector &freq) { json data; for (const std::filesystem::directory_entry &mol_path: std::filesystem::directory_iterator(molecule_path)) { @@ -144,8 +154,8 @@ json generate_response_data(const std::filesystem::path &molecule_path, const st return data; } -json generate_excited_data(const std::filesystem::path &molecule_path, const std::string &xc, - int num_states) { +json generate_excited_data(const std::filesystem::path &molecule_path, + const std::string &xc, int num_states) { json data; for (const std::filesystem::directory_entry &mol_path: std::filesystem::directory_iterator(molecule_path)) { diff --git a/src/apps/molresponse/testing/runners.hpp b/src/apps/molresponse/testing/runners.hpp index bbd4821932f..9171f5ff92c 100644 --- a/src/apps/molresponse/testing/runners.hpp +++ b/src/apps/molresponse/testing/runners.hpp @@ -49,13 +49,13 @@ struct runSchema { explicit runSchema(World &world, const std::string &xc) { root = std::filesystem::current_path();//="/"+molecule_name; - molecules = root.append("molecules"); - xc_path = root.append(xc); - json_database=root.append("json_data"); + molecules = root / "molecules"; + xc_path = root / xc; + json_database = root / "json_data"; - freq_json =json_database.append("frequency.json"); - dalton_dipole_json = json_database.append("dalton-dipole.json"); - dalton_excited_json = json_database.append("dalton-excited.json"); + freq_json = json_database / "frequency.json"; + dalton_dipole_json = json_database / "dalton-dipole.json"; + dalton_excited_json = json_database / "dalton-excited.json"; world.gop.fence(); if (std::filesystem::exists(xc_path)) { @@ -258,7 +258,8 @@ struct excitedSchema { excitedSchema(const runSchema &run_schema, const moldftSchema &m_schema) : xc(m_schema.xc) { - num_states = set_excited_states(run_schema.freq_json_data, m_schema.mol_name, xc); + num_states = set_excited_states(run_schema.freq_json_data, + m_schema.mol_name, xc); excited_state_run_path = generate_excited_run_path(m_schema.moldft_path, num_states); auto [sp, s] = generate_excited_save_path(excited_state_run_path); From 5637d2ac3a048d90f98974577685232815156e8e Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 19 Apr 2023 07:35:06 +0200 Subject: [PATCH 1206/1312] test --- CMakeLists.txt | 2 ++ cmake/config.h.in | 1 + 2 files changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d0c84d6821..dc0a37ac066 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,6 +164,8 @@ option(ENABLE_BOOST "Enable C++ Boost Libraries" OFF) option(ENABLE_GENTENSOR "Enable generic tensor support" OFF) add_feature_info(GENTENSOR ENABLE_GENTENSOR "enables use of MRA Function compression that allows computing in 6 dimensions") +set(MADNESS_USE_GENTENSOR ${ENABLE_GENTENSOR} CACHE BOOL + "enables use of MRA Function compression that allows computing in 6 dimensions") if(ENABLE_GENTENSOR) add_definitions(-DUSE_GENTENSOR) diff --git a/cmake/config.h.in b/cmake/config.h.in index 0a8e1ce08d6..97ead7074e7 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -113,6 +113,7 @@ /* Define to enable MADNESS features */ #cmakedefine MADNESS_TASK_PROFILING 1 #cmakedefine MADNESS_USE_BSEND_ACKS 1 +#cmakedefine ENABLE_GENTENSOR 1 #cmakedefine NEVER_SPIN 1 #cmakedefine TENSOR_BOUNDS_CHECKING 1 #cmakedefine TENSOR_INSTANCE_COUNT 1 From 0fb311f0bb0f535691a9642e119d99c3b19a6ce5 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 19 Apr 2023 08:34:14 +0200 Subject: [PATCH 1207/1312] fixed previous commit for forwarding gentensor use to dependent projects --- src/madness/tensor/tensor.h | 2 +- src/madness/tensor/test_lowranktensor.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/madness/tensor/tensor.h b/src/madness/tensor/tensor.h index 2cb18d7c020..c438f2dcc07 100644 --- a/src/madness/tensor/tensor.h +++ b/src/madness/tensor/tensor.h @@ -61,7 +61,7 @@ #include #include -#ifdef USE_GENTENSOR +#ifdef ENABLE_GENTENSOR #define HAVE_GENTENSOR 1 #else #define HAVE_GENTENSOR 0 diff --git a/src/madness/tensor/test_lowranktensor.cc b/src/madness/tensor/test_lowranktensor.cc index 761acc4f11e..cc65b0d32e0 100644 --- a/src/madness/tensor/test_lowranktensor.cc +++ b/src/madness/tensor/test_lowranktensor.cc @@ -5,8 +5,8 @@ * Author: fbischoff */ -#ifndef USE_GENTENSOR -#define USE_GENTENSOR +#ifndef ENABLE_GENTENSOR +#define ENABLE_GENTENSOR #endif #include From 9e4ce9f24db9563c8855bae25a34b91ffd116fdb Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 19 Apr 2023 09:27:20 +0200 Subject: [PATCH 1208/1312] introducing madchem.h in the top-level include directory --- src/CMakeLists.txt | 4 +- src/{chem.h => madchem.h} | 58 ++++++++++++++++------ src/madness/chem/CMakeLists.txt | 1 - src/madness/chem/SCF.cc | 2 +- src/madness/chem/test_correlation_factor.h | 42 ---------------- 5 files changed, 47 insertions(+), 60 deletions(-) rename src/{chem.h => madchem.h} (57%) delete mode 100644 src/madness/chem/test_correlation_factor.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 08f743e12c5..7a8873abc61 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,6 +9,6 @@ install(FILES madness.h DESTINATION "${MADNESS_INSTALL_INCLUDEDIR}" COMPONENT madness) -install(FILES chem.h - DESTINATION "${MADNESS_INSTALL_INCLUDEDIR}/madness" +install(FILES madchem.h + DESTINATION "${MADNESS_INSTALL_INCLUDEDIR}" COMPONENT chem) diff --git a/src/chem.h b/src/madchem.h similarity index 57% rename from src/chem.h rename to src/madchem.h index 6be6bea3ecc..3715cfc7d4f 100644 --- a/src/chem.h +++ b/src/madchem.h @@ -1,42 +1,72 @@ -#ifndef MADNESS_CHEM_H -#define MADNESS_CHEM_H +#ifndef MADNESS_MADCHEM_H +#define MADNESS_MADCHEM_H -#include -#include +// numerical library +#include + +// convenience +#include +#include + +// the KAIN nonlinear solver +#include + +// quantum chemistry headers +#include #include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include +#include #include #include -#include #include #include #include -#include #include #include #include #include #include -#include #include #include -#include +#include +#include +#include #include #include +#include #include #include #include -#include -#include -#include -#include #include #include #include +#include +#include - -#endif //MADNESS_CHEM_H +#endif //MADNESS_MADCHEM_H diff --git a/src/madness/chem/CMakeLists.txt b/src/madness/chem/CMakeLists.txt index 33a4314b3ed..60f22dc2aac 100644 --- a/src/madness/chem/CMakeLists.txt +++ b/src/madness/chem/CMakeLists.txt @@ -54,7 +54,6 @@ set(MADCHEM_HEADERS SCFOperators.h SCFProtocol.h TDHF.h - test_correlation_factor.h vibanal.h write_test_input.h xcfunctional.h diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 017fa3d9760..682b6aa87fe 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -40,7 +40,7 @@ #include #include #include -#include +#include #if defined(__has_include) # if __has_include() diff --git a/src/madness/chem/test_correlation_factor.h b/src/madness/chem/test_correlation_factor.h deleted file mode 100644 index 05fd0beff69..00000000000 --- a/src/madness/chem/test_correlation_factor.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * test_correlation_factor.h - * - * Created on: Aug 28, 2015 - * Author: kottmanj - */ -#ifndef TEST_CORRELATION_FACTOR -#define TEST_CORRELATION_FACTOR - -#include - - -struct test_correlation_factor{ - test_correlation_factor(World &world, const real_function_3d &f, const double eps) : world(world), corrfac(world), f(f), eps(eps){ - corrfac = CorrelationFactor(world, 1.0, 1.e-7, 1.e-6); - } - test_correlation_factor(World &world,const CorrelationFactor & corrfactor, const real_function_3d &f, const double eps) : world(world), corrfac(corrfactor), f(f), eps(eps){ - - } - - World &world; - CorrelationFactor corrfac; - real_function_3d f; - const double eps; - - - void make_test(){ - output("Testing Correlation Factor"); - real_function_6d ftest = corrfac.apply_U(f,f,eps); - output("Ended Testing for the given function f\n the norm is: " + stringify(ftest.norm2())); - plot_plane(world,ftest,"Uef"); - } - - void output(const std::string &msg)const{ - if(world.rank()==0){ - std::cout << msg << std::endl; - } - } - -}; - -#endif From 3a2bf351ccc02399f11addeced946f344e154826 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 19 Apr 2023 10:11:56 +0200 Subject: [PATCH 1209/1312] fixed helium_exact --- src/examples/helium_exact.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/examples/helium_exact.cc b/src/examples/helium_exact.cc index 9f33606e6aa..a73354e2f7b 100644 --- a/src/examples/helium_exact.cc +++ b/src/examples/helium_exact.cc @@ -451,6 +451,7 @@ int main(int argc, char** argv) { // read out input and stuff commandlineparser parser(argc,argv); + parser.set_keyval("geometry","he"); // it's always going to be helium Nemo nemo(world, parser); auto calc=nemo.get_calc(); From 712a9e4b718d649ae0f7584b2a63f284c344dcc6 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 19 Apr 2023 10:15:09 +0200 Subject: [PATCH 1210/1312] update documentation --- doc/numerical_library.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/doc/numerical_library.md b/doc/numerical_library.md index a104037963a..6ae060d1453 100644 --- a/doc/numerical_library.md +++ b/doc/numerical_library.md @@ -35,7 +35,6 @@ target_link_libraries(yourbinary madness) In file `main.cpp`: ````c -#define USE_GENTENSOR 1 // only needed if madness was configured with `-D ENABLE_GENTENSOR=1 #include using namespace madness; int main(int argc, char* argv[]) { @@ -58,13 +57,6 @@ int main(int argc, char* argv[]) { ```` Going through the code line by line: -````c -#define USE_GENTENSOR 1` // only needed if madness was configured with `-D ENABLE_GENTENSOR=1 -```` - -If MADNESS is to be used for high-dimensional problems (d>3) you will probably use low-rank tensor -approximations, which must be set at MADNESS configure time with the `-D ENABLE_GENTENSOR=1` flag, -and then again in your code. GenTensor and complex Functions are currently mutually exlusive. ````c #include From f06d9b7f8411317fc3dc72e06ff9ea943ffa33f2 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Sun, 7 May 2023 15:31:49 -0400 Subject: [PATCH 1211/1312] make template class static member variables inline, this should resolve duplicate definition fiasco by making them external linkage WORLD_INSTANTIATE_STATIC_TEMPLATES should no longer be necessary --- src/madness/world/dqueue.h | 13 +++---------- src/madness/world/thread.cc | 7 ------- src/madness/world/world_object.h | 13 ++----------- 3 files changed, 5 insertions(+), 28 deletions(-) diff --git a/src/madness/world/dqueue.h b/src/madness/world/dqueue.h index 8883d2b2ef9..50426e48a35 100644 --- a/src/madness/world/dqueue.h +++ b/src/madness/world/dqueue.h @@ -92,9 +92,9 @@ namespace madness { #ifdef MADNESS_DQ_USE_PREBUF static const size_t NPREBUF=MADNESS_DQ_PREBUF_SIZE; - static thread_local T prebuf[NPREBUF]; // relies on this being a singleton class!!!!!!!!!!!!!!!!!! - static thread_local T prebufhi[NPREBUF]; // relies on this being a singleton class!!!!!!!!!!!!!!!!!! - static thread_local size_t ninprebuf, ninprebufhi; + inline static thread_local T prebuf[NPREBUF] = {T{}}; // relies on this being a singleton class!!!!!!!!!!!!!!!!!! + inline static thread_local T prebufhi[NPREBUF] = {T{}}; // relies on this being a singleton class!!!!!!!!!!!!!!!!!! + inline static thread_local size_t ninprebuf = 0, ninprebufhi = 0; #endif void grow() { @@ -334,13 +334,6 @@ namespace madness { } }; -#if defined(MADNESS_DQ_USE_PREBUF) && !defined(MADNESS_CXX_COMPILER_IS_ICC) - template thread_local T DQueue::prebuf[DQueue::NPREBUF] = {T{}}; - template thread_local T DQueue::prebufhi[DQueue::NPREBUF] = {T{}}; - template thread_local size_t DQueue::ninprebuf = 0; - template thread_local size_t DQueue::ninprebufhi = 0; -#endif - template void DQueue::lock_and_flush_prebuf() { #ifdef MADNESS_DQ_USE_PREBUF diff --git a/src/madness/world/thread.cc b/src/madness/world/thread.cc index 739a2abcd00..58f869e49cc 100644 --- a/src/madness/world/thread.cc +++ b/src/madness/world/thread.cc @@ -544,11 +544,4 @@ namespace madness { return instance()->queue.get_stats(); } -#if defined(MADNESS_DQ_USE_PREBUF) && defined(MADNESS_CXX_COMPILER_IS_ICC) - thread_local PoolTaskInterface* DQueue::prebuf[DQueue::NPREBUF] = {}; - thread_local PoolTaskInterface* DQueue::prebufhi[DQueue::NPREBUF] = {}; - thread_local size_t DQueue::ninprebuf = 0; - thread_local size_t DQueue::ninprebufhi = 0; -#endif - } // namespace madness diff --git a/src/madness/world/world_object.h b/src/madness/world/world_object.h index 54beaa238cb..44fa2c1d978 100644 --- a/src/madness/world/world_object.h +++ b/src/madness/world/world_object.h @@ -378,8 +378,8 @@ namespace madness { uniqueidT objid; ///< Sense of self. - static Spinlock pending_mutex; ///< \todo Description needed. - static volatile pendingT pending; ///< Buffer for pending messages. + inline static Spinlock pending_mutex; ///< \todo Description needed. + inline static volatile pendingT pending; ///< Buffer for pending messages. /// \todo Complete: Determine if [unknown] is ready (for ...). @@ -1440,15 +1440,6 @@ namespace madness { } } -#ifdef WORLD_INSTANTIATE_STATIC_TEMPLATES -template -volatile std::list madness::WorldObject::pending; - -template -madness::Spinlock madness::WorldObject::pending_mutex; - -#endif - #endif // MADNESS_WORLD_WORLD_OBJECT_H__INCLUDED /// @} From 88a908838333d454c00883a7eb558446332e2eb3 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Sun, 7 May 2023 16:07:12 -0400 Subject: [PATCH 1212/1312] exclude SCFOperators.cc from unity builds --- src/madness/chem/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/madness/chem/CMakeLists.txt b/src/madness/chem/CMakeLists.txt index 60f22dc2aac..860e7934cc3 100644 --- a/src/madness/chem/CMakeLists.txt +++ b/src/madness/chem/CMakeLists.txt @@ -97,7 +97,7 @@ set(MADCHEM_SOURCES PNO.cpp PNOF12Potentials.cpp PNOGuessFunctions.cpp PNOParameters.cpp PNOStructures.cpp ) # these source files require specific header order inclusion ... just skip them from unity build for now -set_source_files_properties(PNO.cpp PNOF12Potentials.cpp PNOGuessFunctions.cpp PNOParameters.cpp PNOStructures.cpp +set_source_files_properties(PNO.cpp PNOF12Potentials.cpp PNOGuessFunctions.cpp PNOParameters.cpp PNOStructures.cpp SCFOperators.cc PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) if(LIBXC_FOUND) list(APPEND MADCHEM_SOURCES xcfunctional_libxc.cc) From 58b3e2c623d772f6e4a2e9cf5758073de32ecc50 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Mon, 8 May 2023 09:52:57 -0400 Subject: [PATCH 1213/1312] remove all uses+mentions of WORLD_INSTANTIATE_STATIC_TEMPLATES --- doc/libraries/parallel_runtime.dox | 15 --------------- src/apps/cc2/cc2.cc | 3 --- src/apps/interior_bc/embedded_dirichlet.cc | 1 - src/apps/interior_bc/test_problems.h | 1 - src/apps/moldft/preal.cc | 1 - src/apps/moldft/testcosine.cc | 1 - src/apps/moldft/testperiodicdft.cc | 1 - src/apps/moldft/testpg.cc | 1 - src/apps/moldft/wst_functional.h | 2 -- src/apps/mp2/mp2.cc | 1 - src/apps/nemo/nemo.cc | 2 -- src/apps/oep/oep.cc | 2 -- src/apps/periodic_old/dft.cc | 1 - src/apps/periodic_old/eigsolver.cc | 1 - src/apps/periodic_old/ewald.cc | 1 - src/apps/periodic_old/hartreefock.cc | 1 - src/apps/periodic_old/lda.h | 1 - src/apps/periodic_old/libxc.h | 1 - src/apps/periodic_old/solver_driver.cc | 2 -- src/apps/periodic_old/test_comm.cc | 1 - src/apps/periodic_old/test_coulomb.cc | 1 - src/apps/periodic_old/test_lattice.cc | 1 - src/apps/periodic_old/testconv.cc | 1 - src/apps/pno/pno.cpp | 1 - src/apps/tdse/tdse.cc | 1 - src/apps/tdse/tdse.confused.cc | 1 - src/apps/tdse/tdse4.cc | 1 - src/apps/zcis/zcis.cc | 3 --- src/apps/znemo/znemo.cc | 3 --- src/examples/3dharmonic.cc | 1 - src/examples/array_worldobject.cc | 1 - src/examples/binaryop.cc | 1 - src/examples/colloid.cc | 1 - src/examples/compiler/mra-driver.hh | 1 - src/examples/csqrt.cc | 1 - src/examples/dataloadbal.cc | 1 - src/examples/density_smoothing.cc | 3 --- src/examples/dielectric.cc | 1 - src/examples/dielectric_external_field.cc | 1 - src/examples/functionio.cc | 1 - src/examples/graveyard | 4 ---- src/examples/gygi_soltion.cc | 1 - src/examples/h2.cc | 1 - src/examples/h2dft.cc | 2 -- src/examples/h2dynamic.cc | 1 - src/examples/hatom_1d.cc | 1 - src/examples/hatom_energy.cc | 1 - src/examples/he.cc | 1 - src/examples/heat.cc | 1 - src/examples/heat2.cc | 1 - src/examples/hedft.cc | 2 -- src/examples/hefxc.cc | 2 -- src/examples/hehf.cc | 1 - src/examples/helium_exact.cc | 1 - src/examples/helium_mp2.cc | 1 - src/examples/molecularsurface.cc | 1 - src/examples/navstokes_cosines.cc | 1 - src/examples/newsolver.cc | 1 - src/examples/newsolver_lda.cc | 1 - src/examples/nonlinschro.cc | 1 - src/examples/ploterr.cc | 1 - src/examples/sdf_shape_tester.cc | 1 - src/examples/sininteg.cc | 2 -- src/examples/svpe.cc | 1 - src/examples/tdse1d.cc | 1 - src/examples/tdse_example.cc | 1 - src/examples/test_gmres.cc | 1 - src/examples/testspectralprop.cc | 2 -- src/examples/testttg.cc | 1 - src/examples/tiny.cc | 1 - src/examples/vnucso.cc | 1 - src/madness/chem/SCF.cc | 2 -- src/madness/chem/SCF.h | 2 -- src/madness/chem/benchmark_exchange_operator.cc | 1 - src/madness/chem/correlationfactor.cc | 3 --- src/madness/chem/correlationfactor.h | 2 -- src/madness/chem/exchangeoperator.cc | 1 - src/madness/chem/gth_pseudopotential.h | 2 -- src/madness/chem/mp2.h | 1 - src/madness/chem/nemo.cc | 2 -- src/madness/chem/nemo.h | 2 -- src/madness/chem/plotxc.cc | 1 - src/madness/chem/pointgroupoperator.h | 2 -- src/madness/chem/pointgroupsymmetry.cc | 2 -- src/madness/chem/pointgroupsymmetry.h | 2 -- src/madness/chem/test_SCFOperators.cc | 1 - src/madness/chem/test_dft.cc | 1 - src/madness/chem/testxc.cc | 1 - src/madness/mra/graveyard | 3 --- src/madness/mra/mraimpl.h | 1 - src/madness/mra/testinnerext.cc | 1 - src/madness/tensor/test_distributed_matrix.cc | 1 - src/madness/tensor/test_elemental.cc | 1 - src/madness/tensor/testseprep.cc | 2 -- src/madness/world/future.h | 6 +----- src/madness/world/test_binsorter.cc | 1 - src/madness/world/test_dc.cc | 1 - src/madness/world/test_future2.cc | 1 - src/madness/world/test_future3.cc | 1 - src/madness/world/test_hashdc.cc | 1 - src/madness/world/test_tree.cc | 1 - src/madness/world/test_world.cc | 1 - src/madness/world/test_worldptr.cc | 1 - src/madness/world/test_worldref.cc | 1 - 104 files changed, 1 insertion(+), 156 deletions(-) diff --git a/doc/libraries/parallel_runtime.dox b/doc/libraries/parallel_runtime.dox index 659a0c71523..dddd635ccce 100644 --- a/doc/libraries/parallel_runtime.dox +++ b/doc/libraries/parallel_runtime.dox @@ -205,19 +205,4 @@ and other resources necessary to build new distributed capabilities. The distributed container class (madness::WorldContainer) actually inherits most of its functionality from madness::WorldObject. -\par Static data, etc., for templated classes - -Several of the templated classes (currently just the -madness::DistributedContainer, madness::Future and madness::RemoteReference classes) have static -data or helper functions associated with them. These must be defined -in one and only one file. To facilitate this definition, the -necessary templates have been wrapped in C-preprocessor conditional -block so that they are only enabled if \c -WORLD_INSTANTIATE_STATIC_TEMPLATES is defined. In just one of your source -(not a header) files, -define this macro \em before including \c parallel_runtime.h, and then -instantiate the templates that you are using. - -\note Applications using the multiresolution numerical tools probably -do not need to define this macro. */ diff --git a/src/apps/cc2/cc2.cc b/src/apps/cc2/cc2.cc index f4a1250779b..a56a856e796 100644 --- a/src/apps/cc2/cc2.cc +++ b/src/apps/cc2/cc2.cc @@ -37,9 +37,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - - #include "madness/chem/CC2.h" #include "madness/misc/info.h" diff --git a/src/apps/interior_bc/embedded_dirichlet.cc b/src/apps/interior_bc/embedded_dirichlet.cc index 7c3819bb9ab..c2fc73748ec 100644 --- a/src/apps/interior_bc/embedded_dirichlet.cc +++ b/src/apps/interior_bc/embedded_dirichlet.cc @@ -69,7 +69,6 @@ . for their effect on convergence of the solution. */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/apps/interior_bc/test_problems.h b/src/apps/interior_bc/test_problems.h index 63fcf319233..27b901ab2c4 100644 --- a/src/apps/interior_bc/test_problems.h +++ b/src/apps/interior_bc/test_problems.h @@ -64,7 +64,6 @@ #ifndef MADNESS_INTERIOR_BC_TEST_PROBLEMS_H__INCLUDED #define MADNESS_INTERIOR_BC_TEST_PROBLEMS_H__INCLUDED -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/apps/moldft/preal.cc b/src/apps/moldft/preal.cc index 4773676a7d5..c365f2158eb 100644 --- a/src/apps/moldft/preal.cc +++ b/src/apps/moldft/preal.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/apps/moldft/testcosine.cc b/src/apps/moldft/testcosine.cc index 8779c1f809e..5458461a5db 100644 --- a/src/apps/moldft/testcosine.cc +++ b/src/apps/moldft/testcosine.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include using namespace madness; diff --git a/src/apps/moldft/testperiodicdft.cc b/src/apps/moldft/testperiodicdft.cc index 8507f41ee8d..a1cbc7a90da 100644 --- a/src/apps/moldft/testperiodicdft.cc +++ b/src/apps/moldft/testperiodicdft.cc @@ -8,7 +8,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/apps/moldft/testpg.cc b/src/apps/moldft/testpg.cc index acc9ed92d91..ecd825f5711 100644 --- a/src/apps/moldft/testpg.cc +++ b/src/apps/moldft/testpg.cc @@ -29,7 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/apps/moldft/wst_functional.h b/src/apps/moldft/wst_functional.h index 9e0d3b45d6a..554d716482e 100644 --- a/src/apps/moldft/wst_functional.h +++ b/src/apps/moldft/wst_functional.h @@ -1,5 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - #include #include diff --git a/src/apps/mp2/mp2.cc b/src/apps/mp2/mp2.cc index 69988610b33..9a685ac1aa5 100644 --- a/src/apps/mp2/mp2.cc +++ b/src/apps/mp2/mp2.cc @@ -38,7 +38,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include "madness/chem/mp2.h" #include "madness/misc/info.h" diff --git a/src/apps/nemo/nemo.cc b/src/apps/nemo/nemo.cc index c59ad4fd8cd..38ff0b295cb 100644 --- a/src/apps/nemo/nemo.cc +++ b/src/apps/nemo/nemo.cc @@ -31,8 +31,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - /*! \file examples/nemo.cc diff --git a/src/apps/oep/oep.cc b/src/apps/oep/oep.cc index 448550bcca2..58def8b81a7 100644 --- a/src/apps/oep/oep.cc +++ b/src/apps/oep/oep.cc @@ -29,8 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - /*! \file examples/oep.cc \brief optimized effective potentials for DFT diff --git a/src/apps/periodic_old/dft.cc b/src/apps/periodic_old/dft.cc index 64aee2028ec..a34a9aa75b3 100644 --- a/src/apps/periodic_old/dft.cc +++ b/src/apps/periodic_old/dft.cc @@ -30,7 +30,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include "dft.h" #include "util.h" //#include diff --git a/src/apps/periodic_old/eigsolver.cc b/src/apps/periodic_old/eigsolver.cc index 1f1cd7603b0..abddaccb2c2 100644 --- a/src/apps/periodic_old/eigsolver.cc +++ b/src/apps/periodic_old/eigsolver.cc @@ -30,7 +30,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include "eigsolver.h" #include "util.h" diff --git a/src/apps/periodic_old/ewald.cc b/src/apps/periodic_old/ewald.cc index 54f5bbeafcd..43e6c34238b 100644 --- a/src/apps/periodic_old/ewald.cc +++ b/src/apps/periodic_old/ewald.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include "mentity.h" diff --git a/src/apps/periodic_old/hartreefock.cc b/src/apps/periodic_old/hartreefock.cc index 7a36d30c50d..6bdbe1bca45 100644 --- a/src/apps/periodic_old/hartreefock.cc +++ b/src/apps/periodic_old/hartreefock.cc @@ -30,7 +30,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include "hartreefock.h" namespace madness diff --git a/src/apps/periodic_old/lda.h b/src/apps/periodic_old/lda.h index 499c858d88b..1b3209223ad 100644 --- a/src/apps/periodic_old/lda.h +++ b/src/apps/periodic_old/lda.h @@ -39,7 +39,6 @@ #ifndef LDA_H_ #define LDA_H_ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/apps/periodic_old/libxc.h b/src/apps/periodic_old/libxc.h index 2fcd794b390..a68025d9505 100644 --- a/src/apps/periodic_old/libxc.h +++ b/src/apps/periodic_old/libxc.h @@ -39,7 +39,6 @@ #ifndef LIBXC_H_ #define LIBXC_H_ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include //#include "xc.h" diff --git a/src/apps/periodic_old/solver_driver.cc b/src/apps/periodic_old/solver_driver.cc index 827ff5fbbd4..e60fa4e99ed 100644 --- a/src/apps/periodic_old/solver_driver.cc +++ b/src/apps/periodic_old/solver_driver.cc @@ -30,8 +30,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - #include "electronicstructureapp.h" #include "solver.h" diff --git a/src/apps/periodic_old/test_comm.cc b/src/apps/periodic_old/test_comm.cc index 15c922f1d75..f3e87cd61be 100644 --- a/src/apps/periodic_old/test_comm.cc +++ b/src/apps/periodic_old/test_comm.cc @@ -29,7 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include using namespace std; diff --git a/src/apps/periodic_old/test_coulomb.cc b/src/apps/periodic_old/test_coulomb.cc index b594724135f..c12fead0970 100644 --- a/src/apps/periodic_old/test_coulomb.cc +++ b/src/apps/periodic_old/test_coulomb.cc @@ -30,7 +30,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include "eigsolver.h" diff --git a/src/apps/periodic_old/test_lattice.cc b/src/apps/periodic_old/test_lattice.cc index 4dff63371e2..16fb75ee08b 100644 --- a/src/apps/periodic_old/test_lattice.cc +++ b/src/apps/periodic_old/test_lattice.cc @@ -30,7 +30,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include "poperator.h" diff --git a/src/apps/periodic_old/testconv.cc b/src/apps/periodic_old/testconv.cc index 7a867cb2ef9..593e999c14c 100644 --- a/src/apps/periodic_old/testconv.cc +++ b/src/apps/periodic_old/testconv.cc @@ -29,7 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include using namespace std; diff --git a/src/apps/pno/pno.cpp b/src/apps/pno/pno.cpp index 873f3cd5b0b..63963ffcb23 100644 --- a/src/apps/pno/pno.cpp +++ b/src/apps/pno/pno.cpp @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/apps/tdse/tdse.cc b/src/apps/tdse/tdse.cc index 15fbfe29346..457a5cbf9e1 100644 --- a/src/apps/tdse/tdse.cc +++ b/src/apps/tdse/tdse.cc @@ -34,7 +34,6 @@ /// \brief Evolves the hydrogen atom in imaginary and also real time -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/apps/tdse/tdse.confused.cc b/src/apps/tdse/tdse.confused.cc index b13a187530b..b10ffc9d910 100644 --- a/src/apps/tdse/tdse.confused.cc +++ b/src/apps/tdse/tdse.confused.cc @@ -34,7 +34,6 @@ /// \brief Evolves the hydrogen atom in imaginary and also real time -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/apps/tdse/tdse4.cc b/src/apps/tdse/tdse4.cc index b45e5ee2116..0406da62d16 100644 --- a/src/apps/tdse/tdse4.cc +++ b/src/apps/tdse/tdse4.cc @@ -34,7 +34,6 @@ /// \brief Evolves the hydrogen molecular ion in 4D ... 3 electron + 1 nuclear degree of freedom -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/apps/zcis/zcis.cc b/src/apps/zcis/zcis.cc index 1f158859474..20458b3d0a6 100644 --- a/src/apps/zcis/zcis.cc +++ b/src/apps/zcis/zcis.cc @@ -31,9 +31,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - - /*! \file examples/znemo.cc \brief solve the HF equations using numerical exponential MOs diff --git a/src/apps/znemo/znemo.cc b/src/apps/znemo/znemo.cc index ca40239d58b..1014167ee11 100644 --- a/src/apps/znemo/znemo.cc +++ b/src/apps/znemo/znemo.cc @@ -31,9 +31,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - - /*! \file examples/znemo.cc \brief solve the HF equations using numerical exponential MOs diff --git a/src/examples/3dharmonic.cc b/src/examples/3dharmonic.cc index d2f063be1c8..c38ce268945 100644 --- a/src/examples/3dharmonic.cc +++ b/src/examples/3dharmonic.cc @@ -113,7 +113,6 @@ let us know.] */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/array_worldobject.cc b/src/examples/array_worldobject.cc index f0a1db2a7ea..93153e53e2b 100644 --- a/src/examples/array_worldobject.cc +++ b/src/examples/array_worldobject.cc @@ -1,4 +1,3 @@ -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/binaryop.cc b/src/examples/binaryop.cc index cf5bf45cbfa..c839e7026ad 100644 --- a/src/examples/binaryop.cc +++ b/src/examples/binaryop.cc @@ -106,7 +106,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include using namespace madness; diff --git a/src/examples/colloid.cc b/src/examples/colloid.cc index bd7dcccb7c2..559972aa256 100644 --- a/src/examples/colloid.cc +++ b/src/examples/colloid.cc @@ -28,7 +28,6 @@ This proram simulates the effect of surface solute interaction between a colloid */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES //#include #include "molecularmask.h" #include diff --git a/src/examples/compiler/mra-driver.hh b/src/examples/compiler/mra-driver.hh index 18fb6ad4d8e..3641b37fc91 100644 --- a/src/examples/compiler/mra-driver.hh +++ b/src/examples/compiler/mra-driver.hh @@ -590,7 +590,6 @@ public: } else if (c.size() == 0) { if (s=="Let") { - //file << "#define WORLD_INSTANTIATE_STATIC_TEMPLATES\n"; file << "#include \n"; file << "using namespace madness;\n"; } diff --git a/src/examples/csqrt.cc b/src/examples/csqrt.cc index 6212d01d6fb..e2de4dfdd57 100644 --- a/src/examples/csqrt.cc +++ b/src/examples/csqrt.cc @@ -31,7 +31,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/dataloadbal.cc b/src/examples/dataloadbal.cc index 10dbd8f836d..3b8ed0882ed 100644 --- a/src/examples/dataloadbal.cc +++ b/src/examples/dataloadbal.cc @@ -128,7 +128,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/density_smoothing.cc b/src/examples/density_smoothing.cc index 17bce120792..56da8810422 100644 --- a/src/examples/density_smoothing.cc +++ b/src/examples/density_smoothing.cc @@ -31,9 +31,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - - /*! \file examples/nemo.cc \brief solve the HF equations using numerical exponential MOs diff --git a/src/examples/dielectric.cc b/src/examples/dielectric.cc index 1ef33260d47..e52f1c8cc44 100644 --- a/src/examples/dielectric.cc +++ b/src/examples/dielectric.cc @@ -168,7 +168,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/dielectric_external_field.cc b/src/examples/dielectric_external_field.cc index 3bf3202b57e..c21e4a216aa 100644 --- a/src/examples/dielectric_external_field.cc +++ b/src/examples/dielectric_external_field.cc @@ -92,7 +92,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/functionio.cc b/src/examples/functionio.cc index a3f814535ce..7b97d805747 100644 --- a/src/examples/functionio.cc +++ b/src/examples/functionio.cc @@ -89,7 +89,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include using namespace madness; diff --git a/src/examples/graveyard b/src/examples/graveyard index 02ef2e74b84..e6b771c25ef 100644 --- a/src/examples/graveyard +++ b/src/examples/graveyard @@ -32,7 +32,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include @@ -345,7 +344,6 @@ int main(int argc, char** argv) { /// \file bigboy.cc /// \brief artificial benchmark for Cray XT testing -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include using namespace madness; @@ -541,7 +539,6 @@ int main(int argc, char** argv) { $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include @@ -929,7 +926,6 @@ end $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/gygi_soltion.cc b/src/examples/gygi_soltion.cc index 6758cebc7f0..0bf056f31ea 100644 --- a/src/examples/gygi_soltion.cc +++ b/src/examples/gygi_soltion.cc @@ -49,7 +49,6 @@ - The test system isa hydrogen atom (1s orbital) */ //We will test this for a hydrogen atom -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/h2.cc b/src/examples/h2.cc index 36c26206a07..8557d5fc3dc 100644 --- a/src/examples/h2.cc +++ b/src/examples/h2.cc @@ -47,7 +47,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/examples/h2dft.cc b/src/examples/h2dft.cc index 8c201661644..af30b0405bb 100644 --- a/src/examples/h2dft.cc +++ b/src/examples/h2dft.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include @@ -6,7 +5,6 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/examples/h2dynamic.cc b/src/examples/h2dynamic.cc index d959a55d6b0..7b0ec1888e7 100644 --- a/src/examples/h2dynamic.cc +++ b/src/examples/h2dynamic.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/hatom_1d.cc b/src/examples/hatom_1d.cc index 5411496fb92..1010662be18 100644 --- a/src/examples/hatom_1d.cc +++ b/src/examples/hatom_1d.cc @@ -41,7 +41,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/examples/hatom_energy.cc b/src/examples/hatom_energy.cc index 344ec969980..7de5d39fd0d 100644 --- a/src/examples/hatom_energy.cc +++ b/src/examples/hatom_energy.cc @@ -30,7 +30,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES /*! \file examples/hatom_energy.cc diff --git a/src/examples/he.cc b/src/examples/he.cc index 495225a4b8c..8af743a6cf7 100644 --- a/src/examples/he.cc +++ b/src/examples/he.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/heat.cc b/src/examples/heat.cc index dbe4a45a3c4..8f942c8820a 100644 --- a/src/examples/heat.cc +++ b/src/examples/heat.cc @@ -56,7 +56,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/heat2.cc b/src/examples/heat2.cc index b1fd4fd9df1..a16714fffed 100644 --- a/src/examples/heat2.cc +++ b/src/examples/heat2.cc @@ -30,7 +30,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/hedft.cc b/src/examples/hedft.cc index bd207d2780a..0fbc3cd6468 100644 --- a/src/examples/hedft.cc +++ b/src/examples/hedft.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include @@ -6,7 +5,6 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/examples/hefxc.cc b/src/examples/hefxc.cc index 1cbe741e39d..2078e492692 100644 --- a/src/examples/hefxc.cc +++ b/src/examples/hefxc.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include @@ -6,7 +5,6 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/examples/hehf.cc b/src/examples/hehf.cc index 03c2a16f2ed..d09d7220b2b 100644 --- a/src/examples/hehf.cc +++ b/src/examples/hehf.cc @@ -92,7 +92,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/examples/helium_exact.cc b/src/examples/helium_exact.cc index a73354e2f7b..9c307928af5 100644 --- a/src/examples/helium_exact.cc +++ b/src/examples/helium_exact.cc @@ -39,7 +39,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/helium_mp2.cc b/src/examples/helium_mp2.cc index b6bedcad054..9b967e4dea4 100644 --- a/src/examples/helium_mp2.cc +++ b/src/examples/helium_mp2.cc @@ -37,7 +37,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/molecularsurface.cc b/src/examples/molecularsurface.cc index b5b9afb64be..386ec7c0b49 100644 --- a/src/examples/molecularsurface.cc +++ b/src/examples/molecularsurface.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/navstokes_cosines.cc b/src/examples/navstokes_cosines.cc index c18f68f4411..894b8b2ac5c 100755 --- a/src/examples/navstokes_cosines.cc +++ b/src/examples/navstokes_cosines.cc @@ -78,7 +78,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/examples/newsolver.cc b/src/examples/newsolver.cc index dc9c8624b66..d4b5907d19a 100644 --- a/src/examples/newsolver.cc +++ b/src/examples/newsolver.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/newsolver_lda.cc b/src/examples/newsolver_lda.cc index 1f6fb6d3a05..65b4d1e28d8 100644 --- a/src/examples/newsolver_lda.cc +++ b/src/examples/newsolver_lda.cc @@ -1,5 +1,4 @@ -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/nonlinschro.cc b/src/examples/nonlinschro.cc index 8319f545fd9..148c6fd95d0 100644 --- a/src/examples/nonlinschro.cc +++ b/src/examples/nonlinschro.cc @@ -105,7 +105,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/ploterr.cc b/src/examples/ploterr.cc index 885deff83d4..c8d10d68830 100644 --- a/src/examples/ploterr.cc +++ b/src/examples/ploterr.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include using namespace madness; diff --git a/src/examples/sdf_shape_tester.cc b/src/examples/sdf_shape_tester.cc index 0128136f0b1..089965f041c 100644 --- a/src/examples/sdf_shape_tester.cc +++ b/src/examples/sdf_shape_tester.cc @@ -52,7 +52,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/sininteg.cc b/src/examples/sininteg.cc index ddd9bf279b9..85420d321ff 100644 --- a/src/examples/sininteg.cc +++ b/src/examples/sininteg.cc @@ -29,8 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - /*! \file examples/sininteg.cc \brief Compute the integral sin(x) x=0..10 diff --git a/src/examples/svpe.cc b/src/examples/svpe.cc index 457cd854daf..7c1639c9a44 100644 --- a/src/examples/svpe.cc +++ b/src/examples/svpe.cc @@ -31,7 +31,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/tdse1d.cc b/src/examples/tdse1d.cc index ca9402c31c6..cbfa7297d0c 100644 --- a/src/examples/tdse1d.cc +++ b/src/examples/tdse1d.cc @@ -98,7 +98,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #define NO_GENTENSOR #include #include diff --git a/src/examples/tdse_example.cc b/src/examples/tdse_example.cc index 3e59683997e..49a71c56373 100644 --- a/src/examples/tdse_example.cc +++ b/src/examples/tdse_example.cc @@ -34,7 +34,6 @@ /// \brief Evolves the hydrogen atom in imaginary and also real time -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/test_gmres.cc b/src/examples/test_gmres.cc index 9a801467820..c16195a1c26 100644 --- a/src/examples/test_gmres.cc +++ b/src/examples/test_gmres.cc @@ -46,7 +46,6 @@ /// Tightening up the default tolerance of the MADNESS functions makes this /// go away. -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/examples/testspectralprop.cc b/src/examples/testspectralprop.cc index 1cd0481f66d..15b40618c45 100644 --- a/src/examples/testspectralprop.cc +++ b/src/examples/testspectralprop.cc @@ -1,6 +1,4 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - #include #include #include diff --git a/src/examples/testttg.cc b/src/examples/testttg.cc index 975308b55a6..13a29b02a89 100644 --- a/src/examples/testttg.cc +++ b/src/examples/testttg.cc @@ -32,7 +32,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/tiny.cc b/src/examples/tiny.cc index 8ea82cf2255..6e331644138 100644 --- a/src/examples/tiny.cc +++ b/src/examples/tiny.cc @@ -43,7 +43,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/examples/vnucso.cc b/src/examples/vnucso.cc index e14bad4123d..63a7f3a4fc4 100644 --- a/src/examples/vnucso.cc +++ b/src/examples/vnucso.cc @@ -64,7 +64,6 @@ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index 682b6aa87fe..a562ce380e0 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -34,8 +34,6 @@ /// \defgroup moldft The molecular density functional and Hartree-Fock code -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - #include #include diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index 1fc07f361eb..ea54317bcaf 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -40,8 +40,6 @@ #ifndef MADNESS_CHEM_SCF_H__INCLUDED #define MADNESS_CHEM_SCF_H__INCLUDED -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - #include #include diff --git a/src/madness/chem/benchmark_exchange_operator.cc b/src/madness/chem/benchmark_exchange_operator.cc index 7a98c06b1e5..db3f25d85b0 100644 --- a/src/madness/chem/benchmark_exchange_operator.cc +++ b/src/madness/chem/benchmark_exchange_operator.cc @@ -1,5 +1,4 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/chem/correlationfactor.cc b/src/madness/chem/correlationfactor.cc index b541e36cb56..def3c837957 100644 --- a/src/madness/chem/correlationfactor.cc +++ b/src/madness/chem/correlationfactor.cc @@ -31,9 +31,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - - #include namespace madness{ diff --git a/src/madness/chem/correlationfactor.h b/src/madness/chem/correlationfactor.h index 176c3e33e2d..65e75178d18 100644 --- a/src/madness/chem/correlationfactor.h +++ b/src/madness/chem/correlationfactor.h @@ -29,8 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - /*! \file apps/chem/correlationfactor.h \brief class for regularizing singular potentials in the molecular diff --git a/src/madness/chem/exchangeoperator.cc b/src/madness/chem/exchangeoperator.cc index f50b17acb0c..894b609729c 100644 --- a/src/madness/chem/exchangeoperator.cc +++ b/src/madness/chem/exchangeoperator.cc @@ -1,4 +1,3 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/madness/chem/gth_pseudopotential.h b/src/madness/chem/gth_pseudopotential.h index 5acea4811a3..b9cfdc50a83 100644 --- a/src/madness/chem/gth_pseudopotential.h +++ b/src/madness/chem/gth_pseudopotential.h @@ -5,8 +5,6 @@ #ifndef MADNESS_CHEM_GTH_PSEUDOPOTENTIAL_H__INCLUDED #define MADNESS_CHEM_GTH_PSEUDOPOTENTIAL_H__INCLUDED -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - #include #include diff --git a/src/madness/chem/mp2.h b/src/madness/chem/mp2.h index 162e5158803..c861bf87a63 100644 --- a/src/madness/chem/mp2.h +++ b/src/madness/chem/mp2.h @@ -39,7 +39,6 @@ #ifndef MP2_H_ #define MP2_H_ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/chem/nemo.cc b/src/madness/chem/nemo.cc index 11bb0f8ca36..eb5497a6b6c 100644 --- a/src/madness/chem/nemo.cc +++ b/src/madness/chem/nemo.cc @@ -29,8 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - /*! \file examples/nemo.cc \brief solve the HF equations using numerical exponential MOs diff --git a/src/madness/chem/nemo.h b/src/madness/chem/nemo.h index 5f3b80798fa..43fbe1c18a4 100644 --- a/src/madness/chem/nemo.h +++ b/src/madness/chem/nemo.h @@ -29,8 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - /*! \file examples/nemo.h \brief solve the HF equations using numerical exponential MOs diff --git a/src/madness/chem/plotxc.cc b/src/madness/chem/plotxc.cc index ebfa6567c7a..3b4dfa4ac1d 100644 --- a/src/madness/chem/plotxc.cc +++ b/src/madness/chem/plotxc.cc @@ -30,7 +30,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/chem/pointgroupoperator.h b/src/madness/chem/pointgroupoperator.h index b06335ead34..150afefc1b7 100644 --- a/src/madness/chem/pointgroupoperator.h +++ b/src/madness/chem/pointgroupoperator.h @@ -31,8 +31,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - /*! \file chem/pointgroupoperator.h diff --git a/src/madness/chem/pointgroupsymmetry.cc b/src/madness/chem/pointgroupsymmetry.cc index 24c3d4367eb..45c7c4037fd 100644 --- a/src/madness/chem/pointgroupsymmetry.cc +++ b/src/madness/chem/pointgroupsymmetry.cc @@ -31,8 +31,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - /*! \file chem/pointgroupsymmetry.cc diff --git a/src/madness/chem/pointgroupsymmetry.h b/src/madness/chem/pointgroupsymmetry.h index 5fc468102d8..883c2c26653 100644 --- a/src/madness/chem/pointgroupsymmetry.h +++ b/src/madness/chem/pointgroupsymmetry.h @@ -31,8 +31,6 @@ $Id$ */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - /*! \file chem/pointgroupsymmetry.cc diff --git a/src/madness/chem/test_SCFOperators.cc b/src/madness/chem/test_SCFOperators.cc index 9365bcebb50..9e2ecfd7637 100644 --- a/src/madness/chem/test_SCFOperators.cc +++ b/src/madness/chem/test_SCFOperators.cc @@ -29,7 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/chem/test_dft.cc b/src/madness/chem/test_dft.cc index d65485126f9..69c6ee3be40 100644 --- a/src/madness/chem/test_dft.cc +++ b/src/madness/chem/test_dft.cc @@ -29,7 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/madness/chem/testxc.cc b/src/madness/chem/testxc.cc index 48fe469225a..17d66b33827 100644 --- a/src/madness/chem/testxc.cc +++ b/src/madness/chem/testxc.cc @@ -29,7 +29,6 @@ fax: 865-572-0680 */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/mra/graveyard b/src/madness/mra/graveyard index 66f1a73b56b..f7f8b44b586 100644 --- a/src/madness/mra/graveyard +++ b/src/madness/mra/graveyard @@ -101,7 +101,6 @@ // inline void unfilter_inplace(tensorT& s) { // transform_inplace(s, cdata.hg, cdata.work2); // }; -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include using namespace std; @@ -982,7 +981,6 @@ template class LBTree<5,MyProcmap<5> >; template class LBTree<6,MyProcmap<6> >; >>>>>>> .r223 } -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #ifndef LOADBAL_H #define LOADBAL_H @@ -2417,7 +2415,6 @@ runvalg2: */ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/madness/mra/mraimpl.h b/src/madness/mra/mraimpl.h index 88d14e32efc..283d060803b 100644 --- a/src/madness/mra/mraimpl.h +++ b/src/madness/mra/mraimpl.h @@ -36,7 +36,6 @@ #error "mraimpl.h should ONLY be included in one of the mraX.cc files (x=1..6)" #endif -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/mra/testinnerext.cc b/src/madness/mra/testinnerext.cc index b8833f923d7..628fc67ce1c 100644 --- a/src/madness/mra/testinnerext.cc +++ b/src/madness/mra/testinnerext.cc @@ -1,6 +1,5 @@ -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include using namespace madness; diff --git a/src/madness/tensor/test_distributed_matrix.cc b/src/madness/tensor/test_distributed_matrix.cc index e3aee0e936d..b0d42e50614 100644 --- a/src/madness/tensor/test_distributed_matrix.cc +++ b/src/madness/tensor/test_distributed_matrix.cc @@ -1,4 +1,3 @@ -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/madness/tensor/test_elemental.cc b/src/madness/tensor/test_elemental.cc index 8f9b036aeda..ed5dd1cf5f7 100644 --- a/src/madness/tensor/test_elemental.cc +++ b/src/madness/tensor/test_elemental.cc @@ -1,7 +1,6 @@ #include -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include using namespace madness; using namespace std; diff --git a/src/madness/tensor/testseprep.cc b/src/madness/tensor/testseprep.cc index 9429ffc6522..b661331371f 100644 --- a/src/madness/tensor/testseprep.cc +++ b/src/madness/tensor/testseprep.cc @@ -2,8 +2,6 @@ /// \file testSepRep.cc /// \brief test the SeparatedRepresentation (SepRep) for representing matrices -//#define WORLD_INSTANTIATE_STATIC_TEMPLATES - #include using namespace madness; diff --git a/src/madness/world/future.h b/src/madness/world/future.h index eabb6ca6199..d18aed51c37 100644 --- a/src/madness/world/future.h +++ b/src/madness/world/future.h @@ -1012,8 +1012,6 @@ namespace madness { std::ostream& operator<<(std::ostream& out, const Future& f); -#ifdef WORLD_INSTANTIATE_STATIC_TEMPLATES - /// \todo Brief description needed. /// \todo Descriptions needed. @@ -1022,7 +1020,7 @@ namespace madness { /// \param[in] f The future to be output. /// \return The output stream. template - std::ostream& operator<<(std::ostream& out, const Future& f) { + inline std::ostream& operator<<(std::ostream& out, const Future& f) { if (f.probe()) out << f.get(); else if (f.is_remote()) out << f.f->remote_ref; else if (f.f) out << ""; @@ -1030,8 +1028,6 @@ namespace madness { return out; } -#endif - } // namespace madness /// @} diff --git a/src/madness/world/test_binsorter.cc b/src/madness/world/test_binsorter.cc index b76f98584f2..e5bc6aa1fb8 100644 --- a/src/madness/world/test_binsorter.cc +++ b/src/madness/world/test_binsorter.cc @@ -1,4 +1,3 @@ -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/madness/world/test_dc.cc b/src/madness/world/test_dc.cc index 47b93c086e8..5197b006dac 100644 --- a/src/madness/world/test_dc.cc +++ b/src/madness/world/test_dc.cc @@ -29,7 +29,6 @@ fax: 865-572-0680 */ -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/world/test_future2.cc b/src/madness/world/test_future2.cc index 6e41d82ea69..bc4a13d426b 100644 --- a/src/madness/world/test_future2.cc +++ b/src/madness/world/test_future2.cc @@ -29,7 +29,6 @@ fax: 865-572-0680 */ -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/world/test_future3.cc b/src/madness/world/test_future3.cc index 848bf3a25ba..634ea2a002e 100644 --- a/src/madness/world/test_future3.cc +++ b/src/madness/world/test_future3.cc @@ -29,7 +29,6 @@ fax: 865-572-0680 */ -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/madness/world/test_hashdc.cc b/src/madness/world/test_hashdc.cc index 8590d280947..198dbcec9bc 100644 --- a/src/madness/world/test_hashdc.cc +++ b/src/madness/world/test_hashdc.cc @@ -29,7 +29,6 @@ fax: 865-572-0680 */ -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/madness/world/test_tree.cc b/src/madness/world/test_tree.cc index 9a7a93123b2..27fc4ad6687 100644 --- a/src/madness/world/test_tree.cc +++ b/src/madness/world/test_tree.cc @@ -30,7 +30,6 @@ */ -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include diff --git a/src/madness/world/test_world.cc b/src/madness/world/test_world.cc index 342d3c8591e..3d6a2a4b132 100644 --- a/src/madness/world/test_world.cc +++ b/src/madness/world/test_world.cc @@ -33,7 +33,6 @@ #include #include -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/world/test_worldptr.cc b/src/madness/world/test_worldptr.cc index 5bc08f7b845..5f1b2b5d1e4 100644 --- a/src/madness/world/test_worldptr.cc +++ b/src/madness/world/test_worldptr.cc @@ -34,7 +34,6 @@ #ifdef MADNESS_HAS_GOOGLE_TEST #define MADNESS_DISPLAY_EXCEPTION_BREAK_MESSAGE 0 -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include diff --git a/src/madness/world/test_worldref.cc b/src/madness/world/test_worldref.cc index f65dacc4ea8..0eb791efdbe 100644 --- a/src/madness/world/test_worldref.cc +++ b/src/madness/world/test_worldref.cc @@ -33,7 +33,6 @@ #ifdef MADNESS_HAS_GOOGLE_TEST //#define MADNESS_DISPLAY_EXCEPTION_BREAK_MESSAGE 0 -#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include #include From 4d9f0c6c4b5cfdaf6b685c20637c45dbcb117258 Mon Sep 17 00:00:00 2001 From: Eduard Valeyev Date: Thu, 11 May 2023 10:59:12 -0400 Subject: [PATCH 1214/1312] fixup hashing of std::pair --- src/madness/world/worldhash.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/madness/world/worldhash.h b/src/madness/world/worldhash.h index 27aa12bb7ee..96348045dc6 100644 --- a/src/madness/world/worldhash.h +++ b/src/madness/world/worldhash.h @@ -193,14 +193,13 @@ namespace madness { /// \tparam T The class type /// \param t The object to hash /// \return \c t.hash() - template - inline typename std::enable_if::value || - std::is_pointer::value || std::is_array::value), hashT>::type + template ().hash()),hashT>>> + inline auto hash_value(const T& t) { return t.hash(); } - /// Hash a string + /// Hash a std::basic_string /// \tparam T The character type /// \param t The string to hash @@ -208,6 +207,12 @@ namespace madness { template inline hashT hash_value(const std::basic_string& t); + /// Hash a std::pair + + /// \param t a pair to hash + /// \return The hashed value of \p t + template + inline hashT hash_value(const std::pair& t); /// Hash functor @@ -257,9 +262,6 @@ namespace madness { detail::combine_hash(seed, hasher(v)); } - /// Hash a pair - - /// template inline hashT hash_value(const std::pair& t) { hashT result = hash_value(t.first); From ec7f762deebc9496b9db6b3fb01b98862b2666d7 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 16 May 2023 15:30:42 -0400 Subject: [PATCH 1215/1312] Update tutorial.md --- doc/tutorial/tutorial.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index f29a706b89a..3db295758c7 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -2,12 +2,12 @@ This tutorial covers * downloading, building and installing MADNESS; [RJH] -* an overview of the MADNESS parallel runtime sufficient to develop and run numerical applications; [RJH] -* developing new applications using the numerical and chemistry APIS; [All of us] - - overview of basic concepts and the numerical API [RJH] - - hello world in the numerical API [RJH] - - overview of the chemistry API [Florian] - - a simple Hartree-Fock program +* using the MADNESS chemistry applications. [Florian, Hannes, Adrian] + - structure of the input file + - moldft, gradient + - molresponse + - all the other codes incl. 6D + - excited states, hessian * running MADNESS applications in parallel using threads + MPI [Hannes]; and - basic concepts - environment variables @@ -16,11 +16,13 @@ This tutorial covers - Tips, tricks, and pitfalls - binding process+threads to sockets - avoid fast malloc libraries if using MPI -* using the MADNESS chemistry applications. [Florian, Hannes, Adrian] - - moldft - - molresponse - - all the other codes - +* an overview of the MADNESS parallel runtime sufficient to develop numerical applications; [RJH] +* developing new applications using the numerical and chemistry APIS; [All of us] + - overview of basic concepts and the numerical API [RJH] + - hello world in the numerical API [RJH] + - overview of the chemistry API [Florian] + - a simple Hartree-Fock program + ## Downloading From github --- how From de13abb0105651dd36036baca4c0f99c33fdb50b Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Fri, 19 May 2023 04:56:58 -0400 Subject: [PATCH 1216/1312] Update tutorial.md --- doc/tutorial/tutorial.md | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index 3db295758c7..f227236a531 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -19,22 +19,39 @@ This tutorial covers * an overview of the MADNESS parallel runtime sufficient to develop numerical applications; [RJH] * developing new applications using the numerical and chemistry APIS; [All of us] - overview of basic concepts and the numerical API [RJH] + - cmake file and makefile to use madness as a library [???] - hello world in the numerical API [RJH] - overview of the chemistry API [Florian] - a simple Hartree-Fock program ## Downloading -From github --- how +From the command line, clone the [MADNESS GitHub repository](https://github.com/m-a-d-n-e-s-s/madness) using +* HTTPS +``` + git clone https://github.com/m-a-d-n-e-s-s/madness.git +``` +* SSH +``` + git clone git@github.com:m-a-d-n-e-s-s/madness.git +``` +This will make a new directory `madness` --- if you wish use a different name, append it to the command. + +The head of the master branch usually builds and runs correctly due to the continuous integration. If you are looking for the tested version for the Tromso June 2023 workshop, after cloning +``` +cd madness +checkout XXXXXXXXXXXXXXXXXXX +``` ## Building and installing -Reference materials -* [MADNESS ReadTheDocs](https://madness.readthedocs.io/en/latest/INSTALL.html) -* [Cmake](https://cmake.org/) +Please refer to the [installation instructions](https://madness.readthedocs.io/en/latest/INSTALL.html). +Issues that need fixing +* relevant targets +* cmake required +* ACML is now AOCL -$$H \Psi = E \psi$$ From 25fac760db09ec854e6d78ecb6c70155355ed410 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Fri, 19 May 2023 05:00:52 -0400 Subject: [PATCH 1217/1312] Update tutorial.md --- doc/tutorial/tutorial.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index f227236a531..ef4ea013621 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -26,18 +26,18 @@ This tutorial covers ## Downloading -From the command line, clone the [MADNESS GitHub repository](https://github.com/m-a-d-n-e-s-s/madness) using +From the command line, clone the [MADNESS GitHub repository](https://github.com/m-a-d-n-e-s-s/madness) using one of the below * HTTPS ``` git clone https://github.com/m-a-d-n-e-s-s/madness.git ``` -* SSH +* SSH (for which you will need to have a GitHub account with SSH key) ``` git clone git@github.com:m-a-d-n-e-s-s/madness.git ``` This will make a new directory `madness` --- if you wish use a different name, append it to the command. -The head of the master branch usually builds and runs correctly due to the continuous integration. If you are looking for the tested version for the Tromso June 2023 workshop, after cloning +The head of the master branch usually builds and runs correctly due to the continuous integration. If you are looking for the version tested for the Tromso June 2023 workshop, after cloning ``` cd madness checkout XXXXXXXXXXXXXXXXXXX From 589f795a6d6410ed547e274848238ad8f351036f Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Fri, 19 May 2023 05:03:46 -0400 Subject: [PATCH 1218/1312] Update tutorial.md --- doc/tutorial/tutorial.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index ef4ea013621..c1ca2e73fa1 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -1,5 +1,12 @@ # MADNESS tutorial +## Table of contents + +1. [Downloading](#downloading) +2. [Building and installing](#building-and-installing) +3. Insanity + + This tutorial covers * downloading, building and installing MADNESS; [RJH] * using the MADNESS chemistry applications. [Florian, Hannes, Adrian] From 66cec3cfafc24776705c47343e42382cf678dea6 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Fri, 19 May 2023 05:06:38 -0400 Subject: [PATCH 1219/1312] Update tutorial.md --- doc/tutorial/tutorial.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index c1ca2e73fa1..94732adc19a 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -58,6 +58,12 @@ Issues that need fixing * relevant targets * cmake required * ACML is now AOCL +* Configuring a vanilla Ubuntu (or other Linux) system + - what packages to install and how +* Configuring a vanilla Intel Mac +* Configuring a vanilla ARM Mac + + From 4e4ecaccd1b765cc6d7c70d0fc347afd8961f9a1 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Fri, 19 May 2023 17:15:57 -0400 Subject: [PATCH 1220/1312] Update INSTALL.md --- INSTALL.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/INSTALL.md b/INSTALL.md index 5616d0352ad..9a16d1feb1a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -34,6 +34,24 @@ An MPI library is required by default, and should be autodected primarily by loo MADNESS will autodetect the [Intel TBB library](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.html#gs.8byhgg), which is available for free from Intel or via standard Linux package managers (even on ARM). TBB provides a fast task pool. If this is not detected, MADNESS will employ its own task pool. [PaRSEC](https://icl.utk.edu/parsec/) can also be used (see variables below) but is not recommended unless you are using MADNESS with the [Template Task Graph](https://github.com/TESSEorg/ttg). +### Minimal Ubuntu packages + +If you are using a different distribution, just change the name of the command to install packages. + +From a vanilla desktop install of Ubuntu (tested with 23.0.4) +``` + sudo apt install build-essential cmake gcc g++ git intel-mkl mpich +``` +If you want to build the documentation then also +``` + sudo apt install doxygen graphviz texlive +``` + +### Minimal MacOS packages + +???????????????????? + + The below summarizes some of the most useful CMake variables. ## Compiler variables From 1cd3b3e5651c513a8e8b074b7c557febf7f086ee Mon Sep 17 00:00:00 2001 From: Thomas Herault Date: Fri, 27 Jan 2023 16:05:58 -0500 Subject: [PATCH 1221/1312] Update to current parsec master Make it support PaRSEC profiling system by defining task identification functions. We need to integrate the MADNESS communication thread better to avoid a small memory leak (1 small object per communication thread instance as this is now) Fix deadlocks and API changes in latest PaRSEC master Note: need to discuss use of recursive progress calls in src/madness/mra/testdiff1Db --- cmake/modules/FindOrFetchPARSEC.cmake | 2 +- external/versions.cmake | 2 +- src/madness/world/parsec.cc | 162 ++++++++++++++++++-------- src/madness/world/parsec.h | 2 +- 4 files changed, 119 insertions(+), 49 deletions(-) diff --git a/cmake/modules/FindOrFetchPARSEC.cmake b/cmake/modules/FindOrFetchPARSEC.cmake index e85eed6094e..5d522e14d91 100644 --- a/cmake/modules/FindOrFetchPARSEC.cmake +++ b/cmake/modules/FindOrFetchPARSEC.cmake @@ -14,7 +14,7 @@ if (NOT TARGET PaRSEC::parsec) FetchContent_Declare( PARSEC - GIT_REPOSITORY https://github.com/TESSEorg/parsec.git + GIT_REPOSITORY https://github.com/ICLDisco/parsec.git GIT_TAG ${MADNESS_TRACKED_PARSEC_TAG} ) FetchContent_MakeAvailable(PARSEC) diff --git a/external/versions.cmake b/external/versions.cmake index 2061dc60d23..1ca588a0389 100644 --- a/external/versions.cmake +++ b/external/versions.cmake @@ -1 +1 @@ -set(MADNESS_TRACKED_PARSEC_TAG cb9322046c1f856fbca5804a9f96b83bbe2e676b) +set(MADNESS_TRACKED_PARSEC_TAG b1de9a24f49dfc3201301c8add98a0275bef37dd) diff --git a/src/madness/world/parsec.cc b/src/madness/world/parsec.cc index 4ed341cb3f4..b50926ac11e 100644 --- a/src/madness/world/parsec.cc +++ b/src/madness/world/parsec.cc @@ -8,6 +8,8 @@ // Here we initialize with the right child class namespace madness { + static thread_local bool within_madness_task = false; + parsec_hook_return_t complete_madness_task_execution (parsec_execution_stream_t *es, parsec_task_t *task) { (void)es; @@ -28,15 +30,12 @@ namespace madness { parsec_task_t *task) { PoolTaskInterface *c = ((PoolTaskInterface **)task->locals)[0]; assert(c); + within_madness_task = true; c->run(TaskThreadEnv(1, 0, 0)); + within_madness_task = false; return PARSEC_HOOK_RETURN_DONE; } - static uint64_t RUN_hash(const parsec_taskpool_t *tp, const parsec_assignment_t *a) { - (void)a; (void)tp; - return 0; - } - static parsec_hook_return_t empty_hook (parsec_execution_stream_t *es, parsec_task_t *task) { (void)es; (void)task; @@ -52,6 +51,29 @@ namespace madness { return tp->tdm.module->taskpool_addto_nb_tasks(tp, nb_tasks); } + static parsec_key_t madness_parsec_make_key(const parsec_taskpool_t *tp, const parsec_assignment_t *assignments) { + return (parsec_key_t)( reinterpret_cast ( *(const void**)assignments ) ); + } + + static int madness_parsec_key_equal(parsec_key_t a, parsec_key_t b, void *user_data) { + return a == b; + } + + static char *madness_parsec_key_print(char *buffer, size_t buffer_size, parsec_key_t k, void *user_data) { + snprintf(buffer, buffer_size, "MADNESS_TASK(%" PRIx64 ")", (intptr_t)(k)); + return buffer; + } + + static uint64_t madness_parsec_key_hash(parsec_key_t k, void *user_data) { + return (uint64_t)k; + } + + static parsec_key_fn_t madness_parsec_key_fns = { + .key_equal = madness_parsec_key_equal, + .key_print = madness_parsec_key_print, + .key_hash = madness_parsec_key_hash + }; + const parsec_task_class_t madness_parsec_tc = { .name = (char*)"RUN", .flags = PARSEC_HAS_IN_IN_DEPENDENCIES | PARSEC_USE_DEPS_MASK, @@ -59,6 +81,7 @@ namespace madness { .nb_flows = 0, .nb_parameters = 0, .nb_locals = 0, + .task_class_type = 0, .dependencies_goal = 0, .params = {NULL,NULL,NULL, NULL}, .locals = {NULL,NULL,NULL, NULL}, @@ -69,9 +92,12 @@ namespace madness { .initial_data = NULL, .final_data = NULL, .data_affinity = NULL, - .key_generator = (parsec_functionkey_fn_t *) RUN_hash, - .key_functions = NULL, - .make_key = NULL, + .key_functions = &madness_parsec_key_fns, + .make_key = madness_parsec_make_key, + .task_snprintf = NULL, +#if defined(PARSEC_PROF_TRACE) + .profile_info = NULL, +#endif #if defined(PARSEC_SIM) .sim_cost_fct = (parsec_sim_cost_fct_t*) NULL, #endif @@ -92,33 +118,33 @@ namespace madness { .fini = (parsec_hook_t *) NULL, }; + static int parsec_madness_taskpool_enter_wait(parsec_taskpool_t* tp, void*_) + { + assert(tp != NULL); + assert(NULL != tp->tdm.module); + (void)_; + tp->tdm.module->taskpool_ready(tp); + return PARSEC_SUCCESS; + } + + static int parsec_madness_taskpool_leave_wait(parsec_taskpool_t* tp, void*_) + { + assert(tp != NULL); + assert(NULL != tp->tdm.module); + (void)_; + + /* Reset termination detector, so we can start adding tasks again */ + tp->tdm.module->monitor_taskpool(tp, parsec_taskpool_termination_detected); + tp->tdm.module->taskpool_set_nb_tasks(tp, 0); + tp->tdm.module->taskpool_set_runtime_actions(tp, 0); + + /* We are re-attached to the context */ + parsec_atomic_fetch_inc_int32(&tp->context->active_taskpools); + return PARSEC_SUCCESS; + } + const parsec_task_class_t* madness_parsec_tc_array[]= {&(madness::madness_parsec_tc), NULL}; - parsec_taskpool_t ParsecRuntime::tp = { - .super = { 0x0, }, - .taskpool_id = 0, - .taskpool_name = (char*)"MADNESS taskpool", - .nb_tasks = 0, - .taskpool_type = 0, - .devices_index_mask = PARSEC_DEVICES_ALL, - .nb_task_classes = 1, - .priority = 0, - .nb_pending_actions = 0, - .context = NULL, - .tdm = {0x0, }, - .startup_hook = NULL, - .task_classes_array = madness_parsec_tc_array, -#if defined(PARSEC_PROF_TRACE) - .profiling_array = NULL, -#endif - .on_enqueue = NULL, - .on_enqueue_data = NULL, - .on_complete = NULL, - .on_complete_data = NULL, - .update_nb_runtime_task = madness_parsec_update_runtime_nb_tasks, - .destructor = NULL, - .dependencies_array = NULL, - .repo_array = NULL - }; + parsec_taskpool_t *ParsecRuntime::tp = nullptr; parsec_context_t *ParsecRuntime::ctx = nullptr; #ifdef PARSEC_PROF_TRACE int ParsecRuntime::taskpool_profiling_array[2]; @@ -132,22 +158,36 @@ namespace madness { ctx = parsec_init(nb_threads, &argc, &pargv); MPI_Comm parsec_comm = MPI_COMM_SELF; parsec_remote_dep_set_ctx(ctx, (intptr_t)parsec_comm); + tp = PARSEC_OBJ_NEW(parsec_taskpool_t); + tp->taskpool_name = strdup("MADNESS taskpool"); + tp->devices_index_mask = PARSEC_DEVICES_ALL; + tp->nb_task_classes = 1; + tp->task_classes_array = madness_parsec_tc_array; + tp->update_nb_runtime_task = madness_parsec_update_runtime_nb_tasks; + tp->on_enter_wait = parsec_madness_taskpool_enter_wait; + tp->on_leave_wait = parsec_madness_taskpool_leave_wait; + + parsec_termdet_open_module(tp, (char*)"local"); + tp->tdm.module->monitor_taskpool(tp, parsec_taskpool_termination_detected); + tp->tdm.module->taskpool_set_nb_tasks(tp, 0); + tp->tdm.module->taskpool_set_runtime_actions(tp, 0); #ifdef PARSEC_PROF_TRACE - ParsecRuntime::tp.profiling_array = ParsecRuntime::taskpool_profiling_array; + tp->profiling_array = ParsecRuntime::taskpool_profiling_array; parsec_profiling_add_dictionary_keyword("MADNESS TASK", "fill:CC2828", 0, "", - (int *)&ParsecRuntime::tp.profiling_array[0], - (int *)&ParsecRuntime::tp.profiling_array[1]); + (int *)&tp->profiling_array[0], + (int *)&tp->profiling_array[1]); #endif - if( 0 != parsec_context_add_taskpool(ctx, &tp) ) { + if( 0 != parsec_context_add_taskpool(ctx, tp) ) { std::cerr << "ERROR: parsec_context_add_taskpool failed!!" << std::endl; } - parsec_taskpool_update_runtime_nbtask(&tp, 1); if( 0 != parsec_context_start(ctx) ) { std::cerr << "ERROR: context_context_start failed!!" << std::endl; } } ParsecRuntime::~ParsecRuntime() { + parsec_context_wait(ctx); + parsec_taskpool_free(tp); parsec_fini(&ctx); ctx = nullptr; } @@ -168,9 +208,9 @@ namespace madness { parsec_execution_stream_t *my_es = execution_stream(); parsec_task_t* parsec_task = static_cast( parsec_thread_mempool_allocate( my_es->context_mempool ) ); PARSEC_LIST_ITEM_SINGLETON(parsec_task); - parsec_task->taskpool = &tp; + parsec_task->taskpool = tp; parsec_task->task_class = &madness_parsec_tc; - parsec_task->chore_id = 0; + parsec_task->chore_mask = 1<<0; parsec_task->status = PARSEC_TASK_STATUS_NONE; parsec_task->priority = is_high_priority ? 1000 : 0; // 1 & 0 would work as good ((void **)parsec_task->locals)[0] = ptr; @@ -183,18 +223,48 @@ namespace madness { void ParsecRuntime::schedule(PoolTaskInterface *task) { parsec_task_t* parsec_task = task->parsec_task; + parsec_task_t* vp_parsec_task[1] = {parsec_task}; PARSEC_LIST_ITEM_SINGLETON(parsec_task); - tp.tdm.module->taskpool_addto_nb_tasks(&tp, 1); - __parsec_schedule(execution_stream(), parsec_task, 0); + tp->tdm.module->taskpool_addto_nb_tasks(tp, 1); + + parsec_execution_stream_t *es = parsec_my_execution_stream(); + if(nullptr == es) { + /* We are the MADNESS comm thread, which doesn't have a parsec execution stream. + * Let's assign one... It's mostly a copy of 0, except for the profiling if this is enabled */ + es = (parsec_execution_stream_t *)calloc(1, sizeof(parsec_execution_stream_t)); + memcpy(es, context()->virtual_processes[0]->execution_streams[0], sizeof(parsec_execution_stream_t)); + /* This thread doesn't get a scheduler object: schedule happens on computation threads */ + es->scheduler_object = nullptr; +#if defined(PARSEC_PROF_TRACE) + es->es_profile = parsec_profiling_stream_init(2*1024*1024, "MADNESS Comm thread"); + parsec_profiling_set_default_thread(es->es_profile); +#endif /* PARSEC_PROF_TRACE */ + parsec_set_my_execution_stream(es); + } + + __parsec_schedule_vp(es, vp_parsec_task, 0); } void ParsecRuntime::wait() { - parsec_taskpool_update_runtime_nbtask(&tp, -1); - parsec_context_wait(ctx); + if(within_madness_task) { +#ifndef MADNESS_ASSERTIONS_DISABLE + std::cerr << "!!! ERROR: the PaRSEC task backend does not support recursive calls to wait.\n"; + MADNESS_EXCEPTION("ParsecRuntime::wait(): recursive call to wait/test detected", 0); +#endif + return; + } + parsec_taskpool_wait(tp); } int ParsecRuntime::test() { - int rc = parsec_taskpool_test(&tp); + if(within_madness_task) { +#ifndef MADNESS_ASSERTIONS_DISABLE + std::cerr << "!!! ERROR: the PaRSEC task backend does not support recursive calls to wait.\n"; + MADNESS_EXCEPTION("ParsecRuntime::wait(): recursive call to wait/test detected", 0); +#endif + return 0; + } + int rc = parsec_taskpool_test(tp); assert(rc >= 0); return rc; } diff --git a/src/madness/world/parsec.h b/src/madness/world/parsec.h index e20efe73774..2a84c050392 100644 --- a/src/madness/world/parsec.h +++ b/src/madness/world/parsec.h @@ -20,7 +20,7 @@ namespace madness{ class ParsecRuntime { private: static parsec_context_t *ctx; - static parsec_taskpool_t tp; + static parsec_taskpool_t *tp; #ifdef PARSEC_PROF_TRACE static int taskpool_profiling_array[2]; #endif /* PARSEC_PROF_TRACE */ From 0a35bc3f9dd7a09dd5770c3f8a0b77fcd223e2a6 Mon Sep 17 00:00:00 2001 From: Thomas Herault Date: Tue, 9 May 2023 16:37:34 -0400 Subject: [PATCH 1222/1312] Fix parsec profiling, only keep the status that a MADNESS task is on the stack if MADNESS_ASSERTIONS are enabled. Free allocated memory for PaRSEC profiling the MADNESS comm thread at ParsecRuntime deletion time. --- external/versions.cmake | 2 +- src/madness/world/parsec.cc | 54 ++++++++++++++++++++++++++----------- src/madness/world/parsec.h | 1 + 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/external/versions.cmake b/external/versions.cmake index 1ca588a0389..2b64d1b7d7d 100644 --- a/external/versions.cmake +++ b/external/versions.cmake @@ -1 +1 @@ -set(MADNESS_TRACKED_PARSEC_TAG b1de9a24f49dfc3201301c8add98a0275bef37dd) +set(MADNESS_TRACKED_PARSEC_TAG 669ad897d0954a179450212ae40af67bab852a8f) diff --git a/src/madness/world/parsec.cc b/src/madness/world/parsec.cc index b50926ac11e..1f7d5b64c8d 100644 --- a/src/madness/world/parsec.cc +++ b/src/madness/world/parsec.cc @@ -8,7 +8,9 @@ // Here we initialize with the right child class namespace madness { +#ifndef MADNESS_ASSERTIONS_DISABLE static thread_local bool within_madness_task = false; +#endif parsec_hook_return_t complete_madness_task_execution (parsec_execution_stream_t *es, parsec_task_t *task) { @@ -30,9 +32,13 @@ namespace madness { parsec_task_t *task) { PoolTaskInterface *c = ((PoolTaskInterface **)task->locals)[0]; assert(c); +#ifndef MADNESS_ASSERTIONS_DISABLE within_madness_task = true; +#endif c->run(TaskThreadEnv(1, 0, 0)); +#ifndef MADNESS_ASSERTIONS_DISABLE within_madness_task = false; +#endif return PARSEC_HOOK_RETURN_DONE; } @@ -146,6 +152,7 @@ namespace madness { const parsec_task_class_t* madness_parsec_tc_array[]= {&(madness::madness_parsec_tc), NULL}; parsec_taskpool_t *ParsecRuntime::tp = nullptr; parsec_context_t *ParsecRuntime::ctx = nullptr; + parsec_execution_stream_t *ParsecRuntime::madness_comm_thread_es = nullptr; #ifdef PARSEC_PROF_TRACE int ParsecRuntime::taskpool_profiling_array[2]; #endif @@ -178,10 +185,12 @@ namespace madness { (int *)&tp->profiling_array[1]); #endif if( 0 != parsec_context_add_taskpool(ctx, tp) ) { - std::cerr << "ERROR: parsec_context_add_taskpool failed!!" << std::endl; + std::cerr << "ERROR!!! parsec_context_add_taskpool failed!!" << std::endl; + MADNESS_EXCEPTION("ParsecRuntime::ParsecRuntime(): MADNESS taskpool could not be added to the PaRSEC context", 0); } if( 0 != parsec_context_start(ctx) ) { - std::cerr << "ERROR: context_context_start failed!!" << std::endl; + std::cerr << "ERROR!!! context_context_start failed!!" << std::endl; + MADNESS_EXCEPTION("ParsecRuntime::ParsecRuntime(): PaRSEC context could not be started", 0); } } @@ -189,6 +198,12 @@ namespace madness { parsec_context_wait(ctx); parsec_taskpool_free(tp); parsec_fini(&ctx); + if(nullptr != madness_comm_thread_es) { + /* madness_comm_thread_es is just a copy of ES[0]. Resources (including es->profiling_es) are + * actually freed during parsec_fini. Just need to free memory allocated to store it. */ + free(madness_comm_thread_es); + madness_comm_thread_es = nullptr; + } ctx = nullptr; } @@ -229,41 +244,48 @@ namespace madness { parsec_execution_stream_t *es = parsec_my_execution_stream(); if(nullptr == es) { +#ifndef MADNESS_ASSERTIONS_DISABLE + if(nullptr != madness_comm_thread_es) { + std::cerr << "!!! ERROR: the PaRSEC task backend expected at most one MADNESS communication thread.\n"; + MADNESS_EXCEPTION("ParsecRuntime::schedule(): more than one MADNESS communication thread", 0); + } +#endif /* We are the MADNESS comm thread, which doesn't have a parsec execution stream. * Let's assign one... It's mostly a copy of 0, except for the profiling if this is enabled */ - es = (parsec_execution_stream_t *)calloc(1, sizeof(parsec_execution_stream_t)); - memcpy(es, context()->virtual_processes[0]->execution_streams[0], sizeof(parsec_execution_stream_t)); + madness_comm_thread_es = (parsec_execution_stream_t *)calloc(1, sizeof(parsec_execution_stream_t)); + memcpy(madness_comm_thread_es, context()->virtual_processes[0]->execution_streams[0], sizeof(parsec_execution_stream_t)); /* This thread doesn't get a scheduler object: schedule happens on computation threads */ - es->scheduler_object = nullptr; + madness_comm_thread_es->scheduler_object = nullptr; #if defined(PARSEC_PROF_TRACE) - es->es_profile = parsec_profiling_stream_init(2*1024*1024, "MADNESS Comm thread"); - parsec_profiling_set_default_thread(es->es_profile); + madness_comm_thread_es->es_profile = parsec_profiling_stream_init(2*1024*1024, "MADNESS Comm thread"); + parsec_profiling_set_default_thread(madness_comm_thread_es->es_profile); #endif /* PARSEC_PROF_TRACE */ - parsec_set_my_execution_stream(es); + parsec_set_my_execution_stream(madness_comm_thread_es); + es = madness_comm_thread_es; } __parsec_schedule_vp(es, vp_parsec_task, 0); } void ParsecRuntime::wait() { - if(within_madness_task) { #ifndef MADNESS_ASSERTIONS_DISABLE - std::cerr << "!!! ERROR: the PaRSEC task backend does not support recursive calls to wait.\n"; + if(within_madness_task) { + std::cerr << "!!! ERROR: the PaRSEC task backend does not support recursive calls to wait.\n" + << "!!! ERROR: this is usually a symptom that a task is forcing a future that is not ready.\n"; MADNESS_EXCEPTION("ParsecRuntime::wait(): recursive call to wait/test detected", 0); -#endif - return; } +#endif parsec_taskpool_wait(tp); } int ParsecRuntime::test() { - if(within_madness_task) { #ifndef MADNESS_ASSERTIONS_DISABLE - std::cerr << "!!! ERROR: the PaRSEC task backend does not support recursive calls to wait.\n"; + if(within_madness_task) { + std::cerr << "!!! ERROR: the PaRSEC task backend does not support recursive calls to wait.\n" + << "!!! ERROR: this is usually a symptom that a task is forcing a future that is not ready.\n"; MADNESS_EXCEPTION("ParsecRuntime::wait(): recursive call to wait/test detected", 0); -#endif - return 0; } +#endif int rc = parsec_taskpool_test(tp); assert(rc >= 0); return rc; diff --git a/src/madness/world/parsec.h b/src/madness/world/parsec.h index 2a84c050392..f13dfb699d6 100644 --- a/src/madness/world/parsec.h +++ b/src/madness/world/parsec.h @@ -21,6 +21,7 @@ namespace madness{ private: static parsec_context_t *ctx; static parsec_taskpool_t *tp; + static parsec_execution_stream_t *madness_comm_thread_es; #ifdef PARSEC_PROF_TRACE static int taskpool_profiling_array[2]; #endif /* PARSEC_PROF_TRACE */ From 31b2470ca722a6a2d84d4de08d32fb72ae8fdeda Mon Sep 17 00:00:00 2001 From: Thomas Herault Date: Thu, 11 May 2023 13:18:36 -0400 Subject: [PATCH 1223/1312] Update to latest PaRSEC master so TTG and MADNESS point to the same version -- should have no impact on MADNESS over PaRSEC --- external/versions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/versions.cmake b/external/versions.cmake index 2b64d1b7d7d..aae8d3b30ce 100644 --- a/external/versions.cmake +++ b/external/versions.cmake @@ -1 +1 @@ -set(MADNESS_TRACKED_PARSEC_TAG 669ad897d0954a179450212ae40af67bab852a8f) +set(MADNESS_TRACKED_PARSEC_TAG 9fc74b6f165605a133125d8a5b62cf55642c1907) From 2cb8176afbb01fcab5803d60d13f6fd01813ecad Mon Sep 17 00:00:00 2001 From: fbischoff Date: Mon, 22 May 2023 15:53:42 +0200 Subject: [PATCH 1224/1312] unified --help and --print_parameters options for all applications, some pretty-printing --- src/apps/cc2/cc2.cc | 6 +- src/apps/cis/cis.cpp | 19 +- src/apps/dirac/DF.h | 14 +- src/apps/dirac/DFdriver.cc | 92 +++++---- src/apps/moldft/moldft.cc | 10 +- src/apps/molresponse/ResponseBase.hpp | 29 +++ src/apps/molresponse/molresponse.cc | 131 +++++++------ src/apps/mp2/mp2.cc | 69 +++---- src/apps/nemo/nemo.cc | 119 ++++++------ src/apps/oep/oep.cc | 54 +++--- src/apps/pno/pno.cpp | 174 ++++++++++-------- src/apps/zcis/zcis.cc | 74 ++++---- src/apps/znemo/znemo.cc | 161 +++++++--------- src/madness/chem/CC2.h | 2 +- src/madness/chem/PNO.h | 24 +++ .../chem/QCCalculationParametersBase.h | 52 +++++- src/madness/chem/SCF.h | 6 +- src/madness/chem/TDHF.h | 24 +++ src/madness/chem/molecule.cc | 19 +- src/madness/chem/mp2.h | 25 ++- src/madness/chem/nemo.h | 6 +- src/madness/chem/oep.h | 63 ++++--- src/madness/chem/zcis.h | 34 +++- src/madness/chem/znemo.cc | 4 +- src/madness/chem/znemo.h | 48 +++-- src/madness/world/print.cc | 27 +++ src/madness/world/print.h | 9 + 27 files changed, 809 insertions(+), 486 deletions(-) diff --git a/src/apps/cc2/cc2.cc b/src/apps/cc2/cc2.cc index a56a856e796..0f95547e21c 100644 --- a/src/apps/cc2/cc2.cc +++ b/src/apps/cc2/cc2.cc @@ -49,14 +49,14 @@ int main(int argc, char **argv) { World& world=initialize(argc, argv); if (world.rank() == 0) { - print("\n CC2: Coupled Cluster approximate Doubles \n"); + print_header1("CC2: Coupled Cluster approximate Doubles"); printf("starting at time %.1f\n", wall_time()); - print(info::print_revision_information()); } startup(world, argc, argv,true); std::cout.precision(6); FunctionDefaults<3>::set_truncate_mode(1); + if (world.rank()==0) print(info::print_revision_information()); // set the tensor type TensorType tt = TT_2D; @@ -85,7 +85,7 @@ int main(int argc, char **argv) { } double hf_energy = nemo->value(); if (world.rank() == 0) - std::cout << "\n\n\n\n\n\n Reference Calclation Ended\n SCF Energy is: " << hf_energy + std::cout << "\n\n\n\n\n\n Reference Calculation Ended\n SCF Energy is: " << hf_energy << "\n current wall-time: " << wall_time() << "\n current cpu-time: " << cpu_time() << "\n\n\n"; diff --git a/src/apps/cis/cis.cpp b/src/apps/cis/cis.cpp index 27af93e32f9..5cc9704de0b 100644 --- a/src/apps/cis/cis.cpp +++ b/src/apps/cis/cis.cpp @@ -15,17 +15,19 @@ using namespace madness; int main(int argc, char **argv) { int error = 0; + World& world = initialize(argc, argv); { - World& world = initialize(argc, argv); if (world.rank() == 0) { - printf("starting at time %.1f\n", wall_time()); - print("\nmain() compiled at ", __TIME__, " on ", __DATE__); - print(info::print_revision_information()); + print_header1("CIS -- compute DFT and Hartree-Fock excited states in CIS/TDA approximation"); } + //const double time_start = wall_time(); std::cout.precision(6); startup(world, argc, argv, true); + if (world.rank()==0) print(info::print_revision_information()); + + printf("starting at time %.1f\n", wall_time()); print_meminfo(world.rank(), "startup"); if (world.rank() == 0) { @@ -44,9 +46,16 @@ int main(int argc, char **argv) { commandlineparser parser(argc, argv); parser.print_map(); - if (parser.key_exists("test")) { + if (parser.key_exists("help")) { + TDHF::help(); + + } else if (parser.key_exists("print_parameters")) { + TDHF::print_parameters(); + + } else if (parser.key_exists("test")) { print("entering test mode"); error = TDHF::test(world, parser); + } else { TDHF tdhf(world, parser); diff --git a/src/apps/dirac/DF.h b/src/apps/dirac/DF.h index a688de968eb..58c17dcec75 100644 --- a/src/apps/dirac/DF.h +++ b/src/apps/dirac/DF.h @@ -70,7 +70,19 @@ class DF { DF(World & world, // MADNESS world object std::shared_ptr input); // Pointer to input stream - //Calculates the kinetic+rest energy expectation value of psi + static void help() { + print_header2("help page for DIRAC "); + print("The DIRAC code computes Dirac-Fock energies"); + } + + static void print_parameters() { + print("no parameter help is available for the dirac code"); + print("\nYou need a dft-block and a DiracFock-block in an input file named 'input'"); + } + + + + //Calculates the kinetic+rest energy expectation value of psi double rele(World& world, Fcwf& psi); //Applies the exchange operator to all of occupieds diff --git a/src/apps/dirac/DFdriver.cc b/src/apps/dirac/DFdriver.cc index a5a456089bc..8fe4c3d442a 100644 --- a/src/apps/dirac/DFdriver.cc +++ b/src/apps/dirac/DFdriver.cc @@ -2,9 +2,10 @@ * * Main source file for the Dirac Fock code * - */ + */ +#include #include "DF.h" // All Dirac-Fock functions/objects enter through this #include @@ -20,35 +21,64 @@ static inline int file_exists(const char * inpname) } #endif -int main(int argc, char** argv) -{ - // Initialize MADNESS mpi - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); - startup(world,argc,argv); - std::cout.precision(10); - - // This makes a default input file name of 'input' - const char * input = "input"; - for (int i=1; i #include #include +#include + #if defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_STAT_H) && defined(HAVE_UNISTD_H) @@ -74,14 +76,18 @@ static void END_TIMER(World& world, const char *msg) { int main(int argc, char **argv) { - initialize(argc, argv); + World& world=initialize(argc, argv); + if (world.rank() == 0) { + print_header1("MOLDFT -- molecular DFT and Hartree-Fock code"); + } { // limit lifetime of world so that finalize() can execute cleanly - World world(SafeMPI::COMM_WORLD); START_TIMER(world); try { // Load info for MADNESS numerical routines startup(world, argc, argv, true); + if (world.rank()==0) print(info::print_revision_information()); + commandlineparser parser(argc, argv); if (parser.key_exists("help")) { diff --git a/src/apps/molresponse/ResponseBase.hpp b/src/apps/molresponse/ResponseBase.hpp index 1cea35c9d66..d87480f8f5e 100644 --- a/src/apps/molresponse/ResponseBase.hpp +++ b/src/apps/molresponse/ResponseBase.hpp @@ -73,6 +73,35 @@ class ResponseBase { response_timing time_data; mutable std::map> iter_timing; + + static void help() { + print_header2("help page for MOLRESPONSE "); + print("The molresponse code computes linear response properties and excited states"); + print("\nYou can print all available calculation parameters by running\n"); + print("molresponse --print_parameters\n"); + print("You can perform a simple calculation by running\n"); + print("moldft --geometry=h2o.xyz"); + print("molresponse"); + print("\nprovided you have an xyz file in your directory as well as a file named 'response.in'."); + print("with minimal input\n"); + print("response "); + print(" archive mad.restartdata "); + print(" excited_state 1 "); + print("end "); + + } + + static void print_parameters() { + ResponseParameters rparam; + print("A molresponse calculation requires a converged moldft calculations with the "); + print("corresponding parameters."); + print("\nDefault parameters for the response part of the molresponse program are"); + rparam.print("response", "end"); + print("\n\nthe molecular geometry must be specified in a separate block:"); + Molecule::print_parameters(); + } + + protected: // Given molecule returns the nuclear potential of the molecule ResponseParameters r_params; diff --git a/src/apps/molresponse/molresponse.cc b/src/apps/molresponse/molresponse.cc index bb7133130c6..a7e4275f307 100644 --- a/src/apps/molresponse/molresponse.cc +++ b/src/apps/molresponse/molresponse.cc @@ -59,71 +59,86 @@ static inline int file_exists(const char *inpname) { using namespace madness; int main(int argc, char **argv) { - World &world = madness::initialize(argc, argv); + World& world = madness::initialize(argc, argv); startup(world, argc, argv, true); - sleep(10); + if (world.rank() == 0) { + print_header1("MOLRESPONSE -- MADNESS Time-Dependent Density Functional Theory Excited-State Program "); + } + +// sleep(10); int result = 0; std::cout.precision(6); std::string filename = "response.in"; - molresponse::start_timer(world); - // try catch would start here - try { - auto calc_params = initialize_calc_params(world, filename); - if (calc_params.response_parameters.excited_state()) { - - ExcitedResponse calc(world, calc_params); - if (world.rank() == 0) { - print("\n\n"); - print(" MADNESS Time-Dependent Density Functional Theory Excited-State " - "Program"); - print(" ----------------------------------------------------------\n"); - print("\n"); - calc_params.molecule.print(); - print("\n"); - calc_params.response_parameters.print("response"); - // put the response parameters in a j_molrespone json object - } - calc_params.response_parameters.to_json(calc.j_molresponse); - // set protocol to the first - calc.solve(world); - calc.output_json(); - } else if (calc_params.response_parameters.first_order()) { - RHS_Generator rhsGenerator; - if (calc_params.response_parameters.dipole()) { - rhsGenerator = dipole_generator; - } else if (calc_params.response_parameters.nuclear()) { - rhsGenerator = nuclear_generator; + commandlineparser parser(argc, argv); + + if (parser.key_exists("help")) { + ExcitedResponse::help(); + } else if (parser.key_exists("print_parameters")) { + ExcitedResponse::print_parameters(); + } else { + + + + molresponse::start_timer(world); + // try catch would start here + try { + auto calc_params = initialize_calc_params(world, filename); + if (calc_params.response_parameters.excited_state()) { + + ExcitedResponse calc(world, calc_params); + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Time-Dependent Density Functional Theory Excited-State " + "Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc_params.molecule.print(); + print("\n"); + calc_params.response_parameters.print("response"); + // put the response parameters in a j_molrespone json object + } + calc_params.response_parameters.to_json(calc.j_molresponse); + // set protocol to the first + calc.solve(world); + calc.output_json(); + } else if (calc_params.response_parameters.first_order()) { + RHS_Generator rhsGenerator; + if (calc_params.response_parameters.dipole()) { + rhsGenerator = dipole_generator; + } else if (calc_params.response_parameters.nuclear()) { + rhsGenerator = nuclear_generator; + } + auto omega = calc_params.response_parameters.omega(); + FrequencyResponse calc(world, calc_params, omega, rhsGenerator); + // Warm and fuzzy for the user + if (world.rank() == 0) { + print("\n\n"); + print(" MADNESS Time-Dependent Density Functional Theory Frequency Response " + "Program"); + print(" ----------------------------------------------------------\n"); + print("\n"); + calc_params.molecule.print(); + print("\n"); + calc_params.response_parameters.print("response"); + } + calc_params.response_parameters.to_json(calc.j_molresponse); + // set protocol to the first + calc.solve(world); + calc.output_json(); + } else { + if (world.rank() == 0) { print("Response not implemented"); } } - auto omega = calc_params.response_parameters.omega(); - FrequencyResponse calc(world, calc_params, omega, rhsGenerator); - // Warm and fuzzy for the user - if (world.rank() == 0) { - print("\n\n"); - print(" MADNESS Time-Dependent Density Functional Theory Frequency Response " - "Program"); - print(" ----------------------------------------------------------\n"); - print("\n"); - calc_params.molecule.print(); - print("\n"); - calc_params.response_parameters.print("response"); - } - calc_params.response_parameters.to_json(calc.j_molresponse); - // set protocol to the first - calc.solve(world); - calc.output_json(); - } else { - if (world.rank() == 0) { print("Response not implemented"); } - } - - } catch (const SafeMPI::Exception &e) { print(e); } catch (const madness::MadnessException &e) { - std::cout << e << std::endl; - } catch (const madness::TensorException &e) { print(e); } catch (const char *s) { - print(s); - } catch (const std::string &s) { print(s); } catch (const std::exception &e) { - print(e.what()); - } catch (...) { error("caught unhandled exception"); } + + } catch (const SafeMPI::Exception& e) { print(e); } catch (const madness::MadnessException& e) { + std::cout << e << std::endl; + } catch (const madness::TensorException& e) { print(e); } catch (const char *s) { + print(s); + } catch (const std::string& s) { print(s); } catch (const std::exception& e) { + print(e.what()); + } catch (...) { error("caught unhandled exception"); } + } finalize(); return result; diff --git a/src/apps/mp2/mp2.cc b/src/apps/mp2/mp2.cc index 9a685ac1aa5..8f7753bf0a8 100644 --- a/src/apps/mp2/mp2.cc +++ b/src/apps/mp2/mp2.cc @@ -46,49 +46,52 @@ using namespace madness; #ifdef USE_GENTENSOR int main(int argc, char** argv) { - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); - startup(world,argc,argv); - std::cout.precision(6); + World& world=initialize(argc, argv,false); + if (world.rank() == 0) { + print_header1("MP2 -- second order correlation energies"); + printf("starting at time %.1f\n", wall_time()); + } + startup(world,argc,argv,true); + std::cout.precision(6); if (world.rank()==0) print(info::print_revision_information()); + commandlineparser parser(argc,argv); + if (parser.key_exists("help")) { + MP2::help(); - TensorType tt=TT_2D; - if (parser.key_exists("TT")) { - if (parser.value("TT")=="TT_2D") tt=TT_2D; - if (parser.value("TT")=="TT_TENSORTRAIN") tt=TT_TENSORTRAIN; - } - bool do_test=false; - std::string testfilename; - if (parser.key_exists("test")) { - do_test = true; - testfilename=parser.value("test"); - } + } else if (parser.key_exists("print_parameters")) { + MP2::print_parameters(); + + } else { + + TensorType tt = TT_2D; + if (parser.key_exists("TT")) { + if (parser.value("TT") == "TT_2D") tt = TT_2D; + if (parser.value("TT") == "TT_TENSORTRAIN") tt = TT_TENSORTRAIN; + } - FunctionDefaults<6>::set_tensor_type(tt); - FunctionDefaults<6>::set_apply_randomize(true); + FunctionDefaults<6>::set_tensor_type(tt); + FunctionDefaults<6>::set_apply_randomize(true); - try { - MP2 mp2(world,parser); + try { + MP2 mp2(world, parser); - if(world.rank() == 0) printf("\nstarting at time %.1fs\n", wall_time()); + if (world.rank() == 0) printf("\nstarting at time %.1fs\n", wall_time()); - if (do_test) mp2.test(testfilename); - else { - const double hf_energy=mp2.get_hf().value(); - const double mp2_energy=mp2.value(); - if(world.rank() == 0) { - printf("final hf/mp2/total energy %12.8f %12.8f %12.8f\n", - hf_energy,mp2_energy,hf_energy+mp2_energy); - } - } - } catch (std::exception& e) { + const double hf_energy = mp2.get_hf().value(); + const double mp2_energy = mp2.value(); + if (world.rank() == 0) { + printf("final hf/mp2/total energy %12.8f %12.8f %12.8f\n", + hf_energy, mp2_energy, hf_energy + mp2_energy); + } + } catch (std::exception& e) { - if (world.rank()==0) { - print("\ncaught an exception: \n",e.what()); - } + if (world.rank() == 0) { + print("\ncaught an exception: \n", e.what()); + } + } } if(world.rank() == 0) printf("\nfinished at time %.1fs\n\n", wall_time()); diff --git a/src/apps/nemo/nemo.cc b/src/apps/nemo/nemo.cc index 38ff0b295cb..91758b53b55 100644 --- a/src/apps/nemo/nemo.cc +++ b/src/apps/nemo/nemo.cc @@ -53,82 +53,91 @@ using namespace madness; int main(int argc, char** argv) { - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); + World& world=initialize(argc, argv,false); if (world.rank() == 0) { - print("\n NEMO -- Hartree-Fock using numerical exponential molecular orbitals \n"); + print_header1("NEMO -- Hartree-Fock using numerical exponential molecular orbitals"); printf("starting at time %.1f\n", wall_time()); - } + startup(world,argc,argv,true); std::cout.precision(6); - if (world.rank()==0) print(info::print_revision_information()); - try { - commandlineparser parser(argc,argv); - std::shared_ptr nemo(new Nemo(world,parser)); + commandlineparser parser(argc,argv); + if (parser.key_exists("help")) { + Nemo::help(); + + } else if (parser.key_exists("print_parameters")) { + Nemo::print_parameters(); + + } else { - if (world.rank()==0) nemo->get_param().print("dft","end"); + try { + + std::shared_ptr nemo(new Nemo(world, parser)); + + print_header2("input section"); + if (world.rank() == 0) nemo->get_param().print("dft", "end"); // if (world.rank()==0) nemo->get_calc()->param.print("dft","end"); - // optimize the geometry if requested - if (nemo->get_param().gopt()) { - print("\n\n Geometry Optimization "); - print(" ----------------------------------------------------------\n"); + // optimize the geometry if requested + if (nemo->get_param().gopt()) { + print("\n\n Geometry Optimization "); + print(" ----------------------------------------------------------\n"); // calc->param.gprint(world); - Tensor geomcoord =nemo->get_calc()->molecule.get_all_coords().flat(); - MolecularOptimizer geom(world,parser,nemo); - geom.parameters.print("geoopt","end"); + Tensor geomcoord = nemo->get_calc()->molecule.get_all_coords().flat(); + MolecularOptimizer geom(world, parser, nemo); + geom.parameters.print("geoopt", "end"); - geom.parameters.print("geoopt","end"); + geom.parameters.print("geoopt", "end"); - // compute initial hessian - if (nemo->get_param().ginitial_hessian()) { - nemo->value(); - Tensor hess=nemo->hessian(nemo->get_calc()->molecule.get_all_coords()); - geom.set_hessian(hess); - } - geom.optimize(geomcoord); - } else { + // compute initial hessian + if (nemo->get_param().ginitial_hessian()) { + nemo->value(); + Tensor hess = nemo->hessian(nemo->get_calc()->molecule.get_all_coords()); + geom.set_hessian(hess); + } + geom.optimize(geomcoord); + } else { - // compute the energy to get converged orbitals + // compute the energy to get converged orbitals // Nemo nemo(world,calc); - const double energy=nemo->value(); - if (world.rank()==0) { - printf("final energy %12.8f\n", energy); - printf("finished at time %.1f\n", wall_time()); + const double energy = nemo->value(); + if (world.rank() == 0) { + printf("final energy %12.8f\n", energy); + printf("finished at time %.1f\n", wall_time()); + } + } + // compute the hessian + if (nemo->param.hessian()) nemo->hessian(nemo->get_calc()->molecule.get_all_coords()); + + + } catch (const SafeMPI::Exception& e) { + print(e); + error("caught an MPI exception"); + } catch (const madness::MadnessException& e) { + print(e); + error("caught a MADNESS exception"); + } catch (const madness::TensorException& e) { + print(e); + error("caught a Tensor exception"); + } catch (const char *s) { + print(s); + error("caught a string exception"); + } catch (const std::string& s) { + print(s); + error("caught a string (class) exception"); + } catch (const std::exception& e) { + print(e.what()); + error("caught an STL exception"); + } catch (...) { + error("caught unhandled exception"); } - - // compute the hessian - if (nemo->param.hessian()) nemo->hessian(nemo->get_calc()->molecule.get_all_coords()); - - - } catch (const SafeMPI::Exception& e) { - print(e); - error("caught an MPI exception"); - } catch (const madness::MadnessException& e) { - print(e); - error("caught a MADNESS exception"); - } catch (const madness::TensorException& e) { - print(e); - error("caught a Tensor exception"); - } catch (const char* s) { - print(s); - error("caught a string exception"); - } catch (const std::string& s) { - print(s); - error("caught a string (class) exception"); - } catch (const std::exception& e) { - print(e.what()); - error("caught an STL exception"); - } catch (...) { - error("caught unhandled exception"); } finalize(); diff --git a/src/apps/oep/oep.cc b/src/apps/oep/oep.cc index 58def8b81a7..be1e19f4781 100644 --- a/src/apps/oep/oep.cc +++ b/src/apps/oep/oep.cc @@ -83,37 +83,43 @@ void write_test_input() { int main(int argc, char** argv) { - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); + + World& world=initialize(argc, argv,false); if (world.rank() == 0) { - print("\n OEP -- optimized effective potentials for DFT \n"); - printf("starting at time %.1f\n", wall_time()); + print_header1("OEP -- optimized effective potentials for DFT"); } - startup(world, argc, argv,true); - std::cout.precision(6); + startup(world,argc,argv,true); + std::cout.precision(6); if (world.rank()==0) print(info::print_revision_information()); - commandlineparser parser(argc,argv); - // to allow to test the program - bool test = parser.key_exists("test"); - bool analyze = parser.key_exists("analyze"); - - // create test input file if program is tested - if (test) { - write_test_input(); - parser.set_keyval("input","test_input"); + commandlineparser parser(argc,argv); + if (parser.key_exists("help")) { + OEP::help(); + + } else if (parser.key_exists("print_parameters")) { + OEP::print_parameters(); + + } else { + // to allow to test the program + bool test = parser.key_exists("test"); + bool analyze = parser.key_exists("analyze"); + + // create test input file if program is tested + if (test) { + write_test_input(); + parser.set_keyval("input", "test_input"); + } + + // do approximate OEP calculation or test the program + std::shared_ptr oep(new OEP(world, parser)); + oep->print_parameters({"reference", "oep", "oep_calc"}); + if (test) oep->selftest(); + else if (analyze) oep->analyze(); + else oep->value(); } - // do approximate OEP calculation or test the program - std::shared_ptr oep(new OEP(world, parser)); - oep->print_parameters({"reference","oep","oep_calc"}); - int ierr=0; - if (test) ierr=oep->selftest(); - else if (analyze) oep->analyze(); - else oep->value(); - finalize(); - return ierr; + return 0; } diff --git a/src/apps/pno/pno.cpp b/src/apps/pno/pno.cpp index 63963ffcb23..64c782e88a7 100644 --- a/src/apps/pno/pno.cpp +++ b/src/apps/pno/pno.cpp @@ -2,6 +2,8 @@ #include #include #include +#include + using namespace madness; @@ -12,88 +14,98 @@ const std::string TAG_CP = "computeprotocol"; int main(int argc, char** argv) { - { - World& world=initialize(argc, argv); - if (world.rank() == 0) printf("starting at time %.1f\n", wall_time()); - //const double time_start = wall_time(); - std::cout.precision(6); - - startup(world,argc,argv,true); - print_meminfo(world.rank(), "startup"); - - if(world.rank()==0){ - std::cout << "\n\n"; - std::cout << "-------------------------------------------------------------------------------------\n"; - std::cout << "SOLVING MRA-PNO-F12 as described in \n"; - std::cout << "J.S. Kottmann, F.A. Bischoff, E.F. Valeev\n"; - std::cout << "Direct determination of optimal pair-natural orbitals in a real-space representation:\n"; - std::cout << "the second-order Møller-Plesset energy\n"; - std::cout << "Journal of Chemical Physics ... 2019\n"; - std::cout << "-------------------------------------------------------------------------------------\n"; - std::cout << "\n\n"; - } - - // Get the name of the input file (if given) - const std::string input = (argc > 1) ? argv[1] : "input"; - - // Compute the SCF Reference - const double time_scf_start = wall_time(); - commandlineparser parser(argc,argv); + + World& world=initialize(argc, argv,false); + if (world.rank() == 0) { + print_header1("PNO -- MP2 energies using pair natural orbitals"); + printf("starting at time %.1f\n", wall_time()); + } + + startup(world,argc,argv,true); + std::cout.precision(6); + if (world.rank()==0) print(info::print_revision_information()); + + if(world.rank()==0){ + std::cout << "\n\n"; + std::cout << "-------------------------------------------------------------------------------------\n"; + std::cout << "SOLVING MRA-PNO-F12 as described in \n"; + std::cout << "J.S. Kottmann, F.A. Bischoff, E.F. Valeev\n"; + std::cout << "Direct determination of optimal pair-natural orbitals in a real-space representation:\n"; + std::cout << "the second-order Møller-Plesset energy\n"; + std::cout << "Journal of Chemical Physics ... 2019\n"; + std::cout << "-------------------------------------------------------------------------------------\n"; + std::cout << "\n\n"; + } + + + commandlineparser parser(argc,argv); + + if (parser.key_exists("help")) { + PNO::help(); + + } else if (parser.key_exists("print_parameters")) { + PNO::print_parameters(); + + } else { + + + // Compute the SCF Reference + const double time_scf_start = wall_time(); Nemo nemo(world,parser); - nemo.get_calc()->param.print(); - const double scf_energy = nemo.value(); - if (world.rank() == 0) print("nemo energy: ", scf_energy); - if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); - const double time_scf_end = wall_time(); - - // Compute MRA-PNO-MP2-F12 - const double time_pno_start = wall_time(); - PNOParameters parameters(world,parser,nemo.get_calc()->molecule,TAG_PNO); - F12Parameters paramf12(world, parser, parameters, TAG_F12); - PNO pno(world, nemo, parameters, paramf12); - std::vector all_pairs; - pno.solve(all_pairs); - const double time_pno_end = wall_time(); - - - if(world.rank()==0){ - std::cout << std::setfill(' '); - std::cout << "\n\n\n"; - std::cout << "--------------------------------------------------\n"; - std::cout << "MRA-PNO-MP2-F12 ended \n"; - std::cout << "--------------------------------------------------\n"; - std::cout << std::setw(25) << "time scf" << " = " << time_scf_end - time_scf_start << "\n"; - std::cout << std::setw(25) << "energy scf" << " = " << scf_energy << "\n"; - std::cout << "--------------------------------------------------\n"; - } - double mp2_energy = 0.0; - std::cout<< std::setw(25) << "time pno" << " = " << time_pno_end - time_pno_start << "\n"; - for(const auto& pairs: all_pairs){ - if(pairs.type == MP2_PAIRTYPE){ - mp2_energy = pairs.energies.total_energy(); - } - std::pair ranks= pno.get_average_rank(pairs.pno_ij); - if(world.rank()==0){ - std::string name; - std::stringstream ss; - ss << pairs.type; - ss >> name; - std::cout<< std::setw(25) << "energy "+name << " = " << pairs.energies.total_energy() << "\n"; - std::cout<< std::setw(25) << "average pno rank " + name << " = " << ranks.first << "\n"; - std::cout<< std::setw(25) << "max pno rank " + name << " = " << ranks.second << "\n"; - } - } - if(world.rank()==0 and mp2_energy != 0.0){ - std::cout << "--------------------------------------------------\n"; - std::cout<< std::setw(25) << "energy(total)" << " = " << scf_energy + mp2_energy << "\n"; - std::cout << "--------------------------------------------------\n"; - std::cout << "\n\n\n"; - } - - world.gop.fence(); - if (world.rank() == 0) printf("finished at time %.1f\n", wall_time()); - print_stats(world); - } + nemo.get_calc()->param.print(); + const double scf_energy = nemo.value(); + if (world.rank() == 0) print("nemo energy: ", scf_energy); + if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); + const double time_scf_end = wall_time(); + + // Compute MRA-PNO-MP2-F12 + const double time_pno_start = wall_time(); + PNOParameters parameters(world,parser,nemo.get_calc()->molecule,TAG_PNO); + F12Parameters paramf12(world, parser, parameters, TAG_F12); + PNO pno(world, nemo, parameters, paramf12); + std::vector all_pairs; + pno.solve(all_pairs); + const double time_pno_end = wall_time(); + + + if(world.rank()==0){ + std::cout << std::setfill(' '); + std::cout << "\n\n\n"; + std::cout << "--------------------------------------------------\n"; + std::cout << "MRA-PNO-MP2-F12 ended \n"; + std::cout << "--------------------------------------------------\n"; + std::cout << std::setw(25) << "time scf" << " = " << time_scf_end - time_scf_start << "\n"; + std::cout << std::setw(25) << "energy scf" << " = " << scf_energy << "\n"; + std::cout << "--------------------------------------------------\n"; + } + double mp2_energy = 0.0; + std::cout<< std::setw(25) << "time pno" << " = " << time_pno_end - time_pno_start << "\n"; + for(const auto& pairs: all_pairs){ + if(pairs.type == MP2_PAIRTYPE){ + mp2_energy = pairs.energies.total_energy(); + } + std::pair ranks= pno.get_average_rank(pairs.pno_ij); + if(world.rank()==0){ + std::string name; + std::stringstream ss; + ss << pairs.type; + ss >> name; + std::cout<< std::setw(25) << "energy "+name << " = " << pairs.energies.total_energy() << "\n"; + std::cout<< std::setw(25) << "average pno rank " + name << " = " << ranks.first << "\n"; + std::cout<< std::setw(25) << "max pno rank " + name << " = " << ranks.second << "\n"; + } + } + if(world.rank()==0 and mp2_energy != 0.0){ + std::cout << "--------------------------------------------------\n"; + std::cout<< std::setw(25) << "energy(total)" << " = " << scf_energy + mp2_energy << "\n"; + std::cout << "--------------------------------------------------\n"; + std::cout << "\n\n\n"; + } + + world.gop.fence(); + if (world.rank() == 0) printf("finished at time %.1f\n", wall_time()); + print_stats(world); + } finalize(); return 0; } diff --git a/src/apps/zcis/zcis.cc b/src/apps/zcis/zcis.cc index 20458b3d0a6..3a1a9d624f7 100644 --- a/src/apps/zcis/zcis.cc +++ b/src/apps/zcis/zcis.cc @@ -47,46 +47,52 @@ using namespace madness; int main(int argc, char** argv) { - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); - if (world.rank() == 0) { - print("\n ZCIS -- excited states in the CIS approximation using complex orbitals \n"); - printf("starting at time %.1f\n", wall_time()); + World& world=initialize(argc, argv,false); + if (world.rank() == 0) { + print_header1(" ZCIS -- excited states in the CIS approximation using complex orbitals"); } + startup(world,argc,argv,true); std::cout.precision(6); - commandlineparser parser(argc,argv); + if (world.rank()==0) print(info::print_revision_information()); - try { - - std::shared_ptr znemo(new Znemo(world, parser)); - znemo->value(); - Zcis zcis(world,parser,znemo); - zcis.value(); - - - } catch (const SafeMPI::Exception& e) { - print(e); - error("caught an MPI exception"); - } catch (const madness::MadnessException& e) { - print(e); - error("caught a MADNESS exception"); - } catch (const madness::TensorException& e) { - print(e); - error("caught a Tensor exception"); - } catch (const char* s) { - print(s); - error("caught a string exception"); - } catch (const std::string& s) { - print(s); - error("caught a string (class) exception"); - } catch (const std::exception& e) { - print(e.what()); - error("caught an STL exception"); - } catch (...) { - error("caught unhandled exception"); + commandlineparser parser(argc,argv); + if (parser.key_exists("help")) { + Zcis::help(); + + } else if (parser.key_exists("print_parameters")) { + Zcis::print_parameters(); + + } else { + + try { + std::shared_ptr znemo(new Znemo(world, parser)); + znemo->value(); + Zcis zcis(world, parser, znemo); + zcis.value(); + } catch (const SafeMPI::Exception& e) { + print(e); + error("caught an MPI exception"); + } catch (const madness::MadnessException& e) { + print(e); + error("caught a MADNESS exception"); + } catch (const madness::TensorException& e) { + print(e); + error("caught a Tensor exception"); + } catch (const char *s) { + print(s); + error("caught a string exception"); + } catch (const std::string& s) { + print(s); + error("caught a string (class) exception"); + } catch (const std::exception& e) { + print(e.what()); + error("caught an STL exception"); + } catch (...) { + error("caught unhandled exception"); + } } diff --git a/src/apps/znemo/znemo.cc b/src/apps/znemo/znemo.cc index 1014167ee11..446c8b3a356 100644 --- a/src/apps/znemo/znemo.cc +++ b/src/apps/znemo/znemo.cc @@ -43,110 +43,87 @@ #if !defined USE_GENTENSOR -#include "madness/chem/znemo.h" - +#include using namespace madness; - int main(int argc, char** argv) { - initialize(argc, argv); - World world(SafeMPI::COMM_WORLD); - startup(world,argc,argv); - std::cout.precision(6); + World& world=initialize(argc, argv,false); if (world.rank() == 0) { - print("\n ZNEMO -- complex Hartree-Fock using numerical exponential molecular orbitals \n"); - printf("starting at time %.1f\n", wall_time()); - + print_header1(" ZNEMO -- complex Hartree-Fock using numerical exponential molecular orbitals"); + printf("starting at time %.1f\n", wall_time()); } + startup(world,argc,argv,true); + std::cout.precision(6); if (world.rank()==0) print(info::print_revision_information()); - commandlineparser parser(argc,argv); - bool value=true; - bool analyze=false; - bool write_input=false; - bool help=false; - - // parse command line arguments - std::vector allArgs(argv, argv + argc); - for (auto& a : allArgs) { - std::replace_copy(a.begin(), a.end(), a.begin(), '=',' '); - std::replace_copy(a.begin(), a.end(), a.begin(), '-',' '); - std::string key, val; - std::stringstream sa(a); - sa >> key >> val; - if (key=="help") help=true; - if (key=="analyze") { - value=false; - analyze=true; - } - if (key=="write_input") write_input=true; - } - print("help",help); - print("value",value); - print("analyze",analyze); - print("write_input",write_input); - - try { - - std::shared_ptr znemo(new Znemo(world,parser)); - - // optimize the geometry if requested - if (znemo->get_cparam().gopt()) { - print("\n\n Geometry Optimization "); - print(" ----------------------------------------------------------\n"); -// znemo->get_cparam().gprint(world); - - Tensor geomcoord = znemo->molecule().get_all_coords().flat(); - MolecularOptimizer geom(world,parser,znemo); - geom.parameters.set_derived_value >("remove_dof", - {"Tx","Ty","Tz","Rx","Ry"}); - geom.parameters.print("geometry optimization parameters","end"); - geom.optimize(geomcoord); - } else { - - // compute the energy to get converged orbitals - double energy=0.0; - if (value) { - energy=znemo->value(); - } else if (analyze) { - auto zmos=znemo->read_reference(); - for (int i=0; iget_cparam().nalpha(); ++i) znemo->amo.push_back(zmos.first.get_mos()[i]); - for (int i=0; iget_cparam().nbeta(); ++i) znemo->bmo.push_back(zmos.second.get_mos()[i]); - energy=znemo->analyze(); - } - if (world.rank()==0) { - printf("final energy %12.8f\n", energy); - printf("finished at time %.1f\n", wall_time()); - } - - } - - } catch (const SafeMPI::Exception& e) { - print(e); - error("caught an MPI exception"); - } catch (const madness::MadnessException& e) { - print(e); - error("caught a MADNESS exception"); - } catch (const madness::TensorException& e) { - print(e); - error("caught a Tensor exception"); - } catch (const char* s) { - print(s); - error("caught a string exception"); - } catch (const std::string& s) { - print(s); - error("caught a string (class) exception"); - } catch (const std::exception& e) { - print(e.what()); - error("caught an STL exception"); - } catch (...) { - error("caught unhandled exception"); + commandlineparser parser(argc,argv); + if (parser.key_exists("help")) { + Znemo::help(); + + } else if (parser.key_exists("print_parameters")) { + Znemo::print_parameters(); + + } else { + + try { + + bool analyze_only=parser.key_exists("analyze"); + + std::shared_ptr znemo(new Znemo(world,parser)); + + // optimize the geometry if requested + if (znemo->get_cparam().gopt()) { + print("\n\n Geometry Optimization "); + print(" ----------------------------------------------------------\n"); + + Tensor geomcoord = znemo->molecule().get_all_coords().flat(); + MolecularOptimizer geom(world,parser,znemo); + geom.parameters.set_derived_value >("remove_dof", + {"Tx","Ty","Tz","Rx","Ry"}); + geom.parameters.print("geometry optimization parameters","end"); + geom.optimize(geomcoord); + } else { + + // compute the energy to get converged orbitals + double energy=0.0; + if (not analyze_only) energy=znemo->value(); + auto zmos=znemo->read_reference(); + for (int i=0; iget_cparam().nalpha(); ++i) znemo->amo.push_back(zmos.first.get_mos()[i]); + for (int i=0; iget_cparam().nbeta(); ++i) znemo->bmo.push_back(zmos.second.get_mos()[i]); + energy=znemo->analyze(); + + if (world.rank()==0) { + printf("final energy %12.8f\n", energy); + printf("finished at time %.1f\n", wall_time()); + } + } + + } catch (const SafeMPI::Exception& e) { + print(e); + error("caught an MPI exception"); + } catch (const madness::MadnessException& e) { + print(e); + error("caught a MADNESS exception"); + } catch (const madness::TensorException& e) { + print(e); + error("caught a Tensor exception"); + } catch (const char* s) { + print(s); + error("caught a string exception"); + } catch (const std::string& s) { + print(s); + error("caught a string (class) exception"); + } catch (const std::exception& e) { + print(e.what()); + error("caught an STL exception"); + } catch (...) { + error("caught unhandled exception"); + } } - finalize(); return 0; } diff --git a/src/madness/chem/CC2.h b/src/madness/chem/CC2.h index 620d64d79eb..8cf2a754053 100644 --- a/src/madness/chem/CC2.h +++ b/src/madness/chem/CC2.h @@ -88,7 +88,7 @@ class CC2 : public OptimizationTargetInterface, public QCPropertyInterface { std::string name() const {return "CC2";}; static void help() { - print("\nCC2 -- help \n"); + print_header2("help page for CC2"); print("The CC2 code computes correlated ground and excited state energies:\n"); print(" - MP2 ground state"); print(" - CC2 ground and excited states"); diff --git a/src/madness/chem/PNO.h b/src/madness/chem/PNO.h index 0e548fd6d44..0d0e77db417 100644 --- a/src/madness/chem/PNO.h +++ b/src/madness/chem/PNO.h @@ -48,6 +48,30 @@ class PNO : public QCPropertyInterface { std::string name() const {return "PNO";}; + static void help() { + print_header2("help page for PNO"); + print("The PNO code computes MP2 energies using pair natural orbitals"); + print("You can print all available calculation parameters by running\n"); + print("pno --print_parameters\n"); + print("You can perform a simple calculation by running\n"); + print("pno --geometry=h2o.xyz\n"); + print("provided you have an xyz file in your directory."); + + } + + static void print_parameters() { + PNOParameters param; + print("default parameters for the pno program are\n"); + param.print("pno", "end"); + + F12Parameters f12param(param); + print("\n\nadditional parameters for the correlation factor are\n"); + f12param.print("f12", "end"); + + print("\n\nthe molecular geometry must be specified in a separate block:"); + Molecule::print_parameters(); + } + virtual bool selftest() { return true; }; diff --git a/src/madness/chem/QCCalculationParametersBase.h b/src/madness/chem/QCCalculationParametersBase.h index f560c499b98..7833369a135 100644 --- a/src/madness/chem/QCCalculationParametersBase.h +++ b/src/madness/chem/QCCalculationParametersBase.h @@ -176,16 +176,48 @@ struct QCParameter { return word+std::string(nspaces, ' '); }; - std::string result=fill_left(20,key)+" "+fill_right(10,get_value()) + " # " - +fill_right(10,print_precedence()) - // +fill_right(5,get_type()) - + fill_right(45,get_comment()); - if (allowed_values.size()>0) { - using madness::operators::operator<<; - std::stringstream ss; - ss << allowed_values; - result+=ss.str(); - } + // key-value block + std::string keyval=fill_left(20,key)+" "+fill_right(10,get_value()) + " # " +fill_right(10,print_precedence()); + std::string empty_keyval(keyval.size(),' '); + empty_keyval[33]='#'; + + std::string allowed_val; + if (allowed_values.size()>0) { + using madness::operators::operator<<; + std::stringstream ss; + ss << allowed_values; + allowed_val+=ss.str(); + } + + // split comment into several lines: split onto words and add linebreak + bool leave_space_for_allowed_values=(allowed_val.size()>0); + + // first line breaks after 80 characters, all other lines after 120 (leave space f + long keyvalsize=keyval.size(); // length of key, value, precedence + std::string comment1=get_comment(); + auto commentwords=commandlineparser::split(comment1," "); + std::vector commentlines(1); + long nchar=0; + for (auto word : commentwords) { + + bool is_first_line=commentlines.size()==1; + long thislinebreak=120; + if (is_first_line and leave_space_for_allowed_values) thislinebreak=80; + long commentsize=thislinebreak-keyvalsize; + + nchar+=word.size()+1; + if (nchar>commentsize) { // start newline + commentlines.push_back(""); + nchar=word.size()+1; + } + commentlines.back()+=word+" "; + } + + std::string result; + for (int i=0; i ("thresh", 1.e-3, "recommended values: 1.e-4 < econv < 1.e-8"); initialize < double > ("econv", 1.e-3, "recommended values: 1.e-4 < econv < 1.e-8"); @@ -332,7 +330,10 @@ class MP2 : public OptimizationTargetInterface, public QCPropertyInterface { initialize < int > ("maxsub", 2); initialize < bool > ("restart", true); initialize < int > ("maxiter", 5); + } + /// ctor reading out the input file + Parameters(World& world, const commandlineparser& parser) : Parameters() { read_and_set_derived_values(world,parser); // print final parameters @@ -414,6 +415,24 @@ class MP2 : public OptimizationTargetInterface, public QCPropertyInterface { MP2(World& world, const commandlineparser& parser); std::string name() const {return "MP2";}; + static void help() { + print_header2("help page for MP2 "); + print("The mp2 code computes second order correlation energies based on a moldft or nemo calculation"); + print("You can print all available calculation parameters by running\n"); + print("mp2 --print_parameters\n"); + print("You can perform a simple calculation by running\n"); + print("mp2 --geometry=h2o.xyz\n"); + print("provided you have an xyz file in your directory."); + + } + + static void print_parameters() { + Parameters param; + print("default parameters for the mp2 program are"); + param.print("mp2", "end"); + print("\n\nthe molecular geometry must be specified in a separate block:"); + Molecule::print_parameters(); + } virtual bool selftest() { return true; }; diff --git a/src/madness/chem/nemo.h b/src/madness/chem/nemo.h index 43fbe1c18a4..5413631f0fd 100644 --- a/src/madness/chem/nemo.h +++ b/src/madness/chem/nemo.h @@ -388,10 +388,12 @@ class Nemo: public NemoBase, public QCPropertyInterface { bool selftest() {return false;} static void help() { - print("\nNEMO \n"); + print_header2("help page for NEMO"); print("The nemo code computes Hartree-Fock and DFT energies, gradients and hessians using a nuclear correlation factor"); print("that regularizes the singular nuclear potential. SCF orbitals for the basis for post-SCF calculations like"); - print("excitation energies (cis), correlation energies (cc2), local potentials (oep), etc\n\n"); + print("excitation energies (cis), correlation energies (cc2), local potentials (oep), etc\n"); + print("A nemo calculation input is mostly identical to a moldft calculation input, but it uses the additional input"); + print("parameter ncf (nuclear correlation factor)\n"); print("You can print all available calculation parameters by running\n"); print("nemo --print_parameters\n"); print("You can perform a simple calculation by running\n"); diff --git a/src/madness/chem/oep.h b/src/madness/chem/oep.h index 025798022e2..e6e4312f02e 100644 --- a/src/madness/chem/oep.h +++ b/src/madness/chem/oep.h @@ -78,34 +78,37 @@ struct divide_add_interpolate { /// - think about the long-range part of the Slater potential (or medium-range) class OEP_Parameters : public QCCalculationParametersBase { public: - OEP_Parameters(World& world, const commandlineparser& parser) { - - initialize >("model",{"dcep"},"comment on this: oaep ocep dcep mrks"); - initialize("maxiter",150,"maximum number of iterations in OEP algorithm"); - initialize("restart",false,"restart from previous OEP calculation"); + OEP_Parameters() { + initialize >("model",{"dcep"},"comment on this: oaep ocep dcep mrks"); + initialize("maxiter",150,"maximum number of iterations in OEP algorithm"); + initialize("restart",false,"restart from previous OEP calculation"); initialize("no_compute",false,"read from previous OEP calculation, no computation"); - initialize("levelshift",0.0,"shift occupied orbital energies in the BSH operator"); + initialize("levelshift",0.0,"shift occupied orbital energies in the BSH operator"); // initialize("conv_threshold",1.e-5,"comment on this"); - initialize("density_threshold_high",1.e-6,"comment on this"); - initialize("density_threshold_low",1.e-8,"comment on this"); - initialize("density_threshold_inv",1.e-9,"comment on this"); - initialize >("kain_param",{1.0e-8, 3.0},"comment on this"); + initialize("density_threshold_high",1.e-6,"comment on this"); + initialize("density_threshold_low",1.e-8,"comment on this"); + initialize("density_threshold_inv",1.e-9,"comment on this"); + initialize >("kain_param",{1.0e-8, 3.0},"comment on this"); // std::vector oep_model = {false, false, false, false}; - initialize("saving_amount",0,"choose level 0, 1, 2 or 3 for saving functions"); - initialize("save_iter_orbs",0,"if > 0 save all orbitals every ... iterations (needs a lot of storage!"); - initialize("save_iter_density",0,"if > 0 save KS density every ... iterations"); - initialize("save_iter_IKS",0,"if > 0 save IKS every ... iterations"); - initialize("save_iter_kin_tot_KS",0,"if > 0 save kin_tot_KS every ... iterations"); - initialize("save_iter_kin_P_KS",0,"if > 0 save kin_P_KS every ... iterations"); - initialize("save_iter_corrections",0,"if > 0 save OEP correction(s) every ... iterations"); - initialize("save_iter_effective_potential",0,"if > 0 save effective potential every ... iterations"); + initialize("saving_amount",0,"choose level 0, 1, 2 or 3 for saving functions"); + initialize("save_iter_orbs",0,"if > 0 save all orbitals every ... iterations (needs a lot of storage!"); + initialize("save_iter_density",0,"if > 0 save KS density every ... iterations"); + initialize("save_iter_IKS",0,"if > 0 save IKS every ... iterations"); + initialize("save_iter_kin_tot_KS",0,"if > 0 save kin_tot_KS every ... iterations"); + initialize("save_iter_kin_P_KS",0,"if > 0 save kin_P_KS every ... iterations"); + initialize("save_iter_corrections",0,"if > 0 save OEP correction(s) every ... iterations"); + initialize("save_iter_effective_potential",0,"if > 0 save effective potential every ... iterations"); + } + OEP_Parameters(World& world, const commandlineparser& parser) : OEP_Parameters() { read_input_and_commandline_options(world, parser, "oep"); - } - void set_derived_values(const Nemo::NemoCalculationParameters& nparam) { + OEP_Parameters(const OEP_Parameters& other) = default; + + + void set_derived_values(const Nemo::NemoCalculationParameters& nparam) { set_derived_value("density_threshold_high",10.0*nparam.econv()); set_derived_value("density_threshold_low",0.01*get("density_threshold_high")); if (dens_thresh_hi() reference1) { + static void help() { + print_header2("help page for oep"); + print("The oep code computes local exchange potentials based on a Hartree-Fock calculation from nemo"); + print("oep --print_parameters\n"); + print("You can perform a simple calculation by running\n"); + print("oep --geometry=h2o.xyz\n"); + print("provided you have an xyz file in your directory."); + + } + + static void print_parameters() { + OEP_Parameters param; + print("default parameters for the oep program are"); + param.print("oep", "end"); + print("\n\nthe molecular geometry must be specified in a separate block:"); + Molecule::print_parameters(); + } + + void set_reference(const std::shared_ptr reference1) { reference=reference1; } diff --git a/src/madness/chem/zcis.h b/src/madness/chem/zcis.h index 3771cf8a2fa..aee71bfe1ae 100644 --- a/src/madness/chem/zcis.h +++ b/src/madness/chem/zcis.h @@ -22,7 +22,11 @@ class Complex_CIS_Parameters : public QCCalculationParametersBase { public: /// ctor reading out the input file - Complex_CIS_Parameters(World& world, const commandlineparser& parser) { + Complex_CIS_Parameters(World& world, const commandlineparser& parser) : Complex_CIS_Parameters() { + read_input_and_commandline_options(world,parser,"response"); + } + + Complex_CIS_Parameters() { /// the parameters with the enum key, the constructor taking the input file key and a default value initialize("guess_excitation_operators","dipole+"); @@ -37,14 +41,6 @@ class Complex_CIS_Parameters : public QCCalculationParametersBase { initialize("dconv",1.e-3); initialize("printlevel",1); - // read input file - read_input_and_commandline_options(world,parser,"response"); - - // set derived values -// params[param2_].set_derived_value(this->get(param1_)*10.0); - - // print final parameters -// if (world.rank()==0) print(params,"Our parameters"); } std::string guess_excitation_operators() const {return get("guess_excitation_operators");}; @@ -141,6 +137,26 @@ class Zcis : public QCPropertyInterface { double value(); + static void help() { + print_header2("help page for ZCIS"); + print("The zcis code computes excited states for a znemo calculation in the CIS approximation"); + print("\nYou can print all available calculation parameters by running\n"); + print("zcis --print_parameters\n"); + print("You can perform a simple calculation by running\n"); + print("zcis --geometry=h2o.xyz\n"); + print("provided you have an xyz file in your directory."); + + } + + static void print_parameters() { + Complex_CIS_Parameters param; + print("The zcis program requires converged znemo orbitals"); + print("\ndefault parameters for the response part of the zcis program are"); + param.print("response","end"); + print("\n\nthe molecular geometry must be specified in a separate block:"); + Molecule::print_parameters(); + } + std::string name() const {return "zcis";}; diff --git a/src/madness/chem/znemo.cc b/src/madness/chem/znemo.cc index 3d20d58fcb8..f3570c0b5d3 100644 --- a/src/madness/chem/znemo.cc +++ b/src/madness/chem/znemo.cc @@ -33,11 +33,13 @@ Znemo::Znemo(World& world, const commandlineparser& parser) : NemoBase(world), m param.set_derived_values(); + mol.parameters.set_derived_value("no_orient",true); + print_info=printleveler(param.printlevel()); if (world.rank()==0 and print_info.print_setup()) { param.print("complex","end"); - cparam.print("dft"); + cparam.print("dft","end"); mol.print(); } diff --git a/src/madness/chem/znemo.h b/src/madness/chem/znemo.h index a1134e08421..ab410525dbb 100644 --- a/src/madness/chem/znemo.h +++ b/src/madness/chem/znemo.h @@ -57,20 +57,21 @@ class Nemo_complex_Parameters : public QCCalculationParametersBase { public: /// ctor reading out the input file - Nemo_complex_Parameters(World& world, const commandlineparser& parser) { - initialize("physical_B",0.0); - initialize("explicit_B",0.0); - initialize >("box",{1.0, 0.01, 0.0, 0.0, 0.0}); - initialize("shift",0.0); - initialize("printlevel",2); // 0: energies, 1: fock matrix, 2: function sizes - initialize("use_v_vector",false); - initialize("potential_radius",-1.0); - initialize >("guess",std::vector(),"list of l,m,exponent"); // atomic guess functions l, ml, exponent - initialize >("guess_functions",std::vector(),"list function names"); // atomic guess functions l, ml, exponent - + Nemo_complex_Parameters() { + initialize("physical_B",0.0); + initialize("explicit_B",0.0); + initialize >("box",{1.0, 0.01, 0.0, 0.0, 0.0}); + initialize("shift",0.0); + initialize("printlevel",2); // 0: energies, 1: fock matrix, 2: function sizes + initialize("use_v_vector",false); + initialize("potential_radius",-1.0); + initialize >("guess",std::vector(),"list of l,m,exponent"); // atomic guess functions l, ml, exponent + initialize >("guess_functions",std::vector(),"list function names"); // atomic guess functions l, ml, exponent + } + + Nemo_complex_Parameters(World& world, const commandlineparser& parser) : Nemo_complex_Parameters() { // read input file read_input_and_commandline_options(world,parser,"complex"); - } void set_derived_values() { @@ -181,6 +182,29 @@ class Znemo : public NemoBase, public QCPropertyInterface { std::string name() const override {return "znemo";}; + static void help() { + print_header2("help page for ZNEMO "); + print("The znemo code computes Hartree-Fock energies and gradients in the presence of a strong"); + print("magnetic field"); + print(""); + print("You can print all available calculation parameters by running\n"); + print("znemo --print_parameters\n"); + print("You can perform a simple calculation by running\n"); + print("znemo --geometry=h2o.xyz\n"); + print("provided you have an xyz file in your directory."); + + } + + static void print_parameters() { + Nemo_complex_Parameters zparam; + Nemo::NemoCalculationParameters param; + print("default calculations parameters for the znemo program are the same as for the nemo program"); + print("default parameters for the magnetic field of the znemo program are"); + zparam.print("complex","end"); + print("\n\nthe molecular geometry must be specified in a separate block:"); + Molecule::print_parameters(); + } + bool selftest() override { return true; }; diff --git a/src/madness/world/print.cc b/src/madness/world/print.cc index d1fb1a17d34..efc516b1e55 100644 --- a/src/madness/world/print.cc +++ b/src/madness/world/print.cc @@ -40,6 +40,33 @@ namespace madness { + /// big section heading + void print_header1(const std::string& s) { + auto line=std::string(80,'='); + print(""); + print(line); + print(" ",s); + print(line,"\n"); + }; + + + /// medium section heading + void print_header2(const std::string& s) { + auto line=std::string(80,'-'); + print(""); + print(line); + print(" ",s); + print(line,"\n"); + }; + + /// small section heading + void print_header3(const std::string& s) { + auto line=std::string(80,'-'); + print(""); + print(" ",s); + print(line,"\n"); + }; + void print_justified(const char* s, int column, bool underline) { for (int i=0; i Date: Tue, 23 May 2023 15:33:03 -0400 Subject: [PATCH 1225/1312] comment out detritus --- src/apps/moldft/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/moldft/CMakeLists.txt b/src/apps/moldft/CMakeLists.txt index 2d445131b7a..c13f89baa1a 100644 --- a/src/apps/moldft/CMakeLists.txt +++ b/src/apps/moldft/CMakeLists.txt @@ -3,8 +3,8 @@ add_mad_executable(moldft moldft.cc MADchem) add_dependencies(applications-madness moldft) -add_mad_executable(mcpfit mcpfit.cc MADchem) - +# removed mcpfit since it is likely only of historic interest +#add_mad_executable(mcpfit mcpfit.cc MADchem) #add_mad_executable(preal preal.cc MADchem) add_mad_executable(testpg testpg.cc MADchem) From 0d75def32fa2be04ee6fa0f98a617db8a1c011c1 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Tue, 23 May 2023 15:33:18 -0400 Subject: [PATCH 1226/1312] updates --- doc/tutorial/tutorial.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index 94732adc19a..5622d22d304 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -8,7 +8,6 @@ This tutorial covers -* downloading, building and installing MADNESS; [RJH] * using the MADNESS chemistry applications. [Florian, Hannes, Adrian] - structure of the input file - moldft, gradient @@ -30,7 +29,13 @@ This tutorial covers - hello world in the numerical API [RJH] - overview of the chemistry API [Florian] - a simple Hartree-Fock program - + + +Build issues +- Ubuntu 23.04 VM build failed with missing Exchange operator symbol --- but it builds on 22.04 +- `make install` fails due to missing moldft (and presumably other) executable ... if you build applications first it works and does install all chemistry applications +- `make applications` followed by `make install-madness` starts building mad-response +- `make install-chem` just installs heders and libraries, but no chemistry applications? Should the target be renamed? ## Downloading From the command line, clone the [MADNESS GitHub repository](https://github.com/m-a-d-n-e-s-s/madness) using one of the below @@ -58,14 +63,8 @@ Issues that need fixing * relevant targets * cmake required * ACML is now AOCL -* Configuring a vanilla Ubuntu (or other Linux) system +* Configuring a vanilla Ubuntu (or other Linux) system --- DONE - what packages to install and how * Configuring a vanilla Intel Mac * Configuring a vanilla ARM Mac - - - - - - From 43c5694ecf1a1e737f49a1f26a93922a422fb01c Mon Sep 17 00:00:00 2001 From: fbischoff Date: Wed, 24 May 2023 10:30:50 +0200 Subject: [PATCH 1227/1312] cleaning up output for geometry optimization --- src/apps/nemo/nemo.cc | 37 ++++++----- src/apps/znemo/znemo.cc | 6 +- src/madness/chem/SCF.cc | 9 ++- src/madness/chem/SCF.h | 2 + src/madness/chem/SCFProtocol.h | 10 +-- src/madness/chem/molecular_optimizer.h | 87 +++++++++++++++----------- src/madness/chem/molecule.cc | 4 +- src/madness/chem/nemo.cc | 12 ++-- src/madness/chem/nemo.h | 10 ++- src/madness/chem/znemo.cc | 5 +- 10 files changed, 100 insertions(+), 82 deletions(-) diff --git a/src/apps/nemo/nemo.cc b/src/apps/nemo/nemo.cc index 91758b53b55..5757e697b66 100644 --- a/src/apps/nemo/nemo.cc +++ b/src/apps/nemo/nemo.cc @@ -78,39 +78,42 @@ int main(int argc, char** argv) { std::shared_ptr nemo(new Nemo(world, parser)); print_header2("input section"); - if (world.rank() == 0) nemo->get_param().print("dft", "end"); -// if (world.rank()==0) nemo->get_calc()->param.print("dft","end"); + if (world.rank() == 0) { + nemo->get_param().print("dft", "end"); + nemo->molecule().print(); + } // optimize the geometry if requested if (nemo->get_param().gopt()) { - print("\n\n Geometry Optimization "); - print(" ----------------------------------------------------------\n"); -// calc->param.gprint(world); - - Tensor geomcoord = nemo->get_calc()->molecule.get_all_coords().flat(); + print_header2("Geometry Optimization"); MolecularOptimizer geom(world, parser, nemo); geom.parameters.print("geoopt", "end"); - geom.parameters.print("geoopt", "end"); + // compute the energy to get converged orbitals + print_header2("computing initial wave function"); + nemo->value(); + // reduce print level + nemo->param.set_derived_value("print_level",2); + nemo->get_calc()->param.set_derived_value("print_level",2); + nemo->get_calc()->set_print_timings(false); // compute initial hessian if (nemo->get_param().ginitial_hessian()) { - nemo->value(); Tensor hess = nemo->hessian(nemo->get_calc()->molecule.get_all_coords()); geom.set_hessian(hess); } + + print_header2("Starting geometry optimization"); + Tensor geomcoord = nemo->get_calc()->molecule.get_all_coords().flat(); geom.optimize(geomcoord); - } else { + } - // compute the energy to get converged orbitals -// Nemo nemo(world,calc); - const double energy = nemo->value(); - if (world.rank() == 0) { - printf("final energy %12.8f\n", energy); - printf("finished at time %.1f\n", wall_time()); - } + double energy=nemo->value(); + if (world.rank() == 0) { + printf("final energy %12.8f\n", energy); + printf("finished at time %.1f\n", wall_time()); } // compute the hessian diff --git a/src/apps/znemo/znemo.cc b/src/apps/znemo/znemo.cc index 446c8b3a356..4b5cd31d315 100644 --- a/src/apps/znemo/znemo.cc +++ b/src/apps/znemo/znemo.cc @@ -76,13 +76,11 @@ int main(int argc, char** argv) { // optimize the geometry if requested if (znemo->get_cparam().gopt()) { - print("\n\n Geometry Optimization "); - print(" ----------------------------------------------------------\n"); + print_header2("Geometry Optimization"); Tensor geomcoord = znemo->molecule().get_all_coords().flat(); MolecularOptimizer geom(world,parser,znemo); - geom.parameters.set_derived_value >("remove_dof", - {"Tx","Ty","Tz","Rx","Ry"}); + geom.parameters.set_derived_value >("remove_dof",{}); geom.parameters.print("geometry optimization parameters","end"); geom.optimize(geomcoord); } else { diff --git a/src/madness/chem/SCF.cc b/src/madness/chem/SCF.cc index a562ce380e0..769aa9a485b 100644 --- a/src/madness/chem/SCF.cc +++ b/src/madness/chem/SCF.cc @@ -280,6 +280,9 @@ SCF::SCF(World& world, const commandlineparser& parser) : param(CalculationParam } +void SCF::set_print_timings(const bool value) { + print_timings=value; +} void SCF::copy_data(World& world, const SCF& other) { aeps = copy(other.aeps); @@ -1430,7 +1433,7 @@ tensorT SCF::dipole(World& world, const functionT& rho) const { mu[axis] += molecule.nuclear_dipole(axis); } - if (world.rank() == 0 and (param.print_level() > 1)) { + if (world.rank() == 0 and (param.print_level() > 2)) { print("\n Dipole Moment (a.u.)\n -----------\n"); print(" x: ", mu[0]); print(" y: ", mu[1]); @@ -1882,7 +1885,7 @@ double SCF::do_step_restriction(World& world, const vecfuncT& mo, vecfuncT& mo_n double s = param.maxrotn() / anorm[i]; ++nres; if (world.rank() == 0) { - if (nres == 1 and (param.print_level() > 1)) + if (nres == 1 and (param.print_level() > 2)) printf(" restricting step for %s orbitals:", spin.c_str()); printf(" %d", i); } @@ -1895,7 +1898,7 @@ double SCF::do_step_restriction(World& world, const vecfuncT& mo, vecfuncT& mo_n world.gop.fence(); double rms, maxval; vector_stats(anorm, rms, maxval); - if (world.rank() == 0 and (param.print_level() > 1)) + if (world.rank() == 0 and (param.print_level() > 2)) print("Norm of vector changes", spin, ": rms", rms, " max", maxval); return maxval; } diff --git a/src/madness/chem/SCF.h b/src/madness/chem/SCF.h index e7200cd6998..1296927c366 100644 --- a/src/madness/chem/SCF.h +++ b/src/madness/chem/SCF.h @@ -252,6 +252,8 @@ class SCF { Molecule::print_parameters(); } + void set_print_timings(const bool value); + template void set_protocol(World& world, double thresh) { int k; diff --git a/src/madness/chem/SCFProtocol.h b/src/madness/chem/SCFProtocol.h index 3db8db4cd85..396314c377b 100644 --- a/src/madness/chem/SCFProtocol.h +++ b/src/madness/chem/SCFProtocol.h @@ -105,13 +105,7 @@ class SCFProtocol { } } - bool finished() const { - std::stringstream ss; - ss <<"\nending protocol at time" << std::setw(8) << std::setprecision(2) - << wall_time() << "s"; - if(world.rank()==0) print(ss.str()); - return converged; - } + bool finished() const {return converged;} /// go to the next level SCFProtocol& operator++() { @@ -119,7 +113,7 @@ class SCFProtocol { current_prec*=0.1; if (current_prec("update","bfgs"); - initialize("maxiter",20); - initialize("tol",1.e-6); - initialize("value_precision",1.e-12); - initialize("gradient_precision",1.e-12); - initialize("printtest",false); - initialize("cg_method","polak_ribiere"); - initialize >("remove_dof",{"Tx","Ty","Tz","Rx","Ry","Rz"},"which degree of freedom to project out"); + MolecularOptimizationParameters() { + initialize < std::string > ("update", "bfgs", "Quasi-Newton update method",{"bfgs","sr1"}); + initialize < int > ("maxiter", 20); + initialize < double > ("tol", 1.e-4,"geometry convergence threshold for the gradient norm"); + initialize < double > ("value_precision", 1.e-12); + initialize < double > ("gradient_precision", 1.e-12); + initialize < bool > ("printtest", false); + initialize < std::string > ("cg_method", "polak_ribiere","conjugate gradients update",{"polak_ribiere","fletcher-reeves"}); + initialize < std::vector > + ("remove_dof", {"tx", "ty", "tz", "rx", "ry", "rz"}, "degree of freedom projected out: translation/rotation"); + } + MolecularOptimizationParameters(World& world, const commandlineparser& parser) + : MolecularOptimizationParameters() { // read input file read_input_and_commandline_options(world,parser,"geoopt"); + set_derived_values(); } void set_derived_values() { @@ -119,7 +124,13 @@ class MolecularOptimizer : public OptimizerInterface { return converge; } - bool converged() const {return gradient_norm()& displacement) const { + return (gradient_norm() normalmodes; Tensor freq=MolecularOptimizer::compute_frequencies( - target->molecule(),h,normalmodes); + target->molecule(),h,normalmodes,parameters.remove_dof()); madness::print("\ngopt: projected vibrational frequencies (cm-1)\n"); printf("frequency in cm-1 "); for (int i=0; i gradient; target->value_and_gradient(x, f, gradient); - print("gopt: new energy",f); +// print("gopt: new energy",f); const double rawgnorm = gradient.normf()/sqrt(gradient.size()); - print("gopt: raw gradient norm ",rawgnorm); +// print("gopt: raw gradient norm ",rawgnorm); // remove external degrees of freedom (translation and rotation) Tensor project_ext=projector_external_dof(target->molecule(),parameters.remove_dof()); gradient=inner(gradient,project_ext); gnorm = gradient.normf()/sqrt(gradient.size()); - print("gopt: projected gradient norm ",gnorm); - const double gradratio=rawgnorm/gnorm; +// print("gopt: projected gradient norm ",gnorm); +// const double gradratio=rawgnorm/gnorm; - printf(" QuasiNewton iteration %2d value %.12e gradient %.2e %.2e\n", - iter,f,gnorm,gradratio); - if (converged()) break; // if (iter == 1 && h_is_identity) { // // Default initial Hessian is scaled identity but @@ -195,7 +203,7 @@ class MolecularOptimizer : public OptimizerInterface { // } if (iter > 0) { - if (parameters.update() == "BFGS") QuasiNewton::hessian_update_bfgs(dx, gradient-gp,h); + if (parameters.update() == "bfgs") QuasiNewton::hessian_update_bfgs(dx, gradient-gp,h); else QuasiNewton::hessian_update_sr1(dx, gradient-gp,h); } @@ -205,7 +213,7 @@ class MolecularOptimizer : public OptimizerInterface { syev(h, v, e); Tensor normalmodes; Tensor freq=MolecularOptimizer::compute_frequencies( - target->molecule(),h,normalmodes); + target->molecule(),h,normalmodes,parameters.remove_dof()); madness::print("\ngopt: projected vibrational frequencies (cm-1)\n"); printf("frequency in cm-1 "); for (int i=0; i& x) { @@ -257,15 +269,15 @@ class MolecularOptimizer : public OptimizerInterface { // compute energy and gradient target->value_and_gradient(x, energy, gradient); - print("gopt: new energy",energy); +// print("gopt: new energy",energy); gnorm = gradient.normf()/sqrt(gradient.size()); - print("gopt: raw gradient norm ",gnorm); +// print("gopt: raw gradient norm ",gnorm); // remove external degrees of freedom (translation and rotation) Tensor project_ext=projector_external_dof(target->molecule(),parameters.remove_dof()); gradient=inner(gradient,project_ext); gnorm = gradient.normf()/sqrt(gradient.size()); - print("gopt: projected gradient norm ",gnorm); +// print("gopt: projected gradient norm ",gnorm); // compute new displacement if (iter==1) { @@ -282,10 +294,10 @@ class MolecularOptimizer : public OptimizerInterface { // save displacement for the next step old_displacement=displacement; - if (converged() and (displacement.normf()/displacement.size() ext_dof(6,3*mol.natom()); if (remove_Tx) ext_dof(0l,_)=transx; if (remove_Ty) ext_dof(1l,_)=transy; @@ -492,7 +506,7 @@ class MolecularOptimizer : public OptimizerInterface { /// @return the frequencies in atomic units static Tensor compute_frequencies(const Molecule& molecule, const Tensor& hessian, Tensor& normalmodes, - const bool project_tr=true, const bool print_hessian=false) { + const std::vector& remove_dof={}, const bool print_hessian=false) { // compute mass-weighing matrices Tensor M=molecule.massweights(); @@ -503,11 +517,10 @@ class MolecularOptimizer : public OptimizerInterface { Tensor mwhessian=inner(M,inner(hessian,M)); // remove translation and rotation - if (project_tr) MolecularOptimizer::remove_external_dof(mwhessian,molecule, - {"Tx","Ty","Tz","Rx","Ry","Rz"}); + if (remove_dof.size()>0) MolecularOptimizer::remove_external_dof(mwhessian,molecule,remove_dof); if (print_hessian) { - if (project_tr) { + if (remove_dof.size()>0) { print("mass-weighted hessian with translation and rotation projected out"); } else { print("mass-weighted unprojected hessian"); diff --git a/src/madness/chem/molecule.cc b/src/madness/chem/molecule.cc index 63522b370be..c482443db31 100644 --- a/src/madness/chem/molecule.cc +++ b/src/madness/chem/molecule.cc @@ -453,7 +453,7 @@ void Molecule::print() const { std::string p =parameters.print_to_string(); std::cout.flush(); std::stringstream sstream; - sstream << " geometry" << std::endl; + sstream << "geometry" << std::endl; sstream << p << std::endl; // sstream << " eprec " << std::scientific << std::setw(1) << get_eprec() << std::endl << std::fixed; // sstream << " units atomic" << std::endl; @@ -465,7 +465,7 @@ void Molecule::print() const { if (atoms[i].atomic_number == 0) sstream << " " << atoms[i].q; sstream << std::endl; } - sstream << " end" << std::endl; + sstream << "end" << std::endl; std::cout << sstream.str(); } diff --git a/src/madness/chem/nemo.cc b/src/madness/chem/nemo.cc index eb5497a6b6c..5595e0c1b90 100644 --- a/src/madness/chem/nemo.cc +++ b/src/madness/chem/nemo.cc @@ -160,10 +160,10 @@ double Nemo::value(const Tensor& x) { calc->molecule.set_all_coords(x.reshape(calc->molecule.natom(), 3)); coords_sum = xsq; - if (world.rank()==0 and param.print_level()>0) { - print("\n"); - calc->molecule.print(); - } +// if (world.rank()==0 and param.print_level()>0) { +// print("\n"); +// calc->molecule.print(); +// } SCFProtocol p(world,param,"nemo_iterations",param.restart()); @@ -474,7 +474,7 @@ std::vector Nemo::compute_energy_regularized(const vecfuncT& nemo, const double energy = ke + J - K + exc + pe + nucrep + pcm_energy; - if (world.rank() == 0) { + if (world.rank() == 0 and param.print_level()>2) { printf("\n nuclear and kinetic %16.8f\n", ke + pe); printf(" kinetic only %16.8f\n", ke0); // printf("\n kinetic only %16.8f\n", ke2); @@ -1473,7 +1473,7 @@ Tensor Nemo::compute_IR_intensities(const Tensor& normalmodes, // compute the matrix of the normal modes: x -> q Tensor M=molecule().massweights(); - Tensor D=MolecularOptimizer::projector_external_dof(molecule(),{"Tx","Ty","Tz","Rx","Ry","Rz"}); + Tensor D=MolecularOptimizer::projector_external_dof(molecule(),{"tx","ty","tz","rx","ry","rz"}); Tensor DL=inner(D,normalmodes); Tensor nm=inner(M,DL); diff --git a/src/madness/chem/nemo.h b/src/madness/chem/nemo.h index 5413631f0fd..633cee26b98 100644 --- a/src/madness/chem/nemo.h +++ b/src/madness/chem/nemo.h @@ -314,7 +314,7 @@ class NemoBase : public MolecularOptimizationTargetInterface { bool each_energy_conv=param.converge_each_energy() ? maxenergychange=2) { + if (world.rank()==0 and param.print_level()>2) { std::stringstream line; line << "convergence: bshresidual, energy change, max energy change, density change " << std::scientific << std::setprecision(1) @@ -351,6 +351,10 @@ class Nemo: public NemoBase, public QCPropertyInterface { /// class holding parameters for a nemo calculation beyond the standard dft parameters from moldft struct NemoCalculationParameters : public CalculationParameters { + NemoCalculationParameters(World& world, const commandlineparser& parser) : CalculationParameters(world,parser) { + initialize_nemo_parameters(); + } + NemoCalculationParameters(const CalculationParameters& param) : CalculationParameters(param) { initialize_nemo_parameters(); } @@ -496,7 +500,7 @@ class Nemo: public NemoBase, public QCPropertyInterface { std::shared_ptr get_calc() const {return calc;} - NemoCalculationParameters get_param() const {return param;} + const NemoCalculationParameters& get_param() const {return param;} PCM get_pcm()const{return pcm;} @@ -634,7 +638,7 @@ class Nemo: public NemoBase, public QCPropertyInterface { calc->set_protocol<3>(world,thresh); if (need_recompute_factors_and_potentials(thresh)) { - timer timer1(world); + timer timer1(world,param.print_level()>2); get_calc()->make_nuclear_potential(world); construct_nuclear_correlation_factor(calc->molecule, calc->potentialmanager, param.ncf()); timer1.end("reproject ncf"); diff --git a/src/madness/chem/znemo.cc b/src/madness/chem/znemo.cc index f3570c0b5d3..8bdba711e72 100644 --- a/src/madness/chem/znemo.cc +++ b/src/madness/chem/znemo.cc @@ -16,8 +16,9 @@ namespace madness { -Znemo::Znemo(World& world, const commandlineparser& parser) : NemoBase(world), mol(world,parser), param(world,parser), cparam() { - cparam.read_input_and_commandline_options(world,parser,"dft"); +Znemo::Znemo(World& world, const commandlineparser& parser) : NemoBase(world), mol(world,parser), param(world,parser), + cparam(world,parser) { +// cparam.read_input_and_commandline_options(world,parser,"dft"); FunctionDefaults<3>::set_k(cparam.k()); FunctionDefaults<3>::set_thresh(cparam.econv()); From c163c56c0cc5840d1a0a052abc8b98bcc92f77fe Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Thu, 25 May 2023 10:23:59 +0200 Subject: [PATCH 1228/1312] merging with master --- src/CMakeLists.txt | 2 +- src/apps/CMakeLists.txt | 16 +++---- src/apps/pno/CMakeLists.txt | 4 +- src/apps/pno/pno_integrals.cpp | 81 +++++--------------------------- src/madness/chem/PNO.h | 44 ----------------- src/madness/chem/PNOParameters.h | 6 +-- 6 files changed, 26 insertions(+), 127 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ac3000ccbc5..7a8873abc61 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,7 +3,7 @@ add_subdirectory(madness) if(NOT MADNESS_BUILD_MADWORLD_ONLY AND LAPACK_FOUND) add_subdirectory(apps) - #add_subdirectory(examples) + add_subdirectory(examples) endif() install(FILES madness.h DESTINATION "${MADNESS_INSTALL_INCLUDEDIR}" diff --git a/src/apps/CMakeLists.txt b/src/apps/CMakeLists.txt index 9c54a70d7c6..48a8d97f39e 100644 --- a/src/apps/CMakeLists.txt +++ b/src/apps/CMakeLists.txt @@ -2,17 +2,17 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -add_subdirectory(tdse) +#add_subdirectory(tdse) add_subdirectory(moldft) -add_subdirectory(molresponse) +#add_subdirectory(molresponse) add_subdirectory(pno) add_subdirectory(nemo) add_subdirectory(cis) -add_subdirectory(dirac) -add_subdirectory(mp2) -add_subdirectory(cc2) -add_subdirectory(oep) -add_subdirectory(znemo) -add_subdirectory(zcis) +#add_subdirectory(dirac) +#add_subdirectory(mp2) +#add_subdirectory(cc2) +#add_subdirectory(oep) +#add_subdirectory(znemo) +#add_subdirectory(zcis) #add_subdirectory(hf) #add_subdirectory(interior_bc) diff --git a/src/apps/pno/CMakeLists.txt b/src/apps/pno/CMakeLists.txt index 4a509a3dd0f..710be7280ae 100644 --- a/src/apps/pno/CMakeLists.txt +++ b/src/apps/pno/CMakeLists.txt @@ -1,8 +1,8 @@ # src/apps/moldft -add_mad_executable(pno pno.cpp) +add_mad_executable(pno pno.cpp MADchem) add_dependencies(applications-madness pno) -add_mad_executable(pno_integrals pno_integrals.cpp) +add_mad_executable(pno_integrals pno_integrals.cpp MADchem) add_dependencies(applications-madness pno_integrals) install(TARGETS pno DESTINATION "${MADNESS_INSTALL_BINDIR}") diff --git a/src/apps/pno/pno_integrals.cpp b/src/apps/pno/pno_integrals.cpp index ebffd152925..e772a29b4c6 100644 --- a/src/apps/pno/pno_integrals.cpp +++ b/src/apps/pno/pno_integrals.cpp @@ -16,9 +16,9 @@ //#define WORLD_INSTANTIATE_STATIC_TEMPLATES #include #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -120,9 +120,9 @@ int main(int argc, char** argv) { // Compute the SCF Reference const double time_scf_start = wall_time(); - std::shared_ptr calc(new SCF(world, input)); - Nemo nemo(world, calc, input); - nemo.get_calc()->param.print(); + commandlineparser parser(argc,argv); + Nemo nemo(world,parser); + nemo.get_calc()->param.print(); const double scf_energy = nemo.value(); if (world.rank() == 0) print("nemo energy: ", scf_energy); if (world.rank() == 0) printf(" at time %.1f\n", wall_time()); @@ -134,9 +134,9 @@ int main(int argc, char** argv) { // Compute MRA-PNO-MP2-F12 const double time_pno_start = wall_time(); - PNOParameters parameters(world,input,nemo.get_calc()->molecule,TAG_PNO); - F12Parameters paramf12(world, input, parameters, TAG_F12); - PNOIntParameters paramsint(world, input, parameters, TAG_PNOInt); + PNOParameters parameters(world,parser,nemo.get_calc()->molecule,TAG_PNO); + F12Parameters paramf12(world, parser, parameters, TAG_F12); + PNOIntParameters paramsint(world, parser, parameters, TAG_PNOInt); paramsint.print("PNO Integrals evaluated as:\npnoint","end"); PNO pno(world, nemo, parameters, paramf12); pno.solve(); @@ -374,65 +374,10 @@ int main(int argc, char** argv) { // include virtual orbitals if demanded // not the most elegant solution ... but lets see if we need this first + // removed this + // keeping dummies here for now vecfuncT virtuals; std::vector veps; - if (paramsint.n_virt() > 0){ - const auto refsize = reference.size(); - SCF calcx(world, input); - calcx.param.set_user_defined_value("nvalpha", paramsint.n_virt()); - calcx.param.set_user_defined_value("nvbeta", paramsint.n_virt()); - calcx.param.set_user_defined_value("restart", false); - calcx.param.set_user_defined_value("no_compute", false); - calcx.param.set_user_defined_value("nmo_alpha",calc->param.nalpha() + paramsint.n_virt()); - calcx.param.set_user_defined_value("nmo_beta",calc->param.nbeta() + paramsint.n_virt()); - calcx.set_protocol<3>(world,pno.param.thresh()); - calcx.reset_aobasis(calcx.param.aobasis()); - calcx.ao=calcx.project_ao_basis(world,calcx.aobasis); - calcx.make_nuclear_potential(world); - calcx.initial_guess(world); - calcx.param.print(); - calcx.amo = calc->amo; - auto F = Fock(world, calc.get()); - auto Fmat = F(calc->ao, calc->ao); - Tensor U, evals; - syev(Fmat, U, evals); - auto vguess = vecfuncT(); - - if (false){ // standard guess, but pnos usually better - auto F = Fock(world, calc.get()); - auto Fmat = F(calc->ao, calc->ao); - Tensor U, evals; - syev(Fmat, U, evals); - vguess = madness::transform(world, calc->ao, U); - }else{ - auto pnos = vecfuncT(basis.begin()+reference.size(), basis.end()); - auto F = Fock(world, calc.get()); - auto Fmat = F(pnos, pnos); - Tensor U, evals; - syev(Fmat, U, evals); - if(world.rank()==0){ std::cout << " evals = " << evals << "\n";} - vguess = madness::transform(world, pnos, U); - } - - for (auto i=0;i(world, basis); - virtuals = QB(virtuals); - madness::normalize(world, virtuals); - basis.insert(basis.end(), virtuals.begin(), virtuals.end()); - if(world.rank() ==0) std::cout << "added " << paramsint.n_virt() << " virtuals\n"; - } if (parameters.save_pnos()) { for(auto i=0; i(world, &nemo); auto K = madness::Exchange(world, &nemo, 0); auto Jmat = J(basis, basis); auto Kmat = K(basis, basis); @@ -704,7 +649,7 @@ int main(int argc, char** argv) { Tensor h; { auto T = madness::Kinetic(world); - auto V = madness::Nuclear(world, &nemo); + auto V = madness::Nuclear(world, nemo.ncf); h = T(basis,basis) + V(basis,basis); } for (int i=0;i - for all pairs - /// gives back the PairEnergies structure with all singlet and triplet energies - PairEnergies compute_projected_mp2_energies(PNOPairs& pairs)const; - - /// solves whatever was specified in input - /// will call solve_mp2, solve_cispd etc - void solve()const{ - std::vector dummy; - solve(dummy); - } - /// Solve for the PairType that is given - void solve(std::vector& all_pairs) const; - - /// interfaces the BasisFunctions class - /// guesses a set of virtuals depending on the guesstype and what was specified in the parameters - vector_real_function_3d guess_virtuals(const vector_real_function_3d& f = vector_real_function_3d(), const GuessType& inpgt = UNKNOWN_GUESSTYPE) const; - - /// convenience - PNOPairs orthonormalize_cholesky(PNOPairs& pairs) const; - - /// only the f12 part of the excited state correction of CIS(D) (namely the terms s2b and s2c) - PairEnergies compute_cispd_f12_correction_es(const vector_real_function_3d& xcis, PairEnergies& energies) const; - /// excited state correction of CIS(D) (namely the terms s2b and s2c) - /// f12 part is excluded (no need to recompute after every iteration) - PairEnergies compute_cispd_correction_es(const vector_real_function_3d& xcis, PNOPairs& pairs) const; - - /// ground state correction of CIS(D) (s4a, s4b, s4c) - /// f12 is excluded to avoid recomputation in iterations - PairEnergies compute_cispd_correction_gs(const vector_real_function_3d& xcis,const PNOPairs& pairs) const; - - /// The f12 part of the ground state correction of CIS(D) (s4a, s4b, s4c) - PairEnergies compute_cispd_f12_correction_gs(const vector_real_function_3d& xcis, PairEnergies& energies) const; - - /// solve PNO-MP2 equations - void solve_mp2(std::vector& pairs)const{ - if(pairs.empty()){ - PNOPairs mp2(MP2_PAIRTYPE,f12.acmos.size()); - solve_mp2(mp2); - pairs.push_back(mp2); - }else{ - solve_mp2(pairs.front()); - } - } - /// Compute the projected MP2 energies: 2 - for all pairs /// gives back the PairEnergies structure with all singlet and triplet energies PairEnergies compute_projected_mp2_energies(PNOPairs& pairs)const; diff --git a/src/madness/chem/PNOParameters.h b/src/madness/chem/PNOParameters.h index d75b86e5d27..e5d8e284aeb 100644 --- a/src/madness/chem/PNOParameters.h +++ b/src/madness/chem/PNOParameters.h @@ -293,9 +293,9 @@ class PNOIntParameters: public PNOParameters { set_derived_values(param); } - PNOIntParameters(World& world, const std::string& inputfile, const PNOParameters& param, const std::string& TAG="pnoint") : PNOParameters(param){ + PNOIntParameters(World& world, const commandlineparser& parser, const PNOParameters& param, const std::string& TAG="pnoint") : PNOParameters(param){ initialize_pnoint_parameters(); - QCCalculationParametersBase::read(world,inputfile,TAG); + QCCalculationParametersBase::read_input_and_commandline_options(world,parser,TAG); set_derived_values(param); } @@ -314,11 +314,9 @@ class PNOIntParameters: public PNOParameters { initialize("auxbas", "none", "atom centered partial wave guess of format like 'h-2s1p-o-3s2p1d' "); initialize("auxbas_file", "none", "Use external comp. aux. basis in addition to the pnos as auxbasis. Give the filename as parameter. Give the auxbas in turbomole format. Don't use contractions. If a file is specified the auxbas parameter has no effect"); initialize("print_pno_overlap", true, "Print overlap matrix at certain steps in computation, for debugging purposes."); - initialize("n_virt", 0, "Compute this number of virtuals and include them in the integral construction, experimental and not robust!."); initialize("hardcore_boson", false, "compute only integrals for hardcore boson hamiltonian (restricted to double occupations)"); } - int n_virt()const {return get("n_virt");} std::string orthogonalization()const { return get("orthog");} std::string cabs_orthogonalization()const { if (get("orthog_cabs") == "default") From c6f299c0bacd18cc7dac614fc34bd3c818ca6339 Mon Sep 17 00:00:00 2001 From: "J. S. Kottmann" Date: Thu, 25 May 2023 12:45:06 +0200 Subject: [PATCH 1229/1312] installing tiny --- src/examples/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt index 4715fee334d..25b86ccf31d 100644 --- a/src/examples/CMakeLists.txt +++ b/src/examples/CMakeLists.txt @@ -16,4 +16,9 @@ endif() foreach(example ${EXAMPLE_SOURCES}) add_mad_executable(${example} ${example}.cc "MADchem") add_dependencies(numerical-examples-madness ${example}) + # do not merge to master endforeach() + +# to have tiny installed +# do not merge to master +install(TARGETS tiny DESTINATION "${MADNESS_INSTALL_BINDIR}") From 6f85dd2e2fd89fcedcbd5c1c388918b526899b28 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Fri, 26 May 2023 03:42:33 -0400 Subject: [PATCH 1230/1312] cleanup --- INSTALL.md | 120 ++++++++++++++++++++------------------- doc/tutorial/tutorial.md | 19 +++---- 2 files changed, 71 insertions(+), 68 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 9a16d1feb1a..4d641beee7c 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -7,25 +7,21 @@ MADNESS uses CMake to configure the build. Assuming that necessary prerequisites mkdir build cd build cmake /path/to/madness/source -make +make applications ``` -The default make target builds only the numerical library and underlying runtime. To build applications (e.g., `moldft`, `nemo`) specify this on the make command. The target `everything` does what you expect. You can run executables and use libraries from the build directory, but to install into the default location (`/usr`) use `make install`. +The default make target builds only the numerical library and underlying runtime. To build applications (e.g., `moldft`, `nemo`) specify either `applications` (for all of them) or the name of the desired application on the make command. The target `everything` does what you expect. You can run executables and use libraries from the build directory, but to install into the default location (`/usr`) use `make install` (after first building the applications). If required libraries are not in default locations or if you wish to override defaults, you may have to set CMake cache variables as described below. For instance, to build a debug version, without MPI, and with installation in `/home/me/madinstall` ``` cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_MPI=OFF -DCMAKE_INSTALL_PREFIX=/home/me/madinstall /path/to/madness/source +make applications make install ``` + Boolean values for cache variables (specified to CMake using the `-DVARIABLE_NAME` notation in the example above) are considered true if the constant is 1, ON, YES, TRUE, Y, or a non-zero number; or false if the constant is 0, OFF, NO, FALSE, N, or IGNORE. -## Warning about fast memory allocators - -Summary: Only use fast memory allocators if you are using just 1 MPI process or have configured without MPI. - -Depending on the calculation and the number of threads being used, MADNESS can receive about a 10% or even more speedup from fast memory allocators such as tcmalloc, jemalloc, tbbmalloc, etc. However, these **do not work with MPI over InfiniBand** and probably most other transport layers. It can appear to work, and then fail with either wrong numbers or MPI errors. The reason is that IB requires that memory be pinned and hence MPI introduces its own memory allocator(s) to manage this. By overriding the allocator, you will break the guarantee that memory is pinned. - ## Prerequisites Fast BLAS and linear algebra libraries are essential. These must be sequential (single thread) implementations since MADNESS uses tasks/threads for parallelism and invokes the BLAS within a single-threaded task. On X86, we recommend the free [Intel MKL library](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html#gs.8bsxug), which is auto detected on all platforms if the environment variable `MKLROOT` is set. On MacOS, the Apple [Accelerate](https://developer.apple.com/documentation/accelerate) framework (installed as part of [Xcode](https://developer.apple.com/xcode/)) is also autodetected. AMD ACML has not been tested in a while but can be enabled with the CMake variables below. Other libraries need to have their link (and possibly also header) paths and flags provided in the CMake variables for the compiler and linker. On ARM, we recommend the ARM performance library available with their optimized LLVM compiler and enabled with the `-armpl`` compiler+linker flag. The OpenBLAS libary for ARM (not on x86) had a major peformance problem when we last tested it in circa 2020 due to a mutex around a memory block shared by all threads (this issue was reported and might be fixed by now). @@ -109,39 +105,6 @@ The following CMake cache variables turn features on and off. * MADNESS_BUILD_MADWORLD_ONLY --- whether to build the MADNESS runtime only; if `ON`, discovery of BLAS/LAPACK and building of numerical components and applications will be disabled [default=`OFF`] -## MADNESS Runtime and the Address Space Layout Randomization (ASLR) - -ASLR (Linux relevant documentation [here](https://linux-audit.com/linux-aslr-and-kernelrandomize_va_space-setting/)) -is a standard technique for increasing platform security implemented by the OS kernel and/or -the dynamic linker. By randomizing both where the shared libraries are loaded as well as (when enabled) the absolute -position of the executable in memory (such executables are known as position-independent executables). Until recently -MADNESS could only be used with MPI on platforms with ASLR if built with static libraries (for MADNESS code; system and other libraries could still be shared). However, static libraries make it hard to integrate with Python and other frameworks that demand shared libraries. - -If properly configured and built, MADNESS can now be used on ASLR platforms using either static (the default and easiest) or shared libraries. Use the following variables to control the ASLR-related aspects of MADNESS runtime. - -* MADNESS_ASSUMES_ASLR_DISABLED --- MADNESS runtime will assume that the Address Space Layout Randomization (ASLR) is off. - By default MADNESS_ASSUMES_ASLR_DISABLED is set to OFF (i.e. MADNESS will assume that ASLR is enabled); - this will cause all libraries by default to be static (BUILD_SHARED_LIBS=OFF) - and compiled as position-independent code (CMAKE_POSITION_INDEPENDENT_CODE=ON). - This will also enable a runtime check for ASLR. -* CMAKE_POSITION_INDEPENDENT_CODE --- This standard CMake variable controls whether targets are compiled by default - as position-independent code or not. If BUILD_SHARED_LIBS=OFF need to set this to ON if want to use the MADNESS - libraries to build shared libraries or position-independent executables. - -To make things more concrete, consider the following 2 scenarios: -* Platform with ASLR disabled --- set MADNESS_ASSUMES_ASLR_DISABLED=ON to set defaults correctly and enable the ASLR check. - BUILD_SHARED_LIBS can be set to ON (to produce shared libraries, e.g. to save space) or to OFF to - produce static libraries. If the static libraries will be linked into shared libraries set - CMAKE_POSITION_INDEPENDENT_CODE=ON, otherwise CMAKE_POSITION_INDEPENDENT_CODE will be set to OFF for maximum efficiency - of function calls. -* Platform with ASLR enabled --- this is the default. Setting BUILD_SHARED_LIBS=ON in this scenario will produce - executables that can only be safely used with 1 MPI rank, thus BUILD_SHARED_LIBS will be defaulted to OFF (i.e. - MADNESS libraries will be build as static libraries). CMAKE_POSITION_INDEPENDENT_CODE is by default set to ON, - thus MADNESS libraries can be linked into position-independent executables safely. MADNESS libraries can also be - linked into a shared library and used with more than 1 MPI rank, provided that *ALL* code using MADNESS is part of the *SAME* shared library. - E.g. to link MADNESS into a Python module compile MADNESS and all libraries using MADNESS as shared libraries - (with CMAKE_POSITION_INDEPENDENT_CODE=ON) and link them all together into a single module. - ## External libraries The following CMake cache variables enable the use of external libraries with @@ -174,7 +137,15 @@ search for specific dependencies. If the external library is not found in these given paths, or if the paths are not given, CMake will search the paths in CMAKE_PREFIX_PATH as well as other system paths. -## Intel Threading Building Blocks (TBB): +### Library of Exchange-Correlation DFT functionals (LIBXC): + +* ENABLE_LIBXC --- Enables use of the libxc library of density functionals. + [default=ON] +* LIBXC_ROOT_DIR --- The install prefix for LIBXC. +* LIBXC_INCLUDE_DIR --- The path to the LIBXC include directory. +* LIBXC_LIBRARY --- The path to the LIBXC library directory. + +### Intel Threading Building Blocks (TBB): * ENABLE_TBB --- Enables use of Intel TBB as the task scheduler [default=OFF] * TBB_ROOT_DIR --- The install prefix for TBB @@ -187,7 +158,7 @@ CMAKE_PREFIX_PATH as well as other system paths. If TBB_ROOT_DIR is not given, it will be set to the value of the TBBROOT environment variable if it is set. -## Intel Math Kernel Library (MKL): +### Intel Math Kernel Library (MKL): * ENABLE_MKL --- Search for Intel MKL for BLAS and LAPACK support [default=ON] * MKL_ROOT_DIR --- The install prefix for MKL. @@ -195,14 +166,14 @@ If TBB_ROOT_DIR is not given, it will be set to the value of the TBBROOT environ If MKL_ROOT_DIR is not given, it will be set to the value of the MKLROOT environment variable if it is set. -## AMD Core Math Library (ACML): +### AMD Core Math Library (ACML): * ENABLE_ACML --- Search for AMD math library for BLAS and LAPACK support [default=ON] * ACML_ROOT_DIR --- The install prefix for ACML. * ACML_LIBRARY --- The path to the ACML library directory. -## Google Performance Tools (Gperftools): +### Google Performance Tools (Gperftools): * ENABLE_GPERFTOOLS --- Enable use of gperftools, including tcmalloc. [default=OFF] @@ -214,22 +185,14 @@ If MKL_ROOT_DIR is not given, it will be set to the value of the MKLROOT environ If GPERFTOOLS_ROOT_DIR is not given, it will be set to the value of the GPERFTOOLS_DIR environment variable if it is set. -## Libunwind: +### Libunwind: * ENABLE_LIBUNWIND --- Force detection of gperftools [default=OFF, i.e. Libunwind will be searched for when needed] * LIBUNWIND_DIR --- The install prefix for Libunwind. If LIBUNWIND_DIR is not given, it will be set to the value of the LIBUNWIND_DIR environment variable if it is set. -## Library of Exchange-Correlation DFT functionals (LIBXC): - -* ENABLE_LIBXC --- Enables use of the libxc library of density functionals. - [default=ON] -* LIBXC_ROOT_DIR --- The install prefix for LIBXC. -* LIBXC_INCLUDE_DIR --- The path to the LIBXC include directory. -* LIBXC_LIBRARY --- The path to the LIBXC library directory. - -## Polarizable Conitinuum Solver (PCM): +### Polarizable Conitinuum Solver (PCM): * ENABLE_PCM --- Enables use of PCM * PCM_ROOT_DIR --- The install prefix for PCM @@ -242,14 +205,14 @@ madness/external/pcm.cmake madness/modules/FindPCM.cmake madness/src/apps/chem/CMakeLists.txt -## Performance Application Programming Interface (PAPI): +3## Performance Application Programming Interface (PAPI): * ENABLE_PAPI --- Enables use of PAPI [default=OFF] * PAPI_ROOT_DIR --- The install prefix for PAPI. * PAPI_INCLUDE_DIR --- The path to the PAPI include directory. * PAPI_LIBRARY --- The path to the PAPI library directory. -## Elemental parallel linear algebra library: +### Elemental parallel linear algebra library: **This has not been tested in some time.** @@ -265,13 +228,54 @@ madness::initialize will call El::initialize() . MADNESS (numerical codes of MADNESS will not use Elemental). If not set, will use the included Elemental source. -## Parallel Runtime Scheduling and Execution Controller (PaRSEC): +### Parallel Runtime Scheduling and Execution Controller (PaRSEC): + +Recommended only for TTG development. * ENABLE_PARSEC --- Enables use of PaRSEC as the task scheduler [default=OFF]. The use of Intel TBB should be disabled to use PaRSEC. If ENABLE_PARSEC is set but PaRSEC is not found, it will be built from source. +## MADNESS Runtime and the Address Space Layout Randomization (ASLR) + +ASLR (Linux relevant documentation [here](https://linux-audit.com/linux-aslr-and-kernelrandomize_va_space-setting/)) +is a standard technique for increasing platform security implemented by the OS kernel and/or +the dynamic linker. By randomizing both where the shared libraries are loaded as well as (when enabled) the absolute +position of the executable in memory (such executables are known as position-independent executables). Until recently +MADNESS could only be used with MPI on platforms with ASLR if built with static libraries (for MADNESS code; system and other libraries could still be shared). However, static libraries make it hard to integrate with Python and other frameworks that demand shared libraries. + +If properly configured and built, MADNESS can now be used on ASLR platforms using either static (the default and easiest) or shared libraries. Use the following variables to control the ASLR-related aspects of MADNESS runtime. + +* MADNESS_ASSUMES_ASLR_DISABLED --- MADNESS runtime will assume that the Address Space Layout Randomization (ASLR) is off. + By default MADNESS_ASSUMES_ASLR_DISABLED is set to OFF (i.e. MADNESS will assume that ASLR is enabled); + this will cause all libraries by default to be static (BUILD_SHARED_LIBS=OFF) + and compiled as position-independent code (CMAKE_POSITION_INDEPENDENT_CODE=ON). + This will also enable a runtime check for ASLR. +* CMAKE_POSITION_INDEPENDENT_CODE --- This standard CMake variable controls whether targets are compiled by default + as position-independent code or not. If BUILD_SHARED_LIBS=OFF need to set this to ON if want to use the MADNESS + libraries to build shared libraries or position-independent executables. + +To make things more concrete, consider the following 2 scenarios: +* Platform with ASLR disabled --- set MADNESS_ASSUMES_ASLR_DISABLED=ON to set defaults correctly and enable the ASLR check. + BUILD_SHARED_LIBS can be set to ON (to produce shared libraries, e.g. to save space) or to OFF to + produce static libraries. If the static libraries will be linked into shared libraries set + CMAKE_POSITION_INDEPENDENT_CODE=ON, otherwise CMAKE_POSITION_INDEPENDENT_CODE will be set to OFF for maximum efficiency + of function calls. +* Platform with ASLR enabled --- this is the default. Setting BUILD_SHARED_LIBS=ON in this scenario will produce + executables that can only be safely used with 1 MPI rank, thus BUILD_SHARED_LIBS will be defaulted to OFF (i.e. + MADNESS libraries will be build as static libraries). CMAKE_POSITION_INDEPENDENT_CODE is by default set to ON, + thus MADNESS libraries can be linked into position-independent executables safely. MADNESS libraries can also be + linked into a shared library and used with more than 1 MPI rank, provided that *ALL* code using MADNESS is part of the *SAME* shared library. + E.g. to link MADNESS into a Python module compile MADNESS and all libraries using MADNESS as shared libraries + (with CMAKE_POSITION_INDEPENDENT_CODE=ON) and link them all together into a single module. + +## Warning about fast memory allocators + +Summary: Only use fast memory allocators if you are using just 1 MPI process or have configured without MPI. + +Depending on the calculation and the number of threads being used, MADNESS can receive about a 10% or even more speedup from fast memory allocators such as tcmalloc, jemalloc, tbbmalloc, etc. However, these **do not work with MPI over InfiniBand** and probably most other transport layers. It can appear to work, and then fail with either wrong numbers or MPI errors. The reason is that IB requires that memory be pinned and hence MPI introduces its own memory allocator(s) to manage this. By overriding the allocator, you will break the guarantee that memory is pinned. + ## Toolchain files **Use of these files is now deprecated --- configuration should usually work without this.** However, they can be useful if all else fails or on "bleeding-edge" supercomputers with non-standard software environments. diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index 5622d22d304..64ec14d98eb 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -30,12 +30,6 @@ This tutorial covers - overview of the chemistry API [Florian] - a simple Hartree-Fock program - -Build issues -- Ubuntu 23.04 VM build failed with missing Exchange operator symbol --- but it builds on 22.04 -- `make install` fails due to missing moldft (and presumably other) executable ... if you build applications first it works and does install all chemistry applications -- `make applications` followed by `make install-madness` starts building mad-response -- `make install-chem` just installs heders and libraries, but no chemistry applications? Should the target be renamed? ## Downloading From the command line, clone the [MADNESS GitHub repository](https://github.com/m-a-d-n-e-s-s/madness) using one of the below @@ -59,12 +53,17 @@ checkout XXXXXXXXXXXXXXXXXXX Please refer to the [installation instructions](https://madness.readthedocs.io/en/latest/INSTALL.html). +Minimal recipe without MPI +``` +cmake -DENABLE_MPI=OFF -DCMAKE_INSTALL_PREFIX=/home/me/madinstall /path/to/madness/source +make applications +make install +``` + Issues that need fixing -* relevant targets -* cmake required * ACML is now AOCL -* Configuring a vanilla Ubuntu (or other Linux) system --- DONE - - what packages to install and how * Configuring a vanilla Intel Mac + - what packages to install and how * Configuring a vanilla ARM Mac + - what packages to install and how From 3c1a11ac16227f55f53d8f3326fc7a076aec21c6 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 26 May 2023 10:07:44 +0200 Subject: [PATCH 1231/1312] starting api tutorials --- doc/tutorial/API.md | 19 +++++++++++++++++++ doc/tutorial/chemistry.md | 10 ++++++++++ 2 files changed, 29 insertions(+) create mode 100644 doc/tutorial/API.md create mode 100644 doc/tutorial/chemistry.md diff --git a/doc/tutorial/API.md b/doc/tutorial/API.md new file mode 100644 index 00000000000..a9d7381d698 --- /dev/null +++ b/doc/tutorial/API.md @@ -0,0 +1,19 @@ +# Numerical and chemistry API + +## Cmake +When using Madness as external library, we recommend cmake + +## Numerical API + + +## Chemistry API +There is a number of methods for writing quantum chemistry codes, +we will write a simple HF code as an example +```c++ +int main +``` + + +### SCFOperators +### BSHApply +### KAIN Solver diff --git a/doc/tutorial/chemistry.md b/doc/tutorial/chemistry.md new file mode 100644 index 00000000000..4490ae338bc --- /dev/null +++ b/doc/tutorial/chemistry.md @@ -0,0 +1,10 @@ +# Chemistry in Madness +## Running a calculation -- quick and dirty +## Getting help +## The input file -- General structure + +### moldft and nemo + +### molresponse + +### CIS and CC2 From c8f90a54173435f832a41521cd832a32e7f0b634 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 26 May 2023 13:26:08 +0200 Subject: [PATCH 1232/1312] Q2 orthonormalization in vmra.h --- src/madness/mra/vmra.h | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index 23c16efb55b..e5a54e1a02d 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -327,13 +327,44 @@ namespace madness { std::vector< Function > r(n); for (int i=0; i(FunctionFactory(world).fence(false).compressed(true).initial_level(1)); + if (n && fence) world.gop.fence(); + return r; + } - if (n && fence) world.gop.fence(); - return r; + /// orthonormalize the vectors + template + std::vector> orthonormalize(const std::vector >& vf_in) { + if (vf_in.size()==0) return; + World& world=vf_in.front().world(); + auto vf=copy(world,vf_in); + normalize(world,vf); + if (vf.size()==1) return; + double maxq; + double trantol=0.0; + auto Q2=[](const Tensor& s) { + Tensor Q = -0.5*s; + for (int i=0; i Q = Q2(matrix_inner(world, vf, vf)); + maxq=0.0; + for (int i=0; i0.01); + normalize(world,vf); } + /// symmetric orthonormalization (see e.g. Szabo/Ostlund) + /// @param[in] the vector to orthonormalize /// @param[in] overlap matrix template From bcc1a9424727beb6483929fb5df71bf028f6753a Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 26 May 2023 13:26:29 +0200 Subject: [PATCH 1233/1312] unifying SCFOperator api --- src/apps/molresponse/global_functions.cc | 4 ++-- src/madness/chem/BSHApply.h | 9 ++++++--- src/madness/chem/SCFOperators.cc | 21 ++++++++++++++++++--- src/madness/chem/SCFOperators.h | 20 +++++++++++++++----- src/madness/chem/exchangeoperator.h | 6 +++--- src/madness/chem/nemo.cc | 13 ++++++------- src/madness/chem/oep.cc | 5 ++--- src/madness/chem/oep.h | 8 ++++---- src/madness/chem/test_BSHApply.cc | 2 -- src/madness/chem/test_SCFOperators.cc | 6 +++--- src/madness/chem/zcis.cc | 4 ++-- src/madness/chem/znemo.cc | 4 ++-- 12 files changed, 63 insertions(+), 39 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index cf47058b150..ce28dd848df 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -80,8 +80,8 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu double mul_tol = 1e-7; const double lo = 1.e-10; - Exchange op{}; - op.set_parameters(bra, ket, lo); + Exchange op(world,lo,tol); + op.set_bra_and_ket(bra, ket, lo); op.set_algorithm(op.small_memory); return op(vf); } diff --git a/src/madness/chem/BSHApply.h b/src/madness/chem/BSHApply.h index 36e2ee27c69..141b3d6e21b 100644 --- a/src/madness/chem/BSHApply.h +++ b/src/madness/chem/BSHApply.h @@ -15,6 +15,10 @@ namespace madness { /// apply the BSH operator on a vector of functions with corresponding potentials +/// this class +/// - constructs the bsh operator with the appropriate exponents +/// - performs a level shift if necessary +/// - adds coupling terms: ( T - fock(i,i) ) psi_i = -V psi_i + \sum_{j\neq i} psi_j fock(j,i) /// TODO: adding a level shift seems to make the operation less precise, why?? template class BSHApply { @@ -26,7 +30,6 @@ class BSHApply { double bshtol=1.e-5; bool printme=false; bool destroy_Vpsi=false; - bool do_coupling=false; Function metric; public: @@ -123,15 +126,15 @@ class BSHApply { // check dimensions bool consistent=(psi.size()==fock1.dim(0)); if ((fock1.ndim()==2) and not (psi.size()==fock1.dim(1))) consistent=false; - if ((do_coupling) and not (fock1.ndim()==2)) consistent=false; if (not consistent) { print("Fock matrix dimensions",fock1.ndim(), fock1.dim(0), fock1.dim(1)); print("number of orbitals",psi.size()); - print("do_coupling parameter",do_coupling); MADNESS_EXCEPTION("confused Fock matrix/orbital energies in BSHApply - 1",1); } + bool do_coupling=(fock1.ndim()==2); + // subtract the BSH energy (aka Fock diagonal elements) from the rhs // ( T - fock(i,i) ) psi_i = -V psi_i + \sum_{j\neq i} psi_j fock(j,i) // if there is no level shift and the orbital energies are large enough the diff --git a/src/madness/chem/SCFOperators.cc b/src/madness/chem/SCFOperators.cc index 92502f75718..07e449f6666 100644 --- a/src/madness/chem/SCFOperators.cc +++ b/src/madness/chem/SCFOperators.cc @@ -251,6 +251,15 @@ Nuclear::Nuclear(World &world, const NemoBase* nemo) : world(world) { ncf = nemo->ncf; } +template +Nuclear::Nuclear(World &world, const Molecule& molecule) : world(world) { + auto pm_ptr=std::make_shared(molecule,""); + MADNESS_CHECK(molecule.parameters.pure_ae()); + pm_ptr->make_nuclear_potential(world); + ncf = std::shared_ptr( + new PseudoNuclearCorrelationFactor(world, molecule, pm_ptr, 1.0)); +} + template std::vector > Nuclear::operator()(const std::vector > &vket) const { @@ -662,6 +671,11 @@ void XCOperator::prep_xc_args_response(const real_function_3d &dens_pt, truncate(world, xc_args, extra_truncation); } +/// ctor +template +Exchange::Exchange(World& world, const double lo, const double thresh) : impl(new Exchange::ExchangeImpl(world,lo,thresh)) {}; + + /// ctor with a conventional calculation template Exchange::Exchange(World& world, const SCF *calc, const int ispin) : impl(new Exchange::ExchangeImpl(world,calc,ispin)) {}; @@ -682,12 +696,13 @@ std::vector> Exchange::operator()(const std::vector -Exchange& Exchange::set_parameters(const vecfuncT& bra, const vecfuncT& ket, const double lo1) { +Exchange& Exchange::set_bra_and_ket(const vecfuncT& bra, const vecfuncT& ket, const double lo1) { + MADNESS_CHECK(impl); if (not impl) { World& world=bra.front().world(); - impl.reset(new Exchange::ExchangeImpl(world)); + impl.reset(new Exchange::ExchangeImpl(world,lo1,FunctionDefaults::get_thresh())); } - impl->set_parameters(bra,ket,lo1); + impl->set_bra_and_ket(bra, ket); return *this; } diff --git a/src/madness/chem/SCFOperators.h b/src/madness/chem/SCFOperators.h index 8d3d2fef1db..614a0032afe 100644 --- a/src/madness/chem/SCFOperators.h +++ b/src/madness/chem/SCFOperators.h @@ -50,6 +50,7 @@ class OEP; class NuclearCorrelationFactor; class XCfunctional; class MacroTaskQ; +class Molecule; typedef std::vector vecfuncT; @@ -115,9 +116,11 @@ class Exchange : public SCFOperatorBase { }; /// default ctor - Exchange() = default; +// Exchange() = default; - Exchange(std::shared_ptr taskq) : SCFOperatorBase(taskq) {} + Exchange(World& world, const double lo, const double thresh=FunctionDefaults::get_thresh()); + +// Exchange(std::shared_ptr taskq) : SCFOperatorBase(taskq) {} /// ctor with a conventional calculation Exchange(World& world, const SCF *calc, const int ispin); @@ -140,7 +143,7 @@ class Exchange : public SCFOperatorBase { return *this; } - Exchange& set_parameters(const vecfuncT& bra, const vecfuncT& ket, const double lo1); + Exchange& set_bra_and_ket(const vecfuncT& bra, const vecfuncT& ket, const double lo1); Function operator()(const Function& ket) const { vecfuncT vket(1, ket); @@ -169,10 +172,9 @@ class Exchange : public SCFOperatorBase { /// @param[in] vket vector of real_function_3d, the set of ket states /// @return K_ij Tensor operator()(const vecfuncT& vbra, const vecfuncT& vket) const { - const auto bra_equiv_ket = &vbra == &vket; vecfuncT vKket = this->operator()(vket); World& world=vket[0].world(); - auto result = matrix_inner(world, vbra, vKket, bra_equiv_ket); + auto result = matrix_inner(world, vbra, vKket); return result; } @@ -366,6 +368,11 @@ class Coulomb : public SCFOperatorBase { /// default empty ctor Coulomb(World& world) : world(world) {}; + /// default empty ctor + Coulomb(World& world, const double lo, const double thresh=FunctionDefaults<3>::get_thresh()) : world(world) { + reset_poisson_operator_ptr(lo,thresh); + }; + /// ctor with an SCF calculation providing the MOs and density Coulomb(World& world, const SCF* calc); @@ -450,6 +457,9 @@ class Nuclear : public SCFOperatorBase { Nuclear(World& world, const NemoBase* nemo); + /// simple constructor takes a molecule, no nuclear correlation factor or core potentials + Nuclear(World& world, const Molecule& molecule); + Nuclear(World& world, std::shared_ptr ncf) : world(world), ncf(ncf) {} diff --git a/src/madness/chem/exchangeoperator.h b/src/madness/chem/exchangeoperator.h index 0bf8534a506..e855e91386b 100644 --- a/src/madness/chem/exchangeoperator.h +++ b/src/madness/chem/exchangeoperator.h @@ -48,7 +48,7 @@ class Exchange::ExchangeImpl { Algorithm algorithm_ = multiworld_efficient; /// default ctor - ExchangeImpl(World& world) : world(world) {} + ExchangeImpl(World& world, const double lo, const double thresh) : world(world), lo(lo), thresh(thresh) {} /// ctor with a conventional calculation ExchangeImpl(World& world, const SCF *calc, const int ispin) ; @@ -60,10 +60,9 @@ class Exchange::ExchangeImpl { /// @param[in] bra bra space, must be provided as complex conjugate /// @param[in] ket ket space - void set_parameters(const vecfuncT& bra, const vecfuncT& ket, const double lo1) { + void set_bra_and_ket(const vecfuncT& bra, const vecfuncT& ket) { mo_bra = copy(world, bra); mo_ket = copy(world, ket); - lo = lo1; } std::string info() const {return "K";} @@ -126,6 +125,7 @@ class Exchange::ExchangeImpl { bool symmetric_ = false; /// is the exchange matrix symmetric? K phi_i = \sum_k \phi_k \int \phi_k \phi_i vecfuncT mo_bra, mo_ket; ///< MOs for bra and ket double lo = 1.e-4; + double thresh = FunctionDefaults::get_thresh(); long printlevel = 0; double mul_tol = 0.0; diff --git a/src/madness/chem/nemo.cc b/src/madness/chem/nemo.cc index 5595e0c1b90..1388076cfb3 100644 --- a/src/madness/chem/nemo.cc +++ b/src/madness/chem/nemo.cc @@ -387,7 +387,6 @@ double Nemo::solve(const SCFProtocol& proto) { BSHApply bsh_apply(world); bsh_apply.metric=R_square; bsh_apply.lo=get_calc()->param.lo(); - bsh_apply.do_coupling=localized; bsh_apply.levelshift=param.orbitalshift(); auto [residual,eps_update] =bsh_apply(nemo,fock,Vnemo); t_bsh.tag("BSH apply"); @@ -1107,10 +1106,10 @@ vecfuncT Nemo::make_cphf_constant_term(const size_t iatom, const int iaxis, // linear in the density vecfuncT Kconstnemo=zero_functions_compressed(world,nmo); if (not is_dft()) { - Exchange Kconst; + Exchange Kconst(world,param.lo()); vecfuncT kbra=2.0*RXR*nemo; truncate(world,kbra); - Kconst.set_parameters(kbra,nemo,param.lo()); + Kconst.set_bra_and_ket(kbra, nemo, param.lo()); Kconstnemo=Kconst(nemo); truncate(world,Kconstnemo); } @@ -1206,12 +1205,12 @@ vecfuncT Nemo::solve_cphf(const size_t iatom, const int iaxis, const Tensor Kp1; - Kp1.set_parameters(R2nemo,xi_complete,param.lo()).set_symmetric(true); + Exchange Kp1(world,param.lo()); + Kp1.set_bra_and_ket(R2nemo, xi_complete, param.lo()).set_symmetric(true); vecfuncT R2xi=mul(world,R_square,xi_complete); truncate(world,R2xi); - Exchange Kp2; - Kp2.set_parameters(R2xi,nemo,param.lo()); + Exchange Kp2(world,param.lo()); + Kp2.set_bra_and_ket(R2xi, nemo, param.lo()); Kp=truncate(Kp1(nemo) + Kp2(nemo)); } vecfuncT Vpsi2=truncate(Jp(nemo)-Kp+rhsconst); diff --git a/src/madness/chem/oep.cc b/src/madness/chem/oep.cc index 6a962900ccc..c2027d7dc3c 100644 --- a/src/madness/chem/oep.cc +++ b/src/madness/chem/oep.cc @@ -158,8 +158,8 @@ double OEP::compute_and_print_final_energies(const std::string model, const real compute_coulomb_potential(KS_nemo, Jnemo); compute_exchange_potential(KS_nemo, Knemo); - Exchange K; - K.set_parameters(R_square*HF_nemo,HF_nemo,param.lo()); + Exchange K(world,param.lo()); + K.set_bra_and_ket(R_square * HF_nemo, HF_nemo, param.lo()); double Ex_HF=-inner(R_square*HF_nemo,K(HF_nemo)); // compute final exchange energy using different methods and final kinetic energy @@ -352,7 +352,6 @@ double OEP::iterate(const std::string model, const vecfuncT& HF_nemo, const tens bsh_apply.metric=R_square; bsh_apply.levelshift=oep_param.levelshift(); bsh_apply.lo=get_calc()->param.lo(); - bsh_apply.do_coupling=param.do_localize(); auto [residual,eps_update] =bsh_apply(KS_nemo,KS_Fock,Fnemo); timer1.tag("apply BSH"); diff --git a/src/madness/chem/oep.h b/src/madness/chem/oep.h index e6e4312f02e..c5217ba608f 100644 --- a/src/madness/chem/oep.h +++ b/src/madness/chem/oep.h @@ -310,8 +310,8 @@ class OEP : public Nemo { /// compute Slater potential (Kohut, 2014, equation (15)) real_function_3d compute_slater_potential(const vecfuncT& nemo) const { - Exchange K; - K.set_parameters(R_square*nemo,nemo,reference->get_calc()->param.lo()); + Exchange K(world,reference->get_calc()->param.lo()); + K.set_bra_and_ket(R_square * nemo, nemo, reference->get_calc()->param.lo()); const vecfuncT Knemo = K(nemo); // 2.0*R_square in numerator and density (rho) cancel out upon division real_function_3d numerator = -1.0*dot(world, nemo, Knemo); @@ -543,8 +543,8 @@ class OEP : public Nemo { /// compute exchange potential (needed for Econv) void compute_exchange_potential(const vecfuncT& nemo, vecfuncT& Knemo) const { - Exchange K; - K.set_parameters(R_square*nemo,nemo,this->get_calc()->param.lo()); + Exchange K(world,this->get_calc()->param.lo()); + K.set_bra_and_ket(R_square * nemo, nemo, this->get_calc()->param.lo()); Knemo = K(nemo); truncate(world, Knemo); diff --git a/src/madness/chem/test_BSHApply.cc b/src/madness/chem/test_BSHApply.cc index b33661823e9..1a3bca1c5d9 100644 --- a/src/madness/chem/test_BSHApply.cc +++ b/src/madness/chem/test_BSHApply.cc @@ -162,7 +162,6 @@ int test_converged_function(World& world, double shift, bool coupling) { // apply the BSH operator BSHApply bsh_apply(world); - bsh_apply.do_coupling=coupling; bsh_apply.levelshift=shift; auto [residual,eps_update]=bsh_apply(vf,fock,potential*vf); @@ -210,7 +209,6 @@ int test_convergence(World& world, double shift, bool coupling) { for (int i=0; i<100; ++i) { BSHApply bsh_apply(world); - bsh_apply.do_coupling=coupling; bsh_apply.levelshift=shift; auto [residual,eps_update]=bsh_apply(vf,fock,potential*vf); vf-=residual; diff --git a/src/madness/chem/test_SCFOperators.cc b/src/madness/chem/test_SCFOperators.cc index 9e2ecfd7637..d121f0c449c 100644 --- a/src/madness/chem/test_SCFOperators.cc +++ b/src/madness/chem/test_SCFOperators.cc @@ -483,7 +483,8 @@ int test_exchange(World& world) { FunctionDefaults<3>::set_cubic_cell(-10, 10); // construct exchange operator - Exchange K; + double lo=1.e-4; + Exchange K(world,lo); const int nmo=2; Tensor alpha(nmo); @@ -500,8 +501,7 @@ int test_exchange(World& world) { Tensor aocc(nmo); aocc.fill(1.0); - double lo=1.e-4; - K.set_parameters(conj(world,amo),amo,lo); + K.set_bra_and_ket(conj(world, amo), amo, lo); K.set_algorithm(Exchange::multiworld_efficient); // compare the exchange operator to precomputed reference values diff --git a/src/madness/chem/zcis.cc b/src/madness/chem/zcis.cc index 332a0cf6e6f..90b5facc850 100644 --- a/src/madness/chem/zcis.cc +++ b/src/madness/chem/zcis.cc @@ -205,8 +205,8 @@ void Zcis::compute_potentials(std::vector& roots, const real_function_3d& Coulomb Jp(world); complex_function_3d Jp_pot = Jp.compute_potential(denspt); - Exchange Kp; - Kp.set_parameters(conj(world,act_mo),x,nemo->cparam.lo()); + Exchange Kp(world,nemo->cparam.lo()); + Kp.set_bra_and_ket(conj(world, act_mo), x, nemo->cparam.lo()); pot+=Q(Jp_pot*act_mo - Kp(act_mo)); truncate(world,pot); } diff --git a/src/madness/chem/znemo.cc b/src/madness/chem/znemo.cc index 8bdba711e72..c6ab7d2cc02 100644 --- a/src/madness/chem/znemo.cc +++ b/src/madness/chem/znemo.cc @@ -1034,10 +1034,10 @@ Znemo::potentials Znemo::compute_potentials(const std::vector dia2mo=make_bra(mo); // prepare exchange operator - Exchange K; + Exchange K(world,cparam.lo()); Tensor occ(mo.size()); occ=1.0; - K.set_parameters(conj(world,dia2mo),mo,cparam.lo()); + K.set_bra_and_ket(conj(world, dia2mo), mo, cparam.lo()); Nuclear nuc(world,ncf); From 0e1280432052209ec13d30f266493bc61a9ddd1e Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 26 May 2023 14:08:32 +0200 Subject: [PATCH 1234/1312] fixed bug --- src/madness/mra/vmra.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index e5a54e1a02d..efd31ea4d24 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -360,6 +360,7 @@ namespace madness { } while (maxq>0.01); normalize(world,vf); + return vf; } From 504c869cf56f0f978f3a769102b98360fccce825 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 26 May 2023 14:27:56 +0200 Subject: [PATCH 1235/1312] fixed same bug again --- src/madness/mra/vmra.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/madness/mra/vmra.h b/src/madness/mra/vmra.h index efd31ea4d24..289e85d8684 100644 --- a/src/madness/mra/vmra.h +++ b/src/madness/mra/vmra.h @@ -335,11 +335,11 @@ namespace madness { /// orthonormalize the vectors template std::vector> orthonormalize(const std::vector >& vf_in) { - if (vf_in.size()==0) return; + if (vf_in.size()==0) return std::vector>(); World& world=vf_in.front().world(); auto vf=copy(world,vf_in); normalize(world,vf); - if (vf.size()==1) return; + if (vf.size()==1) return copy(world,vf_in); double maxq; double trantol=0.0; auto Q2=[](const Tensor& s) { From 17bd867727bc36dbed8a6bef36fb926db786c162 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Fri, 26 May 2023 14:46:51 +0200 Subject: [PATCH 1236/1312] cleaning up SCFOperator signatures --- src/apps/molresponse/global_functions.cc | 2 +- src/madness/chem/CC2.cc | 7 ++--- src/madness/chem/CC2.h | 2 +- src/madness/chem/SCFOperators.cc | 10 +++---- src/madness/chem/SCFOperators.h | 2 +- src/madness/chem/nemo.cc | 17 ++++++------ src/madness/chem/nemo.h | 21 --------------- src/madness/chem/oep.cc | 11 ++++---- src/madness/chem/oep.h | 4 +-- src/madness/chem/test_SCFOperators.cc | 2 +- src/madness/chem/zcis.cc | 6 ++--- src/madness/chem/znemo.cc | 10 ++++--- src/madness/chem/znemo.h | 2 +- src/madness/mra/nonlinsol.h | 34 +++++++++++++++++++++++- 14 files changed, 73 insertions(+), 57 deletions(-) diff --git a/src/apps/molresponse/global_functions.cc b/src/apps/molresponse/global_functions.cc index ce28dd848df..4c636af7a39 100644 --- a/src/apps/molresponse/global_functions.cc +++ b/src/apps/molresponse/global_functions.cc @@ -81,7 +81,7 @@ auto newK(const vecfuncT &ket, const vecfuncT &bra, const vecfuncT &vf) -> vecfu const double lo = 1.e-10; Exchange op(world,lo,tol); - op.set_bra_and_ket(bra, ket, lo); + op.set_bra_and_ket(bra, ket); op.set_algorithm(op.small_memory); return op(vf); } diff --git a/src/madness/chem/CC2.cc b/src/madness/chem/CC2.cc index 4cb980becfe..bab37bda0cf 100644 --- a/src/madness/chem/CC2.cc +++ b/src/madness/chem/CC2.cc @@ -570,9 +570,10 @@ double CC2::solve_mp2_coupled(Pairs& doubles) { for (auto& tmp_pair : pair_vec) { updated_pairs.insert(tmp_pair.i, tmp_pair.j, tmp_pair); } - typedef allocator allocT; - allocT alloc(world, pair_vec.size()); - XNonlinearSolver, double, allocT> solver(alloc); +// typedef allocator allocT; +// allocT alloc(world, pair_vec.size()); +// XNonlinearSolver, double, allocT> solver(alloc); + auto solver= nonlinear_vector_solver(world,pair_vec.size()); solver.set_maxsub(parameters.kain_subspace()); solver.do_print = (world.rank() == 0); diff --git a/src/madness/chem/CC2.h b/src/madness/chem/CC2.h index 8cf2a754053..e658c24bdc6 100644 --- a/src/madness/chem/CC2.h +++ b/src/madness/chem/CC2.h @@ -206,7 +206,7 @@ class CC2 : public OptimizationTargetInterface, public QCPropertyInterface { old_singles(tmp.first).function = copy(tmp.second.function); // KAIN solver - typedef allocator allocT; + typedef vector_function_allocator allocT; typedef XNonlinearSolver >, double, allocT> solverT; allocT alloc(world, singles.size()); solverT solver(allocT(world, singles.size())); diff --git a/src/madness/chem/SCFOperators.cc b/src/madness/chem/SCFOperators.cc index 07e449f6666..4cdf9981987 100644 --- a/src/madness/chem/SCFOperators.cc +++ b/src/madness/chem/SCFOperators.cc @@ -696,12 +696,12 @@ std::vector> Exchange::operator()(const std::vector -Exchange& Exchange::set_bra_and_ket(const vecfuncT& bra, const vecfuncT& ket, const double lo1) { +Exchange& Exchange::set_bra_and_ket(const vecfuncT& bra, const vecfuncT& ket) { MADNESS_CHECK(impl); - if (not impl) { - World& world=bra.front().world(); - impl.reset(new Exchange::ExchangeImpl(world,lo1,FunctionDefaults::get_thresh())); - } +// if (not impl) { +// World& world=bra.front().world(); +// impl.reset(new Exchange::ExchangeImpl(world,lo1,FunctionDefaults::get_thresh())); +// } impl->set_bra_and_ket(bra, ket); return *this; } diff --git a/src/madness/chem/SCFOperators.h b/src/madness/chem/SCFOperators.h index 614a0032afe..48be93c51f2 100644 --- a/src/madness/chem/SCFOperators.h +++ b/src/madness/chem/SCFOperators.h @@ -143,7 +143,7 @@ class Exchange : public SCFOperatorBase { return *this; } - Exchange& set_bra_and_ket(const vecfuncT& bra, const vecfuncT& ket, const double lo1); + Exchange& set_bra_and_ket(const vecfuncT& bra, const vecfuncT& ket); Function operator()(const Function& ket) const { vecfuncT vket(1, ket); diff --git a/src/madness/chem/nemo.cc b/src/madness/chem/nemo.cc index 1388076cfb3..fa8850b00b8 100644 --- a/src/madness/chem/nemo.cc +++ b/src/madness/chem/nemo.cc @@ -321,10 +321,11 @@ double Nemo::solve(const SCFProtocol& proto) { bool localized=param.do_localize(); real_function_3d density=real_factory_3d(world); // for testing convergence - typedef allocator allocT; - typedef XNonlinearSolver >, double, allocT> solverT; - allocT alloc(world, nemo.size()); - solverT solver(allocT(world, nemo.size())); +// typedef vector_function_allocator allocT; +// typedef XNonlinearSolver >, double, allocT> solverT; +// allocT alloc(world, nemo.size()); +// solverT solver(allocT(world, nemo.size())); + auto solver= nonlinear_vector_solver(world,nemo.size()); // iterate the residual equations @@ -1109,7 +1110,7 @@ vecfuncT Nemo::make_cphf_constant_term(const size_t iatom, const int iaxis, Exchange Kconst(world,param.lo()); vecfuncT kbra=2.0*RXR*nemo; truncate(world,kbra); - Kconst.set_bra_and_ket(kbra, nemo, param.lo()); + Kconst.set_bra_and_ket(kbra, nemo); Kconstnemo=Kconst(nemo); truncate(world,Kconstnemo); } @@ -1164,7 +1165,7 @@ vecfuncT Nemo::solve_cphf(const size_t iatom, const int iaxis, const Tensor allocT; + typedef vector_function_allocator allocT; typedef XNonlinearSolver >, double, allocT> solverT; allocT alloc(world, nemo.size()); solverT solver(allocT(world, nemo.size())); @@ -1206,11 +1207,11 @@ vecfuncT Nemo::solve_cphf(const size_t iatom, const int iaxis, const Tensor Kp1(world,param.lo()); - Kp1.set_bra_and_ket(R2nemo, xi_complete, param.lo()).set_symmetric(true); + Kp1.set_bra_and_ket(R2nemo, xi_complete).set_symmetric(true); vecfuncT R2xi=mul(world,R_square,xi_complete); truncate(world,R2xi); Exchange Kp2(world,param.lo()); - Kp2.set_bra_and_ket(R2xi, nemo, param.lo()); + Kp2.set_bra_and_ket(R2xi, nemo); Kp=truncate(Kp1(nemo) + Kp2(nemo)); } vecfuncT Vpsi2=truncate(Jp(nemo)-Kp+rhsconst); diff --git a/src/madness/chem/nemo.h b/src/madness/chem/nemo.h index 633cee26b98..72a8b2cd558 100644 --- a/src/madness/chem/nemo.h +++ b/src/madness/chem/nemo.h @@ -66,27 +66,6 @@ class PNO; class OEP; -// The default constructor for functions does not initialize -// them to any value, but the solver needs functions initialized -// to zero for which we also need the world object. -template -struct allocator { - World& world; - const int n; - - /// @param[in] world the world - /// @param[in] nn the number of functions in a given vector - allocator(World& world, const int nn) : - world(world), n(nn) { - } - - /// allocate a vector of n empty functions - std::vector > operator()() { - return zero_functions(world, n); - } -}; - - class NemoBase : public MolecularOptimizationTargetInterface { public: diff --git a/src/madness/chem/oep.cc b/src/madness/chem/oep.cc index c2027d7dc3c..8f5588c2008 100644 --- a/src/madness/chem/oep.cc +++ b/src/madness/chem/oep.cc @@ -159,7 +159,7 @@ double OEP::compute_and_print_final_energies(const std::string model, const real compute_exchange_potential(KS_nemo, Knemo); Exchange K(world,param.lo()); - K.set_bra_and_ket(R_square * HF_nemo, HF_nemo, param.lo()); + K.set_bra_and_ket(R_square * HF_nemo, HF_nemo); double Ex_HF=-inner(R_square*HF_nemo,K(HF_nemo)); // compute final exchange energy using different methods and final kinetic energy @@ -227,10 +227,11 @@ double OEP::iterate(const std::string model, const vecfuncT& HF_nemo, const tens } - typedef allocator allocT; - typedef XNonlinearSolver >, double, allocT> solverT; - allocT alloc(world, KS_nemo.size()); - solverT solver(allocT(world, KS_nemo.size()),param.print_level()>4); +// typedef allocator allocT; +// typedef XNonlinearSolver >, double, allocT> solverT; +// allocT alloc(world, KS_nemo.size()); +// solverT solver(allocT(world, KS_nemo.size()),param.print_level()>4); + auto solver= nonlinear_vector_solver(world,KS_nemo.size()); solver.set_maxsub(param.maxsub()); double energy=0.0; diff --git a/src/madness/chem/oep.h b/src/madness/chem/oep.h index c5217ba608f..90f1cdd487e 100644 --- a/src/madness/chem/oep.h +++ b/src/madness/chem/oep.h @@ -311,7 +311,7 @@ class OEP : public Nemo { real_function_3d compute_slater_potential(const vecfuncT& nemo) const { Exchange K(world,reference->get_calc()->param.lo()); - K.set_bra_and_ket(R_square * nemo, nemo, reference->get_calc()->param.lo()); + K.set_bra_and_ket(R_square * nemo, nemo); const vecfuncT Knemo = K(nemo); // 2.0*R_square in numerator and density (rho) cancel out upon division real_function_3d numerator = -1.0*dot(world, nemo, Knemo); @@ -544,7 +544,7 @@ class OEP : public Nemo { void compute_exchange_potential(const vecfuncT& nemo, vecfuncT& Knemo) const { Exchange K(world,this->get_calc()->param.lo()); - K.set_bra_and_ket(R_square * nemo, nemo, this->get_calc()->param.lo()); + K.set_bra_and_ket(R_square * nemo, nemo); Knemo = K(nemo); truncate(world, Knemo); diff --git a/src/madness/chem/test_SCFOperators.cc b/src/madness/chem/test_SCFOperators.cc index d121f0c449c..16437e4142d 100644 --- a/src/madness/chem/test_SCFOperators.cc +++ b/src/madness/chem/test_SCFOperators.cc @@ -501,7 +501,7 @@ int test_exchange(World& world) { Tensor aocc(nmo); aocc.fill(1.0); - K.set_bra_and_ket(conj(world, amo), amo, lo); + K.set_bra_and_ket(conj(world, amo), amo); K.set_algorithm(Exchange::multiworld_efficient); // compare the exchange operator to precomputed reference values diff --git a/src/madness/chem/zcis.cc b/src/madness/chem/zcis.cc index 90b5facc850..9e7748fba73 100644 --- a/src/madness/chem/zcis.cc +++ b/src/madness/chem/zcis.cc @@ -46,8 +46,8 @@ void Zcis::iterate(std::vector& roots) const { //const double shift=nemo->param.shift(); const bool use_kain=true; - XNonlinearSolver ,double_complex, allocator > - allsolver(allocator (world,(active_mo(nemo->amo).size()+active_mo(nemo->bmo).size())*roots.size())); + XNonlinearSolver ,double_complex, vector_function_allocator > + allsolver(vector_function_allocator (world,(active_mo(nemo->amo).size()+active_mo(nemo->bmo).size())*roots.size())); for (int iter=0; iter& roots, const real_function_3d& complex_function_3d Jp_pot = Jp.compute_potential(denspt); Exchange Kp(world,nemo->cparam.lo()); - Kp.set_bra_and_ket(conj(world, act_mo), x, nemo->cparam.lo()); + Kp.set_bra_and_ket(conj(world, act_mo), x); pot+=Q(Jp_pot*act_mo - Kp(act_mo)); truncate(world,pot); } diff --git a/src/madness/chem/znemo.cc b/src/madness/chem/znemo.cc index c6ab7d2cc02..0cc7a87ba09 100644 --- a/src/madness/chem/znemo.cc +++ b/src/madness/chem/znemo.cc @@ -211,8 +211,10 @@ void Znemo::iterate() { // the diamagnetic box - XNonlinearSolver ,double_complex, allocator > solvera(allocator (world,amo.size())); - XNonlinearSolver ,double_complex, allocator > solverb(allocator (world,bmo.size())); +// XNonlinearSolver ,double_complex, allocator > solvera(allocator (world,amo.size())); +// XNonlinearSolver ,double_complex, allocator > solverb(allocator (world,bmo.size())); + auto solvera= nonlinear_vector_solver(world,amo.size()); + auto solverb= nonlinear_vector_solver(world,bmo.size()); solvera.set_maxsub(cparam.maxsub()); // @suppress("Method cannot be resolved") solvera.do_print=(param.printlevel()>2); solverb.set_maxsub(cparam.maxsub()); @@ -1037,7 +1039,7 @@ Znemo::potentials Znemo::compute_potentials(const std::vector K(world,cparam.lo()); Tensor occ(mo.size()); occ=1.0; - K.set_bra_and_ket(conj(world, dia2mo), mo, cparam.lo()); + K.set_bra_and_ket(conj(world, dia2mo), mo); Nuclear nuc(world,ncf); @@ -1137,7 +1139,7 @@ void Znemo::canonicalize(std::vector& amo, std::vector& vnemo, potentials& pot, - XNonlinearSolver ,double_complex, allocator >& solver, + XNonlinearSolver ,double_complex, vector_function_allocator >& solver, Tensor fock, Tensor ovlp) const { Tensor U; diff --git a/src/madness/chem/znemo.h b/src/madness/chem/znemo.h index ab410525dbb..3a822f1b2d3 100644 --- a/src/madness/chem/znemo.h +++ b/src/madness/chem/znemo.h @@ -397,7 +397,7 @@ class Znemo : public NemoBase, public QCPropertyInterface { void canonicalize(std::vector& amo, std::vector& vnemo, potentials& pot, - XNonlinearSolver ,double_complex, allocator >& solver, + XNonlinearSolver ,double_complex, vector_function_allocator >& solver, Tensor fock, Tensor ovlp) const; std::vector orthonormalize(const std::vector& mo) const; diff --git a/src/madness/mra/nonlinsol.h b/src/madness/mra/nonlinsol.h index 3d1042ff448..bb61a8abb68 100644 --- a/src/madness/mra/nonlinsol.h +++ b/src/madness/mra/nonlinsol.h @@ -160,7 +160,28 @@ namespace madness { struct default_allocator { T operator()() {return T();} }; - + + + // The default constructor for functions does not initialize + // them to any value, but the solver needs functions initialized + // to zero for which we also need the world object. + template + struct vector_function_allocator { + World& world; + const int n=-1; + + /// @param[in] world the world + /// @param[in] nn the number of functions in a given vector + vector_function_allocator(World& world, const int nn) : world(world), n(nn) {} + + /// allocate a vector of n empty functions + std::vector > operator()() { + return zero_functions(world, n); + } + }; + + + /// Generalized version of NonlinearSolver not limited to a single madness function /// \ingroup nonlinearsolve @@ -258,6 +279,17 @@ namespace madness { }; + template + static inline XNonlinearSolver>,T,vector_function_allocator> + nonlinear_vector_solver(World& world, const long nvec) { + auto alloc=vector_function_allocator(world,nvec); + return XNonlinearSolver>,T,vector_function_allocator>(alloc); + }; + + + typedef XNonlinearSolver>,double,vector_function_allocator> NonlinearVectorSolver_3d; + typedef XNonlinearSolver>,double,vector_function_allocator> NonlinearVectorSolver_6d; + } #endif From 26d8a42e7ed67ee11fae8352ca0b93e2390fd4b5 Mon Sep 17 00:00:00 2001 From: fbischoff Date: Sat, 27 May 2023 00:25:29 +0200 Subject: [PATCH 1237/1312] working on the chemistry API --- doc/tutorial/API.md | 60 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/doc/tutorial/API.md b/doc/tutorial/API.md index a9d7381d698..e8c6c7878c8 100644 --- a/doc/tutorial/API.md +++ b/doc/tutorial/API.md @@ -9,11 +9,67 @@ When using Madness as external library, we recommend cmake ## Chemistry API There is a number of methods for writing quantum chemistry codes, we will write a simple HF code as an example + + +### SCFOperators +Operators occuring in SCF methods are implemented in SCFOperators.h. Currently there +are: + - ```Kinetic``` + - ```Laplacian``` + - ```Derivative``` + - ```Coulomb``` + - ```Exchange``` + - ```XCOperator``` (using LibXC) + - ```Nuclear``` + - ```DNuclear``` (derivative of the nuclear potential) + - ```Lz``` (angular momentum) + - ```Local``` (any local potential) + +All of the above can be put into a ```Fock``` operator, to simplify notation. Construction follows the scheme +```c++ +auto T=Kinetic(world); +auto Vnuc=Nuclear(world,molecule); +``` +SCFOperators act on MRA functions or vector of functions, yielding either the a result (vector of) functions, +or a matrix representation of the operator ```c++ -int main +std::vector> Vphi=Vnuc(orbitals); +Tensor tmat=T(orbitals,orbitals); ``` -### SCFOperators ### BSHApply +Solving the Schroedinger equation in MRA always looks like +```latex +(T + V)\psi = E \psi +\psi = (T - E)^{-1}V\psi +``` +If there are more than one wave functions (e.g. several orbitals) there might appear +a coupling term +```latex +F\psi_i = f_{ij} \psi_j +\psi_i = (T - f_{ii})^{-1}V\psi_i + \sum_{j\neq i}\psi_j +``` +Since this operator occurs very often, and might include further techniques, +such as a level shift if the energy is positive, a class named ```BSHApply``` +has been introduced that applies the BSHOperator, includes couping and performs +a level shift, if necessary +```c++ +auto [residual, eps_update] = bsh_apply(orbitals, fock, Vorbitals); +``` +New orbitals are the taken directly from the residual, or by using a convergence accelerator +```c++ +orbitals-=residual; +``` + ### KAIN Solver +Similar to DIIS, the KAIN solver stabilizes and accelerates the solution of the nonlinear equations. + +```c++ +auto functionsolver=NonlinearSolver; +auto vectorfunctionsolver=nonlinear_vector_solver(world, orbitals.size()); +``` +The new solution is a linear combination of the old solutions and the new update and can be obtained through +```c++ +orbitals=solver.update(orbitals,residual); +``` From bf7eb2bf2c44e0205d3597f15c24b75caecc2911 Mon Sep 17 00:00:00 2001 From: "Robert J. Harrison" Date: Sun, 28 May 2023 03:30:49 -0400 Subject: [PATCH 1238/1312] slides for background and tutorial --- doc/MADNESSeverything4.odp | Bin 0 -> 16954742 bytes doc/MADNESSeverything4.pdf | Bin 0 -> 6713325 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/MADNESSeverything4.odp create mode 100644 doc/MADNESSeverything4.pdf diff --git a/doc/MADNESSeverything4.odp b/doc/MADNESSeverything4.odp new file mode 100644 index 0000000000000000000000000000000000000000..0cbf524d0541a02326569e18d50d742d2728fc5a GIT binary patch literal 16954742 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 cricmNU9dEcw+f`f7GQ9=An>t*?y>+OI#Ec3^b! zzHXi>tm*Q-+|7DE9aiekS(_?`>38XM+>YdMjtt#OOT3;Lw(6#-dFwHp`MsQ-xVHH; zw>LlB9L_uzyLW1>>pZMI0}=Sy++CZ`Hn%-n+K#MTnf1qS4Krc=&KR?+KvgNWx6RQ5 zZTIpz&_=j-%!xSW!prYjo|$8}HX5E|Cl5Dv;@axV%IS)^eH^21@7Hl@^|0D@cz4&w zYl-QH>Tthp|9&|da=WUXQ#jwFI5rm*#_8tlcYE<%K6^B&`r6|gc$R?+kimRj|Dx{a zd3&XB40P=z&=K&uy;^kP=8b+hIx7@TJbnq$VNQQ9VB<&9|6=641-og4NXW3JlhuCv z{&Fh#CeW6(E|3b`*uiaKT6hZLe7iv|7pyt5ErjogrBYt_3pSAl1Fxqn|;7!TOP zD4~V3#b2KGYG8D$1=eIRO?Ex;Iv@AL9zAm>U0R-($X5&pA9s&1SFRj)aaO?k9*sJ^ ze}cAw>2S}SwQ_1gei~%cT{a!N|jh6y;)*b-%5qw>+SA$*~2f`zP^6*09LQ9D~U2quwO#NQOTvMDtFx^{Ar}V~kpJ5NQs{ZZh80hrqa=Q6h z(=CNo^Wbg6)z3AC@b`6tMA$rT$FuFi&g)gdwxEZGEynU{+hUdA_-!sFFVDfOipsX^ zyGS)h`R>+Hp`Gse8=s&sHB0;J?a}m_nm{YYsY9LSOU}&!H)FBP(CQ^s!W#+>=|E7G!yV zub`-fAWd&v)A6GVZ~8jFO&8y)BX`alTh59sVP}!d;VuKeZ!_v`+j|yV(QbK1hn5XN z$_!)T?oHSu%5uBTs;p^pSBLhf?EAcPGOly_#POqzAXMCg{4Iv5i@>9>=gaoybqC&R zRoA!cB2E%mF_~-~#<|Q&kD`OxL}5-BCUwGjR#w2wMAX;@WOFYQqnV)mSO-t1kzO$rjDZty4*K^`$LAOPI{Lhn$MaFN%LtE9>!Q!PonP?JRd7O|DfUI*@jJil zzKmRNB7@!va(f4OzL%`{t_rcwEBbfkkxc;JUdtF>MWP@Hyk>9DFO3=HGpyqNAeNUi zhUvQ^zFqh#^sP>;I`APVUF-`0i8~GGZdV6S+oMuJe!X=w-``j0I>+wR zJb?Avda&VMwIO)+Xi1lA;w7Bgt`4#+m|IbCPBFq+)9=82W0_prY4WL0QaN1->1|88 zq}z8~?|Gf%^VK}rJA7R$>qxF@e|h;O+WLhcg;oh!T-WDPgqh@y!SMSs~gJ+raz#_2!HqqQL9O=1doy!0R#S&v0=VLEAN2&#&Gy zKA!iR=k4X|+Z9f~o4aX`qbGSnuNJM+&Q>jb`m^HYM-%?81TY@Bla_0Af<)1VxP)#5 zMm`|<>kU&{nH8aIRNLdW*Tc&V%3c0bjb8ZAH`A-fUAIKvGgp1R&ec?vCa>1zF;B{!Ue$MSf3S4Hr>_YyPBEHqV;=`+LZ&r^G7C-Reb{@ZM0&j9uAIEog zn-@KMAFPqprRy546?;Upl^~76Yue;F-^pbk#P!Mbr@OZ;6L)PtzuUXUrY6kd!*8dj z_V(52MD2IJ84RE`jV|}24abFp8L8DcYmY>ppdmivd4HX-^=wb4USC?G!fVf_!`_mm zP`ziZOD(vzYLB$+SAzJ|YTy2_sp54PJ3IhOIgy_{aT280zPLRzU#eZQT> z)yM02N!55FQCRB%H2t1=pW#o%7Ff*&%ZqL9MP0c@b=5kJDe1`L)*0ihM`UDB&D#*z zJZH@Ayt3wC0C0ln%hc^$UiE}+!{7ube(L%9ufw611({Rg`<33B!|)gH8AtLWPM@s_ z71>IzbE}EUhW$oDVZn8Gos`EIOvrYrWs`83GU_BS%h=i+dx5HHd)v3#_J{8#LPSHK zm?@x)HdYc$Ft1sLJfI6timcko2y8@flC7C;-Bb-{Fy#;k!I$Yn@~6o8JNujH85g%e^H(wK;2 z7FRcd<$r)ilMI%qQPwT*gh}+m=GcJFYxvW204N_Dd7>ExW9v3BR^*$aA_&+jC?y-| zVx+%a3!(yZ9Ax^W(P2aXpp|z~0z@%X!wshtbw&jeo2AQ5PX)4|F>B%Oyp@J?U9tmH zLbor#xuC{aWA?sU$Y;p65{<~n${+j%e36QUF3&0TNR_G1OZf}oBM~fFJLf5rTbNW| z%}xS@8$`8gvC`Kr%^iXXB|)fV23@>4-2$guC|9hk<@{Y0bxM|J5)OIpx?@G4flk`| z#E?ohjz|mE=zc89Dap!#V3g?dl-9;<{2g-&ikN5+1`!(+kTz!PqES;Ku41UPq?{^3 zFWw70xm$=Y>vsx+DgsThQ}^tW!EYrbLww`pQZgL(&|FTWn7uMLUS`MLuD?QaSQc;@ zT>?#S*cs}-xb1mNr@VlDBkZ8SgV?{Yb;9+l0CcL!n~tPu;n9nU zdpv!iYriG~k&so|x<@!CvDk{?+k$dk3pT%dEP6S0m?oqcUFJH^8}KoP$rqGmraQrX zT{d8vbKhTEl@~m`ay!`L3bYWL7%C)D7AKg2ttf}W2|8GtN<#=5!_h}i%RPu(Fj7yY zvx0}pZxGg{7C-SviX60I1BaJjRnjUe9SIT>AEcUs7c=%mKkXWz5cG!m)q-V#R&))A zIyvP&&DKX_Oyw73-EVBoq=oBQ3B=6N8e}JPIl_)+Ut({eYHXay%NZ2xt>r|D+gCD) zfMo~)XiH{)W`miqY)q(q@{q0OmpJ#l<1TahM8}H72)(!?=c)d8fevd?GQ8ipw#68! zyL7w|X8NxXTXw3dm5tHY@J($cXJHGp>=`v>L|xM{%H*_Ki1T1zN0O0?OVE`2nX^1e zm2)!oF7E{%G0ucIyM?&RC0gH>xJN8f%sxwk&+rtGP8ua64?3pDIa>vL3!>t&0GxF| z*~{K&9=1?11-#GLgHeh=#Ymdo2o`C}lD=|pr9)$t{4P`rR){Snig?F}nxCxpIbg>> zy2nv#qd)(1@?ec>67UK~hRMh!d@`HS(+_1=W!IEIdWtl>-$7j`a-5t|OG!MGRLpDs zsM$p~saMe%NQ5nt?*PDL_Fo*$kdY=sMjLD4Pb6`IBg(^zBY!S>{4>6@Od@t&M^<}M zkjj(q1fkn4)c#%DV00%uqCAQ0!1)_x z=2~SooJXX*$59!KUWUh|4l9WbR>^Qo@2 z4Oys#xVB(K*>b;zXfoW?Sxo-o30Kr&%&7JKh-i2~^4|%cv6`t_zW*R7?h7mPz%heu2>(gACvzn9I{7e@CboPACSSP*`!*!pGU9y-sX z1uzFkPu>4loPG$axn=`P7V$S$$(NR%3?<%NdV7}e1q24%YgFQFMwNpTU_Y&q#Zxr0 zV$c*H-Xd^L%R;ybF0jXfh+y9Ol-|-+?I5EdM2B;ON@w3g$*?`*sl^jk`ztdSYN~KJ zR+jYCu>@bjYW%ft^d$+}(YJ(KnI;P(xW7Wbl`h(Jv~~O1M@!-I4QiC!<#C@s^^RpI zNSjaf$*9s6^X7LDiFpl(gU&WUMNzq=Sh8oz7DE>wn^o4nt4xg+W`Vt0VA!sdC@xww z4=c~?mN4YCmlLlYPdsj=o12~$1Oyz5`rr9Fhu7KdbS`V-U%ui*Qz-$_BHCVznc<>^ z@I`)OK>Gl1=3d`434&F|4DxFLsfV8u6z6P|S$J2=x2&#Rf~HuKYi$7cubFrmJXXi%4Y?y z$v*9={@J6_*&SM(=wizKBxmU#scuWSoo29CHzg$zXRVdOqzNSwV135VYsF>HG)}Ty z+i)B(%a+K~{s@fODGMf!E=CWxXu1k!)t`;n-oxA&o`3%C6k^Ra3{GpTU4W>Z+hdP5 zu-zu^*VZ+<(K4$5Y9&tPgG|gv@X9eAX73+IEqYZN@c1vvX*uN8r$!I!THHCdMUdug#dfsyk zhVMTrufW40L6MH=2@Z`6a4*+JWDcGT96Yn2fx?a+xGj2CHU&GBvoSPgC*pvbC#Bbm z^uX$~Fm;t0;R=5^S^c7#0f&W(BxD;iN=w-m1wcok0TO2t1_h|eaH>z@vYaz`|~BA5__Z_QdGGa zZ*E99$}48l(kr~jczN;XDP^MymT)MY$m64ChJFH8tn%v0eT_u*sdRod3RWb>P9h#* zdIqbXQA1^7;R82iQWp%VSO6(lp^vc0re0Ai^%ovE=Q7l?=8ZT9G-Hy-brnxbv`b5b zEI@2p)CeAMQj&9-0BEeurdu!z@ud_`iu2R1S%<=QLI#1NVg@Hk-d4|y4xpT&Kf?#9 z8+59Axup=s3=rC)6hhAFE5VT%sfe-X#rG1j#IjbNl>k2o3Evo>IwK!~(O#h)o3p?Bozj_}%Av__bmQ+b(17Nqr-;m)@~D?`YqH+* zxEC&`-RhU}x1hu1F1+muv>+D^%M*8h>)X>kGz1u! ze*tL9M~0-e75Exd$5@G;poY(m@p;O9P3(F8rFO|w8EgV+GYl7xbc8O^4m%53 z@Y(ll@9c1E{=Nua;|rQP$tQ_Su*0FdsxYyl2WJCCXh+4-%U?jE@-%klV2#WY3L-H$ zv2FLNJPZ@{zCk&60xTl7Sj=2`MwT4WgKmcvgWqnI0!ceYqd4H;`J+OhPboJEbef^x zEq|RHwSIjYQQ)pvHYUo5E1XB!(KVxQiWR^Ra(7H$a4Hd}r7kjKxrCR{R){KJO@+T4 zb9;XYkM42M3x<-jUOM2R$7NKm!!TrJ!9&Uj)0<%tQ#IG5MJYPQ3TFq;fY;xM~LYT(0#{~lmdFR_wX6{76tdKJlG+-yKrrlH2 z563*LK3(pZLuc@z2`~+KYiqTw17Ya5Bd6CjWxO)`FqV zeSr$z8*pgxfLDzwxjEwLrfLM!#GAS4$p}1nV#)1^Hx94Ku0~MeXRA(L!W(oD>)&uM z66Zu!TPgBj21H2(s}2^n_=9dGTT)8}_O^t_BXw;t3*3JStLQm7XhQrASK2YkA)9a_ zamH4GH}f;e0|s`;X8UW$uej-#;9_aSSBd1XzNGTph!p+bYch;jKSaWT)fI@2!U{?R zX9-N7EJFvJe?bJPEc`=x|6&I=OX zW>loJH4?mK;Jj7mg(%3EZ%R&5;T2b|VQ-~Zw6HZYni}zg^e478>&2X=PD@!%5HUTD z8L@yV_R%Pd*dxRojcQJ(6@#t_Nj$Dt=$P$dovnWih_kb1WOmJz?Dh3C$lWUSSzs_i zFdBlfBUz%!f8hX?t|1@&U>G0Qf2HKCLO}ru%*N#mwoqd%_+?;4De{|{D>?h0qSiWD z!|ks2rWde76KAMHC6TP*m=ciUrX<2Sp(uaC{bMMRanYuvpw@fG=5pxJ<&reKh}BU3 zf%b5VuM*y=XNrY+0gI3EHg1h+v?9ZG_vylyx8U_JpOQ0-c8lK!NmpBnPmT<_B?k6I$!Gr=Yi( z;TH}1Dv*&=PITy=4neA}l@4HNaDtf9;P9+W93xy}eag;rG&_1YTY-*rPMq1T zk0r`>b6$DUtWKVI;wUq(0| zR-^JO6nf-T%4wh6;)D#Qsn4S!pq{#nE+S1TVQu%`=|k?@erh(CZ+F`1<8<7DuqKRZ zy`3Byi24%i6FS+4haQZAPP`_Idykf@j)43`F^*LBJB`W?#dxeZ-+5hjoYRO8kpu7& z$}AOhnI>>n>TtKixqS-`n)A#Uas6t)a7mp~cmyoe^D#5d8?>{Vt~d+mbMIYea_uG- z*M3i%u6T5D;b66M_!K@5&IMQm;Kg7usTd~W4N=_@q?T0a}{X$vPMX<0?$7;_H9;DEjxvSgOMOqr}`jd2l4 zYaPE3&=}yIAjENiF z)cG~J4tkuXt}XL=2_9r2S^!wU3uRqaQu$9UxPPZ{jEp=9Y61?hjBjUmlbn?)MdxA& z42m_P%~|{Q%H}S=jkRhcZ+ZNc8TM%+R;5GbDepSZ_0&^$RbRJKIuU=^DDDL?u2W6# z!94BZKBU;1ert-FFtN-_r&ThSGor7eFx1woXfKuk46eGA6m9Uc&gl$)5o3p#l7mBlI#u8fYvr zyt`4L--vwlO}-ITVwN!hRY~y`TjeNS*|GlWidoZ;ytCZdjE=K$gAbg9lc(=^W0oM{ zFKq0P0_N^%Lq6CDp*pTEU`Uu;6y&QY4#(?e>gx;SIpug*A*lN3b?EXmdr0tE0a??2 zi1`re?n8mC?b1WNJnS7rEJJb*#7V>YJ`O8H#=S%$>kVI672>NC-6ria1?+&N(M~(f zo#t2HkUsJQcUS|ue3Ais6X)}A*;h&bUFF8~sv@g4p1c_npdq#+^U%9xA+JdR9Z=_t(8xA!*s$gfO zCld67F@Z`HDV$r0R+|;Zvp`@U^Y51I8sg5YblI~m@ zSD0Jh)Mamllv24nc-7`iI<9O${#_MO6vnP+_fJ1PXDL5lCQoWD%2_Fa_SE8l4GT}9V?xCH}EWE znphaB)$Ap^u8F=D-NM$&=FMq$H4H{167cd5xG^=}}KC8>eOeDN$b+h}w>w zs29z@qO-;ak+1^STjtYusJ0`@cfdM7&ZTIx&<<^U1nr#|tj2WBvN6u^6fgA%8B?WG zPAfrQ${kCd1D;jXCM8COBH=(QOPrn$&^H{{?3i>_)$%mwUt+c%u_^M04!mQ*9Pay} z-@p9Hj5HL~bTeekMLT&~s7CHyry%J~J;fimb;Q^x77eUf!hF>!OfSG|7XwEQ~N<`cUKdH2Qm?cGIc! z>K%ypG*C!MN52FT$oOlB;`O+6vl-I1hI%kY-1^LiuF_Kz)tXMLlZqBzXP?r92Y|S#uFGf`1 zFs;d++#%y@(eeo5;|hWr!=U@;1VEc=Itn%IEUWPw$b7xV$lJY@HS@5=tNIbO@;P1w z=qF=Y1Du~rW&44dyg*yRd@w>~SPxoWR{5x!bP#kG@Bp?~g5fQy*$KxXE~>@8F8k(F z%w^f;p{%UGpfD|fm%A5lX#dn$fwJ@v2S%ni?q}yKsMF<29)bQ;dqgf#l-DBRY!iyC zr<6@3>c}N#At${8z?!qtocBVN20p;u+)i@}8G&3I$ei1qb}dz9q@LUO2UjetV|{JlR!N*9rE+o z`^x9@xcQPuMB;=uc*YGT?{wx}&gs4P)e?$T#L<;wyF6^q>Jx~SE{Y7>;H`^q&-%leF*85toN6BNre$db=e zwKV!$K&ogMOG_`)7KVmbh(%g^`)#211Iq;mxiks$7zen?AqOUpzo_L!HV4w1R@T{M zBP8U;Z?1N-swH=$TnXZph!M-`qf+eZ$`|TuvZ?_t%hDelHSY#q^T)0j*H2tr+FdDl zxmzUOTm(-|ec4_qQ?8D3KEFFOtZP~sY{!3m!OkM`=)^GMgMfS#1N|G)S586%+n&}#I7r5qU>!|UQaZkOQmv*Ac|{3PeCl4+c2+<21>>>tRkfm*?!vJY4J3ZJqGX;?X^!jvSp` z4gn?+wSTr&9BKNmcziZ>J2G%{oai}SA&%EgWjd1EYvy)++J2-PeR{iAUgIQUAuy6{ zavQx}bB3=ZUjDqKsOHM_2Lyl&^#}XAB}IR^&V}*+*17!O2Oj_Yz~e91xiJ2Ioy(!t zLS(iCGO*6Ybc)AdJEBE(igi!TEW`Lx&qR4%1&boZ(t_rz)!hX)bQ|KVl9P-hMT}e1 zeSZxn~cg7xf`<5D*ftvkMm>xN2IxwjN?ZqjinU~ zv$p=CUwVLf5k)Bgs=k9Zw@wzd1{{XoTca!eKpobPD>*kF&kHk8vA(QD@A?r|R{kh4 z(H5_watwp;vHr&1-O@-0eM+WHd&OSGMU}faF8?F-T@}b)#jU5K<>q!?_z|^$XRFM- zK1=8};9Yd*QEk5P48U-6OXeL=Q=;Eq1OON%!JzrUb_>Bx2U146JoNS}YRucrd@EnH zwk_=ruRZ2gquCJl%UwNLStL_ZE9QCV$}dCuHmS#QigViL*_*y4YA0#Qm46R%oRMsH z3q;|5dK11>zT(AuE7aOnN3Vk}_<6eLa?k8CH~0duE`pm<*^wKwYIwFT;zy9;Z&kZ5 zq?>QSLzP>hNhdRMd$ukDdoy^-86R>cew+u{cO}45u84TP>_M?;SkCs4vEuc>tF^hm zq1w=($w9>?lVTCsKban&VuCfg@1Zeu2%31e4@Oo&3U8oMyMJ~uv7~V&`o%FJjTWXW z#-8J1wL1(i?0%OV6=CHPlKmJaQ{iA33$QK{>MC$8^rN@m0ma$CT-)E&Lu)F>V`G3& zZFD->99?LkYoVlUHiw=3Hnu&qC&$vL(fFG7tBv-?CZ9G=o2ppawUT?H=UY3~F8J!`29+<(=m(k$I>D5#o0-yGqYLXDI zRwEznxz#(|cR2I8JVa%AJF=!#RUm1i{}a9(S{p& zwQa1?-eDL^dW~VIJ?<&berOsHjVz-A59IC;O636SfjN9a=HbhfH^guI#*P{O~VfmhL>4@fbsB z(w85Vj3Ilk0*O^^V~5)YJ7#C*Q{?t8=_Yd3jo>qP-)WI-n(ag0eLTd6ao}y~a-AYc zy`p!%AHwB!4sWmLW~2XzDLmO`k$IgruX%{6QWf^4*1m=L+MqMD>Eg7FVyJSHHVX5{ zsF*5o)+kmKkLx+N>DaOM!>ACELDYcWn)|B};?7xjF#vqw<>xk>`owwY_-L+Q$LvvB z^`$GgY`uA5xwvTs7n2(me8-#gs;qK8t%fI^amIH->)kU}HV44UJ}owXRB*YygilG3 zoH*Em4rMmu7HzoW;2`%ns>2_tEBR>{+~Hb>W2pRafsyeb;#j5T$8V&TcIV}#v*|iy zqI0c()vm*_{y>w?+en9gr`CEss)=XZn8Ae;E@w;!Fz1z=gaf*9ziBI(^pKgI7mR#C zG`MO#QL`Y~6YaH{gmq@_IY_e7&$|;j$6Q5thnjQaN%YtvUeRX=3q#<`x_QG>arVKU zemljTb0w9FZKmUuQ@C2eB%z7F;t`>B7JL7#k;pW5Wc4uz7y>=p@u@$3+iq7!GgK2W zxaOhR)Q~7X{|=d^?FwhoP<|O7zd1LzXE1R^dfhW8WIT4%*>h}lC+X1cjIu`^k5({M z@MX3@v1Tw1ZW0kZAowD$v+nWh@s20!2;O2;zKTw>-#8MrE%VWig+cT3{+^kk4{^4Y zuN22xT+X57M60F42Em8cltXmskez6ir337yJ9qvh`Y~H!}#C{?0YH{Xj?p$#I8A_oLB4BkQ6puKHC_I)QpltEcmYBvI19IO=yNBA{j;Hwgp zIuQ(KDpK?X)qen%z3rO&FN0-ScFf2$!zFR&gg_4Z$*jf|KZS(PhI8i=yot;WEky%U zm$M`U*$Ri#3q~ZeD%;?V9q(@SN|I|UOd^K0=$U+OVjiy%G)yd}Ve zh!W;GOag0cc^p<>D53-W;?VqPQ8DcrIlO+6+_X4;7-|6MGvUFWWVJvQ91g+|I)SmX z)TvVBME{v$_`^FA*^3H~H$>fDwH*~j3^w9a^qBxUz!7PPgBFD+lCM8v@r8sV^0(qb zjz~qI7$nQ^hv~ix4P1@^l#T_AZ#lt)4G!>yIvzK9M58awcfda`f!zWIuyOGd-lbQ% z+!rnxZKDZc?X1BSUCE?`YBIc)A$Sn$$$~`EFG*1E>8+G^cwxmBvimN58S!qEpEf10 zsbrM(gbX5>{Rcrd7*FUmrcl7=!EVOLH!lR)C9-HMz!NA;2Q=%;oGK$FP45dWH*XRA z+1|xT#X2?Mn(84Jo4Lt}?FAs)3=O~}6TwkS*HS6X(qiEriGBn40*8Hee|f|z59hpc z{wWCU-@dlrJ`2zxnI6cZy|VSIn&k*X&;UdO0T{qbNr2IK5W362 zICZ`2``zU89&dt?S&MkysMkHh2ezx`5p1nBrxHKYgB4Rnr~uezKRM;J`EY88L0Pa$ zx|}6|=$x=cwl2JKu&hYp(_+W3V$14IEUq()@Y zC|OFq07Y474=^Lc=LeG<2N(>U76??{47En@-Y%JR$%?i0%A?%s9#3YMP{aIg-unss<`2AIo2B_;F1YR2xLVYE51gZxp z9||0Zv6ZFG>G4CUw^;r}+TV>sTsb#KB=v8Q_XvcdqLj9f+WGTHB(FDYu zUc+RWOo&vVJX(^p0jaW1S{EoM*oob|HI*kGlGa|*W%~3$iji)157i`5DPPH9yFxm2 zZt(0~lB!fP>J;a+`z<5b1~e5uk-lj5yP`z^@YTtQj2!Pnu(JJOFzZ1A89s z!(lk7cz|o=Ozo(qUMf{3N|*LzFKF>^DQU~(&FF7PIq=Bd(e(s!Pv9rApOI9dIm}

?aAk3g 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%0AGq`rTjZPg2knJv4#4-*O_l& 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%0DpqTtaBGKh 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%0D5=-K`U81HsFKz#e=jdSV; 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%0A6h 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

*zDfaJ4y}M^ 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.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%0DpK7$tV+w|4tH&#xhdXb(WVFknqR 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ΞokNIbPE}2U>F2#&lm+u3AsU2X3`Jwc1 z4Yf4E+~Nm9$X;vQ#ugk*j6YnAimNdBeyVgqtnrt}X|-ns&+bh*Ox{s9&AMQ0OCMDe zj3(hy(#!8^(&8ptwgVRKig*WL-iJ6n6}e}evxQ$iTz%s@FcuTp8V{`tSJ*ppu`AHb zMP{LOSUQ`Q${^a?|0gSvjBoCz(f-rgM%@<8+TMxSPcuZ8`TlfBOQGvcda*w z{rIG`zGzbMk)^YX2bsmLPuzn)=qFa&j*v$BPgcH8t-TQ@u?AeTcTXl&KM!6HGe}V- z2MFXWUS#Ci^%9tT-8jcX+SAIN=SW;6{xlBHXOC04>y55YSH6mMKJm1bKmUt1v#jw& z4(7ljnH@f@W%?hs zqq2vQG_ri4sQSKg+?YVav|xRCOhldPIlnn6GHk>=AK$a3bwsQ&_w`d-UQV{mbjcWF zzX%mp``|fPiet>R3EI3%t;BnL{jUGZ*`a(p-)aGB!H(T&W%3TDHD%1++q^)}pZQs_ zuzNkH`Mq9lKS5o+Bm8rA0)Iz5Am^ZZB;zq|jfpg?1CnNPds6yodXec+_OFJw-D}P> z>jE!23taqTTsOnx=b)Ncl%j>+2KkyNYMSp;X(n|J56mXMBoT~*^VZ}>E48SSFN}%q z28N3TUx!QA=3)HywyL#SuYpV6*8*bKLDjyhfCF8Y+dpo8FE@A6wk~NkgRNse`TUn9 zt}MZS*WQy0nqWGp6?9LVX!**$qx23q7qyU~C=;n_E5!QPQz}FI!EkK+Y;4cZ zhq=}Iij_WLI3Z`n@-DeGu+9Mxb3UT!uvZGGO02*5=Hdmd=dPPOrmHFTxjYa1y>S(` zW5M;+{ee&Z`y8iCLzVM^hP#qJrR%MCyG-O%2YXVXB-Wm$rPOJXnBfpXm{qaqJgfTB^SXzfs~Mb_AyPOj}>K z|FBqHvH5e4+!NtD=vBb}=E%)y+h$@(Z-RZaqeeEFuiOL$` z`(yKk3$0Fp94ntf?%?#A)CsOky5aXssh2~D*IzwYI^duKL3UkO?5&nh8~KK$tYq=c zD|0uU2qKP}AgWM9FTE=Ed|Ud&KJmiBT;IE&>UW$oHrq(Gdz>TlwDf)nn!TvnHlR9^ zC=Pg&(wE1ug~_S>7bns48g8RhQXH9OP0q|*_8B()Y$>d6F`TCXj!t45BiQEB*gRG> zT1|S|bhwG@cY2x^ocBdZ(i|KQc9U-V5DIzb@|ysg35F3e7Eg04AyHGh;dO~a_4|B#iq8jGx%^V8UVRI4=G2{r?Q^{16m&- z7*3%vg-7byb>V}aH7ilC#obNz1iL)`qBOQKTV8JE>*vz*2E9759v&qfpA2<|Q02l? z(VbyUO)!F6UDgNYIDhjxq+GlF2aMD6;6WxyC5d%$^ba(0e?CeCz4>qR|2_yk{-_UB zFRI|r&xhTgkX|+cdCxVdTL z|K-wuDE%)8{4X~D<03V3wMfA4l1K+Xx@%M&>Zy!EPJo`UwFXM!B zFRWZ!cDnDVdgAp+C7|-7}Q_WDyDob(*UZ0U2KvVHBl`_ zQlwjdZL4+qcxsiZArUa^d<7~btF`{J2ni1_R7hqjH2^V{YgdHr&sG%5#E_QiH_+M6 zmWM8a>YLhK$h*Z)bd^JeqiXgW8VGkmEZTfzoMr0TlZ@gqZV8f|3_XzR)diKC?fNr1X?|?3u6kaVc7OaDlF5n zv%7iCFX|S(FO z8IFxu?TGS!x<$K2tn@zKU!SgbBY%~Zg>CePdtB_kH#0NCB_oS!X%Xlf9HjpA2`M5X z!sFqFGa(`2WNQddfE=5Kp1zj@^XYiYI5^|AGsScL?@BahvFAvReUi)9yT=bt1Q%=P z`{@s}uF}x5c9)X#HILGBg|&MTfYcUgnxZLrH19yhtGhOGnF9#CT74}u&jDz(fNk<= zDxj6mZwBMV2dWG<_$2QH8@0=_)MIv139{(5Dw9rL zjC~Hc>C(VX;R4(&D~GZXMdcSSg_oN1-HG56t=pA;=Z&iNP^KlI_BQ!C^ae+YKzDl= zBo)9l7XW>5&p;s$kngvYZS3KCOy<5?C zY7H+c^Hf@+`oudYp@%r7*Mqv*sD{3V`~6?>>0dKD64!&`Uo${ z`SA#A#<2;L2WudOObn*4$YW4TH}Nwh*>T=~LtJ9dY&5;x4?ng~)?hYRVeEq>X7aa~ zAi-6+5LyM%^v$W%O-4&8AJrfjKV z5Z<~mtm}g5c4aDzx+<;)32mh{`tTzzR=gmrn-v?1Woq}4rGZjg(bqzKZOj%_1$=+` zj;g|IJ`O9xd?59Rx~7)0e7Y=mW>ecWsHSq*t@A|~PN*-3A@pxA zL-04NQ6#}B-T;IUj0Crz6_J}_N*;ABF$IDW-vEAvvfgwl6L}LD`dj_JbSY=D6|^@Q z7`)w79nbBP)EmCN%&Uj`&3U5Vx*Tn!ITzb~46P{yRcB_;3aUUA4}^$FJ1Vz%npZ;} z!+p*&B2{O#LPSP6E3GZ?JqkpBu(ijZ{dGd9Q4`CKEa7nSNfQff%8M5;rki$+u4fshYGn}m|L+3)OI-6_h3>HZ{a zbB5^f~Qp+tI zHP(Q~ZpyP~l)&_vruBsEpXE*~@^!rG!!A;@nr-%iv*!A-T$7e7C3j-=zdBZkNRBK@ zNA@Ybt=`qNWv!|BivvbVlXs3+FtzC_TQ)186=s&Dz1i8Kg-_Qa}!48ifrF_t6C)1uXfD0xpO+jmR%#2F;ESsj@|yU1XhcZ54EkKIXhaZQmM zTu|xbv80`G#iJ%w2BHIn24N5wUkBZx#Gry>_+ZQ!lecG8MS7oyD#IJjGIq`QBT9N% z!^_0ps9tC2vvj8PsL$JLokC_N4V?T0Evh@qZ4N1IjZo*DVY&85_T{C50%G!>e4-uf z`~*e760zbpg9=ImXY%X8(v8SW1CtRXX212OM$zJL488yZ6m4bWnMtcba%r~=_j1@W zf}*6UpW|06umPj9+Qmzwo$B+621lGZ2SzVL`<@^jS=FR8nEUNS)fSIsyh#aA!l3FJ z+g^BM{mPAK#rN{Oai(&pN}X9gZp1wg=W>J58N1#lAo8zH`3_%Nvxr z`DN`D`I7j(eUJQHR2Zblvsn?AV-blK#`-fr@yK}8T%7qUH$NhH)WSMs!2Vi#KCuPr zgYLNs+0f$36158UkH0ri^mF-Xvq3Td!c`iJ_`n;juxg&TkrpX7Byz?jTW0IkdC&Nx z)`R)oie~^XR@Xf^d_0`GatxL-1RG50Nc_n<2DMj55k+3R8#FOg8w5rznvS4aEO4{Y z3x2=Fe!^C97nt=NFDw=qcGglfi$6oJG%s8%81#>tR5;iVxix?qm#fR4ld~CX#Z_?{ z<~Vv1R94U_fL$iDdbu!AjyvM1jdj4{{1p4stm8RSq7aze@YQaD8rRh=dH< zEOMj4aPPB$$Vx*JdpZ~cg0qIxzDuFi9qVxuGOasgWjY=wJ}fw%xwH=X$a z2GLB){`cjoXcjig{61yc)sih&u^W12RyIQv_QHqY(8<+r@)wQEFM?cVA(^}q8V zISgHq-d*{!uV_F+M~_~MsQcz0BTOFTBzqaTMGHZHVy#`i+eAPV&5j5AtI0;<@4M!v zs6AaWLJ1ls6RK*nf*B)x_XIL_wL!83ub;N+(<3YwhZk=QQpc#iS7j1Vo(~fq=}aBJ za{!^KGo`j@yPK5dwRS6)|C`xwJCwf`_MZQkuJu&n8(R#gY1{^Ox$dddU4HlHvLvddE-|5&r$|PoS@gIp%rYXqX?nV+hfhv=nauzrv=Tx zO><$wf6|ZB{M^c7Ib9>+ z70Fd^TH1o>~*5*vly$&SVa{yRn`0_SE*Smke8^Z;vpu-;Zp1{ z;~csfF?)!^ac2=`RB;R7_A87N;y!Xo(Ld77@-ED z4X!^KH|f-nb;N6p+XP;%iJ)Di#Ymk)SQUwoYXYmz&W19N4_=35 zNjl8wv!SA8!H7rH7itIIWZtUp6b8!TtMEEbJ-ICzpfVO#5`sbUr9ld@JO_S-#KmDP zRaA8r&650Ba*ib7eyYCX$$S}3E6S^Tw=|`{DxC_hem|(RP0a~dt9Z%WPKjEAm}i9m zqJla!*H&#USQzljbanfV$ydcq<-rR3xydmpMGv8g3j=Qtw^PRKJSk_gA1#pQufX~q zNeF-8I6LXc{lrV?Ytb@$7^$xdBzWmc&UJ2L&qmcy9)i%Ozt!A~typZ}8b)qoetPvd zV(l>aVP^87x?Wjd8-1rvla^@(T{HVi^PN>(_Hc(3Phko*v#Ka{-&kkv~A=XNP*s_ir_dw8+&(mnsp)@&q1$p?Yt$M9z8J(daze z9{ydMytIuB&|tH!Y&=H^;w`;X$JCv?JfW=yGS2OT$j@N9f2UA~<8AE%C~=PewYH#F z#kZn0_{L3|lu+Pp_A`yelH^WfPBM>`-@6=tX=1A5O7M83ozr35^Evlp@>|3}2pZ+= zo;!}TcN*yb@NC>pMq^D-N}ng#G9oKj6P5G@&tUBT{JpcekLAp-t)9+$@oue7`gpfA z`MXUmSSR=K`y|Fn^@*6dEC0wE&=WhxJhC*8<><=A<*JMuTnU%#{d-WK>?OhN6+*^j zV7$I8tk{4(o>|e|f=C>PS%Uxt96Z57xgw+Z;q$Qa5JlxW^0+ zL&r*T*f#4-&g9o|Il-$SZLVYF4J(8Ks+Hh+5d>V*sBOTMq-8I|7Z!}->m?{htWcJ9gp zQ>XDXb*OCsE-JV2G0d4iC%&C3fE!@+wtIqW9@jSu^bE12!6(fdLacxI(EMYnYYMA> zRh%)M$9}rC%q? z_R*evDMHQv~cST zy^P%a?ooiffX7>F)*E+UZIMlxI09&OF6$N?S1xHzH(pH%OeP$>QQ&ShZl5oX?agE7 zuH_tPDEI0uGVJJOFfD}+mDe-H9@b+@{3Ah3!oY>fT+I{x+O6bF#`&OflGKfEwI?%Bb< zj5u)NSuASWI4m7zgbG&VC7bu%v#rF4QKaPPf2hDh1n>E7bMmA5n<`iUxNkwWD z`v?!KbY)s+a)DVgZKuoQo${!Zl1gsvgCWQv zu6^1~3{RU^V_D%;;g@680;OX^A8j=2@-FVanC7X)aCm>3)iV1O${x?T&kaketMY{f zMfD2DoEsspak-*^qH)b;$YVa}m$g%q48X=9Jbub&ADhwm>$&zH$h_UUyZH}~^o0ly zH^iB(qc(&d%%5c)`MIMX3(Cej_ESo1g?FS#3tbT`$}?xUaP^iT+e=u;kkorI_7e5o zY@5-Twx;%IPx&Y{hbH_I+%;8VXJsYZOCC%IwtR?OZ~)&4S>*)JQ6a9;3U4Wwx4Fl`zyo_El$^SdRBZhx zRO}mGht$8NvY)KL^A4b0kbH?aj07V!-$*EQsC)iv!<9S}PO>Y7c9y0u4jBj>ef4UA z`>7y)h@ux%Q+fS5Re1J6PO!7X=ZS4rtEP`7S#P}ef@79jRqZC|oW=41;CnXW%!*Bn z4tytQEta;iO3B=c=`2~EkiU0zqj6bj-XZ?{i}swbI<=eovFaz3D_J1}zD2b~rX##| zS|BrU?^HP#H=t;PF?F@AF@0=Rnn}sCnU-L2XU{Pt>O120X39tjq+a5Ia=*Cv_p9xY z)vc=zWFaQneO6D=n6$3N#_6cq7dG|!p43DOo85|fR-ZYe5?V8bFUkdTys9Nj>phTI zd1#+e@TT)Nt+Yp(4bful&Gt516LP(PTDT}&(-KKqiAfFVylG2%kQOw0{|Tj6WU^4Q zxJ~zvWQc%;h!M@P!oKX1{wPVL1Y!Ws&Zx<-N(XP}qg$Z?fewBs_NGEg9kP=_44M7d z_%&!h8lbRQ{sW&ZXGB-_klG0E%7+RM5Ti4zPf#U!N{{h~Svl5^bH8W1O4?ounhbtV zN;W<3gCW$LojnSWe+9|6(xCFgXcp~@K|2H!ix#&zlT|$oCJ*qi8doIPhg?*Qr#Dj6 zMo)#cW_kter5CFdrm@;e4I9bDVUD?buguYRYl3LtJt`gk{>LcP7LNOpVS7H2CJjnx zJE{-I2X$xYdS?2!HkGcxBrfmlfr@NyZA8<{Uov@%sVVgPx?W|dld2;DE1b%0k9<)9 zhH~w4m)}vn^yq}0_2GCwYlH(x<2_xedFFi>K{pM@mw*aVX%CzuZV92dpHc*Cl`aPA z-DHLl!wdev9=KPX(qOgsB~6HopX5zR-}DCneB`EMoj ztZjnwtD=6rZctEGb)R@+vYNQMQ3peN(h7aZlZj`~;d3=}?<9GAp{7b1Nny++(uKRk zKGMyxXQAh#ti_#=y+F*T&x2PZ>R+rb^?tw(wb850jkk7G{Hx;^N@`o>MbB5*;tDuLOe2UQ_bBEc>^rwy&%ASV zXQ%-OKD()BA_F{!(^ffg_9Db4Y-BcP={xi7q4B2W<5}D1#j#WSonmE%J(>`y?&f8M zN9@pFVyTzH_--(BzwjP=?eN^d6Mt$zuH~4@e&Twr>An%Ej#NxtoLV#EPVsPW-1YdK zx)BwVEN3uW!QSOX1D&ni%;Gr2&7a&vtzeTiX~jvfVFG zS({!{yJu*!_S2M9j%#1@Breaufbq5wb0g07C5@WpeVT;2VUb>kxvW@TXtxdn7%z-- z8k#$JnGp{6N8%;p?D@jvhaX+Ayq?PQ`K_}slCa3S zdM6o{QQeu@G8KDK*RsTVi7UT-883^~u#8<@#mB#nBBfCbg^Fw)_YQ)yc^+?as~tm~ zgbA@uZ~*xeAG5H0jl&nzp|~h`2vcCD&`nOYR#B8}?wdm8-tnD$x#`qRk{JU%lgv!5 zH9Uv?ftzHlHP5}vlj#9LJ567WH1`|*?U*TB<^w@Wk@_tJJy7Tk^xSl&uxVrO%{9cfogZ6E#70(tI-UuH?@TuQ%c~r+B<=#xj{{Afi4Q zhN|72GM87;nFfYR2PYq_yFiz&`0c%pG6I^^#}6wpoDsRJtYm-wRFRHMO!SB6i{1KJ z%tBCJC~6g=SP?0z5UlRAqFf7Xe?K(ei=iZ0(W()8VFJkDeX%k|QqFcQ&>E-Jz;h%g zaw`hN$)X)^OF3*y8#KSh1Y2#(Ml7bbHe|2!?y7 zc!|Nl2UO;$kDa+@4n?2mgLI1T#|bV_z}jS?K(A~M>g0Sef~A#4i-b&+=5OV82NNAw zhPXPnOCro1D>mJ4bUJ5D$+z7}Y0k(9SymEbyg#|EqBX?^=yqp=A;V!BOKqR5)3s&bV|b69n%f6q3iU?n{I@(+y*%T3a<1bU z`>Z&bh+RI<482R5u2G&2KbMLZVo% zP&ze3*=Iq2jeP6-) zo#k|wu&6-%Qt6057E-5_yA4Cm)bEApmAGBL)W_LQ5Pfq%=Y8=Snkmjqi zTm~6xic`s1_=BSI7nckxDi#xh({hXzb=KJo&05Lz=p*nQwc>TEzJaT8+DZp4fynk? zRn8i>94m#ZZcm&Q@toO|*}|I^&^>0haSCR^`;sH1Q7lfPVl)MDO+)hg%Owu%@YHf` zhDx;q6=%G7OFS0zc)nC0oL&+l9Ob7%8lH(koqis6&gYpG~cwTjC*Qo$&Run`XMoOt{hU zMm+vQ@{vi-4UU~IuewRlChQTa`o#;%bYNl~x{Msm%yNwfjfR>C#nb^O!y(T>wqM2J zhZzPJUba8nlIhetO1nBW7q7_1&P@2ai+1m(vZ#@MZvvunU22ogOY?H+M}x5p_Tal4 z8p9>I<6a#xJV0Bley3~a5)HqU+cf&l4L44NLZe^r?|UOrVOWJv*qOQ}vxbr^>nEsw zw+NH^G=-juY-yWFf{)m?s0SdXne6gJDwF{x&`*#&RiW%|;~R4~5?AR@!m8ndD6+#Y z-rt&Tao+I0Vufdk37hZxh!9crmdM`cRrrzhtIuBy)wL|PUB12UNYd033-4K+XSwDJ z=fjd=R$Xx>mn#`oZ&NvY$5Fo5i8(oYdQ7Y1Xso`qVLK#^z$_+p zSv((6(UUB%`I9rTqAku4WNH9{H)uETpL>XL^uF&*bq=B0z#Jjn_asnf+*am;c<=gM zn_tZm`{h#Qs)-e^1#wd}tjH+Wj$>LUB=q9!b)J?P+^bdISKaK5{jl|&6wH{g_%1qp z?G$@Po%JauZLv(I{i&YiJM;DE662Gcj(C{QVEKJ)QsQ1XOVx$&7X&Ji;!mNtw&!hKU6_zveUv#_sy9RRRbyPUTE;<{dg@82&bGY_wWH@!>e(IB=EG- z9~;Bwk=sV(sHQjW!q7Rvz?)np`_oSx*C}Mh`L>5LRToW1Wrql`>J0_i!qkLg!Irw; z&lGci6ZpJ%4@nBw%v?6)g+vLmWk1tvhzILtK3L>X59jl8?kcA{AD>2|Z z4V)Zb8VO0_3nuXwBqWsg=w`17aEH``qzRhY$c?GKOIAu3It_CkV=SABiQ6juSKice0{6k@-5qjbkN=8V0KTM{ngvq~5* z;9U1829$+a4Lr&7O_52-{GNClb=i+mU4kbF>ot7ZHn37%kB{+TC3Vd#bp2XyE8=9? zqMXo|^4{V909Qb$zs-va8_Z>!2%{5cEw8E#5smKR0j@{>p*4lbBUbr8)7%m<(Q=6U zP&*&Aj}dwD^@v?xkKp>Ih$u*ib;mJ7*6iPY!r7Enz#)-7|nvV9J&S0jL1gZX@MP+id~`p z#E@@{9*WFbhdl~ELg=HxYk|z5%h4W8k26KB&(H!%FGjtfvSoT2FbfIs);aojn`G z8iYu=uKt)VdF2|T$0MxP;5x#Cm1v6Tr<0^EjW&7KdryH^3^=*JQ7?2M7AB2Ez6|Ib z$22mr4v&zulbg6U85-ccbqiG_X#tjXv%t;yVID47v(maXxjGKYE!ek5c$ zw|G4?VXzD5NCphr;rH9ox?Vl6Dw0J0-iBI2Z)vW%Mp*Vv^hix7^zIRF_o87f<+cjP zwm?#&6bhVm7*=RcwuYnMw1(5!C^B<5-tm^7heu zx{xm_@|k4N;pb9CB~jEMx#1hFUxz`#JDRT@7X~;lu~R=r+V63k^K}T%^zVs^T0;q3 zAvp|dz~EMgG>4$op-1+&;YH@8l79Mb8?O5-diwEtXp;Rhu9;+Y25XiL@;{Fp{uz^H ze*n{dQK=?EgQcoE2U6WP?Iv8=FR@o5OJDN9%2Fyh&_5Wd}ggK*{s#Yr-bMh$j5%{UV@QaE0S$?_FqRi#p`j3b8q~qFGQ&I z{z5&4ac_coG{}g_5-I%Bx$u8qBJ9C38coUc_j+wYX%l78g_5-OM7u1Otsu2=GWI=TCf9R4FAL_Sri1OgNVa=YNU@$5*KpPnFGd=A z+sQQg$9nDE(E99QiP>tEqGfgLh@-7}?(n*Wp0XFFHXkWWkt3qYY{nkEuc&Bu>;H4A zVm!{+nz&GhDk}Agbb=lt)~UxTY*+UPv!MvIeIw&~*AAxN(IT z{=T@%1@$W^GUCMywINKR5^?2Y#eCG;Ay%Ae+TC$M{-bpn)^Ef#dza>erNjUOvSb0j zJkGGwL_2f8<~UWWC>T+tXN1>p7pitcZ1SOWL1~k&Zcdz=$AziBM-fYR3rG@q!1&9B zE3OZ$Yoban+VK*;?}2?;chMIAY9qB1gZl+qk=RdG%rj?K2Y5w0(>9*#eK7hC8YM{I z;YKy;m;5cQ@{M)zO~RpH#=s(VG0)vrLk@f@);6Da%@>uL1ul&VX}cO@pPhrw*0nca zNIJbt3T~`=UYSWP(WNr9V({^j8!SDTio7=B1)E$QO zqxjoA;4@Kwxo~&wro_@Y&v>lO-%QX^r=7*C?>28TXfYI~miYT;q0ktlVPd3z%=zT! z@&Qen_g$u+EUm8HhY(OpLv@(6G|{SSzIAzcWH+SFC(Y_K zN|k7b=der9LwO85ZICBtqEH79yJ5dKJPa^Bh5I-{BqxpQWm-Iv$S`}%;E73MRM1M;NJgXtlLsT#zKwjOaRlwg@au(&Co@3Bn-PNi^ z;naS=urDcBiwyIUlvYP?F3Pp<5KKGS5&Yp0%X>l)a#_7D5?YtdJ>VRUI(_6GqOgco zdWcID{v*u><{d<(lz2#1;16u9;t^oX7wO8SQN||KnuCigXW*e(K{8X&HSUy(5G^H-DAlC;aS?5 zH=5+FYG?7caW!J`k0kF&(aGgzkq^`}wQ^s>k*1B@LgW<@3Vxv&2e98JeXx)v@^Nyk zKB1}2c-g+JiUG~{VHDM&sbZ9WEJ?>kS}=dwu^3%D7DJlM+LiIw-|=0YR{bre{v7gr z$bjV=A~G(ZZghhOP4cq+Dp}S24DT`?z2O8&qPMI_FQkaK#YzEvzM36DvY|U_9myqf z0A_Q2NZWIg=6ZSyrTwuOSC2Qlfl7YhPP0!e%}TDa0lhDAt@Dy!+n}-tKCP-n9_d zh6$pcKl}<~Kf63^-0k`BHT&PHE$8q2h*qYE9?gzi`*t*o6O9qUjty0sxqVHu{d}UD z%MKJJx2&iP_B41gpdOucb+VW4E<)Gc(Y&*{qFG+i@7xB|zJQxS>x9?os8Mem4L!+A zif8AyQPcy9|4`~r;oYq+G<&^ME3)z@T(i$#=0?r1gNV4j zi>MV6cL=vn;RW7zB^$-62IT(Sv~uzN0LYOZg|v5t^k)QX@tV^a_`kI?@U&w{@5ndg z_;(-mhAV{H3ZVN~T$<=>0W{HTb{AiY7k#EB9T+t`UqidXBC z_15Q&8h#IPZc`V+_OhEY+0TV9Osi4aFN83Pw4R||%_#EeM*W^e>?0pyhapM5ymj4S z&Eq9mT0Y)>_-`!dqIJ{M)KcPXUc~4A>$xOgZ|K{Be4GAfYp<=k_Bv9xr|GF<+s|8@ z+)X^7^ShawoEAgNl-(`UdrZcsqs?1MIWvBXt@IrDL$gvm9+nl%ke;Pnhyk_LsY?SrC;-4ku^ zLjjch;sE&^VS5xd!oRV<30B`NWzlzs>lQyAtRcKK^g1{}(@ED#VJ~XkpaOeQJJ7yV zqggEvk><6FXf9nAzlma2cZ-(XE!qd#%7Z>-zT-7qtuBG^K58#7xIdq$+$aBJPSFGr zXeylKORXW4xJt9ltJUCD)*V|q1%dQg>XUxnb+<6>K%^4J=ixi}w-!R#b>^RB)tToY zo%sjFuBfChKgRm6jFbjt(T^9FNzfcmfpnr`jCLSG)D>C4p^IOx)q)4b4V z`DDP!rROGp@i&OGnGgZxbo&Te58bZvqBDxyX|PyTrJ6JWT1eBxIUMVL=KfL=Tggsx zEv~{WT=Spjcw}K*B?!#&s=_KJ{98+>;I!(pu2rY`rpLOOm>rRE<&Pctjd5=ATP)l1EpHKQooG3_Ei+Qk~jl){HS!^IbeK&yqV9%ic6`FZj*UXcyfvmXtyV3IK(MQ1;^8R-UbGb-XDP%7~bEkjolX-qk?dowT zxkh-0juy?>KMBpCxs+2hlj;7848$t0C_yc-1dgMW^CI%~tZLTRL1I-*4A6M_&(q*5 zs;0rG^)cCx_4AAgazmV@C|sNCYW@Ws@Jo5NUcol^NF0_)cT+mT(4vfe{OJ#p87X=i zkmB*$h}50$9uZRSBTmucJk_{sP=b5-zA!`YJ6>SD23dUviBvT~XA%C3bo}(2bo``o zAS<@M2Fw;fLoR`2*`7*0RuxzYjG3LhnH`07>Xn!#Y<2BwPcF<7+}L@>Sr<;-Rk2ej zh|o%^n_uhr%)vP-@pLsI*FUv_!=pa&HrMp9JL`O8#>wu8K$~zS8s^Ch|G{!=7o`Q{Dx!U z#c=S-5P&~F`=iTkAxwr+b-EDnjhtF6ME~Hx`tH545E(2JcCLP&O4oDJi*g=@IY?CRZImLpX7;kGGu68yZ=+P(>8;4+AS^HDY|AabORfm6QeU=*JJ9YsAU_IzenA^sEuK) zaY;yC6aT=rPQ7_)?5q4s)|Ndx;=3eq6nnB+!j6B3lCLarp8Ji4U9!kN4{ow#kJm42 zl4zETE=kCeg-({CB-X8=`AR`j3AY7M8$>9PPCGhHevfnBK+$x_%KtL>i}`=N-dB@=!WgX>U6Q<_YUj~V63dBx<*Se7y;ic)X_KX&HcIld z)PyB@2WKGxCHW2CTn*i`PTA60$s2&)L+)r@?N~)!s*` z+6lFVI)^K$*WXZ9TXn)6NPCsI6mTA9XN8p^k&~!7({dky1`J@ziQN2U?JjjwyBhkQjKKG=K zbeh!2fz-c?9VTZQ6nMifQ(x~}a zh=VL?KPw9QN*m;XaE{Mj`cAzg$Km^ybl!QA)#ro7jP>m~uxfqDJK zr)_=Ji+$2Mu_3sW$a{Qjj(H$DW>4u}fb!8iEeQ!9d z%F}4}?k7d|wCG9E%R9?JYhiH=)2M1GEQ$x~KjeRk_nH4*AuB;M*gKlW&i0^=R!2vT zrgeE6{(JUlDWHeN3fPP79Zq%?tw9~G4v!j6x5T#Ozh@7ZOb?4@NHe4v(hxF_Dt@pI z5PPw2pN!9I!Ftctz4$&YHx^qk?nr!=l7hYm#^XpU8t9edbC%5|0`L9#zj<}HD=}$E)O?fcR z2dh6et#zt6B9^LZ=WOY9(=lS()=K$th!Ca4K(gyeNodD8EW+^gblysbvX9M)Y#}ns z6#+ka={V9^j|VkiG2LxzPY|z?SFH{qXLujy3=F5I?ZY^bl0MCZQbFbUB}DtpQ$t+B zHLv44!QMRv!x`2X-#gZg_re++xW}u{Za7ZbRgqiNpndgu5I^~g;W71YL&?YTu!i(6 z`9X4G-kp4L!6l`rqPzpda^ivRQHjv@ez%i%t=Hc!r}`0ZEnZ}lupjJ?Xbj1OTC=WSsxTOwUt$wB@S@>>(clE}yM zuo~A%w{k!}_}d>BRJL&*4$@p4ya)&Dw_y(U>vvPxa6V2}2QMhYKzbGAp*g2Ra2$*T z>$h;o7YE(BWKph}j@QI-Yj!@YFT&Qt($|##1L(-sD~ZtZ`Ed(Quzm8qM817sqgeHL zPF7*uvvwGA61MoP5#9BY#`HQk%7`uA++fT2G2&&msk9A*^=h9e-a%IGHio=pm)j2- zPa0ZFRM^6nU4O)kCR?S)^Cb6%aFDJG5Z`;any5m=h5ChR6smhx{j5}t!u9XJXW)|R z1ljg4UaJmgE7c2*hI}Vt`kl*Me%pX=Tu^>5F0CgH4@Qn7P3dDe zT#2b2k>DLQ9p-xY!!=XbrkZNK_3HiHzaKAfZGwS2sxQRd?=7n3gfj;2QX=k%WYV}a z#&$&dl94cp+k72Zquc(~;8NWkG9GdS!@_?opwH|o^V+`y#$^A_JmDGN~tLvU>)1$oT4V3^$vnhYxm0Q z3j_I;Y%QK{N_GeFl+rmE$h$g!II8fD_C-kGedxa(<Cc(fL&nlc|2S#+FN|JwB1 zR?}QKze(D@#Ai-k1C2|t_mkUx+#Q-zUtnzx>sA)~#rjwtm*HHKXNhzpNgq*}td-KC zl4cPJ^|?Q3uj#X`1>l03e2?rvM`3Gl@i|BpwQ=UsID%~E_)fs2JbW@*Z-u*>rY0V7 z*Xk~+7?7`zctrEVhhrU)`0h{#O#8<2$scZYDzq!ENOaHq!^iVZJ5L!4o+De8VWJ4m zRXRHo1X<~RAqwDMn>4GvI-1p91=7o%5+%9ByF%9@ap6U#XYlOmG!!>T1D1?xP&f9LM)D=Ki&#cN7HLAi7C+N<%cBYS9wnWDb0*tNHGQVsjP<;7NjO5c3c7rU$j`$F9+&>o z&Kl~x|5jD)Hp|HSO62`8^`a|^?jmnl-#KQ8Gi+(R43-8X0mw6O#zmehGRh@fM4**h z8$v!NSsqy77vlIvLM6gJmnfsvaqSkd2HZZerhvFY@85^#SdM4m!z^+PfzdohZ*=)b=WUv@-}l zP_3^HpK$H}TH^fW_Mw@eowwuDzH%%a*X-Xz;T-kDnZ@7$&G05eFQ0Ne4SXUf^lFos z_OZqD7HQe$7`*S61C-Q?Kzyq*^Y4 zeEGhUJeImgs#EMY3zRbw%pHQyYwe}Kq-!F>5|jkH;1GMw>aMKioth<3gsrOHNSHc8 znTmDj62_%5NgfAp@i_7egr`$4zZxnScn0~OuwtNm2iB(0`qP9_Ias=<;1kc-q%6W| z4vpyb-~;kNq72LdIix&dPjH+b$2lc(s-)Bj+3C>y^IVhZX1ZPMr)b)YKP=q8%Uq|) ziix<*w7?PKb_0}kb4z<6vtT`Y%)&aNu9=&I>taqfw{&i!FO+ydwP!rM${w>0iMMH$ z6a=T2;d}O%b*p6LVcHqa!)qE*R1C*?%pHuELLA=~uuBkm>*hK&nnF^{Q+cndyK_WEWP% znnaeAa$emEYA&>O^GEv{XF@eAew{z^^0eQ@AD!DcYKMi?8{YkXAKM&y*4bFzx5UNA zbGv~~L{B1n#FbEvJvvT-5+JPs<*Tw5zDc<<{7mgF{KbFNy6|z6N9t7>jxx8S;Y~NU z198?fLpiLztZ{k~b6f1?@~wq_5Cr&8j1 zI>ERULdoWlY}k&|xEI6yY~x6f^b}~et8~r4l^c0m#>TQR5qmf{_MVx#LrJ0k@uot5J`M%PR zJW`Fsp2Ia$#`%zP(xH__6%23S!{ThNd6;?vP6mr2-qG#|&)1hG z)crl?{u$Cn@70U^)4P!hOj$NL+DF))la05SJUV`M`ll1 z)ZFdgvkIM1oQCr-(!O1o_#@Y-sb4*UD{ihtH;nl(CW}t(Rh=(OmbaRxq}=2wNng_& zIE#A;3eOx^>2_)Oumg5+tH3^OeDrq#{03~`)^!I|wS$M3XEE$W>W_^YHUl?V-s@h8 zny^ckuBRA@#0->)Sf1vrnpfm__)S-BdDVUH769^D(3 zqGf8nga-GZr-3`qcikJ%2V|Q?t8*7;)SEd4@NJ``Lf{aMtqY(PjlAiBvD%Jvpe$Tb zuKS29(#MgVPCK{-y$syYdm1^`3T4kk12Pu)MYE4i&@705g`%`d3y}9w)|9#O?y31i zc?ZL9i81KmNGI3>(v3X0ztPNUI263C`G)cEQdILijC0f8-1lUJ!OcJ|kIn{t&mLN~ zWaVb6q*+`Wv~P&{Qe_BOO2FVD=gCjLyH0z;=ss)Od-K&3UIWedMKSIJ8zP^9`FeoA zeeg90V|+uUWYoIRXtx5UfV2=SwO~%+pLu<8z4s}$6Q*ahp&X4diQm%}&^^a^_+16% zHSb2@aGm&m9mWLUcO#vGnPlV^>(e(Fb{_TbMlBp-I1pE_SlfF-`r%8=r|~}dXipE8 zC0>jwk_%8j`XB`VkLPu%hxLo zNOx576SWuC!!oM-&U^V)OttefR z(D<}NDgHp_@o$WN{?w87d>~1RiRZIOvJFGNA7{|fMH2@(PV|R#qYU(n@cJF?8Q(&xwUD`8;|dl&}Mx=hl6`{Dtd9$M4Yz>v|U2F0e8I#%O-_180@hJQX?8~t;Rm|e8~{QdLjrpqo#-1iWY1%1QEGI-z;X@}MRNJk`)f9= z`V36T5YV$C{yzM*Q|G=fm5g;)EZj*?3CU8oyfHvdY+Do8!7}v*_$$R2UBg74FS^;T zrEW?pa0$z>z8ot;1Sqj|s|LtdU@&k?EJ`PotFo3zc^Ini_fjh`?va-=AVN2i)Aw;z z?*{Ovw~u;~K)W!Dl$oSt zWd9Q%*+Pb=(Vl?Tw%z)#NL9?z&H)qpV_^bgq3wzjzF933Tv$ZXNohK1b7@FGH0I&_ zn&uwC?0wLEUmjGdLN!9gqb==Xxh|8gwn@05W`}0O1mt*S5%{Yaw3oK8Sz>JQKM9k> zGFRVw!+?oP(-uJ|)2Mfl#1^vmUjr>!Z%MoKG}kfOSCn=m0+!wHzBc?%2#m-woZH6) zwa=p62Bx3bb*~NSoM0;`#b+jtD6g`FwIedQtr+XPf_2^-1)0vwsDHtfayz(J^Mz1R z8Yv&*C|OxF!ST##)7y=v*^8o+3yE}|mrfeofEdm%p1aRe!_$9&XLovWxxp?tKPImZR}d3j!L7JHURRlABc~Yg=%^cIHI1g zCWyO=p@qoq7UJEn;?vP(!4UZKXzn2c!QZ%pJ!FP`yErb<3Alt1@<%Zygtd)`SZD22 zZ!Juz7z`;HnbT5Rn{iU##=1p=bxUw~9n$=g{EK}g_X#Yyf5Lp8)n^t>Apc92cSY!E zo}bv#hlPUDWC!i&@{ZM354Pd7${tXWSJ{mp@rvtp2xZ?7D@qqB)V|a_noV^RrKJ@h zf0O?Vm!8(*WOs}6fw6L@K6IclYjbRlOch`HK=`g5M0+ZMg}APaW9=yRL$kHBz_qb_ zdxLFZrg|(1-cs0_gJkwt?F5JH-?+N_kMDPRd>VWJJvnq;#1CUfIYVJ;`zFci+mP?$ zdHwD0gzI~328>;r1G`IekXz$Ctu|?2ohseTBHyp@79o9!wB*!cE$$ZUjV^w9h7 zgX&I5JdwMeN`?>J#Wzc`T5(08sBbJrr;F>Vq_N1uJ=k#VOaxoX*s|GEJs!DDboyx0 ze{{dk<1Zq`rg_y~g*`0As-m5-CQE{wSQ>PDmSLaKSSt-$o7s6Z?`_A)XM|_RB8o8_ z%qt{nqu%3>KNRV-@sykvkh+QGh+G6?J6V@^!Hz1rx@0YQT%Gwrhw~a}c+1^8GDZ3D!N(j;_L^g^lBpb&)NbC0kIq6&BA^ z_$S-<^dL17#xf_x;3#vl5?XmLX|%zEOme@p8357nTWbOpW8Y3&C!*+AWUA^@(B41R=Lx_Yu+= z7HK2poy%0;ve^Izg`xs=*Hh?S=oO$c-EAl{v4R zWY1dE>bx;iRBh}H^;pf!L$vJTNDR$ILM5^ju$O`(8MW+PehJNH51AAUUeAf5gu|2V zjk|p_MBw*2Ftu%}x&rdF_<~BREllKAyVq8kXI6(`y}>sH?Zt0XUF$c}aMt)GeUC$% zJKEzKC#yFq#^0n7*_kgQJxNE3#?y>*sf-LgE&7NW;<1Z5DjbMS<>&} z`4>SqE{jj0F6nB$>^Xyx9ps4;YdoIFCcrbV+F2{|1={UfQ!T3QN%hg2MRE-#&#t!1 zqsvCcl$vbtWb7&ZpbhAP8!r{xlz{^Vo+akC)98Pop;-RN#Phz9B<{(FC3HR=6Yp+qn#iw@q zel54_88~waj>E-R!o*=9`vY%p6h_+x7so@9zsp^p3ahsddyieBmLx1vG z!yN{G_e*t{-yh)V0Q`3M=@q1xL5fXqh@}W*yAb0gh0*T8C`Iz7w-Vn?i=$mE-iM)m z+_rjO>go{|@r;E%#>sEN@BqA%HB?q_AV$6qz!t96fovUORq48$YlDr%HcwrVFXd_h zi*(+;!PY;~*7~EDZKbaI=Zm~=7=3&6HgI(c(Xs@vZP0vDSPhmCuJLJzDlP~fod)8% zXra#0w{++7oY7;Jq%;c1kI{dJk)Ip*y@;CClA#IazTqde!RzXrGY34mR~20-_h#^` zJNLVO^Q4k6dgUgmZTl^jJZgKsp zDt^P~sKDuDKYeNi@ioS+Z+)_O53Scl3dXyG&&*)s{ZBb1{r@9mU7Q>3T~1y($AG$A zT^_ZZ>{&+g-=8iQKagfq`1Sly42r_uS|CS2Nlbzi6vLwm{ z3jV`3_LSC!o)>DSk_TMneh%dp?GinVgu}ESbUen|F9l=I2|DFQ@1{0l-`93bIdA;7 zBFE^I_lF>Tt62q2;hnt6uqLX5060Mt!Js#8k=FxpR|DvaAg* zXXR0a_RdIEtQCor=R2^6^Tc}koO9&*m)_?*`&8sp8S)BfPy7D^#W+Ixp7JgIsxIs!(uwh1Vk_?()L@>(N>RZ^ zwtz1a&ST-6F6~F*7oks3xi(a3?`=BUJ7r#dNc%72M6aA&YF)IQjk;vZ`OBX_Lv78j z$j)~QT2_CnzFeJa)gJgx&o?=te~|f-1>Wc4OSTy88P~l=xy_XJnNYg3Ld07@?4;8X zXP^>$qTa%%@W8UYW-O+o(A@@e>G#FLO&Z!j8V=TBqWbU=$y(ih({dhq2gSwH_#CEe zr4%cO6(q~Juq#yO8j4S;K7Ad(>(KsItJw=gGDI*hjbpW)`kgO0Dc&^g{)ubD>wvwY z_+8`RZ!scx4wU2~Id2mFtJ(j8_(oKwK4(DdbX7_wE9elo$|sI5i0AoEtP^3Wm_}p# zt5(hoI{z3%J{0-`7_Z%b-qvxR&`yaytet{v+lf!IB*1>o=R=Gep^746la|Xnu;~eM zSqUvDRm;xSIcn1$mo%89Np0LUldJ(s!)nf>hH{tk7%W~^Rl+@O!4+=v`{21C^P+xf zar_CclOF+F1Xv#KeyNdWiFhPBg`al|k7jH6S}>1JkITuHB=SYIUL>j*UY%E9z%9-< z-BvRAd>vmxy$kBa0$A^<+@33(N$sYJ;68nte4Wn^w1D?G$DPnayOAX1BslRoE9?N* z{_^5Bo#qWLNBe^>8-)~=Vn0;q)(SfBBfkwdDA(DdA@&1fw0ECqce2WzVJPSQAxt7G z{uW|dCiPU(BChd0u{?vznR*B3g=$K#v8GL5`&e=@vL!F7uD1|KH3Qom&#v0%#bbgm79;Tg8VxZhqt(ZLVd z)}#gOWSgqLtv6GR-`;1L4s%cEj4aD7ra4qNim2ZfbpK>=Ffb1Fa7*r>h?iM!}* zS!x}TbDXnrP$+d(#c?s8EZ;^$eUjcj8pi#zeL#hCwEI^UYf}zYl*DxCMke<+x)FAf zeotvr`62Nfc>`J>tNf2T7v4C(rA0R$qut?SaU{DGV*lumpZg^xtEqMe-L<7W5OHL8 zWIt~Y{p$4k@>5Cj_Lkd>#FM0+kH=s>rxx=%ynnLW?jki#)jF)MfnKLy?3sZzJ{Tm1 za6eaxt&oyJQm7wZC=QY>#Pxd6iEQI@!CgXQue4b3EqR_$gvUSnNw)E@gJ*P^juz@Y zF3o2`=#~cIBwt|0Sh8W98-_C^tl_`Pbao*>*4R+ZPJTFiM4^+#HB2Ebk=OWeB`%d*U;5o}G|8<6J1Dt14smD&2e-g)3wX6ZRX^==QzMv>X zCq&l51t7e_Ar*@9+o`I^qumhsBg)A)PUca_$~d>3zdO7}+FCe|vD1Cag%OExk;JE- zfKJT_yQpP*Olq-))JWokP?P$}k|La}-4Y8&;zf-{K96?r!(Q(?`)+Nw~5NOXUr zn;|-ht6XyTuYh)Ea5K2Zw%b}rt9v#;Ip?)zW<#d{B=bD~DzxPhDY$fVxYH$^ zeuE0!_Ikp34%;7o=jUCiQvjsM+pY7{=sNrPEc_QRTfJSV6X9;>w=LmavX7i!pxn-O z`g5<2Rz0;im(O<)%015*7(RV)RHfq)`1clN=qv4^Z#>;4gFQIPmWS6+t}w$@@k3ZU zaly`Gzt&fj3+287XHk68Nge~6*&f*y$2HTT{=bq)qzzFyKH>+e`B|{62Dcf@i`b{w zo*?~5J$)*pQ~C{5AHfC=yBz2=j3_Je`A2d!*+-OV@?|^yxhE^0%39F+r;CodY|(zZT8^8Dscq2f>Uy}ch41Id1gi_vEa8T!Vp&)l zah}rI2gTUZwJ*HSyxf3+EXz4t55~n9Ptj+1G#ePG*PGtj3ME0rdaxa$-`$jHX~5@- zo+OV*JrA;uKLMo}-`|v89R57?Wm%rbp2PqA01=j7hHvH}!RF*m@+VAbE#@9j`e zy8*q2*w9XY?sm6t@iV6UD2m6+jm+`q_&$QH_mXyRgv&8x>vS?F|4*T;;Dki4&^f7x zzKT8Rok;RTaFfQb^naW*D@_%5=w|IxDfgh|FdE}thT?nG45co~HbgL<`^8|{D@E5l zm(X7Z6IhPQxRRpNeYs$TnmO|X#nj7SJ)bBLlf_pO^_QhB|02gIJx3~wqd003f)m9) z{+^0;pJIQ7ql*8spnHt&oXF%9euU0!E%_I&IJFZ$ud+<^p5{D{EMb}IWxh9DxtEah z4&|QK>TM`MR`+Cg%PGa_Uw3&*>oDeho%)uH;rS1!@4|jMw|lhAYPd{RnRanJC;w0B zMPUz`Xb2fjH$T=Sd47OPTnGExpT0o1=&UW3r_vH?g_fmZ@s&T~(-xSwXtKq)97xYqGNH;V!C%@^D&5v@6tpXwmzJPQ6Pn$o00ICAU~TmZ7{)lNAe& z*_IVOs+AtYClO{;gv;zB>1H^WHE9htJy7r7*DL~)6}qeEf$Xja32+mNyHlWkbA~-l zy$UNCoysqq`5fzjwN?-3gJ;*#*@WDEovH7PPH@)&&)kFRLHi2MMW0g*iQG`P_(63; zo5U&V{c$B4^O*zd{B~6f*8M|q=O$-a$I09uV7R!l z2S^pgKAP_@=#Z4N{A`N#Ev)6aT`+k?WXX$4;3w_&Wc$PMWlAKqhqWZ{qSj!+e41si z4c+ux2M4)p0@%Aig$1AYja)*dya(!VeRvIuQMYcnv_4TEM_u#R-S7hU6BN?QUa!Em zQO(5K>*TTFmJ*i{X{Zs;!rL4^0eNTgc!@= z;HJvIc5QWkYPND{k7*_0C}i6tj!=Eg2%Apj(UPok^KLcl%WT^BjTSl=m`fo~kcouYn|zK)3qvJv9zvXa<}f_;GPR$f zSnG`?a0;S1{8a2!=^3xpY|blQ5AQ;rJha9ldgTl?HN=1}uZQa8n`7}pd>AYu#Jkyw z@yH+AutKK#iE>&!2|Eevo}xOPjq6+G{_Ykv?h`T(M7oVU`(aZr1Vur@c&-^C$#@)g zLo03%*iNj&L(|psC#V$-&3BbGVWZ)5ZVL^=GPIL~OV0Q}m^`_+(sgPsgwG)`bhghK z3TN#6op0WilXr7U_T{i&O(|J`xZp5^Xg*v?5^~QWQuKQUbZ{d~<6}RtgeRE$r)m%`Y28T zF`qa%6{3wguVuL3+0KN2ucq3U@+x4KJ#n@}?|JO{jEv$rqu(d}7uR*<*m|$@sQnfC zlBXBv(A*!TK?$8(lC~|*(kZRfnsBI*qE59UZ77YSODbNuzjz_W3*T1w!!O~G zs=eSHts|u;&V@rX=WEbIopwj}uW_Gy2bxb&Pc*GSS&-fqXX_JZT;~(WT7O2bR&%*_ zpC9%oA@Am%W_(4hDUAN)eqFcuMxSmgHKJb|+p&ZD3E`ww+E&Pc{e@^L{-hq};_|)Z z)r`MtK2@8sCh;$j_?-4yC`)BG#nO@b)p)RW6g#MgnhcE@`I^`gsU!|!i79$+@p?RC zNwkHTI9otRVt~ zjQ@W}E0*1$u>XmnP$`32b9$)sNY-1y(4+rb;rg)ko?^^~en%$AY-KjQe4^+%kK@o0CFeGzK& z2McM~@3%D6&%r#x9`TKy*Uhw$1w-Tcm||HI1?(IpL^9D z+V~dnu<3ad|Os%(sWp=BTQ##>cS~r5C4E`y=q*ijL3$0p?TlYp4$_}s;mlX z9k@E!PICRFU$cxNNJ-)FU!oDfc1AFTUdD>ZEur?2ypLxWfG-#FbAYQq)%z)a{@HeA&2xr&D=*I1K`623= zg{)_$+GO#AA^Ff6V7tkDQ5x8~t$7!!D`9)6`!B-p`vQrhCeXPecghOa%6{$@2}!tz zPa^ujGs_LgE_?_#rhm8;ilgMJ$IE$%CE?(`r||4sAR-F<4(O472eRrwLzm&;Y* zfN@5v?CD!;4TcE)u|(W7g}@`#9{aMU1!1dFlLPEJ=I^ z=j~zc^7bV$Sa7BFC=O^gNvU=%l+I%TrPGf*W&AooPiGL%*QteEc1-YL)6tW;@Z2x$ zl8{cCHOINGgTKE|b$7DJ8L7XemG4BHJGdmQgwGAOPq?Pjd-6#XGDh6B_>q+Ix=Z>Q z<}sYh#b4|2%;`wd^P%(HlJ0fOsLheNZ5B!KBc<`4YonCETAHww{qehn!~MlM(0kHF zUXLlB%5qArs8-3#mAO1?p!ejVE2Nyb;$O}+u-PalmW*4@#o}%l|L-2Jc%Gzrb-B(X zzPFS#8>QNM*t)@oHBt|+`?g(DuIAc1nP*^+o`N`K7AWIG;p<5KJ@sX2P3?!95eK*~ zw(7rg`jsjpeu!JDSc3*uanDDvT|Cp?8RkOA&fDv0>y-&1p84r=U~Of9LYacRs8~UxyygC^oAQwx4^d&ij6moRj~z z@C<;^zgztkaB;rd9hP`^&75fdm(ik2rhgl_wHRV^seEe-=}$WQ{zhn53s*6n+8b8~;4d^b5KIX}KirBbO{ z*?Z?%t5Q2FYduf&h_>&vKdWur=)FC?#9PsHPK>bON7%_Hg&e!;Sj^@Ry#c;ZSjm(Z z+DE5kW7&xDIlE}>xac0!f}$74L!}=BmpMEq9)|UU$G^L&t_a4QaD^`Bdb&$zpzGff zuFAH)l@v&(9zz}{qYaz%C~b4(H)Ghk!5y7P;YnNygl8waz;K(2?3sA z;&M4JHy_8@?+!_po{eW659(uAiOM#v2cpb#i7ogehsW}&x>$)pLfq-g#gltq0a17S zLw?U+@}uFiV2|BGeuZoPui>v!XrEbx<}>$CHn;Y;+ne{{vuKae`K=cM_(jp-IHHc) zcUukOl80R<|8G*5Mffu%#75vO5Z0V|6KI?X1h_Bc^qkgx-FV5jD4WPjy9}|b@>*K< zbezb`YiVxHkVkALOR3&yqHW;lNLN!?g_<__7Hy$zk>boBZEf6_5Pi^GF@8*8AZ0N; zTs+%+=A_?>VK0;_dP7(n&@EPF!EUj?%uEaZi%}NU-=b76PP(q9RTsL)I#+i50Pl|3 ze*9EjpNVfe(rr%@)JgLDonaZfU|)QTb2t52g}Fk1d`YX0hgTjyP53efaFM=~2V4~= zoWop(tv}Kjo~##SoOGJWcf?IT;bS@P-zl*tcrHnE&RuD*f6lrA?c&`2sZ$L;E$LPO z+N8@&;zr|ie@5I*4)Y?yb1tOwVk_^xwcBkJcHw+PEK##^AK8gO(;z-oZu+LVP=FlN zJ_{<%IX(`D?gAGl+?(}3J14}YY2N{4IFBR1Qy8qhnYnKy2Ii5@rZibgZ zE~yDlengFH+iJ|q_~dHxV#S2hxr1r{##6SogQQ)g^nO;l7g0gREs^fSP%t@nhMf6b z4fF>uef**<%3o{&*CnWs;4Af(NS~@ByUf2efBI7XO5`=t{%ro+sKgz%6TlAR-48Pl zfv~e1`lN|t#BVh5QMU$H2&&odT{6W^JT2SbC@NaF77vdJxGjl>0X?m#)Sa=Uo$bv5 zRsItB^MPm(^F+pAAL2o3nnJ9thm*rr6N`3dW=?G>eimAlOfDqsCG#SA>GY_Mqm|Bj zkMU#~TW>nEl$0s2xQuR3%E3CWYjZ=L<6SeAe+0Cccnw>!8D3iJD8qv11` z!P#yps^65aJ20fB4*f?A21v-->A-3x+7bk=L=z1viXxs_POLNw6dJDVg-)QnZxZxi zCio8a9fe>e-#d%nvvz42##1#( zSfb>{$@yLOYo!BcYbcHd6eJUnMj|QA`b|o?=rs}UA_aR__A8$;2ru)B=3M;zrhqTw z)5(*;sRMqC`l0))JUIU*CFM2aUG*97LFN@>(@eqh)?4-|5fmT;pauJU~cnq4S-LPUIMW%18$WZpx%s02qU{;#zIG0#=uNVJM;gGP6#u=Zl zq*p5`j7^;f+2Rg-vdWRp>fFEsN@$)DxzC{O!u$%^z?ZbaY zl7nZ|@Fn={7b9)gMLr}I+?%|*o=%CCXixgFYcHO99X=`>%};vm9c^d@EX8J{V4o31 zU?;CQ_>O|ToV5LWUopQ-EZCn!ObKAK zi2iEH(geRG@Q7_Y2mig>eWrYcIm3A?sdwI;zNZ_5#V-uiEqW zsUAejo;NT1T!X(Lf>nh7sxh|U;O>5L${Xu6pjx`|1s5F{w0{d*yqwUbG)>u* zmMh1Oklajaron6VGSmZA1X!VC`rI8$tzWMrg`ciZm5EY@^!JTnmD0d94HK60X(s_F z>q&MkjX6JK3XZKjF>Y6tV7|QO03Fm3C`O^TZrO7YnD9<4x!quQucR#2^7WZBDLCt^ zD*Z4$E-4mCnM5x(mbryx(?5BB*6cn$#_U^K`zc+|t<^j16=bOnJv9+5PZO)$RMqb4 zi<8lNn(FeEV=F^{e6aD#htLfXEWK1lC$ckDqv`ZKT&+0wpi5D^c04meL3duWCbk0- zeHsaJGQH*xQ@>jn9UYbc)EhF&NMBw9$fciO!9;7bdN6z$IIY!X%U?x#5SAAF`}?g- zbN((J!)&!kIodQ@QO$;Q-Rplci!TrT%>BIR(x>ED8bSCepDjQ&IlectU$VGR%0mcq zB6+xD3#9aA=mCi;pxs3{wHw7pmCHZcu12lyyYXi18?N`IMy}VtwH1Qi89q+&2ee_f zIB-w@02&|PEMWOOR6CuwpOL>R6djx3e6n|6fFq9rw8pH#9zZ$1UXyn(M0TbS0&4@X7#}EgVdDJG>WWs+Q3LDRmc(I2lZDwZ%f(@ zA>*VomEN6;OO6DGxGP0k#trC*2EGcr5_3u6ZWIxMUw2_;-EoH5_A|V_fs33=wOtjnLEL0;=zHwmve zIX7E$6)oUH!tMdd)=`n)pGS-kqfDMoEzVH;VnrHw zW-I4*qGaBBkLJ`kur)EN$HsPEeLQpuFa3%GLN`B~1(z?^L=J1>6*PRrmVC`~(PUDci(8t52XD_=pLeiEcB@RB zo!E7l9TT?*>6fV-8uo^|YiIF-osakVpw*k4Bh-PG4*|SdSOlE3j;siX++Fs|B8xiD zjsmA7BlHCdkBLSJN00I$d>hc{Y)fvOBfY>Krsw5|W9sUjdC|U9)!}v;nx2l1VV}}+ z6e4CaPV8=0l|#j{Vb&U(Ph+TeGhWxJxd^)tn=V~Erw9|>|$jjDaO* zB9+p%e7eHqO?g?_iz6`22DceCoF{nza{?+9dkWg(Ru#|S2#3Gu(Owgsxk4JJYV+uC zl~*w&o!?-Fftai+?;mQ%@5W@<55i*1W5*Iiy<9K+Y$yui$Qrz2+$|lDHjCtx*Ra{Y zyF&i#(nTA_6CV%m6y|Y5S8apzAvHgmOw9&?r?eiWB?kM-t^gy)zB}mqmuq@GJdMBJ z5%qGgO52d9`;j9sI&0)N)PAGg`^fZDIJ$YBtJR+m7fN@fY)13ptr*-Y`aO%*FQLR0 zw2Wmmi{E4PvklYj)c4ga$463pQCe9mc~ZG<>gUvq?b-yd1y2ZfiigTxz+2pa+^8m?>OiA@7`~|W^obXiysMutz0#Wtqnziu5OKOOmii67 zhIK#xkZ7hCc?$8+?Xvz4kP;Kp#Uoi>|4kD2Y{V^+onjCcK7Npdc|-ozz-T0Xh>K?V zJqf!N`e89e=(#ihc^{ZiPX;SiuWr#!`*Az^3LegqlW>`}u(zMwaDA>T7dSp|mu3Dk zs3Tve_K0z$TwHlfk*#KKbRsvmvpOL+pw*L7nf|kRW}P_w4R?N`Fq{sHU9oU!R=t6? zzPX4Fs~)WR!1Xy2jkc7Qby-*~H_;+#J$qJK-y=c}yzLM|`Ud+UlYmJK@HoMjvf}{G zd+-`ane0A+;53wdKEUaiZ0^gQXlKYiL5^Jv*ao--P-6PGXn^Moh}c-(AA z03r^1%;g+sK$PQGP}}l|P6SR7PzZP5H$RcbDLj1ih2_hdqB09o1R8fErp`B9yjYfE z%z<0;o;)_`dVT*OMQk#B_qWq^5Wew9mrIIW_RN&+z8@yy)n!c(4^Gv{AYE}zDK2aD zl}W68OPmK__~y5_f-*rQVak5SSNQ(lm&x)ch{&(U6qRQM*DPbykwR0WBn|>0@>sU* zE$hJ#cZ;BoOVHSCRMeqtF%{z$iV1-i!wbbDlS$LqKf%FF3_i5GzzBXm@P2~1GqLOz zdSAx+s}=C0G95QfpW7?WhPL!+(2oV#831|lqihFo!Txp~#UuvvFBu~P4B0^9Fr?I& z$Lk$Uurfi|BwnjpGGW-_%x6ZH2&*sz`g~c4OZhZK2?5I2=i&+U$;4H#y*^%woK9fZ zvLK)HE=uY0(wXA()7I-&Lya`KgIM^E3VYWL|08DTSTA{I?yt@uz|vq3Y3bnCL}5jq ztj3x0j|^du^2j@$j(u>yE3bKPMjYi(N^J<7#`~2<{5c)TlrI-aoIy zl#sGupK~OCrKe735Ed3Xy{{(^m#OA-T^k0p1!skyxkj4pd}@KEzSzV=CPl2Nz(hr(RGpd6M_{4kA=Knz}LkUNt zoF}^9{7Dp)_{Mu=*03ri3b##_oiX=jApk7xx*}^;$Lc z4-J8{Wx!WgS35X62Xu6B^YHL&pPWF`)6;u+dk>6^Kz4U`k0#UNzQ4b3UtPug`SZhM zCL90n-@i~WFhbFIoUzR2a$t~DRfb_wG4@r$`Cs{ zI~3Z@G~-FsA-4w;1wuhEr5bg_RI25H-;WBUlBi0xnyAWED}qm#D)y>cHie>aSQQ$~ zWEaa-VVkU%#j?0u6Ikb6Cx25okE?|nRNiRbY7 z&bHX=-=8fbe!M-6`~d-FaM%`r!(o96fJ7XQB@$+EIaYwfWrG_CK^zH1CSh>em+-mn zgT!LBLgRbC7LFv~#W5a^>=P&S4gC7J0$_2w(eQmf8%N@@BkYaDjF9K}_{;NuprQVj z=^YG1Wwe|pmC5G8&hdT3E|y92FHrE*n`E-%*ZuTSsqIUuZ;tA`Nz-~YIt z0e40S0fVm(XEzJ-{5wZEfZ^9*(?!bnZy#~^ zzOqbbat1V*&+PtdbLIei^3dtD{)xb(-<>a#ZuNO#%FoYtI2cFQ>GDEfuGSs+4lKvL zVfcTYo~SK$8~qpSEsjUi`2V`RF`q6s2EN^Vv)u>E-QJu!Qo+IIy!`#n;QuUiQezoVpCH?3kyj}$;nB`$iUmH@4noIPtjl| zRl6eg1YA>{y;6epbZah!0g&D)OrLrR8~asulwNWNx#^Ez!veZWVjC^9n2^9e9khbn znuX<;*)1}Lf6v~ZTn_=zr*@|awAZW%#|-Ly^1(j|UpsySu>dp6s!Y5u3fYO|2V-Ab zIdH(GBcPGhfUd5ng6Bm7d(9IO?^B&;CzqgWisEV{pZ=uLM`2UDltNhbz3*-|ZfRjf z&8IZA^>GILD5RD68OW6+`j-fV{FjT)ArUzM|=lH_)ukJ(Xk!qzbH2fql|d$#62FxPr18bP<}`mmqZF zdQmkzT~7X9H4J=g(_MjdQ&c@j1=_3M6^=?&PeYyd7%bdWa>!ey*_~IutM8rSN+i`K zX&~nG9 zX|9^&M$W*K?X{6dEVl^hUm1SH`%8BU_Vp91tnPkTDy65FtEW#*I0m|gG1t0!zlM^cR@O4;3WLAaiAi68IwXR;FgZ%#|&7$e)d1b>;< zeU<^VE%te-U{5;YZ9!A@Nk+AO#lZfp&3gG{mxn^FBU?U2Jjbtj2uJEmKzy}C*YXHu zQL|xv0^K83^XKP}i8dBhG|nphp&_qbdV-w5PL1ikhr-BpL7*o(XVlUFt+}i^J=I%5 zSRLDXdBne(jJz`=h5K-^9L|g1=luH#?5aBH#qaxuV*x_rztrP*4DWXQ{8d&7n%#10 z8(_K2TUyeZTm`}#`E#q|0QO2po{J%Sn0n~Rhkc&G!wx1)XqR?;S4KAzmN5KH)>Hyb z>@D`*Dtn4JtVUhrQR{t%Q`#~k_ZUU{ivB@5ys^sY|~0RaY~e1tRkc+-3MF z^x;Rg`lAQR*`n5U$*+D7j_JvxgLV@m&GHMkj1OrmJTvvWwH1zwg}_rP)Ap+J3SMC4 z>6{ud%bLx3S@sM~r`;1_sN2F4>qBT)L*6#LWV(svz^? zT=V1WVsudur)JE|>vL;Xr9Y3cxuT6;ANP=xjN|E-nxF4B+R>-5&DmLUpZ<Mb0!Zf;~UzHW&aurgX+%xilaaydDg$X5PzgNjS!|Ab{hfJyDh)cYQObg#EqNX9aYK5!3obN=aUb?ktZyWM_FJseC}V9K`LHLa z$x>~`SB?}(s03ZeWOou$IHi)?NJL#D%wE2j>s#|}!wki%NjF3*6aJZxKY zh+XioEYH*z;M@vlWzviz+ep-gc_IP+`miyfub>&wIgS7u^u;a7VW%m!7G;2i_`h zf|{w~yv#URMRJWLa1&;gsY1N)3B1-Q7JVF{CVe#e_})A9lO$O)M#^D!Fx|po~2N zk_{FJ>MpUdc1_@I(5ZeOhwX$jM@}zFH|ht!1ta1$a{wlqEB{W^cEQIfP)ai28=`V*8mRo<;S~1g|pVl6y~f zuk@Ed#T1xU?EdX$mdyDJJaZHQxq*ypXWy z6r-T0${0*j&hMaPqiu)Z)s7!Eo}o0x5qglX6}5E7cllZCa~2UjvtuK_R%0WrBk6)| zxG!v(Jln<@G_G7|4xQxf!J=M3@Y+58QyR{HeB`D}5$!61{lVAaFV`4zJ(96!lZCjB z@TD@)I84l-NyN_yp@}VMq={u{gvFWy6i0YVydK?0JU(JPI<)A{rrqx|`)PQ=PJ?aL z@_i%LOFUKyVnO3U6s$|g70vX023K#n%W1|Qsiwx?n`uV1t5=g@D%i7gguvL9$8{!a z^3*&J;_K3Oag?*>0M-{ti%s8Zf7$POBd;fdK!#j{HSUg@zl0l|&)G#VzX3mb>zSq% z>e9U7B!Dx(aYZ?N&6pb_FUiq75np}oNR_*O#NCs-pp=iYH3=Nl!=wh>XPlkpY>`uM zXQOsCH7s#ARk-K%W+CYQ27Ik`cfECuwPJvqr~$vBtcLJ|>0e81j?CP6e?0t-seD1h zLc2VmI3Z3nDf(&3WKIB%fu>!K*_ctTq(aXS`3gVoN_ADj*k*N=#zweobNgG@ zaSf}j-yDjOxc{?S6>z}(-uyeseCV`pBBOcpQsc$V8bgtv`kiTG_L}mw)fQhyv9@ur z%!(UHYU>|`2N>stX|oG1^Wym^XEyi;lV%yd5FKAYDyRkId}Qk47rL65@=L}cm0_a`azgyR^>wV^PA2-hV<;e+F_51m(>Y*(3#RqlTD-NbzW%-C3#KwC<|15 z48yS#;6)L}Z*Yzc!a7s;fad#23+xoVG(K}_{wWTt1oyT0_i>(Oc~xu_n-=Pi=m4kr zyYYn6)TK+7v**Wske_p%ujrFrN(TUo`X}Fx+wMgn}9LAb;MFwJvaFY8?q0avgzxRz$|vS znb#IZ2iL|c<9DXaJ&jH-g7eh%MQwBdA9v8)d31(JOAc}7*`22?&g0sC*-$Nda>dzg zF3%*%VnB-aSLoBz2V-#bn#=9J;!5P@`)YD)oqhm{D}=73Bw+yc;&?2R$&Lc5M^#5u zp!~^Q#Lg!5+{R8w_E&ADJsaPF(izm1{uF&3FMX2(=tYd)foi%{m1Byq-#eeCmNHq% z>Zx&Nh&xU}E4b{n6QbFhUT(;oyUZWl3KnwtENSd~?RM3eGCTTasysN9m(PPXR+<~7 zfJ>^&hVN=W4xYKaoa8p&uJ-M5i;E9(cvM;Xx``P-c9EVAFwe${^W|HpgWXe5XGm48 zG}hN3Ya8axV17GKlk3*W=J|zWYVae2j-4y|x`o!5{70LCCCv{- z@{|G=_kbx{l~N|ld)Q?Ut7wC(uG~(UclvWSAd_1p&D!72ZK&9-t+`@X+*l8NIuxAjZ9NB8oMyBfR9&;B9njOL`!RnS{C8+D>-`m#)40k;SiEc;vX(GE(z}i8k`E$x+4q z*(BhFu$huwQ*P&=auOh*k{8-GQ81I`46;(8-_-l_LBRQzwqc-!N!+j5&SmDcm>Ur$ zvEotbOvp9KAfwQ4e@onp{BGkDys2-h_2d2!9aB#2u~fdUm4>Qy(H?uB^Axc-67&QoSN;-%VTIGnX`l_t%dKR{C3uwXUi2>t;Zmk~9G- zTh!ieQn6}+>+7w)O=Mk?GGS_DsXJPb>rzf7RkhI=o$ZhJ>APrxb!1s(4n9mJvU(d$ zt!z7PjO_H1g%fwmrO1kb?&UU3|C$|9AUjW$DubBEZ&M{JT1r>d5}aA~tsUAuowQg& z={AU-GrBLWqUp2ajeDNVyJTLM+n22I46=)s%|^PWLbr#Ux0Nm;XFQLz&0C-8j6-z0 z^x|lx#kRsu$%p>nds{T0NLO~`r6{d;Ah&h8rwb?Sk=nQcRh92vp-X3B_RaLakfxSu zj6K_&1NNn9<1YSxFbgTC27I3>ngszszD=+}pN`2kv{CEx%~5^ujUl zx*AO|Z4eifueM+Gc0IG9_RJE^KU~L88gWM)r_EY&iG6!uQ;_p3Kni(9M9uf^c&M-x zoyz8}6g{vWUf{ieONfI41xeoHTdlm%12BOnWlyhsJW4(RCYO0+ciAV`U`MH_ynDrl zkSTI*I;t4a7SqXvl^qk@%Utz?`3Q5>S1DFwEcc8ol?C|gCV;a~FKIi6h!oV({QQ$g z1-7j9(PG#+=+vipD4FK(Cc=j8_`otRnX%5{$if$~bXLxVDkqV0mXB{~wAJg6lft*y zvDq%f9kIl4%B$v{Q|kx4l2rDg5}oR4$96pq-zR62=?6>qI*v{A8{31Q_f8fioDI|V zN(BZ}pnPsQv!7*aq2iY(_I#)+o=X2TZe*PT^Hy1>%ZG+zCe`1d%DdEVSaCv%G;;Z; zw-B&docVnI9<`&i*CC9oGXUK{lJLr5*UdLthsJzYX2*-nV#MrDv>@Z=Gf(*_b%kE2 zM)h^5cM*L}JdQKLI{jQ;np-l}V9wqkDKZm^%#LnonK~?3^7d4VRp+3Jga=#^VyWIbviPrM#@iJ%7nYWUJkPO5* zqr^t;!~OI(`biod4x(6}`{xgsBFMKwt|WAPfrP@hdM;w?-tBZvxtW{0oxQuJ@0Blr z{u*-fLMEhKUfo^&`;a%PR1ZnvQC-Nvhv$UGahzF!T7YxuDy-potKt4fmSsjh5Uq_B zQ_?s=LlA0R1Z8N2v&pCyfHxw}39%vVFk&_%$J@b# zWUcGsLh>9|&9HCTS13hKJqyFjHwV!i@$Le7sk|psQE7|cVh;}-E|EG#D7;X~mVXCs zJL{H!YSpE~|F6@5d@Rc9BmTd%6WNrt8)w?-K=36zZ-C(IW==ZIHbv38+E(8?n$&*Yf#}CvTp&cQLgeW0zG@E|aH>^0=_4ee@5-t8fc$uscUV-?? z9tGyM0A&}*L}`HChNR1gwE7UjXIg*-Ii<=}qdLF%G<{S||1pB(%nLMV7LBbao0;t$RVL zGjEO}wos?ibTB$^PSLM#<-5h;tkLqmz%7(vtTXjyA&%-H5oyPGnw4d>bLoLNA14X% zx`kq|O;r*ttAb&p+@ZFP<`qfUm1Icapm5Vki6;ASKEt=9i2Map`P6W@cN$OT+JebkQCrq3?X zC4;*%osf|`X`4A-VI~smn*(OnWhE^P;yiG11{R$UcQ= zi;xI}*0UC;JyfsL(}t}xqu9Fe%;4?AZ(JeSX5Z}T*^*j%ES~nRJc3<0ZXk%|NA&G& zzs<=dMLj4n2x|Ck`@of5nUx?i30vN5>@saE3%Mh_#k%?^EZ>oi{&O8WZ>p3Y>+A&9 zw$=VAph19ju6kNChShW>`$<<>q8%MaHdPafYbH|(}NAofVO z^WbAEx=8dGmD~BhpKS{fJu-y=#a}L*z}Q~ zD1-Ywo`Yv38W~GogVgO*E0M0qy{R(l@;6HGtHN&)Y_gN}Wge13|P1x%g@{`e`Xn#5Wj6w=N8Hs)gf6fQ4!#XU$dNt)max!m4$c(%uqrDCOEl zDH#5x5 zh^$~NTN4SPxsple8h4UJlfNFHmE9X*4jX=#!kF_c%h9GcJO*FadO=qEa?%)QoS?@x zj5h2Sg%S$BV(;4QjTin)#dRAuBU4AziDMzk6LZ&C)k>ZT??8)+fGdOc)tTK7*8F7PuT3}kNG+ArZ> zdxMVw2!or0q zc^Ai~*8Ji6jQ@RL)t}|c;t!S2)s;^5&=A?#KgPdk1jqZ|^V57&fMffR+@07`PZZ8? z!Qcoxc$QhXs>b@l6piWQISDPh-SWCDkPK5ji48Gc)}4mMzcdH@yw?P(ILkzbj1+Rb z&N5=Z5Jbf|bZOnDqk|cO<*t$uq#r6q=3m+peH0K)d;E`=(Y9)OfyB`rgN`gCwmw_P&Yy5L3v@&mlcUo>e5?x>A zEE?x9`Ns%ndY1ppv>>9Y`NP&pv1$Lv{~jHAD!!Y1VmTcfaed=;CHC8jA!A3n2n#rz z2i@@JixF?iyT)G+V>iI9SGQ3=S!RSlu=}gB{x8N1clVcm(3SJY4^$TfKH~A738fe% znE;mX+FX~Wil+kGMnoGNIFJ{>-pe?m)D)oz01W}(;nSKPhlMOB(_dtX_PEdOgEpTe zrYlS-HLKJIE8}cuge%FuoLIPx*e;&kHkm~!E5>(vKQ>u>#{TSf%!9mZH(5o}#^6M{ z2n$a5JBvGkJDE*?*x9BWoz!Oa7@&7c*L9s=m|5Hv<(Dr+xd>{bE&?-t*YzV4I_y>@ z)8aS{yeT!n>YAOG)^vMu>Y``UC}wHKfCa0yl?2Bi3gd>+$%6AmVv0(GC87Y!!q-)D zE0HH9)3+&titdP-@-&v*2Y4>gtH~O)%bxjVtIwpQDw8;PvmM5N9HPtF@egH`&2T6lFw4_1%B=vUm|f_=e=DkV14A0vSZaRi6~g+@+erp!kyQXf zDl2M$7WJFNu%vh)6~zZWW8+wBDJzI^5r&7CE<;`VdGz97^H!0iGB*qq(lM1o=m!IE zzJOe!kdGf+Yhg>=K-A3)qRDK3*5aGn9y>O<2E9Gx9H{I0c6d2-FYvhal^#Rv%Nlk*F%NCHV`hlN+vM+*P_=05^ zhrH4+|3aKo#@y&mQ-f0DH1qLe4QX>3EXoDgGv%z}y|=AhkD*DEb_@XVGkZM}KrIGP zF0##k`TYtt6>(QiMbO7FYgp)GfIZ>yKX@18J)TS7&AY`hWdGiM`f>bdL`eU!_uTp9 zH9EwHL+#{Vjd~YR++(Guwr9v74a8<3o4ayVm=+)!J^Gmu?_Jf#CbJpmPB8ZhbMH1U z)lC`E>lJzUVKhoT^iwh`o$&PUqTIiSl(hwl7Sp!$EXca=%I=uv1Jev#rvjgjRcc736Ei|G5hMv-{oGxqCCG1uxRlB`l%ZiZF7Z=y*2 zTu31m>EHf2rR6d&NNG$tas=(%=T+N2z;#S&|4$Ri=TO&I_9{jWU)=g;XP5?BJ8WEhonRP%WDi!K8qy!i?6NI;z}QV|@mpeAK&% zL`B9sW%)&3-+R_4bd5**_rE6Z(}Thd_t_j%6-Bvw>X}F47dFc>O~Klb*OMHDtR^6C z04_k5fIVf)%g-Vo16hggcu{1tm%wHGRTc6XqpaKiev&~cO9KjmaS2$WEITjr>eDI? z&o8iiy?!<`UtUVRma}v8n*iq7jnxO?avHSjNSN~K^Dfkkmw!iuInhb z2{E~S3#?-ECINWa&PJH`3cL+)q3!AV6p1QpvJiMo37X5WG}{b6xFR_XDL7B{xSZu# z0H~)s!^L(eiYmiv=_i*)b9NUs47owSavlRDiAT2Yk!eykBT{3Wr7q*A&GzV83g&RhsEE}4kf(&FtUetT>Gm-A?QNs zaWgv@xK8{$h})#R^ptxZM`+Yt?72nFH)ve-0hp$oWD7Uv+rO}O}0Zdi104^$3B zuPV{ezz@=xozCu>#t2ksE%;0)YFol7J0htB?sD}9C0T?Ym?M=SM6ihh-&Fn@LS$xc zS)jG!fTMCl=hlGL1#?l5RiLGF)Sy9%9X! z^%iO54gce+vTl{R?&BDxL*X!Hrjhs2z>4=hZssuk$sbt*=z@gG)CCi|E8(dUoU^bc zWz-&Wg=D<k&-Bx;$m;x4sMk`q;Q`IEif7sbWysJB|7fG8*SMK z(!ZfoJU@R^;itL;+W^jN&l1rIQX`kk%_n1LU!uyq{Fd#2YmOv6znZ*k=T`4G<+Pmn zME&0{^|=0oxYb9<+H>|qD`EwWA}ive5JOVeqP!K>6V==RWXRJbc*m{+(FBWL6|{f? zK4K?igqnVD9ssvm@@EbARC)6yoWhX$;c5Jkj_xF}NQ(epwDHq#IP)@zIt@-g{3W!C zBg*N58yfjgg{zM&F_^tgFrqFV15Ak(C{vjC?62S2!ET8jqvR{c*gO4{+SAqLD^XNF9buyMU` zYR8geHuYaFSoTNil<|I1{)+ITn;(=^F1s#+r6;Rmz?;{~o{=7P&g($z9L?y)uACM7 zw7tAx2}%4iE(8JnMb_roPSchR8&i_HEUgiF-5OG&Wm zBey78hoKL^7hI5j>v;Tow6pL{)-h__f|xC`R84pO`r2rRTW2TE@D+MB zpq!ieL*v<76UuhZGB^E?aL3#V9h{{69?tRYLSV^iRF*NZn#z`Gaq7nTj)P(8i6Z~l z4n#5^3dnhE0i^ahpt^8s+RH-1G4K^2b0Uvu%Oq zO+=EeagH=_9=o=Gi}Ew#D8OBicL9Wgo|~wC&o|*rp1` z=+zyU=ISmG<#3{Aj^SEdG2>qIr5tLh`J9J0=u7yt4tu8j@4tlZsMd8^@ztDM0RP&} zpSK$FMcd%pf#-FeZDz&qMRL0-=O1U9(@5Pt8M`i8n%@A)r!qRb!C;i--_I%pEa2u1 z82@n}`rJB;_WYiDqgj?uR$IOlzP2nP!v0My8+ba~Vh3l*lhdt_wPNxtyqTiAbrCeA zCVb*EUny6>66WR+&2i47BF^6`Y0-iN4`*R7;B^$cF}f*29B6AxR54mz}`<*SSEuHl4QjR66EedI-8(}KiOA~LtII9Hj zlH@1Z7VFOujbNv>FpHFwa}gXZbjxAtIW`gjfHYKRCDE*~3d1h}#f=iR-Ys_H@LRbV zM~j+EyQO@GHR&E_8cOjPIH$ctHE}|^>839R8Qu-#&K;!hWG#||a2Lt0R?5`I71K0V z*8xF(ZK#4*=vm??>=dLKT)vVNsWNHVIxM@R%dgw!a;x4l(CE*=1yJXUl5LS>^8T>| zQ7Ww#2}=ppd{(iYN0Yqm7MK^32c(fHxsk`^RS(NKSViV;D)mN5bv zlQ5%9yc&56D;)Z_6jjDtP6Dx5I9X(pPGdYmuqA+Io^f}|E>{V!)fo>}`Yyi0M&L?Y=dAMty@jCtL-xih z4R(Rnxm7OVNut2xK)lD9v+k#7`RIOABR_BzUhW@~H;6r&)5Y+33)w~DOU*TFQ47~= zeh1p_8iU;8U9i3(p1C?$lotabhSPi1n$zdByoG7_ah%)!N(%|C9E%tjH=By2v$n*V zAD`mX4rF*{hMF3LHCN}(LbO~n*XooTX8!u6#Fb68MYj4qcMC|9{dV>i+s*@*6$_5I zfP8rT?%InjTC&JXLQ!|(=IZ|iazKs0>jHDiopKdozV+5~i%?vF!Bxu*&Y=52(s0c_ zf4LJi!ww?i_6ed^NF)+&v*0z}cO@Uiss`jv{<3PxV;{(o9fhoSh4g0#Tk)FH8Tbp@ z8F<<;q<0h>a`Y!pdcjRXZ6(lsEDlTbZ6B8CbvkCW|7ElWQ`DD|(3&HN9h5$xTB1b> ziGA$Eb;Ygs$$IZ|M-9IR*te;RV0+nLvN+C#CrqnR*{=mKinN}gUCl6x=| zVn-lBy|H!u5iQ~+d0IZ*fA|8nbJ4o#YFa6ADKFyl`2AcGa5VJoK(S5#v#r-=-Fh9W z`_uH)v3<$in%qq!(R#5Su6S!ALi0?M9_^FGU3IewM2yMMGi7Jbbf1&)X>0RQLQLkL zQI%c+Z^)Kb#dYgMu}h*T1Jw}WgJN?4@5K_0A`T^V;`2yBW{_MXs9DpXI9|_?C#hfP zS|${Y?;dX%4+W6(YyITQgzYid1pmhW#$S84l+E59tb6>pu!i8$@ZzDdnoYV^Do0W4 z1{FAp+QIgv8qI8Zm@KbdM04qe_)`=!JA1U`?9m?3R+4&``H|OfwYvDi`(A){8pDz_+uDDHy*xm(m#dL* z$YCodz0m0SWWdQ`=cah^cZsqY5CY|N{|H(SJ*e`AJ&gOQzgSfzNg4|+q^aUE&UHI@ zyp+UN@{?SLt1uHw{;QmiJdCUOfmvQvn8nzC>*?g5RbAGt>ZEVFysHdYU2#LKRzL(#v@J<;tEOJZ79Jbd>@#uj~%bEU4y*7{Y0voptA`7MK*r= zO*VeAIFJ`x9|L9!pdq(Fifm1z5vvNU0>;cr(aes)di7>x6ZX1x^d|>qaZc=9^Q;4> z?yA@&6hvqh$>u^GpE;2<_a$T(DA1+Nr1LD*lKem5j(bwd-B&~D)5a%fsdCc{8 z;o`Ka=S3}4Hk=+Bh%E0a-5Q(7n9x(vXTkv0>6dI5%@LD|A}xacejj<_vBw??Al(B~|H5^b+QCnm zc})}~p8o@O_u8{mT)UsYN(m{V zW7A%r*=#NhK371Lk7yy9i2R5}iE2Dc@J*wp%xR{E_h=pA5C89qQ1gGlKHegSecWWQ zk87N3x1M$e2j?$qHs+?U?^^RJwXW-=7u7r%Ymi9p@0DiWJLvP3f%gG<^N4!H@njsg zsDwFCE6bmApA?C85@c#oyZ=+H(-wnu+Q}{ZDLS+lx`B<(iP0IbJCSu$)v}E#-lOhc z)W$H^I5?!JiGO2Xr_sDLj#b_{Ys--x@m+#Ah9lWbVa2}#DOQ%a!sAB6F4=gW2ltq> zr`wk`PBhO&2PfpoLMO|R6Z6)wKlkm;#*&ZZ7J4StJ` z{ysw0PN*%?DO`oJvLH|C?xmHHK1L~u%GwG(<@Q|!zcEhr;0rhEF5tS?VEFrWZlW{&#LvCE^;hh-$RZ;R?*U zXo}k4{gl3czwV^Mb-v6&LqAnq$MxU!u|6r-3Nb7%2SgQ6UZtBIR~snErwUn&{ebR< zY|y3pixr2H2ehL`=LxaJ&KhwX#raq&2TD<4di<%cnr)~b70gqz)0jPV-Fz1N_e!r_$0u2-Nj-|M_mIdKzA-HfGo6cuuo{t9{C=k;B-Jpy)WyPNSO6Q)MZ zFF`b9EBj?p&{NqU_lL`T_R@3d9XSu*w=BO5mAUjkm6=d1d+8%YsOQqZ#Z|NK();1M zoW|6&2pCNI*_)wI)mS#&E|LikJeGbM<->dF9q8Vk`Vjf~w0DX@l_Wk9eJ=ugy_USsi0dx`q=WPN zidk(v$;EzYz1ZkqNfbRkDtsP@jyX$uxOEHH zxAIid-o2E_krrJgx zk+d#v!+*~nDfx`BSOG_|eM88vqBW>P)FEL*=$6=){P*l3(z6JQ&r&{1`7EU&Wgb=h zZ0;xa;n+S2pSS&uo~uXkeO_)XwqV}j_$(#)eGiN)p6~`$q(A-s2+w(!;+x%-JF=hY z6sgGOYX80*v%UN;>h_HC_{AEyXWTJ$Hsp47N@T*G2aPfz>(3@H25n#dO- zt6UNAQkRY+o%Kkn0ZZs^TWg$no1$uU2sqFCIOkyqJuRO_gOo5U3rhJ_=eH2ywN4Fj z3D>-~9|cGE7y#$lV*KcMH{J_taPSeYKD*&OX;npTQG@o?=RxeGZ-zwHdjKV$O2b;R zzvKtWj&*nPL=sweY546Aif{EYjElO(wv5kUFV}72C|e>!+zh993Hi-&Vrl48 zX;_2nr2FBJ4=#A4g4#CPMM1iQf;Zq${WeU&0sU?&3+m(Kb?}-p7^JsB9u)IA_(#ET zF#iCDJyFn|TNe46VS7)UFz2Mh{03}2A}yr)lb|Deuf#*kS4S;4#s0~U;`#Q0O=9)a zDOrtqFIi#WY1raXBD(7>jpcQ)l@VLqsllG{Ysg#dQ)%fB8`R!myo0PfYz%qHFZU&A zJaJGhQDF;vcKsbWl6;k(PLtdVfXyQYMcroSL+w5QK;@E^{Y}f3fF)9seww8 z3G(e_=oT84eS<&)0#qy6;~NZq+>jqaoZM%9Li1n@+F>iHR-9=1Jab^65+GKsqfh1gPS7 zasQT!;=qGQ@gDWl-fD|E6tUk)F-aC#EVovI(++xZ{4*a_?YUtu*&y$RXtA}^)ga_!+Ho2h(EsiY zcX}V>y11)!rjy=oy2KGq_LcXY(piXX_;ow$?<#(aLUGjrJQn=W*v?rqn+-1;0iw#ye^z=0s z2c}@KzyS8)A|6UaA1XhYZl+)!KBBz@o&NTOO-CxJDI8=Q+vXTilg@hkL8rNUtMWTa?e4feL)j23`;08>Y)u473``di3 z-O8tPa=ozn`V=E4(fL4J4y60ko8g;-w1Y4duE5hJcmu@+h(LK8M?bXYnD zrlTuL^DWYZel31x=$=Po@jY@n9d#zl3^ikh+>GtKa!EK!w+cF9hsdwOP@b30YG(~~ z+W)MocAIIWeHGGvghtVoMR!xQtRHRD#d-ELUJlFr;Q-|6sBux`ip+9x*AQss{>Ff5 z#7mMHekY3W##JKhbBQvVjBB@uHQ@e35TBt@Q6fwMv9*&bp0h=X^~}dj7~mftiy)DA)b=U8wKE7mlhjv- zFIoB*N?gC(J}?Wk^LBjNSB`=cn*VzsT&8h2s~8+44Q~>>=#h`-flmYl-f9xrKB{=$ zA}!k-hw)B6KuN0z6i4wK$0J!jNEJmyf`9a{Mct(|BRP}3w1?>a(pf*>W6HOHcCS%i z=>(1RNm$Y&ExyYp=41kNXYKz7sOO}-ANFQ*ak}?50;J+}l9jx*$zxiinXZF;89piIgg-bpm$TwD>%?WxAPeH^(WOI{j}GkMA>F<^=Mjl=JFd zP;;TJlRnzlI3K8a@$2+al&1p@`sm!oF)J*h(eU9<``PEvwa&)&zAvslo!X6bB6=eE zBd&sS9MN$ylmKZhDBqPe@lDE=VF&fM;5RO+bzxeQC+aO3jxn_(;X^02{ZZ?gt{hR{ z(kQ)#wJmW_N)Z-jL-6T$^|krab>fY5viP0ytd)%5^T4|yIEyvb;H~TvGY~#!pO{7Y z$ArVR$)!eBfigsWV;l{PG}-G`%^I%Jl!|pta?sREb;QWh*6e=KR7$)`Cm5GOAo)C! z58E-Bd`4*JUEYo}0KMH=GxQDeP1#r@r1nXE^TZaO?x5*aiW40$Z4`{8UTTBEV5BIq z5Da`*)z)i%QB+HGF0YEe@cVw^zAApDamrp+xkj4uH;A5N?tcww`aJkG#DZ$h4V|4e zQ{*izn$Y%$RqzH=lvX12j**hA+Okeb zan!>cl#svdB#5{?@}E%BQ&cXg_Z=FIhJ)!oQ8EomGbLZ)C`9}7eWYJ`rW%eTheK0F zeMmWN)7qj6rZ>=GvNzWvO#K5&28bdQEows`wEy+M`x3lQef(pPev(&$@_ljmfP9xy zS_Q5q?}&_d#Al8*2hF6@i%n)c8sM6Y+K#MZ@9Fed^xs`D-yMz>m7OXZ`45qPnJh9< z`$!j0Uh_rg2c(^WHSz0?@u9gIevhNXGEv7?Ta2JnPnn}_?T)g(zAPdCYR5Wmj7omd zCZf=3KO3o2XEwakqc&|G>Ri`5Xha@@5}${_Hy^5BN&#=D(|L}pp0cR9$9rTII-xif z^)Rx&T^;u;OVpI_p1@5fRiYc_OpeTEQ+r#d%arY{7AYw=MM~1w^ajeJ--N<5`d4~T z8b0fQL)>bxP8}WbqmQ@&8@YESf~t0K(eg5;y+-4)(ZXh+Cfj>GDp3=TO2lh+13frn zEu)b?XmRrzkf@Hkt4@JdH2(cj@`;c0xEs00UC2(=AWVCLsB+ofuoX>H^2IfH1U(JZ zxxVYsfF_V{7Ol=5l+kEr7r?iTjtGFmG`B8*Ry6Zw_{M5G>Ok43qFVP8Rb-DNKb>}P zA6_(2L+@$kSSOUd;|$1{;CIbGI!^N-{sW5AD$PgT$JkQlsJo{Y6J-ph-x6uC!;wv} z2V@v&aDF4rY6uj3pv8u9(Na{4JdC<&FCKd`gW#U8o=0bce&Pr%Te4F#MbbR34c0fr ze3>#3OeJ8zz$+9d-zn3sGCwngFTv_8*p{ulj3OcPB!^pg(;^+x!K~v$#zuoOZ7#R!!oM# z&U^WGyOTWj(NoSzyL%btBMA`D?s#5ROcXY&)20)nibKLoD@q3^G(YWBiYLiD|GlH1 zKeeU5>WhHaf#ANT|oH%>;(F2cSNGW9((jo9_%3zRx*=A`i)@IS-s2o@q7oZt)1 z6SlN%afqc~(q>DpZ+SJU$xLt#?m*5Ly`DW-KN0aKWiLDyP_;dnf{qqrTMGWRbT> zeEOMA31yx>PbXc|vF*~!82EfkKUI_#QP4M^uZtqNyx9FUA68uhQ!)kgtcbslEVS#? z_o0?C?~a1RjMRW^vgM8eQexQ}zaEyWcfngLM(P$OihR+{ay#vpgaX&G4eQHMB0zu= zMYn2zd=mx$_r#)fLb)niiIn6(eZQA_fpL$#lmQXCk(|Dds`}7JJiSeH5+Wkn=l%l4 zQPyzzM5XAkZTW=PHR#Pe4a6BgNSDZPH(tpyy(kiHd+V(Q@%IVKV3z!=IFE*^QkIRS z8vidM5|Hyw+L>WG_3#}0#!)M@-Df4ozJ5sq_XnT=4D!J>$dgdljeN>Jg%*X|!Fge5 zL}%I@_Dwk}u$CV8=VOjP;gDo^X)u#DBahh&2DA&aSeZdaMvg!6g(YA}I_(K)ecNgO z3RT5S?Hn+n|1OMWEVNy5!Z*8Tf&+_CIw?&jZLSaWiN-wCuSxgtXYYgV`*NXD6{-;` zE^BEQ(;b;?wM~Kzk{y@>6Odz-#o$dcXfJJlv-qguCkd1IGPgecz<`Ov(iTD|(`a;% z#1``RUkfeSZb`fJr0W>{D@r>N0n?sO-Wzffd?T_Pb^A!a_F1&s!1NQl&b1+(6Kn;g z_{_vn?pQm94n8p#2R0c6N}~QR2P)ga_T7 zBWK*sgi|_Jy=aZv*s(?(kxo6WALQXU5Yv=JYDN(_s-7~(iHC}zhse$z;y$k8)7E9d zKsb3U_rU((ZQj8VGSj+UoRH`QTwDOfqj)EPt&NCSXYEvPEi9=R3@jNMW2&uboHVwv zZPDP};vZgzwYVhzVjszQ0!!{2H=niotfFxgf64TT2pq}!i6vujASg|C(vB|gSZ#G- z8%(S0eieC@-S`QwxZa0Aj{UH*bdf^sOU)x~s+%Y+tpxe|{O7s#v>qordz=T1mBjkc zf#$5uQQ=uCzVv|bLo0~()B=leT^Y^RQ5=V6YiEILWBc|3%c3mxcmjN+ur~+s?DE?2 z57`U2y8Dmsce!F3On{!8x-Q~}xx?&%Fr|Hy6!l}sH*H>D>zH7DkIjIw!*XDCSPpV) zl&9Aw>#JR*n_1+?6+R-QualLWdaTLWW8KlkFUg2UrbzK7y`@!anqZykJoc`5RUF}{ zBCG1Cq~XyBNl*8}B4iWs_kV2n&4ubNi09NJwG)d0R>W!SU9})^ zUpQX+97lRG?)y3LebHe57#0AB^YEQ*;ub~IxKrjmssnql`>g71)kE zV@;j}_pmkS_AJ9bqfsgiR-4&*wCHUoC}xCf$0Cd|9Kb6i>Z9)Sk2e(QwDIH^6G+{} z3PiE1b{aXH;?P_wt#XWut3>NMh~c~kv>0n{o?(7r86n=$TIJvGK)PZi)P!}6$Xy8L z+50V&QCZXRuScoce&;R&f(~2LBpeecMnakd+Y|I171EL}1&?DpH}yh)v8%>Z-GRcY zn1i?lQ|xciO0eyLc61e3yy@vsDFFNyYf2-z2d?W{LC`krxQ^JHnkagpbIs{yr? z!RJWBJj!F;BGkzWYN&kxBlKv|<#^3ZK28=7o_2oWR!MX={i|JA)E?HE2Z>M-g8#22 z{cEL`O75*kZF(SuvD9^iiM&5UJH9&%7?MSfYKepE9Br%v_7TF6b{$B{G9^vs8->^z zFGmk_U>WDc)Ht6z5bQ>)-QtK`??|>x5ON#z7$Kcuu{KjC-XM9);REOwa*ae|v-(eV zg%Pn)At2tdX|WK0lX(^|$PqZo!4X~V>X1z|mAtsLo#*W?#K_cgAK2!S8ioO4~GbCFE)G4YgET z7{|SKpQSQuR)=AOAvOi=#cxv`>o>A+*7!YRuT9e(t z5$1omQ}2r1u_*t?;c#VK!Ux5n<%61?hg+~rie9lktlrVg_gE*_qgRkefCHPCH0x+c znRjOtqScp}EjW70S1_CF9*w9v&}pyFkv10^pXOu!7ehC0i&;>YY_)Fwoc{0*@;Het z9{ky?%cbrrkd?dEHWJSK7s|769Y5N{~|2RwQFW$10y5*fNioRit z?a|9X)fq&~Owoy&7ZzOyv7kxzPz@jHz4 z+{N!j)a;%NO|bTjzo`x0SLd8R=&HS{=t8wOgFl?LKlEBBwS+M$hq2BqF%dq%Ixfdg zZ7{rd<5X82V0lgMH2p>FVGhLml6>YxP51n#KI<~Z+HlnMt13doJ0H>>R(?ql4aJi~ zE?G3){dv-ieek_rPd}umGn`F%xYRnwdrefbF{Xy0rUK&CkFX8T=BbzbyXt=ah5RJv z^Gyz7l<4fee2URxjG195KS6XJP5T?Ehdq}5H`|}Z9WlXo>BhJihSKZP&Rjc>CEFva zli#VAGW%qUdtoTCE$x%#ERlRLo10U~@83s>t_T-~5?>NUy_NV0?D0|JOU{TEyQov{7+IlQ6NpAm?^0cTG#`0#cA5YHmUQtCEk=uJ|*kT-| z!dTW~_P+5*n{vMtEF15$G>S@LC{0-phtJKMBQ~%0P@Y&Ve<%{ic`c97plB4v^7caA zsucSnXL;U7mwm2wJSB&S5_4Y`U**WZQ{E%)+)~A#_#EN8oSdgm%^((H-umW$mM__S zN2FrDM0{rXo9}_f`7GtLl+RK=OZhD2vy{(LK1=y5<+GH} zQa(%h-#O)A6@ro)muM1qNNwGrLbdz!EzYl;LsSUZGb@vOY6>id(JbvYSjrM=~ zjU}&O+t$JRUr`$#`+PiEVm}q_f>n_sl2mn`za^RCz(K7Q$W0*3Wq%XWIq3%qYLA2wl0 zT{T0I=DCPz5`mv}ix-~(> zP_4UQ3YJJ-7-LG@1MhdC8f$$HpRX67yN1PS5f?}??Qf8WY{!6f;zX-?#~Wv!<8$^8 zi;v+wX?scOteS5x@of1C&a25vM=X_mojW(lBF|d?YF3_9Xm1Zy#X1pBb&i3(Tqnxu zEB4_V-W<<$_O8gMGUS!ep7#Iyi&2F1BjpGBRbAxK>b(>5nVr_QH>Py(w{h z{j8Tf@V*w`vd3u8=cqp%!>?lzc9 zzpoW;($E6Z5HJrG)rSmC(PaBW(-r9D7ZuOrbFi|NN~|DO5-+2IZj#J36thU47RK&A ze4y1DjslSaAxul-C~c>H*K2mlH&wfT;`Wd_V67->+Z94P zHR6bN3bJh{KFJaX2e_WkFmH$|iilsdTE@UH|Dcvt(1J=e?P?ufoA$V*0mMyOXhbSM z9~K_T-tx6z9-SVSQ%ngIi)w?2S24XhuRy>1TyKV@r2qBWzJ+>M)oTS%?y22gDV#<9 zri$P(eX4wi&kwYKPr1fj&_lbCB;YjI@i{Z-AWMIF@qkYA`d6bh>DxvDMWv|E6uPy7 z&ilw8!(FO%wrGgsz&qNzFSR>a<<2mO>;4QTk{5pqF*S=uDrqrGd{1mo|7xbu!G85N zNsYOC?Ce=_bVpF&!=UqOhnN{l^4GC*Z7)H0@+x>NZc&`J*Rii+onMMZQT%Q;j@@SR z?!05=-{hT^aw(I~%qL#T;xW`7-;7GgmaY)>WSB|*!CB&tqJ6z9vYPruc`Leqd%>ht z8RXm5OT16B?B5F}ugG9&7yvJ@7sliE0*VeuW?z#Qu#0`FE|~A78NZEZo{sQHXAdpQ zJ*GKSIEJV{5On`!aq+ogNKa=Hk5-Yu_9oqQA{t?ey5b()S0-xW-_Hw*9Cv`DT*Xmr zHu63EhGq4i)IyQFXTwOoXXi|QsIf_X3*vXv*|M}cB4(7mv0o^4RmBN0pFH12LVe=i zIub@*+}^LkW!n8Ki_#RXijr6k-N@wpMmNGP*6%58Dkl@op?9J6@yZv~x$wc2EiJn7 z9PLaWg)`ap0P7cj?|3O8MNPBX=&mg#Nko(1k@bo-@Vj#x%1$m3ik_CiVsNTqRjkvK%Y5O?Z9C-RNY z1rG_0ebN%ax8%7}5gr%ylWe15Cu?+BwifCmZp{}0=#~ayr&wUdT(V)F8;lwfO86f# zon6R}5*w)b$q#`qD0PasjU~iuK5hTJrVza*E00DE38~PUN{X7%xkz>Ov0eQNSZ7)7 zU1rEPzxyN{cd-MjRi4nlw(96v5;j zcf}gYo~fH*0yOi=FWr6oXu&=@rDUEERyl7E@}IQen@A|~Bh$EWQx=aJ^xSX2VlLz& z88SDujF_-o2!Ezd~)l^gCXmvH(MDsbQH30F96U-*lk52a2%kfLa}_E`~i z4)9s{Z(z3ipin2m-O6uU!YAY(Iln-;UG4PeJ{_%kYH@C#A0d!Oo_Ao#=L5njoe06d zw#wTC{jbe9Z{;K*AZUPC$33{l0;LG8pqH=7=&m{TTu&f3T7|Uxorda+#`JsCG)JA9Y8>qg3jhuD`&}kS^R^;=J zSdZsqjBYsOs;FR#9ngzo_>#mfqd2_xwrCdJN>ygJD$oq(8i~0wz}-m{-9d; zJ;c=V`upkzxVeSz=g9)I1Ji8j2CHIuP#bZD%GnRa*weKSjAvTzLVxDvvZV*(V$7%L z8Xjo_{dKwNrL9onM3f8Lf%@G|S*8YjuIQiC5vtcg-tniP6yy7+@*=0d0)3d5S8?R< zt{))6@>}pdpHWSMMx1jaOart2o_=qKdfE->J;cU#`g4!7e~TSh@{=&0FE=s8U*r1_ z^4?3>vk7iQlCRV082+D9nZXY6ZmDBvguaC%X<{fvBDhEMSH?vI{0g1fTkz@2>xuj_Q>uy(T9l^Tq(AbhW zB>zG66F5NUc8`@=12@Pk(<)BH@c&d^7>=OvhLpi{^J7io=V!RiGT7Jp{8hR|XI-g0 zm6lR3G%X8?t^5U_wm1iLW3D#K(ww|JIHF%F`E`daY_bf7{M2Jv5&3HCX=9-ejbcx_ zmpZMEk?2-OXMKj1gJo#pOX^Y>LA3_mGnMZ(sw*r>+J)->F0du4V}cH<`=p+Xb(7$9 zLdfr0!u49LjB;&0HEM5C`i#0B8;Q9*x)8cbyTs9)T2oiUeR;3xt+FN>*}3LmmmrQ+(5o~3Y&Li6=S zuw~Hb@*?E=Sk6{kl%C7b-si}R1?Ozj${y89zr!aHrdNa;93$yoFt;^X4Sq>dA3oMR z0#g*at0zfz%0V35gW}E-XxyA`O;>NhDn_UBYv;d488FxCVNZH_J)KR+-N&9bW@MaG z23)!a$wB)H_QhY5goJLaTl|o^u}%DB_3@|@jrq)hd49X91?&E;IBS!$t>a`K4=`PH z)|aizRGws4Z#O7XH)C9}z?Bb&fDNRIVn6Bo3pymkl%Gwxet>nX+xb&hNVdAD1%A_R zPqrqHE>j|*J**>s7q31IC46&8HmCv+*b@?NOJ^6(xMqhZ~2 zeM7uHk2>_%J@6Wj6O_`-QLn(VNzFp(we#F?Uy05PHAuwE@G+;4gFpCe?Jdc&vRSVT z)lqAto@bX!9_}KACn(ljOYHHov&RNHBq7jxLhWJuS=}VZ9|c)|>yU)XaDs2xI}C?t z6f7o2;r}m+`ZUU>OLN#G_zAAusGS_`@6yyTZ9h>BSKAiHO4&6o(8@PmNnl$}dhXtI zOS>}_wZu}K&4PHA)1pGPF_GV~hZf-55*;nDkn{loM+w_)^|iZThr$@f@=uTw>G#>- z&f4i_sU1Jp!f0nYqJ0U3>Sr52WlE~URxq}~H~P8V4lsxE2j0bTG-GxaRSS-KBlUc) zb^rxQKSb?t=j$hwPVY4V#&$ULOXWYhwt74zM?18~vJ!9>viu^BlDuXHeNOGshwL68 z&$FgddxndTkxp|&>5czWx+KG&8`HW1wwAUpdg<|!|VQ=3jV z?WGpcQ`lIG`;g+rM2ZI5Nx_{STSL1K(%2e*K^Wh>TMfrDi}rn!iOvP)QYaE+JR$ZW zpCi)JPzzjv06U*K3=X_O{bvwLy|D$(Km@0sf}<)uV>QXMOgO~)#+?ppDK^{w5aizkVz65 z7K-eLUA+(#1qt&xG(zI>1nhxU+#j%?n1=*rs8>!=FB+8Z7F)tb!q?mv8U|%*CkdCH z_kb`(a&M*E)Eo$3Mqub{pFI%HTlqWRyep^d;gYN?;DDN1vH(%RX$aALxRNB~UO}Yj z_jKssM40Bs7|?8r`#?K^*%GBl*6WJZ(;E>kfwbh&JI-_91B&bs zb}DUnu1V?|Xq}QNW~fi16%g}@f-?cytn*%`^PS~<@K0)*bs4V$W?JKC+w_sgs%vDF z&mJ+J>|ZSFNU`}*=@ADi^r1*E_CdM7NQV+SwZv^()Y7S}w3=|Zl}F6!#!ka1FNeTk zI!p5qQzl#ads99oJT7if&A8)={)Le30$(wLOQ9koy%aSLBhqcPQAA0zD)))*&$K)0 zxrSIhy%Fg;@Esw|aw*gRaLJ&=GH7zce2Hav4$P0^3K=mE-t>H-7glzt5q72(Swm?a zU0U(x<0XqQU+}iVpM495RqX}uXdNv*ZY~@qov%R;b!ws>U*j>44x~@fNHn!TS&%*! zm+BK`Ec0>Xtv~(6R&!apuM9p($UCVgjjyOVmC>K{QrB&s(Wl!=jp*0Ler)4$LfC1Q zwiUv0ybvwLNg83Ut=LCV&G@SpQ?(ge63>Ff=d{;BS!%nHQMDMB-A z(8U>-)GPB&sE?QY!Zw+)O*qM!)X+R+Nq zPvWYEKlOn=_!pmhm#TZP?RU?1BWphc#uW96TJ{=9px2$Y`4dM&YfE(f+RP+OERfeg5U ztVLf3;(D$;Vx>u-%Hk)x;XJ!j@QjSc(KC!Vhx2H7g(c5bBHiZnZnG5DUFeCJ)-;zA zZ)486w9AS-woG9y)}fCOrB|i1(9$5`v`~9?x!s)GM@Mim*15%2hoiR4(QSF*IFH#l z#|t1GMop-2ejZiBwfQY1x#<-(B;Twisp=09$dQv~KzApOC;_3IB5r2ebafE4ec>DK zMUk+DM-06-6V|5g1`CMeR=otOV?{zR-R%JhkwSkUNx2}BeFqm zXg;>J=l(>wDyxEe2d)mblaAs18+B#V0ow=rj`Ju;lGvBmMFFIdm(01xN*EgN1a=@u zrxOq7uetf}`mmVLs|TAHy>Eb{oyz+|uQ4t4_{MGs`o2I99IeOZX=j1~njSXMi5)&8 z>3h67x=05bEKX@qzYc`*uCTKXqW}3^sHuJd^5~!)JY!H9v`R^eRc`vh#xVQ&J{UJ zR#+-ua;`{-!@YbG(F2~@Za{Y6`2$54oB3k7dM|F&PosXsVLo;} zqK1h0*#nACl*)9fTE2wZN03u`WFHuwmZljoG%fAaqUI#dtNoQ*6$?eletMa&JJ$@v z&C5~AUQjdM?d(8p6}M zJm;nJk5R;NBI@ly&i3}iF_>_r^&}cdo1{{^7RuncfXaD^B4zy1PcP?n*4L?r+^~)H z;M38Qsc_vd?ck73nl(pV*T&z+lk83sF`@cfTKSGc-NC_OC46qQe94kd?a=OpSqoyNs-z<{qg-hc-*G4Y?Fg0N=`{H*K zr#s6v(0j5)-ia)p#(YYxNUG!&%3RhO=siW~3MeOTdgpU3Y&Pq|2yX^ z)|0fTE_ZmwcjuC{QIggp=8Yb_k$Sk@x9#9^4NLDN*1(=T2hqw*P(}yB!chG^jb-Ug ztw)*>1-LFY>%U{Xa+Mi7(8*Pl!2+u|^%3kBFSNG@dEkLGI-13j6W;aUL)OD^ueU?* zSgTSD+_%#xx>Z0Y@m-kyo1WJihW^%^w6Qz|?TY?8mq)tup&Ts?Jds&!W+Ci9k5rxZ z10p4c|2MG)K3^9mx@39xfm??uHkZn`u8{tuv+o}Swz)u_ zHTJzpJk~bQ*ZlOJBEyf^pjL?l2i-5IVvD3xksrSfwM4^vK(v3`{BxwIykT|?p>@;G zHbag*&U8HA>N*Qb+G3IA-CvOQOYJ*OKwj{SL@U-t8tH+kmtSRdby z?y3)0nWiVZf8213;!fGcR!3c=iKc#RJ3dE$s_G)YJQUiIUYk0P|Mxe~{}lh>|2HWs zLKE0GjN(YO1$CG@EDZn7kJ>Z+J)7d&`nWf}A~c14BPee>P)DdE!bVWu*8KPE5z@1J z)1Re$mhxH3XDOehe3tURJY@q~CtSUh`LUkkoc_C;{`^DFebMbb-A<9SEYTI;RCSf5 z{qCkeU1eo|Kc75$TPjt>S7CH(a4os2s3Dfm_EdgTd=qadpMQ7LpN8_Yy~px5n?Q8J z(zoNY`G0E3n`A7bM(ycrfw@|@b}oG14OjU- zf(HjyZ@)y|o)76}260Q;K|a$UXWUEUHD=<0tyeiN=$qO(O!-I#q3s^m1{Sm1g7M@YxdkA8;Vap zOkR*wbe!EWqP#Wr_MPpOKKJ&~N(=s9iH7y5Qe6R4{@ySG6#N}kf340v$ni%KXa^>r zSWjiy=jQ7<9Np+F$f|CUTiz@VfvGHUDQ^hM`61FZN5pZt1Nf8{ z=c=g7eRbq^hJdI{!k2eYMjFPm>foST4Ui;7~6DF-gz_)i-V1T)*f;?@M6aHt|Ht$wiL3G&(JADJkc@&StWX))8Ax{|F7~DeWgY+u2)dXl2&W zd)zEPdCOU=qbA!k#Qj3tqW5a7?WTwd0FlS!wSQA=+LRG8*g(829&4D2U=f5E%i?Rs zqyc_gChOxAdmh#@gUBrc@HhDxeu8Nm@*QN2t(Za_Q}nd1zKnefL^`HDfw(Ni@9pt> zG1)^Ne13*$$v$@sp9^G96dc4a-z%<~GevQvsHaH4@0(>WB_S%GV>vw)Hy&j-j@a{} zq6NfrlCy4`#=%~NV&0*qB)L;%M2u@UJ5ylV*%rE~YunR!0i~gu;Tc;_?FBC`!PU#W zQ7Yx+lS{Duug1mD7j_1r3@Sc)f*4BuG%i7*-dk2=P+3?{1rdQIgmb+!aU8M6j`-^H zx5|T&+HLq=srS=&H584$yfohAufpf3XVACcHm{ebxYu;QiPzro0p@OP=p9~idgvqG z=yITFq-P1%QkdJtS6_J*MW>fWsVNgnPqsJg6EvR(& z@9w3`E?LQzj=cY;z;n~q%+5>ELQDF|w+Z=Hw}Foqa!8SPyuI}?kNkK*$I;WCp_&6# zLk~R>2%@0(xvCu9+GfGDeY6`hl79}Nd2t5yQ=%x}pK5v&dh@wN`-_p(i^KyH<$7YM z^$SdKN+O?&ma>L&nh^M{zM%b_Cn6gE4kOQ8VHa;=iiJLUY;ok<%x7V_&q_Y?yZ17m zR5CWQfi`^iG9fu#O&Y2A?7N_hh@1HcfA68Y2e9q!k|%_+;Q&gK`Zxqr2Z=qj&-{2; zeKj>3Z4P;p>25~}<=7ORib=qo{_OQQs5Ir^Righ7BK6-=S>l1GvbZ7Kdfjo&Bh^j^c~`}qDaJ_jjeO$o-7&As(;%yAeskJ*ME?j@&(-tA6{ z15u^{d2NaBqxfE5)WCht#*alBa^9DCkvws2;1c8{^&m+BMX8W8)f4ph+;Ep1jl$=< zZqyk{Gsq67;4^)lsoWcSS>8DEhPKHi8Q!t;))%u;8<4XG$ISYF1R+Dec_b?HTxbvQ z)oY?K%}I(FfzRm%%8TQ(EY`Oc->)!V5m&R#%-89bZZMVjX8*~zL8tU8J}FwqPxxGg zB|N8Vsowex?I82jdSv|uUK@qGnF!^CU<3Dxe)T_xq@-i=R^ zj3vbHDoZvB9HTI=foME6i>sb#bd+uQZAeA(c5g~is-dudJo;)2gVcCK)nl*n&P7f{ zTzxG3|2T?{o@b(%Ev4|UH@x?|vdAH(C~swrUc6!8qXCU2Sl5?<*+-HUe7@A!&!!Mo z_@%o|{V^0GmU9}hB8F)4Kw~LaiuX!oKLvPDQjfZ|#72nr-T0aX>#Sg-ae;t$D z_?313NHV4n`Ufm}oi?3|y{i3X9VvHY93?n@>)&zY{wR=E>Q?cq9~`*hYiM=vD0%2T z9w~K|%{jyVSK{E1e>2@oQxO09z~)Q-|HKq+XfFkyO$}7n)a8F!pn)6O4>>)mOoSlY zuCWg+!six~CeaqG#d9B!)73pZ?#$1~McV8*Lm%)`f`>kkjUxPh;NSFtAXV%XO%%G3 zJY90*S}|}*67T~_z;=sXvn~O0pW)T$eL2=|v(e-z$MDQogWPjQhO|0;>) zAHg(VD@Q~-{9Rm65iai24oLc)kK8q~{rH?mHz;RMT_Hy=83^pXRcsx>7PXngF~rQw z%*@Qp%*=Gm3^Cis%rP@l%*+%sGc(gM^H`%__wj0;Ml;fVXlYBkyLZ)BrGBWcTFcho zs}z0^wFs_rK;@Shnq5~{RJZ%iEf0eW(gDuRJE-I?8TSA@PBl*Nu_O~yGb=Me7MD1t zyS`;Xq0R_AUM5qiL!~(NNO+L1O0;>@knX#P{H#9E02ji;5;Ca6LwHUrv=+g$cr(4z zg`VyBlTJEYSr_3t)DgapKuZ=@R$1Yynh7^Lt1Q%P)el~iY0C(cvLeVIUCc>$Wj1Q*P9w=+Y`&f(c8~j_v%_DRVCbRcl`DZyQEoSP=fNcQmLjT zY`ih*G&Nz$kH$*E6bl?2RIn5%Y`QMQ!5$2u+xUioB^ zM_m$UTZ!e&9hn}HdVzbARIs9Yt$|ctcViS9%m|pGt-@oL3YBfsCdvAqllaUx*zmn? z3k>di$I?>h7{+GEmo6Xw;70HgJbql%$J7C(dF>_2*g|q>#{tkw@n#$+x(qFwQ|@yT zSqVX&yUta2@ zB>Hti%`nvci^ShPx;#3jLBag?J6LQ2k1ur~lITSGF#*JC1J*kCrND%Rcu)JO4S$T! zZ1{O<&yE5~8+{#Dkq0<591p+IW&XZozP01qUs{^tDRR-KF<9LI?kk*4=30vnFzXod zEeZF1T^&!(05hbKrD9#S<1UkUED$cbirvu$1BG;KkMSi5AQgdMiJjm#KxIdhck>o03<_ zs^_ZVm2-Xt+~kS9VLCZXXPG@hz!2FT6+d@qmTS0~tVz%17{7$ZyFUIx60?ARd|G+O zj$2wiv*@cn(G*<6r8yvSst8f)P?^44Y|IVBK3Rm6V(Py*;NEJ&<>g;3(5nD0b_S7Q zm8N7QWv(?wwb>SxaAuUV#BP0#ajSO>j|DoW=XNTFXY$)jhWW zgPt5KPWZ%euWvToyA*K;dui){GuS#$vN*Mb$!n}PN8 zWB4%r&ZW|rL|0l+)b?z*@p?{0rs_s1r-1K>O|54G! z)sNcw{mn0GBhof!lj!RMcN6|W&nx}Jlzouu&je#iqV<hZyRR{@)_NZTUs}| zoG-W;yoH^_2B`*+&%X-s8oKndy)v&HwzMf5pj!p~Tv!Zhd7?FfYwst5=%!|s$_raY z9N}?wya!hYb(VT+OOB(D(wfhfR28zDUnuw)2-1IDH0P}N1m!@!7A&mU+1mclB-CUCx;9sjS{3?8^zSm&mZ}lXD(>1Y*X0g)$DLgoi3uJ$#u8c*I7Ovu z{;zc!s+{;l7$O_NmbMI{F0J*kidzz?Z=Hy2#PEJ?GE3z0f0VFrX%i4LokywxEZjqY znwv^4R)o$C_m)^~9Kjsjm+_(>9qM~~uF6|iHD@Hu3}~ld|4$63|6jT1Q}5%)|848g zOZ5G#;P2ee8o93jS1SLPBL6ca|1WUp$K6|6$PcN%pUIXvHupmhI(*3}UsI&r@5P{*Y%}8ptFKp_L&aea-Q<_6lIdG-bs$ zGcqEQk&)5T(xTF9bCJ&B@2sqV(a~91SsB^f)Yqyr zRa&gnN~Y6cH=D}V<8s$dy_qEZoCSXiLZX{!zb(GnvgBY_wU)yQPh{}vY1?CtHTwdxAj zH#QD-cJh>qq|01RW~o(*qefHcDx3~R%Y2?epu0QO5NI^jT4OP_a#g9X`YEZYspYC= z!~g)``RS?DdZD~ry(+z2qlVtVz+j#g-|E+_fbdhO*p&Gx68 zo$X$C$9dU&-qf6&nqS40uQoduN)!n0FV-~PU+z^tKi=64d%nTpaw-Nvz$r^ghC?9W zR}zVYS{_g5LBqkRX=?rng~KVnzIK2k;MXM)k5UvB4Hl2VEmJBGx4Ju?!Dca!8j8WI z_-eb=+tW=tqfsEad}gUsBDvMqfTS~<0gL6c%B|*#tzPa<(wR&`%_lRC$lO%Zx5|L-k!Dp8U_%Pkf5QV6@|cHSkL5(0b^p+Wo4t#8T2d3WKt|oW{b3& zY|~O0464y+)GZH2leHVIlhteVtG-xSUaU51H``||))>@$p|#u_iUvkUtLf@yvfHf| zeu1_bvDvBP{ct|B+3DQ~*y6v~>NbFc z$5j*-4ur?&EfooaKe^uN=XTl;kHP0FHyMsOdAiw?mX)24K%q!VN-9jGP&l10Q{nb~ zY51C)1@#tFUqj){?f=n1uiKIviNSC>TO`xw^ITW0+nQgYQFFT5Xw&BR-e$kvl9#~& zI9;sLY4d$;x?FE9*xxtZ==9cjyxf?3e|@~)?giuXc~XqU=bPOdj=kR>K`AOMJU*E# z@p?Eh9y++xO{Oh(N$^zC1fasOK7IW zz2G$kv3ss%)F)fjutZYK*4gT!_Wti&W&(0*Ys31q|%psA3eXdLcO zF>p~tR7KHvLN4h^N#qeO{1bS3r)D02+Qj+gx}(w5)~)x}k*C0$vvWJo+1p}t zDK>Z^_TLnwr@ha6L$pr;10=VO+mSOKgRSS6$9 z(lS<|%w7xsp0kXnXKD5vg=aM+DdH927R6O3*aGU!MYok1nqNIW2&{?Z5xkp9?bDYB zWcR(978+9qUEc4CQuR5N?!7#Y{{!nUSy@ERo`K4u*q$sQXv9Tty&^d0^S9FarNp&6 z``SfbIOO6Pv3*s$>!HTC55FosF+meGXnQXFXG&w*rNO;GASE5P_Mi61GKJ?pg4gVn zQTv>%D#DbLmw6AIVE2ZA{_T(@1DRK_^ofM3aahXmoV7?k!=W=04@g;{B%&SJ+rm5@ zw6tlxdmMZq$G;*$dZVBkS4t0EQ!&|Qcw`INCr?IQFaj~o0osl|zIa{ClM84ulnG!s zV$n7H*|6fp_Q67;rqO&m2e!{pXM&aK{^l$sW$6cRdF2Vh1czCOel=h1&5GHW#!60gKjxaV+^4ozv&@O8D+v7F$`S)tKy0BsleRs(XOL&?312IEQ zgxPZFdcoMxLLxlY;>R7yD`u(SU4lP7mK{61`?7P&57&1?XS`40MVp(2=DeVze9jZm zxn#2+TuV#Z3g;|EK~{ve-B<5SMiBwU!6VAwK}miESGyEKW!mHT<@_Fa@by?~F0Dfm zL_kSaeMl-HsUOd6l4<9CCDOpcaH++Q-I@ldPSl%D02$L-@$YB6 z&nyO@?D}q_-cV2xyh*+R=>a^#oB(0WDST@#@0ORHdtb|5=laeT;rCU{rQ}Sev2?k) zDsoZ*%0zduKophlNsO;?fd@qH&@#(D*W5v+v~Xw}PaHr(yko%{ z6!}~ABEGBZ&H}b6gU@!Ce6tZwr#7h?wWfm>5(6oX3eo!Kyr0#4TnNTn**s@E%8G|* z9k05POMKhWU${Nqzu@n`D~#NhIt{=UXMj$KSDVonf4ZsDYD|JXiKFw&Ja7);p5`MC z44tkBhFx8ZpHW|B{b;Tb`~yRW?n#>#6`}flm2}S8%rIg*aHR(%JBnXA7-u{9TsVh{ z!*zD4q%2g{Om>^euPiEP7B)beQb=SVQK&ZW0!rEd&J}%c{57VggmY=*hi4NW9WYSL z>krpkW^F3J;FGqGD>Ow2g{4OWYJ_kb%I2W~DR#~ufIXDGogZ4#D>{4QsYegin}>V; z4)h*D(Mt`?ZGH$G%GeBZkKXE<&Ow})BDc-MSeBLHGmG-Oe>k>9){GnmX*=IuTlcYSQS_grzs?xKYfoziqh$ooAuNwwkC8v9+( za3b$r2Ov9gn0*2tznuE5%ZAX9e#}$0gAbM_hr6z?J^w%MdC(y0J28HF*KU2&=q470 zCAHgJbV;*)rL^6Vu$bZuJK#%LeyBYRGqn>@RPfHFe{8_gcvt1iLM_}VBx8*9k{&`Q z=kg}L;J|m{eUiLo<~<$31>7~!JQCE=8BLi)Mko&O?RezgbK=${Zo}+TNb)lxy7*#U z+~?+j4Oy}qEOu^)M%FO9&>$hjS;XU6&JXqeNT~NYZk@pJl9w?(?-`AMl1rXf0o$K;$hu4>g?OHmyoY#Py~u|i(xQMjXV?M5TYjG!}bk& zrsUt@2e}k@t$&t`NF*mhC&`oIW(>MDeWnOI4=uo>Ggl9D79?OS>$N!G0kYvzLB9@OK{wp;vKoDEf zbs)&BV};G})2g#Xjy4eKU{Jli6PR^KYn;M6>7t(IrsJ`iSR|;uw@PfIfa}k zn!g8;P^uLgHiT~eIbDPIxMCA{vJM{Ga!@uR_os!F&e7e;1kwAc=&Xwo(5a&ifBFuj zzOxh+qxg(bY6yX+#N_===wy}9nX{*{!AybR8X*=SThHld#A7ooQ)ZKrswVu`e;nF5 z@UsZW;d7iX_DMHW2R-f&=l)D#uT5A;H~)DyOnemC*UJ@hMKwlrcO0|ZKf*l`3~Zf_ zDvhi8O_XMOLd&{ex*Ey+QDSLpE^Ja<2jMei;*49ipk$=4SZ7$0-?bIDcp2NdPFhtR ztC|bA{zk!S?Tf)z=11}C3_(mkYMK`Zk5BoVEg4PUtLb3+wdP7zz7KpnsiQ*MK*3Sc zFEtPoBIJyUhtL^bw49n_R#_Wb${zE`gHW7ROs;_{QwVQ~DT7FdN;_O0j!QE8>R|C}eREVy z6C#U)pFkYF64#q*r*Gqgle6Kp!H%pt`zVWnvD0TvLxM5dBQ8g}wszb%jkKo{6l}-e zeWSJrNU15s6L4y>i1078IQ(9+7l&@ypNz_5KG_vbe#U?p6BP{tGShOqV(|TS=hlFL z>}NUToRIVT1nUuW>SqH_7`? z1`})Zz&}*hB6-@bznixrNxhx>t?3d1_P#Zk7#LxrnnpX6YD~bH_5%P)?~xv4AHyl} zJi06f1?Ef-^|X|7!J(DMb14gkE$~C^4%LhFlmT1oR6alY8f=8*y)L~tr!on~I?)R&f<#vr;wGXyt4 z5PX&`^@v$w1G(c`q=V-;``1(J@5HBlR}PFxhggV$n7`;pFAhH5l@ML&&(ztHlEc#To%4Zr(P61B zQR1ef5<1vRa%Kw+v2kfN!97mYN9KQuB7NX2D>xoW`;ljGL4>Cou**WS2@3Qw^pI&l z8u4W*P?CqAx+26T*&(!IUjyMP+FUl@_qZrZ>{$8u*}{LBupT8k%3Ru)u33ub@EcQX z_-X1sERfRCB|n`B-5~f%ulk0O(eUAG>Rr6vG7!Y!%Y5xs(KD$KR|_0*qYf+J@dJtr zSaaH}ceu&D+JWLtBB1vs7CiHqB}oSNqRRZG&tCI1hm;8D6n6W}k419mMsOh6sTK_X z!G&c&a{Ns;I*9MvfyiyO#{vH^WAH`Le^2PtbvnLH|y1RS-6mM@ipBCtEPW2rx@m6k=-41nTXg1E7wguVe^S*WRzPx z*$U)Sm+_LSypc_+(mz`#@)H}aPBl2Skj}iSjoNNi(RT2P<0EdcuEc%U6VkSY^5;0Z zyHw;Wo%nS(I2fi(p`mAu1j*MCtefe;Y@*f=~Vy|h)fnNG-PlbaiolpusPPZB#7mPv$c)3$0UV+<*B}? z)CRBZ1fU5U6dY3bV>ru1pB|_gdL9=_#OkU_VrCL0u;6(e#Mp{ zKHw5D-=V4_*B$nzNI7+6s_2p`X1`b9gH@K3loHL%&(C(wWs^2*A+r22ynb9_`rLCg z)CFG`RU1$CGW%BksqkW9*W?WYOI9tH8^OCnbt18@U28D0Xgno> zhNZJ&s3>hM|rZ^=HZN)u^CB0Y?2 z>y1lJ_^}M13(4RpR#@X|n$s0lDb<4bV+=i{F3G*o&<5szP5Tn|%}kn@7k&n1uT2=t*n{0GHIQH1zo+$#yXb;;_tD6RyZ zbIaG;j(O6J%!Sp##0j)216Oyilma}14-Ap_>@j{XGf@@4RUho4+FFQJnKSf5D;@rDL?1TlWTUgrMk^&Op z$}7d=CnY)`<+(2>mhbd~6e!qn=dRu?RKJVYvBSI)=rhI+otRm zbZFWxsdZLGAA%BtEpSU8(m&fhF^^q9tbKE(Uv{00Ayb-QaZeoH1hdM%Y93d{IUTh0$JS%92t?U;kZHvADvnx~xUnRMKNt`SBz7H2AjD z;})u@!kN1yPIZC8WE(bRV^j&p1q5ZPv|m@up$jd>I1PG_l~k=Fbow&FKw#^M5P%!O zdk)F+`<(VHSh4k;Ziy0ONe?VplM6pSQi&~R*)M06gIQJiH$7CxXfuEGU4CoBb;#Tw zHf77BO(Jad1Kv2Un=YTyt?gu#(nyb|N1#lcy;EbC3k#(Nr|);pM#D@j69A=VhtB?w zblETC40GT8gUx4IFjl_weUiPM!QJFdVwF*xgDAneST)D zA;`{&gf^GT4b2Gv=$cRz*d-)D@a}4nI0DE17+*cCFlxNYMIO>7s2D?0y?;%8j#d3J z=AInuNY4;uMiMpUS28QCIdjbtBx<*2eO1y5(;f>iU~ z;nYi#TiPItV{>6Bz49D6w~N8ih{PZEJPrxo4Vr_9>Pw_zn&}88yby$VuhocxaGg6b z9^U!uXvKLvF8_2kGmse7g_8)=61~WoYFqEuNko;XW%KBw8+(K~LK9lf9Qg=ih}oZ4 z2-6N(N&~~fZkIE7Vm!gsN4b!381b9gcrk|}GntFOx(_XMXZ{&g>$BYDAIt3z3)27xtR(4>X(U*k8JiqRr)|w8RHXT{lD}y)Ma__s2{#aPI8ib+L#@4y1*|wljr-b@Xcge5n5(T|nM`!{G3U?s4g zA)FYc&s`=7+*5e(Kfg|5)1t~TU+DSS{~mka=#&B5ren+;SST>mr%W4xM;!!n)3#B$ zn`l9-w&Zb0ogH*aWvi7$)L|JC#xgD1mY6ot0@epu^6$E*{w-_|3ieApFx|xF`6z>= znY}FS1Rmmv?W2)dm;&<|I!Yvn_Qs>=a(ZK8!HceEI-1AkeZ66vhdRMh^tT9Ik!KkB z`Zs5QEA;GTU5GlNvwN3HnZGUvcA59GJtIyu5=rIUBPr|4`8zxepAcp{E$w# zMBPv}x_o7uXRJWCNz^<5)oIMkf{QmdM2`7p;ysj$JEfb!azE~Bz(ZhH4*zuek()uw zk9m}fQ(dX%5>uOkac_{XRY2(65!&xB0p-*%Zm+Jv?(ak(-Z%=6-a2()Tf5V9vOZ-^ zbDaY7!LFIDtIzR*(49*&o%tGfIDw8;JJv}|+l>Qflx$!b{*!uxMZp$^q(% zW=c+MfZMi$M<3wjC4Brj`m6p^&t3gDxx*6}n~dDE;Bybb=Ts!kxA*QZ#e>gq*r_FT zL7d%dO0On5%7P@NkAmYB^|#MJrAdp=?&9nFtePty-=qJt$iC#>)pdKH_4&?oOKlup z*1#Fd{)RI&o8RXVn^S;0As8os^mx5;GD|_I_MOD^>KW<@?g|4QNIHlYeyE$2_nD7Y zuEhwJ?riR22c@TWztv0v02kmfi9Q<`Yq1B2HS#aYhGWMcTaYM7`-}gTg94eNs;ovH`0dk zJcLVCgh+b6kOk3?fZTz-f}&I5XSa)Y$qXa4aiQy<@V*qBU-b+ZS@*q7{1^{?(9hCz ztydlS45!qv^(W2#zD{}_dqdEI;%D6Mw2=^M~i=C4l%ru4U;NW zUOLwjgSnV0x+kSM22HOCkbb~DU9xo{;&5%ZC`SU*1M=DN1%YpZJtYCwzpBH zxi!KSs`^6rZE40g_}N)qoZh()9^q|x&UC*|*7AR!=8K`bO;mL7D!wh=P=3XjOGcRT zoRuS+ij~H*&ogiXhdB6U#?{oiw$ui1jZ< zOW?)dH$Nafs*v0&5B%IZHKtSJEd^gnh7ag?r8g+WK$2RypD?<+B)fV7{~YInN_Fm< z(omT0{O*a8(4f9JMvlLw_OgZaGh5RXu^l+k5 zcG?m1wUO68Z}}1G5%XiS5i?ftRm16^OODkx32SfDm3dwv@ZgJp5q9}@{Jt%SJfYveNX8RTd5%FF zvnki<@3a0kMMJlJwqUD|tOE-{JdlKrCDbEDd(W)|M79l0#xD2y5{Il(SfauaTT%Zs zk;;e)h2xfXW7oib&nwwagBp)cDp<$Kx#Q@8*%Uf6^c!hZs_V;1#>L4uBJ~kx$Cc_=pS1~lhuLZdXG78sA@CIt@bs=BBTtnw1>9={FTsL!aXqJ19W{~N|nks6z;L`eulCR@s-+fsvDaxC0OZhDh6=DUZu{aVzP6_X-)3aAS4 z7!d%!s-GC-dOsF^pYu)UK9a;}nEso*+DqqhumWIgR7Re0VXdIr4i{CYgepJ0|wzB z(y5q!ZnL&Q9(Fs82VNVc`wDv2CBn+D4 z;3?UGBcx^VA#3A*x*V>n=+%n+j8DxMdLzpg0usAgN>vGf?77EUFo3jwcJi_aMhE zD)(WBELvJ=-|Aqh$FHM?h>`q5^eL`4>5=^v@-H^GVRUW}X7I%GlD6!K#FaD&yroOwOX zUe+)IUZbmw8q1U%#CZoBevc{LLHdV5GH6mqdRFRsZ42i{)wuJ>yp&wOyy)txmT}ql zf?u6lAMH;grTaX|$0Nn@5U2 zn3raMo#?onB+`m5^72c{^9ilkmJMs=uJ{$j@{UuE>lZWi<$k>iqr+z$>}tY0u&P#n z2$nov5@IYH--0yp1J?Ys}BegslIzZUY-X&k(XTy^M$1N{ zrTB*r`P;M;( zQbv+(iFL`2IWUP-{Vy_+V|mPeM~-4rn_m^1kfRN#c_(2Xr$E#<_!2e6+ANw~$`|ZY zosGcVhda_GU_A4NbO(TrcpIp#ZZVg%{#fJksUsow5Lr)EzQ-)&Q$xM_gtohhVI^;$ zRH8MFY~fTJE&?Ko-wI)byiX63y*GdTL&e?q;#^0AbaMVBEZws^a=%zp&AD6PsL zI$Pog|DL`04*M*^y2$HfZ`7q8!Od{E<;hb{dI`Z1dnkm{)ef#Lol5GxrQA!I}{f$F_hFcJ>UEMf$Hr9`X|fJ z6P^+5;aa~=L@AcRwMFoc9SK9UM%I%Iyw~yGM{$aWTj6BuNo9ZrRI=W|4c98j=ly^$ zf%vu^U&pr+SG+`c!L_>paYwS=fh<@1Zkj)jHB&t5m1y=PI83nwC=9v$*&h`jE;F2U zyBvyV<`FE!*Ba3^5+^&U)2t}^;{(}l;aU50h@xO>Ke4riXw7$r++t6Jtm_PJSw8b% z)5*#m1pz)cx^PcO=j~l97hPkjD!h&ufRL3m-E3-Ok2ut?vY|TntMe%M!jsUpaC32Q zH3e%yG6a^RiW`B>n;+MgoIt)P)wYNH8pfGIo}El;eY3<`p6ww~raj}BFSc&Ku(?Eg zF2q_%X@XP_Rv?U+8ra7@>e?Ou$qfsVsAzP{lC}T0 zHGE19H2pr~QflP36V|d<{Bph9I_8GC+W>Pjusip8Yvg+@F(l3`DKYxp{%=ozmH;Id zC#_pn%BtOS#o++C1z2+xHl`fTHWZKpUi+gFsf<|QO5goiX^HMCi4~PXY&1OF%6qf3NtGAV-ce--;Fz+7-YrZ#8s4-GS0H3u1Sb=p+9hEs^MR;@b2Sf zydmh&Bmd+dA)baS)Ta6hS-DC5IEM9v0hv&vtK*Zh0N8s~4&n4%JEZP$ef?jjWa2Pf zOE{&K1(EJ?O(PPEl>O>544jmOIIClLb5i5Ff~wQ5BkN8wda>1R8GJ`IK+Syjy%B)@ zpo-gZjrM|;TH=d3O!t7i#vsovye@ODr59#n18L?zfXJVb?IEIbc1R)WGW1N!C3Y6G zrv#biSD|n9EygfOqaiXj9VDXdeFZCkyo#jIl0z5mKV;7@sjC6l9jT>;j)R{fXiVSf zn#kp=6L8O2(4&b)mB$%lTV6O&|0PxIrV#0_GyN@m8`Y$w7i{oCXHYbGnbY$LA^dnx z9d%D4$eRuipppjrBSf-$J{e&U32@47hy0((C&{@1z*Sb2A-F62Gg+@N0p;zb8FsoZVpVW|}8yiVRvG2EHXEL8-+m`QLSKX)2f&!RfQmdt=Fg{fR}Fb>FVRr z7W(&`h_>DRc4rQ>#5*m}yK?&-+K| zU2^G<+ErP!RmEKhM01pIBaC8JKhR1#UHv`w2Jc?)d*#H3uDi~Q=>b)LkF}2y%^PvZ zu`I)ml2|51eD6Xa2QJX_yJFTdkgkM*I9%zN;r)y3+iUwLVcRT;c0XPHURzo%iQtDv z4%Oxr#E{(7M}PM}BOSOs9owRw=&B`nx>E$Z*o*925R{ln)YHP&mK{+^m@5Y)Y_a{Y z&rQ0SIb4K(abQ-c%XCK#!Cj<5cR}^EG>V{1U)?qSsHDgaKXfn25{)0 z%AWcL+DLI(6uM(ekMO*>h{cdl7)=&E#32y`dMZHKJ|;^LSE`+4`T};!=TuI~p@D*} z87&fz{$+Vh>ogK)YdEN)$pP#>S``N)?uqTPj}<0G%);1`w>q``l8gLk&t^Ny5?2%pIr|tm6!tD<8TYYITN?{aZKNQlqc#N z)(frGUL*ZNH^Z4s5IxR@j6eVPcVFru=nhPK_RBO*c29L zNE~XBskdX)XDwWC;_SS*&d>R&EQm^PbS7Cn? zPCdBfpF&KraW-}j$<f;- zVSec@(~K#60xy~UgEVo6;iwNqd=ZoOZZ~kA42Fi^AMGnq%@h^V0AW`rev!`f#mT~V zaQ&hiQBN9(_vhGGwNvQ*%+=j$GNWru*}N+I_*xQ^zC3liq9*%>uMp5$_GAB6r%1}V zZw2F>_Ex10J%53*L>H)3%1fiP-!2%to4T{7E{xN>WU34|7F`eQ{kbNOwkeDT%i~d# za=dzDzl$w8+Jp5y_FJmF^-{as=RtfC5oc*eTtLHAFB<=A>LnnF{Bjnd1{ zLm?l0{0%wK*eG~q;wYY9z#Jh8nD-EWHF&XPRP&{RuWAWgX6onsQWr#Jafr!kp(si7 zO<;eWb%OJ6=5nJMGg3IQbE|fa$5*IOUb|ZT6S+S%U0p1&;6l=AfhtiNx=ck`vA)%K zlB9i;z)V*^NzfIur`s|qLsk~tl7{nqyPJp$v2A_q{o6X@LqVcOPWx_EVXWk&`liW! z)zS$AN#?^?@6N-9Fbo~bf?t3(Vt5puBwVq;-dwsmEzM1CsG{-ysVtcF+NyOCeD*wrk7yE9Ag`0 zLp;ZU+I@?32G&^qqJ7AHM3>yyiTa`kMhBlVXDM+GtgzpBVR_Y`MBiRz??4(6*L`Sognr(F z|Kw>u%2}oJX*l@Y<~oE~+wbSI$P_h#%hN6IeUgTnWJ0kZOh2w8%u-utB?Fu>#(|W* zD8u-_1cBc<1+aUg_}8?}#InYt-4iY#+H!g;CD%HRjTJR+{S6nf;UGhimeZBaLdsx% zks#aZV-O#%->R-m`-ACFV`_%e0h13E{b5PvphHr9EoBkU0DAe{qv)SRQ+xtfdL{UV zuuK>vU97uqq_otAf4qa(l#vy&kvf;0FO--f3!n5R4DM7kAt14TZf!eU<1|{un9>6V9q@{>H598X#3s5P;xxoW4ba9ub$=SD z&qMJ)4<`vMu62@2!c9xZYo(u+-h)>;(i1F$bl{6<8HK0qO2l!6lWyi)X7>PFTO{+LSKIS0u>44z zMs+p|A3Mq|F;QSQWG6>=pAuKP2#97~NkbAanB4xNxi3Bm3vW(4j&;VR3v-14 zW95!!?KzYxpWkuPjaW-@C+FG@mYMkZ%k$;S#ZJWW8L9fIh2)#LRM{kFRnR7O7|^;t zM0+EdCf!q5LrdqE9gv1$g(#gwfjYcU@Z}SwFv2yqAED>^XVg2)qSnDT1hYfE_#Dd* zgx$-=?NsTq-OD=qF8}Z;O(X-#CQ+>bfQ`?|*v*CU*rN(x{GzDq>aE7Ft`OEuQEQrv zg^3^rQ^bQGI^pER44`~XHGQ%txq_jj)*%Rmf3erWAF;tXCj#NI%^qa@_Va_oYNHFy z*=|264z5a>4vViYK25$wSHBiw-1EYEGsdk8P>nP+&n?p6T?9FWMYf6F(9Y}3_X(F; zJ?^hls2OMdqOxAN{ERd-2*i%tPG&TaKx)gwDOM$W*xd8tgU6 zf{ol?p&e7nXn!_cqc^Q#Up44sd|&i}!~_J?dtPj1Wuv0&rzYJK-zGU}=^D_VMB{cJ48iU@&ta&ZO>wqqK&&GPoU2LFiexzDfDn ziaOOqx?y#7q#dS9383Sz-7$%SUCQ;Nu}sVt>RtR7|Hooepdm(ZT?Z~&vJk!?z)iPCBu)Y;;SY1nCY)BcN@Fuk zR3WUTMQk;SF^w)?KK|hSvLeKOU*D6llR2Nx4F4#BenMGvhDS*};pbkLAT*7OKIA@UHL zQVS+xNLX3+3Tuw+G7VdQ8E&&v%4@Nn#ppFf-$~K2OGQ-#YRg`%C{Iharkq8*x#j*Z z_TDPCZm^BgZ8!}!%+PQeW=nRl3(nVFfXVPK8^vulVX!PHmGtz%& z$)99v`L$$wc|9xB9{EmGxumfDRnW-0=3evV9fHwiwq;8<(WmLrJJBtN=f0W1uU39@ zGmfxH^tsJ>H<&jEjri|#NC!+44e9)Y05RCAdi;rMcGQEXc15Q^)vcY)B zqvs|?kDZkw5mUFUyMz5et)$g$C3!g^5q>SK$eWs$d-mvaX%gn!In!n`ZW!S<9V*X! zGdlPk{_V}r*Ooc_`Yjf-I2yXYS~7sFqVBR>&IoH|CQNkEf0d+nK1Ht+U)4M`LM)uT z=}S`*3Su+`AL0pmTj^hVjBByxL4$XtgGk6F9pS3E2x`G^$R#ZU%?Dpt2pk>Nwa>3p z|F07Ya5Zfu@#c8M2vKaA9{AVcx#-yRt1GH-$dHns2epPAfv_89NJk#nK%#5%@frG% zqZ71^U%HTeFJp=acUk&+y&fm;2b97zIlVD*j&{3YFMrU=htn6`MQ#qWJXYSr|N2{0 zJ%Uxv!>2bnmk6E5r%pHC%uc=6_^hJH-8H9+6(ydzuF1qekCI<_BJai*W?#E_B`86c~nFR<6pk&bBq&2Hk&Z@yQE`V0^ru z7bx!a`OOapROYbZ%U|PMv~xxn@XsrY%*naz^Duaf;WNE%fUi!#6g@y+G}rS&IY@7F z0xE2pD)34p;8A_XWBv0a+lAe!fQ5fV6C3>1g|Scges!H~T@#j9FG9R0qkLFTN?x?3 zh$1JwH;K!xyDfC5Qu~EYmAc}J78p9GZt_v?+WIJZRk-R~+z3Y-dm@Fj+LEfRqK@tf zep{3tv4lgbc&{J0fq9jbhag7Qo`!{rvJS=Tm8SIfv+K~c6th$I;7G!`v>)RJsu4m5 zBMai9zCrByZ@lt*)9N-|sg9M?-}+68N(8Qn z$C;vjavUClf`?dw7tjw~9ZZ%51PiFus4ZobkZ-{HNx}9wILgc5p0~=>a^3y7Ig)Ip zl^N8p2mcUA#eW~W{4y?JhOIuokp)39B{Cbf_i`UbH-UAdF>$@}$86i|aL|wVV6jlDgvBNBy?dnx9Q4*``8Hn zifo(3{YFU{;*6ovWkxl*$^4g>Y~1KR<1L4=MkDS)`{TeeB1x&82&*&K&F9Sx1oYU&vl#s$&#gt&$atwkeKML zys3#E<}gnN>y-XrN237_bN)&jQ)0P1Zv6%I5IZ_=Ow$tXXmk+-c9{IBGVPd0!z&X(i&Rk`@hvO6q;`Sh+}O5^j1EXc29vf~WQR@T2VgmTq9lzRL+JKPXZP3Gy7FE%?Hekfpg6i^ z3View3bBpt>5WXN3WTu9)M>L?D+hgJ>on29lnd5K?s!qF|P z=_kF@Z#o0?AHY};_VDTR^VCOf9U4w1(PjF9Ytl0};;6Q30BPA>?BNxcz;IlrrFDqR z;_4)JEXZ=2RVh{rDL0t5(ju*y99QShI@KeB%l02bZ!^nPhw;~~OzChclG+F~k+?Zu z&lRWBwo~?ZFMx26XooX3oN}W6DP2?AI!1Z|JtJF)?0I-5qj8u$+giF6`5d04d$?3$ zRU!h$Vx&ar@GF^8lxfCYF9G>3*P&l@-|Ei5OE!r`-r?Lzio?-!malRD%b!Mecw|=D zaL&v4Gr91SjFOU2$~VR<(h4GP*Ls5H58&j)v@6%2HH;L*hwPWu%DVX}z*xL@Vg<7d zx{y{;0h^3M@|98?^4EH?$>pMI185AOeN|62MY@Hm+ZaC&BGAqN8 z-)-S80=9e&^{8ze#ntkGWqq<6D^$0*RJTyZ=zCNAd(%SXeut7hr>rf8(-Kk~bPud< zN_D9zBHP7rIhD@QXnKQ-13J|6^*sNV%EL#3MeZ5=FPn>5fmuiCwS(?AP6vEtwG@` zG97@a@sb&S6R?8syv{FZAc5XrWZ+bP9w&BjRv5rr(yt3U1%3j#n8MbdVp-MIX9Vg=_%Ie4s< zRQO{zyAh<>%nv`W?c|%O3|1Pwr&29m?;c757gnFWyY1U7EqQdnJ2gjGeJH)|i?=+z#n{HcxqHvbZp_3QYAC$bTYQ|HLb85)WI-i0#J0nwkF07pOaJ_TPlt;kNeXB zGxvdoRIYxeSw`=;NgG>(v(w%Sj0$JfW)cZQFAzt^_f61dtElLRbG1+v{5e&Qi^c8{ z$ctxuLdY*|8PAG2bkFSo?invR{sngEoGSQtR|oPSN#6pl>L?@%PXBDn*LK4)p#yvp zUvu`n&#C-3$rG~gH{n*!1Dv^gGXRMaS6#Dpw@TGC8u@I-DUw}QK9}By(Vq|cIvD^a zT3!?0E^FQ2nO6=Bc2V%#_G-A;d>v#Ymn1Peh z#BD1K%+6IctS%|<-yd(0YrkVg6-&as3d5;U-qKG87KH7WMwGlgc8F&bqZXba^#|tR@>gcL;^f?Ry>nxagvN)z@Xe9dEyuHx ziOwQ9lH_@=ru_g~I=RF;VI_rII)*gPN-*-1lR4&*k-lIy{kWWdVzxR?vLLfSDk+Kt z#d?mGM~fPF=!Nv3m{qH$jzPx@=KoNMSi69VTaWQJ^p!V@_JI!GE^H$HQbr$Ayi)4R z&^@Q-A#sa*-Z*ufk$P2$)0l{PJxQ2dQB=M#LX6RP+xVX2G0>E+R8X(<`C~Q3o&>5Y zCWYj4bHXl~^c;b9cDp6!W_)&sasjnFd~He75IxIXDox+oBmMGGZ~RE-`eC2qS0a`* zSzz_^su^OIBj}zvS zF}!Ot?Qa&j1t{kBrYA_ssh4u!UukfGf58q1;8me2H71!9&zhqfLVMsv_3Zo=J}uRE ze5o*41v8%c-H(Q)46ioGRE?ENiiacF^=7NRFy;}3ogiI#+fpSg-A;uBwCW7B8+=V- z?S2YBTKuV*_NtzSXdD0eRsr;+IJR%OiEPitUHsAU#GB_Zyk&rU=!3NBe6rDP zx#(LAu)%aYmitpUi4Xp4T~J_U7r(SbenU~!F`9O7fxPy+OhK_m92R46pGv-jjyI^q z+3dtalZzehWk#96G}2CJG6o6268h!ecTi+J_k>XDr9m#RUJG!R59i<=wK|$z&E0Ml8lPG)Gr?PkwA6V(bo;E} z#f}`*pV?VgrraiI$NaLzjf6qj!4tgGtXO(&_#jA3$ zG{D484ydD`rEN|5h!E$acg$wgfpFe0^@+dHW%F0%8j5n|O9WKlz4VaweSD7`g}hef zhGG$p!8|;r>~KXnb@f6=a$6zlR7(V1#d@9*?k{x9^UqZED)C_zh6Z{TiW^x!b6~v{ z^|{vL)mbqh`Jm1zaTc8Z#p#TYK?wg@R&Q$1I)GT&^#t%7M~J$lVZvdlzW6hp;3`vge-&7WIPej7-t(IKZhIi24-eKD8!^JgbKh zeV_S)$t_$QzoeloC)!Wi;rOld_*syO46txutba8x(1cHq)TAL=2bQt{>=p_#_@V9} zL;k|PrIKWMQY0??V>qnGMOG5Tjy1Jyrz(Ra`cCUbuKB&-J*oAK*A`O<#jU|lUSOU& zFHw5=r0`rCzdfbM$q8vu4uc%(XgYK1NhA*+XW(NIUv&~Z0RZV#o$) zf)sXg$frxPDmnxsVY&`qfviXxj-91~HbhjScel8%&@hTSDc1*ovy=?Q<3sbDWN1&U%oA2=bp2S0 zB%Df!bw6dtm5_X~Ib-$nR=NmuVO|o+{CEKIuY%QdB7qzZWTVmUfb-HE!&)tk@>|=V zikQ^bx!E|y0A$;q9PK8dO|N9V)n$h2f={Z0fS+j!h;uTH&H?o+B?=XGJk$*TIx%E2 zSh}cJJ1s1nefalZ(c~oMXb>sFO#(BRcfcDI?TRVKi4} z=9K%SVTMhzo=)+Xk8tw8$H;4ZBgq0lbJ463u=MVJKvc!E-2;2>Y)(?^E+^)w#sI;K zLeDS6nfU$WMrrxxX#Vc}!U$4*Ue42hzn>C2Mpufh^N$pGVLn>xuZ8KP*h(BjZU>@z zn(Q^c{{*OyFHbp>bwdd1}&2IGKpGfj5j@7*!<`hQQ5B;e=HDA)kd@W(m>A;IQ~J zog+stGUKMpZGMC8-`YJe>~h3=i1NedVf80@!^7V&n)aEN+z*6l7ndLB>bLf~doZ0m z;!@F4ei67e?y)gzE2jm~?vgB341taWp>1~#Cmu8<;h0$U7^$varMKvi$Bsk#> zV>++WW#66`YNj0MU68iP=}UU`VK%7PGT@6nrbH$LE}J#WPmK0={I;o&adC1Rwn)in z;Xg2bs_M~o*$0AJ`N0^fKWdx*l-rt@W&t*s z-Vo8DuE8Cb%lB+%gSN~rDuO4_nKbaOL3|O{(ww=Uch5K%yC8b3d)v=xS)vpSFO4*& zH$?3^kE$TvVt*T6b>U;`gByw4NR~yBQXwjk4B~>i;<7Y0$!Xs7*KnITru$fXdE^-i zy7GX~K?d^TC#Ef2G~Y~g^+ZKbT28?Q$vsV)72$1FF81#yQ`_zN$+EZ`6jEw%Q|wW0 zAld@jX9$;}+*|pZQ|4Lq=z}p;Puw8vGn5%a7|1QO!S;=F#l~rhuhT@DVb0$@ZrL*; z+VXpUb$pOpy7Q((QS+OFbc=us_ z*$}^3R=KAv04mlVCU&NkmT^pOJ`paTuNH4(NgNiWu{ZWDj4th>e;}JL`xVj-=8ky^ z>%rWQb3tTvAUNJCcW3i(tps&!=8v>x3*x5{PgyTn1Udy`oJrw$?Xx`bUELU9Ch)d z)n!t?n=|~%NW8d|CJjNAna%edu~fPzI`kYWzYTT512JnR6^WKZ)08b~OTAJ`s)hK2 z`o0#P7XeW`U9qWp!kp~424&iV4laL@%1bt8207Mf9C=#@lA6qxiVo8%OD$_scq~m& z9L7oHVB+ZhjR-H8^mooIrTMwjz-5}3SYy6jH37xc=h)6pdo^olz4uP`37dq%%Agxe zY4gIh9_8$&kjbQ#dhYKT&P~*24Bjn!58G6I8XqEeKPxPFG=*>}sbXjj+=XcBNn>ms zG@<~F*~J@DhEp?(rB$WuuDT022BKTaaPJ6(w|rKmf+uPGH+15dIo@U`pZ-o`G&rfo zyt}g@Br}PVS?;cv(T8pV@V@JS@n{-2x}3!m&bdfyrN?mDPiOfO&k6Q6)lPqA@XU_W zDlu^{X|D%ou)D4S@ZLp0R}j?36XZd80#Do;uDP?Lkpp3|50ukxT`ICOm1+h>&OF+h zV7kRlsCcsj_=d~kXS(*0w48x4xE3s1+j)uqe@vC)xx!gzyqPG@wk=CWQ~c#C(w;CZv}nyj`L*;cLG# zTouaoC=Rm9Jh_6HxRxU5a>p}GP1yI6;CC!2^00O&_Byq+=6qYLhSg&_0<86qS;mS& zp!jUiMGOshPrtu1z85~uW8FFh(tKyCpoM3-3e#L#UYL1Ilt;jhF#?iz*lc_!zkI=Wo?l|E=k*gv@k@vzHEn&iSL6X|?rV zIv(%}#VvDaYmk)6lhCpu-WsJxljvBlm5o$k$Cr$zlUnOc(~1`QROz6k9b*EfNBb|$ ze+e;mAxPteHTu*fNlPznHrkDx$@*LRJy6%WCWk~SEEA_C zm~=?x*MoJ{&P9e(-Ke~DPt82DbyT_1iDm*v?`TB?W;nt5yt#a33O~jyfW<1NRdA8& z;gZ0gTcs4#UvX(%se{x$e4Bqj6YljC{R~Pvev*V4EC>nb3|Ur8Yq>u=1)zl*KU?tu zK-m#2e5hg1+N`>l+5AsFhlvkgc&nAt3yys174M zEK5`uZS%!y&&84ltyFP&B(s^*SdZi>8k86B1!7@@ zgPYWO(pm_{ZYWSHy1H67$!mWZ`QT)6J1^7EP!s$*>wELO7Mcjv<6j~Zqlm;Hrn(ih zk!PLKSKaNNbB~u3o&LRe*!%o+&=a+AbLSeeyfUE#uFqeUB%t?IFTv4{*_ubz)rJ7rX~`F zq{n?S@C;TL@q}2;LQyA|$N`|=QP{f|x05aaN$0fB%oph5Q8hk+ppJP~iH2rB$JK9L zsA4oJolOgn4jr;vYq2cK+(a?GTXJt>a+2~E)yt83rK+|AYxxO5(m25F2qI3SMh}VQ zGh-Kp_2rI}EDVwqlmTyU0(-ry&!Gwf)W`WBFck~u@9qQ7Jk&oWLnU{Z0P`YU*pZAOw*nak^5To{_)UhI| zx}H6CpXVMQm0stB;_BkjVhn8m@;^5WJcd086v~qi{qnK{_`CAlJI^j>3P2AAdYkW2K}gIh*n+h=RYJ)<=X8z{vGwOS03^XGd& z!N&CQb7jrHZ@1PK3}^;g?Cu&cbfqf$pQ>O@W-;T8p{0@*8>@1w-^h27uL}O+3wt4; z3S$I4e>#jpWZ#SD=7e~~>AsRLizbgU__2UT+QV$ymYR@cBgq_C%Jj}=(&?dL&Ys#+ z_o^pbC|YBpz-`sgjx9e?KV?|aU%7QJ5#?SH9NO?Fdf>KrLtV1k{(@gRbu1M3^v;En zIU;-#=6H-EYnI;WIp@7LqWw4=VBwxT*N918A;MjQ!}AwNIjzEQ+7f?7AOzIFi$E+u z7%g0PDQ=Jcat{2t@pQ}>Q2(qI%H=Yr9E?GGyJ^qMcb?W5urG%$8C7Ok4RzmtLLjKi zw6&b*lBf3--_ji5agL}%U9l4clyF|#>Te78@+QTFzITOJaLu4w%?@GRE8mT<*nHe!i-&WVi>u%esGo;?vIKsaq;So&!}^eUc|M z6DH;uVYl{ZBeCMZ;gG}kwG%LFa~#X7GqTA}eKLkvvkYaAZ)hf2in$U60HEL49w{x+C*AFAoNR09>Z;trb!&xb2A#wRJpNTa4x(N@j*kZXE9<>*e(QeDc%dxaJm zmU)Y;d|PUeF0%bmufJ15H)L0gXh;}ahZTmTMC>QR-$uqgh z##*+~i1wlD(0}ARkz%quA6Qm83Z~+Grl@7_-=)yKeT9IBKlZ!AtM)B)-kE8CA&P|? z5KfC+i3Ic`6Hlyw+C!b~i@#sdeQ>>dBmU7Qg2pGBo@X3UWi;ooNQ?!Mv zdHhsLSdI}A521#_I}1}IF=E_oWkUGv9#id*k3ifmy8-CDonS@g49|Q zkWp8rd|<7CqIZ>>-_+U%N*ookk9A#JC!aum-7mOCC$Zm4O4q84y!9^&JTblhCwbzx zXUk2?KhE8uIQ^8GiI3K$yZXMWP7zhiwA78^Bnxz~57S8Zo}1pgPYLfqfW%2s#1?q~ zF1|UuDbbkQw4Lbt)u!r3-OXCfSva$9CCyCuUV_{l_Db)|$dqYjGScZ+IEg>INRf6| zcfvu*p0NsWsG}o-doVK!^w9`1kEFM>&3#2}zUj2|mFo|kBat7h)YAuP%8P{&$L0YyyW-xo0KqOWc{WpOqFpXa{94o$`s3H~N&_ zIm1X4l=6U04jGh+POXUbg((!OzO?F2eOx0qgpagjts|QWtPjU}lifJB8NGxI!txMQ z3jfUxg38YJQJc!?yyDogx`~KbzZ*s$-#Z{o?>kO zI2j3A`t+%d*QfV{r4?OZof#{0s_leMleTqOTG3C(j}A1XpM>2{MHij*FfDx_#AD8X z(Z_sF>CrfeNhUY*3iF8aDWX6HQjqdyA5vYr#1*WPBJ&wd43zvK$^B+gcyOY~G}I0R z`PQ}i-h>zdg{*Ykm)d)u7O8zs%0lwta!-f8P2nHs5f6pz&>1fxeyP;ntg&6R=I>a1 zuaW8LKYM zB_>G;&z1fSDF}t3p^5+-j!zF48lE`@?H3rRZTnfCp8XH1Jn6CH{r0upz4queI+0OU zU0q&%R(*8}F>Z*}m|ogj_6~5@gKLf{!xF4O?WVoKF93MZg!RE#!A>T>L%U}lh3CLX zPnX9r97tf;qFv=WV%WxG7qfFlN2>U-0}N4OAmTIw&2Lu zR<+u=E*Dj-GG!*=?0C@Ue@QSPTFew9O`!9>Fu@#Z^hU=cZV|SE7_;;5<;J;Fj`Oh2 z#^WuUyrNaL@b!U))vIHM8Sf@iO|!>#x~^-Mn<;f~$ua6nB77UyFO;iPm4o577H!i& z?Op)EmRxiAD=Ab0i(z8szR51tzaCZ+6GzN`54nj;lPiFrtnf zy^1J3*xX%GqXp|m=c4z%4i#Cv!?C4RYJJ#sWK?=E*VK5sbmE>NZ(bSYRYvxjBbM6* zh82SaIAcKMHJh|!r24Kmd{TK>ufJL?3SEY36-Re`YuXecX$3b-r+7zmAU|C5@^*th z*AhKP11?~pbfY{%Ir@&@w?RF3a!D=PZ2Rn|W*8$&20;N|Je*Q#rTxOr2g$xu9v5k? zNPmNSxbixZMFaTKMzQbX(ZuhxTT(62HFJ;U7WiIh&n&UPh@p-MOEimUxD@_Red~2- zk~)~R-dy%wa`;&xrDYeJ&$PN`pZSugK5S=$XuNXzbRx>V@$+|MD@HWxr(X9(pURayv z7|^Xm3V?sv9_iF3(*cg=B6kc=+6=ff4vE4RzPYm6B6nJMF9M<$;8*VH=9$fDODd15 zfKu&ILF92TRT|7q4oB4rAI_Ps7mDCcn)xc=H3qyrt8xpM!SqKOwfn34h2soq4sbp` z3Csi9o0SNK=eX>vL&94r^~!b4xAFs$Fd!7i>Y z8(?7kqqTvk)t%IZ2|%2Mfs!BTq0WCU{Q1p$ubn~J27fI=m$iB;h7}b=tR>MkL)X@) zEt&dM6%uSu`NVH1GdXvIoQti!j)hcb3-ORGx1}O|7pAmB*SyH-DhYAmZ>Lc3m`fR! z-VVVU)NNXiXN73=21H>QMsHzsgfg+MB~dw0k>259+W-fakzTO;Sqv;`#N75N!2z^4+JaZ^%R zWc!AWFzU3f<=DSRSP^i7vdoj(n{FOeI{y;Ny>cVp$$-Pf>US>aQzYC5w ze|y_8qiQa2TOEc^p$~SV#={l3|Fv$DihL5WG^GkSuDis(cP2295g-RGQx&d(?Ne8V z6?2$PCQ`raV;w|Vb+Jz^<+wTKxc%7-`Fv*khae^-?TYX^mUx@D!E5f-dIM^f0p8U7 ziD1gIcML9yyavjJym~$EYwCiz?v^k&79+RPJ<4_ENyD}ogO<#@`!$VL`Kq=A-Kn8-CTCgg^rM7B}NQ!Nl22dx@}0%zFO_miU@L6bSSqas5w-w z>Be~Nsb^K*vvUSJyY0uwADqW?sFfSmTLkIu(8Z2?NWNDdpabON-$-YdCA?R2)qSar z_Fw^IY@fV3ITi}1gLwKmjr2=o+nAyTDCg2k{OL8=3Z;>M7GYKXS7+Oy*r+sKnpQ!? zDtPiQs;1$@PQa{^ zvA4o(Il0Y{w&qu(k)YIU3ibL=R158#e`OdZZ>on@F~VX=?hGyhrX9UPjgE7)E(ulQ zwZ6)IrF^LMsgTcv;qoTe_!j94q=1%2F6~Ob_%py0Cb_rK%U2l zct(7a7{?-d%GFpTM?YE%%#x|O7uGx{i)I3$ct~r=l9>f|hRYGg^NO5JH%9hEKghJnBBkHVhjv^(o)~hFkD^`Zry|LPMhiau* zmWVU?fSf4K9>-9_OUseIywdgzr6up;p#@L#B+jfwhPbmP1a=;>yK|3SwK}hOkQv!+bX3cWk4n*Th$)A-wd@3$x>O)8f>l& z(RJ+EurZeP>asb0&QC%>srH_mI9aiY%%y5b$ z;@b>0Wnv`Vv644;+UNQu#-QX;H9ckNpsRG)ES2Ut(za&IssyR_v9*>`HN|fEW z8?A80WaH>hkY+hB+F3&*rYHJ54&nssZQwd$PfA7cTvx07EE+|9GFrTc;S~vv(qqII zg`nBcl!elL;wRoN=kj_u&k}Yk%oRjYYrD#veixPO`_OruO_|Sm*sOY1uz~D*_3o%E zUv0s%kjJm|NgK#d$Dtn`wuj_cvp!iQ-xfYkk)Bv0?mh9a+*(K|BfoyRBUVKUz+4gZ zJl7g`y5fe>RD1cbE`0H1YM^ati#S`W%^nXQx3YL%c?@BkPVBYU^e)r*N4(y+bO;3S zO~gK_c}#utuE(#k#JJ$7g5_2^SO+d_g{MN%T7R#J6wv$8of7=j6~cz8miq=KFw@`T z^&kcyYNjGB(=IAe7(Z?I(5_T%;JOMhdhhgUspJ=-NBrh`-dF-+9ZJLQf61q9C$Bi| zS)<+BqBHbg`8W^{N1Lf)n`8ZARB$tLD0$O@!rZwUCTcD-bex&qsc=Kft!?4C+Ix$k zZNI89>V8Swde7FBn|?p>e30;-8DEGHcschF*y{oqe8weViRB*`L%L35sP(IR3bLR> z8)|#l@PBmAuzpeBhkV&GHfXpuA9`==G+w0$vY=@=0f3mZWnhE#r`eyn7T3WkJnY&rok+b00itFYYj_^hX&MgS$cq3z} z!F-e+|Naury6ye#MXK%bsYP7_@Dm%RF`a{**qu^a@;%=C+T^MBTiO#rk6xMkk_k7@)6$tuU8 zd|KtbZzUalURj_FGS%#Yzwkr*23-fC4i`)r-b}w|x$aEFElFb}D%4;(_H9#gcp7_a z@PrlY>ng`y6A5U1yqFiFk}EQ*g7dv!{+%=>;4;eTge;wP)1idF(TW1@J1W8}T*=Wf zeOw$Zz6{$TkmupML{btD+>f2QLYburb{o$AC&ovaSuc_%o zl_MzxGbV`FgZ>`AqACigH(A9EY# z{=Z`!7clb>1n*FOuke{rU51VOUhpG4BN0jJ)P{G=FAwdEOvb%Gh@zu)2L=p-rZ?5MNr)TiCO~=kl<8enfP|#I4J1F|N25z|@YZ^I3Mt)431SU2dbv_p zLmuJxg)uMlA)@-!gmuIl?RNK<{OI&iJ)KJ1Gd;ocQq$e`#80CJyKPI}ZL(@tUbwP1 zt`1T;DP*Fs;glj#N&)GgDMQNiVV;NGxtMd{X?*M7K=b9&XyMX^&mWNQpi_dsMRm#H z5kw(L4?<^GPc~;31FHEqcA&3@i}Yi)>9T)Z23-d~hjZeVIzMu%pX1?s=RDalZe#m- z1mp9Csz!}xH#2-chwz4ME9m+iliW4uiJ7vaBF=%<7PM5E8V%oCl5DOu3pyHcZd z2Yi;8RO(2VkG~n!_&d_OR}?2pbA`C-aC%QuAK}>L1hY80rG61I>Pqj_O$yo&RRxjf zsGt_RdT0pIOLCM4Z~)n%*|_GZ+!drx+GWP8_}&oSr-mC~axePBQ-bp!dKyUzYT@)L z?>*nAw1GZY``YNX$(?1u<^ph+O4CdT^rIsIZlVZjJ~36OFI$K!JyFefQwGgjr#uQ; z(F#OPTXUehGs(+_rsHe#!Yjk<-^0gz5bl`tqXVJb$s6gnYjz^<286zLgmgMz){31l z_?uxM!-y@i_HhtN+hOmu*UhJS?=?#6CkO8~(y~2nbaCM~lW8D75_Pli0n_mAuDy~w zuq6Xax?lieWDPG{t;EsmC%F6yF4mn=?7K^%=xzMkPjWy+q_r7Tt8|d2!A0+zn+mDR z1FSaX-&RKj#}y=lne?uo5>KhQ81nhRwI$MI6g}5lPp0to!WI0=1V$8Y**M|%V|hc8U0Oc2QARq-G@8_$l^^C;hpN?CEpL&NkgwqRzUHg+MMY4NPrB1%b)~o@*j)j1UxXE zp=@oGYE!iHfbO{SW07_c7Jl0lK5x2V&zksfgj<+{Q6V`^0moTW$EGR>pU_XeoAiU^ zHNOso$AOql-HQx&2yoQwc)LtO0Gmm5^vdl$zJ-khp%nn~4Kn?2@Dy)?B0@cB!ma&L z^Fa0@nKzZQ-g+ORY?=8VSA>WZ^_{L=Lwgu%?NT5_eNUH^fMj5^hgoBq(H}&^_2K+YdEQ;?*6Z`zzdR3Ekq> z!XMr`_#-**W0e|5C0+bu$xhTo^#xqhG72IGWp zBJd=Bx1nb&ze{+AD!dpVa}@zmYaj1_ADdmVHtaai72B6DiMsWj9or?>MW)EJrwqciLWlraSZ}lewdU3F!p>tFGI9_-T6uF}o0Eac8TfmTcQw6~0xSO(b z^%di;jwu{{dkOB(Cs=56LdtVMG@GSJ_zBYXXexg`D>OLdd7bl9N+y_ zN8V`}w2v)DdQ{~Ppqxh$H=>QbU!da&Hlh1fsB0`d`|p854=Qs#iR~Tc*_mh#SMA4^ z7xmm28a12D>KYqduYmtog-W?jD!1Ts0dC4rDl*X_u+#mp!u-b5N1MMXV|j9jJNUkU z>3#6I5X*RGQajSs-zdgV7Po+?Skw~iB(l#|uuWXP%4}9GY*%_f^7Wy~4GoZ1>ca<& zp@un_3i->Ty<)fd8!SrjZl*BL7aauNR2y0W}slP)@o2@f%YccCndxiC(t%k>WvgbeooXUWda+f}XPB z;1iFL!|Q7tx{Hfqxh~;L_sp=hS^!OX5oV^PR@hi>oo_H5 z4Q6V5}H1H$P4Xc^*^_tOjw6C=93aH zhsTqb7GTel4xr#WPHuPP&e^a)pT2Sss-nf?|I=JD1vMyFM|eyPXmn`|U6#~YLl20v zT{YH!)Us0r2z|Y$sTI6J4;xFpC`ha)rZ}T_uIkQqv7$3-`7(6FFDq}sdzF>+SOp~3 zrtrWvsdYV*Rm0UA1{mAPwhQYQN1R*N)gkP%MJApz6s8*gi!@xsHD=gT6T#xHq?uK- z=YYk9Zdpv^*jfbYd8!@&$D{9KvUAg#n=tNE=scSJn0W8E+nBF+p)b68Dd%m{I6t{_ zfe{(<8y=S+YPN3U=uyIQysuUMz-F(HN5==fpAxM5p*W(4BwD+zyCgq z+|C(FIJS(BK}U+ZvFWx($C>4pKQl2D)wv>dq6l!$?H1ZL^^ciFve2A85NGaunI0lY z?e=<;FQDwcb))tes$HtP-5kq!x9+0+u0~uH^v2e4V}G&R^@dfv(OYsi*)1HQQ`0%x zh;e-ZCm*0aC52@AWpXGarsa(~LI```$ zqQBdQT+k(2u@wX3v-Z2cE&naKkp>+PRx}z$#iiy$2+3QOs-_y$Rj)ZAt@rBFjH+U& z`@=+CKRC)xQ(eFBBVre}c)1I2%flXj(<9KDt9QZniO_iH`@RV7h7aY{ai#)DNCXZT zj2QDd{AuWkTYw=~`7;C3mCLTAcKozE+=%TN1@w&=xoTWpP-Up{{53f;TT9JziU<*(upvkd-8=s#w`|EFI=*1gNfR$8?RxXz(^6I)PJP5_Vz#~CMLFac7Q4> zDz**|z%DK>x3{+dGBPr^_xC_HHa53+cYr!NI-~Iy@o*lEBLX{|Ohd9i8V6}}I0@!}9uC4m+kTPGM&u@WVT#||Gn~06c$@BsZ=`uLa|hyT7&Uyr<;T6Ts}x( zaIoM+GEJURh4O5>lZEL*F-)V?2I_i~1=!U_O9(6uC;vz^PM$)E^lY1h$?1F%l;hPp zO1skq=vIeI2riF1|4cSdo=T1OY=?`@=|TzI*?RDd1t51N0O>Y}$b?`p8TU@6 zG3hN=s?mEqTc$FZz)ogyp?SaVfu*w9;7;c7;dy`FiN2ndUGP{-#BFvvo&%ksRm)=UXR;|a2^=g9&+~rmW+V3#f$IDH~Z_Il80>JiW^Mq_) zZ}r&i55ci{+>xVkxIjl@@IsKtq&lFsrFEO}%zOl7CT>I5)yD-T^&3c8ra?4U2JSDKv-B{#QQj5blirQHe%(# zC05((>O$TjE}xuNRrUg}W+otwf^&tvDzxo6>}h`_Z8kJJFvScIg}Jp@s2}U0Xg}PV zn_RS0V$=b3@YjlJ19ap`-5dN&P!o8l0M*$)5sKumt)Yk+M%bgjw0buJx8Rz@#>NhJ z(cjbraPu30_e19-sFRQfIKy|c-;ZB3Nnh1Me$aWR;VZ1e9;;a3cnvbZQGVF)e2 z)PMy=GlvAZ?L*F90_Z7>wdINk&BsDwZn4=`d(5#5+F_A8Fi+b;eabf`GH`F*wWAN) zmB~PsAxC|-P0(u0I_@(1WnP$7PD`K4_b~&&b~@wAs1oMl>M`((rL3Ti|W^{kKhlA+2QjVhb>gT8j2$jvo5WMXo-i-itG2ZCmTQfLp=59 zqcy9yO)eCVEY&GR)@OVadQ$#!1f48dfGMhlN>$c1T^kt-RUmFEXfl3+;e#NZp#pO63Og9)3 zO&mq;$2#}98U&>}v)zbcj@CBm6)6SBo6I{Xg+7ZYQ-;8I2G^X!pw<203Cnc!#F*;Y z_npN~6Yi66c`>JKT}sSbmQ<%69jZ8!Tu(f}A<4HgOtU}Pcfske(JTBp^OG3a>1jn{ zTAiD3=wL!`cAn>r@k{6h(XLH8$~vjvTCni^_#gtVMg6Nlo+xUd0`kAMyE7gubuH8| zNdpmUCxPxPtnI?HMmpTF^@6AO?KyBuHiOkwg-#2;W_@ybPW5m)SQmt}X(UQ_#jq91 zQ6PsZI&OwBe@jF{H7p7{$Gq~BT9_++dbh9O4n2{Vt|{CNGf|Ex7rZ{_M<^&G8>Gq{ z!Gcn%SxwG??qBpm*6i0ym=(2Z_W&oyqssLaq5?>iGml1H=>~G~ zJ}b2&?E3)l+S7H%_^~-2mep^uOq=Ux)}dQ?@W$0PhL=>hYl3=AX{ZkmepY-!!pD3CA z%VI%l^wvAewc|eCG1Jp|B20FKFh{LCzXOYQq#Hv(`c=u9R6!idO8!{tl^2nze~}6#vmGE)4di7%&Z(aepFL?*OA>>m5&Dxnho|k3^S};V zD83@RLHI*K11RaN7oN**KpUWB(S2=a=MSrZa-u>%gR95=VKzt7qZm_jZrn75Lxju^ z7O{9iq9>iLUc;#O{81NR3?w#b(U_LOmc(an(ICz10C&+bYUteXcV>MuJ;+OB&Sto9meX34Oa$J3dQ znp8798BRyPN*spg*S^qhvwiR275q$yz(Tg@0x+JvBMiyblDZ~OlgFTr%p8+E^qv|7 z%N9ahF?Yss5^rR`eTJTebzD2W`^`{G5o zp0a-J{3z5h$lV^TRT-~K`32NuyTo5eX-YIfZJdVLF={)JNO!-j8TG&*QNY5(LudT5 z|IJ$fNN}99c}O^jY)&aWo-e7N;Th=Sv33)k@K(+I>ZD(L=6Lum6<$V!SXDUW*Suic z`mw`Tn(`Iz>V$&&(o!~LBh2=0;IPt;giQU8c>g>9Hr)Wqgotp=F5rh)gl)HGIbvr@ zG_eF9Ke_m3$n%^j$6B65C%`4MI;4(iPeC2U2(CkUHi%)HOuZN8-*h5Vv?K}Q35q^( zBrCNo(1eu3$0YK`)ZqPxl`z7H8ekTHD^565G!S!l>K;TI2I1TVF>5$Aa)GY3$d!yx z6BO+jBsMldoKu?^AS>e6q%eY>IfHdH9f=ZtxJ%HeQTtS}2H{S_$tTz#+H9IZb;dH)b}SM*cg-rLQ(XYofZefDYhK zz_$$n?+ogna!=Wk)dG@&`b99iiGK~0$R=WP-yj0Vrbpf`UoVjp|DO5;nm=}6`4H;b zJ-C|DGuzasZ>(tBj)wOnActa7XNWu}rHq#da*C3P$u8)9MLG5*?K+MqU<#r}CS~WZ z;?C6}s@vwo(QyZPKRX+qJgspFdYifHLeW4IPxC&c3F0QxT+&Y6Ue|`i1h&Cb_v&<= zUhA6KUnh&GqA4`Equ54BijT;wuIOlwebSJVH4MtGR0T zGJ}KKhi4y*nzlK&_rVG`x@2Cf+o9d7dKB8-?b&^+@N3%DbA1MRXgl0;P}STEVhW;RXA@PDOC1;Pbb+ zubcjRHsq?mYox~qN!oWCmEa8B4d99$T`9D=l*RB{>3YxMkOFbkV;8hUs;UWV#;8O1 z(Uw+kUJnSU$hj-|oI{jQa%CR*L|-WbI5O|6l)OW(rrqBNP(ci^Ev^S9MmglWO;8aU zVBYYi2+XAsJeBO{^yUE}xs<)bsL>eGY0WXC{p|h7&^QOgOIyPqEG=CNqxn3|>c0tS zb%g1TYv&i#3j(6;QJZ$iimL8kNhGoG^VH4wH~kIRW1O^VY0Rw3gVc?<;p?pLjN-J9 zWb*>HsIP~O)sJ3*)LmEwZ6^iI%- zDGa6fciNs*W-g~`dhIcFUI`E8P+%{%aXtgG^uoBYdIkt3ovJd9V~G;7_P`05VV!%S zEw9;&@l~h=*3_xRNxZ2Q-^6tXWqfkH#OD)phm_9{j$0oI6$>tU)m6uXj>s%0>O?h& z`iSy#xog6;BDSc@ykn5J=3b;+gvRnk*M@K;F=eAni(vpGex%{eLh(1z)r|=uM|66r z8zR~>KivC9Y^?>q*q(YoPO25RtA7G5h0=X@n^Not_dDgCBl2A$wIoZrG za(nnyuT@Db=+#_ORN7fel-sgM zsMo*+iRpaqgybE}-igao&>qK(+a@wWL;!QiC$Lz^NL7XiTaltk4(9)CAGVwAz|j)T}b z?WIZWD9naBnq=;&eFHSN7jhFm3Tk-TGF4Fg)O40wI!EO+b854#!Y_BA1}`}9~y z?yJ9~6e;AE<|*5!1JKTEqJMwIqB~`Q?bkme{0~)93p~OMj`HKn5{X1SbZLGDnMWcB z0aQNM`S?H&!Z5AiMiuT*-Ynv9y%>A2)nUHk${DG%PtySn-Z%y9)FU+GSHgpKd#+*a zQ>({i(@*Q)=)oGe$UWLrLC})^a1=30i&v|O6bqvasq;!zDR+*L~fgA=wx_Vt8NU%34IWfpX zpW-szLlGyC3d9vBegJ7lflZ?6S&b4pP!~4!;~$$>wu{I8UBe1l&l?B9#6_C#agMTKA!s6ETSqA*AfUD!YFR&Ien3{7C+qRnQ=~SeOZVy))X(S zH__6JkQ7k!+B){8HP|nM370TQl&~eZ@JzDII`JOj30LR?NQ%uK>55oN-SMK@Ta=-B z{M=eNhYQUJZ-h`blMIqzF!Q|QXr$#eQ=|~@r&Gvdn3qkDTE11fVLVJ)WfM~(K#g(? z1Ma)Py*iz{%8g4~KG9WXA4pWYbR0;Eug{8JzcKe@EJhvE9vQa7)eLupHMcP02sz0k z8Db@pC+fiP->D2K*Q|-0fT%cw2zN>mM=Nv3b!uMQGi<>YojQTn)D7Xc; z7q`UMpBW=Iob>a?9zfl!W06?o z@siM%jfmNg&HrR|pG}9|Uv{K7?`=$R^uvJUi7`Wd45QZwr;g8x2^D6gUi`CKT3@Y* z`guk296Ir>Iq0Q5V3*?`@0k=%ZNRBOq18EKH4-&acNzvs48m zng@7>jjI;)K#|psJlZW}E;sB0v5Vz(8QaiUXNkKBPGE^au&FhSk}n9lcvz@w!yLX3 zAJaDtYze%ELRPqKmQ}_qpwaKr7<4k1M= z&*R&Sz2Jr(wWvTG&27EslCWFlZ_`RFdbnw}j68))+B6CIRwWl~JhluvLA@r(tDnFS zKiq*b8Q562>)AejZ(&OET3q9Q(LOlLG>2Hg72^)BWh01&Pes_2iW7aTvF!T{(E_?s zwLO}*436vOb`9o^46NmC@h`8;9HrLwo-T}#jtcq5Op>dWLLK)EM(dp-)n?a;`@F)G z)=cLLBDe_q0qJzSro_&O=+bQHnVB1{aXy_S#}?6 zsiMB$l~j4)BPR>CpGB4(L$HDEQmDcUa>Cz0 zD-1-TW~UD~nzjiYUwoLaG_5nC(#{AMO0yz&Ef||mlepFiW0_)_7V(b2lvjiJfm9od zsx6hF#O*jmk18`oAIeZh(1U(y6_>ybRIn0cEZ2~M7b+Vk@Z~0JWEya^7cAk^4*H~~bYD&Z7j*!01W2xQ0h7BL0)ck85ZfIQ7h&qu= zShrdoYaXl+syEFQ<;y@h37&EhRmy_l{C@qY>Z%5Pzynk?a=H3iSh)>R=A@4r%g}Cc z+X&)I7HU!-Sq&AW4by)_s3NPZyZ>r+G4clom#Ns@?-|+$UgAZ)9p(k>;XA9uz6D^> zfO9MbKuvX+r%qACgWF19|8SrW!>S#}&`4&#?@YRlBsai!bVcN_*!IL!x#ZC?15O!j z^4J>%2s#tW9>TF3Rtj#jUD>+6j=ZUTHwH%aeD4r=Bp z)RXkjRSJy=;VRriL!$2hTDpyBE2sVo1yLFBFC7lO=bnq{cz7Ta(NQ(?d2q8pu5T`^ zYkIRQ#xTk+zupU&#y~IvgXn=N}75rklx5rvKSr|G$IJ zo1HW%{QxK7Rhq>;3)6_&_=I1@ZF^=OfzRZweiIXj9e-KW#@M=(fIXScoV2k7WGBkZ zlYHnmv?|#t|Fv0P6A=}_9jT*lFRp!FTgiNC#yq*d4K3Wy4>lSSqd+Urh*0`Rl%EsI zoaCN&iK>a$93NsV$j1HV-Xi&Fw95qEZ{n6zAFPy3%^Wr4?~a{zxVU~WmW`30hj=hE zYiRdQ-p)xg29tqI+$V4E*-#8YIHw8r=>?w-{N-JgnMIxpg+P}`GmBFeyDZ3>kT!=b z$dFuo2Q0|Z1D@r1@WYgI7~m~)4BQz@aoZ)n8s%LJrlusU^X!R1dJ|5m+e!K+JhfGL zs`9vDmPI0+H>Oq=_o^5gf(sFB%7--1sF3WlEp+o}$NtBhe~UTOnavNkSd;Z+Tz^2> z!m|372}|V#-MW78+{2Re1P&V_kav09(DFB=^ES^_zZ_6+j^ROZ1-x@OfiNZUBxe%q zFhrFQ${~B+x)0uD2l%JEIs>p5B`}$uJwq69Y8Rp(uZaAv{ZPmIzZN}85Wd=9)Zyj2 zNp8HLERT5?PVkB4jKy7MqH^D$0++r!dgs13d`|?}bKHNJ%SV6Shu1ILXh~qTq+H!V zSz}`^sG*6lhyR$2>Xi4z(lC4uy8rE_HO?-2pGBbFMm(jXPyK*@Rx8qL9wcn~n~4n4 z@9?bO?q5ZO=k#}ZWHq2mI(kxEKS7JC)=Kd%mytVJ-Q)hW!?ncSmfUEC&6hz``N{ra zyVn8!`on9WCOWqQa7~}DUj&8IwoQZE#KNmZwM;HbxgWoFFM$MD1*DEsT&=M)nfH|KPihA@L|okecF(SJ+Q0`^JA-C+KKG8<*I=oABrG0wBblK zri*(JQ{QOmd6$JuN-nEQ9o7vX5RL8MWBp=`m_U4K_?zrVGcMhavkK7{b#U{RpI_L` znh8OOATZ21$Z+qF-Q_SLJ8e0xaM1)a;Z`La^uoe@8ncSaPla2-amZERoM*#9$e{;lfXAxg|WR)9mj}8y<6>ai} zUM}$Tt6tZ!s_od2#=(E65q7A^d*W36Uo*S%EZ2#r(9KAuIjV%!c~>~*ozMSKX+J9~ zgkSB=qe-%$2ZNwmsu67$tcu7e=i{FP4xdni9=!!X zxCjd3Mqt5cCFCNOLAgt1eVCiE@VMM{6W+V&E>uiz)AGo}I{De&OUkO_ zvB>%gV7Yh_-k>her^LL!m&hFFPdUjWDI}sANNps{96e$;8BTPe9$uA&$<{+B>wO(3 z5Gp08II_@NQcc)MUR8Lw5-^g3R;~P;wEl*_ukhSkScKF-S@B;s1JUR76Oo@kCfEgk z0*6X-5NKeuvh5>nK93#7WNiHm9$f^(bTNZ6sqy6Q!PRd&#t(R-6E_EvcOX2o%KO~d z(2I!+3SmEon}SUHco1%wXnHxmuBE3ec+S<1#XJ^gYm+FqVeE2Vdh2}V)b*z#Vb-9e z$3Rk#$VsqvdE^LrA4(H_Ltkne)T4D#bKpj7M@S31oIGU^SgGFr8JoD4o_rj5Nvok) z#wd3L&5lcm<1Ml~?cp!_lH@{|eEzed&pcS7r%jpEA@GoW4yH*N^ot^eH<09)#N*_U z17Xl1(R97JQ}t)B(dQC11NHjm%E`E8W3s^c>kc~&ye80~ z3(9xXg;jrx9aZIRRsMRN@}$BsVNMEt6z_!B_*=W6B`+5Q?-wd@Pt>lcfOd#6(GpPg z5K^I19+y&s3chH(IT2PbLlwLHw3LNmrdjn6o!b^_qv_Z94ywV!!{8RAZ8plFC?Gn1 zbSu9k>KyzEvg|y7PZZ;3=~wHnxeV4<9!&hG1%Qo%K9e0U8b|@ZGt4|g9ZW2lg@ODV z=e&fZd_Rs?qMIb-L7@jDWYq|M^#;R|A!dEw=T6&}^XV=ZO_>!CeO%g98!2lXf`ffz ztjVTCF6@xBiyp;@1~GwXD;3O84&YdD<1>sgCsbE$CtTAn!V%64cp@wpp9R#8WP0SX z`a{on*# zS>VL*?)ImKKEHVhXRZc__;|7yZ6LWijJF27Paa!tiVOZGxc;S3Tsi4tH_aR;xx80L z7*CR|wrb?Qnsp+)iSIh)q47uT$uLv&E*lCpGcl^;kLGoZf~C8t<2gY6kf{8#DVym) zg`6fZ&J1=$wQHtD>&}>(>U4@f=GkD($Je>55HRo#$26Hxl44zaTV3Qi=ks$42#Qfn zvwytZL2Fh{_m#j0f%(HGQ=EK9iJJ7fm*kPUs=lz=%>JehabVmp=M;2_S@w3|y{3g1 zPvdn>qTPd~Sk~U2y|5TTh!PTpFVktYo|@zdA#xb36K2J ztyFk0Ub!ZecqJti4XsK&N7>28wP*a2Sow)4#`uaGN~T&Ze-VqHbF_z5+Ca`-+Z}4< zR_&65`YP|TKqU^c)wV)?%@G%sx_7C)a8wyZh4^<03on?N32)?84#^{toO7e+O)S#_ zT^NijOzg|Ho4%5|4kA^I%%_M+#1!VKS>KLUKGSIS%m{mQ&c!`5-qqPFZFuy5T-tr_ zm5?<)p_7fbkgVz@3cjTazQq2)UM$&qb;7MlPnebUS<@$&g>}+^>xpx0+siH$tYKLR z84pu57$Epm42y5{wCQN?iOBy5pf9xmnLhy!VLXrsM#0AE|Jx{qmrKrs|84n%|u-X-p2Fn z<-l_I1yCD(*graYt}8L6@8YO@^XA~!AUmE9*m?LFbF4v`akg5e!mAI`i?!myxy@i}lUTQOe49*NyB!I(^hqIujOuL_ablXft>>((`t zJY+?g)0BH<7$8RzzqsZbyZ$ZE3klZXp+nu)r4vnM%3`;8R4xzNJnbc%!*vs61%Wc; zn&(~E1a~8R*?kD`=GOWwLVVr)S@V3O!(S^WBdfX*7}DRB=2Ep zZKywWq6#p{py*Ea@EmkU$81L?f$y(Dkpo+bi4A5&z5aJr6OrUTLhYR?1M`Us+ux~B z`@t!7b_T8+EOi;hFL#O=gp}o8Fm3U^{*?0F!M4(8gaVNd%%ewPlOQ1quhCH=D}9zy zljFDVLy!7fF&S2_+LAz5$*)RYa$yhGZoXLS{_9$6XEzepKH)b{*%dTO$+MkRg+Z$N z63fnZ&~N-4o{JeCaO+!X&e&Y>xr&ruty6Qdbp%%JI`>s?AUX3pQw5_gGr~yOyRmny zDnYtVy=Sq(qWx(aOCks(*H#hUwy@?gU9OWVED35*9|*Q`%PJp(gt;BV1hqB-(zbqu z>?pXRH!YT30K4Ru?fatIF>HrZ{*C)9H=#bXdck z5K}WODSrSywJq5wUuu9fct%s4klQCfp7|x;%(lto$nEoouTMlp1}i6?XH8naq;`k| zmx8?sl7m<>oT;P~i&{EF!6Xl0NUP1sA{M*Oy~Tmq@QE_b)l8LMVL+zP4>>lPF&a-_#m2l!=a;zv1l-Yh^Sz@a3K?-^b6zw?C%#0*>4?h^!XTIh8d##f8 zn~Kk&N_`7XQ(u^kVZg-0q*7afZ!@y6T4RX7!sMje4g{(lhsyiBzK%T5X-)%rKvj_H zmIG?AdITRXef@-{;LfZyJxbzViRf62R|dMZ_GI~s2& zl`EU_yzbM_hlC}gxg`N=bv$~RGCIO0=nYU?}PVdI3-^FO3fZPV65%VX71I{rq^ zW4c(c_l8PO5W4RVJR@zf9--?!V8kMI`V5i5`54%bINmhJQZvlT8GqXjGrjAb+j737 z$3FkclJJH^z@8;h6tn!%O_Z3AqY5`94Ps!Y%5{bzE zjBT3SIa!cMFx2jRuiT9@ZQZRfo7<1*)?_E$sXLvi->-|_>t|}jfv$MJ37Muqg!{DS zG0kh7JC|8nfp1tUl`T3Wi$bLBn`byXzw0nBdzB$xnF~dpTZOv!ByRKW>RtU>*MFlM zN@y#VaGV-w<@*#%@ERu-;lXp5w?c22Zes5Vv|IZP1b2&A({kwx)~wU#ca%dp$ua>x zyx(CnJBzK>icL4uJ{o|Z{}zFvc4+31Z8%TPV&*%&+xwlusk^h*@e6@1<&)FBg&A5W72?qOJp4(xr?JaTne>aU3=9WWT=MdU`22{n z!Nomm1I(K*8-{Tha_Skh5LYuUbbyo?<9xT)N_I%m`|eVXMaAoM`v?B7rpSdl*9@U2 zd&YL>4|3?9px0LC~hj!71m`-F0(tjQN1b)xk~jxhsyNBg#Jjl##$cpda>=BdD7YAOem{}cy- zsy7bdjQxYnGdD}6HxpU3vvrh3hNjZ!!wpSwv65Kn#zsW6Ya2Taw8LE{Be>I&BoB0A zzBbaF##>h1Z3aEnh9<%$r$(x69BZO76pcKXjh1ji$};h^c4_7EC#hSIGYKtyLf25d zo-APHf3^9x#CQqObSY9oUYTCRRuqiMhekT7skZ0S5tsZtMlJNm)a;9tHa}pjvTWuL zHAIJgNQ=+X98|a+OiLh2SddzeM14%^?jZx;sN*)~qg_p2RNsO-P3ZAUXfUY)%?=fg z!FE;JcXZPtD2m{%1^|?4Xugm7ot!Hk0%fT5U}}1l)JB&{)2S5>am_@NTXD?nDrxO& zm3}$ETUZLO!0POixn&DAJF1w`_w{_W_&DFr1ChJAREAtc-A#byraSX{z7#bzVDPY? zA#RjgMJnpZ9P=qDnn!J{Uc}saB^Cm%Tc$ZnYL28m0lRyOSR5P_wEXgnB4DL*Ujhd6 zrn>DTk}S%>3Gb~a?PIKqvTGCLZ4KJaudZKFTQ54$GHG_~5$Y5=qR ze5iB$NKsN%+>&$>sI zLg$LL1g{iXP|KErd%{M8SUp-r-jD_YN24Iu$%C3-R|>4T-S}YEQ&zgd(NM{%9$L`MI4*U7dGVy~;2RQ~Gt9F1S!KtTR`(;8k z@_+<|g1wZwZU}I|YO`av%gzZf{tu zy&Yq4uPde>j<%W20MFxw`|h|=9q)jTiL9c-HE~pHmxQj38RVO0I=2?_dQkz`QmG27 zHw0!ATj!F^kokIo3A?uq$;^ys&j%Ad#WgFS$GyjH`Z*0;@|=~p1>nYD;qmUKpWvQN z;*SXux>nP>qy+8KX;1mPvHg=`_q!X2HA35a=fOZw`rin!|wEMoFpBQa>$e($Q{9AVU?>@5MA75y*qV0v z!i(S8!Czk9d(C`oQ!tK`0av5hpI{ShS?-5Ji(KkzTxILE&(i{3YNel!n6A#kO5|}g zf~~VKJ=m2RGwq@gk_lKF#a3a=j~VH(Ldi5WFTZV{xX{k=@%shn$(RrFr_N||9!dM> zrhv}z3HNc;?-TCVd}5E=G2Y_Oy6a{hfzlxL@X?~Sa!s9C@Raa}OO#B9xyy3??hL`| za*QJF1H9?*z0CZIa0SmEWd}-617p3kM-iJg0r$l^V-7Vp zRPFtA^NjlIqJTbGS}69qbbXu1-i-aC9K^zgFSQIM$8d^!C8^xG7_Np0_j^4y8a~$v zq{m+uxnWHeES*a2r^?bG$npiD09l**+Ym3k1?HvN7f`rXmFVNxR}_~+oO!kS^*bvp0B3uHlsC%E0TM-8!cow>~NlbhhiF$UK_m>tiBpr`QYk+jP z+^d9&b5bUDa;7g;*!(xX+YXgrJ_)jijtI)1Zw&9@@K?cZl5xn(%G)Bc7n>6ukNER2 zW}&o(1mUJwHn1n zxJk^>a)coVyRCfGWT7Hr(P=Mvl4Xuqa+RxZygTU&rEN2+CT^Lz{H|H7)zeJ$EI^MF zB^G5$`IK`W$~WODMUSW;!SZxhtP{?v;~?8AiH!Q=&Uzwml}N3TBufUS-JYycWmJ#p zl_+(qgt=}YUfc2c7rKeW(X>0|1=ISCvW$Z9GX(@B>m6GW zDR?6WRf$Cl)N7no#fPn=feMTuP4FFwn}asn?YCUYc8y87R5dil1qbk&yFH#)4p}+< zC+0;&YODo8(Q)yfB2}#Flv*g28^q=NY;lsN@=B}La8xzGV?_8mKot&uVf5r7D^unW z=Zh~+Doy&z#x)uzU*zIF1+A+5ZMnwB%X~eC!zpepD%a{T;;TgX^r0ZuB3p}$1VP1oYI~VS&Xs&gKElS zg!kg>G=($b;={)t*XaYtde7xPz;y*K)LmDF_sP8CUSv|Pt+E9_@)UN^t`+M%(+ZXv z-j|u-k%AoH&Asv1G@-fOfV3&L?LfQifH>xG)t5Mtv9HMZ#GclZ6A5EHaQPgPE zC3y}6_Us5?(!hTgjP&fGPV-?rNcUaq{~k8Q!w*^F zO_=bckg@cyD`zHM*)g5{3U{!hHFJJ_3G4j+h0_MfrVG%@!|9?*HLOPCMk?(^?W)D< zIS|R-ktx+sP@|(y;nvU4>P4SJ-U2I-_ck)8>tENC@+Zc3w^1Hi;&IguGMdo#VO5O2 zby>?dmipAQ#!Z+rM^%|!Hhtn_gUx1cWxJJohZv!!MAMT8Ii6X|cKr5+0#2v5COs=% zV%Q;BKA)?g*!^3mF z5eQdeJqaHCNkfaxTsO*b!gIDrMCW{d)e!QM+WV<}9oDLdniXyG%-lP{k4pK>=S_P9 z@?uDXf$0r2h*>1_uov{&(bQ{CO7z@nRjn$JN?pSMc}+fr*g&D)^}s1jUDWRw?1G`P z>i-r+m0Un2F6p#noKaVvIb2~J8r`eqhgza#Q*ioCME9F=hxcB3SI;4C;#57~Z(_v0 z)_xI3W%E_8*=O8R*8%@s302a?6Ca>Pbj>>l0o(p1mzGonq{jQ4a@wc#mQQ@sX;}n( z6Lcy`8C6T~=U)VyDA`!H4%0HoASs(txoT2z9dyu;G#a4sN745puOVa21-a3~*_Kgx z82LjUZ!MDu6{pC|Rydc^FUom=pa%Gz>#~6fv}#&jzBK<3x(r>Q)I$1UI+$w`fd^|!atLX*uI-|xj zS+Pz=9!ndXb?7q&`dgmd;$%VgEc_dW!UnVxyYA61OO#d;esh#WypMC#WS*Jqf*+fM3=hvmHffz?aS0@LsL^fgt&?Y zSDq3ph1Sd3Rur*k)0n{P&JWKm4FwWa6$2yC3DO79s@jDiYOC$WmW2CcH_mxV1`9G} z3J?164IWK^4$%%{%fa#o=XI1&Djb>|w-4S^AR%r_JoDWg`?lMW&bkU{1yn~zX z&4J$M<5&8J$cvckcC7>y-4PD9h!O!OF>d%-9TTcSh+=Mcl6{vm@I>+aqZhZVf-43; z0>O!Z>gdQhq`d)5MV|!rZnAnq+kjk!!t0+Pnl0cI7wDx7RyhV@Yj27*r(ydI+7omTws1et~q zcx}fF{_J^2cv+q|j6&YpZltC+{3n;ea`f#QnUxK8+XAI#*3AW=%k zy6QdZU~XC`JKVS)L*mI}hi=GAMf)GhTR9%9bZFdYe58v2yewTO;|8qwnS}b4Ko1!_ z|6^Pa%lK82=esJHx&@HGp6cn#O6IMZl+PLn35Iba_qG(RCVdeXIoIii&jCz_0iHLM zE6eRSD1Xyv`z1&FO{Pdy#pl`_W33Z-S|tCBGhj<5H8meY-rL*-+e_9cy6kAfYW9?b zF4!vMywoV{eCCZZ60c)kCOMzYMFND0yF0}@vi_l+st@~r_c`5lv>!+#BGbsCnXhI z7X2Y7G5IU#)SVqT{%xt{>`E}?S-MPU-%gH)@E&xcVp*{|@l z?_Z-<)Lu2{4(enySBNJP#nis%lA@u%anmyWwpXiGSlU{e_cAG36q7|L6IS7_@Y}4K zjOCQXIt(D9)?T6J{JG-IVNnyF*`(tCY5$@I$h&`)t7VOsvdKqke|1i9s2~TtK4>q? z5q7fiN#2trlXs{@TlT}vLc%N1o6Rxzv3PO7hDPpBkDV>_j@TJ;4&+L>zf>CcDe|Dt zU`l6E9q_#Vt2;|GKlml_nVxHiD>ZTxHy>2WbcQAl5fS*lIYWi)`@737AbAC!M+bfK zF%SG!ndkpytXB4=&+>c~`bAllzj2?LZ?1+F1+_+$ZPp3G$|VR04kdSxKaLV646IF9 zFcjk<1r?eshNDS1cmphfaMMuRUmrPPgHSPcLM8!O%l7#7?{wEYSM&rDwzGTkPJM9NMNkcC1$~PN73)Ou#dxq27X;({j?wBZ<8ihs%W3gK1 zGYWW3PimQdnNvyo%!RSvs~B((biaja>9HSaB#Ajr{w}iSu~GwPXoqW|G1B3&ni3N5 zF$~&C9`tWhkeLi3X)keij3!XZAN8Z3U_{DEd~UmGsC|*yrGR2dAQ3m)bMxMr<}Pu~ z5Odh8(`W%MZA@(2wr$(y#I|kQ z&KG}iHd}kU7r(vO+P(PSoa$5O=|0_0zjdlkcfZd=w@8Itj-@%|G*7v50*!h)pM6l@vf!hlv+P^>m;usT3vk{>0`<$JqZe`+Zrb;8;%@F|{< zGxj?}b+Uc3n}TKxq^NdJPKV*b5TvCN4IAN*6@FqMB%c5^W@ZRwUk>gm{Cy?cYvmo5 zx&k@k7>DB}v)G8r1hTwGgxV{`LY>PV12G@U#Cv3RXn#kUdGY=Aa#9dENr+_JkwH z(X64tzLT#$^{jA9ilV?&iFe9I`}?F~1{K;U|6zdR}&NLl+J{%hPgR?!0yx|{Jx=d!pVYEo^sXD!LVs#6n zG1d;DG?@BsrvQ5dC;m95;Or zK7^gH{ma&Nc|7S~3^dXgdBg^ye6KZ*-4`oq(KsiAVpvMYP?f^?ybp144E|p+M%Xoi zXt{tAj$YS__*MrsX5+=sK~GV4+VR~FYCH``u(p0>h&VW-wsMU{0tzS|yH8DcFDb`& z&)Ih>D=>R+-Zb$xDaPn*7kL-qezm8-q2s)4C;jcVEJBt!^1?cj+Eq93Se=&+I$mJR zN`z$0xcG}uk*;W+@FMTNx)Yx#J4J#EM97V$o0Hx0>+*654kT@A)ISRbb{9RWUFj?3OFVTc zCQ}BflI^p0z#v|$Wttzk>a65}21zk(OWo%&R{N^L2ybx2cBIag}_;AFC21Dpcj^uSYpm8paDX3l*xuxZm#_H zZSC=}og|w({c2opz&Wb4HH$_{xr^Iv^v3SWF1yhIUbC)(M%RF#%35~W$G1ZsYZ|rs zlTK2M#O&ocan#S1+>PQ%=M4C|H02*LDD(a7g=g)M)vz65-m9xdcRlz3t=;T?%oBm` zLQp=bYy|{Zsb$w~Sbe(do2J%A2zrrDN2|NI`=#|Kltu zjX`nuZAb0sy_~VTmPhigzI%+4Bfxd~LE+_;8`^(liy$tq#J{G7>hr1b%67Rl9P$NB zmQMqtHDY>V6pfOA&^7}5umtsBp^A$Ti|v$JN0z-}2$|?>sY3nwHz;$%>Sp80n75Nn zq0ArZQG?vm%Db)nMaz@aD==tow%l9iiH_+#UW+=LKd%J) z*#nV@I!ZI}=Kb-kHI7TbDDJYEJKPpg<8=F%2u`E`FPD3`<#O8Rm^g^&H8Ku}#DPBs zo2o%5zy`1BbwR{AT?G0&jt01Oe{BiNk#W+(J^byp)NRN2VN8@!OB6u*Z2|8wd zXv)0_?_vCk<@1>-Cs~pk06E(!dZaFrp{l?!%%OsEnkm$q^Q~c1eg5Wcf}<(|f}H%% zsWQq}cl&Tv9zc|&kn0G354x_zs6IIXGECT)-HpvEep^VR@U+-1t?W+3(_3xx(_l?^ z4@(8JGdR3FYvL0oD_WP8~s2*#)A_+idjk2XO%!_mUM40X2;V7RXO;DZV7B zPuNYdEmE0;cqx`oHa41&q?VK!xP|gi9J?gd>bSz0eO3DpQ0ns;Ar~yGPz$8vyqb$- z*(|}De(QX0%*7HWYmBdwxI<-$^0#}QT0Z^w!=(8<5?j$cdUyhPG?VPsu&k)g&p|nl zg@0}l(4&qU=U)zqs|GK4zwLeTq)$5I3ik(h4%4AAbXw;m%sI{PE#kCos`x)LoDjtf z2p_r`a8<_zIrbx_G}l$$WQlaG!y+Z?v%B}9p+5IH#ijmGrnuDj{B!N*8cf{nw=I=X zz8%~*cPvgcZ{##v{WT8UfsSt7Nho+Ix+uG+fl=oGU0+ZdLF@o~;;09A_GAd%r@hqRxV7@80(Py;nU3|m%q_#5=U3c{zZy|ZGK#|h%UKP*pGa5* zHnEzi__#BA?QnA?L|^uWPv9%R#v4LSTzH7#WlD%_FL+uR!H^m%kd=63{aYWOMqkQZ zUmk=_*V?qGZs#lIi|5SliX+$0LWa|ZL$Kc$RXd~+0V z&Y+BkKSi9}2haaSx6m6I18K*qFWcuf_g^ux+^#~cgB?!b=vo6B%b%*^OmLwt8hG{# zDQ4LFI1d!}>acY1HRf}iXE#Xx&%CTXyC4uX%IIE=MjG!{SG1M<;yd--arSO){vK9| zb_F={aPG`Nvu5Kf_TjY=v#pPlTY62IK=s-19c}cNP`QrGY&{(_@u&x$pLA+-1HXqv z!t2W2tZwnJXmh~$u-(0k@47R{JeVSHiU&#eA876p7NV9kOsyoZ_ZbvMV}&siQywr9 z;OwI=lw<8&z@;v!YpLtIB7|{t{!YiT)m%dHh`Cd}qG3y%nd&2(4%`C1XkSeZ&LyCZ zU1Q_rXfxnOOV0qsc)ch6(SnHX#T3q)GyOZ$)L$b|s9Fez04qb=@{Hk*{)2MFtUfB& zrN%0P3ez~Z^`^RGX3xaL<>5}J_SOnvf=K@E0Qkfi;Tvh}57igtGe;Y~Y~GBI+~GH? zM`D9Vhrd_&t^M;##)nMHNfI|8Vu9N^#Su&u#fnEw>Nu3DwjClYBv#0tKmf8Cg$`0|bzvP)hUK2yF^B>re zp6l!^D8u%o?t7eK_4qh}Uj1LRz%(VT$DjzMY_#-lM2KR5m&)W9i_mLQrB`g zd`XKoJVfRuUzuH#RuQ0`8e21qu52w~bA>b0UV2frQ$5apMsHd4Y>3drFRS?xDQqLN zyZOh*KsFqjE5p5ZcT?4r7{fJ)uUZW|JE^Xf*@03NbK0Taij(6@VX}q}Gg=&I$Y5xs zuJNl@FZeJ+%D&}5*_o0O!$)~fRdo&UEVBEKGwF?52>W&dw0y%dl4@&Cwnd|1>S-IH zv7D=t8e>vO0P0X^E>FT7rub{$6KfAj2)ToX1lZBlCFEa`mDb+p4|bcyo@`mY7>@O38phz6 zF67mV8m)iDVWmv`%o)@b(d4XMtXPNxsFlakn54}I<$6m)mgkbE;)82j16;{?&FhL` zM5`xyR$+ySKpP}RSA+#WtuRM{2j3nqI%+X8dRay=imP?`r4s~hS8kw={Pd(}G+V8x zGPX~!27*Eh+95Sw`4MJOnPQ(KGA&eS{B`ck8SfD3(;4*>8|P7rsBUJ-st7In(E_mJ zxl<=BBhe7*s~4F(=;;noQKeA+gkB8^QPit;W67?@1wl1dsVX6)E`YY%4<+BaLSrDB zy7PqPFZ*^+UJQOGzG5}Zyt>GcPwQm)ztoQ1x>iDImbXdf zFB3%twUdRmOi?o7QR`w&`|d4cE;ZPemmyEzpsO)mhOtfd+z=CHs>;rIGfY|-oU7rb zbRkKP$A^8y7^|#s;+G8OFsAfq!uNe=u*l#kohKpW%jNYZSgLdDXdJ&H|a(-rAyyNuTGRV`((c5u5qzW z_*|T~V^u6yDjC&?RM2JeOek%e<5;^$sQ?9+3>+g8y|;*u^jK$y6t{b_F|5()mFZke z-RCXrsk53F3|uWmB5RtLLzrqCHMrm$uNs#JGzR*Yafo+K_cBV?b&8NOWIY|0V4OW8 z-3Vq@t{zj=^p8_rEZGe@C4<|mow?u0|61*j1pIR^*;+264z6IaXVda&HQ?ZCB}sl- zMcCuQ;3b)Q3d2>77Tns#F4IV{;PcwjS+AT>-(cTH*HZt~^{6w}n+gmjuQP?K|$d$v8Z;ebJN_eeJY1P@jvMwkZCct|PKeZf>_N z_DYF=-;rvr?-^|vo3DD0!@TQVlO$>t1c{@TNZzDTz+>h60?tc5UoL#XGn;IuyPFM($oyg=6gKRhD19i;tsftREpzryP6QvG_qgG1Y*KK0$=3g6D? z^(tRU{EettL>oo*!pFZ35c~_&0IU6ISm+2@zOHb{bE86Xt0#BqGZ*g!_bAb&ql;oQysZ_{a8vFnFjN(~_rDn08RN?s(ivWglZlWKPayD;g+6 z+dhXcvJ$q1l%Ie6ou7^hmsMh{l#8{drCei#j5%sYdw1x{K0E`Ni?~xOnEol8v61J6 z27V|)Y}a10O$&N60S=T*=?px2XHMA=)Ty=Ogq-HInX^yT*a< z`Q6K~?>#jVxHI=3Nb|;l4wIpK^AAJhyI+?r`UO6p?s6v_^G{c; zLa)@LIo|GMQs%28FP)+0g)9mpR!ffV_|4lQ^cQ(d3V&Ulzb$RO4-!PDqHCunNmpNI2VZgw>Suh#@Q6G z{5G1ni#YC_Vix$=`}1Q>>@~g0fe&lSy$2F7OZz!(paHU^Jg?aN+^3c!GLdcp34GZZ zv#>%;&3Lpo=Oh_TCUDodQ1TkCznj|1+W763W`b@MM$;&_A^z}p@}A^Y50o!6*tsRz z#8t=n#x^56#hW#EWpamIv)8$dtDHpPW}s3y2ad_y$IidC;?(vF2^>FS&|Q_&*RwCl z*`2w?GVB?*sh*F{%~gg#bAa-6xZ(F757;u!bBr05Gq?^n*`?a%M!fru7PS%~t%Wwj z^M4~w0k2~67c1b|eCpcLs?yJmcG zagPx{fslnZ13?Wf!hoYeHP1D-6WrPLT&I5S|>etJ*C%R;HEoYdX+k<)VDrY!Y< zHEpGQ=nHyh6w8 z=4W~B8({~VV5d6Wc$)G{ZNMF1L1wpTVY48UCAcr4&Q@UWAx&Mn=B4Nrh@uesp;b^= zMo?zpyG|nyFe$b4ZOk%ObvixWPJw^BdL~?5t%evw&b>=;@rH*|f9VnMZ7KFPL1+Ur zoERY`a$?Rl~?U{ePk#FN!@qm#*n;+(COPU9SG?cP6YUvT1nog z9b25GGud$RvL@DH0veS->N%!+KzZ6ksByLoblQtb3G=_zQ1#eHT4Vcqo-^nl>4cRU zH>%$bT94n{=-vg>inVJOQy;E(OSO05GYC0q1-G=jqAm!8H0heowRpdNV6JeZ>P=@dvsJ6o$a;#70_y(5-56E zb7C(g4#J(vK6_M2=O7i@lpieWz4)|QLoTW&VAV=j0RcWy0=eU-MfRXeZ~xNmSAJB7 zAUg}U-DGIV-PeSaIhL{7U}ev^%Ots_;PI92B<^ABTsT}P7%MOwv~TF0oQ?D0F;-E{F!T$%Q$UAEw6dsUeGZ{GCUe+GC~-tQME&uEQa-k z2WPDQ8Ned;{QQH3mJc@f7H3J?El$ZM1hLnIyL5*uzt{)#m8h;Q)n4ZDwdEOt%5=!V zvn`k-Cw8XL{7J{*9HSLY&M{jS?c^)S7>tb+To1Dp=M`qTh|R!^B7oVV=We={ih2r} z?bPThvBg#}^`tD?6Qcq!cbAMoy1^9i*d`a107mJtuQmTk?Us0C7RE!Rv84*SYyr*` zqa;}f$9fw9$|ypcQr2Bn{fWyljKiU*j@PG>$jq*Oc?9GzdrR_QY^L6u2$*JUx9{|$ z@&f;GYd&OHJy=wIe@`|pI6=ENDvt+WC*x()YEy52h9Bo?xgag$Z@4!9c5anq-u5}6 zsTN8D{;klw8%f%!?E-l-+q#bTTpl3HNIpXviMaPIz>H)uOMqsIkoA%N<*qUy(%d(K zXFan(#ffW~+~&&Rp5IPfuRH*BZyKV?Lv?&qNm)Pqt6)E1yU=;PDz{PV$4CQNT}GS> z`0UI4on%p06>6D1tCM=FEN1Idk`w4{b=0u#fF;%@T2lTP(#icJ#rV4a#ut;_)~r_S zdgVzxP<`d9&_O~-WV$#lJ~FV$i?0^Pxuw=y@eKtwyqNo)3NFqie4tNZ;m3lzyBtn& zYmltjx$s-bh!bZ&fhQpzg$z*%>Y#lWvltf5W~g2HIo56`BE*s;wTg`mh$9ocj&Wss zbeCBBaz8Ij(~4(Z$iM&C=WvXUC{J8RVsTl@r^V<2kK(wXYZZg!j+@w^en4$(+ zDoZqu)zsoV(*w5u8cg<5B9-S=9&?d^GXr=98=upmg{mIDW$9jG=}95{Y6iT6Y0PuN zGI*nEe^@C3{HZ3fszr%p6=^RvY5 zG5Oo$fl&=25<}f?;WdysYk%3tR=Zea`_Q7M>CCVfS`n-+b^in0J0Wr2_XG#YOM zovhZZr?c$mXL)YUWh={V4$fGYKFL@|BUf3P+=!kfmRS}j`@ALe?kVCU<|H9bLzbjF z8?&jW8+3(2Q;p7Ml2Kz}&NB;o&Y?%ZZ|lwr^wkzKaI-EO8{8VI@E1n%NGy;<)gZvsRwDSqiq@+#1!}tYi{Rt zK_PZga;scWkYyNE28`rE2dgRKw&VrZ;Pd?X?+jS7-cm9T$z7!g$e(!RTi0gAx!_zF zI;Ps6Q1kGwA5zME-p&n+k+ryb1(>mJx)6-R>%%=v6f(P(zf=1J4YzCv(`3%Hef4-U z*ed<%!R5MdMLBgj`~s>7^Bh_^`66%NYQul04)|BY`(n+q7+T14Jcw$Ht-`FeL<|_! zzQiw-bBD~gLXJA(x0G{7hD(f=($zc(6?TtO`LE8a>|=CcD2<64iDu2%AJ1cjF=7yT zdZR5YqArz7^C`P3g=1mK#_a19e;DkGSb7)lw)~P3;zOL*!ubkN<8^OgTsC(3_`pbB z22YVUqZlQfU#;wn5g+;fYl1|!(Q(8&Y8U=w!l~ZY0;TvBb6aXqExDrDZtSR24CfVl zY#zG&ZSkg^SS*^>IPsC6a%55og5!&jk}wRpUTHr8uu$sZe-q~@&i2zTy67u_u8zj_ z&=s{fDZwsEmyS0r&Hk8Oq7nET_dA<{m=rr!fZEB}m!GdL+WyG=Bqk9vn%*^7tbcgG z>nWHu{^eD&|EN^REX~CMU=daB&isx`9kTrN?ee_d2Y5Nu=HN=E;#ltGy>gj?83aFw z6P?hPOJD}FTSWNyLV0)Mlswh3pBhGZ^6UDqfme&O-ccLxX0m93xl(nwiF~9&j)ur4>|%Ua!3vgrp>w`K5{BWktij5|6t!l?GLpTr!*Zj92~e^PA*K zlQWup`CjW1FQE5IbkA8=Vp=N`eTIT6R5aemZjX? zXsRChO5a14QxBmqwPdot(+h1rLq36dOAno(U)=2%U)e|k3=Dve5$Ae}!gktGLcKm- zii#vztYxc=)}o9E?1?CIZo~8+pDLnrv1Z=zF$LtQyUI=(w)+)|Y1*S!l;wbUy~ zfEVZAP3L5$(KUcUM?NE`V_!U6_|XK1o?g{$lq4Uj@apm79qM(qsp*A!zBOon z9Bt5hqT#&7G)0&2y|1zn-}UZ(w-aTPY{X|1QzC2 zwEN9#tLcvBN!D+%GJUS&L$ob^&aim-qdToijD?MsQ%(G7^SL8l8(+;gJgrX0c{sP# zO0h;itYJ!?2Gbf=91j=GQ5`hIjke+64oZw{S6u%B+0TDd$`e>76h1f7s@^%N>6@i3 z&o=rcZW8K5dv^_6DVa=(LYOfPtYvl#s0-#YO!o>8a)A44HL z@KN|Fa>x?cQN7wG zF_)(!X+m`b{7YWl6s)Um3CY-ABT8Wdq(-dUO1WWYQcuJY4Q&ivw)4cf7h#_5ur^LL zyU;70@DzL1RR3kZnb}w~Dy6PpiFbSz9~ac&PG$h*{hIA}Id^i>*s(e(cHZn|)KG`> z$WlYY=rS(N?4!h;`DzC9NVX8OLTG$NYvVk+~@8CQKpA{n|7^b@c&?^<+jr&}m$zxfR2jySR;`B7 zQt@Y zM4T2Qwj_NR2l46!N*ud*>_;G?pL#zm5w2{|=TvE9SbP>91vArpT?)*qq(xc`-szDO z01jqix$QAWs+sE0A15UyH{EhZm?vM`|`L+_Ot=x?vXvnW3&0GmBT?|7}z zVRh9iZPCe5G}Yd|LrVv$8R`ey*<;SumW4BNGv=nx_L+@u`+WnhY%*4uL+)uOj#_9cNr z?}rdaLRKb5V!7i|wTW^uF6HEdPCVCQ#!q_08p_ysDe%E9wxevrWOMRi{<_wj7BU+1 z{&nk4@9{9`0AM1aRhHkiI?2>MB0e~x2&-pzvmwEiPiM7HV`|`ah8jZ!QSiZ)Ip&V< z(*5#>ai{ImU1n+95nMW9ZtV30qG!6rvg_BXQ}9!^Lu4(Fy8@|)XTtrd)j@^1R0Ok7 zKITwU%gNnWLCMS4AKzzR$Oe$cP@b6uUPT@OPaRKQ48VlpgEX+g%y&a@TE_MVzTOPG zm&I}HP`bmjq8b(R5xxPjk#_<=siRC#(7GEacn7IA;GtX@6r(O{+ z>P?nxDO3p=#BQP}uf{9De|Sl3;_HPwV{SvloRl}bSSc`bELvEp&O(Lq75_#eA)NP% zz)VZ#;UkCS!Ix8(~kEnq}yVPIx94qs03 zzV$SLEDE!&WWV6f8@v13&ES$#yq0t3^e3>D*jvc4L||HKVvqMY+FLjG#9KhAMc3ue zau+{}xM^z*Db;HSL{L~44n&aW4qWRk9MRC?CunC{< zOn13v?$nKvdJvclSoY18RemRRfRM^-m$O~-o=9SPTx*EO$z5@#i|$^+vb6$P#LMbX zm&)5-@8W$#iOxr(4#g2ojL1LX$5&WKEA%oAK4SRirN6Znmsl``V$6v(=_y$e53e z@~Coj#Y!RLEN1_&MplKtK2Sz}9UBzoPU5R^KM!=q3MbrkYAKG&oP3rTgnk=Y^J58N zp3|F56lxm^*a}}X6}7h)*3;0~=P{^r2UblY{`PSLW_}+Y=9m!QY(}(PDc}K3;XBv(4}Nk!HfC<#DUQ>Es}tR(jRB2JG+w6vk@-|IML-dVItUe? zf1xZKF1}btd)y$aanONYuON3jIbgzyL?-g{v&22bmdFN|H?S%jjByZosQ2;Z&nrfl z)*w%ahk6Xa^We?GA&mK3uGrq(>l#W2b2OiQHP)6_$&2G8@_ckoFFp#;GNw@hV!X$m9B^a=GtJkeBi(&tO}d_^7)B9RcUW4Sh<>-tNgQjY&-*BXr${;c zGCk-qs9>>4v5;F0X=3BL>sWj=J|u&l-BYi;lhhNtqA-)^s=y<>mUV|PQNHam0I4s{D{~l|LMAkZa zDVW_6BeLvpkKH%^^ZFT;_ZzdPFJ-sgz{iI1d7FHeNXnK72TQKJIFvgz1vl@|`?|Qh zpxKy_1=?x|^QFW55iKI>5ZlW0`EqNQLHvr`GD=B7xdQMvF!2R@6otFtku@NS0T zM9lCD>f-S~N3XmFc&TR7BADtc4lzj2HOYAZ4s~K=fT6ibja_6Z^1*^2cQfa>^+D6W z%Lc{#GqA2Id3trW`fxTc)&S<0{1gryszp};Y*mkAnfGi-Q$)SBj$(P7y9F@HbPZ8v z1F;C@*XgWVFPf`nLR$jQ#4{@~=qoju&S*-c(H>u30{SH)b+XqU!Zuyu#=%GV#{M%w z`bIP!>t1{*k|I@1a^1Y;$!=@&51Yp8TaUu0a|VY+?mhZNAmp#@-?-ilPWv6gIduHY zg=d4{?_hJ-_go<>9Q3+26SqKUudkXu0C?vod@kYOg;}tuQUOwf5~NDG_~^9^IkaCF=Tn z)o5*Q!p)n}j|-J0@#;53?b(Hx69aZ*zXY1>M#apZ{tNmnhF5!B*>1vjv#@jGu!q=`K;d7op_Sl?P1-$1NbawRPF3Cm$Nekxr6qWh@xiA1}3fb{+(^ zjhZ8poi#!*h*%01>^=Fmqk_!CUsE#MsDGTHcA%$H#WE*h70m-?E@;|i`(Ndvd~~ik zsnlM7aE$#)iSN9)^ucqp(7y&#@U}ob5xPIkw|=$mC-#)e)JS$H(_+SkrGZUc3R!}PxAr|F<6nogGO2n%!r|;|Jb$D4JwRH0? zUz;gOsJWRMKzU5KFOJKBkgPeb>7~2DytFkX&8-d2N9x~rZ-w47jlOYj;CfMSBT35{o0{=_-|n zt|&qQpvTH%Sxcinl+ODMzgRibONh6-_Gu?SeTAb49_YYp@ujs&v7UPRjT1t;L$lmo za@Yk7J4^`G0#>dnZ01}h$r=&AmsqG*xbE*H<(awG4#D&(gKj|hVs1XVeMcaPS#GP% zYG=a_+Z6p4BP1m2{bt5MUDl(s;9=uJyJypKR*s&RV<`~v7i?$VMwHh>&q90A{1t}Cn{{&ZJb*!>MQiHJ;a zQ$;-^6wG=V|1}5etIGB}BHZ!;oD_I&>5sgo(>Yy?n)Fe30qH)*)O#Rzwyri`kf@_ zFA2KI8Nr33c}&4#$1h%0(8m2lJmpeNsZv0!n(6{oQfiYl`eYUoK85)yDhFPwNjvWr z#4gUqZP!yrJd5y4+9hRHNLSLNk7^j)XWMV*)Z#AXSPITZ#$L(&lIq`lMfUOC2wj-U znykYVLk*#-Da9Us-E=X-%*L%P4nK0GN$|jX9gg!3lrgwFWMGBK&RcHmXMvCC~ z+1^<~%%Wu-3A;kg=-3pglj>!ADTAJIzG_q3TtHsH2MCY;F^gJxip(}0t&7w>zZbU+3Iyu#p>eJx#f4y!(rWA{7=GG1GPYR25;Je*V&OMiXon@#GzG&L9N1bwRR!cm5?as0fF%(1jYk zuZq+H54VnJ)NLjSSR8M{U-Xfkr3V|P?IK-gWChvjxTy^{=tsN*j-0`-q!Y%Eq|)7Z zc>NA$KP)fM1}@oYA@3;f=&(LRp|5zH*+~@sPNg?grhxL)(m&^osMxmA<@XOb=`d86jD zSO4>TgsI;4Y*DI@Nf*_!F4njL`40BOKt-pZjjd_4^UF~3weOwFua#Y_T#RZSUl0-?%t|!}L!E`FkK*tYqd*6ObA}RJCjx-L0D*j+;88 zL%sJ{kCLECXuKpR=J10xJH_WLSOvYpDI*&*Z6W(G<--kumSTQ9!vDi0WU)=4PW|6V zaMGAASH#Q(t+odhr}s|1uLwyH$%{V*I}WtZj29*k+b6#+KJ7^}9RRtu0|z*Bok z#D+E5fqfFDQ|3PqJhgMUutX8t*c%e~OtSoC!_zRh2VMQ|xs zrTwW0zG`s;JsyWS(kv7q1o~3cwL(vu^>N|nSF1?eQ;Jn6p}vidi&X z^EvAAeFZI}j($-5LF`dfeNO{~9KW+SR*UP)F+7LbY42jVTO%LAq_A@A)yz;Tynsv$-OFIgp=VXzKL!@m(5z!ny@QXcwt zv_Zr}Pae62m@s6cs^VYoaexd&n=~%+V=ejfyQ_L1AG3!Ee4fX`mguU}+kOvLNLR}) zX8eeYh4ibNCG*0ZXExnm^s^&w-L$J+PVS(T#f(>nIb{&FjuKljLk)}U{(Pn(tkftx zz+hE1r9pU_;%h{uKqF10-w8L(W(xm;_4n?2ZRJab|+fkClA5tLcaD0 zy>`fh&4#1+h7Do>BvLW4PK3}Guk{-cd;Y*bX6yCg`i4KYSxBSBdZ#WEn}L8q7Od79 zNN}urben)AO-xjX?|dyl{MqT|s2;@tK6&)zEKXg8w-5mmr`HVWwQ|+um+M*cfVazX z1E#Tc^e_2a6sSy*1_})M0Hx=Xthx2;Z6)AZI!V*DDZ6aQHTtF&;!~y<#;Zp7CHe3q zG-f5B6{Xh~Lru>g{Qu9F_qN@hZ$Id-ugkt)Am0VQysuiB?*HNt{r@KBe;(cch28(L z^govV3j_ZJ^S@a7A4~s*f&YT}Uo8EPrT@aff5H4Omj1`me_`OiVEz|N{|{K|0{22w zU4itvo~|0ohUyFK=n%4ly{;M3mdtNO)5ufHpDhShENboGLUW~11GQg!nQmk1;DR1A zSvc|T26*@E$od-BcQ64zXVM)3JT5cr2qSy!c%cV&crgR^{~zCcO%;0jF$S5tyqA}+ zJv*i0epOUK#SzXJHvOPs{s9N~%-6d|KIxJBDmTnuIOj(MMHE47)}%3e=9IT`(Wm#@ zZ_ex|1qFqjiwguMCZ?UUGdLR?o1LpGBqAc>&BMb_1_p+krzZ$PLc*KJM{qtqzR?6S z*yp!5A%6ZJKOrCl<>ir#rZUh20t0_(He1Ejf1y2o`i6_-|>r! zLmf_KV%{B1K)&3cgo1*@@b?9P=ga2{%D39-Qz{lgq0woeMWE9_3`JswqL4}Qk0p@h zE0-(Ew>z0rDwTXojA~+xC(}S4O{9jxpi}b?MWE*^7E8*vIT)8I7Q-l4YoJ&B{Z`1X zR1L*pvEZM|V98gh){yUTu`W|8MOduX#1s?~%Gc@gkni#FHk-`@VYXUD`bPeY#$^j3 zm&xE?D3QrmZ!nqdbaynHD*z7)4i=b5q09eUsWRK{Y-zSo0^ex8fwA6X33;{A5{iJ& z$v+ZvXk_-tK$>vDM)kO2Fg6Ka<0guUe}!+u>?^x=@PvaJ7N? z`gj5P@dgY90fXpe+wlSegG2}t2!!a{?F-Z&jr;Z6=~Nzz)d~xakQYxh3JZipEG9^y zP_*xKu26q6jq$h3r5YBS4PF!>9|5^^+K(NdH#+GocI582YpyhAa}?c2gotkRfF5hk;_Fnyl)Ak)}v2_|#-2z}mf z#h%YfbM?L_<)7W2pjx9D^85S!%s;nV1GRc1Xj<)dv=ll`h>28&P+gxFaFr@G5E|8* zAYI=N^lzHMD^+VlzPkhO^Y!7X)?fl(rQLzCT&)Rtu~HifkIULS9F4md%lGLglgZk5 zJe9dO!}k?Lr`g>5T_0St#U|K#qq*d?CB%8+~?%Lnu5R540G3E{Ks>!cbHS+1{~4ioL~hCA-%L zb9TpLxGWw|jPC{^PiAsMVKM1@zawmKzF5lc<<7X(;Rr^n%LBbey8~jSRyP!v&8BxM zlWi~8_tXEoUwz+Gz4u+!4tTBI>Ixv(?C~We;CB0gNXQ!`7E91~FcQ1>{j!^fGbOjD zOKfi6PduGYHxLHh?x63P@B1G8-gj#^Pgj~yh=`%CfbG8T5$p|wBHr8{h&?}?p$ZEN z^BWnFdVRiQcYD2nDkvx*;p4+IGBP6J;=t5PHtwuD%o%`+^09QS>v^v1--|5;Tp1uQ)hVSo0i9ibL6g6%s z=6zuJh%Uc-INcjtwN<~Z3qL}y%V5qfZ`Wpzt(e#JZn^;Iw~R#i$BfXL@7lac`0)X} zA02f5b&0Qxx@Rzx&M3u};Zp^(&nK?vt;XWuv#PBjFVd@b0~DxHtKwQn6R4Ays77n~Yqz#NW>5ZiVppIYjut;HoPhv^T9II1ZX{)$ z`mq0HI|3hKfY>fIBWh-(>Vs*xd)zic9D^)F9g+%G?eCb-yHbE{`K2#Dj1i28Dt8Ox z_P{p(bDB4f8EHz9?_|Mp`Rwe1Ftc_P`YI##l%d_giC<4Hya4GI(Mro;Jbi}v>^=u% z7AVL}NjQGr_ogLJL)jpky5z8aZRnc$AllTXbFWH;!kiE>yS6Yddpzqja4(Qg60NVF(+bMW#lNcTKwmZ&$6Vwu3WU$P&|%Jz-wYYU zi-z3<{ZghgMv!ymW(cv@I!_d$86xt%uAeYr#&4A-I`P1%Y(Q;i{tfR3R;xXXnj&5% zmIg=mt5rNYhlbCs)Qr)w%wyLbYx1CsIASIGK3Og6i4m$!kvl9_eV!SXS6%UExD3ma zzN#XLQ_5MpDa_oJ4@0GSt?vu~sK=GdOx+in&UlKCxehzUq$IX-O8?|8jHqBqGu#7nC{j5~$ zd_c@Bn!ydEq`W>yCmyxk>PA31l@rfxOc zRlER7bJEEdo?DqmKWoQzPaHxY*$D)b+cgl}OIRl)V7IXGGM-AS>!!vNB6fuNKnERC ziDnuTX~n!8=vq<$sTTr+DS@u=Ws~<*gN;6&)oxtJSYwy`jGBw@L*XNmWXCDSo-0U1 z$g}8hZ1*^P&o&zuJEd|7@^~?5&vO&2rQ};;!Sd@xAl+-sU@Fa_Aczcc`Y&ibxjnQd z==2J5@}5xI{US+rUSaOM$?-4JW!{{wA6lD}w==IeV$BeC7gVPjA6 zs{PoCp-AZ%DWN#rMPxcJsOVWGL8~AO%C)}m#AGwFNr+@^l*G}6sqVuzw2Q&X`!`$- zGrR6>_S{Y@%4xj%2)3hNSSWj&5d9Q-in;>Lr8De1GnUhd-G86h#*F1V>@%@Rw%?9| zg2r+uwpN=l&1+VL9oJi!D{1AByWtBsrL1m~bL-Z2U8kfxNmHBNtjLAM6Y$KS@W-~vv3O)IME_iP=h?izK! zH<&Riu#2uVe!EY|AdV0N!)}R%WjM0oW<Y2CajYa4E*yquwO%G2h9Bt{d z9nQLVF6GmdHDtla>;0`IHq_XZo#lOg7P@4v&+qZv1Xj^Z>HMNrz6$wr=BgVu=QF5h zjW$pWR|uBKy5Tn)2TQCt%aQqBhCx60Sv?o!f&spCc7i1X@yVIC)`H(avz2|;X1eY9 zP|nge&c5P#E&N4uX)~AxgYfh3rJ%H?HM^E^%a4&x;V8R7^WF`dTO`R#)z2nywe-^w z+x-DNpZbs<1H)l3p5GWo+A$kF!8^Sn_eSbtF3PpF55%hdco_!B#Ah+@U6Xt$9 z(Ha&6W2x7q*PpnCqqapdUKgm}88C?Jdtq=K`}MT+%Y4}Yn$272?vrjGjxGFd?it6h zcuZjX$18S7#ySM`bPTHTp7!9XpQ5MBjAl1s70jic60wD;=ALNwn*>?jj8m)(yL!^c zXkC(}*KfHlksRz486vS)%=AX-aTuPb!jH&L5L{sZsQS_-SBKgr7^~=f8Ta-SHNG;? zv0#X2@QP%hr#2CmlAL8n%Z=6`p&)8#Gta*z|8T z`fc^QB*IIptm__UGkA{s;La(iWWj~=u(+Fvr^aN4L*gIco=p7?!7)!fssq=^Mit|8 z7KtMqd)NW4|E-1w99K(N&T+lR5tXJ)%q`haFvIA7F=j^h{GY<$I+R> z^&Ff`Tz7YMeog%P1IGgKYma6aS!A==bwYI?yf~_PXhYFC0A7PxmWJZp35D{-)AOs1 z*ZC=y{x}7fUisXHt}6@8QsW~%`t$xPCR)dn4_zQ@M~pjuFtTsDxS!!U7)Jsj>5b3P zlkV{LiX+_9*jm0a`oUe!&$CdBU)Kn>TM!QdzDm))2Zf=A+(BBpX+9>cZ6H9)h$FwfKlum&j z*bRCj%V8po7V(lX*E_U&w2_ddaw1*109%_yd@Y9aqnR4CfX3tZr-=&kkz~blJBUGj z){39Lr?v5x6Z|$q#eXM|eFUZwFo#e-0Dl{(AEU(|UGKT%7Q7@hPTBy@$@Hx1Wcd*^ zKY=jW}``Q~0S@3s~f>48H)5yN^R{2y& z=ja59YC0^xkuJCrobPx^L&$=$&{GuKBRW<>3+^-WgQw8X){5-1K6^*VFHH|>p@o6O z*=N2}$iuRQ-K7!U9ro}iVJZX*@KECP)A1Ab^_O=Fe+$aV zEU^@5y`W^NThLK8?yc9f=T=m)IL}lR4T6E3qUZQzv|KygV1puBJ5G14xC?o#J<_=N z@OXajNv8!s*2XDl$!&$1kc-a}|dA71w#fNmK;`nqYO;_m08O|8JxMjWGyIsX7 zqC)$0OExG2!btW$ed<5b`hF&g+lv~y68$;rHJ(rrj?CnmjQP`eg1iK@B zY_GqJ&u)m&loeze5r3gOJ_}t)dhatg4Q1Hvs=-%`_au2d=2=EX>2_$ud)qiP64KZ5 zBM@24sf~Ny;!_P&D4mLDA7}#Q@%$b-aICXoEAdm2vDD*}R=G>AnyB=s%Rw#qH{jA7 z#RhTP#&rIo$-rgR$bDnp#JLjq1c%j>$h-D8QKdvxORMNQ58kN1+T-IQI`Tpd$Z7R2 z3X*?ej_xHsD_50FrG8?x2G$BlO80qD1mKE)`{&1CJW-?V0eLFEB7ZH?qfg;P_{Oj%@yXmS7rHL-94|6cPgR+;4Rd7{FkaHT(DcLQ{ z$n>b9Sj(rW)r$A{L^S2DCLQ@vp~;}~2ck8%2`O@84{J%X?}+-LSg(~L(7rgbd&?`Z zkD{)rZ0#UCw}8A*0ncwe!w9FgsxDTF1>Ivtet{IyBq-99dR@S?@qpwJ}L zo#%eVJ&IGo0F{uQ$GwZynBRRX;nYtp^!(k^>JNyUinIw9X-k7jF?oFPIW#XmX;dj$ z!Y|XHG0ISyjn?p4?=s|-*f&U3Ar^yli37p=9*==uxXt@M4DS41ij8NU0<+z{8k*AVB_`|PU~x(I!INJi zI$Ia+8KtM55pvXaV`-imJ^dfy8%JNxqHShN_xbXWaf}VNw zgJ2MEC7k(i?@4i31H~oTukS&eA`g<#Q%t5c(;^A#IVbXmmz)kdtLS*jv^1lsDKTw% zODoqFq(sZk>VOqh4w0-yco;DNoiEcf(zmyWA2i- zx3pUlUkxW~9wXim$r7bT3)lCjV{Q z(5NYzJzQ#;74lo649!x^4dzj@g?z+L#wdE;tzagkj|IomRhC~vGr>1~6DO}*c&}+9Mf#}-w39t`xg&`C)#4H5xYYk?3Y{5#^X#r*R2&hVU*I2su7mTsIjQ9 zSfXp|ELgy}#T81FEUZJ+wh>L`{wph@F9O^m340BT$sg3#&53O^rV|SzY#VSSn6V5| zVq)tR96k9ny2IC!NB(m%Kyna#EJ*%A4i^L8Y{3R-Uo_q56-kDvsQ3gq7|srv$B#8j zp8DU+dB>KsP@BDrpEYp5kF|H9FEjzoWn4XSWrIRCB2eTHIAp9s-Z$-Xc%Ve!?xl(4 zC7+2|EZdhp7Rn$i48MaK%W51AMDscKmxLwF2ol;&hRfM19=u&0)}@Z9eT}A<#ImtM zvu&d23H{Y5L>!q>CDMub7*Gn|E$&>jTIao-Gu8-LT784imPNpQS2g`~-V#_5;F??w`1>d=tcILVg#vT6&VL*O}z) zoWuN@NOHvJVVXT%fbVSgWIP9*Oj5EN9OE21i28!MpB~VRkL{lD0H`O5>O4rZr$l2N z+da7@7@+p7#W|tP;&~;Ys+w;xHNaO~4B}*GSkqLJqbv8n>V@)p%eW>|E?)Xt$7tu) ztgE$cHqWUw`@N|W%}Dd9YtIJ3$at7xhiyeM8+BYDO$oj&>}N6dwx;&Nf8AQ74LyZj zc3Qz+byK%y@oj&_yIH~<_Rm}Lqt9Vs>9#o6$)BCFwpi5SK~C|+f6(P++p(=qcz$Z{ z4x#@mJIwxfU0D)B;p_-GOHCRfjqt#~v*8Lre=i+D{vVd^{@RkLL!2E&_qG6Olr+j? z6y4jD|GjjS`QHDpDRf-vxYBW@<4VVsjw>BkI<9nF`QN`Xo5Tj|im+R#!`ILjVI?Qo zeIMm$dV%;YdxiJT621kYENCHf_lLlrcs(-_8{@5h)4XL!!@^*tA2 z3)|5r0rxa}r>CKn*hu407LF~~VR|=;o%O)BeqhOYB(jwn@xEiUt;u6$Yza*- z-dK^h*jp%IN8f%(U$`rp>kyUZ)1;?H-fd$U_JsFuaF^H_Y%P*1C6w0({Gpdv85T@F zyC?zPlXoGe?G(zbj?+J93GQ}b;1T5aX(OO#>1*zpGB)F>DneD^H@|m0A8HuLxtDj4 zgIY;r!k+IirUQ1`p1yr0&^^#XS-78e@AO2!?!6X7mT$>>-vXPt&-6J6$&^{r-D@Lg z{sLijz%H=2|2E)t5YDIFKRs3Ce|=+Z_FR`5hpr~PJOdlZ$8{El5e{Rb3*;}=V91tO zzGFQyUl$Y4QhjI-79R=p7Z}Wa2>UG3Fk50#S|U!02H`n-F$*EfJMM^^Q6_u0U65bpbb!_W4hs{z^KKEg&7 zI&i&PJZEctw>YU$jaI@Su;P;?17{0u|0Rjl44^_c(k&nR!-@OD?@AA}b$F&QMfeHj z>jLZ`;kn^6SlL}<8<)4lcH>;6T`eWEB^G3JBye8dL-Ktioye28unEji;UbwKT;T(} zK@Y0uDfq%8?#b*6b9nY-a(OsRBWf+Qq`is4C6`e=`koOcFWQ+{1d8wsW)C*K0YwoG zo=c)Oqt=|?qFKYX63y!mCv%RO5&zyp^7|xJTmL!WK?=kqUBr`nVS)uO&bRvbm8J)v ziQ!(rmj>-QYX3n%*5^dSKB&oSApC*IJnX{EbC-4rlm|PqK1%llU0AK`7jca={NhvL zY%R#SgW6x7wdC1pR?JQu^Zufy2}5S8Rtl0e9JlvWXmwEyOXh{@G+MubZ11Qt!o6|< z%a7NBDYSdHkVl+dBbN5h#Rfw)l>HK{XFdFWD?TlvxNRV>h9D;O5Es+uZ=oB{O!?AL zyLPIA_&bW5*3MdBZn93s?)##|fm6jI&Df_Zcym#lctxWQPiXYN&>UfLRI!lL-0m$7%ca z;=tOW;FRqsU$5*ys+;IL$rD=Q`WMD()}x%99E9pEbmV^hL#!2_dm}U+CPEn*kR|ea z1?4vqOBA28H9du2E(wRV(qiK^2`@q zR{z-Rg+%SP=lQFPUMaiKC zQk}omlzd`dS&?#-d+mol8u-E^Xsz`Lyf#Wk_yZ(1ow<|tb%1J8Z09?}^X;MQe#QGd5%|I3*Wgmc5j0fcHd+_{_6XA|l?y z&T2V=S$sSk!xfv5_SW$=McAz5GnriAp`Ndg_c>)%usxdX7D6ivC4Eri)J1?$1D1d$ zg7H1IA#jdY!?;{Be}(M9*&DW85)W3IK#VH^Eq!U{L>0t*op_Px+|W+>qMWJw6gw8S zv%Y-fPK0K}@0W~bI>T+-QJ^{pUR7KsG5{F|V%8vnP>z%~=^daw|F zR;_0DTww{~yo&7{r4jV`?|kmU-^`@76X`iP4`c_;f*E|j_io6-b2PU4x2fW{U)Epc zEUTF?luOoq&_>bcT~Jho5QK-$^(ehoR~hCW&$@!J_J*z&tdyIw77W*E-Or1(QZ10U z`PrZvXj-uM_M*Lqa$AJA{0pByJ~DWOTx`oWQ$|PZ>GM?CM|g?r3)y(bAvlS6YJ{_V zUD*xAEQl%hVF4T>8PcJYONTEJ;>kGD&4?*ap&Jy4Che*xtmKtHPQfa>)>6V6j@oDu zTJsxfHj&)qgY{f;Kl%5f997x}9m7#;VHu&!4m&u?%{XtWP>QB1A+Z`|EE1L_;Fbbo zbOGo_-~WswqK9H#kAM^Jm4{{TC~$aEUYie z_Y-D;-5lv6Xm3GE*-!VKCV&+w+k$PpU!)+Vz0B7Qu#V=%nCFqa!id^dw@1GUl$Z;f zUJP5hCi=c21WWOWYTki(H;la}O|q(72hXY2VW|rIRrIlR1KWBmuWGX_So`C8IZykK zR8Piv6tB5p#!1<@OThL1IK`&7N2d-XTYMyCk9LDLyc)$d(DBT%n2N`_hWnkIh2?T7 zxRFl$xZl5y4>U0FmE(L0RLK=9nHtNeu48Y1nNd;pYAYxiKaSh^8QUJT9-=nSJrk+5 zdm81W-M3WEg(X&$^(@Z)MM5}fsmU&In#So(D9^Rl*F)?6N*OoLhSV7zAyq}-iY_@pE0C#-lAA-&N7^!<2IYoF7;T%Iy3FN^)(f6?n!H{>6}; zl9umdQ}=gO zbpJ5roL^!?Sq?<+bg?9aOkEfX+KqaY1YYxMq%ao5!5%P-c5X~!;}gi9dmZX}$ZVmJ z7O=Y032wUv;ri^S_z}k`RG9sWRC6Lc5GJIgh1P)g2On_G#vZ)KbJ@NeJ)Mw#)r=;1 z#g)I$C(1Jg?fS6aUZ7D<_5#|@jafr_9&ew=P?nfU^PKS=Fo{Rx$~n}7uW~i==X>Uk znv4FQxgF~^8Fzz@pF|c|tY?3t~Ic-_zU(c_R1V`-8kc=p5%r z=Is%KVvnGGlbhurj&;B_Ly+^|ZsMJ75J3(0T1e5Ow{llLynZ3-;%(@e9KK1ukiG2g z3>BA3K_HC>l^1rjg-hyhsh-S42zWcp;s>&F349Ae=Zmw8g)`S%11iT!G)`s3{5xw$mc%1q<5I+^hf@2Hkw@C3YEaL_^Zm*9Wag2cY<6Hz3GtTt zS$$E8_V9dvAl-!BVcl%C}$)a=ow%6ij87@^{m-b*x7sAChv z=`BttL4yyWaP~{t-f+**@%)i|2OFKetb9swXFG|V!WNf!rsC8p;k zz^1D?gmc7q*vkp;R8bO7+C$!u?3hw{q&JD2H@o2@=M9}zyh(8%egFLEJ;;W0Cp%A4 zKpyohq=}QJQev8wUt)YNxF|n)zF$K41v=Q^7iH7ehpqC=zxpFTlf7-P4NiO`8(bb| zZpsw}w52G@qCE_nW+u-2POyl}xzd*w`;rnt|D44dtS!Xpp0jY&S_0Te)oeS5R)3#V zu^Y0_qVq46%H%1c@Qx524vOG*3!Q~jJk_Vs!d$`4qwqnT!Mm}N28;jSPhyi%V+%EN zmE_=rHeV!BmZXQp#MOTwr%kT1XPO}PLc=9xGsi-H0ixADe}U}NpJm}Ic=O-?DDy)4 z9dZvJkR;WD+4Mxr{pheC>64QVHBE!%UJ!0KEzJEJ-u0)FK3I_TRB@Iv;J5m!B25&T zyW)AjQXWuqmCkOdKAX8}P~A;6lwOF<5~YJ7zXX|is>CRK=-mPu4OPH+VCE~@2fCde z1=gMT2EXr!b6E%09RF&jX~70|w`GwS?v)H$eySymkoUAr=5lY3zk^l@@^@Ic>TxMs zBc1SmcR;8sbWiG&yDIj1TBquP?~2v0qneAIjIrL(-po=@uUiNvGa$j?$QRw{ljGXDQ*dyc_)U@lSmGrp0xms(las+X~=& zq8^y}ZjPq-&_2%ql;-u*6|Pfc@$J+Gq5c1WTr?8@S>_CNK{J$%OrPg`=jYa*p$)oi zQFfM=m*0nA(@R4#OkNr<$*ga^9#(fH{r-4R=*UPOm)+gI$vT6ob-vTAO6_h~5IQtWyKItlFz$fxN5ueiXNck!rDVbBH$i~PO zMji_Otw{Mu9oY??m16^04nG@S$bD9B-a$lDO468lB5UaL_;@{|^#s=x<195dsan;^ zeBYxrqD`NZJSIgum+QMnNslV|hvQ1qOlZimGB*)_p*t?%yiNXKCTOU}$&Kp7ORG=6#<(9Wb&zQxviBj(F0UQT50 zzBYZMd#&80D%+zetL`{V<^1RZcZm{ZWVxr}6k+>A%&zFGUvrRh=&tKV@+WcumU4MW zICGD5J!OPae9YTC<1MWzQ60F4ye5{MC0AO-z2DH*`6gYybyWOsV!EC=55+TwcA9Wn zGl5%v^f`-#S0K!1N!*sU$2+^n!Z+kSg8@0M(O4l|BkwXl0Kd}p2J=`c>S%)Lbf(BWSJuONINpe?MRDbb&-RuYDuKIts!kcn3XfI~#~{<`sSRS8;7Me6ZUmyj$TK&Bk8PiK?VnBfqsh zqUio;O%J->GU}YamOJqU`2CjN$jwc41%{R_Iy8~q4-$_y`^qgAuBjr3$hWD;wVW)1 z__hT4@whAHD3(=m?#}-0e|)jQIr5{B_b#V$cH>^W2DAtMvAhSKB8K!G)rOorHKq%^ zA+Bu$dLN6~6CG~D6TM5}8O6WU-e9WwQUIFr3St*D6R8(pmS4kj?AR+Y)#wwH(U+QQ z_`8$oh_n`t71^K6>s+M8({j{yKPS#bvS%o&=|MH!Xx`JZb5uj@Dio7mAKracu6RkA zmKo;{KgQ>rr)q)}Uywb`iv0QVZ59piYUsy+YMcH~d#`nh_u5^_r|G2dwtH%Ca(fm< z_F^@(cq<}@R%qvZJ}a>I(m^dSKdowH3YL+XdQHZ&vDu_zen~fdO7({HI9o_!uMD%< zNexvQD2E)rzz#a`SS(>=fheJ~>mY(87ombn{dz8e+@7IKQoFdTpOq)1Lx_GRWJk(h z_7t8GZ?D5X_&51C_WHXuDg528O2&_s*Wg+RI$xYF`=l$y@hWQVp#-m@b|I`_?Zu5Q zljpT9YoK|}ZnC^O%ZS!kMsyn77Nfcr-pFmZN^NcN`?{ex_(`;LQ1dSOS-Kp21^lZp-T>kbF z=cXgy0$4azcAEfwIK3~N=q(SF&uh=_0h+_2WZ&9@$U)QB5;GEN`3^{L!ZhFFnRECYA>(Kk|a%shMM{88LoB5`FyEihbd2T7g}Lj zF8O`=eUxEb#txokm6(oA|F@Y=_IcF>#j8&GrZu}t#jB?l@3=SY43aIo1oA?tGc-u& ziYU>=?&hGZ#UPZk2`Hrp*_ z@yek84bQxwc;?C1Kv`TpEZnmC(MQ2ps{VH$dwEG&DU>fly3-TG9Iju}xXOr2<`v$k zaEmndpPiFPmol;X0=@qt33-*3<);ytAJ&w2*j0giH-+3(BT7BTKb#fIIYnm`r}%oU z=2XPS7~<4ScjJd8>zF55KSy2lW zRJ(@;q26TX5BtKVX{urG4IXf>9E~CIEAGfEq>E(9U4758B4-Bqa4eiN#+$enz8>n^ z@*z~Vk1uUm3Eh9eV^8SosiFfsC;wZr^eIoTi)67QEdFtmC(IR6>~Y!--4zbyQ$`E5 zdN?40^MuZ#vJyH;mb_#WYk)i{$>P1}?{ASNKKGd10W=>#+b37mO(w8YX8N%lMDu^( zcdrb8luqGy7ghfKGklK~@r8U#loi-n;Y&~M-_F1GB-ImXMpUQXe--PNTj5QZva%Vi zJor%rR@|#03uW1m7x~NaRf4~1RGYLwTk8Ya5%$nOj=Agp1OIr#ul(a$m495OTz>0m z8!%JeOZG9>>wog^zVvjhJH4pqq1c0l+pHEcTqw8@1Y|pnU~=;FM+TUzRD6 zGZ)R2P$moQEJI3khn<59Lb3do44`JJ`QJ>(R({_ZKB7m!w>Ic#A-`|v6Y*}p27ae{ zt+7s!ClONO-vSRf{*3*;G6i&vI*ZXv$p}f_kA{?J?{+Ufpp17cr#v*QjGf?$aWZ2ClcH)PGW)>(SQc@)=UO;Hf@FzuIVwt6{xCg9j?s&fX`@@Np{d=;J z-_aZ1X+;?FjdlLuySdgYJyZ3%>V|l(PaN0ng7kaFHNdGD%(=ODNipchvrS*S&gDHj z!;O?Z=VCo4kv!KPOu4+Nb|q7flll9}*kCryW`C#y59Z#s#NJRlj=wW{rpG%eiFO9Q zNYP^{78a3aPX}-`3lwiSVY{c*vTsKG5&$cxpSauuqzLLKDn&oFS2_x891C_`3DplzE@kcH1T|I3Y(jLr5mHwHrJIUr5n* zFP0;%wn69v&-mWUv|De*@8R!T7J5Nx-ug{(G2~6z`Y7g}cI&^P)oi=AgMG!TZMrWAj3pD83{5gBOIRY<(%N$6vSJ zhjx*awAD77M_cRrOxjCcd*PQngCJ$Qf8eZ^CTeky9)6jbZp&xYeBIALb74gfwxoGl za&bV24t-x59kV z-qUH3S6Z~Tn5sHUA6+hX1KTL8&BgNBTR-IgO7)rlU00TZ`fzp(t({>YjgiK9j3K+c z8UK6f7>&&eizRRtJ3EZ>Dw={cOd94fjNTI4i2uEGn8s0I(Q&2YO2?I|D}yBVm#!x} zi*x%NJcrv`Jy)sXTSutN4&l8c@mx@2_j_Qh^@R6GEFt6fN2Go4Cj919=~g_?be<;n z!E*n;9q}r#kECH13A#}Af*o(8O1mYh0G1E_<~nf|e<|AZuUqPXe4)D2OXMs~VIb;* z0=@k$*?ENg-9-% z8`9}Z;Un$!h^hd8(7SC7fowEY)oSVVh{tgr!7w`OfA9rOu_eh+(5^mz1Fv-ZlsT?J zo7cFJ@#-D};Su*3f4Ywzl{w5xwM zM*tR)Uhni2wUW`KxAq*5zg?mFR=r?`&s*-x_yNxFzO}r{7E5GrJgHtnHeDdww-4-NJ2FPH z1MhumfI;`*P?{3aL3z^HUQ1(Pb|^I(92p1PhVYz9eIM8(b@kv8WHGWXWTm{^?ofC3 z;7Y8-A)eWF+j|V-!wO1LntG*BW#ym7;Eu&A|^(>=Fjg4@HZ}q|K!u`A%qv*Cy=K!1BBbL zwQCxfA|=8vR(xnPx$LhfRof$d@&D&m_VDQ{bR;i??w^L`{NRxaU7TA4izSasT^vW` zFBu85`IxT)JC)qO3jC>_cA5;H_8=4MgFo$Hbz!p`lFyT}*MxgdAA;r{d+a2!OYGxY zD`Mvhi1@TLt*g{a}b$Ork}O|GqV-#eHxU4)mA zg^!v|u#%#486e#zdv2Eqlw&xSDr;@c6&%pw4ds?zsqV489JqZ?5vSo!ecr!LjrUWQ zCnpOfS@5=3B#!uG+V;^RojJ*eU$tdVaEazmc^qVaPkHcHbLBk}KM!h>Z@jwGJ3B_~ zR@x$Wzj)-ju5{l;uWUrHwI=QI_s% zmL31vFK6vlk+b$nkYDaTE5M(4J7|~N*ERQ#NnE>n2>DdhfHtWdR8HpkHb2U5B)`$PSPa_Bn(LswwzUv{ zi!^b+5P-4YQsN?^KKJtq1>hRJRnS~JMCc2{`MUH#-fO5}zgbpl zzgUfZJ7T{|v*@-wr>I)iM&m;Eh-Vsafz9?%0K!7lxTtbPQqjPd$Y}B7UZ({_OOy^S z5#slOrHJ=gSYcVl<+q5{Lgwx1ru)KKZidZq)1s z%(Tz}Vth%UI*Jc@J(4YhC6=2Nvk(7H)Lja3PA=wI+QXE5>EypYaO8(Tey>pv%`KYg zqp+pVa($P5oRV44fouO8pqd4FPaMs#1Ya-3^e?tisW)PmZOE6EO|ui;N#FY99g z_p1~c4&pWq%fp7D9utB0#S!994EBlq*PVRT{0l0o5sIc7Ir*EVWGQ9`slP=keCBFd zJ8={bp$KMu`_RSVXR49)(98b`ajGR`2Tggh)XVbB$YdkDqP(!&x?+?`DP&c$pnieo z7JL-fc;qZ+@hkYK%F}r>KH9f&-2iK8HjMo99M3tl+S&NLKeCq@quon8qGwY+;&v#? zD>}}F{Gizh;_pSY{7uTG;W&*q*8xwYs<0q5MtUp2b&hrnd}l%12eqDs;#FygjPxb; z_Jo6 zEjXbJ6ejd_aW+t6GF2^`JW|FKhkea4W9lNAYh=kbyIq(Hvc9x~aWgnm&LicpT^A^4 zgd*?4FqQAAD{G)|K3 zHM>vF798q5uf2DcKR78A9n(}Joo_X!>hnRkJ?T5Uep8cVXrDv+VC0Db` zM9+;_U8+m9uhBoW3ZBL5j_dg>+Jn!|hqa%0Tz)$Y;E3Y$yT4N-NvBLGGP{t0;Mk7J{k&rBaLLA95oP{Vp-%WFXuT&#(<}ho@s1J$vjPkQ6 zgV(EYXiW{|3R9UtGLYq_YEgTfA?(2UZ#D2Ojq&e6^QW*4#P#`LBIPc{Hg?`Y*%66j z*$-x$gI3aodFOI|)I^(%o*j9`#w&RA%ICIt-#cC_DkUl-lNs3LcLgxDoIUrPqbmX=sihT5FTD08&BtmFn+i>e@0F@Vp}Z;)x7k&AaK+k8Gr!Ba1{EMe zn(_wex}lYkr1KDsKN)kDNs?b=Li+~<0wz31$>0gDm3&xtsJ|U zcxHx*Gg`PL=SK(18N^p04_Rq8`o7LRW#+y+$u&`?;Pr>RRem_~33h};H3rLXq*)Dv z9G~RcFjg#i(xH`djkZWJ$<#S*y#AzE>6n;(v*K)jLJv}A0*Ns-YZ7>%!Ye8EH zmghRo?TdF^?(;lhI(w;}qxw$5`%nu?CJc#AuH?xVBt zHTKkP=&lw6rxrJ|N^CYW8Z15?KZ#vrI@bz!3vj5bW(AO3vd0F2S zlpMh;XZosqbY6tO^KK7FRMS9bw^X0Ktm~WQZsI}yz|)VG1+Aj}GBO2<$H#|a2Dxd+ z_%zGP2gVJ$ikB0QYViq>|7z7N4;TTOS!{0l^W;9-x6vjA6=bnb^i%onQ0lew%l3gp zo}15ihb5wI5$lnP1`W-awD!hp)1l6wYL)JO1%qhDe8$$A>9hKUkiwRaa8na7s3?_&9iE&>MO5D%#K5H{QM1MKB$j8hw zXa_bWtsN_qf`)f^WnX&F@f$x#B(F(=SJrFm8x3P;nr|ZCfJJUxzM?`i5DY#S;@#>V zF2`%=rA31`_Y;BBBPr2EpC?D{xsh2Uwn13Pnli1pkUcc-H}fTryk5h1KhrLuqMX9>2d>_E-1}s|!BNiGk=tZ`AKJ)J6-VfeFuMP5MI7E;|o+rS?0@BiK@dk z=R3S!LRU`HAYAcX6p8dqMJsux*Lp*EdZRT5e!it2$|e5=uA}afCfUfP8vo7BiXr8# z!Ai5=(G4$T)%*d`ty(-2HT(-ggL0|dS?))kgIT;DbEG9X-}KkzbPa; zS5oT!e9!Aom?b&2H0a2i5u{6p2NZ=_CoUouR6v2F2xxl3%ZybqYT zKMtmIUdT~#;%~~#1T!z(X{R*pw0SkiCO1}~eoeZEJ+TjZ-oB^A=O8NFN3ARv3(B63U=DK0g>A@Xh9JqhvM)clXm#5|Xp_{+fan=Glx?6SZ(O#|fCt`FWt;OF# zv4sSBO!qR_GnCZVXwzd+o2Mcv?#tT==5jDke@)SP1k75P+f%?-C(XA>rkLcn<)lAM zw8isy;x#!E20h&`$Ob;|Out8Z=1y_Qxq}YjJG+SI|E{*#n=ojirN}YRGlr;_)!%PK z^&6Wi1@j9Pj$5I*@WVkOzF_1DI$S zk#NL*rmbkuy4YX++fFy$8%C_*q7TIbtmaV7%OOXwthXThcgCpAr$7$p?6=_wRK&?$ z*s=k&tc@FOkzJpg_k`fvtQ)eg*D=~9DmniXNi)N?2|hkFlnGE6FP z)KJ*jOu}+S0DsmPs#iL2Fdkgr-~n`{K<9L_yO158Hu)J?ZRB_z?7=dz7<*VhVXToO z%*1jf#yiV9YGu^sL8B< z{{_cQYCO3z*>$Bv0b3)ao}@I9Y%dW#N3?qN-=UHtx-X>Y4{^i#QwdwbafI16*+)n* zwXmU@y9%Q9O7WsymBSCW{gIeC@1)cMx#ajHdo(nAR$#tw(|I;(H90}ZUXQ3Qqxo?^ zuZ%CEob^((DAKBIyv?_~kYHr+*{>1E$6&X3pLXW=_ zWII__vP^6p7B$-HN`Da5l?9OK^*hL=SRCf4TLXon%>2{2Q`1EJe?%>O=L-3v6B; zFOTSAAJYY)*5d&$fQf31`<)z1GRh@a!EW}%GTqPNZ$UC-xugDvv_MdEL1`6pV^*ec zPIoJLzidl@E}T}Zr(N;Vb|uYz`zL>uNRQ^p&ti~H(Kl7%G+oc3q4(+A)G$wV78cY# zdqS68Ht`xWsQg6aJg)R^mb_0Mk5BWFVJuT#f(ta<%PwbN1^*gxoJxi zH!VB;9m{s!p610|Xpw>LzT>9m(zwHzb|z$DlEu78`?NHN>>D%V<;9*B<%;NgZ9!cb z&&2|)$<-9>_ol?#D(fp%e&x@vRpLmXlnz(g^ga{HEl%Sf(xZpXk-lex%RS+7hlk@VsJ%_BB5@IHRifHN*eZ#w z-XRcRxE)YcBRe6jjKRU$5BpEOP#fm9tWWJ0rwdq2p{-&}2lXy|L;)=o$DP;Y5W^ib zcAUkDHBkjY%*cUNbDyf_R0bDBOU?Nel{?9v+-I2f5m2?K3Qbatn+h&;L@>U}&#-yo@vzNT1Xy^B3OA#HngJE6&Zrg$%% zbkMxImch~p-2PX8wMzosenmdVFP}hLs>0aJbNsc^Ys~QJrjl(^$ZJg7YC|!zAJ(@P z_&#G)YMr2L*TO?_+5jBC+4Qlv-NYI5smwx2p5`mexMh26P-9nd53{g}3(M<#MDkh+ z+$#@t4do(5U3wR#x>RCzkHhq&N<~$f+){VR*+h6N>FEtGNJ1ye4m{t}qmS`QDj%-)Lsd_CK^~i@k7wd((Q* ziiBEL72Z;wra%UvK_0yH38=a=6>{qK=R&jX83#O-Yl%PGhck?6RGnvfv6OqeI(9J? z8DNKaX^&JDzv>YV!_Gd1UsR zzYgYXwR0I~q7pYlMfEiJS2nnM1MFH^x$GWqNqOih7lo0fKea%e8&1f6<7h(LA_sBB zJ~~(}3Yn~*0s9{%Hq~Di1ePlpyD+KdYHbL7iTjxV&17QxAu8&DN*Y*$>;P+?m@mw? z5N~{ zMk6*6mDb3y9X_F0vz{M3tx1fDgeacdp2`)k)lDDsV3yZ^HMGvUd9~{w@X~E^A4rx| zIF`K08rK*Q-`&s{dymFyocF7|{d#ieJPb^63`}C430|inGOh~ES>F{`0SwR1{DwAG z7p^FS6D5cmv}lg=RFQyZ-)Rjev=!>l2VrjO9RaHYvcbCt&w`X?78Yfmzoy>gyG&jP z%Cv6@Ngm%YhY~dhwhsEp>X{GgrC79Q8JHDMk@c*Jls$;99Mdbdj^9k4qb6%MIy&e= z%O1`VQ_bRye-qW*C%9xvr)?qya`VxtgEtw6=(|`>!3{ zTS(MXAB(oIxfr#I`8Jlgvpo{XnJ@JORypR4EESUZ7BU;KsrWVOGjLbpg*+`nFEJuh z;;lS;;3|dkt*+n|Da8PIz1GyP3x}0AoNH(sns55z>=+$vO+)w%Qt~&V`Lya9~umCg&x5qwc<>|P>CH9$b&pB=uDaq_fcIE2@Ty)gp5Bqw^mR9NS@8%zS zNHy1dvnO)bFRH_+g%3ASNN5_^N&yfEJ!8nZM{@vx^;3~yw+cUMpIa0@#Uu&cM?PLR2bNCHDE6~FiQc#ZQlQEukC?6TO4HMFf!4wJ*@^Ufuhq^{K zgsTWrifT18)U;I3p~MEKx(BN4v?e2??;qx`) z7av~XOE(*Rp>#V9@CA+L!D*PRGCC0=S&eh|uz3BrEKB#{NUtac$a`paXN6zVgXq?CN z@4>B9el-OeU$t3>)D5e+An(vR=wHJA1d(|cTw`Qm1SiNMNtga_%5&sY&}Cs`Z~?q7 z2yr5Dp@!-rXd)m11f3WJBqYY2_bSU%-L6+?16<$NT-)1h-m;92rWKWyKAX!rn~N}$ z3#_`|ioNgVY{Qu~xqP>yCr3MG6g~^2FEUY-9iWmf%Sh%y-{4!m0$yZT3fW9mS~+BY z7imr)+Xkp(W+QuV)78u4ImQZUw^*p-<<9XV0QVU-=7TJ;bo*s073P2=Y4y?!PjOa8D~qDrLM z3mB9+tIPvDuDgF*UcGOO5f=+Q%-v6w=@PF&W+CNmi@D$9c#&_#Z`ZwKY8m}aC)ons zn>@5NVzkJ@o%^2R6kfzVekklL@^+7l?omVUY^m~87Q?ay&NzHz> z{mw=_kc{Q7ex&>3=pKAzBWq2;E!haoID`r)wFU)HmAuBgQRL)Kk94eyHgeT+zOYTp zPV#2XS{~VE(e7|AW&iVMf0mtD4PX~MbhY*jBE)Lv{iI%^nq3IZ2H zd^``B$*m$Zp&;|nOmsWoh02;;kRab9EHWcpIO$@Hk9vlO0dUyxT|20RJed@>heozl zZOKqIIX+vZ^&MYiRRPJgTFeUVxi+=Xl(tjcHgsCY%b(ST?;G+?du0Mui+hfOy1h=- z7{L0J*7`cvGovmF(;f(sGrDijhu2L;IZCciwu&F6@#U}Ai<&mI-%PaQW`o;dUlzxX zrd${X?SJO>VrC>&AF^jTt)wJSBAIQ)?`I7*A1occEsEdko;i!|*|en|v!<<<4}XGe zasDAFwpdJ@hO@-ptyh};Ju!-;heDFG?{TG@6P$!%pLw=hyhkt{+y+2;o7;Fvh?6zD zNKS#_C7l%$am)In+8`5PyH-eT=dxhqVB->b;z$qJ%D>W~u@)0~xD+t`!Y5Z@1slYTU&MHFe=pW!fc zGdXi{!{!WHPMzWHX}6=VR&40TT`$|<&)_p3CAXJ<)T7xi)q-hT$vfvoMsv(3NhZ|t ze1B<0&k4vdDtp9>-qE_lYx{yi_Iy_?lZ`FzBU3-gxVkGlh((^;(q=-L7* z{uyxyL9!xaCVbz}4?Ae(W?qr*uSl|df*>v30(LRxxqi7X8FY`7pp<~il~4QIqxT<0 zKccj1o!X61JJ*}VnH%uw*et#Jt*e|7=URVNscP`!+1|ckmRVs89wXz6?$N?qpHM~% zD|!sYjG2UfEF5R*NpA}HX)~Fs@C(WruC~k7^9T>R8tS>oy=2)t;eRvt@jUk2IdIG0 z&k@3J1XQUpx;3qUv5;H{I$7s>{>TbPv_B*#e^kK zh~IOpgNL|YymG((ai_h_cjtvK$8QdE>@~ty+)J+#-k?q1k#i4seAwWRwWaM-hJ=c3 z^(l$AV^%%OPlUPQx6ERivZ0n$yX(wv79koH2{i62<+JX;7v5nk<^~d0O>Wm6L0;n% z4BXw{VAd*32Zgd9p}hcEjX1t_!)Tt7=fR_Bd0?%g)OttS#yP6ew5Dol?18;-XP8`* z7Fz{N*)y-63PXL#DYM!M83H*&Rpi&|%XkonxDbgKK2cvsWp*v#*ayn4@VdW~Ir;bl z+K%%_bZPa>1v+@hF=jsvi*Wkp_m7d@DtBd83K5@*%$)Tk)JsvPq>Ix;@vM$e!3-VHd?!?sC z^SXb%n{Qstd$RVCW+a~?j7r`3?x9Drm=%OGM#%a|lXbgvE%W|m7Z8t=sazq z8V8?Ej4ecO9WSGm`pHf$YiU>{s)?cEyJQ|YkNN;?NTYOF?Eb2}dbPrD1raJo{^ikp z4|?hlF6H!CWO~H8FsjH}R_$|>WMP!4=6gB(s^fNK>-g^McNg;Hx$|pL!x~a=jhrA2 zipY}uLyQVh_yJUl<=k57sQ8Y=6yD5zNBNNI5=q>ztK_@r?kHf7m^CHoQcor&`e#IGjIOza0;dlZZ!?w!4&E%VTmjWYk%Cun;+Hs z`^5{M3ZfgUEtNJ838}GIBsvg~aut4Ufl0q=HE9WFb?>>QS3W!&!N#&yi%;(8?dJpq zhVR^2I$abx@W zU_4qa@w_B`29_zl{dbdp*ohM~HRRVwc_48Y=`Wnmy#4_&AwyMpx@-RXA z&2yCZqu4vW4|nB~ZrCqbRxxRHpERo`m5{V!_5u9ISk{$UZlK2d<)tLd0sCG9TZHW5 z&HB!_j9_8fHHYWR^U0}Fn*MA@uVL!aD zmi4@ynUs_3u?>*W>7)CWme;Z3=^sVa81d5DwY;G}x?sa|*c`)0${33+u2t6X6qowR09go5xf|Hkb(wT*vyH>y;X5%JVu2?nqE6i%ybH>Ab6_J%FN@diBiiUXVwi9azc58f@oPJ%;SF-=P1th+YEXnm=9VRfo-QJE>>FnEl8&H zqhnyo$NV@U4@(ktd{F!bfEdyeA8xccu{n(}79HRF)(e>~G<>){i=Dm5nnJNKAS|}`KG>3%nnS@BB zmoI2bH>lj3=GR-=p6;BQzRQRr3ATAM>&Z0as<6fc*5TqIZJeF91A%Ypl9aO*? zF)NFy_INn}{3Iot-o!!!3OekSq<_^ z*b&_~a-_Gds&J?!(|P3DmLbT+!#G7@ULXyB5RcIiulaFzLTB~S2FtSnCOSls ztD|7|FzQh1kM7b8)irI1P{x;EuNiJR(_cCqqTJd?e(N__Bj4!XHMnEB1sP@@!yN=N zXr@~6#@a`db5@`5_~(qNQqS$^K7$hnS9q;nTu@h$@)oNn+6x1%?9|T{E`Lh`6KE6BF^kcX9b>${6dgmTL zh~eT?!|yr2j6sBMVphAQWCWuw`OaL4&KZzLn$A%VFTmpZ*jIBN;_3ToY64F=419rv zp)HdAyGOH>*JsfP`Nv+q^_Gkzeg!}0Vt_p#C9)j17tySV7dIhJ23o64L}pNp z`SFaIJUnq+%r1*nJs_3Y-zI|C&S5gCVUdQ zV1&)5!^Dt?m&tGa0x^s>O?pq4KkKn-IN81#2ODrEZDLr(w%|H6&>Jy|}S!HPhKL^=ITR z!hq}O07FNBGbl$s8Cts%ZE?NzMC)?aeEyKn##QSbN4v{$LE3F8k~qZ=qvS`EPOOF% z+QUg_NEHQwt8IiqQRxrMC0AV_`w;`XJeFl*!Ald3+QM&ja{_5gGtEAUEBM;}9$h0k zB@<&}khv+lCqvHy^=M{+760x)odYAc>v=WRXD+=p&nQa)s&F~GUWx$jJI(%Wbts|x z^gcXLbLYK$=<#)58?Z^p?v%RZc`eYc_3|$IBjCw}1i6clu~{m(A;8;o1CI(u`Mbfj zTm7IVPPg0=nabs5(BHLcEtXJ>FRBZfzysel5|4`OKyJ!AY@0t}5RZzCQq;axtoct2 zA0uVBg4Z3K*=?JRz(X!N6Z=!j8A}Wp3wWA?7v?nRxBTZV$yycFp*nQexVxkY~cXz7`1Zn3*4mLg^`0vS}D@HruD1W_bnSF`H$Fyu@ke+5^E`Ej)%& z*NSZ8&z_ur8+BWF0e`!U-}-n6+V22ISlj@B!85Y4!j zub@3@=~rs9{yB^42g_|(995-D!IH^cs_B!uAUvhG9Ykm0le>=_kn7VPhBI!D+H?!V zuf46^hI|s+%ZF60FaDYdY?8%~b=Fd0YvLdvGwV-g?fz2N%1?a_ctN0l(I^tNZ_J}^ zv(6eeo?-@Z#epx-*Q2&c2P~5H-Z*MiZ%Yu>htFg4bet{^V}9p@xH~OHY)X3k8NzAs zFLCVV@frPL$@hJF!d=>+&Wq86v-m7N3TCGHx{}ydS&_CHe$ZhmUfrq3@H*qp*78;| z0%m2V+UQUFE;1fL!PZ+d56N1O@_wS)I$_GR5d?}re3d{!nxBDted z^~v&4fLdatC+U@-(MLAErp7Ox)CloT-!rb!$~oz%UxpIiwog9WvZtPjgX&!`c&Hj<#6<7Ko`ifvrc@OPpz~E8xJ9Kcuz5&g}hT>*3(PiWxn=zA!qQAG4?C;%q zV|U)Z=v}gl*K$ss7z5jgyoDS~1ZJcrcX^MZKlO5ty#0i<3^Co3r`O^;T-;PuwWzNS>3g zS-o;)wLh30z%BDS@t*@N{Nno&RQDp<+aNih#fpHnK%m=wn8n10QdV1g`>xT-li($H z_!jruH{HR#wloCD#*>0sA||EKmGbx{7?wOX&!3n%-Zp!vnTflO@r`HB?m7q^uPxQJ z#YUEC*;V8uWufhf2yWP@vy`}K42k(sRE9L$0y0@WyMD_e42p!rl!qb3ht<=dF_2Z? zZc46|mAV}nFky!&5&`=zau2e_wZP^ItgQH>?3EeLy;)&e!wAzY;E8Fg?!4>1^mO15 z!Rc-bX=3GaMXUxpP(Z=$WX_`KO}rL>OEQa-?7m+*V916|{61h3hniD>n+r45Wo`;| zlfNsuTw?iGIG5vkLMh>|n2xx=WUUKblx8)I8hmT zC6R;ud!a4OYIj|nCQy9mC8iNa4qH|C<=78wH_@Tf& z&8&lTG4!#NLCYOmRWOQ};wZTIXAO>D5K7*kFCP%!^(8WE!~7N$g4psTC!#C=YmoNI zo`yZKpM4Oe{ek#aX*w}3Fx4u;-6~63>rlZ5aiu81qg+|h!Asx{q~=Q-*rwBETmKrU;C34Z4@PR;y%Ty;g*(0Sj8oe246q}at6T6 z9ldYwIq^paV3~&DEPX&Nh(H%NOGw2rHG?Qao25c?=yAzDJ4U`v%ul*`|KaCEW>Z=- zfYx1HO?}a2bPHajzyVa$8V8NiWzoJ#U?XM)l>Yss7Z@{UV-q2^f!Rb1){x;|_z>h0 z-FXyBJYc!eL|wF&Y>{5f-ZwnCIiVP1GF=C?!hBsB-G!-=VvE%=)o-U^T?B<4vVfmI&(pD zG}GSsm2&|@uXBtZZkaxrWo2E(GL@o~%9I%~!H2=+OF=>`MJmCoL>P#<(WvkAV)I7s zRF`Xt*w;Bwwyw?!LPcfQ`mws)Mhk^3%cN;5Vszgb#iwlSFRsYCrr zU)D~HGNfIe!y4+Z--whQi>)YKEo>6mR!QHSnP@7#a~8ln%71dBeefgb7GT~3-95?F8x=OOT>!iGa29hM;NG6v_vr}A$?%BBh| z7moT0?kPr*7z{&r)u*D*pL@7tSeG|D#r@hyw>rJ9*DtH`Zbsvqho3xk8C`a=IBV z$2ZdhD=vRLCAL3@xHG6m$9O`GnN;2fB%h0%A=|)GA7(b#@KFY@X_)0Cy$hB(U2Pvr z0#Wf!3pjT)JH35{IkRL7x@$}-_tQY#+9L_(j_npP-#;2)^IJZQKCfMit|Gh|QHkv$ zJUK9~>kx9jln!j@pm|W@NjaSv`6Um_Xc@SO?-P0Bc+i){SVhT29LH8si9G^&YvBaj zPdL~f67Z(WGDG_jzh?J`zAx(~^mk84ic&vTt4A@*iDM66zgRNgVkIB(y1?IR8Vo5@ zm~8qfK;E)^Z4)?N0^hL@;vLp;huHdx%rzf&4A;MW7^`z6kG9MdaEgXS3fzIM8B@%J zP2=3TW)agV%3uY-Q+!bntjvL))(kd78O!9ZV>YJ@{Y~#L7%F{Pa7jn2!_u1_L-P^}pYh`$JxS3iV(!4NA zw+Q+W>`haNGrO9;cKHIQ7sYI#LFZAvyHZjXEQpEj`SP|cV#K%P#u7^}4ZtOpo>)*+ zXkcZ01%v-r&gQ)$O?d>NzC(+*iW|}>Kxc46K$me5Sfay(n)955Q?mS)3db{dc z$R_&P`^FJ3UmReuWI>5}8xaRAQmm=$-`@DFnXjZR4rE=9^Gho}=|x}yPrg>n8UCt> zeX~kn1xfTFPllBzUirpJIWi&1BIPQ4_54LU%p06LS@;-V+Is7@;903Q#)>C@#z=CWt)@-sD)#Qt4!>V#W&RZ!B(sK(=0m+zA&o$r1RdNk1C8BDt>18ygIb?0$yMc;R4Tk^#Cco%ZjTDOWK|4hc9CU($An?zy)K@N+$ zSLtXn?zO)CYW49v;DHgp3AeF$ajc5tE}eKsYFxcJt%YPnxy(d;F*8WH(_LPR(Hir`g`m(l7+eM#Po3_( zC|lyAe0bNoZK>Zyo30Q#JL(H;J|?}$0=+6ahqg_#YVY7IB#(+x69p%?<6QK4KZp53 zW!^sCaoptYtBjCGi1 zN*D$Cv6b-Bwp1TuBDd2)3}R1U^Rip%>9E)ihJ%kO^m>$pCa$#_+x=HSvN83Gda>KR zR~px&n0+)8kM>23WVulzGYCs1g6$b=zqlivBvU9TLcITSNF8|HeXmI>M>dEj*#s_B zw;OGOlWzH5JSl_#T!|laanP0M`?e|xa%Hw0T>{8=k=*2>R_TLLtM@~z)&=}ORsA>|`2Gb1^!=d$txvCk~k<4#H(aclN zpDPGfENbiILUAQm2ew~(ooQ$4acx%Tee-ujv_b~U~F%yqo{$Folnv-kh` z^SgP0rw?O*nd@t5$;yj!D%w{?6?80iwO-Q?6$=O)`~!c-4%x(8_LJNwZ{Ca_0Te+5 zu}PEm#EEn6{866)qtA>vATbe{or^0lG7_e(qaz?Q6T7XmGcYt1!p*}YAT{+zq1-bt zHWvQn?JXcT7vFe10qo=RlaPP_2p9x}kb(lT!DJe`zrR0@R*Q8khllH6EFQ$+XbP&` z;V@vM-BBoq+x>^q0D5;c4fA?;82IseFXRslmZ#qzAYUd=NTJ=vfI_JV8i7U&Jsg1= zxHlXr6ploi_wyS03S~+Poet(CN+s}#6k3?WiR8e$!%3lFXw*Ez;RyM1Mba|uc1GoL zMX(ChYUt$(mB6#*N}*^hmOPW`4Eah`+A^I^)}?YKh_jVynEd>F`C46`GQD12X0tgU zELJPXAIpG|Xl$WGGMPN{#ge%y4JNa#E{-O%dEkM8fxN$yDRUJn)MlF1@tir5gRo zW+&Uj=_172(^P8)#>*GtGC$^(r7k8`h2~bs&~2lq0wjnO`+3)o=l+)Je*7& zr0@LzrdF-;OQu#EsO|lNu2iiKSguqX{Amt&@Ans1l}01@N{tT8`AT)*u*6aH3PnUH@qi`?p*S!YEGud^P zt91XmJ=reS8X=ypHer4)2Y$Xk5B^}bv(q1FcQQxF?)Ace!{GoLgU16s8iO0SKN>q2 zj!eFDFrH|4wnWM9{l=Wd;RrsH!vpj4z`*T|}jb3je`1)=ly4X^tAr zXs^&JiI6nAS{Dd@}I2^RFh0A579fCm53$q=>UOTRYowFKlzy}gFw`g9h zvUdm)A9%{F0%~yvf9k1Nm80CvTIZf4)9P%w=*j ziR0IzkTd+gmw(b*Y0@ZobOX_s5iILG)l*v0-Hk%OlXy<+ri#w}4*5xjYJVd~c791z z&o(kjTYvuK8N7cYW^*ZAB{q8hZ!YIjvr#5&C7oBN{9-e}#z z1guqPp|o4gwl$A46Tqa)hJFi#k_lE?&`5~xV>2A%k5_x0hkinWHmM2uQdwifjxuF@ zPLKtTjsO#=J_m(XE`Q^LNXk0N9;dUqdn|ARsZDBP=y)6RMe_%KVg1+L@F^+U0Q5fY z$gTX>!zXR>XRVOGbpA=iD(i^nKP*W6Mmdn^p@fH6jU`T0tTP$m#bI@S+{AfqaJCDG zk54N|qEqnp9?}@6dEo%GT8sac{!RCf8QO`by|ro`o}^Y zXv-Nny9lO&m;AEZX`XZ&K!SRNOw1<%MK7OsJcPJLVKISIf$xF~bjMKd0N5%ui!J4 z*glEyu|q?F@@3e=#`9)R0o0<(KQm#(mbB9^EVr^V1MO|sU1@LwM5kZqT`qxOUZT1o z0Xv0D7x9$Z-8bc);IX4kd%CC)O0+ZR2&?Ah&#ol}5c(m|=+RUKUz_}wI!sjB9L|%5 zM%uenx8%HBAF>}26uV9_cD%v-yq;x8Q@dx;tG0QBxtZ1fKrB|n_dRy-+e^Nrmu&?1 zAx00R&@4xikj2#RcC<+eERpaHr21Yt3mCm19dkU2kewcs&ZaiF`Gxl+^k?n7u1%i9 z&WU$yGf)9!0&5{6^Akgec$N(>0{LPlK}smn?YE~q)|xtK;ZjDTHqIhF+1Oh}r%m)Z zlxKyHZ(H-?Rcwy`{wZ}?@~s$BDE>(EQoy+)rq94od8kUvQH=#SRMT_+S&OnlBGSMn zwRbY8IIe@cG_f^{97y7J8AXvP|Is~3h_1_ap0_f zzeZk9tM>}ECSx6cT33*tQ_mR!STL2iPgm6KcTDXet_t>x`(KyW=ru9h&SphBCH!N0 ziWfEIDSaNY{oA!&Mxas`^W1_&je#?8a-~BP3v}T?edt~#wyrFmvd1`!Uy6-NxITn$ zZ>=lDHGIt=wft3?wUDQA_5=d~;u*BBip{nRH6vi^Wr(yvC_(Aynf3J*U;~>G+Z*lJ z50>?kqpG}owZ^Hq$#Ujm%V4CckFI0><yC3-#`BN`=j8##Fu*%Q_F^3V|lxdC-;>E=Aowh4{Yucc9NrqX+E-7>L*D8K@Mv z;cR-#O29UMW3u;(NypWz{EQ-7P0!vB+e*aJoGA@F@aF!yIIrnP0zJikIyPQ*m!ebP zd<#}vi)37Cd4|lcxoHvc{PP!g?pquV$e;m(?ly)fpdO2-pS+v!S=7RaF2>RlJ51&M zb|F7=ylD$>uvCwxp{0a{B?vlPn~o27(+)n>8Lp@t9j38TB_B~bn8pou^+=^TVqaV<=osn^|j$w zQ%39DCixmKj^)ed2IGvuZCc+`tlC3d)L%%8Qw-&O+RJ_&J`t%@%xaqfsx&EDQbSm! zY1;WSHmHU!%u+Kf(cLr!b35fkCh%Ijh%+38g}8$P&5(Myes_oqYaq!lq<< ziN{b%^e;KrbN+V0b*I}F59?>H5<#ge^);SZ(>okjfn23|31H|ogL^h)IarC9aN)jw zo{Y_0pvT;|WpLWWxGGVz8YD4x7X}b*AFWtecG|QC9HWnTrpkK@#xQhQqku9HmGfSp z0TsME4ZHjqLby;Xd@)n#RYyBU`?byGSC-pz_$-*ATAmDpqWEdURj6g}o4vB5d^nL+ zAUD{fdS;YdS&Ah3oVQxmt>aR&w|x|Ck3&c7j#?UKsp!~)liBy$G&6iTUMK%1+&@<@ z{bN0+dp;qn`dLsxMQl%n>P5l{T~!GT>g??LI{oQHZE_P3z~wqlyt-i(WlU&)0Lzd7au$c zs}}Ystz(O7nJf58FrBKsM6d1W!ypct|!| zN(q(aK!(V_ujya@>H;Qx_Pd&ml<5`m!muHE)()9sM5cMK=-^@zD zS@LdQKFtdPtVlF&0dR)$In8^e*XFiehoHUF^0(Vi#@PPlpi_iP@O|6hXQO4eVym8X z?O^m!(TS{nj*O2g*))6sN8|`(ojAvh`;9-2m;a4eF@Jsa5#BdEja<|}*EMcYqvttD z2=gVYh#*;Kg>|a7MU@FXj+0HGAQO7XmH?&}aF0uG4r$JS<`H4&Ej%h|)^9E9bA$4> z28h>LF};R-Ej|^XZDNRHf1h%N)=+P$>tr769K_o~E)lE)@_j7n6e=2T*TOQ;v6?

Eq#L!R0g1@^vq*Yu#Z_CrtsaMo*$~hT*I@>VC|5(vGA;J5G-%5MYQ?dcg4%oh)92 zWu++S-gjD!=!_c$5JyMC#~#n-IB5bES!V^LXse|`wZBBzm1q@blMLdUsqcE)Y{wlt1#B?pHTomhs@=DGg{9N9JA8Bm06ca1qh0Vh|cCXb-VwGiXV!GI_# zQ09bIkpx2aw1I?s$-Iq#C&#;OR(_{1D)Xbq@C>oezhxL_BVym)J0vtLqv2?OM)4iS z#@i{24B1V^+Gj&6*O*LoD9i1h5%uu6ky2uqQgQJY23$aV-C3BWnQYPr%P)yQdP}H} z)|Tc4!BX+=J6FEIv@%TxA#FP7OAkSiO|phgI@kaUmwWruFUJt*9uf_WzUjTZlR| z$H@*Mxkj2_n2rz%MCqtvg{y7 zTtK70CDYn|mfd$#Mp|kr@z>MrHhqde@`8`7w0K~&)bGK68A0n<9J>}|>08;V;zP1i zaqQhm(-r!0g)>GkZdtGQZdWmisL(#$k`2m$Fp|AbpZbrqzn_WXIBKHgNnF?iJ?OI` zao2#*!nFoJFu0x2A(0h;Shqrjusy)?mLBa zXwQx{ynr^BpVBOqspYmD9LIf;(&{YPOsfZ%hmUYB?t_Mq{s<=e5}+q>PQh=AMAK58Arn-@Ot$|c2!OHC`@ zt$mVb0UYGxJsmo^JqqhHj9_=9kL~rBvG0ZmO<6&v5%Cv#;H|%nJYL^J2aa_%Y$bjw zV=VRjq+RZkt0pQv>T*y`{tftOj$(tjZeu!s(PZFb)yQpQ-o&{Q*n`7rN@QL8o2XK} zs-;zQod<7}U+uAR5gmD<2IREb7X`_`Fh}$V#VWX}Mv!wF{gmvMWn_9(k+0>`)M~|hd?K21SCfwXsL*6k*#l9V+k_Ok zv4^!J*>*(jkgwND5oli=*}dfz*hf*G$aY-m ziErdR&NzbNn$!nwNtS2k8)2Y+x~sF!--oz-D$>^L@ImM#kIH; zl-1X5?(aG#f$AWybY`gpSJKW`$=Z4DSKOjF6%0@b>3Q6{SdIDJw-QeM)I!hSJ+1zL zxT%ab!7|#?pi)d8UwjU&i%%L=N|x};G-!-6lxCwfeAT-Qc_sD@QdNk>AYI}>@V-Yo zdQ3ZLWTN#sgcZ&-WoA9yaHXWIr=#?{8lQ})~K=Nw&e0T_QSL7j7A)Ue5?QO1rVN&KVR6%Hj7%;SuDL*g(Xd zi$!{oJP&30D!H1sdl_8#^W;I#Jo-T}h}RO%e7NuBDS1IP zK8i<*@>}UaZ9151(;+AU(_YdAW+?PLre4q|!E7n2NOs;M=CNU>CeTWiWu-FXZ!fV& zeC*Ff+~+kM_bDjJSE;BnPG>4*i1#_Jd9yr9XYCj(NqMcipG9-7i@S@~;?E*$M;1Q_j|q0yF8u_o=VTLwCYq@rDt$`%vD3I%?kz=K+sH{d#R;+^&X&`%t zNLQi03OHVj<=~_=s${_h@sKfh$=X}mEs5`jlQoYKZ-`{^Qlp0J`_r+x8piU9DST*z zw}kEs6jSiFP*xhF)nmO|#Chix%IdH@BB2t7!W_=)9i9d5R-_n z3F%|O`E-@#*U(DvO-)Ry7W^p-@xm5lvhz*(!Sag z0!umOC(xB&Pvgo)*wgdvX?QGHiB-RLbKmqzvRLR9KOgQMy6{ou%J)hvp!g4(SyllR za`CBK?l@}gPuv00N8V8)n{GQ$As26gCW70(UE6TH37QuCx)XQ89MV_5KNrRKCq*;3 zM)w`59%JzX4zc(FYjY1l7X{%~Z0Aq0O`L|eKRW}2YoKrngeD)@hg$m-mIeE|5(}YL zzk@v-U0Oas8X5nfWb#h3_?5XYaIJ!78*=<`k)YOPSf_ZKNW_Pr`D`AUH}Tq7iN%aP z%_F}ITj9JES0H;b>Vs+e_6W%{5aP^82Bq-vnepr(ynpX}p8g8gNg_@EAgHlS$DSsg zd`95lih(zBNoo7z2(25+OI8F{znr=K9uj+_M~P#a&Gs9?6m|RJVemv)Ci*$>+MYVkeAJ+FmunQW+%{6&8zkZJh-R7`M1WiIRnNh}t%ysoZ{LMf630TQtI6 z!(y@rwRLl18;$As!U)?2oC#(uLlmFbdId*M-bZ)%Uh>F)P6kL0f{z8sKgi)?;F~Sj z0PTyW>%F3pVJa#*8k(-0x#;UFZukrEJU#{-h3^)3E?TYgUd|b- z2Q00&L1@b&U{<=VqZD(1?Ur>RE*T2%JB9N|a5EN@7aZmO`;Uz!**Enl&31l*y*Aqc z;YasRTvombVl*MY3tKHM$=d5ovUbj4eoZ9VWArf1mM*||wp%iugH9$X*$s|y4jn{! zLETOdXvXJuPj~>-5_xqVq}fuUv5xJQ+!72>d)DHd&}Q+x5>Qpmx0o8>D=r3cvNNn{ zD#_lJ`(L#}alK_+6DbxieW_!#b8FVsS~r{L)SCU?RPkn{+3VV~K`=5NX4s)yk7<+3|Tj9U1Ez*XZ!Y(_lV6VEVYqQw4zvA62VGjG}E!olMu&{J%oa^Mz zPFZU#YOx@v=$DNKl z9e4is@60B#!MY;s7RvB7v_)9SNp?R+F`8Z=e#>6rv$KS6K`0Aa$lUWG@F(8SOk_!l zJ{7@ZQHK1BS}141Y-qqEqpN`5rgHzj9&sPICsP!e&?vImTkiY$w>2eZfoled1+#J$ z{$(v46ux*#EL!)ReWV-;GhsD9BhgG3XBWTxCAO7)8=Y3&oLA(1I^H-B_rL}gF}@915<5 zH}V_`gr=oz&DN9LmD6<~mI8M!vHi zSl16MIgdoTQX}4WjJ7pdtc)$8>BSo>@)mmw1?*_s59tecMRgsb((Fy@HL`9S%djWB zeS^Ei&R}hklqsRSKHv|%#LBQ>ve`um@Sdy-F>R+%Y;~OeIZJT23j_BczfT(h^`)=5 zWs2C0r>qE7h2Q+%@p!0VAje+bK@MsqjR{-6!VREfZ~JY)>mZy@yM5|ajMb|fgF-KPQ za`)N5V-W89f5Wf#psNAd;y%Jg6*_ReTRdlLeYZHNQH@r@Ah6<-M+UAI+Wt!ts~JFr zZlqg2_Jj2Im}b;kXh~-ig-b4@ zxc5CHOkQ*{u?Q655zHQJdIRzz96Xmqbw;f@zeTf#Z6%u5A5P{RGb8@JhvfH3s<`!?u7{!ytv-#<5!v3D4f~)b&w=m8_4#KG9%n87qI+zEto>5cMEyM*)?P7{9J4>RKu}fg7vJ2-*3g< zB8uAv@@xoVQV(%4ef}1@@yL`f9kpwxDu}-$ziI8P1?DE}WbD2#N*p*hOeS{|n7fcG88iJM8LRx7mV3T3!ES;WRQD0za7`+&GiKcfO3!Q;h4e57KP> z{T$X@lZ6ol4K$w=3;GJastt$Vxt(|q_92goZKpXfMMc3|&{Wp-q}_%n2rjWc%LbUG zP%w#*|DG&eqnrlulwm<^XOcep8p#i=9STm_j`ID=4y3w?zLPwmCGLM=tY$rm$;m;e z-a-Ebm`;H8u1?aHhQuW1yK$#K4-Bw zo&Q8L0G zAhGGpousb=l#?nyh#`9Tl|~D;8BOc_tCrB4C`e)zz}z=P!$|m^WH=fP`)FM|>yhWR zk@wXRFjFx|A|J}Hd`&zKZBgb>KHHEyM^ONqC>r0-V$D?$o^2qn>$=v_}aIYpLSX5chdc?E4q3CDzQ? zkiFoPT!2~jQnCTw6D8s^&q|4icn>?PzCYgQ zlvTm{Xti4itt^!EL5Wir0YVK}0-6ZM&(wy%Ii3yUa>@J^vIl2x*m6lcSZM+=t^~C7 zrIQm?5c757MWS;h zJ!lrp;OD(}Llz#RvDLp#6~Fzm{3=IT&4i(RWZegC6n)+WMO6qvc<5Y@!fSPvVeav) zD+p_E=xV`Au_`V{~2dQ4@JAi6}<`@WiQf1oEJrD>=e+Q zKrO$k1~d%sFF+jefXB3J(Mbofu)ZiiPnZREbEJ!)y#*;nKizkl09K@I3)b;|k%E-Y zGG8~qI$9TFo=5TwBWhjU9{DOzVlHfYF|6sD==+KgEX5wxyaVxW7<*5WWK}s2o>Q&E zQWf~C=ws;y*7aE4)n-|+_Q(Blp7tN9o{aM--gCi>lcI5#fb0EnicW8jOdUwN_(+N# z?FMalHi~PYd}hOROmCS)AL8gm98llU?96&C{Du zo=dH-ht~a-B5s}ysWUu6&Il>wut*{Ua0cBqENcnBA?oLdXOS9pL{1pYQ5!NwO{1CQ zdCxQ@d?!W14^ys%BvzG$6_+#FoYeDucRr2PD9YzY5z5zj7MxkIKqWPSc8*7FnZuv) zx$$PK-LTekTG&3;POKdiY2Hh+E#>s9F^Gj?f%Yo>fE|!FlsS86vyHSrLf#@zIfq*CRqjUqe9zoba?$@Yw`1KVwmXN}%UwU8SfSQP3b zPe`X=L2O6*XPO%!PvjPSe~`}yo#PzIygp)3^byo=aVaC3wR{`Fv2<7b;EZ z-{@1sE7GT|yt)PfAfG+!&n*b<@J>3As7ckTxAGkEYA5OuR$j4sSbri>YPM)oX1!@5 zj8O5(@*Ax}FMMG3NW`V$&MmAX8OQK&jeK$wb(6t1&RaK>SSCKv1NSytR3jB4JT3sL*Wn3ooG=PFYx-l zlVhr}odD%-qW2b#B{RKU<(w{*i;8k4sciUJBvy*$QBkh?jr7-{kRw9QwPWT1$|VL` z$H@9Ufw%k)T$9t!L`Ab9KWa!ul@4g1c1SV=X@^$YzlQ-FNh#&@-4WFLv`YN}%H2f! zYt)$pX(6{PtLX2G2=92O@DE_!1H^L7nHe6Kr(#vhpd# zlkFsS3Ts^AnTk`ZkVEoFap4qogT)ze>MRr>zbn^n4U#=t?{(yVbks(G@(fBW1~y&IAzUNA!&Xjsr}C0`(i!rGq{o!XBfUxF zyx9#OIdABy;!TR@==}1!PgrLXtR1DkY{_`6b5Zf{Sv`^YaqIFVMjT zzbKl%K5Ug&{?#A(mGo_Ub#USv>EQA_b5rgppe;pS7VTlsG&6DDcY;NHoGWcZBJPX3@ zriHnE!@K@ek_QX2o+{2#1pHQCm8Xe3b5}g?SIPrwuF};l)n_wT4XURphtdnNS)z0> zn&V&1G%eV`?zS`%!@ZJ0 z%TKk05%QU~$$Z?~WAC6{g6tg@u6kU`)<`G3-yIO@3f+_Xa;HP5sE4kNv zUBSg*wwRE$t1hnDo^-Y@OvO{mA-2v>S3f79Z+QB}VO|7`{EGf@xBd^dYjeCV8K0FLJM(-p3hXYuXS2BH1` zfLt^a|5@e?bwM+fjZB~C{N(4>o}mr8ZBb5^mY3g$VAD!NW05__4(vH4cm*w1Ln18Poq{jyz?h^v1 z*U~!{*tCd$&u6&nbQLn zmX*1Q_zOL80oQG^2QxuKIZkd=CvM6TFOM%PqvGaF7)4`f9vhWDFUiJ6R! zX1^UtajY(KuvIOIB)2sr?FX}R<~UHKT)V9_7!qKBO*=Z->V#CbJ2%C4M{;KaQI5Q# z&;BZ|t%eVF+k|&3T%*<43p!Dj6szaAwnr2_AFb&@_giM2^Vj1}d;xyHr8jePQ(l3g zWs43?r1yiwqt3o^i-l_{4IMRh+xCfBPR_Y;cb3C}h3M zsa)N-6|VuEfqyKYfhUh4eMh+=Cr^#(0&j?G+koE3Vzxww+pt9MQg}xGFSRw8vc436 zraXh#1?Sj4TjG=Qy6gg0jnJAZ9Ey(|tq|LYGU^KTKYg^mF>8G?N9X}PB zi#!nV#N+3%5&mt2(APHepHte*J;`Q1EAJbL?BzGOz1&4g8J%S2b~o9&{YyGpFQo{~Yoa8Rl!nAzk_vOz~gmD==c$QUSIyU{^MmpJNRTmVi zI?0>X=qeSjo?5Kq-mo)B*6b3<3ZahBAek$oL>H60GS^b?J+`=(usa}F^Ao$9gQ6CL zaGXuRQF@T=r96Efm_A?9MBL)&R=u2J~29A#9(^foZdlS=mSr5>wEl-d)= zmKlq_JdO*Ho^ypgqPr+!uB(+V7OQ$zltKm7>7hX=H<|gvzOZSUYS?;%2iz)0b4dJ( zJMs?cB3WWr-?Oa9nL$1r3+IgSChmo=hx)dB2$k*QOIub#_g}Es6Z(28?*Na<|CTg; ziqq>NS@Z~teca>;bA=RVoVG)Eg+uw2*+R7*4v649p{uCugiewrF4@EyAWurNcrW_< zTcnAvJtlVm%?Hr-$yIfe3G5s*{a6m7`9H9`SB5`Ir?9(=D*OH!e#VOULbfG}3hb=# zr6;#<=U;o0@`*Gfs#Bl8ignAa@Fq;z*^E{m{3rq|?$wZmvTVqU{N?yA!QV8hO z^?~#Vd*~m>+;#tfeZ1jU_HnJsJ}y%(zxA{Ym?`fi+nDS1KlyiG>RszeFKT%xwxFSL z|Dh14y`{2Wsc0XVHHcLsis$0GMKvskO3C(|`=m^)b0A61+WkLboz|D1_f9?#Q(Ienn8+5dg-#7G$c(-2zzf-=}SSQGn2r2Pzfd?Fa#&%zs0=h>X#b~Bv zge0FwLrS!FyB9A%j{90EN~c+hby`iyaZMKb6hZLPv^dMl&5FCHah6ZPZk{Dp zwQ!X4sT%y03f*JWd$s9U5$khIdR45Tc~2Ue;tZM@*A9B4?YTd9y|uA-5UT0Wn4>aP zC=A*ewCn$#3RMK^n7Jjjg$^|^!`gXL&2M9S-0p8dVLe}F#?Vt@uTcMcHQgqH!{Eoq z%XwA?#J==q#~msJ!4ebL^ojIt$eL}-cP=@SBB0GJT26?qv$TloDDKCaq9EpB+Aq^= zwQNNBC`V9%)>HOz3s~3O@qG99hZ8B=_hci#qc^-xb@bFEiertEdq4e?x_ zIIi0T>9>q~fKxG;b93*KV$hFAo4$6P%UgDa8!21P#d=Pn@mzZ_#qy>)l}s&8=Iw08A|y8OM)+r(RMK-*qjdn;Dr z>)Lx$DS(p z-rG|hynkFUHZPQk;wPd%ctL2&+Lz*f{B`Yp=oCpwTXnN}bhN(Dq`hRd7kt03ZS;?v zX|azQ({rH?>+;JAb|`gCz97zLZ{MPRE6gY9J)IhPrbTOwsj{>5(dA+{u#U3YTr8ix z`9uD%WS{xpb!RE44`;{F-Wdkc7-@{h7}Cp|@xPaj(b&weSOQnEv%@H^qA5tjq+uSz z=q<60_}@#1X&f0A9d|nJblj=BGe}~8>3XuWxVF#1Yq-7HbCoQ1v}>Xa zVEN#0E)!Srm!eJox~2}u7s@-mM2^xF2BJJzKEt|pOY9okEJc45O?52Vc+>TapX~?P~Kk@JhE$nd2JNd5s$x&+ai09&wBD=Ns+0FRbQ;&s_U# zkNc!SV*acG`PElIz?{{?ysLeJ0vTf1N%og)pfO?FtdxjYPMm_1HCj`Ue^iWXW`dSerm=O$si`AQP z1m~4^Q|VD2r>KK|;!x0x24S$@k6<5yk)YcEm(xPff%h!Zwa7T0-O_!HLpJ~pU)8Lk z_M@N`k6sCZMtvu&y36B}KZo$Q5A0(*GDflkpM7e8LHFQLnj@lv($iR9OJiYnC^Z_K z83){k@R&+{AJ`*x_23?4F|saXrMTSgP)cPskE$MgP!VP(*A;*e<;=*5dC( zOpJKV`|k+wH!g_(kfk&Ogxj&UYZ{m$CBiROe5f9IFHC)G7@IH8VY3^O&6A?ngnLgPg61B3>?E;E?BiQ2V&@Bp__Q>wtJH8gW$d>grjbP!%fqGM zo*6H$f4Xau$sf*;4f4I4oLlR@cQ8e|2rnTEpEa9cC3)vEK)Ow~+%6F)#&9fU*4mmY zIH1KFiY>iT-D7(>aQmJ-PQ#u0ynme<@24zJP8LeC;BBvrIO3CO+egdj%t6CbB$eTzrp(yK1R=*2kFH>yA(#iBb z>19HfNNFf^B|G=6;{I36?dKhJ30ZVTSy#F3928eQVpOckGLB!*b|tBs$KHE<2L z8ojSl@n_1f6+N%Kw@-un)cda)S&DIt>?GT0f-ytfe^RuTNutvUe~R?p#WoZ%(gD|a z>ai_&2hHe}xZY8{o1vkc8?3bZy_Z%Bw636sfjowbXvpt-vG`niGX`zZ0-n5I-5M%)(Rk;zO=kMs-_>^$hOHVn{xW9%ppN?=H8*y5Db|^TT12NM3PK zL+_c7&KNs+o|0DerdXAsEH}z3ZH$48qI6fY?D*GyIcl$p9JN=1>~i;60p8>7pj~cX z*W5oQap~$IHy6l*FdUvk z#v^zS1~L_%%_9JerQ*Bc%&bX3{T`5*G>e zxt&)i0N3cPg67;ILSGop_oWB&SwjW;&9YMa#cJ%^5&KnIMYrWSMcJ}88W*xhJkodz zY_^925Ei1uMVTv-iUz(!MvEW!IxQetqI7VH5Wf#BMZC|#3d>_$ev4R5K0k4!0DD8< z&xGEbj$ZIX3OWYC7`{jN3!jJ&&L=n>-~6`U@3n=Fb`l$eS9c#D<{<(*+*)Eaj6Q5P zr{fI_w2zLp5WziaXT`4a8HB%R)R%{!`RHGx;q41y&dDI3x8tXM1s}L2$Gs?|AIX-%63fks*@u58 z$}WXCCl~W5?O{s1bn;&xIPyavzt^aT<`%8=QCQPwIls$3PRT6jz@`5UP|bq8C(dSF zK6>x17ijX)Nmh#1rif`4uYCo=>n|qCSZdj+?(@7^AU@K-FN5$J9;SJq31>-KyC^sX zmwDE#4&pBEso4a%c~sTJz|V*9h%iC}KfNzL3SRhiA;fF(U2!#gmUkKMPtq zx6uvqN73k+45N9*tjp|s(vs{z`WpV^`LaG1aKB2P;UKQlusm!S$}ti6TpS_(#9*Ju zf8EJ<&A*_c8lh;ak(0k!N*=}RAhowhh0mNVYbVa)A>_fVZy&li{7gBr9(wsdAx^b~ z?4T)6ntE9t8JTQ^R}>ePTUU%CDTS;`6x1)!+=7q%8jqaiD1HSWWqCSp#z*Hit{Y%2 zt%i|*p5rlxRy`a0`y+dqG1|R!B6>E(BW{PHJfq`W$Pb#GApTxN%ipA28jjO^a~<$R zstOB2W2CnNT<2)Vz;_n3eNgIIC|;F@$VgveYk!!LQig@4;CgSIqMK(d6Yr&y#bb+e zsbmyC4}1z-lexs|dYH$=41yndOw8JBQ#|42+=3IzKw&~(7gqx{CR5e2$s=VOhv?( zBq^^(?wR-geu(Ku*M7(gYS|y!SX!pcTXHt5OtjpH)up^t`x^a2yWm;8@3@|?qCNQP zd|3O5`{lR80FEd=zxz8ilH|&Qf+QcxVP+&0FFOako{h;2l1{920cGycYBUnG9|_3< zD8!L0!&Qj<^W8KD_)awvR}QnJjPj6p&nWjr8N6SGLu+avXPC+al7TEYWsBP53}FY( zf2)CSX^wvnnm>hYAg<2`6Df8nwz2aLijGJe%YHEH9JG@z%sZF!qbBNP)OTbR8?WHe zE1%oqbMJVrsFbLT6hB1rWi(4d=_7%~^s|L?B1vapi1@Wthv5IX%&HhGvr%;F zDQU8?#WgOkZ!VT?hgpxCB2iqlmJnL(XJZs}I@Nbd)~18QEqc8fBhug!Q3ssAiIjfU zIE_xA^Bl>Y1Xl5M`k7VegyMXZ!^ryfV#WbJqUQY`18*#-SbKaj+B=0!ZM1?*o8ntJ zQ<6VrN>X%s6*Av%AlITkr9KscA6nuPw*w6GCwpzQkvCv3pIs3kNiD5ddf~kjze6M6B3guaexX!M^gFDt{TKQepHK+g)(v0`gJZMbo-<1L}HqPVjqdK z-dlvqYJ0<8)XobItoa!_snA(}SF!=kqS!3b&dtbZH8U~bZyO!u1ea-VT?LJ4=S{TD zt79kwr9efko+DIbkE1x97Vr@|tI*K*v~%oY;+YvL&S>G193LGhM-X3uJfx-BX!|<1 zl$qP^B#3L2RyW%1w!vJ`tOac)Sf1-R*Dv06xzFQ->FTBGNA;70_n{V) z%rREHJD|9n-N+T*5$+#+dw7#pYaLB_xsJ-H7?*xfgUvZr3 z_sM%%SFjY%c}pxdJFTNpPWW#C*Grk(G%I2;xd0p`q=j)t({&GO7d8?5vau<~|8~4{ zfln%1oG00i3j8c}#&K9!vb^(N2ybzRuYGhCzQ&%q4&Bva;MC$qR*B7KMuWws<0r9; zOh+1}nG)KcPKf!U1it@`RnDIp6Z+bsBrofmf|4V6=S*Lfjn0b@c;4*+iE0|?>Xz!W zmvw)$JWV{vA9(uFvY=ITUPh)svH19q&mcFQ7@ua@`M|hASMhSa~o|^P(d2|L_d}74oAIqe%U^d$Yb;Q>99o9En+=V(V(FfllIoX#A%`fNP=gS||Q4b?vTU2FQwJus7-F zIowAz)=fd*L%ef%aguB5xg$;3)5djf`kqk-^;v%7+NeBcT)(0Ygkay@Jc4y93%Mht zLt}PH_QB*Z_ZYVo;fVWLK4)#Fhv+W{7x|o72JOJ+NNdN+q@dv)-r1MlbNt2+63J?k z;Fa~-`bNXpndY0wHeeYyE?-fh83+cS3-NAs50~RP^wOfio7;)N>5-J^qR*3~_T0!U z65AjwWKEe?T*w}p&zt#@MP9Grr=RJRP}03ebka2e`!1odiq0X*siJtV9JcA~&vIu; z$L=r3uqqOmn8ct{N&I|ujY&b@je16R$_FA6KZ4yJ3s;9@6VYZ^gny znJ?Pw!{hfC%l-=cu)5&GoEV5c^i~ZJ-oQZMGcgaHP%g`@L}IkF;_szdp!Sg$RB?pf zNKU^`C>v=bpWZ$?3E|~y)4xD@lx4n5l_)!GbAH0>C3NL94Z5*7BKQI`vQkj`FM(viDj1%CBEQMg4im z4ufq_4Z<9hb-gq2Q^;Ak&6MYY+H|JPY~K`;ohvDMf4=AWC(I)`^=QzMH6uuu4iCr+ zvrb$@Mn;~0;wQb+umti6$aC9b|8keuV)+~}aeo|4=e&@;;>6#SkqKsAxYJ2#I%)H2 zkWFr^K>3N;+E)8cAX{yyt7>FBf5j6J0>pKY-pC+d+PV56 zKKbqtPeKa6oiY!nVDBgc3G~#wk^3s#6qmHjAWZ?*CPfr~`><-xG z$QG3Cz3uX|$ZrEvPV8EALpmqe7z*+;6W7GioWja($$YM;$GnJRJ~bBvIx{0ZfVo9a z@Kr4>4&|YpG8%Wu(kvABGm~DKH?n2VgHA4l(0N`uY49Grd3$m1lR4)pj)3^1jt(i5 zq1H`YIgGjm`7`YE>>$<&Y#yM zF*jV3?&<H@SMOAc*ef+vC=Oy_Uek98YETKo>N-otW=Lw|z zOWLW-c?_3N^oc{AK@2@X9$oISI&9^wD{0w1OL8r{ZVcDBz6EEV`(az5+&RMvt{`cu zJu9Ty2EzJmk9hCNGfuF~xHNbyMpTEEv}Yak@l2NR%QQF~X#f^RJ+Kz_N?&dr#dT<@ zd=|Je_HP%^uT7S26oW}3kLDnntx-GnarQB4cmKJ+%bL?*7IflwS4IBe(;g;gm=_ir zD}4{a3s&?nOmS6wY$_g`Ee8g(<-lJ?o=};ruO^A!%p!a#F^M?+imc=`W3`qUo0_}$ zOEmH$iN&TjdJ9R0c*bR_M>xAeBzBc&71>@zA_=c5=f@j2c7&dzxDXhW8@QyP6p)D^!HK@;B(%CgWjH{@-wPOrOIlvG)T_gc8hXG zSUnaVoQDIshD38T_5PC{7wNR|Tt6*n+Ow_5#dh*(WKYUN^R$q}b6mV2th>OEKYL!z zv6d<_%r0Jfv9WTm{Cf|iHAg~4*u^>W9$fkEJp{+7Aj|l#d?eZ5c~Zqev#n_kt_hSQ zAzlN=iYXoyl9Haf&fs=#nuYfAt{g}84suCsIr7bwa(}bNjN2Z_qbu^=LeHP0=py}B zk!*JHEf?!c_h-)UY30;N7{`(1h3g#2c4!Rp3IDU)VorY56Dm%1QpWUs$jL2>A@B!~ zFNyp-#M#cSCN4Lc=bn0HOUu%N>muLt4Jxk14t+=x<~6?7twotEhs?E!FiOc5U6kw0 z6yu~%Bht<;zLjEawExNri_*g`-C*X<-0B!6v_?-IHyS(`p-Jou<<2eY|hddiDDzJIid*Wv zS;egmlvjX7A-5)QZW%u@=cL3P&3smH?yDmai`&DWR;-Lp%A8*sITWjlU^!VfogDut zX4jUBL8SY!l`-;IS|P7sh2)$|@wekuc__#iepKOCSK03PMd17z%xx2+3kT%)Z~GWz zO}Vy(Z{#a8y}8FTYtgJr%`;Jw_g-gf)XWOxmVsUKCRxN;LvaFzf^aRVlA-M-=da=+ zi`m1k-YgICA#=WQOKt`?{JjdyYaTCcgP?}1si&I53_fem>PvIU>N4z6<)$EC{1M5l zzmbKr!llGBMp?5IxGxTx#Qh`cH7 z^*soax;WtqLeKPoW!$p(akQq>7g|%kioh&t506GOFI^@*_14@SYqNdt3D0K~o0tz8 zeX7`Iq#o;}>=nB`s$EMO&t-BYdj&-Vn0eD(wvM_L9=9kbX=79kl0tu>`7;tu|FWr#-ZTFhj#F9+`>>u*y{@E4lY0Z{N;x9#!v2 zG2i9RGMF;E>R*p3;^AFzjw+i4#U7aDD#`(|5XTYa`-$+am?Vv;K-nx5ziUfnr!!dT z{T%#)VrJfJe0VmZ%J3`HvWvQSlkaoe%$8DT54Vq)^Ul2XN(gj!7v-xDHt(q4mPfIK#{w??K}; zD@wYLrrB&uoomC~)&YsRv9aHg4=bBSWVKk#MeA79zW-~^qO-7GX{RURX#)>pBR3hA zr{5CQtj?*SYAHMGI|=*nK~S~mOH%6dFBB)alE2A;O<--(ub*nh>MzFHOeX(E z+~qWDzs>E>>>ZnByLNS63{~yb$urj?&6-VKt^Tag&JmAn5hCGUc0c)UI~HtqqA3Exf+%`r9Q56*1S?tgC#y9|70qz8#9q* zfdxy4lvGiT>~?%6Vg1G&!u3Q+fBT4Q!kCOiNB?2ONy);xD+F~$xensqI_8hR2Q{t4 zS8$FDU(7wrP4#)gq&b#Xo3iIrhEgkaM`sJ=e8zUyE2o{m1+i-ZW4qTKFx^yZZ|h&F zYM?KtbsbEL;$}Ts`XlXMZL)fTZK?uO(w|RBwdc%D_D$~W!uw$Y&TVKgj>=#qvZ|B` zvilL!vtNd~u=)P4eZi9dPvhDDs}t@2-tp4+GE<1wF8+6#7|&b9cC|^oBjH}Jz(5Hp zx!-1M&TXSaO<`BIyU-})+_#SSCD2!~yux^Ir|`&EuC?xqCz+vfK^tBxYNUxqM%Tni zVHJfG5Kk>Ins>Uob|Nw2JsCtFaDyS7luolsSeGPxoCd4|5D4|GUuM}U#nn%{8R0h^ z)__a7ZWX9)3I|z+5@2$q18xud<0%&|>VTcYzNf*dq-*z%JcGqpuwLF)1_f#oi&)C`zrarV;59aE5xXB}6|e9tpR^0u z4_X2hP@8IV&?3<~4)!1}m$r}2$?p_)glyEnry*#c5$0>Y(1~Q`P3db=O>@_NQmL8O z`ZLC`QVz;rqOFaHR!q}6hXbSbT7WkDc}|wMTwQ7V5B5YScye9i^^imnZ0n~%CtJ7;;qSKrQ9_S6(r zY77#KoZZ{b6unTYV=k;Vs9j7Ne|jWO@RAL{SNKeat!XB{YHe$>DyAE8HSBaFpqp}$ z`2OiAaS+c6SYBb0*#4Ld*h4MO_2XBk@%?ogurGgAV+^iqOnu@$ zOinYxu0p(9e*FVbQ-r)o4(dV-D4b<>3tI$*9)6iz@fXxoBz>NFdYf!gWZ)W)+e8k6 zh4hn%{K^TX5P=lY!cYbkHPIbM!+oP8ODbl<>8J^)6zaSfOP8FH+IX548Pk|py z_=V&y8c!aKw>18HNs_;~Rvcar7OaD^8lvv3Yf4m!$cN>!B-@V|I%k9eQSung4b_=z zV}+-=UP!Ma!5$26V-n8DQ4_GIcin79Ub}ilW<*(fXiWtb0;JMmIZdl!(bv&;OUc^}!`COYqYQuO1ej(~@Dx&ns(3 z9ZxkC`=VxrLgmx)C^b{?IKON#MrptrWQMoN)m&%a!cw2EwSokP3gOFKy!@qA3;8*m zSw6_~RxpY8RO#5a=@ZIR^xEI2j?11Jsg=)~-Q|y^8 z*DQx~0V2t1!OGxGwYNPo9EE{pe230FWJ-~U@i^Ywml}!?&!zqRfdu=S(FQ$B3mTso zZB?NcrK6LX_~ZJfZd+2y+d3O$mc|^qh7gD7oHtvB$FKES&QodAD&IaG1bO>>Tl8%j zW#wCX@O5;MeZ_CDa=W6GUa|e93hFB!9oa&aQA+#w^~(hi*8tC`23ROg=$D_yfb~^8yymK1Y2Z|y+0Qc zl+*p4Nc2rtt+uI!%4K`te?)6`c?9UToRH?h_u(8`1L^On)*bwS=-mo?u-&`-R*~tgjHg1Ol4`~Zz|}M z2|*XaCAbqJTs1KS4!YG$T`hvg#_;BvihE-q3Ro>qlk`NWst)@$5Zat?q|~?V`$!-s zNu?x0$HfaHa^h?erpJT|a}NrWu9I`o!Dv3Cz#}2c(QyFBh(Q=JdC~ z{ezYlhj^&FKJ@%TbJ&YIde&#qn1|mIIeeK}efafb3L6!zqHh9=nu5^L{3>Ep5d9(S zK>R8#Xd-Z}MjhBW7^#*q{4LFoD>YqnClJKesVle&t&g zU#OjyE>}S^!>^7V&z$%jUUS~>%qR7kCaC4#+-WUFU8?;~E(|}iTk_s=K5(4)XEXJb zGm~6M5Z77m0{l%ov(LpS;rWyG;q z082Fqv--jsb*}@hwemf`v9(ve>)5_h<#b15KkW4M`uUak);`AV2mj$|Eko;s9eFg; zbdk%({M2e)_`KcsnmP)j%h!2+mJHj*SZceR`OPG2Eh(>nvb<0a`H`4aIvk~r@bU_e z?+WM8^b1cW&wa?}UM;{uWIO1R;8>5fNCMG{xeg3g*GAUKgxeYwtFsv+3NUb_l_Qe6Q-J-{ykozl zWclaa5q1%xb{2wj8S-27Ayo>_`R@QbQ5hhjw<&T{Xr4zdJyuefxPzVMLu6a6-XI5~ zgJ~<5z)^ow!5H~L_D4;-TXN5<3)>R3GXul80?zOU)k!FImj7@IUj$(3N>S z(l?()hEXG@zYEok`my3K;F7gUv<%h1ef{xLYTL-ZS8g57YY4kHn8#HAUEb5jdC%=h zNO0K(+3*n78H0rsuPag7O`O#v*!^9jLRYKaQGsPuMe98aVb)DhBn8Xx0j_4P)vv{n z8i)u?Y44^|Ow{GW3oUY8+0nA5m~ECj>yszdq8@5C>n=fP+Z$*G zlnt@F;NWAhYl4jTJ;r1Gda(xyBpZcWeUkU{R@`!e&)v9G9VgO{sVEk|9p3rnKro)6 z9SB(XcbdVaV0gc^4w9^vp1*PvTS`1_$w_B|}OxSiX&Cj)0*HJ|p`p&vB&6v~l4 zs)RDlf5kQ2`MXMZs}9uNzYA9jnfW8KXW%Z<9gi+p4&`v4Hv%=@ZeO@~?sS^c87rFY z!@Wl1grHuJ>j=|nuIpDhrmh)k&nlH1B75P~N8zExVU~9dSQ5G%a zT3zm0-PY=v`0rHq-x$n|tTFS-XDReOgun({k^okFxmoZ#Tc|i$Ye(+=KKQ~%xn2jq z%@57>kRw`ZP7kEv%1FhhjFpmp0k9H_wur@;xd;CUVL^Q4?t;%*8GDM-C&hK|BKooq z{#8y>4fp3;=dvEv+0j14dEOPkHY`sSEK;&cpcm3ugEU~j8)jf6R|IbiqTs!WE(lQERvQ=8r=}8}Qw~8TWCw!y!cJq&Kg&}HQq^xuOa(~I-v+H> zx9KXzr0WMGhhp8mdazWQ93~l)-XQ!Fd}l~E3%JQQFw)RK_UWSV5DAE~_MuhChxE03 z?<~Smg66{lrhqdz1Fm~p0{=Gl9>h{lca5Gi8~Sv!&PYK_VeM~HoFCr<=lKlXCIxt8 zS&gQ^S7Z4{U-4}8`IQAEIOk(sTYqFRFtw3PEFa2&tUnU+PX!Wc-#}A+D7TI$w7b>z z6Q=j&NGCvQme&@&O56{r`GgC7B^c@lkf#`G4YN4)4g6mgtwrJjjp^sg-ZEQ2K=L!a zw15%-{!dX;cA1dKgROve9?F&~A}8i5%dO0DlscMJ!!QOp(3?EBgQ9bYAvR5A)_I7C zvq@s)C#OX2mhBLKY<6xU<4cN2fH|eD&JgqO&I*I9Kv_Axj?k@%?u9h1Y~`!kEWRr~ zGuw3)wx^j-p%6=6ch7cmMz?p-qba53AG+jBXV1yV2&43QPfVO}*N$H@^@KVRSuAB5 z^%dszL6D=pk0l9yh?Z`I@=vgDLnKKm)g1d%09b!0515VKG!}5t(XX!pA~`mi?$2Qw zZ=Qs1-X&6taY?2dNjmH{g9?VKN)m`ilI*#K#O3_zQ0)_}ipG}-A)eV2LRNa9!a4){ zj6^$E_i)h0B#7FM!GSs;<2O0R&Ej=W`bZ{bsI>7aj}?ME(mOKNstvLl;s$wNccp&(kIo| z5@UDkDJ&Dck+QkKyFpd$9=qau$e2r!i%pyfv*-5nW&DnnvfJi{@Q1TT*0j3G8yLM< z>*m(_d-gGexoFA+TpTwCPjymJ<(=5&z5Ku~cC5XXf5;B?^d?l+X?cM!^V|&**f0iB zeAMiAX$&!dnQ_DfP%~_`sJmgRhiNnORGfz@DaL`-V3=yPMeXsA>0Y`_!qPchXwzB6 z-ri14wj4-yB$)qJlu@*Qe#yH^bG&K63Q$2f-^CjmR~T7ux$1}8Et%f_;Zvg&yS>pw z5XElN8q6|XX!G5wL%191%@=W{?Du&1TS2Df)x@WG<*8jrHv|A0Ks)MeWL8r{)YKQS zO|cYW9yROSM-xkSd-}Ph4J&q+*UtoL}3gOFO+}?~5sNIA2K9^sa82%XAU#0E&{GfV?OiFr|9JUk2U*BGoa|0ac!N z|#^e ztCiG!S{`oH6oCnVn4+cD-InQXlE>&l} z;6{;{5Q#_cxX!5UPu%ktDc}GSB~>CErQND09|%)80|#io`2|=BZG0zKw`xzof$_ev zzk79P=_At){p+T6KMUF{81n~?=>Gj?dFT9nv3=OfY`M;8J*cXamgw(zYzy96M76XX zTm;+mvQ5f$lo)Vdy6jtSv3MXvqoP1f4c0oH&ktt3HSHwCrWy za#zT-8=PUgcaqzQ<`~ zq3@3Hs^>K-mU2*g@@`v3UhZ#kl8Zb~-DoTnggx4Pg{3v zBPo?d<$^n}*LWE6^K1f{!}EvNbmHMnMB6*{V0LV+joy!H;;S0`leB_rDy}Hm@f~+P z-I1qqzRS+Ol(z|yfLk(P4*1>P$GqT+3A5Vt^ChvK(_E*TV&hsWwnULm@&)w~o|S^0 zVFfCjAWhwL*6bI2_TiSr`}G%+g`hP&^eE_`uD%F1D^CFvD5o%v9KOErf*;E8)i z7^jl?dA)pt_T48c!21Xlnfb#jaPNHQz&{W??)aiafJ`W+%pf#-JRx$_^djfS``S(} zBzoZI#uiWZGhjpNlV1a+C-Kct!0Va#pxZ!_D316eW2;}^@zL6)d+RZf4>}R6JZd1A zcd0z@+N-NB0+-fXVWc+QM>u3HqIVsTCWC-y_Cle&^+;%zn%8Lb~YveHKD> z)#+$e6@mC-o%;@}B*!~{ zr3VOD?5o)*0`3L3|61qnUAyZk>^54e#dy^;6KH&P zZg#n}O!?6R3{<=2^o>w0AhJcFz=W_eiluQ#Qt5RInLN@H;sZv0NpsjgwVrlLzxY=d z6>MKEV`U>=h$!-;NgEkYM%G8ByNS>$-#FeJshu!x{Mb(v_jIpKC;*;nb}T$pZI7GA zO!0g! z`vYDVUQ75VF=#5i| zLeh=$cM30FXnMq4E3=_JA;uEN&yG&lrU(>fj9ty4YF6MG85e>$EoVjG!fH$Ao<&0_ z4i(5SfZX0ZY|Bitv=|fnx<4c0$VR{e$bXts+iW zLJV<2iYPhNo#L{0*1uzlNbjboc>Zf)r!j$RnpUAYOq01}lkT+kBKVu^xP`>P4bq_* z_ycTE{M3SI#cQGM?VK7C%0Vblqt#}Kiynlu==HlD$dt4?qO)I4p^{15n$zZPRVKcL zZ8jb=?2xKzk>UD*LaQjpaai=P)F+1#Qpk?<7@!y)Ido=?mr0+qD^a4Y88oIT(ZeW! zo#wAe$I?@uj!8plMxJdx1Q>#uNNBx>l@0ENpL|YgzS_MqUj=|oZPG%Cj>AJMgIZgp zOOUW9?sIt^?BN-wLZ(%9o*^u2EYJmo4wQ7tl#0>j4c25c7-R!{Mrq6T|^V{sM zA|YVdOhZUF6_!mvAtw3td!x*4m3Lj(i^J&K8DsjeMSa=}-318IwsizL@P!^H$#9gt zcCqpMEPmpUnPdvyZ>MAYCKSY*K(*v2NO{73uWwTaqRAE_OmWu%1`=Zw6<^{fZwHPk z@2yYs$qZ(cCtdTWl)=?lhe9ZS%duQ|8)BI@%eJWKnt&-Msk9N%VGE4~O)NSJEb0)x z8qSRGs5j5riC?Z526^S6EJn`j)3EITEqG4xXg;p^;}Li&L0wgY5Fh{D>pGdmyLZ** zdxpEvhorlbpuF$0@rMj!jMwSsPS_L)^-wz~{cGJNu-jG%+aFXcw=x zTul^^x}Dc$wUNQPhSKRbtWIn;0l(dLK|Bd?h9VL5WApB)hHQ zu^)(FgGDzcj{I)$w}6JsaUT0uPPWslq&f7BK)$E)V_DtV5hZ!>mT;-9*{`Cq3At}B z6*b2f4_D6s;=J_li7^yg;ZIAOV_NUeVTl@ZfDO)1oaObbBn1M}xO83rTk5rjU>c?w zx&cb|XCLL8(o}0L+~1V;_ssWXc(?jQC!KFYSH>u{~3X9X#MQWjtDXDYE$t&-C}Df3?mHi84!^~U;Tct=e7%&Pg$0A<>(M2{~S zrt#TtcO@Wf(Nh1fUS&V!8*8MhjmlEclT=N$4ff=jZYP|jOk_eX%BwsQRcU5Dv>vf; zv2eiLD@o^f8scO^D6!?~iE}TgyFf%p#Je?dX)$GWrj8hYF2{XwPw00A3Cvte@zNxi@Ec*fJNBB$aBK?Wt1BK< zUNl$6qwZGa`vnN$MzWi-r|%NJU016ozwSUpbHj~WvG~K|1wPDl+8R&@cf|6@-Wh`4-p%%0r(u5H}8k&+PGwjt?M83|EvBho^NuYVASkhP5dx*!) z$k>CW@XyNZe^bO%i>CRL>g4;F&m%Q8;$}_(z*}x_*2!NMrN?!u?)f!nXq=4q4_5&4 zbSUk;c|ghwowmy0Fv10g?4oR0`?d=GLm6`x?Z`J`cR;yz$P4PUxT8MGO7^ydd>HlXj*jIRTGuy7{2o?|$7@ z5TAsiuz+Io+2g!o-*OLSU5DxZ=qNLvII5{nYPvsxm-1i}?vrt1Rb03}|Gwl|3e*wk zyVrXI@sAXGF#zJ;%94n8vH$sq`_Pcz9EpMe-@+%wiCSKTVd;{ue-B$S2U0?hdjFjV zWkCzkOcl0d6Ef#TT7ZLojB6_2@9Br>lK|f-L$qyCNvF1AAoGL7r0wyP(GIVy zJB87yvGO9N;-9Gtnd1YdfBLf_`i%p&0#d?u%A+_(q@Rrl3#m^jXArJ6dy9noz7Rf~ zd-n4Xs62*q+77Jfej=ZC`0qafB8$p%s4Yxywys%!?0N|eKagK3^*!2R7}R&%+C33cph&yJjU3D{ATH~Jj5;W<>8!xI8;cVr-1T(Ulx$J7Ia z#E+G)#>@)RNl_I(MA`DgSWmnZ?~lp_F^jX#c(dk;>d z4>{Q&n^@^YMK|L5ueDE6>u9ihMnsf+7#0RJV?3B`F*Id3C5Zwj;Fxc#-9oQgxrm^i z7xABeZOhwyze)u1qD8h0Yu_I6{#-OZ8u&igKWPIOLv`C6*Lq_znZ7G|hSqs3IUY(` z++du|4pJ8jwi1a_Z8o*L=|m$#{XY6?m8P#DU`#lP=FB+ey{ZED+wv%T19J*l5^3&= zcFf{p^Kub|hjINGm$3F>=gxX{CmQIpeSU(|+`glntcTnZ_U!zQ z!HD#Z%_k~#3`1B*?*21=4)y+5`g6#Sn#b5Oxoy+ZGQacTblGUk6i z+5d&^|0w;B(tjcFUt<23OaG(vUkLn{nE&O{|0w+z0{4ip?{kiq@w)q4&e56g@$nALY`X|5r6sy@%gjs7XL9aU>{r{KMPp8z&%;^Dn;GU8} z+-SMj`m>gWc#xkrVKuaNA%wB<;1@U&x5?wtpFpQBK1q51IA#*^DtD& zu)i(Yd3bq)o159&+uMVxtLfW2I)b~p_`SWogUZXPy?uOwfk5u(=jWjMdgkYs7m+gg z%>Jz{Vm7N81aNS06dW8FohI|(f&!B9EKYj!sWikUt63yo*ZrUzUN_M?{SFeZ%XJh2 z0tBDi{orn&JJDXh7m~owcjbZ~;56C|Bp7t+FmTvR2olj4!9@}=qK&2_1>QHi%0=R^ zG&)TbDRdfevgu5S7LzH#O%_w49j*rjelNGmg`!Xu+KpuDRqC*GT6G8-RqDZ28r7n$ zwtowJA5N8vB@ruhnyLO&X~5eq)ggME{t52%I1}yheJBX{c%3T{fv{d~AmyZKZcVTSV;ixC=d^Q(inNt40^4H%%ne0}BH9F14kLN2aRx<<{{9a7&*F(rGPMZQ5!hu5X z&wB~i3rfNRAyDwfJA+{j*7Ib~FGu+%H@hPZ<`Zbzo$j;@dTj`4%tlCk@3-(Z+Kt~d z>-1s!K40l;bX(yx>kSe6J|6MkKi{qzET{3byF3|d^ngf<^+w3}T=qe6_}qiUf$!ki zTn-`A+1x|4cx1@o_d=S<7e>Zr(hrKkW*#h+OW(ddm~uXt#BBF{pwsX2M65IF zL*jN^56b3t8WjF|hX6WmgscIbhW_2l_T@&G^VOzcd*GLlfcG^Rk&quu0+C?ISOW3T zzl&|3ERg6w4$OS52^;JtR4`2%~265G7Dx5A7ezW@_hkL5_qdM`6&*YG*1KPtf1c)lUO zcj4LZ1~MmVlWo3;bgBJY?!KP*At<@Fe&t_y(>F4C`#<*V&Bl$q^`cWXpFN*Dc{{}B z6PsVZ{G3LMvAD5(7y5jLr=f1N_$o_Nc%DWYN77DMMqe*a|9EMLglmL9F#lPbrr4p49YU|zR&A%2 zdvl&(CWPIP8~YIqBO9umteKQLz;Pr#7`6VY02_w_Yg!lPxw_Dd24md#pUK*HY!vul z?S5FSO6BVSR7$QXfnNsP+eaeTF#431CT=(JpA16Wpf&K@Q5;IF-*7vGhd0WX_aBU@ z@AYDz2!+SdOI(M5Wjq+-W(A1cVYJu;onbyqyi*17g%SNc!sK~@@7(9m?;rLoWGCNw z`zYhx=fgsY>Q{C!V7y!9&tdXp{V#DPD0?UV6$tAI{#GO}lRk6=Yg3Jje%)A#r$XxM z3$ecUH?F;*Lz%&B$lseEpzm%HSJD&26YLbE?>;JFfA20@HI-jR1`d;XIY zN*-dn-!A>;CndotDwP^644r<@(IoPwjO}lnDk5*f?{_>^4W=HZew0|nfe4~481TDh zX)M#>N<_3F!(~}-4fGSJd~)YnKvny^WXMs&2DvPToYHxU@Fiw#w8ku{A6*OCk`}BA zr8<*(x05uA^PsE`SspR?KM6O9{TBve`Huk)Vx>E!YXFV}P4ZIKpLV}Y4%=t_cN*dL zT!A6>Sf(7UVGgP#fpyI7nvpi1y~-_iv18v|H5JOA{y#4@9!Fs#XAaDv zDo;^QIC3efI8|EX)>{S*%Jg$}h4z>4Q4Q3(?k{y3z^1k>E{~X(m0M##5xk4`1 z?z^M*Bu|uJGtxtcRHmE5{7+s?_3Da20;wMXlL=2l{G%)QwM$dI-4!oQLaJj>V^_(Z z>pAxsQ*-@Jj5+tQFa9$q^XaO%l~9H`UFJ|C->*=Ja0~4qAp4GZ*kDy zD|~B4iYZ8qA{SURzX|>4T@F)Dli|9v09bA5WI#(Fja@&D_T%U7mRYbd5=j0db@tFx zyrbQLXv+O!CBg+jcEOLX^GRDITj z@O5N+{{#Or9Czc13*cBzc)+pg4|&GQ#E?;|(BK01P(&K&c7pIW6Mf+B_q0Xb)@b^I zv=-}>^Z+a_C}>8;hxc3 zCTUe4TD&D9&3`Vi;l4e>jMWNRR-xyF&O8rOw2LLFjz042eL!vCaS#XMABDj4+z8f2 zR&6x5mh##Cx!5#5Waww=1ifFl5}r!i$96DwZGU^71J}-Me1ta6rf@h2x8lIgeKO0I z%I6Xks8lYgo%U=$-EA#VQd|55MOyy^Oj}lVQ}av%zUUk$HFEWh*`aGo(3jrDWcf@T zO(!-hj_1r47;>)uP+2F{7B~yvvL|3@G-Uvc>fwI>*tUAmO+o+u4EhV3hA^DhY+no8 z7wky?Rx|6oaaUMV>!|NPa_9RTvk0YhdTe_>o0So;#@G8M@em-`*yj zlwOsqux)EsPQLgC;Vtw)%KJTh$hfFxPSFA4X&!|4Z(jym2_2*ux7&p32 zk6^e`pSHP^f|Cu*!Cr@c0A%M55z`rgv>G$ku5z^~c?MkOHD1+hu`OnYQ%zmYZp$)sJW z$)9HNx~tV9XK0r-_=33pnDk@{i zv3X5!j5?kYC2OtWSNIJGyUYp_7C%ovBcgHkT9f?tcQc5O(rL7jJXtkuO~X^1_PVdnFq-!o5i*Z2ZiTg5)?ZhYt&y zy{Q{9VpZnOlKs~3uKf3r;3L-V5$Q1{L1Sz?$LMnFDX%-+sVj1S=E<}J-q%t;{!lB} zt`4%ryP~IT7n{M@@9SojhV4XV*0cC=L^e|0knenghgVgAt7SGds`|l7;z>%`Q?Bzz z^_aB8VLbrFr>IyAaV-~=&Rc?<;454Xo&n0AjFE1T3e%NZ~fBVOb8F2RLpIyO>XQ&T};f;QYg2!>9a@n+ExFC)bf_9YDUZo z{O$qRxa!`xJc_;rm@^2UUIZ-;d`!U*>T`11!2{Qc=xam1B$5v>QjT4rmITphTEwbh z_ijrVUct`lpifXFYjGK~jdeNfr7L@%y z`BcnXJqjQTjE-P0$V3zp9<+)mJ6YWECLT!XDQUR%u6@yOY6j0-b`K>h5I+`*eh`Cy zmKIMq-e)|Hq=RT#zIBNRHW5&P>`|FB-Fn4prHGL-=|&cE;Tzg?hL?)kg>)-L5Um9Q z0<$Ve@MW;N+d^qltS+8U0IT>;yaP_`>hE6PRwRvSk=$S&Ag+}l9?bqclb;EuuZN`l ziA&@PawB`txR4hPxuiy+>LNI5-fMPKCM*0xtpZ(LzDEU(Oz)Kp%ym!L))@hYNbx@v zRY_zU?D0;tHtDkACJ1s#3>6|SxRao?LhcBeZD4FzxO}6H{l&**tp^+=1FkV%OIyji zYGxNvZ)FxB^o~tPTply8Fq#_dO}uQvy&?p=sTrV5z&}qFyrAWh-C8+@I*;-G(uD%- zUHJkA+dgjseVJ)gZn50ervYz*7adp{9HZ>G5~0Tb%#(Q^WAo(7@j(TV zkMRoz^yi{PX9*lkTmosr0FVv%uQnGrT~`AWs{MWX!AwU?uOx)P0+Scw;*yFj{4j!+ zX}_?n)a4nxD|0Noq@w!FwxCPa7g)w1gJ=%1w!fdmyS>DKmOcHOD%)aE$rN8%>33O?qTlY`O^_|aPk%8SGlaqP zKc&IU-nmTYdwY!PMquW&)kH=Prm~`q;`|=e4dExfbZ@9CkBfmu^(86ue;HS-n7cU4 z0C-a6v;$qsI}L)Azi7&dAuw+ zf%|A5%p}JK)-3&Vc)<}-KhAfYfGZWjnb<5>{E%ARniY2@;8eb)U^)*bx?lOH;PYcc zloMLGaoOh@(hgUbfR>;PBI``CxWD+g$7rC#tGn5OpffJd985;iU6^80{w}9G-e{d;E87`_ByD_b!dps^oUrET`w2Ly@W+(HA7x|-|SBkVoaLOn%EToC#o zgWxy6LZ?Dhtv+2mjkPYVOr}H2E)&gkRps2og^G5*4P+O&zr9m;tUtH7^&}iiZe-sadVUxahwl|TH=)GxMb(T~>=Var z`)qSdH0WY364>Tq&GXMGBZ9Q4LJj|^d&Ce?nI<<{i`e?x!SyQG?ZwWTBe9n}ox7!iS{7}?qCmU!x}24iW_ znSgik`)Ooc%<(wHU($$;UK;7oFrLozWv#j@*3|AXYvh_tUedpxWXS!PUyrj11KvfF zTM({V-V%?xC1V-GOcAn|3-i%7*y7~l=x$s6vUFRu6O_c&>Z(AA#F$y~bN~`tx9neJ+>Z@q z6l?Jngtrf?wBJ5r$h&~u-^OT8v*eeMhV9_TAr5X{7ukP0pH|}(m0Gh1Sej!?vt>bA za8PbxU)u^9cfi=4F*ObUu%$;Zt(&akr6pHslPog459%O|!?&BCA>kY8<8LC=^4-Pv zNmxiIXs3Dz)=Og4?XL@c8hfK}!fvU$50zI2*ZN(|^s%}A5QYv?6Fd&?!PYR7Yly4e zrx#Y?uG1pi$bRaO)sRi?{Dv08sbCd2e^tDWKG7DKf8o5lsN|L9LiuYl&%>FK3DzRk zBkQdzKB|~+oIY2DZXmVgPNT^)?+g=2qX>nrF78Y8#H8yV@KpPAfv0u*&P%CUki?O$ zSfL@V4Wj}BeGEHW>})q#5)+;Boec_)T)uSKn$YNhNsK7UKU5vlTtzya2c`RJKAz|= z5}uB=Kayn_n|!8*61M>@>DdX*N8KoOu^njnY?)^NXZ=eOhH zh|{7NCX?3aVbI@u$d^vJ@)&i&1irNgXOLce@xB{OJu^JLrc+M3spuJBBGII^bT3j# zIFMt)$8BBq_^@HB{ZzpGGSb&a@coh1``U*ak?yX1{4AIC_pkwIurh6z1^-AWJ*5sa zE$N>z6AVDQ6vnGGop404TS#pXtTTV5;~XPX1FjJ`U^LtCaIa_CKD{P{aQUut8)udC zt$MQuFAH=^Nrks#%qr71kZeH4W{2&FTWY9;%q!b9-!hYl0XMn(B(;OOpR)X8I4?O2 zkSKs`@l4l|1q9&gKi}<(%<{a7utYAQP5QMzl;G3^naG~o*q~os5cHhK7HJKi?rD8QIEA7m zqHkADL>%}c?G^@Tz!wZbP?j|J0%e9QRQ>j}Mb2ECvY02{I-h0%S&I`KMj4;;u6zZzy3nqe&BIwTy93o@hoN|X zOKnht?WL`iU6$5=-BtAWUgkMbDa0R2wirgtS&+ zFC35IZ;PE0jw%^PMtdc!_P8tH#6J0wIY5yE(LmiPtkwraN{rNknGbp0&P!=UK&H!!E0 zXX~aM_N={Bebxn@ePst-^1AY+odn$$!9x`9HN-PWq z8Tmi70tDme@lBMbf#rLR#v@uEtJD4q^b?kaTJL`C031=NRK_KGp}t*VYfC*S_3@E% z#}3nqR$&)tX+j^VDErQfA7T34u$?T9Z=McAH=`%I*Jq0Bu+4HtFQ57tTlp9h+jtvZ zCAulo$UMV`&^051kOmk(^%`@9N4Qw|Hb2kZQR;$4Wl(hejEQY8)U>J2&!QPJbU%Cl0j^d;44AvK+>5hQc89(k*jM7sSbgAUCYe#=HM70C7N$zlqnz zN-SpdX&(7y+6w2TnEcriQ6Egvw?{~xfe>RwGAN0U&x&UU;r)B(^VCJC&{0U6{$|cQww%>Xvvu*a4(|7{w=VRBCZM~F zyGPEfP%sS-6xjm~nJbg^O}`u-C?2?bDPnoaS7H{;_N9)6BFGBC@1VxA8fOF1e9rwP zVM)=0gnENw-ggS+k>FM=7B4u;{r4XmOR{h3QHt&S z1bfqL2ZSHpKXF<4CWw)Q{4Q*@wIpk=Gs)UHhxs*;WRKCq6kECg-=*D>`5bhzNQrK6 zjC1H9$_wgtdO$Niw|l|^pq9w1^B~2R;?1?wZpkgq1hr-@&H-%}&npg9)O?Go4!+`I z5GOmsnx>NMUAg~ND-_pT+BKeH@luyMMmx7=UF~(Vc}}g_?@bkNMvA?zKN|=mV_}8^ zx)u3s)P8{!NAPW7KZ|m-HnkQ0>)OK8kW<)Yrxol~H+5|`+xAzynr+Qh2>ow4VfH`k&Js`;&W@0y)T9y82oL-_ zEA9aF_tFt$|6!?~uPuQx#Mx2wYzvS^NuxYQ(X&nY-%CeXpZ$MLp?0Tsr*@}yr*@}y zr*@}yr*`Lm|D9PSHrP;@-9j0@y1p!6B>m#d&_-4|F)+1OmNL4 zu^?8q{J*TFgTfatiA5TovyYTRVJ58RXC#^#VjSX^zr?n(ZzEHxoAZjiPsbbQ<{sF< zM$5=f{?YWDeIZ-tXE*sg#!NWFW1g??xe#5*fi@|oIWlv0NU>FgvlMTdn4f*(k-B+I zJcoj7p^ZF;LLrxDJcq(@m`^zrLRm#R1K~b8nn$xb()tu|PqB6C4ZXxhnuoGbthqKb zx{>d!2iEliOUx~iuGEOP9i?wg7Atd0XnOI+iabT%LVgF@_CxwYT~S?!h!lI1dX22x z=F;p5Z{OrDu`^g(IAuyGXUzPEQDUW85ZUY^1b9!@g{ZbuD7HGr_?*SLJA{FIkl&|_ zfcnzc+A>9K#!^;DlFouH-(k!E?6f0o`$}MVpocPWKjqe` zN55{pCWM!3$y?t7o4L*OIS7dqS<>BWBk2ADVRhzR;As18!0RBKPq}^SRpfttb1nAV zkQ|4h2E0528_33W7KRZHbG!@WE7@SkmS}!rJv?t03y)HL=m-`c35*vQ%zX&^Y@=be z#3J-WoD>PdbM|7of~_O(bwt+3+=IPNip*JJlikX*ZItn#5X*wz+({Z`+vi)j-aa!Sz|uJMin}6y<03tYh$+Ixy6=gbe1Ag0kpJh>Ml*zn?dYm8lKc>ua7ZUua4(x0RHA7sw*oM_kwHFyq$KM@0e6LRdJ`j=-Zadw&=vlGX>zldeRkeRBT zg2o!o+j}ashKPnG@<273t=~Y_ca$07UfImckJp4Lbb7a-M~p)=md?*b2SHUF`^8z$ zdiecT>@A|WZ2-@PASUz>7t`l&p&O4(`O;CpcB+E-JMx>>%94L>qCv*)`=a=PQ$@qA z*rzIZbCREUMWYT+X!gI*4P_@?D7(Y1-gTNSh^N){PZmleqapB<3BrvtaeU`X4?V@W z9{V88#^29j%{5pEQP4p5NwJ`>;H%nj_?_E{_h29LsMvP815;EKyain)Lr>amh=QQv z>oaYDSqcS{2>I`c(lyFy5K9>r#C8_xqpz9#!1|%!l=UdzuN**XnCLsn6I$Z_7s6`P zqnMoRgz7DHJKm(R8+iUHLyh^`yMGY z-uWygX3w3-vlz&8^^YFWflqC7wXMXS1?6XzDH1+$sW;%R8cq2d9vwX!iKz0h{J0)O zIl_HU%7?HF*Y%MsJ5tib3~UQhvV-~SKrk~C*1SQE?4syE##k{Lh3Aki8Wp{vs9VFT z`gZTQg!@78OPs7wG>}G9E|@^8$r#wFqU2BmsrKJ$Nu_%lmvI&&xK>j34X$_HYw5q_o7f^A09I{&IA^d<@tSb4Da4bd`qMgLH1p$ks^Ai`FhEYz5Zsv~c zHII${3C=i12?&c(J|kKhx<2I?-}ukxBR}31j?w4%;=$AlIapqz4-jY|trf=2@0=d=Ll^t(GXuJx#Aog?j0Lc>}r`!vLT-V^)& zMQe#QGdE-}I3*WgmZOwxfcHd+_{_6nJR;u1&gwaWS$sYm!yTKD_BQZ6McAywGg(~V zp^@*8_c>*iu|8Vu7D6ik zK#VC4Eq&?aL}kQ$op=%N+|a@CMKM$N$#*PlXMOq1oe0f{-!B=hbf(*e<&ve2>svw2 zEEY-lo4{Wj|8l6y@o$1kYW&|i1KUiv>%l_!S+$$pbA=^{^D5SJlxEQ9zw^2ae>02T zL8Ry4JdhqV3uf^1-n$_akI~rb-=?zPep!B%qpW7aP(HHmgFb>j?}8#KgdjY0u1Ddu zhDtE^c$O7}wKsINVWrrVwP3nV`+gpzm2!c^%+Cr{LDz!4cNFbC9Jhse&A;&V<0FGd z$i=p7GevYnpFU5SeT0{|zmSf19D)*vr)D_I_m$mH)P|U19~QtN8bbyg<=2OY&x z>tPw8%mzC+%FVcLs!)oS%E8e(WiAqyCE%6>V`P5lM&JL8Gopv0UE_*gnT>K3X*|x0 zA~bgL8&05>-&F@XhWF_SuI`9@6(BJeHoYj;bWQYqMF^H+kLuomcsGQ-CrPr3 zoCnXT=3%Ka{8i+!bOY;pEbnTwY*_o_emPJ7k5o^_c@*!tV8uz%xJ$tG{y0UacSNQR zAYFVUMUQraHar`}H8AkVv8W2ixrF$y5Dq0%L zsIFsce_2sc^lB?85j&3S`RVH(v>&20&n*+lrF)v?B;B`Eu7xC4g!L@O?L|T;NvVl0 zaGK`nO(@5u*4IPp{7Mlw&xX_<9wujm6tdeSkpVb^?wXdhgx?VLbHuYqjXEp`4Cbg! z>7%C6O!B;EiW0t)BH@Q9*MbtO!a|D4nQTrP`Mx`!#%cuR^P>pm>pTn2ELfnDnm|9t zqn6C!&-mPUE7opU>p4AaAL}624vIAIC8aIpyC_nAh;l`VsVS>L_Lnuj2We+MjP;)- z^doWX==t6uN2XsA8}J+;?|pK|sHDC`Rt}%|jm{QZbkNg^zq>?dkiDLdaU4IF z{6?e89rr{PdcCDSR7#*68xG;8Oq3+$`=lxRyDGAOh;q#*v7szGqIbGj0)nS5tPA>$ zMjQz|=haAIEQo_WU>Kd;n8e1%kv{jjuInMIhDK7r>P{!P?iz^uv!7x|9H&rWwJTE2 ziO>L;kdzkM1KuBez&RUz@E(t4`*QSjT`i z4XHogK98a(F^ldw<0oL^kI0#Gs0Cl;ZsgDR%pD~c<3Dpd)@d^C4#i0Ca~jT;5ij=S z$-ak9g=_Uq(yJ#sl0gqLX^eZP@f#WNw$!^?CuN|mr6na%?FhgcC?L4>TfBZ%tXli zc9_i$Wakq27J$wdXBQ1+uD1qMijl@c;j0_`ex-dsRsIl-70=yVo~>z&N{jh-+KxOD zkAR&=i=jEcyCF(O6eDiY!-?5>-q3oYYS&wNj<~c2KJZKmR=!jLXU;{njTj}`*EmjJ zbXGW&+=h%i(kE1fdKMnlnb`V{es^eH>9u0dvy&z|+?76f;ACmo2_C2Q4Nd5(Cs6ZHr?uUI{-Kb|PH zTC^#%-ZT+LsQ6_2jaH!-J}`SE;!<(v7S@r7V|chuKDmjy$>223TQ`(gH2xB1R_R** zMkk}sq?6gWAtt)PQyz^ErTAUd;Q(=#x0YGCn|N>vWh503THx=WycD~77Ks&QS-Yr4 z34Kel=1!(RJHt*jozVMC*gku~E^2KD?rmvNjZ}#6)U49bGN!}PXVT$hdPxSX3x9C# zM2d!3f!Ft)98-<$WLEAbdT-%aveMgC&gnwAs3>QW%7&jwVkKE_73HemNPis)*~8>q zJ60Z`Tw41)Dha^Lgc4(*ldlzz&#TV^PyGaAaVCB)G~5XAG? zeFG!;sE9V2c>X$SDYNoSUcMSHNr@vgdoR&Sq4rG>r?)tr1RZulp=_73zTuXk@$#xPug*7hmOvb5I$RT;8xNwTP!Qyl{br$lI-<4~(Cdm=4cRNQzS}*eG zM?+qn-jJ8g}1!PgrM3Oj3D#fSS`6b5Ygo|>| z^YaqIFVGfppT(!u3<=BC_{Utf~EEc(NsYi8lR?*xnZ zI9J-zV_Q-@7@xCflf8x*!*dpjQcGqwQnlL7q21pnneT@5v&ei)rP8?zE4(8_hXcd7 z-a=O)8BdKV)G$|Y^C)x>SMYAEgvn9 zWzTeh?1hexl+7Fq*#(GJ$Ls~NO@Ee+ui(vp|D*H^>37IAd_aO!6J}G7SlcmRJJKg7 z14^1E+p{3tZd!=jH@xdlC3&y_>#5=_MZjKCr_|UrrbUMm_@xaPg)DH|hJ@T(R@eO|85!bQ~tU3PGOxJ=9 z?4FiJV!Br%aQUg0FhV}lHkprmN9-N6OOU<8##N6?SsNLI_q#LKb%pK;eR5U7HcuN= zE$~yZ#+BS_zOKMxuv$#W+EoYFY)?8{7oy@RbYt3CtkY6XG6lN zH=Lt1r`_$GHR4r@J1w6E|9t!tpT8+_-K?tLga5Vy_?f5&R=!)kDL!=0Gc%6n_0tuu zlV|bm)CP6?{{cB^CjPU`8R~#;C>xnN&-uyEtv%~D=(a^USz1nhA3~Z|8XCi7rSX!i z^49BNbym{vj|bHq8P5H(yW2NeXHwP9PnuP(6{{l;&sD3PhuY`~Z;0CsSq&Ap_aNTo zWH++Z)e(oy&B3ki$I;+Ahsy}^{C2f-(L@}M6pfpxosulzhL8$}vm?p_Fz!Yut-10@ z=H4A&T61e5KYLguJDOzyh)q6EIWmn5l>A*IaGj5#ukA$SJv}!dL^{>DVb0j@mv}BI>x^_sMk#4W->u7Z?lR23 z*9ubOgAex!fzxa09Sdk$*uUp9+;zGN9a&E1C3a-5=>DJN7?>%@l>#i1GD(H5*~ha3 zQM6SV6`xw->Q8+7WT=!5pUCn=d`ih8<*QhvWKNYN9V2H5St$6oBE=(hWH$_Ujtykl z{nD^P?z40A4kDUTg67N`ZcuQ+Y zln3r1&xs{R$(2%Z?>E$SzDbpD9ToeVn5t#YL$S=Eo+g~uP2idzea>X#6$tZL0@tM- zvCi(X@eO&;U_cJLH&zJM$*0T@z^`<_$vPL4k3!T916bA6_?Hvc*{v=UKCOf`JpWcD zA#0l`(oB(iBpq4(b|l5II>^CRH6@bV){wLx#L8OZK#_9&wo+hh%Fv`jyK_%Zf#?kaIoYytK( z3-ag7x0!Unv!NdY%5C~zZM`-q)@yeqo~Dz++wRG&$?aJL>5ElSgvsT^kW3xCrH4>eq7#;Q9Q(BXbp9;@O9*9`t@pIS+|29JCYn%DcNp0qyWHXb~9B4pdze}}!?Nw$|u-f+=sD<`>79r>iG{a-%b%kN~vtjIko`A9*fO477us^JP3U=zoW0UQjIaWNV-( zt{ygS+3o0~U@T?-yN|8Bq^J~%7a`f{iD?d(uW4ST$0h3yZ&tWP68q222_#EdSbc%s zf02N^%EI!|49ti7D7Czfay?6O^tFS$%ENlfSpMrQ_@X3R@JTuTqV&8nUSrBFe2dT0>JO;-M}FKn8w zDz@I>0k_K091_3cj=V#20pRhn*^8@J-j?h1jxf}ii`*_2z?BjZseO#toe(Px)uu|SjwlUZ1fAa6X z)VubRUexkXY(Yok{zE}ddrM`%QqevzOCYOC6wk$Vi)vU76%!pf_eq&p=Rks-wfn!s zI&D;0r)|{oI7O@ULT_NBb7FJ`?45U&7^!d_%J-$I8|#I-7Q z%9``cj`&?sb{$u;#mt0%J5#PK_MER9HQOekeFc2rl%;Q9mMM`V7p;^~BnzD^LrM&X zor4NM(R{WDpk}J|-%7_;{@fWpqesBEY0%L^e&5h1;@y57{7(5=qn#jkJS4@x1s-tx z>Dzr}3g{kn6r+`r5t4i!4Jpyz?Ov?hIPPnuD4k|W)@d~*$8~i%B~wreNt2SB_|02a ze#a_~wjy-pxy9^s9D)n{m#=NE^OMb-olTj5bXx)>BCOLy<#kGUpXnXF@ zU2oIaI|$WuXv|Sr$`=Ct4BGX7PlhTCbk|Ln3E!s|qt+Ta= z>nQHWx*{OvX8JGF(rVd^@=^A{{H>?#;})>4xnlY5?++)Ew(rSCen)S3ryXI)H}>^| zpXOSxv`pFSs+nTBJaOEx3sP?x_W-A&Fz4ppB}Jhhk2ZbnI+wTX3^$UtoRjsOMB};E zV2b5Ub}E@#oXp=(#s;%tX|{(l@L+Cji|-A!V)#3wXL`Jo66j>$izF?UWFcWGwsZhz zvq1ia6KS`!TDHxIUoyiAY9}Vw04a>xiAd5;EmkAtc0TJ`(P`q;TM+N!a!PAgZ>YoH z>%2|8^#=6q)wQ=`#lNn-H$~oONxN=~7o3p2o53_D^tBp11z$)~cQ2MbrMf}r1JC%` z%am(x#h>BtTNZjjDPH?caWUjcTKg#Go^tKKq1K#s?LAR1r!_U!3x<+>_KiD~QP)jx z7fFCmDb{`u$4Bb5x1{&>R0HoH7mUpVr6c%>=nq~{H)-ulaX2|Zdj@3lj z<9$3=0BiMiO`p@~A34)vA2p`uLT%RNmlf<#@|t`>oX_6AMg3NoPttoTHS$c0_8OCA zXX#_e$!=gBW%M~&UPtqX{BOxV^FQm(l29Mcj-kCX1f((27>_Zemp9{oFCC*xGs9wW zT*b}~qqvHuAPtj-c?_es#5Ur8FCC`SGAwF$YIkaPs_qPw*k6X8>@2SBbMPAKX!cws zi*IeA4m*U;j>KyLox|^evF8)sBeA&j-yf0kvzzdnQ>9w*IMaE$TnEek`+CHyz&?_M zSvc@Ql?x8MjVk4uC<9nt_?yebmHnki%fGIv1M-FPPA`$8G=+gE50*=}uH6#5#x_e* zo3H9?ukeV+wwBC_TLde}`cPa?Oh60X!aBU4u9lDSP&nO|C>A2ING?dFErpMC)+3@k z{6X)wH3hKIlvS&x(S5khKSBO~-gr{Jgsg@Dw#hwR41c4Z^wAT7;Bjgw zsBeAk2;!^=2EfH?%{YSd%DbtID34RrK|gUQ=thGu*zZSh48ce+Y=FxtA?Uz+7U^1K z9?xzWzQ$n~0Ee&Y)=>Kq(27T|1Vf{~6IR{j@yVZq`P&Efu^s6n*@4eKHNl{Ja45wQ z(Lw2HtgofH5Id9{4bF@MZbNuXrLhm}k-Bg#0OC6j?WG@*Bv-zB_3_F$B zzw*3SPdiNpPe+i6^}(M`u)46>4aw$7(QCrJrw>7Qk3Dvh*d_MytsSxR1w?#Wn$}fn zxSTTf+Yr;pB8%nWl5o$87uP?-HOb-+XUGQm-c8P}b>BOPB3*=+kcrQlO|X)@bLk-6 zCR=Wo2oz&DmNIK?%^8%r#T$w(y;99%ds%S%o;*&&o%+0gogD9{OixZ0Ot9f?uZ%e2 zlV#gS+vvq}O@3t}%zbcIrh^giijLYHu9D0C$|_pM_7SFG5Dxb_(>aV1$7@hKp#(=XC^H!soxQ)Z5T_zLn44k+mA>-?2g}E zZi#ij-#X`q!xoXe;-Ze;Gas2gcJe$Wtm;j%DnnT=lvUc80~kf=u4dWrul;h=US&CI zuQ=J|?z8;7$J;@>T)wWkeoWxf)kDauq6YK{Wua0ckGJ_zek-3s$*Y`F|9NUke1m{J zbEfyH*T-)zkOyHnJcsm0@E*zw;Dv}+qeSu>&5OmLzpT3s`fFPY^0!D6_bc*iyb^gd z9lu9P7oyB$TqMOW66$k1uaF1W#QcJL4GA zTPRZ^QZc5o(@C?OpC?qHH`ATsd5Y#QyshW!yTHdZMKKZDL_J(1w0ohj4K4XX7Q-H% zF$>3twDT8FJ{J9KXzAQWH^>)3qh~UV<{7gtv+qeuascUT_>AV#mo!hu>g0-|7hW~kv#~j-AZ0zrk>}C3B_tJ^z*%Xhs9g6Ubj&mU&=yrnm zdtp6)lX59IPV>!mz!RwoET|hLy%pd(M>__-v!U&SQqMy1sx(AK`Vw3F!-|wLEGz}r zd*c+{JbjsXFP$tNTZ~I3qxgB?Q{bA&C05tNJSJuk{K#Ws)@GgJ2`}dsm{1xD5&Al~ z8mKW@s+36_DPxMkw&qwdb&;$&vSgjzAxs5WUpm3K8JsERkz&}c3luX#o_FCG?f~@d zi3;umC^ltpdACY;_%~5z&p0clzLY20X~6^-L$lNjLqUxwEC&o4C&~JnLx?J}HpL|N z5B`3Rs4s)R(mG`+EWRX3c{Os+y7%`(Oh3BzLtaqJ{?NwOGG*S9vsq=JH!#RuU8>c~K6tBB6NMIpFndOh%A& zVx{scbB9)=k)Z!bNESdrj$|3GLgb(CraQoQs*$*ISS4kYhs1kkxi3oN{VE)KO9MH> zR0fa?WVt9?)E;LDIdJ}49ehi3{Cm*-DQp9AeO{PIu}jg7op(@lMEqFxgH`9CopfQI zxtt$0P$#3lBdgeW1&>kr+!mjE$8$v`MP;V=A(Ag6SprHQaV)A|S~w??bOxrdUt0yc zXR5g#SBcH6vbho)MW>z;CYxJa z*IO|n4K87|!TFnT>1UnO=r}shk=RLK6;7v~S%pq0&PO?ntZy%79N;5r-tSTH#)gWu z$0sAbli1WoE4cJYzLhg2`BSDOMWLF6vYAQ$hHlB`$G0z%+ld*TyvR2JGdt zD-0y5r5#Hzy!R!o$7&0k3Qdylm8?W{c~&B>v#apnjJ=W+M)8TU9Ts=;{gEkb3tyZx`W}Z%txK>%;kmsAlL7>kE0|z~)Jo&aUZNEp! zSrd{RS0@+`a_);fd=0FLIMc=zfuB>rwH%*VPranJy3ua84d#MwE$A!4@|?%He(|o$ zeI6%FS1(mRs-Gmh5A~pAj$}kB2C1;Y;2P8za8&f;FHW2=SjAs{69;baU2$sZ121mLR;M7Yad;Oudyeu!*I1I zIJLNuMPjp=*<`cn_(|*{Gmu7UrG)mU6Jp*7f$x7~mGh_OxV~vol85z8Ldg-lbEdD# zM(0HcJn!~^cr^`lbxZcy%f7$ao+cjT3po8~S>P%{qL1dB6zJ&0=#?Unlp`xs5hSs347fqMyokhofFUzf2#9=dt(H2>2fvunZe zdMExab^WekCdh(hus5maIowAz)=5I&L%ef%F_LTQxg$;3)8=(<#-0%ejhTMq+NeBc zT)(0YgdpGDJc4y93%(J&94^aq=%qx1 zH@6dk(<3R~#h5#Lt-0ZuB(_0V$eJ>}xR5=xo;UL)i@Z_CPe0Qsp@e&n=%i~L_FY^d z6`ezrQ$?{}+0&-8Kg*RV6}!J2!>UMNVgiFsCGhjrH5LVZH|iO~DIW-nk8w&ewvzJz zkr)pL?}jbXdq}Mpy%h@+Wxi-{42|7iG}|le!)k&Lb7CO+&|5V?cmo50&&1qxLb(jL z5{Z${iocg;f!ar2K*bSyBRTy(p-gxh`SkYDNeD0BH2n*dM_J~}REe^~Hs>e2UP4z+ z(;(dOU6c{&nT%GlOt1BZ(9~vYcKm$HIFyh47r2kQOS(ieAJzD8E>;vNZ!Mo0rc)2q z;V92qA$y<2ul)M?Rn(t{Y%n+tszI28vaWYJehN7Yx0UjoP>asAS?!xbqH{$h@6Y!< z|AciUCm#(4vStJtQsDu4Vb+O@$jHd^PyA$b8Wu-B0eNoQ>|gE@TP&XgChm`e>6{m` zSDg5pG%~@;3wJsxO($($4N8+6D^R{B*~1av2fgph&XqDymbhZKmbTTu6UbIu*HtyL zoxkD<2${uoklM%~U)s6)!9IEK5Kn>&y`45u#S^Qg&5cf`(dwXMhbZ2ECp6-AOY+i_ ztfP*vC}`sd=ub}_KkN>q&54tPpurU7>DX z@aFBsyiequr#J%Qk2*S}V7gj2apf@T7Ua)x%(H`7C$RBZi68Xt93eh50q!ci>Owkd z9jlHyDvoAaPYC3BAQp&grTAQMO}c9cVBw-_h6uJ9l6+motGVr}L2&1~|DZmQ+P;G; zWP<4!yQQNOZ~;z~k7BG7w>Bcj+Q_GRD`HJ~U{HQ{KYb-x;-s~W+ZI*PEspW)vYeOX zU-*%1C$NMb0V}ywpO`y<@-OM9GUqW|J~74*bq2BS3G(Q2kJVv2Z(T{t?pcCs*>$40 z#`P^Y^V|>H3g*fYQeXv1Q|(zn-8K-`XMMzbPo8mtZN{a*V==56w4^=jppR#wgkPq> z;cyeM5bA-os8{-O>nN^6OXah`m9T%ifN^c2bfYLt5_vQS(QJ>}ag4K%QM>!k{ayB) z2D6|Ozq<5vRV%OW#n;{$oguL=*=v` zm*SI%)33-%PBT_-o3Y8ci@!u7KN47UYNNNHWQt{6rh0_4D_CMzc~+6_l_iq!s&Ib1 zabrj5If_d$CW}Z)KMIRD8-}0%Gw++7t0y6t-#tb?vFKz%K23iwWd}YNZWMgTGd-#O zepdc=R@pyBIKkyW{?0b`ma=KQD>RTXl=|xr;Dpd zWU&b3E7&mkOazaVF@6uHdQ_^cHcJEL>}|IwXN28j;lX)0kZVXZN0aYAsd14`8_)IAgRVW>id<|bpGNki zJTy-WN<7EK3&Oe!{P?ryQ zS3RNPR3~Lj--jIBvKS110Qr*0&qJK;>}uh1qjm17SGJTaEx0c7J>R6_TJ+F|Bw=3T zYu#Fu$+F8_n+T(nY|%xy&P*{*#uOs$9O7F^)<*xYys#)e>@o~y?#vDU-AVG-Hu)~0 ztCF?plg@*Wx^^&|`)A1GdtAjsvdB>@0q}}v8*7Pkgm_3^2O4DwI(f|3aeSOJnbk4f`>Bi#ILxe-kVk2>Ogq~SOjuw0_T?b6LU_8-_gux1?Rpx60w*g{AtBX z8>Ec+rIAC?hA@_cWi`n0k771`*(gN1A6pqCkEIpz3RY0gxfFXlR+Wc>eBnnGesz`Y zj$Z`Mufg0lF}hIZeEw}8gRCjnvhj_4WtKPhcxEk{b;)@qO7h<8Y>%2*f!s2&Yu+S_ zIO`}*z*GRPB~&!Ez2y8=JY-Qv_|==`CO%}$H*U+#;D*0fhI!3nrEL({a5eQ*bC|(r z?O9_fE?HfMJ*wOk)hj!ylRYl#Ix{10N_l+`!lW)vxPs6#JzyEPEPfoV>-2@zl&>N%i#Wog(ag(` zK~KFscgNbS-+RLI8AT`Ng+`w$v>9o{Iw^a_ZjY+h62^0xT*+QR5dl`-beFB8ZiU7z z%0b!}TgrI$lx47#w>=rTYUNIdvPYWj+?W=`>0bx!d0#AnDrBoo7SHJj?I6t1af?TW zVgl@P)yazP{m9$5v#dvzds5VQxiSr=%&x}QV+wnC7nq~UW5G5za5dMKZObFA8KS-X9LLIwc zMLZbsy>3_CrRq6cJx;NTI>rjHxcrKTwyA0jH>>cT*Hz|t|AN|S;O&rNR*=prD)z%= zPDNU=3*O17P{%!}sfgY`DR^p}FL|-JABOz6&6Ty(x+1LO5)025CrpB2X<(;lsHE9I z)VMFeAwH_pigoajbnk4aRWTAr>|;fEm8l`DQ?RYa*+0YB^rs=l0&i2tMcFshxjnk5 zP~Asv>C=d9kaJQPRFM$Y{b`WIUNF8p^+CO8t%7I+y>of_n6aB;YNd%soxekk=RN+O zOG+BaP#0U@dsM3Nt+f2n1$*mdSX*knK3uW29-eBO)D!Bg9O^a`*=(4IZ9EH}Ut?s~ zIx+S(z}Qb{y|6RRFe}G<(D=-PlJ28vX||=#wP9`RfW+L`*zd@Pl~pIQnk?#~eJtwV z|21dPSy->M(-ZNufd|pyn@r17Z;5JF=hRTOl#TVBgnjrRuxjKbDf#&qij!Q)-{in1 zur{gJPdQrDIWtuC7iDcGlYb-Ta*DOz=Jsdyj?GHDc6DA1RqfTtGuI-;nk`=CDDE_s zI=dywd!eeaIr+)Hu90Fe8yI3J?mvwh?HMjqHFjsYQ>$?*oKB<0?zW5;UG23EXWpsR zb{OWSQCkmN4hws2h=8AkYo20#5kg2h^~qT))b%amaXeqw*IQzRn1AZEVUO`F73#Xy z@#vcrv56lGz~-50)<#(=RJDn_;qt>3%h|ylDb&Yy2;Z@=8L8Gs+@Nd}>iW(=l`@q3 z;p_TRUtP}H`|+;e#`68ri!J-=`4hrv_U^63ZsK)R+Vy;W`qThy4L)1Vkg?|?4ewYC zJ{N}9L`R?d-*QU&|HhqFP&PWdm9lb<1!=3a)nhBgvy9|_FWJieBFiRAHSTK^r%RF*nIr&r4{knr~eaZ)b7;o)b7;o)b7;o)b7;o)b7;o)b7;o)b9MB zeCJRJTq5e^s~d1pYTB}R*^l&FfJ09XlfY@;&~x3SQ%z!uzoB0O9eS=G`G0y&r>J1_ z;i2bxOEs_mIFl@~(^v~viAA#rNm}7(P5NLVTlObB#-8fh+v!DxSjvDae(@APl9wpb z9j=l;=$5ykdkj9k+~JyQO^vO^b6=aV<}8_y5oH_$NG)BE?o%E5$mushdcVwT`tcMimdSxJzso3#K-wz!}~qj?>x@m^~ydp4?2Ea#;=$DxuOS7hSv7S#W}K^jtykE%1UQE4|ipvV7V@4Dlw zs*?YlTVBaagCsyeh?G!;B!~h*%7W616zPZ{=!%OdAd6+~YeNAQ5vkI2DN+^`P>@A2 zKwuF>Q9uw32#5hfLVDi)&CEUTz57}S``O>`^ZD)aM{?i2cg~!d@0mGg&bg;lFkhO1 zw@@tR8KWZ-hP7_Cm3W_U(U}z@Q3tV;R!5wGTX`qyZM+H(^d0H($Va2I4d&7PnL1rM z*+H2Iw#P)PiIWOU+kRHhf{_)H;x4>CrhP#i)5JQ`<>|sqq+Frl;CGEsp1l71$C=r6aE``{{``(XhC(( zm_8+jQb4nyBj7x*I6f`@$Y)|5i7Y}Mo$*(jDy6jku>$!J^=t6FdH#7{XBMGdSowgt z3bOA&Udd7&GC7|&F>SOV>Wa_ITwa9Ft|OQA(1W<@JNs0+gT8So<4K#M&O^#*Hb4{D zznM-gyH6iBoRl!jn~N4?JN$d)GXZRUHHqIPW*%b(+QBL(C|nno3#D7C!>Zvtl_@?chHB8(EEQ zSmK=bs?!-kuAImd#(*lbR@7?i=G;cZFq&16E6&qCZR5~aG0%6!o$>r^4%Xc^n%#N9 z!S^&ft>9ECubIDms*LMUcXBu4;73=RJQ-%w{NOTiK{Ma}F3P%ANb+8E{`R72>q}^E z*GTafYGr>|^v2o}wubT0n`dF<_7_lZ{8gT7(gSw#oT{H~*+tfOud+@DxTbT*G-Z$J z4r$*a>X!taKiNRc)GYM0Ch_2H3ON5nC!L5pk)oZ*rt``~I{v;((9Ut0yvtQ}+MA8$ z9)7^KdOf+&&fRlhDxb4+tQNH1Vmu1TU(?#MqPC*S)9%g{LTQL04vPge^KB}0AnhGf z;pvk*#-#m1U;mn-HB~Z1BjiITGI`(8iLlG%Ii+3It0Z&G@6hK^i<8DYcqVIGkD=T~ zd+Fn`CHpnP@zxJtj!r2siX2WlYfH-$2{iA>k>zkLIld`%I%(ctzr;vf5BHkf2J z49yL2pD3alyF~qmIAj=2Ex65qWb*i%MQvIk@(G*Ve=)UEIubPKC5oqc>|(QaC$WP2^P#ZAL${-hnB#6jJ^v5ZT%lyR*=*F6?2=0R1m zAzN4bl-CxWKve9#MNlQp7d=ShPUG(G?(Q@Wjk`OIySr;6-MG8EJRa`u?k^` zGqd|P|A<-qq9SrrH!CYn-H6Jnd+s??<+ynY5pl1VETL2q4Isj7L{{aj*Y&o%X70fLX9Z-`~{?u-OzeJ3OBP_lH>JCcgAu&uEIF&9J`MP)SP(VMkaa9Ts)D_{JD8o z>`XsxG{QK)m9FCL8-|Ijd!g|iu~oaC)3p<@R(=;O`l%ad zt8kse7Jq%aL}_9~TAM_PJ(#1v8;-DQ9Lbp9Ft%ib?$Dc{bTf;smoCWFslyp!xyH{P zlABNLy5I~nQU>%9mA3C4PgkJ}mj0nOO!zXUzir=LOFdI(`gu9nWe`Y_;ih!=>+jEC z-`D2aCS;>6?6P09*;=->H)v*a9h(jgt6-Ma8YSWcHGQ8^h73!2qgZ1!e9x@e_u3HM z4M1$RI8@mgyrm=`o9saiZ^G<6AJ_*j?i%*z!%cq(rHh-EAjb~cUE{b}=l zs^~a76>{iCEG)wsCti9gyD1PW<@3I4yeGK$eU`AB_HLB{Az(g0roGMP980@9l?yZ#C)XyMb7a9~ZVMJjHBOOz8V&SpDGvQ^v zBGrx_KM5_lY;y3H2RW>oI)spiLaOqK60pj-RO#&sCCe=qfgRhk0GynQGw#N^j6{6(-|c&rEZX=T zE=rrY^4DlQW@CO<`q=ki`y>+HE4eTm%3z^2w(E!Z4IOp<-ez&m{k8IUnP3I$zVrRa zUD#@CL#^9CYwY3M9A!$^`f(c8{Kk+2;du+aS2565e@enJcuwyk-!ot~Fomw%g=SIu z8gAGfbCiCKnVBvq;7=(ve~nOpTz|^PHQZ?@0OjP5Qmc_I4xJJq!ErOBBVu@yB!cu{ zRgvlzl>I7EPVkFb^?CO%*|dLU)c%u!5p6jnviMitP>+mKxH`3&>)|mvV%D*PWJ7%j z@`i-K-R9Kc%E2)G`EKbS_1Am1ccezr$!bc|A;(v}MHw82I=s**XxOGApF%^5f z$3Iw&X0eT72|N#tx&ocSkR-RI4;_t-g=T-$M%AVD1E+O-*^4wU@AI5b5&)`om<<6` z$jM!4Qd32@IFkEBc~c%3s$Lps%z0TYV+xnJpP+&YnQC9Dxq@XAI&~=vie~{!*0`XN zda%Xw!ar2%9C>Vh(%X`hWVBfXgMxCeg9B0VN3y-OVrk)CL`BUUzz8iNuU5(>bN9P< ztn4KyjYTW!5i_xiFUFhMoHCr5XlUj#fmHic@~6B=WoudwYuUv8e7#1oZGrV_mS#Z_ zh(w9MX^7l=k|7PxSTy}r{GaXABEG$i(JuSjGE^E7rT5~?gn zq&nz6$)Ot%krK0JN`~_-;6j9Flb|Q!SE?(-Kb_ zFIW)IbeN@;Wx@)%WP)b4g>;qw@HY{9SF-YCe@Xc(T?%)`2+1=(Po|E8FxG zN3JHN#c7&_#=_ObqoQM#$o|`@nsD8!eq!Da;u*f;Bgo+(+}_lgtR#ad)CkN|pao+A zCT~*=1t{|f_aRHXps1B>6D#feoLzcfBv>vIon44G*b)6j0*tXgtj|cK*FsvS4ak5y z&+Ve#fCEqV-^tj~v9l&azpKjnIiMZq5&sC{qrk0hl>W|0c+i(H0-v2}{GHRe-967U z+NJ>ahk~e=Xx5oXa{Z)c>FUeX#=0$$uE&z8FxsubDeYdRCB4~wX&h05AjgZVPC4c~ z|4c%*o)Rqg!yGVBR?9FlXHUAqc&chsp)=z~*F|aZmq79pIt@Va72QhK92D-4vRD~q z)G6&N$+^IBGBHwGNUi$gq91ME>{k?9b~D9GA46=K%CwAi0`zKuMQ=vIRBf!&CUI`I zVG(4CsJ5%VjW)T`6rZ`-q_EvV%~R~KnZadWr^1P*redZ?JZq{_Q!ruUC$3~AfpCmRN-wDMrxPY094Zi&)On9aV4?DiWO_UOi#DUo);*voO7=--Dg)5 za>{GmjV%FflN#gu%#g1{nmR*h7xSG&?d_BMtllhe=v7HRP*-j=Q%+A7Nayk+rCea; zv82JOEChZf#7^9Sxc5Vk&cs|NulJ}FdPl(0XrU^33a+t=M{{qDC5CZ&_{(k4yFvHc zFq5mK{JeeKU@q&Sz{^-P-y_2g%@TS-Vo_;oZeHnN-zohHl_wiyN&ov)2I0ScH5cxA z#R9YLD0?(kK9}AkaJXh0J|n9tU#a3;n8jc8Bncn5xml!onxg!+UHQi%i~LqscsE?C zfFaXt3wf(iO2v{p5+81$AU+I&jpI5m++2}5t(`j8r^YPM`d5_7^#?MngexvXAkJtx zW$^`W|0n8jz>3hYXRK~#ApkocSNMdZFK2z;BzM0(Ob`dJEAY3A^bg2%)137zd#~lR zc4vlKv=&oE#aaB6cO1CI^1)^s%0|B!;2P(6WX-cdy4XIs>pbd0Oc1XeVpAXFkJ&p>oET-&JcU6qWHe+B7;kZ@ zEKNCZ7ov$8)R(oXz=sIrx~v&n6kVJylt2%Dbh^1a_MtjjC$%|m@q=7CW;H{mT=7jaLtD+M6&uQh?O zY!gbD-R70GqehAP7pM}dzAOEPhh6(O5w!T4xNWRp<{=r;$!1Gt8t%Dq#Q1B>wQhEb zz@fR0=D}fAy?XrPql`?yJ^+msGRL2q#OL}g(j7a~&!O=V^ee4WC3n9A&9oE%>7{gI zH{^G^@Oz;ZB%3|p*6z)J(Ja-pR-y}n;wcy>;0}p z;3R{56K=&wR|^+p0$d8#P_Hayd5OH&Nzg$KmriZ1#yO*hd6dZ=vYs?tM66fiz$5pH zzk9@$$*jN8?9a0hTwe`Y^Jbb&i^Twz{`>_$FlhCha+L8Fj@o2N5b7SkfqTQ1a6Wqn zSye5mmp8>d`!eh~_rx~zFKO!*xtR52WqwQvESf6nJaLV31M7S4Y}3ynZc~a}CxY7F z5m|0P0u#ky*t9+mVAEH_uk{k4sXldgK&qWbMj0A;uIe-hGnP;QZ!3Cv^3h{;?v(f6 z4~(18k=cGLS+B#HC&Y1_!9%nueqUBX>x{#Ut3}sVO=)&1i|s0194WbT-enEO?%B?| zG|;|J_No6K!3l4iq(P*u@_;v8*GR=e^O`_B-U;u&8O&MvEQH!)sTG?=bh)9*WB4TW z(a)}bn8QDgYM8Lw22mE03sf4GAX+9#Ey$5jcpTOX520JOtOy_{1sAj4 z@-CVW>J!3rBtfn)w~W5h88_1@_zqO61I!^c?uN)uu)AJ6$;D4ZPzjq&G=JtGvPRgo z9qKtKZPd@^2|9l2Np$K;B4Wsy917}ByGB1tdqfY}Y+NiI_$?+nFH7+2obl=D1bk@; z!%S+x_H|1`G99tQ_4*66lwcYw#hXj{cPOL1aP@hPgy9T3Ks5qHaD+T>=X4 zcf49=Xzy>O4!hY)uO62kH?hB^C=A&M#cj+hX2dq%Jw})Vse;lY^5X$y+tY(LHPHVGxx-)Uyx>qN>4XP$ z6onU>b97eeotW|Vue^>cba2`!NbQfBmQj}T|Kf-bCaXEfX-tYW%K`ngh9G-iM-vjM z^L&-h~!*LCe>`)qaPM0Y=M_ zw=PfUfoPxFuK zPb71f6Yx&zc_CH5-amHo@q^pVEZ!yCE>;2S&Ql5w$oj@04B2&*SlXeK721>*l+PS? z$#$n-FGyqfDcm#;%3FB=(dTZ()ub1=Ql(TN$xniGkoe&P{@)j~9v8lBvOnoK!AieC zH*8lCW0eW%pLb9kg{`ITou0yJib%f-x0rNd5{^UnwlQ-lbf50tmA#s;K|b+st!E_A zWFSJ%e;*Eq07*%r>MPF(X(Pqf&O$n&tJ|w7(E}>Hm@^@}oc++3Up(W#lVB@7&%dTXWNG$)uQsjgmcf3T`hjPoSs;@_(;i}Ato z47pB+u(c_)?}oBZ^U)y`IjbDV0nLlzB}IQlVxZbQrS0A=`DxB4Q*lVm$k)iZl)2c$ zq{%*}=HSjzeVSY2e&t;}6rvnVQj<-|iEb6NujIk(qA7kB&?bqvrP_}$m%!*8xR8N7 zpm_Yjwr+r=NB=OMW$Um+z5Y6{LD0~eKa$|b#kXJ@o-BujJICGr1RN67aLDIW7Y}!7 zif#tGJRBSVf;_{%x60KHZA?Wy!G7nwulrE&na7e>>4h_?8sTKcR3SrS)ff~TDk2B! z7LR#HTN1U@2bEEgUFRI(0z;d!pAZ|Skc+-=+axa?kDut0L?=D6>@}cmgN8v5i{GuU zU#RBho;F%N^^3xjjhKPY%6Er)ba;6Z8Ukv6Z$3<@#BY{<3I`Z&NgvVoDZt_kOJL02#eGT6G}ha%$UtO!p0rHZ5(x9!c2&zc$P~SA9%@_{98Bc66l-YxR0n zOYD}A+@V6F<|>%0_~nA$Ggs6S#b~uNRT=hq7fdH72|sQji7W)jeyn(Dgz++ZRL`9{ z<*qgp{}3uh5hU{bes?2N4s%*D^Vvo7Zn8(o6t;(njL^KHdf)VInISIGKtIPns7%}M z75Z#Bq+|Hp{2!+l#wlf=e$5q%bjK{$i^b`H2b_Rzpr_P)6v7is0nCvHPVJo@a6@D7 zUB&k^JOzYk@EJS}+II_da7nVmG6&uN1TWts zkpV3!YaQ{z#C1X1Ql1xm&jqzSWF!S&z1V1B!okh&nv=<`91(s?N=O7H{%t?7Im%KZV4q_CF)}iDMN| zemL0P`J;K-7+*rD z_}QSBijSY{+PAkVCv}-C)k^a&l>do8Obr{f>C4BPtL(Eyjg6chrh88>Jh>6bezdcW z?IuFL@=#C_FOqR{lwc-mIhjp5Lz_6)PY+ONNLxGk+YsJfxBt$Mw-Naohj^r_Ai!*wrsa5CSjhQ-lh`w(RAxml8lWk0MZ_8O>T zXXe<|m{&w6*;uRPOM)2jU1*0I6*&E-=}R*A-7ty?FI&c-3eu`tyNLqfDU!h`LjQOZ$g>p4x$BbhK*|+gzhU$#qGlu8>xUg>Nzd^EL6Gi zgf>WU0z9-73QVsAVwe&(!TgE7I{Q(6HYe|-f)v0h_5qV& zIy?ONm{V!IgN4-*k>e(%Bs0-^-n)J&-TnKt{Y~{a26wdk(>YIqtLt6y52X9r1_>KK zXu6G;An%?Nl)3Icr@vISUF`-%Lc3{os=%s@kKZaexnV~?ikU+dk3am1pz`+S30zCp zNAj-{v^3{wQ;uT=2&z(NXg72)Z$K3c1Nm!eF6~u zVv*=m;86njEw1EtaLJpumqP!RY@!~U;+&R&4w(l}0}5i3esNXL*JL(m(6x0MbS+x<|}$dbGvUdAYM-cOp;6YxcnozZFp5w?Wh)El`PF<=8w>(HHPpH3|aU!6tjFQg{yl$1%d^CA>%BFSnU_u zCQ~~BpvSHu{iGQ2!4=93ehvFJWkPrP#Q9Ax0bQXy_qu{15;f+i!oxpaTIsU3rSS;U zmobX=^C*NIuVA4`#*QdzwG3nYu&cS$@9nz47lH#kpf&HvvvXowV9U%1a-OXbN`s4_CQt=}=nxvpi$Igcmf%vOp(D%JU*sJ;#V_ z@A=ZI6cf=v7=uHn%^Mk)r2Plx38E6LEdO>Kadw|G3*l0$-J)k@fui|8-{K1E35*3; zBC+>eF}8=J9J0UhnT|b+wa(`RJU{tFl!fpL)#%*DUr$!HW!v`na%!>B3nSn~3mW6sAO-WvbHHHRIT%H*3F?i;&UT;0?B#DvurIKpp=yBd2){~^P>DD}R>fs53Z zh6K1usqe5=ec9i>i`@>!6&JMzKg(OLx&7D}hmIG>@iUxE2^p$&xVKX)eBO+i@cR`* zOsM$J+V)U1;|eyuVQ_zqve{=xd@Xk_6B-;~N%-;QJqV%F@TxF9`##@6Q(f;Zk)1LM zkp6AIEZD3o;K>ncMs@fyi?k--JhVYNO@=xMa|exNAn~5UZVDZHxVUWWS?G7so~w)Y zXTJGffp*f7xrK z5^TEU_&lM^vDVdRy#jP_bJK*wyoQ`>2&F>i{@@kGe?BOh8gVkq%W49x{Y5$Y5TMwh z{}ZtlA~MiD(i(&Uqsw_PPpVSL8ol?O<_+b`M)&jcVpA>>LmCHcr(#vR5ZcTQRZ>8L z%ovrjj+EE))(vy;w{~aZ$S_^p{E}fPFghDjuQOpMAegkh{fw3E5ptwCu=LXU%I9#w z-jXOjgV^(qR}H{ddz`N{_Rh-mIcGmVXf^6FFPHEERh)jUWS+Kt8^@bPER7Velwdi% z`JvQ)_x5%scG(J3`D3+9cSv!|Gs)jxA>MS{!>06Z_3e0q4g6Frbo#i|XAJl9O1N}w3BYWq|I?s8 z{jBuo`-DSl=4)Y!J#Y2pDvY45@Rc5RfCsYq`tZ`an#EQQ&&T^w_V5SY>!Ivt%EMLs zs(|JYgy6;k(`UlSzkzT!7-G$O@nYevsulEYWQlRI()!lJ1^$;im7+@F>CdTnmqXz3 z^I#H+9YsaTC#`v7cEhR-GRHbCxo_F30`DRK|L61|E9-|x$C8X6XqZ~Ha@Gb>;z^X> zw@n2AxWGUt<23OaDXZzaa2mV*dY|OMXy)FqRt~vQNKgCu#avh8vrkgjnf2L>rWl z!9L)S2#{zT--97NJR){38Cnp|+1@J@K@;~(^o`HkuUlPL=VRF3mL;!QhKuzTd~Ow- zb28*{9RC~sKNy^R!n=*zAzO412AtV&2odfLb<>f9AM~H&2=>4ef6`}-jT z1O|p6`w$z@gwpdV`_zmGi}v z+Z>H)REuCS7SB$h(!(5%r$@kJ z(uoX4W9F+C%PO}!o0q8;!>d*6U{&5Qnk$0iuwTQ-;IxIF%;b*1V$>0lk%4WpTSe1p zwt=eFZ4KwLUlUnxvCr4X|z;2S**mqzud%sxj%*QdwmS^e}57E{CMA8cjylL1_9mE69i#AlPAjJ zd2NKlW(JE$$cGV*gb&>xff9jAF4gmer13(T3XAu>6%M-vVk{v))=(Ti%>Hmf#1-%r znM(c-*ml6DpnMh&DwRS8r10A{gnW(wZi)O~@SmlMVb=2{z4xc{#zV2VEG|d#e>iQi zCUOMvk0$;?xExP~dEFiLzCGXV4ig82=K889i|%^eL-L6d?@?$uxx0&SfO6${b2L-uXTF|v>gz^X}i?3)@*CM z+2K~_|L(m~XAEJt(T4i*w2!jVWQ}gO1;G7yyHi?eFh_X%nqTL3uCdZ$k8igPBy_)6 z`4;f`&V8}bj_&?%4XV@QDqPU#v1hBx$9Nm)R~PW<&*QiQMj+t%9hs01G6ID-oLoA- zXSPs!cctFc@$Jcp$7v5TOTY_FF`EynR4F%{-EyjDwb62Squs^v-hfS*5c9&$J4uCxqE$kDChZbh6(V0$J+vU zK{#v!!)9ibJwca*fPhaTA>Su3VqyQ#uUVp6S~#H*5&g&0xx3@(%->N_za=FleaFOv znw_2fj*bpdUtj+n8yn{4<|Z*Q5iBYy%BWsTB$?vHFdq(05lT!F6ztf-2K((&QnZ3W z{jsMTVl(EtJ6&U`y-^eK%JlEekHc=K9wN36JIoUp%htd|6seFV$+f+p0PNu1w<}8B zm0Ug}heQ6%K4wP^@O*H)eOQ6(E1SBg&n^j*D9>Y4fp2D&FXwBs@@U{c#hlFfjIy5ID%0>l3U zU+UI*xK9|Dp|x>f>ko0`i2dVSJ3!zDB+V!XPFESMR2W4gjrGfWV(U0X%UEN4ptv*n z4CCs}Z_hM8c4>7A(Jrn+QL<&rQ`&_GVajt;Zv{fx9xE$)A~@@*9g`ng3IGhrF-p|p zuqEB84Uf-PCJAW{am3RTVSqIGMy*vO*1Im5vLb&6=Dr!23)4sLnEEGdvX}p*{%K>x z0cHf>G)0SrKGfsSuxR@{s8#K@8~K?%v;e_i{m+%LJ&ErG7p5zk9E*?z>baU#87HcO zrHhxlywn}eMjhcbsIfP)i2mR$o?=cL8`&FR5%H5`XOS(R+>`FG-4Y}9iRxz*PSpbo zf7~Ckzn$M!WI5?n4Xh4cwSz2T;8y_X^yj!z$xb+Tic z_ir47ZlfOqHblt(6dmyX4swJ^(bkUA7xGBT**?@+0Y^9k`=Mx)t8TLuf#L-V5$f>^qH^ ze;%YHnfm<^wL^0ipPGa({WoS&g>=y|@ahpWDzl_dN-(-kQsHj7S6m%o{|$&B%?2Bj z$KJNnOwX`Ge#?ddMqF%`fVg`WrL@WJB~XG3s^E!~bpi&qDav<QPXS=GEKEG*LlU z&?i?qD!UWbT3CdK@R~n_>Q{F>k~OuQN?k(lXd$m>#VIWjHJJha2uRN>c7sI9U5W(D z5TDna50+&b=x4$!)P@aK^d$r<{b(?U49MDOo+!HDQ_HBSr{a-!DdgFCg}JI0Lqp%l z(3HS^!ry(kJEc{Lkpt$-X1L)d_&9P8{#e?M4-OuBq)5|nyM9)XC&ouWzr61l&(uVZOZ#nB36L$ z+v%BSvkXj|`YqDs4o`>HKjLr2i{W7+^px7NAr0&b`9ZO&ND`Q13t&qW>33hGC=LY4qQ`Lkg$HEedl>0;vNSFI^_Cgh@&rP^#o4n6ses{ zmC&WmaQ$4Q>Lno^c~idV`4LCx-6W}ttE-qaCE?in8TBOEw$09kL`hIPQoI>H&IsPD z&$dh`p+X}CSl>}2m0+^^m6ox` zN7v{jsGud1`(siaWzij#csi*yIObSJWty@@sp9>fc8(S$s<_*W<}=9Pkb)Pn=LY{4 zc?;Q#`4UpWEJ(ccnucWe1k3@(7=>uIY18LI?SC{gl&DFGFg@gv57cS)j zLT4GCuXsi>d)aLcHe-3n+Pvfya$*RY*$59~h)oBwFp|rxkl1^(!;lN83LY=>{Ur`c4YC-$Ng{gp`ou)2 z-j9l4N^B+{A`r&eqE_FSzQzkB4@$i6bH6X526UOgg49~lYGeH!)5q@^Fb+YS!T-1h zAY_#G1sjF+3jC?LV6q4Kqe_jMf(>#H)|Wi5$UU@pCM+DZ+F6nX)8Kq^wf0IDu)j*` z1_g0gy|??@H5a8@*3R=-X-+Abd5~9xA;#pba}11#(i6VnyIrEOoKeJZAU&LdJ!pCJ zu_4(TN*rw*!umAFFKeT46)uB?Z8YZ09#8YKNul~Xa3EveQ0n&G#u!5B@v%Q;HB|Q< z%pD5lKMo`&ED^swF<-C_&oephJSY4@D!mgf1prO~gp2RP8J)Cr`iB+!J z^=S@U(2!2fTvg4ZTAuwiGz`bo3zvWLo1$P9_rWupe7&988*ENpLKAHII3<0bo> z2ew$*u%8uiSlUlKy(sL!Y$>^2gldlkF7s8>sl~=Xc~H4SE_Bim?3yGc`iOJ1$C9MB zWvl1`C9fYP8e<9R)0^Ag$l19Fl1TRy`kG{L2Jw0AfSjxG2}kg{xQ3##L(9$s)t+|P z@;=36oHG7P@nDb;_?w*c@9h)T>KNwYpGJ`GAv$Kf@_Dml25iT^5gG|X1Z?WjrTo}N z*6crOB%S=5oI|i?zV-$jPNG7|44(EdDrM7aH}jw-t}W-_?UKraE69d~9#sMh^fQ>9 zThV1s=Hce-^BQjHw#lO8BNnXl*&(rI= z5TNpEAYAqIKFN)hyAd!WC6u@x#FRO3nQOIn#EoC>8p`EWdPd4$5wk;|tc80-tw$AR zre@Ur*W0@~{q_?`1Lvczg)#hwb6gH~XftRh^N2CUw6`9ji5Bcw)Bv$SKN7IRJRM$A z{`jC;7SjTo&;0HD=>Y>nDI{jvbCd3)?_J)-h^f{=aTEq%ZV~jode4G7?YdBjts7;J zjpIq<4Dlum1KIO)(lzJY&J`1Q#P9>|0Al^%Aenb(nE@?xaDpn+vQNnbe@1blWKYp| zZ~rDxmLb$$9LE%~FMXjoh}kon>SF($QOyv{jIoj^*WN@{tX_iO<4gR@8c6qv>h!o2 zU^rcrHM_{TYRTNmW$J_HQ%c+0=~?93*q100#@v|zVL#_HfticC!bSq9xfRmB@~m4uaG;%nrNaDxM0YHi`7lL<%1sHK5~SgKB7(0@E^+2B>= zC~yk0IE{3{k2|qFMzj7UJbu|pE6B*3{&a5bo+&g)HkZP-CDJ5+ggbus&|t6YZSg%6sLEqbn0DNXM0-0k$_YA zj)L|g=<$m_*L zHLq?5bIBj3<~bcs2?*p$&z+-5Z9fDOTnzgq&f74|j#a`eMr*?3$4erMKdDb90WvhV8jGywerX0)CXxG>ngcEXRwzVavd4q zGd;ppV%N%rF*^)$hj!z?>+7V0e)+@MJ8{WcjYqSI4j7(9LHJ5X*h?t-t&CSJC~4U5 z+`<22Pg8Lc`u2}t!PJ@MisPA!vc{7&|TU`4U#tYD%rh=zpwAQVQbkm%BQ98aV7f@Q}V^)`+3zh zz2S;s+*-+J$h!4&dfz9fSUu}kgcP79PP~uQjZqjeNiut_?U=E}Ca~`m1Mnh(P7|>V znh7$^hSL3!BTFnNBxIf1c~B7}6W4j6mK*@Fl}WxL@@rjd%CPB=ry-}y_8;yaH9Rdl zGk9oT%O6xVDf)}5bik<)?z7tXr?$uh0cAqxmG_w71H;HdpD6poinE`iy0J?=8Gq4L z?U~oUwe4+xJhS3RZ=7_BU&7ap7{ zuSAt9{JpweVI&FPN9$*@pR^jvzlSwm@b?(<&Q<{UFwa@?#1is=Ey4)I;mykud#K}C zB~C%H6^nqy0k+IsCS)-;r6KmUjgV10tnE2d!+?klJEBR=SOqVwpvt3Ef&P79J81&G z?d%u{-(WX?1EHmNGX6iJQesgjg)^j93f-o_P3Wr#kfs^4mBuN;-#qZCKhpXy!1i+l z>Y`Hb83-TdikCE_bKOx(|Gi&!(|jG=S1zd)DRdrC6j-(yLmvg((jC;v4xd8ny8~Uh zmmGVtBI(V>ss=AP+)9Y4e#HSE+VL&4ww>(Iu}M&5c4HD0yYnXRnP)tB2>! z7Bt2El;G)Y!Rp7rqVjvL-lcWb9aVV(O*^j17$rP)`IPH%49{4WRFgti-=$7OFN#M- zXZ1u$Qo}v4YoIi}w;I2dS^hKcAIvcpOAY=_*WysS(!$41yxiEDAAYr_`&vp{F^I@E zw&rc2$N7|lT;!_ko!Z#l+9>L62Dq6J8uRE)%ldr!MQ2X;ahu50orgR&LJ`+54Rw1D zLr%0*O*QDJ`S;-mcOo{Pa=&x9*Q-N+adpNvPKh7Im!&WFI}nG!5PSU0XA6jS?_v-C zTO_B!llt|R++8`&m}~A+Rn2XOF-9rJ*sW=5C|vomWGRay0%GS+&n9b>C4J=j;^emE z_>UvDdTmDZW(&*t?BgEy*m%^2mvHz*MM?2!$tU|=AEZZ4to`+oDqoxzk6-)6G3i1T z7SizauHp&FOUVURe{8mEP&6%$D1ZPAJ&Rl52M-_2Ng!RYc zxldxzNC?IKcXaE?rU%G}EOa3d<#9+2olp*&;G~s}B7^SM+*mUd?`-2;+nLXJ)2i+(QLxl(50o8W9 z&Kce4c#P|(_DyU03i%f3nB?+~Fa8xHWv5Y1!n%|lbAIrZ;27|isJOv3HmykDadFy$ zce!^_(qVm?%;8Y=#JoS=-a>1x&gRm_QZPk`)ITm`T6*d+ds<5a50%^K;K$_zYi1#m ziQ2@-1t*heu`8;uIB!*W@mwiEH7T4$L&Vij-Sm)Oq5UoRQY)9@y!dAVvXw5(iZhb& zsWk;`_`Iw2$YMp`E(po=!yf630$9_-e$S1dL17Juz06TMIMB92evxSB1f>AI$@b}Z zjC$L-@sqQxY0~ly5mKHp_&^aAC=D2r+rU$tFZIG znvP^jhQspeZjp_>!R&cU?pWa4OS5@y+rl;#LR;a1#>oKkW6{DAnHJ@8bF2}|b#tpU zvtM=b$&3f&?rhS^KCQvHiF{ZDN}Ae2gp-ilk1CG(=_@=`I-rxOLL#x{%o*H~Xc_Bi zWZgSPTaoinpOAAdhlB6y$V6UVmoVN~P~t-CIbuH-8H`d74AK4ps+8YK8RvTxIuB8W zX4-3mpP>zg^MTPv$sdb3Mp|R6!a+=L-guT=eK~7eIq}26n1&CwnjnQ*ip&Uu)#Luf z{_lJZcI`Pg&#CVr7A@K$VS2u2Y4qVXujrbA3rQX+Bchy5G3BD(d;U z^(^p!Tk~5Y?L$=A^lvz$0@w3>peQEzuY(lTtpxI>UuDdzs4Jkust1qs6?}3Vf}itM z-Kg>!%gjX3N=<`WBelmq*mY-$(<_MTEaZB9 zS=f$;vZ;1lVUVZL@ker9QCmo;`|nfdC3qMI%@DUyj|HIA{7(~Y?Otu`f|GCW3p5f0 ze^Cd2uHLX3GyAqaWs<3PuZ~liZhw<2|Mh*Xf#uI%n}2141V)|ax{W!!^*S(9%WGPm)w z{TQ|#VB4kozn=+Q8)Tw>ImXJJkenf$d3T7j3$^(4K;&guX&#G4a}H+OenshK!P!je zWkIYlT_gOLZ|PnxFs~FDzB!(@Gxu0`zq}@x0+XFPeh8&MKHD zkJdkA-PyxdFLGNCq;n_5R2iM(e+%=QGuKB>hGZ2D9^>8C{nOH*1_-&`ht7Pap<8@5 zUNU@h+r4n)l~urFLIU-4H}1iUeAx&oeh{afJ+GmaiDwc1m~H{HF5;Lor4U?C`RsBn zdRYBjCis6$hW_8<2Wb1Rx=9FP*ec_~Zsj>bBN{rPf4m7tm&jXuSD&RN{C1Es^!=9{ zU&yW!AXj_jH-;Bo>~I0%2X?XYRIv6;ptO`Gbhm=}ryuX0kfTx&4O_m7XJf1H)$w*3 zMlM{&v9!kG3I2UHetCRTU)6Xe{;Bj3HgM$ z7EPL7Chn%yRTY04XFBCk+K7hDzSI4fdgqbgxf1=Kz@x?jkrW~ z^^a<)EqfR1$IxX5=kyg^2F5Hl$`p2skA9l^Ifh7IcT{iy^_7^~`Y47jp{eiG-UeY` zk4NHmX>8!y+_Db4q}`CJMkrmMga4JMz=Cq3Df3kxURQ*MGO~bE)8j_5 zdFOj{jRRO=Le<&nWn<7V$p+{%&5%%3ldxgPH#CmUb;r9^D}HIHhE=ujtU5HvXqXy= zn8kSio;IM#83exx+X}cqp}s`vrWc%9K1%9q>Q|yMJpSt1oJPtO9Xl;(a`KY1z`d+TFIUQZd^|D=jh!2S-Zdg4pW`Bf_*a!cHEaI zFnpd9S7NOh7LsYa2DxZCBVmaVaLo9r3Y^eCRdFHuAN%hKu7nHFwPauRm|?;=h-!|` zglORJk(52X$m1K8^z}-JefSi(#yR5+sD?w;XG^}E*p~Piy?=Kc^G>PNL?+>szs^2^ zV|02)Fy=f{kymsVd%)sz?*1TMik|K==0icqN1V>0eS?8IY(CH$>EaE3C!#Hg*JKmP{A=kfPoy z?203*^8B^{F)^*p@pz1)*oKC7i=$_Ck^zg!3uC^^r5_izbD3!hvvnJ}*vzTqO!|KTVnCh03v#l9`RhP1GZU7)L5}RA=s?C; zG3tfqkT2>Ly`ZRD!>amr@3@BhLGVkQq;NEVdQ&bKPqWEr*s0>=Py?y<-)c@iF|RDh zIre+~hu%8)!gtVG8{>Fxl=Sdtme@4rPTJQ2%1M(LZB<;X8jz6lf{lxI65AF8 zERxPoTx=RfIVHN9JF?e2Hu@(x;}|C(EJpo|cxmYRlw*A3KcDyfcvm<^pW}-MQ!C_P zd5M!p(1PDp4%czyFgXb)wc$6eEkp?(33#8=0vyxt?$o%}y`FW9 zv_}mMOR4PB5Z8H6Z2K3jCDzQ`kiFoXT!5L5a?P=Llx<@o)@R zY(m=0z}FOEvl7o_ae;?MzCPaPoK?p1XtrAjt!$k1Mvc=D210dM0=h89&(sFPIi3yU za*2H9vjt^q*m6lM*m(jmrZ}|prIQnt5%YDDMZ9xE2m2SrOx>rwV_`e%!$;|IQiMX2M+$7Q)Y})$E=tEJ2)C zv7DncfDe z5%hT%6j31r;h}Rq3a>R(f;q>ttRSqtpo)h0h-!89YKMwq=_sq9gkBdCKe~yu|f|Y`o(Tlt3~y!&$zr?1rK?#1#9m z01ijQ!rGzyUwb8<~<~P)BqJEPX z*7KhG$-gJXsM0y;D2`eW%LrvQ*uhb5#(7hPQnXYKj@Bt-k+3WQwu6q#dLGU*jHqpONA#-ziMg<8MX{u7qVFq0 zuoPQV_YTCnA?!VAl2zn9cuqABOO@fTB9EmTSk_~CRhwzU+7H*udHR2(dNR(Vc+UkZ zPKw4|0}|NG)`|qIj*(79#ZF5inw_;xc0CxIU}Ty-KL53#}Rbbw5%ok zhNzz-o<(ZZVL4zBM{P_}WC?%9=f+vFcEwW9>0$dA2eEcgw0SQnZ7ttL(egu-D{4$l zSq<{PtnocaEAwG2|16;&fqh5M*A6){{gT*#=Ky){lRHMG^(C@$_{48?w%DSB9#;I_ zBszoa^?bDB__;1m<1sBA-&N7^LzHWNoF76}uRs-*CaTcuE%l*N0_E6n2tQ?_BrV@3P2JyB(fvb|Yd(n$ zVc8MA)5Q`HJY`{B&~G$iPvAMPMhIg-9OMB*>Ey;lHZG3rxz}}F4_PfV(gId@I>Bw% zKwO{w6hGovg$t`+k#bIi2Eh2FywDo({@?>H+317!cr4qOqo?Ci&zjK$@3`{!`FMGz zpi>`?+Y2xl53*}Ry%tdU)d4lDxgktbwRut2sW^)tzH{aCLFc$cGH#EU6ng~i zn_MhANvs2|8G;=Db`zg$g9xg#*FusSy_Ki(;{6Lz7jHvta`-0sLiVz|(^XO`2>~=7 zR9@IoHYusUrF=3IAoJUyHb0PEO5j@nzPUK7Xee{N)xT1VG!6=1-Qf2tt^29Uhj^@b z?&k7rO=DD6%)hgC@r#m&H3F8Q8S_#af=>K%*ykI<`Y%D-pX?%r8V$@XHu}r zr3yH6DXM+MsL{U0e){4YMMBAa$S5OyLRF||;qm_Dd$P*NNH#mLr-XP*{VcxNi}vt% ze<0n2-C#n`oO1 zO5?nBLy1M>FJWett@UqgGWtw5nN1pEq8mKr(fCk`-&GwBkYssnnU%Xq2B%O*QpunN z{{G2J@vCQ%SW%X>v#OWSx1?+CWcsty?Of9dz0ZX0vlr~5+IHaDmKN8@g$Pg0Dhn-R zHXMB>8&2kzbilgs2bWHyXowYfdEd)1)mTqvzD{CYr~{`#ql5{0>|bQ_n<2qahz!NM@A{=$Lg#Is{pV zcHV!0{v1h3<@DVVwEOf*`I(iwiTBrNGYQf{?papx-v<%i@lLWofMxd=%Q9zX(v@Y= z9aS@_{T|9)6IU8qs^vhVvL@O)ayE$?97P_umPSS{l0zRD$JcMGW$C!xX^>>Q(@A2> z4CQo2LpipDBzg#fcpkfNVFd3L(MA)`Uq>}%R-VbrXX7O)NrXo4C7LPJdlMw-Elwvv zhmBAu+oh~;xM%2izHokmjjmpHIVE|roy1OIiAy|_Noo~JNbV^voTIL=I2}oyh5WSd z%B@?I;-O{p1O!rCzE0hRbK#Ch>mnh`)nY3G#Q?r0Q`gYa@g3 zes|`&uFx%^cdjZ}=V^ng27W5mxRURhuPd+^tR55ccGbZ-+mp`Lg{WjoImFiasdmF? z4wzf6dT#3diI;Bi(U5TJ4VNg5X?MG1jd+#fPRpmkKOg_Z$8SnfH>=9`;J>W^ekSUH zRqoc^6dyY0nHhWY`e};PX=m~6lm>PC{Q)^?B>uC^8R~#;2pf^Q%=yXBtv%{C=(yHwU-6A4h@fY_227dko)Y?yn~1)m!L88MAp#f@$q^_?+LC+##wS{Qnsp- zd4E7_M4!4O`JNP=T(0jPAw8<-ABrnYGoc~N!rVmsg`T*8^EUZ|nV_Q_CpW5*G-ZvK z$Cs5>Npl8_q&_r{jZ9sZbgx~Slx2GqMb#aLDO?_%;VyBaj4bzLk|Jz>h}jf<^=k=I4Bd6Z2;L$WU@7kp zacAz4uBVJp+8^__&Ui~}NR$WeAo0zI+&O`Ccp`9k2 z){WrK_|+RV&D0# zHQ$FXtS@}Vw0L`2NC5q1*MjQ zg^}ErKwrM^N->IMRFb>1fBPR_(vTeaQOJ9jL%F(fFJ1#W1OHe)15Z1K^d04foHQk> zGrS?GZ3B8Ai`5eynuaHOmm)LT|5AH{DeFsqXv#B)UC>RST6|eP9gneNuf$}dPf$i* za;f3(PL?CmS~ymCe+Exq~|d8)rZ^ zJEbj28+MXfy)=ULP)gcPW? zxY1?uytZWxbg$V>md9Wl(K_3RPC?pYM3+JvxeZsbZCdiaZYsw3d_G$K+;cXPC9-nJSXiy#FC7k!$$bG5kg=4%zsYmGxsE) z`OG|TB=VQv;Qn$KDQR?)RoY!;@AfmryX{BbZR*)0Av@Hf*|ywp8Z$V$ldnUm*^p&< z|JzHFn}%}B%t9%%+j!{B`F-I;Z+W12UPn$3&>R*a`_}$D{N+xvzg+T$i&kGb>4oaZ zCzYJ6es0Pa|DKR70yik4#7B@l^r>`ziw7U4j>@VG^`vRgP&c1F!?o@>pD%UnFvUsk zLMu$qdww7O97PzHc0guXBxYdK{%xd_V_tPZ@v4))X^*Z_$?B=iJMIlT17*uDj=T`+ z2o2J?!ismcxGQ5V`P!3~)Z%t$4$}R^?q;W`#X#(5WP2%3-v?%l6?yx}V~Jv* z9h96e_oS(2l#9h6lb)^6}GW^6`_$ zfuh*Ds${kbYVsC{7EG};W0i*Oz-4BlY-ZPCxAexlE|0pljwh?k0&KFgud`M;b&%Le zCZdG4Q{P;p$Y(j~sD$ZlK&B@Z9g|BvR)aWoB#td39(}nV=O;Vo3VTF%QN&yqyIgEu z^(?4`3aZmX15t0X%7=YnQ*~9b_685QSB}Pz_?2|z71Bkr#jd_*Sx_#24Jcuf9xWa(3!UT4W>N7(%17EhQXBst@>9l9wJ z%BzePD)n&YFfJ3iipompB-!GUEvx~`qy&rgqQAdGp7`8jaR<k!Hko^7B{GZn+fM zgeWVU*)D@0MPS9e8nU`9E6O5YS-wi}H;w8O7U*k!AUnbl{>L(R!++o(Z}^peT(9zv z%bd$^J#7P4&U?x}=6d~3{@sUK*M8EAY94|$=&0X+D9CwlsjOEj-Unm}WL1gdIXG`o z3Cp2kq9f-%DHH2#NRYF3|Ce~DjVkZ7jawe4Xw_cm4QzByjLv|)^R5yj6|O`19+mi_ zW~#Nu${}SX7hqLSEbHbbDr4|zbneF<4m@gnecCC%9X{Q^Le9Y+a$cNfDfFr z^!>{+CvxPXl@p3&p_66EiQ%wwPyr~K&lUmHOf~;o`Pj;zJHtoxaQH3_K3d4{8~Q}D z+pmM)DPL=}6XcGEr1-bM1CBp^zpu;z-J_0Tv~n_BlFy?dC;GeHij^D7_gX1Rr&*GD zTFuFEU0u$}WYj{^w1o8O`Z?=aajN1L zt>b;9B%e@Qt03HtePvZ(!43t*(P_+5l$EtHOy%vn7LIZ`RfV6Dp?i#WuRawoVttOu zsEQS|u1Q0ZoI$hV+Cgu$J@@CXw`r^$glZZz=BO;?3xR$*t@^(wLluTLW-dwXp+gJI zw053U*qAc+ZV+5~zx zWR14vz9}(+BA~4`+D?eAv(lb`{v#yMWHW` zHht|nhu7>3H~Az>-jbO1-QK>H0R(ynQ>?3)q4WQG+~PfV`4ZMF`FeVR_j^HPvKX^gi zq@^##_4w=3d($bB5^0sq=F!pm-V^td*IxJ~_drNm?jJa-rHESGV}xI3q+0S>wOscz z&|O&3oh@meQolH-+s*bmRuW~8_wif-tku^geNLl&e;InPvpBcU#%rjf*>jaFzO{uq><~UX0#NyI_e?-d9Zo+R) zm1@P~Oy}ux9W49r%Mq^v`$!sQ;lK-3E;#Tus+3Ej3}AWTZ>|$p_Lm|p|GK0OC>P2* zy+n@E6b7I^ST5bNc1!FU+bl_KzACT1A|oE#S~4px5v(BVO>sRj0WEk9>+pWMT0X`@ z;dE=FSct?TxgeFg6gkpakBIW{2ff?Y6u?GNR;`v!kN7^$BN$3o<6K|R6TB0hwp79_n57 z6XZ`9!%p(QWCfiC>u#MA3f@wp#EO}LZ6yr!9u+rv@AnvG*Xj)JYl#0A##nB-7exz| z?6r6GS~^ren=JqfORaWlMZILU80|I3;%`?dzg16|?(>%WGUmb=UbmiS*<$hRjVI+x z$Z7~+o7~gI@Hg5?A3Y%m9;b$a+Sb>OAkK=QKU}QVj3YR&yqn61`Zz@$^c9DIZWIWE z{C)(-5R3rB2DqFOf)2c8k*`JOaqO1iYaE9DaQLcj4b>k3t$6fGFf{5je$`zbpZqzP zzkOgI+mSw!9r)~16AZiuhf?ej9h8>F@>-e;u|vtx;K(@OHkij$8hgVYsf!2SK^DX7 zKo*M2?FMyb4XVhBAL5Z+x4lPGtWx@zgwEg!x_1oNpLSH!C2)IDEl2qrRh~-A3Y5=T z?aNdZO6n67+yBQdX#hM{;hX9PY%oQ{c7*NH3v*5WPQ>`I*S!6X0Dt3x_)lKl9zuB0 zeLQ(e(?Pf$OS`6n$x=N0V#kLzlgs`JQq?`u7yo~5Wec6ALP!0D(EZb}tRFm5p^I?~ zW6|Vsse|K){3Rn`79aDKVW$%NSDv@(X{Slx=?F5hKKRoKRu?v_A^AKhdQG_Z^dac( zvByplyTm@ewIg=EfQU~^Q@cnFms7@m8)E8NJzpGVxKf30BhXTsla%$)4LK0>v1Pq0Cxaa|UH@@rGhcuT=BcUKZSbpdF`S zPQBm1PLB6erY9#0CfM+{S9%=D$+GREt#{@iAAXgVJ-{WBxAIuX_MYP4ujb5iBz7Lu zAm4a3r*{sF*sXL*ycFb#r;$*E^&zj{1+k|kxw!21iFx)`&KdkE7o@t zeTSc?w{Euu?{VVDM+}K9er$$H&eRiw?ef*fj?WUXhI@_PSFZ3g<=2XwSI*m~!F_7| z*Ni;H*hhAfZ#2%FF77`mTFWBQ>4ZN;dhcQziWupDb3C=!7QBN-^h%uXsNBuaP|gij z%KhF;I|q7KFv0*H!$myg^SxMX4!xOz^DvS25)}L)B%4-LQa!l9eQXE)SOq%k?Ep?g zhf;fT0_Bx#%4*l6xP#18(lhAIcXe)?OYQX zrQU|d^R06Jp1gg*P40z)j1o-Ugysu6Km(c!3=LrS_B@vi>0;c1x+d2W>5U{^SSgBD ziieVNL?l$>^GS&8&o*R(7gF?RiUS>qqrr-^pTsJm=2FLvV&?ce0gDFmlhMj3JXJ3? z_?oR(x0P6rpe`(m^ux%pW_SGVa!V}x{npuY4_idq6&H2%p83f1vD3~|!m3^rt1^V; zLS3beIe<}=?rN3||JpA{?Nyee_KK5V?mo-UTf7~#%jN5u>&FDHT|I=nDsDiZP!=jB z@_3sc<+t)FoV>~@^_!>W#5V}oGiQ3AdVT!n0_`9SgXfTb58gw00lX0LYSc)6qj9kq z^p|zlL4R#)LH-tLl72;gjaMR%rs4O<=|a?*jEkiBMM8b<=N0n9HF~R{HFt>62Zr%= z>4ALKP{Dq)jMRRy8vAy{ewAj?ZMjcTwycfjh3pZJG~NQ69pM0kg{W~+=8A+O0WVR| z;>W#C3y7Bp16(4+?*mGb>@%@Kavzu9B36TsPwXkc-q80mpcm((C(KR4$3Pg(*9d>% z6Uo8(1n1-1-}d{xw(-$UVgvE&?&HHeL|}(oORT!thwbKkynz9Z@v#=d_>S6Hv5R~L z;V^(Y-s7+MpwueLA_@ZjN%!yF0&uV zN^$_{YxtAr%leq#{VMGY2XdQ+rTFE{sk4(2t`Zv9Q@5v zaxZ2FslG)jeAaAPJ8={brX9@sj-iXe&y*wUp_l&?l2l8`2D)-&sh8oAk%?w_MR8%d z3`HrDQplo2LHz>FZTM(klwn~hxZWG9*yic$#Cz#v@t9&9gi!P!8K$x@|E;s_a24AwQ<(cn!1~Y$ z#?9bNF^?3(c3q&D5!!hdj^PSG-=3)8-k)Mq_Lg_6bccTvW%i7-V(LSAqMa6uhtV`j z%`gPih{AHfz_F5SuQ`OMB5PAjV*lXp=ZO0<_$$p*mcrso(v(-D^sH-tU&QpIYhRQF z)$9*#Y&BEnEjgQ225N4^>QG*)eU1L1Rq!m{cihNl(e8Y9KCJ)5_vN=ke~u_NpZhyC zlEg}af+R2MVOAs*FFPB&o{i23l1{8ter4>?Y%~J&9|_3^{-(s;iLhu+da&M=h$Bm-D3$`-Z98A1-6|4s+r(HQ>$bbkulKwO^} zCQ$5BbYtfo6de&ihRwCw9JG=y%rl3}qXyb!)OO?*8>iqgDxcfpbMJVrsHCXO6hB1z zWh6^L?IVsw^-T-s1k%pH6!vSYVE0Tl*W)a)nN>DdVk7C)Q^F*3i)&n8-&{274yzqE zS)#aTJt4ID&qgcg465&xtW5`p+3b2NM&!XItTs4*8!r8m;^Pn-!e^>HHrEwm2FCTG_lcE}g_ue8@cHbMeqJCabK#kAP zNrle-yOIrPCdFovb#6sQvzdhff7|FtC%8;&>ndnWD{p+-vO0!3P!d#B>p4P2{y2)$ zX#pSM8xq=sOguAPB^f6FlH=+G<3P@Rk%!NLH4$gpxFYa#3b>Zz6YHs! z)Lu7Q?Y6-j(5(f1MOdEmIJYm}b-vHzgz4&~YDe{xg!iEyl*}=9ygQ(noZZM3-VyHa zU`!f#_t7bsS!%S{pVs5OD`^ip7WMibT*nt zBb@Nx%-k+zZd2`u#l-w@l#mv}5lz=UXkDa<*q4n-(*L*PoeO-D`Qkjuca;BU=^N~a zg(TZM?}gA7clg{#SK({y$;&WYEecL8Ze)?zEM_*@d^&y-yT}Y=QCc~n_34C|H$vd+ z-x%fmsX4AsTAbuzeUfl;1n->TtMbu#5dzP<-63Ah16|#cefF}iZ?>mN2KfR`KUx;J ziq6Z(94HMJL9m+EzX=Z!lE29Dh`gEkORORWm(cIOt}wIjPT+`{>+8n5$pA;5fY#f0w#`*H9B=K{nW%)bkwfqY~>R;qM{dIjk7z zHTB$)Cv0i+IyYmFh=ayVzj13+?lZ1maR)+>?`|H!I)w$_5mMnXnm{|txAkCiEj+IWr!#ljQ554F3jUU95*Cfs>%eD25hO#rwH<53^ z)^A+C;zBn7Og@4EGX=k zLe9c%%>LmWaRlLelj`@ zjiWsQd2HMKU+xlHET01=>5qkJTo&@KILS9@WP()|?sQU`PTIU0n5HyVpngrdha-C* z^u8~ znOHq-Zget@W(OTRMDhMRp%M36(k?yeI_mg}f;NeO{`8b_L+?P^64`>fy|+XAEb`mH zloPu)+mOx)HiiQH%)~Wu6z8y#TOuDT>OL=GpHD6YfzHfG4`5D_6MR-nNkX}4rHsT? zvJ|U}>zT!^0V}yypO`y<@-OM9Fz3-+KQYD+ zaR#yO3EI)+J64D7vUMdZyGIFbW!H(~7T0&+%yU0%E0`-sNP!ikO|@qQb=yE#pY;)M zJ$b|lwh@#5`LM2gu_k1LZ}7SqFw3By`wk}EtSs#SHkw~492yI z(v6}pQRLAa#IrqW$1%x1M(gfB-|w>LG?)pU_}x`de)zP9#Tn*>)Qy&YfS?5{x|=4u zDtl}y8CyLECadSbUq&8RiM+2CiQdd2d?`MWB>jrK1R!i|Ctd8Q}zzMoaT->Cc_!=2!AAb)2YdrR3g-W3{0b>Ik2 zzN)5X^-w;8gwt+~b*I^z95grPq0_}xB=T4U@)>NXd?tcN${4?jr%GRP`|0%2tp9Ys z&z>(L#wcgi-hneLJylvhV@;6+AFws(?OCdQMs=@Ld2N;k%Guj)QO*eaj)e!8;Q($S z(HKp>{-h>FI&D11PY=5GY%5B!oqQVElk(6!EhzCE7cU6wF7V^eo|kj1C5sGmNS0n~ zjNB^!eh1Q?BcTH9;u3ieu6*?#jD1v)b^KR8lDyw}QYAsFuW2^U36vutRtLw5DmyBq zB|UYW&i&jp3LTYQS&r%*#uEq$z2e?aA8Bi<0Z&%{>z&xjjmb zkT$SRUMa&~Q-Av^2GAkN)nauFQbu-#QDWoWfQ>QBxe$*Ed=<~mGjJ4vt4hDCOg_;V zisF)Yo{!ljMjpXqat@u%WEI5Fn4E>yxJqh9OUHoLRa|}r4`tkmUr9^7Hmju7f$|El z2$a@%E-mvX=A00}qnXbNE`4<*VlhYL(~6ZgNEzFgMhQh5!dMQL)gZ?|irMsKqY&wS ztYx&^msZF#SV1}GQta(mRUQi33qPvJtBdS+{33994dT9uQH3(+^KbhYWJ|f0O>VST zW_fduXV#)omt1C|B(J^B_NbW^C@mAa=1sbYvyS2fOaq*HLJ_8N0pm`_TrC7R{M=SoaHaY zpE1k2qsg~UwDi72<`1+YTY}u;izy2;*Aw?bnVeEoD4=$}(8W>z;&CwMr*MStHGM zX-o~`{I7%dye*bM74p?4i|2HNcMzuQxW^+yF#&eH>SRUtzO>u7v#dvzds5W*xiSr+ z%&x}QqYHa@7nrTeW2)f-BOUVaHJGpkSt3Dk43N|97?)>Ug!I?C$Y~^p`Y0~pKbTGX|h$s zic>y)zl)FSg{V0>hVTz;VM3Tz{6X?;6zbRoE8;+Lr>~V@!)G=0o#pPFa zXq&3$aI*^Ud0l0W_b;fO2Hp-SW(E01#l?QO%(+M_cELLt7wWhNH5bwQCk9W6^QB!Z zz7IqDxXqQh)H)-q;~ERk7$;1Gp=n^JXsD#wK-9P|z#-nN(~5QQk#z5Ds8ul%N9=t? zc$KLktW&V9$I(CC*z~8t#sY6s$3@vU)VV!6t5DrXY3b95ZIE+P7*vrE*7a$i#9lDI zI`u}oXsv>11HE&3`RFm5Vrr#{N1eYzjpsf7o=Zv^$xs(--+NT5@tw5%(FJ?$WmsFP zy*^yA)gGQ|ozxQQtQ_h(6WJ`7fOR|zo?l}`mpU=_I>6XhXua?o9AQ?8cc=cD1vTAA zQ`4+VoomBd*8z#Su`%D%9#&SJ$ZE2vi}t>#fB)C)MQ35XQcn-W(*_Dl-SLd(V~mJv|-FUwbBm5oHR=7Zp&d|FAWj!vvAE*EH6R` zNvAwHYlXVJMLdq@>+*U@tPt~0y)US$jL)72H_9UwX1-Up;?9 zIL+R@mDo+Zj!e6puTP&EfUUu2s~Ix(T%_S0i^1o@@S5o8bN^dTN&nxtvkK})XSY&T z&M_cum9~0prFfPR{O=`O*-8 z1Rk|JwL7&twL7&twL7&twL7&twL7&twL7&t|0mx$L;{zHI{E4bT$Gx&EME2_{TATR zlS3tN+Bf7}SLsxfnBs5fmq3S}>r4ATJ*H7qu=((ibG@XR*MFQrp4h3Zg{#D(S%f65 zaI_?Su#heL6CPtvW$o?sqCzZXz!krEiXUm0DAFCS(tgk_Z$q~je0sUVCD)n~TZ`wu zHetzGG9SrxgHCzR1>FWYDrgSh$(s#3mP~WF+-ef*VFXs1eABz(2#;DM+@XC|hTNqy zaR0F36yp~c=rp_|_iV@cHR1aM zR_VmV9sRlY>K{KIfnrz%{jU2Y(pwXlAJuvi=3$8xg)uqb2T1*0sOnm)VTUDp(SEo*$y7!zqq37t~I#KOw;M?0gws$JOSb*;@GsUL} zFB?5!%lXwmzM$@=U6G4p3)(lnV?5b~xoR)HtLXaT9<3u?Sl}%aE7)RmZ1h82+wMT! zr#*;SA!6+$cEda3GYsCTj#9@%##Mag<}#5P!r`*Y3v_jQtODmkWzE>oxZOx}Lh zo<-y9)QWrMb&CEeYHTk)L|W($50)9T&=-Pa-}2l#K~^B2V1A`voY!q8H~=7SY<2wh~4<81LC z924ufw^-KEPyXu`QwIOXI?zGxmuQw5|9qG`3uqVBKWutI4jaXuEOC^{bY7Na!wk_v zY&WSqN84|L%11O9wc2+Nt=ApjxNMWqo8o?>%V7=BhBh*du6izLOcGBT25>J~eu3xw ze)?q{X+bWnjXlmhIiJ`fz+RB?n|n-4#3S{K_?p}NDYlmHMoZv5uKDZ@$D;Y&pwNfBZnyP$^$C z%w$>!``~hMSvQ|v5#-(EiFqf*#*jTe8!D*N5?zkX24+%SoTuoXt$2tl_` zDqvfa!L*xgs(x_f6kDIY$bCA@lFlD~7tfeM)czZZ`Za<0ldZ%&-I5`cLqlssX#q>o0na)HJ^+gia<@+xuxk2A`XZ5DmW8eO@2uyKP& zb4UoHGzdS=0<)IVEbH79sUb-Y|5}6ZLKDfc9@9>KD$Pf3pSUDzh&OH8Zk|$@qU2&} z)E7vFC+R+;^nn&#j6A>bCb7=)x7v9IwgLXr#gN#g+UMe^VcccGZ7#)Q#{Wz-gNMjw z$|m3yO2u?Lr@mr{MrMS_Ph>wi;$$NoR>loo{M=n-rR^s57#HF#H<-nXS}rhv_$2CmO=U}wCP}XL+C=p2cID_#3*r* zNA89;lE-v9nK6S0(j~UtHgh_H+5jlu<|wa*PE+!+o_~>s@rqQpdg}%21x|mb_B{8- zQWocZl)mL_u5Hv$AcfOz{cqIok;%UBZ&A8&t=TBx?&8#B`V;IUmo{y?d$_vpQ)u-v zTJiY2OCFXyPt(+SlOj4E3zPqM>XWCBptM-Tl93Wz_N@``p#piP8e)TYxX5<#+HcB= zwjP!hQj20wC+%t4!S=|3G678o^1q{q#|Kd@Hf#epzY><6=^A5sPRbPLP1GN*>c<$J zR1v7=(^k&=0l^za+$9>9~J^o?u^>f`|1L!_{?f zWjyuGWXh*=?w)MXeywx89EquO;vbDIbYUmQ=P4&g0MknOrWoRV?|mW*_3WpXZ0VXt zFLGP1(66{JKRQzx7i&3PX?V~Eex>+kytzY(6Hyh|KA~bamD~HUU(wCb2v;;<9ejx5H?MZr@eN^-59xl0+UL}W0$NetqWkx_x6 zi!Wr&g%P}7ZsQg&lj&iw-b={XM&~18>vST9f04^Ueu}S>I|dT^qLif9!*LQp4%V;I zGk$2L#o{_5Yo9E-LCI6F#yv@`_8Db*PxS2x!FXnhNm`W}19~pdf1jS`ek97B6ukQy z(1%9(g5xNu#$XG36o@%ur4913js3qtF+x$qSbQT_O(6J!*w4?4CGVs3O1Y}kJ{E{$ zbp3ca*YF8Fz}AxA%N?ib@$)#(GK8M38pYLf%TpC}W4yWjkLBb|p;rb`@);a}7jAth+MC1)riKPI6+8|a_R zgO9rI%|;ZR&8-`CT!&d`U+;}goX_4Crw9>q%~cj_^82CnCltZ1J7QJ;^)&Up)b%a2 z?4hqdPic^1g%7npVLWF;RL3Aa%g(_$t@&AF9nAn$Z;rj)_?e?=ZT@bl{_iIDb>lhj z0b`$SEMwh2v;+v%nMyrH#l+TnDTHR&!cMQAa^H9Z5>~)@se_G&0KnxxvEI+ z9&v3g_b6De&yc$m(q$Yqn5|W!7NtsA#`_ekSmc^*|1h<4o2S_m;k6EQp3g|i3FWcI zTZ8TSMsA*I5$Mwqt0!Lz@&JE)f82<`QP3D~-I?LU*Gq6*xkPF!Pmgoum zE~lj7!-&!z%!QFyCs#8suX5(8Q1{tkcU;2=aJ0n02&{rWAm|9N{j9ec3w9bk$5{TI zY}axBedq(Gce8CcUpLXLU_P{cErl!J#y@jQy3nU&9fP-&-|k3Sgz}y%QjV6UmxC+? z=tin?72`m7+kI}hWL zhW8$%EpZiLJnMeYCWy$a$}Xblh_<7~+*zo&2ea^rRVlyQP~1M9J(3w-0!I^|^y?wSW= z@Ko}>vr>J*o0fc{)z`(c9@1fH!e$J71HD3nTSQ5db0Sc(>$3^7-oKa>U2oTo$IGm2g7c^9zI6`$@_lEgoxQeURQ{1lLgqMtYspIIKtyGo^@L?9#8I-7lLl z>X|~U%5O!w2dxCs%$LFlp$Zt3DR>)- zb#z^a3wdi-%W|QgHGg>p9Wu-W{-SlH%?pd^5OnOlWo%u+(k+;nA!d##W`@Mf>| z2pw1w@gBn%h;k0)_(XZdCxyfN1vm^^b1}C}YI-e!~8 zkDK7(!>pADv$@M5Ra8JJkfsskWJBTY4QtOC1onx28|Ig5YvATI{`fn(%Xu+L%zws1LIv zbD}Z5eDGIr(mzI3H%1+JlE;P?&`yL-{xGPiZ$K=r#2>TIZy_V|H9zWF<_&4)(G%2^ zssCOehY#Sp%!*z9YTG$MbKqN&F)((>?l~_~?%@C`9sACD&%l?nFBzIA52UNgljL%| zduK;EV`-5UibpQ)y4LO+co`=Er5xiAcZTec;#kI5snnaKqU^zUv<^eG5U?vVZ*;Mr-*@>DqVWlAEn?w$X< zE*-x{?K)$27KBd_Q>OoW4!k*e7SmV_UYazY*RfBCXc?7vS9Y>dSF(88To+MB(Uz8^ z(ps3uA&cvKR^5GS*+VOdy0&ojog!wwhvwR>J|fe6azw4F23UwzN$jsP2WliDeSo+PDge}-8q=06z>0e;M;|PSO!HzceXYtPSiMd8}f7;K7ypux)jC|io zC$ZV7Mm79{fO~^El`FP7f+{3mCuuQA;1J7xs=)Gh5E?cIk8UiEF=~;huFz*D;A%P1bNK;%w7s>{Ow_jlI2o*fy6gteKLU3HuCB+r$kkeWy`!S z6DP%U&LD8U&w@I&7okok+G-wAB?}@zpVSTTW1jx-#1)fv<~6Tt*S!k;$5|~o61Bk4 zVJmQ<^YTxgi?rb^F}Rth9aiLr`UEJYNBTj7u^&eREuCYXexAs*X|Hi%5Kupc_6Gg7 zY59|H&;1Dl(sD6{h7k5rY`U-GJVXsVGlBRQ^pzKMQ5YTGQsYu{#VGDQpSp^~1{I&i zhEUdo8#^qQ_^T<^MPUu?(q$pIN`%T*+M;#b_|CJD-I9BN=+5Xq%9{?08dvn&?-vfU zDp1%Sy|Pd|QETW6t_6RMoUFfUgNup<;pVSLGroU2uxn*1KQ7Kh5oA*Pj3;~$5NagW zIRq9sem9%)+Y*FP7elgGS{;3}AiNHCG0ER|6mGc=DbuIMXe3X{hr)M5@{J>L4Qd|+ z-A5D96*L5wuO6*!e_{s^=q7ozv9WKm+$Wzq6e(j%Pm{}^9h(%iV`gUp>=Xu<(3E)4 z)OCk`aDco!q0%C2)8`yxG7u(AU8I9N3;#N`hqdFalqSELOMX{1Cp->Qx8&!PIfgT*p`YKJlCJMtmF4); z<6Vi-qVs`Jsaj5vQq-z-h|y)ikQ3pniNw{os235hLAL3VorIg>c~lLh@&q5ch!x8_ zCREm|%xR=P@@;A7pV_~4EUtN=R7D4M7?60mjB*TDji)$j*!{PW|CXi@VfKtZ294Mg z5P{XGB(Zt(dxv4%KPEdL)$q9rLD7%|lv9EwM_?ZxA%u1L%+yDiwN2;SB0F1XDTe}*C#BiPs! zRi8Tf_F6#DYKu>ghjrx_c@J-5LnBvAjo2B)RMVG4fy?HK6=uX)GLE8igfP~+zs)kO zWVya7?E`^xP)!BGqKt%9O%kRt>5ZcCOEwI_pn?yENO?!+gnMsd83abV$W4gNzC%Dz zyhS>7LHhgg-?fI99?YU`e4iVhvox`Zf|Btxjw6Pl)IL?WgFG`LOZH8|q9^Y)ddgQ^$gJ}t zimsi6I#CZi!Vcfeb>mg|$M&`Z;>nDgFj?^W>=4We7eej)%D|dd8BDmooFz=Uovqfy z=Pm=jx30K4@cS>aBm2mC#y^F)b0qtpM7wb#a+7l+jnf|hIw5o?ZvJ> z8H4z8U{X8cOVeVzbeyx(#mCRCe+B2WcS+n3%Yi@nh9G#Ue`Z%5gR3~mv zZ1Pt9K2Z^ty7o^W{v4?S&*JDoc^| z%$S6EU((2;MoA?I1XBZ=tu?igq*pV~&=8xYTn+p16~l`Cct@`d{3E8uZI~hKm9D6s z=Jq9sp`fWvI6u`{{VPH1bg&o^zH&f3j&f0Rmo>wGY2IE5ejaY?gWi_b9I6 z#so(Qjs7k57YUACtEbZ6(N@sZ2UQwu0Aa24UuT&3{i2>MS{7$M*FP8pR5(OG%_jLJ zU)O6NmLOX?NqDb65XIN%;H(!s4S@rQ6tV9CT-KD&(d;Y()taFr}~xr;i~%8 z(8jRicyCrbq(`V4xz7)O&B*x=doJUAh#y{z{T_a4F+#kKsJu}bH|A&(iyv+uBBeju zzeTxmm#hfQB})9Iw4LD@jlO^p1iBa+Kc}T{ zgBKQ#H{B<@q09r57Z7%brTJyWUq?(&`qT|ZYt?JHwV*5r(8!Vxo2M7iwW_Cg zXdlQgiX7ZU7v$#%C$uH6#`NPb5vV(9y5?xMB_wJlRcfw`Nvti!uBFxa6mI5uM=xcl zu(ohTc}{Gxg^WjX)Zg3DaS=EE7>S{5Yo|PY;1(&USAHeat$YjBAflPEwnK`|w1pzp zhu|*Ua-9Js1LZ#rW>#R9^A=)>%6Xc3i#P7hBoguX-n;nk+I;3>6S+0aiqP)X$h$Hs zh^Gi{EaaWq^BidBv!ajPQUZ$)g_XyqHv$A3BY9OahIFmN;?AG$u$VeEb^C_~pgCk$ za_cr-PpkI7QYt#Tmi_C*yp3;F8Z=6L$U=Ca_#A)FO95JBBs7*(Z{E{2R>BX%o=3D& zV%g&Qw{DEApl`SeHv^P8EcZ8fla1XglxlvnteL5k0dBq@UE!;2u462QV}^AVY^^=7 zf!Bi+Mb-RkcYl@lP392C+K@Kg0uP0n9-SkNRt^`~;<_%(@QF}R>iOF6rX;wA zRQ*1?1Qx6Gv~S87wdHFVZ!bka*wfpaFcYUjh9QYND4KyruG5$dxuZ}w&XjbvrJZMzJXh_2J)zo2?yT-kY<(R| z9k|=-Tc{;4f`VS|!}G)E0y1x&ROvbO?`O=`8XNMcrx~5U%OBxYRpSBjGmY=5DEMu~ zTI02>DVn~nMm!?K`3DnCH(t)PQe?Nr(u%Rqe*xjyC*Y|E_-3mKqn?q8d}yyy-kHuu zmAh3=@NIiHOMFiec69IQh1?oLoT)aX2=D7U7D}5}JVsOu`JY&pD`>6GVwe7F2O^3q zf*SO>2R!9YQpC4K_Aj0-xDi?)aBqhRx6t^J5UW5bn7!uVn?1>Ibh&LAP&t?TBtuPi*X{o$m81Wccp_DvW!YjYh31hokkJF}gSS(J!YhJp?Of%-Vyxa+8Ud zF>z!~aL(^1xTZhFon~rDrGz|bfbAdg-d%!o2`DZ#2WjTda|rtqk)5PVaGjNH^lVTe z;YC^$n?_NpgWv~_8)7i-t#8wzjpGYP05VF;D^=s-`2BgLC!JAP_v9ZdNE$%cFcZYqtmL%`%&>3af7$T?;C|s5_5(>BTs4M=({%bgka#(OaY`EJ4sR>)+RNvsv+KBP7NbwIdrInF9BGfugKMHT^nwoLnYBw} z1A&*HdbrQlw7LX0&M`9~cj|Ija~-@?wrdTQWKG~+w)Sw=j)k0>?s18j>^9DIuO959;lIj&Ju zT+qd)+&ZzC^G?t1@q=(UTw2~qJ$DXS>VCpEy(84{nDSLS|BlQ+i!MA-IoL7vsycXr z`T)Bh0gxO6Wa``7gi$>Em++1~S+~u_-ju|}``=0TDvdvWyAw=oq_EvaU1`Iugq=R} z+H|cqvxUH`mtNA(4;x(iu@dkmSM4^%0<>TWkoN6Y!j@L7+en|DIOaGgi>LndZlf5c z&Ate}v<=VhJKg|^tK_W@h0?F-qD=qrstQr9%yVW=E>M;&+t}D5wYvDbP8_9Ck~`W zwY3H`H+=`TPRYOamkG4QDF5_0(ixiqeJRFmCII`H^LjjW;xuZ4q-{_l4>}B88hfTT zy?&}bZXcj8B^K>3us&Wkt>J~x|L%N!Ow=4ToZr3vBGYILjtkhZ$lx(j_lbLjvKZw(VmKb|;KYe|T~ z9i8OUA7)?3Z#I1YPSqd$F&}at@6t%!B41MonUk(K&;QgKfGmY9XK|#P`-*2X){-?1 zlTI)+$c!@?ClNYcPzy1-q*VBEV46D)n$lItgus~N+#)VSJl-CTF@F)E4<7aKtZ(w~ zl+G-HTo)0n7Cc{k=Fz%7wb@m$wf#8`GePrD>t&*<=VdJ))w0UgBkvS8)y0H5~R3@L$$Fe(?xqnxH%)B}P*D_)aMzuCtdabO7;l(oTn1 zS8W{rAR|2VKc;laIy_xka%M1{rrfz1r?Lci1I>lz{8Wk?I!(A}L{0cpyAnSJ?m8=0 z5xnors`CTiSnI41FDW8NS8EJ0g9g_ZmMPfw1c9TGkq4&u1}QUY+goFmMH-(!`4-~Y z__|^XN;`JW{y5jBH@=sYgAOt$5Jx5p9AeMKTHd&&amR?#CH=HV2+BjI8~_e?k(Dp8 zTW~ioP?qKz+%pMQyI-7L7h{wyiyz)R;t?B6o$z%>&KAsjoE*Ny)ihgms}3ml!sqk} zJ_JjFpr>*W{v{Wmk5iJzY-2#oN5XYSQ6JC^C97V4BBP=|tTLmwG@0cBZdMJYK5j^d ztNLvw$_J$x{&2(-Ma)~a1OJV^KQ%71(^SnXBA53Q?QG~!!cR?&1$Gf9uZsGsCMlJua_rvS+Bv@gDsch_YbbLv?pM;>|pCb zm*8q9-fu7Y2#wX4tRb3Qp5G2dm# zNDoQTHQs{pP3XCrghbR~{>cpaa@Y##;&G_*I*YdR-84`L_!_?*x)(6O1GVY7#qwFC zy@^Kw2$Y1%@{6|9)$%0J4>Y)P_A7sBpb_Q{Qm6B~6L1;ZrF5NHrBe?}VbJRv&RX(G z*Ak_uXv_=H$L2pP&oNjcUxx?iG6IUJP3FG~Lj0{@B4e|_n{DE%i0{3ka5^`-wCC;=gp(U;P@Nc2;`jxSF(1 zJuBmvl`0l#kVG)giv9QT{}2YppODUDR){98_&%o=%)I!!gI&}lVEcV%*gV}1_}{?M zK9KC1Ve9ycKH`2)pE&)30SnHB@#rA<0R@g7AwqtXbwjc7#Ntp-QE1dv1ITN zkdOk4 zSQjf6Ai zoq&A}2iR=13OrtJ#7lagqLL%Dzg{1y`u{@*4of$Th$&YY+F3iCQ zT;-!k)X6IsL(K z97e}Osbm&Q%<)Vf+{5t{aK4WxlJN{Ktiy>kXukJ5w70k0DMp_UFSTmD@3dOY$llKf zSZeiVD6~55*on02V3JAn0mfsAJyl&FaAQdfK^QbD-L_rtP&BHQ{>o)4J)o{n#4^>Y zKo-lz?$riM{f$=VYVUWCfLJCoZTOg4)*z;r6J=k{o7=gW7mZVn{f z?oTn=z2ARsw!4GdZgmDsPs_PIUgEd=d=l__J$)nO^Y;IGOF&Hx+dn9%?`SG(=L=F~ z6qN5VF)_#(7?3kFGstLY;59Wh$XHm=*Vot4(b3;RLPGRv)c9jbUvzU|QDq$K(9K<{gr!lU3(3`y}hG*j?h>oX%h$1u3w+_7_!s*6F<@v zSa;aCesSq>7$DhYsXS~Yk?@*cjg$WC)VqB0KFS&IqBXA*zP*O(j`eT7O!S#h_Z0b~ zLrKwR_)v=O{edfb<1p0AheO*`*T0!eST}6_Fx%43efdlRvB?N@YYEH{Ae^?C_Ir8(PcYa@LsXq2s>kPc0Z+ zP@?UfewljFYRr~I+f{*)IdZ@J8vN{jYVp%T7<{KtD;Dfo6Nz7zy8Y&|@iz;)m&7h1 zIbfoP>!s#teb^Ry7}qdfjgiLRHF-#&W$y9oy0HuKnaMvFUS};Cq;LJpYn&Cs3H9q% z!vy6_$*hCpe#G|1FYqRvin`qunG(@z?gkpBxf5>Vp0|twppM*v*cw zLvq&RWn17i^&{u(pR7m%@&ih%>IyE!FV3VmjQmnS{!u6B0V5=>uve5Pv|2>^cBw~5 z8Gi4r6CUsf20n+WdAosT{D|b{5BfL40;8xOJEtMC8%*xpg*cC;?7h3F{syLC?cNghxj>Q2GM?T7}G%=odu8H5%s%| z#>h<1$Wk#G?tMcEq4>ws_tBBIK~jPg)Mc)8oCaZn|5Jbo4d7Njk_!z6(-S8 zOO8=9O>fW0LPY4}a2DsG17qyu$)=2=zQ*90;4IuW_Wm(1JG+J_q+r27>M>Q>WC#Ig zfTS`2YzItNQM>Edd_9u`_mZ^6^qk~=(nAI$zA53;C9gwm3j$e_sr;f$p4n(qv-!S! zpfY-^7TH-6O*vqs#Vf-`&A$lCx3k_Js1mxssHpr|hBw=ta{2-f`Q6k1U4@Wo0Cuv6 z?Wte5StwOuaFKoQ{aG8Ana~w?$QPddnx!JRbhECZfYWmRepBy|wwu0n_UXb4|5VJX zzJ;!B8|-QNyIM@m%d25VzV$(%DKloqqhSUhi_+9oHb#@ zfZ9D;Aj^rbWNAzE9*K&P-Jxs~xZOlZ*CZX0RGuQYYgm{=8GA?J&U%R^0PoX7*4auH zWoN|Y>7nQ#S`sZaM0~LH#1B^fyq?WT3t`?O=qu8ttzRl^V)nne)?(lT)3!%QvPRr5 zp@6q9R>?t;`X}Xvuy7>55IW1Ivb1n4PrF7i%Wt!HOHqFBlFLGiJSbNITg7LO0I&|r z@1mFMnA88Y^eDK^zIbL{mh@cv!JO8_xK6Rbi!P~VU4b)H?Ixx7Iz;6n_QDCV;Pj*P zCiP*vG%LSwEZl@mpKLrQb+^W!YBAO9Aq^&FGhDg+N07xI(GzXdf+gD)`WWnebOPEM z)$tqA5_?LWqHbAAS!AsozT(qa3Kc&MOzga4ual(*be7K9=^FlO)9D-GY?ZWclEqoZ zLSqq&zjD4=m@&KZeRt%pNZsNuB-Ei1gHoJYxyal@8$yMduvQ!HbvuEd`{V16(3{A1 z8HZXVpbBrU(`%@by4J?$_g&bOd^he0R#EopU)A(?yMSt(t<&(eQ`g9#q=!x$xAcX5 zjt4)kqwHJ+tjWGz8}iJb87QzJK7T!l7r3y8xJQavwMcN4!zbj~1MSZBp_@ON;C|X^ z(dpw1-4g(m-eQGu>G6hMg29zfyT0`*Bi^jq?P~2dHWr>)M$VA% z;7O}^T62tICXAL~7l2p0#fP~FB1_{}Kg)sUFueGxjJC85x^(SRvNd-@)Xm|eN32e| zIA)1>geNmukGeI}oSAONVCq~3F3GgH< zhAGvLA!IfZ!0WWpbF$U1pGLlqi&5{(401MWeJVf;ti;vkZ){cvnu*z7yZ&)g>`mN$ zwYaAkyH6M)rS-ohQY&gyoe(7Oc_fRdml^$AjH82LFPgi?XxLRh8dfM=bh?`$=bLLe zrz+a*JajHqXEm<4d>B9FW@YBK4S44%==;CaP>VX9z%A^nR+EScR7%5C>3MnLm@9zvN6eduGN15w+s zuVP_#En2n2?MacOVtj%y_svKbdD9LOel*u$)pKT4UOD%XtA(_l<1HST(I>q37jwU6 zu?5dz<5b$EN!j_Lw4T${uhw%tzQx7qeF8nv>0b#qk%XA9_B1I>(C_ zJNEG{y=&w0A=Z<>Wj9A=wyh0aTiUc64(y6U5B^D;Ch?HaG+HFc37`m8z14q>aO%O> z_8OA>DTNsxkwvUVa9snYVV4y{$Q{sWUNKC6R_E;RHCx|}>4D833q0gX;ilDG*8aJ( zp@(D(D=Cm1)#Wj_(KDN`MK@7R-zwTLx=oOl9+g#7+0`ERq*@f4vDY4 zx9KhGX(NIWaV<4C!;js~;SoufceHvE$jqMGu;-Kn*CsdkLJ|>%5Oy$?>6D6OWS#Dt zxUQ1?o#Q#&uF!HIBfpQ(OzoqHlFGt4FWRp$rpm4k>`Z+xV_Zl`fJF9k3SDrv`U!}2ZQHhv2^ zl&+t3<}Fo^5C!-8_RnnX0s&t7`#9fGSZuXwfQbEglzk?gT&2o*ppop(IdLbC8yOJ{ zfSQZH!}ksPN`1 zuJZbMKdSeQ_~D~~Rv^@tLQ-av=fL)-Zz6(Qu%ZYJaTh!yCn)1%H~>lllt9u-DWRMYU#tDD#aWCeYv->CDA+hKY50 zRR1i5Uf1#P?rd<~vTuM_|9;oG>VjJopKo$Nn$q zxH@9E1j$o9;bmkL!AmCxIQWNpk|I09&qE6FFoS%nuwR89BM6JRB07JZRmUC!JsSuc z5>N*q?RYhFj<(Wy>ZVB|<)P=Oa%=h!zkIffetcAV+W(-WonlVkh~aHy(-~~UrDZmT zOqS`_Jr0=?G(GKjOi7C*K6g<*q8ao&b@!U8s}G&Km=0cQv=?K~uRI7Msx4N;eQY04 zL6Bq5@Kq%=13S2SA>gztuhXL$Q9Lmm8KS6gNYZjfDX~w=khrn!_H=~69k#|Ddk(`y z1C^Ov;@*;vU<_g6X$TR6R=4^SYRfbv2A15fMBf)s2(hkXpi6}i+kE7s-{9??7-}lC zl!4UlVKYC~m>dO5FGRS$slKi8@j>kc;{siWwRbR{En^4`QM>Ro5ZLJ@cJ+Hw#G(A+e$s69pNtGj}y&>EwpBI#)_zv z!<;{bxerRI@t?(aM)GfOVK@ z@9x>$I$Iur$TC0-p?Y+Lz@hLrFmaE#?7PDKGccVAXj&|N>y3a!Y%%LVfpKMZ7K#Fj z(M_@XFak!leS1SX4IJU3Cs#n@o|LRZ-p1Y?31y{t$4;VA7-sd__WRXG=sDyBHIN8R zsT=3ESaOTa6}aPnr-bC82NF@NplOu5pVALlYewP5#a0r=@*l7cvf8HXR0d3(h_Rud*EleQ%mpCwi}r|v^N(To1V zQWNtmAN}+;P zeB_iz5>Zrtr${ASE#-nY$1Gm$6@=m=V7KIl3@oWpU8qO{8R=nJQLZ`GZ+8I}@| zvlZUih-XZXfOW->q${oZ{ACki3lp}pUAD6vxFs4x$8Ks5--lMoqA(?%$j+Lz9it{Z zz{C-m$J2%3)%KnZ zwbG&NOr`4}W1Q0nT#-U(A1&UimSU@ln#7m7)vt4+1mg9CuhdPhkrydg@MCZNqgq8H z6{`MCC?B4_#W~xQ9oDK>#^zg7b6f5`Jhh8U<>`16hTk(V&|%`WNSSY_G3s27Qel$5ryuP`F3)cU3_p+zl!>yem$hqu7};ZQ}&sTD7SBpZTDss;opVl5yF7GQ{{{Y zdCG?N{G=ow@dhHrqPs`?6BrOzq%>w`XFB%!c#S+~mxV?ZNy##$rlO4{Hq|>=3&`A^ zb637>{-LPLVHm20RJF>eJa`Bl-L)%+&VzcOJNOJZ$1!N7)!wo_t zlZl{D4r=zVvX!qxEVtB7D5<<%kUa!HzHwny&qLXthvV#u$aNDVk$^A2&?76M9W z@$<;2qJZ~x>XXiP&NFKdb;Fu15FRVlhG{sMY~`tKtLjJvvcbA}hqp0xz$2!_1krv3 zZ1-3$$MHimKWq%9Kb{eia#Y&=Q*wx9dLegI08267l=Gd}`Ne~5+@0!+K$ON;xyeAz zsM*u?Ff^wa!-BHnaZwqUazAAAZ=OM7s<|C-%ev#nJNeAD!vCIYqC1^N)-*@y{#6CW zIYpt^RvWDqh{7*D9vM11g&&~Ao#&uz?glc*DfO%grkIaE;Gb;}M{-rQma~r0p;GI^ zj33r+?xcL$KmuHt{b7m+0E0ToRlN(+HQb({)^*lM6^ez(H0Uf@^Q07@0Ruesv0(g) zaDa`z9BXeqZUsl|i9HczdAm?D0l#MC33s^Qr8z|;w~f9l+D?V9Z89ln*nPT~Dwa;k zA_ekh#RVsoECshb&j|iGIAa`TezQUkDnAl(Xihm%7Qocg1Vq$QGEe@K# zCwGFXC01Ci>s$01`#H_Iv$@?mfy>d~=m*freEpXx(i1(^STwD~0hcf$=(|O@U6u3%`bI?YoxJi{1I%4+N?3B z9|;T5N;}m#R2nVh3E3&Dg6Ec82bZQMd8WvHKgpaXJ;~t4R8rWJaiD`o@aBg~VzVBi^POo0#byjr2YWSlfFkDgq>UtErY_{Tk%3fxmk7l;QShvoYQ z*~4J)&!KtdGh2wbh5N9e9yIIUi@_U2NDpHbriS+9S$m728H|!tpi-1XiQ<~#>SdRu z#g*#6?qM|O4D!Q&i|0g{1754ngF9jD!aSBO)r3E?8*OB)@;DMY7<(JP1AH;Y^o(V# zI(+k>ZS%Oi=-l`DxbR7#dxiq{3FGbLuO@yP`96p!Y;@#i>QfQ(3cv=|3N2n6M#UDr zusN>O7?<0mHiTt4+jTW{xa1%)f8Q|H;&Ctu@HIc@kKx;nZu#TBbvL&CuNK^uL4=m! zS!z6YrE|VU4nmzs4Z(u8%#Im(>S$dTH4)u4dfMiX_N2zn_Ju_?{d45%l9`7DEe#Dj zjWjw>cGk~;U=pTWH)<|k^78-?CQvc|l+Cln=$uQBY5_q|6BCL_u>!v#8QiML3f_J~ z&TWe-9^k84qt?Dnxz+W#tQPxNNKl|QHC4?v;lckj@{YEYVC#!5J`Czr(Uh*e=k#mO zs7ujB6W{#pk!&E1wf$Oe`6tUy29s(AA<`ZeUl=H$E$eDFIOKxl_Du=x;*?vgrqIpt zqTbRWj7gv(CCq_8O~f%w2%}*=x74qy8Kz%+vbwN@6jZtXS&A8YMtAX3w#Kc*5i7}dk}TCX?eftk4l!`o6pKv7On z^_a}qN?GOUtX1bll@Xg_^2CR`r1#wlE$IU45&LtU;sa{fGWW2!#v4G0pb>xU)PJcc zG86e_%c1w&XEB2;n?4<%9#A6QSFl6y(G}W z=py9IaJCPLp!c`6*j=U`mbiXjwUwLC+IYlJt#(pObGJ!e1;hZH>d>qhGm~I@F`W<8 zwb9NnsS+!CnpGg@COg~KKLo4#__uvR>8Ta08)t8qxGBT&zf9bR&o7zqGXZ$TaR#X* zOr}BTmdd1(*M%X^D-;AJX+!;vl+Bo{!;X~b4(@}Flz2hz@j^uL%K1#lmwCDF%w;4E zvQUrcmPL!xl2-oiFz^GhmP~oL7a7h&wcbV{Eo8L`Kd)Q!?kYwMjcs7188+22i;gvi zLHrxu!@9*Zsb|PB29^qCF|KP`sXROPY3pPzP?GRPQm_Z%DW8lI<;?KJS=#>JKqGC) z3od^KREDs#>eyX_7_ad6AE`*P8}AwxrBKpp;xTeUuiCb_2#{FN_m{`GC+~jE zv6;ScU5IUTqGA&q=locgZE>-fsj{qs-8s;>S#9bzxnu$&3KEMXI^C|qw07~UCAed; zYxv+^al#xaR%U5n9DM01gz>PE4(S(vXPD}Sy0Om)$no#P1A#qDuwu89rDmxiO|7l; z<|z?!`VIiV_8_4g33_=oZIj7rV0eC0i1=QmcO)0;oegW^$K11iF$%>IJ0>oZHr-g^ z8gmyzL=`ORcs**jE7Gz1=bqtqACu5{w!T_z|Au*d?>bNgOe+VK|0dMWgTrs$q)W_e zsId&6FZQ6(|FwKQ!UJv!59}JaR+i2dWb374c$?E^_5-8H!9GhSSwjV?W}2=qGk znMOObQd(<$$&W=i#&{>h4`Z%HPb7A`tGkXoMmQ0>zWI_fY6pb9{MdoJ03nFVH56^b zM>SK_A&no-#DyGeGe#6QOvg@=!zF2n-fTSHF}lx;^!Lgo0~kH4%@NG7cD7p}sF@5V zp6OaytZ1&=KkSH;k}H-_Jy+r~p@?+%K^c4MVN#-jyl25{dQ>t)KtYh)|7XFh(G^e*qGamrs7*=2uY!#` zxw8?7!VVIp&BzKv^etU}467r!zk01$*66oi`<96yAazVnpF6cBph}Q(Q;_F<85<8ww5N$XW>OvACqz^s^q$ zGgv!8lv1(3!gNab!DH4ygyp z_NVlY9J5v74Ks7dNREz%Ca+3h{zW_vYx{XcCFxq9r|ypfJ?x)q^*~Hjf@g!_T|!{T zG`t_U8&&JwH5=zO!G-mm-T-_yfu8qdZVjK0U2j5k^w74T(2{WRFb5@k(}@KwgzFX_ z*Ht2*`~xPAe_()11>BOkmM~gqFJnr<;9)(4JM15~%I7fw{?k0G%9_Nvx}3L43h@qF zk{fts=}dgr&df|*OfWUlSk$dRJjv{1z88$7y$)edEeVD6cz5G33a;cXLPu}_m3iaa^bIV#tJSPnEd;*yw?ZJA9=cj^`0xM-X2H8Gt-KL^k0}Sst zI^7r>1Q8RH*xe!Mp0p3_@BuQH`Xe9+URmX%T3m>@I6DPg@1s@0`0bd#j~o+2zuzxq zA}lw~)Q7}8=clXVM|lzKGamaJeP%QaCdLs~;3r2QlTRoqaJPBviFt3!v7>??tLr=> z^~ed4hU^B&^E-ZcNu#jRTuWhMxtZ;s?Exp%jcKDy+90P#2gPmY*%9=ADFqE=!yCRy zSu>{ZtuWFj4Xg5M$~6YkVGa3aP#_zI3Q6j6a>(QS)}>JI=VEiJ_K_c-2d;8qHrDZa z?aTZ%Aq6Fcn{duq_x%}B7`m_cWr`U_`X;^25b1+6fAGX6K*sU`O8;j~zJ9Ow{Vi8x z;1+-%P9-wjxc#Fx`zWHGT+ zpHl(Irw3(5yQb1!v}#luM!dK8okj^Fos8z;=Y{kuZLX;y&Nh_-hM z&BS*D??lkdR!Cw-_Az7751(qy*SKA`_*X&Q_>y#WUqF;AjuLkes8yIn_m*(acs zVvjrYQLB14-)wzg+ry{aV2&$S5jvWV*Ebi?CWxCEvHKI-ZC_0(U{9;>T_>{Fp#^<@ z_?P!ONOukTXY$jiJuhr&KO6>Kgt5|6O=DMiF{MWXMtm^-*u~qOHIfFBeA-cF$o?u% zgv0EmCiRjaDow8k`rZdIQGETpFc!P?-W_@Tp2pc3k+XMRaGI%~B@%oblOWuRb*h*T zo`9>gq-HND_=RIvy;u}K5gf{XzVJ?7(Uu&z$s~fXB|dW{6mKaIqO4CeurKw+>gTnQ z0RXc2-aO0u-#BMNnv##JnoDPAUC2u&UYUB?q+?jB(%z>NG)CDYTSAMZJ;u&1-e{xK z@d>x&4$j9f{Q4aGx#d^?hj8#_3iSnL+4aurBAR55Aq2q0R*%+sdDBeYz2a%S!a2=Zpgw$kmkqALoisTZrH^ABXcWsP~ z|Cudr895PuhD)3FdygXKJmkA5$pb{@t%W}$RKEZLW4w%wl+oVqaHgmB(tY%TAPJqG zauM3P3qt?>itIH>q;hlh3kKDZu-Uh8*-`k4?;s@J?brxjx2U07AcqGh{e3x(^i?E{ zPgYctDIDkhPICu;Uivv?eFkn_;5>nC7C=5eS>!SO8jbN9us_bBpj_G-0v?WC0K;FXYq1RAXbe$04KvxP(%fkpEy?4tsaT6{w z3<_M~W>8ttqXQ(vXRuq|sg#Dy9(NN@6SxbqLc$wyDe%p$!x$4UZNKJu@gCzPi49($ z#2G|o1LMMsDMFmPS%jkZwrqCetdRwrA2h@i@|tdxblQEspYB>0OCxTP>JIC;xVB12 zkP-bI^c#ie8YL&YZ;F>S0WfDm4x+z?`Fd?#XvBwYH`l~G(md(-CMr0w1PGU3D7ozUIIqj8Ox}@nInO_gZ zdnE;@(xUX;lwPDE3Y%qhX<1g+D^HBF1qsJEU$z+To|bzv%S%=T2WP|t`XL_Kwj^r+ z%X5Z+0ECpER?SsznOck5zLV?4TRaAzP;h5^P8Ex>qUfTo?Kl1_i|1^J2j=ohh7-9; zQl+fv25-cIVim*v-b~S?qlEZ}>d43g?t~zNm);^we?jad9W4pU>lI^$ zmjjx0oPc?HlMQ8!*&Eq-d2Pc-gtTbZ2zi~jkd%{O5%*6*iR-q~zVETLRdjU@Y$My~ zr()DN_5TL|ia>S0z~4W4DSq`V5-ZBGc2@Ng`j&LfolJjrx}9q}q4$}vefEM~RND?* z+tT71xe(#0S!JPR%!Z@SWW&k)k`7oG{@~Jy6b-QgFYkLfrW)(XtlUlf-on0Q<+qER z(}i+TQO+cl4?mN{O0wK4&Q-sW{W=7)hsn8itTI5o#65u+i1aE~g|%#u7NsMpvyh+mUAc8@k{q#mw{tXP^`eY^GUV0i4SCsIp6^V6)r4>rcyNz)c{s_@ zQ5~6;XHa7?v1w`v;T-Wj)^fr-*)EAEogr^Xc1+3K(wlfLo89n{%Z9Eh*(7<6zJGr7 z9%RM2lbxqtKpyo>q=}QJQhcgiUSe!cxG1+gKQAHt3LVmr7e&+8hpqC=zv?5ulD+My z4Nh_+8(bb|Zpt0`^(ASSMSmD{%`9B@onRsF=Sp3AtV@aq<8u~mvX>BJc+NsmYst(; zsAk*QwEFub+q)tAEHd8`sdVnbitGr{;lMC%x6oBcCR1YyCCm}rJPIAe8N4eiVY2!E z{UkOCHMY7|sZu{Uq0bvmoFy1x5lQtQ$dRU0*)v@rd!ge!Wi!V@egWduF@J&V)1PUR zD|qwY|0w-JS`E2|^-qv$!YpbLYdr?6NBZPsKuyzRdlrP-O$%}VhIjobqz@KgJyepV z2>7kOs+}gu}$v#`9YEnH-Ih0nH;I!_x^HSklh#ua?md|iP>VD*@gx2q1$*`9Q^ zE<`0$$|1JSPqiCHbHI<~s^_NOpLppO9}Nko-f)T1n0B{I)`(Xr?zDUw{PXcoeEg;) zb+f8`5B}S7;Af&9SmkcrP4S^~o|&;Xub-w!opu)APH9lL-ye{ZM&dt9ouLlshOiN- z%bcJ5+}fjVgRWbYlcnY4_aUU|rJ+7dUK%gSs&Bm>T4x3Q{&-;B5#fAac6a+G>rATB z`AM_NwPJO&!*kW@=b<`!z#EcwLsmm2?LCNh8TpMYb#)|Rb8~R3`*9Sw&gMFTJicA+ zQZ$i-BSqsTs;49ixFMt>;p~X=0F1p6N^`E}5xCC#(ARz<+T|rbku0qewBqG!9`B@lOA_cQOQ0hwu95&{b)Q!pKfm$I&3Afk zK!|jzal@Rk-7fK5Qq~dal8jTbj=o=)>D*64*SI&vb<6Uiwh zkCd^Up--;BE)REmV*d;cAW%osX)5z?cI{-LQB>V=n8M}J8SWA%%E)q0CMm-9hnP*#SHG4Z z#n4?hjNmPD0haLo5O?Mt>3YftrTsB)>x{RghD3Sb9`c-6a+F*tmGpi`Tj$$U<6GfION{_T7>%JXnajXtXuvJZo zG`BUR?FX^4);Lh)T)(XpnBt&+ntpWh)d|UbcW#RBj`Yq3q8xcepZ!%*TLm8+_6hG+ zq(-x`7j&X5DfXS;S{@Pfe59^B-ESLp&R_RC@dfz(p4!OGMR^5=lqoVKp56}Q^1+BTr~u~PS( z)A1NP_DW1P`UGY4C6^lh?qoS4t%YNS_b2i^7b(fKES25YiA#~}8QRtKpqy?r@9Eh& z${}_Yib}5!@4hN$yrf9W^y7ygV>{=r5+}tLU{AB4e7<~_Ne4U|`Z1u~rvKI6YlGsw zc30wQIw`X4mfV}%o<)$oSQRba3MirF`q`h)3hcdfP!G&cuNs+xZDb~2lksY9HnFH* z!cCu&y&yHo7L?d4(=2vUM_C5SqJ%H7gHC)emN2pa?4h%2BZ34Mp}b4|dM*Lno}oxm zhoozqnLD^cuyF=tL(X6J5T222ufsn0H}N-)`nz>W{N1if#E)Ip;93yAxj0SsNmq>F zS=8D?ah^r(LP&vHiyB=f&ud%OK=+#6WO)p>5v{Y0=oF+aMsz8(k=t+;+omP&>!xCi z&*#&{FO;9m!s?;~>M;xDQmYC1-jcTYwk(X|zGHoB2PFNJ=A`4N!gJCNL@depIc$V~ z8zJ@k&;FyS*6`o_HI8@yxV@{-KL&B60$=rnr+Js zr!j-0JNY`4nhjZ&_rJX)xoIf3%q)~LyN!q5oZlBt^p*#T=XK=t0L@_$vTyCb!(Z+s z`^zP7xM=m2lU}Hfd{W8D>gT3>@$U)QLU4m3N_+&_L!V0bw|MYz>Zq*BP*0i$4R!O_ zGhFMA^Z8Q84pW@uF0{h*yyy4f&ryVNX$NGMMPddv?cYW^Ip$Rt6t6nzoA&4`m8_oH zyyM=mGf=kd;>Zi3j?f^TE39~Di@P$`lCM2!NiA-7<{;hA>~407S`5T~HXeKFLAICj z^nGB)Sdq7nJeDX1+Cj zsu880;~&n9=8~eTN>Y5iR!b^uV-!hh2Fl5cJ*OTQ3i++~;>v*!t zEWjo^`#NitQwNEiWFksvJN3;qihP!#j!Kx`24s3t(J{HyV>O6VN8;Er;?bA;aelIM zuCPaR7e&l2;QDc7)A8 zZt;XULXtC1+o78xp}fjyp;8ZL4&ySRtEjAmPLeGy*}@v2OiHj=FZ%mC*W5ANU2xAr9E z6KO_VCqI7`?UqZCO^C9xne8(8Nd#8Rt0Ak)vZ5^VmF24hf77TwVZOfR2eKm^;eRZ1 zH~a_w@rGad$Mq`zxXiiy*3&j%<-DitW3Jcl27zM)SfyZt&?P5D}*ogjBSB*ni49&r5W`+a2&=pJ*{h&CZiUTCMP%Xo42m~j+Gp3Md-qFi`n@&1Q+-(U;A9= zCG)x3_(&4XXys#sB%e{Mg_cSe1?x76viMElJv6ZjY)=a-&jZPKK)wW4D>?*A9B4?YTd9y-j27AXL+!F-K)7UkLQmY1Lny z3{@D~n7JgihYl?;)7rUGjqjqn-|lBaVLxAH#n3}yuh9N`H7!j9hry5cm-DPNh<)hI zjyqHcf+QxeX%pz(kTu$t`=-PQih#D(XgeXc&Q>GNqqrXHih!7#>Ay@(t7bFmN7)1O zx1PL@d%(Knish@nKb%Nfzb6~KzCtzcec2BO8w%TZa3TOSV@#U-p6w}uvTA}^f`_8kuxp!R%3cD z)MlN3UCs_AFUc3gdF<_5v~PuZq`jw7BG0sFFELqmmfnV(>;{%mMxT@Abu@p-|Ca1C z|FiBa3H9OZXj(f%KpHKL_83iec{Bd^lF_;}Gb|RzS?ugkimPY}(okur$547pY$N{n zlA$^+!=iSlcBgiy>druk{blIE&f?rY8?T{`X3tf!_|_KcutWIl2)q{1Is6_Ndp_Yk z5{pa!{ShfYy9vKJRjL(_Go7o;b+GKeFGsuz>?3KIg##~Cx!}Ots8TM8GJxfUzqw9a z*vT~k6-0q}@>j6dIK&-cP=T=>kb&-S=Znk44W z%G193a>zV;)ll!MpCEs_7Q< z;dSeImMs>~-gr{Jgsg@Dw#hwR41c4Y^wAT7;BjgwsBL}i2;!^=`oqO)%{YSd%DbtI zsE;DOzQ$qb4~MVn)=>Qs(27T| z1Vf`f<5%A0@yVZq`P&Efu^s6n*@4eKHNn7pa45wd(LrfxEU%@x5Id9{4UUWhZi9JD zrLi~ck-B*B9b_@Q4rHOY+-^{3)}V^4_#qzIb=!M1#VVzbN$3o&pnJ!F{b@%vT>`fk z)pC^2QRS($v_Scs)xJzsp`<=RvHgGSk_NzI6~3u%zy?!9Y)9BGy)f70??j9bd(GSL z2=F&9i2vl(?IDC0-N%!sG#!N7v9xPCm@LJ^uXcQBGr8=qAXVKXeewV2R<_V-Dsw`a?V0B@$ z8j{bGqSu6bPalHr9((L0u}kdZTRURs3yAo%G_{M=a2aLnw;`sUMIOt;CE=bGFV264 zYm&tu&X5oCy_=j{>%MmoMY;$tArl`pn_va)&ZUENo9ww=EKrQ$7|N`*HD^%f7H=rF z^h!04?PbC32ikEO=G6QB>*RPpWqNY5V1f;Ad!@&boGjZu+InXW^5Iu$*#lf6c`J{F zZ0{)!{%X!VM`Gtf4f2gwb9(2%h}}x3#7jY*cp3>sSReBGT@ZU(qAQe2r1wcL6*`AY zL!b-!xo;KozhZqi(RcWHdh2#u@E#|Qe8iB*;>TvFEiyAqO~j%olf{ur1vhip@@+VILA|qZNWQe zM6ba4j>_E(4dvWmrQGkmv~!?$1tSdLFC?KN+oz!c+BPgRj|obz6z`2_PRll)dbg_Bn~rG9hOocIO-d*)2p{k%ec zxJGXkwB`;G`oJ*0EoQe)qa*sszox-Iu9%9gd!ynsF8k;YqKvm+dU zumCkK%3P69B;X|qTKu@zX+H51VSr17__(XDWKEe6;_V@jMuWfv^lh{DKy8HMr4-wem))K33_F=m@A8%lQ zV|=WIFutR9R_r35LHLV$eL47r_x?3HUcV6HoCxxHJAT?%@PS)${JS$eqj@+n4_qJ( zZ#I0BA|JJZp9pe(Th}|pCvTQqjhfwn88$vZj4c6_NAV%gN3vy*#B#Bsj^W>lx=TSW z$wfR$d#DmGo%q)Wj{FeF?=|YKyG1j71eWw!&hN61b21Y;aP5BsRJ9@Rfuq@wm)?8p z1-iU+l9i&hDPo$%>R*BI`iq4!mfBXT`#f(Jh>vve>p;AQhUgyXLRo^|Ar4N#Wu7&w zgSd;LwXB!N<=EgRCYRPmhrpQb1#LYt_EYlL<$6t)sy!{KO0&)x6u{y zMNsdV1fzJytjp{NvXUG?`WpV^`LaIdcfU$I!-3qUVY%5*)MLW%xfnwHiNQXR|GJZ} zntwqBHA2x+JqLfYl-!HiL8@<|3ZFGw)=nJ7gJ}n|zGLWO@H6Gedg$f*uEFM#gYb7K3 zdEisvn#eU)*TXy}W+42;V`A23o$LuO=M)%U8VV8mIyf7sFOTQPN( ztU0n|o82Ky1y~!ZBO{=-U$&-1}2(%HHyBmG1CwqRgIg zR!n^;Pqfqg@i3Z3sTqcV8c|pd7&umv?KOuGRb*|7N$el|{Ty*$27je_%2HT-Nt*I1 zl%93%?~9mza_x(|$BJ%p*R#Q5x@8;m}(e$Qh z_}n|5D=H}}GsO>)ei_LUQ2U5uQGL_GIf1k@FopfrD%d?!&Gk4-Y-W|smDor+^^`El z+~OM7*EbiS5%4dole0?@@DCN5LB#D%KvKjPy?8QyZn=(kJ;=&XnX& znUWNnUWLr}TgbVvcgar$;m4LZ#q9voyh&ag)5sgJmyfP6kffG&EIskwmoy)%J!~p8 zNxoOI64m8diMY+K!hMnn|%)WSv`)(QIa6z~44H(g`lp+PV@N)5;s4wych! z4wM8H)q0Llkw1>&bXvei_(p|>zNeLA7ZcA+S4l<>m*n{906BvA3gjj$EseUbb5EJI z?oM(}l*xGiA#ar*j(mb0AzqEa_8VzdLm~SoIX8?QOKv&yFzTkA`P`G>0w2;Ed2}}D zPoAOWP*OB=b#lbD%KL^g-z*LUeLfg4@HyqlxAkfJJxb1+kmR^J!8nj}U*zF)U`@oC zHm(T#oC2<8_{4f@CAHU$R=aI52Xt#eUlEq&JkITlcb)I^IAOYasoGKfB;kFi2PJci z9q$e(CTBNtg?EJeI~bD&-hFfmW|kT)_NVoD?{b>o)m}K1VQ;ivvA1`E_^YotPWAib zz3ekslIOf77M+de(FiB}H#4_OncGx5Vlgp493`ZMa75E}4_X&#BKBotlJx)Wc;|ed zWWG30@*U;>MfwK&VIj%(&U+!W#T`EP(N*{wd-5_2SBrvEiyK)aHj9}}HlL24#4a)e zS(H{zXni^%=8X{e`Zq>7e`=2FlNKj=Sf3=E9Kkzh_^Nz#UWCB&Zg+@R^FUX(WS_n4 z>znOql0m+J(~p)0uB7uaG6#ys$A|U|a?y$LskW65%o_|9F2^6$V+)Y~YUNB17!JCb zY)!A#EjUi^#NVZ^-!;?(S&$9(CiOgr z`>4b^N%(t+cMdB?dQCld6GmHUkASKNUR#EeK4z9eJ4myqwPU4|@bC`r>_hK4e&Yx6UV{Y2pONQ!qc=FVPgPIxAX zZ4ef)rc5s`U=OY5&3wrtZ`ASA&vZ&C;oc)U=^BS^7gtEd=V0YjQLI2t8VT<%0QfozT#lu9I zFWMVJWA_)$_6pmun&88n7>GXfRt*r|zyRPQF*lu1F2lVX^B@ucf zIsHDqOn4gk^!Cw72ru6>_ZKLSvMiS=5@m;N&QEx~gf5(?fw{Hb-mNsr;xL7TRG1OwdhQn)xRkuI#*Qk{`|o6Pgr|$^4?$|Z$_XY6&cVj z%sO!)IT?BWiJy&5L*r;qKpxvR|ChVO7Rl#;N%~`98kdEquD{n4pF@SPH4pamb6Pxx{f-&qM%J8pg%oj+|WCa zwnVm|Ztv~TK8yS|Fy+Lq%{HWSf{md7KQnPn9K|`T*yoc=L7+1;(gT=N z?0L}1gv%RUE6Ic2og>7DCcs@qR-MU4tz)%ON5;`e>j8m055#!6QkqJ&?jAmMNmun=m2wP;uRa_=b4 zLrdhdz?HClJA-j;qI9DuOcZ%E2k~r=+Hp*>kI}mO&-c6RISpn)Cw_Molpj9rVR44J zA$6mrA0TM{^6sX|uF4*pO2$^tfywGQ@RyOtRU+@JMWQ#e2w#d%BuT#_FFB1^y=}xM zmoEMiiSkHb(W&*`f|4ngah>WBj;>&dUFBItwpW%&!>hvO@y3lEq30+r#h5H2Dg7uc zl57}${?B&b>{2}m!Tj#g@`*(!6Uu4Ydnr5cv2df{L!RkLz3*q0?>8#{$8aaO9LV3< z#@Y$u;a_M|*CPYX&s$Hfc6x(odH zv*+a;Ysn(R9FnCM8zZ;Mzu$qh=SZjkySPN&gDYRX2V)-WQD>T8;f za{}c^h}FTdqRNg6X-Q9Ar*l6yjY3CdSC*rC2RS9S4CUrZxxZOs#(fX8qbu^&!pNVa z=py4+k!%jhEhp)2DzY$ zqKj~wnPQxbDMZ>iB)5{Rjs9Ql!lL%D%P@$!GdKKqC+T0?Uj~vw!0Iztqv6eVSNQSiQK)ozMC-?bUZWb;t>j<>UGQcKN^?GiVV0*H5 z^P=RscyrGLNp6plBcu(ilUK^H*VNy>iUD*;aOG$v=EHLjAH(b6%XbrqN2z(W~# z;#bmAugxlHb)dWgECQu9o=eO8i8&|4?`Y<;oJ(IFiCD}L`LtrC4N}JTrBOoBhA@_c zWi`n0k771`*(gN1A8Q#c_oe0X3|3IixfFXlR+Wc>_QH=U^6Db{9lr=%UW2%AVpO5b z`TW~H2H8@sWs@82m08~0VM^1~>e@GR$orD{X_ohO4Nhn!|KHYR?)=an0&7>`~>W zpuPAblGT1A4`=yH@n_7k?r8F@6D_?jk@*9y$d(|t_@auWXgy7M7Rx0=SG}^LI@#l* zt}`>rrj*wYAWZD+gfj>|(;b#_&*H~Xx=vqcPWdVVvxp-y8pXT}8QiJ2=k8dW^#@OQ zKE3FKywK=Vg*GFMSSDq!*zHmETEaN4lPlRPC?dcrn{Kjq)UD9ig*nLjVoMm$p0X5{ z@VY0VRISnpQPxPaT^dt^IRERQJ#UM}P=$Q8$>KR3;T?qOI_~kvP)vYbuR2-Ly)W(d z?JVn2<(?GveXdM{D6^~a_2|ML-UVi>vRP2%|h9C zZK=&qh=UeuJ70akm8IEF3At7bMG4!DA7u2#1pHpV#?5?Mdu2 zROn}R&S%?wZJKNqvEr0Z-|yn%dI4%qjv@R5TbK~06@QRC8-+S{!HReg;(Oh$x=Yn_ zID4F86?KdiU~&1C9onX$t|kGsX!MVQ3oIDHa=1V zd?ejF8){XI#1VU65ng3#2v8l?H#Yrwu(80~)NxVv4Rvmh&MH**QCj*mVjJX~ z6b4l!gmrxyD6toeuTH(uE?TP~+CcAIUN(BnrkGl3;!)@CP~&-zzvq&YMl#gJ+V>un zYJ4Xxdvw8Gdl}Z2YOfDhY_*4{S|_!HIxB~|&O|l~CSV=Ug6Gv3(WOp|y$&$;6&R)^$K)Zfwl=w1<^dC$gF>>Y}|b>fir0d*NAFuhi26 z@w9;l(czm+%Tlk2N>=C8P}P);^_hrm_#m)qJ5B zPxf_*6oc8o5JPeQX_RQsaG@%(8_S(qiBsTo8YOnKWwhvGFKrm}POY@VFei=Dy4!MC z*h@nM{48Aa6w8YcLeeQu&RU@^Zy}H4`MSJb5-Y^~Q!fo$jAyA(m$i;Z-=v65{8#`s z&q%X0%1WUsP23HaA1+_U4(>>yJhnslo`p?MwLFprWus7+cLu7Iq1+E&mzVnNa@O9C zcLg_=@7JDe=~vI65KgmqZzXmUuOrhg=j+p_24HLO*=mN2Jr`+s$71lgFuW!@`rQAP zQ_}x8?yQ2k(b=t(m2(V8TcxcYTPdDp1pj;SR`wTpHd(5fAM!wMI9m|}H^>iCMX91k zMcRkW$NyeZ5ubhfKY>T>PVG+ZPVG+ZPVG+ZPVG+ZPVG+ZPVG+Z&i~1G4w1kmqE5cL z0T-pFEsK}^NWTR*^yE+poc0Yl*Ht>zB&PTq`X$hz=latAPmgI76>L5{f zaD+!K67JAGD?;wl8MuGgaEkGZ3v?RZk$bk|{F?B6n-#DROQHyzgzllx-ND*GxGNT? zuwJ26KpyT9Psr54R;zSk;*S2@d-abWk3cc3gnrk366vi8%#Uh433IVTio%$j?*pX% zE>v}`)$!Ud8@+3o-D3gHl+*q-MaZ^tiX%?snveItU!9+`56?T9?@3$o>mEo!XNYIx zpYTYE6kB1b6zklkZX!k2I##n7RXoJvF0oxKnChGiXLz01PkUKL?D=*Eud_=Dekw!Q z1|hWn-Vu-HqWC$xZ+GAFDT>&FN`gD)G>8O_0-{YI zN~Gq;V1A&cj#DNI=rq`1jeSg#0WyEMPX-`8BxX?rn*G11$DRYqFrdx6O=qayE6){!2bC z4B=6GLEG7wKv>Qnemx1}HC&O(+=7P6&qVe(_Np_m$F0{My3|X(guwdL$wQFgT{Y8!)zmKKkR=&%YvMd!I>&uew0t6Lr|faP-4IP@Q5{CBkoCp(@MXWV z-cHj<@AaB1U}C*!2$z0OJ~~k;LaZxMaE2?|b(C z(bz`WyxwV4A5^6H4A%u0D#Thr`9AtL;Vx+{#bg-=)@k>)Xq>G2Ik1{_7s7jl;!nq7 zCq*jVZua<0IiB8Wrs&|RZziuX&bO3q3nh*q-*&%RF+1dgy+e~+tZfO*Cse_GY@&18 zR>*Hv>fC}U!F;b&#%?2_J6lx#P3ScH?Jmxl|KqlkW2noTMiP3}8%AF;Y$bfK6I&GR z>0NYA@v7xhiGRC%(}7OHb}hp7G|OHse}8``dqWmXV-&{ySqQ_kIv8t`4%LjQx@By2 zcs|?6eY(Jr&J`HNU(B-*^Ru*i8xsHI2;8iA)Tf-pi(_$a-&c|1q=)DM<3*>65-$<>ofqV2+=nu%*md4K~6ccj`>-;Zw|9$iE|pJixcOY}wh z5T1iMPi??@*m!;3>B#sSi5J8{Sa|c5%r5Ei-dJK4$GKQWAw~N-d@xAi1l%-@W=odG50pTZ2^3DK=+{10$b;QY0gUWLrwkU%^&q&_M4eF6gcKQWk_}j|_8`oV5m$_`$W&DSw=(Jncw*E;qoD07b zN=4hS46?h*cb|i|2_Ly5d{p&JcX`%rt%+g;kIx?P<;b%RayMu7i@g#cud9^RYiGfW z7UGhT5nT2yjQ>M**U1&Q&u=Eyt33B>v0{`j#|pWM;!G#~IylC7Y|922Q%rr3ALy1(V|2sKKve=?bKU(w*)SM|Lmq9(O2S<&GL%s? zjtl5wT^n?alH>dI`(0SYxh@@xm5Q0}@=R}gDu+OePYvb?jA(Bg8`LUoYFe>g9EQd! z=I3#OvD>D->g5Rh!tZ&sseb_g0RR8&T?u$pRkA+kF1@4^5(r_HT^2!1Kx7Gu2%{kT zqHKZ~1%2WujtDCHRL~JeR1gr6O-0aQ6$BMjWKay7B8!6tL`7D`Adrxdt?#R%Y{*cHbUH%J7j`-~Z zu&{o=c#GDk=8Hd3$hBgcaH;2bzfoKpI01dAT-#4wvqSzZKLySODO6vsBZ=q3^9ne7 zFFkvmIF^cYo%U6s|48K$e$g%}4u(`|@BytT zkdx&C4a>`B=D!eQii#1_VmH*9Xu(NxE4?p*ypN$5K&=u#E$|$pQ#obC;Uh7SW=nnt zJxU5TThE^xNdj%<*UUpoR#U3d#liYn3*4#3ZW{P-%a@9HLJ>s<~ z^iin`V#DN`&bx#WC6=DL0AI8b=L2 z%(qVG1!e>m8hBPuz8=a4HAJpx9O8iG=5$Z7^|M$-)@gP3_wykSxY`f(=Z}0J*CtfU z@)tezaE(wN2)8{jAM|hGUo;}ZGKkr5=`aI z;u^{ikBUZEteZzaXsGJZVEZ*&+)d>KQo3l@E8$*el|k=^MB+45_lox=O?k_HA=H*5Xqx<*V0(V^^%MY3Ak_*asot@uRP)8KWrZucfJ8^im4 zg>tlHRvAVsg7K!RaN%?i28jLzro)N(1xTm7Cc&N#Uwqi=tHC|;(!{Bl9$7fc#h##bL;)I1fkPs}Piqd7e8=hqxP2&F|~nqRe{PIAHA)o6y$7 zWLsPtmvvQMcK3F9XqkLj;>Ml*z}4%CON9pEf-OSSaj(c0J;@)yPh1c9N~}XU=tZMz z{Y)ca4~zNa3!M{711kxaeD7dk+{wMC8dD2e_$M$7uI=;t#P=S0Pbcr{h1tZ(^N!eN zox7|KNL|_GG56DHjimSS!w_CUg$Wl|~ zPhThx+U;ymTV|(-w)1T9IPUC`l2bIc>SSxR=v`PUXIKSkhLH16g8d1BTIbQy&@=b< zNz1Gv&r<3I%=9#zoWIhuIQ~U>9VB+0X*OWbcO>1)ISv^3>QX(fno9@Hogno%}i>>e9q z^F7c*2Ae0XyS`qpl{d9Z+20dKL$MxR((-uT;)M_{X+!-N-Vi&izytcCwX4~rIbsL4 z`8o}?rkqmyYvfVsfbA(PiKf(PF0_gAU`LdU@_Y@Ptv~(No^vR7ANtF;X!(%z*y6j? zb&jk*`S!sZoUM%R zRQb`uylB{LjjhhltWn*@&MYX>qSBzOLIbQ>6Mvj>&^k1Cua&p>LmHELrVH&hVV+$w zdCqaNsd{1*Zk+jL60UOS=?k^A?Clr49=_Qlv}N*e!2ak1S@4V2y=!e9#`bTCIFWUP z&BnOv6{hSFp$T=aJ?f($6Emp{#^-4J?LuaQR(Zge&JucGWT15ixe}z1I{g1T_E@ro zLHkdP7FU*{H<$Rd0$s&YU4;tTwil*F6I18{dXVk$?S0Un%K%#ia-c=oPmi+mtN}?g zN^VG-VYhQdDh&@&&I@zI)11cNSV(Obyn;9?A3{?D!AYN6;Rl+HN21MHpy5m^i|o z*Ta@S@1+`cm$UVvPR`9z7F+~zuJ>L;ySB_$V|f*!9`jO&UP9XeEus3gsZ^~PsNX7_ z?RvQPh~(x7Zpj`u2LAyeL(yrxHWOW(x-~0%EGvYri0i|{oxhR*K0$0%5K@jC~M|<`;$Lms8*Il?||OH zMr>n*enVT?+~$3J%N{BPF(=+Z{h|bHkzW@3jTLQZKNC1;L0p}I{X_`k9*jOmT0Z9rj$vc5qF__YJKH4Q}#^MTMO@ zUL%s}t8gd|l>hpw&{BO#=o1n@r5XcyU@s-Vy79|$o7JutKakaSKvg%z@hA?JE!j?1TH#>D0;3hK zs@4xe>mxCgd-QT_xKEpAx1qUYK=;ha6gKdynkCUPjRlvFVKPxj)UONk(&~x(YPKyPlM80rbg?039f&vj2fSU zc6(wdy`3}`CiJul(ge09k?Y`kB~%w6pWAV#jITy0KBK6;jvjK%`;5b!j$tH4_Oju zGA2>F#Pg1Dn+`QSm_w}we2zPGC0rqo$JcX>_}H!|q)bT9#qx9_{SVbw)J_WQ>T-f= z{Aew)HHx`)r)#alY^0%4=WPeITur%mGPS@8t`lj-Okqs$i8qtgb1ch>yLxush!Q}* z*ro2P#MP>_`h6j-D%(b2jZk|8{GwNXf1-m9*rLN)>}>jYhdE?JZRdIi+Z}5x+ynQa zBHZ07VSrqaqVDl}q;v8=x?yXqW?jFb?yEY=T?_Kjo4&oJjb_#Z|2bnR*|*8UD)ir^ z764lRblV3-Q1a{$Ey^BjIbr*+wELj4_;cXi1B#EE)_Sj=y5idR$9;W%z?n7v&G}T; zc2a$Qe2zQAkNd#7DpdsK?q$jKnv$Y6ydC3C6ORg%{f%x@L7og-?OFl*O)I>%5ZNI* zs&7@B1#;RVSr&i3Abv0Pf4W!HS6ATskv!1V!hQ5cP#-owEuloGr%=k7d%9k#R|-ko z6UX>_{Ap=zXt~q@+HI4c+gl%JVhoWBGD0<3H5=7t_4XdsCWzfnewaD|J-9}i<{x^> zZcc3fU^CA=-2M3D78ODg^tR+`*#J1?birMG|Ctdg`)h{YY^67Urkc|+J~|&g93S*D z&4SPW{=v_<@04GD5{wI5qUR=h_smvT%UXCrGZgw^yY}2%`hTHe{!``;|KCuy6kWuY z2XP;%zQTIYdN2ik*M`@~dP~t&Y#E1P`w45DH7;cwhV4ziXN}YN+;r@{ z<8x-s7cM*#`;KjMVrybe%!zIDj-AZJwr$(CGqG*+4&R*f7yQ1Qs`tZFwX3>6tm@u< z^{QRHSFd$lMaI(q_ZjTn@gtYai9tK|(@46o^iacQEvXbU&gvK}|{2 z0jRTXNmB|@E#WH!Vb$4h3!FlPha^*7knYyYcw zn+SGG*S7{Pfo8m_>JvFs>rhTRoShUI6QdaOlwYAwL}w0M{;EY_*#_bXQ6356Y+yh_$exQ#g*~ZT+n;$YUSOfFIYG6nhG@GdkQNXfjPnXko zoW36yP(WMlc55MCGU6=?jm>{uVT+2>J#JFo;wIZ&OTaEE?JFR@@Kck!L`Dpf0IGad z4#veTeTc@Xa$CX?-6v#W%#PI6B3McGQa*jIm<7U**W zn;UqPC$FGuB*RCdQNkrP(r+LuQvMD=8e~cA`$c%1b<{Du90eb z=;Z_KZ%!W_7s#yDL#Wk?p1(L|>MA`R4p1*N(kf?GtxLDO+4zm4sCms2kn2#^=8f*6JHCuP`J1ewl zMmgGKIe;9f4BQ)IzRT20Zo$k|Lldm_*^y>|pR2FzRPbWULf9ZRUC11{gq7z^?yKIY z#a5V=0Fdl(Jpud3u<0r{G0N<%#1LA-T*Rzu|L2;}3ujF7+vHz$KCR<}BEuRaE;~yu z4;S|rF|EnVHS34)T927C)f09}%v6dwy{an!WZRm~^W+@-)tq_Lx7!LosvkYsF&iXZ zo%We~@WV|ImruQ~M~NL0+b>(!UeMYScwA|55D6Q*Ag-Y0?+nquIRMdUbG_~PCa{_b z#@}>2d+x@Zs~8)4#w#Q5j8V*epilF-Eo|nMjzNpA6Ob)3!Mc_ggIi9tA$PMz_5?%} znUU!XSICf+CwPCnqG@z**uu(R>Yp;wlm7+va__ed3*c0^m7)vyYQ>5L-zDn;%D-U_3HLhjCZt-uGH>w)dnFxL%Q^_Om_;^T6W&iLvRN!uIHaYqSroa-Mip_liq&0GGB|{8Zt;* z^%s4KN;NY>TRWGhs3OhO4>k23sVls42p16(t$AO+6Hs3E->W+RF=xoQupS4$scf9= z#lkmc&oj!o#_(BEgY|&Yep2?dN-O4@)<8rj<8OgZLAv^(s>I%tx?6|))`swW1(60C zl3M{>;?aeL-IDu!rxCa@b`H0u(>~gT9gF?PVA!!QAhai6T*>@%cH)pi4*v%`*u#Uo zeK%|s{O(9_Ty^l#`1Bqf^BXFY`gY4@odzCIIL$EY8H` zMc!(@rW@$Yu@bHk^?ObA$iY}lT+O8HNHv6b^gAn}_Ly6Sy1aU+3EBF5?zz>@b~Ucs{{0M1tS9@I5|%9!9gxX1Ea$5XNOk9VJoL!p;A;91_)-RE!u zO<7MGZTj7F?N6PwhLeHE`=Z6$2aE}OmazN!7-z5!>i(V>d}rBk{M;0$^%}M20@2oK z7q$+;+;CF#?r*Mv(Mz|3V`Ln7ho{U@n+fwAd;wXglh;7p-E?U0h+6= z#&cA9=%SMB@g>WcPe7@Fe~aCMthZj2<`IAC8vk&~3ksLWR%HxTo|zir zkR8logABdq{<1Ecax}Sh=8QT zB{Yj(Q@@+(yD4FXAW>};ym|foy#4U<*!3o~uMHxecSQHrU%QeCFC6}lxVo6(VaE~( zmIW7RFZL`IYR;tQ;Y577i&bPI%XxL-QSaysm?<;_E8BTlfxJD0HF98bDffWw>uG(s z^z-3?#t;0!x^SjLtyaYb+^87!5VI=F=KD&LEM9)Ed#UBy-F3JSM>SGPkgrwKOilz`JJ0Hh+P9V4DXr0C*d#y{hO&&#B>-E`IGHsH( z!tM^&n6`3@P~SZm9W?n_g;D#qCFf%iV3p>egBrjmv)A?nHYsIU?TdPBfLptRHHyMj zUo3PPpN1lz*1W$#8HKaWg*%Ee3~mJU&wT8CRcT$rD`XAIpp)gi1gU@P<{W!L-qYB? zbQ1>ZidoTqhribtJ%6)aoFS!I8i#o1A8uiql&q?mw8=-9ZGsPudaP|>33YA)EfDny zb3}vSZiki*UdFL=yq1ICw=v7ux3##on*tZ>s$5uxKjKZ_Fy(Ma8%%|Xo}23%1fTl8 z_XGAf)#$vFUG71I$qUviM~yuK&4W*X!Iy?iSF9;F^sG8gahH<$ovCJf-!TPjlmmXc z9XmWpu5aY+WZT@P#u`K+jY){**&oCgv-_)FPMvCQ7fvzsKU+^9hc2#oQI|=kDN&jL zhY0xhxR1(F5iJ(vm0eN&c(=piFr2g`W4I+!8fJXinLR!x92Q zD3nK@CX+w;oNo;6*pBa*84D^^z8{oyitd4XEMktxK{nLkYo(jkPm+4L5DBt9$y=dT zb>~rC|6~=Le#$M6Uqmm`{RX0{Lqe`W$?T*#7U%s^U0O3*V-Z#7%&5W|WhN_VpV30f z--rk|7Od&1x;?ZUFP%YUPLK3@O!9ahG!rYTzvTKnwn($k5`kY2cDA!Hz|(EH(rn$I z<=GXXC}s+YCUOF|$0uZO4<1Zw zFnZ7R;G8K%f%&q@>yUcO1W!WAr*SC(kyrWmWas!L!B?+hbW3;_^SoeZY?G-j5jtfN z-vgF;g)5R*8<7;&?mMaF4ERlCV!Wi^1km@VF6#c`O%E?WdubE{gyNz3xbnN9rckr~ zw7(fft|%P_Kva7YJFjNT?~UFqj7Z!<1)BgmE3pV?dE}49EyXrkhL3+iz5gVN?3xB< z=Memhc!P~D=L78~8QsU@kkn?;mP^@9FUd zo!qvbQ2PQW4=uF;_j||~pOo8=YTcX4PA3*<8PV$Bm3FJpXArn#siWh)ACA6~&*6-J ziyhOQLDn5Fe45cIrrrinzlY7)ft26EP<^_00m?iV?K>SM@S?$6KjUXt%$9lxBH44|Dp6BO8*N2 z|BKCkzVshT{|f^Di_L$&^dCz93j+U(&40f1A4>lV0{@H6|9^eS8`2Bi?Cz7V*%MP8 z1{QaHV?!rU#=(L{ms$;Ouy95gK0!EFGFKrCeFnm- z^YhWYD7&t;ed7o;#mDh=n^_+K0gFm58AB}eU+4b`2p`SL)z*t|6EzQ1(I1pXdGmn=_H(xkWdVR z76%LxQb4AO{UI|Yie%>NEzE2da}a49HgJ<^?16`q=_28n3^^v_ zNi$`tbmkjv>W@V88GpbvH{gyFL0FdSqRES zzx+#;i~GJ7qyKV$!elgrkizXmIg!Q=Z#tcY=yW*YU)}wIdpMN|e|I<;Xx9aT>Uw|F zN)hxGpx3DR*7bVH`~2~GWw6s1Tw^{yBwJf9S2 z>wj%=jo~2NGw3MW;A_KbEEi}sIz8Ace%C|!fDW)U+Fcncw3?B8-XGL8x_$VqmutTJ zyk2lFw>Xf!ea%s0F;BVN;m&HkQU}>&y8-9>b^~p_)`Zw(w}r&(dhVCW>(*DL)2{z? zxlv;_O}O0d#(2Kg40ycS0zf0-`vpP+`m%jLU_+4z0{TM%{jp>c+h0oy$d`!jt2G+l ze!khW-yMMEa=#_d;BkSI%N9U1o67L7H=FKjbvoMq@=g1lKFAi}4XJjUGwct&E(G-| zZU64i54Kz1<5Ae7+{(^SFm06!bxm&*Jkhme20{nv9r~6f8^77l~1~!!MapudiIadi&vQ z2^j|mR#8#$`fw5t`1;5oDj^~A>lebn(2%gUHvYiyu!yiQScm5m5-J)R2@MTwTzq`5 zX}y0Q^?kQE8hQp?LD{C*j;KpaK&MQAl1}Mmpl>KJdE1w<%J$kc8fSC3ZYO@#ch7Ib z^lb(A8a87YMu`L)aZKDKAMl}rAh74lxH{s)`pvUwa|P8W2n|kBRi9O2JJ5G2;Nk5` z3{GZBezf2ga0&@ zje-W4OvCQe-%ui9is1KaJL%uiTh_treg`AoJ)W9_zIst_e!bq|U_*HzR6%Y?j1Lnj zJoL2aC9ouN_WP!Ht0^9M5o%KCVWWm=ugH0$@9s6~6Q z^_#Zb7C_D_eQRP0WbSh-0WXAUhd^kTzLEyM71>U8Q5A~9KDZV12{zDA8)2W+_Bs;@ z(hlpl0c&O8G6k9sA%a_vvH=GN^wo0^#i58#`_Eorecx@pAu!YhUxmlj$*3_$M&UV7 z;l9TT`V6rGu|U1GC_ud+puQ#>?86K&SHS7d$_`n>X!8hkVZdi-uJ#SrHo(Vo;|% z-w;X?wYg{ty$P|z&8l}&=e@k*ZfNdl70VBKafLYa748hd&tcJ{t5U1piH6@KD!yCWApx>3g{JQO+* z+P>SM*p!_&$R`wAHY|q3*>0)|cJSGXBEu=T%HaiWH&RU;k=^2>`+uu6&Ia@?d?~&f z+`ty&JO%ItNjnHewnWjqcQqs~!_T|4l&GUTO+({UuPN?KSiF$@SVa2~NEZe433G_xXf*ruGltTjZD3rMo9YN)VX(qjetb>Ls%PR zj#tEEvq&TbRCSo75sxp`?hxt<^zrwdMugDl9nW`dbU1MElT)a0D1-48j)mat-kQIi z%s%!jcR6|a)*0Rh%Hq$NhjVI77*Kmhi6*%jx%}-Z?xQ;+#rIV0zwS0oGPKYK<<+M> zuATqQV~oG!dR;-r5Q3BG!{}yfinlT0Z46SqlU(tX86iDdnGyV1cs@PXQ` zI89W$v=+HogN!ZGNXhR$$&TO25C>}e`5+hCtGxvu*soDtov({I0ySs7IpiGg{0c*F zP}pgT-+xQ;_X4MQg(US1S!JH2WYlW)Z@Euc+7xrzM!^A7sHOA(YSFS)-ijTmvG-T8 zH;Z=JD8ALbq*@l=UYn>RQgg{0oacnKd?Rk?o(r5;;4Q=`8dN~l4uyLwpsN?LK#n&EEa|d_hs++v@GiUk^xw%?n9xP86D#>V_R?C6;~K0JAKX2_0l?4)rr%!2IoUddq|qS%u4HN?5M1-8I@ zm3c3OWw!@V4|8&ksC6(yKtCd&Ox}{0w;eF>ib^aufO_hA4^kocFXLeoXIbY$B>3G)Xl%r{LZ>xME2IB zSQX0B;f4_GvMycU$V||1ixct$#obHVO}ehv&qTnfU#h??Bt_pp(svxzC<-dR=JdMU z7W-tlsUw^?3gtaVqhdr}hC0pA`@L-`#Kpn5Wn{u`%-vXhZ9gZ+x@{=HM)_l3OJA~} z%Ngg?p?Y->-b%_Q-k;1o;8#-ll(o2+u)4?F<=Ir7KSc0bbLZJNrcDx_*AVqw@FW;7w$51 z1N!EihlGuCY_L<+CA3+ml=mz42%GrK588CmB;~wzl0|`bL=wi)+B;@*X2kv@MidEG zJ!s2sL+o8MG*I_%%f1x4yI~^DvFn6&P5~bEh}G)I(~cd4lonNiFV|Ay_}KX*C0_WT z$UX}luL68X)|&Buq%!(ok(i(g_IvKHuPXJ3CPVCHMs(pMd27-DXm$!w^XK06tI+@? zNV0CP5p5t(;A}vCYkn2DfasG|72l0lA^@gkks@1SC!_#X(m%T!ZE^qeW~{cvpra0R zJ-)Q^)a)G!VJm=bbdQOMz;4}%9PPy}hw}Y$G8;yB`6ZJDLbF+;_rl6|`Ko727FGx` zNtWVuOz%jUBr_k6{1jyWCf>HqV&8pOj6eZD)GH55AN{NWWz#ZE4Zj{3&8iv8?=!l9 z0Y@`0yozmrEcNKKZG2l}ZMqE_qG#lRV7 z4&CF!sL;7ckuA;YTM_eVy7E#&!Y{REe1N+pf+(%eH7RrIOu)@!5I!F7!S&&XD`ef? zMbzaS6?7Dw$A3;+;w(OA*kq~y88+`wk0|p@Nu0O^?U0)0RpuNzV2BId@oCCG=)%z^ zedUyt2XX6P>2^1Q`KIg|JZY#F-p?8fKXv5N6EI?9TzS&rgD?039|6#`9yJeq&IilO30X9pj$8#Eaun);(8WS zjCMOmI2Ml8AV)G5M}ynU;Z2}r$1aoby6y9~CQywBh_FE?l6+45!Ms#}M_|yfN?N8O zBRm+0S?AbgMu_@KVQb={Q%V06VPGPdcL1Vf6J;;##P;17uP1iWP1&&JF=qWLYJG=j zKPh}@_@}*FJ-jSCjRaU9Ge{ozS$hgP#`RbJr{df@6LO82eJ(-LbJ=q^~oK}W;6USotp=ZIdL#g{fvVXZw{?52l8jmqj`3S?7Ld%Pc+)f99f!Kl*3+iTup=jH_=#`) zjB5jI5@>T4A|~{r=|fH$&fjKx#A>~uA30A0MD)W{fURcCfgk39=ZNKN6iD*$nxl1F zoJYr7YF{;1rvOMTw_KnlFuAq{fIAaP;wV2!W7lQ{21b; zN*Ldb31Tk39?xC4hILfU>Llwb>cth+ z3I8^c*8w=n=V!)s)X!{H*CgzmYkj@Sc% zB7eiu**;7J0C2hdjIF&_B0;Og3sG&8^G#*wjCG5t&!WO0OnJ8leQJa;CXZ7}(@whc z$M!FN#)*_|gJ*_2 z#GqKAptdUhESMbL8(K#(h|cz9U88oCeVAPXg;M|Y&H>q|OF?KCyJ z1#hj{f9E8;*Pssb98^Ld$g&|;i{N3vV~>DBpZqgD>)eM5UMhe zPog`Y<%{l6q!mKGZYsHa(S37xJ)aAbUI7CHd!=6Y*rA&aQ|vB13q5_c&?Ywb&m(>R z*v7)1hANtlJ^gU7eX@*_?%4#FPh4xPb{f%Zkrx^g{gK8|HDQoc@0R$wTZqoXn#$ZX zAH*$4_t=}Ua^XAFd~Yl2X}!kyt_%W5auS%Bh$ha}*&E*pIMMzi|x!8AdxQ`c9TFvkQxEU=XD15;h; zWx^ZAQ=`$`t};<)P_9lucL*ZnYGrgCJyjK{)~!b`x?bq#{rU}fXJ%pd*3VtD zwn3LeF{$fVhx3@Iq(a08qA+xHJ<3wFe3*#IZ^Dzf%MjbkA@%vBTK887Mif5Jr5}sF zcQ5HN8^!3@blUFCE+)7KNC;v>-6@f3e0$1D2vAj!R(yXEAg8${mh#>=)?_8%7ZN-Y z^?v_zC!|h5^pp~7%EnLC6gh2vu=*zhdxb{(;ayeEw0{`CUtGHuaka|xFoUlE^@^NW zA~@qMhdnb;YaXNsUes8?`)lbLwpfjcs+XRk4ftb|^s&p}h;n%}(Wt0y@2aAPx8rJB zXuTK#|4EU$->mfb)^_+yQs(LVlsl{Un8_7xF*RgHd3L{}tzUWgY;CsK=GfrOv_HYx zL_>+iq*tTdv$?mh4-tEI^m-<5Hf#kSscqj#{CcKQ(@^UE^0Q*=Sw^sBDrr}=qsI5} z#3lDt5x5Csz*a$16+|aYs1avG%|?(k(m%)swIkgOd^0Y!wy{;~{lftsh*+rlqd(5v ztL1+0gPJHGO5%w$EP~%zl7F~+j=NLbEZE19;NKjo`JH1#=AJXY12i zy~mWc1g@F0MlQ4(b&3o*94*Bxn1PIiDG&o!v=_C!;q|I_$D%^e5g(pMmLcz4T0AV0 z%swxUc)Iczq?-2*`;U}YO-!p-^7C-pm~1#^b67~-LJ4alI}*t+60L$Mv~i{0Up6sMG_&u@XKDa*LNivfF1G zMj~`~w+(qtf>0(I&Jvc{pw~~{zk<8ypkH_^wqfm&Z9ka(KJ#vbcxTcPCE|@SNwK$= z2{K?F_QLYGK4Z>Uf${Y4^n@aWSMvbL^LH)@s^JrQ*kl9L0m=gWcg z1dgCA^-W;e1*i7+If+eGl5AV58It5`Ka#lDE`DD7jw=M4XBWJxpw`5v#}B@SPC<&0 zUa__-{Ys5tfo+9h0e${1kr^G47T7b8>?N|@_QUiT#11WW5?C(7H`n|HfmD;hrmC@9 zpdR+G&(P+3Gtx1jp*Jf}MXmJT)P zP1l(TK_)8@#R<=St#Px2zntu%W7eT*HlvK~!}tYwvnqq0qHO?k**k4C#wS>mqF__|P93YYWNH)_I_!N)i0qgIn8TN=xX_q2w)a7ECSj?_E<=Bc>^~FHX0>3e zlmMP!@S{ZkX2&Bd>x=5K#FrO$C2Ndu$}axC=j|N#uN~v+$y`EAPC<+cz}ORm@F=uV z!JH0jejcHoTt429>Pl zMVQN-YYxS$un$ng)K&$6!;`OFS7g9q|3m_ba!$%yrle&@! zqL?HgZ%C&*=j;&yQ8*{Gmx=RPeOHYlTa_PpN7f3`!PKIvjLt=9Cy!V`k|5YjK~Qz=Zde&w2d+8-JH`C~i?+ zr@2IT3*-HKbvsm9Mpkxk#c+9E9ons!5KYd`$Cee0>DG_FSxKG4B3AuI=CynW+TrZT zUKxo;cVdeh&O>;|DpZ&X_&pOOA+8=ue@6H5>bSr06`oKuR;n*in||J$?q;B2rqgbq zriU)q0O=*oiN%L!_Zj{IEYpqUGJ&gIv!Yi1y7@6mCuxwrjKyq`IB6o*E+3kHw8vXR zGU-Ds2%;MYe@ybqwCnhHht0ap746>DaObSejCER&a+qS>N;0X*KC0AV;b`!fCUJ^c zbB+I{ny`3-4>!nnd4~@dYCw3P@JCwt zbtU|9%ERclUj4oo+=}!haHDqUalf{%DLBdO2P1>REe^VC?j`+*UJzB<8FHqnl~Q@E z+nQ$9#=(PD2Zk%YOnBZe*u;qyA9lJ5zHuRec5_(W7&nrpJ>#&-C{98Bs}7yM9=901 zf=ItrmKj}EF>6W%wIJNN>EBs*z>=MuAzfV&SX_)iM60f$6xd~E^;0C39_MiwjBV4^ zM&Jx`rKW&e_vx==XmvroWd;%Mp$lDBx6-jL?Ptk-%MUU>bs1h^7i-~W|Se-15r zocq(TBPkOAo$(jrqR$`@sPGp>0n{o@qcf2XZv!4Gy_Xz>g&u1d^xxr9D4CR=yda z>uf=Y6KQWQ@#-@~3$@_f({#55RB`M__(GmJANSmOl=59n^6w>@Hm*qp_WqT>z~R!u z7W|!{F%QP$Ox6ikr?=4}_}1n)u8}PPH;*Kk>!p-(LB^L19%5b`&N6gRT|>Zyg`-YA zY8?x{Vhy>Te6I$UO)GIr@x%Q4|A~@MBUkk2v=lt*?9p5z-yuVmG&MbV;Fq@i zBvUUCdHpK8tU2H?te=G_BzMZdSTL>kQ=TyOwyE6V0Uhxsxxr48(Q}7;loG>pyMN9z zIw_*gC_8TlvCwdTC! z2>w3xyUb!Elk%QEDT!Wcg?2#(6l{Wl(511mE~KUf(J~jpy5q;_5*=1d8YP6>eQ;CD zM{q4qB=wgFW3C63POF};pw;lvret7rq=LA~IPODY$gOfP#TZ~&Ijl&QBSI}{Cxvy@ zb3FY8npZA$r)NA1XRI!><7rSCDP)I)g4gV6KbEoRT*x8$>jc*7mz*clFUT^&X>OMf zpwoeP_;v=48Tt+?{5m=W@eyL-wo!_xP6>%UhgKaL+P|OVc1{BaPM4TqowfPQTx!Hw zU*Wjf^gQ#)kEW6*>ak0V9+oy8NS^SG8uR-ukEkcgl*zqr4Sjo5*`sbb*Fkrp2zj(U zaC=_JXJPl=G(>#>uIgyx*4TJVHGRC;_)7YbZ*hsgYxWy0jj_a_S%#z)8TtNtDOMjt zQ*@>+vblOpv9Bj9CGAV$N(7d09t7X8rALI=@W?%KDxQAk9__Q=jYnk|b#r!|+xazn zL05Ky2&NvURS^VLg4%}wh#mr?Rt5P%(HygF<(%ir7BpK*Fu2UuzImb z5}gK|lU7t-xBRuYO*}BJKcMIuLT}Ns(EuV61X$zH6v0`p_Ont3=}zCmbMMg1G{u$V z{$?#!ox?^)eqctm55Y>pD+-e7rg?1cVP`{4?(qxGq9M&54a|W`F>Y%D21W_Y`>)D^ z&bS;M!DW1Y+_;x*I-uoZntW0di2p#3*`hTf&|AuG$g9hrdTM!lPh|gqlgkS{$xq|38NG{BFt->0F z!p-X3du&+si0mAv%8cCE))>CR5ppm2Ll$8Wr5yBNBIJ8!mUsP9S%`busltg)2O|p& z7kLo&w-AnA7Up=8R8(bThce{hqEAIX9vQ<@+oU{)=P)_^qSs+(!uH?)%>FV14L69^ zvR`{qmZlCG!uY~JXYT2NA##5_D9A>C!n^6?!MKrWeA_xxtH;Z#fpO67ar`Jixj&2! z*qkGpFm*;bk>Y|hhMo*MdFyyW8W}TUn>ANW7WsL`pwykEt}me0!ttq zW82P|cde<+p5nyys?@g%@ZhRZvL3Un(av+}{&p+f`g8Z_ASg}WykEB^>=Ej5ZMS2e z2=sOn)=Q9JDAD9k%Cj4lnKvOYN2aYeGQ^9(9Vc0&#?`x&NT4w1pJGUK*za>HLV12L z=3gHKM2&LhH4IZeh7C57Y(E7b2OdV}*Q^&dCe(=MaA;;Mz7>T${Ii4WW9&HULOPXU zE^|iWNy_Kw0|c>PSszeyZg-T5(5#gmMYEb4#n#Y+Rik4Y!HLMfe0bucbh4k}n%$pT zCzMN~IcO*3bSW=8LsY&ILNPIQbTdf}K=)ZJJ_yi(4z6fD;-m;TJ*{kH3-d|*jPuaA0ZY1ew3J9jv3Pa zw5`&rT22@X6crb4ytHAuHqa)hLyo+HPHTaSBL5Cs%}5(vyO^bMDn(|Evq!r4BaP##*tp`r(_GUh#Z@e_l%ibZBU#n| z)!anD?;xA_o~-r?8?>4$UX-1fevMDe2zEPo*3f0F2AlnyI)%B0Ff$z0oh)n?^G+Dy zN+7s&V8Lfvu;*#X^EDbn#2q-DY;2~WFisUiBls3qUpKO&!&|*#_T%AFE1#8|q4FJf zd+<-Xe}bmZsUFFkReyQz#kGt|l0>;VwEN^!sinpNBMMJX|C~RWE;J<#`Za7tuUv}| z_Ot79NU)buYpJd?)X55&i2*nMJI;;g3`wiV3 zMY%_?)v3wf%9hb)07Dw-2~%LtGi=I0pyeTc8HqwW-oYKlo%rP7+fzmrqGm*=IP+Zl zhIkE;BqlHX{-zX_Bc(e>yGe6>@l9f+Bg3h8dOrK#f_q?|DR4$#|5bvEkI{8Sp8+}* zI+M%l@mFd1+;LytEMcn*2PC|K*1X{SI)X{wBJy*ihrls;@<`|!8RjIR&?_b5xGd^f zfK^DrP`6Gm6)$nX>iOS?KD;jS2+^B3pLgfU^JNa#$gN2kz) z`zg~#n!oHoOr zi`qnYz3aa$AaVwaCQK!0LspSB58ELfC2E59I^hsar}JagiM&wtI?ha~X1oxp#fj$B zd!S@ipx5W+noL%>)O&=Q%t%Sr+<5QiW8brGeB>7gZ;fXV&}i@6e>vRs7U)a75u{_p z&zg|94>0?8C&W*9N?+(}Bp+KblI1vdN@@)LaK1vd9=MG-o!I#|M5Xb?YC5)}DVJa; z0mCZjfC{zPHJZa@F`c&GjE9@sC;#`c!M6$Azb(#ltzjnQMnr@L3i7sjHZ0_UcZ;$Z zn4#UGnl4R?-L<2~tSiPy79*p&_R$i1BHTXeHp?<`2aP84my|g8VgyoDfgI1TR)Uk& zSvm$3zo#zSbcMI#s#+s)sGI2TmfC=9y;f0t0b^W9raI_)zr~vM>%cS z8FwQEuE$zd5ws&HFxJlSiEm!rbQ~USr)Kz2(&8cp&j{C@TK`qGz(ClS z9J4IGLdx4P`!_aSv?1FeD3mUxglRur7xnr5&vlw_*!y>S&m8U8R@U%b((tpgbg9fI zh08RzgWO78BsSW!yv}^n_>z7_biZ&M<9$+Y1V0C__a?2Rst{?)`C#;B;%ks|&;-0)!8c^R0aKa90W zWFMujQeGzr?#gvWV~5IFl#VOse(KsB&I_ZIgHHGFfr55F}x;TY7$ zj_9gJqmT(;{_eZN>lCW6uoo-#;g60NFAHS!de*UEhJFf$_fh5!EzbN zPtHnDUiyLP&XPdeZUc^!<3PJ|Lo{Bf0wHFD0#$ zBF11?Jsk8vUA^(E#6lB)I^bS@+;F{nXA1~-68NPCn`uk~=A)crTm0AcaO!olA`Nh_ zR9LQFHtkxf=`62|R2b@5E^4CpK_qg{vhYX^cDw-w1#Z&QVvPjsp?`?YfIp^4X$muzgX{!>a!bNTnFl`iL|AHS%S$4Hte!)-Yu4*ja> z7N#UR1wrSk0=RKe0tcvt%oi646*$#n?M9~-*PNkxcQ@%t|0>&Vy`Sx5{ImbInIyM+ zb5i(CxtsQHzKyfVo;K7!TT91>WWT}XvY~#lRT1F&8DQh3c1?grr)9lyIZj#?d4Fq4 zc@qhT=;EIC?-$-EpT8`|?;s}4UhM?pMMdns*75Q*YZ%QYPRXaKRwwJ{5M;r-3IY~p zp|j!|((8D5EUrX5WJc_at;~sGwX_1&`_;1pkF2Z6O7_;~X~f{AxWqZCi#^8bw#Sut zP^TiPpZb=^QP_^k_*1VgA?7l)00%2;RV%a9@Z#2|?qjhy#yR^}xc)L7fX*wbJRRLz zw9+|R5jx%6#lN&pl7*h6By+v4m;emnKSxn3KODO z!cs1Zv*U60-||_3?wqSa9*!{Ep2FLYqV7`xT9|-SCnEJsLM3&~vA6xIbLNfDN?dSO zoI<6bK?TavKdSBSuEb$YWjXQ6S{d(Ba@Dd6EU{?rS(0)V?ge1%(FwGrb;d?PA+ezW zzI4ibO6smF`w7d$NxU*px+5EM7P=y$@#8Zot>u=-P9Pw^?LFi)`W}5F8;#b29%Q$$ z)j&!YIVcM~Q``2OpmMzw7u}yumadd$e5&LB-0E>f-f@5eQ;l=*sgkW?*;FHwhm#YR zq@184@&wqDBc=6{_KnCGH9R(%eJ6Pj<+CO%53ZGgO>!LZj|@qh0OsuZQAe;lq=^~M zws9KSvATC|u?2z<8g0Uj9Uh0gNct<4I8y8Gu~s(k2X9yQfUgQ);KlqUXr)&YAqIX7&ixEZ9!GiNlR?i2T5&~5IQUak24v3 zoEJMKmnhTAMTvGRGx@Ncth4@ag}CnQ5pm`}wH}#d?>=6((pl?s=nZO_FsGyDEO|D5 zBBNv3CtmT)*VlJBADG`ha(4TNg&ko1vmA4Oq9lXp z>sC*oqSl|g>lx>s72aU189Vl|94QlfjAWS!w4*?B zd}1%Ozc%x30a#3qZtzr>@3rX@yYP(>8kNOi&|$W&9kVT z4l7b`VY74OdF{xW7@n{ztboZeq79A_orbjK=pMz^aT~5`$Bg8C$x@2(`Fy(kmhzL? zSVNRRBW9yqYIUK|GtxGnRfNyE@7UPh1xeqdIqC4xs8HI0NFW(MfOYV1BZS`fnSYCsaO3LUYyR>_%-tGIEcRLGtx2b23g4|G#X4^`i(U`%}oq8Qg z&xWkX``<2-+%%M1HWopd-Nr+I&hJAvddmaF^SW|+fab7h)wlNF@Rz%({&K}1&e(nB zq!;QVpLBAv`?)D!{0l<%9e6riOX!KCX3#`Fv?$ z2PjT*J6d5z-t!0W=P1IsybChRt}qju_HQGdT=S|+npd6lO=onKPFD9E-f@4}7NS~q z@5l?GkI*2UE3$NVo3}RBQm;K3N$uT^Y&i_yvg^4iYB2=+*?8=w``9kZ)Ay2@6J*{# z>R6%}Xcr|H$arSZ|AuE?(meCzYoI8u-VSLw{ph1$3}yejiM2eUs1%A9A>HY&Wj5EZ zXk%Y3!&I-{8EQISQ)x3ssJu7PTwTrSU!1}0I z{^vaSvZ8wM$v&p|v0lzKL8^;dip+a+4K=@@70#C8(JMISV%Y_Wd^bhCbR$YX$KReA z$0bEqouv4Bt(R2fx>%Cb43v`}dq6!d0t)dNz9%fu=8liKUxT8)U6fQsMrRTJOFn-3 zOg?_{I8YQ@Po2z`LtWkiagrs0W~}nC1-Q&Cl+ElC>`I&(hIAT{{uI`#Rh zIIp~#Y{Ima&FYlFH!`qNeoa|JmJ?-Bs3Kn__?t$JN%M_$Uy>c+3jbr7x9LCdk2ihK zKW^0d$5qbNx1M$YJLi2>A9JHm{`zA8wXXA|7u7rrYcNp1e_53C-d0<$bi5DB9>Qu8 z$8&Jrq7s%s)nr%BeNraY*^s1W?fxI}PMdY!X$QAFPSLKt&>Pt3oEV(}d+uK&UMb#y z@;z$tMXhvejh#cvn)nZnb(+nK;#`$JXRUc=NBpiNyM!~@LT16g-6>ZVd%)+7x*b#S zz7$?^&NBBetDLBji*`;Zl7&u|At$B-?m3D;$wH0@pjNv1-_FM-{@igsqCbN#GT@_) z`o5vpB)dHZSV{R>5pHq(nfrZJ4(J|z6r-J!&lL4M8ggR1-m6rlv3#$U zqI6oNn5Xre95yuMoJ>Y7BtuTF;5W}a`5ntS+N#il=N5DFu^&$JU*7k*&P(NUb?}iQ zn$gb3NJTxPRu3(e9varo3T5$|zn5mz$ zksYTlZqYv8M=9zFwbdHJE!bC^i${j!B2DjqSZ{<>uOmNxIS^%v>no~8P@=}k}&(q zu0*&QyYtT~kRnMnP)-VloAO?4`nYMjL1PsWC@;ThJ4I`9zgZA6&6rBqLR-hoOa)f1hf zo_efK+V#9Kw4>9+>DM4%$LW;ju71#fzt?%QeDx_9JL^kt$4b9ndOwQ1&z^DFHa|F` z?r!F%K4Glab~(+d34Sn)^s`UBp@P0_db>yxyiT+98`wY6FTE|jx2G2Pe=~nf0Vp5M zPei};gN7+fUySSV`=$4%QzT_FDx1xvqxJnK?jo>1j((mc}M(T6C6}DmzPmQz*NPWmGVRvVyMW5BYy3`^^7ccb0|5 zaAGvAonfGiRz~}bCcC^9|9kOhLxvd^OXDndVmQTBv;<|iGTdi4y(P98|9kOpgUGNb z?i6>5J9T%4DC~DrA9e!g_Stxia5a0bmc_Te)PU{BXGh|-h{5Iez&P^>?^M{k%-uN{9E#>#WI$$F`QuiAw}4%KB4WPkeA2Uc(x^ zpRTr7iBLS#nkW_`xkO$_r!Gy7bk-xfGW<&KwzUMa&nc@`TemxWALkAXr>ptvKrobC zlng~&s`F>?OSeu{;s&&Nt?L-i?lB1NaF6ku%bodNSe?^vxb@i?*GY@Qf>>qRS6>R* zX0I6TU-LB-&J@Eo^1tK+gAMC$pB4(943zh7(=Z)IBR6m<70gFtpc4|eVVzrr_H7DS2=PAEcUzi^7jQcXahU2_$BhRwM z64_H<%9oJS6wKCpXNutuw3A->LJkN|4+XVtpcBD6JA#35rdBJC;FR`mDl_Wi6m{^i zJPZt`@>G9 zhY#ODmZKU#c8bgG1r25msme<4=aF6i_>ZPorOYu&-N6$K&l#}aoT#QN;PtRpp2~S@ z+*5uiQaQBN+o?K~)F&vm|JUuxAPCpto9YE@C`H6}g)PcMYhC_M#Kg!ay!{RWf8&Du zcR|BWLU_h|Jb6kpLAV7=yJ&#PN+SH|#D_MM$DS%m&7I2Ipuex?ikPNDNBxD+{oS-; z7PzBB7w;9x;>hFD0LKyeOGd&hKIW^#HZAtAGH=ymZj->*6=ZT_2%;0L9&A=q@_AD9 znsnpdZ7|$m;cf~$%U(TmB6dHGh>s~#dniqpP{w`-V(MAsu{=-~ZrJhS{AaqT*n;3V z`5<3-skyao`sbiX7wHjX<)dajETi4IOptC?J-3S_iZL8RnYA{B=E&CODaDqaujR9) zB6xj8J5D3q`oDOR8t?0@cmFDyv1F}+vZn}-kFDd_%+)00go8o%3~qd3yOok z5L)11!d$3BzVTXa&s`X?o9L8yIVg}wBcTKvKwiJoa$j3qm2%1SKItE%?orAx=s|w& ztEGa@+uu#}1%961zSBm$$BiQ&IV`61p&2?kQ%}tAl&>*ieD>f~+-vlrdX?`fzgEoL zO8x;&Zc^(%VdN>sKC+E`qwlPl;{J`IwQLHVPWVlx_bzszh>)!bm^yl*^ma$xiXGYsM}T*O16z%!-h(3>eZ4-;uGLBk(LvS~*pHGQ-G}~sSLYvVdA_6l2!i=Obhx!t;zK7!Q{D>k z%V3RBlk*?v8?9|V&o1XL$=jE|#f=D1QG%tH)OvmwXhL&=sR``ZQsAs9Q;Zu?*W_9v zy^*8`D@V~viBMLJh=f{vJ_%F(*`{3ZP>Fj(aiF7cG}v)|qOfYHxis*im^uDVz>*>S zWVAL4k2Xrkf6>vaJ1VSCjvg$Q^uw63R&V_7Tw5&r#irR`AF#=^D=r)8J@YY{W2c>` zq~-l6R%IB=i@Hh&YcQiI-4!es{9+YySfbp zb=-h4sUlQM=J7V)sBh)dIC&hZd@@(hNnj3O_uc7z>W%T6)3k#y0valM@>=$Sj-JI_zWy@M;UBK?}NaKyL!4(cbT7ViC zWv)mn5&Q@REx+33HlKKjHo;j!{35t4$v!J9ruK35En;=}_{5$9>?wUe1Nw13`oh;K z_!tbM`5F-{JT5cr+GNJ0GuWbZ#I0C zCLi^Ip9pe)*3dsJpkVgA&01ZC84f-`PACJENAWh#N3wB7$1Z5=q8$af6z<6yi-gc)ubB3P2qB@T|lIi5AEi@crh z)U1cRJgRC!@Z1sdTo4n*Pxn1D|$_sNf}7w{=VRA2w}%vLwXf;N<=EhS9kl%s^;g3km${HM|qy2 zc?ZP~3r*_CglIPM$Ff`-rmbM_=9-vpCSwxs9GsD4KfD zB>0?X%sR)uA}h%Sq)*^Co-gZFVebpHGaSNg8kUa@M?EGIpNl8NuNmx?`LEmfs`)!q z(Ib>?we#>dOR2q>?W6j>)8Vsc%i4yccqr{)Hg*kNJbtDeS-1Uy?vkY1LM|{=B1^pj zkBm&V!efdH%WEo0k(5$)Eeh&KXzjp9`xUn_2#0-XScudUdoRfXw(VQaV%R@0j-vDO=JtkX?3dti?Oz~LPY&)jziake` zYO}k9sR$cDCm1(?JH{w)QEG)@phpy$2L_K-RC~=OL{(XbQVRPUe?LjwSHNFsp0X8}ACacK0;OkP z`#(lZ-*|qEvY?uSpo61k%Dkm!v-*IVo3RFzmuh#jziAabf%hFY^I5bvpPdgFU-NzW zEijNHN+{(0T#qEVnxr8qhs#~kEQFQ7lX_B?g zMXs-JD4BDs-Hw~AP+YW;5IX#4qcwCU-FI5nrhOwEcD)@V^579!AKX8UQoc91eg2Nl zb0l|@Se0YxXI7yTit|tpBk$Y8>3eyPn!7R&U^ReE;rbCnB zdo3$bL!On0+w3|#xMFRfncrhglgbdOOn;%wh2}K>oi7}l!Fk+We8h#PL^TBOy-KK@ zzBg<|2WX9XjXlS~j4W6q`lXxg8nJW;O==ZKI>y;2f>3%b_`~yonjh>JaKc zDNs?ZCkYk#<0ww24ZMPnbZF>%S~<2e`S^65WQ=fDjgJmiBZ$vKKC;p>sQVK4l-cX< zrshPMjQ8*N*ZJYdC)gDd^%xw#k!CdZz%H(@?bC)f9raHV-rGjdGRHXa zZiP~6b|X)CPPo5-F&W_9O{ZXH>Cs|;`UUS@O7pwk3x_i7kJc;p_HK}P;W5Xlf1kXc za|TQCoWH{2a?v~*?S}tm<8~?Yn(9O>Cl`i4328AL(RAI3)5{+wZ0pW5hn%MfE1h@#5-pM>U?y5guwTDZ%EYhKv%C+pZ%Qc zo8xJcL80JdcYX+2PUmG*4m6KX0PPv%r4!>*9V;JL*P5!FOZ?M_EkOROVWJ{*cIH^ZDtpM6@m9d{XgXpc#|a-UMSh+*x#` z($kM&FwL0v*=jp~PQMUx*p|+7YdK$Tp}lDRyGu6DqT`Hi{9WqC?ZYjQ9ob+{)6a9b zn@Vhug1_5%=ZI3I*EI4*p0K5@YrM>TqW77z{>-gWwa<9I#~nyH0(bBT)+sFiH7Ok) zb1CW`Om2INabFSkxbM|-)^>h~|B7&ikC`8!6J*%aIyxG7{Khr6pq#JkWr0Y9uyLZKOd=Ax46(#uP&X~_nSl+DZ z`2E!wR!swwlNfX>gP$*~vT5jhQp=c*20&zDyjzOCm0AXf#C#zC4%n!?fb?3?U-K|g z=8Mkeh=e^Qb3Mj3tR)37HwJP5y;TFGr!WZkNX$nklq+yAksRZ$?f23s(C?8K(Mg2f zNKU_xuMm|%KE2&^62dPq!~F%yqpZqhibC08Tk{iMkDv$VX)vz%9$Js|O~osDrdRtz zM0%q&H-5fq9>#nALtIC_6+^O>_iFq%FDr?hw^z>$)2WBr@F&k&q3%A*@9pas)^UFd za>0-cxCUu9>bm}!>{F;&xb2*WLOnXuX7_JO$?jFPygy&@{1f(`oVqud$eR&jN=F8? z3$sT4j+~4<|HQXux8d(-Pe2{p4*!?8!WOFMfJypeVH%f(x+_ldO&OVBmxVW-l%|t5 zj|XQcjisnxlkVZl-Uq$!%PEx#P?4nK^p+t5?jv)$j52}s%GHIQDj1KUsW{@b7#_gm5~J?T37_==(qiGcCglySqa zLB8fkqXgy(^n zFRxY-^TI{tx+$1N$+{6DIYvn8c@?kLj>`wbwM#*R`$Kx`4$hECmP72Sflj~$yHP%h zF>c)3h!X3dp6acNB^7|dg}t*FtEn0%&28MbsEclKObK)>}kQ*MM9bLX-b-*cGPqMQ6l;Ku(gII2HeF5$~_rvC*dGmx7 zSxVYeXI9j(8Khrw-r=pMjyTCN;?j_@99aw6(wem|z&BaJFVm24lm%EAwZLk$D+9TA z6z8GE>RI4w*uLGtygFIAToNYAJeq@ec1G>ECfRVb?*8-rE@w`Inb3{jT?6HZPy5*1 zVQyH%IOQwIF@I@q%VbY&k4-0IyXU}S_Z$SN$lp~X@2gFrH?v4@OHU+8KPE3ZjaZ{& z#HN-m{t|=oNMdp6_1>b2C4q6B>JE;s{0h6kvx;n~u8@XTgUjQo7duGLQCx~SRYX$e zQCK9|Nc{Yt?Y=ps`WNKqcaK(2EV@}xPSai}xq**`%SCVVOi%iKKf8QC()m9=bAxjs z{GDy=8D-OWUThrIfg?Ees+ykFL-`Dnj(IgV9Ai)O(A-#nP8Ziu$YT-0XRzVwnFt;! zV}385Ds##0q0>jR{?q+FXTFGdvzk?VE6%X=RC)D`HAND<#MYpI>plb#gmwDFuQMlf_{n^20K)YHhml!xYCQHAHYct}{c zLl*w*DK*Dhs>m>xWa-DosIBtvcOacP5~{#4t>p&j4DIvJ8jj%o>p$2{9uTO1=KL)vwqUY2A~`+Pkw8<&@T1lna8?2xH`J-17+ zGg-R@QF1-}xo3hTw^Pdz(gD_}D`n&p>TmDG0Je7vPdVN$FFgl)ZD&d z6$Z45Sq$-(-sy#;W$&A9(i%#B1=MAf)>M|3_q>YE%l)u-;zE|b-4d~3apZHGy2)i+ z+qyJLDARR8RZ~@5rv0N{)!8%yIsFtn>H36|Mwfsa5n!wcbnH7J9DbjWo%7#V7Ht_vHPZ$K;mx3bF|B%Vv~0I~sfa zqjRd!*O!{7*n7$wFptxoj#BkYr=QhFdV|tlcpX~NTy2OwXL0fl+6)KJ zcwCcBKyX~OwME=LwA%Mk)A&{gjEu)?lpRl=UEQZ1ZV;bPZ>G(g1=$|>$5rG5;#I6i z6AQUQgiZVVXeFNw|Y8HFu#{7A19lczZ{9|jp!Cw4DE`QyLn)G;Rt765aOkR zZ4vw&PN1=W?dXHFCb7|#GS(YiC$Re3E2J0k^J(tB|CsgqRUA1LkHZyM!o*=w_6MQf zDD1WievZc@f2RiD8q<0QwjST877nHAshqmj3T-c28}7C7yVKE<`CSbiir{x>Sg#gBw+ERauu$)IM>@iN81`~?l zovfh>dIPcZ{ViK7xXNhM+T%3)74Up)_x zVH$rV&1yUOj*eNuG{Ak2HsICUQN#QaA5HbM5{`5aKV4*6c3&I*v_3Obta{{eTEnX1 z&{aE?@m;VkI{#WdbIx{n$4X}m@-q;A%e=VKGe2@lMA`0B!^ZD?h# zZ&=E{Qq9QjGy=_$1^iyvDE6UsvceR}2D7Uxi|qc3pcwRUVWT)o)r>^(DM&4X;;4W} zi#vkUCaQ!;)V_chil8<+;KL$F4LRVwaDBqkyR7xQ3O&X^=Mx zJH2ht>Spr&P?%oi)@6IJ9QSLns?LHt)fV{z zwZ*&QI;*lU-UYno7dPI&%P#5vjgYNyY_xq1dF6Zrj5WrZ_%&qDGMVpRU!zvj%%+Oy z`JoongzYUri-o#iv@lx4x1e>{I($E`1;#!4e<6<&QbI~d2`M2Zq=b}^5>i4+NC_z+ z|1XDp(14iB9qV+e@SV}Cf1{@7=v{?k#hhS3)W!#Qj5NOKnbqhty{TBNc=yoy&zNV( zD%ktQgFEgr+U=eFEX~9|t@@TQRHnLY7z>L_$(f{8z3vFx*b}V{!;hzAlLuTqy`+AQ zR*9~}!ERa)+Lz!Om4&hA7n^eXr?T6#?`scIu2g<=jUQ>3_lw|o*R%?HfmiZo!iTRv zQ*63z3^m3L>L!|-{scC&)gtlz=ie6f+fRGoepZvn#xJL0)TCiNvz=3>C$HNqf{jRt zEO7Eh{|TdunHp&O^+sgYtKC+i7SD+1l^q&L)%beahxhXA)z4+v0>!li#_mnbr&AMD z8A^34yo40V3ggK-X%P7=RC}to;&p6QI%`-RP!*!dr~N6iki9J`hjL=3{MEe&Z{>aV z7i&MsYtp{Dj^B*R+bGZO_u#N`MZXQHlCAT=PWfb6TfCI@j7I%@afbR>B~hAB!ZuD5 z>*-y-$?NZXmeahWG4IOI)-=$y8R7Er0vt?c^X1ZfPSB--l?4%923CxplUW@Vy0QQA9o&u5yj%717080zaWZ@)LP2R)R@y$=h~^) zsXo13{+nGpd#qzG5Sb9mymU-7SL(Ok|vj)U{b8lXO`<20J<7b%T#>H)(bx#ui7%{spW?kZ+l)Gn&5C1v$cE+SV+6awM=I+`J!5{k_-%QEUY@_9H*P>u3P+cy>CJ5`0zS6=3B1)4b^$t&0D+_J(u5V zA63(l_@YjyR?vPQ?FsmcQk|#TVLR}M`Rq0GOjd0mjOVmpgy+eMznhwsPc4;WIoJ5% zSf0g8nOX(}wDfUmqhKgm6{M>(MExB znrffO&*ovWvmX9U)@hkX^LWqvg`@f0hWe7a5QPHas*xtcT(S?&S7&we?O!Ut zbFnz@LFaETnfXC3*>;Uk|Day>mnAQ($>rKG4tlZ`MtVO5HOF0HTa#|Em2Ikicco?9 z-#yED+RZJUFRlS=Ojl^M7o~n)(fO0L)ok4sp7tc}xyb?E`{<+-)gD8%QfYKvnM%R? z4vIX-?PM=k705Rm*&e>hb@f_OAxj!uMKZk#QogP-N;r*$x&I< z4lh&RkuAj8)-Zr<6X0bEovHpr3Q49-+qI_@Yo+Aj)~FpxDlSFO zG;#;lXlA7Qj5mPCEFVU$Gh`d!JDg1|cCPlN`q3~N*yJ_~l1SsPQ`KmP$j5LTNM0o% z8*1{?mkd?WJR$Nk%qO2XSy3k|<8mH;?+xi`Ti`gxL+345M@f`W$-L_cXxEJLs21+4 zP)oE?qa1$+Db!BZRVBze?wBWzEmJ>-=b%f({LePPy)mC#4Z7~I$zlPNr8?y5?4I)6lEWyK(^@L%FTqFO-C`(RsieR=IvHYsI>RM* zN$byLItk1(gS)_=Y`blSbOlBOlyW6kej({pg-jmjpMgHyBNdNs$pBrF(@)Tdb#FKv zc`y8%FwZz&Z2-yL!%w@zQ)C~xsOk+{`&!rSmb6+M zwYhx$3DMm0JOUGDkBh%?Uo75l(#KEg2P4bVSu)syW8NzAH8p-=xbHXH ziW{Q2t-w(f?{v~0fzR0<*&oM0(xLYMMwLVhqFVXb)l~Bf$g(M%XIY-WHpP7n^y4i0 zR7MA_6R2K>4IFk2&~6yjKvj+`$#rCRHNv@oTH_|Md7RdC2V2SUbNW34?&rNOSMJc? z>T6xM6_ls`F_`Vs32!U5Xg}YyWE#rUJ@y~QdN{p_&*#YpmtUp@!aZoH_hWjiV?<{M z)M885k?<_@@)z9AdHKUVjOAjFr&}XD8V%fS)teFK7fJ<{7?kb(*4a(@&bGX-=vvZ< zv(g~z`2A3i<@=L_SX#R=?X%Rjq6e#hOMfh9q;wZGcb}`v5cYh4j4~5=v2o*dbTeI_r&T)jg>HkQjJM- zHXJc^Fs!(|6^H*@!F$1YGUi)jyJI-Zx>Jc9l2EZzDQTtRVJY9jyGDJT>K`;d!9wC( z?s*#qJGQDlg-1<;ZRh3PW0m4EI-#j6`Av`Ox|cQfCfHAsz>r>0`_0n4)7s%af=ks5 z0p6QnSiPi@l^5nSH?!bzu2ot1^+?xx_>DsS^%3yqQtNU%lzl=gkXoV@%U0fp$chE~ zZ0FixP3u3xI}u)O45!#fQd$WvYnnCq^s;d=-LweI)ak6A%UYlwRDd+79iTw%=Bu6@ z;|zSj(rI$f;l)@7TrGzAF5meH?M)~*(wF_@!xaK`AUO7*deER-KJ-~3K^Iz+AeUq6!`lDZk5mffLi| zQn)q@u}&Qv8>k8383c`%EFKxRl1h0SwB-8mcc?|py7T1vBwk6%;a9&RTnq>H^? zfqSEokG0pweZx7ubY7gTM%)QcaQF)F1MjUp<8ZI-G9uUTrOs`PA zon&_$rUdx3M1KjqP2&Ltdq}pM+n8s;PJ|~}mOp{x0{#B2#6WX*v!gFxKZ5CjaK!rx zh_m)KKFypogD=2d25(yXcKgG8iXZ(KwxhZ8@+n#Hr<-8K3zh@u$oh9w4rdoO4Yw@ z+=tm^F|^}T;uf_QV`?=mAAtCB~Kn&6H$6M*lKE&O}hL&)VlI~XNbff zgykghA?{k-^GCO9lyAJIA2JTWR+9B_)r|JWjl3y6wOjLalFVh5>n6{BsOr_ACO9yj ze?&-m+y|-9gY^OR#5Ey0*EqJHv}kQ*H#I1EX&GJZ*t60U>1RJ7`6bf6B}<*f5qW;cY&c|JTwo;~9CXHPCW(^v<+ zGV|0NBcrqqY7ud8Fv{$8{+<_j=005FJtNz*ioXKpdXnaOt(M1QjmRjTuhg?N|HXA3 zId)yDKV@g5k>u&cH@@7I|X+22rF|svD4PdYq7A4_R?I$kXJnX zzBBI5_ZN`)VF>kUbE5WK+>TnUX?(kpSqVV86tvlY>^J^DG~`$hANdQPFd72YoC zmavp0&Gk|lQ4p+y4z7dF5Sg!VPc9_$AMpzrWnN-qhiX07_HQ14um{bCQa`$~@#*vx z%P?Mv&DCFg3w9ai176YEQ-8(+*hOQ$w!@5B7cBo8>D)Tdc#2x0SydZ=;|X=N4ROYG zz5-e6zj}L*1zfw2J@_k0KEOSV_-eYcSo$+Z4c;7H`gB^UUHZ469(%c+P(J!f`vOX0 zd!f3kU#W#Tv1U7YHRHFYPt`6wllU7rc%Syi(16PB1?O$lu9gSaZR%@kp=LrymV63o zB9+8R z<{UMSE!=0MulSVbWS;57-X@$^R?b{-nq_J|(KENq{k{b4a_A8q7-`wZFLXVAn+F{4 zspF>nNe4#a9q)U0Gz&AgKeWJ!tYd64Ca+givM0a+*17hSAMF&(I zJ@pXATtKU=n8)s!Jc{*?M~Ktoj^CiWt%lPo*m`(0j7*0WIBRxPP^P-?2K@+f_NUrp zNsP{1@FYX&DwRDjB;I;PrGFX9-IPfh{X0H6L2_LMt?ccF^CFbJg?!hjS1`nLJlAQC z32mt)Sn>Rl?Tv3wCBUMJ+;>idMpmtIaIJC`>=oVX=jR%kZ)|~3i7tah5NAR~9cf8$Ii|VE+mgMu%(v$9 zN@73eQX2e#0y;GL)E=05Eq&YA&AV;hLaU7z;+&($R zc<9sfP1d3W*u*V{m6{V%Grj>gs2@ER1xjO0atS^yD>`{Ltg<9bduUq0LH-_Ijo*4r zxlY+78xtbUbZ3J5`5aYyC{czD^it zj>Dc0$PTXw^ghX$UZcMkmS?tY(-Pu%RXC6a@!z2=j#OU;ZF0WU2N{{H?+QegS8uV8n=}=cDh{J z`c326)H_n>OVYWyN5hHSmTNb|xAqaOzHMZSk1#~^XWg35&M-2TcJIgYssZXG$v;Xz zNu$^I)qamfA<NX>q>vtMc-aEUf$N#T1sN# z7-P{H%j0#@kW=1g!q{{SXD)*0OZ#(3JI%V{Sl7$%pQXAxQ-W7b9f_O zH@IKpnoiHjCsEWR>Y_73PARR6G(W>Umf&)Uq#eOA9p&^`^uj<+w+HfQj*(e6Yh*>p zrTv_1doF))cH&%)#`jJR_Zz1`&uK35Y(nj9&ZnaX)hca`zJNy!^qf3&MctrIN6zO* z@VPyoSTccpu22_a_x8s3hxo>NY2qUhGQpqhV~whS|>b_K!P0GROz+L)qlrDr$gQ8gKok>xp)8Uv{O@SjFpny7jwk zSiUP`J$gHOUtX=b)lh#f85Zw5Rc0Cf@8l5xN&jNAN#N%^H4v6~_m7-t{Fm2lP<~_^ zxQ{W!=k+RoT+O=D-uK6%d;dU|l`1$T>s7(%wiz@hb zqPsNw9f5OR(Hq0xu$N0mCooi~P0vz|CIsWeLS5?80OH~ZJbLR8=s*@$g5Vf>n zpeHM53$@L9d#^PnDC|#uxOD=$e~&cVAA0g{i)k^bzGo46KmNQ?Y=DDahFYg;Acg&% z$cyjK4Fhd|#lV{#{N_IHIm4#M=c5PH!>>$d#y9_5e}?={`P3Kwv}h!n^@R7w`PS7i zmKDoFp)ZYVvljCI;>P)Ru^;~53E3Dr!S+eyN2(7PlZ;96cwYra&vZYJ{M#0BZhB+r z4BMwr+`eE;F{Z>%p}4*He%=&^oSQBoC8UIukP=ct{(leImcA2?AI*EhigC#LJ;b{H zV8uQX@|;emC`?NY#wRxiX_>!=Sl1w}g3lL`MQ?ZgX7xrqof_OiyID0?@6QWIzcW5b zveDTisF?pLhD7PC=!YHq^-Q zl$+3(@Hd-IM_Do0r{enKd>+C1ogZ#FO4gni>0}0V#_<)|OoNu2md)Ro7j}Meoc)5P zZaVGdP&Zoqk)QmGbEbd#OKCo`E4ZZ2dkTc5cNuB9{LP;8S0s%VG)mU#_ zA=Esax?M`(ys~Xw>M5E-DKa0<2$Iw-Ifu%K;-*;TJ1-)Cq2*&zEAbyG4bN3;bt4S< zeY;Yir|juPQLzalA{5V>PzweKXAM90iGaB!Aj*P?as4#^PN|XV{oz3G|kN zX!eNh{M`+X56qnyVR)mk`(5DJz#;q`@j6R8Y)9PXUNO3Wz9TEt5}oNJxsAHqb@0 zqb=1J&TEo}<0|Fn2$XZA(lBW@w>0kcV&<)Is{WL`BJpBL+-+$!rgmB-MuDp6jHut_ zn>KTb23}Bis&rGPs)UL`8Ea}W%cL#7Tcug;6k8s)aDghPqVPA_89s$!+wmD>9X%LA z?bWTYL0v}O0+oYd_n}-?;`@I1zLpjy4qjixurxon7q3gSa2$M#Z{E>^Dd(x$$kA|> zjPF0!B2Yr9%tkuH^^iPjAvt2pi^gtHw>ko8d(9kd)5+%@j+7jsT-hbYsk;IpFzh@x zoz%7YYIy;@osk<}wj4TwyqH2z%OY{=D4b8G;Qf!5i%l24j=?&p7oiDiBI#*`WSz9P zfyyOXm`)>A3MrK2bmw9_;weAnjoA-01Ut8z@wwjmy`{}{lfO#T-c-4X_fgNGcO`m{ zZAgBv>3oxj+VL31?q$=C2rnrQ#RU&Vpb&HvAC+6GO z3`LZXzZON7cO)GPo1ZY!@oSn$wUAV88oDnU)OC^jsvGFkHaCVHX`YyIWpym|i*ra% ziKEIt89ANk$!rI$FD8%{sq;>Xm0?TuWel<3K{glNHB-vjO5wXUiq>;7RB61AC(B&r zQ}Ei#ecH_An8mR@{Unym$hW-Oh!fPbL6VS4-Ux*$53+DiO=0N=l0@p}TV|G?+F@H$?n z*_09(vTGzA#~8bCZu#CfpbLqKeX*L=5vQd5pm8t2WMSRwwu+EQDBX}uO*uq9c;`%CS5_7ceo-wbuoS8|>stfqmUWB96a5BwqP+Yv`l z*CJ2|qiqGa38QB>ZB6t%n?#dVMKHbGvpOSccb4PP0b4F_rK-pye2;-0m#O zElZ=>88#h=Kp~6{6yONo@BCMEAjVK%t4=zdNS@;e$+d3FCDnj;sRnFuTPa&LKpQ!^ zDLub|$F~J|^3$>X_P-zPBtJ|)gvJQXMR+;e>Of>^?F^#}VR+R;Q{ecq|It$MYX)8q z@_6eNPf?n&4ny4OAs=8GzN=|*Rf8`?7dY`9Z}mgn4rN4?(QBmxCIFAZo%c?ZU+Jc2y$?DcXxMpcR08c+zvK;|IGDY z?@ZN9&Bfa{yQ_NF?%nHodS5)U7H8G7ff2q36mJ3F74g1D2|pFEl#oQpY(Z3z-2$g0 zTTQI*BNmA-M{V6(RiCI*P9zyb53dVEpq==H(uNvzxTzY=rwV$iicc`CQ_^i@;OTU9 z7(>@?vcxtfI^Y@wQ*2$dr1B!3j_)eacBT}h32n9Nkb7OO!#%kJmqkzggwpKvvmNuS zgWN+r3iD*y6#A52M_Cm+rar+x_-3DTL;MR2V~WS?D+OEh^X+>U1s{`KU zUtfw{V%s+k2plEWYG> z{hIPl_y}4y3|!$AQTSE(geaOT;}LhqUBCR@2qa*UKdky_Ycx0k+~EY{pFjS5_3xrV zueh@6B(0*=VXR2z8?ZrVN6P8!em~{3(-%pzInKk08O+EME<9TGI@i5=eEIc5=x&W? zvVdE%BrfQYF+XmbF3;v*&SQxGo~j`~Xb;*;l%6ajrXGiLe=lgk)r$}D$_x~jUdLVT z!--mc&x3psH0s~%9CH>CJ?*hE&MP1ZV15D|!<+z;BrSyyrN_EtuyTF`#ETDRYK~ap zJvquKQ#=6T+vIO<=21Kz9w@kk!!_vDoXf!>#jmw{nOkt`VVbzJY62k9T`$)H?Uz!9 zF+|Zf5uCDv+ez(?&Jf6yRK(nGlf+KcYrM3-7kO7zDRxMPKfxEdJnQD2k_3kI!r50r z^zmYul^>;51fh&OX{&2AGTbS)nzJi!+WIwuNrIP1u z%Y?j}gY1?5>;=$kIeiA!#Nc2oigN6QK8~x~S!N+#zNjCq+z^$>y>Jy*o2H1#Y`47R z-e540zK?efbBgrXSA|wApAs~D@sy}cR(Fg(pCGj}2-MtVHqa;*QXtqU;*-X>)31j- zbR>*Y*j!nXnB`!u4;wiJ*O2l8ie{R(aCm_7qzxfz;bNSZh*PJLeQbvw?QcO(K_$46 zU3wt$u}lK1IU+AAyG`YX?^ct)4`!01z7S~r#Th;R)TyZC-9hd-n2eM#ColBQe(4)t z8cDCPXk#S>d(L2YfWs!vIG&P`DNhg?K+aP_*KU}N%W5&MsdUh&9jvqhYaDW-^&=D7 zv+;PrFX)dA!432xC@X9}DHQM82p0&?Q!5EQGX}TrIPX#AybwPkTsL5UP)@#8jJDc+ zSXu4&&kS0UNTw~%>6&DB4{766!)Dz(^!Skb(BEi2i`#u&{yuVR#1CLoR$B4TE96BL zZb#(refdCF#_;y1J)8Ox-pK&RJo?J3&C8RKxMit0z?$ts>N=1N*}{AnO>)7`@f~4K zJQGAoK+1&o-4X#W-ZG|8D9qey*m!JltG5r>Y0mkYE%a@5LKi^0WSEIB*DVhZS+? z{NzmEzX`#gU#Kk-g|N?r#ub}Xoug_K$^7Fr*>loNNvQI_|OEp z6*mPgS+qyh!E?P{-?J;Yb3ejE z8|C9N@{J+MKHcaE?ca)?)U$sia?LC_Y<}~24d6x~Tp@n%QKN<7K4dZ(J$su=x8m+c zGT`79Jjxmh9@PmR_1%46R!~FGE{_&s%%8d(crK6jcyDFJV^0TzE<3*~{1g7XHWlFJ z@h;6aNnr6o@#lW(yQw|oOB7@Lo$~k4o2{Qw;+37M;O|G3PncI1uu9zybj5#@V%drx zDqi{B&t^NG|N0U`B95l(1RwoHEBj>e@#eewvfn7Zz^ero@4gxK=Nm>p)=)EAZ|g&3 zyTg|dmvS`ipUW6Lq?zO>sB$JyDy1l3JrVM2u?!ishTjR5Dytpk7!gG9oi_;Dxor?$ z*8K_&Kh0%-vUE=xQg2iXNh@pc|AH6Im7_0rC<6;tWOT8}TW<_G{Zs_UvujBF;tfN1 z8H6fRMI;RF=pu<{KzgA?{{jQ$FGBX;;r|f?@4kWDN|F7ZxxA6R55C4nOe^L5R5cp5#{MVQMi_(9Bz<)C5zrOTel>QS0 z{*yWX^`-wCC;{PJu%zl-?MLy6&()_gFAH}mF$~78hm40!KM3Rzc{Ss>Q(bjKU!7P(4F(2AWV79qoQ)0rdVdUFR8%xt*w2?vDf<%^lNLH6 zHUmr$5^gYsM3~4-u0)Pjjj>X@ha;VGE=)X=Hik?B18jk8QZT#OsK`pKS&m+dlTxRT zXR%Talv=sg*MPu4aw;kq2K7>y1V+u^k5OcyR6R$h!CI-q%e7cJ4{p9(8`FBB6t)4d z6wK#(BC^rynq$!6rPSpMw4BcV%xSZXPQYai10v)Jrjbt-nJbhh=j6mnr16B{ zFzbknB{JuzmuXD5x&kcc3Q_89*Kk%F0PyE)O(Cend?H#}crItlUq9A{$>4VnX3=jI zS*p~}(QUGu?(lX$n#qH|JzK%_x;ud-^|}0f`)`8~a(fI7e7+CzeT9g=zrB(R2oS*` z<9&jLNBtuj2-maK6S&=nCj5t7Jh*#0N8D(++KA2P(E;z9F-!yzFNP50h!T&>8Y_ZC zkYF$ZAKGLnGRSdvu;=k=cY8NVI2Zwwrkgg)2MUu`;g572O;1slFJcz(9$zj~0AJ|+ z#W|VX3{ftF54-bm2Pv7`mOw5`h}e8Q`7?*bIpo^|| zl0;@*IN_H|XePr>B8_sb&%$qyl;wIY7#bBiuw|N6!CZjF?hhP|J`7Ur`|9<0T$J^z zFBqlTaaVG=-U`!ZvmM{}?aAVCKgsadhY2oEtGap@D|EL%-WO=Q*4T4@zP9}U_6zw~ z7uxM?`7^)!zd!nIZarCkZwPJf7r}zw_uZQv-bUa~V71@7?{|l-PecM9=pQD72|*(b zrj&~8p2?HiUam25czJaE?zjV!F5rnlK|!%KU!v*&xwZQ4e1M!T=#4X(!4H2pl@)@7 z%hGM=_X>;4YVhadBYXD8lD0<^7%x9I(I@==0{=vcC)1|8I57$J;#f87Rx{8jD{uCM-8XX@G zGcq!Ad4I0^Q(D@8e*Pn;Bnurr02P)y{mwwcxQzX?L10Ye2XXYZm&T`pNR=U^cj6=M z%y(}q;tX2v{!1a8--@O0@=$JRR~Dze=zo`?RHTzXjpCSve>AK!MeM&D)CRrgLgUzW z)G@z&`il6IYnx}X8|hu2l>5eyRauK*^GWZ2>HNLD`&wl8;trbVOXU~4BqvkKB{8%tdQmF7#DGP5v zUMH-;XByaBv#>&BUKI6rGihPQc~bjNOwx#V^)G;t*0R(qQ9*o)mAui%hYPmMB>t~& zlSVBa*!TTJBRhW1@soG^ATan?3t?J2;YCMYRIpY{mC9Q~%V=NA1as*hVySB9{qqd2 znX`@s4@Y%FDxdlWWQX{i97^vB;>^n`(xmM~FN}-03(iilANi4ZgdS=h6*2B zBO+mde>^T55}KxKeb@q1;MAXsX3&;w|I3!FgN_Z_1yPnuvbOn-fcus^M&8~T#cg?% z21DRdaO>ggK(w?W-3z`|eiIAMtq1d$A<^D4GbhDMjj@|?dd4T|f6-Lscc1wE(|1ye zJ})COGkRUTp>o?_ee|A-Z=E;`8{UnRsB!N^4;Q*>TO9k6W#-7coF> zJtwn8O+nM)HbqIP{)QZ=`Z`LB8D7SgQ0ExvN2VAY>oizIYJl7K!|u*1rvXDrcxlCx zFpXrLM#*{m0CHALj;SDSbYapY-A|2^`juAo3rqq4y>q9%0ZDw-f;P?PAIz$? zzQsdV4_@UQ-Np#*e_ za~iiO#6|@PH@hKghC5US&!TBQ!x*;dh&e$8ASNQ@CzX~U=FdyA!=twXQi7Nk9?cUwx@P~D@f1{fv3rW#U5{N1Xqe^knih!f+^pr& z8aXySiWs9Hr-UKKHS6h)CJ&dDf?8oEdiyZ@wi3;e^o!j@@~=^d^pppdr>ul9XQ-ce$q4W+Qfr509<6v4i&J=VvpvWDmrX``lcGwURjJC~hYp8}744GSi zO++5zu~=FCq7i7v=v^`8xPp|E+F^4B+@JG$On}U~u|Z32fdLGnX8IOxSFhAkx#_dy zZYhwCvE?SZu&Bb!i7mUTBHF}fY7g)Yr7+xJ_s@2rZy@Jfp4MHAha|shIG9R&qLLuJ~K_XkG>o-ULlMGnO<}O?~scHjz?~d^- zl!DFnz-^kR`)^vk1iBN;!TWs}YaG%b@y!cyCHasXk}50QNXW4@-&C=CoJOxtDLt%g zvRzrIR~LQs^T-dbQHN3*lYmWTc~7DVU}!yA(y}q4cR!QjJb~1%E1ypg1ZIRdIG~UP zr~|aL@mEyKx_E8a5Ra-tyk*iK=eP7EnAS~0mK~Wy{Iw@(60Jrc$a&Is5x^THIe|v@ zfE%SwLmIPxcFS}d>x}T{-i-yzNZ>Xkh1aN8awm=FpT?}Ym?4sO{X9)jU!fag4HLiQdW<=oGRsK>PK?(PnhgRK6s^}lV9Qe^d9!F)5-G0v1?Lj; z9uIde_h?^tMlF%qAoQD(bxPTL^)AtddQAN~eH>0ks&ocQiop6BGA^522&BJo+NFqZ z6Rl*dlepl3T~Y!N7`%b4iu}7B?gHCs-|jv7Xo6yPYSt}*PQ%#y;xGBA-haR85HSY5 zyIB~bjcTM;UJ6>Y;EOf8`oIu+#+x7i`fhn3h};CnyF%4PwrSW)2jcuys>7@;jbMaj zblb0E44m616lxsHeT_F=K^{cPJHHAQ$GN=tgu+@*|E7rWy{7tz(u{bIucK<-@>-!T z#`r5IE&ZNuwk)}BD>BGa<6Pdes_STDJg`u2H1(3wkHYabsYMT!? zFxi|&B^jQOt1mqNy|!e8=FG$1n{7WCEw%KvanF%Ii;k%h%NI z=rgM6A<;~R(0HD(e8;OCC!&aMmN`OgxVVyr;luHuEaUmSsG#)*)uTxXtyQ8~0PGp5 z?d&fYP6T0LQ5B^~DpG?sQ7A|q>f0?Z2=w0EeWFe9+V-1E>K8(=XFmjIZzR~2O7i7u zA{Q$vn>t5&6wX0D&wYXFK{NZAAiu;;%H!1IoFHEEtSi9lwu9D>;$r9CJ|SkhbAo}y z@VVEQ|J^`_%&Xc4Za}j$H68JZsDn&`G31s18dmf7DHrKJW!SH?>-eGTpOM(p{)Z7x zJ%W#HZC_W;i=YH^^4U4614)A8%rBl5^N`1I+%j}LgqH`ve+rP9dhLP7|BOfHDTpVk zg=&mm`94I>lq0KZDh)q8LU&r>U^qeK0-8MG%|A2M?V`DeKPs1j%F`m+5(fDYLt;B^ z#`(fUoEu|i*)dmfg1Fe^wPz7~i0Z~7s)Y$Ej5|_XiiB}IxVK&E`%2Ry>0aN3t@dsi z47HJbSvBxJu}Y>6>QwtQja*#Z;8tP|XIdhlQ&6u2_(^7$7A-6@u>E9Vh}@)=woN&r zC?p3zKVDH>=vtJ@kI3J2lNM!6a#XAR&FUp`Ol=fB(EhJ&;TzY&3 zfx}OqT~xHpE1{cL%2+r-vt#u;A-h0OM>tW(g_t#ZqgrE9dB8QiXL(1CRj^5Wyx2D! z@_X{?Ov5N~2X2-2!BdSV_)LpbG{bAifoAIfcw8?UgKPH1pW0_XiTon49ho_pzJt7= zoZ)j5c)h4)N>cM!e`Gd6gtvNv#qP7G-*{1V%eYOg1&tHE4fJ3rEa&Wq`)j+Ma;VwW z2Ko?H;4KZnehbCGLZ+>yW8g?OaAC}P&^s+(M(NuG`Gzu+QDGO2-;Y>{!xcfY4pW!A z;mf9|zO)))(4v*h9ZIBT@xet+HZ$YWAMDr<}jeSWc+s(wWY zE}`h$pyyD3stMs3V*R&lv!&q98<{^1UW+9y{mmIEIHm)^g)eqHYKGNonYx%3S>z%R3= z%8GDAg?tN2wr_Mwo8@a+AkZDG7gL5htKFfa6MaAr8mQ&Z??}UQjkY6s?4fLO!AVlq zXxH^?I-*z}Iu}IZ^%O!J;{cg0#p7;(4zD(VR1IbYDGLAd!X*{^+Re0aaVf?#H_k1} zL5^Ahp+jv6%42TJ0l?aK2AtaaYeVw7Kf8qP61%z+WioukRld`3rMq|dw_AFLy&AJc z)+YFCv>>O$byr7iY0YSv(YXL!XClHL6T-3MIvmUprXk8n7|Mx9f#I$X~!Y6 z*JH<{Qr<#Y8gk%8jN$**)03e~;_r-cH-Zj;-)Vrx3L)?S-J?=wLRy1=P=7^^iMWP3 zE|*rRpxv;y$z|WWYd}+y{xlayR7xHo1AdO^rxXp&Yms?y; zG;OMg5EPc?aTHPAh_jGjSejI6okf)8o-pm2eb^P8qigbuvvuEIQB<^cB&Rd;P(2H0 z6je8wyZ2nDZ7*QA)Zi;p3E-DFWUQF+jFA$^`%WyUgtQ+@q?Oat>#G}D;usDX2m6<$-zn>dbBl*aN$YuDx0S93cq6f}JA)u?cPpkeATt6Mh8)&7Z+{+@%K ztBx_}aYRum={aE}=ohx2sPl&U=9t=Aq>w}ZHdYgn=#+)90coOY-R3gO{`{o;ZigCR zcp1%fpb7EG^F~0-fI#1#Vm`&wwesv_(0>7 zU_tnP{4K9D>kf$q|D-B#Y|@EVKMVQW?|=MmrDPT3r4j3GTTQepinsco^!8mzKPkR3 zO@I#dpmf(e5LZ<$sEhE83?&9q1B=>!_`GcjaLCxd0>@|8Z!XgrR#!xd^PLQ6i5{4i@D6g|hJ=XJ*{ID8U$|i&F^vzeA zL@CrgRyj8o)srn1b!W!q+wE^Frel;kHBX9TW;|7+N({})Pkxl#Yt_%bARh2uHXn0-InD-%#|8-@M#?borl;m^P+{8jZ#*UGk7?$41-yUFzhxyM@hUNK@UI9jd>IO+z+@T|lysdLbA=7t=w{T$;>}hpT7GA7|Y&_;{Jkv>U-<0-!@T=mc z4F?>g-z_!2X^rxNgM?nZpuD+vG8fh}BdcJM44zC3rzWDXyn_ug4*O>M&^bDF?mp8O z%s&OX-5ZGX>2)3|Q-xYT!%F=wPkB(ID_TS09N%Zm_8xEs|I_~tZfZq+fxt)pflY8f zcw3)u5vI=Uk!Zd65Y>Jb*pj;U>>l(9&TblYU|hTjU#FHHI?Z|}2?pfY@CD-tFN2hy zITH!NuFM({)~`fvj&3OvpJUBlK$#<|1432fhfqr;HooE@Qaaq_7R1wpbY{#a?jwUW zrW-^9-7>&8OvTFt!@>#&9cc!2GL+pOxx@RvBf#ib8#&4RwB5R^6$Kx^cS?p+lFB5p zm^Yzmr<73pRO4%HPpQRm@0RM=Cm*7kI}yK;p6+j~7G+&sy_tA3yU8)OuNA*i8-1TX zd6+N_>eK+@dwiR@DDb_npGY#6mFr@k$_X4xKqTS8;XpUrjtr#are<-6pW4v1lbJIv znO#n7UX(q;rbbal-}VDry_%~*2TTXOf7jq_5V%=LOPq~`O9XnK_*(~uV);D}IzmQ- zF6%g+2)Xn=zuds5WP3j`SyT%Jxd$vReKvv*V=No?ioq*NOIu z^$Cz|MchfGqI#cliN}*Nd05qQVGY#Ea+EyR=Z3~g%t}Z}V-9z~%QYi68H+%gG#(uK zqw(l+1;2j^yrf-P%h_?Y~rXmM)t`B z${(mskLBijb{kdZ0FPKLPmj^gJ=Rb|bVayk$|o!205acrMmlMtnrJKqEF8&?YCS~R z<`+(wb3Q+gg^OmMAOhAH7FQC|F6PBfy~>)4rghrOJ0hd>`RjxtYgeF>CT-+(UAZae znku8d{Bay%8w*_yJFuz0flAT2RJTHtb!godhj;PyR!Pbk+8q`7LFTqa%Jb zsVJL|uNl>1eR20C`g{bI9a4DC4Kh5`Qldv$9AuQbTG+c7v-XZzHZ6xk&BEX_jv1^z(E4~mO)w_eDdiy7S;^wvr>%ETcGXk#h(h>yI2jolEvq zeom$)$)~{15mQ*ar{hf0H&{%&>G=gYh_X6*Qt7WzgC*LZ!=X?gt}>1WMd&FxKv7eU z=JNL&I-Edi9wSM#RQ}T_GvLT<7y}k#!;UNM5x?r-==#^y%#QYUk049B{T~}GN}YJ_ z$V=obb4}9rpxU(qhBKBb@LoxEoR$t#M!eDnUiCTe3w0$5p4Wnk7QWjwT92) zi-Z>us?Ph+1<)FW4c;%N%#GHC9PxwC}a&GZ<<6ua@SI!I7>kxi{I9|Mi ztA#kLh3!ub#jeva_cStx>w`Bd4-bylIT@k**+hmtX9MPq+1h`AMJgrZ%?(9OM~k%; zR5yz7v(1Ax5lgq4P916|ueW?#8hnGM`uTB$MzI;J_f3O)*ohwzpe^n05SmwdhIb8- zPP$kl9?m@rG8-{-0|mzeK$6?fdQ>+(=lXw&C`KT}^nq`)w}FPBzmiIp{0Uu5hClm} z;Vp0{JrzC2iby9GBd|;X%Xapb%LF?*!B`=Xd7Ti^w;~tzUXbl2Se{X034c9SI%!q< zFYDwp;Q>Ovok!e30`5F6Uf57|&f7iD*Vl5)3va{YcBX!IZZh{XT!t|tMA?|UWlSCU zw8FIP@^0>;Chf6P8u&JaEZf7eT-StU7CWG{3tZn(H{!-k%S{4nu#YDOYXb0>LjY?9 z3+P3J7M$Gza=_6ec>UyzCHuqM_g?@d`8UO0|KLh1rEpm#l*-u!Eu2bW-gchUDy>(H z!T`yzqH^*@OH;$_KZAg(g!%x9xkq}q#m3eWKjSSyZ{73K>SxgcEn*#ntj2j<2Q~Tp z8^V7?VSlAG2DItV&@j?xI(afeE(PyTceO<0^FjE_IPs?ZV|mac<8oTpaHpdzI>f_x zWj{4M5ces{@V;OR=q%2;dyfjPAF5Q=mz4hK8%Yi8E}Bo1`z_2FduE@*`J~S{B6|>r zMlIF0Buttg$m0W7QFp~GOt=qxfyUyF^Nf9HNSe%NKydm-`SNoyz;#en_`R4CnF>Kg z8>PB~FxH63M^uPNyU*@qiK0DBi2KIf72QT9Ldga*21hy|6b?1OjuZkzy8%YIRFpAm$gx*4w{ zNUR)2+6kWTvaNLYdt~f-cWjnSdzN*#D-T9tL0mpU`N5`Gz+OVwLkm+c_v@`rU-)a< z%IZ(|+v)0fK3`_X^oK$B_w2gf)fC-Yc)i#URsd~j?rx6QADtKajIj6@#$UZAf1%o= zg*f)p6hfo;$i?_-EOBVBZ#Bk5Me($lx>gIEoOk*wxJkq13|V==sz7T&wQ5FOlrX~; zJzC)%ipwn0p{r$^4N;G5MI-Fx|2jHS+G%SnGXFRs{sPhqUi3U%jrgzKD(Fy~n} zLb!fG8sq)Jd~|m~El>bXk+`6mQ*|JqLrsOQd-T1?h)%1TSxzmI&Cv5Me=BoMSg^qx zU_PZe+C91;Rx;>A&tI#Yu=K3R;T{)`wdZvt{sKJHv$7rKW7E%d?D{?`W8qK5JdSoJ zvg9x5oOq5>zvk4wN9yr@70^RGZ>)LGQE~KBz%fXBE`%mJMbo%4199%ysEm&zq(eppswVV~AW{2zBG41F zYubpNOt<2?li>lr2tdt>)CJ0-BIF{}?DO)Z_FKejVQ_&>i7JzFQKQ68EsVgdV+1QK z@c8DUTH;nS4{$bfT75OiF5ly(oM}@OzfC9k1a!$Z@$jRc{fql!wpfCnc&~Qw+DF*P zZh0id7ir^M&gyPXK1s2sC*HP)Jrh{QUeGa~Bv+jY8TeDI<=gw0Tf=>@YqX4whr13c z(M9>*?+0??4&j0z?2{Lsw`8WN{wc2q3ka3Yb!+K5X4H&{ah9)iqQ;pxV0Rzt6)eNS zI3?~eg-@uc18Rd=w^vXz@v`taX~znW%3H_-<{$}!b|~;3M{EA1N;QW(x42>_uC-)q zz&#CQ3dp}?2Zcrv70uPilxdI6u8y8yEZ&!auqzDCVaP`?J=5RcmIDXHZx1}pDe~ME zE7IGaBTpL2dq?Xo!vqYe2BMQv58!BvGYtGs)&W3)(&MQ5or58TrQn}th&k6kPXV90bAPtpk7p;{s-<+;c+z1VLn zG4M_Hl87o{2K;2FNOZ>Xvyy-`B(>y*t3l><|sTx1&H|E92)2uK4Fk zKN84X=1c4Etkk&KS&vN|^64+G3t!4cS_K^C=Bt-n<@ei-{*l{%wm+R zztpSp1l&;iuXvMErP7OKjK&yeQ!u}IZqMD;PUBtLfSD^-`hh%;I*mLb3hfh+`3P>0 zp&+ngk(M{&>fN?ayGTX)4s1k*Ze8N7P;MTEWkRw9?!Y5za(v)ooO3ap-<{q36z({t zAnq>s#+%!gEB>8BJg*%;q}^WJmufgQ!`oC0cmp zPMd&PJ)nJ_gj0Jt>Re~mSLSd;F8KG+%)LOgxa^i8fzWsUCNX5^cMHpNDl?4uXMlJm zsnz+VJN7V}UNP zT~f;0QMTXSAcd=Du`6`s$Ubc3Y&CjLV2i{MgqHBZ=l_ex%SRJ&`w_!bO-a1c5Z*qW?tDlHxZl* zn#|4Rh~wmaSw}4E53{CP@{zharK5Ws^;(RShd)Y6E+)-8dnjr@DB8+QypvX&Cy+7z zW4hS?dr~4~Ph836DEbu%Z!|?s#T`uC->g`bNcyq!TH(QDX_e0H6f@9EV9Yib*yRRV z>t3maz}bvOpDS@$buNzYUrrrhQ^P+}M^LHE=Fe5+9cO58x`bnM@6QAp;NwSfOWs$pSn~oyUQJhzWOzq+&j?nl!%bli&z_=N)-9xesj%fF+ zIP%j+L|;qJrcgtCS;{A}f#`06O?F4#dstV6NVTN+nkwkjoVISB>lROoq4db29oqj)#!B;7Kp#`p+ANVF}ozNAI&FABivA{FWL^017s@DeQK`?5lv`fF@#A&<-i>+8EY%Ian!t>eD3p=yKE&tb zeC}E>M9qeQ%Y`KNv(mTTV98~0jY(vwoQIFi%G4vi#-RS53Eb6u*s(cV1- zM?QbsW2HIeq@@4aAhCAZLDaMbm&PD6M`+1<#K&zY3$i{~JoUys6{(|buxGxZ$jg$3 zN%v$A>ZZ06zc>iBOia4|p|{a3RV7#0qpxBB&49a>PkS`yl&^tt!f%d>Q4u2111 z`ycut-6p2=^$Q|l+0jLc4fdZhGc$*$&RKkDNcJuP<+ocyhkv^FYp&z>ZFN}`AAv-! zke`CuMhBD+rcp<4RTY3=g*h5Bbsl`u4Cd!{zI^BvjiseCs#0gK(u%Ao4d6W5QGu9D z_OYK&W%%@Eg$&9O%HJc{v0hYD7AfyclTc7WC>F5JW^qC5=hFvVrku=wR>$?rLOOpp zEya1+J18zqvRlU~lzo(6Aw@{uY6D`Yq-Q4g4>BD`Gju$S9rCSc8%&>)Ln6S_m=@LG zLLas`7ni}2eMr81+0fWhlKPCLGj{|np-%UpMTP8WjWP~X*;#T`D)CK$oca0aqo%0{ zPq^qSmMrPt^eKP~Z;B_xB8~8ME=Qiv?Ab&|-5sXT8F(9fN)@_VE5KnH)@&P#RQz_* zMv%|tl7zhbNXQE<+alO5=o#oE*bp@Pl3Z0Wq`Rt=l7`vaOam z-tCOi#bTa&e*+hpFq4C(8ciZW(yCL%hc(@d(>6C+;oo{?b=EBsM|%Fs>SIwdIbe9{ z!DQe7PTL|U$KT?n`i5135;EZuv?>axz`Y>E%t0XdCxxb;-(ze6C}LmAT3c0aB!9#OIWlj zcNJL_9U<3rWd~e8c29Pd(;Cdmj6GD5M)p7G)&J9_ZsBZ8Lc6;;s9WdTD#{^+<6FD! z;`g>ys$0rD@k%u)wR<)jr*XG%#A03S``bigZQ0_xdHN+(Q1$-Ue}5LBQ)p_Rf7--CCkMd!L6@L+i%yVQ#XkPd|p}k=y*i1KGqFy zVWHzZ+YtLmZ@odDoR#ZFQ|_`mP%)``(7*`D@gA?N-huNDUtH03p;=Abg~V?Rn>6d_ z*Uddpt4a($-)LVG@@0+piYY@+BnM5Z0AQ%|M%E%K;Ye@RYdY&NQ#+-AvoX6hK~``S zDK12?gxlasbT1x@H+@KY3(x-eA(mgRQs)c%R8kxLu_o^@=e70K zsby0Um|c-pfJCQ}mv1UVsMCBS#CSo+E&FH(Q!|LW3<^g~S-r?M2VMHddwLrBDs?A& z_Iw(eRxYknnZyr4!cY}48@i)nmYSB)Q+Eu_O#`a70Q{lMv-*2C3z6u50JjdZ3LWGh z{LfewE~L+KlgHkZ5hLt=!i$YR0NEMy>B76Tfp4_zH?gTHMS9Q`J16!_iIh=7BtkiJ z?{>z_XjbZo6}aT!<4P-%hpH0&4n^67!b8bqTw<&e2a9@3UY*(alj?hA zn$;83)m>B{oVHif^>ntRe%=ZcOIZ3`sXMz38md*?G|`3Td6_<1SlW8X@q2LnzN3Z6<@w-J4&=tm~Wiu->mi-@WVx}^MBxQ&;(3KpR8Rl*X zZVZY(;!mXjUGLgsrYe2+NXNyGY%L=Hpy~WHckM(&sc&LVluUZ=%|WN`7;gus35v9e z#bV7qRi1srt_s$n-Y@qf7M*WPLpiwK8iJ%=IkDys(_e1WY#>JV%gFkImzOGqOrDfDC||zgR^s1a6CsgCU0-+*TJskrRWdDKk`6CpKAWemeD0)q z=LoyC$}q4WAdyW-VCTtw({B5HRF4;xOEabTd|BwvL|sJjz{OqSnT*@i4kj`_^mF^ zQpFFZsoV6OFBW@Q!vZMpK`$O-?$^6s^1kZ~Eq9uVZNKHOKQ9tF*O3qTlFHdH)y#!k zlLT=c4gbqZ+OBn18)5{V_1(bMdQn~ZoHZ5yF;ilkNC9TKV4Mp4Y{*=F1;=J^Ti4FH zSv~Pdq&*QmDMJe3kt7% z6)x*$F;Z+yPPqhEx@h2p@4QOpRUVrfqE5A#UQDs-QrA@K)k}*pYFk?1%NT#(B2Xh> zh_A2uWL1f3sg=#8B)#34wq z_wiz8+yA%m(NY(5Pi%a8&Sfkd zwp&vvFf5VsHW6`V&7J3`##XI%Xw~KkSFRXiDg-(7&pSSSFy9p_GW00=x}9ef`4)I_ z0FkapQK%}jmpORr|JsK-+-gn)t;f*a&gjQd@`?0%p)hLW@FrD%+X<42RCh^lIt7xN z)!9UDi!B)}d3hLF{>ja^2APH@8L6|Sht6@tc%L|0F;GlUTg87Q(+4GJEtkmwR>Lc_ zbDx6qR+j2VQ`2I=Fx^h2v?aqz``8PZNtKy{ zH}==UiXvcrT`yXk7rSFmBr%)vn+HrJL_v$J6>23D^TEOy#00okITZ)>-*sTd=braH{JEr|H0l{1jY4! z;hzZv5&{HwOK>Mxa0u@1?kZ@zqla1v)X*;5-zP%)D? zP0YweGJlwBT#$+SFYVvjr=MjX6YB5gP(;OlKRI$3)+Ezd15?m^QnO6Q(6qYF4Rd)K zIt8@n_*pwRi&n?poU6&X`8GhFT(xo+$v4~?_r`pd4u6uB6BmMR-we4{bLz-_|KQXg zSwsPfg7>=26-fmwXBCY?<~8B*zBWu~h^cxTs`W2l3%}K5@?ZCyPD{-Yl2Xnr;lYo8 zG7VV#6fv<1^<~P+owy4cGB_I|6`OC5XwHpN6Z4EN)(^KGdhc>>l*_E8KF4&6;9+-z zr#({_=8Wv^_9oUd&gA5~fBy%g`9GGLpHneK=k5PB#FbP!H(obU&f4)n>qg`UbeG+w)8`)odtgte3JG^s^9lCh#IrQAD zIR&1ZnHQI|m;W=ZUHLNzTKZW~hYYbntIj+69?k(j$yWyRVi_s?dS;`3KM|qgw-eN-BOt_Oq*zxg6douFh z^K^_yp*=PEpbtPi$HFe+vRgy6EZb8FR3-(LD#jmFK%ztPsN9OzF85k;-$cZu!0~I= zFoe_+MhCmA=Q7mPUhji~G$o#Lfcgxr&}h)u$& z!f`cQW!_^-yn%z^hVH9kA4QQ>eh9{(W4`~iV))FWPm7{+RX6G*9CULmd+gt?h%j%? z9pYHQD7eo=N%P(A(|DHDY&n;%D_}b9;oLj|aQjIns$hZbj%DV?7rtf>& zl3q`}@O3BWiIx2Tc`kz^=B2Y1u^SdCe5i|q8dipPnc&m|;||wdStCk-i&hV{o}e0_ z*>7hr<(ae5-Aw~l(TUa5^%a{Z#4G7sE@2L*zt2(APvhjDDDY_J>B(jK#ZVf^?)dG* zuddhPaH(>Pz11Fzs$ZYp*ksO~M%wIo(kbT=ru^;vGqJ2H?+e5L8RMe4h)e!TPdO%w z`(v{44hU8Dg}hq#Mv1T;g=V9yYgyi!Cxi6Ple#!vlr>rVJkZ$AqwckVXii7e0B1^2 zFMP(>nkbe*Fq?5)lX_CC0rz0`WKEY^HxIPtQ}`!#TO*>fsnaGrKa24X;20!Zpau>O zTeKLmG#SmMJM=#8(tD_Zs5%t2y5i#!LYtARX{DJPOL z#Xa-;Wf7*`*THJO?mo63GLNO(ZdP`ltK{b8;gWifTC5{j@(%&#(ba5HkAHTo*VB}k zepOF7(7s*=m_^jZROYqK(jV#`>q%{BF-E&m(W@S>4cYB6&mpe5)7Alg!dc$%+FX3O zK)0wEfv+F}o>iv6T5~QLetEV>L&4g;Urd#uQvQjuYst`;+rv6`pxD3g^$tq7S}a5w zeCP35u%t>I;$rH*Bjt*U(nQ)5m>+Zuz#XjM?%}#P#DX;Z={=qC<+e7-fzDY-S0*r{ zU~3_B)x5R+Rfm+c@4wJa-BIv)ouMD81nfE#?SAgcMQ(y?{&fi%zYW-47s!r1k*R|WZ98VSR z{-kfbmug6)NTX^y7se;xu@9}(c1?8qq8{10bq(dz1QAYB>!9cF*ujU(K}#+h-7LSa zly<%8$~gE3^*vK;uPXe32~MU>eae%WgDD@NZq!*N8~8bA1z16G_W0*|fs2Ydez=7X z%8e5IWL>EUVA$jV1HQ)2uQ{Z$bAaAOn}O>i2CtY*Iq{4!e&LDiyv75dUJ*KBzB1f; zop54_0r|bO?~x}m^2)oa_$k-C%(GPC>-VO7x^YOZg{D4FNo2yAvw12$`)1rgH*pa`E!4Mx!%aF@?d(MkCE(02mkCIWO)`6`Cd=p z1MXMj)>!I%9V)J%w^1+N=jCCcLq4yYnL&k4vEiX`YOKNJ>U8&BJgRO}e#YKETMrr^ zINU{TTUO*Z18bwKy!jsfSij?7PwO8OrXxQ2@N7UT2K&&~-}x}#id{Kdc+bcX0qDF3 zDY2n`Zl8knZ17gOs)e9~uCXsL0MCaH>;7%2O&iW#<8M{BFNwJNz; zm3vjP#Pg){9^VqLTXZq&7Uq?S4qG*Ivm1Le^W3`@majth<45b@hx)#8_9`}blvx9d z%$UjR)&J5VD2tUV*M7?y0F=oq4fna9i~9sz+F0$Y3(I0m<-TC45iivAfxmKlCH~}2 zZ}a@Xe{&~$BE;rYDh`0TQ22!IqQEAi9TBeEr|9v?R;o~C$^x@~y=>&Lt#D?{nTJzu zcHy{3v&~z*RW1PsLovfTSXcz&QF@S<3>Gr$=Z;AYb`jBLrAj|F`hn8a2q+LxktteX z{iwGUruli$noa6!z}$6h;;yM~1t##1T1X@`RV)#MY$m47f729oXc5jv;Sqv=&YmI| zktX!__BS5Crc}+45yn2pfJhFH78rkF=N}`u!Nq>Tbc=6jlp9TXk11XShZ-)~gH5Ss zAUm#2j#J#nFud91s!%0@Ku^Ibw;+^XYmpPL+!IQ0qnKFIW%p#UIc)fuJ{Np>FvoZ1 zbVOus4AjRkzmS7?tf0LzK9W@joe<7Cu&8{Rz*i8cG22f_v>rey1Z;y|ir7O?w2Ccp zusA0dV*J(l7QP8pn74ZRB&>u99%F>8xq{3~F=&=nSxV3~Y&QI^uu`ki$O+EX& z{dQ;6uH4pMqB5hFG0sVaqtK5HX-J@p?I0;fzh$Up|2e;Br92MiK3^MI_9f!t9`)YklA%et+Ui8JK2bpQ zxb69^B(B(UTfTsv`jB*HDuGpWW3E7RU3eNIf*2v)l($~9fOtOaEU?suMbuk$jeY8( zm!gjV`YD=*MaGmtGiFI-|D)$$=mj5?>Wz1qF?f>MDonvY@!6Srfw#~RvIk}&2=t{(STn%pr}Fop32WN z=vPA6ki$_(L0DpzKUu}hx1lnN(Al%qwD3)b==3WfzRslrg~v{co6+@TS(m|#>D0AK zY@$jKDFvRf2ZkvWB(#hdc;2B0w{aREyGCm-lZATi^3een+~B(YLH2Z~XdgkwGkL}M z8Yv?@ofi~cD#E};ix#^qdt(sW6r}Z58*FGjAZ?0D! zVz@#klH_)dEIrFzBqG$HJu@Pbb>D@Cd_;6Ll|S2-!D2O~1M|>0JNv`l?+N@klkKr_ z7GTCXgj(k4(&}C=4n))Sz3?#gL7!>z8l$bq+Wed|^#2P}KSe zBsoZ9aog~|Nu{naewwN)26CojoFOlp;qzXM*5iLHsyVGQ>}*V&CqpT)T}fHZ&ivV` z_2*!ABe#e!&(ulJs#wE0)_VSoVB9O58?zG2aCBxKlWJ4Bq{}iYl|9S*_ym^8pZGbS zx5a-dZaUytYRFT-d1{!cyHJS*)UF6vxuwAmEJ?{ zA+OOFMz~w#hP5zLKoC4&n*VHytNo#izyfEo!_2CV-#gs$Q0dt&J6IU+TmLK__>TXN z_a))HCBHoX@M^&RBcmF|aZxFeEOOtwC{Tx%bmK;;@<1)%B7CmAbk+0OCI-j& zdf`1O^(v4vr>)f@ou~XJ?+zC{P@aA`>A9~|ve^bHsEE&T)hBEY97CNuPT5I!SLYgNqu|;g&$i8%2;j)vtf4tJpP4C%9b5sP)p(2=ODc(>D`|WN_gM$rd0s0%m^^lCxSi zymKrf$@FTdrR-KJj{MeNE{8+4_B^#?DYjv^y$))WraoMfTsck;Hce6eJ9y|cT%A9e zItO>nr9qDU?dL_!b1go0YC2i2JVU3zL-0gyw?I;qtvKP@==7H{{$a&N>< z3-#{`G{g9;GMJC~C9g^c!+T1HwMZGX4x}P}_~Ip2evThQK3E%Zt>o#1nujm&QD~Tec_*HC8pv}_q3wlF+^D$H&i!SWjct7{Vuqyg1et8 z540C+Om=*j5(5n3?2*UG8(oYq>gDppw_Tm|u!#%#Y|kHMDL5Ma(e4k~V+6LV$GV&P z#2WC1Y(AR&uK0=g7msah6iT(x5*js{&;C)jh3{HFEkbHJ4Cjd{SuJ}565(8&*?rqeTn(H61!%k5=ISMzA_*i!$tT?jfZ4t8-;ytd5 zGq&Z*Z|Y%(@B9il7R%xG51H1`%SfFp zVcpEP)*#dfapr%uAq0v>>o>Yx$f(LdT&;f&?oD}i4oa)TPLY%s$y<9azhkAZP{47# zJhh1*5w4fYK@2Isp(&Msuo-5XoTY})(14XIajn^XtO^Fb<&b%5PXh*G(-w(cw8aV3 z@j4PU6-oN}wkw_bVvh*gWUO2-%`5Vh>}rPy@!gkEjjmbDc7>cK8b)sQflwcEulbMp ztVz8vgzCfBXVlHY4L4oA$aP-N0p5buchW3T>dP5{?sp!LPgKhS4$k-b`WIKjZ0?_* z>`#WN1zxzvvA!yEx5zB&1)`Ho5^cHjt!WsujxF&yZP|keF=uH&RuT<0jL~vtigt^H z^6~uQ4SR)kYO%vlQaGDyg2277o8L_>5eK7~Hp*H5mJ@S>f-$u9^>JeV4C0bUg1^)y zb(8gAcEpO$t#{Q*)N@?E^)x>nB%QcQ>?|1H5Jmp@mN>7i-Z|Zf-8(IU(nehtw3kZ|UY>9BoD) z;ehx{XcMC^o8`{yO~ox`O>D*c=G@n%3q-&~I#4bCS1*`>-rJ?8dnBC~q1woD=2)}X zMa-#+ZE9tbwpbj%Bg9PBNr$aSKk$QBh?M9S;tL}g=Sm>YXaXlKUq@K9B)l0-DC=M$ zr#j0yJcO6;!hpF0xIbYAd+`ng#G6LpR-}vz==I}(=AsDq<3Aj7u4v#apvC{F;#Odos5^3b>-&N;F;V4jr%CB< zVs#E$M?aG+SpQ1h=2OSZDj2VAKKSJr9`QE&Y8Y4!c=Y-Z7{3;nA1vFEqH379)cOV0 zILm{6@B-_6NZRRB%!&O>sav##99v*#>rK+3tzP(S)YdP)kZE*$ER#QS-H``4Mvpi|+*6P+o4+HLmy6L%Fz+%~I~cG}MzQz@!-NXM!=|Gc44vpA`fm@G^fL7`2) zAmjrRGj2~^;$QGApZECkBOx$uF(IFDY)T6{c&i;M~dPv8f88B zym`@V;^adm>rioS(?eCd=ZhF?=B@Ae#{Pn>xVTrOGeoK?U%gD+H7RUV?iab}tL5}& z8a-aSRx~mD;3^PLD?XDI;D|&) zh}BQJ>Ugjdy%_N2ZBJ=WG*+9F%S%00rrUsEdqe8t-# zJX4Ds3NwV5>?`KUoldG;mG!w}o0~Yf8nzAkz89vTY#nS8LF4p_Tj(KDh?@eXmizE- zwiisN>)$*0IQe<2&GdG~=vYh38cJ+pu{d4G;fP9PL>2EC=2Uz7PU?gg$yS4p6?bxbpKh$ zRGeYMT-IX5v`_5NunT03S4qw|QQYuwa5EpGI7f1)n*ckwP$zp3- zF7;tx=>+<{S{9w&j3^AOp_BZ+ZQ#^ur`n|d$>dat?54MANh%cOodm9x(o&h#DTLgE zMNgAV6U@#+n4-PlN%_{dVsA1ci5g%JMN+4j*=4wr(B-2?SY8S=5_kkGyPx$(4JaEPwBSSw80aA2MSuaMeLkna* z^B*{$55qkT`pMcT<$ z?E3p?{gnmlB*U>)IHQ76OiG)R7W=KiwPmAuT7ic_+I>|AW24_*DLSJ7Y)TJC)Keu~mzE$B1z*?8g0-tJ3{F5KDxwZ=()oRv)?z*0SHeF)%HENA#}iqKWN4KCpTm2G^0&qB^i85e$q3I)-*m0O zU1AsL0Z)!W@IMGbE{kcRIQ3emiAz3tt0@$D&kQr8P0Xx* z_Bci*c3ZpJ)JjRIvN_+nSiWto%|jU}O3_|bfOy5CMbeQRIbq>#E?Hgk2izuMO-pT37k2o$ zwEWbmSK?joD{VFvNl&HG577NV8l+MP<+^=}cgZhx6qd@omjV~n#4eXm)jD3g=E_0{ zn2iRaS(`|xxZ8bD1zn!~tqER&9r{HAPZBdxq>Lf*W88&DMlfnG80s-pf%-tN;#7^Y zn z8W%IZ+J8B|C&|q_SKr%efUBzLnai#iX|lrcvfazb{`q~>YYg@R1B&Mvbr*i2+Ve!& z@6D1pU5P4M^}TuiJS@SUL_B|Evg5M1oq^&TwA8t|kFZ@pyV=xl%V&u7Y`!yGr~Y)VV>LBa($LD#c!9!+!uro(Gu zAA-Dakvc`tzRQw3N?T=6bI{-RE@5Y3t=)R0A9gI-H=`5)Kib;#>(ZKyLf(+DL$>I> zZ1#7U(-&fQmeI~qT`iRx>cz2pe?FK>H&_1W-1BgEYRbSGj)@pUz$5(66xUd~W3Wkt zXpqQ&4X7~j$i`o%CeHiMcG<5eTKA$Q_t2f?{deqdz8jt4z3Z% zjJ7}=`5tcTB{!=L$>JOS4macgnNeK)#2h6gv0<>QWUdUWaZ?1eqeG#~ir!&34-8!w4uVs9y>I@b~a28WInyO9E zN)ckkPO{nCStAbB+f%jI)+yw)4OCQT2B8cEI=t9mH?RM?I`2H&^1PCh7DyWKJOE^l z@BdmzT1fx7C#fF7hG!P<^jTT>HM+{m8Z%oeaT{q^X2i^ZhO^t}2qHqp@b z3&}rp8FAOu{NsMenxTF|b8VJ)`CFsz6kCsH29SG{A&aga-&%&C6o^~oqdW7MfHlbW zH!=H;oVa}xX4?F?5Ci(X*n+-#4rodW=PN)??YO2FdH=sCec5H7TPRh2n(0?jbs~AvjZPKJ?os6xOZQOI*?bH&n=D zd!n*zFt)^-j~ugXo3wS(Q9@^Eko!gJdMEX1ihb-jwInnKeAO&2gd{8L^4fD=zPRTo zl|)L1{gAx3?6}V)jmjik!)K?G6fG`2)^cqb^jNV?xnr)Ks;9Nj`my<8aZJXlt|94S zh$&rdioB)lj|jfLR$?9zsr5F}pU(at82{?HXws>Rb5I|NuEwb3u$9LqTEhZ2dAvPV z;4MZtk2?43sl)B#COfkIT&KQ-S{U>oHgjV9+Hn^sRN&E+3`%fYvlJ)yEVc`9%XRtf zb9}a|eeE{SNU_SJ*c5qB`7X)BA09kdlQzusYtOMlaFLHvbJD+GCDf+stY94IrR%IbUqxl>KIyD(a2n!l+=`v)Hq@VcTPcXWtx&d^p7- zi$Rw1N1%x&PIUu4$SA|8=krS(ybo=`?l6MN#ej!g2cZQ=R4Jv@r{q1WtBw=vEa55# zNEqR?bwF^}-UHXVd{AEJ;=Y`~ZG+sfi@F}L+*%NjGtEuVApU&YKC7-+eAmZheY(|e z#-BrlV`GzO}_Z%ae8x8E-jTJIYzUWyP;e53`0(J5RGl&~Jf1s%3{j7gQ z{8z>OPmc}?iQkmF-2G~9xDSj6psqW?Vf}a(0EIP@i`;p0gjIe);E(-&(Y2RFu;oSn z$W25y_)e3Atn+6tp&hkp2B(gq3r#ZaOSRH_(rZd&<(!N|pd6S#+W~O}x#XXlbZM>j zgdzb3Kp1YqsRlRy!N7U7jrZ-1IoN*~{}HpUGzOmfEwu_;Bh z^8Nb=HJLbVK6(b( zM_kLimf%_)2yYHS^@bF+bD$&0>K#9kw8rzQ!&C-3yh^k&#~lXLFK(tV7a8+jA*fBc zgAiA@<4-537Yh^8489}iV>ahX7AI~yUm1UeHXuzq5D{*9k(>TR-jq(WWOqxSGM48K~DK90#!9{>)0bZ&ZvxJPIoQg~`EJKV=ABdfuj% zgi+=eB>XFVjbI$=sn4j&2gi94x{;KSFFiSBYE|4{p;N(Pe147esFJGSCXVV}ack@;)40p^35SLLpt zQiU!Aero-S#fw|Io_Rhx$Jj5GEC(r(_X%+61?RTV-G&1!0so*R)su@OCKYwffrc5_2YyyVeK>caXoWUI}**!F#cXqw-bME~XvIPhGF`P@-~h z_TC&LyR=OvU!B)cL5b}@3`d#fB0x-sL@(fKp;8-ECC&1r z*z($rk$vDAptQnyg0;k9(Wc?4yT+lTyz4|N%f5r)9z9Rh3+imS%OC2_ciFU=%CfG6 zPPqcSTLUnO^E8|w3cFab!y)a~LZ!Q5;MF#n)m(BSm?8I*YJ{fkFFCbtAMTXtH1whd z-ebdy7skyr%^Jk*@nhCXGuQSnnihUSek6v1H&XzLCUy6y?t*H z4}4nxdDNX9zR>NwLrLEd!zzxHUWc&l8|7NnB5TDiGbcUK=o`B+}1-ap(+Rf#w?;CPc2^p8gy z_fymn0GKRmqj=%?8gh5nCbV4`xOqL+A@w9Tyr=QavnfidDD118Fgk-jnPmK00yRy0 z&Np3N^y0TV)FY>e4#7?TY&i_)I=dPiG*aGY1X}*(!WB#-a$LdJ>a!W}{~Ecu-E6u12Ky z)QuKv7l^TDx`&~JC~8Tbn;Dw zC<(N;f`eBhvA5i|wI{mo@d#&bK6mE3l#UN_+56dan{_pnaYQ}fx3sx@_l(fWFDokd z-)DCyr%@bs;rH*nEfE0wd|N!9AMm9b^DL!`tjS~uED|_|5^KLo=g85qOZWUZsY_Tz z*v?m6!44a~6KcfhQATufeYA_P8V1~^mRA8Op(wSN{E#Mv=yALHTSY7N$N-2Ul&nc1 zAs0@XAC5gv%19tN)oM>|;bB?_oyZVgYhu(qRgr|fJhEI8Y~u3vuXc#l%1o3E%#-^NZIhFu831WIT4(2vFL zp@-Zq88eB}mC!8h`q-`2>$;ycxc6CPdButq^g0zbKu^)<_T^=*r;*iO^?XDFViEk* zlerWK>7&3n)N|F%BGv)m7G;cfau=9nwghNl{R{fBHb8vE#Fvxc^h|)R69%+%{k2od z&=B3$X>m4^`7$(Mz~z^$upGZuE_V8=J(#6d(iDbH(lj~K9iR}C$p-83@4|!qd%QCF z&i4JPXXfphRck(X>8^jqv4bn4{I=zw_(gLs z>8hqK9%;%Prh`JF0|O;dX8A^2SwmvZ8iqi_BL_yDNA*r5+f*z4GJGBN&a`Y}NvlV- zG65^($aSfMczK&Wd4tLl1HFUO(9olyIQo0MdN3al^%Vt6O#0Safimc|mk)kBS5eAJ z@pg`bvW)MOZ~elzTo>JJxwUf@^n7By-s?$~jLMHD63mV8D>W>-L9k7$YF_@$=*__% zK5;L}$x`^Q*bura1GP3a{&T!I)X)xhs(cdQ0oTW622c%k`_kk{IS0_DtB$~hwu_o@2C@|ygzOOGf7Qf zcxQT9Qz0&Mf3BxnULKrp3~4(Lr8~F^v&?K~z%EzMEoJ9&=)t7XC2Ut&Va_1I^`a+;Q+asg($BrE#;e}G^?i#EBv#SgR1|W>(^x!io3K;@^v$%m_#et@>ytKj1ZKyfPkxZjOtF1tU+vz67s;yh)EH(T&VjAW;ZDGX&?|5s;>GDC`X3G!jN)5{tt2LZEX*YyQ zas43TF&cpeq!SRsRIYc81k>PqmCeULHvq6F@mk`=O(Dg~dNRhcFPCk{A^e@cb|lR& zRmQsJD2Jl1i<%(*D=Hwk)wRe`dvy}`dfq7lNx&n^)tA2Y*hd2+g8?3k0t%7v;cc!w6MZ+Ym2V2#;%P4_*{CCBxYCud!KakW%j^*WvUc~VCoNX# zh-v}h{t|q1zw(a4m|6EMTz;R4d$!OBJgne6P`ufdWhdjsbeP%uH60QTB|1itJWTZ>ta?swEUT?nD*?H@nA~x? z8O$l~pP#3CBHu6HWyZB;&|L-O9SXSv?mF+hFy9!%!K|;@qEK5zPL3|@#(?#L<5jub zXt0=gbTNSE@Dv+;UO0XcDJ zkqR)*!saYMcjhiU@zt5CJ3)tW|E@`!Vjegn83q5s5jGct@bBB;Bhl6u$8DL{Oyf-u{iEBW(r3r ziixv$r=8V{xbL>BqB)Bc0LpM?32e1^^!F+j9P3UWGoB>yY{}ei&E?_Hw|6XmMtY)_ z^I2i%ifp~r%jy@Mv7hjjAIOacFYx~ZtgR5uH zS_SAu?uUpfeA^{8uI%?FLH>VT90#g-iZd-IvtyPXI;*YKEvtszjj#I-w$`SUU{14i zE8Mb6xDsI=YvKPCT8%ENi{02pD0Vl%%pGd;b2neUOIUKAYgJeqjpw9~_(j}1$S&fp z1;#u7Oj9$E3IiadSnDy@?#%bgZx(8{^M{cIpUghm1(^MXNOd4$eP;`_)_GzL==Q=o zPG>;Jy+GY48q)vEa^lUm=NjVIN*FHy;iMkQmJNielT~aojbR+Ie#|38TYV}aqNlsf z!u7EzXcV_K(ENA$jS1zJcCrya6Xl=L3N+QvzUgj#6dB|i3)5aeuc&(5Ll1kOoHhJy zn^ZNj*$$t6|kC8{@8zcI_I$Chfy`wO=%Ec`qrcuLm(JSe_L#ioDG(G;EW8 z)a2bKEM;@fyhVaIy{*kqoE*99E60Z8QbBA=zIw?0{cD5)>+Pr(`|i%2DMgA zs02m+Ospg2H%wz2aFfO?$T9*A!2d!O75TD}kh4vY+RT+B2=4c%88rMWar)PEfdN%B z_3q2KDRcKl)WrmyPj}y`XKM1n;kR9v?w!~G?}r2FzZp(3rGA*VXk!mP3Fsd%q)hR5 zjtibHOCRh9vvHcvz7yBFU%8$To+;5B5NSza>z7ZW@2=TqW2U+$XUUzccyQ?bwyidO zPGKnd_MK^X>u>$rxPE$=i;ek|Kfxf%$`|=FrCx^-?s!~z>1$cc-Y<6MTazJibZn9s=o@lpi{>eN zY`{1+iHA&6A%o$)_eG>G6r99+Jo@bWmG`pmM01En%cAJ}V>9XIiW+rp&{`99Z71w; zs=m*Q#7LE;Qu$+{)!YnO-gl|b=N0AiWwx#|tNH@WyVLbwPH@csWTT5xycL-?6;jR9 zH+JJnYmrxLA6Kv`S6>)M6kuPqS(F?pO=H4rvST%7Cs6J{-7tX%UsK$%mAw@GhW`=f zY&&t1UBF6P_uX1*-;?MGhC~SXJp;(Obft+3uuD5~W8_kSh!<{i%m3IPjFAEe`*E

gmbr(_JqzPx%9eS9WZ*sl*#oq5YwG3mp=LlOT^3;^(H7>I)5qZh zL#!qxGRkEU3FNM5h(WRVBhWS!wELi=-`IKbQcDHL z7ZBxbI^}oWS`g~#-{egPO{utX!d)Dnin)UbT45Y8C05h`Q(x#iez&KFuKao7YV`!a zlcBR5PcbNFJPWBy2x?)3TKbfPp}A+-<#)p9RT%nMUp_jnS~^h5gS=woj^V9`(teE!`6<@7_zZ1k!#KuYu$a+2tnD7?JoPG3qd z(?t14<<&~nfbmLtu)=uueWd6J%u6?9Qx?^ejZo?K_m8lQ;y@pEm;3ObIIETP&l(ir z>t^x^pl_KbsQ6Fir7RO-bi5P24?FS#{gi5i=ay8$5WPg@`Q+G%LPX2rk^4RD|N>^7~5|WT-5ColSq-dgg!8S z`R27}O?%s`bXCCTLvy=xz*O)?w!c;V{);=UnC;DDNK@hU9jDkm2&{CuGA`m0q4=H> zl-`E{Pn9Tg|}%S;38oEeJoJU$X7FcXG@&E<}P!8eh*uT z8G3BK$>h~`$z-lf^o72v%g4D7rK%k8?Ztc0w^3y+-G6b{2H?F#Ey1d096?2h2`kg* zwvSYfKBlaL*{7d``YtGQ9qysv-2ePlEW*MeTJ3i|W9)s?=-rkJV^(e^hs%_g77M2P z+i~$PbY&H0%WwgteU+}BH-d|n-P`LA&S?9m&_@op*(9$Ap;EP(&hxn!7JGNjBJR2z z&bPJm1cATEpTqihTJcj^U~|-IyDb@<%aIPyS$5pCq!A(pPzCl4%9-8@kNXV4Ki(I3 zu8hnp4d1Cu_rdfF$&mgS0R0-vCoqFnFm6C+NUQdz&YZF%H4VCEo~j44^70WsYvV!- zkP`vsrb|>X_+5u`yz1yC`j%gpVeQ%9QQ;IR#0RdQWvrEd z5<(h{!11Z@ia~TSCkyU4%{No!Nl4>(t*1tXq|BY`bH#kodf~0OO~o+7SRHO=EIF&Xap0%FQAi#BL zedDb3D>eTB8!Wx`;HEoAfIV`@$x{*Sww8@o*<8wBFS8$m*e^X=+u(mdpAdf9j}E+b z$5?`klyv-&{f8s4b7lO^hLlarLYWid`utfpp?IdO8D~U?TTTn{|A>jDz#>2Qr+KZJ zBPWhzRj;M^SjGXldO6*mharidEBXSBhjgFwr^V{$y_9xc=$zcs!CH>$GYAX!jL7=@ zSCSK5Qkc0SovGe7pbq;Jai2`(u*7G+@%6$-u6*t{kFwuWpj_3jiX^A^2v$8vZ6hm! zgO?}$s%WCWEKEXwu|?`jnc&h;6OU5m^LI5QSMB7!IaRuToH08#$qTDe>~W1AY9r4a#w&m;y}YjUReF5!`Dq#WasJth=m|1MwXDW@rIDhoyZE|BMz) z?b1yzld=x2^@$KA8bZwz^j>rR{E;;F8E%Kxz}%XW7ZVy6IM~Y$;D6DbY1*W*wX9I0 zDey6k-MlH|>r;YDw7Xc_epo|nzvFXg(huJgUTGVH&|+2Gj(YJ;+k&0C$^@zacp`5x zTcfWw_Pa{aIWO@$${yVxNg$g3zMgUY)e_4ebe$@JJ;+6XrXufgN&ygax=jZ$gRB&+ytURk6B^}VJy}ad? zObJ?P57&%i^#k}}_(%3>CV5~{fk%_v_*~%ZvF^llzgAC1XZqI#&?#xiDnWY680I>3 zl{`*$6L+e4szQ35*;I649{|OtS&3(CVpal^%dm|@WacLH?4w=b+H3F;|a zJ5^grfmL62EVWdMxFRY8_`puX6?=7zg9Z!Yr~eR*&IqX{KR2XUgG*-4fwSYC9rNGs zKL=qv$J~nOe_4U-TqR_;)Me|ZdMZygWu{s4HHB|__V4X0F9?m7z!M7_Le{8gSB|}+ zY!kY8ZAIk7I7bTv{5ym63#fY*jKS#YaRKr~4=yha9LIZ)q?KeX9iEo=oeaBKv+Wa$ z`_V)$1tZWjr15ZZ`cD2`uOzb4vNDWeiszCZY*7RLwv#D;jP55IjE(uV=cPfWWWXS; z19_0^_kXK@>p{q(WzaK(#{j4#gV{k`h~J_43cp}#jnYAB$QTI6#*yTIY@2Vc_i~Oa zaYx;ijR|~SD=B#D;e2OHn)p_s|J3FAOMTuax5oqj5g=}(?|SkRLMu=u@#c=EfgYIu zhjoxG@4L*wdQQpDtaM7p0*A`V!tlx1_Y{ao5>24gF^kf_lFGyhiSQl)N1*akWXHAu z_DEZSx#7L3f*dj5=M__kBj(%N`~%-<{XVr;VXEA9FWq~y+jq*37xn>jKZ$*dwwMst zM&7Z~EAm8_DrP@q(CxN9eY|KABilMWr{lvhMisVcDxazBg5YkDE%fz7JaAwWRJ5f= z`;or9Y|W0ND&s!L2Yf<6C;!*YF8JT%|3wil0SNCX|2Jo#@5evhzz4tF_Zr#mf0O@D zpZ}cG{}=iHQ|UjI{uc%Qmze)@=|7eJ7X|*8nE!I=Kb8I$1^$6+)hvPX<3?Uqm_J}#bPojVHY)btkFceTlF#j+1&Z;ZU zCRo(TN00>f;3T-aTX2Wq4qW=ou>X|>Pe3>MpsqK8(o+0~eD4tG@-z$7`3%11r-aFQR zl!;$W8}M)}GeZ!8t{>E=*UOzg`yENcHiSj7C_ zc_P%ht;|3yn!tSV$b8K@0JT1dTPBG*Ab~Imt-efHQLn5_77eB3P zsXq{#E?>Dwrc}3$^(PsbQjrX{YLzzje7Ra5A`{5}WWJ(6A{xI`tAWyTzC2{5$*Mph zo3~V_g;C%8N_?(D1NH87Q8EY)d8*b>l-+U;A)0_oB9T&ls?kD)-D&}8B9lup5{F@` z-bA+1a{gPDPK!h)r_EHejZUN0A_`OIEyhZVT`UR_FDWhUHzGb)u@Z&ssWvAw=i?bz zy$)CL7TfiyPA@mm%k|jNbOF5Q{aM6E@iuIy=Us0_O&4&Z)2l!+SMX@Hh3Wb3H04<)X2|7o`0-SV<$C7IR9I|Q*yVBsiP%iX|Ba`!u~;q8kLL&wkoZ3S z5PUu&^M1J+dfZD?ygV++1x#k~Jf1axFP{!`cO#j){;jn+vDj_!kLL=J82CO>;LvOO z*L)P&BH}Xkf4H>P{R%*@RsTgcm2qIvz%SZlEXDBYdjG@Guw73F1m4i|7R@$C3iT@O z5J(pkr9z`-FoVPD^7UcU=zOK=aXXBp)^?ru<#9Lm@#E*UzOSAyFE`-F{ZxYwJHT15 zwW5D`rnjd14fx@--Ih(?z7z(XT9;FG>(yrD)fT&<7$Uw}r$dFal_tavH^?BQ`#nbJ z?GeW7{;cQ24|R5%f?|@AM(=O0-1b|aP>A`%KWw~xx!uR@xQ7r!EC3XGf5H3^(s#8x zwIkl&-@i3e zB-`r!#9FP}7Wi?posU3l^?l{FU26@<;R@bN?kn%f3EG2!P+xvIC#(>h)3R>0yP1|9nSXc+fxp@l|? z-6wa7Qc9-=|G9U1EjK;3os@=+)DEf{Vf8fcF8C=U|k5@-(l z)|mrBcNrYkBy!<*f4;EC)0)m=+l40q$RT6Y>3c;HJNblq+uy_Ry}(sfn7)KXPW?M- zv>n_Zv$B~tnYdvo<@xV`=nk9Tm+b8@GWBCJ0I8AkNH1k1M-N9k{e@gW&=CHy2{0si zRAdQ;ExByhi&UzHiL|7WzQs|JQmJBfKz|2|=|5|<$f(NJ&Ayo>{ya!52EpmC%FAcW zai<@?iQaOp!bSFQ9w#GsnH#FM91mM8)^Ef0XvKHTH8EMpWCYEjNJ~o_{cnQU3F!kg za!J^GUpXYU$f99*R1tZIE6D#4@;SRTTK30pf#`E5)J7B zrn7jK$ZRU#dSmJX5xN>yHepkiby%|9}NtY?P=J&{@9Vh~@(fO!4W8`wgY zSKHzwv$}>nA>N8|s)JlZS!kVae+lbOCEX~*GPu|}2tro)DO|h!=4MXLr>aBO*LAl? zRAIQ9sSi?^Io5&^Ly3!@d|;xD(}X0M9+j5~oc6-`16dK~tx(3%Yu=m}wY>fyfm{8w zL+u#^;UgCHZT>;au$%v61mNmm%lbVqoZ@lOW$@S-P*Of_D=sKH3ey|;2vnYR=6dK$ z=<|5C9%NnN|Ju(qrx-G&a>!Y|O94%W4KdoWtk-7LzQ)Px<3`vjgpBlNi2_w6-b!YA z4|)!{>+0Vz_t`uo6>o=&7SkIXenrvy{nGsb-JqVVUy$4}BgS56e)@(KyPGb}x;F26 z@l=nyjzo2w1)N#WYV5T0IZ7501^PwR?jd#J7HGavCx?Uhn%SxKg-`5V)haY1LwkbV3sN4z ziar2q&?$_?CQ5i*xT$!jxtgA>tvq?R>ywZ3E$Th^;9wu5Oy7qj3g!A{6=e2(l?nH= zL;Tr72KzDr^y=F>%jc41mCta^zYfBejw}(+3 zhGU29YIe=bBUoapcm6UR6*FiiHQd81WuDn!_hA!93U(`H@-eln3g+p8N+xXCPnESO z8newQeo8HNyDaoGOY)&Jta=+?BsXvh{jFz6xs*G0s!|%spg_d6z~?wck7|&>RV~C8 zDGcAZohbj2QA+-8AC$c9PGs=?F#qRwtid9#gHCaQ)b?uhu273?cjF0%b&`Vi659+P z2KdUyfWw(oX4s(Pn|j((%M4dUtSsr~KB#q1 zD7VENYuHY4a+c;M>p7s%{XV|6 zli5tv!Z4#K@tkf(`;J*=&1WyACHZqWj}>e~02=s!$og=prCXGP-l;{-XsLdT-j|?c z=%a`GM{AK@DV5HOScPwUN(@5I`nW7}rjAS=K4pi_&a&Nqj+^)ul6cFOBXm6{r*pO& zDP6&Ay?o8Bl(yk>I-ZezWm!>*Qn}1fLo_5Ct?avLZfwYr;O31^ha9m1$1SxAKQ$l^ zbIod(CHK6NRNNK>mp&F3Ht6&~!L95*?+x1~)LO=dH=5GG^7j&Ego0$ntJOZ(K>$g` zsaFgsFXv&UlBXo!jn+&5;JcFiU`K8*Tx4wRR5pB?ik~;B#u12nbPZ&i3G%g`rh{Fa zwO+?j`A5utpZkeM*anp;BaDF{!~~p{Wj=gO^k3H6#c%wZ$^uI6L6&lgHv1>?gF0#J z__s~v#v~9gAYjiWRzh{uyCe)Z+Q@1x1y@HG=B7L#fmk2QNmJtQztYauI$G#E3A?8{ettRYq1p*+*Sj6 zj(ZAUSGAnQzIJ zdk=}Mswcs^WzB4Z1dt|-zhqFFQ&}YTEr!|iH(lM2<7;F)FJl(pvHHr;#p&&wM{;?b zV3%Kg1!FQVdKg|pjIN?O0lM(bDa4Z-7C6e|!iXuoj>N@S%|)2z^bMA=bYI>^eAp1> zi;|jZHSZ^WBrK4IEWXr>x2N2`2b!G+%#E7l%txnx10vf_`xk3%k}0-tF89La_wS;6 z8XLt85e843i9ZsTDHA+25-B#Jq7UFaC_a1vX4S`yI-&uX#J|OQbnbSQF#-xzHLec? zhnhQaafr#VaMe6U<5hsMG(7?x$lLTI8wFQbEXW1W*aoo+U3iaA3wD8148#&1Yu)wq z5&P3lNl{^I32~cQGW*gy4Z)-9l@n^_fn4zgr6uueogjr_xcveZ>6zJds{RgKXytKYe#_yHX6JQMI%I|_VZ&n^# zxVmyor@Faxc>?D~(*`QRWc-K=ELc}VT;1hQlH*n>g;l|^iO_QC3&lUrSO*bZ9s5V_ zdzjnC_ql(G--$^f!+b5Tm^KJ2Eqb)Or)btUmyoi3GE{ZB?MK@FI2FU(0xIPwM|WQ% z1ABCD1$Zk_p1`YNm4Fi?9-O?OalHLr6Hv}P@C<6xLrh&HKe5;YY|(7c=%sWBHL2q6 zBLkswj^s!&MDpBPAsFcCW@<@kid3M#~1#p0C6lW#+X`eymFRoV$gZO4AO1SxDD&q#X7AIbn`K0!ns_x-WTgtQ zVIGJDv3LJQ&J7k!eE6Z?oMLC$8KCt*pAl_I2A8Z?hY7xM~%5`F;J})>cshIGA|1_#$9#yNm8)-JN)NZ|*Q@(9&pDRA}%3RC%HC7~-(d z!aM%AT_*JVjWyx0j@*Ghx5Q3QEBW_*HmwpwA+3B&ku8hN*LLUthVxl#NAuh1eiQ6( zo{pGw=*+?{JA@gExwa<-X2*mM)yGJBtiYaaX7}{qmKo#L}%gG zF)AcZdo4N=c*ErAMF-G!0-@5ZKxI02|$;O;iBg)I#!x7w&Av}{irQO_YsY%cJa7}{I5G+u^ zxn8XQQO?7gKKi>+9GMofZ8G9QxlkwQLg3}Ql(~nt!6P+Z}$(-2I`VgE^+C?q0l3n~U2(_S(H@Y)onH5>8r8p5L&o zc$eXW2s5%{1@ zELW}ZF+nk<%v```h^k%ARa7u8zipm8zPoiw%4t8Qm1yHsJ`rKTijT9pGvG}6_Jpm@ zRgjkN?-xsD4?b$3hqgf@g=IwT0Kz0IWK*+`x&OS;@W@{XY6W%3j? z#iHtqSs_;(_Xi>iUNppbc*-++-CgWIA8KW`H>C?Kqy!}49JYP{-Sk0o?ae9$Ol)y1 zllp2Pn}mi9^rWf&Oma1?_+O4%8zRG6`qP;0c`meI@PK$5q3l7-?71YFo&&E(x9ss` zzl61yzzR9MG+n*Ptd5tkJE+_h^w3@*kXq(I*qMM6 z=CoFy$)9VZs?Sto)@h-uo#SeYPg1JW*KqU8)VrcCmupODhFz90PwOxcfph^eW446_ zA!*n4+sSB$`y!uNmR1L0h!aCHOX6VHZBk6~;>_VVOuCn9cI&6k)P}KamrkY`xLI6) z-w(lbwd7W}JcEY_yQda@Zi>~7m`@%|kmy6*|J>F(vCiG^>$y8?n-UI2dz|!tcKu>X z$J^KUBX+uW#q`K&IK@yc`Difu2{hkf*wGj3hiedu#oeQCQ*HM8()H0mAPnY#_I#(e zY9kXdxi7>>Dfp0c3SVE$9b|lA=5U>HT=!)+3lqBSLIa-)$HRz72R4_GR$kmVNVZ~- z24KUR&!aj>vm(~WqF7lBa2|JDfK&JI7u{LX$!U`*QN?G`Su+?Fh?#3BI+^8DsY1Pa zPH9Xn9rh7Ni5*r$buvH}${wb)T<;edt<*MtoL7Q>59*mV2jebXVOUXGjR5r;-Z8fmzjq9@9qySK6>R(6i7yPF zc!ABKL=}k#J z+vWa$7dPR7;}&G%PL;Fk2jO8H4Fkvg?J^4Rmz>gIK8Gv^FZaQSRo-s&3@b^-I7#`C zK)1%2C#BJbu}kIlwjKeQ1;?1BRrI0P^{=z>Jh=FZen4f)oUa?+@`oUn78=wWPVq>j;Gft@t!pE{MI9zqxJ9Kn&Wb}IY!I9K-H&oHb|a>LJI-XI0KcT zC$-b2uO9g(RWVBaONe@}$V&J9oA+I(5QF~KcY~G!-#{}G`%*KK+PbwLM@4M9lIPxb z#|g#>=U{J?zJ2P{7(+{HPL(-9>Am8vY6hTF1;i-PICYwsRAd<3!X3&xOsg_tw;yk3vk5Tw)760(B82R?af}JlqElip)>5ha+{tizA57eHTv+l zL47zJ#v=J+XtbI)@e`xYb(+b-0W8znSqDh>cP`T-?1|ue2)VDDIUb~(C6#xt?t81d z>tffHeSlFF39V#G1Nvzto_xwv1-nG-#A7DI8RdbaU};5ni{}2YF;i4qRbl+r0jugJ zCRF`!TJe6`qAf)iDff<$QV0FS@EX^m^=I!lv8Cxwk>U;wYrHaS`c$bPw|>rtM`=C^ z@Oe#qJ0_x71HDcQKkN3|zs7}$nmh(MN%K2uRH!S4yseR*xa-$XuB_FG+ml3dE^*#{qsh?6>yuZ*oy%k2mi?~q0qSH z&2GqU5UXy^uo^lN31uMahibL#Eyd=PWz3Rv6oxh@bpNp~VbV`9>L8g6(%I3=zQJow z+A&XXk$qD*J<~9U;;ntc<5ue@?JT~TS6HNg1&8{jaop_PV^}lB4pn&t zRdQ+rGBVpmh6A!Nb zoZ19L+!+uXs*k-DAIN)i@QKX-OShL*t7??f%_pCXzTarzO!cGbcwBKkT_RWRi|++n zZw{HU2N`-OuKo2gOWO>3g4K*~fJW|mwd)r;QquT>MLlp#j{HhPHno^B8TLnx+J~Fk zpZ#iv>hV4+2#TB95Mh~d1Ht<^`JNS^OJI2uA_oauC4d51) zHxjmUDhbvR>(pzM^A~yk;L{c1a3{h_^ZA@9u)wT>>7b6I5E=GV-pZ+VxFCAZ%R+E; zL}y!Uc2E!z@y0O_`!X2B8$QhoKep~RcKke0@aXI#8?{_l==bYL#sh9!_c6169Hj$} zI?kD-0_kkatyp<`Qol2?aRHe(9iA*YcZ}7%xweaisVIjC&b8o076<{E2);zQZmfvq zU>y+ontC)eE{%FC1fxvnGLB|wgi~_P=o;&l^9=B#HfZ5{sS|K^5)v1VmUtHu4TZm2vfDu5__GcIFwcu>Eg&adbTZl zQ>Ag8KX=1SF-*VZ(%~Ys=qIT7Rzcrq%AN%I^%#=|YZ}?W-_h7Je)vbSiS*QW5of-1 z>xVYkxk1Q6lx=YDY1>m~RQgNL`?CDcHR+)d zLf%j3C&i_~LzE5pW|SbefNaOkQ8<;=$J(#LM^dK-N#;vg;5{sWddsxv!Cgy)g5!mc z`8PR}lsXT`A>Y3Z-YS?hDHS_7xy3FSgXWRu<67$r*QFyd)rloukHFPpT0mlB7r8Hd z-=#Np$KgXFm4WqBA7*T7hv^ucfuJ7#4RFLU<$?1#V$@_9)m|4n!WjJSJ}Wako@k!8 zJrl8_9C*S#P^7_=)z)M+X5#_46O{`V26p8CXgZ=0B>mc{AT*N|0_54(LDDt4>*$Jj zV)Poc)R5PWpk_F^mUcgUL7OVi7>3xjwzBc&XeOf-SqMrE$J_@!`XCt0fCOc*eoC+K zk}f2WpNhABH4Up(nV{37>UebiiFE6EhwW&?bS}W)o;<*V@yU!{ zmacm&VYliswrIcP(Gb^9p-eZ+E3cM%BtcgU-a`#pdq_H=LG?zjA*%#mY8|(`X>eK@kxE$A&p|UHJU(1a zPUjFyQK$R0JX<7+E5f|Om{~L?Os^5ZHv5^gtvGG*=rCQ`$Dv2II`**8*riM`=Uh;f zDwZ5(WVcZuxb5>n&+YGFGs{S$Zf}CY_+e!ZL}VQH0W&TXscOZUelhgfo{$}8cJF3` zAYLbDS`&Ap$hLY@_pRbIY2FzrF~tRCf%^^g85;@7uxo2JD|T_^nW)meiVnX(Eo6yBlQOG1*hX%A3k+2 z4|!)V;Kp3JlI_r(&IOpaRa=XRqZ$c9nc-KLLamMWSMK}9-G4?qa~TPiOc50AE_a-S ziC<5Uc-4~YSkX9jif)*D=-=q1t2eAC^|#D8k_0~-vX#FOItLot45W_NlP<`nSeb9I z*ESX|Fyxre4E=OUhkth_+?6fh@_UDk4)5}GmS^+SW8v+PQ!&?7{j*AA1I^BV(U52U z+TO)(MUKV-vb;(}NpaN2-n$8It5afqC0rMfd%B(Ffw;vFs#X^9UiehA?VF{?u3jO7 zBfn}G?Gs2u)p@$URDd!ru~q1l<%j4Exzc*PPn2f$G$+L(yw0S%jyzFw+zQUM^oAP{$zhkOui#$|lKlqzTl{=UX-|b{{mnO(3=%ODpAbE8>y>aw& zQ^Em>)5DQIZ^8C>y9>e_vhT&6-!$R)-f~HqXKs;7Hx%Gpnbl-j((F*jt5Eg2Wjauz z!S{pJqcZ9ym&EJRQ)&Y=F2{emenV{r=_=4qnH7Vbu1OfjO^4K`p4<-T6PHjaiF#IX zg>mSOQ`uG{*|6^9okqtUh!86pqecH^yJzCtu>$xcKYH65zt%E`N-f+UHkewO`Uz5t zqHgLuTo&BcS5oR@DJARL)j##gR(FszR1IE1Umk<69iDKq@Y0MfGyY^_FD(^qOFD0I zb1iPDp8C@HdQxTT8Z2}^{b8_T+SGWsF1StLFLurUacGbdX0xB{!8cDbaV8mmuDQRm z&71DKG^5-Fv!`!fM;^3zh{bUfQ}eXEql)?5_Vh6Qh_|;@VN?$`c)sQ*Zn(aBbtVy# zVUnGFA*H<;nXEyh=`2z}kTHI9Qu=+JEB@x}PcM{UHz94Y@6u27#aXVqbmDP~Jfve_~*WDQDw(_-3KL>KesO*+7#a;ZYH9EsLbTZrIERk#rE{;y!S-Pz_ijdULG!V*HMpA?&a9sV0wqhLrl?*AJ0COMf;DEUD7>Oskqx@P3Gh1iIQH4XSXYK z?V&jnKN4dq6;Ja#%K0JSHma5w5VvVq>v+^+^Dv2odZTpC13Z*+r|~GesCxVd_nxQV z(Y#ft)NyyeN+n%P$&9lLlE>CZbsKWJFv34Q8(H9Sy1M8sR8yn-H(`7+-E`K8qM`IU zo{ewA1{R_O{_WmVv{{~2UK$V39k20*Ykr%YfY{JcpiR1NB#u6(#kMFy?0G-056$W| zH7!cWN$y}ebl^C4?3!J$e6#}p52BTNbBbhlhD&XjH+c{W?-T?z@DAkZE3b+L>xowx z+-+iTgKHR_lS0WMl=l$cCh%<#&elet%0^3CURl$A*)V*{5vT9UEM{Bxx*l~2X;b>V zU&ngHRBIDj%{D)$K>TW%@?cj_(E_Sz-#G4t3cWt4*VnEU;gBT<&awvL$P?@^hhSj+N-d|HBb z1S>xBeIN2)DF@_C&)L$oIEUZyS@?+(Z2kOCh>gn_y@S_P^~mp;#|teMFFUMqR7E8V zh}~5=^WBH;I3q$6#J>`b-A3!a!~B0_UcbBX|4Zg|+uI$s-^=gr}|=ceVo`S9)yd5{-C9Y2>-bep$p z=T+6vu;S*2Wpa8y&(MMsf;5(|fY`*aNp!4aIIZNb(0{al{pLv6VP;6a2vp6?-d$9Z ze!6p$akP4gXA+b0@+(g1ZRHe}@*}86CVxTL|MsqX^iwC)m)0fHt#+DYFi0hatD^$I zckrmxh^u^q{-dfmxK8Z#&jC!_3T%8%`473?1N{%=1gO{XtW$6h=Yeugzq|q_zRF}@TK=q)@7*eIF)*m;vUijxS z7+MWy?Ff>50Kd2+eKTC8x&O^T8tJKzA2BOcG^0ZdO1cHqDnhS81|m5y0x(Floxc814EIWwd*UI3b8;th)6=kFJt4Z9 zEm`x{tC&g0>RYZP_O3(!!gvVnd{9+NLW@*AJ;6A+s$Wq4XC>^CA~6T`os9Zmj~^YM zM)0#be>EI;?+#)Eo}Th8%|3?K9Y2}X&kbHO`k-s@sMAY!q5}rvi`QQnhr3%ChVG-6 zaO`H>YoorK|4QNCN*yFn&oDQ+NIlwh0S2L~wM)3ay5?DOf#g||CTY)E=c7lQF!a(+ ztgsxMoBhd^zC;P>weGz9Yo{&0?X3duyy`Ed++m$x)wn9dvlROM#fx~=-0xprLOW6GL;vk_>XcB@Rl2syWtunFZ7tY2L8{4?6vALRe z^w_;S2i+~=o}h@nDZN-TUgng3DA}Q|vSXfW=36;opfIIWk~|=5*KEz{j*dkp|8lXKH;&Qfj#axoN}^|*bh$(xYa*l}6r z5Fpku=h~a(n>gW+PBjlX^dFlPH9-oF40ffP9`?W2-gDzzj?S7O7g?Gn{+XfYhu%wd z^<8)tVvh=R6?x17=*aD>qJIrD5kkNfX6z12MKLJm)TkH%wPPyU*kblO`CA!FYNz;v zETA-!aN)m3%%cDOs1|KI7i%1qb^VE4H9EJOY?+Ifze({WXA13zf))?$Z|Q{!-8LlB z19&3?Hase|wVN&1^nB0dNlB6=>jRM&El*n^-dt>;s>Hg$`EmDOWuOJ?{;mlRZr;B^ z=8x`FFlbAqrUWGE@9-D-8QcVTz$np>T_};4jTuxP9{t+0QCs&{p|XDcT0*eUj`}Zx zUNJb4DN+?=8$T0QF5(mgAQ}{7r*{eD^mUN_X*zdR>EW^y}Jqh z8EauNJH;FUoM*OSuH0B|Lt!wq96lhF0HPG;RopcF+Oz2L=2nv=6W@TnnY;AEjrv)*{23fTQN zy18yK4*^^#{scpjHM?kk?!v4{EP6~8Qm-;4Xsjz5C<_Re>>fs zUqeVhUH@?^_4d=t5N9zgDtpMhvc!tIDt4e<8>AJj3WRYBGy+)YJE|cc`Gh)Uo4xKV z$hLIT_%b*twVR+ET3n-8(1Tx&-1NEBNfoiR_)}2^c{>)O2>?u6>G?VHnosqG=dAC< zf_b;Dsf?bBB3T5K;c#!4bfM>GGqrVG2R*oieihZarKdg_=|4T$c^#`(r>Pa##lP@z zsax#b!$#jD0`VDzekZNfSJE!AZKeCWI@iyS=r?yDth-9?PNo14JjAYaHk~b-p+>T$pWtj3ij&sgx z07Dm|GYnzT9lS7==xA**Y)N`%K^HQDz)|WA4G0YG*Cvx+hjp#=)2T3;`5LEb)6c2X_;N}HGNL*$q|F+h$ubeR zMdbH&n1|R*=ZP-oHxkIXVcdSdasQ=U6V&rehA_!l{oYUvV+OM4=BZ6k1CJ%nbHvYz zzXRY ~CO$LlPS=R)P-gIQRg72S3vZbB*Ju;^ z)q}l)sa08nArfFJ7zIW?u7SvInXCzagwnrI$tmw6i6*lwrOJ{XfLgZY%olSCdF+z9 z8fe6-th6{PL%w>}}?B1h1VWaBIL~q$k9`~(5j+?u0RjY(P0j_Hk`B++ zUv=7hHzj8&t^-go+T45Mh2Jq#JhWQI6RQG1t#GZ=*GtoqJ>P+EZiKQtlKM1zOd>`l z-RFt!-twMzq)EC0AW_Lki8GQ=(`n678tq}{H*p+*+OMRa$n+tv)XAVYfIvmYgG<~; z(g=n_|IG)-TYR4WkzI)Lz3weXP}nxA04v1G$%moqFN|;X@CIF})5E~$bZagXG9-Kx z>s>`q;;7X0yg$~%qC}ysuTO5ACxHVH-K=y_FI0K0_aW%mbM=aSm1FpnPpZ%oVI}gC zr2cBwuKp@)+t%@B4k6`c6JU_qs*ce6D9t3)&CSZK17f_>^Nj z_uLF&Z@eNDE;f0(T!-BwX;W&`UcG4Z=c#8{4CslYKLtYHd|^#?nuqYdlIp>X{RQ0N z^8Fa*y=kNtVSPt*eQ2*OwM6OY0MtStdjjggh|4L%be9f9sR7oTj7@(C1~4romAxR{ zGSN~qb;qR-)+nfOvsh@@M%odk`Dg&8a<~T!@0n7HQyAG@EB06fiMLd-!aIZ7*p^Wf zl9umhyBT{cWhHt&6i=8L(QQv#Hgvi9HK)tR;uNSu806&-i=*{t*|%?_q|mtkBJw{= z^W&{Dj2d#zji8urQi%hyzi4UCUHC=1teDm+bQGBgi7y_7DEuk#0W`v&$ymR#H+ic7 zA4;LPO>DOuj9+OicOa#wa~Y`v&7n@XJSo>+d|Cwt{u=)cPYd(e z9l;s42nT{`^sOuru)x7tFMf!AtnaAJP)m&8_yxEHvI)4VHbVF^A28Eyz(lHhRWitV zW#7CcI^l(!!$^ALpOVxsY2N|9)Lxze?}KKP+x;Z~F%M^tzHh?n0q^|S!AS~P7*~O8 zOniB>WYyP6)#nosqY4dhvqD$2;k57i7s!!NO8;|P;!+%sCG0N9eLa@##~93c)`Xrn z{tJ%Yv!KkpYbnDNk8X^Mi7#L|$0T|Bvo;NIbOml>2h#D$*EkFRA5?$sHRMJ=l7tR` zcrapmiS2wR-RE>B>~z%>sL;6nI&mWV`59%$^1nvI>a3>G0F$40&$(U>E|`aD(&f`4 zVQkFMKpM*e4Q2Qj!KH~1Gr#o6uz+&z*qiPf%>Nu~@viNCmdVNkuCcPuT6_Nq3#$zS zdMlhcjSFl!NNV^K`2Xrrw7Z2fIH!i6Q{N9M!~O;$j%By}mwfi`N-4g7MsGtCj8oes zeY^%e465Q8i^U-`D8Sq(lXSn(QiS$&v~|tN79Y7FpC9w*JdU*EzobU_{F3@6_w2GR zNps2Wm8p-AJ5CYSyPZXWiwQHNtP zs$|!)TX=li`60QX82+>C8qNbP>!35W%Ly_Lx%3#j#{B*9n5vfkmBR5rP)6)|@|7)% z1AfwnbaJdrUOqNpn_bY06Qi8qrg&Doek&Bb7Hjx=nd?Qx+fwqQUjh0@?rW)Qs+*WW zWPmA;Q*Ows!^Il>G-JYOz%`DFxz+1mhtpw8CNPa4mg7MOf(}QnE}fMP^Px>Q4}^86 zUD&_T?c&pwl9$09pruiw5|NP#NKAq&fGc*m#C-3`85G5z9Z!Pob1;sb3339$ zo0PXYe?4ruR>kjxj>MBOcskw!Cs~KJ

A)%XNSe2|a_TPj(T4H$rqK*yf)*Bvdw+ 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

;95Gy_2l0?sw4;D;lsz4lTnMzZ}G3#Z$P$ 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%0D;z=q%dab{ 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%0DgGEZD?QyCi$M)Eg(6T=Q3nwz}1pjdAg#Y*+Z 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

YmjdO!wmr> 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ⓈTv7(JXXn`$rypsNZffO-+kr@^Svkvr5Ki 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 SNKKzc%~aHe6=E{LW_vEcqDY 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 z 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Ⓢ{JQWZ->@b4H0F4hLI|55F^23cOIm+h>8t37tdzw5v-=&5A^yo+VGfd~S@1wJ z&*@mKPi0YVduD8n$w>p^i%)h!$Z|Yq%v?uRxykis_?eqlS-XD5m-z^<0o%^6H z9%90MUVWtOGu`rVCY_VK z=el$|N3IEdME}z3Br)}FgH7b-d+Gz4FZA7hSj*iy)IBJE3E?rsR zGlYlB^FZA4fQy4QW)Wqju{NM-VVwv1#^{50tO<}!TcxBT=8zP!ux)!AY;giWDcAsA0H z>!AS5>A$?+^0TC8h9!*bPynCue4X;X>hpdLTV-=1@Mi=1f70;x(eU@$`s!ctvt8s1 zt@|1#Z5T3K8494pKd3AYRs{*HG^4HF3T)#I?$8MCxC(+0xMZ3J_rqF7C=BiN0N4~7 z`%&=lR^TW>NE>~~j9KvH6+H(egdGwxLl8P*7P>+ovJ^)@JstYvDs&Ac>=0&+{OPxy z!Y+A3kK;mb=mF=jc#&7wy?@x2e;5>n9x*-~%{dJDw|EiybvTGH6jPJ#3MFF2KLRHJ zmhp*r(1jowB^ zam7dR5=Il&M+$D!h&o5h1Vl^D(8$h2GY0_p>Z9LyN58y|=F|Kp%J5CKB9a&G8?0QU z9Po|j=$krnpS4b+c0>iOU+p*tfzQqOrLboZkqeY5mdr((7*!=PQ#P?lb>`WCNUb2IKr1SDEqTtlFnX2xfSP>zd&1~?27u&3aq67f z5ubuOn~E`;_UI(-+B}6&EA=uU72P8J$xRxNF#}yL^{G}GMFTmVMF!Js26jRQqe}+O zP6i8F=Al;_XJ9%je=@fm8Fnw=3N`Dr2Y}9)HDC@a7iF%dX9|gCF-(*TNW(&_|aWZB-56pht`&+^YF3U_SOOG+jY&Pp>!l*UJ#3ftHB1;sOFfz#f zc$4X3k>$is`qCxGgedO?f0p1;?x;bYPeYy_bT-d0Ft3L)&w4h;k3T;I28~=;VOzuB z81q8|a~u=$k4D*&w*hI4d9e*SY5Z9k`~`eQz?g;tQ^x$Lz?@<XsUSVxa5tT4>x7R@)gu` zWze1SjX+$=U5;6m3N*_KcIb0t3=LC(Ff^(I^eJXsnxMBhv!rE0*+Lia5 zRbuH?X!cb~jg_b46_Tx0hZz9AvNApxGzu!$?5osjEZcKHP!_9RuYdueYLlRvw{z9g z5;eFg09)eP4+6Cg0<|P7HEkKBx|Y>ijkW5#wQnsIoOXeq54ooO~UX^7%Po%@uZrK zO+AUt-LB0MyRw6cz+tE*=tn~_0SJtF++6Su@VybtR|eiI1n(C%@9Z{L!a7CeMVEy| z(UvV(Uf|?a@XjuHiWqXF4cXV0&9VezwHA@LLV)QI)RmSnamYS#3mygpQLrV5x)lK5 zinaowfp5cDX+;uiHjZqC9j0VxYQ+?5n~^JJgD>};Yl+!nL(~EA6tyv7$dF*b-Sq)E z6mXvjwuux0h5D&9@Joc#+IfT9xraNHNFag=9hmGLyr2#=l@3r+aF$ks@?D4GUFXhj zhYCim{+%>QQ74K)CvJM$p(e;mr@=y}4c0qKr|U8%=`u=cRn(C-$LJuv1&%O)e3(IY zRzQ0lpfq%zQhg%;5x!HOq$>iW(@vnvfx4BI8ThpbI5z`Iz5^!Cw+09TgA}NaU)9ZgYc^D;Rc;0H5bGUaV35cKz zgcAa_`3I4(kH7(YuY&soB8SQDN67bwQM`sg3q!I*paB_RzY~aVU@%*L_!Gh?2j-{} z)E7)W0AyJJwrhX}2|xs-BgDFNvtGl`ZHFaU#-ta9#j}Qh%|HTcVA~c*Wq(X`eo*@} ztz`1VShL>Mu;_u}sjt+x`W=Bg-QLBFLgs$j;DA@r=3H9zHUzgn`e@Q z09;06F4mJ+Vl%9iL74Ev??YycR}sDp%zoXU)f<>CbDK_en=!Tqh8K@M)5pysO=`Ux zE!d}l$)b{dgbLERQpNcW>v>ku7in&DIK^X;A-H4v<1HcmtqU|=&GX*}<`X|K$_$^1iM9GgbV7*5}w=a!F~6U z5Y3s}@>%lGCF!thGjI@OT)fg< zL{nKoQ*j|{UBy0LMr@r#fUR>1Q4%jAz^2gn-GA^e{$P2zioQ5Wp8{lb2ePu_Bz&Lx z*4!n=3gmiE0qfqr5?<#m5u;^Y%Sc|ug552)uJcuI?KigQ81`-Js+-NvIMK6^QE)3Jk!4 z*7ToX_E9K6k{WfPIp+yXpiY=Cpl$36>Fvb09g9~ zoB*$HSZ}U{tmK1}x>QVsVLO?^2Wxr2ZPdXW*+S^x(c!_-Q}|;HvBPX=$$rz|{EE6*wwyp0PUzuJtH4KiVQ23a_ZI?+OSORFspk@<=R!7TSFGpv z80Y(7pi(LhYYU7U9WjWU^9+$MrLe+ek=@Yg2a(GSi%UDU%MUPFWP5^|diL`E4At&} zN##N+<-+srF}HFr@~CQWx1^cFnMTQlm&k>W@)c&Q8W9aB?k$i*1Spv@Hm2}n(E?{s z;5)*=q~yajz~Bl^MJ>MNdYtv@Tu-#ejhLrO9l6AM*23Uj*m+S$oPzH6D0^6~j z{mFlngRhiIZmC*t3HNVP{Vz1}Z%MqA50!48LzVAqm2ZZzadJx!3T&>YT7a`q(6-3c zJoe3n@J&7W0|BgiLVnS5crEtjA%_MB7CG8@d;Oa-A_ZU~EZe=*$Ml0!;`|p=X#Y?~ zk*n=rFdoyYY5?D1_@h2`3D*!`Z^hxak*b;rH+d1yrp;|s|9bmXj$-of%IG;Q*VYL| zf82A+hv2QT{OK>e#7K|P%JalZG%4Rz6R98QG<@7&>`a`Zn)kz;Bhs<7%@eOe9uTJ% zP+MK`@q1M0cU4;|4t8OA`ya~aBa@}E{P?bB878hWbp$M7G(o70ZDcik4285J1F)kp z;Laeu$v>5m&ec(0vm<)Ho3_674A7AH^MWl`=l0`FfD^0j#fNUG$7GH&I=?BS)Tyf( z8%MuqV8(vdqZ`O1@$RO>gC3>5_ijszB%3HaGIg0~ke2kP%92fi@lN(xiSbY?(&h zSuu-@sY(PO-sxfB$jsddGBittnVx$)-Hz;K*kEI?mDO!;C0eKcAGu zp~y95WKaFWWY0#7fEe*Le>PZkiwo@=Ge~J6yrNuD44FoCfDHQL)=mM*z+Qz?uvvj! zVZSVROd6Ac2{whsvvB-!e%f_ULKeR6Kt*OZ>$xmn>=|y;5w9PYn&!wUUcJQQ$B%_o zF*)93>&cQn_C&Lhtm?rumE_hm<|*WQL1_18BJC>Uwz^v?TUV9hGKFQ5MIrVPkB(ij z#f6+O-NZ+AuY$)i0L*7Du`(YY^}g45FVZ}oCi;E7_N|8qW30x(MhCaD|MUa}0B(MO zLeG!DeM;B4mSkelHJR&T&Vy&8?ne*;IIe%cB9r^+S4{r;g)gr*KI-kEVc!FJXF(sDkshyD25 zA}xiw^TAt+7+iOa-LCaH?c=ydU2*1asGCiv44AcCYgTW&wB9#8IcU%gP)UtDcDP3J zRCq3pF>gO-gA6+Bp9A0R7s}gcJ}r6e*ks09s{5HD2$ZU2zi11aLPHR{Xmp&;VksmRh}QeJ>M>Tm9Hgp|j7aY%T7$0s`ds)19=WS3c7;0k?~> zRWl>+?Jr?Xq0`Z#1%?6F9qqRlpI)&Xgba#5N=g;A$`OTPeX?c1;8b57K5wXtA5@Qc zN{L9m1=-+J_962%z(__A@7FXFxMxa7RTgjU)ns*JMocZ_riUpb6$!%V)Q8Xbtv}+k zB&93U`Xgni;0Q+o)%W}l#OcKi&TT1#R6uagPb8o;%6{+1-U8a`gqdqbLO>%Kc$b@v zOW#IR-erXnFm<=^so4ao8vP)C#3!?mUv8S&Zh(dTMS6SLPTap~c~s}BKuj$%90_rW z@|u9W_e~bR&P|ptKCWc{x=9Ffl@a5dOncDz$k&gmMr4}pL{q_$VG+^P%NDtEdiW9F zGUnDIGC0VU7J;!Wh(;8y^$J+{AA&?k4A2boqpzuPGi`s1 zvWUq_=*+?cwmQn)d>l(gy~`$VckWV6x24;R?#8U8QGQ)<>UW5kcTZr}?I2Z|;?IyP z4dDej&=xDqoNbB#_*J&uD!=%X&`IJHMEG&w(S!JCIjU!r0%OKM;ajicG@B)ax@TqA z_-2vZ2GB-Lj@tv=XgM2EUWdGo&K6!@Q$i((XM8h~BTY&ow+?$I#qRVi8()pJUZ!A@2 zcGSS1`s4ZbwG9vCN-GaK0G}S2>r6FFfw{RYpe}y&U%GwO${4fDd^%|*sN`h7e~Njl z!xZ2RrnAi z@KNt9=Sc`QQiYTh$p+(d=ch#z9}-?vtr6kI_bSH>L<@14z|zzM)-l~76HS}*cGqF% zcON9Xm`$JI-VER}R79Njn@ZXH4>+mGXYBV!h^fzx8t54?H466JaL_!B;f%GrGgrH%9Zz_(sUTMz{W=o{!@j&P{3w*7-rk@Ppf^~g$YIEPNHIdUXqD^O zyti`3U*k#ky4YOEQlCm-rqJY5&H1WT#4OTuR?LNrzv8~dYon1_DMwp`^%W6IqO1<2 zo;t1*Ys*yF6xyecDGcxS-`X3^pS(xGfSNGdI@xqgKhCd}C=0Rq^4)mhwx+xF#mS+! zkHjiaq_T||Y&R(Q`RN^axHj{{aTpy*ABnWHNnP{faH!Ur9Q#Gz_5O-q?)=6}P3PM4 z+YeD4f>h6^t_J+T5W&jE1qs?~rOyxcX{n#Llto^4T`qipFgI_?wxD#IV|^@<)?Grm zl<6-{0hJpH?P_7WOii%Hx)GA{sY<)dtP49vRDIsH{NC7}9co)Qm=sX)BK&HJzD&6pl@NkG9cq==VF-r)<~Y=h-KZ^IO-Si?}4E&K%Wk3(7rU zIc7djIV;`tA5aRr8Hdg9rKh5-!KTn|bGE=+#G1{oy-On|PZzJ6c`o;6I6g-e37^Bx zZXRbt#b%gN*He+fr$PvBevR%oOSRod^-G}5*rmJ8Qa82v1Gl4E51Q3l_sKUL?z|OC z_m|3z+dMCzwbSHK=%Gm850M5Gq4rY|I0;cvm8PpX*sdJ}mN1Gs5*oIL@LS6_gVU(~fiftr1hAtND*#u&4eZtuqQU^ir@F%>39Qd@7s0QF8q7t9A zKAsQ49dD&v6QxW-CxZoxRMDs%cxhGJ=yclf9a;m!#p$cW^TXR1#?u&^+E}S$nH|~= z054e1+Bm2K*hyf#=&vcX|K(F?(*F(0Xs^!`?yq^Y|FKNwuLt&DxB`FKqW@M~WKEyp zPab2Ip^TK3w+fp_t6L3t)};{@#5rl^8O*!U9T|vRlPg%h?X{;nZO-YK`maE)m_o*Xtf|f<;x(LA{b?@NKCMKw0olYXPvk< zg2xad9p)3$LyKI}@ASFBC*91kIk1A!*ZGtFG;2ut0DFtV>0mOU)$>6jE6>v*5oGJC z0YSQC%@HYN-Lo-q9+t{cRb{EFVGV)gkFeWe-Seq%^IEP+bw|YuB>mil=^3lqg_>Dg zx-VQP;$!<4GoO5bmy3SY(B#?$;@XJRC%TY{v^~?Us zN{(wuKe89r6Ua;Wwt{yTuD2aRQm(dwV^glz^1hSB?o>_bHSX2b8s8q&Y#z93C47bR zK8iwD7Cg*>mfUF+;2wTH?!smh+Urw?e)~izC~|)`;%Ec2MaCjc$E&7GZr5u*rS57Q zQ8o`(`;9gaH)raPq4!rmV57(?>xUi>cj##^Yd!++A|Rf}0{Rz--H;T~ui7&z`Y3qx zt*8lyo_H8y0G_z0bzqhoHAMeH!e0#aRXEHR^)%8Fw1Fazys4`6QDnp0hzca$-exF@ zYjwBd4BCESUQ0)UTFZ3AoT0;sV7$Zj=*9};2(`4zBwMMIqOBPT^~69WU*i2P zwh9V$#W19J(gPA29EtGpU89=m?v{HeA>is@L`!omBkxl2)ZZwRo{O*d)zg!xyx?wX zSq3=?saMhY!NxD-X5_SHabha^X~Zp@`*;^$#X^{6*yJ_64UkUb;xLTawEd+qP`6I(mpRV_qLWhO~~x0<&@S`zUWi!EaMgDraZ zi!H(r{F5z8{nZx9|4Un>{fjM{|G(KHJ*?ks(cvF$(OaZnZBgtWZBf~;wg~XMEqVt1 zn=R^d{SR9N{g<|Ab5Q43Th#R@TeQ~3e*R}$RP&21Vs3Q&-4+>Mj{a_oVt=0;0|CKFj`hzW6gW00Ne`AZT zeE$<$B>Iaj8vMl;ng3#oM1HYFw=w^0i!}dXizNSMi=OHpgn<^9nX#r@G15&U9{2!6Lk&OfU~f3rpAf3`)Y|IQYn(*D^N z>Hlhru79^h+yAgdYQNZ`H~(adr2b@!H2-Le%zv>(n!nqk{Qt}r>HN_a9sZLoI{ar_ zl=}kZPqt|EkG9C}7h5#)mo56YwkVJ|oemhQl^eN}XXcU{zr%Vr8ZQhi@Se?2pUtx3 zFUaa;LpI1SbjgY2&o|pCIH<@kvM8)7D2NFx%rOWovjA4h73RU_(c}tY^Js_;zs;jH z6sE)G(Od${f15|!gq=*CEnd7SUhXZn`|%Nx-DSq5ByLA*$py5F#y3;|m_{o#Wh^z_ z(Oe|L*+=6!Z7A(VD}Cq%oS~KR!)YuO;5|?Ua%vmhjM&aKTr|o|Xdp%4xJKu+YmyX)1VHD_Al~X&cMvn967c%BZ006?|Tm zPov6z+M?S^lI%(W$|}^;N-5VW?m163LG71{L3r}=tgvtqMj}8Xv6`^3 zTBxxaLqPcrF`i)`Gptvn?pkAx{xeo&tPSD<{Vw&acTCN9_us* zO|zls00idSNc&~viQ54x?VRlGv`s*UA}WnZ|Cy0C!TxscqmGw*tzLK?82^X8y9#Qn zark|YyCi|OxNDIDrL?%aQ=mA7LMaq4E$;5_?i2}H+}(m}aCdjjPM=rLo;h=7_Pkg7 z{AY5Ji{v6JGs&#vvwmNr?!S6S7ATtTRgsoO#0GnaJLIW`H5#SFy?C}ljgagtHrdCtE zUK51@HP$*;OKG2G0L21eofnjO2nZDbgew5x_=v}?K1rZ1L7_#&@IyhO%CD>z9Ddm7|W9LHLlz~u~k#TG_bIWC?C zpm1k|c8tBP7?T#9lqDZmHi7%XNrJUWa_VV&w;nOJQE&Sxo%B&%cq%PwN(XmF8dtJ@ zVHBZ#1PO791ul#_X6#ERk;cchtQd`srVXuTf2PkmE=|SjLR4^p*6tv6^05JUt~QLp zFnunhWiG5`Zg&x`iqgE`ya+g#p*M%dIb}96m$o$jc6Bt$eZsS4G7guZ>Kh~}eF#0A zfjw%jtZc6QX}XMjAp{qiOg@i}IE!L5&!q|tNP`*(%o@TwX{S(jj)f}Rg&zIIz9S?a z^_lvm5&m?7X8qxI2&4p;0S=4$m;SLu{rci#Y|t49psp*7nf6w-B-> zUMWP{_=Kd`8s{jh`Lu*=}E zJL8b0eLwklzr1xJ-Qxh4+KeFE43GLK)Ou^veJ9YJ3c^>aaERRbk1g63I>wpWH+won zrrw_e17;$CXJA0q^6}5sqo$FA$Bv*sMM#}sBm~$A!pRAe@+tDk$=>qe0r)5_V}0`Y z8x`k?n8$j9!EW)=5n2`54(Rk5Zi_hn!xpt2BIX?*;>>D2ADey!y?=Q?IC_i?^E^ZD z*sMHDC4slnDlYg>&L~DNL||uP!k0*NO;62`*UBf@XXnfvmw1^+so;Z%=iLYEvQ;I3 zXy%o8`IUg@IoM&U`X{pE)8N4f0&RgVYxG>T{S-Znmy-kk1 zOSHL*h&-E;12K)Bq5?Nl-T=}vKa!Z{;1E}-_+{OX_ zv|ZM%+#ee3M~*&Fs@{cX%wQrS4=CT_s6LW=Kb;ypwZj*TUS^)WJ9(sCdsxm~=`aLz z!R`uBK~PGQMVru}(d%`aIz! zFn4cmK{BN?4cz;-Z0Q3iF*d%ARJ}CyZ8o&KzdlB4PHK7C4Xf@L)!M%=7**0tEMDMpV(7+3(O@aMRAxVEa_{n^D;|t>fgCsC z3r5rY(H-8_k6_^=oj4{bBF7w?vSkv9vwTF)yec`C@?n<#avrx4SseU9JOp}Wk{?;b zZ`CWgs5yslJl`wx0v9_`VZ1wbYh&9Mi2QaVJj(#!|)}!$GvM7)gau6 z(~8Qzw-UjlZ}GV%dYMoyKdLGVqyChZ>iNN~B18L=Rkn!L3N*^J-N6CN4z7(A9maLMuP*O4Bsa^txQnP9b`BAi!O5y2uYgpy<09nxJlyY{8>v z*VnQ?KN&Rja@vrwOa|HUZ3Ppu;B(4aGrC2?dX*zyvWmw7L-XnT zm6=(k_F&U-vsOl^s|~`Ypv-w6IpdvrG_rCkdzUbJi(L1CgNk)k4_>N~6JCx4;l|`4Uo0ccHryEDjoQV{}m8-D4 zKSvr^&VrL^1^b&(9cQE7_%-tP$LLgu_lmBlteE-6=*_S#f8|fLLzF0zA3BR?j%$#ct!v&q2n92&6U8C65fh|3#wmz_jG2HliiR;@p zc7%siPXL+9jVsxp<=hodGVU$_*LbMmV-kUEoj8S3bO`GZ6`;C{l1uE&Z-bVSXzPP? za1y|)rX=fOd54AyS{V7AmFV{HMrubeG9pkQkNl@rHgS@d&MM5759YgT$kYI*CO+*;=4&SRjV@=pczbu^OJ^SB7MIxXSN!8CMs~BE% zI+JPRT?|<9cS9OHlZ;7W}6SFfRYg}O~J&pjMb>tOZE zEngVMJnj{vF3gj^$5p-~=c<&K#*S(MA$zSvE2SEO(88<)F;NR8oRS%AR#iSAQZKHu zDw2TYQALKRAD(uX2%o+F_-1|To7~%M;W7)IC)7zvG4;aXZW*nfVjw=@R2I7ASL*l0 znyvPS#VHcA3O`=IXj=YRNIbo3@X$Et@$}ON=KaD_zfx_k(1NqvMT7LqyQZ1o#p<$Z z*YEtFXy!u%ex?VJGYY+Lg4*#WL`hB;PfVz3#g5I?Bxo?RY7goxdkp?5|GC8{&aYb- zRa-+iPGiBDI={>_tJ!9SXJTUvof%7@{rTtEiV-wDazE9uQZ{X4NW2J>;O6SZ#dKj4 z(_ds)scS;Daa)R$812QW*-kHW=?hs3ub6F3(PMVo;{VJN{J!xwueEeV(`U5z^|Y9$ zC!XGIt6pyNa8&f|52%XO~L-gv59{gJCR5UZJFIi{=le6WR8Zq_0T@~yD`Z} z<}LzrC0lIVpA?IUspzPwJeCgUfL_BVv#A2^JoiaZ{E%qa2`fxL>IhoF* z7bDXfXX{4pZX}RFC1a^%|_W;xv-!&{pmO-Inj4BDK0cYgT)H!+oLKRygr8`>l?1 zi{+SY1P0Q)1L(|eL&ReO^A~yEb zHtQ%mGTraOPEFn}Za^}AGy%bOkt&OuNST<;zzkb|&&4edyW1{mywjp)(p8qeo1ver z$w`y~v^=v|1MVKt@UGyl`<}C;Q-%F0#uKy1X#WJK+GXx1{Wr3oTza#?pwvmS_TaLL z=^niJOcz&b1sj!F$%&ukp8k94l&*`_YQMs>mgX$`;H&R=pxKom zJ@MVv3%Q&+eG5)LN;j|5EB`7DO?w-e=|aTV=3MNsaOnG5K%FDg+2P0XrJ9l3l6ZMc ze&F)Losj#XWQ@ync?MnX&BK8y+!htaJzdy#2+HfgqG!7@Zu-n3Pwprl7w|K08>Kxi zwS8t*HtMfxh50Yu8~@sX=g~;AJ+9(C+;{r?9-%ujxFIn2>kW=a7GB|d@to&`nw94d ze$95fu*&0=6&QnB?GrLCB5MomZF@{s%HshJQeF^>Ks&lbI|8BbZNQF=cU_8QUk8guu4 zk?1v1?=>~){p!$b=GXfzuGc)T*P^EPdv~wpRIk-$uk~fG4N9LaVV@mcpFMZq4~aep z^}e4beZL&~9R2#7;`*HP`dn)IT)X?+ruy7B`#diD;FrL95%zo2_4{!5`%3itsrUPv z^anWf2m18~#q|g0^~3&uZi{sO2W*ka=zlI4-Q|tm*Ni@ND@S7fE133wKvMqol>d8= zz`wZB|0p;5S1|2g!L)w`)BY7q`@cAt##8TNb?i{xq<Cr|;Hl|c^f+wL0^SIlE&ckg&e`#{xH{ved58Z1ukh>Q z5A<70GvSY;!@g47*#`pO#6Q}MMO}-agUI(}<#i^azgFi)o0%&pH%?~O))aBJm@5U| zPZcR$<;lAXXf)|em*QpoGJqhe&$>+fiTHWSr}7=|mSnbW`%i`c(t*Z-j$_aDpDO3F zLqkU0`97&%)rIg2a31)emDSfZj9EwDzbrVkW+2qnDIR}~d|1ez#6$0eSlN~HFCJPu z){pD++12STACEY;&K_C2d>>i<8%#q#J{iV+T*b%~=^$tH_Lk3DLkRrPjo5nHEBLsM zpNY`>9()!qpSA8c8PO-LbROuNW=jE!6hUEcJ&%+Byu~8iu>2YCB5`4H`*peVkRkg; z^VZ`IH~RgMH~2hbRB;PH9+FvwrILko8VP&Yz=z#6Wj??7+}3wG z3VXgWgpm_?!kcNx7@o*lUMNAH=t-UkM4T@xyijkwFzdZgZoSaIA>!_Oy{z{poAV~? z_acTj)5g7Dt$H&Ac~gITL+XS`|IM3z&gbQ+&l@6NrX-)EP9LsYFIFPo4?({0lfif2 zeAg#@CFXnuwER9W`MnSFQ<(FU`=^ z9}njI98wSzq6PZfOe>oU3D*ksBSNkX3jH$|Qc=W^f{xIPf!rt))~prQpA_1b#L!U` z3J<1@5rvP{hYk0;fEmN*K7>!nFpn}J&)KsFM7sK{D#+)mL-Wi#0 zFNOzZ9{Y~@Z!?YWF81ABEbm>c05gMla z@me(TA2{Ollj97NV|ASAd4iGkofAxxW4}5he;Y_p;{Dr9GrNobKA+%_obVnYQGPw) zhiszzK*Cq;#1C1Ca-hFcMsChY?z~BU^R%JAlcIhnh3_RrYbQtX{?kkYCh>nxN_S4m zG*8GLNJ{#rnU))joSU3dOq`N$o`R8`QZ=7kGoMncoth(?QvOdft(7;mK{hp0JGHF= zxk;A7AKpwmOD)?=9dS+_)lTbm{->F?nl=%f4xRtIW(04hL4(s5VZ<5Gy}!*guyn@0 zcEL^Jy;?)_@FiPQP!+ya>+R*UloaPe%{Q zI-N(xf;ZE~v+%I8fG$)|dzq&V*>k*^PtMtBG1*91S+s*$w6C)e@3W}}DTz~ZnE0~b zg)~58&I5HWjz#VVXb!hdF4uhyZ%8ixJq5viE=@}AByrwRbhf~0raUxLz$-`5C0*4e zPlk^|5{j&Bk*kW8ry)n7R-Dg2mPbpHFHcgSzn`ylpKEN9%j8m^S)3l7wqkH#{f=t< z-N;uGty5AN{R_3S#KEH2bHBtKtF(YR6vels+@iF}qIANdc<`TQ+T?xdBuQD6PT7o0 z30id7Iv=>r!kEz(yz2tar~O+_+mr*NCx98L0DD*n=X~W&v1NQz;D^TFPmRC13c$$T z<&zubXe?z9DHQ^zRm;UT7?^0g||>e4?C#*kXp@GQeF77{NI9UNU87n|Cutf(I{v3 z2LFIh8HHAx_0(`=*Qn#i$8z2JYmq^24sfUTf<8XV7SUd9^Au!U`;nY8nCi(u7mg&?=Dx=aKUE~E8cAkpn^M{rd zI4ja^+th8Va%eqHZSB?t?Kc5-zXSRYUZ0b;-MF@0g|?$BwDADsTlw2Df$glK9r+7w z=&J2;o$YwT?bin#7-4dY`~c8lDGZz7r9cyrLVF)lC;MY3&ZBIVZs(dy=R3p-q%;7n zUN~k)`@7XH4xG-6nl6NjP7Lp^7pmEJ+CUk%4vg#$d77`uN#q=lUBZ^gnr=PR3bOnP zT`1$-fQ}5KuyjJi-q(-azcI*9jeE3)dv)A;Y|?u4^ct~^dT~U1Nxl0zzIV}u^$IAE zp8E8hk@orE^if#$gm8Bnz*qslN&)g@ph&$I-n5QSps&SR0PV$I%hCaDvO3>1nGn6c zFADh#qM7*P{Yau+5_$u#^y)HL>(UfjEC~k*hWpTr2HAiESVlvV3IoP8JxPayoqBa1 z5<}9DfO;~5f##uF%kInjq0(8GuiV33tkS)DU3itlZ?hqNX@C*S@;LaW5!LVpPThvy z$U5tgwgUvUV+gqe@=kQ{&mp9Bm}xI;WSg~)TV-U&ZDeIp;_$I&{*mC64177<83s?K z{lksc;oPV~YO$&R7zY70o#2%q!0i!Ig2RCOG){#(VN5tivIIC+0Io8Hlh{q5DfVHc zGg6aJQj<&3!Eh0Z9!FT80HZ{}5t*=8(UV9=6R6|k@;T%q6Q=DZ}z;MZT?vrpz zgk3pFycQC=R{ z+KjQ_jHA`8OZco(`iw<7z)~O3=mfG2AI9OF6%S|p0_R3ca}i5(O5EcF%`@JD0N)l+ zqSagu>lAVcL*&zZmLM|1(QJL=i~xDWo9KB4_rDD3+d5Jx?m`&b!WZ0y8pxb*Ts>@f zD4s2>h>f7w3Yw}21(P$t2aT$ZkZSc8s>2ui%NE(A7P`r&yl{bS`UJCVi%pBrRaS;U z*wf+=?$SE>^3aiZj6O7?baFm?>7XU8RItUtoqj`b-!?VaV6E73irD!wvO`C=6&AK`wFI!iBd~)-05tKYcn*j4 ztY}=}+=%@jZbY$bVK9N00np6Y#jE`0{}PzNKKCPIwb*2s87apDtOl# z5BT$XFWY+eqvEcR!HzC&YPA*zOFI$^;INDR5WZ&AYj8N&iUiKs^QAaIGujMX27CL->@@wg-IBNVME~NUdyrJ_9g2@|PQ(DD5v;@3&a) z?EFr9#C!9amzI!6jm0cAJ@#Rh@shQ8^MNoExoN z2n%0gJDhW6p0j`fZz4e{2>=$G`Il|mh2WD1isQ%sfVmO*2t#q!j|%8NAAW3|Hc-+WAyo4cI4EO;#wB}1f=?jmL8}`c`IWG2xH$E zb)(WW4gab>j6K@Ni@RoKcrB)Ji@T^ku>?kqe$|@?ttm`C?<*l;d&E_N{Z6=)>gv>V%n;Q&UCft=^ z%k{I*;*UIht0v31G}%UjZ0exGOKV@vB0)g!phU*DF*fv)S@NBRhFML`(6SWnan@GQ zgLG|hkch^cz`DrH?x%I#TD(=p%MAs>iNaf8h*cvfKIic_6c0bVeTYu zddDW4D#(n$uX%mFrqh9NFmyi_*9H8+U1kO2D3Kz{h8M1=^1~Rz*$LMqefrL2DY+$ z=OX%N1hco-e}dW?LnKK7sFkPMdueQ7A@n&0$#5L4_A+M)LFm%ZC2` z^QP8&VQS40`-2N3!h8&Zm%T&&M)2h%RW z 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 z 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

8KG@a1T;6`PhJKhi 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

  • M=CzaL5erJgqFL7 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%0DPh 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%0A`waF?@u)xz%dN;8vs8F@}5d`7D#xjkgMtpSab+N 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

    X1wL)2)iZ1 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 &G zX;_0);nDLpDx2l69^A{MXJ(bp84X=!`hHCrIL3UJ^NTuw@8`L&m#0db>bZ(lSbFEx z8r9~vSg`{ekef2lz=8h-sUegv&%iJ*oy*)8eB8@p1}^`6kMcWM29z__7Jv+ne|~rL z(+}To|M^idn@XrefNENf2g-f+n7i3p(+p!d!0TiY!A8Ar}@?V z(tLa&8k=*}T@4>QHXMA7hwwPvz4GyKVh!Hoqd|zFxJ4KEAOsr4J*dwkG_#Xft0KHt zuADPKcL9VRz1mP%ysb;@5!bvL4Xsv5_;`s0EvehSsjPl^KXWG;kA5~aH9f5|q-uMl z)_Ic}h@HsRMV-F)_FU8}Yp$y6ER7ArFOjmO& z*&M}k?+ZF|_cM$wc~DWM#1?=&9}JG)o&3{_A7A`K=i72IDOnalJ^O`q? z6bzwXy*7X_g6#I5kZvNt-l}N6_VA&l@~RAsNn4Vt@^Qyav;xGYAA`f!zuLVr^LOp= z{)GA9%W!_RSq2BoSBWDj1OyZ9?@EDAUvkzTW9M#w`2W0^Q6p7-=*bl3uN2 z#SaTj5<+TU10-Kp%gVcbK!&0AvIHXNTS=0&lDnT}Y-Kl#M{kGiR~83tuiVkqb?h`j8MaDspt9M^ z=($=V+lc!gSaO>f%?0q-85T}p3}KgbukX}EC@9}*VMFDS^?{6Cl0?QcABW6W2p%rI zQlpbMK5_R9JhVLj8|!o8gC3=<&mj`0({r`?gG7V%cW=23!Wp$c`x6F)SAIRex^yX- zSz5Ms+dL$Tj{p8Z+OVA;`Jn{+E-$pLz z#C@3Og7A^eTH&###(4k-CJ$}Q<(kd4#wOHx>I4aSwAFI4{IIO60opt6k@sEhNM53zG}JkG{`_F@!{DdE;KlRqwpTCb@79Wy_)uJu9+`9Xm9KXD!SEfBH<+)S!365o?sZp&y!uGcth~$a}kNg8nMegZr zB(DLasDf`WRK`x59K8Y3eA?BP^Y@eUG1BEGe1u%SoF(6{fhOz|4DtH=dk32NaK^2& zS-Q=%1sY+!@eTcNzN+vL;}om@{_Q0er8?2NfjvL9veN29;X(R2w_T6aYdW-xK`xZ% z`J&OvsMUOh_=rZcCY`$GxV!sG-W6~h{R{Pn)#s|x5DHtp&FzZT=c{JKc-IL*b8mzF ztIuzk+U?l2PtU2(Lrin^-!z3er4%x|8Y(_szEq7~y9ao;fEys6Y+Ahx{{tV{Q}{qu zC2x3Jy}M1q8wgpidm9@VictNf$Y$?@2YJ`d${@GOX>HEcCk7B2Z%COS5ZQ)W&h9Si z-&XmnhxaMBAEoQ6?GcQo+`x_g0GM$f+K77})pO7JWvFg4lzF^wlxSqdht4Q6%u4iJ zFn&x=Fc;E1NS)qJ-kj(l`C0!PB|Gu4TBa%;-;^(ariqE)H@)ir^SPK8t)ecdJ~UYXI4DsiseZ@XUhk}P z@K9YZdrfSg)~oeeg%gn?5F&Ac0I^K#o=dnMtgb#NS_G*OAsZXm`=nh<>#NoL{bi{= zW7r#=p{s?w<)hi0s}ks^bD;QmsSrU3q3x^6)izoiSoEvb>%P6YqlMEU+8Kb&#snaf zR-UhGk)Z7JcPGI{_>qzY_x4`8ZE*HF&=$MvsXGk~za z`^zbSymQlYiCb8(eW~*g3M!zz%Qn)g^>;IBqbx`K*3H;lEQ0>kjj3rDKdzi{=>$B2 zPI+u`aS>Vy7Cjsc{8FO2xI?&kAF^CaZZV|wRNa~($*ex zYmTn*%V-|RyEdR%RmZG>G34Px2_X*^ATG1=AHjzt?`0C1*oUpRTBc!>|8nK7ZR|v- zQ8_+7KAH%J4@Qr{!J&@tVBn`A#QXpdLpCbrOu>@2yrRu3-L+N=b-KYwtvRJ-zcWI7 zWAF&?^Bp;|haW)LYprWNkaz6FdBNVTn~IN|Uw^p#%4hHX+Wb8Dgt{K}iu}YLTCC5Y z=2kJ6aiiVdp4a#>cT=6lF;JZv<9rY<&u79%XtEL4$H8O9e9is;j@IsT$*wy1LcdXw zEM=l__3J<4hd!2Ftq~s$c!M?D5H9F;o&X<@yPeL~<82P-+D)(0rr=@iQN3=i$#Bpp zvfKLrb3qqJCH&ZGkU(6`bGALqcbI(W znyQ2k%eM5y&BK1E|Z9Cen4GMa|)83LSkWL<~K9o{Kfbu|dtp~)(!&Sx*b@o_A z9UZVrxzl#b%vq=K_Kn*>LEQ=u57av2HKyDuHF&V+9A#9FlNB^(+~u!qK_egdr^jgk z#=|i^?ehqCb`JMldi5^Ic#coBTz;!;K?V@c=G{D-AD9D)`8e@`<*1No`{Rz^-#vUC zTL1VZSdMz9pY6ofqmFg(a&Md2(Uw!a^&E5w^#*PQ_JO0JP{3_~`B1deB4$~gEJ->J>?mSTOwx5I!cleUAF$bo>B5KK21JXBv6zd5wopd%rKGN6!@Ad%6@L)%gnBW%6Bvs@~LC zn5cCDN9}_@7lMzR?_B{K&2_=Y6G|6wJsbA+9AV4*Ct22GZR?<&)o51B+KsddW3?<1 zL~4$Qh#L=3hdg+oNmhOpI+ZxT`7aF|ZqOEY%vACwuvSY3;S*~Fy#YK_tu{2m>!~X= zUQ5pzBfFh#|CZ;5#!c(oOi$&C0rFTM43j@}Bje~ew2#38y;pJkM3e&|wqRr~GK1xF zr%UbliQJEZnc7f~*9XTtzg?!wQK~O$pYNH+DR$Xxt}~%T@n&Rh?q*c=;UpA{jamFS zU49HX_rUcz;%nrFSfF0F*W2swVrQ}IReH}{N$A1{yTRJ+`u9E`%oeOkDQ|KEx*iA~ zJL=r6>!xA>4x@B|A}#++?F;(IIG|XR%;eTq!uAU z9%2*sp({mP>72I?tZt5Cv%#+sC(#|T!y8N07&(|skr*X zk4*klZB{?F8-F}ja^mUu@r!Qs9S1F5S1_w}xC#3#p<=qpT3OC&HuSA~{5YIoneT^9 zSbT7tymPDPbXj}px^jE=#ca`G%~TrMOTN8iV;r=vKA$!EuFVI}(Z4bqS@(}q#%K>X z>3EhOmNAH`Xpb)V8nvV7)(oK__Qx*IF9ILAg6+T&9-YTZ3fv(s6dfEq7)G8*mh}WH zL>&kY!UMR`GJl(jLx?;NRzcrg)kDBt^3A!=(TR~G^4SnRSf39^k9WuDDQU*@L$Hov<8v#PlXh5j zUuY&5gkA>_SAZNMF??gLAHf(>Cm#+UO1?Vqo4Z>sUnSD-x-aC`P0)9pzkyp(`V{rY z8U2#c;k3)B{b89AJegIj4{tepDdcqJyv2`@%E{=+ADe!40rKg17fs#SK8%86&}N#c`x~l4t2^IpO2u$-dU-r*@aL=c*&Z z=Y2b|PQI36J4-{w2Rf};b>%#>fKG)5b^Zu^aYD(}iG3x&2huBali{b;Gj_>Wd7GZ& zGcIcR5jB3|vD2|` z!*5ZVcV5S_h)f6Y06)m_*vI%fB!%NFiQ8zgVj3d%?AHh$5BUHi4?=}UR=)kLIW+@P z7b2%T5RGs!Y~3Kn4^xl|GIz%Tkz3dFqIz4(L$5mto-bK{+zmM4j`S*bXs}yLd}x37 zbb^JdVDR?9>hotk@UO6Q^`)KGI9o}SQjbi{Or>(gp#gd)gpYx$w+A7_H~%~r4vS=6z-j&P&jsM45Qay)V{I6O4?zZhzO-Kls`Ej7fCYuq$$h?t zO1)O~gYtgnjI&Ei7)2o3}m|XA2&D6ND zz4!75o#2s}jS|Ric@tM(vZl|?IkS|Rn#hKDT{b^Im0)owF?bb}A2uB$2l+9-0dsf%WKtjl?C6gyG#^sOZZTH z7(5goDt~qP9DGo9Cv@#2c6@Tq7H(2CND+Li@)dr?{+#PxMI&TEj*a}W*}E5mkK&qB z;Be-7N(>}E=)fwE{2g_0_703_-g^>GvML^{kaC4f;N(Y?SIbhQKd{0a$yFwAu|pe7 z$=jMbP|ua=N-89uK$2fbo%3Blvn4(?-KCJ%G3Hple6eV5P$G>wY#(d(+W2zZ9H zSudF~zvF-O?(PNPBbzH0!sbVoK|BAvfd0f*cph)N4k&aK#S_P4Je~EYgMD364XJbbq*p7U51fTq&+y@TqDxCb zp%C>Q@+Ky@{sHuLT!M9Eu_<7j+XsJcW&>T@1b2HMI;higdIQQU5$(^y-%7SF~%IHe(Y>udZD_OE1yJ zR=5E9IP^C|e|lxL>_kWdu|}?95r-4Q2GAFAT0i{r+wq~jtI~QXg;snVgt&pP2Cp4L z$Tjcp1^ccBk*!um;87>l9PjZXlkY1cyCQQ?E~xwYAb?1=;*ua6pesK76zKJE3S{_@ z6681}srGEk>-m-$P7+6}kNKO}9drxZW7(nupMCVBA@2c+PJd(KW7*X+CAU{p$k4fG zSZ&TVzUj${sjM$x5_k{#Bwja0cNBnQ&N`2d^qXm|D*%MmoEpKGt1LfO^G;boxsdAb zJgdfNs_p}LoQIEzQS5~b{d@eWk0lfg|LME=RaK_1=rXU*or%tUu6*iimw%V0H~$mQ zZ+_iF-jeHHn1ib3-TG^QD=$#OF}=ZlKj>ujpxIW|B+Dl1d88&%gW%jEe&p}}=X*Mx zP>lm#^5kmhYP6#ex)Jy3655pr$FJN352mk@Bxu%diXRvnz_L$a_qh>QCdSi+(r|(m zO5XszziIdCrGs8&v%cZRW=7h@tR|vk2&K`oD;Bb@?R4Cd)S=~A^yu_;AWREFU88hv zuEhu0mhyGfm8bvZsx3jHdo^z*8iiP4@ug4 zPSF6>$5Jr-U{~yO%Sgsez62k>qZ=TDH$Fqk49||}2l(n@ar7^qCnoqyhdBneFpj3lT!AL_cQSys2__W9&3-q@&nl}4*d%T%Y24D~2L zL{9HL%s!Siy;1@pqlfC2aXc8JNS&Tg1ZxwZy#`Afl>i^gSen1Bb%Iqj(-;JgkBtXH zxt$%yedKt;S5v3k*>jxPZd=keA09SMiQW9dX&7=!2k+0J0^R1TJE0nm_sMI^QC}N2 zNY#JIUWbbwTV8`Acecr!2_=fw0mpK!n+_^@_Z;@F)*qi<2^HuJD9E|E;s41ep(IP* z47ZXjA#yp%*?IJ4;DGQ4uRbmU9|3_#_4_92`$MKstnn54Y)n0coUMerkHo|!Y zZfrE@^IES4#6<=WTfY;0EJIZT@X#7M?q~Eyk&;)U)AKhfm^BnX;7T@l%bh!=NIipK z?KhYi_zV!bP~ME$x}7^w0yM6#s{U&bFI(#6g!?N_&~GVu8@4Z4tByv|nTgB{ zQKa_w&!sXh3HwYpx4zw15((NG%4?*F6uqjMAFR&~tw#AZhIuJ${zG&v$^9#uUTh_{4oDew?6p3V~Ij)1YchyqRY{kCKSRe z;-p`_I}XD`IkvD|dfxwm?OkuHwb3$q#L7x0ye+}ShZ!|O$CW!igbzKs1Ff7w?MDrML8TwL*>Fi6G_b{eOV=7$ePBDvDI6+?aJaww&h>X+y?T4_LqI^M zaucJ+-J~-k)1y2!dt+*5dO|PNvGG(etH24~+1)?bhqylBwssXBkyN-uUu&X_b0i)447(abB!nEia7<4XiticG6W_85JL6@`uJW3NrUdJW z`PjTm>@<9UjXP%L`5AJ_6aexkT4o0SNeKjwl`?j1r~+ABS|U1@78e=Joyg+YdEU_% za%4Z~^PBNe2-;UBkm(#OoX5+Fzt-bp#Fmu;ex0S#BoS?H;{66fDzru}v%~wPzq+(y z-Cb*5SsFxF?;yWY4*Kh(a0iQvsZuGteI*6DEiftfN{-c+t1BVau6|T3qhij*Y93-`ooQH=Qlv1z*3eg-Zw^i_6PNG_K$`%C*7IbuVhfuxzdx&CD7&xM&3AJIFdymWYnaWu%wBAqyTfN>SbIGx$XCv{X`qKI0#ZcEnjzxg%^mqHa@{>E5`%-i40foMy zv=KbvvRc>A(X9^ zx4a@n0hKu|rG7|);z~w0Kh$!PtfI)IPu7t5pY@fgpQz6a+2K-xID)%;UT0{j1VZhT zm2F6&N}O@y*HV>1u6o+G(a1uJ>9s0uc_%@E3x0S1`96vPIkI4qF?whfphQPnQz|J@ zP7e+t;4B|}HWJO$l4iE6H_f_gvjQRAu4Y*X7aBDD4VsV@hn9Xxlf6kBUxc89qSS)|FAj z^9XbL&sjj?jdjZuZN3i9C!EaT$=}=pELOG;FuTVsno5!0 za4JcZNP7IF`xF{5{ihJ0@2gWoZx=HU-Qzdf0YqR_eqPNqGZ`s9;)@AQujX`sdSiCV z@6?{Z8#P0GjE#RfB-{{noxEvUJdR%*k{FFIB1%OUs00-8&29bv{qm(ha+&_y`&T(X zzY5#i4^*Jv&u#+greIg;c))Etx36uQ30zt7+VIURQ!&wqgR9Pa$);Z9iQb(1!pItv zjQ&}63!Ijejkx`_RMRkVdLLW3?6szq@Uh~roXZY$4OI< zaA*55?((Msj!p;upRmc&#%^X=lPkrCNwYa8QIsGvkw`TD)w6?xjPFfXib%gv8_ju0d5I%8A&zNu@ z1&uSuZSQY)+g__o_?cnUZD$i6jl?EMYoF078u*x)%<%*}w zu;;Zmy@tjk7%8r#=nVjL%tmREK(5LpPT8d3V|qFgiDmw;AAcI8D1fiEKdtG256@dy z70M0@jVJi2KlEwCqoM9KAR%0(ewUMiErL0vxVFi zy2)v{M{ku-*JJuq* zoi5g=1R2DPe9H9(E|Ds_0WN0cvurb@okqOk-M>a=Ca2sG<6L+^(@p1t;oK|g)-w^M zC&$$pI#j)wQ7x^hCb%>hsK{L&A?^2cDt94g_d`4v5kF|Zs=U3&Ap!EEUvrpzX9ld8 zWn)l?c5Ao7nwOTHejj@}ecLui` zL$gMtD3V}F`7t{ajb}D@-~4rZeJy3E!?3k#9$awX>Ol2=+w-V930MFb(CqRgUadpU zzOeyJ79_i37|dtfxsds}^{+ZkpvDBM<;HKTfoi&{wQITZ%jKI*YOE7cV{Jh6gK~Q_JA}E)ppxl+@&ut3gsi3RmKHs?bVH^>v1a2_8@G+L~lNPx_c}9~uWl z*?k~Lp+BnTXV$vPDC>&bON579lnM_EA9K;<(n`7RZ5DG`0;IrHs454!v{q|0zWtUG zUPK2}i4f^hIx_R&F>_;*gmxf#!tfDG75@DFzQAK`EiIJ|Y=-p13OrDURMn@hO*<9h zLy^%YCBM;Zz-EZ(AUv`wSq2YV9ZTqHzI~&n>H87P&d+qOq7iezA^$2AKVmjOnUe}; za>^&51Sj6`uZ`URI3t(wi3A~+NB*z?xsds}Pfv8)wH83mDL;m(P=Lr=4(#5(bRzxK z6zK)N0PN|1X#xk7=e*^-?)~V2W+^6k*T=_nlF(>S1sE>|18xxe1_LE$aERB|+M}Y# zyQ`K1aow_;jeL%V7!fjohSSXF(S>BbyxH*@aBR;dQ7xdFE>`6%*RavWr(9-km6Jo7 zUXt28q3~dwo3R(l+zR0X_4(Ywy}$eJ`={%Szo{GmQYsYD@eqVpYt@F}qa>Aj*+aFl z?llRHb+6H0uT&vL?Nuu^n-HM^o?+RONeMI)^YbxOJ~3B)0P;+ZCVs`&U{2>V=*|w= zn)ON`F(bF?$&a??sdEEwITtM z%4Tz*niTRy!H5rze6fiCn#oFmEGINUgL5^vqTG$PN10s#Ak&gw~DE?W6>X5|}cZ9W^n|6ew}Zok_s zmvDY_g#;S1Jj?pz3%PQEf6XApNv1KKizi~5U1>GL+-i(nw()U{R9Jr0(Av=bfJDlD zRD7tC;SM3HS(Ol_PVz0N-d8u|Uo|#$$r6k!NKLM+03L`P$gPyq5(~1c8C#6f>f`d6 z?v?9NO?`&!DNG=VVf-HhKmI?l#-DU0e(*oD@jD8oEdPJI{E5^!qgO|KTj4(@KrUea zJRtA}`j|#fJoy!Tn2QCMQo(f}NPfkAAIK~_-@bA^Br0M%cmelZgU8ejSMrXrCp0-3 zNd*yv1H7lo&rn{*F8Qu(i&n~c^Q$mYqIGH5XPTMtYY(Z-7yrxOKY!lc@6@UiFXZdZ zmy!q}ILtZNQwuI0z^^@*&*A<~rBd+(9+zCr5^fA0<8rpHUl)LYdzDD#OKZ(Fw_X-k zfapelsmMCL_IFZ;)bX<})p)H&*R5K$?o3k(0*`{^bSqgl&G5Me?a}#E3g7@dsZbP& z*b89wab@J=)9fg-H`nR6;3EW|_$>k27e>z4t;g}}BiF(!B376OA?5PrPgs16jyQmj z?)Aq5$c5~m;{sd{4+#AN#0?0~4@X_j3>LD9%9h-xa=r{EB98YuF zHmRXwa%yJwi|9>`xOEQQY`43eC*9rM?oJQh3h?K_qPE9HyFy;m5i+FQnAy^+8H2~n ztW?p-N4t`qJ#E&ia%$yfU#s!5mm~|+Tip0LxKm5vkxge)N%>F7cp@52sN!v8DxzWx z$`5xDg!xrLqJ!Z>qAxyX)^B7Lg5(WA5pdLM^!;@Soi@vg{M4#@l@KN+EnD(8FQ^{9A!(K0OGeCqo3Av9c~1Zk*d`S|iDpC~FuuL+V6 zKhEXTU&IN1zt08i*A@eT%uXQh^V)aNI~N`yxwe5SeuhnD*jys{in58BrMq{Ny7zj^ zxqY~mD9~V$5=(_X3BJZnlsQgKu3trE#f9gdlVCAyTiF4Hp%Ljv|AH{FJyQPma@}6iJEm ziG;j>bRy~xzGpSR)AZ^*(MkLgez*^JXp=afILNb7A^E=D^z7aR9-BlrynB4H18c4wtZ3MpASptZl4+)J=Ji z+s$Uj!F6*8k#oF_0fj^lyjzn>hMk$cd2>FM&7`y7YE+ABwHlkFBr;*Jw#|`Ro!;w8 z0YUUwoR7wnNUmmsDc*!`zsju}i7wnJ|HI#o4?0bZ?RXP3n%??)!XX5}$fh##Gn10a z1I?pk+|FiHqZ~Po4jUua0Fdhwf{%DM7rtC}_T~T1In1$C2S%y_69q?^p7HouEUqFy zL~6x;GMZ*7ew&i>$@n~80Pryje9qlaT8oAc6wD*1WJOUZIe3uXel_&p;|sUuCA`Ko z!BQL4>%%4?mp&P4-^zbsRy8_0cJ10V{JO>v@&}v~{&svQFS~SlLdXgFQAk1US0*6G zrix=0-p^<`0L>kBBwt<0yRBENJ#HGemi!xrB=iA4X6s52F{al63=;$(pI$y!Z|fos@q2tOKwlI~-|j7D ziS8F5RQEa0h+6RuKl@Zhv@ikO>=XR6;F{?qpz zLkDv-Ro0)G|-8)%c|(J4dSQOITm9hq!aD~~1ibp`GMP`-q@XuvQ~OEpZlPs=7q z0u?uo*vx0P9u>-!78e&6=baCHgd@U9oq(KOFbD1~10EySM#n~7utWs0D&#Cx@plf8 z3(%(y$!~-xinNe9G6~!OA@AOW7`#Wmnu*WfMQ>MkYXOfhS67VuVVo;1%_&nerIoo( z+(?m%CGSH7zE;dRK5S9P2=%)BtTi_qnB>U~yjm=fiIF17HICa}53}kQXuZ!2OVX?4 zy|2If>wd@DOl*oheuA}E36TIpGL;}k1StvaTFHlFy5@JT$bK1BL$fP#RxXWvBqwNO zYx>b`5Z`)l3k%GfHX19g{UMOXY#UQ z{ws*+5(`>qqvub~lM8WcU)?Yp&hVdD#Bw11z!$9GXJ>;I+|b8>?5IkRB7qwlF?jF+ zKBP_`WrlTTO!)f-$Zvmjh2aTd=W$q~K~t>2Ku<@7!Sq~7gHFbT)Wps9MrA`SEmzHg zl}0#{TzwHm%JRA8^g-*2wZ~j6`IXn}dX1VKArkvS0?$S@M zNS!Jt=n@J5IZD^26K1%pd`k6XSV*KoSyq4$LIjYI;3%O(0taFTzLZoZ&AwF;7>jIj{1k=v5n6nuuF?hx(-OCU$oz&bH?hG0GFow)%V4@}0yJXp83y3d^F zGY21cog&q(TWT@sCqWJz7)2wwiYC9>+}nHNN&F}kqi)v5Ihz!>wQ`xm=2g&K^SE<$ zMPgnlAQ1r`+ORV|gK$hy7l~&ceB0UStgoAPf(4HQ-Mu<`6ZHXN_jXL_u3GEc_PQ1x zm;qSt$Q1zHelpAPs&>Yy8GLerybTqN-yS1S&~?CXzy~^3xtx^c@`a@IiKpU%k2E7l zG%h#E9Mh{QVji{muV{**WQifaviLDJJUy4tw9Gv#wbGii5xdGGh8kF!K1%GdpyArs zK@?$Td1>U*A8HD60r+5pw-}P>R|($3eUnfecDaA28Vv@IS0-YzON+^EbvtuzsH@l% zO{&Ma%7{k3nBx}Sj4RBil<5a}#50@!@ajdcjVVQ`sEtx3NmWtemcOn_Z4&B+CNblV z>1C_i<~OEI>xxe}3oi9d*%z zwRr>)Y}OG=&{Mi{lhtpX$J&{1qkW40(^5LBv zyGf$h``v zafNtH(4@;Br<`gtnfo;AiaYj=I(x7{51(}HeSPK=eI~}QV~ltmT!Asgh~#abYK?vh zAHQdST!g)v_feEX7oMi1=2_F9HxdxAxS(4r5PPkKcW@C3^4)B}CfS_wYso%OIEGSm)|m`i_!#34 zl;;asO&-mFKq#vw=TW7xIhMjWJ{>^BJsGA|{F%g$WHJ#=%MTYj^mTw1Ib*M4%&*Odva7U2heav_ ztD`1ZRN>*rJsm!w0^tNPYHNfOr_-=G*C(5p^dU0gATmaTV3sZk)|GQS-G2Kad|%In z_@5UFL4|JGfBR-KX(H7y@;(ZKRvF-}_D>cgmG3pyLn6zc{CATir=)}_ zmQoT`8+|7%Y}h-_Y8HiHLQvRWw6)BxF5<_XbTpcZ+E|d?>ggFp$CO&oo+DWzwS@~G zVd;_J4>{w+MU&T#Xpy1~-pc_S@lsTKTTo7&n!4duB!Lith~!ynx6U!)Il5cF{Sdyd z=K@|DDel1*VOZto&}3Rl@cMAm!Q>?Nv5IM#71l)YRa^_3`P2&7L|Wu z0GW-(l2lhOh4Jy)ax1?lN4m_^l={O8HX>8n1$9~f$myKo@?<2jlCRY38(!cE=X?5S z1d);|PJ|>eb(BaVztT2q@gIC0U_-_iqKSo}7)F3tEj@llH<#!j7d|ebVJ>D8aLS_! z!2=qQOG_Am#B60#2ZY+d3gN@?vu37mOls?0-z6@CUAGDy0J(Y&K7PLdxrkSmE1C3$ zUx5TBo$8V?Fq26X>*fREqvIt-Yqj?9e4pjaO6IO_lZhQ_Iz+j#ho!jV{+{Z>{rc|P zpMUChw3Kc@G(mD9$>NjgWHz0(OE{a#VUQ=MZ6O|Ks;)gANL@+x>{2V3!N`y6V-qui zkFbQQhL0g*+;<_eCF0NQlp6_-GYc6#k9Tx=d?vn>Ems5~F27n=+i3dj7)LD<)2g4f z2r7&eij0(-wh%b%oW&R9aoN?Z@>+u0<6nfwV#0=l&eP^o{M;8S&B4-Jdmu#yMrDUYECyx4=nUv zzcT;TgXiW#h}xrKf+AeYpo@XrZK{t6ff}IW#zSe{FjSb)FF%Frl z3*;xPf+5*yboA<#;JgJFv*1G#tU{qusipk-e8&_~eX;>!NP?ZQ6n>=eyTBx6xm5y8 zFLrZv#+eAC1Bf@PS_@)l;gMQa$*<fp37DI2!Is!SLFbC8oy~p z>)yjhAGye(X5hhj7@LXCXY!DzUo7|qI`?Ld0>(2wu$;SCT*C;y5GmGEX+{(`tWRj) zENGr-IW-fpmg~65`3%G39=QE!Xh;wq%$u+Q7;f&m1xuQH%v0t{t|^Tl6DTJ>3NNXf zP72B|d#9$HmJtCmu3cU&K>jdO^b2`iIduW4`CZV*osI(tA#z|639nTr!JLqE8@vzy z!7bH1|Hc%SS13`FPR7IDV4P2o{G;&D_%S&xdHV9BZvSA=f85dht}Vf1--dVt$C65D zpT|)!Vs0G@eI_oA%EufX9kX?wkHLkwGBP^$*;FFyjMY#>b1rzAwXbZMlUGNt4h9E% z{oStTm0OVcSxzot{x~r!CF|J86+dzL=-Om7k;xYd<#IJ!D(L7-Mrc5?Pe+ zanRp+tkJ`C8JxS*o1>T=q7>%bnusJ~mQBw@OuLtL#~8XiR|Fln`SnD7JTjWj<%+)V z=NVh|U;N}s;9=6Gk}G-;f53hTZ8;;;lM_RXrLpPAd?u64uNJDgtZ&M&ui*28ld=qs zA_yYs58a*+E6@Q4|wjTO^q=;Y$M zs+3jUB?)C>;KLRG*m$^nWe6Y0uoNK5kQ0QOCIx%(*T)=-;L6prBar`}R6_G=MhWt8!H!+3!ce`CIEj6e}t?E%Ka7Hb4rH%4>i_AE2HKoFiV~JvX zauO86{C0O|=keokZYQ{88y0sxM%=h*qdMUZCnD1`5oPabANG^0SFdnL;Gd>$w;#(| z0iyBawC&C>wkvF6+s`2a>9w}LsjRNvUtt1sa}Imk0ucW+jEqgrB~n>N5LcjEhxf=; zAU^ISDa8m97|~QJ;l2`W=entf3my&~O4t?158v1KG8_RVms7w;G#H&Dy9!#i-O6^^ zcZf5S2B#q^+2X{tq5c){3wUUR;Wu_N0+E)I{(uh3W)6cJ~D>~upxWi*Sfsd?QYXB%CvkaakfO$B_t2AV6E?l@`xtK z-6DlN*U{aLM$@Za|B1rGDT}^9^f)@QLi%V<)A(pCe4HrxIW;vMXqt~+J-x$I$J!w} z*p>m&RpiY%+120ZobZ-wEL6Co@Cru<I7Y1I7n+pMr zzuF(XR?rRa3L_7q3=6e=;aDSQOHbB(jE3M6KSqO7F+L+{k^m&1FQmcyqpe3BZy z=wRN~pTY3aKoUj<#(|DPHiZ+ZI_u-Cr$$i@2Q%|~Ic^$elwgxsh?1Sj*bIe*&=Avu zhZkAY`7aR#mq@`<&9QUl=keI0RUk1U6*Um}XO!L2H}3kl?T4vW!x?*!3pt4w{anne z!WKi(C0NaM6d`SHwLa;S_ z;l3kwIjX@iIcj~$M!VkZY($@E#629_Ls)v+aauG9RmRgNLxp)pZXW>%#vZ98i?L`l zH2N3|ltC|f+n(;IeMR+{WnBUZ{xD1o!u-Sqg$GisiHPg->cYS@7uhDqZAvH=-sqK2 z{wN971-&Y3@s?_AVl^7{Kx(51>0;OJY5(c|Qz*63DGV+zJ2YGBwjqPNUaf9W$tiDo zRM2lq#@SG`ijb@3+PAV%tS%W$Oi<;ZP+RwV13Nau8yaz2Hb3oh5My8XM`?8A>X}RJ zqlsAZ{%S?CzfR6FAhX3C-l%uOL0XIaBjZP}g52aQb{dkv#~fIF|8IM5%bK? z^>O`U3XE5Q#ZHOMEKSE+RO9j?mu+yi76(*yWbeBW)8P zd*Y*m^5{D_qtL%go#)UkNx3Cl@~_5@?0=-Ng{vu6JeY&TNMTmC92W3dqJul(UYRi!yH`-y!f1o$&XAtd0wjzNNo+h$Etd+#jAW<2 zA$7Whkd1ry`}a3tIoXF3**$tW!@g;) z(Og@rse)|LsbkK$)|Iu>9Xwcjj9}fL2l$ZsJY6W=avtn9;(q!xJmL=Ygs}1c^zP`m z+K-P;=zI3u#bZ12XCu?eg{7+BXgAFFQ~SHR!xY}8|IzHQD8hmr;aUeG5MOI)>+nJ2 z8TZ7dNMN_8HqRX?t3Wukd1h=Jh_8jhqKgrm7D?#UTT9*t{KMrO&u}>xOoeLShMJ-gAf_%&(NEr4`%A(1Pvt`T1*@ z(j*x4%{-ojtV!x0XQ}{{iBVYx? z?e#m<=x?m8H5*VMr=^TjkDW`+Srr{;JMpqAE0b4iyZ+F_P>lmgt*jp^AD zcm!F{{voW&x3?oU&5dxW&E96C@U93>^m4+>mHkGuk<|dT$`PJ@?I62i{NO6&zB6v4 zHazAZ%FMv(oxF9!BlJ{Sx7Ksq6Vwrib;x!f?+)lVPf5cOd~BmuYgBcrlH*`6s^mXi z1;)mT_TWe*aUX=7%2RojfY|6s>610C7J18LwFkYmo>|d%5ZJ$V-gEPF>?WE&t$OH$ z$LI4Dt52z5Jlnh~mxTx-F=U*oi#jAk1M8Rx$nP2-oDpgbqA{eo(pp(Tb(;ibd-y^FR(`l_9^sn!|%k%WMY1CxmvB)Gqxn| z3XpJuWn(Nh`Gyu>~OkQ*S-AOZ0AKa_?MOZv1bqs=Dp~>rW0fkab+QS+hGYysF z0?3P>1~(Ex`h4tO6ZtP-^4Myi6tBCEa#dqN%@+_^;F`rx+uwb7)8y->UL;T~9hlhVfHvhvzi2TY0 z$hZG16rb{j7kpsEJ$f<30hvyu7K*p3RsWA_bYj4|CfO5B3jsRRR*>qXYeG z8cAW&$yX|9OL(g6i(7t$VtH%~{c+wlRY%z--@w>7kHJ!tqHUcOLA83T_~oLvIFEgB z#*gtKxe@sjQmKHDqI3bWY7{4FPbpi8fVj-IIafY{;Bk*0?rbZz8*M85QbWe^e9hoo zo53LwIk_SUAoJG4vMSv*d7at}1Bh`b}kP_d6m9k$i*H`eP(WHQ3>rW6dT!l>^ zW%{cv`n=MUxV*ev$`|wboTFT+Hs?$%;p7bI3*bgeA-R0Xvd>0FMp1#VH?R^6p`SiI zB8zQL@xdWyc&hWO_$X=#Ef3p733F?J=jLeE{Uzsum! zFpa*P4QxRmu|GC;B)#$kvPo{?rjkJo;<~&xBb>xep({X+oe=)M@saTg&ZQWWkTN0& zrXhaSZ?$eWI`~B?L;rTC**1axGE%Ezp^gP;*NzIKps+|ff?F}Ah1r=wgbRgfL z$R}qbk?3SRl{X6E>b=eWBf6d+Wk@MJ{`SOlu(58kW;L`tZnLv-wwS^d`q*@GK3gdK zK_ZAN5I_mg;Yx@D@`5Uh!) z6l?KPFD`QIgz)!`4+Ie8Ia-F)>jDu0N3-tNvGa z0l?H;(w4%Nvg_KGA0d4F^x_ZzAqND_ z(ygu91DZ#JOb>~IL=r8g@$d|JJf2KtzC`DsnsFoU4cm}<7NXe>rrfA(w(e;8Azyrn z@~Cj5zQ#Gj#N|PY7nQ(7Tsb2%z;`~_QoMV&ha9W_XnSY(5ro0E?sU{nRNv-{+{Um{ zU@X*mIrDHo4g_~YfUWe zW0hH@3mBSyqYkUpMze{3QISvirJ_3mkD~Lfpm1z58K`|u2A*J}5af)qF^F%ByyJ&o zKbe9RAc~KtM=6AC!h&JD|F^v#c4)KSZu|O*Uz8d;HEZ&LAzLH~OI|i7rNj^ z6A-~TmHnh{N3$Ir$ATeNdne;lpO!bmH0D{XuO;+7>?+7Z>Eas{Z!l;STS#;3JdE zBY>3i1uf7wC?g$+!x;(W`JtO~>*Kku&h1D|1Rpo%(HxzfotaPwN_r6;oesE$q!dHW zPU8otIo%#Urw8)$ChBF7)Y=U))N)H1Z;`o9Jmv}kml5vo>=F9N9f1$fprMQukB+N< zkh-OSiRcVF%8iu@eMKoQEPP;7WCAWb zAujTnFK^z=-INl5x&u<@lBjJdqtk}<|(Kak3yhR!wcp-USR+zkxfw9#0~%N0uU&G@F#T5StL zYBd2y2PU~hhtpYF;yMme#91qO@Dhm*t7H{#BEwp|;oYDZyr~c?Ky-?3Rz}L=9nk^d zN04B>;R`ZY8w@JwN3SGUHsU^1t#}oR->Tsm(Dx%=$nwNp0W&ok1Q5*DfR7vypVcL)6)Y&; zHv+u?09JTe;s2j|*cDlZh$V7qI3+;74d zPNzkUF29)XOR7@Cwup}<=qlXc>|VD|Mvic2u4g5F zKp;Ybjo)nff(|JZTT+)>^eEZ7nlmS|?2u6_oL(VP-a-VCN={O&Yje(9n#(pZRv>Ie zPMBcC2+57dh?xBT@$oY7U{xdUO1V^~X*lw%O1W%47LZU!YLx>oXd&Zinh}!RamweT zLAT@Bfl}y(1_e3^ioqJU>%qQIvyr{Me@7N_r-KDpl^?)6d47&b^HpqV$hY2lSn_v4 zg2gkcA{3~fjRUf;%6IYuG!PEYxBER#2Oo4?dZOOcH<#4+4NQ;3z%#_N8G0V0)lwSU zAZjO%XuDExG+K?8&q~1em#b`DNggV3Rui4^vGC}8duIpu=m|P*SKM;e0&%b8;jm%( znbE0~=SgfVmIWX+e1rf5{YCj9=%9DBsaSg2+@;pUk2q4I>Kym+v-_8%@y!i_<<6|PEtZ~GQ!koiPp$H}1oXL+TsP)Mq z7U5yEl3*+t4N8w=ZfEH7NJKv<#M zch1XX=^>E+Ou*_DT!RVXTIP_$AcDcU$_Q`w*=^G9E~^_l#C^5AT&-2>#X=VSYe)A8 zG(x$DF4#**34#wPAnFQ0(Ae;OP}ZCiZP%BCD-SG$2f9V=_?Eqfe##~ByH zV2X@Gd^K0Vo2shzxB#JGqYl@3^ia@0$Tt z%yvEFh7P`Ka4RqUgWPK9>hmT*p&+9_hM zT8fh9$GMI)mCc*bC`@uTxD82?6n{!?1*JR8DyTu-?OnW#sod`0zBlBAIJ+2p;>}{Clmh--h+?*EYL{^ONObL;2Nc zJe9_52V)(4kRXCdoc!(++SO83jZ#!AgWM~5)~AiI6Eb^rJ@jNa!do4*c%A#Y8*!T%4~KYI5U14dS8k&h3D!(}Vrq&kUOq}#nt;xL z&epO8XSJv`$bA#{GRX0d$#Vk0DZ zq4@Gca#MCQxHt~_t-4*s80SI-x1@HEz`xVk>ebfUy43{Y%#D;SXH5=kTg4MeT2$pN zuG3r#g-DH%l-N;bZ4OpkM&f~&)S4$2IOw=n|Lq28leemvN8VIJd5qBoP%5o86PrPg z7rhUzNwEMKITyX~51Nr5&UqWxlgehCGk9SLBn4Kw-1E$5Gp4i*Mq*m2LCX0=s!B2f zldDS?kKYw|^;TwF0NJn=Tc_>=nEc&@K!Wz}`W6JYmcK53WqCSYk>jefIZl9_g^B`z zF_VaaZl5V=kGGBzL?X!MX1~8{EGboj>}~2^Q5)1HrdZ3>uLT~R-gdv+EM+n&D>w`t zTp!HAC$U;@v{ng_OmMq!{vcsj^3g)BsPr`A1H{{jA${mwbN}tFt2Z6nSE>zxsRgQr zv1quYCOk4|%)tz|D&=9hg0U3sOVLS@IB$bc;wCGOOEndJnhzEve2ewaPnl zLD<|Z0Umy(4%L^6{s)CYe?xvN=Cuv(IdXGg)Db+T+dxO3lk*2#>^#_92jjuntCY-@ ztmypUHYU~KQ0jBSa2XIORej5>bX_gKR3JQ<(=n;TE*0)fXmoz3tA2Qr(cN0Ug=HGl z=yNxehh>tACS@{Z6Li$)Bj+w0Us1k|=kYh3w{tx(bLIWd6b5mG|CWV}dR_&{@zZs! zg5)Zu4j){Ivc7KQ7slbd8{ugHp#T;T64+I#nHvSM!I5gX0U=wMN{yIRdMk8klmH?R z*Nu(k;MamwMM&rr~m!lPS-DF29-zN z*`$%tSp-uJdM_)b5PE{R3m_rZ8ohwBQsZF)6yUK1V#$MbXexYLbE+f8V+5d%7&7w> zmgnrVs21yTmI)Ps2il88fo?7Xk6&#^u}eHfm8{U9vDe$ufC;ro!3QW`0+1V62B99G zY04=+*uWb9^iySGA4@Pf8Tfda^7Q#HSi9HqEn2)}^QxupsbP511Py0YcE@TD^{jvx z?k`VMO=xW;zy~s{LnVMV6^-Gl?7|L;a5;@2ybELAGjuMwBddRU3SzqC-$f1-WQLdp(h!h1@ z*f%J-$?XE%sS-}Y+Jt=~Ax2AYi>rq0b*RF|7jhQO@ir0g+%0}!2?RTYBf0@{T!Qs> zp2ycdZ|izeHuq9v8UaY2R!*5<5jvyjxSn+TY`U^DHEl#_G_InNvqM_A|LiX2T?Imx zq6+W|I>0MAF!?s!jnWly%m=lS{X$oO+=f;{WeMS{A=j45X0KnjS3k)C>UIDDBkt4p z?r(8#LYc3f#%)f!HNR?i)*t@m@Q3^I!H($?(`;)gOLUDx{B>=ott4t2Y{5I*EG%wN4o1JgVv zw@XO;65_~CDdKlI9l!4v5+C(MD0NNg(AMx)j3ZEoD{NQT9aHk5ek z6O{?ve7My#)VV6wst8+P4R_W$?T)_5m$>%jq_-gcJ04E2GQq1$U2zNQUqYRsZX_8&RIl=1X5d>m0UrtAL-{2i!v@G(ydF)r z)4&FB;lPnWp5ZxXm(b=8DD6y9Crzm)a`E^c$IpMHwy=DXq&DxHO*uw*`vwpBj&Aj_ zj92T{C=W=MEev^I%My?4>WPI!F3{WtubZBk5H>7`_lAK!%n(OLki?V5)>uB8WK}FdH6sGQB$zsWvEq$ ze%Cn>Wb}x~5(ByD30*da1>o^R^MCY-nS$yZU`zEr+DlY9Ai0+O+TGpVKB@)DNT3Dc zD?R{_;;m(Q(5j`PmmOICNdU>1JPs)!31%#{ht=rAk?G~7Qy0X2dxy#H_icISV5lg}iQfjLw18i}tmK0;h-oxE(ZNskXhF_!RXdoPM zgN0NrWYZyh=*gn#2AWK{QppB22od7{snu#WD$OQ2QfMF$25oC{VP>;1jGCx=_U zh7ZsW18C@WSn(FenR?B#{NDV|YisLo4pq!LGO{h7*R<(3N+q$kaCu7%Y4_F>? zJ?-Lg1n7VEfnJ_I3v8Ee+-C@ZrNZNVih*c4(8Cz5-KJa)1j_NM{}%7RM$<3mGTc^5 zhtZ+Ig9<+@<+PjUka>xvmU!CR8&vm_y@>et&3cJ~CCtr8Us^A!gU_KHxL zmjxc>s+1qimCpVC_kVf%{NUN+UaOo{wvA?<+D@ZT1^o(Md8C#k^0k>Rwj1Wyp^8;x z?c>D_rf*2NXn=oIg?Vi$0~%S-8Wy}v#=0lTbkcRMwCuU)z9Wxexv;;tyRCLvl490e zKhTyY+2aNMD|scMQi@X?fCL1031}xBA3#V-jq{Mnf=r@*tbvJ>z8ORCfVeVjUym9} z{=$2g$#V))HRmu76dDjk2Un%Xsz$A6388`(EmwJJqcH5s*a$Rz>_*m^Un!1RV0` z8uiBQPOrba`}E-N&!6w#U&XKlR86O+Kyu&2=-83e%7ufkmf2wS?G>)gE8t_6!lvAM zADW(P>gI)mWX^hv3JwkOvs!sL$t(G;go20sFgH1gAM(bL(&yXSty@YQMg@WZ!Wp6d zJz}b&81%2s9{YDWY4~6WA%R5m`JiRx2v@os+t$iP+OJyZ!l%#f9 z*1u;X0OI=qbanderA84-Rrc?^V3164330Z zuLhJ{GX1nY}0$V<7#MUWZijBb-Hiy!CCp6LGW;K14} z;iiCQwi<*Fj6J5|Ut#M|;FO#bbX<6a{QL_)Eu(B$%(z!Of{=UnHn(Xy!XdY5%dS)2 zsoL=6l?U$N|MhTh_s`#bQ_1VoqC*>Q^f{`By!iblY_V4IDF>c_B~>buw_hz{RUK5R z+)_SYT&}hM^@qpXk}YLyWlTyV@N!k2qRP!+uBN`-2032?&iH_{aD0f#11ygu`#)ALv$p0x4sU-*9}`J)_34%!}y@q#%cWE ziSbUSh>lQ8*ZE1tr%30RoEV!N9jrqgfyXcYuylr6gdoIXM|I=7UT*__JpJt+WY&7! zJKB!r5DyHKc6)t&Ywuw1POEGbkbHQ?t;{iO3D-$WT$SQLC!dbOPu?X=2MR^Z{c;$s z6>_;^vD&z^`)FfD!Ut*Vl~Mt#_r7lASC#D~|0ZvKuxC5nUT-aQ#Z__?W0SGilv%E5eSX5{gF`0~cQn6H z-Jx?;Xj>TLYLtd~QB>wfUXZ`$v(k(pC8*i1wAjb$ZBUfFuTyU55E33$Gna*zHn`&debs*f4oz0E&wG)tlKyJi2MfF3QUh)6?Cw4J>yJNTU4H-0cdhD|8HpirAY|lRFmQ4tkt+`kY4>29__t5o#r&ZElj3TC=M~049q`O zn`aK$u`bwk4qjhz&p{ji5Mk;o^mp%TIju4D46&J&DKl zoe%B~ew0UiltB9PHHK`g0wVYcH&A&PeJCDa73iA=$me@coa6rSx7Tac;zZ1;kS3fkXu|ksF(q6nvr+%}_D+8{I1kyp z>h~Ezu&~^*?((uzq`-F8wShyo#1LB`yfkuYz>>kQH2>71pF($?av-;x?M{2GjiDUAn~k<4SNnf`@t0OPkLfxm=dILOhBrOh7HyJbeI< zGvOPxkP}>R@R9psfuH!`gYu@?rp%wOpyvbEk>t2LHy6?0x@YRbMNGn8|TyLS83 zQ024L+uH8$?10WMKX)H8x7xA#yrTic*Z$e^O@y!oRRu~Wu9^q&WX#o=5>IdOUM3$xh&++ahWu=S|KU^HN%9-CcKvp9 z{oxPKpC4{F3lcrDh7J>wC<``9e<(ttsOtaG?{qh|A7P;J^v|twChh8}&_NoHUY+Lf zY50Z;>Ie^_quKHWqaC@DYDX?a9;R<`Ilu>0LmG|SQXH)#h-~%Ia>HA`@eMX*=XEh^ zYSJ7<8AgWQB@__S${5^^|8i|Mp_0O%4Kq?e3c-3YCA8_l;6Xh*32vx--7%PEkJ;`G zp5REn;mo}jG%Xget92alv`XY?$jJU%<>i!_-m<|fa5;-*`)GIB2rDg z+Mztf2hTX`G)VeQI8WNB3M5_(y;OeFN2GLDLrvMss@>T5(`}6MxY=h6DS1RY{U84G z@L;!93oXrzXN@B267Rl&QcrH-2IM`pSxb)J7$iO~T?|Vu zcpmWKEwVOe?<#hM3IC8-l^b|#w+UR3FBWcqCY6K;(AelOeI+tJqVq%oEv3alG z+uRNvYPQ_l>Zzkn2g)hcTepIpWe9Ui0diFbgp=C8QvU9c0OKh>jyq9zsF`eJoHzE> z9Sx-5wnxilzg()8OUpXYD+)xajgH{s`O`Mm_sRVz0#Q(*@~cwg z_wMfsK%PI_|4aXWtW@%8*Xl{ctfo~Wh~_}@5=eMij`P*HphYi68qBrUTC2^5#Ew?= zn<~o>q*(0+wF?_f=!i5>?PA=wq)H30fFsL~L04rZhe$Y5bu4&-4v)mynJe1cRfDKN zWN~{(HRP}&|22v53mlZl7pFGf(46H=WFj%2D=z!(TC1~;KKa%?0m$ZN&*4LgkACkS zMS`)gtkOWmuWqt~CHRoonz9{qwXwJH2k2lQLwomq;^QqJjJZ8sAVryt z^8%1*PzR^fg`DZ4$)VDHd@SQs<(kk7?Q}aTkq&<;d4soBF~wJSNN(bP&2YM_n^_n)p;OMF2@7R9VcUe|AHKCd}M)T;MShh6kcY|3ToeYa$L#gLGJN4)};A zGYf^~S_4<#U8kbF#E|W6i6Xu2t*z~?OSTPMGmkgXPd3q0D|DBeB(QR{>#7JsTSxVYl6YP>fBUqM1kMFsmiy$ z)$DA@qwxLX|2+H=np*$)=gv3fTqecLeJnbzwBzBWI1dr2&UIWEU3a?O4cct1VzFwi z)&CWi+t!V3CpWfrV|(&`Gi&gz`7twp z=FeBXPOsH{(Dm%9uBvnPe)dD4^M`@a8|>)y8k>+&nHBqa006n_s3@cxUmTfeu=V|= zMBBWi)L<3ji<|j&8sE8;*pa`HL}~oY_>LyVwYs(SbrlDW2&+eBJ4>kSkeI4bN8}B~ z%f8IPeODzDWnHb}igPIShQpLER2gj)8k=~9bCk}ibhTT_j1XN4OxjC~TZ&c|2+V6l z78)E8vDve;*BrR7&wiRJK%)OD9nG8ktB3R;0*xZ>RHSXsq_;q|!$6psHW=Z6%w-9o zLwrxKoUc$hKV`0k%m&srt=6G^h6PEXN$ns|YS zk{re=Mx!dw4j%>I?F&03lDigmcJ6A9U(?@epIA#t$Rei;^eO*z^53Xq7=y%$q^g8g zQ4tH6#e$AhU^;SX3}OXfeNxQ>33GR{shfnJ-in~wdAYsj-T4hQSZ+^t)Oa9BEA}4Puc}y;-I5f5P(K@S;+F*0-Lj)!dOS=g?8-Um$ zL>z%d>-h$(ivv2w#9+Okr0#(Q_+?dsq7OfJN*_-!fsOCro4xL;0O*cc$`zh{CoWsB zW#*vdh8@GrL|sWO^}N`vkmoqoV%6AMT)*!P+3vy7Bo_QP3dQM3EU#0BO$9*kMN#*+ zU&)%yTMfhReEU{G0g8K&dv+$jQzCmLM08u*)kEvmuBF#pK&u(kGnZsAi_}tCBZ8a( zS4&3#8~um>$a^chm{%oCu`Xd=PF|*on$7t>x{gjq#0dwf!mkbhoy!)@_TgVN4r>1) z1&BD8fgvOYh2arZx&H3r5*q+A*K7a3iOW4ekPAC7a=ui+#xU@iF`xwxwxm+uj`h5z zvN!_mbzQJ1KnkO;u+e=vwHC0Brk=|JVo$@xW9`!xPzJkfEfD#%G~O4M4b4nafjCQu zbvnHZOjS|j4_qvz%>qqaCC3XhtyTu?#qTlN=6&VX*3P$J>4qh-Y|lY*kExe?J!q~v(dny-pD=8cvrGP&$qsqbKD z7ZlQk5pJcFg2)g?;6{TahtXZ9?9D91)CF?q%}%}dAXvy;4g~t?J@XP{qyAF7Oh^Xt z?=n8sy9{4P^VkcMa|lh)fwvvY53&&RQ@%putf-sVmcs{69^0p+J!Jp0b*ER1_m1Y^ zk|E06CY1@^Ve`K?PLXOjhi_staLg&`Yq0a}EPZnFwH`h>#{D%j%bq9N`^His;(ZS} z-BvUI66W+s)(^PSlag2aMIw)kRRymS(C~Dj3%6WnTr%lX-;#w^GogeW|50x2~+b3*do+_+#o7l<_rxXjqgE6AcP*l#x*t9ho=_$sXsgs-yLFZp4<}7bW>o z_?O*E9M@4{bXc(n75_krCoI!e?y8#O%1x}~!?EfPsAl}Rduwaojk8O`uLjA8KkdcV z*O?wrS$3qOO?BJPO^#EqNOfmhxzXob^^tnuunJ{Et@2CNz{HnJTFTq)to)%9DnU-% zJ+9U^TbWi(Q>0Xmm@zk#B;K2B-v2UJ{$7#(D`^z#kbk^yts`gw(r$6TKol#{J#r$z z=OhZ|ER)rs6)Zhv57Lc9ZYwMZllnS+K_Dpj7>QWwW2}{}%ZWgE z{Vv6MrH_O0=-?L|=yphRfr8uc)mPl~k zFqx!0BvGme{ZS2sNcC5V%_@ynx^fsCZ}}I5CJPq>@Ft;)Lo9Zn_a0u!a&th5QESH= z&Dq}2YFXYwtnp2~kfG~Ofic5jK@~|q1mG&o3HA@XuNnN(?UJJX3g@& zuWPWdd>Rb{@`1jBRg2avs#hO20%|Ky(-~zealWEdnmq8u{KnUuo3rFQYS zQI#Y=I)NvZ^?by)DqKDeD#Zzy9Ow!4hp$QcU!Wa(6&ukbh*<@T!3fY8Nh!OQMW337 zsyWr0cg$Adt>`BKFo=t^GcqHVG|c5NcOH-Rj0@e{nBik$%UMoZvLe=1TR(i5U<)6} zZilR0!2{fsMQ;RWT=`jZbDIp^HT8t~v4+Nv|FpxCce?r`f zB(l4wi&Ck*r5?HEQf6aGrTklWxlvp3^tm)`X>id2GA2J=Co{eQo|&dYXUTHK@~MvX zUyxuLXBiIXRyZpCOlhu)H4~$!^Joy032qI#Ia1I{i1RxZb3LDz<5VyrfG}sscHfWx zwPmg9?Kh#sEd5K8e12dju*sUBD7shrbn7M^^%NL2Qs>WI+M)qVj z8)gUtc4QOFjGg%B(CBEa;!hT>*tARDruycG7Twns{UmloVo3Y?GKMrfHGJhBvxt}S z7ma{|h58*Z!D2Mf9RRbuRAZ)`&96ac{Kc#zqk{5?JrMYd#J5MKRJjd{(}i~9`>N+p zs{aiGWnJT9Im*>zM2y5nheo$p?=(Rb68=Gftc5my$3Gml{z|-J8?!|9+W2*1U@~o} zwT8vZ%QIj)5$O1CAL*5=hqvdcW`~-C-L@{-&innea2c8UPEp?@?k*M*g_v!@GE_&|?D>&pdbwZ;q1kJGF0c@=2O+XxDpBUhu&zq^IWfxqGeKW6q)4Mpn9_ zV5&$A5*SesUDQ3}9h4k+CYTGlv9dSSVCrAW=2Vzao}VP{h&&2;{J?@wpZz^#_ zL2VZ7I3d|@5j>1B#hOU#aQKNy#yEm{;33jCCg`YebK@p}z0x~Nc3&5cyr{K#`YaDRR zYK~Tr_!S?W74rInetcD+|8x^0%)=3X4e&b)vyJW^_y|A?IP?F#@RXp`SNm%33qp+? zjhhb&QH5HX4GkxnIJe%QNJ>310pz2BCz1Rtk*+p@bUs!MUIPY1>TmzGe}D+*_E~$X z`%EewSMQ9>*k-}H4{bME-}?Tf+->LGG}~-EH-IH`+A}(JjLPQmBS48taF$4>Qig5c zR~H+|e8(mbGXH92Eyedn?kfT))u99z z9=x3dv763zXB{?no|A4^PDHwE-JI+58UP6|1*DO>oM--RJ)P#tFt~vF@xP&9LN!X( zDq&gbXeI}x*~x`WY5FneE=ac`Rrf#S4FSJWvwzKtreJG}aYP{VT2@p~*(#@gNpIec z^TjrXAVbDmv zXcdksC4w|VG*-S<%Y}kUxXyBq{DucHTeOVUJi1f@W=05vnecj?W-U+uG5Zg(1J;W& zOpn_;{MydBr@KyRHK1;D5 za`!e6h>JIPtNB<1iACp{Ym#6m(y!-m&$a#364v@E({846E4mi9V&h2CJ?ti0%3WL{ zTgRSiPz$JzR>D1=JuVivsVd@j{^q>v;xf}qq+P2O4fYX|nO=IP?)+Q$wm7je1RW-S z*k75eZm^#$?8L0Ub{`#+u?L5L`#I>Q>143G(aph$Ob@=z;Hbf8U`vq7d;iQ7Y%kr& z8kQ}bX}$$*i9Nnp9rk_&q!gKruPGY=r!9EtC;t+r=om2Fno{t;b;@dORM={UVMxh+ zklx{J*Ls&0UZ#8l-Q2{=0B(wen@XA(kd%|+EUkh^Bn!HAjp0zYCN#5jtX2tupjGvS z9HxGWmH`6Bd8J3l{PK!eF?3(}BU3a&a94p_4BOu`w)A?Jrb}k=aoF81(Z3$weNlX$ zy#J^_A;=37bybl+^sr^*@;0P(#@^~gf+J=92B}H@*5>B0>Y0C zg!V&&;s{B-dHrrdPW!G4pg<1VdOSmo(6)Z9%pH-J)Y27pwHr>r0*n1MIA> zZl&voGGR2ziN=Wqm#Lh0R7j1mu3A1io((V!6kfjzy}aH7>#uJJcwq8_5q1V){M+l_ zOQOUP{_Q5~;1KmfqzVIo(YKDNPhNasDm!{z$`B0mVAY5D(-|&18;)pjFiiYKj67t8 z)Nx)p9R1|Z=BLe&Dc5ATN&`we45RxgYpmu+Q&((oE#*+PgXwrcqQnG>T5WQw_~~>$Vn@!h_j5N zc@ko8)3!-=;77=?R-T=ouDhdZ_U6l29I>JhG4Chf1B`1qHllK`Jf_iZ$I>h94Bd;3 zh*_8EHRslXUv%4N3TXf47S*>9Mksxq5bX>@@Na4k4h46PIX(Q6;?&QA2$i8k9RlO` zoCL|>i$T;{OH`quL<*W1Mhj~hQPFv}!Sw;uy)=VBU2lp_xO}t&Mq!I*J4pbjkG|Tm z3;A?{O2kFTvC_oC4@c5c3#+l=cl58pcVC3B`PY2LEBd?-Mc3HF^LCy@BYb`?DA)8> zPV&S1$xmokX64TuT%9=}CG-yNb$A>`u*)q)UvQI;heZVpAp})18Dq3eAT)LrkSOUW znrEen5RYIgWpOx|2PwKtBtp!ASv*J_capPD)`?K1n{W9&+5p^Xn?CsZ`_HcYr%_&= zqb2HYn#8N5(F?on*8S_z!laUM3^ikQJ@7Wknt8K^0TFR_*`cZKR->dLje+)qea|X; z0Y3!PEu=y$?>}4D_8AkIB%)`!G|i>7r$mCnAsoIbSK1nA+4))%W5dKCsZVpIltJS5 ztFugE@a+L3`wynI`v@qkjK5M*-EW=)XP|?iNLI_sD_Vx)j+jMbgn}41r>q--4{7-F z)MS>iwO?|wi>U`4r?;Lz@jeFc4fVIQ`SK~4y-$PpEBXiZu4dN^)>$eqF%AVf=3)V9 ze2;N13-OhV#Ig$joR%ajL$qD?I>zBr-n-ydZka^%+5Hp%#rj&=96-z4IV*Kgl@b!X-Mu74wi zLnIPKZKqWDDwW?Clq`Gl=gxs5YO}*e4aWY&8-l8vrf3I3Aq>kJNsgcjMPCny%ed(Q z-(F9f5t|W(c#%XX9Od*N2laM8SFpM*QpCnV1wo$Rq{d9URpZcf%0{Yn=X|p@a%qwvC!pW3ZH-B0El-VsMzC9QS*?UQV!qB2@H^hp`#y2rIZ?IjdbiP*z zG-o@iNapaa8$ehAr!JE|9%U1hNoW8~@n+B;D{9CZH$gp<-F2GXt~FCn)WbJ_yY0yf z^!v^K0_$x}Dd0a^M0)*9G|W8*RJf)9|GD+}n3+PjyxHA<9<*l+F>fqQo?e7}px+K$ z@b2#be&;s5uXz0L>e5CVtbrf{Wh=@~!5f$aUTVB9u@r#sELV^)He8Tuxlj`>tDu*g zEF7X25(HvGaRotzy50fP|MRR4tOj=vHjODc&1|NB5dL`eG!E?I zglbL%{f!n`H0;sKOJGdG<{}w9QebXZiF#ubb7+ruUj>CHGBR#5t!%Ugi11EYehrLi zH#v)Nny5!n2*tLwp}wi6lQFqd;sYuyURaZ*CK3YmkN%0K8yXxwwu$;&W7124d?|ht znO$WBtD%o8)0dC$x8K?;6vHijjuCZwPSN*783z@DFANQm+Nl>0B3mzjNpGsHH_!$; zDvnF?*9EP%rn_;nLmPyeMIgZ&n0kQ>6xWb>{KURHoh`K>&KG{i8-PWpT@!5hFucw2+(eYu(7o`+*xjI%~JSpF?CZ7S| z+@8%8VM%@F7QKa@#J->9KXYMe^fGdQr;%aE8$T|0E=TCN!XU6H|Iu8)&7MeBp*1Sd zQ^q7mRI=x9pmuQ(wav9^xlFXDkU3*>+M4RUvU(%Vuil1XwiiYt<-ly{u_;LBq=KLH z+g_1zfg#BBEB8l8Di*=I4)Qt~cyi�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

    ILH9{#N~V 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%0A>F$v%aCB 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

    UQlFqwWZV!UXC#^)PgJh6%N%_l8R&*$u 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%0A;-B&hn5TbzG3+m+ zf+EUZ9re-RAG5p$#{dH<2*V&L(1Q8LY+r}~gM?tQC*Gffv7lb<#_N9ea-sh-EDQ<@ zQ;Ro0=qkZj3y9MT%_%o~2|%34u^CW(Pj1XuD}rOl8KSLD1pjsxG5dY7{O3DgGy&9O zsQ+R7((TW%!wp;xabUt3C7z;$Lc!fJQ%UGS-zmcHh9k!JHe!eg3&fF->&Dw6 zbb2*WSeZ@VJk#YHes+*ChO^xSCN&Vpw`t|Yj5kgVi8G((8j$Av?9tGuK-NvkQ*j(7 zT|7tH{Z1(@rBaa~aE3LYcpQ2ZH4lZD&Z z5cC@LQbMGazL_i}n^Yt`9A!lbQ^!L;{0WJ3W3139I``|8dDxKHeTl`DiKM)Z?A2j! zOWrCq0mE24c2|$o+ydy{(o7_7#*|!hkgh1qp4O40Z?Kp~jl3`A0GJw3jhc3?{^kSy zI3-Wqvpw8v6DF5^(t4F9iY5NwHW}7w%tKozi#n^cJYkzre3g~NaH@+Rjp(s($y>cG zb;X?-JjfV0-?suI7*)7%4gKcwhOw0lfNioz1*Sa!jT ze-Lk?p#JeQ9Gx0xbggWy!p8gbPEJTbo)B&;>J>`hBqYg09_rE3*Z+^Zw~VSI>Xt=u zcXxMp3+@(Ng9UeYcZXoX-Q9u{WCsYr-609C!CeBcA>X;<-aF2D@BjOejM3R)chjSL zt(rBfYNBEm{5A0y!-{Sp_mkj@&5*R3A47tZd+=|DYwrnhkp z$wGG2u_WF}PO0YIl4;LnE)WzcE3*Cw4t-=|-ZVl88FvBntAFL+l(>W37Y%-VhTTK0 z^YF3P-!oo12h_$XXfZ4|F#BEYk#$+OVf9mpqmcatedT<=z0c$B+OQPqOM);*tAZ6= zC|-i>e3i6x$-+JH(gqTepTP;J-g^Tgvs4l2fiT9%hE zW31>eyr8;fySv|+O_6&c`{$W=vs0N{l>LchRcgBv8v+H!3Fh;_z2xu(tY3K0v5^fL!dvCINJlRLm~ z!{-a1!}8JMTWj!~Ie`^(Ts;w5m)|`{EF?_y=2Pi@XjPmt)(BPS`z1mfitBAS8wCsF zTna@aNWMEm^j-CAmbAoLtce-0npW_;Dlu(7&YcoN24|rk$VpPobezbvp)^pfjVcuWY4RnY!IQhEC8I$f3S&3Vw>(aadN~N^TaGmC|cX zb&`ueT{uoT%wLs1 z{VBQk2Kzlr!{F1Wwkg`p%{L#xb)7mI-Yy6+Hs}>9wo{Gy(JkQNvFbKUq?PD1@0~x{w*z-I#xlAO>5}f z`kHVf*{;o-K!iNPi`5HV&C5)og<{gu4odzLxN-UNRJOJcMKwch!=L<7wX>K+hzm^c zQ!H+{?^sm1AnXCeSSZo=^jrosu_4YyeFx_844LL|KM}|v-!+y*y;Jb|qUwH>i#pZ2pP1sYYCcdeBlESS(58ADlAMQUmDUjbdfs6}5|* zmshtZEM~2SCHRCDx>L~$DD;!hd5m0DddZPZD`z4c#WLN&nj!$tSCqM8wQPrabA=^8 zQZ`1DU>8nn(YAJn7LWwQIl93fi=|>l(A4Fl!WMBjZn$B+4uFReD;NWlFg6juP{BkF zVF~YRsjE9K-DDTy%V{0~H9VyLP9d{YG)&=(dOTZxd z2mz9kmV5la?#_jQ3ApYeZL>wOS8oQ~>{BH}jBHs4D_E9Uq9RBiw5lN}OO!>DbCGw6 zs*E20>i*h_792f3I8~9hHOmF;)Ps8OYF5JBa+V1bH^P(RGeLd+^$eHtE zV=?UFGYvT8qbHMhSZWZHjJT?WFbJr{*YCiJtKd@Iz^@=+Es7*Jt2hvGg`=5fbP$&a zW?~t(;TImSc-^ykCc!|XjK3TW^}5#sm?0oamB{v+gHUF|Bz=nFv7E`uh56z^$l2gI zSwW>MROtKNtjZA`*5%G}S;AExtV<=tI$aWAuBVv)J?U0gDy%}6OcFIo1sGpt1jx7s zfd$TuMUIQK?_Bq=HVzVRFBxf7P;+?+c6S)BMIujv!HOyshjkUrECHA6MAXpxEM;V# zu-M`MuJN~^&HuL=pZXRO2ZxGx>kpG^z9G|U>Ib zz3J^xRut4hg(>QS{tss&f)n@ed_%Ht?Qlv2j0ak0ghoInXlRyH$Nh>} z1p^W0EQz>hn@wE=QvhekEIe9+ctR-!%Jl%cmSjTxY@2pIRjp=Pg%SuC%?eQfGoqk# zAoM=s9=3|r^iBZSc$o^*aMzqDl6GNkV^7YX_B%-WSmVpXseC5NWy|rEwjDOLhg~UU zQr0NZ@2Bu6ztE(11WoCFVmjB>d!8AH;VB=t6nWI$p~pl^%=3#FTWbG4wPq&H{f8Ff zr*e#I*>``6+$}}k%9fvZzy1AW#4c7Lkr`R%b&Z8`s~ucB>kw`PJzN9aN3GFv zo#Kv2eKAb?6Yh=g^j9N{_51L*n~_26;uDy7ly}j-;kA3($&9c&(O^K7+~-8v5^PL& zNns7cz6%KUT@ObA0=tT(EsF!Vc@;s`u$SS(NPtXY>I4FQt{a$1}-$(5X z1VtpupGR6T??#A7^%_3t!I=zNc=i9RKM)DcsfEo z{TSz@RW0RZ%a32XYpvqQXVF=DC~-Yh)8zn_4ExG1hW!HRr^G90)+*fy z1ImirqVh-FrEbXEYBd@j^dnBM?!m*B_zhx303gU~^wNW5B(lSxsYtPpW1r|J>df6GHYWJyWh;iS(^Ci< zPcV%sRFs%3XJ-!W!?Q2DM#K9qIW+Fl*M0k0u{IU#Wf@~ds`ZV@nn3+e450}TBwmq~ z_@H7X+XJ@YYvnETfGH0L$=FN{>c z29_0dTvOp0&B141NK-czEiDwfhzSIm;%qklX#?>=NqjmzCKf**=Z?;#rtev8*$sS} z;NP5>CgPekukv6PP0RCy=8nc@p*AC?WX02D#>DWY{;-2)N9EK1*t>KsbB!el+X!|m z%nir8&3>UmcKT{fh5FkB3B4t>NQypVMt0GQCZXg^(1I|;uQZ%myq?X_g2&O0k80^s z)o2T5A9%DF!pUc~AJpM^|In(sCX!p&*r5?eLSg9(#|ram^Fl{peT_1laEemPrwB>9 znTNd8zn;nVT|*jMlV&2cI=`XuIMMpaWjiW!U#vg?z(|IuQGGEA8_Y8);mCIjsJQu zEE)|Id+!J>rCL(-b0#@Mxb=KCU4h^?AQ4>meUucE_bAX)FXt}<5zvSR>r;x>Xw5FM7WQkhRF3XxDui zo}CR$}ZvRpZKlmKPhxmEdQm*VNA}&kl27vbUQM9t^`)V-o4>kumDXJO|&|6wntloI&061nXmTuE8)Vd4CN^L3F|jsCi1C| zD--3ML7ZD-zI$bSeaZ+R#m=_LrYw)Ppjes;QJy6z$yyNoEiDPLf4XcIgR#oQHgso50FU>YnMc;@oJw`Y7^_8nb^ zYFw-cRcE<#mgrj}o18I0dP=A$ZCmhA|36P?yk z4!y9kL~zYy)~~+obGKzt9DBKQB_@BsNV#>*7|P7#a~01xQoNN)-BjAudVu zpE4U7$Ro_p=Ro=qA)9(-#kC37oFu)4X0wllhKsPjT@-NWyj^yS_pvLK2QHdu+NTH& z-xN(Tl2P&ttlPn<^Z?p4wTo_B5l_%CPhKhRXKMa|ZRw_@2?2sdwjUZ*9!OJQOfB<; zt9k{#-Jv(~JU7ApuHCwKo(QOw1ruWi1wUE6$N0LTO$}0EK~?(Q>^A2A7Xcw?p^u}_ z^5;z&(MK_5sqAI^&8hz%Oy_t-2VW38UElUGIG{rh%KpbRjK%^$byV-xq2q1Go1pz; z|Bp~El@NVN-MDBf+*P9^_|4!^ z=wfXo7Iayx=!fv#@DiY3-M$i^2wJ?tXE_d$kPTv5B>lFOs$miE!cimz)_7ff|1|zs z*KUZUOMu4<;m6aQ&&FpD+n;*8J%v^N0A~*wb|BG#p3hc-qKQw@OgSE5M0g#--%M)K z7>ysTG6Sh6b-oS5ml5h`Di5m+_CP3yKK|!=(WouRHY|k`<;!M_cSMsk=y1NX!@BU= z%OL(-Q&oh}?hhs=!)93sNdlH_gZgEJ3A%|+ilk-;-l(Wl>~<4pj5}el{?ARWt`U)% zsKgVz9EqyE&uGydho#%}nOG87`544jB(CGMYjx>~K3NZ0(%?U%_kd@84-=)jtgu8p z#>3{9-bcX{-|A*Bc!@;yMeum)Z6JErYT-;_DI|S|s)-*+J4(9@({##6w1!4?MzHSu zsq@Il=syyTRVSoypR_s9Fq8HLg@_NdsSQOi_7~fZ*k>LKbt%zUP^o`)0+7bXHX+M# zRM&l(%kH)x=78eJ>Da||D2Cc$Xd=ad<-%*P)UCLdb}0#S7T%C8OqAhISdvWzY&E;_ z;E7^0tW7aLNV@@i&lO>+@Wj9s3;56ThB+`rYqK(0$?#o%_0^9@At2*3ecM1}4Z=G2(brxZL zAW$f|fSE)!3c~KiKrWOp&QjcA0n2xSbp6wZIM8Jbh`>ufIDWHd@UQyObAxAi379(pNlhuzZ z8!7a)ot%_`tk9mc>`XSCaK;eDxI!8_EX5jIa`d%K`H}>NDUoZ~7vlciZU-3o98TZs zu_Ub6)|m!ZzOQ4V7?=M&!-=B8zkP^Vl$8jE101NDTA6shgtNo#y!}VeCA~SQgEIo0&!*mTT(UhQp`UK|@BYOBI*jp1=L4W;pU0mUc0s zjpwPku`CQIp105I+z1R0!0Pw-DKB{g zJx<~C0Zb$e!EHv!2oE?`{dUkEpp|s4a@r3+=q0usz@<73?iNpHHL`F9k*VhN6Zos7 zo=1y2b{>=^Hvhy*yf99fEV(`?&nL+~%0ZbHRJzM;KA5o*&$u3vu&Utb$B-dK82dts1L)}lvft~lF2r?g@Vjfs$E)41Pi_R^ALqnoxBAMQ z+HGy7t~D4-&=U*hGoZ-|;$n5WxgAO<$L*z=!bn>=n3b4BF1k{(mKt%!c#9P@Nq8hQ z+xNJ@teeHu-~{K=nBhFO z4`d5`uz46%%Q6op7Wp_)fgBOtPqRAbqsP!?vw+3NgEiUhWLS#kE2fj-)gGJ0FC z`5?^E>2?trsriOR4; z(c7Uqn$A6YkO8ElK@cTBAZf;Lr6%x(A~&UnQMh3MnbtRqo;eUGo@-{di)} zw(?mL4-wteO4Yp#>%98m?cP>+Pl?33OLa8!eFM@actYO^ij5)Xre_2ir;mh_m= zK}?LsVG3%hjYDX)SW7Hawn*?0m+l^jee-bvja*{fRisdAn&`O86xCyv%Y>YSY{HA*m< zeh|0GWZi==iJNj^F9+EgGs*{~!h%6m>V5*IUdU09#E!!}_rj8RffXLiVwqW=Nj8ykyxL|PBj5iY(t5hD zU0J*Nvl(qV6*PMN6`g`m{E$kvHSdY-_$w=dcEMAnY_N!V|KXE2$`>5sILC4>0M}1?k$9{?PoC0?F z4srRM%{wOL2=l=pw0dnLe{584W8nkF4NMDXv@bbZeG4H$so!D>)`qF+YgI^;_koNf z_=u7H?+lUf=)^cDu^}6(t8fGKcpLM}?aq{)h5djR8p$(z2lQ1Sv^(aCK>=t~@gf-? zo&izY%rNOCnf+^-9TOF^;a8m*bod*|bBK()+TpfyeVw38pu8*YD zz?C4tx3i#xkX~{ThN>G|`+Yt6Ge1*!A-ct{2J=xIMb1e}mbk59nRY5}x9OGpxo&AU zEl5DOVdrevdv14?qmD+$4>R>}uxZ?G?p_bcz=kxtSdBkjdQp9ca@u*sl2PeBRF%@v zdSdC}o(xe0Pr|H-Cd7ez`^TQmE&3v$i&5!Y)NW1n)cdidnuTd7jl$c0>T#jaZ(g0| zJHUOcTvH*@QYGx(%~Igt+5-|tvv`+Ksu(Kr82hLz=aFE8&CoyT=X4{1aq*uAT&`%j zL)4OJ0QB!Ftjr_1@21U>z%Dum$Dv!ik_=nq4i^M3Ukm?Qktw-&EiCFL+BiU|A7UkP z%?(Ql->+;9y*~}*b!HicF}Z0Wje}$q`t^|_q5|J(8Na+^H`y-RbO=dMiqi)Adk2*_ z^xTEFedWlYa6|49@r<>i;=8Kh?=88rNUz$AwRTF+9q@+#79J*By;%?tFlUa>Zy!;24k4C!Qdf&cg2*stH+V)2vZ?eI+mNJyFfkG4`pze9y+c$#h{ zXeIfdwdYWEre_A}U|_F*{=c>7>=NAE;vCYP(o#}5*kn|Hr`*$%Yu2R8~~rIeE#K!`zMSR$h0{1^dSM6yJIAgw_) z3*{#IBh-3tYF|v#3F`eQ+IN@-vO}>Mac2lQp(#-{4XhP%q%x`Z10GN<*9|WTe}yMq zJWr3zPmfj>{ZAh~>yOrd{QY|3e%!s_S^u~7#=ZVD{rRZ(`6%#y=ikk4NQHX})U$3O zJpOll#t$J3>-P99@OdvVpmOiwVG$V3ed!r^>lt`K8+d{Ga)vss{qi*V^3;9me_H>1 zSkLhj*?XkW!bVO(0kQB*Sm@>2=moo$E|P=Oww^9x7>}bC#6PK2?L49W@_hQDgt^VN z;Kcm0_wqz~Kdg9ZeKJL@*mx#v80@InkQH#g2b`FJG+YxR?*^c1l^jmsZSE+!(aCVO zwPQfNe^-0|o|C?u2R{7>Jey|?I7dW#DGz+06@D4*eHtbGJ54He(ffQ|KTjnqZFKN# z^t@xV8>Co@_1qTt*aml*4omNSC-zyA+RO{bTPSuV@S!}Aq2>K05wyOA0o>Da{$Kp} zG=bTH!@jd+KXRSeh$0Y!d+)P*>1&TzpC32rv06U`?aoOBmzH+;A;R4W7kG+yAJu(* zUPpZLs{gn+o9tuli=f@CIERF=KTdy znu;($_>mhX20-LVQqeKu@g4AQh91l2pYKCSpVoo)rRIiJoi(Wby(DNa=tQd+*P2PG zUeB?cyW9J)vV6kvxeeH2LJ(ORTzc-u9RZ!cNXZuR=e0_t3q^%MV6+mSQ7Hp8o1q^N z)deYqp6+$G5m`Og;v9}9-+A1+3Y1DJ+LwUpCC&W-$QvcXdAtOg1)WEAv&4cq_v=8+ z>RA14)1>ebrtncs)5WOsa2eVee?dF{elt$EB|eGtYT)hH-v^8*m{jj$cguvbNicG} zcQXOMSP}9A;7t>to;t^Jo)FQ9Iy7gmkiW0)>#wN$iIg96^%0p|c_k@wD~pgT)P#^3`RVs}WY+9%64~RVp)K#13h({OJXj!WU6&`` z$0f_tfYL&c85;;W$c7cirW`emoWEn=t%^KviIja}ScT3Vk&JYm;EzP*N?RlIAF<;# zdQaRlSuw>fZX{nzX!RHCY4fBz9JLuO(MCV=Ob|qI9p=!n-;I#q@*(IFjcPst_%83K7p^7>f{z-rFaQv z-;fr?;Lgplc*dDU$6)clOTi;Z9DyVv@z+h$BEFehQ(Pfw3RmP)30ZcBu6eE2_L4L$fjQpsmxS*NHtir%bU89QjHvu0;nHqLoMi19w?}09s`9;)< zxB#LW3%RMK>i(3sVQL;iL5ZLAlx}9Oa9O9DAX!Zb%)GmRTE1!pIini`4YWY*k?mil zv(h{xNVshj_EjVkE?77OhbrF+NL!Q!;WBU~gT9AChX`!}3M;(%0*mmyAQ3iLS!B!x z_BpO-=`>-X;}UivZZ5+T0+%LN6w%}!;`oLQqM#rl!U@bi{ZIunJH8(oG{9=ybtbrW1t(4%+zb7 z-uvWwtXLoVPHRtp#e_vAiGzwd9i_x3Sq6;q?c(7W2(Xn22VeSy7%SD4``~g?C^4m} z0`5nRfJWW-N(6s!lh!AJcXF_Bj01W8z^mMDZOIJ4GVh++`tF+#&41pbPS!RP8Lxy4 zMVpY-_da*#hD6ASH4d{N)`f zvklVc5}07~%Squu`0*jf#Wiqlqu4Uv=a9bPVLBn8BxAn8eY%N1KI2qmmGZz<)LBmi zuoeK(yX2?hSHuMBo4|`V^1I&u*jDubi6W-(=+KuDG81r!G{J4^wCnUX!g8T?0SqXl zjoYCdRr;(!TKAQj?_?zBAdoa?T{H3WC`8TH#?JNnYPYCbtSf9#M^C1$IZX1IkekG zKxNh}6H?e9i>OMzf9!qnT}X|ywTMM1FLJ}%k#u``{_6qr_!zg_O(s(!lQpL~iuQi0_NfmMCB4;i0ilg!G=KJ&HLW-u=vvh1HH+ZO+R6z=~PzEMV2c(yx22zqXS*mKX)JktB2}hoC#l(1t z#26NrVmrw3|K~j@w0`a&3}#LUkIy14!ijk9sOO~fS7}}mm*^}8m9qFQn7|$A=JZiw zVdP@VMEX`vsP(hJhl!xTL9)h_uTlz-#gEMC<{*5|d#Gs$&7?2x>vR7Bg@uq9)T7pY zgUOR?dB_EA{LW>ncL+0&=e?Jf%ohvm5AIe`xdQuFUSMc>F=59>hiaMDX9$@Mis5-h zF71#(9%CsyonwupkP%bie39>oxN&0Wu^h^O6b6l)KJjOeDE@>GY!L0rHIv+xQI<+r z>To-h^_LDuArjCt`{{I4zFr+X(|88wbj{qY9pGIoSD*uS6HbM2e*a9R}aZuLg8tqjOi%+?V?`y(XUI<-$9Wf=H- z?IM;N-|9@5GYYUhP?r^29`-ns>z#9vD5~HY810}iI8)4}G}g&uP`nk5w##3*h7YtK znSpr4vzR%M0yySesUO92PMWe;>lHc*JYQr*bzmh5%WpUUigC@L)kVA!2ezWG=LP#& z?e;1*DL{wvL$N9$*GGPX#S1|}li>e9{jg^p{c$F}XD&+VKX>92s0i)}um+}&ypXyE z{WNGkISl9YwXfKnFFb>gL3eV*54Y-u_$A5+5`kJa6=MYRJF2>??tQ3!1vqy<0-t2s zM_uCr0f+l@u-w4eab7aCb9R`Dqxa5Ht`pDh=S62UQ$<;iZg$ZKhoD~ugP+Ut(}U` ze%i6v1E$A-WA{mQXA*eC6s`hx!s|0ew7Xw{Mt(!|nfq%%a@^UtV*sbj-7EAw`T12{ zBYX*4Tfb2J6_Kt3wfO5`DVLEP8VNleUvP*!Wh=L;vSF)`F?*HDDlqI8r4JB!ADPYb zEG8mCGYxze1oeeN0ww4am-O8VDwJFwvfAf7((4nz{55fEW!LdJBIfym^@YRl(DCKQv18cCL5*xghj~ML ztz>ZGkd8+K2_GTJ;T6S?weicBaeSsX`@?wE7;{IK3(JE4X{Gn>JF6P|*;8!q9U|1- zBM>I=0m3iJZllZzE_QQycs%!Duj+FQ6>8p-t&fGcO_t?I_R?!{fZQJ&BptkwOi$%v zx5DKH5900JghZkA_Wt@Iva`M4vV%p%N!?*V`?EE*v3%7I%gt>$PdR;WoFv1}LB0VVQoG?$3@LnKlk7 z2%6PjBXD!4u%`Y_uz$Ff(3l>Fp%IqVL?+rWzge-u$g;~?T0{F(E129$nM`2Y=ctg) z1Yta-&n!rOVNsE}rq$01ZdMI7x*U1u5LBzVFk!l${%ZOkw z8>!vHAG^(sjY=$`^hrswKhS!_h+hme+jme+g&&9p>0aT+&3E1`RtMU+;;(?_wpYrL|35zfnHe0Dg+H$6hO0np~tzJHyy0JI4e&i^ot zAQT2qY00Pqu{@O)Armw#wTnAPlpjNhr7TYqH)nvv6^;$nEvI-1>>4WU~>vniSq zb0_`i^aoKf++Fn%WS3h!UvbgjNai$al12kZ?Tqw{tZdb%li0J9L??>tO%P8Ku4{&l zI>NaVP%M@@;bd+ECd1whz7PDD0clgQ+){I%b1TT5<}ag2lxQJ;9)n)Ki@$auwH?h2 za!f2A!65il2guyWIs!D!Gj|&bWVEJ8XNFN?@h%YT*jnWHM9<4Omb+Wvj8XJ?E|rkg#u5f zR#GX@8EbPb8B~0Mb+{^0Mctjs*@hDxL92L_e$ zO$5<{PhE5|g{6*Ar4u-Hs93fXvZW@C>`W@Wnz>ZRpRhi~Wc}{>EYgd{N-l!4eIGJb z8Y|M^w3TUPZduw;WrAFxZEj&$GrA-YCNs;4xVHO)AFI^2h6KFN?GJ>uQ&zXn?BPOt z9ZZ$2)K+OYnWHrAo~22=W#>-%_5{}02}ICx>RB5jCR);mEWW@FL(+NlCriJL?ol* z47pR$d}$`0=#R4GeSCz2OujCmxb?h&+#CXPp)-Xbdc*K0rdR@ldJ_ByNieMW1}i_3 zL**#Akbmsfd4rWJQlMX-^d@~>jv=+PlBP(Dguyb=M%@us4Ld z8XJ@kYv;K7bq8Q^8(QGpa$xOFY&)23e|>TA3fwwmo)+O9-5#H5mG`wT9M*JVWEcn} zRe}1C=39>7P=kvP_znU^xo}LP8{cifG1feEf8ppI&(@mLr(jgPIZDA#(C2*IzxD0jl>d^LvXU&CSpuc;|flzbjt96cl_e*LFuI@h(lsUow= zVRdVr^|$Qu0+P+vFB9^zvbe6%6(tl4;ZQ%zVTDk;lA9z%XOSyX|JZxJ>`bx>~>3lHsuA`6h}Ru2j>GfZ@LmDnQ%6x)PeQwZ%;k{$2YZzFD7xgRBXzthAK^ z=~`Jr4;u6o&V>EeCQVA?w9ro97i1!i73%OS`Y!~Xaf!Xq5NHnKWyVZIMZiOG?~C35 zD^tl(;i)4XMm5Mqp;?H$L7xtYoK*m7` zS7};9h6`zQ#?RR5VarzO?pWK5oT-UyezHoV7QMxyOq8=Ri=xXA_<_0g8^;KZV@(xy zFI2w3uaQ&ADz;H(K!x5P^LAeSZo$v}v+W0(u%3tSaH+Gr^4YH37sXkgGt5%F-;|Dt z)q*eUVay5pwvnH*<^FJ2>5+zZSdA8;L>x^mUEDdLOl9yXM*LdFDLyRSCB#p&8loU- z$MlHXcb@&Wi{af%gOOS0krYoK>bHM_Rivt!upc_zc76Y=V)(F`9#Kz&Of#|;Gnkd6 zapGHeHpTG>zK~1{^Px#d+pM=8*W3tY)=QYvikO*f5=wDjF|@RhTQf)nRBb zDm`MY$ua>#a?0D2!w1u(-*Npw6TYGEWVP*-@b}#yK)z~G6U~*A*vny0MTSGzU6G}r z4?B4|({?XwyG;Mx%MT>EjQ@kn@*7}%HK`kRsAz>r#fiw~kWWEIq_wl}Y()U9(#|?d zW>`Kb?0N!Zie;oNb2pVo;PF#ftkZjpzjDn<@kwlw<8-1kfj0;Kg_=?@4{#x1k~P!D z!(Qo8K~reHnN$@;jtL?%FTs}Y{z~%hJc0QFKgaRK(*?&LK%!b30PiD{EISRPnwaTl zARY+nGa;i(Ycq|B_n+f?T~8pTXCWn9K1D_xxw7pB^vrOG5TMoIMqxrETbePQaR}zA zyxX802hZigI9P{ViTMc_zWuXYid1--5LF9+fqgNK_$(}6|8O9PIB$l14|mZUus|Zg z%N1I|!kh1MB_-2~lb**BK46d_G#*|}+@QLO7&j4+A>2TWH{J!8@0==R~XH zt0FV$5$nXh!Gh!#Wj<_t5eNSzD>^B?L53JEC6?hv3Thh6v{PR0w0;&ACB(I7?E{mI zD%@CWLsii}HQT|~+Ay?iSB~eIYG%n4NElHC8whIY>yLn2txIY3$&$aBs~AqYtVqxa zEL6R#nP*Rb;O1=+KxvD%ewh*0GlBfdCCC;JEB^v42fpS5^F$|*;!_lDrzR$>9pyltQxI4$&uOF+7dR&Oowk||2i(! zz%6285$UxrzUuHbKK_tzW z54L%Ext?f+wM&U|bmA3Kk#x~rPoPbO@znXW{)~!x-NmWm!qtoQTRU1DZladTC z*`Pb6G@CreWEF1!-6Kk34Y*LU3^3fSukMh!#8C$RT?~xJOPe{792}oHy91}YTX+&%KPo!Dt3(MM zfD0RqYp731JK$rhtrC>H1QZ?NH>5N-AvEBuqI-ovsf7 z=jM%!)d{x%BppeXx__cotw(YeO#x~xk*<^?gD|~4`Ux-i-QQ6-$M06qNfx>|Mb!oYvZ|d+b~KRFxlpOxWtQv3;>-y{Yh!!oXsm%RM{pZn$CdVji9- zqNymCq5I9#8}kxI@PTOXYVJmBB`bIXhdX9(h0yB;#>Pffr?^GwPA$=4_ino)gJ&zM zP=^4ok}g}^%JhBtk_D@02YeDTU|2GKCmyM%AmuIUY|bZqvXG#a^=Lk+{$ zs8WVM)tOBW56ZGYzeLhb4^nxKnEZBygA3SVtjLK6m_F6ZFa=>ofP>KzD~oFW0}6x?$dO9ME9{t@fVYQb+a~e%JK-Bin*7; zergB9U|n@0+IDRebSr#ikg!E02A;m+G|(rBf-OOi(eR3M?H`zb89c#3y@ZDj8~>{r z9YC@k@Xsc410YS%O>4K_8^!}_{1ZqaxpoJGy=Hb7bvrQn4 zxQn`~H{ePDSUl8iG7lH!aQn)&FyJgkN`(~=<8b~4lEJ7zcIQC9Tv?1N%-C|LKGyIac}c zI@@+LmKEoA57P`?D5Ym{F!+f++eYh@$P! zG*3Iv*5$boKCg_-4#<0yXx;i`@i=4kL+`XI1c=Ko84XN zwv@Sfj4C2##86}@lF1X}hYuvm2eAsl?%pzFu)$8vxBj43rDxlgM}QYa=;u;!rx4G9 zDMtL!2e=##3nd~2t`T6J7Y=ec2%L^hKrItzKvvzmCkE!@;sjxn2Y$c1hG;2ZoWPf& zUZ4#GuM>`S+#i$cJcyqQp+m)SRUdF&t-5VfTf3d=2n|s5c2bkh=(#H-jaJ` zNW}xoq<&{&-F746P9NVZm_97`28tw6zn8MMUTY(`_q*7ZL!b(4@jNxOz^&aZ&Fd+W z9>%;b5}=Qe8uQjRaK{!rB#VVofsTvB?oEM z#z2)UeD~fi*7l@9dZ7)YfiIz(uY^w+RbIM~D%`W(E3H%UrGiUyz$o0ReP*Uc+Kehf zkQUjmKn=!0)5a+L!q^?>W;(PmV@^fCT42twfD(;7sA-w_#UFH7rdL1wwk+VFo&APw zopx^HaKjr$qPf}{b>x?2srnz7GgBZHqJ{ZJ5PI47Th+%EnwOAwDcEv zJ$5`_%v_suK-Iiswr|TF5IZ3L@qtLx0$X8Nf#NmESLIySG8da#P&L5gqK#})>XZI+ z#1pyHp%%Ip%iTngtW0R@!wAMWC2RPs{+Z?#JR&?c+$o~;l)51Si?ARNm_fc;WDYW7 zg{CwVb1k+nCn%%h5O3j}?!7oDUw)~E6fOiQy~t%l9+|C#F=*Yxy}N5JRoiQ`K+bha z^{H!P*=m!GM9DHdi7}0O=&K7ZwCLV_N?4)YMx+pnacQDsk7bDn*b#wOzdK}fh{z-u z#*ipWkHHtD6Y1p|MNJVF*TP>et(WC1w&U4=rOsC+=dUz~af`)bL#{;mu2C<1ma4X| zvuSQFxXXH{SG1+76EjB$Of(yXwqGtRE>|@E$s613rb1)6^J}=$A!JN34_kJ|IbR@NVs-<}tb8e8CJEZcupIpgb>o=E$**!L6p~;BoJ8=FV*7Afx<%%ibdksHp5sg0~pBGw(Xm@O@ARYDTJ4$Jy z!cDS!F9r7PCPI*Fg1G+fS!Jsivn4#(m0#*vU&a$?*;%K!emqF|2JSR5#hfaja`EAZ zl@6XqD!+h+HxHDz50k7dk%1kp)B!C0M>i6X82c^r-d7K`v`uy02uH>DT^d^wA%uaW-`a!!S2z#`S2%{RvB~$jS15!9&eYe)7 zq=8TD(XsCNQ$$djEm+xFD9#K8pIrW?SZ6*r0b$8^n>+9T04)3>>Uu5??)~Il2u1<^ z|1kE}QBl6(yD!}}bSXJ>cb9Z`OG$Sl2-4ln(B0i2Aky6-NH+-53W#uC^!wX;?X&h- z>-^~&oOtJ*=XvhyzOK)WKs=T9qkT8-HVmEW8{(rCvHW+xD4GCIW()2k_b1gwkK4`L zKB;WPFl2eoI3zeX~ET8z2*02(x*n&u8tGY&~+3Xb6W`Q4IFCwZTD0>341#( z0d=_vaPJtHfMg7aC}Y;yK9--{n1Q_Jm3UYDxNC?F{5xO`DBg(f5=cokQ(xCa;MT*4 z0;qWrz-&;_*&m78@2CH&lwHd?yH}@peOcY-Ey3iNIZ+~?JW(&Tnh4tt@*`^WULuvu z(OW*)V3EBmY*<_Hjng4su<5fN!9wzPc((@{+zcD!oGB->7rN;WVD%imbvz309n?=? zL728Cy!m`o7+rrvD|(OYKNuJl?vz%w0D--r?rg3dsWS382KV7UoOB%Kz9T{{V3ch@ z=m41Odb%}3w1j3R7e^%RE#xR=UTJf5mNH*_4=@xwz;WTSY4f>JnPn)t+hy6VD0#6< zQJ3AxaVYa&XN}z^xnn--M)Bh}23Mi5j>3d2W#qoUdEI zIqoWEFvHlfW_z2I+f3F@-!>en-|^G#g*+a8$=NwDRs9O{17Bpk!tNu~ETKd-dLN;6 zXPZ`rN`bH-X8l&nDGFxiZ>|YRZY^>+=0l-g+!4{LtwhD!(w0OJOj$hR5!nU-r?Wd$ z?+FFs9_4K*MCeph-6VJlc8_}2g3a~|i2t+M+VQaq=#IZ{o|vv|j{(4*9wrM|Pq?Hq zWKPgi!*xuFFTAn9?Vzg)Q3d@);x;wb7W#@89UkKC+-0C3R%B zUg>n!6}^sTWdRV{gf_3zr&qy8)y6rJ<0T9_m12Z)wB>!3O4$(vhR%V^Y4iD5FbQjB zQtM4o$UKG2x{-{0-B6nwG7Ew!Y{)ay9B7EcV!xrDCI*||;R&$q=rUR( z4uv{DVD!hfzxDK&H3jui*LQ7GS1E$bL zmMo<$=*QUv@{A_6eGw z&{e$O{%1doz|#HMO&Gi%2-USZT~`8ROqWWp{@{!6_WeCO*yF)?OofbQ z7a4odyZKp3SJnhA#{QM5O{lOkL=Z!K`^)`J<$}Gy@*6wlcp@teu=%Fq}$UlHe zC8g0bjB9Q!m!eE|dz4YgPSD4v%glilxDRR2*LZt$Ux9P*`%U6rHUdLsxn_Ia2Yr6N zny@dardqZ^qv7N#@$jJ^1a_0m1>=Xq`8O%TJ9nZOu`HwE&{@eMh->UbGx`xx`vb9W z+y-h|sk181&WrgaB^E1E9_~UaFkoO2L)Dy!!StQgGhS4>qhy#kv z4xu75NIuz*WOH&3){cKwdoBP`q=KJC(BWX>g|3jiwnpre^;_drbf=~n5T}Rtajz9~ zoZr^er}-dumL0>6(@Xe(3 zSMZ{gDe(M|-oizt@K? z0p*}FFSD0m>=CzT4qP}yL{3|{@s2u&{bswy)}lolm0(?Yf6G87zi133OulXFw^A_U z5W`|=YM~inFj1T(W4~>q6vc?gPiQ~RYe22~qBDckR2{(cbJebH-*~cI=@L2XiH->j zaOvw3#8W(2ihDf#VcC0WV`!>V^r)@_ClRYSZFz51Vb6UJbG()s`Q#b*Nzr;%Or0g5 z?iEp7q~+FN5t?s%nAieLY4X@`0umK%=E;++Jo#g}5-NZvs`mQC3g}T!8$fmX7>ecG zi)_GI(<#!wuCdsV!oJjn-fuhW7jV?C87k4g^Q~D>>)Zqdfj#D&Ip46T$3hh?|>}M$EB_mHfvL^WYA1 z-0Ir1q2O2#bh2+pC~x_oVzUkW?^VRFdKh`^R$q}7@CXx(NA~!MF}ze#CrZb7d|$4W z8gQ+qLVjx&lsfm${rDP!2RHM%SLQj9%|E(zxPomsmhZDJHKLg~ML;w6D+E)Ak~67l^*2`@Sx&Bb&mn>2 zlhCg3h^<{G+N+mXihwa)ttiVKv#F%SoFv9>;r0o8dNaNJ9nU|B`YOV9Iw0G+`e~!Zjpu7phTJ7<* z7q8%ztVbeLGT77QLS2veW86cih)!Lj1~nkmZqz!g^No&~%$cE%1w*S$$-D~R7?fH= zX>`8Slml8A{qKOnv4;>1k!^r;a}EHGsv9G_FVeIQ;8dlESO@-=rDu{RIllw+Big#0 zt@U^}5f`p{_s4A3{L|QcQI(8fhPFAfz9Lp{*w_6fHbKjfOPDw`kURa$p^yf)P;D6| zy%_)gMas3POjv{Oyn7pGcwevC|KGN^N1=Qq7J`3F(P2u}YoP$LAgOz9FDCo{qJe@i zfdXy;cYUt`iPs8y17x%<{UVFClC$|?AaziW=7=drC{IWZk2nRyDkNck&t$mS{dkOX zY!VZe_Q&iN*JbByH%gZQVwTzt1O3gW1UE+7s2y(9LM=Rkk8j@Ujlj?XmL1Kzbf!u_ z{%z=IwGw*PT`2w|S0Br??776%U)zS|W2!b}jcYCGIVjo9Y;z|}Q&#xzA znv65*AT={f{X!8IIr$^S(xE?W-o@bMscJ_}CgW=^a5hSteQ8?$XM8Ec9!Jgf(P45F z=_l7qR9l5DJTPyMXRLWd{TgdVCoWR$weuPWW4}P_ll7flOG%S{*UR%lR zq-TxAK0~fLS?F+6JR&`_J3v3nhAk9orfaC>7wd^8!_?R;-klE`lo zX~`~OJ}oklRCgzX4Gj@VsW3|XhVJYvFT6ji*(QgM+$0yiiGR#SF0`_z_AKX3B(s7j z6PsCmW_^f%puTMt|Bs25{ z2<4?xyx#aC_@n(Dxi-zw10CT?J(-AaMnp&n8LO?J?vfm`cBA{x#fNL^DOJs356Y%@c z+m`ny-KBkg>4m^`0&95g0u?ihT%t~et;^e-Pr=!vA({5#HSgiQGN6i_vFs3k*rgBL zStw{OfmYvMc^za1UAf`%Kmr%RnUWP7R_X((C-{!c8b!SfW?O1kesaX@5hDn$Z1h^J zKus>k&nI|HNW~(@+}7fr+21o)cH*0?@qD~zL25xZ0sXStwMe=bC;A?lwBismyT$dQ zDCXuH8QY-A-H>u?-?)O3S z7qW+RL|1E-MhH}Pea@@>3E8DN`6L1EX{5H4)KXnIKh<$Dip~_oc=bz>+1kT#D)CVs zmdwO+!mNb@6-SuTjL+-$Lh$8KV;&LH(**VQLbPYNc#^SdqFRe)px;{sq~zND8cd>* zU@uZ2VfGH{wN+$Mw{PcO+--(gB3{O4cfIvp{X$uDfK=y*Av;<;z#Z}PidH1V-fX^_ z!GjonbH3BM@<#Ckjg(=9qjf0pu{fP<7^ejpd{K-9$2FZtkk7pXu8Xth96JVKqw1P> z&uHSa`xVDQJ>~&9zwx(heaccHVTtQdBXf4gm8@eE{uUXID)tW9hKZ%-)Je-6M5a%e z5%}T)wK0}b2ztyPE*S*tEpW$UEH6wd=G`$87aVcK+Fc-WAe~AQfupnN85!ndpn@H) zaJqb?)HhGCf7e2AdK${G(~1ONpV4L>sKMqap;t#J>lNxIti-*wO`&9zZmHxzM7xVm z{VeVV)l_HFhAf8ad$GK<#?q1#H|EYsi=w|krv+@TvG@BBp#wEKOk#_)ANK>QzGBMwSy&PUFLimqY$$1w%pwCe|N-;A8zeU=z%`1U| ztI6foRsXZ*zhXw=TcO6s|B4f(y_j8eSyzP!_ul{)Yyc`^5F!LY+W=T)9|Y@1*#7MV ze>Fvi-vN}&;h_dbe9hHa=dcU{+Y(aTKSULDyF+PMq2E1ablf=&XglQs-HX4G$b?8h z?1zYT{7aMzVnOG@dYTk<%Ka^S%qh2g`~LTXh|t|y)B9F^<2<&zh=#FMZIa*qUwWx5 zl4}cpfMIIa!Zhj=F!<6i2Dh zg=aq~A`9<|Je}Wievd%xt4o&Te?E~e!QaB``XgX)wC4koUxj3ub>nP*J5xZRX@VOF z#7;(N6??*A5iy*@^PV;UuCZxNRv)c>asCjkA`dF4{EC;_BXC{k*UF!m9Rr3LIbGY# z1kvDCdJQwr7truXh*ttrO=saFz_u7`5)g|a#ctNtbaGXL_3gXEtib}2{{l&>Xq!YL zYG9b#%JIAAsJw6IrT`^Di9v6rT_L;8C_YuBpg~FYg~)&3Nzxo@o0^axTEkXvCxn+D z2`wyE8*@ufE=JxaWgoqnoz8?YV-;sI57MeVW;?gZJgHR)r@ZArC)&bMzNR0eyt1WN zBY)P{moG>xZJyA4hn$QU!IGlJf_ssIP8G+ZHl71FY^A1z@HIrvRKM7$ba5;rqw(_MeWs4EJ0aMZOI@32Zi+O2uQ6>y zNQz34I8zQw808on9amePv*dfLa-5;u)u}`mM(N@lO}tqy3R+t!DOENuZ?ve14-?&5 znh~G~cHs_46RNKPlq-(MN}$B~V8!$M5l`oEZW)S%kCNQ@ghk}K8RGZQlx z!0&}^S><|%y)th8o>%8fW_k>m5T&;>k>78h04YPH?>qFmibVtsfOxbr&hp8=M}A)Z zXcvb@KlQ4*)VJ?qje|%C7($RS#E76~?UE_4l{pie=M*f<7!mo}dq z4sc#ODv{>S2J27~;RiI&PnU7eMCE1*{V6n_(r$}ac^_+-bZiMW{9chBHH>#K3J+BZnh|MdbzbON*Ti(*~@j$b<CQQPNx)&Kzf>bfpa2jaS1Eaz30cskBisumk%SylmMiQ~pjxuIm zK7As_cLzFUnQ@NpFU_U2ng?L2&lZN0z@?7Nm!v%mmA5{}CB9Dwyq`xW{2%Ww^=<8> zmVSMTBKvbB0}$0{s?fBDkDLebbacDj71HJkh@HAFhgz163=|sp_t%{J(SfN%tTiDT z%KV|zt254luj_*^a8!i8=*GWW13aTa4}%28=J(U@VOgqb*2enT-Qh zp0*Ggw=r|UZ*9Y7zoU)UfuS4iq_jg!g6;jSFxp5vz{XX_i zmLM(?N8s+TGH4iRys-Z>E}e1twgFe^*jD++MM~?aVHf;3mbL=BKyf)PFu3Rq#CPVm zXeUxUmaYjNln+xaUcrv~9UWJQKVagX8zF^q+iUTUspO_{lV&|Bb&xk+LGA8%Os(lX_Om7a1a%!=yQ^&}Oc9c!PQGs>9H}yqQ zK=7{-&?~1u9eoIv%Sn4UR`HitjNj0gN{(fuwpFV6)||a)6*O9r*Jgjv=++AinW&*q z#M<%>sf-yZT_%R8GR4 zABBi1Cj*#ipAmjI_IM*ijmbw!}c1l3rUYB866AvA;T`&v<;yhdOR;)Q_oz^r_HjqnLUPfJiJEPsdh^A6O^`> z%}$z;tJdhPsG7}R;nbj{yY=56sf$_}s@?vh%K$I}B$)ABWL~pkpvV7rD+Z)p9$?*8x-i_LR zInjyYL_=_;B2HB4#R)*+x4NA~Y7(T_L2Uv0wOGZC7}JPc`a11==B7CXPaVE=!Ck(p z%*k8zcn?AT$nB5s?UkU4d<}sx2@Mq|3{e(d=6=$IDR%7Lo0lt)sF}x*G)?e2-|h#s zdP@?OPst-OCpevxUn5YtA$!VVf~(2!>M*$DhK85fKLD9yKgnEW7#=!q$)z*u zD_k_1xto%RmoCLiVutOe_^r467unt~8Rjfq7ZOje=n7<$@B2V48_t1}pkvnoJnyJ{ zxV}kOxdYC~IRLUGgCRh+%>Yhl%qothwo-iOm?K$fT4GvOUZ}Vmy64402+?)-5P=#MC0USh7ye}k_Z?AU#)E$x{mMeRSi4P)jCo*QE-cS%NUi1^_S zY<-ew{QLq;)SO$Q+Ek?KbgVh|&OjrPxp?By>^Or-hwQ^C`%hjhIz4P-d3?1bUAmj) z^5nb6D&s$u;%0gG0ca@+D;?xArk{MaQow?Uk>ubi7snAfXU>EnNyn#%ArLi$0tZZzqq07};7#}p zjCp&R9az}ka1+Z5g*8k z#m8P`>rcO7uBLw2x!;}bbrK|8n8jeTO?r~gHyK^ zF6AN_JL6MZ9~vof@ZGk|0zg7bhoYXMwxHKGo)}`hZWJ~AF$(H=Zz#2%Vy6PH)2;7w zsYV}JH1w}X?|Xh!h)=LwyB#J?tUfsVOw?-BObvRI4+khBh~AH?@P%yO0z~?WK9{hB zGU_bo4TjgZ2>S42-*jYf_;)j)-bW%`cpJ;QI8&Z0=4LbF9Mf=h`JL_H|1-kb!U=iZ zG)D0D#M%Adw8G49Y&&7mli9aV`Ummcc>e2R#zKdg!NX_E?br@e0*S^t z-K`|zPRbuEDON3dZzy30!FDD|(_OOsXJ z?>00F$@iv1G$MtJ<;n5(G4_R0-^lS(2!vuf8 zhFOkG2SUf+?ieRG*;cR;zx|sq)88*wfuh4MqaU9x<}+6inELcpm;g?v&Do%kxp$wI z1ljb7@0%;`Y^O$7+c56Zn<+oE#d{xl*Pd2CZj1|LF9FegIzRUwuT9r({RW2e~M2f=(tFp`LRufrsk&r}CqPG0`+Ni29`cP;t@fOYx z_m2x$pT9{wG#j2m2a~X0qn5+`heJS__X;Hux>dd0b~&cw=!1fpR}5uj>aEhSilfmzl|1 zZlHna1*JVc1wD}`soWAo12=$}_Pm20&w|A7y%{i@_WN;vvr|dd2G+MehqU#5SD!=m zRo}7`9Y8JX(;S|PY@y8*gHbkYj6XJ-@jDdUB*H3>vo#J3A?{OxGLsUjIwQm;ig?@g z4S!wnI7cJQ_BP0~7FxtKB_=zseglB6ReKfcGOq)*om#y0aBV0TAV_SyuRhg;K8;c) zOd#{Shl5;bs>Zl$D~y063BQZDtg`DyEAw2BE%*jtw#N7417HtIPvd5N_B=Lj*Ljh4S?#m+jwmF7AKGE$4{MaYM#F1IzF7}Mki8GEYKfw_Kbd6b z_xZ-XSM)mHYsx-aizngaWcTHE)Nn#Qgt9;1#W7;lzIO!JF$<45&a*6vhDlxA16V^n zNjV(f{HJn&NbC;a*Sq+&^(7br-}>0!m*xSxF|;`D9zfYJ$>H79%xoJWvi+a96+&L; zfI&C+Ubp?P{~+)GrpTQ_E>0Y-iT^T(o#CzkUo$xwWBNZ^bQuNUO;)y3Ya9OCXz~R@ zbR7Td!Eo~4EQv;Q+HBHmE2RI+4%(uUwT{a){`yrB3H$AaeAa+D$Cdc+!%3_pUeQ!G~TXg>HT zE@Q$07*iF)rpTDyh;^X~^`jzFZ&0M)0r&#S*6n7=D|Zo~Kd?sY!~>BUtE^^5#|eud z%HNK?3#qBRU`(#7iAX<0(tHE#Iku`k;zdY=z!9Zj3s)kyYpq`;F+)dgKlkIq@$8ij zjq}~bc26flk3Pi5D3K~59w?6Pbvw+t0jfbVWdd4C`dd$;6<9oSN?l3#0hPN6r9u{8 za`WPeiOwyjZH!+nXl10M*Xi(lDwlzEH@s0Ip{ChK;u-<@IC-h0Wau8o&y~(ku6eH_ zU5_-P&5OnEQb)fvVej_9w`;y)XBm|h; zB?P2TY>(k9cSS7Bt9gFdA70W(yUFMXEK7;aZr&KVVC9fEZ~&KIu-Wi$N@MD)Q6HsI zSIUET5mdJ+G3y^kAIMv+W^KOe(A34u`(XXi;=YnqZ%-=G06j$WP!+3>h%Z`@2CBpL z&2IdHX3VtfCVnIKh9~BebPc@18893ISsafeCLSx{i^P~JQXnx01?@gy5sZqFMW-kZ z)=R$S8@Iwgz0Q05+Y=7u*B@iOxeKB*%3VR%l>Av`i3$B5Kv{zs8Jbc>Rw$TzbQ4f(K zkrq(BXint;@(l?dw(!U(T+`IkpWm^=xUZzM!Wr`Kh1`#3>Zuh&XnK8T=$XPC7^Jpm zi>}lL4SPW&FYqzNe8XxOn3tAQ2^P9lz=1H?(mD@%y`p7?<%lJJ44R#J+E2*~BJ`Fa zg5{g@kG}+;u2QD3b&oYL;7>};I6B+q?srTNg!qfEEpA^4k4yy+B)p7)#+n930@&UC zdT}iHQNNGN^)hJjbRUws&KZ#Cp=<)3=| zlQKkr;T|g=Njk#*t~r|0VxnD#tH=%c&c+%>ikk%Qq=%naqt-c@WT>PQnmo#>&JWrI_6rXG6Ea9a$5 zUX?7Xpi?xV^QO<#lq-TSRY+DB5Z)B5wo@c7`aQidqH-|`yGoS7gKj4_?WC}sR|MIJ zpFEbT9EDV=xpueQh=(%~b1BY_7mdP=UjJ{rv zPimW(IGxqAv4Y6czsV#XH*_-dEqOfeOkoMb9Am1R7Ajx6DfUz|+EJUl_9)`Q9t=<{ zm)7k`nxOmC4Q^?}Olqd)2Wn7q+So@wJn(Rxg=~+Ho8s#WGB5^8O|%e$ zalfi-Tx${cSR3xfPf=XCmq~@*H znoGDD?)L2>5U&6{$h&ctFnhlndsXJ~%||rR&X7BH1!0v)o7aHOkv88Yj`)}dkRW8J zEh)Y>)6?6PLa>zf#%e0hq<_@xZClMeeo3`ZXdcSx8Rru}& z*x`fq6J=O+aI(N)M+Dh)O7z+HiF>5IgQF8oR>34p0%yo)uBYq}nmW}NfbA~`ONedr zm{!v63u}x3;KzHEoHyDDqetI@&3TKQ%Vh~EDTE^5kE(e9vNN5@RdJRmKpnYdB})m; zT^v^8UFR}}@Ph-;aNlw@FAbVs#3K+O$h0@>g4wlH)tbVJ$zvW=9%S=mCdJ#AnwZ`~ zDqY_HgcqkyhB09@0%B1KuQyd3IB)fo+ZZ{1l#2;L#ryZD8gsF@iR8G)et(fSmf$x?P+aO7_3xL8?!nnCMdyVY)e(s~@$s zK2x~Si;15NE#X4sv;)2n0W07OF*#Dhdu3^<26V(qmHFD8U1@g9duQ$ibDT?I&O}8} zKs0PLY-5}T8T{|LVRO>>?2!QA3#kB=joo6jLG$VqyK3!`Dp(ljhi|so*#I^)ja=zu z{oDng6m5th|8Px7rUs2xQGlUw+5BwDdY;kUc2h-QgTUS%>&ZT+utg#9YYxs&A*^^I z#H$eJ&F@@DR;|%dlbUrS>j;u8i4?YDVTZl7n0u2Pw9&yd02(J`J* z_Bee=YUb~?qWQN&B(6!+X-VJ?oQ*fr<3w;zS_7r`!kF6in~^(1zNweX}&I_D~+-BZu9X*cHx7*zdLq3;%)xycf1!NH$B zCv8Ay%v(g#j2w1Cse(jt0c#!KTQgmy8aa(dRgu4@uT+B&k5)ZA(X^!GHa)xK-11JJ8ukKw<$gz8NTee zh+7C0>KCk`xJOx3%sKt-g!QSzG!LAENr^U9D#w2bBARdi5=62{S38H$ewiT966WFi zEZIamd~)A|Ma9ykN96nw*Z=8rBY||UMS3;a5u7*L_M6joZy!Bvy|-r?9eXfGel>W= z@c=FS-o}>}{;o4b=@ga{FS7KQ7jA7?F!ba9%(9LZWBeV!@7emF2W{fAb5ZD9`!f@C zAAV*RTufFQrmirGQPJP@Qyeh!^b_Xay}I55=__jBYgGN#Gm_1(JhdCx4*!4{TB~;d z*$)(Qkn1?04HLiouiizZSk5M5wFq=JZ`r@+>-B}R9SZ6r`!lu7^f@GrH=g-BLSJlE z`Z?@<(%&{n)+P#Ul7Y1=-dYq&1r93Zl|~9A>2de*sY-Sh9P<0lTrckqmaW9-rR*t0hxAd2&E_MNvx@wXd zyIUB)r*~T<4)){PgpPjZ9nEng39&{r4xbi-Kc^92Q^?2%0U?LhY5xJ%SPF_wbG#Sp z*{V6Lc}E(dvYv@l9!bl(_5C~?K6i&^iEqT-1PG9$KBS-2hxj604RjTpDBQaRNH;i3 zmRswV&ZAv?v88VLB1>JhrWU0!k#a!)>PI;qq*F~9P_by^T{85w>`Mx0?jf(P7fD*U z@SxgyNULmIHNZ8^+>&ZP=PB1|vV^uoGhvIRk)C`RY3u}}Mxpd-lX5FV>g|rEe2c<7 z45s$f6e$Bov4E~ME=h-11h;mVzi>*AD{uE(iP#GIWr-%neH%LeD#Xtj*_%i$iA2mU;;?L zLAGNgdP|=yXZe;9i{v5?04HH=(tHf9>enJj?5PoJL)Jn|*pIT6i;=cXj5w`pI-@z7 zxucpVkGczaLqg)=lw~SkX1wPHgE3K}Um}f)qOG-NB|L7-+)HZ=$uzK+L50YACw_Cz zlS;5D^u0Vb<1zfDrMIBVMiG;&J8E6amg!lFWT#OQTgJv^YW|R6psvMPkTt`l|K?UW zq7U>$h-dlM*s+0sWzY0E@k5o`#L2z3;*w|c=)!Mn8h$OL9#0|H4-l-MGtFnx-x;uh zUOgo@RxVWHtgK`;L*j>YTlKdha2=LRXi^8``Po|^ z>u|{2ICLJw=lTh#@Obz7bK$%r@b9-V>A_2GdF8$^=gltUSPS`}#ds)k*| zgg==RkFCK5YZUTkM*SDdVsWQ0l538x>Sk`77xD|>0y_v>GtlLA!{+nTFKiL-t72U% z0GDi*!2`7P-unk&rZEeJSP<$F!r96*mn(O(6kB(~|ig6@(9n zuAOpkiN2`cCgnp$#QT7!Bj8(y9;0G|X`|tq(Jn^L!iM{a{imPIIn~>65#{56g0Qi) z{>?ID?wHpQ-$PkLpET51%0SuA;--U1I0lkT#AlUSgU#_Gk1oy`sF4e1?Z>4(>*Itz z>~X%fI^h|k&AuYMMw(AGk^x~H*;rLVLee28sVr}Bkx-Uz8KBXa?L$|A_^!-XN+&^U zQzLz+xW_#+#7D$tW-bDbfT=b!zzMG!le9l4usc681)BZEJcn2!)A@JuH!NAkN~=%cMP5<*RRING29=~{gSH(RXTg26Q$dr(7TYcfx(o$xE9$6 zw+LUgZvH+u#UIyX%wFa}@GX_P>@wffxE@AaZ?P5bf;6nY#iofWnW!ZzXpM!-j`Q6I z-1aB~w}B}#@D4LS^*~;6Whr$B_A|1GjZQt(v~BF9>p{+Sn*VBB zMG#^g*5O2Xi@#m()@Ejb{r{TY>W5x^Qd*^b7YJ@>&Xe5B`RFdZa4+YMQYD&T;DnVv z9|YO|z5BNWyq zXS}*o18_o%u!vdEsViG5BqzDb5eFCf5o!q<^S;B7)guz6snVA8^>+bbTg^626QC$u!~=nqouAa; zEjNf~7VOt3frFCC8Ja#XEx37_e$bA$3=r4bgzWe6>WIqLe^u|RlY;;6o zPdvb1@SB;$*|h;RgK4k7gdDSrtzLs6Y%2E48?mWr1%68pDH6qSZfTEv)p0#+$>0*r zdsE4p50Wk00=2YuQ zojd<1^mBu}jm#Ykg@pAIibhKW9SA>gKij{9CQHv1Bdi!~=qSSLxq5Lz6IjAS_-t68fMud~(A zXock6;dn+wCLvnqri8JZtj$Lnf#~I5fSpTg+c|7z+RjEfSCc{5{Rm3|(=z>qjXA2S zez6FYdma5)u#0G9?Q#q78ze`LFO;Pp`DhHs^z`(h%O2aPt8@rPXT&IEV`ef(QX5Bc>RKsVyHxa#(gv<_Xb-2GZg*r+z8K(OR@#}eB$w# zvc*p$X>-Y+U@Lhy-c$9_y)$^>1VRlKUv#ppdTsXj6}51-`vUnDY`~87>#nVdS$bSA zus7gY_v}5Y0oRiQ@a5hDP=?j+54=xde+$C)Zok1-9l|W(hfQ!4W#@%cpMwsvRHZy67fJd_#x$;-hg!#QPOrUCe!n#_u(t)IiNM*oQw=x zuMIm1ML?cujY0L)fA;|Z`W71|QNnYxC@$@$8@kF3YSZr|DUPD5g?URn_yUwugbz~a z(NQP6Niiq|;Ry_eyenfDPOJD*w=A?kx^{t)*D{*s6=l4>a)S++00f?MBk*{#p<()? z36d<}pkF=(D541JJ z5=K)^z&ce;|6Il}3CAdQM6xACfdkBHzt>Gpu`&#dtRwj#_io z*#9XjEm^Upnxvek*66a9XE*R~3uiLG-_RUY=`~_Wt0dBu&jA!o05H;Rghl%g0Qz7c z%Rp=QzZ@iR)9f{tnsKd7%PF;3_r(~wti2uM0xGqDrhjJZPH$m1vA0}GA25o)FC-?$lAApN>NgAUdEA1pEY1#S~fvZ(|FUIS}nfNiU7 z1D+HL*ciWxz}?v19fk)P`##JO{!ECB{)SL%b=GhY4d1sY zvX>Z>*t`E?Oy38BBt*7JN$$|=-)k>>L{=`>Cd}cds&g16J&HR82>BO<_=Bh%rJ}Fy zL!^F;S%lfc0j_Gf=v6-Hv3iQ6ji|5M^p)}P0wrEUR_6ApJ_HQKDNJ7c)5asc_k#y- z%&8D;oFsml2;BP6_k@dQV59a?U!5jn7%(iYW8koAN{ z?$>_$K}kRoxxig1a=V~WT)hQ)x>{K{Fd(F;G@wAl9z^%=zf!_M$OIU@By#RzD$N$V z@HWU8%Qg}oU>Q_NoEy-Td>HY87H>-+aW8k1MAQW^`9vCgjrU8Y%Ag_OPV53vQ6tmt z?N_N<`$jU?S=K$#y0 z50yYX<);Q|*u9v!hA)zLmA3tess|4frDmo#OSp=zMHF5RsGvMbaa(ycXIW(q>GWx}0V1&zJ3 zhQ9CZBg1%WF=&Ojc_5Pix6zM`a^stCKJn6Szh9>7|H=xW%Wf&6ZEk5!856ilPRIM4 zG&qdP+ZWP)rVDaW*tbE5YN99T_i-#|_+9sq66Lr2{@gB82-)VT@Z}{yFx&tK7$D5U zY`>K28{Y5_6V+xgdOs$Jd4F6|Mv$8-dw(YSm4XY2#+;pN0*ReWK*J7UQN3GNA}4t= z7|`vNCmd6ug>;zYqQ;a?=HzidpC>7xF9sXK(Wp*;Z6u1++l~Yzi^_emJr| z9i{_vq3e}@*8(WE-}`dt{XlWID~?i+c+Z?WDAMf;6l$ciQmB*CG4hML0L*fS&X8|D zdIQ)lm6@7%mRJJcgNka>Vi#G7k1MNcqoOPZtca$lLx^L<0iUsMGbM!y_5HXNTEjI_ zP7Hg)qI$fz;WdswJ;X$|84CfYl(bLerLfehFcJp(d02H0y`6OAQlSSL` z^}SWUGNIPsZgxUgw9#e*Pfq+@=4?3bii8w!?hjx5%BnG~8rE@Hr=vHilu-^w&G6bs zu^gvn?4aXO+ZgVZ9>3pxEEDo2N^WU0wlI=5qHiS{#w=Fbr8^*2GyJ}NL;dufCM;oU z6^>2|KsueFW!dRHEj8HU^$fGITh6k9nvX;9pokZ+c6Ez{K>6RQt8yXk^`_PtfB;7X z1X`WG&W`F1FuCim^x<_Ab3K=2P9cmrCEi?$h-@qS945pI3~N=|3F_N`^jJzt3}=e8 z6tObq#c(P~J{BWUZuehky^TGA43?TXTPC5Uh@EQZxqi&VR_V;jRhR$WrE2Dk z{zp+uW-Kh1{~tBc8Y>WfI)tQoN$c-qv|bPru$}b&`SLHTDh1S0ZEa`kt}nZZKHU3d z+1B5Xi$;-|J7}F3lrGQz%eK5@)hFfLQU6!x6T}b9JcRy#*n8`!IO48N5DV_^?(XjH z?(Xgm!QI{6U4jOO;O-U(!CitTKuDM($-6tV=i52o-@DW2bZAajb*h`{`rZ57M*xbL z+1BveFfN!NMmV46t*fef-=Xu?RSltJu|i#k8YaIcD~dn$jGv&Y7{PGPAPg5Eua*a5 zO+s;f(F7`QU(N$2^2&JDVF~>dfBO(O{&&(EnGMu!9L~`zsQ02Lq#51cJIR9)m&~Iq zP!gqCB8#)YZ>Oyye~opJm%@8Fu$t!7=1xiQH~P=ch3ZLDW$&lDk0yz#e$F5r+{h;E zSl-Ww4uNHDQBA6l)Cn5&#~2vxL95f%z@2woTm~-t)I24fd#H1Zq>xmweg9TQQXg`uMuUpq!a3H zQL_LG%rUglk8#f>&n&uNW=;PVpe{ayDgG8U|7gi@|h_@oAjq@B~+Rav)PmyM%D9_aK&tJ?1;3* z{A6heN`R*p6Yr`nJVq??^mJS}*Pnq{P`NrtmFFr`vH}uFQr`ec2z(|hlEkYMB@**_ z;x#~bP(&I>GiC5oKZQj6p9PTNRasdU{ zg|pV-vBXl}cm%l1>?b4A{tQ`5leAwhd5uZibsm=2P#GpkHF{63Q^o^ZMvinUsJLOO z>-{o*(J7E zoRE)<;d~xd|p6+;uIolWn;<|q3Sg3S{W^pQoQ~lLIOyF zvIAQyDL?#^TQ2oM@I5oy=Z2`Sa{ayx|)PSmTb z$hy+(2(sDXTdE)=^4Hvxie2h?{GTIE&NvR0pvnDFI*DT5qw}`^4*~(-G_QE=-0QE> zfR%xH=il~V2RaP8&W%X9mO}TRgw)n&$Mx{7tHJL3zvoYyPVN6ukRp>X|M~%nSpIJg zR6zz1)+#<0o&PoBbce`O^5*sYUH0c`yqKWgq*Fja+HU;6VH2NEf@+!f{O5SE!B%F$ zSJS~~Hy7X5FF^Fk`qr;3d<&pDSARC1${hpvcgLeEbPr+pPk)=YPl4)|K=U?I)+L;; zo%F~im5!!IpE62iF9c8M-`+3)LS#>6RF%Aqt6)vk_{~p13Px_?E903~+QM9oM|c^9 zCsb1#GMhB03el!T&!F1OI#xL5SP0>{=24n4N;oH51%dSSligERTH8TE`jkx z^`LiwLf{rmXHl*7qCH6|arxC6Tio|ql>mOQR|Gt;HWR!vPzhOi8|W^2chM>Q(l(rgXZjNx<`tJ+q5#DC1u?C?xJb^tNktbd%?5y$sF8@rT|t1 z&LJA7j0IgP%r4XvV}rfjQ@i;Y&&+}RD~q5>i(K|CCEB&(5+_s)!0jZ|;_d%{Zx+yw z#M369q%(V<-O!7qGdQJw*) z+F(N+Ift`BRk@i)*SIw=z_pdzT~@mWy%;`cA!z)B2o=T}WRko)^9XGjkK;4Me0!ql zryLN_+@X1)ltMP&@25Q52l#@!^Ncx6w}pQ2$9B1DS^x|mHfb~ki_a>QY59F-;gh+h znQO8vwAc5#C`s-^JR(ovplBx}iM9C96x{}Frohz*0^@~LHv{GBCOO&SFzPHbm&c%L zH{zMnny?ocm&u^7ONoAsyTkeTXDV}3(1-V=Ci?@m?fdT+C_(zBH6cUNfN`aKD)JEE zS6YqPqbu6`!YcFP1x%ydC-u-is9|oguZ3e7TJI9SKWkl5oN9F8NCB!x<@W{rKB~{g zVDRp>3l5?T`F?}meUj|sVJO5e&1k!xJ4>i08aN&I@HRjJC z?7^Io5HUXgA(Cdx!}*X@31(h#2hSW z0*CTz)pt0?j-Y@kdlz7B?0MXajndF!>KCr40yxqhlaUGoqldu7EO{O1JI4CIL;qx6 zuer0+k2eQAei$T(-%-M2@-p8vo9V^-qS*qR(`c@);xmUwke72!7`rS)HP}5Ha4{Z{JVVHPl}=HTSLFy0O24HQlQTL$w}1HBS4?i z(Gr7SqiZDGIWzte=~7TIifH5@=|F-NzXDXv`zlhvQ{P@cW%pEVmIXTeAWFtE2#NCm zZY4#k=1iLN0GeGx>YQQGAx#|Xu#`)FUfimtglGBV#WtJLRxI#+U4;OE>m|w)KNnIz zxtee4JVx2lt`!qNhs%pla0hVPfE5$qMX!eP{#tFi#_Yo)N0uaM7NI}H+n)ILE}8^$ zA8OPNC7jI6Z_rc-=@)Ar_`Oc36P1)pq1f?{R1?A7C?<8ZEXL$^uiIxtuNJ>8>dM3q z>gv<_r*sjVP}dzdFl2>Kp32F-rQk6z?zb@Kn^iFOF&N{!{j5B0tW#?a2@_9#gRX?Q zq<&Uq&ZVX5{ZSQ4JWP2aJ?%D3@(T9C+X+1SQ^1Nw zd23+4(e}6Ey5w{o(naQHdbBYRQ&Bp6B;-IUumKuaK81uWSJ-6vDIt1$osXl%Q(i%& z6Qg?M%@+R!eLIT%=wJtMga-m{>H4+E6Gj*8`eYdR6sEeK@RPooou}9X5LuALe;~4h zn5tT?ZhJ$t#l}SdNdMjy{@&)_3@jhIwHYaEiT^*Qcy2w89CL5nj-U^J*4Cp-aLvS! z|E#Qlh~^6X&z|-KU_Ex^xdNE2_M2RNO%DH+&PSIYjgfUA{NJ>!hFF);PDoB^U@4iqJmymMuc{Ab0sq_a#3gIkvOLy>4}T<#b0Pxw4w zGx!11al#L2o=Y9%3#o<6#Vy=eG~(84t_e1WX@FKV6^@Q{P{LTtO+C^#M}?nbnxfiN z%yv#Pr*!VCO384P++vkRz8q`VawoYLbY__<9}Nxisq%Q|XfcnB)AD)->xk>|ksA1| zw_-ygjDE_AylN(MHq2>6nX_Vi3JvNkO?#SL3Trw74f#|VNrqel>&$@(qYMd}%6moY z1oT~-jiXj|6hNVR+<23Iq|TyX$&)Jg0OXaU411zxmPI+H!Nf+a;SXR?ge}gHh77?V z<_}Te%xakM9g@2t98y(fZYR5TkZb5>Jj?#~QvNzozUq7ghS4IccjhtK`JPlWl zE_;FkrY208@J;r}_@>{#`?MI7o>4eK@mY)h08e}DnWe~Hkpy}we?VL432$DONa@1P*w%b#NQ6Z^L_HOF^IGq%2zxVg zkn#d#XB(TFO~5a$0*Ta6dM27=^~%(#a<0N;b)^!-S^CAR`x+k4N>pvf-Z~D_2hK7% z748TNW^KhkV_E@+_fugcXBpHpiZqc0fT+rftG0hXd0TLC00vaw76&VoN93FkcKS!a ze$5KOC)!j=`pQj_>^(lr^o;31FI5MnK9tnL)LNB0<`f`^j6&K&osDq~(~`^;us;sL z@M_W)o@Ze6Iaaus9G#1&T`9@LsTFX;UhVgvW0g21kc~zuPK=d-Bko{ zJis{(G-miOF`$a%Iqcua0X3wjy{A|n1gOE1zrL(SGqm5qV6~ZI>@r+9{Q;NG1$Ev9 zW1ue%<0F4Q^&6zKer$y$GF=6GA5i{P_)X;@2*z-f;3>HK^4(454;#RiriV~nDygv0;p)-CNsUsZ+v9}sL^8R8yx_1Nx&Nznf^b}rXK;}7q^&JV6F3GGcc zzw+kv{eSWFVvj*3AUpn|TnWM$5O0e|CwVP%>7ZAh;O^@8*eyPo6TGEi??}?T=laEe@h5><*hY$VMSo`#g(KdF)$ z?besFBv1H2wDbi&ZyvvP8tXtmrBqN20;OEW5I>NUw&It2>sJiuu-={6VxE4dd4q{7 zVu|!?xk7*}p2Dazrd&gFrQXVB85IRE|JN5v|Y3nx+3G$GewedEF8xW0>eJL!rPGj3GAff3b|;aq{0#kHO(vcw`7#gu;Gs6G7Y3=`tDtOA z8fX)=G!`mqmac{Zow}(AIV0mn+3Q=1Bw*56l@3w!MhgJ%VX6K44dS6(KWOqo7BgUR z1*KHky8I4xWx8atQa?o9)Pml$a>Z1mNL%d)8^0O;eZP zRdmx`^c;|9ZR620n8hmO`pc3VC_e;H8Lt_}nloNE=&Y%ReQQ4X3!e#Xl*{ZguWNKM z$nEMj1lKWw5UnqpY8@oKq=Ots|$)}KnsMhpH%`A7zXD1S{*l#tJzt9 z09uydpktOf0gqx{x8X1$v#-XXG+I{T9izmZhNLF|r?$iZ=$ld3u5KXC5(M_GhPs~! zX$ah7is)>Kja!qfk3%7w`z*|N6EGpP%RIofc*!uURs7X2?}^gVhV1w7nWvYE0&JNR zIM1h7cW(~;T$>#wkZIJj8Vm*lcy&^BkpQlMvloJZ%{8w&`V_-+<8A@y+GyR%9O!bv zte$R$ZNTEFMBxw*aT$b45()3u3%t{qoSEehm6GQOJd7Iv^oI$BPiB##a*Tup0T%e1 zlVvdQ2s!mxX`I7+fl5Pn1AoP;PGuYX>+Voz5+bymn_ocdqDgQz0(;B%dtd-`?|nRB zy{=SCr=x2OOup_w3aB6%ehV2sggVUX3;hDA%wbVRBS0fFAfkHc>L8cUhSs1DJUx(i zB6WxF1iZY0Rt1H7d@&jo87FpqVFcge*GE6Lpy;O%Tb5--5GI(Xm3$d)04Na2EbN7{ zRi9;;9yTJmzA{kYdhQ4J2HfRZOA#*lsefE7f3_6 zV;3O=Lw^3Cs`p%uOt_~pils}0!6#)f__0_JCT?n%}Yj6*9|3WM#E^x_l z4Vs5S|DKFRlSfLIlt)BV~k5PyYEhccyl9<`~D|xRY2#)R~Rqf4}bG>vph5bW$R*n&# z(MA?}=(=d0(tItD`GX-1Y2j)$F6X)({5c>_s8^M2fR=`ydIsiUD)LeT*OjhvxUq}I z*{*bf1S4+_X7fSZ-5!1-zo(;&vsRH({&EPIfu=fG!_iJal%6q|KH@lhQVj+saIG+q z)OrsZHkVTqiMKFj1fA$&SfV%r7Vs-m)mpl@%sP%nWQ+L^={^QFy}8svUj#mdB_qp= zK39iB#z@TPCb1<*i9?5qn#h)BJcTW!-rG(>QDvks(=??Fx@`-(-|p$+F36M0I7GWP z3jza3FV@c~X|m6B0wg$f6${svHJN51<`GYCyX`hW3MKoK=77X}^Jc8Vt2jwhD z>XD>Vo>G>NoDS#G@cmvqN+0zI^GfL2G|GV6vkC zWOG>19fhf{lrstv3vC~?Vz8T)`{~iZI8>9|warw!2rJo%GqB!j3GqC5PS%YcOq`W( zEg6H>Ch=BS7iHDWwL$^b<@qozB&7Rz5@=Dz=jc~DxVvayKROYWeY#lKVINH&YIW~_ znsK79zX2ec$iZS58m22!zUEggYpTKzeHZ4#3vdJ2v4E@D(@QLK5(xIAarc_W2+f*a02LA|kujoz^T|9(J2a5)bGSPcDHUswDIDcjCbk~+ z_IUt0QyD4CHaM1L&3q_q`uwfCx7=fLb>^x4ud<>2I$CW!MROMb`zo}t;QbZP5hU*r zU=cRe5C43Br{~xiZWF2%O*)$&j$EdC1TrXiuXfVzi_^aLT;SZFUTY!iMnynVa=1r8z9pLwLn3*lDS>a|Sk^lCW zi_rJl@<1PP`87b_VOUxv;PB2d0Ek@&Oo=UzDm(zAUcu|*BVfib(Ep_e;G|_?Sl6}D zZC3}86b9gN?g3GU75O-11Zac}>lHk)wkw|nvJu~++KhWH+c(!?>1zg1!dn zwSEu)jNOS&4&Izx%&sDd0>%}pkaaZaP4v`{$P)PnWm7SJDFr^OWlZnZiU8a$7_`uX zVl(#er%Z?6lboRHUI*jJeLNrvC2Mkof1OswIT5CtFNU&|aa^*Dv_MXUG4eYeID$Dt zE-WAAT7$FWg24GWe;qdA`F5(fc01mwXKy+ZHy#*GA_w& zwW$eNb3IFiD(4J+ZVszC$7I=7D&?pOj<$AKlb9*4wt{+TNpI{NDA3uqZ!i9u(8w=fhNt_5~+Pq)5&lU*jHh+Na@t(m7hx3~VLr`@FE3=4k`BFHV=0~AG=lL3 zO(vVPW-^Y@EXyhLJMS4YC2?3vaSK1V1iP~BjjVLjab_G2XoQ^sevQNCcI-W>kYd1f z4zoJbtkL`rrj_LPC|kag(&wGgI3Nnx3S7h3IkK(63QS_xP@VKEgJ)Bc-1?5euk+z0 z=N@@bvVAI9kjminQ4baj?z_Ud^~Pf@2Olx7uMofv(Z2&I&Mjzkl%`nX0iO{*4DYaY z2OOg@4m$T;WB#Ue`(s^l%tub~pVe#jTUcz3eE2ScrBwAe)2=#$Ffjk1tohyXXZ|7a z#(_q*0a_l38BIBFxV3-F?g+!b&S`O2ka%(ZDJ(W;{x6bK74k>bGury5>iKvX*9&wm zDpKq84#)SV?>+zNb4bPk0~Uz|G$OEw|-HLgBv}=`Zg2{I82FKnMrA zEn0=W@V}ZMRtP}F2aNffIqzcr*a}pI4-E4Jp%fDRNEw{Y!jj2m&*RIz@Ga}8F8>kc zDhtF0Q13yPM{_Zj$Yd3z2&e*1%t*9DsIQ2b%u*j0t)M!{RaCce&kd<)Dr~<1h4gcj zJ_Q9ML%2K4lL_O5;&Ek*8Dek1{$j}tgtL{K3^41xP6W`2#0$i-AEXKm3gFfdoFK0U%GpbcH%OI$ZT%#{nCph) zP|?*Ous#M@Y9xj!9WJLZrB?gUWRj225)`Nm(=cJ%wBNc}TAX3x=FU;j#6IGga43tC z^N94mct&@Sr#EP*Zh9g!t;1mZU8d9`-Dd-%zmSFA5tkfr3wRX)Y?|3s0j%UOLyqXfPAumAxs(-I% z#+F$}->y9gkU&wStd0aJ(O~rkE!aBAarCv7y;3&eGe3mQ=34+hT*?F=0{8*fmoLPV z4UT15e%;_5!008pAE+^9&_ z9Xrwe4GbDs#e25ZSQo=DCOK@}`lNtc0a$FgehN6cOV)IOWpqOR1jWQ>NR!XAeJsj@ zv_Dm;GRd6~2G&M9Nt*&dT0`TL(A~zIWmu01O1TO;>F zq+R)ZhCRtM53sC2*d0{j;zn`?_rQ}yAVZjsCTdTe+bE~<*S<~L*+lIi< zt7uUEka#xfiY5zb5v*n3L&cfrSL32HA@+z|4kSsY z`*=XODRmC~TJG!ZvSkwB1M}l_1gx;F-xH=wI0-8T5|gIhMaENgxL63Us01w;GExZjpJ|(6kuHt=jTa z&!jd9l4ErZPz3$#AJdW6l6N9dLg8*#FMpi!VmdKs%WhwA--}*fL18v!wJO_%b_s8v zzJ?1B^-;!DsX0u%X(C@vbmt&$JIR-LguO~oC2JW~om$z^PWDrlagDkG9T`o9f7=4k zVZA<1=lM^IBA65Z0FL~Ytft9&*jXv>8%B1DTy9>qB<+!YO6>GxSi~s_DZ-kSA=U8- z3>Dlq9Z^H~A-NjEIpwqiQj;|JN3D~;P6RfW41cYO-My{Lu$OKJ zi!HW*Wb}l!`lHXIzpP-80eeUaV|>Pz5g_SK<@!H9FnLPr{(tiT>cs{Oq3?m7#{n?d z_;2<+H2AFfvH*axvH6eXTZA5*(?lF_CV`o}@_N;JIAb=|wMz%E$nia$7FMu%sM2NEuS=Oe$;O_WS-U zC?+uu_yz)lTV{9$5wAQa8>+%z>r~3!RP+lmGcccYkj7`E^W8A>#1p}u8 z3c;1|WpyhgSmpE}04Gp9_q_iR zyVL_@O|86o&K*qV%pNec_l>;*(nXJ%3U{d^YBCu_bre1?nm#U_UIFQ$mUAeHrYJL0 zekapEk(4XXYSXZ|%7j~ z9xV>a((Upd?P6e<%W}1Bicj+pxD-}s#M4p=S;X_ew~;d#7D>l}uQ;nnY@5tYK0%k{ zp2*Fc<8#H^r@p=BiIFQQF=JD7HW~Jgx6t{}CYy-m^dv6UdkT<qj)6`Q=ae$%`g-(wG0J*Ij4yQ6yx=0f#>xsNRV=N0Y$KKO0R1 zU<-Eq%ShqvB#o)T#{e#eDp7z(4?xlhKKqOH{7c8wp2u(0n`r^kF;R(uLRoHrTi-JF zXV6ON4#z(iLhj76pFw|0WWC5B!%xrr*w-VKO#U}M=hx1me@2??xDfo9tsDxM5r1}J zjuPfzlo|VDT?)V|J*h<;P%-zG)!i|ZA`G2~xi2VDNO_Y#cAY1|g`~Y=Rl@bMMn8iN@et~h824Gka#NoF) zXgVDt9ta3Jq>Q+Ty0_tFK3|=d#M7ig@(%lGNnZ%qp<^^+fC?>FI$zNLc_ZN#kj}lS zmwtY~EdAN4BB{Xq_^@Wwh|bY;1lU5g-j}E68NUgz_H3Z1l?tjqHTD5f2;r)rMsJbl zyWups?61$~Ol`qTNH4nVV$6mz%iP-Z%>G!ix(gzZ-X1b=d@^)ja^6`W93=|tG8 ztPSw(F!hr#Z(?kU5?o@)XN(1~Gk<4y!8QykmJ`RYOAKF1&9Er`)a=@nD$ng$j#W(~ zk2+y+(M=FF(jX-#(80uu$|(KI^JB(W>%z+n zF=DbR&Q>IAiwEURRdV(45FXB4XgxA(;Tao_d1NsNY#AR?A}tMA->=YM0Q&T{iUxdMgUL#5(`to6Q&T!D81fR{n2o~kxYwVzpM@l(cDb?B2n)3 z(JHuR73>4E(pnDn3@u&UC9rUSOxl|w7 zJ9JWI7vzn|Ww|8}wV!#YOzr z0`7h0?`~Sgs447rl>0~M`~0})r}dcLkT&T%sl_NA6+D!qK3}TeFU=huAcnjvtx%AV zVysWzB-(FvZulYQ5tsVj4qEOei|ag5&fR7J!fEc(g|Vc$^D6y!=zEQb76|{pJyD| zF`Lyaz`h{(wfAOuX-iCCkild$+d_$%saC02Z`ixh{}v<1zqXB_56F^ihmOgplnU+} z+sNODv*~Y8tY5h-jBqEA;@w1zjIamaXxbE{`U@=TXfmDdftl@`@Ut!OE_*%BH9u^% zJK$}D_5f&x0ffcL<>p5=zCNIM;CKwBe&7l!vNi;eOlQzuz#JRHK(k&KcKilMEfruBi2OX#d9ws>3r%x!nBXu)CybI# zMbbT$MQ+P-2dn0N6>huF=}tVIB)7cH2N|N9bRm&qqF0x)mEAzt9juO z@7=XnEG9%#58%($)OQ0fMeLf9*Ei%s(?HS|x`Zf-1KTrS`{Q?fR>!EmvCFi$mxbZ* zNVM4c$bO}FPk9@;P&&<;rn<Ibf3H0W_E;}tH0T8pD$ zN`d+zqS=Y5w^_2_Ly_RB9kZI)WKd>0TRd{{KK&k}>T=dp?WF~_b9C&xm6%dlGcdnN zw?)!!j@GOYIgF|+_OL6B92kgldE1WFmPu!5o)z_PYr)jyHI~J+XgpawaND@;A8w*7 zLha4X>-1q1aw{;2X)Qd^nILtf=3$M{y>ygQA>wi@!6FC0#JJSZCrngjCJ8!4pOxC& znH#r%2pO2vrn@Rl7W0X-o4oJtP>_cwY5#C*ou^Rt$xu|UZ?|YWtsRao5$uT>pKOLZ zxz^%x)V zlyff8-pVoUJ!trE8krqnG=@MCMh+$bR9tdDq#;m)X~>dT94A*5w%*D%phy$`?-Xg{ z*qMTFFQX<&Z1yFsKDUbkELwQ9I$DlI4i-I-hBA)LWpQ5N z7!ABW3#0#AQCJZN>_Vf*R_nPT(yyyb-jtm3R<+iL+fsm zbw<1_{#8)>RiNkhkKr!#%5&Rj?`@9Pc5QLUZ^hT)yj_A7K0gwf9u_n-82cFNA7963 z@U~(Dh2lxO25T@k*9c}#g*1O2ol?B7oXcC*IT-EhuRjG5rd>K0Y)OWmO6WqD^|FY6 zO56KA>le z|IO7QA7`1JsMqOgp(d6WH}YEB*vG5-x;OjOh4oP{kz9kF4^UhZ*5!}GTL6Xm%-aI9 zrqA?)m0<7-e2RPrTypr-;!!oR)+d3V7cB*vpq*2mcjn70y>|33au<*jsKAP~$+=FC zhYsC3hcE3%ZG+(^@AcK^7_byoEEL=VC$;px>O8g{Xda)DkLO6cbyWV^?bS$lgkE2i z2oEt25FyKilDUZFh9sgzYZKQM4?GUHqBa!aY|T@WU6|b0;HPn=(%Cgbs-=HXzl#PD zuBT78&55*SJ@mJTi#LRr0)r6C@ZuSpG7fSD{=b0TluKe6DIOkp13>o$Sn>{Yb?kWV36-zAVtvAek`zc5%cJ$VJ`yC zg||_%TOlWLtv{Apt6hl2IZ8 z@8TiyKYGYIPD-M381g4fqeAvB5B&7)4BJIjI9)#k`Qninwx`{ltr3x#O69yP5jc4u z8f?{BJFqPA19KDXnph#%^M2$agf8Pq+uBtMyF-rO*94BnnqWcnm_#J z3i;fcyFBYuzQo=v-PJbFZV0Hnl~92MN>&XFu><~qhcqGVR0hNT%+6;(-dCjhHt}3tP&}K?W}CSymllt~ z-o^IxFlVn|C)gQJCKD89&SbRBlX8g@9xl#QrMNJZnQG8!8MT`Lims3vn&D$`8aKoTz2F9Q?7YeOh}qF5%xgdXSI(ElfZe*%38gvcMJweQ{$lHin zM?K~IPAq8MCjb4`U}G`r?}Rb(Qde@tX{#HngQ)*9z>aTYegeQbsFn+0M*g+U4vWR> z*YiU-W72R7p00vAX8{${6^xAs(ka@sKur@bhI123-P? z5MlIk&<{6!o6ohyI%K0JataT!&Ay-^CRwQ%7N*H$yjMFu^vG9zKON)00x<*3{XU;= zfrKqO@`;gBwS?eYY*?2B4r5u8C}cQGzSS4tsaU;>FUkZQW9xx~!#n6G35v4>@26HR$G4_W*e{EHU#IULe|HH6jK^J?=e!@>)@8ZS;6zUj9b=qi} z$qgBj2;3#f&6lj7OcxY9Hr3>*CJ)}PvA)coe_5>!dj?e`&1i zn8K?~Ut8)r!n7`;jkt+0$tglrSS(`hiO6 z_gGKW<&@WZA08IG*f?4_$JR9Kf zgMhr<|0~S$FILGa@fW~kkz^BLVP_HLVwK?GVda)!77_oiF-x!=0HwTx1_%CM%^K}g z;Kx6h64f091l0p{%%7151OyyJSzcWNc#?;QM@>!5+S=OJ*EcpcHak1Jva+(ZwRK=% zU~O$}dU|?yclYAr;^E=p_4O6l{{P(m&nNKzjZfeO{3m_unKkfj0dZGVR0B@$|3BYA z)P6uwfPiqd{25>5T>@jQT3Y0YPloN^UOOCVz&s~|q#xJ1evmt6lRV2raEiETY7UAz zX%W*+RkH5r$k2foq__TeA58J>P}9+c8G?WL7@Fjm^2}`0IS~{%Cg%x$LIF-#n0Wy? zF9*pl$n+VZC==e>&#)O!m9sbsdowBtM;v z#Xw7nCiQ?`+?h}zVsrB>I`nlz-ciN%2{GNddN2r+uc_Ph@!!Xl3o?*jQdiT9w|t8z z8V@!r_wsFEbQEm|B8A*9C=)p(tIm8h>;hCL=FaHCoa;+KYl8Bp86&9+mQ_s1d3naM zoqbs&m9_Ms2zXzD32Lx9BAY}gel2wgzu%iPi_US;CT_G6f`xhvk~DzgI$v&SSf=aI z0du4l7|I}nLpY&B@q53`X@;&yLuP1y^?7Jh&ig7Tc?M)I2@ghVkD@bR zC~l)cxZFCe+m?R86%Dgl+HS(T?A1tmpQ5X?>O^IufJqqf0ab`SY%w~|5LGf7N0v;$ z&R>g$Bn9>{ET;_&!eJSsuAWiXHN%hA?g&)B0Ho2US1(R>!x@RMZ;rq|=juyBZj}lM zjxt-)xmE&PfSvoM$rq-cjE8x&qxPUX)Gbp>$`32&yS~_6hxbCTd&61w5rml+5KmW) zB15|17}tv5d!jU!S;hjRa_UA12<`jC*bkttBi7mt8*Jo6Q-ykvzA@@v&*Z{)w3~~` z42z=kyHQs2;*ydsqSV|FI-@Mdg-PktQ^m0+Kzj&q=$9z3?Ivhi1=vujscP5iGU;5 z$veW1%n+3Y#HMOWSJOrLU0&XY>#hNY3Wndd!=D-L1_eCSS6+OOzja-Dee2rS0?q5u zpPaWUKgr^vXn2O-34~6(Xl}M+FX|Wi?!q+`_LE@_>(T>Jy){h7Tn=wmfyxcZn`;}~ zFw?vvR(${93HvN$3uN(1v96d>VP$@PRomZdVS>MP=U#^d3Gx?M2Z&$!{+^Nh^S9IR z8_NPRH@-NB;J5P{KVT7nMadhW}>^9+$XXj@R296n&0~xyiKrZ+W+`3#~HN(mFlx*H|X>|MP zmZhMSj~D18xnxH-hoeye#+OF_Y_bJn{AMoCQ4Hh<_IuAk`0V z-Ge+55r_}d*))sGLFukDi-bNGGhy!_Sk`;QcbnAB59pcQG>Bc|#@So3=FZ4d;%(au z>k#En9I$xT_jI}r@WCiSvh8r?cxHBt$xZnpac39P@GhiHqLNwEo1=({VJ6QP4;^wl znRTO*ba{q-*4>^#U1Zp)tL$o!APKDb97SOitGbWWAn`fAd<9^^UJOrwEA-84NYs)GWATl0aIxI-9cgfUbjb|T@glU@eR zi)p|+ML5=aSQqv;=U*zYD1ipC8lt|P*{$A0`POZzLqh{QV8L~F#wWpA05iv`0ufXT zC@fIcBGORpvY(E-_O`qbE{Yf)bD12hn}|Hq*#Ux7u@8YmYL z(L|WlDIM6rTHr(R4Dj&GV_@VxnI+ra9N0FvW(-}zl&t(GgiycEyBD+SO-BM{!yhfV zUa1c_H&nskeU2~WOuji7A@(i>lo@0t5|8vuli$i5yFG$9OT(Z%=d5RoA47M%ZW?|@ z*tUPH+|>Vt8okVQthb7)wB@-QL^gTse04-SS3MV1Xsv4+qPkVlXKAeVV{s1QNdfGz ztU=gaugUKdqL%wNB!*AzPj$fcK8OppSSYDWVY6xS-h;n6gU6s^uQp;ELuPT6=5v|^ zBqzqTD^K;O+p>4u8DR=N#-s|DsvY?fwvh==3#y>sRt$0xZtwH!d3}-wOeafH&pfWj5OA|KRK`prVSu zcHtRNx*O?6x^n=7P*Os=L%LgP1f)Ys8U#d9q?8g6MnD=#L3(IOhmt|+J2T_|z3+PO zz3cnd_bgrFVdl&^`?vRgp1seUeYV@p{Jmg8{tOgB1y_mM*9zuwt$)Ovc=X-mr_4oo zb;wGRQ~AOlLzeVrs&eP;ais8@HMhQM%Yh57?}nK_cs&m9%3T*a4Vis6cU;dzQ9#}9 zUr@uM)*}U{zNnUgKW>t;5yPINhwr|ogq^V%!1{4~=66Tj0<36IhMGPYkX(svgfG5a zDo7_c^25^wJ|VX@xsa3c{V_ymm)8=ZRJ-d&nW&*EaV)kfV|x8qUwY)ogKE8S(!EqD zrq_mvL$do3gEy1qSon<|qsJZGQxOK?RF2T$C1cY z57CSZ;4+rIB+m0w%52e^ICulz?EThZ8eOJ|jK7s$RhE9YY6!+n*{C)6_36CUv0pyz zuE?#d(+r<9`7s*rDxS+b+fvxQuGm7030up+T{&=@{3Mxqul(ICWRaRg|3oMV( z=-)r7IG(>DedzKD>3Ym1Eiqb!lgGd^W6797Q8_ofg>AT$ymONqdTnE1kVr6Mba_H| zF*b4Z>dy~vaa&5lo*8Baf$T1JJJ?qLkJZS7Ei{kAI&(f8Ii^p5(>uVD&~29@B!;mSL3roL5qV>fp4Q9k|03t6HJUH$aoZ!?1jf z%xEHoHGPq;!Qz>EF4re_(f6Ar_nh)S*WNExmZtsD=Al#lz@-UmthmNwM$ta6SM8!y zQo&V#d|}i4Hk;lT!A3QC%MKTuDQsEw(m<>dY+1Y{b)O;g_Ia!Te$2A7?u|JylfQ} z(}1(!Wo&X4TXae(yWxKhfp`B%atwMfqR?vbex6E#bCffI9Md5KW|GdxjYrqbViT?h~o(Z(@pQiByP9akz!5zf%s=j(=lEw{2G zoProx0U-~oJ!q1g8Irvhh#?&h`*kwy_Nlz;Kr76McZiHC_p&DN^ntJcOG7V@hb~yr zzdv3&V=pp-tYAHt^E6^L$f2WFt$HnCDW(0<{+YrMn8wufiG1cEGyE4Au}Qa{0@K3t zJhAcX`Bi3ExA)Z<+maDfoS5(iBIFt@CHc%OuPovD#{I827FWhX>!rbE4evaEyNfN=(9;ZjuKhQ-Fo%tMR~$U9@h?dNN9m$B^qoZpOWH0p zu5!I*j;s_)*yQ(P>eyic6_0BdRxNdxrx@VJ9JiQp{X>^j-|Hf~mVPVDka|SOK1z#v zrm0|QIu(N2<6rHUbX%;z#FwI?3*{dM6RII=vNmsVj+UxyX*8mZ8^3Dl4HLsJ|59s< zWxmBn>QDS7D}$80jaepfKZqs2PSV4<_>;N$tn+;3LGUu!8~bhre(dnSy>IzERP~C6 z6zB$`!e{@#U2JF=wY+}V79Y?9AENKE=JAtMVbrj7cY2M-Iz2A*Jwy^JrY8?O_g zvD8=-PLH6J@Q=ll7G`7xrV{J_2I6ZxOh!L~DAczd`^`hmrRyTgl&{6wJ~u8#qg$U( zRpY*&(wjB5}+)KS(NZUW^{~N6^)8h1P|{bQInemsRI@Ce@s&4($mgQuGhSIG1~vozBH)TB^Y$ z!ScBCwQ~H4cW6WI99w0s*CcIlpF-kjFG!h|hGeTkPQQ_a-$a1-4*$MRZ`mVVP7Bj6(uOL$Uu zDf?5`&AKyfF7&a?<9bo|07)ik=&8Vb#kYr%eF}NIm)+@Dm+=9ihTvk6D|!BgcRzUa zn=a!Md#bmCi=44xq*~3?y0p`sSzb{(hi^nuIhDDk0W}5s4$kCZ0&hN-U++o3qoOEt zXqgR>$P#<7KqCpSml-6Sxb6AJF-~-XM;{kf1#S7|*dh(fV_9{02n%+1z-bhR%>dIG zf^De14keRSGz9kjecN{K>NhDI+{BW33NoLVBKNA~!|xPk{7DeDtoGq&_B*=XN8+`6 z_o-$WkFbC6T7D=uX=jncYxb*Gl`Z_VxI@BJmYS*8=(19a~)erm_thw{;ou`^h(2&}zj7*(?j(^LvFeXU@$p6KXNKVO zIKS}_X9JUY$vp{MXNdH|6F0GbO6j#qF&E)}x#<22mzB{0W;ZSkTC!dxK(60OX!Uks z!@hcL^>E>dpOi6CJIU)Hjtd{D+lgC_dQJ3&?k0%NdE&nPKUrBtCTit*E$+WzWL}(B zk;wJ~Qpw6(e5J>L^+-sDz*cXaLFQ$14VIv1NG&xfASDLKSugDcRCt|i?6OmamlGkw z?t+$dVp#EvdiOsWIKXs9mO2oo*spqjeNnxrHE+o3czi7&N9$=|>)$FH20L^}mb&dT zuCdS$rE)Vjgl*O9k%ct$V-BJlP4{Ieu zV8QVz?w@MNXK?G_|@iHrAR+d6{DrJgV&l-fqPymMQKwU@x=j>y?&g4CWnvtEt& zrWan6AUD*DJhZm#J;d=9vD-oO)DpLN?j#g=QVy4Yl$dl7Cp!?hht?^z;7}PvSaFNi zkYx==QK^RS)kbIfvbV@gHEygc(Mg^mYp0b{_q3Ijv2Go1Xt0qqVNZSXOW7q}q|?hA z)lfpnW7zq9A=a9AbB19AUIC(Pm9KOOE2JPY@Hspc7Q_Y!i6yna*=W5PSK!Inz~DZS zXm~Q-Kf`nrag{T;H~4N&f^iN+0`V`MuDvJp4F8?&T+{?kn+!;i_QzpuQpJb$8G%;5 zLHtfi2({bjdaBkYRWboGXwB@6$I&}d@P0Y@WF3BesMN7F!R&YPm(BUipzHfPBX>sa zfR0D3yc1FBS}4bTVF5xOp^z(VG70BKTJG=#H}p+M8^^4ViS6qsI9GCTW`XCRH%);i@rKfJm%vNBx?M_Y z+r6XWq`~R!4{GhXEm~dPR8ZHH9_(Rcn_MM*ofy27DCnC++PPEaAvqU8vjsgV6qgf% z9sY)>nb)r1G2;hr5&LRiT9fyo>)fv!iBr2|Q}Dbjy6+ZzX$hCo=E}<-eUl^%>mpag zZEm#EFa3<~KF~%W^HcAbu{?TW8WiFB(NTf2d#Q%>&BcRlsY*S|TOFg(`NAK*AV zf^MHf@@G4+@tXQK9r3SoC*7qSAT|di%VaT%6~#b?dECPQpM`xTC$ZVg7=T96hDcR< z(h87V&wR}!LRyG=iY9#Rx3+vn6sAd!$QN78LzrCO$Nr9tR$)X=kM$AEo=^+n)`4h- z4^QO6j-uYp?G7Llb%{DxYE*B-p*81(2X*rhf!b#;J%m1HL!aOid;Ptb-etx) z?0s+Ei{#}_RzVq8`TW94Z|tCv&ScX9&d98=-S3M!0=Gwtoq8RCnOCb8=WamPVcscR z|EK)b(zkpW#Nk;$k2At6@7#QGT*=$#W zqfs#ao;2k~o3gy7Vp>ZT7e{^USU4*pF+yD6&9y!vH%I8F4B#I#AopDXS9jF2{!ga=VL{4aB;T@NzS{SPsUX@8!mE<9uVWeXvGSU3=dl zQiHOfx|dJR!hf;Cp)tDqZ_VrW|KxsX2j0y&9c3@z^PAE5+pTcfT4%KmF?XH+QU{~| z7j@A63_JXnbvq!dQtFOY{S2HzCYtctp98Lx9xhk>y6Pq=c3d-$#cCz(`$%bbL~Ke7 zqLWDs2MFJgEQiC-@Uy41&+cvZinz>}KRE@Ks@aix>tL%mnNf`hX%-!#QlNR!Bzu|jV# zO#kWtq?p}&S4;5aXtPWsE~J`{i>VV=sy4PbYQ+y+oGmP3aQ8T*isz}@pv!C%|DX3E zB57Oa?USs6Hn3&JUc6?F5l{uzqnHo%%B#&&pkZvdtUm+)+UI1m;rzc3%ZVe@4qkg? z6xs#$3PD3sb(55AxaaQzo9ygzwZNho&X4<~;p&tgCS)IQOjth>>JDUsni$_pee`ra z<6m7?;+BV<4?0+XPbp4dJ7FQ!6X>8Vf2|p`#Y6Quoe937e{w&*v3N*I*~IE6m9)=+ z3uBSca`M};bp9FeVxIO79SxS?c}>#K#4@mD-iV2mj+>vGam=*<#c6-ln=?SM>7(z03rm8iUh^GFbaM+HU1ytE;-Y*dD)Q zLf>nx?bAe^-w3mtg{VJ!M>k}DKWPBEl#5Rm?Wt*IjiVY=njBOQElbv1fP(is@PTKk zcn#o!4)#9ost7LdevnPQJ6%ARWxU{_%`z#9--39p0^Co0&tD+7swJ6usCq8Vbm${b zmWXH&8BF?()qD>QMR{%ObB7ovdmpLmp6iID;x~-C_Bt)~evJ0cF@ef-d#w>VNB?!2N5}*I40P!f4Mp??5&J z8(yr;2k*Fm$c3c!_45C7MMt+abYkkLc3yg%tcoGs0S75(!lJni_vq7$kmxhrWnryvWQ%y>p=lxf455T<( zdaLCMLPaf%yR!$68#bY4$-Qp4GD!)hE#M$33;q=+b$6JNIm3aE<%ttxprL@>( zc|jR)o0Fs=ifVx9ToxUlR%|4-JMb56N)FCtS7N%8PuDwKbj zU^{ul3CB;NMh%Cm69-WiC;rXenP zKHXZ|{T>M7xxI;F(2yD*K~ly$o5Hf|u^6488^r5obF)HB=uLtyLUfep4d*sx1lsZ z=Qj@G4d+&O8OVH2pf%u!Tn7F+?36ao&u={1Oj+eOrQ#k|H?#2RDl;PYsx#AR&>=pJ zBr;oKL)V8vsMo|xOfpBf{0XX=@-mCS{gZ>126XYVE@G}D_ws=<5tO#@$@j*S+4y&Y z?!BY|O}`@p#5bp(=Jiz(r&_r6u@k_u)jmp?`TOqubV=WLfC)mdD2m>9EQJ85rfPf z`WcJw_$c#ES>`bwk5bHdGmnOR7Cjt~-orvH(9Mv~iEaS9ODv7M<|&?wi`hyTEo%Fx{Pgi zDXvVu6}1RL?exWM?5Jor??iXehp5qeiHnDWJDNOxzUrjd_t;@_fGvsm+FaatcV*|Z-H>3!F1y215f>OZT=9_%^w!~1f5zv9lf+P>iDTov>x1cH~)3!GN@@V5o?`sXf%J7 z*N_{mX-t_iz4y|b9XlT@C~>x=ci^FYjl=NO_<>gTko+g95lF;b%XBzlP^$LFU&^zQ zMo>YSoDzf{O4j= zU6d8Lz}{Bo{Kj0wmwqAyIO+puo3ESAZ3vvl7m3pVa_<`cQ0JC5T;10UZgX5#71Vw| z#ng5Fv+y}H^`P82&+LK8&CpJyglnGyytmEmmRytH)8mgfdz*SRkK=7RD}Uoob2By) zOOtJ+Mfa_7i`U}AWP1)d$BrnVmCkUaE>>%(7bkpOMen%`c>3yjtmEBAxM!fal}HP| z-f`7Km@LJ=OGq5>HWAzcRT0jeRP!S~kmsl@Us?<=n9ab19z!%FD*TXS(jYAp`^oCCW}Ce4PP-KC&E z_J^4zpgG|?U{aQ{97ahISN0!~jSc_lvY182mvnuT(=_JgPPAook*My9ww)v`aiP=r z?q$ULiIdSQ$&`6KoYQ|UZZWP88c?RR+gZey%;w%ewPx zp08Ng(oT2x9jF>rX{Kx3N>MkKlyWeaDwqkcP7=PFAg!s5ttRL*+Q zQz;ZQsyh&f)sehH&+TSX+^lfTA8jXZ_j~AM9*a52>yd8_@U;+k@wqbc8RZdI(E<0g zM+#as8=a`FV8%K6L=ptFr(-FmH?1XEz%0V}^UdX-<9UuSVd05FtKq>l)4=1fP6c%q zM0Kj4qz%a8{t+mMtn-scrfS^bqCK}VCCNfeMCAcOKpZx`zm9+mI_&(MGM8|DvbQTw zGom|?wfjWO?35pQ8^-ivtTIP_S$m!GB^YiTAUg8rA+~Iz_ze0&dC2)a-BUYjLaanF+>km0J2B+m}bQ=i1`h1DZsy%h(%azxsT$>)D2 zg)x4EWogXJ$7#@OA1fm{4BihnOE2d9^!D<%l)$d`h4d7Y8@RUKqnnVxRy-I@jY)j{P(K!aHh%cMR2nMYwaUh>2VYv{7zC9AA z@W2V$jgPn>rRvO`uFb*^G-{47>Zp2X#Wpaf)!Z1-;fK5w@j)T4`b0-RfVQORK`#p);?$1nehArH=((m^05pI1Jqt}?=7C>Y7%A1Z zKXF&91Rqi(dJep}veQu|zi)PRG{W!m)f9mTlCF$w;$1&9y&zjQq*S18S$upQYch80 z^nPMy?xj5_)}vFQXF1oa)uwYL@3(gSG^fzJtR;D!8(yStL0pVK;hV2Xo2SGoZ#4+W zhTk7!exa$B5AKlK8g~7jSxPG7oX#@A6WBE#lR-9Jr8v*VkBP}jN$e6EIT&i7n~qY z(S)rB3B5A&+dA+1US-ViE7|ynXV8P;nHu|>dUD3x^$`b$jWW$yO%(a zbh>Yej+OTUwSo?#yK0Pn390JB7$LWT%{{d|BOUWG=U5jqBqST~hhWgOueCX`l{Zqj zX}KL#TzRRe-dS1$hX&T&ivgt_}7G&p;@HPn`?o5MSoM-M`7K z&Z!=h2R)bmO^d7Kjnr2Yf7m&31CrOT`Sd-@ktL4PxIWJOR8*>d*yFpI$S)#XTCn@a zVwY0OPyI!N5C-hn`wOBkPIB_R%y1Fj%{a^N*oweSf8YzxaF%IQSw=(}=$pjgY!IX= z7Ts{W=* z0dZ%K2Mg)h(1ZY#&+grk_-rXi?ptnb=7Fe@pdrLDOM;#lT!=Zz+}H>Yq8@xZ?3cVc z4FV+1`-qZ+C3c7FKqm^}2R^NNga_*#Qc@0TfvVA#$;gb$d=oJrC(zSlg?=%(ojYfxLqtu3{H--tUYqWE3>q)_j)3lhbZXv-DW~~u9qF~ z#fPvQT5m5L`PH(pXYHCnIFP3-F$2+_nczVGm8IB{B)r%r`dkVeNS{UB!Lpw4Pu}&` zc^7_n*ht~%>YcsTEP5VT15P*b?$=`aEa1vyr>H3y*9OwVJx|(5??u-8Lg+i*OWY;w z`Hpbb<|%_&XmQZYg05p92csI>;ka1uneOisGboF*ABlk_h%o>%&#SY4ig)b~Ti~E> z9TyU^IbB8Sd_=w<#|c$Ko_)Ds1dbXT=;gQLcYMy!)_B!PS-sUsxE$agto0DPJutYd zX-Oqq_+g0XosZ!N8dpsg}E zCnZ={(aK0}NH=0lSm3PvM+o$MnDl!X9f-O8Hp#uLecu7*zCGX z9>d)8qfV17CXZL38l94Fuif6CO!3}8cr}-JmQ5__k3&ZoU?&7W$vt%YEb^9Q!WGYq z@N^iweiZjEPMO_Ldcid8Wzy2QjSG@)_wIS@ORwA{h_}x*wpCOQetSw3ZBc?02hegT6_(w`zPY9iq1W{#rO%Etnuz*6PZqC2y za=7+pta~c0@c3e+I~BBlzB9e9DsPFuuo6Ct_=SIc6XuwBPUf{QN5yd~ypx-fxbzXU ziS9>)A`@s(gd`#`iC9Rz4oQ_p$^4(Mtitb!0au2dA2dHF<-Oapyiv^I(TNSVJnr6r zk9>V@2y^$i_Y}G#DC1kDWlnHICRtk%r&*VJ0p?XcU`;cq@t8fF7b`%l_4FRqHUAfj zrj1rADWBuDexVuLw&+;w&^u*TxQ;7Ei{Tnr)^kB-v*opE5yYK^I}{lg*op$CS7%*? zJh*{AH|C*;rq7^Cr#5Gi4>w4WeTj{9S+9qm9DJ=^J?DVtA1^I_`R0{sYdV()17CN2 za7sQeq1NqZ*)L%VNt(3Jq-IqW|^c;g>)BgXwB~-${nn<|8M@ zxvL=|&&Eg_mSNE83U_B+sY-EHsgSeY@!<|h&0hg~*yXHXIQI5j&v}mi9WeGHu?B;- zr2)10ghk;QAi#gbX>T<}A!ghRD0{RoB7fV9!GenqaS)HEQvB+%nA!WkpBv{SxyW5H zHRj+d9IO+_0AF^QeHL#Gn&#LHgMH2O+NmkStNyCpkDapdD0|^@j@L=)i0wgqih;%% zR@?jB+-&e>JE*{U-X{>owvE3!#76thL00GRCNhBP=H#=&`DH?pe&R#c&VntGGgp(* z)KG9c18%IJH79v#bJyvEAgU%Bmov@d&z2JFgow|xL-zONMAC0CMtb#9M)tj;AdSYY zcoq?iZT>+89B9os(@!LlO5szDqg>SXO<4v4Z%M&k!!5P}7Z-b2jB2wdrF(Q`jF2kU zjN!Awi&hN3#eBlA;Qdz4=S`;AF%x+n09$}YFTGb#a%Zm4WUkNGF9fBos=p?cY3?-( zvi)4eebO9ZTUdG6C*vE#y&a&KU<&uo%U+>o}58@I{LQ;3?sZ1G2sHI{8TwQEEX^7j~uBoCTQk}Fs|A6zHhsTzMz7G z@nQ)&vG>M)7LeGkzi!j_HYz8P`K)kA(IxkVm2omQ!&)v+*UjK#phwVrtDTq96-enO zFE@->six_DN3fO{T)Ri-GR$zXN71T{_cxgNi9)j#OvgiU{w)^4MzVH0JH$y4c1*bQ zwF!DI62ZwhBo$5Em9p{e=Vo9&f(3hCgEA!m7p56S_bjeUNi*mW8gkmg11Xw$$~Q4< zp0uxalB<~sfty{m&GUMS4)7nU2AOM_mO?{(TK&PBtA#VQ`ke|hC)GqUFDOrlU)hjx zkm(N0>F+lVK<@|3hV6OKcH@DTS&O%y$F5C-PJgKeGr>yYlla$&5r}MVY?6)5-F2g^ z?;kEl!2AB=j_1F#*WJnQ{YuP$z`>W*sT8|`IHO5lLg+}2feSvcaFQdDD~qpKB$HmM z_k)Zt8R13wUfowW8whN>+scA@L5;cC-3eu%h?>i#_b1*`^5;(XF)ZJ$(Z*q%w<&;{ z{YpYeZ!f<_QG}8g8T12vzHDex-&9L$kUE{$NKsSkooAYz#@;-P>dUtZ*T70Ghs5Fq&wuCB=LFc9|4U@SiVx|4#XO z*#-&{Tjf>0`cr_Tiv!6tGD;LN6nMYxKH~hsah(=?{d#U%Rqs#r-R#yV6S06aa9|+A z=7R*^63^#WO87yq=+-qD=LcEfi^6(`(2lja-sp|Q*}eByWXtqkR*LZH*KM-BEBv0& zz|IWZ3kd_f@#vA!==)WMH{-h4*0T{r&C(t7@~^d6#SH^O9eNM|)y@}N{Yi~5dh_wa z_!Be#q`K_1y?QX|Dw4X1xtxN;{npRLPwV!EoQ19UG-X5H=_F+3cOHL>lC(LIK8)(X zk(vDh68-z0$z)f&?4lq0swku!Kh?u$u2G$DSw!-{LFcC=1dv0`#lC86;M5GSUZ1pT z?g^=UGWgq~NGxUtI*;3)7KA#}zl^}7@TG{2OQW?i*E&%mw;zb+z+QOx;(b>_8DmLH zk}m2_8$KTqBG*aGFIGSh#m+tc<9A>FC=mwzWW9L9P80BK$awBxDkkI+4kTx1gosHg zF@l1W1#jLKu$A$%=(xqfxqA#q*dk^Z)j}o+y7gVypiin^sS(b66cXlXeEPi*>?Xrk1*Ut@R1F-E%UMp&M5rvb2`fSD+ROZdKSbtZMzPfPj;>pSOM^H<^Cr zSbrf2OC6jmc@%|M0$t3uYBhw0rCV4KEd;rKy}QpS0+)0#GtC^{CbG5n63{)+<~iCB zyJ-x2irxJA=zi@k50P}kwjewb8482`D{L4j=Ti#Y80{UNlL^41y-leCNuk$q`%lC> zf2=%A(ORcF!9BwP9ZfF?&7vA^8@MZgd-J%0XU-mmo!kVWg)psi1oXhr5EdSZ^)6g0| zB>y|p#K7KY@V%0uQ8`-s1+q;t;>5@G7w^ed>;YjAlXcvBsEynQbyV|MRatG4M4|di zP_FkFDU(WPC4&pgaM1!$#TLz&u6=6L25I)H@ygbASI|vJH|yEAPQORV0_3W?g4dFr zw9Te2FSQHL{O(7aRKh2;V!5vd_;IKu6K5+)SE&)8iGpmx3AP{E$HgSW5sW82QQ75x z)*{xTkp7>{8`4RDPUHk$eduBy{@4qTi`Ks)mf#3;fqkLN=Ue-HmHvp1YG&<*9}-e) zDZv5arApghEA!W55Ej1_J&CuVqSCZ1J^XMRn#5SsoJHYZ2bDjUV}0F!up1D6@{}HI z&;y^Y;!xAEJv9P8fFwD`-$7V0$q3fRo6Xi;Oi9V79k; z8h>kR(2D4L7}8H1xW^_2hd6>wk=T3rXv)ut7`7DmwM&48v`*xUec_2e)xbz|7c3?r zf4nl^W})2d%zt7`w{yKK=!@j)gyi{!OwfzxTU?f&+PWi)swq6mW-Rka|NGyB^3AgZwFQ78Me&OR+kXkqd=%7QckcR{x3N_ zVSZE2c(KDLHg^AQ;4kHogg*t~CWChS|MxrVuE44^hodKVrma!;W&WS%BRWyD4$aYl zL8!m~_j`>clqJwN8;eSaN#0YHxu+_7SM;6;a38X`$p86X;~SH}-IMpoaDdNsUNRR4 z{=u=;P*cX-M~QEIIuC5Y_f%B{h9rU*ftQ+sepgiXqBdeCCxX&|pI?CF=$*f#HU@az zbp(NK27y2~Zh>e!bZ&w`P!Rfl#M#}2Ky%8OQ)z@CVxL**W zO|gE>0etBH1cy4G{Qukr{J&QF!6Vcy)&Bz-cOq~7k4?aTb8b)ohWVd>alUwkvef?o z_p=+Q75N_!!RM?1|Br2eH6F6wCH~*Gf;6%4UHD-^e|BepnHF*P z&{*jxB%&9y?|bpA!oEM9OXFqcdy z9s)uXIQYyO-DW;I#G^h^z(fq#pVI`e04OgSaTSguMZocKwgdz7 zWb&osV@O#PfhVq((u+SC$`QREkO>0yH2H0fmuqBGoB*@jJeS&)!D#%K6+gexDF%jP z`lVI$90j($n$$Z(q7Zl1vjohPYg!8DFm3i)1`HMd{&6KRtweH07t3i7b?7=p0*BNq zz&BIb?#B?ZNKvj5Ihm045u z?l06TfIzHuW@!6V#sj15jH=CL*#pr4PKPO9Kns`~7jn9<(x`@l39t@gxvLb` z3p_g&mxPgbgWuf^1$#AOR$8N57r+$0)89*W*Da$cJSyFp1_sWBTl{%Dnysvhd>ETu!+=0No%12^CvF3n%i{Q*QIx!U z1RG>bSWRZ~POn@&i;w(s3kno_OTZMDt4rmF8QfZV67P0-{{@MGw8wn2_bQI=a{_8U zg9=uP&q%o`Ju^EWLjs=CK z7bxde*2)J)>eb)Y#k@qL{>gBjr0W!`=)cIVf2SNz!KI!_MyNr`BGPzK*59ueA&19z!C~uhb?# z`Hfzhk7YMNcIxO9gEF58iKTP1(^#oWB2E0}!aNFbIHb&wAcQp#9YF2?<_b<%TWHi{ zoRy-%W1$83Q5o=cU_tB7RzIU7ine|RU>qpB}@_0k~VrZmd9Akc#x zG*h&hTn7uIfuW@mVDcuDoN~P#Fl|XbfDD*)0)YGklPxzAIb=}C`2~y=24({*#pj`- z)>)t3-&SE`8s!H-3@GcOp^W0U(6f)rdm+G>l&4R7+AcBvn)2X_sMZ=B1?!9db`o4t zXedvhQ*ujCJBCInSCh+K(Ge(kQY5+GI^Ua$TmQp1HSnwS+4-> z+%@`u2?VOIz`UD{56Jz%62whT4HqOh zDgxqCNq*4$FTb7n7dZ9y%C>u3w4gbdVKMxkCnrP5{|Z;9wAu7rrwb&?9cf37BCFz1 zz?;$SVKGvjrlvsQ-fJm>OeQW+H|~G*m%uzabt6lzLowNyU%ut1Jet{JRS5Gif+5if zA6bP7(+bo zTSTF#?>h=Y8`Dfcu7iJ#Qbw=s7Nu@$z#fqE)cyr-LhFi&a7~$fxYzqQ1MLeJ;fP_l#&CzF! znlBr2>hVuIl%i$GD3lkScFq4-Vm~O5LJ7p9C#4wH%=u3$mJWCDMuVJx#;!EqDI4H< zfV3!vbI>X5uaXr;JoPGpQz@aTD6!B-zUukklGy5jGYksG#vvjb@f~!$PiWd8)VL}H zGG-YVlHNS)f{q;{D;gABdf16_O<+$|eAl$F-qB)C5Vc z0-jnAwJ#dq$rWHYlUP<#nJI|Q`1?K4^s)Q~e92y!$ywJ|O$FoqKN zMGE|;$HN#G^Ijt1Nl&H|we5~0FO_t1yLkfzvVSSDH1ZBQHS?=YV$4O3aj9@+jDSje z;FM9wifuhCQ*wf#ZORef$UHZ+h$+Dy!z7_QlPIzmG>seZz(|ZzF?;l33JWXhV0g?n z=o}O0i9b=(9RZcEJ=u<40LpT-ggsWqq&%=LFqq28slw@b8|IYa2J(6q0bLB0>_n1) zKrdM_`=N|?nSW-DlHRmJoZBeMOkr{W0^v@kvThJDA4-avV`Y10J`F*EG8ye$X&=i_ zLW+zitNj{Nl&E|YtwN${YAFumA-4`7M%;5Kb^Rq|wcP^!_K-Tg<9|iW09t*?5_Rlj z)G)1dK>$h}ZECagpmABeS?Q#x)P~-{Y1|a>T)%)l)0q%jnA`#J3dX!e75C7hl~oQH zvkdImLGA5tl(g=Mn69bstm>r58y%o#3_i!uK5beV8q4Z}8?*n*5~eg%D7?19KSGr- zLKf_N7zt#rMj!H0Y6<_6(vX- z-6=nSE(JE&n>&!DMnfVvcIuWQQy3BW00DchQ}c$(5h4eA6M(KU-(_bO%$rT-js zXXZS?YZ?H9R#y$bnAb&n4+8#y2HBCBB^oQi5ona6WIyr%RUE#^VFM~}n7a4QJ5(yn z6?90jGtCVK|6JXW9SnkcE32ZAFqK>2bPW_5fN#@>FJQvN8Yv1g zE)qnSzbcRo0@nF)+JDCpjjHrK=8Yj6XLZ0FZ=g;!M$vFi$u}MlG%F8P+{RPJ|0_mI zQTkujC%OV%G*V|UF+m+xE%(qlc!M}C9|eXnR8dtRdp{FZ_kH&1PoV(8e9SRatBmHW zMP)WLlz*UW*IT+MRrzG-!7)$+0*651fT>-TQALKhV~SJ55t@lv68GLbNMlz?pgKt9 z$LJ|1bfM}&RrLUqN#CMp(fS2638WB3Qj1 zr8fDE5~3ykmAkJ1GhYkwp^)H&s&QjUd3^j);Chdi-Y3fZ>*#Jr^9v`;PAKASF)aaw zu~&CdB_AiB$u@JuYMuzX;wx67{7)_NpV|+_@zd3U+=nsfwhCD(rmjhLLf7OTTmz_P z#O_S|ziMhGgdX-0la1q6Z&sQ$pxS>Wc7tqf1&H%K!8*Fw%}k7p;MJdFACmJDKSAfPTW1K8mCcR&MHI)Gnv#9u^3? z{hw+VT`LbOtEm4AhJT8l6N^C)Llczc7?I5Gt(A@LVQ36_AE=LGqST@uB7-R+<1p1X zM=7TMN$TrIA>Qe0^D7WIpo2hQL_N@Mi0j4VibAJ4AkCu@gYit$ zl>|sb-ISQCI3<;`z07~SqZkED0`u25%X1qX~?IgNSk@ySay0lqy1XR3_ zUfltA)nH8cE&dSAW0nV@7_MXsslhhpRk{NJfq=ahU`M}HdP72xfx zqW6Fq<&r=@5Ck(J;Cv_8sIlM}83e1Qj+a;TAv5uX*l5gN9e9%#5PZ9FuFpca6pO6jiG}j#U}32A3$peNU99s z7WOD`j{R%O6#-p7l<(Pjhz>-e(Y-04_ZpSa;xMU2>gcy8$Q4%Q@1NV+u=$@fitbgV z!CZi>dIpg==;<2L$`ZjPZ|Q0hVlm_- zz(avm9bkSSt!tiMA=`O8Hm)w^yTNMNlbfZV38jLdebY2?Z=<= zt*QKNHL4}k8lZI@tSuoPJ)-2tFX6pn?&iHN88cP1@%%`Br#rs5WdO*$jcz7Kz=hY4 zGr8v-o-sja#O*Me1l?6OK!IuuL(D=e*BHL|mMpBOh-TH*-h+<2bwINU=#|EITbZE| zd=7@?VM-M97#3`(4c*cz&Z<0g%f=kn7rwLgj}DVKAT@?1XxY>Ua2W+QXNB`5x&`r6 z+2GZkXIM80`ciN{e8UjwgL+KnA^Y5nLL9X&s=FI@E;R-`TLc(6+(GG&7H!{GuI(@l z33Yo<6m&8nC}Q!>6m3EGRvNVmWCAdWNg0!Tig$k5G zRm)}jx4cunVfZ!X;G5&@&`q5b>Z~wZvl3hoOpggw>!fk~9clfH0$1ocq^`#W)2kfo zguTFsuY(*jrhnCDT|`6`cf|t6tCdlWY{c^YAtk`Afc`Sj#(%-|#ioaOX$jTQU63!u z&>E=L?`E627Oy>j87Yq{fhdt&!fti}`}!pfMY7_lxUr1;PE!Nxp_Bg@|MCDhIipBjU`hEiP^ zdIEtakExyDs$7q+JGyCpz9)UTdG?n9$OG0=1Wu8ro{T`)BDlQMAM1!BVBGx|Nm#l2s$M%e&EIMP)cb9f3tnWUt~U}KhjKJ zTpEN{^n;19sgyuRmRGklI!@zD33rI+mOkZoDlSwD9AG-=al?rmPVysu^p_o~;p44RPC&rDQ28DN#}~QwYVR?9BJNu5;=A+5Y_f z^E?0C_v5a6jB9zFbDq!Vd7kGVd+q}~v3<7s^_=y=k{gnxhjZ8T0G9IV{m2~*Bzk8! z{`rB^;0iN+GJ&rlv~ZzxxTAmpSosz&dI&l-qknFenh^`BL!qCB%;!5lpkYgHmtYoW z|MS4agMX`jJ{(O)_Y(p-bXIwLjb(SNWN9@9aD7nnb7%_mw*84AbMW1Z_N_;*@XQc@Swx5W2 z1886U+_|IYdh{ep=4W&zJ95kLBelj>HIx-{YkU?XH(#=?hJ);bKsJ0Mu#)k?i4Yn`a;po9L>$>K zFJv+GkC(ApF@_rabofBNxw0qA2`Xz5eMY#lPHmT=Ez&?F9%PX2DPW*z_Eox)T?q<` zBiCWM2ZnW_LH?-I4vrldbx-7L_dL^%%{Z-s@x^N)^1SG={mn3{wIRlZDZ;6?Nnvx>!g9L@pf zK?zI0kDPLsI>I=!0li<*kog=dzaAm543R6JX5)IF&(cAor2`Esa(hQw#4nV3G0kiY z)pB@}z)D5Y)_e;$&NM(zj#V|#Gbfha{9|KuG1aOuKqfC`Y0t8EyJGT{9gpsp&tudG zH#A}~%2q>K5F|~S#iPA%rSAd%_FU8kA8E{p5nb0+ej~p96oBSRpr3@}vv|UA_=K!pwCU(n;1lB7ir?Gwj)e8-Z8n;k8~W_t-{j($p^L%= zXMRZD(O5JI{Xv}M3h|p(@+T`A)S4`SMQk{y6;jn#e-ARC(mZj}kNEZ%UtjVtRK4_V zVzr-p&~W}7+Hq8w*TZggPh8e9sWgMU;I+uQ5fs2Wvj2_`RO{4-Zw%4wDy$&D;n7aK zLi9Ke4H{Dgx%sawD529mlUMS7?x_LXl}tv7H>CPZ4s+URl)2Og5P=5DE;z&9}gv~&@KRi zNrTZD@0;QPzZJ|+*iLPi&?0%%B@9;|(ZB&x=|AC-c~Gp#n#*$|Z+@m#&B*$zIdk(+ ziSK0xLTe|IxkSkx1H%R4?AX^07-{laiWh2+4>lXqA(4L|Unqq}{9FCRPn4te{v>Tq zsCEsl?z(s(50EYyP2f_fIL$5X#}n4gGPkY~%IDqB47_jROU-1l9|Niju&p&`<9WdUi z>tPFTNZ0Lm?DWHF9Op#M0yk}I+m^teC_(Zii&J%Lh{C1(IPkdRwX9>u;LB92x0wYy z5b}wSkbc)LC-J8&4iLD_2bC6cwE;WBsh{UIO0vs0T05W%d|!pneq~1`W+oulM@J5| z+zMV|&7f}BBITzan@m-is0B!a`A>F7&4`Or;`mG<`quG@Pyr&-l=l0UVDO%+rM};9 zp}mI#&nO;~BNRW2F?oQ|@&wv00EoA=0gj`LJYW7ELppSXVM1P#3wZ#~uU`W-01a7< zfj~zTmEJ6?&FjtW9jL4vySV5)5Ff;bX@|_=Oec+ZA6EIViZgqmmTQi6;vRDnW^kS@ zBg5^N3*KVC%1EN;iTY%Svo%(gJm09Lc`jtFEz0*Ex`(hi)>pzZ`Y%mtKj|t3Zh)yG zMEdr6I>^ISLw5zV7n$2{d1JlPL6z3rGR>s9O@C~swI>12+~Tc$PsD=SZZ$&bk?Py8 zyrgl0b8HjqQBmw8yX-&gblF6T&aDz1RdnQuQkB-<&wkj`vs8-ftxUR0&f_R*k7~}CxNuO*Qvb;9NXz`fyLpzQ2 zKSx?+9|dV0#)8e!h63h>!i5=t6rO)>x$@kb{an`Loya!n7@Up$97^_ip%{Sy5Rvpe zwIeH%x?Vy?716K0a8Cj5Ox}EL)h<7ts|q4s?vDnePyPt)d7`cKXTlkST81JfZUP^1 z`^P@&9XNID$nCtI`smsi1l>KlUnCeSJ=kPQP?d%Y!<=fUZUBRAO zGvq+{w`9u1t*C>dRJQfA>~g!1#e#zQVd}2>r=XE^tz15~z-zUlVQMM$B|$gQ>hzAH z570%CHa!Efo?PPlHDaY87So0OZ)%O_&cp_yQZjZCe+Sy$e@;gZP9s_N)+uygy8eT9VC=UHegY^;P zhDV-;y&a7BlYDB()Nc`2TrC>9ZK%xXQ_Zw@tQ2_D_ZMn2)m06ZfvE>(s!G`bt$YhC95gy$$p+9Z3oF*!ET8TP!7cti|b|9 zqp`bWrRD-XdK-|Jy(L1-#Jy0K+1vdwFlh3-De>o!P}fimCOA2?u^DJQTKjUR zwbxegu0%sLc4{I6z{chn6O>6rcrhv{Y_!-_kI)F7_2E9fN2WQL5gXAG3S8@ykqj z<^5fP-3#|~z23|E$t!}K4HTc_SoDYc^kB%nlf(Lahofhq-Q+I9YHLieA`(=7IqGCWt5c>5{hvyj(=+{imxdt)2(r}N31QBYb#zFQ z^5*u07KE4%l+J;6lt6syHWP4LHDtae!5z6tyte^2@A+j_mdck|I65V4y=SYhRJM`V zL%rK&(lX}u>!_3^Q7zb=Dagu=Y@JbF;XH9#-$3g43fl)R=mSjp=6-(iK^by8G<3g3 zOllY4a5QgE!OuEq;2yZOD)#W_9%!h&WwxN<&*q^o~4^|K(OQT0# z*fj>ZwRKg*u(kb_{Iu2Lvl=JlOByl$lFSJz7(VWG-)n88a#R3~AL#+32+`^{lD6NC z_R9vE-{gKbK2uk@4N8=N>TEVOUK}WDRLa354 zAQVA}7T?^?k+hz4aac|E^tE?n(=3dMd@Myo;)b-wf@+F>C;rT=>^pp-Hmv5s8%Mza zK!a1yP3S2B`?{Ao`6A~BgU4Bca$o|EnM3}TlqSZZ`+nbQHhc3H5Q`WOBA>&TQIylh zRCR|GRod=GHeE&-OGM6@gtPy70Cve@Km5RrBVmd|$4{VVnz!sR(YMjg3>M4iqFRz9()kqhAe=cSo|_fAZ`7X)`3aSEi(-^kS^Cr?s zp|3&dOUoul+xvbY#}jp4Nkn#_hZ)7~1S<#_6Qo$QBD8~6<>*|0X~r^f=Z>8*4Wf;Y z>UlO9%jG_j<{*+w6hcCm)Ea(I`_5Jv6_0t1Wig`s%1o_#2 zL^qrx&1d7sno>-fv2<0vTR}KowUXBZ)lFLDMzQS`*xX6CB%a&N)m#d)=^Du-y!EYZ zbs!T;@Q;^nh7uz>lS;J55$Pso!`WM?1&M@Es-5rS4_56 z)SZt-V-*>`;K6oab0oHG7Q=#_%rPnPXKv(AI`yuad;bCj&Jr>9^{ar$TXjkWrXKVwt`d2g_zF3> zJ}ih&fEW1CRv#r_=lA_{UXd@{tLq4F!se&?GsEULX?eWX^wc#i{XJ$;aNZ^F z*WQrto0shvU;JdU7`a8j!C04A4MC4`a3VB$UFk~XMQT7^q%;4Hv(s&-)qRxgBsx_x znxb=}`>*ijo~qLB$rAx$|3c`!CSU`v4uCH0x?~R9rbS)UUVKETGqCCYfc3qDP}G$L zp3Jk}_L$SKdOl6Bg%Pg33yp<5NC%;D`>21Q{$s#vlnsBKmR(#RPJz-*aG{(627O~2 zBz@0WK0y#C-%ww~BuK?;TCeU}74p=Q=xhDvL4{l%<-jaZ5*?$h6dnz4uX{%KdIG4K zctM_){EPh>t3zW4AcKhM`sCM!eX1RTBiHzIXg_x}yqXp=|KK7i5@3Wk47gkz7N-$( z0;>k$9CUSN@4GiS^Hj{Zv2yoU)~=B|sH*tH8&XKCpZvCpqs{O`OxrQK>1JfJ8OYU* z>R3#xz}flAgl&2fplK1Bqh*6eJ4OL|w`-C) zsqzASUS={UmdM+ANM?o&M0}rq{N~h91|(RGzK&gptP;_+OXF1jMy<0y42Sy*Y2UOD z-Rr*tRW}LH6$u=IH~I?VS6=`o1pPpbM1r%>u8u(cfssx16cVxjTyE-8wa$q+V%8}8 z!o{WnNQtF&L-o}eBaMQJm;JG*)bs3b_ikjdNTqTauOafp9X#j! zvAt(+RDaRagm&K(%6ifLXW&xGu(e~CYU_Gz5`qVM=!%gbB&{n_YAhay$2aga$BBjOe;} z@Gmd08h~M8{aqK-s&*k@9fn$ud}fXqD1SORk96-BCTc4eABfTl`J7eOXc3R833eEe z+i7C@`A`6g=zHbMjT6Ik{9N^s4s>PEj8;u9c2HTegUyXfo5F%I=x^-KryD~n#2mR%XfZW&`*X6DuwU=_3X_SH8K+I;^J*ZV`>>U8 z>FHQ;A2%b$4mq8xb_a-kohObusQo$T#RywPXnxZ;hO0XcuTpHI1IAnNI~jgb|i!F^1O?vU1A?-*6ti>l(5Ck)X`9u+F9Oub#J7CM%i< zOkgOLjy^fq8~L<72gdI#I%7f1QZR(4Y;(>2!DfL4rS;MMC(dG+gGc=2tajYt&9f7> z=p@CVy9yDN#r31D_lRdnRd~TecK}%`vmX}^%(0T~p6vNNAG1ZrgxwzqY$vOBSLvVB zP$pNV{OP(a&Msro)+WZT9YlFUpi;fKinqIRJ)IcUdFvfOy!t zzzsr8FMGroGTtZ7t$oWE6_C4n1d+2}5zUmVQ`Q$R&)ppDfIp8U0Ozyh-!59(yF> zG`~ccw|QextSgetpH%RTm2s9XV<=h(M-B;{F1RimIqZJWv^;)ilF&}1c7LYa*-l#Y zRJZV>bhLf^{P;(o+PU$Yflld<1!CWc99bAIn$pQE(ne)+tR~l4DF1Ac2gUE=o~W6q z*up{X6!BF!-X!fOn==^{bJhM!KFx6YV>I#49_zH)d5i&>D4@zz(!_o*k~;F4|IggfeE3-^KVmIO*ig<@2cR zJTkv@k~A;e=Tr@M?96TK3>u7ZkXEI_Y>%iEiK z5t@R?s>~np^qdP$HcQ-@G33PAy0^36?n%$p^Js9X=r%Ki;GMOe3lcihHm#nkij;Bv z=fn`2Y}tgsF_0+U3%eCrdbTQU8KPX$GG*i zIK0GdV>=m~W29E}%nqT+kw7@1O4s@B*%@SuH!3MPvfoE1@$~#%s~yOP?ICDjgF839 zYh@5H;!JwxuNC_9HKW=qoSW8E9)79jKc#6Jpm%+%|YD_|_{YF`ae4a|is&6B!&tSdzkV@X`T|*$<@z+ty=sqrfNqL}{GL(XjmOvDOvS-YC_E2*{f36D)vv}5mgG{Jm%Ejq zq!H%^4fGpM*eC8UP}FGk{rJU`R)k|dxwU3Y-mNt*rURsBpsF^xo!BR5Zr|My793Jj zM_A75_*~@UBwoHtm-6u7ib#VJ3``PD{yC9hhKfncPOgsYQgrm+@rzyGfQ>$?uh&Wq zf9eJ73Tna!VViM zE%hkkXdA2DdSfmgEY)pZ6Wb{587ka)xbFgcm%q}t3eN(HP7#7=S+cZ8mSz;b-WB_` zeutC5lZ044Q6(D$IZG~Y$&s<#ckR`OLPy)3#+fR| zPdABXz8{TnI(9;Aurf@n<8z&CneUcsC8t@`??`j^++*{BHH6K!&1(OYj8DCgMIMib zB+bIDM;yq}K08*|(XKi0J%o-auDV>vWJ2A&Aly=CQJTh9KsOc1I%-V(euQQI`-*p!%+5qRjW+@gP44_*wbK|-;7r+ziwFf-JIXElC6w)+ zvXt^F8o0{`)p2+yEXICVPBhVf-ea(SN84)kv!%k-or`HkqS7t>pyS4i-O8gV6uf{aTY$gyd~WY zSK&}*V@_onP3dG*0@xmBGZDhZ)^5MM`BhrvHZb&AC zRLU3F*`9ck!oixqfw(}Of+ax?rmycGa@CST0DRWSB2$;foln}j2IkLs{;4}O!Ts5i zH#bC2=wpO<-`)FlVrO$TrD}l$UN{|y^vug$=KYi!Uid87>+5v!C4e3?09Cl}=P#bc()4zU;Ko zngW{^k@u78wt%9wIB#`z*EYRR^Q_Xv$1#ddg>zQot;{8K0s>KZUzcR~rwq*|G>mI^ zychZybT_}%G)PZ)#MFfP0;Jn+p>qJ6%G+&i3b*el#!2OI_Afudu#qE@tuIwq6_k!- z7d=Z|*Wi~NbU1_)ka)UVbwWM!Jz7o%DKzpbrKvZE-GQ?<=tW^C;~Amz@~l!(bieVv zo~M(=B{S()gxr)$uLofR^bZVvujEBz0~`tI^+6Fuwjb56%xvyE{F80ssWd9!wi+&p zC_C9mSgwQD$}An)MOWF?J?>GS4Ojtjo{OCvY<=dQsL_)!vE>N_%gO|Dpvz9{A>F;m zS#E7o2Z$wLh&XcMA&=;MBZv_pqoq z^_A5FLKs;&>g1jqL{&=5Hj7>n8<1j0vRnI?A9R0S5Z}NmDLr)ljiyeaJvyGH>Pa#( z&9LdMt%ak`5H0wS+bU6Ul)IezMWnJjHPU|nIneBru=ai2_15`IXe^1th6k3mp;anU zs?rQCifukNd%5+7A3??nLE$a{6Z_9hmD)8e(rdTPhXPN}CISCn?XGeLKKhnh{!|cy(@amYw6;%Z$9uc-wr(Gc@w~DYI&~(+VdREP2RrS=AM_O7nITd6 zd8hSNF*p2KZ8*pC^GkiYLg44{{>-R@_gLaTALW&tO*=3=feI+3L580c_#$keQf*)Z z<$ycy0iCV*Xbp1;U~c)oMaG^Lr-fQz1nel%Dqyoa>GNaV#rs7+jch4*h)+MUGEr}W zL@de({LUo!9J|Y(Gs&#C`9ui9_^a|{=T>Fnaz>gIjM>-oY~-{MBk;l(AN@~%hUthh z-2q<`B1Ts1SzZ{wZD-AsR$_0|Iqi;JHEU-6@o->|%wgUEwPKm;UPSsB{|5A#zDI}? z3V^SgG$`Odv|TJk67SAon3Ho&`@)X%Il0YSg$>e9d=L)VR|g`TOEw420)qQ&#^H+M zvu3BPjr^wSXYPGPM^rYMlSnhor(ou7j_vi`M!&?!DLV8SxaEi9=dXny{ z)*HYbX5_~1#c#EL+LLo)A_(IYF8|(dX%@ij4*tIDBY$4Fwms1;(z>r3k8>MI|tD<4R8|ZV&(auQ+cDmRMLcnv083Wa9UQK znoQt^JtrxVUImYLfb3H|EUZ59A=1A6I=4ggMXVfxvU6^B#5}TF-A_Px+aoXc;w?Rs zaC{fi9}_w(ui6$P}@BU%;-15ySA~0>{80|3CHe-XxQNA7CvJI?W0O1lxf7ly7cXg~3 z`zHih1PG%PMh=rvK=G4cm^E)6xvJzwqQ0Al#uMUs_1-e5jfFX_Vr#V9n(+B_b_Gb( zcFgK%>-^&Bgx}3`cFqdYGOelc?7EDK1#T_e3ea!Y*;YaO$^>7SQ8*FAe$4rWo#CPc z$Jv0FYT9N+tD|^3Rl4d}g|{flO?#batKa^)WMyZt+Ji9)Cq_%mtKazSth6Z>?BH%p z<^G62wn*7-ng&Q2J!9*4oT2*ccAYz9|SC@i3||6%TRn^zVu{X+36TcLM=2Gi+M zRSZ#S?4X9icx{ zG!z_L@f{E@8wWG-I->Z)9Yx;x&PJPT??)PK+g@|wm||6ruQh!%d=oswo%M#h=fg5w zRDTDw>gs}sd$mp|-rz4x4F_gemyEJ=aA0IM$d`CL*@Nevcg}jJMd@ZC8{^qQ*~888 zRno~DHrUz+(y5$R;)Rcytd!C(tRvtmFgf$rRp9vCDM>fmK;|`qr|~(b!%9~gckS)j z;`yY%93;E9DvF-;w@?_5T^J>&=bI=YOk`7<|D`bkQZZKDzL_)e9vm#EyOkp z?0|P4Q@=E`S&@H0`s4?7H-GTXkf{U+E4uug&I5|ism;~Tmu@pz_WEUe256*dn6*i> zFoo+Iua?ekJHx^gjJL`g@R}i#v`k6?=GyC5tOwT@X}ren9UMSIVaB2%^JkBqgXtHB zWRm$e!YZeS4TPcGx?L>~c?j#oCM)XXtwLCy(CZ2}5gK#8PwkUgca@7u;!!o(F#uEv z>9VR0rJtbh-S(7r6txIaKb2*p;+l7)=;!5I-pFBd#ZYv}>6(Oub*S4FJKoj&oO7oe zc%?D}!+!C60<10D`NG9m0%B``WQ@y`6Cm>wAr4OZVO~@l_P#*o@RuOa#K=>#mM#7; z6&%r&n>z5Vhu@iNu*N6kd%?0d>0AkyYsElYxrGcv336JBuipXW98r7Rw@?F8*mGZ-PgAPf_&F;&RT3{3_Gt7rnv37PeVoBRSfMXm zZdDCGp}{XQyV0?+l_DC(vgmU)GaKJ;JM|B*^-m%|4Glr!oLys8 zyqvYxUAFj5iMm4_E0DVk*v98{qeR z%|iO2c-DYs)4AmR*D<{e)4sXZ{!E7rky@?w@rcM}7O6bZl2Q{ZDgF3a70l)ncxxD# z5i8ccY5z_}j9bMB{Y^9FA0!Fs@)#R>ZOT;`j21x#Ng9Op8N!IZbZZhwo})WS3e7P4 zEjP~r^4MIsl$kzhUEQXjb(UpeeT_DEOU~tajA73Lzh>zZk~%W?j^@jrhZDMdxO%b6 zn!(Et>BG>ZMHBxoUo>oqH#x`-q2h>f{XB$7XeCm};-yY*po(df!ZI zuV}f?v7AHJX31f-WAj!d;8zG){GFD7kE zjJ@)O&01^T4nZ0ECsy7=_P~d>hR-nAn5Qrp9!<|vzP5s+?R-36WC!xOi}Dn}J*-$a zI%IavTK+w&R??v>IsQ^Z*}Ju=)ZWrP+R-DK#3Mwa+G zLPTL?dvgyHacFcPV?z=Kf|ZmqeQ_%QZS<&oI24$YeF zjOek!J?=$elOYz$YqJ#awtrG5kN-aM<1Zf%e1yo>lJI&~gCjLnQAZh@t?c+E)=pBM zn_67DJ$87&RW5k#({o~8YmdL!^*KMmxnblS43fu9O!*=8j&UVcI|Z=y&9=KEV_vzr zi3W#+RSCAU^KO;B#~6WOqbo=j^5WykrQ;p&IHbX&oJ6cWO z8Gdo?-XU6Q9_OS``iD@lBz!N3YbuzBDMF#*om?-Jk zodS1b>qOw4KisN29Jdqv_SkD%Z684|eWUF5hwq{*h3Y~WQYBY{kDu{5^M~8X-?A&` zqun+8wRf-jAbv#dH;|LvTk>wg^@b=;hAl`sHydin@2ph*3Tm27bD69}X#Y#^xhpp@ z=8Tm=C9{4IhMQ<1SddP58zBgPSO#h(__N!#B(-dZL-8Y!4Bn88{+K=44izzr&TRW#ZEl^6nv{)WsuU+_zsqW55W5=S zHc<5;$o&z;Y^MyrVl#Or_)sN{5?wg-4w0@!KJ9vCQ5qV$1~cB-JRb_W9uJn6^TCo% z-OO(tx*j=FbQs*Q8~^7@{hq{m@*_dK8p0UExU`rhM*d43P6otA#VJL0hT( zBrbYhQ5#bmwsuST^w*$ed$(rTs~JhQ>SAEm(z*VJrMEjApuIo_La~X}XEB?{k3=J< zwRBQPp{MMK_*Sukf$N}tiZl*-U{WdaKqxqJpWki^;XnU`f43Hpk00jqaQJm&`(2Hd zn`KvUO)KRbp#Xg-&0LF5uZ`>)V+l<{cOPFCc>w%QmfQVwxQmqz=x`PLfC$y>slF% zcSlajmRwv@;5IL&n3s}xHrs#`Xa<=YxnJ`Yep=T4Uqv-?bz0lkfZxDSI%f@d5Q^l$ zB)d?PsUP#htcdS@gyS9RzcUzplpOciVGV{!xREc|4<#H_Sv5bRPUd?oS{;YLK$ojtR`9jWlM z4RxI?O6zxsoQXw~=8ED*Erzw(-ixUz-xK#4573soOCrpFrF+7Qw2q1<}OWL%$ z%ni>po0z$Q_~1U3g^2l3Mc-U&bER&>x?)6SThM@%AQP@MrBifpaL z#Rc;veM$d0zC=xxhNNn7j1Ng=pWpz^RlqT&3ij;+2jm2q8f90(2vj2SLQ-7oAeGB& zt!Y7~6XM4#ypQHtF_BJX7x1HqxZ)>S7@xZIxs*~1$6(BMKS%uPI)-vYRrTcy+ypUJ)pc#K?OL2zJ*-|r- zc$%4&z+H+O)upME>)XKf@A+pfuC99Gxyg~soKRo3VH6~HoBM(0_9-cwYe4g6S>MFs z&U_%Z6G<#844Zbv(wwXG9pJXo#jt4zq#yKB$x^7r=E^ynGnOK@!@M53=Agu&wicFk zUz1FjYEaWdicHQ*__6M@N{BF1O3Rn8l;^k@sya$T(W` zfh_Bkcsj%5ME@O_kL`OD_cUR}WQC9b8tdmdm|3F~BE&hAJY1c=31R_@L*85PVYw$lnQLFggr(l^(8 zJ8=;D%DSgvPyLoZd(1KgA*+0bwY+yjV9udI?oDxLpI#Y&GjpRkfz;4*qm(s-h@94u zF))8?oZad@{=T%NoU}W3T~qm8(^m|%M9;8-|y_y-y^fchop=I*>3YOdE=6*EO{ z31>UzB(OhqBd6QH@$B>yN7MQzSQG0oo73z8j@ao9=Jw+etdg#jOL<^wYce^5)Cea# zwq@K)nEjpESuM4cwQT}r4oCsOi%FMSA`;&9x7t7dK{#@L z>C*kx!+9^{f%4CT(`v!bme!1o>jZshvz02HD4(=;)Z2UeSQX;WvRgu3C7Q6NUBsIN z3~NfV0js_gH59HmrDv@4YekU7M>vTa+)91RkitzTB;#NB;t~A8rLGYbk5^&DN1UYB zFuS6#V7(~e0Ool(dTV$f9H1|ixcZro?X(oGqFaga^5)j{f`_0EW9|vX3@v_04+2)z zP@DF+j?fG_`qm?f8m$jMyI$hg*-B8B@cDK-Pxv{B2BtEH|<7by$uer2%MAQM!Gd|FuF zQ7=yc&X=GUvLC@8&$jI>`JnMz&MYqfnPq9i5G>N3Wr_Becb~pwzxRyM2|qfCY?6Um zGaLw-NwN<)?HMQ~wqov{N!GJSYtcWA_Ah4cz|50gq^SifQMxj$$>U-z;?JI@{1Sc}sPrQsU7D^{`_QDv<+%;GN1`FjA>}AwE~ueZ?gx*ZVC39C zC)M56x1S&pH6q@#$e4%q@MsZ20#+m{ifj0Oi z@`HCG#smt-Ci{b!=3ca{g^XV%VVjn9Y#{j7OrhO$&n%_64E(zqLv@ixtpw*v=jLAZ zlkILyCZ7-T=~H`Vk5!wWSRQ zaG?5%{l1jcv$tgI+VSyl5)@gP!_~{UTyzG%$&+C^RL<_(siC#1hn0VRJVYp>+F}3I zbB+`1*>V{kVq1r#e8PQ|%;S{jQ$PgUmH76x<`-0`_RN0F$+Pdu%)ML7mhGICw072~q_Vs)gW&aVH73O145v=TA#U_A-+UVYz7+gj`4K>4H+ zHqIb>zyHkQ^Wz)z4rXr^I4@f_(V^XL{+gatVfQ_H;b=D}oI2K48qb9-oRiI-<|THP#z`*6*ltT-Tc$1`LJOoF9E)R?WP! z9NecGsO^SaDn9a<6`Nt2DaAF(PET!~O{u&2kkBsVS!e4&aoxb-KP>_VNF?~jWrMYr z_GZr_BYh0iV614t8fuaQ)7X0BpKrwWFVO@$mJe-Q=Vgn^rbwPM+8unX;9-}LrRU!l zm$6&BbXLhL4k?285t%;cqVbxGb8#sdLj_{E15_SDaAzna4<8CSh5K=80whYNGox4H zF0RWb!`Ra99Z-cdqb|uIlYx0Rsf`KuwtuAg>!S)ZZ8*JkOED%{im$cXHZyQtG-S1GMM zQKdK=aYvmD04pV~^L}5ZHap@y3Fbbghq;e26KxOy9jc;}6>?sX?SV&!6XIV&y8)v) zZMZrfM{V`#Je#<7yHZe#+oh|7E@MIKXMKEQ(Frpkxg72Cz9VXHDu^ zq&1EF{9NnD6)}QcKQ610mVx^aqTX;e53;_qzBEUHcMd&gE3)MUQ+GN03nS)YoE3;< z4!N0J4^{$Sa~Bzcom;`>vKh7Pe_#f6y=og`>5F{6o+U^OB1olBhMJ+j6@U4!ugxbw zZlFkpG_(n|H5=1fnBWS)s$rwaai}*Avy)q|@?oV*Z?f|`Z1O_S7m74m|3mZLCn-eJ zf@hCQ?7kCrx8MV8bg1Y_+F^j0q;AoRw&ym5S(xGpKIFF%UxK`+Tn15-XH(f14Z%JX z0bF*wx?ag$h8VOPhFnUrKTgTX{f{#8Zir{spZmJDK>Q1Nhh6o>s1o+h8)$ z8K#3B|EM`7MB)YF{F%$At)STvkVPH+ughS5johfso7F|@c?xYBcX%5B*-ISaSm_6| z7@{;G`~=5MPBB|MS_B$Gv5~03i$PqtPXJ7ZiG1u&yhUNWzsbyy95&WCcoH#%wZH=X>#UC^ckaF|r;k@G0Jj&~ZWB-|OGy50Bw@ zUEI|GJ%w;@#MPKcRf`TTY4HlMe<2Sq{FLu=t)B-6JSrGvOVIHtD$5th=^%u5AFkV_86{Iqa7}4DD3oF4OVZujk9N+f;8cZ2*T)rC21ZDI$~v7p9y}S zfiINb`4Nn82j|`EdgPD55(j~Wg&%({5);64?gMp!vYCWjdmVK>{fP6xFmrmE4u(*c z{+3)^T^2AoB8VHkksz&$;$vwNV?!E(_kq+FrfuprwT(YWYj?1>b?SM|G3oqVGIAM_duzl&YKWk%pe9(D0bQ--_bx1 z9D^6vTTrV@<4B)@$tg6R$NckH6DDp}7iS|YXx2i%m7f>hfmvB)y=Z?@GggO$wtN?F)oTM`Ry61PE`nJQ#{dr&pKi6(i%Y`jEH<+Ty4!5GL zPo1t?BmY1djK)de$Ee%}Z`npWqWlh(=yc45?*@|s?T5+NJ~Z|%`1-@T8NxR>#z-(t zE8Yfl)s^}kTxVW;iL4bx<4W`E$_gGu`Jc$ccK+K_)IyqF1k)$9Cfw0)06ERp^D82L zqG+7AWrrs}ly9s!s!%?81V)Qf17C=^KfJz%>)BHgQGhZ`aI1>zpn+OP7zVyXkc>NJ z+O0ctaSQT!Hd5%41A%owzvHH)cLHnR;Un>!=DM~DwYEiLJ^4%h4(|`Pm>*>XRg}(^ zwQIo$7Vd{)Mh}cjl4Kj}6?dRvX_?{ck47S9z$wFxW)*5IK1hKNehTrP0A*(+dIp*; z>=Y6LNQ|;ay8!G;kjZMUA~xcXh{9P5M!|5MH6Vkm$EnPXT83ly@R9>NTBJ!vN0Hy* zfdkSYajn+@uR29`1q{5cKaD{k*CY|o@`X#iTl&_`EbP|yA>=I=b;W)x=-4ydVXR#X zyf`xMtJ7V9EK+))gMIW)cy##bfR#FH>w@_l0xSO%Mjl9gq*id@`@6*FUZe7^hYj-O z>d5A%^WSiqxt;}IJyHP&vwiz6@uIs2hAyG26PTC8yrDC2CP5;XA;U5ZS*^;7r-92{ zsuxx}x#VoUm2C*;HVycC`TqrbNpjWe>V%vc_4=2P)C2l5_ZxCbSt2$zg;&dBCp26$}5`+a5XjNOyS)Xn&KL* zaob^4_-44-IDZ=q=OVB$tG5+D-~|`<$l&`sVC4m093ZX3?#Ro%ekZ!|X7`>`-%4|tk(C1$5csL0t-5BsW1T3 z2nhLBx8ODg+huMB&f~hI%o{!@5hMEZr6jl%Rn5$>&Jp>#&aQPdbIK0{B*1 zfbL=$eosao;%fp6Z{>qiX<2PhVbc0xiekGo&_J*y2yohiUzup^DFLEekY_0xh$bvB z@bWCY2>aWi7F#ebMJq9`^OKL!qrM2+d$4hz0RHqzla+zANJ8!o?m|skkhf6Ytaey+z|3*+8+Bc&e?4$eY;Fhfeh=XQq`2;KlU zZGe8J_P6~d3NaqkAN&5xrTtQiONB|W_CpmU*2Fe^DVJ7d_zcJ#>Stw*V9cEc3%Ahy z2aV?!cFPgt;KPOROv{`CZ>8&bK=6sF=^%dU2O$TVB6h#%9v`7k@M_@`VV<_k?35US$0@pm)e6kBtF@LDmw4Y3qJ~w}h|@EZvx# zhubP)y#exyJ{JFbs2&AGX(=6dGSY5Ub_;anry-WH3>Y<2Sa?B7bTr_mqPuBuc{=ou z%q#UU&a>MRroshs;Nyz3(M5yrv1f#H3|}$A;+D_-2HCbaJF*tv!UlZ%C3oB=g45bL z0v7%`=oe0g5)M5jjNQ<6WR1}T;*W=xI)$(Mn?0av-bIE6SW(LZdD&SKkMP&CqUa;M z;si$^e_eShbG}Fj19QHt4Kx2rUT>8O)5G78t_u0m74W4yp@@@Fq*C-p7g}UQ%EGuC zbofUvmNtyz!L%Bezzh5VL=pYnEez~q?&%&Wy4~er6lcp z)_~JL$5sXkEk@RJ?PmG|Ul++^h3mr%ELo(@MrS}JM{OMg;|alqx^Ll~`#Ok*A_6;m zeIdQV9k<2{S$vnfHSi257__PwTc)rG5G9_4Rc-OG34_L6`hMQ?gc@40KR!#jrNsMWbXm zj~lHgHw=P$fVOxE8puF}sgQoJBU1VNkH|U*XY4jIwz|n(&lhG(2qNh2fD4NenqUG@ z2cbhi!;;_u(!d94h6i3OMRAk=5m~nQb`LU;6Z$1kE(xeEpbwEBfcGSU`RW=xQxd)b zELA>(DZ zLqCYtR`}|gzXm7#Ci34>d`(VEE5I(6{=SXJd1|-)m;V+1 z^?@&x`Vwt0foF=_)7hH3t}((_W8yq89hj)J0q6!03X5&qR)|6e|1Iu6hreh18?ILB z&vOe_wji9RLq+j!a%2o(DS?;R#)K3SlqRdmz||gr4s$1s&mOmX+klgJq%^RzUfKpv z+mXsSx6OK3NRt_`cEx1UAGL-;jEakD;dvq8vpsZ7i|o!G!zr)5J0NcpRN?8S7k>na z-SyE5Ja@3?F%KMO`0aF`J^#lucW?@>9t}_tA|2)&T9986%J7JZ4`8FTprK|}w*qSP zw{Cn0I|4{|@TNcpmLgrE0=_R0XY&q{Ej3Kz)@CsA5uiDMopH>E(1ZH|klz+z`68Q8 zw?m|gpDh;?K|{YCL~(*E5Fa|E%2?>9fs)p0gUueK->4rnVu|o~jVK&h`%8csi;Or9 zGaDP*;Ovm%O#13N!+79u&qcQE-#uV|pNHM9O(Hkd4}XWvE{Oi*v9jpHUzYgTPvyi- z$jLOYEfk-%!d^R0im!mF1c}GDHSaKqUM1BPxaIMHdXKM&9zA&p;n#$$RgFiyJe}p4nwfy z6vrsC)i|`NyWu*kH+<)OXbIqE?AR?(NQ=>~J3M*Wwb1(i=Xcy)463H&0T`f*myFg< zGiZmSfEJ$ho|zakTM3n-OdsqC_#lX{RDrE?jhr)3)f0HI5QLe^`dQ6Se0Jc18aLlc z$teYGgh_qj%`eAJ;2;1UmP~K>SsT{Kn^9E_$lm^0d^?u16kZ9EVCmuX#|5A4dC->T z)68M|Aw29S42mD9_w>5n{J)MruJcrPXu3prZHh#IrLhF#$cScJN(0Ramj=!1E|s^M znnt5BO+gIXYkANYcF9ru;mY_uEo2!wC1xZyR$RA*AtyvPeu}>pyoC)o93blsuq$wK zBj{0@`tkeqI~sX?W~Ue{{&!Z}t?2zD8JBQ|r@vot``)t`4OS0*3}9obhKiEh+A!Fb zCNb7}=35n@{I?f=Kqz;&As zacNz-QVyp;S@YAt`I}gl!A2}(cu_-T7%~lx*=_CV?>v~yI0d#ySNxoLu%ONZF|)Z;~OO-W`=yQw5%-XjGtUHom-$HCqbd}@cYD_0(^T)1tf*- zpT{2-cSHMZ@Eh+Tutr})5QE*P1Q&Kp!+2|Y9;s2}=ROPt7cS$Av#4`J@YZ|LA<-lcK*zPcCo~$P%-)!$oyNG!$f-ZjMpE5Z ze8-yM0?rvI^wzckgQ6(Zj_p4o@h+6cC6&mLii8-AmbSa8b|MRn^>i>~c@jAD^fMYx zGHb73Jw5?W2f2`$%7nqF^kw4Kvom4%p$S#cw+1)G|Km!$Xh7pKzH&4{GI|PMyCU7| z0Z5nXtmcQtZ%6~hb%3O2IhOYREj%KT+(eVA2wrRMu~9VEM%4&g>_=!<-(Z@E%QP$_w)gl-tr}o`*~)mKieUOJlviJe&@jTY zenesfe3igD-KEysSbXkj?rKmC4{~O~>3Y4C7Dn*acfYwlVS#HR@H2FfvsOM32U(d@ z3v?FV8my>YSDy8aq-G&&o(LT^v#98EKRl)aj3XKwA_*l&+71dU0Sgh$(E;XtH5txb zrJ789k@HVSx7(UZBJ04vByQ0J(}Wumc;jBbJU9at|!!NJeA z>+$7dc!5B|xDtO7z8(@fhJ(m8DZl--erq3Kpi(%}O3zW?=vrTl#7?sI9v#js)NDs8 zPOl-ty3PN`+?NMJxwn50DoM#!lr`B(D6$LHkkB%z2q6?vNwUjQDT7Ffl&x_{3(`Rn zMp>gQWhoWe%cQYppLy@Oudnl*=l6Tx|KIOF&v~AwGtE8seSg2#_1UgU#z~vKTObc% zankZi_dys$#T#>@^@4ciY+&mOZMx%_{7H)5jpR%soTTw zXi|DoAEjZe>Hk>9{rIpI;&z~-1y%v0LAfBrtXJF&kNhDD{PmXk&-<>b?(ahrE34)p z>t!v)@FXe)OB!F3-EA5VuKwDV14`-n$Nvo<90Rw;_({+&{?5w3bR z#>#*Qw2#~}p1y!TJ6QR3A2QCv(O4lgJFmG;Ee8w?oD?`#qieshR4Qg(= zSuhwH(vEosfVzkHhVn>y-?Z$%z61QD0qvqd%fHM&kAO{6fC9u-dUH|Gl0$bm4+Jokh*nVL(hHE3*J^ zza|f}$YkJ^x*xvS5Axw<`DJ-r#Ct!_Zlhcs^n1K$Kr#{1w6FXsU60%bLTET95gi7+ z{oqy_h;)Q!UalBA-EerxG(VO~{O=u$@Ko4hfA7&~8?Li3JVM$ZupsgxAO-zQ9HLHc ziS0lHwowb{E+Q(G&V762h2N%bBCvbtj(+znCZiPS;Q-8^k@B9zG9BaK+6r{V>a$2&YRiCg1gt z5|(Q_3%x}Ai!K3^D=)A7>l5K0dF_yV29-7@_+(^3qLUkInIdrzZ`f7Vs*P6vQ*@{U zx=O{(As&&3vX^tS*2Y3^=r{t@)MiWIzV8@cMPjQoKY@O>|C;pc=5iJ|{Fln^rcoud;3Z?{H<_W?CY1hK@^ zUkA{9+`k%fW$72oBt@znqQN%1IzUJBKz z;YjjH0octPCV z7^%A(3%@n~`hU5Cd*FgHK=p1P4l^19IjO|=4O#~xX!4ddgW_f91XR_FMh@(DHnA_B zJU4$q`nVJvQG?-V@)~xXgu9J^otg;(I-`SrAmgVjYfJZ=r4*E0?!CRbV*CakWBS@b z?+^{C1t=hV(X%~NWM3yb)we#!Sfrhn?AxJR5=RLE2Twd7Om{C1_-+MQ9%uEj4-cty1r9*g1iJ2Uc=rrXDw(#zM?}(o1M!-i z1+rDSML>5EU}&z68Z>`-=V5^~Kf9&s;y!!V5})q5B=#Y`EXi*N@N>`x%{YmX2goN@ zOpOpSI=bWnh%xpY1}2AGc^odDkO%{P!$FUx-hAjeOsp$RYP(yErbhphbBlB9*7Hm_ zdJY_h%sPQfz{@{RSN{d5zF-XU3;)-98A2Y3sDRk@tMV|;C+;3nh*hqr0$7jejmgWZ zr=YqMP(#BbK<4_7@Gd$MeS52etjPy5CcJ2*77>~$-bFrIr+B(|rUuj`hYm+Mg4Y6d z-F%CKjC!=rxE<1tuwZLK`2_OHP~c%b zl21GhV8nZ&8WeSUw9J!s5=I{XgB-wD+%N>?j)UFjLq2n;+(R=HeD#qS2#AE%z%SSl z^UR2)!6_H@{R+^7LinOw3@UQ+4>VyAO=vo~M@LMw`BT!cy#^tR+hF6lHTBs#+5V{^WEXSgF6Z+PUCBtZTBsR5E z9dowcO8Qxd9sl+>SSqfNwJ4O)q3l4m0j3`8eF;L?$w9T&_=gUGx6cA8BQ&}LUVH3& zZ&mhUyEd%@WDGXT^`tOXx0nBbBZb@wJ93VGs5w9pZ*fOQ%bnI9O-*Q96X^?R6v84g zMSPb_gUJ$Dy7(%JJOb$6yhsJ?Zc{|@m@Nq~-hD52V85K(RhGaoUs8p&4v_#UtMceP z$o@RzF-#zt9Mmcp(^{BkEusy8+R4AN2=D4Y@V77ySlHqZCBZlxFwbL5KV-jd#?Gfs zpbChKVp)WAA`L=jFcY_v+yB$&yF$xEZXr+JwMzwFR=^Nnd}vn7wHKgTUN`;+&1{#N ztll15{H%WZKhL9qY0;fNI9ila=xCgbuj5ZE9BD9J7+m!}_?|UnV7pImBe)#6@EP?b zmXQcfV$Q%uaD=7)%d8L>0TJsn-yoDIEHIs!S!l%Sz1yBYO=9bpChw?z>O0-IsdYlwTAwq?~6ubo}?)c z0W`!OA8aREfy#QLF{o>P>eKORLmt}|17OQ0qp|W=zrb&>8IyW9U508S_H5xe}{XSjs<-m^{PLA&Xx|~DSDgrlP%u0`+Z5B`+ z8+7WXdn0}n@4{Dj%e6~mJ@rs$R#6FQmjH*|Y7bG3Qgz^XCSG1f2-yJHl-C*Ka3*A9 zDK2yfQ(LR(f(Bqy0Ig4Ufku>9!@H=e0hmC!W@Hu z_v-?0(FDQf_1g>C@fGfmKN0Svogo%Pb-=5T{ZwKRH{0(5~7oeyht$Plricsnm>sKOx*Z?f43Uy(q+%qhVR( zqSv*GiI}Hy=>h2rJsfi9u-eQaYhnTVo=uyhPgeoHWfTX6Yxv+xmCrzAiA)W5;01By z9n>djk)T#QG3|v08y9uw!;ZiYC)-afg6q9ME?^J;p=ws{@Q3B6CX|@JZoI z3V^&1< z5`H7#1Zt%1&7e<{3dm)*)L`f!OH<`|$u1kWX-x|tRYij5lD>n&v)pD8%!#g*Mcfnbc7bBNhxqWxh5gx)_ zo)^FR>tv#=El?RDeM*;#4=?C9+zuNf@5~%)2`I8+@Gmc&9e2jg4W4f_Hp0s9@g(4H zR**o#uyX<)6HHuR{@g<$3uVbYmAn|A1;*e9@RUk0$PJ!hT?a zupLZ&bxD59H5Vwl{i?OJi2q7Lyc@`@_+no2FIVnc#AX*M8{L7KJRs_Do8Vb4NJDYKgoD;M(r@X0|+m^i@ANad;xSt(d4+N!oG8fr_X^1`cY87 zSk8nuR4oFAxb;Sa;YT2t*4)|nlK&8JBL+yV!@Ed3!hLu#Jq6FY02d?aM?K&{5z{qm z@Ls`eJAiQETzWyl-==z3BrNLSOIO&7X>OZ@ByEAl0AJR^GFMm!4(7D5o@VR;SVB6b z3$|A$%%yD~#KLEu!Bjm8Yy>Gkpdz^=c4rbjtl=o>j{=zBWi&G8Hp_4NeMv6RKev!@ zNeZGkgvd*uBhkB53QGL(K8*Ft0wCeq4zUmdP$BYzso7tON<)#m-ZpmP1Vfo$Q}Ro{<-woTLJE~e#{Dm2YdIQ zyA{x|V^FK{_NRPyZVT5LfG7&i$q+)uB@I>?)U6)OD-Jqy>YM}h7oG7C1ijnKYh zCS^j-CPW=%P&BVt!LFmAI_lC7m_))05`~9gQw1!pF`)O-s@6vM;zzDim9$Tykl{zc z1y(6G%W@upjK}JnP^vQre#$z%y#h~Y!XnB9kRv%9tUKb1#QL&)4W zE7o@wMm-&Sj&*7HGDA|`F?BiF?mEolIJ%U*g>Z2(a+})?VPb9B7j~5Jb^xtY8`h8- zH2d>mYS0Jl`bSaVw$XM_4e}#n6cNC^__plZ`8;#l|vV@CY+W4jc?dVI$Vg9)1)VUQvn3%-k zDeL*?#0=)4$GXQ0i9|-ku1izje7Y{}x!8}lU7FM#L+^H4hAbtdN8;)hNh>&Q$k2(X zP+%gE^q)qQ(_a4}=_!=6@iH3ky9xckF`Awe{vPELUjlGB5j1BxC8?@;YzDso^E4$Q zGkggZbkf*VQOpu-4c!MBUbkfwF!0*Zj$*G-h+J><+cVcRNiIB)J*((OE0k zi}vmd{ONEQ|2k_*Ya?h@Hv$u1A0=jUq5bo^cSTD!;o2V0kF%JC^V4teXj1oaG=nU? zH|0@+sX!JQygMK<)r}t`yf^cVwBp^gh=k~h%1byIIebX9QspwXa&JHg_OjCX6& zkq%F2f)YduN9e&!*yrb57qZ#H?Q(FW#!E}w9~^}R=hlRjJqX^z&Zmm zFn#SrlXUqI-k}CVyrYA=l8%KVQBrj9aRMQr_ZHjGO2<6KpO28^KC!bg^whwJrcrVt znPc#2RbsoaNr1LcH96-7he0b!Jg=eZCH(HEi80C&5j^>pCX+o<9f1^mh{H)31|f7~ z{~MvyRHS42qFC{F_AhyRs~|=Ee}z20zqmvL*Ebt`Yyj@4+?GF3t7I_Ko0k zjpwjCfK6NNspMKT@77|mU>`r4)6!jb@Jygc#6{%VudL566yT$G6Qh7UuR+Y684}l? zUdSQXh{X8d(P_FpDT!+(^$eKN3^4zRPtY)K`G?;N5r?89q}Zhd4Q*;& z+r`~R2P>S{#je{;JGv=i`7iT0q@*sSgV5+>u~#OsJdqO4pBo`1tJKGgO!kkEGAZ30 zVY&Qh95id{e{yM0yVm`eR1%$k9h%zw5NuuL=YBARc>Lr?#Oux zTlUES&=vGBN+>NQ6lvC2+n&m?nW|lp{WXzh%f~#v?sp?cy~)f~R(XEfr=)d1P6C}a zuzlz*;Z)1Dgw#A{r%n3&}uA7@>P^zwKg%S$~w$S6Y@$ip42@MPT6?;4{9 z26fX6EH|v|NdLNe=#K564x0f9@QDL6uYN(PU2yJ>pZDs6z1&yOAetj_a3)yN zUT_)7xl-%H9ztAQeT;z4+!{ltPb5Lo=8t2&)4QGl3V&EI_R+f;x^-OsZ8<^lke|u6 z94+X$`K$!4*lg>QL(q^PibJDKNRa1FLv#psj5vvrNIn5qy2lx zcrZ11ev~DEdmvBAf7olcnhT3%eX2fOoGbI$KtjQSW(39M<*&&6QX|Psw z&DKPI$QT<%@jM?_=f0iJ+m#n%B5x(J?u9tH(AY= znZd?lC9$ujdnw8Twk8pc&Mq8};V5E{jXg?2VqU{UXlb3kZ=X7VCL2(~4+Tbi0A6KN z9dO>cldo<@smCxu%lmezFi(hvP*!@v%<*SDvs1ylm^|M#bJ|i>Cur5>BHvp@6b(TjwaHtOx;Z74kePj^;<@0n3SGb)5Ee#V2CZ3z?pshK(Fn(Uv@?1NZo1GVWK{@U` zGYz7g-G5h{S<9KV3gk;x*nkuNb#fP>Nn3u=wX^U*@hw_w`1WM6M)=Jc8 z%0gPl1)ISkO~-WkD%XHhCWNg}Z%*DG6oM1jkT2tDztL`B zCm+Q#Sxi6#avo^LxLVs>_R%}Ffimuq25j{)^-vCm6Zi5<#d6imwu?c2U^uZ-FV@oF z<8RII)NJou_rnw-e=|gFno4`i@}i^L>P3TKuw7MH%y7&Bc<#;yCmqG!22Sj4n4gzw zI^0QR4L&uE*Zf`N1Rygp1z*ttV&_-#8SI{bcKP(T^?R2{3Xl!Nv#mKs4WVYkz9hl! zOX~HSD!5BKV&xV0ORJpZBY)^?)3*akTFTve?iE0tBH=-huyv%<4g|oO3nRt4r7;5K z+lW8;KF(ELW6QSQgIx?xxh_CfeEJMkKwy9fI>@E5wM`T+n%JJWB^&uO;>n0RMb6V> zSjk?Y*?M<6aHIM%ezFNC5$QM0;$Rq*0K7V0i--379PF3-Xg(*t`prYo8L6`YoLAvU zFgqUe@yoo@yv78b$+Pe(FD>ST>)@qt{dBu}{L!i9uouY5V zN)D?R`)3F4yO+%jh)BhDm(O>R-vwjWjRlK)mq2%I*YJ`2!O-f(imm(A)KeasyRQ^n zml{s&=a_kUZ!REP*h@TBD9!M+j~}&GP_jmDzy*5&^R6%!x*i0#YfOw++fOi(9@uGk zQ02@GAcV}CY*uT`lF^$~-)}%ZFnB28=wR?nzypo> z(w+|%0}VCvbdYF0^?D)}Gx!q`WD65}Mpsoonw3=9vT3pApbqwr@~7GnW!GkRWjjsy z&7;H`@h;ed-f51%;??+p4TB`j`s_*enOwF|;?@)p+|ZQEyiJ;$ln9#czAh28b-0H3 zJ+CcWHDhXKe|n_yLWb6lJ-xD>anm+%a-NiaX=!{jLq{~sbkYkf6tkwooXlubg$t*` zpesl~!6fQTO_GjHXY}xtX)@Vtp`?w!;OEJ@5ri>#)a+aNu5TC)tgjxqgRYvY6#)8g zpyxt0U*IP6P?86vT8}}3usDk8WAMvTn98#OQ5sIO%KCN)VU=F%x-V53sB{^AA@+xo=1 z80DD&s89dA6?+QGS9OvLYstsnm6Yb^-f=-rB;jtJkRCM#RAfXDeZ+0)-^Bi5(S|JL z(XA{I^C2brM7{_6Cr%N5Pd#x}w6?#6fc+#OGr5Q=U zCZHSYU`~@)?i}+59qUPEyT_5Fp1X}3OGY+%$GfyE*^aDPHyZvM*I-}z$mR>sr`aOI zxyYwTC(POf>4}$@fp2xpCrfPoYP@Tb!f}Vv46mUx0^;KKCS8|p(o(6-N44ClZ3(B=B z%n|!5ZNl?*a4*Py`ln2H>^!G9+1q2Kp!eTu&smsyZ80aY$4h7OXs<1uM}lQJIN^7n z>Q0HfgCU6y_zH(aDgi%zXVIu(c5%)=@&`+mtY7piS6UhAl}`d--yHOpUK3X@kjXnyR~ z9ph6V*D$yUig#YT{6I08-wXq3Yl&eK|7m zv~afdsvP#-!ra`#2B;nptowbck$aDGqMzW>DT z`h#GNwb*W2a4o1)?Pr0$^N)7s{pMM(hVs8M+clTlx*y&xS#+t$72dV?12?auc+k#) z4;MUuL6TA4itGxf9-s&sTE)_M8-Sd~-nfIy_*UXNVdW-|@|DW+UQl~y2G@jcFM0M_ zs3ZRT)y>W>z3JDGcM-V96d-3R`&mVfiWGQtSGXruj~^*=g9l;1u6 z95Bf3thX1Wko|OnT&n7Mp7bC_(utcMo9)FlLfm@kVyox1)&#=q^~j6n5L2_prY^2DdpzV}?9*=(CV{!$Ms z8YR!QBqk?jEVVD~8ILT``Qf+IE?1|0XV=#Kt#T<3`)&mMsqS5uIr-*R`rv4Cm}*rY z$eV~DH7Z+3={h$4s$s2NPDK-yc0axGmDNstddCFb7q@M*qW%U0kUtdz8*r)FycxZn zHmbJ5Vp#e8PW=@`^(9#zvRn4I*2dP>E+H@@sjF@3YL5<>l%nYuV}Ag)J~cDbvMwL# zyyi;nysn?1CtKR=ssV})Mrn`WalZ=3$@!%;qKI@W8 zlJfY<*JJ0uK;tVsFJTGRY2aRfZ~eoc8X`L)n+HcWYkd4o zvbH1JyvBa=V_VC&&=TgKORnT=84@hA8LG1?@vQ!^YXfIiVtpT_y=$H3b&`It5?_O_ zvtUssa{vD>>gDgwiT6m5yX%TONcU;+om8?X!kJ8HM~C(x z?G{S6<^$qrDmm$9uZIoXsx7LS9)t@(U%4fbEiF#8cw9yUxm3_J;^VY7%NV)J))sDc zBQ6StM%tcDpp&)SUvq@=(KmCuex5SGONn~s94_g zi5JL_q62p9X{2BFObc!o!gjLcRSP9$bAAEM)~w?EOSSw$@yn~qx{YtfZ}_9g_(jb9ZBQ^wq_;hv-Kg)6zvKPGKx|mj2Cj5^IO*;QzpyC6 zRduGW=w2#B4AdpFm)uTORU+cd%0J~2O6P0_`GPxhB{u}Qj;S;E|6238fuj%{5bYkR zx1VfFc$_SxJ-O@BiPvXV9qc{)2ZGHrW~jX@FW4Ni*oPf8&)$RnK%Ub-kg*DwK8Rzx zZYJT}(rCBvsthDJ`3%8d*UiN}s}ljoG>fnO`;K+njK+L6&PQUDX<5=lO_o~Clsvg zkONX#<}qvh>WVc^-}w_dPa`!eA}^QxRTcllF6QSN2_HQkQJ2$#qVkVV{q(PpFS^)> zaN(C18^H%>m>-PuUT)v~7kcRLp#|E)VeL0x3{7M`;b^tY8BP1d#sj)af2%vDw_#hc zchW4}DgFg4F_p?>=#UnL=z(;rz;rw6K3~?&%R6-AU7mZR5yKkR6o2zcBDm+s4b1(J3 z&yc1cPU8=pAWfT@X1NJ|`QA;^hJ1XDZF<_jrzfW;7rnf#e!~P>xWqk*FRq?aFag>x zS6=G;E|MOun%-l`Cv-VN%G*I9V)>`M`S~8sYqLp?hb{$?d1204OWw}u6{gRzhJgMlqh z;;~d!hF(XcZIJUw7jdr^*3{pKkXp;L#xTyzJPwfF<0K@ZGvwnqQQznm*GL7V;3jor z?22Qr{(Qn>k>$ElizKlxlxKwD^axp&KN)|lF)xhdOK1MEV#M)2cm5Sbb^sWclBG34bWRl^f#46e`7 z$jD1O@Y-K$#E?W>wk_M*F<46SXtd*uC%@3Ah%t}|oc?Cg#LW;}37Bnk@D7VoaT;Kl zYYdlEYhhCZ*Gfp_9mI%@-PhZ)pWDKAa>{>)j0xTKoA#W5Ktd+nV!<8ynH+fv@ormo z+v=3uUK(HC726bN-_HF`;TCa_jA=oteDi>Ua-}drhrND$Srv`qj?~=>gnl10p8$t&Y6j&`CjF<7w=Q$`KQ)t#GL+WPyD51 zaeeQp!-6DNOWM)Potg>;?^|dso1Y3%|~OB@!=^ZY#D6`9;Kris!VA}&Bl z^_FT4h||89SGDDtldsfQ_Z}XMGWUD^03y>5#sNuXrKFkVVIa-9A4NpFVGoh-Tbir& z=w-P^noAW4quZF+>;B{&y?Ds$Zgvy(%XQnvR}EOpR<=-LJE%YTfyLi=IK~AX7d!Zt z3Ek{%4Bppe=#3ajpVJ7oixNM0Qeh&2xoRQHF*o7H+O$)7mCk0Y6;<+HhI8^zfXKv7 z;(Q&yEMVYjvCGr8GBtA)Z9qm>M;A#5*%krCoNeb?xuej<+>-Ys zv)?zLSl@~ideY0vpQk$Y?6T@C^w!N(+GGO}4E*FMEi0-U?He#XV@1CHtX0jJfmH3j zqOegvE3=z#gHEE6EBrc}`nx;>ik74-Kdf@e)_QcXUZ#~XKh6@2n9~kyVDyY{eYkS4 z>j<2M|M;KD2A8s}xkvW}QpG*hf3Jp|4jBr{Ir$?JHOH~-gaTbiAmO?G+I7FfD~$xR zyToGe8mpJuDa)Mubt6}(D*Bid-?P&Udet>~3YfjEX>D%TO^Y!WXya+_$Y7D(VgOcoH(!+aYkQEBS!toKw;wX)#F(udXBiU?T34Is;GI+FX2I|#wq>W_L&2v zEIP{nt8j*$g&lLNXM4Z@>n_gNG-5-{g-sP8seXMirLt8xgW9rwmh_Z1uN=wdDz(eH zbAaP5M__mt@uw684tHDID4HsSNbp_p23PV3RpfkA;sh5gJ(!H;9! zunjI65fk+!4%qAfD23=ylVNl4hC*zeU7=7C4O&B4ejPd)p9t10rSL5<85Q7&9MSqy4}?RHZaYSVIuAQq0V3q1dKvkHP_w(O zXO%ruLv z7f00>QDY>JH+Ya#YW=7_rQz;_cH*C+f#)3yO7ZO`7fzcj%&EUfd+Z~6 za4Y<(clU1}sa&bNd@MQ%%G1WNaZkc3Ro9U9bYHTYk(pj6QWySYKH(s{;lZG*>Kp5Y zEdRscF+kqKal1^5h?=AjV*YQUKnH4BYmXaW6 z69LG-iyFV#6893btsh8GDw9NW*Nf%U%9DELu+dNDNp|ckYWMODY*;rlVSBpXA>`id5*MXbr@#t6MpDF4WwE6% zDvq%!P}Y`|ypL^a>oKL*EcjusJLa_d(nNDPNctBD&ZBf{^7j= zv90mvHy=!CYX36lnLq8#=#LxF?S7+~zFv7{Vg=jHq(en8vi8HQ%jXzv!~9P6L)lfm z3Z6oz(D22Q_Zi0(yH`fx>6D|Cck-tLkbIo?&eJ*xLjpxHq4ie8?-ak`ASG)Yj>P2*OAg9+!8tr zlGoY2zf1b~hfA6$7ST$vPJ%Y#u%xD;94B4rc&x_x#fZ$#9O#Ji&t?1hZ`#N9Cyci3()X~N(03g<#s1wujpt1N zt?fx{398RV{hotwxVf=fz*FGbsN(q>F%^IoNoi0<=rO8?;S?;hdU2H6B2d}T>C*pW zQ~=W*l+`3^SdNbNh19~C{C2Dt(%esSoiZ(QQdEGw{H(i%vh>*0m(PP<&hL9^lXJor zR`2OO+V5UAQJFgFDL&1OI`MxGq)(_YA9?BL;G6XGb8f#q)m)d2BQwM@e;`$8i~Nx2 zL*YB5In(S15?&3yRq|U>I$FevY|ZU2dwML9rC0WZXdx(j}W~a2;kgb)Pv{F?J}jA9ZO=ruR0OpIZ|{Hf-K@?cKA7j zndd2k4Q26|jWpFd|8rTVR(;0HqKhp6IU4oh{DX{!cpu8b0ZpJd35GJrs_r}ezSaAD z%^FVW@i$)Jcip=kvbtQU=QDhg`0gFEu9GgzU-4HZc7u8kd;RF3MN^E!@xkC@D-W8lCQKVtzexUj z9*?1JmI(%VK`#Z(eD>2Xm2b?~;*RMTM>!-ZGfA0n;xoWD}`h*L?p zc3xn$OJcL~`4-JS%oW~ z-;tRObob6b0w5{NxB29h#_-)1?OW4dZy`JGUpBq^~Qq16_f4E`GI!5@2s1g@idxne=EtpAkNPN0=5!# z?oZn(T|z4Rw_($GIFT_0nL0Bw2M(PY;>s*KL=B#d&M1m-E5BZfjDr_?_9_cFjfy1% z{)GRfe?hmK!VqWEWXI|nFGMz$C&H`wd4ld6dc`#K@g>lB70ka{6hZpz0axECe|`FQ zFE2o;vTO+bVH4#*Qq=cXqr`(x8*6#an(06#Kj5ZB?DYwG!W0 zADWu4|#NOpP4|_b%-}=6>hHZ0+eYptVnJSq=ErE|PWX6@+dqR=5 z*$&USDBtb!I*X}H?qePHkHLcOUo-N~jlqw9W=L4w2e(e7Tei>Gt>tL(9n7DtJUhI)!SwZokL4nq3mzr{`*PI*&nm*Ap)qc9XfWUhbOcFyMK29#In8#H58e=)%2N zbm{sTaL0Rmr46aAdA8nJ`UHx>@E*?7@G8$P(DCydATrIf-+i~@R-%AN9(8_%tIiO$}ZV$44r1}#jT67d} zGERg2@@8)tAneDKd?nL_Me%Ycan1WXK|PE(9}}x$o@Q&VO`g4Bs3@SdX*GZdZl9nq zYsu@^z^M_BoM#`3?{strMa#8Z$M=q{6yRaYC+L1`iKDxoXV7)%TLwMO1J~?4>yxxs z3&unt?&hY>otJ;*6zFvHuIN2H7i|tTlm`VV`%bm=e$X5^&vm9@Nm@1AYr9L6trm8d zWK<xCT zmdjwW7HEb|xi@O}TIwiQoX>vG>kY9*CH9nRu`P7oL4j&W(sN;4ed<%P`%0Gvr%{pB zGKuu=Xv<`Fiye|)+x3+9ft)jw*(hWJ!htJodsaLr<$*~lo!B+k=F~)m&h6xRx~*fn(uV2$d+y{#U0blvO!j-}#Zb?_FaQ2{T6a z4-Hk#heDXydz1jGi((9Tr>>2xjyI3LFl53A9b+#o=2!=adw4a@f?E1HeCJYTbcZcUjfi^O8bzO=J@7qqoWX>Q=~nE!r-^ zzNKW)BzA4TvffS^H9wVt-arlAnIH+r%+bytW zkTGVQkD2UIh`v|TPMg}6vz1D-YNFQMux((SQdkip@BBV^J$^`Gv^c&OCEwZb!752h z5%=C5?ra?7+V8?^=km>N{mC8IA4pUcH|WbB<>w0*HO-NCc=M%W&y^=xAX@C7`i{md z^fRdt6%-+*@}oAmYFBbw_6sT!`G~LH7SdLHq(fjGd!Gj%hx6cz-DV;6-k{77$G9uP z9KXfn6&Z~di%e4$q&o)TjPHoZOzs0PsT_{xRk3J8u0#TH3ZZ(V(Da244%98uKIrEp=Rs>ULrdLDoSx13f zVbM1!wU=$#9wp$>t)D27W)Chnmplo>16LaI32cgxI#h9=84!EIoJ36fn-b2&J6s*? zUq$8E)+|0ZNT#a3etn)n z9I&tNb>^MczFL#+@UV~)zOpehxN$1d>}JFmf)cRnsq78<>ZdEO-sGa;PWE{086KvK zeHCWJA<%&n&E@MAeBuI(Qso6SO8iH0roAKFTi?t!MF28Fqs-Y^yjQ;CHF&tJj^QM8ch)x}jMU z>0Y#n-A@>Y=rpaB7>0vP0ArquCLbN1cuTRgYVOqzgC&%3vs1G=J1;wi3#Lc(;BjEG z)bH_YpV}lF^C`t#uWiZjdXoPzflz>G#KPUb(wZ^X=8wqQd|9DqiN>)?!TM4HmuCj~ z5-;{)Op8dg+Z3>fl6D7vC1E_z8#7w^dLN+7p0CsuTz4M3^S_oC>OE@`jpf^`xB9?$ z%R^8;*KwZ?lK4{{x>i?-Pe*i^scprDllHf3NKS&7$+9rgoqJt>7E&FIU&gw@UyopsOgHO9lIbIc&+m@m%w9ZD*&`Gm-*2P}D>u8QT zRirDYLKvg6FHHDZU@{6%%~z>DZSxPCXFb#=XocHMs1041Y}p5NSn_;%^js`;oAu^MMl& z=kl?u5yoE1K5IKn#L{Ye37*8g7Bf?@SyFprgq$zD1!lkh>J5?yQ`%&9vk64yrFlJZ zh-u`eNI%0~INb*6^pvc(kPU>ra3=#hg)+F-WI#Gj!Ga%g)6yBn6+AR5Kgg#e(k*0t zPR)`fSz6a;=c<`wL@H_Y+RDyH_hAa$+m);A&wy*5O7Zn$t;A(ko~KrJHve`JeyGi9 z#|iY5D`scu{FGrE(wjURn9}lvoqJ%EdH+cRz4`@h>jb@_|LJ(n`dPo43*P#4tldlh z!)onWGRaApXHqdye817hf1}Cpy}~I_mSIl*+1_7_5Aygca%r8Sf#QbG#%9awzep84 z&TeEkswlXSm|^uh=N!O}8~8cIrSf)Tw!_eScv^@=Z1`bW{zqzLV&(I;Y>p-ARELA;S2tA3pOm?TEYb z8~FtUiBkO-bRV(f_w_6IDmZtex4#yTI?SBXhrB;x&#oi1qxbkXeed_PF`K|>lgvVW ziPYTZc&?N>1;z&YiAs8(-?6MgdTpQ?eK4rYWj{_}?xmmsN40q2aK(6wF~%qkS-to$ zO3Xaqm*S%akv*~`5R>kcHVNSa-N-(o)W&78md`E(24EOBPu{bhY1+=b^1ae3xwUgM z#imXZvQYkK=j(0eU%b}|tb2X=?>QgmWS`b17RWZ|hqZp|3s{{WqbsT{7i^m~nNyKB zaxiu^Zut_mQah&!%oF;bd+nkt^rcq4^MvwR@hFMU%b7RK9mZc=GZn6~=((CL5ALak zFNuzV{%_N&k@fj=3d&2Qr7uZ4V6=DX)6Tq#N8fMkH+%Y4%(kTBzzrWKGw^k*^zuFA zjaKB#qR1nU5CsK7syME4KHT$R1q@vZH_Og#^}SgmQ*s3fD!hVp93p)VdoWL*u95#C zlA6%M9GdheH_FY=A!d6`KjQOqJ!+VOwA^Ss}|evSTmbOd%}MD zMfnu2uY$KaT^{+Yw{R)Tp2J?;@sXJlm^|53tQM^b@z(ji9p>xmWO~2->-IEheD*LuIPGH3K{q}ga2w13S_0oL#g<8 zTeeD!J{_cwBoZ3<7DrLnPG6d(wIacPU`qcCuE03`ZS!!Yy1}Y;N9I+`r~N%>F%q5H zi-JCw3xYA+(B+O!zao)M?L79zBGESOsFt{U+)Jpk^3UD4iV=q4QA--AO5IDvJ;!ZP z9fs8(%2pCG?|Pq{2x`CEMCG=cqFW{Vtef?lYbs7{_h)=`VO0o|!78p)C6(#K1_|(s zy=FNI2XxN%K4pCP!P@v-zE<8RsQm#Qemhn(<@ON!T&I_m7raMG%WUfmtfXXNbXGxK zeCrtWiM46o2s`?7Ub?VTN0Xp95~k0z)hsvP_gC7{IB3!gejnt2^jWN3FD32!pHW)z z<`iEPY||IbAG`SzBljWC!6-azt8G@^GNzHX0bds$-m+bE4q_A?YiTj2I2yWL1=J}M ze^YE=zHr0^7^Ep5A)kDX;Q_B_Rv;5bx?OLh8|mb&I#@CJNq>XE`OX$?osqe(@)(CB- zx^4Na`1EChbl3}AfB!ppJOSqsJ5dCQpKZ5_lUPUbo4T|ZqKhLmsMfMWHH zX7(2TL!xA^3ybsCA$MbYPU8yy*9BdM1_Y$H!%D8C7&k-YQ6f4xuZ^vBO7o(X^T$3v z%uw(y<0VI1VQ$GESC$({A~|C?akD*&0ZBFfWq-5aN7ep)QXXu^`GDyQkUy-5b{m8u zAM<|3wOdK-sNu^nBO|r5RP2S6S{RSZ$d&W{%1b8imx^_@qov#L5PuOaR!M|Ov_v>> z9%J^5-+0v7ajl?%(XjMjeL@?r&QN$|v>F8fspuc9k{YY4!vV4m$DH}|7Qf2VnOy`! zY1v!-;~liQ_X}&74OLgSpo#3UcgrRD*J%{!-SfCk+tzdl#4?WlOaO{Au#$>wRz`$i zvmGQnDSc}*OuokIUeNYPDQh!vtw=vb`6ehqq>>>=$gd0uvVRkagW}AN{Soba_`@NQ3r)A78Fx?=kHn5 zbR0_@jVhJ;RWrL^UBzM z6$AjVprM(tya_5AyW%R1UiYf;`BLN|-#d?jlKLX}@mR$ic{CQTEqm$KWqL7>nXR%%_b9&1j+iGv8vMyV6kePJhktRmQ);DV8{U>@#%#pFp)b)>R*#9nPYNtRqMQ`f$wKHfPEi{& z?zIm3#BMcU9S$9V51+j8=b0BtKY7sfOs;_ji6hAcbbGgSegi%kB-Ol4dqWRTIS=uM zy%b63uJK>Ia*L+aY-`Rul%l{7yvB)t29z3CJz|P&BScHDW%Lh&cF3@^&3}-G9>O2W zPedBu*yVpUM*R2{EM^d>dM&V^G(GC1p5ORP@eo2L~k6(#H~<6ji1KH zaq*G)MTr#Y>p!uhjvG@8sX7+|u&8qTzWiCo*(sz1MsXWkeC#91>lP!SUiCKU3~M?* z(t@}GNfPMRvX2KO_X9|?k)LgJfElg20o_)s7afzMQwR4c>sVG9$@?WMshhkVzuQLj z3E&f85YZH^cTSsRQ~K$5vWu1VK>g z4n;yhM5Ieaq(Qnv5u_22kW@k%MCtAhX{4l6knY$wbKE@dTF-j+-ru|TkMDSo;~VRk zt|?6KdB+&nxZ=FdbJP2Ibe!}DY{+4XXoz%lY5zk(bYQ>r2NCpg%S{XC_^cg1KJ_`w zwyg;IlA!{WSnk(&w47>l6k|DUV}C&m8Z|UBl+?yqj{ulCh*|v28S~PQQd@jYP%6d= zX)YJz0u~tmKC++`rMrOcgSQop6~*+MkM1>Ta-h>>I`0wx^6VxCqG{S!HU7u+V}31x zrr~NX?vSf;7@_ImfCy$l^cTQeu;<#Th6zE57t7seUv-kkQl|} zbAOIhop1`YnqDmh4FfNHU*vIWRO+%@nzDtUpl*^Og6bJt0$Tf#W(C?hvOS?0?*`9! z3`K&*{CWe>F<@K{?Q&k*RIe@tJ?y@Yv82J|hxQexvdA)NkTBslD8W4@Ch$pOelF(! zBp<(ujFIH)5X$q|zI+72rShzi*b*b*SBbV(kJ8Og^(T&S+N*b0`;5xp>$2vlkV~w@ z(*T$~;it}&*l)6kl?g%`4Oqr!=J5NLg-aRD4sA<{mG2>h;`EmDm%6jdp2HhGUxZ?>oG}R5 zW80~w3}e;bc45NesRL3{RUk8nlL(7EK-5vqx#A51E?gfa=iJ8YZA@`=JO#>RIkWm{XPr zoM{}0|FjGwrQ)T3Z$+Ra0M_Tyn|V{rS}d8Mb0dP$Yw{PYl%r7u@uyEzeReOxIj~0{ z2I*MvqsF@i#}J4dTohvjz6H!XB>^eQLY|cfERS^^tshR+Wour-uNnmqZw_k>m=~cB z?DY^Y0;E#@A2^cW-l6i2=?u6eurUq#el!ySy@Bd@*GJSW+aqLuLR$c~TrSE_gyh8h z*^pv*P}g<{NV621Fw=k$k~`OB89*wZ{6;y37@6y(T&O!7?&$+31adFV9@OO7gW3ur zeOWR?Vqgqw6d`Hjsu>dn?9N)&rPNDVkyJ@kDG;mwl%H%gCtx*CGzD6iJ6(sMU6~M0 z&u_SC%5u;GSMFQB4Qvyf=f1k6dVR>&xR@R4jRc% z`8oMB0mZ6T>f0L#55|j-z{{R{xn8hRTM>w?CBXHEK&gvYW<*HouQ%AQkYsi~bQ?Qo z19{BGT>$rQ83CKn)6oQbfY^`d>SDZS*3n)FqO7(NA#npXq{2Ad`!ahB3`J^t>}5pZ zw1)~%}4>N2hZN7-<5R_1{i`LWO;D%K;>&L8;z4@d+O^EMJdp!rKm zB7$xe#3cfWfE!K=Vjct&1Icr@%={$n3^_Ej0xLl8blHQR5F)txwy_VW?9JRoY(1i@ zkYhV|o-hgccN~h~Iv>K~2!cmzsP&i2L*BuR;O8VH&>aNV@go(?y}_*$z~%)pg~1er zh$nzikm8(q9OnCE1YKnvFBWegd@A4$zcj$=%@7TMjrw0GA(@0*o!D)lZs9nRFb|f~ zbz?B;XZei4tO|SmY+$M>Q}%)g;9!fO?GjV~^+4T3fUOT;23-9Sd*~j;pd7b7W5(W{ zgM0e|{5X6EDb)ehuL8{DYk0O0=fyoJ5FX^9oKN2km;)ItXaV7}MiFlH(7AF103Ssf z0*v>MQf0^fNPZ7daAv zfQ=sr(KMHnuqUENkz+=}3G}sNV=EIwEAU?|mjh?&7SJ&C=S*Fflx^J9f(SoxIH09< zHtLDAP{TMstm8h!Rhvc>{x}5{m?%)q0pV&#emg+Ua{cH zO^3$8gkd+YVj&K~LH9Kg++4YF0)ug0z6h{@MX^3Q_B5RhDZs}m{0aGmu;0@%U-r6UFGWw0UeMi??chOfXpWfOQv6cQjS zpM5j^Of0GKog2iQZ<=>T9ew#q^9X=hu`B+o=N^*r@Wh4{Ats(IAqqgE0Ll-ec(9ct zg(P7$h?!&1Q~^Z=q--n;d;m6%js1(+eBRC}S)*}TlwL_y@BLw*5r zOb~1Jgvq*C`JzF#o=g?k=35q0K&@j8*itBAwSM~yv z08(9N0T@hQ&|KqVh0M!6OoTh;mQ|q1E@pZ*_dJHcColVeubr zYzVtemxrNaKcxcC6!-|fFcArW{tGAmYlCkX14-d$PVRsh=riQjRQsGy!lz8S?npqL z{0BN@4BUJeiQJAjO3-K#)ylKLy^{c2|7{psbdL*6oU`+UIR<-{a!*}80 z0)*g%&iU(wvvv5j0an`J0x>HAEKdZh#(589`xZ|Hvm*eKI+AXHH@p64UM>;z0R^9(1N~jd8#x;uaUi25 zBax1DdBe-yf!pz(NDXp3Sm3^D4WJh6Lx^;B?Bj~5N(#*Nf3ty3cL_MtXvT9tuoC(8w+PU3)5Edic!IrK1vb&7X3&c-!(6PP_c z-Re~kJ>DV;LE^*9pgbY;jhaYHaJmhrvpi;jW2_QUE%$->j5;SDx(Vw?FTmwV*#O6} z?Q}k1VH`OitT!S6``j+z_JF2${J`_(9(IyCBF&3W&=9J;ND_E&e7H^S8+t1ca)NS2 zruLgizlN|Mc#u}&&tVxKu(i*^qLx@tdmnVtg<_(R^*_x7&O^j88s-WTyJpoZ%3I_|TU+16fmvbg?W}a&cg3=$vtAMC> zb9iPCd(@Z9&S|D#J!t#HW$Igx;06#0dSp&5dDKV*EED6g2hd6T;B0L|rdI+EUfQsq z$6hLj`w~iR^O_hl9Q9T}wDJJ93-}$NsxAS?Ovv*N729{$;6+DhVWv7%fF0Y12MH&8 zSu%aLtJ76Z`_hhoZl3-EOGiKSfGg%_&#L+a+!sbz1TiEH1XE04FIx^!x(1k)wXRP6 zEPy%t{^GItB)}0zNgfOA?q*ohMRxxN``pGc2vC^dR!3eCv}#D4bAg+nR8s&CkreQl zrHvZG%t26Sufz-s$WFY_nhIhn$3XVfJ^iS0icDBj{W#lNgOolYdvWn$0K~aCdN=U- zATG(Qd8Ck$=LHk!eyF~Myc{~WCE$e59E|}+ZiCTkt}E1MLw*bFw?rW9aFYOKE^O3Z zMD_ZkDI(|?(1W7~L=ueWGJ&TT5I(o~tcQV>hT36~AA|1x2mt)&n|mF@(&Zbv2!z4C zbMFy+4*dD*;#o`^@6*-|iO68cNQgti41XUU_aG&LzyIj$Z&aw~OYX0~o4`M})_?se z;+=GsEgGVF`$q11LrF_fbC%n=>0gQ26s?59q8sfygz5 zp;Py$^FkIknoiaMeBma<^!)cxy?3rM3HP}y5Ae~P@j;A{6=Dzy>|CWluTg~5& z&WHYw%ZGknef50j|J#RgU!U9jzy27^h`;{i?EQad7EF9QCrCq@4bE&$da&SBB>b*&X7))03pXJR zdH4Yc%M}548k`5t-N3ZVeE>!o+K7kl{f8$%Bw0$7PaW?)euF4;n7kVVlyglp+=6r!>`@bfG?`tRc@ zA7DYhtO&SE?>>Q>>e-NDyk2K`M8MCYoA}H9^cV`SnMwh_f-gt}Kv=kK?5M4O+K{O- znEsxw6sS=6z?}9F6SpY1jr851OGI`H1~fvC+^!jprT%)V-gS(^ct99}ygB^#8Dw3X z&Wu#bb{|Pd-W-|$qZFW97Ju1=_^3#s6}d zC_v(EWmf=%aP(IqreR5W8@TPK(`vYuFghw_2M7Lvwdvr7WZ_gk=? zIf}QOPy=aDmV{Ffnud}On1%z@wB`|*xo05Z&GtXHll5@`>Y_(`bOKnKG$Er+6;=P5 zg^KJ#E$Dq`K`Yt$bH;J%)>J{`P6Ohr672VI;ser|02R4w-LNo)Zt!^_0@egE+jrbW zl84hcmVv|-BM_OgA6@^(%RbrK)PU5K;N0mVB{&=6TtMRqB5xvQF_@ZecSOU$hU95I zj1UY(@6d+#AZ!wHf;LsU9_?E_WiWWfiA?kV?Wv2EH<2g9Bm@vwdEr!bBFvYBaZ%l0 zR%m1TOu&au9JMW278cD0k+Cl*cw`J!;o%0%gvJ2b-i=fKURnb=JuTy&P+;F6LX5|s zB{%=ZLNRpW$SE>@*rL`DeSh*14z`FQ!nDCEUeY3-eU=*2fnHs^GF$4(BJQg+ZqC z<4Kjkv=+!#Jll8Vf7Ln8H-Yod4e6B_DoH2wHFQ#5XaI$~xVs2&<6#iE?kn$D&uFlYH zfz%;V3#X<#QXckiMOX&?x)n*q{m-d_KoAhXK_th-1DHE@a>#()9|d=^w{wN)Y|y)7I$c_Tt9euL{GC7l(~<>{NhVol;41|~whZ_+zCJ(zZEVQk zz>1qn45oyKyl-IDAJV7-4XQ~`ce6W=XkEYE z$pFhj;KS@G9M;;%q6S$v=ueY|C0aQ{EG5g%^Ep^ZBJBLrb!qUpd|`>CWwgaCefCec z0Cx53>0#cLNS?rzU2WEXxNaT}!D!ZSdsLJDOFuT;au_h~3sWdUkV0X0Z6lMp9N?p> zL~zA{KpuKhz{^u0rZ^i9;C2)KRadJod@5i+Q$KaEO^16``nUdgBjvGPofG(Aq>+Gt z{oDb@e&ruHBQt8ieOdq@36u}9jIgSh?7~QBae^{osVv(>w1y1o3>MD2k{*NHVhYv$NzT^r5 zhLPw>9kH|FQ4X*DpQ2)cBYB{}h(8AGu>=60z8X!?rT+AieLD90D44DsO0h|3eS6zE z$TL!gvj~cA?xwSEGjjiCw$J{u6AAD5=dz7pi%B%{9e@d0(o~QXw%7cS<60|dYV`$4 zd9rgA?+?MwAVuT@7r+u>8m-=*s~o*L;Jly)qWk|0EXW>%Y$lzo3obcQU_b(i)}!Hgp9Olfm;ijc%%>JP ze1N-1Ngfpj9LUzk8An0@oXDyO4AH%OFgpkV{WSlHD+Ur1+cL5gnqUkTX_(O$PU{q5 zSP;Qch}?j1+M^IiE;Sx4$AfCbMq$MR^9%s^Y8wGf+=inGk!aN9m|H2Jr*Frdc3|pp ze!C+17~lIa*)QLKk1Y8TKcD2E!B6%3a}`36F7bjY5ae$b;YQgB(^Uf)ixF9cT+QOe8=s zK?PSIuxGxJM84&=*NQU(spV@2NS@L|3w7gxpL@=RITBfn=Xu4yobD%jP&5=e53TzE zWdRYK{DlMtK~|jTJPiv&onbq@otumM2&XU+mEo-jMn=tgGWw#?m zJfBHTS0xn%$?>xzSCbQe%10-do$K<-w1FgRPC4~&O+gbfu~5x(%&M1FAq_!1hr z0)2|-nwY?yk4Xa%jnEW<5}VXY2L1ZYi~O#!LXw6G*_J`h8+#Ty&K)OCD5#B;W?Um0Ur%m;;wi zB)XA90wf{I2c#ODfISoK29T!v#N=n=MsV2p+WZ)}X>D@)U^~+J%^BIC0^*KqvZ;+b zhxPw-K@p$yU@yHJhRVtsMu75w1gP#&N=NYyyS-Y^4@MFtRpMlwFwo&sSZqZ26K&#v2rS95uvBN+a22J83+ z4+H@oO8+Ub0UhkB`<%H?pYL9P(KV1pgQVwwPSSqZL;uU+;J5GoL-q!N`0pi!*WJI| zzIrH=g_Q{%l*#Fdn$5k(_r;$mJVqcKhGo0jy5#%Wq}ydXy4fDGKalTW?QFh2 zL!6Ev?jbH>U|?cgxQK~~dFj$cENo&N?8}$2$q9+@h^Z-PX{e!HosNN>iSF7>dMYYr z-WxY>-+}tuX_@$i`8b5wIk`B_4uS&JoUt!sli}cyaa^UkibSOSxBfV-Mi5*?dym0@ zhH?#oN`Qh!fO1-ophX~1ElYgK zAv_{7>SJ_bQgX_d)U@=BZ{PC^3X6(MN^9%t8ycIMTUvX1`}zk4hkg!EPEF6u&do0@ zF0F5DZf)=E?(H9(T^9-h4P4g0uI%5givYSVRCIJSbj-8sLP52MUT6g97p~sHAQV@` zd}c{>jpOx2;=3WA^J*^9b3R@pd2ZE>b%lXzl5zd)(vVm7zjk47{y$yWzb@>*u4@>9 zjfMg}JTwA?C}Q`3Ine{_f9xySUhPNOS7oZuhlo!X62CJHW+@joU5#2l$$H`D%JN(F zQTykRgB>9XM6@6CC)EG*`rmsG%8ME+@AxgNoV4bDAY+T!%}V{#GU|%C+2IuK;%}MO z8r@OHKb!J=XuFFGWi=kZOseYf>Ljt2g36qNp`um-ISr0lG?X&3W*eXQ`7Iz?!dQ6QKT{r>M?St|w_ z`9FTkcl3HF5H!VWS6p~*B*IWS@JEF?;1xEJN7?u7Pq^Rwp1wq9^{^6ITTEC~_}_ag z|7T8R29&UB=)UFdEbH>N9!fZG2AKa*dP9bKk#6H6w0`}V5#Ti`!sw78kJZ`JIxHVa zYAPGjCn<39BDnbn#>wX?z7?k1_sGHzUKEj^6fj1lI@^eEJf|-v$J`$bThz#lct&6H zQdow2@r1e}$ndK)x*uZ1Z$>a`OwP*PX7}Jpe^`cA8Vkuztv}@OJR?l5=%WzYt z;LU_a4>ra7#E8GXR6BG@j_7ZBmrD<>(NhcT4@(c>(p$G(6;0bYpg2%TTRPy0%QgD* zEJH)e)^whcR*3eI6y0HvA=*rt;MCh^dD>j|gLVUo+A@?`gj5V~U6PO8(X=b8);Q$@ zD6?;Agf^m+hno+!KN7x&O|Zq^m2H*lY>{#|TI>D&OrsyS?-aD=%hMzHS+c7;9lGdq zAF~RCKaP-Tl_bnMelN_K3c_*2B6S8h?eIg#oE zX8D?Tgqs*+jOm2(a<3`)i!d0BUj5o=UDRsoDzg22FQy?nzAEFM^UdeXQ}X^;v0n3` zBIRz%A1rN>SFC^J))gNp&dpXOl^s?!?{qLh5$;&BAKzofrL2eUq9+BW$uUuxH&m!A zq|$P)uDJ)e)!zMzLwP(oUKUlZfcrUJEv0f6`%qoMWl&}^?mh`s?|rk&9h_N~pV~O7 z5Uf0dx^GU*B3`v{ybi5H+u}mWzJG@SFCOdtt0&v3KTz%yKSEK|(z<74!PrpmPkbk^ z^Y<%6x=BYR=hDXF33+~jZ);3UKqcPz6Y`p)2MM(v*Tb4fc{huT^u4j)mr1otnTGvZ z^!uIPtbce-b|+oeVeH-hSNAxV+0V<#;cafV%azpYX|m5qevE%|Nq&UsO3BGig_usG z7D-Id+KJ0#f(nl_|St5F~hLr6)at=zRM|(*5Vmft71!9ewDZhb3y}W^>*; z&CTLM)33#7rKG00tMDb?pKP^8A&#fx69VlDX54Xv?qn)B(&S~-aHo``@853sqETtm zqQXz&-#t*xd4#+-XZPp-y#C+sfwBcRs~~FPoUNp}vQyZea>iQGy8m+Yc0>Klr}4*J zeC>vpYS(`q%y|e$Q$N0;n0!Z`>Zv*Vq8A!@3-`RnJAX}$zGOp2+i$ctEyDtW9}9PJ z7vwGtM8B(ZRebtU!q@N@D-{j@N%)k&^>6nOnwVTDTQ9u~EZ9F1f4iH~Wd+d^NcP1< z;i4YzwbXt+MNn)e;5t-lDr2ow3fWvQ6|5p@aDLgH@mp`)Ltr6UJy9KhR_%q-GG1+% z?^Ze)&&2g-gQ;joC)_1s7l;+bE;#TuVHyglKf5kDkf*pWeTtaY+0?OL_pIGCIk_U6 z$!Zt9(v0UTQIB9G2ue?DDA&l!D z!coiKrkqvWy$&1;+V`Ero7GA8RlTLAP=_QK{l{&n;n%>Ejcen%i4PczYB({N6myfhpDd2Ep|AD zPtB}$6}PcU29WS=2`roCNV04-S4z>T3hO!1(+l|xIX8sfL={ja$#P|h%>OQF^F8KT zFDr?%kl(g~SG02HmtP}AY4`IDuC)GY92=qWEUFUDY^N&^?O76x(lpKEvlW>bRQ`M< z9#cDbP!RY*)-{#%6mi#xEKR&qP`{Xt=HoCP$uF<^wA$VUmoLs?4|8rPU{^BcW*l)> zO?0MCllrpTL~V_UTzh;uut!d6eTCle2v=cNeH?4u#V!mp(t1N+ zTG{uapsAlflcMpfNlf*n8FtYU)^pe|w``>!rTa?iKJ+fTG3ce>mB1g+x~|6Ul-FBo zuREB&_1ldhzpN@>R)uZuj!JXQe2T?jgv*^CZps!_&AzJ+W{T2<>L@t$G`vqw5xAV& zOv4oq3xw9rw$&WYDR=KxA(@H&=idWb>`kW}-qYwJ-e9KJ@X-|f9MJVCSXRI>jHF1J zlRHygSAG79*o|qUW#yh-pQV48qUQG*6WIjDgNeCPXB@Lc#mF?Fd)BEY0s*^uBMh9K zEA&xr$}RkhPq+fP%D=^YU{rn=8L`CracVL7=gK|0hE7Yrf&|Tl3LC*=%&Ch%G^SqU zAIi7;e&hI4fN#JM5)dyo9Tc9Tx6au>%KOWZ_C+YwrrGQ>u^mz8&Ff!H%lR!_{O6^g z>(pS19vlC$(M9}hG5)6hT`G9mU@UA^v^LL#Kxtfqz9(SAh0x|j$?SK#%Bn#k|PcHH%2Tls69#~2stS+Da?)AP+0e&)5mWFE}RQ`h?_)#tOh zjFEoNub@h&NXX4x6cYO{SLWQM`A`2hDQ)x`dy__fvkCDCEiLQI`juFQOT>Y9n8*XI zFz1h1CCPhiu-{G`1Uy3jpm-la{O>PSoM~EL4R`NkXG*ci==X;$Wi$S{r&r-cT1`NDAR= zafNaZ1MQCXH@%@C&S1si3e|^wX11Elt1Aq6L?_11Zv+XHACw!L>IJp2P9#9g!?s^L zR8_upn`*2cJfjkuaQgoA{U>`NiiuxMk*d9XuixT_+IgYb33u(O@~@|=MVatuI7O;W zyz5x5<0Rw^ep+#Sil7zgDQF^`jG-E6igms5NuGQ5P3Pdl(PtuF)1>;t)r775{{X<*7-k z;WF^8Tuc=uaIX(=j}Bn`;%Uifi%jCgsJqWDhrOaeC=pbC~)sk#!nBnfk@z6w`KDgScN^ ze4`>RUnrzfSXxA(3IgX6}8g8L9L` zw~yHZ`x;y?7dW+fy^oaB7f62)Iln3tfA{gy@f1OT4O4Jhj)NYwD4d3Jh+ln~l}s64 z7&wVIMbIw@u=2DiA1c4Kk5^fsw!ay2`>B-ikD&Vz+%`{J>*xj(U7Y0wIXi{)*4!lr zXG;1^8Nw9$7_Lih4BA-nx}=gZ_0c3l48}{8>J%!$4w6u4r24aeB7v~{&S%ZN9N7`p zb)shbvEggSgUj!ou-ByLtK|ARjj?_Y;=N1vNlWilHEmm?Uld>)HYWTws>{rXT|7c| zvPK;&tT3rlH;IQor1eu_PG^MPao*7J!<~I8)4|TK>MXi#41{irzE`DZRPt30_qc0r zT0d-|Rlnzz#Ap2^t#_+x$@Ttym;DrnV6C;^Aq8>215w{=jH`@MqKsgsQd#=#xMS~q zscX1$-TCfg!?o+Lo5#pcl75^b*u%S}h$wPKI2+r)Y3wmVf}ps|sTm9A$|h}xvgkOr z0uq#~o_)udN{_Wh>kQ1;I_mwY?%c4q6Jn;8cc}Q|PpR8KQ~Lbz%_(MogXgCR-zB$# z9*3s%1pMUGD-k^p1k5cyxN8*9q>-SMcqK9+o)RTERj+B+3R&qlYJTdlwZ2ES{^9)# zcNRpb-{&t{tW69wPha}_P;C|!ZPR+`enS0Lu3*6Pc~bag>reYGOFbdQ+)OT0#8HQF zw^;A@lC`pkpu1TY=_WjfvuZ56G*(V-I|wY-RkD}%J-#CFGKp25_>)T}y-WMMAM*@& z3ZHWY9*a+vq~N|Qkj3wvle&k~_0agYy~uXQ{Z}g4DdU(LvvEXYbuU#kVshB$cG7Ns(gLlTP}j=A{6%p8lLgYj-RyJIf5zFElf@RdyC zJludg&D<%I#~Q!n*Bd;2o*SCKAmEwBG%_c7EqswF_luO%MvUf0f^D-%VL${CL||3g`PsnQ{6W^Yn(LYoWK@Z2$>8ynX?iO_maT9jT;8B6;2cC%F(`s;a8?9+L zPSR`2&=o_B){Y+bPLvbZwI!Fm*Vdq_>`e;;Wy-6Pm(^$`OobToPTx(OY;InaDX*=% z)qGiR{f|;>Nl9spv*Y0{J$Jj^{oh*UWp8R*P0AuKVKZwF?Vy&g?aeJK#g#{H&@s(Q z91iUYTW@93lHQurMalavm>4?69ThOE6pAZ4ep!d@^Kwuq;?$exXdk~>ng|~ISg91hM^4-7!TZld z*+;JKks5}LuhL16SDU_~G5ok7FQt~()9=>Lr(#j+8DUX((C!tEUQ(saqvl#E> zjotIW?#2lcZeDQnz^dgNmLGZIwC$irdC{6(-H|DGDr7nT2~VWm?oNodM(ej4mQ^XG z8WL{XRhP|&>|L*NDfc|5jVS9m7uLG`WuK#E1XzTT^9!#z90WI3gjOo7mvgE+RH?jC zv0AjhI{LE>wf>FUCr`0p$+eRL+Tmw*F3eBmok=SCNF$~Uld+Qx=(cjhw*nO>S;&iX zb|L=J_qC|)t(Z>@(MGbrkX~7DEv~~}f80+^Gqz&mZGI%*Lrq6mnw8NUi&jlZa_Q4VIc}(l2^JU_xX>i zBF)!%4ZkN{CSl2w+qh6=#K69)J~aC=NJivKuDH!5szDB|cN6`~CU5RUPo_UuILNxr z->71cVW^RemH7rQ$3&i60Y4{oM**v)aBhpL9{VW|hRi-xfOA~-+q^705HL&TspGlU zNLiuVSQtuA%hJxZQ7M2;g0>`swiq`2^-Uy)@6uGt{U7P-BL+MFS)1d@aekpglRBy32ILzI;ht2)pf}zfM*1D1odQxHceoW=ZKZ%%T zoV7Vj2~KrEc^$U6_vGNAXY#_MeGQ#BGs9#=BXjl3rrnrKH|`{{H~%v;r~hl&=5pt$ zq9AqlQ^X{7uQ@rkJNHaTC5QBsP;mPR+CYVOC0Bn=oRCalBL;e?jOi9TalA6WntcZ53*j!8PyL*8;)Luas zXH>)Wsk^Fn!dZr&jK>A5>^V*i^s~iC_q}9G8)1JeW%{vqPPDi z##PgeRkVnMr)f0PBH;}UcD?eIQlkplO!cxQ*Y|>R$^&FC7X}bo*B&Kpp?=FwUF@)) zqHiA&4oECbd3ak&&!nLFTDCTek4N>Q8V~P@4$9)PCeKF7(IU;CNKxLN;^`~DSVj*7 z3MMZK^tdhc$MM!xk&GG%v{Ptpc&2L0ezq5j*H|eVrczuPufED~iy^0npDB|l)SXjj zZ2h}Z#9;NCT8CL9bM{A1AGA zlpKz6x7dM(lub#o&ijtvz2drx>Yfu%ws!ihc@*!Y3o&KIVb%}WH?-DOz4*1=QEbtc zJE``^g;DOsTqc*N(cJer;|J2eZ9WTdqzWskheRn~D&^Bc`a2}D@0GMRhKQbt$u z$+ZiAJt z|7~1iXXzfc{KfQsPnqon-9*1lSNp~<%j%(>wX>n)sCv)eQH~N`YF-)6=f|B_?Xfv_ zmn-hsW+t2(&>vwi8~G7@SHM$;WQz9ZpGR+G7}s`EN!s}-pO)=2pdC-}6!QJ9IOgBc z#T~8@iKFg*{DLX%x$v?M&xZcSi%3hC4_#XJ#L;raPd@O7$n?9BIdt9Yz20YwL)Kt) z5krcUKxFhiCRY76eSsYJK!l3gkPOo_(sH91`l2 z>MuK|XtXER-ruNu+c|x_>THnOQy_Fhue{ zXnXH1VZ!mTt6$l!N>7s!e83`peTqO6&CPa!9!_>gj{20vt?#eHMFU;c*Xe5s_hRbg zv2iM=esRlf*TcO|(CIjMG8eM$PH#a)=HZ)rFYeuGQjdU-Hy#?5AyxH(1VNvHYP zmq`0C;!sn{nCD^nP6^`LRdxPGFV=GcFkCim0`qZ(lm%n9AlFwi(>c9<_@%Gj&5e#a zwk(Nwg;z-x&Z@Nu@51(s#|m8aQJ21dmU#Q#t@GnHCS?!=%N-pQO4pI0A4&;+ve2qD z_9gUKL99Q&&DBJ@wAXy_wpOE_g<||$XV2yX)%M|Ck0aShS%2>sg=lB8*p;%^_Vnxz z$)*|I-lfhaq-S=xF*+2=b1HuCF`Gqjkf%O!6gu)auwkNoup~s}(|yF0QIM>(MC2Ms zg+ZWa6D5+Acv7%jYL{*G%h+GCmv zrC-XR7ke2dTjtI9)LSO$PMTgk$I!fI zQ-Q1cmqh`)V6z=pj@sc)s+pAX2ObGZuUmF=1^1?@n~tsxa5m9j)GMt^TaZ!8KOv)E z&s1Hql5Z$$P}{V?Grn@*+Mc&0A-TbhUh@s#_Shk3x%PzdtKY17YRP2_^8JsmyJiQY z*ZJp-^d!x#5F*>DDaIi`HL3Jxg)dv@t8iyLh>I4!S%fJ|(m`GrU05MBnEreG_MX>d zhpc?e0|C>6fX4w>^k!b4^n_kU#mn$pSMHhdiSX7Qow-4FY}}(=P=Aot?WeT;IS8{v92O0JrJs+aok7c-(N0z#h3#Csq zu7_QCE2kwXVsx>_PAJr!Vog){!F1h0vOr+S$W7NLVFiPwv9=f$e!4RV=iKR_rm z$&bi%_WlU2ej|#tS~n$}6Kp;EJ>c_%M!NhsUghGBK7__7Rlo-xc=0KMX0M=}+sNWV zUV!$PIiiS>SdT5ZDc~d@rDx38&d#jR`K{{7#B9}78I$zkvEZ>5&xIq3^$I~1PLZAW z-|w_A%!KI_Ozs3}vs^*B{JI62e%Xqn;?y1ag&P4)EX2>2F4lZ`7j)^$O)uiecX>U#YHyT^>JHGq-VF!TGYusB1v(0yB@JE{>q23~%# zZ(1#zW*>{Bvvp%gi9V>UtO(sWa8CExydIM5V$(*IFfT#mJcy&Vxzv?e-LGbo-lUiH zy;ut&Z=w10vq*n~rj{Pnz{;1@g4_Ld%p2dA(gu{DnZyUK4c4=zE_Wm=+&JW(KlrL} ziFq+tE=Z&}S1&gzKeHm9?rWS(t5$s-CN&wwfn5bQ_K2tdf{Q!xvq=R4ijYHD-6tgT zq6BWF4O6w;ICrKB`lWDnuQE{==_NUzU=|8f_^pUM-M1B?a2Ups7{AR zYPD1F*y(^`#f5Y-ipzqSt;mmuZB&9Rkpqu80`1u;!X!30x2K}8JZ5UcNY&oS)N*v+ zsShVq_5Ih_wb3=}H=?v!eNPe?w1Q%3XqQQnWJ{L0R68lU{B50g)#e6rQdkgIX`jd1 zvlNr>E-NmUj(^v;iM%o#*KQT`uKgxn9_Ab2Kr0~|rGntkskH_AxCV;4-6PQM=;6wA z|J4chdY$nGj-WDgATfH^uLB$34;? zV%}yVUiuz&Hk(-e_F^W|UCbs^3JN|xFE0%1eCM$LLQr~0!E`>iz^;IJ@U~_^2bX2= zP862BwpyA@%_jZSYwLdw1_g5X+4lJPvMg zBpur`Ja(2syPUVBr^G|+cXGc}k~>gXU@ls>xvf_wIp#MLCEO630#n z=o7(B6|NRqe*%T5pG|9{%5!WIG~*sRdz3|!o~)6RQ~Pv@hNOQm4@^_uu`1cPNy=#1 zVJPMNdZ2X7dcxj6|4onDO^PhU+EdqWdVNWH8|XcTv=~CqGCw#MKkr#-AvcL=n+TY> zHgkeW(#Aq+P<4;{$#jWAtsTX9NsfdKnM+$4N6}SZ#0?d6t5E~KiS1m&y!Df$l%I0( zti91a8`tgzdZ8DS?`wveZtgzh%dSG%yFOS$LH^B8H(y(BWYrvNWs~wN8WRFH!S|1n z!%mOMA5@boYf=o~^3gLSIqKiwp;bK?2q!`7Xqw|_;E7gQI5?hf6XATE0!82w;{W=s8TDUOg zy`0LOsh>`1uj8Pn6=2P=o4KatOJpR<5j$X$p4K`4Qk0x!NJoLo8S|Zs*uX{;%X>Aa z!Hgk?(oSbvqZpIj+-RGz`=6?DqL+RbOyTS2X&ZD=57y87>#PlY#g~!I($#EWX&}^;?&&;5SaAo*iz1q{e*sDlKk24<`n^0GooOZl*~Qt3Q@cs|UPp(VOLVz%m%K3#=tq(i!XwP!2) zvF0b=Qr+9A&z~zaOD~BvI#9dcEF*iqiDG9^)5YZHUVkHnmcaH8*E6r*9`0rFqH-$w zDV=vZUJZU2HsV~e${J*nhe57=C=lEL=Av4+oOfR5^T%)#1XbGRIK+nemA8pHqB~* zfI&;L0@-|8J-^4d)5vw1x?|9-f4G|5dp}|0Y8XjwzP(gQvi`I{*;@=-vK)(^F=aGF zI-58oPeqc9Me31Mw#|Xvx9*9T9wKkc)^R@UaAa{D%{)a@-7*O-G*a2*$F8I2TYMw6 zk&EN0ZU4egxQqUMMh1tBFoI-NfaF88-8&-_9-%(DmY~}*lg+@X{z>L+aNTaQMH*t9!CvbY%4HOkG0*C#DQrE_8w20YN_KH-_1BHjj! ziqXI1PMwUY6G>-53z-RZzjMMp^UB1S*kyZ(7MHF4z-IXS=6qfdeb<;$*OKtTBTS1k zd--Hro4r?~C&y-F;cemIrM$s?f(7v!%sdh+Kg51a(>ma=(c17+Ejr;?9O%JgPHz70He=Lx-IltYzNS%e^tMksUps zk<+D%rl^!^JG#IIWos-JcU#|Lhz43l>{4xKOS3y!YjGRVs=jVwRgcpjYi<6BuBtg9 zO0Hv=u&^1%6PkNie>viv{W?3pFs{^Whhwz19;;*>ao_r%NvgkL)D^$%s+>}yNh>EA%}A^KC9>i>#Ypk*vl2P2w}wjJEdN1 zQI_687u{6Dh_X8W^pVwjL;(p_&Uo%^+`lCgUnv>P^}n*c>Kj3UwZc>J@QvTPu+&s% z1>-o|wSuAmykgRJ{)2=y5^I^g+|2r>L&;Xk;+AF7)iEjeNA3#QdfTn4c}pUcO&iuf zopg0Kjuf8eCY*4Mj->`DGV0B;eIvtsnjD*OxWGHZI+`D+(WTj&RGAm)a%*U<)j1Ql zUiHGdeN7|{T~AWK&6>_?BM;8S$8vew`0NB%}mqU#IrV-tqOg+V4=2Tn&sp5amXX1Jk<3@sMEVZAqBRbcg6CvasfOf z>{7N4JK=0Ti{I4&6ZgFvNF0F4kgf%XP1mVda$sx5!a+EQ~KaH20!=9&K}vp@A2bHKX*DVXC~p+Q~7Pn z>rDySX}pZ53&c5|P1F(aYtyCdFNpuPbF(r@s=#LmF8mqDwB~~NE?qyU)JX!)+cw&Q9e*z zVNh+4zMkLOO76qGfh95X*ku~W9R#Fdkjw1ZKxC{MXlc#ws5O(YAk1n#9o<># z7Q*q}5miRf+hO!>_%WKQztL__9sj;B`Jx!DjKjk&nM#|!_<^x)=J1f0bQV}ne#?qY zQQZcNVxq4hFp0+k4Wsi*)u6{&!Z=QYo)$T_YV5b>>|QWPygfx+;ZT@Om=~kI|34-G zP`TwlEPX_oElc!GhWf)d3>6m1ex|g8M;Hv1EHRJ!zXX5$>z$HX*#PT5 z8p^dM0;8%y4V1h3uTZj&1=S0R*0L*;oL>==1mn=hhKkd#3q2Yu&JM1ny)^pqG&9bzL;!Hr&A_?Zn0)qBJMGS* z%KN5Zx~ec!s-iw%%xiJ|u#I{TdKx%sX^w3S^d|F(PUt7LFO$SU6>5r?F9B3qc>lLr4*hcU)=b4*Vj302cpOK zUmvth!*GnU>gr#0O-Tm_TG1p!hn|7}omgnaF6j0AcFi`OadkyO^`y|(W6C#xFjarH zsCw!J*~oxWT;GRb@yyqV@K%%fx&8|S+0X41R|@5oms=y_sB3E7*^+olwKdgxRjGBk zEU`z=7k{5+QLY)MO>MEP7xu{SPG9U*nzmeKPjk8cdepL~rkt^xG778)E`6kbm$=|j z-LEizuHQ%c)jKhr&DCdl%42Rz8suFjXD57Iu%BvUNsFw4Al}J3<0k>JJE!@R6t1z- zI_OdAuXc+c6XRk(Nmayw6!#~@`%#W_ox@w>NTt|TCw(1SX0*}E7AxSS7Ca9oJRv~+ zugJM}qIzMZcI;T@{VBV-!su`?XUWn&ty;;moE+=y3n}HXxhhp#tlTt+2)-aNql;4* znf5&2Y6J!F!uDf&wK)iN$+H=ZYfW!DqFET(gn$fG6UfI96Xtob_#5SN|GXeHWUUZA z>a^8$1|()IE(C~LE*liQU|hv#qy4qtu-B;D9_1~D&oNEa9Fo9aJQDu?qbeo-uYv8@ z?aZRsdxMG!rVJxu=Y2_M)PDfcxqX?odi%*-uF4n8r87mvg00>_l2JUxzvW^| zggP=%MF^$T@EZP>(swF-Zv-x?vCLO_a6V1W*V6j@)zc$;eQTR(iFdq#P{|j*BHM>$ zC4qqpPx#ROlMmR!Fi ze;gh?__nGN@LTSQaC>P!WteZ+m}26Yt(5T0JaJK};Al0jX#R7YgL9cK>hzdARYbx# zVT9GM;=N$3%k(L1i|P9cTw|BmdBiQ7oVwTf5%H9oX|IWSp^ygPjJA=(Q|{00X$&uE zMOL>mz0q>Ra%~NfmuRVJ)Q=+WLe<>^s~erqiXC|zW;GoCzB&nd(C0wS5ExEH&pj#;VYS|e#J$!k)VF69h`ATQcdWJD zjcS>7JB-BwuP&lvXV8QOz?r7-rT+5xJBKy7q%}V0nV>K(xp-;v`Tie(=b$@*isWtV z`m^vldcbsfIcIR+SP;Tf2+jhZx1|6Q4&OslYyR=u`#Gk0J`qsXl356jmRJVWfCu00 zR^%HzG)5_NZD}Pz^NKz-Xl~DCDt}&w&#o^)u4X zNc8`xSc0l31$Ig!?+tn_Z0z1L-*K;3R{#F7y}e&Qg=3a%JbiV$!`>ZwAl%gK;^bM* z^jw#DQ}x>W&8l;RpeeaNcW#*HswX|qo1&Y8556Qji#^QgO=J6;8>+ZVZTcRDnT6uvIF@uKCrU3>Tvhd z+l(jv19T=nDnLXj?oV@`?wk8e$OCO-q-~t=EhOx`m&aeZw~GDW-_Tod3zr?I3Fgx) zAge7#d@Y|us9(SR2S9w`Qo-E9l2hwcJgv!yBVwaxUk_1Xn%VYeohd5_{?8Vq+Z*?c zdt6|DGcJ%s-a`FY@b65sdG|QwvyPOp#G_*lF*?u3LDCb6>-MXbjU7mQ!z;;GlgmaW>T@VO?)d` zV7fg-qfel1I1bXBhUQSvN^QrjNQyu`5GXulcM;#gR*)V0GqEqW`~piiekZ-t&MTHa z>vcl$eO=$Csucxghqle1!*3ZWBZc$eeO<7x|FpVJ(OPJSj{3SM+aUn5zSP+`GA3JE z4XDHr60_5|^%mpTNBU0GQNsPzZFm>BR?SHC zFgG-dn7ZPa5{OQ^MF!qAtcB zNsubHr39`stHqxTtqW@>m@#3lD7D}(P`m9;x*=S9owogGqqTfpi&2os+b!;x)V9Or z*6r;Uk{6Hub@5enA01&q-sa|)(s8MEgcqfw!aIuP1#$AL*SxShLEZ|=gAa9zBd${e zd&#=9{i}WxcRXxcdDurXCsUsucOv?KBGZBXRUp_5#lYy3_4^`$0*9i&MTg6Cne!uBDO?5mfERDL{>Nq6c zawuI)`&=zpUofWHB%%t^s^}l5yXJ6>oNYmjjdoNBV&3ERa5d|nJBi9zKUh`mkB4I= zjS|4R!-%1k3<4$QS2A699d&Sz84(-VzVPA-TQpE3c7QsXQ( z-ejbBYIe!WnhGhIPlD0nvr3M2}k*f`Np z+@&O9=HMWKbF+_W%?1EQP&9(LCCKiN3gS`KNi1}C<31J8^p#Nn07uOC&LJUnLN0>k zy9|@!5koGM3`Hf(iG?6RE3**sf=-^ET!O`yFT2`$4!jG3zEQ+TPy4D=rCYyVSvL;m zD;*sR+j7S?4I)!2-9*1k1>FM@f3QsIO~^UH>#xZ;QLjhAbIxF*Cq;iiU>XRZoPSX( zQY^K{yO7u1CL75u+{sSGwhrQ$z6}L<6qyL!< z?EeIbTYg7l{PUQvLjAr9x$IwMY!Xw*ZF$)*oODr*o$+Zn;K7s*xBhr~V_s=S?%Q{F ziEX1R*e zem45tGF;k!fZ@anvXiUYBP%z}YZj;cJTu{|uEtsEhR-UE&S}lMLs$+{zXc_W4mvWW z2J;G32V^VpTYdKH8QgQppqVZ^?Ni&SJJ)OD7G>_G=oTYTJ`>2h{#2COHnNA= zB;tO&`oH0vcrWwT<|MR4%V@0+NBy)ZvABWgPnSb^@OCE)mRUMECa#+GC< zq}JnOK6bZZ#CJ14C2X^$~l^uXczfhBkGWOW2@}g6B z?)|}Xg#as)rGJ-3`i_NMma0ZxZg+6{uJ7OD4n4O(PyBwqQGCL$=f`Ve6*h9q69%q( zc$XT`O8rxQsT7uJ;t$*I)ow~x!%>{ z)SN1uymdC)x(!qcVLo}OaPEx+x@l0_oVL0-#VdGw(1K)eM9g#x--bhT4@NnWR&QA- zHvEC<_izXTX(jJ;qEllZ)%^LqwhowAn7*X%!Q9*s_R($xXfLqA{&?Ztz8i+L)m{JecmTEo@v@*U(;AzsU^7SUo&*<7Csd4v8!;YHGHW0F^7tJ8>eb*umA{ zfI*;@o7m=;C%n%SPn5DVJjPYqCZVg<#r_Wo1S{iKB~PC#&9(4HhJVpmmQf_C2octxc%2h>9+_N*Ncyp2PAdQmVf+YnY`$jNmUmNxuW zB%({ZuG!BXxzju{YjekQ;Gmf3mbtS#r*=iH+3G>Ve-B-EqTc9Qf}zm|9lnrvR7Jc5 zBAB|s9J~m6WK}V-K$i9$93lg0NA^+x?V%T#5t{CyGQfITX4s(q^exsmfnDxMiaHG7 z(;RZS<2!pG|BJ9^^wc<5SoYe{k>78uzYLu1uH-&k&!L&%b6NFbd zCm-x;=KeqjbZ`Pc@%2K-ciH%{+)9q!f?eKyOWQU*GxgR&X*p7H{ORMyd2McjeRLKf z-@evr&>ZuM#)+bAItHhsCqin7U_tiePcKRZ@Q(9rAEYZbQUUw!3 zpmhDPO|ZL7Yg^V%1YF6FR)lLl->+G3eI~+vH@9u}44{nyjX`y7u|Z-9G@5->1LdYVF9@cJJ4|36Q{9-DwZYo{3O{O{8+YsvP!P za%JL4esshS!)anB`PZ6oO^Qf+)D7&@%VJgvhhR&AC84Phxx5|iY2~$mKcF+*wVEK6H=$S(8v4JxfYdo&<$8GhQRm)uihJ} zqe4rf7kAs`PhN*yIqx*CVdS0N7bc54+%WFi-Re{*H6?I9Q%&z?LC0D8&?jJb$mM1 zg>!;M)$MDla&gdnE1cI+iE?A{q*J$CAD;b_e&wmeGc2B*Tu|EP_fwdaSBz0;|El8F z*Y>IH#1fa*X{qOTcZ3zjoY&pjEfH$-Y$*<5w01W*o7N63FYqusfuUy60r zJ=sS#_)PwwPqEwn$SQ}%3B`6x$;a2@^akVL36eePzAo=sz5!J(h2 z%ef>)LaaE_h7mN<(901h;wyAzOu7*q*Pa;UDzYRHBTl5W9f%nx{rBq@Z!()}ScLh| z$3J2UVqv}lFZ3>(Cms?u+6PL-K8K<@GJzIO<+>_Xp15h7?pz}gEqtQCANfEfkg?5( zF=37hhE}7=LC=Q(=B?6BSXS4Zh%Rb*H71KH5vEe%htd`f^2gAPgK&mYo}^lu7>%J? zK+)G`yUK(xXKvM|XXE|caZ$%2*zp%4K^Xk-J*GF))tZ4g2UKO}l5lOcTxb5UF;<44 zsmH%3;1phn(q(4vzAVM5d{(xZsqH~rJ=$7YA9r&b1XgT+%@viQ>@{FFQOu&6=1O7| z{RePo#m>0Yf9C9o!4fOX8x+0~qULIBc#<}~+uY(pDMiQWv|uqDE>`^bV8ET;8;1u1 z3*{9Yq{`@svL{g_fw+5L|z<)ZO>rG zPGP4!D!y3^AU@3yMl+Lm{|oSo>YldXE#{Yj1r4Q6qF2%Qp^LGlHw2{p1_9jM+DQ_S zs73w*W9unSgfZT{qh(9;Ox4%;!EPVSV7DWZA1HH;ysekj4%*&SOxmOrrf;c5ah*~_ zIL^Lg3p<6rz`Ga2+CI%xlKL}Epf;Kt^0f8mA-j5 zT#{t&|6daS|MJg-`x4}SI1-T!x{Xz0ikrt}Ydcz`Y42TK)>BUtl>QuoE7TM!Qqct4 z3wJUc^;kc#o_T`vJIt=+K3!ub8y`EaYUk5(tRWv+T8xebV*6_bp8+RIp;!<>YP_aw z!M8h4M4T6I8MmppX$zc;7LedpbCB?Ip&$9x-Rfi1KR}b^W|OelI!PeKaKS5pKCgeN z+RN=BurtXrd%!2hMLIUym#1~Q*8HOc0JzrRPp&e<+v0xCy~2KOPNJ!{@SMD!yLV$- z8lkX}8Z%j{o?S}Z8W8=VI=P>ech+EFZu0#w*}b(Od|62&kTopKDusGi6LMdTvr8P6 zixsdX^Y=%kq6lul6Mb-AiG==%C|&u=cyT2w_tUTa;N2jBowjgSZGmx4EjmQa#jvVP z8QW_m3^>8Pk79E9RlbVBo;Fy0v1qE|JUN!`ztGD5Lv0&&Ef=i^ayn}l8uO+;UBN~( z7r*cai2i+LZ3Ab5C>3DmDLIgTYIv_Z174O}AV(FY^GM&n;o032Ki|el-F|;eJo_yX z!J76lpDFYXEONCK$IuW<*PKZue$3Zg=2gpC6%s_(JB?BW@WfT396;k$YNfCwOKQDD zF=F40J}aeVvU-JkYn+*Z(>m;GY!Xa!*M7Tj4W!jI=DX(ha#Q$(^Q<&al7C3-lkGBUywFp651aZw5temxR~ftzYLsIA``XTvsJ)!ledV+FuHg;9^3)q0iS) zFN&;CIcGuODXym#sFF{YW8F1;EfG=Kc#aJeiK5zYX|;?1lv4^G$u-~n-lUx4HG#_M z$Qg-m8UWoIAz3uLpX9c_#o|i|z4&U52?!J$td#f#6V7w`bXq^^JgVvI_0vD%H~ra- zQ{k1%n zC8p$WV(bQ)r0yZ}b1^&>77et^NF-ZHVBVrg@<>H=ClxwjHSxf^5yY>Eswn8l?Dz6{ zI2~xK^a0iXXxS3Y1jyjhx#c|D+zxsOP%)>gwJ|%ne5{ki=VP)nMdto=|`W z&WXHbTl;6N-*GxUQ#FE)CNBf;hqFYgh}6>Cg+8pY?&-oiXnL}vAE#x#_z$2m^Z3g7 zrP238F^D0v(3M@Dxr}S4PJ1F` z2=b=wVU+#sXqAZbZSM6|9O>Zk_H-kc!&>aIMX+>K{Y8W@lgqP3{pA*n>PNZ^aoClWH?Q`EF08hKzXA7<%L4H+twUsqOpA05fiu6Crv@`%+E>TOQixa9`?yU;~)&z zDlnC6V%=+3+~R;BLI~i_^(mjZjE05yj)~&KCv`0xS$ppM4IJml+S_pm-J-_wd_mnM*LGZth#IG5tuZsdtuT8I ztBeaE`LbQr!E;WE_;%ia>0g|p^9#x%TSo%=!o>JkF&UZPM{U-v_Us@<5{@0L7Pj)A zr3+NUFvSbkan|Vo%5=|T)sde>;5E7s-F%|xn#{(byz{TzNR{$o!ehGa=I=<*Ry^Y; zI*FrhJ8`|2fPa8DvDJ15PWkx;1HOj&Z##`aftbM9zsU=EZj#g-CQy@sH>!4AlcPs_ z1vo0+TfEUD1P&?jl}Qg{;wzMBKHqH5uDWF9`Edlgb;>$IlppUd5$*vx-D;8)oP(@L zF*_V!I}1l5!NSN&mv};LP4hqi8sANko7oe%g`=vVqaka_YJ*_5!BI>zmio|y96H{o z9}(L4)NuM|4QBf^nUH3C+mG-vY@w$acQ1xX>8Lf6rkJI8cUzjbwvNBjBuLVf)LpUywP=Z3UzutoxS{OJy6 z0}x5ZcPD}7C%`ix_s2TJu>9}rQ~Z}bAD4syp9SIg#(*>Ss*9hBHJZ`ukTp_@tXhlh zbLC_74dFGq8?~w3EwwkkpRBSfD}(i=6o>jL#@t1AMHgvRXUpjUkvAk9{LOq|2haJe zJ2B}U#7F*f_Ik;A(15or)0!ytFyVo4b$XeXuevYgC!%PpJ>(;~vZ`WihsDf8^#K;_ zyMt0{&PB06X%*Er?}kUEfjhw$U=C+^l^|W~Pq+`-jHH|WfCMM~iI#-%%z2^S6Oq|3 zECP|%gvENY%}Ozr8klcGO)bt#X!@zl0$)PO>%ft^(NyBatXv}K;xxGGVm|p~@r{f!Z1roBvICO1;1)#$_nT=p9xw2I{v7sEj z6#~~;3dffkoO!-u0`1`(KN}mj{f~!;Ix1$B4W?EwDrdP13u>a9c-W-Sa2i3A*8DAB z>`fzax=GmIO+yCC@auS=TCKfp!P3x5;ii!3b#}V+S{2a*i=6|cxU_f>6_!I&$>D{= zB%Pp&97tX4lPcrjfc3M%V`-LN^>aQxF9|w|B$A>e65U5FwgCXLf>;I5fc|S2oV1dfPpeeJjEDot*u~ zZ0)n)xb#R)GDRT(*M{;67p^eZ1y1=R3_FVz1KA9W(Co zrQIz#-=)bC)6~hsPUH~E;5%f;E))%#5L0PeHHKKLc<<$=#<)ZGlj_AvhXd&2*LwKV zmMX)6XbkQ=^c1*kfr5seg_0fA}PpoPtTz+Uc(Vm&S+NSi(1J zUy^QBzYmIyBH?vi#bWauC#g{Ni}z51{=3wUa2lF7n3hW(PoMa;Sp(i8*7>7I^08qm zIP&72Ieog-l{8|kDoE(=7miZFZv$yI{^KT(jBNKKor{{{WR*78&0TN`#jv$IYNkqz3b zrvebd4!Wwr+z2Ztcg=M<^eFy2ta!QZrIxk8?``~ut~xPgKx5S+-P{P2oM2X!4_sm8o5 zn7$L*UZ(U>*f&+Mm^a2Xsu9&oBc{Daq(nqD1V7!d^2p z_Wcl}X&rM{g_ppu+HnM`C>egv%{fs0p&J78re%u>vsr0oQi*ujZ4CV774_?nVyf8| z-`&r}O5&wteWTBHz1##z{G^ygrlH29Ftz+rC5KhEWNY}%pIWY7*0WR{QUs=b@ywC) z%OI?g7Y7&iRs{|WS`wP9lNUHohCBW52mE+MGIDg`bV9wCu`mQ3XGbN5v#+U;y(=BZ z`TSrsLG`!GQw`twvvoGG@VG`-FJIA12OVwnG)du}J{dZLlu0jd?rjBJ!0 ze;^#S|BvpwNHKomdgED7koq4-YNO%(mng94_40sJg`uLERiYh17~J&p1cjscX6Tcf z;b)A4m%Y8LZE%c>NAP{C4$h|rt*?p!G52C!)G^`|=^~J>m{+Lg;f;kc-EJPC5j1_k zZEK?_QC4})%j8XONEqkDf3%9k0WUpK@3AS7UoBkDN$sv$&)kN=?#wrZ`zs%M4%B0z zdrkR`_-XU*?W7j3CfuwzL5ZX2_hkpqw*>%Gzmtrj(@ZpuS?T-k}HisF{qvA1Te3RnE5V{NymAlWc7GIj+*| z*Gd!Su@`)XHoT)L>gj}Cyra0mm&2QsF%o5nESPBU4`5Yw`ZwRA)NqqKP4~U`m(Ya| zOw`5R$Pv5wzfa+xZ;UOI-F&foe6drNOr$@I4#KF~6Dle%Q`oFXsaKx_pZ)s{e=OYP zT;oY>I*|YoqvX--`DVK^>a+T>PWZ!syc}(Ga&F6|B>!4F$1H4I_5VJRI;ID^xD?}D z?tJY~qZgYdq=p_Z#6wG$#TVd?`fmP=SP4z;$EA95}xT*KBB zI?_7{B=+J2?V2{eaYEUTX?urMr@0Y#Vz1Jr@t&`{bfkT=YEBsZt4Gf-cP|Nk1?9&+ z#kuvRgZ>sD)6h^5K`1SBFovcRab8Dmcnbe}j%DQxY?e5RK6ot<=AJ-o7t*iObZf4I z9bXE}zt=v`4R87#Hw3o$b|BEAo#Lz}ZjO^btTGf_vQ&0$r11c9YPgsKUD43Lq&x4Y z&mS1$?7`+}7~UOxmFsrMyUdpL76_wgV`(S{L;lbg*rl065RWQr96ekTs2 z5<~w1ByIzb`gOJ9)8tBnem^}GJ&5EXZ%LWab|xaGfBP7_eufBwS#BJ!CajijvBE2P z-FF_Q3IZUj?UZyHLt9ym-!-)o`y;`^_mm2qdKbbUR^ z@_2~3+zI~HCyqjDLo(-zZuhLjh+rcRVTnx!S|rYNQBo5PIs{hkt|@);YnNAM@N7fl@8buF_s8Lz z4mI)M4p*;)Q~xM+1SGrdHzrB++&s#XhL@WZE0W9IkdY4VaM9kNrn1ZOD6Clb&-+^2 z+L2Al?DS3uVPV@@>~u?<^o7>wgLIWw7VdL&6OG`|Ei$BHpiO0HBJ@K1)Bkgu~Ua;xnv()f*%1hh`7M_iH;aj)qJUi5{b(AjSqs zzzbFHb{SvCHb3hOP-<~xjyI0Cu)lm6W|4b=nVCOcVu@yj<+u5kk3050-QXM=T=SR~ z)^K#nUmgMbML8h~m4KUrAz5^o|BTJ|M!m-IiuS`*H7$#E6z$XDorDQh6df4ug%bHT zBRo04Tx9nFz2|SWQEPwAljI$Q{*A6QkfgDbJ|1{v5-(1kXK>{wu;k3UO!lor7L~h? zk;KpcW6@vqr(CAh4PaI!$Huf1T$DS6N~3eOvEE)wW#gW(>h~$$2~ijZypO+(_j%`v zp_`FO=v_9L02;rn+#Hwtey5rm1#bXnLgCq2OaZ=ylG%9Vxy?I_klIco|E@Hg_ng09 zs@_3BDZEc;J6<-Pw|CU=W#C4Bbnn(MFIpVO)|j?4>uuGpVQo~mzCn`r+W_c;%ar$a z?CojR9j{CrA>OBgSeCLLgcIS((H@~@Wx7}ENG_wsNk=0I))(eLTKkCYK>rZQJ zBtFSk83pbng!xIcC9m841K6~sW^V2-b~M2}lU%8&pf)=RSkr`) zjfK-7VrH?0us_tQf~x*K=SKej<;4BJE0hUQvukr!jI^2=Oac7-fo7%K_jxkCPhFkj zjqh?y!E}XKVHHt%3=HKb1Ul18o8s3>Qw7Z!ziVCo0ocaMViS~Fh9S$Fohbd?xW#E+ z=YG-@L~BF%#{rt`Z%Y9eUWXKY{XhS}6FVrO1`kr1o{#cc1XqYWp-|E``#{%lBUgc0Vc08@CG4`!2KE zdGFO6+EJdCT_qIpI#GaE2st!-vEfh}LBfQy9WY&W-<7 zb)5whXa0F91?*`qoyN14(3$!aRE^V@%dKcjgeJ-53#txPyH=`N%#=sd$aOoGq||gR znypN%v4ovWKK^b2*c}GhtPMIF`_s9tJv1)y8(8isaDL*gfQCsDS>iBNQsP}f|E!;tsEkuAk97D zWK>MbH(xz=+qvHdk75S>2kW16Em+}&2;B_ACkxnOhQxr=-}nTALK2|b$w2P0Fuiar z@AzZaKYzUh7qWgATg;0SL7R5?KD-FHWI7yRE={O#;bIUzH$jf zB#f^b2_Umq;IaN)jid6%?{aXI(enu`TtHN)u)`AYA1@ugYZTq|Pgg{> zWs+YeemvRsSXPK2qFk}(^>=?c2BtvM?f5SH<2*=^Er~X*KPrF19WJfQQZYYX`)Sg8 zv)I^6gSoVyx&+Hj48OlS7tLB~Zrye>HnO+bu==ym@a8-c0Y&OWNCuoRdoaM0O;HX<& z#-j_lK2-m@>!*dA9py%SI*-hIXS2*7xR}tZ6^-ftg-;_L_P#(i%HK{LRO#_%ZL4<^p6Z{@? zhK65irAgK=h5_i?bk{Od&AtsHG7fZrTIM6MX`f3421~z`L*~&jgZlRFMzZj1khO_v zE>mO;=~@e3-cpxdOY?##ZS}gH=ZQrY5oC6`9^pvFUko|v$7jFtVja3m>(*&va5&7F zbU$y<$B)?608r+Pn9#C~XeveN>g;v87QWF)V7|AYeRdOLLfqgSWZ8Q+>60G%qENVU zG>Y|5Z=LQcB0n-${Z0_zc;p4Rzwl@6zcBf#x52xnhR$P?#vyq(I$FNnyeaDq7BAr| zwJkio^5aCCKLD#w*B!sv%vDs{B^g9P7T7H#lMsekYUn`-C|R_N-wv28OA*?c;k!W6 z;+ZVdKpr}5d6dvIf8g2+=`K(L|L6~D?RpO($9pkuw-7O@UKrr=v&>veZtTt`Gs_b6 zQSG6|Z{~6l#-C&^z@s8kz<@ATj=pQ`e6d&yt|1KOX=P`*`K-n=du@HCLL-y)VJG+; zrymfe8J|2eBc(OB{#e7G1=ZtPw*m=ChceLQ@(69MToo~%moMvk0YcPaK12D}ZZgd& za#jv*UOW>SH_KEjdv7#4XxDOs&nVFi=iHlfb5@I(MNw1|xxB~Cp(EyQ{{V33dMtN) zPZ}b>t-QuG7xm`t0*wUNy;Kakt+s%)QZu!Jq+qGK=7md+Dlolu`nc)FM-m_Fj?jLe zoR9q!cvls}3(GBD7TWbK^K@Yha5Jvt(F@!BzgiXJcBENp`&lvZOa%S3t_|!rMOs3T zP3mSiv|lA#m}l{YHEuG=yDD3u-&BX$NkAE>y}Dfv>rSxr{H-Kn7MmK{LUPjta)=9Zgh$_hfGe5U~)W>F$v_yUVE5v_McSrdO$ zqOzzoNrKaMlTIZU4r|-Aqj%9TUFke%W>6Nn?b9^=kVhWK^<7HkN`W)p*pEWLTzhwi zP_ry+#2U#pr*5iDp}b(^1U9gi&46Ogjc+K$`}ngCl;PupJn0`0mYT(xp`KcGS3$n5 z=bY{pa;G85wC03gLUX_0h9Az8!n61Z2-jpSs&#_buhpE5)U8AllkcniMYOqUFr9(v zk>kYZ7{d#}+DV{kLu%2EM`z8w>(L<>g-Q3tctN|P6W{VJ?Vk-|7=7a0 zL>{Mzzj)1aq9h-SkG4E4g}&YE-=E(KROqeEn%95J&&vi{^eYl`aB2^W2WtP*X_y}u7J|zzZ z;()d=P9CwGEZn?H!jW0ak^{$l9EU#%Q=v$}l)GcG`;@V-2s^V~<{(OQR^7j-@41to z&WG)vQFbokN^E^F)3OY0#`NNkx5y6!DQaH=LOKlk^gX)4hBDZBR?g;blM{(`1EC8| zTu^Kk`$r4*^bkL`T;GOr9P*HzV%Na0Zz(D2e_EGv7K`qL(S?`OnqxTb?Z!u$<9Qy< zWoh7ERm6ZWrHZufuyg%b`x6Te>2GfSqcVu~KK;=3dLZt7`TttVfDi)h1_zo$kx%I9 zrWZ)`e{F<@CLP8X+S0+|bjQabwNhK$f3G#MRd?a;dATTHM)$HKS9vr;CHKB#O>pF|j5=SrUd2z9P;t`ZT>2{*&hEHSa*H`2Ls`FVfOk@4 zn!NDW0ufX?c!gQ@H+Yqg+&+xuq5#4r_uTn(Cq>HUOz& z<#f4kIycMa(EEUN=ejQL&Ic^_WG&x;eY%cD#}dyOa8!M zAwZcRBE;nkrM1$RQXgiTxV}{Iflgy9`7IC~a8y=#%u#*T*Kkxfyz#>{x|<@37fAn& zlmupv6+~&we4TXqd0{`;L0^wAMkU?P>t@XILRM%>YR}a3rEM#ElPwUYqbCPiGkcZ^ zeKvdf(83|t%_8y6m>lS8^P{7xHNnj=BjDbFNa* za(ReJ1vPcUwAdO)Cdg3l7m0%Jt+e1$ajRZ!2C1{cqmN=!z=CR=oxB*vWj2O+Ctbdc zB#srd1KnrK=fohi%fv0dO&u$t--+sSQ|4FoeM_li*}uR@(7~(80vONnJ-Pp(@?12d zy*`ZFllsXvT6phuTO{WhvMj2zE7&1cQgLC@sO%wG$&ChKxiwkEEN_Lc9sH9MjnUj52x*$B%Iw~Kv+`cs zfq|fq+z+NkkAn(rN8MHETw_-`(F;7HTQrADg;L0&xKK*tOTgWObqb;)V=tz}pTaoVu*{ z*%i-_d-+eUz}uh`#`<9O+MpYdbL7WpV%JyvUw9*;R8okT%hQk4==!f#t#f>=UNmu- zNerhSQN=Q)rhg#@FxI7t{Ji7xYj5XCsPSk^ACrY^N}g^sYH3(FcbFVlB35w9@t(v$ zl#m@_o$H|fb-b$7*+O(R>VYyTWLRsljCe>>N;4yW1-YUz& z72kRJOyzy0)0f@``Z*oRNAi`^muwhFjwz6ulP1<<(Tp%-(*oA3Y!%($RuOPhuveKV z+5^uu%r1S_QAe*Cp=+s*9F)Qd`J9gLJWQCG1RJdzq#q_*qgf>J9*^Fc!G#YUskQy=K_MAuzX&D*(~Xl9THNAE6-z&@C0%UkiV% zQ>)At0xA~B3st8pw`&AVPC9!m3({COv0rk9;PCA)7G1hs+`RZ1dK(D;Jx)!JPuZZ; zNmuCBvq(%eba2MzmUsmPaVn6oDY;Xj%tb``nOK?8!~1G68ly-O69f)|y$kRj=7LlZBNbb6>x#$G+>?gUfB93pHel_4DV9Z4}&- z-`pG{SR+7I>h~0Kn@^rULh@&@vT-WaleV$LA9O-Tj3X`xHhDM9+AAUp!7K{lnOQE4 zjIkfh!%5L9RW9W%{C#@j!x$99^Nt3|EgtBmGt+SFFt?+HIa0)Gk!b8&dZL1WEH_*R zlUP9IspKCLdr3}>ZF-9nTG|HmznIYFHsuVdACZ)Ik0Z>=G zAjU0qtu49hgZ9>XW`G+?WNe>UuDj~AwQcLN^g;S-q_!2ffhYu095Mdn;9>vaW8+4$ z+&Of)!`3uBGcN9epL1(7%>|o=&}7XBl0=0UqultC2(es|>;%qooDSg%YQ#A9HjBT&WrS1T(v)B6~1wG$o z-s2KqFF(!lPUU!!Jf9j4uT#T2&(E6I)AVzwyV{N}p#st-r zkftwIpEnY?-cAyhT^=-yTY=S^C$~jzhIJ8wt2sFHRbC$H?~cnTy8a*P-YTf=KHArZ z0u3!z+@%GI1a}QkiWe;qoVHLb1&Tw^mg4S(qQy1E-Q9~NxVr|oz{%}6(%7=}acAAmXt03MmDI)Z@bH89+Iq(gUhYl4{PlXK49(zt{w1AUs z?poeC_m1b1A-zGcJ{41RHhQ?!wh--PhB#$gb4VzMfN9E;OBu3?RKIQ2^Chd$Hj}iw z#vuaJts8~6LF6|U>zZVW2}Td`%X1N!!aWVx#XA^JG`Hp(?X z>|GZ=89`F9?F1wrlw%=-G@DEV!nIHllX>8k`>o*Ae zTGCLMNAUc5L%0U`c#@vB>!bbgb@7_L&Jg*M5PYl>R%)@un8~@TtvhutUj1&!U{1j` zY&A{4k~-lzIa&N0n8Fpq%zoSR8T*+Gmc*xisj!TXnGiJudYPg8-#2?rK5t92lTvfi z$#B`Y#i(e~#9cZt%bEKX^iV2bFR6B_k?>;X3wOl^HoDPlpGRlOke%)h6N%|{q56Zs z*NwCg-piy3SFXW(&;H>I_EWFfVUuW>3^St8hX)y)>ax?FR~Aj{9JXmo4n<;-NM4W2 znFhU9bc)MTHNv>n+@OdNi94lud{4^Sx<|>^F6Q$M4SHc%x&t#qT*1`Bm;OCOSo1dr zviD^1xIAl)0`Lv$*`-eU>1d)=Z}50pR_6)ro+uv8UW8AiEXmvey|acm03VcxX>!T2 zc!~5}Ruj1tEWZ>r=qmd`^bS#vqMTZ}e|2w|NPJa{t?jdbIUGyo%T4c1=XA1sOllO+{SbAV|~>O!3!NB)s{fl~=v>iNLA_ zLubs6S-lCM_lSWW+_^B?+d?T)<@M)wjB;c(Sb?o^^+7hL*+Hy#aGvwuZxi+^!S{!7m-#e5Y!wdCMx zs;(U_pyF^c`$C=_<-8IHBT}hr7rs)8MDYS5rFh+PN7)i5Kd%3Bc;`^av~dCIK@2Rv zLT(qY`5Ku@>ebm;$)DAMR4DHUykpM3dX`z!J3tNW9@oQ{i0aVLHORtp5*`1OMxof8 zRfO7_KN<MZuHQ;fbt;BDs2pak6l!y~28mD;j(5sJPBO&%oI^l{mm z>rjz;xLze1_SiDpGcY4Yj>3YZWE=}+OFloRS=UC>8J1(^tx{T%%Tz{QRqkUKI-O}uLAzhPx0t| zhDG*Rt=+}ZwW2ySrcV-`##C;M5`d@RF~1Oa^FsGA-=Fgq&ao_+UaAH7n~4W!GVWqc zWOwTrb@dafuTSVcTdsCs}l&i|TwE~9P8e>2=2zrvjcp@K*gc34Up9pWHQnlPmj_%pz?Nvx)8`9EQl;uX`oq~ZN^;suC1 z-%AZv8qln{IeIsRqFpaF_C%%1K7TM5u05sgEZ?BVc~uvy_E#0%LTTMc!<|BDL7c1@de_hiDem;%{{{h5A!I_pStv~nT(=O{X%nAbv4zQmzxjk z{bZW2iBQ-yXKU-N#gEkoquxZ_84T+P6z6dte26dm@u}f9~J65kB+f9Ty z;`8J-+|~ACcI}*mS72E=FrlWN=z<=YSl!ge2ieOC%Ov!txluXf&d|AfhSOW=fcX`7 zUh{*TOf+!w76<;zgS&iDKwgSRM|smk;Lkp8g+z@*bCyENHYZ7wNokd2gs(C2k>g}; z{HkQ~s55dO3tlJ@fK~o=C=gVV4ADSHtF1{d2KI-MIsS-Wmfgsd?PM$>KS|nX$M%tA z(NFPXZ&QpIGk=X3p?X-sS;_1Pz(hw$S|JVQ#oRWuV|ST*5%ci8$rrB|DifOfx@(sjvs<2Ne)SCMvC5DN!>F%SWaKOQJX+Sd z8n@vzk+>SZ6)o}`Zj`%J-Yq5())(QFvK&*mTfw__9SQD{@T_X~*>@jI8AsL1$`V~} zVx5dbkARaurq}aH*ZB?Xei}{Y>e;oI29as&yP)sTRB?Ux$_m>if}+Ohig?`FHJ5mU z4KWO7Taox?&KHTBx#aF+%o|2SZTNMKVbqb717qDcx~0+nB)?mtP;x*Ub(#U$#r$CC zH?vdNELM9HNJ2z|p?b)?#td+vTq1{P-Zkl(t zcm6XUhaOst>U^x7F@PLqKbdLV5}K-(ZZ|;KA9E+!Zw`!)8ky1jRL|-Dt^xl%=0DGN zOKiqQQO~_NF~1NTZ)@=C)tNzN0J#3fL(P}*O#V>iU1AQfVgAM%l~g~UW9$<6SUzU0v-SE_RMFOrD4j$Z~IP2l8WJ5d((11a-hO3 zx3M;u+VUMsF1yP#coxCH^e4$OSV&a%dyvx^Uw`qwBslS=v@==1jXqx46{qQEo=pWF z&JP?5=8|B#gc{7q=UsU;Ghd($TyGLK6KXQb7k191^q0LVUPt2+=OrsX4{eFplrvXH z@gf;fuZ)b%mfx{XpJ>1P#mL{2@#edj#lAm}IEW+H_UcR~g$zQ~v8BXzVETpsfPvoN z*mYrVt#j#*`0R?_u0PF2@JmJT7AS@^QMXh@4zALcJoPWl-}}gC{4`?i1jQ@?yIM}c zB6xk&?pZoepLm5{0lZ{Lk5Ro|!Sjq>>6sTWQ}~hLrxxlm;`j(C0%hKodu0c2Q-piQ z8!VJa1OwXT&4Lr6CQgrZyY;@NRT~NUC=hg-1y}UD9}m+!_4q`tr>Me~{iH1o4kEe% z8d$uX3`)$4$?P4GXZYo}S`$t}Iy?1st~w=X}M zv2DmuML9@2EOXG?=hUaML}umzpUhsqZmnuFJbn7hdo7FF+_s*7Q{|=2v@=W8;6jYa z#ohL=S3IMF<70!g_%bv}LT9M503s(-H#AYnL#xsK2~e46lscpBlO#cI+zq^E836aM zdi{Mx*}5rAmjZ*J(rE`d`U#f>=(68G%bk^4(|(v=wYAltii%>F{Z%VP${zxGn1xxEE* zCpJ@DV>?`j(8`LbZ35MQE5&hy8~^WJ(fK&_ZFH_x_u>-(>%7-SPuf@`20U>hv}f|$ z^bIoEthB*`c~6#sbq(G1dZ;>e;CXEwmoC^S&Xx(8{m?oYozyfn5Y2>FX7l7@6B6Kq z7y-k<%P&rG#!{jAuY-`d_f@=B3_UKUb%7vQv22t*1#tt3^~T_(N7-5g)Pvmloz8N5Ou=qL%24oV4XBLg>g})D|g!2F9S*x0b*mI zN1BdkX%zeVfW}{pkB~iFF(T}C{1aw-SVP3XBOx3XQ=&a3t~AXjD433jqFt!R^nJLM9NGy;?ZXF5kYr1-0sD9 z(!t5;xxmHyJ;fv=RUVECxO9J4Ca~sIA^4&P9EZVH&z1zrol$osKi~Q8wtK-yX}qW@ znq2~mWb1gSp8E;5c z6W=)KF0CT`ZQb6=7pz4x&MfIXqB3R}t@5as;rP{)x~%fq=tAXEf~uJ3N?CNtbXj_4 zL2db}qM4#+h1uk0g?L5$*qI=M%Y4fYt+Zx!kh!geUHNs$E%EHD`iLH~Ae z%_6Cw?&G!4gqw@U z$}6BsEr|4pi6zQr`;Kl_NXciOuEZ#Qb8eE3;M^y9%i|N*3$NA!qL>X)*o>V@8yAD9bqkJN!_``r0aQEoJ#Qm-Nt1?$gb35$c*%o-}N zPw6wt#mwiC4iuiMXStx56H~^K>nP4cGuw$FLgk^XBC*oi_iELT$L`lyPTi*X@NEZZ z-B%9w;U@6+IP8Y!acq*G^)DV5Fj|cRfVCJI)7SQ?I$6z@hdhEM^s9C-uJjo@R{M;P z^l!T>_tU*J>8P^eSJi*89aneQrdXV!XAYNXsvyz~WYrYN1^b~laX4CjfmE<8S9PBh z%wMhEltCy9Y&qrlaOy0R%~WU<@{0W2Z;oO3#!!U zKk1AA`v^-ZT(}3h5-dz$IxREzn=2eDm=FY*t$Y%Eh(6EfH6==EZ_qQpQLJph^YZ50 zIOOZ%u_fYd?_<{+rESko$*3x`umnH?Sq|fQ^1<7 zi&uvjR~Q(84;(8FqP(fJ?$AIJa>%q!i#rI0m9)B}(p6FA>kY-9`p}#y954NiHis>1 zsFhdq#yjT*q4vJeu0B~Jzs0|`zVVfU)#D8o08pT$A$GaR#UMaVEQ|3Kql3KJwnQ^$ zUq3CWPHNUzQd5y0S4KO|P>C7@8MbJuCs@lMR0Z$UT^}seX05u?uyrgHrHRhe4s_t- z^+JdxgS{{ps5TzbJfg}f{OFhWz#y9G0)@uJ-+RX%$4t(0Qc0VZ3_o_H`46rj}6AC5l8-O(V&X>ZbKPiPmFBg^TF?uFD50e)Y6jis(TF39&(Toeaxh6Jz3 zz4BlVk-1KJH-){FjzxAlIT;~C)hd7e-DC%}k9w_4cGH4WUE}O1U?luq1LFF3eCth1 zl!oAV!S$$j?6<8#%`<(e`YH6tqqqdt7KMKmh~) z=ZWaQCxZV+ZlCuvX(oirGSpP6n_N)NZ}R&!qNZKx@AdP^Fu(owWb5{0_;BZt;7FDe z!8Il|NC}FbWAYPj|2J4iz5WkI&?D{XH?QOJsEX|FM;Y!v6`J?*xmWvw-vSieU9}-m zD!ogLGNbnr`?xC&r}Whon!I0ze4F?yvbwV{U8MzVD%`yHE>&_rEbDjDvCXB#ulxj{ z$3(vi<7k>LX==yV)~)hEVXK?>#L5=&uJy5)k&1e4+IxSA3Lw$Q%w}v+ZFL@H`XCSV z-*$_%%ev#!rM;^!zcHl4K7V}wF5z`a+6bGW zIa8yOEwJ5farX!Jf%z3Avk7bYiUwpHrc$>6Y6teedGW&{KW=5-O!3p|RY|>0AgjyY zWv6bvm^w?h3hFn;jPKRR)$jW)R_(QGR%rJe3b)ceIvk{1s+>Lk2)qGLxSh*%Hyd91 zGuk?JG$$`>)(p9H{dP&XIbzfS?uB3c(RK=KJe5+{CwJ0zTAqJ6MDKSTf?WUI@=*Lx zVi@}T-_6MF7@C{KoAw?8A)XD5Kn`14{1;-2{Y#_jI4EOte1@j5myAePM`8lOZW;4J*1+!60{Fz%o>OW^MD9w$` z1rk}L&7Ld$M`||3v%1G!(6f0^Bz9ON^-O^|o2#OGo9WIOFipB=mTS(TR;)a~G+m`^ zr1IL`oh@FC4h^Sz;6a)Wx9M-Dog6ZS&PNt~xrUKU)T%f8*<@@1Dd~Y)2&E5p?r9;Vdpcr?K^7xXU1%hYmg)X)^&K}ajeO)z z58qPj*sm+eo7W(_JkpY?r#sjp0D7_U^B&bShr_-6h+++?qB&$#Z(-0yG51k;O?Avg z*uZTbD6_+z5nhQFRa0L|c7+S5mZ&sDHQX-Mw7vHI0rpk z$l4vv;5JCdkcK?vC6o6OP5JC_?$XId&8T`w^h0#F|kVsl^x6#1+r1s5Z*IW=_d@ZFXa-hMXgr z3r9^|)M_tKM7EQUulHzDqvx;S-r{*oXt8uEp2fEYXYnig(#oldwuO&$x71$(W3-&i z*!&$WL^5KZt_t=-8M~!z_S9EB;K-* zQ`#D%po}z0iPGYIk$J@wx1wdxu(wT`A(0PernF{usosE(HVI>J+D;q{u7$+<9IBHC zNWTxO_Z4u;i`hPb_Wg{Ki&+j^49nxFlhaqJq<3|`0O6V7+{2CHHEY8d_(6qf%KA9w zw47lWdUjPzwxB8Ou)k|3>OuNv)+#9v!__3-=??Cl%bfHvP`>(8c!pR(RD?JBRVRW? zETnx8QdFp+H1+gz+9v0@F0)*RkqD;vQEUEi&t+=LlBOhPr0@#fS!otWn6_U2z(wN$@eSO@ zrx{D~7TX~fXyNfY%h3oPVtntjudJuh;bbO-`03`mB+Gh+6}M^l<9taMUhA13^dn9FgGh%eRxqkrom~ABX(Bp zBl5}eH95pMu6drg-kbC6n=dUXj~J$=L>FdD(GeM)(GJe!4pdC7S%(QdFrhE9 zB$WQdaOL{Bx!o~spttM7Em)DFkXy~wIw5PdwGD5c)vI@Jc|rIN6=PWp@(EaYqf=>6hc`Ed0pcB+@iOLSSTSr4UNWgps3dCpwr^+44HFPy!__n{h$km*vX=PR2n|I64X2RNhQyh2lZ4^TbnHdF& z_?;*ECCY=@D?ag16S>m{bpQWP=>BtB*HG@!A8WicSh!clV6*Tg;j5nVKA<>nqBi0| z^@#K+s8zUaZlsF#P>SbL#;L zj=h2PfS7MWt&!Iu7hmsOj?S$<5aNo{rlX2H#{i(zqO300j~3A4B_O1D?WqY(y(2o; zD`+xtQbTXH^KSZsjYGD5Sz*ov^EB~*bgx$Qn}WtIyxh6`u&+sDRb$A$&O~@wT1W;J znye80{hVqL_U6WR%~r~y;_*geudcy6>TOJ)d%~U{+jKdr3bV~IqXTLyv66G~68pn;TV;iO zADS-eI!-H3JI*}6@}~JyQ=>mVC7U?m~T5C~+%)N#mLTmif6v@+^?K0kH< z{&j7qRI&ZyzF5Vyxe9+;kM!?_GVFa}j?nw@0x-AmB>+Q(b^9`SMdHm3n#37<cB+zrnPqEK}U#DHQ5RNyG~jQi9)OPUe_O*@kMla_kSKC*4(8&V23h?%Awgi>sIXm^qF-Cdl zY3faXniMK6fAjU7`)LZ3o7k=lX)lInKZ@hmfm&C6=IiS40sPW3mZ8OqSq%w`bhKZd z=!X>d+Bn`IOC2TYs2k_4z4Wk4z4*Ks27Z7qT5fk0Ra#eHj+Z*iD17}w<4tt;t^~LM zPtuY7ch@)NLv}1+uOG#fk45%yfgN6=e;P;PlL;BC_m9rc$j`FETL@sD0;j*H%d4OI zsr}U0U33?xtMH{of0UapbA}gxd^dblwtV znH!}l2-@l8Yg%j-9jAK3lT#tZ2jDjdwaSK;bhOQaIE4wC?#i$eey7uq&U5`ZoV-x8 zpdV<6ZSpFTaTZY4V@`JlteFBrqM`yG2Wsnral-uFUq*5!0oo+b@8EvD(ql8J8k`e+ zk2F3Y^QX4sP9AK(N==JMlN{sur(fM|G(ILRO(@vKs}7v+h-+x*K!eD%-=Tx(8!dY4 zm7jf@^b$KvFjEKi0|I0jHt8O9F=r8@j5H`(>$N36X>-kFsuSJu6uPia^#A(! zBXhRDc{iEE%O<5-4XFB{aoir|QlI&}HlaVP98z6=`KO~M+{~wrs`JZffHyQf^HKn; zSYzicZgLw;8!tIi>H7`dmV*G1-AI~wB>TSPE_5~+wd!L|m|pcMJY^i2z5{g2JoEe- zQa$-8`Kui15|MZ(eWwH214bDGy$Ce%-1dzG9iS_QXu+0-t4$n^to$KkanMMaWYu44 zjkN%(tuBOALGG$XC9$>}y0FfQE*OK{{lx0iPC99NM0O|N!AEOfkQhXN#W?BpIYk32 zRynB$nA;$p3g`f()vK0+X*agUiqCDSNFJ@4RlYLRwv-xIJvBYWY z3hz6QQYd3rJFzKyieY1*YMluM&X0Ht>Rm!WAsZ6r4wJa~wQegk96`XLF>tIq%#3v% zAcl8wa{HcTNBAVzh`cWkkw!4g+*%p7!BmyXhvAc@Md)-%ZT5Kn1`gZS7NqYG&37<0>$fkNFT+vE_&$KS`rRq3T$8hP z)D#;1{1=pWdip!nQTfJqvS(zf#AL3|pJEg?m)VRRlIvPlieW$}XS{DB=iNr+#XU0= zpF+_q?=ce7K1RajdK+~K4}@$BRQhWJY&$4#Z?Ka^{z8QEl1FJ(V1uaqk-5NbQwtny zkKY^@7ar@$6y3kvYVr1T6KRASQ5N93G{%lKdE}s(dF9+-n@f!^6Y3v2fZE@3$|RpL z2P2LP^oF?DyfHgiB8mC|XBA@s&u>H4Q$mcp83a?y|CVR0-oK?{WFNduK}t720q*S& zo>B&1jFauD7uv;o#U?ZwYA}dAo@Mq0fJ~-@6NoXR3EYy6?v5CxEj;TxoNpX^?DOZ% z``z=gzh(H;X}JU_y+NlqCu^hxk;6R_2kDx&wol?3H&a}QABQSjZsIPp2~>RElvfG+ zRHs`AA21N6b?vC?Jq)Y1eE1gIS~`ldM#87M{m6sQ;CCvucsiDuO0;iFSMU<*=`2nU z7Lq4g^sfeFJi(EcbXtJwn|94#rW3FhackmKOFifO04ja`d4tTSvVEB17YF8Cru{rw zrKZMeU*PcyKxX5{!N|aC72!+X?%pOe>CCWkxmfIMl>ntGfi~IQG1>*9heXe$B-ih6 zg{jll#~x*|)E&ABW%~@3nNDNmJIZ!6f4#3Jh;U8eRa+UkZJS3G9fY5NsP;U}UY$ne zRhIguXvR5Mr&Pr{M_h8rFlpNDe(|^d5q;FQw5}9C>pOu{q~stO-$Upd?OO`>5nsyy zcBL6iUHtOrF*xSYVNXNO|ENwTp`4CYEDE+$$;yp;PmEitCT&dfX ze*5#dM8a1<4h76WI);7te#Vi{QbZ*tyyT;V{N-8SRka}Z&D+7};NSE*hI4!9#zFXP zU%ytC`mezxGiplOcv;<;4us)(;WT)DD`M{uX~H}hpo=wdU14o7-C|w5w@$#OycnO$ zQl(77ryKd%1LU<+4?QOk?IBrFjb-@>IH~h|(puPse1N?(Y@7JXe}=)r_U$sC)y+ax zPda^iQe){-X~5wGXE9WJW4?#XuXJ4g#0U<~$9);f+zQR=jS2Q>3ND(5f3rb=?f=1G zgd+p+7$!MS6_?uy0uhImZAj9Ci7KQzw2v)cV_Pd)hN&A^E;dIS!lmE z?fio=V*-vr**nLYcv`4Vjvkk~QP-!ve$xT0Ap9#XMYoeZ4*iQfiTYqn9=zo#7X&mm zQp~5wU&l-RhyjazdWgTljD>(V(==6{Yo%}{mRFvk70|q;H)=Y@+-B3Az-(8hV=!PM z1VB&JYNf=-#1&5EjhKh-gt*3#%;Bkj>Y^QxV|^Q##A3nOodjA%q%Ql7o6#q~fu|MZ zJ3Jdha4<1+Zvmz%AmZ;Oi!HcILB7OBf5u1J<&BNhGc*6Hvc+(1Jl{kO9s_r?2vH2k zl#sd4-XhZ#iYLov85`IZXfAZ;F@dcDa=i2JvhdKZ{?-5^P*8x7zbheTYNh-|p|yK& zXdh?X){ifqun<2g&k*ApOj)warh2Fmj7tL>`}`(X2_x}k z;Yz})=f6B8Zz|HOSWc-@LjdB~ciy@Z$szfW=af2A_BfVMy4Rvo_ zKXoi<;TPE}z`+=og{JLo-;kDc=9{WLt#lMVCboMkGfwb?JiFc+qvcX0;J5tWAwpG-@VamPC-NfYnsdPX7q81<6p*91Qd;Jh45c)2(?|lc>E*zK0 z)Bn3T6kf=Q6^kjYA+3Sql2@#HWOBvI`SVUAN&M_K6Xt?UgV?`TF1tJk!~gonAPwhX ztsgHv(i)8^CAsFMTT8r#nNLXRt*gK2&3yTp6lK#Y(F3#|yvsZU}8LRp^qYr6~FCXOT$~rjw ztQj_GLbsMJm*trFd^1@f-82RoL$G1jou#n3+#Yw52qs-4VyI~U%H^5jt_XVS8dJU-QciNAU5KSti(a z$mx5_&!Uf|pIC=gx!aj*e>V^S*T*8f*rV^L4^?)L?t4(mI~Nt}V^;{RTD4!2p*!Cm z5Blbw7Lb3G30j;Y{noQ)S}NCnc7MfIA~Cv{Ohf;$$!@01y_uxz#;O~KD!H_V&_ri_ zwmMx=Zno0N)atax{;=vFL!L9>)5=iGBC6z_%r(cQp#r*Gxv}WUvT6$Vqk>tO*{|Eb zQpYp&cIQEo7(Fv|+GeweOlQ+pji_pJP0 z4dN}STz>RHnJG$EInF(Z;U|pw#=Fpt=4g@fgkebpusEqq$jW>JM#POfZkhGU()CBQ zU}fLH#oBAj7d3H#^gRSs3V^z=a@0H641R?mu=loOHH^Qp{9!NiGrd+pCLZnWD=(gt<|dos&*jXIM8n<>zWw zDnterFYzqq=3VZa7mhbT($Atwpc`1Q9sP1b7#~SZ5qTrVx0ursJ`u=HduWRDoRlod+<^E#6}cH+wfBhQ>7u?{^i=h0+2O>!HCSIGPtywZg{ z;_;UTL+@bi4$q_*0L&G@S7RqUROyHsl<#C=Gt#Xf_xbl^O6rtpAPT*K+Ey3S10F{k zx;jRk)<2Gn=M6fkM(RidG*jv2Sl&CPQ&u>@QH4ui^s0T#lfR^$e|}m6nooX}o+UkQ zej{BnFu5S_(k~oL{iZ|8VlpF$;vbH4c@sz} zIT}Z5&cw~yCGM%JmFWvLO=6RM%?L?_j?LpQS$igIecVs~!O;0r1Ai6tqmFa=6VQ@s zoF!T!8g)^+{QQ(Wqd7tHgIM1o5?DBm`n+~ht@gyO&Ur{tBm~>f7nncDJ-0EHuT$7b z@jyO~Ie~h2wV&&+aSKyN;+ftg=oz(^^tjeZ{ywuJ`c^&Q_9B57doj#i;`=Se%`THkgfxw zvSgD9UQcZ`H--*OZdwTqVqs0kdVw<0Zajtef$3$@;B}?$dsBJi1lkr&0X_1wV9ZjaBH&fcf}4oMzLEd+mnZZgF%v#Ff0 zFTX$11am$UD?ksd1btY4&)Z16GF%v|7x?}TK`SB@sp*suNr-V(zCYCdte~Ma^uvYC z-Ba>>vIrp#PG5vpHz@cU(eG5QVr*Wn3KAimk^XF~cu0~t#bD7AZW*)go3CZ4wP zz*6hZ4~2vw)g1J==<0xGEvDmv|Cj_q;C?2lD9+zvcN8r~&?k8bs4rxqxRAEm>7`jJ zFJ+Ww23aoj=`!sTAqqE4(>z7HRs0acIkxLtznuJELhm-Hp0E^LRmP0hH9+WZdRmHJSU(qxuZj6-=vQ7@+f9uG2S zd>3A?fZ=m}`l)N@&1soO>_X@lo=ege-O+$Fx&A#Nq*Ex%ZC(sDB9+@;3g92uF#kydq+YkhH^QPB{oFK z#;8-$jOE+A!!@w|e6%ux&Yog1rhw)u)Yd6`ApXQAN`-sIG=0K2g_hloABWBaFm{~~ z3`xgzaCdmJ_S`~8+=AjS3Ok(s#tEr&=u zmr>Kg2OGCLy(aSk3%?ApvLkD`w!e;ZaLV|ZKZBh30n$V{C3pHT*6Luz)l2ffrk(+& z^FM!y^*?R7)1!ZS0cxiI9&AfxreCkq_RXVsUogKe1LEW%NQV=KXR!~(9N0txcXdSIU_xcrQ&N?XlP@)QC*b8a|hDz6!IkNwMnPNrN^!hijE)kLPF%HoS?V zd_BK9eqPM+Q_#D5CpzVx3w?TAEJy83@8{R5w+9=bIF|y?Mz^<$6!j%#EcDpnd_%rS zOq6ewYbJW%GZ#zkM!}_g{FT9heyButhHAo5pWV_)mzqDmEkYE;dP-ih*pD?x5S7Bs z-#IJVfc?4QzOYp(`zGp0)n}7$SFT*$xQEXU+FL$4lvmyH)6l@DJKpKW4P|FST;oKl z`96Hghhv@Nr7hDWk2_&=fWFMPPHAu5t7^5v<)G&JWDd&UXa&yhdU>;%)ulJf+jqjL zu{rOrAME@i{AjACr8szsLMxYNd2W`JmgR;yuKJl5eIaQT)GDS9-r{~P5_)7-t?;k# zrVGsv76bF$$UAl_Lr7>i}%J?R-YMOVUsY^aG(~B0TDzJlNVO|vJT9n42shN$tfCi!3tt^Gi zk;RFhc)2mRK(~6#=b)(C5`TBxB!Hvbp$uoO0#vCNJr|J0@i{t;=%e)TL++Pp;M3mlkD4WC$UgO{Mg6-m19?OD_mC z)Z+1@)$I*5s>taN(kE)TE%X%Phq};OgP4F4zaOjmn|BP2xmc{rSyE0gLtO{W`&~7vaBa>!Fjb9D_2@ljFxSudF^z z+9kOXBK+A!udiitCn9u$6q_$WzrH%H2ygveJjP1%?`b%;_j`3v>^v8{Bp4X!6BVq9 zaz!hR>#dnzSJcogSc42hqZ#+KeYf8&TnK%<}1TVj=+wn2B-GvEC}G zc_aOMR&mHp+Q_tr;;F8dKg;-m8RPoVlk2W!=H#v;104Im!_llU)kFuo&cHcvUE%f& znQmHOlXOTIG&h5yX%dE5o=6ghj6|ecA6GKD zUchiCF6#nqxYIpg);FFhO^G488T9tVPI!F(U>Ni>#T`CX+PEx`Tlvo-Me)BCDWLz; z%=&-!b6A5Qkolnf+9>B7%Y1@qvKs)WuDE~g+|Lt6QPsp0n09><1;uVc1XwoIMQt`r zqK^n zSHztcFDxTEQldP70&c?y(eNAAyeL<0RPy=TkZPjlyY<%U?mF!QeM)$h#N!o3lx5!` z1-8RcW+O}uKuH75BJD}a0aK()LT)mB*B)%G{=F163=-lY^B2BWLub7rswH}|FQa@$ zU9A1rq}?~v+U4o~)UO`Qg%rJNvKQ^i*J5{;p*a9~UilNRytPoCN!%oDa4(PI@o1bZ zw~F1G=Wn>n+-}k5{I>Zdr*`^~t+Mr-b!`T|bKe8Cx=;B=d(hp=58h)3?jx(F33-a}W8tMr z=vv31iR<9%W71_5IghANq23gfkwD3HaJk75|Hj4i^fQWL{&RXcSyXLBDsC{JMDiDl z7>(LX-A7s^YDKs&q5#A{l3bboVbhJFHW!<3p(A#omrg6Yi^Yyy7m6YFr22~A@qMF} zn+5IL0c2J%7m7K%H-D}g^vuiZV<1-u^(RSJ48jh=+8&e*vfB>ILbFJMliBgZ(h5UB z60^_yyAnc1^^)dvJO(-fuaf|!l1k*ANu9m;O4xzH@DGM(R)-%Y+b}($D!$dvoHX}1++)2U6Z|J$U$q7t1<#zE}ox4_A4rhFRZ1L_CfzJ5F^qvsZ zWpJD_FOGAMjtoA-SL}E~hlAmC?Qep}_EhVkuo|^Dt&=fH=qv>ZhNvT?L_t}SED^j* zA29jrtr#{?moU}-J`Ul^H5$SiUD${m`972=aOFH=kr1l0>{cxIum`E{=fdx99_oX?_Os;bAaW3@7vIC2^ouC zW#Vl$c6uu|!1SbWdXt9bqH0ms;)FxRyS{S$tGQGFz`1`B{+Q)VYlk3p3!Llkt)6M<51l$9p9c&L?VH%GaAcay&}_&_=xlDwcqw^9RMw~?^1XfjWT(6|Trotg}k zAqINxJG#59t3F+RSeAW>9RT=a^`Nt@yeUxJTAg6Te=O9}Ii`p3=ZK7ng=mF^;*o(W zjs+C>la93;3Lbbd@R^6x%;-7_;Mmn-BQJjS?sf9ya@uaSIz(9ZE+i1_~fPkD5{1_4i zVj?DZd9#Hoe2+~$HcU~WVW$Ak-l=Rw#-sAD6K;``(-WChLeDvsF2q+_J#^!lIQ@IS z|H(emzt|7PrIvi))1F>iu%yDa>*l%WYd8ru+k8enHPVTy74MuFo1TiUrmvdWO%1{; zcg7L?{!{@d1kk<%g!*fjnhlf7v&%|R9}e<|;IAC|2;N)qDzN>CV8>fFISPvKewLg= z4_m7qQcGs6;wrlP<-SCe--?}z(B$KE2H-ud~!$mi9=}`CPDH+`F*CQ zj0Q>*U+sjPiT6p@{rxi)OW!HZyC|;!QIH6HaN0IT-5W2R(FE&BzH1jO5!rEaav*Ad z9Mf+V@=o|DiI>ffYzn`L^g!~rCOA*M zT*wVoi{_UA7u{W@=}L^!WJ9z+Z$aJ&>U9|8uFlj!UFzFIda|ncvqj0;`TaBXO4LvL z73%3Zm~u10Pt<^XlTR2cmdIyK{x}UO$6E^tYx9W!s}xomb65J7--;G4P)R%}h$gk} z&-;LtieeR*>W~BS_MxT!Jt6mn^&8{Kx18f9R~Tgi%OZ+>>tFD)4X3UOTV4+|ON^Pk zK8LV5J*omdp!G@)FSeehYTPk)@HVA&sjN0m;tXVqz7Y`FX#-wT0mNVWcSgCmNMyb# zW8xf%Wa$W;EIP!EFZ@es zlYI{~K$P?MP4__RpzQMx)`Oy^Pcv(qOV8R{{@rD*mC8O9(m0uf1Ra|(7ULqWUv-&` zWQ5wCgK$mLEIFhU7CB09g%Hk)w_p#1>e_2ru1|P`K>TQWtz~=Eq`WvB7Y2l@2r5i? z^98b6a&?b}CXeQ{drnsh)2gM*UOnp5hZK>^ehDaw=|}s;gxYFz;^VXtPQv(VysaR- zCJ~z9;f z(dM#1@hUtZ*(J+Z{JeEvNt{zkR4;TN_c<^TN09fV;rnpKmS3+EFV30UUx~bqdw9V5 z?>9pZmR@Pac>WiEmB4Gxa-TR;n9Oc>_49i6=9nhiY(-vV zk*FReAh3ga`*#B`JCX3qB9Gi%J93@L z8y^yD--${4l^C{=WN7$FNv-F)_HMQa)65?!)bh^9blM18jsr7^qI0cg$WOKwBq%^+ zFapYs`{NydPE*qBKOq6;<-h&`%#A~CER6@EB;M{l)A=6%XiC4##k3a22_kNz9YDL+ zjqiHlxaD1?8GK+inNm|u7Z&>35=UE4wAs_&H$Ds{Ixa!zLgMf-slu*Sa(y?}wAY`n z&wCvV!c;&~*CcfAbEzJZ{Es;1kYJLMwt@nSU(-E0|AB1&hd%kDPD~X%P^kBUJQ&Wy z@qz$OHgpdNNq2(BJeqf=jPx70aR-*wlNnu!uCm+(YoWmRQj|f*jRtvZvhL=&N}{gqoqI%_5wMhDF88DceZ z;0&R1LPOM;AZod;d-Tepl|4TDpkVCY$lVVnk0i;y!peDl0Lom`9o)rQOPn5gZ*Rp80J~Z;O zTe=q`u|B#L+3mdCu-odAC8Mw3NC&;cr3B=L9cq!P{W&y*_;XI{KSAykKOO$i6tX-C z!nhohVcrv58Bj4-wyAnweh&I=n1`OZfl7wzRvQX8%)URM z^^u@Ca_sBt+6LWoD}(%UH!n1YH_s^*9rf}h zluJ3+9%KcI7xG7ou?V$Td?_?IChbGfe`kUV#I&gDFOJ(lkL4bK9|X(|JwhS`V&wAK-Na(GpR0BB{Hyjw_4CI1ZgQL~Hm1h#zs>RAMc-cw zRIeY0+^QQ!GFf1l!B82SuWL=a+ayXij%~O;D1TDe(T^5=YkJD_Y*HS(_vo>%Ack7~ z_l}PriRi#_|A3?Tm5R1E?8*WDT18PsL&#&)m~AQoON8;%%BPcHioXx4ckJ}`TdBq9 zUKnFRaK~ZsIZICmw(d0Z<=W>g?VMxwLj8b@!N7A{V}|~o7r0xk zv0TPdp~ zb0=SpQo~hm8!kdc8v5p zv!#u?M|&`LeVwd4FF9Hi^)Jllrk>Gel8XLS#-uftJDot%3kB{wvW&f;s%i@cja0P* z>r89nvmbjS_%+2wmbHPw=$z!Fc=^&y^7gW5_D9ku~ZpDcany-OtLhNslP@ssP!uhG^){qzH5**_O{< zO8vIODugi~Dz|AWu()KrmzeEH^v%8OE<#WAkMGGrUxFv6J>=$$^Djz&{Kd90jomS>Qw%3;Qw&f;x^#$re>S!TeSbFscPXUMR3QWLxP#GVu@aMql@MK6yawGW!bKNrQp#|mpQlm-^{?)5=kyMYX7>Or<&xUra3*2aKI4Y?vxxrmbyE@( zUkmvR(VxZE(-kxho9>~@Lz*zhFoR%Gk&xIxwxH7e#fbFrqC%TUvRxe;Gk*Y{1}{b{ z@zyiuabTH*rmhzYG;nu~z;oWLcZ=(Wdyqj;m+lZeNsFMF0I&f2L ztjTl?s0K$--GZJ-*T#!Ilb0l;9Xki;mZ>0@bHcdGCg9g6i=@9_3lsD6?7d&=PFjUV}lMa?GN z5my@0xc;}a_rE?-cJkkyH-_mK$TUe9z5kvn>Gz5%sa)u`#_v(wWm8$aMhWvInf$o) zD$rA6;P>t#bh>wHc|VwYrZ8XDFXiClNl5&O? zM1t_MIV-EK;y)LJGg-gud~awsw1qlTc>^x1-ZqVY%^RpP+dHay59-VbEa{ho8O;f# zPuZ4cYPqEqmp1=}^auKHfdMgw4vFl2x$8MQ!ej1gW0zhapkcga_T|BpL=Q@$^H4)$ zqc+DheLFH@x_aXi!#K6&&UG3!*byF9_$Vv4ZQ^BF8UE#i!{S*DNHU=@i32UC1t#&W zKIF?Bf61oM{FU2Gp((bus!hRql|)ieEXR^0=YJ*7{}-_H|IYi`cl|W1B$+WK2E#h; zsN+3!6`OV#tGN>xMztCg5ZQ4wyMYsCU)tRcfLo_1!kYcCz~!v8dc@rGZ~l_Ga(n6^>O+2h zZsLzx^mD6efme=OoQ&beu7^maE*VW{%Ag{Ffu|lxrzR8Vb&$Y614j$&LS{UFI8&&7 z%u`T6QGeQ|Oa3;oTWTr7uCiMiIchB{1`50{5Ck0#9#Wa-&9AY?rvya=(1t_#s(m#K zm33fhiGC+r5Qr95LIKmN|DLT+H2XQ(Tf-BeDN7(#b+Z}dtw#=%NFB(z3xM8CX(K{ziuVc zcMFK1l6Y~A;WM0sGP9iD=Hn&dax>-Bcy5Tq%{Nfds+^}!!nQd9gAaL2*I+|}9!61Z zwf>%;R1|y*!w6Y(!l zab0~+7po5numa!t{9LlX5%Cn%Y#G&M@PImtP^G2_ZP{M$d=++ydZufDKm*!Kne{VA z@Y+SyzWWD!mt;S_{!O4iVk0pkIZ7$oMtnsNl`zHe{oSJqIh1YZsdgeX1m{NO;_3>) zIz`|#|EHjAys59A6=LTgS3=>EG@YA;s_5ib3meA7BB9_3P2`>j9o z(tqR^zf@a0lZ^HT=g=&GPPUs{E(+4L^U-&qV+A zpaM7909<6w|kOJ^WqE~h1VO9jK{?5{l+wPmC;*V-3r zjoE?!0PegWAA#(fe^%%xTsD+FzGTnM3=)@<*}(!ajN+50&yiN8eDnv#iyo&YG|V5` zL0TccwTwi(pO*y5+>-xFL_)E|4GyOI zFP0km*sI^dUIq{x0T1Hl%^RYPWuo)Bf9$RFLl65`v5L-(#=!QO$@Z5^A8G6uleWD3 zeMr#E?$12t+GhMLhm-Oujc02QVAZXc*U&908wiM7aWi}SmY;}M9;-eVKY+kM5H2oU zi`94%lwkS5 z);DsBmJ?ry`{_5GKXTT;ZBjO1iyT{|hl2Pj9iCa*&rLt59>KGV>}orlO9upc1Rjd5I)q#2a2`nV zIw*v%q2A2#N1oX6^OyI=;uQ%5 zghGSeUokX*5-T1^kEI1EpF{ymMTL}M<; zxtuN)ah@d*8g|xGFx)TzYgtMM^31h^BQrKmdnX-q1*ep3EwfNi!&o1}&RBdP5?{M) z&&n2IQY~{{s`!76WN;iuT*}cc+4g?(0Y1Vs8`rS*uEZTUf|#+fg{H{xJ=Kw=o9w>U zW23N`zFlo<7Fp2_+T?>@zTZbfHYZU2-WEJLG;y(>ol)dH@r;GtK;oqOlne0!AktN3q(1E zKnFIAyZbf|+uN0X>^8S7aJu)=d6_q&hQ8YSlhh4DG$;$waOTsGkGKYI`&f)h9j5q+ zh0XnJJIgWMKRRz7FJ_ z@FJGP@|5Y}6d871d!a3OqP@3E`N3I&vifoIKY)M5<0efm#SxT)HgZ)r#Tck*cQmDX z6<|qO@ZNjnkE=+C5mFmmEVyLoc^>NrI%rG}1DMm{f@Meu= z;sJv|#mRTIk8ye~rKmMUbZ`7^Iq@VF=fir{R1o-zZ?0I#A1h@Q75Ca^9Mm(pWNhab zii$!vM8lWK$3;Tl%P=jW?+gdH_I;_Vcc!lA$u4H-@k$~QY}yd59Nh*@=_q+Ef3Ltr zp>FL5mYglmr`)6D#=~RA_~$6nzPGTSx5{buV+skt_p&FAON7yU#sEPy>g0mQFERHQ zp?I5$M*GjK)2AeRL#Q9kWBHIY!`R#cnCmW>rn^0euYX#`p{@=W$@=g(_vz&^U0m#n z;8XaJ15XDK-0xo19B}j%gI}sogUJ~Z40rN+L{oqcPZRwLv$sjWg0mPbBVx@S6II0cWckg&>sgD@{ruC+QYRYccqQE zp^4`M(NEw3jnNib#J*$%na!-V*?48QzL$zEq#F6|o)WK*Wd&P3&LCA1!2i51Lt-Rx z4Eq}7D)&8P(93=@hFX03Qd}mFfg=(C&-xq4dp=4kOH{mtvmxa{(k<@Mj?7mos(++X z4TWNQ;&CIb$hoSOPIT2o>Y^L z&C@Uu@B9m6JA=%0{&53w5$i$hy;@;_M?%kEG2J`^Up(XXIodCgtY7v}+^tcx+{Qx) zrs~o~^V6ve!rH9xS8%+*R)`PlaXE2y8v)7nv&5T?)LWM6Huoqk0jbAhA?S}d5w?k^ zy#}F1MdqCYPAzPk#jRca9)GCY;1B}?!+8T4pgo$aVQ;%-tN>P(IDq)g*}hU%&c)J+zGX!a@#MMs^6N$SxoO(Yxs((n2L^<$t(#)m;9nb z%=2cyT_Haoo274)0j4P8<4-H)t8Pm}R`=mmy__`js*DY1>unctgNbTsph>|oR(59r ze)O3YWRPQU7cFh=5a0~lBzx+>(*cCL}C z#D&`8E>d0p+vtd+FGX`OW((C7&KdwM?CiFh2$=mutw#0lB-|w(F5qi7~gTv2G z8kc!TD^ypLsyGvB$PMr?Z5qir zW?b@LP%(bu)$a_e1b;d!=yoAOgdQv!%g!nDDS5Ohl+nrSPO4qJx~9W@yaJco)y%S9 zi>#RI%o)7#45I0gntnUoIAYZdi8j}k(>zdh4@e!V1iP3`AJgn?cgz0Hk_cO=(M^3+ zI)5|an-5p8>8tLYt=a*OM{d<%m+?(9a-3l zg%H^jaH1+Pxn$AK-%2DXE#Pg8Tk7qP|9B^=XJ!BUy@Nr0E-BLv7sK;<86Rvt%H2?e zI^uMg6iC$P>k7Rwv0+n5r>HvYchW7b>`CIPlUUonrXp&gdPBEMehbicdZ%&*4?mTk z&XcQckt zx@ABb-pNOS5^0Pmr=!x9_Tt1Pv`8lLL3Q|3a@b)aUs`3i$WY!4k8jmY1SVvmV_gzQ zA0a0dr_^8*NO&>YgRYOu+v~jtp#Dk?bnXmpMs`g4H>!3Z#6Hyc=;=GFhjXD-LG|R$P9m6oY~wkz9`6xXu}$(|yn4~R;qQ~^DVjup z_@Fk;g%y`YY``@DsQ={{EHtobD!S*t-Jiu18FW5EsY&dJM5PLBmv*AFAzIx^I>+7@r)r zI}6R6t>P4$BBxdH9x95AoKe4yEkQ&J46amh7Yvv6Vzx94#gmBh41y;OZbZ(6R;yGO zS=l5dCoW!db9t!550$Sj{r&!mHSy!4ZmEA#DD;b%YWYaH!#>f$dz|6KFv2ofS{IcT zSm6N3_?$Vsettxt@)dg`%IPrzo{CV?iBd*{IeGc9HaD9JF#GYocuYWcK7TXQrHJbp zXTRs$+t$hVh^YR6RwZR@7=mDXwkn_sBmkD{EgZJV#FIew0^@#wHnh}Kmjh9*G0wn5 zu}wI&snE^gD=Q;~<%uRREcM^-=s-ZJi5#U6XVT9deU<+Xn2-9PrK|yYzjBTrH}jr1EMKQk`qY; zu37HA1g=(lj%lW)&uYANvK$r1IBVWpd&Jj0zL)r_SsZx_=8DMLb<();EPx{Y=n?1n zVUpj(=qO;i8NODTM;mM#8mxuwFw3d;=(ja(jsR%RZtM`h8MgB;_M@xP1pC)Ky${hb_hA{G=wzxSk`@GdlH(C27l{ z%D3X~l|9j&6YE{hL)nyow z_81wp_SW^$K^8Co#PannRA+9>d(baXkTJf!6kK4*bgedwQTMgHet~LuFI$f^P;U10 zk*k8~IQ}==Kn^x-hV~W19nEYO5_?NwiYPWs8y_RCaf$<)Ez#c>=!h#kieP0t%kae0 z%nlCupRJIzH<${3)L;ZlFYnJ}A2+JTWRp~qaF>V# zt}F4XxR=u|JO2ZGd4Y`JybUK5ovm~t8d{!!i}84ABEgn{I#QW4Nt~9$58w+CJq1l_^Y9dkTiuV1lA)7@DgGU?6ABGfvoLewsGc>^Oi!;Rs&HpNN>+krxF4&m* z^jo>WcCk}mM{{JjIP}#&fNgvTH0Z!3ZUxsV;N$ajL%hK8S6lY#RL($WT6HA&yTd?0 zyyQ(%*r=-uMoc>Cw2Sl*e~0YGg*5~sx^&IB#(K@1buQfvr!b$sX5}`x={NLJuqNyE zu-dZx#X!aa7Dy^Nh@AKeN^-b*ha2|~Kr-n0R}Za@_c(9KhF==)gYXh?GNzi@9pcD; zOBM0jPRcLw`b2{MDgVgX8Eu7TW^w4%9q2?VS?&P@KNG&csr9E_*zHB%)-ksHqQ`S7 z;urttfqMdPS5Gk=rV%NuIm-ttZntGm4!z*%uGmVQ$GTpPYU>yXWrQ}uuUa|t*Q%c{ zcp1$w$i&J0#6?q$Gee)>*ahQ%H?9*&ETUxd5JB1g2WWwQ4Z4$597fDm2-N13ex%df z`Eudc`$E?a)lR&jon?=;JPKKzCQX^61y-Ii#pW8@8^qMj5{5y3QqLKOG; zwK`kERhpfC<@@kB2S-9b$iPv*W9$AxNcRdx&N^8+ffiym+VH4cVw#jqhA+shJc#Qa zQa&kWieH4#q*tzAx3o2qzPR{UvT1+U`UsR9$o#InzI#!s!}EMgcl8%`G3N11be_HV z@ogG<^yPrj1V;HMScBt_OVUc}rvt^Et0V$LhwRZ%;o{F1kRuy%u6)4bnCl7)BH69N zWNE=J(_*gwg=IkcKo%cr7;+ng^>8ijTXUeLHM=ky)-}^NbK?m!F6z|Hw{2~+wKuUj zxe&GpAu?wEwvpf?ou=UA$N0;Nv^l+*0Z+w0NXDJhzav+*xUxH)Si(+Q`KIYN;tiZ8DcSD3$7h(R!n=(2cinejIuP{`qogX!2c}f$eR2Byw4;9gv29k$L4_ z5-@==dCU2|*BOrzLw$c=6P_{eTXd=A%RgJdydEws@dTR&`Ny(;)+X!PTx9k+rbAATH*X)|Q%Cx$0>`gqPD$@jtIU^DC6LQMr+;vG#qHE&6 zQf{wjUWr2|$FSpTl7Cs7AITZqJq#?Sd4~{rp+{U&g$fStx6oG(Y)Fd1JA-AB5YHQ0 zTs^}j`ysL9?U>Dc_M1X0$l*=9&qbbyZZ5*MzurKWAXm)yp=55Zc$2sTGXLo(h8RsF z=CNmoloy98KQ~;5^>DA}A7GCC*gY7v9XKX&qgF%zAWNJi`&QQNURVGB&5)P&uy+a| zP4{wnbG|Fe^s#5U@IE^`7GU)rS?(&0rtn7oeMRhlG9MzEdq~DL^0dl!uo!ADB5+em z&mUv&!gv(xsz;we7p#2|*}B023NXynZB4tImX}vvz-(QY`$eTY>wn$YoKG`zY;HU? zX3uFSu2+b92k-0JiWzmUX6WzJ*E0*-ld)EBoR$kF#LpA%HtZ}f+5p{dzRjfX=Rjg>!P3Oi~47BKCZwIz7Fdsp0WgW1^ZFz&vY z4|t{y!McHwoglYw9EJI$MQ|S6BCQdIqVQH}-quj}I@SGRQY}Y5m0;JFePKZQO!|&jKj~ zi(k)z@{S>S-mhe{1Yg{3v5G}>k&RjHx2gQFM)uJTOSZNHo{gTHuDP3wI;)Gs^Gnf4 z&vJ<-QsH`uT<|zla`hle$UZt(*9z;_a^rSL+xHu3Gl`h<;01fLI#3-bL zE;{}CKMFHiZK6)QiGKy_b)20fRoE+(8SkGd*+di2TR;4?EIbgweX8#9Iz(7UScSc! zPY&&nx+Xr6pzI7%>JhQtO6t@H728wJLK0SMfks?%%p1$&R1Yt))XNQW{WRN}^Kb8R zV-Q?x#}DD8u^(*hT7~-kgGBw|+GPk$sVUEWN6y9^t)?u+;rN`#i2z~83|gbPKH~Yn zh21t-mnphK`wAtS=YCG!je9!zCW4Y(#2d8|**l-G&a(z4Q7Zdm8^D~v1j(?#7D*nL zN4`PLr<;QOj53p;80MQG%A-qy*H?5ohTkRD#gnRXabjbn_{tLL)%-i~QbDz@asqWO zKJoZVaB(-(MI!}rYu9)!1@d7Co?1Yxr!FogYN}B>8=GSgE)gv|_ms$LGanA0O~taw zCyT7;*MiH*1t(jN0~Z_RlZ`{A+1MbJS4Go4FLuf7NyQ>)=US(k-TCHzMKG55`_^=q z>@&{A*Wqkaf*cHu++TYXeG#`agvEOpXq9`qo7Dx@*UirxVK6W^*?3(D2@Du6rPGDQ zPEmx_uO%C4#K}!hgRo)*#|yd)!ZRfJr)ik6cgBA~WZi4Mlkee^0+%6Qom9#>^EQqHeO-DkR$t`1StsH@VW&O=3c8^W z3Uj8KPz7fuJ_QEA=s@|{dNAm@XM@=hNp+if2{vr29k0z!XBv(T*RS|TwLPPU?kUt|@3iG>*_W`ckG z*(E;mU+pe$5yyF#10*XEh|KJtYePW5+QmE~S%F-uf&pya1BpZHo^`AoT%W{s{d znWpVpx5B%$AAx&uKs`=SF{CNtZK%Lva?!e009M9VG2IQ?P|u{-fsz^b`p!(VV!cvG zTrTx|V&yc7wC67TZyyM3jFH)Ld)*1Z+5GIG+k$|niZx90IBYw5U2cw`Z!(I!WBP&NY1kSTX zM{NfVg+oU9!1oF zLRXB#W22%+oA^;wJ4gBxnQ_C5zfVANcsYhW-(-)q-sl&<{ZEHmzj;=K5R#-Z0)7Hc z?01~C*5ui23`~q6r&hFS`H!>)o1C4vz8%g6!n7(0#J`yAhj7F{VyW)D^#2Elf_fDp z61^ZzDSEXFN|?-F2r-NZzK4jxl?-IvvZ2P~iU|J}zYFcSxJzLqB!l8_4}Q(%Aa@h9 z8jXd79%75-=j}mIo35b@vFzLbKkU8bhshOxy_E05C@e)nI`k09XB)R&*#nD?gbG){ z%%_DM z$}r1+0BUePXKkX?m>;6$Mxs6HaPh=2PrT!oC5*nn!!a56HJ?iRC-j}&sglk-!@@%o zuk@rwjnouK7jPp8*fW>Po$A5($pwmUi!ozccneC9>|xu)Y+gO!Sy&E#>hD`B{JqGM zf(PL_HL9r<%+8d9n+z+*%P;!UELTtdQEuFTC2T+XU$IBZI(pgp zb_|5l2(GA}EgHo>tQX+>CaEW`=souU?n?a{ zAgX(HR!ApoXPn7gP^~aSwo6I~tM5IIUNcYWT7M$UO|xtl;C2Qb{p4FVl0j3NQ!rvr z>Yc?lC9?CWCp&HmV517b%yJLTZ@O&SX|6!Tsqs0GYJ53a0MsppP0D>_zxNH+32$MH z*F~$V-)Xcgyq;;XNh$T8bz)gSTI?~-kbXfZY4-}}Z=}nS!bC}|%@RMQSMPgq*)~QY zO;`ol71*<>E%bhlqgr1>k4bHC&z($Ho8q8q+M|2)qV314QWoEig6o-VWc_B+`~OyU zIr=*}9+?V^piTij$)C9w6xtyeF1d1V;ZF?{$bnxg40K=+PGKD0?1Mv$@A|5Lb3v}P z*8i`@%%jxnVS~Ypy*(|n7n%&@Fn?vE7UiyGTKX<`OGg2RuE6)gVCNYLY`aWBHYYER zg#)y_wuqKt9+t1?`Iz_kL5E3D#H-r*KbL~dB~@%|gHzlgOkxinM$?6(0YXNT(+6&* zE&wmE8iMbq(Sbo)+fw0XV|YZuA6lrH)PQ&!(ba9q*+BO()-W(2&%iK2#qO`iCqUwh z037#Gi58ff$r!LgPa4N{fDDo#OYp);nhvf$2>;149IbPFkKk<~l^XB{-YTb+WBL(znOG@a4-ZucP_7d9VAU zCc|Bin2vP7V8`)MAz&Sh?EEN`VQ6njD3;-5)Ns}M27h$Zp9BdhFrQ?>e{9bi$-ElJ zS4;D1TeveEy+-~Ypq(J*EX(%<-QHjJ{N7D~AtE{}ImJ?5rReEPCFkGw^D!C7B$_Ta zfgc1rSvxbz2A=6hm;Obv)R5uk!n5+%8?+H3JDD|OG%*w= zi}+SCXkXAd+6=Gk#dFCHx5)b0mf(NMP@Et5OV>!<#2=z!J4=YzB+8re6n{*r`sC zRSc8`ihZ-)%|An0gB1D-W`)uzOvhN->`r2z2B}2OYH7w=qeM9^CR!(v)vvX3p@^R zcMO#F*y^wQIK?MN;i<(!hv#U~o`j1iQ<9ZaP)z z`#^mdT1r`<8#;PNoHeHqu(Q_euyB@G>*!_4?mpl=+wblU%suOjsq+1;Yb>f1Ptw0{ z9T*-HgzPIx0fL?A;eVcav*#$+11H%xK7CWHLuIJkseT>hRv^kZe(5{Y0~PZLIokz| zZ76?I@{)xlF14-4QI8dvPXsqHr7tfuJ_x0HS`j1^|2Ew5V~D5kQ?kDQ&)L@O9` z&tSaV&5x$s$1aJ1KVy>KTw%*eXx;xjOi!z*wC>QXflWR5e20Sb!^+!P(ACJB6#X5? zz+zF|b{c;?P>{a0JxPJNlQn>z(l>+k!ri+95F85ap6*J16gU@1EG>bFWow=11pIEq zhqYYrex#z|8F=aT_))i58nk~2VJPsS_I^)0oQ}nwcSQsIp+q_anleqwDwGjmRM7Qw zuI=D0r_VFS_)bjSYib9{Anf}bt;qn9WmjZH-4Ojz%Ri>LF?_&BH8E(JOlB5|fe!H; zxoS>l(o!B7WRjJep6Y1WuITAr6HxhBES^YWCEHekqLtVieR+MZ%9o8;!{b)_?oj($SVvne+x(;Q%P+WNYnwH-1(=)H|<-@B|==x z_0A4)ao{q%r_H8${VMbxttD0)cZe0IFsey}Eco-^<>aiLLjs|G?B%3`Kt~n7@&S&w zV2#;lGW%)7GyL=93AaU4Ys@Pj`wr1m8{F4zk>r@TV+|~BsD|)7r)zs3#yR5RdADeWpFDlmXI!>ok)y@u7HH(Cy zm2yk|c`RX#Y)~#It^<|OgDs~^tk)Y75=K_v28T|kr`nw)F7BOv8VwIX31 z#fDz>`O8I~Zl-+3Aiu7S?n9O{2sliGK8Pe9XZBWN-g><58+6J0LB(5%@$Ij;|5Ziq4DrHr zL^q5`UGv+KJHO>C1{T;K9fqBoTX4ZMQy^K!xKaYJhl6zfQx;2uyfm%M+KR`q7 z4f!}aNxIEq?mvK74iO^vLUpRcvn)s|w8UPh{`7>^BSh^DT?Q_6!uE|`{owce;= ze8N*n5_b=>XdUYmi-u(g;7>@@ubW970#UGnbfU1GRZiXWOREg_b)LOueqcnXj|gAA zXfQihZt9|R+5y~eN{&N449|UTz_DO%oRV%vog>IBm+*&SkJs<&bgKEpM9Ay| zV@S18sJJ-Cn1ty3kk=XzIM`}v*l0^WF#M-B=#JxVW^9qWf8MuJJ2qn=YM??vEP-*V zF-3Spw2mpMk{QC^Ot{RRFGbD4pm6py)=O*mJuOL0Czpo{TF}nOd;T3bP_yZA6%P@} z<(^GmD$7kaWZG^lqm0&*k1tPWXaSp?L4MtzMmf1`YwMf3556&T)?t@NK5>FCngM9W z^@zd!9`1D3(=R9z)UlK9ZH+rE&}*B}@(1nz;qI-v+KT%2-B2h{w75%)ySta-#obG> zLa^Wvq(G74QlMC%I7NcHTY%#3?(PKb&hzZC_t@jzpWyu;KSfAhYt%T;Dn z0pW-GUfgut4AFo4Isd#OzYgT<>tSAUbb3I3>Zwaz22zdnw)qFpWtDm?!}hL$H=h|z zW2IK)l)jA*xr7}{!Pm_e=c8MkeiaOi1`6c`~A~^6tRZn_qhSkUyiafl>G@63LAMe_1Lv&85t2Cl})4i^-23TU03-T zC|banWP!3iklbUf$DHDzfeU$`B=JNT*QwpUp^+^;TLJF2ASfSvV*PIip|>mMi4>Ptflp!t zU@)1KbG_pPJ11x@XE!(BC(kkuQ+q*ATU=eaBbFsafsAOMJfNEXn;b?eSEmjcW2@`r zPLM8Tq6^z%D;}1Htn;fAPtVu$fp`_@7E6%Wfrnu=kXqL35o$Ykd7PFad*kormY^MK zFZ4m=qu4Cq>xvWsc5+$Vcj-F81+fbOR+8a?D)lt=H(rLKhbb0ZJLHU2waiDX6|Zs%S7Yf*53 zU)mUT@{yayOU#>T4Z3Te8tiBJ`p-$Sj1o^%(6)X)@PR5j;@UWi^Ik|+be;QgU?t7J z3*o6KH)E3O?jYU2tgIq__%8iaNcP=9q0tWzNFYreR{<{^I)pi>eZWdtF=;Q@oS8ez zearJmk3r1sy$t$`_u^fSiv~y2kJ5d)-ugsA z-4Aa_M*v?B^ta90Gf!GsQ+_-LZ3l)r>Z5IpNSnYR!gHLf##MB1g_0*1De^OB)dQJ19i7`7+NY_@&RU#I#>}1YC7FOS)2}4W#+}t*dS1|SzE>M3HYA$0p zszVIs-9P8xqf1PHBo5w~Rw zp-WeNb*X6C9{n+JMt&^%Dh&A`d$ySi*L$n`mYDnCtduyx)yO7jhU|w(zXDAxTfOc( z5<4*(E|oVCfG zd6@+7W`!^){NP$DS(U!3yQLsO6A>WlELD3XRp#WJ)U!PL2~W9FIA1gUO3(ZcU_%=Z zx=cjI?L+YN4(ZZa!oDQaJkO%$OrMl<@wb#3KWAH|GsZgZA={CP-{#-QhU_HT_SbvS zzvVOK%<%go?bfI2d|qlGlmvVJ{iTXNI$^*t?iW($XTUnO*j?cfH8z67W_#Q6E78~* zmd4N3q|byrzO_cQrTf23tEO)e&pMW~aN+qURIdewNwqkJ5_x4x*CD!i@ zx*b})xN+zG38cLxV zDwe~7rGOm{+s;9Ij?dYqk-$`}p?BY3j%_JZ=tQoc{k2u$piScjnuRkv5GgGQ@A1;9 z49#BwuT5W}@F!CscFS^IlyP{}NJ8c-r2#$hgw9i-Ww#_Bn5xmm(z&&$%@?-Ue;4Y9 z%oJWxek1jEjHvf;YbcVKQ8=T9@|!{20C=uQKid=zeY7zK8hm-)8Y0rgrB8~z+2=XP;SyJtROxX9*F*UlOXx;R$mkQt|FPCX1~mfY6ay zsvO(<8KrUpW;;>Nw44PFNU|k%LE{U0Dw$;d4b$?KxhVX>4Xu~TgfiqdI{NvwKc5-d zMMrlb=0K|wuu?&guF15MYU{L;>QY$v`mRu|{1>@oK}?hVwJEZ>v5iS~e=B*9_E$<& zaed>WqrX8{FSY2mQ78VKKZz`2H_N>BE^OOdqg|C*#tIP$A@WO$O(FoIxc3ds4IyDU zVGOKQ-f=0dJ9oPx$R5W4jKF_yI#(Y02E>y7Y4*=m^LG9fN)x0fm23|uf0^7BGNk5X z>F-<##2A40tUr!8b*~vt(fL%A>6FD6s)+lH>fq#4W_lsOD#><|bQ!9FoLUpjF0wlY z0fb1`f0pG?%TlW1Q3gzk4-yXU$;T_0Iz2^yCe)Xf$nCIK1v$mto%^sWI9$X&`+A)e z1IkL{-p(5@XSj^9L02z3X=y&~R<+Xu!#|vVujX98<1KHlP88guhe-U4>u*%Y0KOe` zb26P~+-Q;Dk*4l&4s>>vmVXx~XAwQ~r)Sn9OR|4dQcubJmzE$x0MZ8OE-`|qpZYfi zb7tPqrvuK%5dJ6#&PCg>Q{Y4e<(Sj@+p_Nvw8s4a$jzd+aW8p(z0Bvd-0%MY-Zu}p z%GWe__JSiDOAFB2pN)8(XOyn})hwTJZD`bHHeYCF^X@HCm?% zE(1LX3=rTRtUTS#{nsu1?AqU@uP*t*gelsOb1-!X{x7T02_Zhl-Z5%VZGzl&8uTeU^Y^u>zSm;EiUbCS9! zcl6ek`yW6^DhA+a+B&hIb~^+W?e7=xTdx;Jqui2Az5uQbJ6k8Z`pvnHD#C`<)Tx>f zYm&kyE}lSdvwApx?%W}X`(ID(u$HI1Bc<8#SepkcnlzFRm!9Le+XVI6z z>@-o_FT#}6nR)`2Bfk$m+k@%1(_0<~uTPARW5~nq4PIgUW{3DGylz`mVPQ~&5v}Xp z$>ix;4qZR!s}=w`oTH_Xr)LxDYK2QnSY!T{T;J?Ae60^wWK^PYjn69~BZ8XAu7iQ) zMqfQtRw@th1h?2L2$g$sqi@KLmZJ5`sa;b;vsUqk>;dRuKITnj@~e-bT|eI3f23fyz8R`QC60F^ZRzQVfOzt;4<`6-Kv8s38?Jq_elRTG&Xh`5PNvQ?luPVknE znYmDherVw!|LxFPN5oVAyXWJe$v8}Sw=uDv66i4h9GG7-Q`olLAf)|?e!zk*1%*0~ zisxjqo(XQ3X9gpD`Ow37<96%3a%RTco*4^&0xn4L3p}xvm;eI;@|a(Vqie(>BQm7b zQs&ABte9d5gN<XG9# ze$4%pH?&DacdG)`hqCHnP9pD6KOF%i)-Rza;TBO)ST7;EhWr`l_#Vfs*SU3M!f^M^ zeT~wXV$e2a^5qTI`(0YxU*BH+?s}XbMH&#^noQK=)OJ;p40V*+#O^kt53m=M`VppT zdOq?zTDR%F*C0JEZMYYItufSzTOu_#S-B49D9-Pr=mnwk^>CCdD@=K!?EC(H;r7=j<{1dXB7jQr{#oJ+WkzHv(c=Oz6ktqmh0M?r+J3o1NhUMIECn_QJho z;$LW;%D|ZA1S(An8zaP{s7qD52Cr(OuLlssrF6i~$*G5P`0SqM4EwEuDD*6hN{KC- zrD`biVqe|u)0`xeQpML7)yTo3Fq#evMw3T2tk2*Z$(4s}O7E0A#dFRgABIM~M4I=4 z=mC0xslrkwR|jhaep^6~$K+^A=Ka^MUkU{B4X;J0FbMo+EIlFF=ly#RgJeHlR1IPm zGC{fy1zI@-#`Qyj+xkg=OCHebY6;~1_)P4seth{-hPw`&;E#*&;+ZeAk-5BC<(2a} z*|^`Ia(F*o&=Rx?;;w2;S+JnnO{TNeSfG;BHZ@QlCD;b@b&p*Rd~q2gAhLs*>(0J} zu93il1dR7Jas1kbVMlT2CAI$KV*5WEuoT?-e3G-SNbcuTm=e{Ej@>)(l$?HjQA7@A znbR*Bo*?@)%^evdVwhJlSqF?mKFU3$+g<7y6eoK;dZ8xxn=x{ApY@C*+}e6r6zLdKJR)THYkn1ylQqQ4R_MH{@_W-FHyI<*oT&Et2u^+U zd$a++w>;P&DE(SVT+CMBXUb)9vXxdDy@pQ6G~Tj)5W={nO3=SlIpoS`)@HFakUk;4 zf2Xt@Vw8!N>|NSLO?6)0_qfWiT)kZ5AI5CJ?vm*x`E4uORWf;KKYeMwQrn**aHAklW?w?x zd4LAz0;g24&ehpNDa9`0oi+_U@Og$hyW~uvAD1xWjFRK~>((qD@d~9L<#~3{N#_%; zgFYb_wF8O6Tz2Hog53Fsr?5~~l|?1+*d_j+vc7)G^4lJI+HINwg@S`Qud4fyJ2r?= zND^GHFF)ifYCXqK$}de@k)=d`-R8;@KHHDz?lid9sz0^M>j=6UDAMEeDT?x(!1Y_7 z1ly-7o;ZJ4k=g#}n4B3^iVsS8pafmR>@P}J!|Elef#tdIid8`eW3vQjW(i*Pp+HpF zx~eYL$2{#-uTNuqgT=aCLLV@AgPR-74(|Q|_}1(N8$x&RYkATD01-`y2;~c7er}uP z)i?rCC-4stX(XTE#!#1uf5@j0KSH)dUJr`dgHFGa${$78t`FpUW$m3dnD+i4LY zA0oIK7}Ms}p&&sg1*xru{POJpy-mCSMD8s6U6O^T7QSr5&v_G%JyNLjv?RNI>N!8& zf{a5}Hpmh$+GpG@(+7p=5%T1QR(hR3K1R8_c@76!%AW8-+mh z0uzSq(qY*=UVb&y&!tnXBreq}S-qCdzV{cLOj9>x?~)CvC`*4I=2POC&W1p18K~%4 z722G9n8vkx2+wQXn62pIfjeg;2C^GavgIx-Lk_Fn36__)ZVA^Yl=@JGt+Yiz^xv39 z`n&QtY(qN;?RXJz2?*SW*l1Huuzl|r-uBoJWJR;_UQOK$3zllvv8(_tv|?NPrtsR6 ze^)1LAjOk^;>|f#_@aJU+Uynd#8Y6(F#?GKQtm%a45cuymbM5#vE}6ar|*Zxw)GEy zYV1ANqcz{C(;CHVq#CRB$zAFg^4%X-gKax13Yf+D0u&pt3f?7Qp?BieiJiH_)|kFl zWi$HLQ*todkdP3q{?^a`&A|;3emKvB?ArqxiY{M$%DE~(`g7}(+Y+>hGi8{i!^k$R zi;*Eubf!D9$X*F@w0@D1pXj;A&tOGAk)l&H+QGL;XiJ{{z>EpTxGvv{f&znlZKJd( zP6jDXAHdCy!caiSWR-z?e%gV~NC7K;VTS69sk%yT72VwJVn#->c(L1E*E3p4DG2E6 z2g6&oU9-eJFlCDTs;R1kue(A~3jLEA=>hO74HVc5f6@h8xS9`#dFpYx8fUk`qiOov zgt{T3f_kgkj){B&+Wpub)ckO}0{GCO*a9bGO?!-Zhv3_M;gd$ZQOVp^!MjhjQ+{%i z$vBlNj0$Fq5Np6fVZ3@c6I ze(+p|xTDIxe?3iDr5g34<6YCyY&O;lh4+uJ-$e@w^ae*knW$M5w-sS;zB8kA_#7hreUObyU0D9%)cbFE6_4Ys6bq}3@dmIV5#MCqzH+a_tN z>Tg&;!o4dh&j__!T|X~cJ-Sqkhs6a(VT@t6RHoGpx025Hrji#HL^~;MtF&S<#^!W! zaA;n^Wph>HF3ZDF+Ut}f$+cQo5AxU)P3k%V^J`wF@8di~fF~ivz`v41x&9rO-CljVO zS7{`DZ%R1ND~lf*I2<@suCDAt@j%i2#TmIJaFhL`oy^;~&sF@c**olH)aY{dm`TecOJ#`02SmMfE$00cW6i2BfnhL%=J9*eb55Q82chz$@-Yz} zstQ3T0H?4%w{5x>HNh$tY*?U`*u!tEwww@5YCGE=bq?)W!||4gZnjPX=AsMn)!%c2 zk;id!sBd<%DY)EA5jpEcBZHSaorWJN2gzaMe95whJ?#F~qPM@aVuXfAs>nk9tR$j| zv;2n3k^k6)V*sVTR4s5*2psxh1BNum1u zWU#iOUZ{bsXHz;Nd`g%;VIOTPJ$2Lk$5Ib9fzRh(3SMsSyWXJflI=wN1AGe^Bc%r; zubVrAA7dsVVi?X zh3l#hK9&8{@lLEboOeLfRp%1TEbXOk*E62YbKuY2pNQU|pd%B!-r3j&$?6KF)ETp} zg{6_N{+OFwZ)Nii2I*btOiVydqG1Oq2tcu>!2`P&`E(qJ<1YysyZSXu`TY9@R{!RN z(ZNnIJx_1h0ywXJP5 zy_6oGKfXdm9=w-iq<7+FA2qDWOB%ez%T`a6#Sb068AkbX|tcwJ8{v?~@{A=RUTZ zvPNh>kQ4MW>krocx%JwI_p8O>Cc~hzP=G@IgyEuROVOd{pf~{$4qv?vPvvdTms%vO z-#>%V2k6?gyyk~AL7w0!4YL)Fn9#nZ;6W5sHl*oL#IQ^m^5;+w!D3Qwtdl;wdxydF`^#Kazm;=XXwUB8N)Gh8UFUqsg?JFskyb`60ae#k4FvXr(RoZYh z%~`!Os9bSyQK+|KYfmT)z#s7Dcht~xa9!b@a%0^q%8G_2Y#*MysO{s9%z2DeLuT9T z)d@IulR5G)39zba9r7=NdCU}w5AJ*g7JJ+%m=jQ{cu4Wz?f1-YR+eHy3e6*KeJN5J z#1uu!j~q2W`el-Da-4R;1oDX1VMbSfw7ew$zWF8BKfG_-Xh=hQVT@?p4ktc+nEd|k zho0w`wp2^2Y^Svt7n^IOyVAuM47iiGqm!Qk7*pO!NA4@-=U)#s&u=MU)JT>3oMzgu(hx2=XU!;sB%Sku>_raFH$IMdonMWcOdvWBI0}Vqqk)yJa*i&u zm;1iy!+DH+c8s8-siHRjI5}Uf0x}vrSsJ}q*ysxxTzwP#NKk5$JXIKnZ?w3qa5bcG z7bL|b6CHB;+S3c+YK+aRj?$=XNSOI>UrxQi>n&_C6zld4v^Lqsr4_R?dAb#&BG!HQ zM=Y_3=qfPGPZm_T>Z2VN`<1f95EY{maX`EJhj0r!`hv8%F$%0uby#|y-E-@im|87l zyk+I#lX-%Imps@n?@bR1GDE6>>m7Z#U>FIljdF8}X(pSQ+m)SiK?|coKSYOG&%LlH zG1U6{*Rb=7TP=SoipP=0+*cRBJ(+EtDKIV>jBqqpMm&l;lWf{+1DC0$VCBSGbG5SW zAkGtdT~zq$2bFer30PZ~2|(jHV}NxA-5xvd@cOd$7gN6xCZ` z3NF^C?X9ifTXt!8Wnmlbd2MkjWt8r{@^fM;Y9oeK9p}cF^ZDi}&hXMf{PhOeu6A3l zw3$AsT|N_LwgV(9)NS=G&!LwXGU?pwe*jN!>Yj1EyIzj>XJ+RT&xM)D%kkCyO^=TT zf@nyjy%Sa0Q@CZsY-QpgD(!N67SN*iF z?ewh|HZ?$-GDAxX_KMP8dy&1PXxwsN$NzV9NY^A zcy?;y{CWV)l+&IhNCPOdt)m^b>vQ;ezS-(pYM@$E==}C^t*N@cO^VVN0RvQI34Z0z30?{x1a=2KEjlrCOpNzN%xIy$h+Vj9q4Qt#4l zO(z+36H%$zU5h`-)4joBs_fygI$c^*Kl<$&$y^Zv`+sVEEcSO=hF=@*Tw*4>oarO@ zqLZ~0%nSUEe#1lfk`o5~o_aGA{ek)QqfZqUkonZjCi88Ybd`xFoPbgaN724y>X=E*jn3#7NaEcHrm< zE9o>WKk8xOthzmQi0+ryQR%%*8facl%4;YSB-2}Zk#2kB-~eGA__k9v)BNRcY13!< zZlk(o9sF$Vakky*uSH0=;YHI2{ef%<6SBo)tnGirjMC>lZ=PKXdcnx&UL#`S#CA zduP%Xlob}5=d8~|v=ThP&)glSR^ek9fvsg|G$8?ynO$Tpn>f2`s61T2YEE?LHdptl z#aldQp>r7~6^9WhRlqKqS|1ZN%AjO@qXYQ|$hwxW)tlgN^PD$6Od-Alu?+ptpemZC z&O0xY5Zi!$cW?O)SyE8vp>R#JNtDKQB8%8MFf}DQ&Q1>{)FDZ&U-U0sUKy_J&i0wV zkS3Tg(Y&a=6XN7}7y5aWaNx}s3Eyv0MvIj*P)_L;2k2=|Bw#5wFHBQhrjt%W<`B0) z>Hlud`dO6PyV;ZP+&mTZHW0Lyw*+JI2n*c$`}tpxd`RjE5S~6(CJHU!lLmdWbW4U! z2|t7w>greRe`aMC@nSVzN$CgXPE~~Pmb`BSf@AVA=IdMgMWCW}oUnQ8`5U01r~c%( z2;C+s^b@lmd49UnrwMdPJzjC-AJGJd^Xk-{- zRoAcD3+o$HR1_WaMh6lsO>R0#i7IgLTT*4ifAHv-3Tr8e059k7^ZMH9n_4e)SFR7} zKMezZbiF3TLJCG@v+ZeqNd56+bQ0I-P?Fh-NbgHc5h^;LD8hA`a} z(N?7ZBDKYF>bO^*N$I04ui3oyd#||9m#IHneZf1od$-SIh%SkA(I05kx2S^Y( zuNIKJ6@WJ3;f%Lwqt{Rw^UcRfOMKKv=SK4RHQ4A+Zm0&4bSL05(*FSsb|SS$?YgPX ztL^)Nq5jsYC+1f>M5)9r&WvxuthGRy$U%ob<>)q%n-UkI&DR6`NDPF!;G;)X!I=tY zr!NgbzOB)O{t{z#6xd8m)=gg`w~aS#L-m}wPELD-S84q_{z|?4S)QzWW;2m@6nvnF z$z%WHG9;l4QP|NWk58)pdQckNI~gaT?5fi8X%Zpq82wKG2pJ~zmCYwMJkPB7d0L2z zB9j`EneHDzMqu++AECOq(T{oJAc^*4@yctBB20AjwqeWWloLU_4>?x#OZsEC7#CKT z5yPeZz0U*LBDI*VnD!3E729>LV5H>K+F;G{w5F)Fu+v_Dlwh{o1YqCF;2_U4}D@HiL5hpZ_%p1M5oqCrD3h?7Xnjf$AWd{ zjA$bLc<2~zlid>(X1|UPl2Ny$(p~K~BSujN_}=DnLJg`kx5*QRf+d5Y`lr7|js}?y zCD;ltD7+svsv5&4`_VbfR%Wf!w*I~$h9{A2|GZI`av@irt}`=ZOK+V}rUG{(vnqzV+s!q$&%3!CqtLb~ z%iLPa(9Vv}H%YbGsm?0dpZ3!oYt!BNn(;?@<-Pw%zH4heU(Ik6%sj7g;4I;$=M>Gv z?MHN`aN(E6Ky!{v#m04>1Kn2L&F%K8Y!JnEbT5&5G3=(|hnO5h0R2igvhK!+?BGJG zPn8A4{#yOxCF;a;pwVL7X8FubW(wazlyQ?wlsJ}}gi8@U&%Vg1gvg#d(AbAgQxL69 zWA4OpgMDzW3d*2cN;EPY@I$JH1rtQL2%+9)DlK&q-Ai1(;Ig<`)nRz>|glPZKo0&zZ=|XD3ApKX` zco9Won`4#!##qP`Um(F+>l-jTR*ToLl^g@O0^uTfW`ka2e{&C{IG8XtFYV!I4;TZX zA}c_aqlwn7zzA*gIZ1?vISyu&so;=UZDxtZJ31#MDw)os2mNxTO~VR)mQ^;9_tRL| z)!bb(=9GTRwwHwaGrE>8!>;%1Y_2Q*h+`0bzjg@PjB~51SMI*ba}hnhV)1&J@eIZ5 z7n@E5cy=~?gDcJqgg3r|qqscPS8KWE0k-Xt!dbGbS+mD>de`joPWQ8{11bIbEfdY% zh%bYHy1MsJA@Ah#?5h75<+)eqy!&IL^OK4f(G_dbE$R5ZOpDVO*G}KhZij61$sdY! z0nDTT96&*Ct)_})N`c|DS4NYz=5%>&i!8`}o6)lvnIU5wF>QIZ);rh0soaGjuRes4 z2s#^s>ob&l7kIRRCdmjFjjI%clfopH;t_xya8TD6%Ne8JQfBf>oqWqgs4QQRI-7izdJ)Ss(Ig+q3q(9Tca&e7KoO&?u$&ohjkH}7{dmi8_Y&W4$Xqb ztnT;B^i@*I8}8fJlDWb|JZg^F%5aQLV<@tn*6_~S5L@F-ca`P?l9qh{`uS{?%N@z0 zKv`1L-=RoLPmxg-&Nm0E)s{1ktrGc$`@XU;_LO3}MA<85x-)+z5y^$p`sRufw`gt= z+NY{$kArKd>zm^IvA-aK80D!5loH<2ara!KI4x&j> zag3+$@SK}FFRn#Oy&6CU1}0`|ieamaDIZYPW>B)nbx9Kr$&>3d&@x=$V;H4>d2WgH zaNin^%Hvy8m*qW>U+i5(nwcy4_`7%w^nJHve`_0xz`Rlsz$6JGXXI7}mBQ)kTE7Q; zn{_H9sQG$S^sP@Pj-O=^N#IpqW`mC&dG`&5;jdFsg>+%;7XgbdF zDaNT3Rio!O8Bwm+{LW7k)ASl1al;K&v3^m?bhF%WJF(p4fNS+w(g1(4$a}Fq2-d70 zRf&>giP1pi85{Pv_Rc3UBBwN%@S)h;LY=za9J^{7Zvq@<2nK>8Nj_3!!fkLN5M@GT}fxyXu2HAp5B+ z0$=FUmQ<)qb4;rlWk>KV>G!Xe*f77O7owT3qGitXa!Y`>s_x^#n!8mSyWT&BO7lkC zJNTwkKO!JSc*}~O{yV07WG6~?K;YLH$_rJ7P9_IMUITF8%_y6(+O#8-18*}~5d&$k zBCxMHQd$P5^ZoX(ZDvIYc?Cq2-tDiX%SC-O|B2DV@kmu+OZ;<+miRPE(x~vjKJeAz zI+mN+L@Atl43=)XGWx6jR!G#(I$`V$8?~aR_%+I@#F)Sad!qEZXf<^s9i={d$$`z7 zX9|yq+f+>AeHKUCEVoRb9cS*2i*e-kdxTZWh`4&pi#BpqFk$SosJ}m3qPu9eT<8eD zO38%rlG$MlyPn_~pB#ZIV^>xJbk*`$s=Ha0qW5BD8LNko6iHdGbF0lW8!cyIN~WU@ z!aSPa6|<#?N{$#RBM78kcT&pRo99%)@UV;HIw60tk&*VUE61&1^&+}8vfGMQ4&ixn0&!ezUOlq^eYjeH4{2`=KxMH{U~!(RX~99;Muq$rq6 zt_n;sm@F@x#s>?Kmr8cPCG`gOsG_Df)QI2y1GHqtw75Z(#61SbXv*D{L6NOlag4Fl z055=UN1F2IL6+eb!J#&Noi+bA8u z_cd};JuGzu`E9~qf?-r2)%8H$qH}1LJH-ap2p_d&Cv2|GA9>S}ukVGgy>Xma(S3xB zlw){nmk)~Kc&hH_A{wl&d_G15=h8nnYx6-#@zOdNT5E27n-v=#?}dOp!^*80&P?;# zljVy=K`CWNmWWdZqPiASlR+SBOuM^1MVyQ8l*by1>V}x`*=Us`*x?dIhMdSPUXk7v z4SD+NevTsl=*xJtB7nNEjh6-!9^Mx~(Ac7g1$yrjPya2v(PBZNkZeBA2@##2dco@% z%Bfz}4o_7&V;#7X1=yOu9wd-8Iu=j2)}-WaU+bC&A2Y*<#ZYEu^OGmtOI)WTRYNA(St|#kL<#z>VIgwdTyaU zQvDoW$8+RPDd>wx%}F;1^~XZTn7ILz27Y8yIHl5|+Wv*F_bEDAJkHN$EelzxEf%aW zGjSU;a~wd_8tc#SRe0IbLDt->Bf2ePw_;h?k%39`&O812HbTq#IUvFfEWq&*BWGkqUqavrA@PcaG zR2~)ntRNwCihK2{*_WBzQ7mug*?C<*s`luN>r*7Q-u!mi#8ARpsYQK@kZXGIw6A$r z9Hr?nK9JcVUT_v16-o=l)mpKSrI zzyWvlw^V@!B&j$#!|U7G22^hasCnTiaan}K-HJZXj2wn-iR#k6ZdlIj5I>B+3Kd&j+785EYjz) znYmb3D~aIwP-m%sE%5OvHEzDT5zF8}S&^s2_m|UyES@Q}sATw1vwU$JICRmOIbrM7 z%$H)p44N!HB9Hd6WbWL)nCxOgDlLpe~Nc zO~&QhEv9~VHab!bJKd&Las7K$+Ax$)-RjI(ClH6HP`He#7_a2|w-k z)*Sl;(`!w&i#lnP6S|9|bX8M>VwDtS(>TuYcC>k5z+3VV)76E;Bxmma;dZT!2-6;? zQ|TkfR>))%LPrdRe|dChCvQp7v8eaX5duK^3}ui-ZUwH@65Q~Odn{^(5=p!NWN!j2 z-`BCov(OpU?P#eUXUkRXyu3M|Ef4f<4r}>(J6oB(vZU6*Uw)`xN#%2N4Mpsp^N@Q2 znEl>0L7wZzFc#U;)SSvJ-zhqu6{?AxwztL>QOj_olv*;SdKH;14HQvW2PFhO;F*7& zFl@GK$#TC){4PS?EU8#iKP%Y#8T628hr1TtT4WEg7pMmV*l1U@`~h z%7^;IB_6)9WltPAjJm#E!EsX zqGaZ@8a}ATOVnjPo&SiXTf9T;Xu5OiX7IBK@iGrgfMd4O$r3??6Wz6}oY~44bmWDr zwAl1GJvR7SQu&v*oJ;jcxb>!9sFy6NS`^5y57}x{3?c1k;AO)KT%L_o7ihFrvqa|?Ho^MctXl^Cr2RF#JE zGj~r{%l18taaoxf>wk4IqGPqmNG5N4Ns3)KC6%areaOlD&}*?C9fo3MbutE8Z6ndY z;HaA^98e+^5jiu{|I@0Uo;BQQWrg){&X!6xoKrwz16~#`(dkvrGGLJ_JxrQCa$169 zY;Z-?L*6wRQ#6Ja9O1@04Jo>Mqs@^%T$yIxyxl*_a zq2^rXd_hsV#OXKN_8`(m|7=wl(P03|MUv6`{%wBqmEtGs^8m5Zubi#I^Br+JX-?Km zCxGl$;~a}?K-?#{PS{2Vq7@xsJuZO1KzFB+MiO_MN_SInwS#LiBW{kplP28)5ILG{ zE=Tsd#ZL2ns-8Gqx)B-M%ACu93w16QJokF7(uS6o&Hb!%`#~>tg1bRe0yWCPI&qVo zdXmdmFSPeO5-96Iq5cErh4gv~ted@qzpgMe2^;79GR-k|KGe-Z5;P}Ht@QNTpGxtx zDo?CZS2MA99qC9Z|Bk;%O9QT+GPi*ieKM=$oKsg*_rt68a)ohRLYRK<2?+dH8PZLz z+F$azH?FuEeb(=UnKbA!2thnAH=T=fNF-nT+(p2(H$ePKf8s=g(-876s^uj z>bAuU?z_2`2-l8%!ZYlWX@O~%5+DeHd4|G8mrZl~4f{jC)s=6#u(=%>CFM_Vt{8um z@~aVL{D!KX-$m|Jv+8|<-YJ!<5zGpF{Jx-gS>YLr?UNe$WC?P!<_s?St5M)ozo5i)fw7mHvxJYJOk^`0d--FYTV;D)kfSUk!BO7 z44~?=503H77!s@o>$V4mx7ygt>8rI!m2%#rqS*!7f7-Gph}!ygQ-v}d`TD&_r+UDM zJY)x4!92Xz2!#X`Q=NnNDI9Ksl-+qlwBGQHULJ_z-6hUcqCCgKU$6hB{$s?euJD!5 zZ;+=w&P++|5wo1~{V@u$zj{Jghuu=GaholH3D>V(X$bws;CktMKYNAZ-_TJBRro&I z6dOJnk2^6gfUsBoT>PLy#%a4v3{*ZMR^{s>#|jowDVMxtjEO*T(vFwMrJXAwk1sAK z_Tw-iW_rUQI&Npab9e0LX6r4}4=kJTNU;Bq(C<5|9_vTtweE~B@x5=S4%9xoUV&2b z)PVCnFrq92ShSy0FToaB$65Sf(!yQ6lTwlu7{wWuUuBY?kJ0oj9F1j){`ZtjtVn?vNz-LdJx*W}5=B;MyvUO%aE_ z`6uX~4c|)#h5r_zw_R*wGi{2!Q>mHs6MMhd+?@YT2FZu?0G>Igw3(^U_rZ_AnmRex zOk6NMlRasX_q3Drbx8Kv=QzzVOIQ*|x9P_!HRR%b^n>ei^N4YKa@%O<+7~5#CQ_U4Idz^E6Er1rV_xD1l3D8CjCws`4d;TS`IY zK?`R803eBGb!&RBlp22R-mZk{^$@d-b!Vb~fNsqKk+fH4OGHZD*ACYf2bqWiz24z{ zM{hcT89%zFpWYRlgiJ$;6KQh|SdCH@Qsf)m(=Nri^|sS{^NL@%-AV<{WOWcDKd>pG zrdikh;1$}Bl)D}?v1v!!m;@uw6fXIgU&$6nutW4iwzhLv9As#2h`r+1hH(}2;{{hp ztvay+{$V}DDj~2mjWVyOc;HYX7ML+5i310#HyP$PPjeeFR!n{H%`#?b`h9p%8g;+f08pLNBz<^KGIAZ;+*HP#og3HzzQ%_=G!6 z=b*Gn`qpZ_yu>ngnV9H=Py3C0NW_WLO|siBF9FuOaUmaz{eD+HZx=gJ#!Hw8impOKb8avLkMl2jDSQJO zdCVq>Q+o;y1#NjemM09*s9(+2*7_U%?zHLi-Gs}-`i%5%-K!F?taz&hXFnhTf@N;X z$l6g&V7~ZcCb|(0vrfgouW7(`g1Qmu$@rCt{wfE)u^66S%#)k1+6d$H%wMtKjN?gzu zfDDm;lA%>=>``1lGczT*1j`RBr`xFvN7w_MfR@;aj7ts|t&lP_P%Pi6@9j0l`U|0b zjL(KwjjNEMvZl`-(62}8hx1U&(2bos1jBSJxPJpef+xy#+|g6CPN5{AeI<_cx~Y3&AW)Pe&E;DctrdfF~GVk?gj_(c`a5JPv)_ z^G5cL8Ezi%_p(!b3KMRA{4bK@sxx9KJ2(p zdrz#s{~tt1B!Go1xWtAQz^inkVrF^K(u=He9_?%8N|den^A%yxV?me0-S!F1j|U>A zp$a?sj1qy@(}9ta9L5K8G1k9(h>jEL=^H(t=Ne5Y8|I2;E0eZx>aAaw@n6w+Ag&*{ zqrm&QZoHGM9L(aSPI{Dt=w8h@=SgmH{dIj&QDeEUSrr$!;OsGNkL=%^RS`?`{$T9q zu$s0W3ObjnU+e59EQyc>^N!x`?c z5xO8)4Z7>D#j3v|4k$bT~%3?%9(PbC5@WkL*m0ES_?RWs#of+ zfksEtgNxe3oy@Pxj^lDQ^mk6my^5y5!=;C)l?4kgUz4^wmswYHA8??Kz(CtSnASJs zn;xV__OBi?MyeK}yb=vL6rCGbWjr4(SkLlR71GesXUNIKVjqN%25QdF&CjT7O}anZ zOq2_-F>|h41SiRp`pf&$fHZ|!=<;wQlHZupP|Fs7wiFO<^T{{JeZ4YDq@V?y6gNLd zIJ;g{I&h`ujKEpl3s$}H{{YoOG@0N%so|;fe}G^_eX%R}Z%@sVG7J~wg27C4Cgfb; z=C3PMauVn~%3bRvhTs^HyNe1fI`WcV8t56PU_)d&X=DQc?d(Z2?iA&^1dBv-E zyt`tGcjx%VEp|dxb9Q9xF^iauoU`gAD>aR*ROUvq#CsDbLECN%#2XTk#fC>%sQ4hD z6SIYaLp?7&yjpEeqW>(6h%oYZ=T;J^YO!(YVBU(NnTQUEfFLpEU`$=}EInNP!cNii zK2%}$n?y*j(NE3QygX(e-ujJ09I(E*naX;pST>P4$I7r4HZO9E&j5a|&D4fz;rmj|JsrdzWe zlYZwdh7!}|6EpH;D}&E%Z@b6N$GlzG>#BjVo%=Z@o$GSmHN`25>INEmdn5eb?GL_Wl8De_&*UPa)j7Gv~a{^Ef*8 zv5m~^7ne0*$q{5Pny^f>2v1t6%j4AHyZQNDbt4Tmu^(?JuzRF+Grw-OexEwE;qnsG zVVqwj-LQ|0WK)aMmZ3e>NlQ~R5IYMIqW9X6yAZ;Y11D0i5e~i>OnxS&{>HX<$bZ$v z7l2vl(PWG93dGSZ)E;Y+2bDUjYD?e91|3b5Z!M4;0 zn0$Yj9*e&e&xsYhDHE*5!EaT>hOS_Xk!uioiImtTCGxk?oZ4#|!l&1?gxB`1M?RWk zj<}z7goy8Jr}(-yV(@MK25sn*V#Td4OF_*E;+AEXkRCUtVJ`sTB~QSPE2v9@>{It* zi~-Mvi*4z09e4#@U`u$vW75KNSXU|u*)>v*Jb9L~lQ0%9T&AGr8XUmg^Qeu`+ljx_C-p}ROTJ?s=zU{)n&-tg za33Yx4R?t!nMx)f23&sg2;BkGLs^S%haRNN-q60vwo%|MOV^4Yk4Ng1ecX#ze}yMgK0S zGdhKiXD4-1O&KeNbv8Dq(5<#W30O_7KFY)!?5a4g`-=A81rN z)Hm3*Y*|?ujd!xGP5v zP{CKV--16uwd%)y*lif;;4G$*)j3*dBk{;Ov)aL;sNPQ9ODk4~PzCaiBVEFeRflk` zaH}6qyu4v->la!VUpcaccB@(!0S_|@ho@#`;hd5P4zC?221&076EY6Vld|NgpDKEa z@)M3nI;r1&EW+wwjt0OQEv_iy2z*{_Q;+(}I(TCtbyO+)9pvqLv0DxG=y^YL$I?%V zxT_QW!oRMHiZwGZ?qFK#RDQfP93uLg5BgQjFo11!kfXyFS{*uY(IJ;O5(-RHPFRGXG?3vy9 zjsm#nZ^yc!*+~C%e~#I1d^a8y3Pjl96ks!iC}r(}bY7q1(IgA?-i7efBg({-RWwZd zCSfY!zYm(YTw2K|J%zKDT3Un5U;g02pwxqBw^ zsQRCa+~T8pYJ_B| z3qzEmWF}d;G1VG%#LnaOVb!LnN1{>mw?pfi+(X4)igK~+C3Y0!Z~YjYzkA@FO?xr+ zI+dZihKU87K(swlzj6Hd8A9l@+Q)dsSEf3_echTi!ql@9Q^(1EDDNSWMuY@E9!n2a zhR645C!&pP1pii#3N>snhNZu!6xVKz?D|@raCoTLL}5fvl|Sy0!Fb3B!n{>^#!OMf z-bcQd?;K2scF$s+_k^xsCn7Ra)k$BpodRoez8P8KG2nESUxVU}_vsr}6uArKwdrZ# zbM3GVX690x>)JBMw${a^1iDc%)H~z*%YMM@O{fqn5?(3USlQ(NmMexZbR+xarnPgq zuq5V_A`BT0XL#rGttgu|&i5tsUzo_TVr{1%hw>{`n~c+~Q#QMmZ8C=SfuS-4X@oS3 zFzuC%&nHvdC-*I4ry} zyXmz|K@1ykSuXr!w-!Bi;UercJZf0Ri@5Z&Z|Jn zJOR0M4 zt}eg01;@}WLYPw56jH;If^4qauRsO;W!9mZdx0N9y87P#(x7~WWQ%h_8N#5P-NTg& z-|}J;x%9^_^s`xpI|m(XqJ$(@^?h0*1*xviS2Ih6Tz*RLBuC1ZHT36|zK)3XWe|IU<@IfD%@R zaVC!wg0%076=qGU;|8q;50_-iyHKY{uFA~eQ~`w}Ok|^f|B}2o^~b>QFt+XXd9@dQ zam@DzDDkhMP=WPH?D?RF7Jz+(T(UhJE(yFSL{2%7Z5^EmR^|GNMsdoX<_LmN4>mro z2XjOubm5uJlPLii*dW+9o9tg}ZmCv|n@SWFxEuhf>f?I$)0wSkQDSOnkWfed3EfEt z2Q>usTI56)O~SKY%0tr?hrio4xfJS&DQI@w%PfvTq=YyY=K0Gw=GO0w@z{e7|RE6cs zF$-9(c|rL#> z@}GgZy;m`&z}YWORF-X!N}l>@t6mf{%6h9GOTe@Oh9kaz6k$KBxk*%oN$d9Zl|Zy~ zp^#iQ5ZBfIL6!w~S*k|wmsmN!iVrShJ5#fbhq)8QwcJ}FqaE|#Qj4S_TW8a%pZ#{O1sA$=`Zy z=)K<+3=^iJOJGq>U;PR)NXmeksYOVfRs|6Hmj%YEXG4*R1U&tL{F>`5@|=rkTxqZ& z$wAB#Z3Z}gLRms<@PDO8AV~w&%#rUVxCya45-@}tx>(OGuJ4Bt=mAEXddQCQ^mqKv z99zN@O>CFc(*t^%vw@1H%F?%u{DUG$6O0Q#)7_4wgernKh*d~!hY8Ja{^vG z1G1H5ScJBzqcm|k)&(N)Y=!UN>*6lTu6it!u6 zC?37lq%N(GEt(zWml_gNm<5eX{u}x-RwgY_A{>9%1Asw0r@WpiEhWHx99{hBY2F*y zfN`%L+73@hcQeW*o+h@M9%+bkmM#0{b^q+t_P@(^2$cUzKF4;Hp)uQ5H%2-ivHXGG z8F6n}J5Shu-+FvyQBbf_#enxRI)?%*m8GzdzMzWUP-KDeh2J>JylTOJD1-icu>RkV z=WU@rIL5O+n;u#1BZY-;>|Pk%9F4OLJak=w6g*Oqw<~d%YY)c<8GTw4%a`EfQwvw8 z=y}eiYH4?{3vfpi#Ps7qF|)r(s^+)Xb~-7ELuAl0+3_R&x|^qY4U6IL1Hb7p=QS3) z(fKDC%DY~-W5#`3almIZs?P+~*n$>O8CPcu7pndjEZq*;! znzHZBd*;)h7yPDa5-{In)RSbrO4H%GVxD#n&-}kHQ?&CxO{1w`|m7SizO+jxfK=NYB5G`hr%62~UiJj!~Gdt8UqKi3&Uwv8ZEQg*6zZsQ5l8`h9=R z;AZX?TAe+kE;2MuF>n+c>wwVlZ7wsU(0j`X6u3$-Z9{fE-%>r=leQ$=PZF1QvM&M< zm~yiDMMXL7$p{X@u3Sp|AYEF~D!qNYKu_!3>uzi}+a&w%B*U(r)Ou9-<$|3FWoa&{ z5ZBuh(>CP~YYN?0RJV)pvJNl%BNgmT`C4bZZZ~%1N@?KB)y8sCb#mrPe33~CL69)5!^+c zgp`SJ2vgWV@YAGMJTi^zH|N`7uXLe%W$rAji!NNuFRZYo*s4a&UQAZDP{U~O!33wF ze=iy-jEmL}$FZ1i1$Z5~;$3fFb_`ay3ae7#DYFk;=*FqY0Jyac{MvR=~3rFdk%3r+vD<&{7#eRXtX zG|a?hUagbU>_!u-xx{WA&PEkc^NaI}!b=jGT{)H5t9`$G6n8fqj27FrYC_t+*>HA3 z%1VbW*?(DFOBSG`&!+KCrjIc2B}2UM-d|zMMMv8ty5sK+xw$7U){PkzCP-q)kc}Ze z?MJp3SSWgWktx>i$4G9<_{Xo_H7G!*FXgHe#_dshp_5?Rjb}QuxjKE^gvnVE_RVx_ zbz-^@K;a^WK2Xu(+y>|9T!(OZNBS(~9tdfQ$nkc6-PLfbzTsv6$|eQ#_%vUcsZv|6 z&I1?oPLmMiOKFCRzqa|ZZ$5#B&19)APo_*}+$yJL0yb;>iIe4y;0nvFZ(|BxA_DZ} z8*k=!uZt!xF8&E>@+d^L1pfh`dm;3YJSY9<5pHaO!$FlVF1XEKrM|TXJRbIZ=03@7 zI!-wxS(?}eJXd3XxRe@#T=PC-A((p;J-WIVBtgz!gh{=k_U#2ikE<1l^`+leRh#Q; zX)=5Xq6@h!9nzX+7E(n}jdg93oG~;1z4%}gKMrbczxPLj{sVZyy);`~tt8o%)8v9A6q2H}WI)N(Z z>vlv-_jN1g%x*0coz4$H;WlcAh%fEz6Qr#oKxL}b(ps&W7>`Q@VC!7o(bod-9QzB^ zv<+Y3D>H!G1T()E$AbAkJwSX96C$#1Bk$Xrek{6#*^w~U1dko)-0Qb~f6XZh`T`|O zZ#<|B-jy`+^YwrvjUkLQs~SCAVa)n`Nq@{aT>RRFj0lHTUE3vy6DShB0fYg2UZwUc zjA6vuN|gcN%%I9a%|wQz;1$a@)oI7Ga9$B}RF$dsJbQ(;-zmM|eHaHZS7ovjH7kM! zRSz2JwsfMlU1%I2F`(?-=<0$&0gRbky9r)fMY)rmp8P_yNjkmbIjF{AvR8q1ZHB7X zu&dsp!be@V%D@2}_V;g1L+JS=c>%ejs$?aNdm$+(tDvlgTwZ`K_SBH9qB9&{aU4h9 zJ-@wrs)`ws@dzab!C}^mM4e3V5ke_Z_cZ82@ zEqr7*(E)W$#tk=I98ZL0>%77+&B0$FR`jYcy+Lop_E4cjO?_o7iJ4WJ??dAVP(5-{ zG0BO4#9p8`tl-u~<$)?6N>{x@q%MPwDM^a4bTCa3(4Sk|%oqvvhcO;T!P<@PycUk# zBa2~DE=D^xeVGpFg}67CRCeRvu1|EVig+?N-xOo!#yk%(>SV?F6XJ}skJ}2oo_eDo(;&Sy zR^e!>!1akaeaxvELF@A6$HE*q9C)iS%t?y~67S181ZE+rgpIk)#k4jIL6(;2jlK1u z!YU+?v#$|pRG1`(BB)4k9WhTtPdSGqW-jtx|1sx>I_Y=7)rSTf{M*^NFG)I*6Upbi z%?;;M!WfnrX-ZtF&Qj_UwnVK0Ee+AH5*FefhJ)x2`gxSk92XdW|z8sheGD}fGVNCIrL$i`4+ z<;n_Iok$OM`I0lgdL@S9SFbNZ>XReXhU z`8vL-K2~&;r)BESRX={1$_?t8Bg+|7ufcSo9@CujwOgXC+XyXT z^qw3bF)a_8Ue0A~D)w&k+efbG-A%jy%|871Dp$<~pTsIRUe)70(VH|=)I2lP^w~!f z^E|y&#&31Ra?j<~oqflO4kt=IoAQ#^lWMiUfYsH;U)(xt`RL0?dtASGzl*8i&r7eO zo#YC4n2w8kJem?BE?esJA|LrMO&vArD`0@)s<|&$V4&~2So7Fw(zQoVkvW|}Pqi99 z9U;&yeg1~g_MCFGlWqv4VmHDg*B@THs#=^3vKh3u^Y{5v>{t?`@;m2rLE%AWsz%Vz z#>>#k;S~ucm+U%@zze>8k$1`qW&+^Uj|qJ;EntPN$~cfm~8fK zbWA@Ieg^q$v-Kuq>wMFk*0zD6fe(4^ri4-B>a5CwERwP_R95~G{)GX889hqRewb+f zFxk07<`#>;zFxpj57IS46oWyD@)Mq{lshBGuVKIH)8_%Se0L5fX~5?edl3SsC!h{I zd8(v_B)`#oBKth`ois+QyHVZrgIa@x^@#a+v9dm%%><9cdW$3`>pJWEBA09gb#lAbp0?Q|-Fb!@{V z1pJX0R*~}~9@qbMHihqJ)Qo&YDH+Sv_EyCeX_}jT5neH(tcBi7gr*GXG_Ak0{nxq9 zfBvAviBonX_uPygIdd6wv+v%K9$TdeP1e(K@V_}#r0{kcfBXtpeEjfC%u~Db zR;kv8XJ*Y;flVo+J!%?xmCghJAq&&H;P2J-z5K;0x=Hzvfkn3xnZHd_tR~gX{?aV( zttutn$D4qElC_!jDWwRi?JTc*K$za<3*HDXOGs~)FGnoElo!nw+sSQbR?Ju5yJmL| z-Ot5KZM0YjYdJoUo3osfy1cA?SuU)Yzt!V-5Bb?_<3t@QjC05$$_##wDtz8;3LkL> z@ftMvW1M3I>mx779WB43+LTlJ(@T9wwBJV9CA~^5p@v^No5yQlQQ%kL>XA z7UE)Xix;&&{}(suw`i@yH~YLGOOz3}Mm@O#eXh8{NqJ5pHSEMzvTN2CuIZ0b zIReY2OGjcfX^~MeUBFTtuO0$+mh7F_Dn_n>?7*PfY_M6r>54O3E8U~04^Y5t(fq}; z>&*a<&vaHl68vJe{)90NiRd12;-?Ffp&|NV6x)48dy{h;Q?Me^-C}woQAfL~jV_D} zAf}q{c(llf^B~iu>G#&&>A8?OsyH>K8Vtve>b?;O6ZC?}8hIEwa5uLbc`~WR_w(@` za$r#MmD#|3Lf;|4al7kMZs_>COi#1NQWYJ2n}U$It`ePe5z`@mKJGGjh8uZLW10m? z_iR&AWHQblAD$<3!~6kmf=iPD6aNJsiHx?`=(X1fm?}Q072gB z2TNLLB)aRs)gLUIP~^GeDYsjq-uOwjM?A)f?F)i_3`96wv8;@6KxwtJuzT_ zdTVL6wY06GEm6+Q)UiIIZT8D!F;H@g&SBbx!W6y2=^wzadzOj~OvhU*<_LIjs>c>t zh|uVt1XMwpElT!FLXI|Z3zih~p~lNP)ty@wO%Wy;?kZC!e{2VilG;R-&jMWb-8+;d z--=QFfm@J&DI|3X&DT_qI3B+T>h` z#%$<+plz4U$n=c|thO|o_hNFMAL~iabSvZ_`+hAMI~(t8T=Ge^@N%%%G8l%*Sdu{@ zwDq__^=kMZwqi*4r71c6`H%FOH_k}qzN1PZA!V`H?l%G6D;{W#uzP{(b|&z*E)J)a zOCh5J4Tsd5MU!9o#PJ21OL~3&Ji1>hv8bAHyqkYnbVB-b&f4c^qn%E(`Sm*q-1 z>A}%lzIU~@4kniW>brMVJ+)YIN14cB_UlNu&6>J|O&3f8X}#r3byV7Cb#a}!%Q2h< zuVU3kX{GJ=SLVRKWh&4CA!UT@jpk$-*Mk-3al%yT7?0G-JN-u-bT`WTS%>0Rf->nz zmgqEZi5Zj|C6+RYMm7b4g7T4pS0 zmMa1fn5$rqvR3T^;1j)SMtoMUHo_%nPHdrYkpY&s9$N$_i1W2Ob$x6(%7tgtn1U0c zljDsQq^%jELa#h1b;MJ8N$pMU?4`u#pE1zukAOG^JvI+vx2s=mO9MYY+WW)4HcVg%LPF(>o#s|Zlc)!&LMqpfk3NVt}yA<2GIsz@nx^rSR+iyP_5rfjBnDL&wFpUt$s7%^&K!RJQ1qqSZ+3Pd*g zsm5TQ2NXTzDLaL4YCYWTEihKD^sg4Qbe39vniwfjex|i`(C0^BXfJFf zgiI)jzy3nOf|WEdAbh_ChtbHgyGYSlI%$t@7yf9YK^B2k4eimV(;c3+L0j76x;^$e z-4DJ;9iY+X{LaNR)zziqcw^>%VaDkn=T?Sq3tksSLbA|igGep@mvuid4gCI5V44eC z@AR@sE-alvV>tq!m@V#+IZ|{?{1iibuiDFeogu4g^re^KSLy7C+RNGum?A;$ zRmR>Did*_~S}CV~dB~$_D-pH2x1yQ?=jt)PYzL*p2Oj(P%}~dhIk(!Xw1aaN5q{^9 zNyP$VVR1@$MJ%AxqEDkTB_ZBe7DRI(1j}5u85{dvw>aurR>u>A^W@w{%}7F45&d;+ za}qHokx=bkIKJKaInW_fRz9b6C|^PSL)J^@F~v#4j3wzR|2-;4+oF0(6x95U$x;ZT z9Rk!@dsg+JB)tq;`EtsCg9?HfLwyLjG^-1JDo>Nol70rupaMADjAA0uz4HlEVe(E= zYWB;zB~NK3_X|sB0$wgXNJ9tBXqId7CsNI~yD_a{PYN&XgSK#@b~hX!E~t*JJ5i%_ zt;=Yporq`3w$pRWX`PqP`3H>TUgjq;`seZF^EP_@di%>ZH2$b|Eg@{%<2q<70z=;^ zbn$Gk-kRu5I8EHX;M+_3tkTd{-4vQPa5oHpK}fA9AHu3HxcctIrWM-6){yw@{%I8R zW(xs>&zG6q(Kl@G@xSO)z3;(rb!t6&Mp>GWAYAlp|37kyDA*&pHOKnuGtH`fX~*%X zK!u<~i@;?8mVoTl72$YTOPW&E*NV;}QZ^Y~qqKXM5sSIZM>A7okG8auBQOQO-3ND- zPb3n!A*(RBGa34OT7MY9Ul!OiGw`$7*pHgry zLbG(M$DJqy_L)L7kB?%vS*!QrCThxdX4&>Yd4<&WfZT~otK@IJ?#|E5kBh=O1%J4o!NBla*6}hbh*Y+uZ5X_*C`}03~lkug|;3=lHa6Yh!Z^K*mdp zV%c!F@3umRP2GrSbNW^p)#bFPHih2>xT|r>$&}D4k(4Qg=GA{)akh3R+FR!EieMk3D*o!UBB?2)$#*;-%az+2#HFF2`; zW`cWYh0(lkv^65?KyMjDke@QWv?8&y3qj~L+>!< zNKjKdz8<V%A`*Nwq$T#{56Xciq^G`Bld2Y3KWSFim7BOk z0-~D`7!l2!n@e^$bsOS5==dgSm`48qoP5z7miVsFn_-r7a)Cy(2x+v!lf+o32G=4hJ+b-^`0Y>&(>Ma_-x_+RvQN0M&*Xk{ihS%M~gC)5mCy zolyCxx>oC;1KuRJ?HvrR-cR$rdqk0ar=U|WppCcS91H@JEU^$z24(JQlGQVu#w)7b zbGaIv;KWJr2A%%8Afi{uM`;zmM2i}un%Qyxkz*7?@h$$UtVBq8qX|Uh>b)o3X0Y;= zBNpZ2%hqY*L%>~le3Jqy9>q7CUb`kr_sr2&_Ym%=Hx{@$hqVsK z7^UG19SN-|>0^(3uOH&=@x6T)b);za&Oq-=s6tA(3Lkq?WBlQu{Ql|+j$B_Wu(lr2 z?4G-Q_n^wVNR2(<_!^ykLYfAFLABBr=;-k#hiF`q}-xK3(J%&N21jG4amiGWOk%Z$4_lr=$>ih-tcn&B@22tQ35!kX74HJ(1|h7G>ZTWWh=8e?SNXs9EDBdUjJ zvWE+5Q}B7XJbbHQMOS z+&HRfN;%ZI+v*4&%+laIByhREe1cXNu?tmgLOMx2A^bDdE}>Iu9h{6rRBQm z#eqI)fh$JOqQrFc*dGff8d|q5i>>Ymx|T=Ebhsz1zDuRBLnW#zeB zW5uF?G}=4;**OC_C44uMVURP{tDh{@*c+}59w6O&Eh)7DId)MYc&Kzat(-4USR?MS5PC~c_=j&XXm1HYPQA`?R}`j82l_5qN5D59e>_4Dz2p?CXD$ye zA8ygEt4arGXv3olw!I|WT5j4`aHN3w7QD6IMYr)jI6-qQ${|vci0{(WnuqE#xL0ckL>)?7~X(|89=le|6Q?nN< z|3#BP|8u_ce@QaA&h=!H(2eXp(l|#Xt$&*{1^n`UT>xHrx;@b!GN96vyM7@$AXO17mfBsYn75iQVfcM6dxx*2j8JDFPfsh`6su(UX1C5$q+qGL zsNt?pcg82U4sUH>Vmt9Q13ER@N&TSt@^D#lkipNg7r&w74rbbYjcFM0Q)Hb&RoFW|Ag zOu*yOU(P|VuZt9RQu8K4adhO^3{57yEW!H@=>=YkAaND3NF{Oz4VtzP6WI5{kWg-( zIW9559br9F08607TwOkz1wpD(ME%8bE?09o#$GrM9D(otP3R#G3-06)g=rzhf@2e{NLG>rn zLeA?;LHl>cBP)k4GWrne^O^{b)ng-+blXGWB*P%p@i`Ev1Nbugh1D4aa08mx@mQRa zM=5<>p4?o(2;$A1c+d@^PY{OsC^i8K=wCDf!!mJ#kb}q>M;#gTa72myM%Wz(4nKVw zFU9@dG$d1d4JABf5B7QfnqzrXXwJrAe5CuwQoxAO$j8O*4954uQad2tBZwtbKZ9q@#;;df^(U$j-gO_`kxc_^2{(H` zYrJ8On280u3*c9O5sEn({bl1^f{8mTca>}nwY^5?*B^`K?gML+&2AtnXc0aFjsvPkCrOv-*)$QMA`EO&Qe30kX-DdoVWU|b3A7j#;Z}JDs~w)7iiHI zt-$HUF15N?Qo>+K1~F-r-fj9bp!;F9m-jyaNJEg~)WlwcHxaimhP?;MnJE74s=PE* z>5wfaD!-2;e4~=asyjo_)b>CVZ=~pu%JL{re{fhjJW1zuy6+aEbWJ02a!NT$?i0lv z(IEEp;qaH(47>2HH!({ER}_xVpbDfEs6z}ZgOQ>7>2H-gHH^v($l`OuhA_vE75 z?-E3_z3Fc!2B~$knHi?){4@&wI|x-?tM9BQvyIpHiFn|7OqyrcvUmJCn9pAxJgf7` z_kzZ5s(uVf-Zu0~OH>=H=rnE9&E`sE+DyH=kPPm2ajE;BKWg+Jo^)1hmJS1cRaml2e`DXR&TD{#0U}@8AA6Long0!r*{Ik0ZXZj7 zu0i>k65H$D228zX3`g@&A(hIta_i}jt=&m9bT=rjuq?})a@+Nd4BEFlOIxq`n0s7k z6=021516(&-!Y!gTAkjifjp8HaR2zXMSKG*3fI+08X@s_$zs;u>1)zFyGD4%p_GDu z!<)cC3SFwpO58L$7z>u3U*OGZP?b;&&PZ#a0^xPkvxNMm&ky`uT* zb!;3rDk88^9j45$lDMjLO3E2E{iC%q;p1+|W;~Jfifkia|2KDkBpa=4Q$PN%E3{`I ze?P-gqyb+M&wenxJDOPNvg2}FZBUlscs7D`Hj|cDKwjVPhk+$79ygpY4wJ9-C(cK^==qK^yPu(ZE2J?fO7GpLCRCRw0XhFD_$;_XZ zX!AJU)_;=%FC!K5nlqk?(0pC51Zoy*q>m3|rdZgqw{!;?Tg8gWgb>GZh3sUpe_OAh z0VPa&Hx%D121oQ}aehS(+KH_C=xOJyiSWZgysEoZ$MOvG!A08V#Rg}>vr~FdUo993 zt7=6ZF8i%UvprKqNw7Uq5&5R`J|5N^g^xMj2uyk#>ZrY%YFeP*W9MOGLq^EBD@`b+ zn-=G{*r-VOVI`(X)8V$SE8)CZ<%s9|7yIzPU*ip@al!F>1_aGMT)cMs+QOS|9AZ?v zW(qRPu1f9qSZVHl8GoC5SAK>U@r@Do84wNGDps}ia+uY zU*AxAt3?xml&2w_o0%a*WG}lDcx-vH3nWEjX{`#0A4USk${+3Y=?j+Ra}R91DT2gW zwLq)%QHUa*l(Typ)Qd4j;snXVVK>@LnCVqvz5cA}_kP=I1OrPxmxtBuKY%W(;58B< zQDduG0Sgva4XN)Ul$(vrsGB3OsS<&i`Wk0y%&dW^@@*<9hfBh(+WFL7VHp^wMW!i} z)cc0)kdpLMk9hm9jk#cbIfJ6*dp$~H3CC}PUGMz*X=dwLgIhl)%EeB})W!{Y#B+RY z->5YO01HRGGqtxo1rdtRcH>lWXN1yt|Adp>`3rR;>*-*(~hl}VDR*%npfXsB(o z3q$wTux>-LT<3Wx6(pfECy$;H#%Kk3^7YIq*z7nbzn5%cC3hD5jt(3_hx)n?5`nM>SvQ z!lTqC334(;XrW}#Td7l$hxSW38czWOBa8O!vAnnu9P$-G4UG`g^5R1sW(8)5tkc^^ zgBwb6751{k$u^)FP#br2{zB8~ZacVr-=8wbX+HN?-wnZE4m8g zMyoVVcP+YHFT`DVJvo&%PiC zUFhov_Myu)nSNB{)2#BNnGQ~QjHZt4xQM+O7kfcOnmdYI{^Kk7OzyG6ioOML#k;W> znxgC{XJ5O^_YL5ZyV58xQ#;3W{^I;`xZy_A&=6jM_JZCk(#Hyp&fX6`^6j=3pB#mM zjDiH9T1G+6W9$?DdsDQKg@kLkwoado6_#xWS)lZmQqdnrBosEMp|-BM&cmaCCIb_l z>XQ;j`6V?RS~#WX&>hK;1FF9SE5lF2%;uDrEfO&~vapz^PU{}}rk1WsS8pJ-ylc>k zNI|z86PaP@7xf*zQlhpvz&iI!sayFCo<_IW$xS+=Oa{SUufXYjd-ocUZjm>O`^W>u z3}KuOWh-m^T@@VN0yHApb6fKB5pF`t@FGZ|@~UNA7p;ZMVO5hLSSu|JSvXn&$60exZvJRc5J#Uh|)q6z+=l(wdHpm5U8wPjdjYhXF%_>L(SpXF5W# zE85j&^W{}KEL(eCrc&n{%A#5Ub9F{X9k8>tu2i)z1Fak}8p)h*_;Q=Jre<6>Y0TD3 z?FJ;im}l3>+cl%M=TdP#nrUJ&$*3zslkcQj$2}`otP_S}Zu7e5H5NlbJ0VdOysZZe znhwlQv~nW9pcr4K#uA~8t2g9 zS09eOG{|{64L62k+cw=ZJ3X{uk3fRB4-1%MF9NUsM{ov=`{$%b2AfL9=7 zM1eB4qrupUw-Xw=@0s_ZsZ3klq&dB_d20(jpC>i@AW-Wkhu(Kl0epfjk+M6&{j2y* zR^a??=9f&lHZjBBFDSh)Ed`KVC!gSbi*N-{dj?%)ILFwBH8ucwd1Ys zPVFA;{Wo=yu#}fkf!xCUjyDZ>25zwf6qSie$avD2Fh!)yv)d*%JalFoBkh~F5Cr{0 zuG~2c2pcG`rz6(>yE|31v{SZftp%-YEfyU6gtQ@oT8(#4f%x&rNu#N+H(}W^D<;;6J!m-$kerbX#gwj0!@^Z$VwP zL}co%C6-xa@!MiDELs>T>b~z>>_yutu)Li(WxaPs*lHLIeHQs0UGx2~nN9wKZA}!{d_#S#2Tu+msCF71dC))IW zuwkrzeST9FKVLpRT8Dtg2#3*t{U{?~isbBX*r81RpJ^vS4@vuqCLntsJRboXx+=>T zVkzNz8+(zYGi?>&kq+fBxCQp?IKRpo&9M?bS+4JKDOt>5+am)B(zY zRvXJvz((lWe(w&kdd-k>0XEUJ7qCfdL9@5wp`!iB?iFb^;pwX%2W6advh#G6nn@@6ij1s8(&YVzsH^M z@1k%VMu#ON#+={UJ7h#Moi?6pE^DVFcZ#JQ%Wj5zTH{gwL$nT>u*XFYCuEX^J6%#( zP(D!qRO>}|lmGVKG-9&R0Ot{ZE^j*fc{Sq=^d)USb)sj~F<<*wS)J@+`X_aWRC-w7 zWc&1X#)uxJK_}%W>&p{Wm4*o8+J+cI&2(`_OJu$JXn^D%dAWqOufF{ycCZ1XX6GNM z3SWOPw!78HOU~2Uzjq|_&V11UeQ^@WO}lPNA2&c7D(5FJOg7Rs$er4yPasZ)l)!G_&w;Vx4A*?qeiaIH3rI({4WFN!Z z{d;R|3Q6gEv-}Xch{o)KZ$7A6*ZLIWmkYBVlvJIICZh}QY9$Oa>Zwgz%aQGakFo}0>%ny03In9jS((H z0dL3Dr&L`--y~?>q@|}r=-UP*L=;+-83gT72725Rdkp|ft5BX+>R*U&9(9^5-wk7X zAVCHlq9TEs@UdT9Vzt*52eXxRqEp?a-B-w(KP`NDuPt!2wd}_gACS<3(PhJI@@?lb zBabjo`Li+Pt(C2~5%<|M_pKgU%FB`7cnka!wI&HnL0uOVcc7(98P2p29Wqo`!oz!Q zWy3Uqna$#@p(3ztnlC0u7AVunEPa?DKoVL}_*t-pdG;T`w%Pp32@QSde&D4%)VJ$H z^YiM3d52KwM3fQ%Ou=(I8>9a>rF*c)ebEC!!RWpS67}y9GWh)Iw zabu1aB4?DpxT@pE>#Ij&KlHJmevWXjD#x97KHYlKrQXjZiN;uRPlSH@1?O4Hkt4Gf z-9kd2>?Payc3upkVfE8@yUG-8M%MZx+FO&{HPOkg@3Z!J(Qux%0eA1;t$4RK+rx7L zGn0CKfSHi(I)pre0m~_(eUU8soX8MC+9oV>a z#oc6XF~-9FdyPqbp&6hA0HCzLNGLd1>`g6}YEx|SUw4Qh_m>pdcA{)!hZM*QE6L&q zAY*^X!e27|SSDdJy~p3%tgE4q#vX5aIhy_^;K|I~xT6l49v!H83T`gIw9r)8q93zu zR1_`lC5w9UG(|TyDrzJ8B&C0Y#+A^eex5iHRL5SZi6wGwS@1FyhKJu%WMp)~_s#y# z#6-!8gLdsWS0U?Z0LQ1-McD~P;~q-r@r1j!uEomJc^CR8e^n>>TGf>wN1VwlQ&N{g z>fD08ZPNB^um4~Vek$1fg2fqdr11ZpR`7pj!2d%r{6C(j>{rsz6#PfGQy5zy6mYKR zv))OXve(5sWT91QWgWsEb))-2^qTrfLc$Q9s>}H$C9=$%vhK0^0le$;XBqJ5BYSoK z@kK^rE;8QgsKKLr{EOW$Lyl@YV|!-sUjv0bbp-GA%tZ&9?>vp6>_32^uP)q82%uh6 z*YoSPdJeP{rw1;o+_gyI_T@D=)e~b+GdGO!CB!=8QrDW9F=H)n-`k{7`ZSBg6yTtl z!7|Q5)$x@@T(oC%i1KH~pD3TPtI^${O}RH=Xd2OyM!KH8g|2bhb+L4sxfxx7RO!kXhFFK1|Hj=}g|*ebT|N{Flol;eBm|0-qQ%`QP@s5m zD{jTzU5iuP-4h&wySux)2lr0icjo`i%=w&rbLHAsa+rg?pM5{;S?jmp6`Tl!TY{6& zitFh)`g)1l)E&jnfggF9l(AkJGB2vU>7v~)8t5!Tc5*}k2`U8hw*B(%k2Aj&N>|9+ zGPx+CR}fx;nlrynOO2k(&L;y)xA%5YGQ4U}9>i8!dec9|)7H%Z*5Qyr^s4FP0{r@) zlzV|(?bhe)`C4tE5OT>Jg?d_1lQn_bX?cWyN_xXw+H_34s1EVtB;y11)H+`9m`e>V z^}UG>O<*;)2R8{sw$BH@Z>uN{)mLnL4b>S9%^lT_P^haL00 zk0+D6%krN5`CKT~l%ssHo$uS%mP3PnOz!7m0C#c!0^%dP!9fZXB%-C^2b$%cyqd9* zHR}ejQb#Lojo;ewrA_(h(`;+YCb9Hyv9Lvv?s^Im&(DbEDyl+*aK#6+D8Gol>X+q3 zS>d2=JX`|KCW(;yH!1*9g|&6ewSF8gchqM8UQc9_G%3Q<{2hVPEq-aLfqESAvSf73 zd}1$7*IG5!L+Z|Zz29MPx^;vqA)hV=O?{yH1P4bJEm{Z|`wfvay3D*o(B;a8E4k;9 z65=Uvx%Wt1@a{vbXKCHId&3C$FF=4PKMIBL!CqNB)H?qwfHz;z@(K5f0p{KhPXj)nyYa4fRcA%@EuJIftQ(vt*7Khdi zeCI$gis8wBwCm2B+QM?mJ0z*|HsrGE>migtFdO1<&Ka)ML*y>OrFKnh!#52?Azee9 znsyRY&|EJOIpJT}vE{&NtB&}#FcoE$c(&~Uv390Z#RPWW`-c2VyIgIG!nCN=2vmF( zvph|T-%RS7?J~Oi@>ycu@y$CJPdMY&(3dQ-y~r(;gMPK=MzdH{1}m!gdGbEsui@@1 z079&Jsl0O|%TTqHM_N1wZ@J~A>5`GSYG<9(_4StD$p>X?8gdgZ z9YA?SP1<|Al?*4>$ik36A0^!@Pj0BmbWgCPE#YU#2ywOQ{18F4^z=3QTRE?`IB~%|B4yI(?Ag_I86vq%@lt_( zqmUq?MoN4*9fnY^OAo+eZlDdH-n-h1(mV>cve|xM50UtEQO#p;H6jhRFXs8WWTbQ; zC%!VNEoGCFs-lYzyQyLucwswPHMf2nyfbc14?!Gpbzr?|J?F6Ft8l~A*>+@q|J&)? zVb_m9-a(nQ?8}Js4T3%7MgsPQSd!GsQ;Xu6R=`nRB4Ga^KL7aL-K$^S`z@h|n1!Ha z`#u6bW@nSlH#O2Tagq8j(p8z4J@ON&$}g=4s=v z-|)h$UT9D|qhzmnO5m0!cW+}OK6R0?}LDmJ{Oo)em?xj znDAI+B05{5>~Ct2A~PyVfnaar8$N-Dz@!f`t`i~Q`kZ!NqTxkw$c^nN-2fjqm@bh zy5X8ThVpjPErkBZ?(Ml!4}I6#FK@>95EhBGg(;0y?roG4W0o&6ec3l>Iad(adqRJ^ zlgh-*1`yfLtex_tj^Jn z-8E^%v!$XMx{OPcjU_ZJqbNi|pQ;bkH;yi-WJ=RrM}NTBslvklDA%^GL_~b)k;B!b zh!1i{oUL?RvAuSm7B^l3siGfcSiJ4_{&j90NmX~Th*$6E5Yq6AM&51v;bHnAveLR_ z4V;ezQf%b}yBd=mX=$Cw#RK^SgSUH1VpXdeFQC=dd0O{g9*l!SgH=Fmou&1t_oP?{ zudR@m9%U+*zuZ;{sFG@tc9WXJMg+UhH9L0ht^50=4qiSS7V&Aj6H5bawK^_Bfix!X zm;iine#>Y(T{0qO)X-BC7r48wI&G_rUGDM;(;z2o{mF52z~N}$!Cev$q*gzA=w+m6 z1GpN+Y?DoYHn_ZOWFd>1uFZ-YtfvP9bYz>#VuMLxDKV0n~gLg>1 zD@pEAFSP);0XfTJW3ZIn-8slZ*nlG$$iO5K;ku$LxOPX~10rgS0Xw7?1d_gT`7kU_ z*v_rBC2)77%^CRX`dNRI*IiRWXkmput0W5rDf9eD2((qG^Lqe1h&4g!Lx&N(1N6?+ zXj6Y+On#2b7d17!G*n2Y?B!%Wv=H(6mviyo$+!Fe;J@;DZ{3udXOK)?L71K^Rv2d6 zdBpMNxF0H>B3v@kJ;uKQ-=Bq@dU2CQZN3q0cynxE?T#O^zpv)FF%6NE4__e?PU4?5^zC zzMva;!MlUcqMCE%wM!wx8rpv{^jRUS{oL}e zqaXKrwBBYsA|0j(CNi|YmBdAynm&c3jhah;SdiRSyKn>u@!x2Ii9I=2(~)qjTxd5+ zb>&1Uq?uem6bnS(shsCA^~QAjqlIL>2Kiw8c>sJaJJD3Ho!Asli=%{M_wrOC-aG8A z7HL>$1kPjBRmP8gLumAb>uX?&P0X%+J_AdVkWu~aa;-3{AC|4PFgUz`&N zIm3&ec18mI;S6C%^r%Ps7@ljT=7%C2CBJ}NvU*o%segKUqpx9+Ed8|B4!xImN9Ym# zEU!p$7v&m$yK0HT0o=69 zhBxbJmj_Zow6?KI&fm+X$h%Z>X_HJZMl1?OSLi*l#q4!H!bA=d4P@&Oz{#A|pszpA z1>yFJ#B%$QP3iu8HS(62J%vkFU||0#&-<|JsIf6|NO~)sOZI6iSxcUk1_=i<8Vv!$ z(!0H*TXFA&CppOc%Hdq9mJ9_Gsmte%hj9H?ySwN_{5EVyM<|liWNBQuiJgDuY-JgQ z7!;&Vh4wU-wbSgLEXr$KdlI7-uKLl;b}D7R=5a<5k?4X}Wcc|5N{I4Di_{OFOHsGd zezfAu>Bs)fRpNFOA8Mc10K8sE$P`d%!!Co zk1QP3Z?}UYNQ)4mz&#&v?yEK2BbqE13x#Rvk|FfwD4bXX6Eqt*VdF@b&MYOZY(7C; zugM+9PHit%&P&D}FD*qOO6k(03OAQVwG5n7qrI@C>7vJYwN&Uzc$z0}dg1-MXy8=x z=o-u_*J|M&8*8L4i^_+s6PRO8Lk>nay9?e>fbmxyJ}?Y3nZNe-v?lA6@@^(@urBJj z2JU?mVNwb03+++vp1z6KUfbCY_as$cswv&VoA22SC0Z6AyV#m-PJZIvJi!-9)BwRb z+xf9LM=>vx+oYou8FxVNJB@+%qWwcuNbQc#Mj;rM|*$$qda3 z6cT%1?Gx9i&Lc~nN3UFlrIFIFsHOy#YQp`?ZL9rfOI$r}j-Ll4b*NNw6~k9}!bTj> zU}vG37>;jSj68%l?m(OBQ4h+E6-ZbD58L5;1Z2*8ZJ;hOg_z6Lkk!vB7vvM{!k?Vd zmU!R{v6^oHFZQt`CUYG;m{CtgmM^8jZbUGxG8BnacFh-3Oo!M5LZ5ijwZzrPliL-| zq;=8!6|)D%6kYN|-Spvu+lVr_EIxnzrMyYOD_8EsgHh!n1|b}OEv?r26G}l%hPijI z%5HtGIJ+|TBnKWe{E7O5)XV;vZlb3A(~wxDG%tY)*R-8?=vXOe*N1UJ4ELWyT)>=T z1mTKbj-PtcI>MpF(38oQHHwS>_ofM}*E?{8_R2^ztuiHIu;MUlc+4s5{BFeylS}K- zqoW768LyZn+y)j;46@+-s7d0tzSVk`@4C!_Oy)L+Px1aU@7IT4nN<0qVd>7f3luz~ zhcZ0txrSJ_eWKb05#`#e{Ry*2iTcQ!Hl?R>dTR9C)pQ}wTBGH~+@AnY`z@d26aSdD#vrX`8e6GUT(evp+t};7-cy%sIZSf}*U0w{ zH)l9t_t^HI?sMZ_2XU z)SP@DWAE#G7PPk%^=sr4j4z=f1D31Su7BEH$qyhID2gEHS+R1M8@8AYu8teu5i}*C z`0jGG@=f-=3T4+0!b=r)T*HGUHR7CeJrFrKcS)k~zM9LJ|Fz|lYO-NtT?3BRz)hhE z$dyn&>z(tBNkWqw)w2UXaXaYKw935M;xG$A zuI};*NLH|MWvue)$nUO3r>pmOv52&=I~q^JzLZa%r#MQX#%T?Iy?r0*&-{iFhmtnDa#vjYLgTN> zaidc7_41pKVYuVK6YmRNr*~&^+Xp$0%u->z(rUc0AC?oBw{`+IJXTv=`>Z;F8*;Cg zTrBwxj5!m#e-01%_%{eI9nF^Q@r3<5E|t~6@c&S`B%ElEM~l$tWq$XKn)PA-TtwDf z5B&>JqOH8z_jDu5_}|0eMd{glu?^j@YEgSz95Z`JDxElI6~0n*hq&-+))p9*{~!~$ z*^@nfTZd@k%R5f%k)3W6bgV6N8WMtQ0e?{Kt}};I-MC*QNQ6a_U&eOR7MLPozkl&7 zU;hiw+FKb-aEo{U1O8O+Dp5g+|1zdSl6X&&FxFHX{YmUe8$}J zKhX~K7%DQ0GL?KGb-N}F$RJPo3y{eaYoJQ$Mh#*{NS(a?h_ra`HpJ!#tx z6<4j*L0)G+9^622Vz{cd7ajjIYV@x*_>VsLp9>|)LbJLY?MN`txwE`i@h>{G; zM%%`=m*-ZXHtpcj+-ajSGBQG&^rL42(8$;b6kyz9z2V%MUHXkZ6Kk=5(Nq`iSR=?z zuD%Tco&aHMk-6a85D%1%^!MG1zz4?6nkAXWUBDRAFFd1_<}`1tr+qv&b+)i1(7#$7kiAig!}x#5qOI*huEf3thWiTa6U}*Hmsf@i?#2}9!wDU z9nInu&uA+Kx!H;m)*<=Br2tplS zb9Ojlo=>5D8yP&x)Slt_A3m7Tfilg!>IG=@ej$qOL?7pd+Xz4P9h&!rGh|$LXq+_L z*2E6zaYcM6<>;!x?874s^595$oy{_Gle!>rW=xALxS+G))#CPuJ}W<{>_aP#%D=Do z!Nh(ul{Xw{5_Z7$*q-kUqWKGW&xdWh?v35l9=<5ERK3`b@^-n`b51a1Zw@$8dj~L_ zOV#;pvapl&KbHzW~%H z3U}9H(M^l_04D|HN80{Ehca8IwbeBg7}=JX@ewJ(i;9euv+1Oq(SN0x00%@~-oa7snAE zU|)UUh-bp_?!RR5LqQZas+MUJ7}a#;TMH^0oCLyE2}VzV*7Z@QIduJt|DwF$qFc|9 zxm2VIuTw}Lb{`DnW&7YbYF?K~QjlJ3&cS16IpuMKeJaQd*g~1M?RD2LNFYv-f{TS2 zJXc0ioO2IG=_)s8J+|hgW|s-8>yo$(6(dv^2dhoX@j(S@6dA8f%3Sk%mzDQE<(H;`T153(TGLW_U)K(n)~$@SBbpVX|IfpzBP?Dsd8+I zL-B>A`7PAdA!Jo;g)kmvRcnvE_O&1Cc^IynGB5WZA38grt6`MX)}K9o%2Q8vdI6B% zUhZrBNAkMVqLqE38qQfe%M^-CW0L7dq6g0J(_}L>Ll%$5!%A6>H`gf3AVIYIoc$=4 zmZ*()5b6LcytJx5w?iNJ6EYu+2%~&qpYlyrve|b@Qwj_?hjl;aog8M~dnd2KQ@n?y z$p0rj_n+S$aWL$Hn!7k~*+>HC_jcH=EZWr#dC`K-t3k*d&MapKm)ZUa)(u*_*nrmUxhc6$A;wG&*Kn=@?p~^|7 zeAF@|BODuMeNasoF0ur22ol|327qu|GZl1kbeC#WLJ1!UqJIvK^qvbgBD~Qh>)JQ?_ z68V7NIF8Ez$&a}3n=P;@BJbwwnv}$#lWT$yqe}Z-ce-fS`#{nN*ECkWqj86FW13&9 zlV_N?MGDhbWOG!-cdGI=A2<_K=03RnqGqrM8U_5k!i;LVK2VzuyygdfqK^4|LsycbaK-HD7p%N@0=muJ=e3jDu}yqD4tt7HSgIz_ zJGY|~r$h`wwKoec+_uUX|y%d02|PeALF> zkohlQ+?#gS(nI#4wcOT~FQ9o62RE}3x*<^k{GnJ>B9Tl&uuNGIpH661ewR098LV8H z=1bCuI6@KfQK#sCP?@HLwYatrFBS3W* zYssU@K)dJ^zDyx0Fo~>`1!{g;P3N7(k8ugdvW+qyxNCZssL=z46n61dCUFd_um;e| zve-rnlRT<&Z>+fZ`KHFqkE4t`rF<7z0DfEQe^>rIrNQ)V@*@VofmahHe2yf~Wpm!_ zknzu}EC9Ss&b{ka*V=FMUMHh*O z|1cpE+jJY8BjO=_=>2Y`FW2JWP1wxM5xA9_I_;Y~1ZHP~Sgfhad`nKr9y5s~ZS8Y?>1U zgvGBk4bX>i)YyFkFb2E>acvc@TPzji<@~7^Wa*U(FO~Z7W$+QMVuGS_zJ*WpV83nf zp&Ku^JhgoF;ZJ{3*C)wEelZv8APj$!Lrp%l+|D*~MtKu>PHq zZ9P&ZgE(9f9&DbSQ(N0?5&QD#lN!WO!uZe$O41sC%+VN;HXBOs{HB^ck(6P*oNZNIzc$5;LbU5A{ z;WvjGCjTz20%(XO$KO#tz=xNk-ETNuo~rPt*I>nEr(J3O3tF2zLUD?vI-o?YTYm{yMT9SJA4-FGOFzlExneziQm4Yy7wq5neCT(2L{X9 zrWvZd5xDaQe#6Y_(kj^UUjTVCay4g_cqBq1RO6&N> zW1y_9tV1T+ifN-0?u7)$MIo7VwPp+59Rhlx-i56s7f@y;>j6IZ!L^SbS@LhqlY7yy>VpmAlaYM&Tufob&tM z_Fn*LQE3WBY@*6<8(s4Zrq=+6ggG1SzScL&bFDm4MTfNJdyWk3Cs@mxQWNp}gEkU( zv%RUVH_rmZ=}pr9F{f`(u5l5}!)Oyqi#zhv_*Z(R`~b?pYLK4~gAALE$i?6Wg)rO^ zgtpfg_Wj~p-AyJLmxS}<>Rlgcx((4<7}$~DP-BRf-ZVR0>YG-E1j#vXCVZf#vPPfD z9irE}$zT;CN_ejD!q9Q$Hi)ht~+kn3Xg7oZU8EQutR$d9m(xsmpQSE~N78xMkJ>m1ni zPvlQCfUXJYVmkUfhya&Sua|q=-Cs2!iw;@wTTGswl&cKf_LhX?J>?QW(sC^|I~L>A z%*Th2Lb@rUMf%~?AV0+4`d^KahUA|+N6rqe4cU|v!^$nM3A?nOVq zlNjX9Q(JczS0qGxJNJwWtZTd9{{oI{@wlPZ?@LjR)0K%z4(>CY9ZPg97E@Q&WR0PJ zF8b=T5G!s<+vXErAyRAXI;4xRB~y9{U4d@|v4o#9tL*~Wx1{KjFG=$zAyiVde&fq` zGNqaai!-Y+Y)D#%C~n`mDRU|pJu4fc?BM0~M|*9E35|DA1@}U&lqOuq*%&gOZ*(Ft zWTxh_VIGoFxUl-*Maed8)qPxerwYZt^|q4jubK~E`6W0 ztdVv$N_k314kifo4i-ECdI9`ro83m57ZfnWTaJF4v9pY><(Jy6MeE43t1+BIo}St~fNt7=)lL|MyPq4l zCwMziM!We@CT~m?F>ceg;?F@j{;GBT6KTxJZFB@@mnzeIv0U{cR{&!FM_KOcF}M3Q zp;>VeRtGMK(Rp7tKW}#xW2Pf^O-qbzWh%|bzK?QR*Xu9F&Ais!PX2&vHO?6 zJ`UC$&RgJL0L9uNy4jmvbC?M}^;^xif+iXqCKWE6YBi743yWIc`uJu~tBb_&(?1RT zsBCZNFWnoV>kfijGLf7|93QZ!pOhRdkCjt!DaO(x@lXnETyILb`&?S-*4}EGd3~N@ zSFMkACWsdALSxJ$vWuyYbFcY@E`VnacfTo9A#gZr%Xs7-tejM5G2e=5LF77NIO&hu z%2L~*azIA*4#Mw42=wNGtznvR5{*pD(egP7ZTAoPei96Ddz_OgSt7wWrE4M#hZoo8 zI=tZUC>FZm?9$;E!`Gd+i;r&L7l{crWlNszRWql=uUN)`lpVM7-sS2LJ##O6%FW|W zIB7vxK})N{3{l4RpU!Y&E<6U88_1?QdyCt;>(cSYpZrFI!1gUCemTC!n*$+Gcn0m% zPT!yEeoR}CAe`-EQKYH!Q;d2n{8-PAE_giq!xX(#ha{Y}Q(5yfrc~_X<)3ZPAB1wT z9~DruEyF*S85FgBknAV#-tzyfR`4=zAwm!(y!&&*l796N!WyRGdtF1v&%>XM_fxy9-GNb@#j_pw)2UR43D);S>BSzaFF92<5IM@Blg`O}3tw!} z1{$Wtj=OwHFf}eKmGj*t430188~wtHm36)wCt8>km^0~=N3?W_bR_Wlj1daJtu4z} zUqWYz(yQN=@`hNAzsnPKYa53}W%o_bg$n~sD5Hf4`DSl}&#>iRlbNKUsZlG+)Lqeq z=KAN$GDiq{9?vG|7N20C zANXtDGWGr3ydcMYM+f23(}{tJ$FomRM&!mQ$N0W0V?pH)DO3;w?)3S1&^S8HDegOE zSm3DT{6Wgd3nWuniH`uMn~{{KH`@pkbmm$3(DvXW46k|cod;zZnLY6r21mz^0Y4H` zw~BK^;-8c^n$}S6Vz(rlJ4_?@w-tP8NgKP44(7L27iPxp3Oh7Dgl7fu8;=i;+Ku;;h3N51CT=R`Qm993Q@m-lZu2@s|IwM5a{D zb;=NyH?wmTJH9RN&3UHO@;b2l5M`(K=*J)7au!!j1xP$#bGIdi1G7%W0=pGTs#2Ek4Zl4OBO} zEXu`)2s$|TWtYQGsMKD`O8(;o_Wtcf2!GX^6|9=!D`<3%!Uic$=U=-&AcIAP=D3xO zpALsHJtx`v!M_wu>_np)QKVpykkxmYU903_d$Nef^*c$g{{j-McwqCuZ7=qN)ekVE zqAE?-7oprBu;ylANLgWR&4m$2zjeRM#sx)iSjACO-jc)xRoo>>T*+s^KsXgpkNcvG z?*VBEhWCVYxO1m8Pyf*&Cr(mTzZaQc;3#9U$Q)ZE%477X@r=&9*QQ*i`h(YYm%&YD^{|hqe@mKa~CU9!zhnw=*T!&lddK@h+DZ7hr z3!iEjP&1UjZwbWj{wV)E2$NV|uUb?two{FBK0fxO$+;^OpL@~fxu^WYxb@aZ3-eY^ z%Pl;t^X~UL!IMQnujMKiJFmw*tAJBgM$!BpNk>P=L&_z(K<}+&2D)NLe}ivV_OYk% z4F%aF(XGsTmEW3^4A-ct=7Y`I+@IUm!yn;50Zi@bNvYxc;Vrr#^x}y`HV}NGG1!Bh zFZDLcj7K=M@!5Ti{vKXPs)%~DjCLi6;zIi46Yq#es$+ydRY?W?{5C#WG)leF8p$(9 z*a4qV&i^K5|A(0U-{~8%@5vQjnX4>^H3Bika)oK>oia?c+I|wE5U`@Z--6U$pR(8i2KEY&P2W57$MP!asb zPuVGVq-=nB7Ad3;Z=tdJ)!aJEt}Wfe%_ufHY^p3jZ8J-EKpX*{Y&RACa*O^!Rz6(6n|d9EbOuw#b7&A zhYD(XeRb=Fzz>m%tjSj?TsoPohFPEKn$O$9x2xWSvJxKV&7~aTbFye@)HbnzO}x8_S{ zkOTV(M^fPLRF#Mu+6))=={u3Z-8CsrP6-my|m_k3S?>-bmuL>zpvnSZ(-TKkGU}tBkv=_Tc0wED4ok2|82b5 z*2Q+A?$&ve+*VVTUXG~u<>P&}wXDPn^+bhvLMGK}t}RJT?3XN z#WDm%CgFYagj{#aoP+nP-%6s}1O2`b^7}l*qHJkhboI*am5Xwfi*ra2!mB{5U8H6` zB~)X-oDly(RhIqwChcTpIj$x%tFQPh)^wYmB8C9Wg6G?7F=~0X2Sd(^lNFAMq>%0B zN4c9*Orbo_N+)3Gy!!0=bY$8irVg@nyM%Bm<~AAq1z>5mtOZ?5o5rU|mQzJ2^Tf*g zptQJP1~f}-%Mc`a!0Kt2?daC7R)kgv$&#Ix#cqSRDByedBUSXxwt%|Ex@?Z(TZJhE}{fH#dnlEZ&v%=k*Tj z0`UnP&-ymh8aX@5MYy+K=4Q6s9m#4`I;x(omTi6SOz!6jH8n*|EJ<3LEr876X)z#z z&{TD!fbkt<<0upDuu)&8SkmKDV2E=#co`%??QW}HP4LrKQLt2!;fdL9uK{=_ek z>{L>5$Gknw$*{&kO01s@TTX75P-I#~zhd-P^C~Bd7aI)$guQOWOK_+zwB?k>ZATVC4&e zV1$kSe(&<$%=wFf`oMtbQ!Qu*#$0f%AsG5V|QOKKWe6NaFj$o#ih9` zr}J(g=f2Nsn#;vD*~99T#y*x@e?e}9(-@uv;JwKXjI)}*hhlDZwu@0ce*l;~@7Wfi z*m1ubxmHBise|(;cM}F>M9@Y1jl(|jBt5M(BSIyYnw}xO&95{iuU5n@=pLPeHc@CO z72n}eRN~#7xYYN_VVD-b&S>rYcCBu#X@?b2m4&nuTm*O*C6D3K>quU1Uyq`rGa+_l zKg!l3r~Jr+sy))IB@WjY&r6kbv~>WCRP-pn(0~X;U2lv1Kf6--OB5{ zVtfl_nN;}UH#Bbk?G zO3`8-GgLXK&JN(Vjj`Xozxf(Hp9k~dHEl*7s7riXf?8Yix9l@P-2;*$)}nit&9Q%q z`DF1lq#f7BZyLAQ1qlhkGIg=-sPkoUJbRS3fhhMWwP2S%*{Cj!z|~||lHmcwdmVMI zWrRJ7DTvO@wg70xz(^TAT(uy5EY#N4$vp$kqR>Aabqv}GFMm&~&)kLGv2H>(=V!)K z8RSi0FRJ^^MdwGNM7Ur6CZb24RHaX$dZ2n2#0QH zfNM{TXR4Vm@!LXL;Bhs>w2aJj`xkzgcf4MS89tJ0W&03c;hi1yqwN|>++v>Yt3#1a z!p-Sfe&JTLjd4V#H>ZSJDlHAuFo^hAEED81U< zOYW`C50ggkxmCw?J)r?E5*Y?u<+P6f!{>w`hSzf!*Q-DKVhL)Gheo|p@9+N}zTqj0 zx>pOZzDwxrQaoSHwk|F>5=CT7>Qyxz-N@J?#JgZfpZjx92=7dpBC_1gcE3nXE}&=X z;zq)bOsDI5q3{sQ>`=wh(YUWNnEFjbuBH>9*8tP{!TN`9Hos*bV6U#6YdBxk(gKU?JGy>y0{*1Jt2G=r%}Hq*T57_b>jCSKsvBjQv1UV z``)7RYGJ`B!){emq!HKW^QsC82$D%9MCcxIKi%!&uyet9%2I4*t3o;CT>{Bt6hz}< zEyU?XVD^dIqkd7lnMk|pxwx)B_1vGD%RbG{0(x$hShDvhp{g2k(#^zuALLezv223^ z9}8Rl-E=7b*QO&`B3W%Q&_rBofcog!%0uGyLr_eI&l{m<%y|T4|}J(u)_%` zW7bJMFO&5kzmQr8Jk2xZd0s_0dKtHh-w;3_XD1~z&y}li*+OkKtp4T_fdEKzq>gF7 zCT!nr&77!dsL>`GlL<`DtqV1Hx1#1dAgB~~HxXD!#b`{p%MnmS%QjnHFf^?o=A8K% zS2gX(i^n}((Ngex>YyJ!^8m}1eFYbN=)gW{A*Rl+ahM=ydAI%SwBT{bCn zGIsgs-6OOV@9?w$tk+AK*?9k})Y&z-=P%%cbe>vAwuWoWh(};SBBFI%KP_f4zh`Uh z!S#l24bb>4+&Q@7+m$zwuvaM}ct!Cr>uBA7?6|I_LeA(86v#lDDgjBjWrOSIpM)uC zzbO#?^c43l=aia$3PoHe`rV^Mf17Z7keSXQ*(bu|l{whlXj`*rvT8sF)!X9Yf3Nyw zUbf|NPQuz3TVSSRVZ}F`XgOHfG0MtbeH4TKs7qf@B}Mg%HWN$A$qS||ylN&B9twLEuscT5sr{^ReEU;M2z;>|;&f?ZW**U?H_K zYn(vOWDxR?v(oWvDY%cv|I+6lA*3YE+(}+`T+*H(UR=tA5;Lnzkl-$&MvdX5JY8&M z2naOM$0$6C1w47uQFqPiE`C1-z7jB|bj-q7T|8YqdAl@Nh0xKl?I~fNQUSgSt`8Zq zq@#Pi^XG&dUOf3E`&+X55id_%My&u?(fQS#^HKfC_ilRB9PNUmYvWL#mewJDiJvI! zzE$pnOY9c!_0UsB(AB_iZqO;HKJ}!@h>1Wq5t`%QS^Rf~ z$RvO!1On-YZ4vAYEK6dZyb6)rOA0DMyw1O@w-UyFHUlGrNnqOMlBES6$NSR(P$T@z z>|Fs&*gNcHQMSAar8Knb85n-b?9t~2c{M|tBON3@?9B-BN!~}gH)p?$xI?qFC-IKI z8|?0Z;cOFYGY#tBwQn}-c(g}Ks`UyQM8f=`dvSNlgc->jrCqKiYdqj>G)@5*6l%o# z7v*Ucr{LVK?1Pwv&XbQQ4zZl-z-xgO9ybJye;`}90LA~>Tbh~v3%EccV~PKXN`VBr z-dv@*Q!YAa%v($h+)^*697<(c(xF&pbkUpM;yxL1SH?xyToerAGx8WhsuSi$MG&Me%HPw%!SGaQ(mD5-5xAEk9abOeb36z<;)IAM;SpM zqd5Q4aWiE#r37Q`;e#=mT9WH4s5#p|NfeUs+v`BZaK&k9`;|+lA&lmc8(Jp6pX3+< zpEQ*7d?^iaq{-`tvtj`^2bntY3v+%RQccjwR>~3j9EI22wl(krVh5irlGX(jSP3)# zd(lbpT^1%BUYpb=AMxg+rn|wrF4Q%SbBk6Ux}=noD0TlO$&U!3v-IO8bRr=C3TVxNnZjL5+Ghb z%zfD$BhtBR>iR$=P;6kaYo$(>0?dvSI~Atpe(l>UaJ!*3!_4-A@80k|kzlbDDZTL% z*flS2@njZ5*)(Y+mNfV^;%HM|k@uO~Zq4|Dk*Jm&(X#eGVx@))4PO54_RJWlnR8KI#`?zu`JdfQvA5rTp1b-jkN2 z$`WU|a4iQ;&4aZC^DORX=l?95s*~gY094IC)S;_xtaKq`*p>8QJvz`C1!3UEn(W?> zl5>SSN<}X{#Y$+Pl403ly3ulB=hTOBavKTd?QxU+h_BrJzgXZNQzhn8i!Nh7B2R{7 zZlH*)&Ry8L(yB2YN_Uo?W#))FZ*Ews;xjAE;i~YZN zN8~DF)=Qp}N&jnRF}O78-oH;}ZQd#Vh) z$wiTX5Lmn6`_4uh zZlYlMb*{O)&*5y^1nN`3uY+v3mY|@fzC5CIwT| zp2leH732h>?+vQf?3sO(5CzB%V;eR{9PIt`^!JhF=d!IX0n;3N0hhu-HnMF3t=4X2 z!RnD6tph8fN7K_)yOZ#h+vy zj}JCSDd?sRdQj>;%I z7SL1kfu#*~;4c)BATtf#;0q-AeHHBy1KiPAru7S=^qQd#m}}qTG5ZHmQoi6RlDniw zQBv;(lndtPY^x;^N|=tkM9Q8EBv3u5&C3_}vj8`K*hTqJ{N+#dY`* zIG*~24~uFLEOQu~i-kC%fm_~Q;O<3(pEu!`r>|LiQm}P7wkR{A1BzrX711m{Dhjeh zXB02C&c@4Fsug|ENnL?aZ4s~_FbQa=p~Y99_KDJX)a)b0P<=Pd6%*9Vy&3PC0&~e`t9=XR=8*Td&*d$kGstW{aA!rxb)Zrfq?I3 zBx`a8Y^a7}E<)+)p9ebrprKau+$?m^HAz~lqR`QG1I*WbQ1#bVLpFMNS$94#qAgZF zNELQ_nBx8MbEzZ7n%^{k`d#ir_8>Xs$!vrsR(p4_#~T|b{R+!y$4~%UYBq1`i3+LR z1f^`e3|d|ah>r#hTuG9O80aE1nt7)xJViF;9@&PD0Va*MCA=zqVFvzakm# z*p{X=ZQs=o(YBVA|zgysK+=Koh+vA#%C4NWAj$K-@4HMqi)da5XW zY`n^Naz3M;{%aiIS3mP@+#b3zJSCvKeVx9wex@qwXx1ZKEXvn+ex;l4g2^t!VWkbn z0P!Xy_+l2)o`M!f2_BMO2^Z-nT2F8tQvz~A5cJ^^R>EDOT|_I-(ABrHinb|diE8i) zz*&uYi6H0)K4!XlFZTJnci{+OhK;@^b2}sx^C|f5#lf@CW$!?{8$9HC$;8mBMNlWE zMTPl%2ve!W;{15<^7;AGr+rY6K~U=ES%$`o(RxQOjp8ZfzhN};ste&0bObS2ABuX9 zkQ(Lfe$O8+iaiI&67HmJvz`#0GG7L~bB*ZKr-SQ;+^h6PHQF}WKERubMjrStzTq?& z(?ek$O*Fu#XFGq!9c7HnwvZv#>Pf+37{%{ugcJ+r^==H5>(lrQqcv~%V7vi|qav_p z&AVd48oO1&BSi`mX)T9)p36lK^oXdZIO?LJ1t~htb4o>l{K)3MBMvl-c>XIwDJ(P= z>*xG;-%+k7F9}eMyhk4Z#{HJ}sPRu$Nc0W+TH8RTji=^88O1isJKIjg;}xaRyth{w zYyzKgmTyLx5M5o_7iABnNLgF*6;uCKMQDk>?hI8|IAbZtE2LLc$YYc8wCJ#fb!AD4 zPLa&g1q++&W~Lqert-A{oo@M0^t#E`Q-T|7XsT&oq4vH5I*oTYDAfMZAwaA+qUcPCFsaY zQNr-%^O+pdA7c*U!Z!y0!0OqmK_e5Te?_pG9QacA;~gj$IfW^55MS8JWn zHF=BS0ftvX6aHRYlT9B!Fw`+Q7AbB<=;vrsv%;e@H>p@HPp|tBBB@viBTuVHmjfKT z)dN(D3soA#Pay8$mFmYBof@zc1Gu&&!#$}J?YtuFl8Sk~EkpTpJFMk#+VXWt2a5Zd zbEO?rHD(YR2~h*7v`lFzH9FVqtmWD7lF?*~3VJylZ#ujGg#x2%hWzf#GNEJFi^wAM zK-B~luT${~e=S4DQU|NuC^r}1%pq0bRaX_-uHvTG8YA0`7)?W?d?)gzjb+6{bU1ci zcDCQ>dKhB+350ENzHX-F)_Rp1J_?t8UYQqB*8fr}KX@%7SrFLOmBQrTlq(p6;hO5i zDoMq8NgJ-^t+`DGJ6@1J@=+{sq~?ID=q-GL_hg%i#l4FpzT(~j;oWk+$@j;3?p$Ru z2>}sTthv&~Tdqhx=S7X7Pq~Si3%HqcrmkvKNRn4f8np#1%)E{6^eDZn9DB$%>SL*A zB~U@2L&ztGs30-hGN0J+#$!b-W2K%4^dD<`zq{eW4s(n}Mgonbi9y8ZD_<4b#dlV_ zVN~yH&0)`x4^^a*>B~ia_BC#1J&S>cA98!S3s&LQH*vNc=t?=E%ICgUdO@eUh2!KQqZ>o_?xeQYpO4s*-RZm&|r%{c?5YCf2tee7}lB zjT1K6sYh};u`|EF`qRX#7N;-zK$JTS3#78x_cOZxW+AC_$GyyGEC+x8u6n zujkBsDr?nHjT$3kTs`@Hs{?=kCkxIHjS=?UL-3SMSb@zp;5CzvtH)hTk2~5%P)5oV zft+i22>5rkCSrO{VpD~3d>WC#{GEd-$j5oihwaJiHbr*oGE?iyyyeIC!s%AmFoyn` z2Vk%bBy|HQT{VBPsWv^?hnRD8?h^U<;llpqBUg-f((H|q#zE?s zqXbd;xbMp>L0`iA@6`(r%o9SiYch^k(f2xW?;%mw5`IB~1E|~#dtykT zjcS?0(BF@lSB&NIs=ZHui9$1*OC8rjgEn0HB`x z6w?LL6;5VktAgrhA%#An*fVWkj0@_hWVt^GszoS{Xfm~3Zjn1hUZ=1&lH&I7&SS4! z^1l_M^TnV`L(i1| z{+zOIos1n8tpk)nrNilMvyf@Vou6)HK$(HgaCJG!8_ve%(hytV&%?Ak`*4&U2t(lk z54_=|xJQu_C5|A0{8F&(&hA)`^*?d|41|%|uZEGv29mIEq1>61EFi33+w{u5I`hRS zfGh9RJNy!hJN3fm{N;ay_cd|++|pg!oTl!f7P}~j>&7WDtIpGb`2s!~1&|VBO#b(;Gj$?%h z$DTF`7Jgyo6vS5$xnlHXt6VV*d6a26Azg~>O$w=bPCh#+B)-K|_6>DB{EWHxd_`(6 zRnH87dQ zQEYw}tb2!-=7mDEz48u$IxPgUGkeX#Bfk|$ch-H%11tiFGEaj$fi$ocR|n|SN=tT) z1)UsWK;at758&GQ#XDc&2#KkR(QK?^YP~rIhVY#7=aZG|zng4UJ}lSYIllXSjI;5) z@yc6AU;s+ds$OO#=|cv#gS|^20hq_3b}`J=@X>gTV-!vN-$%)R9w|Wtn^nQ?iqSl} z@+`^ji88f<#fdyp-wwRtl-C$p4U5V$Wl3awt$CZQ4zlUpK)TjRHimF>*8F+n2tl3m zN3U~@@+ux&vC6y+lhDJ>Oxf4{!|yi?>a|DRIhzcMN2MB>L%ev^YZ#pJ<7voN@ly5DiXz-^~$z)-R2fC(yG%4bd0i4a{HmHKFqV`TOzDjZ{^$Kn12bIDl z?zjVQz+`)kkcd%Xs!(53kaG6@$Wn~uE>VFR3%B&iK(u^~0yYov{gNr|T+T!3qkEW^ z766@}e_&9jIyd}7{NG0Ozb~S5lgzS)$|g5+u6V?fK>QMAF!x2K+iKJkiTDQdd6~Hj z=8qDh$BmY!6GH)FD3cf5Av$vp&EYdbGV^^Zxloo?lwH6|Nqe}Z5ki1#uz>8Pax4X< zJ%%?pXbOoq{IJ7{UHqI1{dtX2DeSGAJ=rEM2`|hpFpt+7&b=9SQJ8y4%71*8g|dY> z6(w_D?TNxs7`HwxuUv0!33-{k7+zz)=tdn-0t{FJg;==HT(x`JI58(@*?+{`3*hgH z?rLF=62MMaZ_T9EV;k4;sww1RY9$)9>?6#;fw+S(O!;Dq$5i#5KaA{+)%BaN8$K3r zmz{#sl@~@Bmc_%5gorl5RoE7I3l^&VcRK4Yo$17$CNDRqakL{Oc)DolX(Ba5LL+5w zq9id7nBz%`%zLxN4Hh=ts%MPy4i`rNQhDW}m62qmKQt-*h0VbXU8BbEX9doPzGNKebiu?dR9W9A4q(kt>26kN1$61*Qj1(R_? zOon?g*@SoyC_KX(6JFU#3X&LAr?q7+ZJ$Fw1h-mqXI5!Ws<5;Uw$ zTtlC^3DbQc6%}5~*Qp|i>rQ?b4ms~@f6eMCS4;&`Y}TO?^Tq$cMOh@`x*0ovx*Ah~ zV(#kF3-h^Bk>DcasKoG`^K%X8snx$Z)tpwV!C&H(YAu!!RP(S!cTbLiSLp|9&MD7S z;NxuGbC}w6+xy)h6UD($0m>(0MCMZ_&qmhwWHKB?-%`m_$P#%U#4XQga`2#3UAHA= zy#-v-B)w44DxDaeO4PHUXGA$CXH?2!x8AY=3F}VE&iQV~R3T`fYAOl&J^3JK?qQOi zA1o?+SF#?mfl0Ivy6asHC6o}5debsk`;LJ%Zi?>mp=|JCvHso&XqT;hS|1U6N}eS~ z11bqB7{Jj}3?8c)B0_F~Z%6P6lX0Tqr}Z^zB;^W@yH+!hGi8IQQ;y|o^| zk~I(9rcU4jj6X_E4mI)W2Owco;O|G7yV>4ti~-lX1Ywh|05aK~*3YwQ?MfJq#_n|KU}qdxE%qCB8HOQz^c6CGUu zUT$x=<)3)1NR}vtFlk?M(|&$LcX>iVl*3q;+!YFFf!WOHQOjXxq;QU>u_o(3%^OFJ z&CgXEaM50E74fTjP5=W)LJA@Sa@6%ix<{x_H61=ZUT~HCY5L=_*AqG^zEjKdk#khR>*k2L_kD;me6-!J=m76$O_gpzs#Wb`#lR}am_6{-uJ z{j02G7?Ou=haR5 zp=wVJSC?;ISqB2>P&#Hoi02}N?inW6S>%LeGBZG;NSepScKjE%q z`v$VE;O<6!l8L;j@+Kk-&v@RIxPFwHhmdXU3zZ9ET<&as5`-E>FaIBa z>0dz8KVQ{&LC#k^V|ETqz4%yl97r}KNnT$ZVX9}=uq-0qp_vmg%5Xp26Vs25bb}X7 zKSlhyTYhuHOD%*B6LmZ8R$^%HIm)H0*N0Ei;eC7__&R8SF7{71_cl3Oab;QX zi#Ged(dF`Y#_|P;JZo+kFu!Hk@*8p{K4bhIO3F*JYYZa#Xa5`q{~iec_gzA}8wOpM z2uQUB53e1}!dB8~I8^p)b3c|8v%eyrusbMx=|Ke1m~KBV^Gjc@eoeULwsd8!5`6fI znSU~}NdSHWtN#=Lw1HoD`4AqG`%9H9@+29en7>a-`WYjkq-K>mRO0`0t|^|@q}55!jEM$`?Zn@Ul9E{anogJ zOVstKYgt4yhKXNV{UamK^$*R3xU?k^{pGDvG;^a_Y;YuojRTR}&PyoNOO7A;JETAH zzT}&5C&u*aWPKjvCOnpMVM1z|+)ZW6L+|$r@wuV4l__W@E7+n!;RWk}FzukIBVz4k zD2#>lh-;9GPCpPS$-5j?Y$xTmoVir8X4e7Zos|ecOWVKL<7#R zH)+$4NiwQOu=~FuWfMX*l9a|4uezlbT?w0KUiPHhBU%rMFG-Y}+w>sBRQt7yaeTRv`5jgH;3mQSXh?O%X9&$>xgmcFF^P zCA^%Bjxy-7VxqU}*rvYUT5Sp@GiNZ2ufI?R>Zt^utw4sA&JF&Q5e~kkmDK(8%lGA2 z)ew|&E&!%0q@diXp^C&_$?t)WZ;_P;r7tDuK(Ve>>+K3~I7(X6o$=*A3 zov5zT8T<1+U%M&A3V<}sUzZ{Ptb(euQl?lk&pEouk)>9z^7uO_UwOT&{(+T`D=9{`4~E=Qbv2(7 z->^#|DzmAwst5zW^yVg$z!32trG;WT{P~E+|4Byifela|B#a!P5|GCB2BG3ONC`#_ z#`c55*spSmvEV1R3C96sCt$@Ky8z4WaH4R#jQJ*v*%1cKJ_+E}5!taHC5k|?` zqr_EtBm$2WjJ1`Ttj(mSa~_9I7tpN~ZvcsIc*UpcbqsL*=g0$d+P#1nv2H4*f~HxD zbkqyI?ku3$1Zmpv157&pTMbb~D%UE`#(S&da@)aPBT^$g%Mu%1jgw4p+ay_+q&-iQ z<-NOlmryBG*uAnr3iua_pc_>$Q4-jRyP!*3-`Z*yuitHVJo`|)LGtatOP+P5da6R; zH-{2xf!)|;)(%!kH(#evo)Lrj9VGxNY?4y~Gq-hXa(Iprq+h-}j(r*Bw!wFD^geok zjW%h{Vo>c(GauczT^i$y;~S+J=-&hEHZT07^#{u@^J{{9`H=XRFbT?7PSH(1zEQ65 z@rimLTrg+8wsVY!?eHQm3muJ+*NzC&C1t$8+_XN?WcjB>vb3(Zln%1e`u0TLO8j@G zPv|-`A=N7S2xJPNg=}J4j)!COS#n#!0X5!iUv@DeS1B!VWPCZPslVtbw$wEFzNbh< zklB2!t=LW*82W_Kgvg3CG+<+urM5D)MiE&yL={xrpF3RVT_HmNg6R8l3KimlVecbt zA~Q@+u|-6DWEYs3sdcxu85mlHcV!Sk<&8$i0A@xMqc(w+N2hFj(b=9`+Z>lGw3z8Q zeW^U{n;4}enx;t`8PD%4#9vUZkqU<@6F4+jwfpMqQ$l*gK+VpeBnlK>d?b>|DS!7L zk5-`KP1UdV5FsybVqP7&zI!$7rQqcu6t8sKJHzI5xeTMUyQ#h`oN7d+-}`j8&@BwF zwhp}!q$t!CD>AyrG`oLpG;OX6hiuQKknhuZai_nE2iI@BlOimfMquEauq;S8l2|0J zthOyUZ)@{+S>cYnmC0|}6Ei_61f!nk>(S$XA}vn&A|WM90s21w~c z(PE{5!ELSU*WKvwt%y=EJJo2BuThkw%Icm^SlhkxWhLXf?rPk{Ox^tV9MkfO+)Kes z3`KGczwbu%CH~JPpYQHKMJg?*z}*52p>ZIMsc$VzFF`-Li-iNQ@NURwbKAa@m&XKT zENyMGE+BSV=qEhoOZGkbqhSZqiD-S}JviQ34fGWqUU__#Wt)Y5=phlKC16K7kNH`- z2=59^6h@nC9e{4YBGE2!3jNE0N+$RYu!y;riKn*KTdKw^LFc7tVlZh1JI2am%7$>h zE&IudQT+SY`%NzA%KD%mWdqM}V>*xZTj2qcZNL9y8?^Zw`x%}cQ}sO$iW%;nM&ZcH z=53<9Fk;{wmfFW&Yxo`EbJUMNerLwEnPZQws3(tlr9`Z|d0ZY~S*FWSey zSn0!wG96}Fc5Uw{caeD}C8~P((lCA^EmGXUZW?4P9m=iX=UKWYCoCv+!=X1dqGI2V z<+w>#cK4;93;DsNL2wqqOeK0xi;5V}X`e~J?B(rW$-6!rgh2>oC6y}XO&bX~PNl^o@(5}WdU z7kf8nSW?DVhE=qaQTA6f*}VcXZpVmvWeLuIhsdA(11@I{LAZqJ3x746tv!DB(OS!W zYb|KZnjhF2(uQI$LRo(p<-RDDEzRskpIDne@wqeA<#;#db0DC&ilQ;igCaQG*wrL* z9a%)heNh-x(6A(!H&07RIb%S2Lp}zY%GdfOPGhjVRQiC(t}1F0*PO{Mj8R1WIrN%- z96Su)Kkqgt6B4^hyw8hx57)j}Br&y}IsqZ5{(Y@a^Us zk8~@m4RyJ_+kR?e zqnHxF`mK6}k9H&cD$1@z&%OpH`J*T&|6blwnw|!1xq@0s=_OU`T$Jb6nW{>b3!Udd zTmCQ^dN*ycVDHb7rZ;L?b`RoI2NrViY?3zu0L?0LuVDj1i?pnEdv+(Vzw|)(0?x@g zMm2RCr+fBb4W1V|=-xBMnzvD^z(Pk7le7vuFR{ScJI_CgNiEU5j82>|0XCe_Nf$d9 z@`27$J@L+8093eVKvGfRm|s6@l%^-~@=M%DVkLKChLgC}stQ|>aw*al(krz-UqR8^ zBEGyRW=GZ%%_Gyd^)`Ab)|GG6?V^HFEr~xrD{_0J+7a>FTn4%lUDmAFLqf6&k6i)> zW9SIphq!LPT6}FvFOKIg=>gJPZzq;9Q;yfg-sCbO)Q?MP;}U7XezoN98** zNili#F^`(w&|9$U%Td{Hyfy@C8V5=b`mFT#KX9FZ7e&}v3|vp-ermI);G6{^8%Zqk z5O~|;56n4|qf+U%#+eFk_J1BZ;yLs}f*;TdZk%oEPm|A%yatM(CpVoi477G(uv9OQ ztOj8c!j|sNk)8HIbm+^?ddQ6nA!?T^iB{viu?PO}>Hl$aiym z-LA=7<}((*biaLV^}+o+mK5T>qf!Dg6?qHIyZ^|78g@vJ!^;Zt+y<1*8 z8~+x)n=zMgBiA!v&M7Nu2?tLCdehu|ad$n~6=k2Rkxa>zXf6oaxbAk)-Xwn8g`+&F z&&)Bbd*C!IH#VN(|2E4}&Y<=-0k(Y<0d$xDCsi2^VJm_H45V-SZH^iC!)*QY!mDsw zj{OYd`?OOCm+70!y02RgMWj@R-4HP=k9Br(eJ$NS6`t53%u#X4o@1Kpi@N}1VmyHS zHDecWHmsQzDa?^dc}(>nN!}dz?G=P$G#@@)DKMsIfOps!+tI3lHTD z;~zU)vz|vE-uwzr_O}x5NuLU55jxYUrN2De747cMLC3^|F3;k!^yd$*4KYpMq=-6E!D7qi!%;e(A(XY^)8F5O>+&cTk zgHz#O2khw5{Tm6bM!>G4lg!yzt8bNeAYVflpmdZ<7(6RnkXbhMV@j9~PD=oK`f|(# zpu%QB_n>bQ6bAd61N))UL22uyI0;egPCKZ1IpWV(duP=Pk^!NkAuMX^6lrE^Z0k zTB;HIg}Wp4*M7q7sp}v{BEwrvN1<2aCEI#YUJY_Z!x!V{@&s!k!H#9WPpk_e(^?|i zN!^U0*($$`A2FddRWe_s^E5ZrzbFx@OQN75%RnT!2^-%#nW}EMATg0tq(v~H$~Abb z`>KR~z$9Kb)KI@ts{Q*^8p>?$@7F#A7T2{TydPdA#KuYHqwdGQacm^7KSF6y>Q@lz zC528ay_os0)l~ndfBx=T)Kl&1polFRfA*~lhI3kdpqLvOneC&(?EJ^$CVRuJ2=Ta_ zR{W(VjCK5)A9dhi5dgCq@c_B^+1D#p@w)rQ zzVI5B2^`Hc*E>hxGI)jcd6jCKJA$GS4}{J zFv%SJ+VU3NgjYVi(c)PfOW4TxlSoUc&TX=sot-+5Ojh2@CjA$Q^$#Lz4ahY8rx(Ev z^82G?EQv;X5bp2@UM=&xiGW`};WzmIg`!~gYlh}I@%I>hTig7*T~dbW@#jx(=8l4j z7FOgdp-4_vv4?#5SM>+1J*Wr|jx6H$r&avD>(w7^lc(>ZNHN*)iCt%0@LFv*DG3IM zmR-SJF4`66x(6h$V3uspm_9BGVo^&8f|^S197L&h{2+T8CK60qyeNu%473-$ilqk7 z0&|edS&4CDSOJqj2G&N!taH0DEG5KAkdTpjV^%YF-z zte5xN-vQd-UKI3TJZn}wOwM+wiyjixAgr)#2&svqe)oB>vKdhIt^i0f`)PK#Nr_Gm zFWYu(`kSw-kcqFb6bMld;<2KhkvQP5;<@QWwv(^Uy8tcYdL7U(3BS&tiw)c=Dkdd5 zBHOxwl&;EjQ4JN+5y`8Kb2Nb{PL|XVI8Kx7KE!41-iN}~M2}7DIae8`)lQ#hGsf3@ zTxk*QRA{Q^DvtVOabZj{%Lxt!_oVrC=tt6X-NLd$3n1C-`^ig9^4C8VUJ8>sfAa{K zpRP8D#7Tn;PV0>|4%IQ9E!5RPT0n}4;Wg_N3^Nd;0_`5s4X32Rn3hl%f;;cFJJ4IA z#W5!FXF|2jUHKMTKktyKaN|C&ABfmPK0&9Q_&!@S8BsVSVCmw9tkN>TsY=b(w?7nK z@eH54t9_gd1imki5k+cZ=R}15##lLoj3BP;I*iiajX2h>UOL=?f?UDcAaxB(Jfxib zpY^)mgON%dcXD_Yu_x+no)xj)ZP?5zQ9GeyXXNYPvcinVJ|uSOOX{QiJ(VhL%KqAzD!yPY&8rS2}d zK)J4ZiNLO?ICPP-D_=={Nh(dS9SyvBJvEh8gqFn=5`Ihz&yGHEEVe#j%c+O;oA!x0 zX$bQ%Ja_QRaNHB7Gjeu>XV?8F{je2P-A8uY7&Vt^7ws%nO{b2dX^RmW6jSG)8n< zXQp9|1H|rY7s3L#QVn**f1#kquNZ=QxPJbIwVP0cP`6gQT~(>)`f@qyy@HC?-m^v; zKXVam9%{a1cnF{TA56VSA~%$pq!sQGuCLk6lkT`9=jPTiMvr+3DDJ%T;!s-F)-lj& zXj_JWaDR78F=41)Vjw5g)9w{UkI&JyiQiB4qw)@T|8TSrpOpbKig@2dvTy)&(-n;et~Z>D6BC%%W`-nK{;;&gy-n`YA=MEq{7vD!`IuGMRvV5| zRA4@_ukEN2R|o7&j%#V9&i_Yg^uH8Q5YWbGk%P^~J)a4kj+8YyUNmRViHJVR1GsH&j0M)Cj_i@=4o+BE=Y#4*Yh+A(nG%1Hp%r-M z6oR?-E4EuWk`z{1;9^u_7nM<-rW-jnTT!3EX78;8YYFyrK0Kq1Lo5elqVrC}F*E;C zgK8Rai*{s~@0Jvu!Rqr}`RnbXWV~EN@vn$v2fwVOLnL@o0prG(x(bMPVFx6+RRsH0 zxbkX$1h;r5A1z7nxJc2QHiTd_QAv?KYpd%>QISW?wwx;ts;(N<(hnvU)9#hF=C`ig0eU_hlX{sdDHWx5i=TDQU57k=%Vl!h#veUxE9#hJnoZl+G!1}U*ZBnCQ^6SVFW>chO6 zG4Yzd&S_v*$jJ05?7>|V&;ko&xr=)xkAt9SSD+R+cCHU}MnWIxK}=vIv{ zOyXtOIP3emQ2z%B^JhP|>D;n=vyx^GS}x<~hvO8=w~WFs6r)?iR>^E%lJ?>!w6(g}wYoDt&pn6bLnr#=p z!Ei&i)@*`9$UA!ga7iH=pouwo=*aNqzpj$WMb@U14GMB)jtgO~S79mc?hB~dE?F(? za(#-4zF|?|Iu73}&P~%GNJwZ!-tT_@?s^1#^fYfsgKk(Y_xJ|3hLaict@--l90WJZ zF(-76c)dl4chDkL8HNk9tSZBGi-L}x(MnkzYYy`<6`t)vye-0q3kSrLi;84#<0WX| z(jvt|_aJ(A5HN%VTI#Hrv$#K3;@8|8FELizswD5gTI;H5ZB{>THPbI6>ayQ#@4hRq{`p=$6K!7WlS zMP0HlpjQ}Hu(&_VaqB$JHmzdsz7_8!gY@6ox4A2A`G?)E2ohYDe>rsdu70}fp(k*# zL5D-9)LNPq=qpWR7&oE!w?64xjK%mi&~=>KPcYeKII^ealA*%GAV^jwpLX3P-t9CT zE<$*t{})P!J`JPXP|??g#^1E3I49YXfGX`hA(2fPmP9v)Sm{14QR-griOzCOLS5-o ze<@qn3iop=jNarX?SupE-h*DSMO3W}4toE--;v^Gq`J;&6yuM$Pa`xfFSFb1df%V_8-B-1dAmyUd8~=Tit8~#rKtmn` z-v-~^%8xz318wXs(TX<16=a!?S{#csbgMz$QW6rjJnbY9LE9d=H;?W2Dqr%ELhm18 zl|u?M^^f{!JlSqM&@0)B|nK%JCq`z>IxY_Z2Y;I<+HCtgC<|57+nMY+A7B+gPWxRHN}7j1lrS(_>_X6n>v+VK!P@36h}rM6gD zl$NiId&E=ZTx1=65;Do_W)(?^Xsfw1Y|*}6yUk4(dEYaoRyLa9EML`(+y&LX{rklA zfAV{~RlEmUhVTa=^z4Vg^7$bP-eYW^Fl^T?M~2^&erbq9D#O1}y03kVr@v=S9sp|w z3v>?0Y`l{$lH3^jtX{1R7;Q)!5{O%8n>OqD9_jUzd2#l5zw>28`dm~I=o^~zm~7T` zNUyW<0rVF@`?S4=W&$D*_jUb5=RJsuYRsU+R^-)r%q!PnbGx9xzECMflxHoNo{C-@ za>e!cnlLS`-*}bI*jra<$foO{9EEFg`ub=Ys{$DYy0y4RX35h1S((E9ajibNmnrBm z2=Xuif{HAGpsD?CVQP9Vz4%F zRKfGuh(SWU-X4}nS?OVn5BzL-t!dp|`g zJhn42lF@B80WwWwN{9hmpxTFb@XX$PoDJ5`G*wQx#1;zDk!QMh*0;#0eQl(n=iq%% z#^y(Or))-pl@`)N)v>f86@tttUycAxRPNB`CnHjo;5aL2tL<&hKmgpitxPue~wxq>%U@YPA394kt=4z44Kn zGd#Q0}sP`Oj*mFypYWy4VgDUA& zI{eXC+Yk&xzpoJ|l>mtHmFyK5t0rb0AvZ4Lzt0$Wx{Eq1I&E#!cw^54kc~%Vn(nx+ z++&NLBJj-eppEfkd-pI@r-z?$NQVIGIW(HvRY-jE@OOAc+n=BEzs{hXi420jFZ-!| zLBh5Zkek3ad6UgyRe*c#{e@_4Q-($bd9dbER7ctw$A_k2@2~{*AOVZ`J+Or3BsOyq zoFVi*{5p&#SZh#I_s_uiMZThp;k1bWZc!CV!dTxOc(aY-fV#>Pnn448PFY zfDnU?-H7d$nYk_=RXHp(G=pl=b6)fxqFx{Ez3hdV7`R_9r>|F^^{A_DShz-PvR2fO zSgqfyL%vD#a&1XuU#Z!5SMdX)?86Y^y@hLoHo5Z-_f>U;6L+SU<@}b%6;??~AKrrb zffi>L8y38IHFww;be&T{1?UXBB?m3+y|+R$F*? z^g767o5wM!eRpY{ZX+EN(j2J9>v$*Kp&HZcBk*d&vd|<`Dh06u5jI(7FQvWLRq1})HmH$OYt?Glrif{a)6=+ z^=Tj)@&;W&#cE1+;poBJ_Ul{FMNKjOW~-PR%U@29Z88(15KOO9MCJfqtd$B})IaWg z6QHLU9Ey@!+s|4zhy7t?%qhrQE!EOO;F$$COn<To7S&hiDzMTE!g zqSxI!hz-vp zUA0H82wpeh$pJSIpJ0nWRmqaqckGl%efFhj?i+*1XX&dd8TD5=YAC;uo*R`3c?s6A z5)CJ+ofG8k&Gj+&UkT!62CIwv$($>Cz6pwh(%6A5M7TOhkd)r_+&uA+mn0rw{py z+mP4n5d_?3WcRiDyoPoA5J+!D1=rWGeOG-X zGvr0yoGw@c<-YjS2EXr~S{?Fnv0x+KpP}>D=!$&Y$p7Z=zRQn+sN@1YW_<&vq>In# zzYM#zI>}van%jMDx5x9uJ*E=Farmu{M4~Lq&Z<<%JZhmrk9=iQW%_%n(eQ_NbqN!` zLVkMcF&)iEImxF6b9p+Nc=>TGQ#(v~3_G5veIC>^*}vqmz@Y>~5h6_1qZ9L{?X%TI z0lIT>hlV%N3MuqdtEy8ubC>Bg$-l$#JtS~DkZD47I*kHLKQ&Kd(WXWeFg651yzBFm zck70RqJ8$vwO&lizs{y{J-A)6-|Iiei|en7eUK{|6Nz?;7?51hK2vU@IYtddqpd_i z<338;jlMh<03VY`)Zfc**Colv){nlhyOx@Zj8SM<2h!HfI6m6@9H(osRCa za;n8mVogOBW37O;GUscVZKpA!OeaQ8YS(gVXpzE!eBGYntAi1CKb8i;IfkJ|lca&I z!2W@;+MVBrV+6~t@!wpy8-9t$B~X&)P2pkpAKFAY{H4WiE=J|E#wEDe9jI#Gn`P1| zll^$Mi9(77%8nhiC-LLeG&0lZL>Nm_FQSuiE`DO6guTt3GNfzynH87v>`t@f8-fV4 z`ARet89Hj@fqM#3C09OznkE0i*!j6&jluV9#MrL3ljDA=-L@2vi$qAzRJ-tG)xY|` zPGqQC`YZ^Rw3zV9`gLZn@QEHnnpI}L`<~5J+HBdW36$n!zPt{THSC$~71nbh;mtOM zg)q#kV5dz0v**wqB~n}kuT-%qSo{a9$#B1P{1V(%@W zqWa%{QA`vS3=EJk=oBQRMX8~?Lj|dk?#2S88A@8DTe?9-T0nB>?(UBJZ2i6OIqzBT zxp&>Q-gC}c_x@SBfPoqI{>JlsYVR>SyXYQ((!Ue%86WNntrV}r55B8ztt(?Ol|Hf7 z+fSMCt&I~TMEuD`h4gdbJTA)?50MDEE?->Xw@+xLrHxA+C26qz~|{~>mhEJ5W9wn^sHoe2x=?<;vfJB*dB47V|6 z5pAcQ)TMeS5oF;DuxQz9Dg;f0ulFtqOTXv*SnW)2vlrid;H2v`>Q6q{Oc$Fw+=zW3 z#?3JvN-ircz^p!Bes}z?UYrJ62<)BiiiesjN8w{Urwr0G7*JX#xBI8HO=jTea?QfTj&uYJ3J6p1P+LfYFWsV-vN${&-5iFba+>w90-x6z+&w!3(tZubrSB)os86Hm8?RDEL) zUG-`5r#hFp(cUhW%U$hC^$ z#=_mW%#6m)1hywNkPt|@38{UQXfkk4Yk32QUj%%izVpH_Xbu)Ak> zDbeTMsl%8^|E~vPp9v&a`q_ULVI3%mAA31nWtCaK-r)RV<>C-S+m}x3`f6iayq_Yt z&Acw+1j@JpeD%v(M?s0-<7ac!9;=10N>mM5N~73qgH-6QTG)wJ%SpCziJlRAbZ0A5 z!YS@`vkTAI@Ouc#+J*DgB=<7+#}=xOlEiL#iXMo#oXe(NCI5c?x9&DpKImj43U*0vv0MMtNqV6j14~197sM8UnEjD`8KB8 za@lcX`nQX)M%w|oaUbsu&KyyuA4CZkJgDcfWL>in?1L>~rU6fK3eqkz+&y`k#Jub= zj?FmfJh#12^n}g$BM*h7*)}Pi?A_aBbiYMElruXe+^3LYC7}HO$%b3O$F^!s}nA!}S7HCcfEV0VC zJ`liL2o6^2UC&Q#%qY<gq5a;v0TR7Z4}DL5j*go!3Pv`=EzC$IO2F zBC)}MlOx`A`bVD|5qa3AHT9l|kBZy6*rO9Jp%M)f;XPrt46aETvkwow72i`uj}(S< zQCkz;eb}()`#BLpc-M3zF`LQWIt-Es( zKZH@&UPM>m?S>u2wJkC1o#`*HcULvomum*8T&0xBS`y-V^Zz4a^rAWCwexmmkAS%E zJB1ZvVZ7N-s|Ss_*BZYbidJ=(e-Svb(2rI`2)?o*3EL|^!AEt!NA^|Pf@N`| zcXYoKd!Ng)nZ0=C))n;aH_`&--$q<;;eK8JUksQ2m!6ZJ_D+y=PBF)nNQAk0+mAA@ zLm9!{-)AeXdlGmtQbg)~)%=zmU;0LXG@-lGlA`V7eH&{&B5A?TC))HxL}mYy7f0f? z*qa9|ZER&m@Sg5=U%k$%MD%_%47bC15;ZBqpJ0olobAU?MfKWpPdgA#YwnzYlQttuBrJ zDXA=$NooDe;?3niox4WZ)^jwOueC?V%x>5xYhtvhh4R%HlfCsk+R3@T_9`n|t@%~< zw5qSre_~>57I(T`+(#ejK+JWeH2u^Y`p~@T_I|Q0t(%_WrV>LlG3nTxcJ<~;$(+{i z!o`4VfttRFwJgon>MnB^&+=l!AN9ssyw6Hg$Vql&A>&Ke7|qWn_urTlrK7l-{`%l) zlkVFccQ?H0Wz%k<5wETlVhQGt?|)vq71KxcY~-Zi^P;L8wwa{4+QIr?$;1vW+O9cn ze%`D6AHRHMV2}Lpqt5kIwhWgD!5FuzYUapO9Kq9Mg4dVGLofW3Tt8`Y`|UHmi>D<1 zS^g?M_VXGV%eNa&n_jdPyL;=_ZfVh+#g40Ms}85LkZz*0NN4Az^!pi6B-552)az94 zJW{L^mmg~TCe50ATZeo!seY7A_`BexOJqbv?2~R2ri{QFkBM$p;4o}8Cu={oy5R0J zN-ASR9ov*Ws%^KrEm}~#G8vO);K$RX=3F51iYPEA0M`rJ;)8t*y78O zb`gJ1O*7BrX_MTW6r0r7D`FYCk|6F94A+3Ffqob2Io({s12;;bx%}S|^8X;8|LgJp zcs1=m<8h+Nep(|4)&AV0&y8+wPS#6t^bNkM|8KW%>7niSud$~2l#&1HV)ibI)mxCdcUyZ}?PZ#MHQttJ|vWVVmXu23_`|-e5wwRiZyof5RMxm9=cnJy* ziSSPi41Sg^6X2U#Dc-+0{b*k8f*nbsbH#Uywsh0xuHcK<_i{Xgv1ud8WZJ453(|!? zO%d;wJ(TopMV}C=N36BtV9!Z?zF_+7gEw_?TQ?(1LI!Bd|1gJPRGud5|gk^G3J) zQ_`Oruk~y$Cg4j8j+Ostty#NZanXvC`h?&_#D)&85wVx}URFwsqF?0Q_uq%!@&?UF zbKC4$f5tDla{qDQmo&fEB4_NYY6Uzvxf7PhT+R|vm){j0OhA_;;5_3#(ZGu%>RRFF zlIA6)SuFK^ko>YR&v$xJx?FD3jEn~m+sS-n=3d9Xsa!E4bJ0FxdXc*_@Y1jSC%bXs zB(Hy)$`d$Fn;f0Dr@PR~+dC-kZgDz{F^_A$mSEm%Duz^S%e?nzDx=(p?OL-F_xD%6 z48A?K+tgpPO;*nOnxRkI>UjjdHqw)O(|mL)(IM=E3Bh}3vy`69oPwfAMyIwxeLctXB8b^Eg2UaDXf_*_h5?av~PQ@WHn#^$*0%L#0HWu;bx&DtzZn6J| zqm%x%>Z+kV8IGB`v3Gk`#bH@*%{7MN5-X?PP=hu zjed^1q5FX4%Z?wrl!mm|MDn0jhz;56PLEUlk3JJnzpc%s{3K}kgqb=*=lYI{3YMRI zPQ9X0illHZufLy+s7s9L7mst<2U7bzm6X{d{FSA!dnlv$zJ$QS30tX!GvI~VBD255j zpTqmk+A|1mh*DA)nJfC6n=2l=okY)Y)0}GDAUJ^z!=z$wscB>n`9fMJruVcv-`;9R zg`-PBK8I~vzeeqS4@x{Q9=w2n&zQ%jFj7|QJJm80Nkv6|=p=>QX&{*cOeVF)4jep;!MBLRvA&b`~6Zdmd=KFgLFti+@87Z|2 z#w;qYy1$g`DD1SR3|@^8iM*8I?9Vz9PU2U03Wt1uF8cZETa_no_I|YM4REpv1{O}o zOz4*kF=1>=7OFjS);+mB8|S9;YahlPuNrrZULp@v0-v~ zsUyGN$*y*AuH=f`G{tI>UR zKl_xXPv{l0Obfsp0c|~3I$+5V>UgrWgY(AlRHt5hcZXEO)SR%A2S;FqJCQ)5JwvI_ z(1WhT&SfgA(+(1bq`CKetjTrMx7V!ua8y|=z43h4veL^DTHsZQ*7cV#?_SX1w=n^Bx&lK8^M zBU{mCb1VB*qG7VnN_8CRchc`0+3{?A@_c4O`JG>I7*;*#@NJ7k$X}mUX$c!SJ62&Z zdU35`G`%>wN%VT#x#S%|Sut{d_TD#<3g$Ddkz+n=bkB7^N(@O4Q^R{FZt~%I(PS&` z-1&Fk@ZbEye|`SXZfNpf{n)7sHI+AVS4};cqHRC(a|%8nXOrpiH3zfT(_|C=a{Upj zRYQG)4Q8xtRzj1cx8G#opJRvjYBZ~feYZZK**Ye3slPn0zGj&r{!DmJj25muYEIya znxZEwkGXy9OZtaR3`^(g*xP%wliGrs&E+)9ud-RD-;bkftUi6ElepdM@bP}vROgrF zxUC(ATKpS9+}`scw)MO!1qU=a9F^z&Mqi&@vx|%=-hW#p6DHv6;06ii6#Jy9+x;_o zMQtJ^^~1EqMEj}3xckFl>>I52YP~+h$%$N7e0E}nKK{I5&3gUXqqpqI>JioQSdFSR zQei?Bhc&_f1c;pY*JJ-vkoI3aHfK39N0|xGx#2caH)`iz;5|o$s ze%@fTmC)!W8A-=IFAfD-->ASTktNdkV8H4KI zlimkwh-t#5r{^036dnBpTML9nk}_JNIOyyhy)3W|3wEo7hO)IdPd;aH>lW}AH}j}= znRMS-CS3XQjz+=g+XjD?CRRo_rN%kgkoMlDNUdvpU&a)KTmMs{|1UA*f8V&AsCO3Y z7RW89rZ6T5cO2^#d-RQqLFVA}l^rbZmjMDsT;qAy2kK20Bg&z-dYcOxCHt+`vWVcl zOY71b%DFPn;$?K6SaM|g6n3M*ymc*h^g7>Qo>5Sp-Ni`RM;Fh}C9DyQDwfk{^;W#m zAmS+XndmGXiaWCqT4>ur&x?6K0{37FdQ6JkKJm=I{{J5xgG<(GR{}d(AKZoa;UM!U z=lmIaZd2=_LUHBF9Ak4(nONcXZL z@R#Ps5razVj=>KDi9qIp^X2;^Rdm?{o_F5*E4=l=D*VrbuK?lyr=i&Y(?4@N?v<4| zb(#9UPR9prU=$!k~j@r_%oM>bCm> zc!t+wFErhU5ll(2QOSsMiFssFqP}TKVo|tlm{Fv<8q>?9RKqN_!cRs_CBYGBx+O!p zh?7hUjr>&tJ8QdKZ}6z@?K$$3t$*N}c5W%*uU2$y4xj(TaKl>|4g>jczgL&^_0-?5 zac~C6u9pAvwX9I!$eF)iyWjIV&HT^9gmM)2C;oo@`NO^M7yfxznDD&zKVQ;(5nDO= z_v^=3gx}o!=V33J|MxGwb77YkloR0&veVl#@wQ!um(N( z_juRwcrtLc4GmKyse&RnOw@bg2#pzZ>-<9Cr>!x3%X@ur6x*!G5qy69k{Y$XUwjjz zMiAjg$}`s?BhWSMcAPm@1KAD)AZM>Q&CP%ptrYoV<=;K zt?%vmE)|`w2zInyj_R5Xa}c!*$J9bcvP@-GMaZX5w_FZZ>x|pJyoX<=$Hm1Bp^l*^Y@;f=(aDyY3c=Oq44Y9 zzI}76n0otcpx6SF%THr&Wz}ROnJS;Cn5oY0;N&#i{2PXQ$zcImKxgP!Sy{27@glwy zs8+sh&8)+wFlNrFN0t*G{7AUIc#=8JWYrx0eo8hju<|t zqs@q&V;I1M`=Wk^2Rp0pNnuNW<9q*St(R$KA=W0+W6Yo0;E& zl;Xh;YJ-`y)S1gy-fS)O#?vY!)ej9F>A)?taBwEhAbZKYwXE$f8cS9R>uh6pIyN0% z)Y8^Aw5X`aabqSf&!Clfyt=x&D_)c!-qiT-aRP98nRvY~~Z9Nmz>z_^AW zYI+(PF+V>)OFKK2GTX&`G&U=8r~@Xkv(QANq^zu|p#dc*C>X)(kjwh;Vdhj7soUXZ zSgGA|7VNKvR~+ezsq%RE_}ws?VY&;OxGE-n`3-4QORy2l=skEEIyw|!KEu+}(_y`C zwD2qsn7?v#EWN>`NrRf}&Wz-?p7{(r3%%G^!0mQ)U{d$Mazadv;YL@MmWGb=>ibu( zOb_Y|gBlX)X2!ljQjFaEBEH;U+U=%*gAU> zkSiY_9V!(VD{*miH#Rp*v7@^?1MWV}ciJ{h&ykAcKsLUi;moD!blJEkm2Ss3nYBAN zW;-?)@>KN-(g+9q_}usYyN@Nl;ovb555^M_4KG_s^y8GyEEjrmj2Lrq;B9B510(P~BRg|50fQFz(*iH4v}D5$iwv?yt5X|CGCz4>e}FE9CL z&psP>rrbq2PK6uf!&x$_ejO=vZPh3;RZ>;`L}ApKB1fmpVCMF&@~HYXtj@XiLPIe+1-nkeSHNX2pP1v7p|kljG@2fM>2SSOfZJ&+qtK+EikzH$ zb9q=mW*ZiOd07wAM!m|(U3UcORkAwYoVgGTJ?`DR(+cvZvhmK^IEk#;C6l@+^2*A} zy^*&B`EJLqS{05;VN6=`;^JPgBNInPo@o`E3$_Xzmv@==K#8ScWo@^2HDR1W4~G@8 zI`5bx(+u_Hq5dz~Cr{qMdD?8u$g!LBDK<1TI3Ddz+dv)F%&syYeY3YYpM2uf*_ngg zbuVa0Fe+yW$QV!&+%{=)$=vE(q@0;J8X{(;uKinR++F0%@XqrKmoYJs2bERRR z-uZLqz9u9jOcdLW{rp&4U{-aw<*SX+b zwNM5%%j!>nu$Io+BIWj8_N(4p$IVrLzp8K+C>J#U~hYA7*D{m=g0Vy>X9DM&Q_|}q<&zwGtS%?pb${%}c2$!uq;LP>X8b2BWzO<2eE-QCLMfMs6S*iwIL)-Nz@ zdm^tK-On?-zg(pP6&+UD##$5e^o*Ugb!UCxeM%Jc=BnqJ<8ASx(|s{o-J^TQB6?x+ zyPO5l$XJ~I1BmO_x3^n2f78pz$c#_BySr;iV`xDfDd$oe@P zAMKk#)t8XZ`uLodp2&trC-rzfy9xk`9&30f6kE-@;?h!LtL5H2>R~h?N7E(z(#B91 z!yc%7vGL4hlGT6&LPA4r>vWsaUp9rNy6kVQZEh;9j@4x16T-}fB=Az(A0MpCpyXv` z16Ez>UqQ`kgApdYb&Cc{Xm3x?t?e)^)4SQ*VJf}LlK?`d_r7~jAgdY!tDSvW&1N$#|= zt||4b$`_%Jx3^&KCO&P$;THLbHgd}{R5585-=U@dIKQyqTy4?I$#oJV1|wSUyNifvr3YLZueVFx{WZ#FrW&1KJ8DwbcX#_PHQoGQ}IHfK9T zO-)UAOM#2I_kYI+bm_h?CN3`i+*9@$v`e!C=R?z`h4u?jYt~j)zV;EJS;O^UD*&z0 z@NK3S5D-AMf4oL*3XK-s&ERr;xNQjw3>K%&)Gs1ve)B)xU#NZkqW9yW#-d{7O{D4~ z$Xi`KBF1Tn3!t9_6jZ46EK6q43ov*~N3h2)=ndUwiEQ3mts_Tpu`dai{3T+x0BAEY zDw*m^`&)};=`1I3+;OiVaM-;p0T5PgD`$GY0}neNGyz6bDIhs1yJ-OL-Nw#xxyD^| zC^dGQ+iZr<@(uL$=U{2Jtn)%gWt*Fu61I(=^6|Ntsae9>iq%5*=Dx%v6b(5_yu~Fb z?30V&+b-ZKU%yvYE@nH%ot=x88)mpmeDh{lHWwUAB8>d*{{9~Zq*0Uw=qjUDZ~0MW zNA7Ubl`B^`NrDb5t85RV+dm7Ql8SmH2YpTfI>ZfTZ3Z139T<(f*obe?>FtRBITQIr z@!Ic_z{y0jbhET8(ts;WJ1zAUpqunqQ5cJ!zRj_*F`tt8&eWh~cDxQCIzGf@t^E5L zU4qt7$Rk@~_z-d#&0{Cc!otGoeEQ58T6T6N@0-jm>wUh&?5xI*WIjC*oSmI@C}n#1 zuw#dd=esJ@X3aX&-dxII9@)I0f&J}etibU>(DZz6(^<{Pjq>i*@j73}Zw?`RD$kxh z%i8?Pc*EOuf3fJccI@F$Mf6|=Y`De#qIsZ@C4LRs{eWqqKQ(O=J4{YYBrs`}8UnGz zB*3{0uVO%C!NJ}~aE*Bwklb4ZI?0mZ81&%qY)3LZ9P_XhY|`62Qh;j>Lo|PJSd0n5 zI%)!T`{+&@%?Cd}WuRr(Z{DPKa&qz|dRUt#P&V$N6K zXO6BYl%W~Gry?&l)m5@I+eFD-^n5DX1YhljL_|1NS3=d0Xmn&ActrvPGWs#1fQ&E^ z^Eu`(EG}NZaRbm6H<3=ZjI?z3bgWyJT)fEO)_2L}%KfZYuU_RFw2}eLtLae+|MV$^ zfPd$k*Z@puqgcuyY)+$6`_(ZiatE&8OaP0VwwJofmMhaii!g@WlADv$28Zi&I+22s zg2HfjZ4#4xL>{3IK*oDR&$aXzz%;w2^hZ6G3mIKR^oxsCof<8ru(MM$l- z%cfHLPi^lTj1(^q{aj&%0^<_HAWR)#nL3Z{!dJMN?@e1<+Xyxz422Pt?zw@IJoxzw z1Qw_vNEvuoM%IP%=L3O*0l4?TCpD%}iU-22SAQA#J5W1*sW3E0a)Nf#{`wRy8$7Pt zva@6Fve70={K)*Xg{qe6AGUxnpw+$!B{-L^A~PM7+VW!fLj&T16n|2lB*4*gJFDaH zYUPAk8h8q+aBv=*{t>4Jgk4=- zBUp4jKrd3xP>sX8PKQuDCMG6gHp74zhbbby^?y0CtjK60iTvL}3a|2h(6>3~%H>dn3VirK`vQeqUQ#!$d|#Lfud- zvo(R`EYjB2mL{L*)t#-AeN)G|ZLSpXnKG=UKoD|PO9v%k%6+nDrtNMn1F~e(t-T1` z%n;^y?swc<@nD*}oSd9oKze|DGgt0>*;*P*cX!8uzt&o83qU4Kvm|$He7vjD#pyb; zwkGtCwe|H5C@<{rO6kPS4x0m3tw!w$sM_U$)>au%BV-#el#`>QaX=Z=Nu|RMiOcuq z(lH6C3dw1D4H!DL+ysCYNM~^Ye6^dUpaDXUZVObTU!U^e7l^qm6JQl49Ubluuk0`^*^3YGRp~)A=qobIhOL=u&>FMrHLeaM71-usqIQL2>XY|);t~=;u$6#9!&XXz zG6h^Nh)Sv*B!ugPgcQ&S!X>HB;Ns2~4ZD^ts`BqnTx*WvQYb)ULwjE-LzOeeW@Q2= zMNc+{)Q*~#%yy-RK@CiVx}^vxp#!#*H7syma^C5gnG{efks+2Jul1dTZ=rprIPb0@ zWEX0eez0hX0#X%x$@tX$`L;eeJ39w|`a}a&`pnt0uxI7C?N>gZJauY$CIUJ@35%NP zGzFqA6Q1*~`2swC9tcF=*XK{OP*U(HPJQhkFyd5?p_H%&ECI_L(bL|O;=>Q!od$fX zsDUoIpIrTpOP(V1@v8A~Wd#U^ccB8)P*I7jPq$)c+Ttlu+2w0qUZC;R2O`RIF;?yi ztd9|<`JsxkKS~rL6bA(b0mBP9tjh&jf`${fG&iUD^#Fbmhw#K7sj|39+hOuL9K#H- z?BBcV(}>&xn;lLq4T`PfYRyeE$2-^I2{?MXxc^NNC&@*$e&pkSjST*;m;T>mIqbVf zJb3;FHZ9Ty;}InB>k|u<0cB`&UF8l|AcJdYg+)bWK-X%lu6_#g*BoH9FJHc7)M`Ta z8!WX60;6DHV4$O+gm$S@b*{%6H3J*BWGf6QaI z)CtN*>bGx?)3*o&4rCRQrMrBH9_G93+d`eEee_5b0CepqpyEcbaMcT6g(G5^)pScL zm>kOM*7My`xCCUKP~ta%YoXVtnh|ZVEfyqTXp?k+4MAyxGk{yh5~qP;M7ZGlkLR;Z z6jbvfhtT$Nu@e+UrDSPRggh))Y{x)7PK2t_^dhGo#J%IgWjFR0KhL4$K_>uw761FU zETTtQSXh8#k`I+MAt2x~sy*<&=*0ANGN?eQf^W}qJMVlwI6OpzDZaJ(`5(38-2TC4_>geeuP^eLA z<;5Co!(VM28qx+v#Ys9oJ8RUXlcCB2Qo4q3gGn@cyjUCbCunj$)8XOarC{WMGy?qC z)OGyN%i{>Yt9c;@aub}to^JJ!5x(gxLV2WonfvgHrsSRJziaTtFL&F#W=V zzt3CpdT7v+0(z9MTSIY@L0Mw@E=2o|v>tyKzlLgUmUAB4+xE(iAD3BfoO{n%$ zN(v3)a$qJVClfn66+tvqUmWxG^1_6Lg|Sd^bN3l9f^w_{l8*5&fJ_;+Lc+pCE+s^O zS3L;GO?myjy@Rr|vssJQj_Xtq-Tuz^}C4d{VpK~`2MV8rDy8@gNa`Sa(> zCIGqQH|M%GLH$jKo(%w~9V86jcc!2=!uV%_lqQA&dw?Fak4&8^Z4g;82zgfoI%VAR zHI5<`mO2P+T}y*y;GJoq+5sRX{rUxORiHC`YyD_{8BV;9X8Nn`qB_*;`r%;#>`t?O z-Y!gWEmtIalDn#c_}Qsp zRzV4}Y=POZwtROSy25F@du6nGa%qVPUhfhauPSKGif_+eqCf$3guM|0Ei<0zp*{^G zqZB+W55nWb`1pO4ac^!SEcs1Pq-MbJQ-p;xf7Nr&}SIllb#OH0sG6+#zsj~lZ2A^ z&riR(yp6(L^Cksb6!|#A0IUL71}w0p69DmZ3knz)9+;Eg{m15&eGG8--u?Slqy(lPkBkK*@t=!pp};i*PUg0(i;b7q+%>nvXmN(6qVG+mYr1+um9jL|5C;fKB@m}CUTSKG7EA#miFg!~O=0QKcQ6U?1!CpFHp?fD1YQd-0hmhZ`Nn-5KGI+e?|(sHG9v6EguK1Dq-vFlHan6sd7* zE31c7%+uWfv_Prfq4s)H=JdQ z>#cdU*8|`W%p))p1QDCP4I`7@Tw$o^tt_VC2a7nRD`yhkyqOHGa?;3mt}9)lF|EUi z5$Y3IIf}>o!^dFEyH?MGrb7qXeY&WS&^wA*F!@4(XVNLAe1-yru!+5?NV8yvW;6$w zdM1OVO2DSlRI+0{F5OOI)F_;wwH?v^qffv*j%Wu5Q}`0yuh>o6=+;ncrKDwHncs~x z)88~Gy6Fz2HXV98-la=jU=ehIcN{{e)M)$*gyjO=I(!>2yycY-2c~13q`{eP=^*aq zagm}@@T&wOqXjA_+|$p>)cz1OgfytE>U_}rC{WO!kgomX#}B0SB_=1Qi~5rxr8RKE zW$YvM#`drq8q7;%(S3i5+Xb3<#r{&6gBLl?t3M$W_sFlRtc2IrlkeSklb8Gzo2$x- z$3ubh?JaCxkc1LMd~;(A^i+@YBy-R8XxE_T z=g$<_pU`{?<`7X6Ty>L>kqYZs40ID4Xb_;bJqFF78vsZ?)I1U^11od$--z~MKJra- zUsqT6IuVgkmoiK&;9;Y0?kCn(SKAb1_!2>qnFCYK5fH0lskIT(1~HxaMheJ^^ygjs z0N~4d=J(x-)!N&RYYo(sV`G@An-^$K2OA=_D@!*=Z$@>8rm|ZpgX$U_@d!A zsETahE*F>%s)Kj}&gP(&?{%CN9MznA^RbKl5_SF(t^ARj2g$KZ>gPZ-Dxu(OD%paz z*&kv!MDvHx(f3;2j^d#Vfg~plH1#)tCy;0EqL3s8p!m+*mlC_XyGGCfkViO&or9*a zxHOVf61J4+&*wh+`y+u2(2#f7E`d&B!NTHZ+^REZ+H<_W{Bh643L_nBi~V@bK+nJ+ znL5V)30Nd;AfMjD#q}(^#R#P!1bPk3N7{=Tuj8fTOB#h@$ubgJW#UvpdO2d=Hzg*U zhC@ipi`PxJhVD$iKKLSptYq`(;NY3aEtx2D!G?w#C=_Dt05aOBzwe&{dV`n0KQ#b} z;ymykxdYLxs8#_T`&FFc-1TYZldujSEjMhl^-VpBI+Ke-O&c z_m&bx%3}+Wssc8M%xIO{%Ymi{x26W2654`NN0O9pVSYXv{Ej3jgB_qPAsEwhUgBl;2quENIqnNstyT;Y8pAzBzMMMi7A}FJ8O|#$dke z&t_8qE&`YXVWY6#S4<1$IE1+nKZxdakcaX!fg`P2((Cl!Am=x!Pm+Z&;@`E@kmMbL zoPpXJ<%5DZ^E>Wot@JP$gtHJQLHzbVX%(0u( zgM+gM=16X8QK4$|(DP}HA@ivsz7crm&IM$ee0QdSQ~!pqO^9-ifb~YE2N_7%w9PsF zoV>i6@C|_JG*BeFq=#WSG&D7(|9&AYCDrxg{W{^59PR7$N$Db&>~?p819~+jIXHyP zaMyhG^woo-qOv}GctpxgnEv6M)9x-`WERk}=vVQdhi7&9?D8y^4jDU^ek1_mmhSCf*H(W5^cxZPX}v>h8% zCL2p`%s6hJB#*sn{QGl;A8A=aqC^$8XjmMSO43;hb(?3YR*dHXg6xgAN)(pz1VSZgr4N~%yKMo`QHW!x~ zMiIay32GRu*a7A6*H1n18#~s$=oHP%bhnj)J5xqeyV41ec}9BqH&O$Io28tne0`vqV4g=5s<2Hb#2SGJRBc&l=1N4M2P+TB=mkpqB4#W>Eh`#Xq<{dWh zYmn!_?@C!6>Asww!_v^&nsHxri_n$^$LoPN}qMF=p2>kxzj(1wn)NW*P} z)1ZX}p$-r%fufH132irl-+@Gt3X2@7xh#bBpes(_Zeh1wP({c&;Ksx&5}<-0ju%Qj zPv4h>gd}507=yr0kdqtj$%u*Rz)OTQR2mEf;=OcLD5l5?QU%f0ouV=PBVXd&LD4B^ zd^$KdKol4-4DuHc0m46-0j!)&!_v^c<0 zM3A_8&Wrbmivdbn#abi1da-#NlrcoiaoHZUn;R@EqM!x73QjO2_NtgszzWI`!T>gA zI@Aqyn9U*AeUo%{+oge2pqk@*0RaIgv#kik{wA0Qp1@FaW~e;`Z1&4g0=7C3AD;x6 zVW&+9c_9r0lkoZToyEa2709z;SoJviZ_00MpUvx4o}Hy_tgkQ5WW9+)rrFk3MYr(n zG3rM8)_+4sH&ro3(7csfr+fj<855U%LFZrw17jF~#KQ43Jj>Eeyhm6u`j| zDGp3KNI1`9vsGZJt`fsy6Ncu|4mps_rI%1tYKdWIa=4OlTc@jk7-HoZ8UEY6 z-JSD_iop2&tZhGf1_?1E5jjZ7BC(ShB$WlmXcm!)!${Sa2%F;@Y7C(oerMcY-H`C` zdtVhlA5?aXrAKk!I5K@5f<8w;paS#`(omF$pbr)XCgH<}54>8CHj?Apn~7I8!Sefm z_z(aV(drI_w+Kl|GeOK$b4jt!gvFEwBA1Bewj;I$Tjk~!KZwO*)9@W39dw-SBip?+ zY&uwK1j-n<-BJ{V(ddu&$T-No83nAa?D~o#%%h zYXfMR{QUe#x_98_3tc<)keBrhun!>CHJFN_ygjhG8SA=dgoHSt_+b3~{gG+|F*?xB zxOjLBgw30AReBSh)*9>T>e2?@mX+-@N)Qt=Yab*XVq2!iFxz{}FxCpNoC_eu0ZGco z5H7EH^7QGtvr8dpNQMB~)B%HlNwV(3XU_8{{D<@TH@gXO+TEwhMicb~mUgi;%-Q}> z9Yo>&+p#w32>^6`VrHlE%^Q8g{=$dK zIY+Ca?}#~L(#L9sRZ1*lK@Cs>X^OG>h z)y}jIg*!s@Eq-yYuN=WvVgP7yjm1e%0PrKph-z)Rx!E)Hd0q zQedPYlc}};=IDq=1XAglU7OU>KW9A2{pO})W3jCQc3nwQ$?VU6kc+s<%cpq|n5Afy z?Lm_E=1W~&c~5+akZ_~Ju4xd(Iel-n$vSOssdS~0&Gl{aBqkdi4HJiTrFEUOnVU#H zgxJVz`{hFz-?Nw0l~$N9yW{%xE;!5!?%oO`hdgPpr>CcWOH?XEiV^>=0~WFG5wy${ z09wRwmB5ec>H^D2aU_vv><27(9@&c!QTqa^e8h|etkT8UwB45WqJwD*y>!8e2e;Zp=VLaH_k$zQ`B1gVy_7V#61 z7&g?^Y#8G3X8m|G5QvbH$`9dNutDbYTKV(T*Fl+Zgk7ctw)W;?zY2twYoQzcQ(v#0 zJk>O_SQI%o>dCh;<}K(rafLin$4!17dz|_8D-9#uYQbiH5B$E|2!X1%946eE(LBd2 zS*^eFY1lT@&YZSSvlw54jNW5-Qv1wuXM+wY&t9tdb-S*#$wV%z7|>wy@kvXcU9bCa z7|Pw^dm^(1DeOHNhLKp!2rh)YXX z@h}s*<9bAD@P#*PV@!iDvp2lj3XRmL;HfNxB?pPYFNnZ?=gwoOJRL~LW23*f7r`Lh zaP0zYUv>zsRBR79DO>Sw_2?pL0>pYfbLNZ@6aa|+eu5@$T59W0#>eKcria)n?8cq4 zAlVR-k(q9|K@&r?m{O2%+}zxd_!AKkXZBOgMDgp8JCy@YCf5|oh-?^;h^B9?gCTAV z01FA#E9n5Q0Gyc1baFqOn>Sm${G?f9JUw;V zKe5~{aM@P_8dB3!a{J1aWOw)DD%)qzh|;+zXt}vj@Wl2?7rDMF0r3krJ&1G}LNg}T z8iH8X*2f=^;@J5$=%s_OA=mTzb))#2_P+1ij0CeT&tXi1p2nSdh+t|$5IxtptZ-@x zvD|?@4S&_aAQC&j%bqG982^oo*d@5e0?sT99Sdaz!bVn2Tv?o;eM6BQNz%XP5FK4io@xAP=5l?dCci)Q!SI35?1lmr-U!>;#X6E%l{07yjqC7dHhnbv1r z7k4!4ehlYun>WAOl1EPGk8op$27HqPSEJko5(X_;98`d&9IG4Os{VrKZ+y+I*}*MQ zAHjOJsAU>@>d8dI!J&3^Mm);`F@Owp+27W49Y!F57>Yp_^= z-S`q0Fb(IFAMNQH{~n=-+n{=DyO#JxMJ<4|at6w15k%9ZDyL7mm$L#{&eePS1ONVT z}pYuI1uhm5fB0L7qFFUz|?I1yk^x^zU!=% zrYJ8F<}u-bfBSY&D8u=-rNL>!%MY}wJr2|S`HcgYRiUmJb|l3B?Z6;StFNG{6PD-X zxWc_*E8q|V=cz7S|15VJxj><-O9_NLOA8BHAfrHaPvzv~z_l*#w4K{fA#@=O3+8yu zM~8Cil>-T!!%?7j?A)VV`78$6EU-S6a$X2S5R}mNQL*R1LWN+U__;lCp3wFd4&LhqJq)B_z;S_8t}^1nJTow;!*wl=|0_<=JODm_bhK%`GNNNV z*thoBm7R;7{psjvIB03=fT7%<=%LXP@&u1x|H;yVg_H(yDRD7#?AGEj5G}iC2x37e z4USo&b#puZfe((sfagCiE(>~wQoKlXful`s;j53b>gpoTJ*`zB$BP~;ttxow9j#ut zkOk(-jlaxO=;I&L{0s#CQUUB@5(>~&pn`ZRWkzH=J4e0bxEbWze5g=(_hHAEi3w|A zA&QxuRmsF;r?i(%ONjjT+!J14NrB3{<^}D-9rpuJr2f&#CdS6(dq!cN?)Wolm!|;5 zn*AMDWxczmmYAd+Vl8kO@{=O3S1wUPC7{ZU5wf67&CQu#-=4%FygR`gpaUNMWrXEa z?u=ak*G^nsnKU0<_7t1>ZcGBiQ;mnp9h9-BadFWI3||Lma=2Y}+y$qG=qBJnBhBGu zV=&8~6ahq1yS=W{BLQ593L1gg4%dBg)Cvg+8G`T$>6y1t(a~LS-525z*LY33Jmosh z0ZFM?Ku=%)hV41KDBnvVD>yhs{)oAE^%B7c5J`=HygTm*Z!-QeN0rTNh?j4FArH*i zD#dt_ODF^quz@W!PMp{KioFiG90(u>@Ht6PKM?{8J1qsiy`_s}-5_*>T+IbGyF#{h zMJMF)7}fK|Fu{Mb294n1AXx+OqBh68nHynGkUOt@*RrQXwjc9dBDktdtw0im7y#k9w_7y?_zUc!~T~<3Le@XwR~cE3fa(7B)#qAw9i}9lB@>D0Xl}O z5VD)=CJ8`2-#46jBW&zstc@}hWhj{n zMKnpXW~7-4&9f;);;KYxAeskhp3x>snoDy@rP8EH^ZWZ>+4sGl_j#UoecxK&`qsPN z@4MFX+{>oU>l}{rIR5|NbQrDNcFGxT^x6K-x(s#jqIircMaomk0`wf`8P7n8z(kb~ z&{rOFJZi%rC}daZfV(nODqjoP1}Il3q8b+H9G8$Ft4$dJrTADE$~|qIwgm7MxEMl9 zASD?At=-(+&A&NfzZlf7H2e7Nz94Fv-s^&9EQ-DhL>Ou;sF?~b96Su3>yH&HHcNm; z^F$r3

    }6?bog@6Tz0MuO@@5D;1Ak;)G8ilWWJ#i*_o_tPc%L&QG0cfW{;7A85~zsSjqkMoVit`jB#0bRaym|AAJvS>{T%(RA5S@TzjytC}7aTsMQ^p*u+yv1KW-Z-2 z(EBB}LmE>7k}!(I2h9)Hr*(@%9}oL!B*)Zuyt;Z9=e-3u7CP~iK|f(TW$^7ZcX5TG z8+;iTS3>%N?YI&pP+@X8N&nUlxNRrNG`cv#!gQoT+$pWI#sJ2mus!$4)bUx~ulgl} z*<=k*jxyNP=8ldCSg>epgMuu@C<@1;GJ@rmBtMWtLKi%jsx~aOkQjSZo_oMW-5%^7 zx6$o^Xn2ZpU5X^3Mvc{*>&x#5ZAp` z?`78g{^!hTYenT2&vmVre67Z_ZWH_4QxR+fh4YStoheGx4wL_;V%&4(Wc;aVmxDE~ zOkXGdnyZF?$#$-3qPw{6-RlpMY!3;cWspFe+2*bcNbf}k5^lX)eaMoI#px(HmnUi^LY z#m&H<&|wVhEr8F71c@DBCkIPEJ=&SGlLO-o1Hc#>Q7~HsZVT#tTuvg~1(v^rcFymv ztVn;s<>*Un!M{(AN?UxKk1YP%b^d?KAFm!PAO2el@PFLJ{qKB1Be$}~n)%TpKBzVE zt~F7CZ%sK`qiuzdi~=+ODwxKJ`GFJ%ta64{PH1GLA}r4U%c%9nSPu;ieIF70?Ac+M z-Wm9PNPyr}3i{yBW4?bs zM|v)j#CIh(Eo^RXmSB(}8G;1^R1{S&b#FtE91aplNm<$UZZCC+BxeS?^z!9P#S!$Uq@@s*NXBWCnNz1zcyoEM zp--mC^vuOb&%(UX|5?YK3KIrbNJ$v1s4xi_K+be=uOBJANvO21J6(YR zw>h6hSB)xpA|Z1k86X@?hL~Le9C&jX0xwGKOsq!Zd73N>SXENT2dkBE;y9*6F__MN zP^Ilaoq({Xgx2Nd=6*HX{ndQ0Zc=qeW7pJ43hbv@YNz%13DC`?Lv(eW_sbv+_hl*E zWBUac-VlQ!sR#ruw*)*U;nC59;UJAXu&#E7RYF7q9$L6Dnu|DxY15|Boec>_8RKuJ z!ho+`QCYd=k&OK=K5r>qU0p5CsV{z2zqn`Q{^Q51frsSj#kE1BTuLP!F!DEVL?wRA z)65zjPK(8#!3x5A`XgNs&KIpFH0+?(euVF-w#i(z&l_^C4~=HlA}X2|N}Bw?j%{H6 zoAvlHQ~_j-B5eqPI}f+(!~@FLPO^|gW5*Lx(l%@lKSid=)O5|#vuC>20X&_j3)k!o z1-Avb`~f-nsVPQL#d!Ag>AIK^{7=D2h&aQ;!xh!kZ0me5xySVS_^kBu^t3K}jBQKY z{BGy#dDNN=jZ9rA%fwyh3ip&+lN1d;l565vggEF&Mn+1jC!UkT`@uzO6L8Uk;guP7 zN#MDK1;fI^z&I#bS|*0*(Q=zs+g=jl9$qcPu^LydvnZv2m z1nxlD)?Th|s)SKu0gWf2fWWjXFk*C*nV9YmzKmbDH(cdXm zL9dzic)JSjFJ8O~=)NJuXuCp#&tG z4!vS{Xk;pc9>P0cudi}^N*c-%dDFQ<7Q&nk!1Y8IU^IdNj06kS@j%_=K9_LsUrWP7 zLks`9wNyz>EgW3GF~&GlGXtxeWSvGlpc4^*h!*z|izTU#v|4Sz$q51j2Q`VijtlKH<6+bC~HFB-zNA!znP&CFJJE1vwGnkzvJaiQ!As}>_>CjT?PNv zOuu^i+yB9TykcKVgEX>0z*tEwRf$g}_FUrfBjSS(PR|@kg_MpZuxNb)?#ru1@*3%C zc7r18y(0?a^7U?)2;M4TTk6r0{Ruzh{LY;zi8TA*dRv8eqfjkxjTe`9#IZdoZ9IHh zok8?7ERzRc!O!L_b;c*5DsE_nL`$VOw}jo`Cr`t2Tem-!Eo+CvbfErE{A9zNlVm_( z@%~yZXf?k;;dE~E-lq)4R-j|Y$OnS%&eP8?$~Y!N8MD!Xa$fvw;YsF_*uY5Ec-y+B zpdhBWFV5BC>-(*+m3U%$BKH(&sA5dfc{`F0Vahvj&ZNzoztKS$3_Wf>DvO#NSz@8^4c)uaa z!?U`xTtC1eSg6igOi8JJb{3{6FBE^I4uO1)7i|kzz5~1`#_pGS)l^j?O?qW}}`OUk{0VBZMKi@q?q9KAd|n&vtrL5EyZqk*MUk^!Ev z;5P@j+d{z+j%1y{W1fAm<#Ot}hU?tDh(~J3#Y5-WTFc`dadMaXoptN&^0rMc2pvV} zf|svv1WMzfr|z2S>O?%+hQ)Gn%>v>Y3$dIYN1-Yn@!O2;vp9T_#EDFa+$^N$kcP#4Q2c1a&Pc-+b}t zK#*${#W?_%4u=5o7_j^Mc>`|Kr}OB>NvN3Rwd(rF%eX0OuGy4*Q`vV{1wiV|_Ns)4 z81)$}uUg;lKcO-cWjKc=1|T2G3S55&+X!UU@7v5J8R+Uh{pOHn-uCpxi*1}%d?2)W z*Ebc+oBKgdQt}ytp%!}N_6y#<_cBk099M#xQYZJrp5PgC)?swd#57$|aef+0gTgha2Po4oqD4fb1JwnEYOnD(*5%s(lD}#C_0&}rmP%n)2DT>)<49qyEF2|i-y^I zOvQG}C>WQoF3sVbWBmEW4KD`cOUDDC4=YeFDBX*pU@jK>*V|YV3`@jG0W~>RFln6_ z0Q?36p=V|$vGNl?a}Km)HfM09)jGaAN7Q3k-rkq=PvH?(yV}iEMh3Iq<_jg2#Omzp z|FBVYCTXcHm@@^7y)2qdc$CS=Ws``@xN>EBOra1juM{v86;vx+ZIIp$`n1tgfhJ`0 zpMN$m>?&h*e3vYpvC<-WbWQd)&&R8SvL=O9&_Am{937*Me&@x^=_Dy>n9iDg0u(_R z)L^x+b^3SmdFSn{9!e{KM3a&%B;?UYmEi`(6egjVxwv~Z`+of+N3PGCchSqI{lFo8 z=ytALv4pA0fqB~Ox18ZsWl27~%U4F&w*Lf1NO~gsvSqf{Gs#UynFdNKDpCxTi>jAl$<~bgm z@!QrT&Y|j)6&Zr6tMg*@AW|0sIB<^fGt4?rJT$= z_UZ;jMA2LTCrPFWEtku_YERZ-T4ymhs}a3&{0loT+tR)(qGC=V6XTP?QR-Q}cUqg- zItHuRb4>!C-@K_hQsk~xF)_{!z9(bZme0|PL_TlLwpMfLjW3Uxlw_b_eU#ebbAWft zchv;bNk*`YdPIA>TETYxk0)b1J#9drb{bU=IyIZ^kGa3TzT|@kpR8N;d4MeLrO~xg zM#W!MExJWyyEBr4UU$)QlXYq~6-cK}%kIA)HdJ39Hfz31n2hhSeE$qNLqk);`b=$v z2^lR|e(%XD({m9C#yRgBUl{haWQT`cFwR8?!ll;jUS28vBOO-9@Ot_jW2{?uF8BTN z;A_`@YySF&;hSr^t~Xz_-P$-}^C`_~axMa7)bqUSNq5~5omN-USKt(h$QxA#_@<*6 zWvgMMLBdQ?)r-b^T`8@cMn&tSg=z{DUw1Esy;cWv8qW5l;*ld>6FDgga(!5->W_^$;i!%;F91~u8DfEwNuMtmwN3RJsj#W=QQR+ms8QMm0r8{a#eD#af0E} z%@XKb%F3hazuiAN68`k5+^RfU*I zQrLmXVFkCwP?_9g?Z{ zDP3Z#+BHMGY!(f#<{lAuX|FPF8tBlT{C2UPfTS$Fhrxzg$*jpQJ-xipm0?ZGHA&L8 zCZogcJ@8b(7+B#Wuvt7dwlUKr2C-;lx197B-f%;_ZH&%T42vow-__0OnUsGo@>1+v3GfkPwLeTN*3ZVE78q`>feLBV$7!Z{_AnLjO)~uExg3mD|r;LkE*?1Pz9O zQR$}2PD^;s2zun<=N}4(j;#V}BGNwMaFkCIjy56SHk~9sD>tJHyzk}p9JVe8NS<>) zepH0;8hJ&L=!|1hLG*uvCdj`4EqasS#D5JMl-*e=C<(Y0zg!C2E(NC`*`jEt7HXU) zVmHt`O8V|PUkvjz;r<|~E9#*%W_j@t7DkC_;ZXxIY-L8q&z)H&d~jdQVy!>;1e{DT z@~S9+j+8Q=&=$^SUEWY>5?6_S%Boyvx8HGcN0Q8I_QKVhBy7>ymZ4{(OCU2Nskory z{TF!928nc>Nm}PF3Q8f|F>7LgpY&3b6GK@D7W6lk+Z2ZDkTVrv9(Zu+~c zSFZfQ#@4LVH*PkRreiN;`41?=`P~+19Q^iahpgFm{DZ)_&Lfxf^dNMdZdm7=I+SrH zTds1i96JGw3zXyl@>=Z9bHef8T2Py6p#Zx;bmoW=x%i+%za*B_ri*hURft0s%{OA` z<9!oN&OdRQ9Ce<(z=%J4n|-Z(#vb!f#Q+CoXpR-jsXq&yk-2C15kO&MggpS3shu_1 zrVeci*>1t9$TG+d6CTb3qSCeub+S!)ryHUiFIoC?srx?`a3P! z74ZxUTETE-zUM_(@`4IQ}Ev;yZ^H?u_ z=LC=-N>(5n0O}{jE#bu`}Ke87bY`NO4;a7ikG$bbXaAMb!g zy~9u#tW)&Ta)l)(DubP&R}ronh;u?=4k8nrEy@JGc3X_pe}Q-W73cA?C7(fSV}RXK6N7@e)b_ho(0bI_!(+Sl8{PNh?GKVZRu{t?W`jn8+ zhIm&D3?3jsM4lpJAVce>vZ`tra?Yf?)BEmf@OcBqBaSoXIUCKY09=UQL@PlL4qB2R z=&5A$F|{F?jf(~|l&WO_-1^bt@oxI|WrJ7Wub5o7#mp07fAClKLfmT>76EbUSG4{W z0oH$$0$m(5RPIRgF!A{lnLJh;#Di4S(DA&BV6`8}iV!gs&%-Im6D1&IT`<0{mNKE+mWs zITgituf2e!6c@__PJmpONO8113K-Wh{CTF-z0-&J)N=W!*FjJ84dOMA)60q8b)4u6 zFs8g)SJ%{UI_GMV(I0|uH0kg0$^6RBEDh<;0^)}+?M#%}a=8R$wsI8&Z=>)u3I!fVJdfA^7)0Q&TB zXA8)bRLJ}+#uM!)3%N;BglvEaRU|88qNB^TCw{O4gFsYKm`z`cNc$i4IjgvtkKv%s zVR`{ao!QI(sy*2B_sPEfaod^1?&JqRXFq<` zT?yzq>aiGHs-n2~yG5o`Z#oML-+k?w=@pt*ek4~U(YjErxkpPuKn#{t?f!{iQpa1^ zHe8-VmJbP!4Wu}3haz9tlFCc^w6+TItBxWsF-&`Mq@pTT=LR~d)640bu+9=R36>`U zU?(UeG{|8zS71?S$2-sTcA^HxU4Z6BxaZXj%JTsv(AbgpLw(Ecsgq=~-d^=H(~FaK zUZC_h6>SG4hczW@f%WP0`@b`f z`|Bay_Ky7Z>fkS!{U-hE|I_QtC?{T2tPLn;hAeoQ-;XL@ZcL=17L~5!SQ96DV-zIH zxDi7u`L}L`VW&v|Y7@M#xkoi8%>J8}XZwH2pbC0;S{V2Hq91J1tkRqg#+x1rp{78-f>M&Cj25ayA$2XeBPT& z1Tu^OqAMvXJ|jmm1kai7d&e6=lTyMtdW6FW>p*i|4xm*@POdTRk+5ANO^)k;4JjGbrGrb4K;Gd@Axy9vepX3QWME)`IV2tXlRU=5&; zd^{*#QA0_P*9DnO!Lk8blS04VAcMoKeOXIo4)o%+ZHFvN1wITCg~KhZPV%S=7vdxw z_x`N~h&3`c&M>OC>lUuHsL&j#EN~3AsB2YYnL<3gE-4QY|8YU~)@f4fCRI zi`Fzu#AM1e$r`sr02QRG$_%EaZ1}4OWsjf*;rs0L50KtYxR#swbevs|&_q+cBHal? z2+IjIW>k5C@!qT7DI-+NB{716YgKrLZL9fSZV7TSKEvA^{^G?6NS=R`?q0o+(kwwJ zKj4B%E+RFxDk2zD52lTT5WWAt0kgrfOv)Ra6%_8Ds$%k*ra3C!pYZdR7EsDpE-NeW$P+z)q zX_Fua%$7)8iSdc^YaMkMOZq3d>o)~CV~RL8wyQxHabn;vRxivsQZ{GStPh=*6_->N ztVd2E{AYMF_hZyk3~*&$C2jro6pyT(^b1w^`M7>|Iv8y#*OipYW*H+5uSM0VynTbL ze^yPORIeh~$FroZ6gDyJ4zLy(rSe!09)Nw5b^Nh3 z1F^fACZmiME*Hu>Nz90iBY4}Y?S53(PbkxE_?u}4oebpJc>e&VQ`_&cIh4l#580KP z+7n1pQ0J6G4*E-#Wq^o_d5abem9E}vevBjrSdPlzo~MjL%FTx3`k$SfYV_2#2&|-z z2dfizSbDk!1aswcIPJ~KS^Cq|cOq7sEIE+G8Gl=LVc~yVy{fraa&3m)R_ehPIXvmE z%uy2(6oBX=3#F2Z=JSB@@A@>kfM6H?SJA7oI?Mm{{Ejb4Q{v6Q?dt%u4G*yXUHiP) z!G!l|=)MU3Q(LIP7`dWMmKEe2D$vl>)RD&tE~mdGRA?E$>Y5tjEDbeddmF~HIVS=! ztU;qA_4!Hj&AES*U^Nv5uQwwz=hKQ)1Up%bf!b?GWw3&KdPNo0Ld>U!kKmp z!2L@h&9_K09*Y!G$Wrrmg=UV*iIpyUYpbX!oC!jrA$FL6T&#+(~z;(&-#gSwHb57r5Hr-Q^p%uMa0DhqM_JJvmc&$Dh$%_UGW>C zYu=06Y=#!yA!lB%dcLB2sCq#Do?NuQ$Jxlp$Q&NHpQ%`+3y-Z34~&+09F2$Mu4Sg8cbBK~&an4cNXfM6nv;RsQP zQ&DK8(VF{KysNx=mM+cB{q#s%#3PhojuOStOF>*km?v!+fl|7)CTANf0l^E()_n?s zzz7T7@el>ewAzYJDnX&oFfORmPuEJ;i+kJQ^OvFPEo|~YTVxyTwRtzUpcly5=N^20p_hDm!1y)aRPRVC~O=vTwPshkh8RCihYO-TV~4t<0&_C`sv6i{FgQ+ z|3PzQ@(T<)9@0qt%>VG=eqJ+!3o~TboyttqNU2Y~tvB)Wt2jDlqWA1%&$1R`6$4p| z-Wjl4^3%y`Jm0*lgdHSJv=P(=2v|_w{xLqsp9?nYdk$m)lofXph$P9#p@ip z@t;IJA17MefeLLqyoo=E7Ss+vsxXL8?bzFY) zMMFsQw01fmvNsIROOkSzjkHmKE=4S1%qwYU#Gd4urx;?{Rk?N>kcYV=}a&ny+~`hX2n=2-8STLg{x%pB*}P0Chaw;JJ=*=p}&lK>Y_o z1Ib>;_0tQZ&=vWQ4}Gs(pOzsC9ChHel4j*ztHh2VcM%W6I__+PG2_Lk-mt>1YZ!NY zVV8NHUNU=XI1WKJ3$(=lJR-A{O-!OIQZvcIkE`dBAmJ+|Bmv&lLMLTZEGW`Q0uuCi}FDESnWlEtYZMM-DMazEWYQZFb zs7d;EvCW$=jMPuAk&kiEHWU?|&Yi+MM#F(=-4JfE!GiwwHv1@(d9jy814gD7WKZ~S zx8(j<2LdQeQi>NF^c>Sp`f_1b4Xu?LYsWS;Xo4Alk;1+f4~zNH*flNFg#Pq%ZH%^}KvtNAe%W*6mbQQw!^DnhaaE6>1d`sTp(l3I{u{`}eNcS)%o^DXpS8 zu<`nJ;fS;@wJjlW#XB=ky|x5`Z?fWD$&NcA36A3`jAt7IK9&krjH#YJT@dat>W#D_ zH6@h_{|n!R>T9qZOsXu*>07zyhp^xNwjb>d|An}~(Uic*m26p$DBREa9kx{I94U(# zG0J<;Ta`Zi;@w?Mq-sVNZ%xvO3YajD^%0m`oa+_z)$Fr?lVhSu=J0~f%Dxv&J;7in zZ&CeZrdZyCaSdHvKDSjvvcmm^H*7~c8+~>(+jiF2NaL?FCPvmUzE<+DdlP);&S}YG zHxXBOe}nYN;G4hs`ddE@2uT_rl{IK9u2st%GlB0#&8l|5-`{CM2Q)u6KTwSmDONXa zhVJ=^r1TxE+c&UgO`f>D>~w0QOX32%^;p|ZNifIvi}jNv#duv7_t6;lGmj zMOO*$RVCR`T!AE?iW@8y|GhlH`L-w%!jY0Xez$jIkBEpUBnDNP87H7WaJ}o_Dd;$2 z?l#!X-#b>5nve|$Q{KpkH>Eb%vRlMbJap8dJJUB}&n1yE$WcIlL$#%DnU)_B40>KR zdGx$#BM)Enz5dRRjfnBK$lGda+o_V2^mr?dY;T`j9>Zz(P6TA{fp3p}g`A?~f+n7X1Y`nYTZ2In zZy*;v(Q_kzvdnjgm;Zm#HgvLWlVaqzILP40uTp+0y+VTs8Ot(_;>=*fC1l$;`97iI zUBrtQ8ix)|GpgS8*|a;1jd$?d#sh7US{X~YB*3u&$PCl6?_EZ^ncLct#hO+Yy;}+j z6VE?Wj;V{OO>>9i8HI@qWH8WGK=Q6J(B&71qZoZ)Xj-(>7~iZAT@mCS{h<1MxYK0$ z#l4zU$=kIp(`0nsJ<}Mp!zDYv%ZZs@2dn@^`KJn+9|NZ?cY%2~T|H|!U#-@ve$HOo zcv0wKR&EP)JEP-k+rHQQW^qrWpLzB9`AYH^)eslp*77MMf2YX*JsAXt{{KP-!JNhf zF1i@{v|P`Np$5W{&Y<6FCNn_dxCy?SZ=gA%>B$jD!n3_YSqR(Wd5rvc>}z z&&Q1Qu_8)CEUmeT|Q)PFV*Q%!_v@ zEO^5qpk|pSge$4AFuPKX*sf%qYgewusEEJg=&Zb?k&s}bo%D5Q&Rsv0ziIt%*%#Jc z$k~mI)KRLySv01B60x~7YfH%gT>U!RnllCQ51*_*nz&gYUQtDRO=wTgDZHyAsR_2N zmcC$6iiGNuajoI^?nPjr98f_8PRdP|fouOzoH{!JiGBO_E$WSuCt{=KBj%5cj8;zO zRX|Z_V37Ru=@&20(j#m3nx8-g8&i#&GeC?KafXH4cAfhiNL~;~m&p)DK?!i%*}OwZ z6oI$ex|4(skZRaCMn^`LlAWJoOaJBnQbKDNf_nHcSi=|4q6RxVv$!qaE=sn2RF=Ym z$oZgvBZAIB$`TYoX!42QC!rQ{j@!v9h8BEsxNdtPbp*K0tmV+y05JwnkcI$vuS?~u z5J`Z_?6pS}?wXih3c3e|TY^L%KqJqg!d$>9QWK%~f7KV$Gx<5K?`LTE=wws(qb)Pm za*2s5pH*1$+bGXWxx?}^_`Dvd$%TJg^jx<$f-T%)+T!@GRaXi}qOL4T3QtI$&NEMW z$+F6ozy01Y-(~9xi5+uapJjZksps50L(KA}^adMYPWSz%y7mm!75K4={qVn3Pz1pZ z$j)?^j8k-dm>AejxwLMKc=FQ(S`abQ0+{nZW`ALc5Sek)q`Kla#z@+5txo0S-*i4+4lt z<%oR<*v6(zhz}w0Ky3*2NZ=^hi)6Zpz`%nf-hH_X3K%>N_g@x}z=ZV;*Ps1pTS4p) zMPVb{6|ze07>Ks>NL~zJo3?_AC~J?^hCT=XS>r&~ovQKiaS(kiMXfbvLm#()idSm> zurYwbWk(~(a+r3Cc`+=3vrZ}T9%CRCN54bs z0xAM@mM0eicacgvUsKwIxOP2pe*zKQap8R=VeznuT;AQ z_sWogh6FmIdlU!(DK?PMw%8nw5=fb;(j`I+ZetZFeBoc&B0;&XXx*8pCx{jF#i^jS zu%B%xhSD(xhLwOx&2FL_D0?12I`~-HC63TA#xv0HYUpXoNrwcNia1CS+pqVJ3cv-5 zoTy-@GgBwW!l?&ftjBV(fjus%1mX&wa{(YG9`I>~BO8qNHzBSEso$W8qd-j9Zn>!p z4=}Qhq0OxK0(}dy5k>R6hp|D4MCafDoe}m2q0lk1exakY3PAXV9DI5e7_bC9P)3TZ z@POyoxbdWo7+6%`E?xlv1?E^8@CkfN-T303HyeBPrq}?rbz~^J^e;Q9`#KURF+ZID zmUf7^GS?vbYx_U`Malo%^e-f`XKFE{A7}`gk~rdzua5rP`S}0M1CM2pmf_VfYxd?e zhuaX3Zh3G_H7fh;j$xZL^xBwmEa`3?j5`w-CHHP(*2Uc~YpSV@hFod`IJJi_04Y=rqDeSeuJ053CH zEwSSZsOoFXxOKHPG*Sw;oZNE1EK%D=ci)=*24!=)**77G6h1@r#7fX&acve5P(&I| zh4Zu-HQHb!D5l)^sXcvX&peOU*DQJt;e_!1DghJ%^Oml;kXcA7tdftumwi7fx3y95 z! z14i~s{z4YD4Zi2yiY@cUx`Qq`9p1c1XLLaG>HGI*(WbZE-Pcu!`1(lfQ)UEJ0!Pj; z0=g1F9?g4giua8W|8&uBzW46^dHZegOcjDh72T$)k$}H^*RaHE;F;-u*KUYy@Oir= z=x1_@>m6xJQ>^r4-$9PdDhi|%y!&2|RqO!ePZbVMb2*uz~5Jqx<;HT@f zXnFnfh2H9mr=4VaKl`-D+a;SLEFMa4$P(XE0k{E}ZOh`3;OEaNWR?NeE_7ay15&TT zumz%cSV$~XCsqVKE zyBW_Qf+ea|x`8<3go5Q5N3M{@yd}K^VuyKrtg9}sd z2PVc+4o9~T|HqwgSO6U^1p+rM9>E@QQUF95=0!)?m40);)`M#gWW8JAps@<%27*$H z(E7_;TVF1m~y5xn;RFB#XJ^0Yv9;|NiC=77m=j!KZj7sPJ z^J*^10oS~9=MHX%?Bm@C9iBIjHYpGmt%p!S=)q3sQLu4Up*lRSef4C91NeAE(=V|sBZ zuZ`Y+`h>RJ{ackWy0pE5pD#EZQhg-FtNiRkvm_d^{C>+lIA#Lfp&vt*IC++>a)^8Y z%nH50*E(ecBEeK|zI!D?=swi-tbl>4357Hirc z4V4(6LqVYPLxV8pLikp_{wJBfu|n}nV7o7|>xD^(&NeCub{k!8W0NCjZMJVAD~8~o zEE0zgDVlj`D_lAq`;&KzG}g{KKAbI!fdI3M%BOv2fMJ}#%u||?zl~K_PtW#RW`NT~ z3YJQ)>}`}1isk(q&^Be@U6N9_bz^@j+4=LvXhdJ05j0RN)wFVyk^WR>RakQJ=W1OX zn#Ik9R=rn8@fuOWHg0AaztgbP&>%_c$3qI!^***G;c zVJ{0574P@Q;ZO&8OZTeO;1ABedAi>wMziEkelBsn>v+7cHRe)MW#`+}zE84$EbfgI z74>tbE_0D3UiAwwJn>WsK&*U^92% zd&)`vtn{L$v84J;`K24uLt6c%!CW%{^N#c+aIw#gOCt2>8n~ z_}MdAmTGZh)zB>(SoSQ_OnG}zdbE)y1CI(j15pq_k;!rw@OB|6-e|{dl1XGaWgQKG zk(xAa;PRlvEk~&ZVPa>|Mj;^;V8qJM37{sXL@wMbcM(h!sh~MPa6N<665NFo1PQ85 z8o*;ii(J|EVS{w%UFTC33ikKSN4kcVwu8k9hIx}4=XGD(gyEkPKqe_3UQXq;j9ULBBn#&U8{eZnzHdKho7fY z31$C%d?2O*_5rPkIhuK2wnB!^=aM3FjW8Fq7I{A;wWYPP=+ zeO3KLY}HmRdpBrdLOY^wR{*Yp;!}+A?Bhp!(A^7x&$^|K{fJKe%Gj3wXs3LTxJ41} z7)5^-`fQ(L%DbJScsLJa7ViSihOH;s?jPkS0;BM!1O;lMdwq^9VI#z!fPtuhu-}Rr zyVUk@xPwUUj|w~(2Q!pdU@MNGJa;>MG&!SUWRtgW*T%yt$X>Va<{D6A`+K*z| z^cH#urq&I)u|QCKTjt{7nT(GfwcUUBmLb1yXS`+CM_31Ly~z&fHQ?vrDS3T0r7K6M z?(g`l(!Pb<;%>8lTE=dgk@(+&}tu!iHkV zvGxV1qQ1s$c*tr()3rA7M%X{`yd+k!)4d=bUEpS#>3ZFbv(V4HaR)PrCP)(SDFrf7u?}11Krh2Jl{2%cIVTh zQ^V7^46|LN-Bwp(({k2JLkFz4#T>U_UHQlQkdk}(mTKPGbpvnssQ5K_^6)CVNaH`d z;5t6Y=$G+tZac%h!Lt0?-0rqK{zdIQr_I_}1H77MACxYX(xv{n6XMcCb+Kh5y6$R^b$%5yrzAHA`# z8EzOIq{KOO^cCz}IhINjhBnadBS*apE_-8Mj1}Iuuex^G-(B>e(J1^6?t^5IX=$HaQ^Q z-FZ^xmnd(Ve&MP~T2z)^!Gyf99Ut8wDF2$;i@DT`YK=hH7A- zt5%)%5qDu-u})$Hn|2GL!KNLsP=1rvj(B{qAa8{Im@ZjbA3%R0q$;dT5L*^(LR*0Q zg8tv|TgY!LECG7;h5rcHP zu=SIWxfm4@5=FwHd85rmF&lYtX<}L@7|I073QBV#yV831{ZEn5T)wx4sug@r+;vX! zf|i_<`lO*I`X+{eZtfq{sZihy>8v5c_y8;fkR9o(s^a&gi4LNErOiXZXy-PXZ9*DB zOy)>T}I=?0kj;)?k7cXudN*Z+s~lJ5p3Wr z`^6IH6yACsnD)}{^CV_O1C6RH-jz$#kP>+qi{Olty!}Z zdCT(9HHHglEJ$9#-8Rj0gNlYm zu-mG*vgdgRLEF||Gyfnt7ppw0kFPm+6}F9-FpoDN;A>ykA>~ z4Y@09epRExc4_ph0{#)vsW31PR7@7SEJ*XZ_j@Rxrf6BPTh>QC5AO)$;R4c5C+&pbDdu7VO|jv|8?sKg6AMOoR{&!C7hg@9@YZ(2-0U-*&Wyaw)NQfCu7JHmLVh}9ta$0d$FK1yS%Kv{)<-KTa%?<&rTCiE=edBxO=Dr>u zPhaD*rukCl4X+N-rcH1Tpct0Jd2`X$pJXM0msb!Q#1OuOVnW82X+v1KkUIJ!<+%JM z9v@_TFZ6xdzc)*XAu!^)G5)le>pOSO7_zQV0|#HJCv=izuEotjU01wRcK;Iq)L_#T zDf=3=We}DJ!ll2&X)v!KW%=v*0e>M(Q*FuA^XxfkmVf4!oPCYP5%CRD3_#VC0)`Y& zau1dx=d9}jD++piAIWOTCy1IJ_la8qmI2zMpmx2(oCPZZoxBQ8J4oNbZ1I1=PY0!R zmLIR|R0q?1Hui9?(V7h&A7VtaFyBjJH%2OxjrQxomy7MBzb&+P`q?-Kbw744HNgHN zU50C*W<-TuwwyT-1Mkv&F*ChKBE53j!CEMH4ZvK{T?K1F+!pSu1cNX0=Nb1`NuVr# z^hGS+7O>|Nzz;9~OsPG4a+=K^>#h8azh`I>_VZq2-uqU#EJT(Qq1{E*WT*+8b`Sor z->e&VK{rF{dyZ;bz)C>KB^i(_Ln9Mjp=BpynWpKjY59oI@8sm&R+H2{`U|Vm)~l!t zQOyn@9K`kxE23u0XvGB=qKG|3$WR5X7Q{;pY8AOa&jjvZ$S2RJhu@iGa40;f`-CHb zMg^rdQaU9U3H2hBGa`zMgIwLV%7q+XmSEV#@6k54=UUNcNhv?@*xz1F^Olr+QyNwM z98jS$Vo}~P(V;+&sT*eIiw=Tpq10S-oyT@zU5gJ9L*sA%Ln7*AtSIoU3Pg`!%mYv*P%b&(yLmngQu<)qas<0HHWcwARcZ@;H6dJH!`IBhCQ~)RubvWK4 zly#qrHUNR;0lAcAa01enuvEMu_^b%<47UWN+U0^38gLZ5!(Nf7obUrYf=mb6TDA0_ zatl`JRR~t}pZd#WC*0$kGlpAE542rMi_V&`HT4FP?L41Q)*V=a1^7pYx(Q{Vp(o?N zUzG_Z0;z@BO$r!8S0-fAl)#Fnh+6_mUM0Y1M+1;8L#DDW5%fYY)uOtPSceY~T|B>F zo(_b*5PSb~I*WiG#o2G$CIvs!_C}MPY^$oZ#BL;(_zU|YQ7;3yG0tWKO7tW&WK0(} z3N0F)IE6M8s7%b%%ZporO!baJ$Ju^AG5p5ZfWvm^ZXu@DP>9X!(wGiHnQPAMCUAjOxCzyT;$5S3DN>fg z4M28GQ}5t^_5#*vTr38H&_}AGS2sFRNB7%wNXinK2^<3j25^Zm^Mb4krEOc z34f)SZF$TRM+0C!uu_NJ2<;?H4-uU@ah3b4kS>UMu%k<11@DTYlI)F;WF zNCoU$DG2v7BB&?`nvu({>ATk=yeq9+1kB)OF0R9*VI|QwbBkw~MJY)ytt%CM{8j~w zGukg6c08)}e7zU39Q4z)X}-8%^>PI6uWX&V8S(Nn)6MolHwbZ}`(tdJ@> zh|{_OEcx`SQK5-}`ry@nt~DRIv$L$M1i}N;cATKiOKeWvs5E#fg;jV+!*yaXDQfS< zX9wlvIw8YfR8*C41DkYTTgIRHu68IS;CO^W2s`$pKI^u|E_U_Z9Rw*t%(nH@XENOsqXbr z)lxotE$$VU$hLdP4t_8?A9RCb}|4xZ6R7^bZ}X%s`*@O87^i~AiTb2+$784`S-yyZY#@<6dVW$XDkWXAk!X%XBFbi0^=%B z&l{W*;@z2PQkHhHBZF?GC9)gaa(UB~M#tgmNwV!v2E_V7&|V*RyKptxow44dU-|3m zBFCr-t?FQQZE1wtXr7JpQ??zE1ycLkN3dhQ@Z?z8%agfI{ni~(lhBI(jz~)@iQ@A~ zQHngXCK|u^CzzK zpjDQBfJ~9tBF*R=jx>2F>I#L2B9);;bL_n>#U&wB_w#a9;y^{Xk_X#Lqay9eR3(B! z@7zgaTZZjo&3jJyD@WIaVDFqGHa16?-=iSwfSiNn5#HJyA$RVq9_U;J71}!rM1r_) zMe4VwzY~l%Z;>goL)QE3>fHJEulNd6r|KNd`lNaeWohXbnd6qO3s=7{lM!+V1w;-$ zT#O4_H8?!!@An|2)Ya`gZ~^0(cW!o4hK3~(3n&GPC7zD}`M|p4eiy$rdkbL;5n};e zNt^e!AGl9TN`H_1@?}T9&%kw&3G0A;4cJFM1dq=dFYt~X7yBnh)9@-J@c^}vD1OUs z75YPiKmCQAPL3s(+8}O7<{KqtCnc~Q<(I`hT9&HpRRLJW2@Mml~ujIp|kLb8(tuBM@Kyb+sjpGtqP%E zk4|&hgog|a0zjdY;<{)%>ZB2EC zsJid2iPVAe2?W4&;<1flhoYrb33&)0dc-AB6}w)_(Q$(tM{UA`))5H=PnGCY>v~(1 zOYxtFg^Cdnpvv%kXnp@^z+Zpe2F?m3e4mvbrs%_sjRn^I*cE*W-KhV@3Mok=b-PgT3^74$y@Svmf``@jqwkT7oElY?)aM1ws}c7Gt!H>5wu6-ms^Z%o9?fdM zt9kO|x&sG15>5PC7EhOwH#0ls#&jq(Saz3& zxw*_ek%+n){tMCJQQxvC--P28w$ZN+9@yg--DmUxJ%^v5&bw_xiC5?JwVT%*x_aiT z`O24-$2)%H84JCnR_x>L_p@?AV6`_+ulOpB0UUnAWPWYEc?TduPPqQsWui$to=54r9 zY<16mHF)c~23Hl=@^M95k!iNedfS#q3$QI)5rf-z;Psp|OoiFpD4f`Nx5vh9khYf9 zcC^1!>TdTc%w-zuEiN|AVNcg zs$M=H%<;@^W%b{m5@3>c{<+AAf&0QWxg{<6IS724EN>0aFKs)C%VtsAC60#BdG>az zE(6>;=(v*Lz41JArmAC+)ABDSS;H-ksY7*wslzRqMkVk1j^2AN6;md*C<>Ez0Pn_- zW16YgkjEgdWa|$=7_Wa;QMyeBuGq@;mSGI0E9)&UHh9f>jg!}K7f#e#yLMSdkLXK= zhutxrfQ5~>`AyKFItA_P`g!uexVc(U(Q5)qU0sb-I*k2y>OTvXRt>Am@CMs0ePdxQ zB7_`oCYlx$V?x{H@!^@TX;;LGoi5mec}9XrG#B311#nn*BPQN^uVv)HHTz~8{&n-V zd96jS#a?E;_#pr6a`AzsAExD>_?NPVwv3|Mc5BstT#DK4A7|g_1VeJ9>SZ$@hF6I* zn=-l$Dcq06^#5+Q{w)R{7`5$1O~<)6Zk#F%HCU*EUr&mVAfBxjJh(*&L~;|qlN?%< zO-d3L0~w}XBue9(@BxhIqKDgg|KQ||#v_hBeOq)^&0~Tee$ByZNPJ<8DawCI4;+t4 zf9cEGROGTXeD;k+_0`W>jgL!8N|U+Ik_krm{6^^9g7@1VzpPF|s2*e#o@IM6F9#&$ zg|nkZbap<~+~VJFxjFPQR@9P^=a3(ndZX)L3A{xVZ{b0p7P+6Z4lX?Uz|QyWlBl1_ zHm-O2YiGsaAYYnp7!~*rS-fSdi=JIpnZ$qexc)=rkY+G3Kj#f+28rB`p9yKi^G=_} z#gt!h|2aUBvvE5q{h&?SABxDa?EHMX>YRJ`(`KZxrv(a?AL9`J(_I$`XK<-|0kX0E+V7nvKFp!Eqs4p zWs0h1k-13_N@z%Wx(v_OIF;&c?Rt4D+~_3kCamSieYrO=>Ok zmOeS|Cweya=ZCX9Y|{Qx4gqF(W%`Z5F5$5F`2D)NN7`IgImVD*BMlptvfvxQC_CHc z=2f5UaLioUBPov^vVi^yJP#gJupL=cmAF+*KJnR(``x>Qv$sjj^UQL3hE1Fi@wg3; zOm?*{U8%tt<`i5G@Gu05LpSV(22CC`ihyNfNpofxbsW2H!p>TnV5~B0_UvDmr$zev zgTfZywu#Sa%|duAU< z`cGh2*6afyb1(pGXkiQVm)>xIyMN?1gfpQpWkqAM1gv|E{wrD2#jE~=p0O0}f5enW zZ9N33)5w5>(&fu?9Mv;s1eL{fM=an-t~zJz2{h~|Hdk19G_lz7f%0F^{?-EId*&ww zA1Yvq*bMxsU^_VD)*Wf(!-wUAWFMVcejE~;Kf_*L&u5j`fIo)byvY@8Oke7}>@Gcn z*^pofj+`-So_0}LP?&Yk>WycUObzAcr_mi|;bC6TiqO0>h6`^*Dd$9A|`zEnSmEm5(50FZftxXAf^cIdhVAe zpYBgo-%`|GVI}cgVJZbijiZImN2)#Tq#ADFx^)brjNPl~%L1F%GXG`enOFfpVr%x^ zF$g7j3JZ&f3lk??vP_DkWh|x4gdMFnXAJ4ToJW`!c>ClQCY*eN^CNDoK`(1|WhDDL zoml1=es!IGCf)$=YGE`o%jpF^!;Ha!N1Q+>?)5kh0q=Jr01&1#?hJn?#9a~xk9@)l< zT?KaW@OCV1Za(jsrv&K>XSihm{uel`Z|EBrB@V5E{@<*)KLAdIOzvf6xpf#YbG6X2 zi09jNo(Ya|&KKC&I?2%xaiD(2!0X?%Sey$Y&T&O#Whv?E4jK*d^2YJ z)`Hw^k7+t%$f-tfc>u&!JbZXbi6E}(1Yn`>0Zs30l9sVBl7klPzKQ|WQ1a={S>XfU zBRAIwuje-nDwvhte5p%MsU-Ve_61SP(FgN=DsXMbE~a1~WA0HWr{LW}4WMtwx|JgY z98%Bz59;1Jtg0^h_uYz!QU)OmxIvKGbV{dmmjz0QfYK%1C@BphAV_xz zhzOhR&NG(2zjN-N_n-Sb=kDkA1rauDtvTnIV~jb*=Q}f_o|J{z@~Ddz9@*d0x%WL# z_3zsjWz)5c*bCB>o?U{u&T6+`%=dKJ= z7F-k5sN%~y6%Qx8wZxQmHs^{)Up#Nc>Gnkxd>BYlEr@`sZOxK^y;qYY@Mu@RA%pao z<${ZzvZP;Sn2NS%anBOWJnM($_eM(}4=itrL;Xw3$UFO2R{Sdkan^qqR6=$_%vS}^ zpFdd}%%l==+HH@wEo_VZ74t z8!Cl=WCyNh7`v}Z%%#VAI)w6(zk3l?vtpTfnuo)dGuIC%Rr?%CXZH1+}P={ zj*x4fo?MB>{o}bd(q%E!Godu{M*4?d0oJdILy{-DkJI_tbrOr?@;pI=Pq3y)gDU3f zA4`}}DO(=3vfNx*k#>9JvkD(DZk8U3iYD=$mo8pZ&GE*?6&9r(tkQo`RiiJdJDzR< zg$}I$7T$qf`;EtGaJ&(n|M6_wj^E5{b2VS7o|_)f6=hlo*(oG?ewdx zd!-KruVxRxRT+s~i;|Hk92-52lhSwlSP`9Fn0HOuDI(;0yrO}Jd6pcQtW3QLHMY2d zLUU5q-kaMlg_{1~pS*!?nuwmAwtTz9jTc{j|DJCctJt^`7R|0V?nAcBo1HSA@4yo4pVLuh{FZoWCYK3aV03*R^Yl=f)EwtK9EeiePX==3uBLn+p$ud}nZzq;Tn zo)>6G*!4JcqM=$qSUdvILluiWPu1{vDbvkhEB-#m4m#W+76;omM=Ey|KYSpw z=p6Uw*ma%rI98dyRqIsFCvfKuhGVd^KjFvpzD9X@7VT(9qSQxL>~@i+KRBuRrL~Qh zm9M=fI7e8}Uv4p4z>kbAn1kl`WKb2HY2O+!a(vm%rglF_M3m%u{D~~s&8%#pvVo%g=av zIZKZ32st0-xnJ#_6UqDeQ{|O^$oi1(V5lRr{9%zQR@m-$BK``O5=e0EC!UlinUjD! z_27YSLEDW2%&<7?dIf%p(WrW|g;V~>c23Kypt^-FgDbOJ2}f5bA)*t9l0|7R_N}}0sZ+zT? zI&!ui3S}rmjf1@qM#ZyO70b#h#wvRJWwTja#%C`O`f)5u^xjORLIx!42V;Zn{Lq?9 z_L9%yt}vM{+ZCbp!3M!W?RbK#&rEst0N`1x;<2bJnz(wd93C*#*$Z#XR*g@GOij(G zo@<)Fd_6v==EkibdJ|c#nqrb}f?4e*XA~uaX4WbA%1snY235BA7k2!l#pCvqYV4oQhkU`pTiEW4V#XhHhF~`@5;C3!OBL8Zxr6*G6M^WH>r; zEm6hnx7-|gP{mTP*HpDZ$c43zFvPkP5`MWiKn$DYA4R7F%;1b8x%tU4Gp5+OWQ3SD zh*xVXeu>AR7wgDQ^~g3&nwXa!=rr1vH0PMtW_P$;!-C(#;?*f47|%S` z8Iq_cy(O=n^!@uE3rqH!E&T&@HmWTxIQWZ0l9GNkIdyfPSj*J-gh~xv!_E@!T9#n# z1-yGA+G|zKj}>uW>ZTe*dNTwvel0q_8Rje(3h#z{rdZi-Eo50aUab1@LM?UDcKuO* z-Y8uM$7|=T)cCU23GsWz#^U{3jOvyT8l^v!nS|1GisaVe(W*(U;$@pN=%^1F3w>I& zAafE+E&Wm2!kg@o*I~?~@!suFj;tMDZ8YTv46}6J_K(M2(i(|Y5sg)P9a=VFy>1mF z#~*?piIKdF2+0<85M5S9f57_)<>t!U;wLh1H=i20t-j8E?4x2lu^&_y2*E&Phs({4 z?-Pvi)Ze1|(>D5Kq<{VAO=H;8)%G&03HES5!Dx$0J#r2$c91Kg;J%5D@O|yRl_Owb zAIg4nMa|v1Upyqth`051zmOf`yBXhJQIIMNw*R?al*)o`HqsDPSo4==>ETm|5!2xr ze5(B{MWAv<-f32iEvi?zt!5ja8I&8lr7qwnPsDYO4d zk&%%f_?blvONyKb*Egckh$5I5O{MSxL5vKWCSstF1nAL8$O$%x8=2>A-}-+Rob-JE zz@I=+y;M|j#DE!g{{2n*!`o#mx}SQCX{9ndf}XC?@?^&uJzne)-(^AuxkbHGnVRV0pWxbURRP%gk^6pk7>C5QcAS+cn zUSXG7vvbHf+|d~H>DACkG;`Ufv&{Ycc;yP&Rj&?_CmfMhPscKfs#ZJn@`c{Uv z0uILr$nKR?3`9kiDT14q|GBCD#kjM77c9q-(hV2BmD|5=Ih}i)tDtABtQuGTUGo-I z|7${z{Nrky*D|AOm*Gs?fF-G}Yud21)rd&A^5}Gp>6RO9>?7|QE0RjKrTUYz&#+?5 z;K-nl5{lW@6a66v>>kg$GIVF8bS0nafM|IyM#!-uTNfLaS`|)Ryd+-M4`8yV*^$O)P4EF_;rGEIxN%WQf|f7GW@+dAPV7erm9njJ z<_C_HU!7#xCuV=`MLt<~Wp=2^cdl)5>KSgUhGzY!vg)7SA`24}6Rt?je+lJm29sYG; zBJcWKu@FBpnA5~?_#*}q0DE0-8d{Xs-S>X{B@ghh?1-$%k9GL*Qc*qvJ) z;@Uaxu)A|pFiBGO9v{d`V*)oH5ri6KpTtJ+ITy2gU+S+VKe}NYd{t+~0Ub8=r~d5H zVArE-s*O83>c>@;9Ue;BenvbuYbK`1q$cgP_!T@%Gpw`SlSimBtS!=5aMANG(8}F(qmpbWBbrAp*?k6b8H?l$=>f*;NLo_#}b`d$P)>WRc00L z)Vrqd&N9|;hVLytV)e^;G^*^AbGbH=G5n7`m5}#W2XXXr>Efcpiv5*&557yX=@!;rQfe$BYLWJ`%^49kYuU-#0e{3?YWpjJvXSfhpr-X+#H)2K%y@lwzp2 z^VNdSP4o`AkE}-%M91bt$k@u7jz(A>c`pgQPs}L>5UqIYs_=o3)x`K>XiKy#QOSiR zPUT<2RMU>xjw`D1%PL!@UzgsNlXh9Y{^Mez8L7<5{!`7+tG-@zdc|kkjh(Gk`D4n= zC-x!xH;1FnnVezWr|7W+Kn3Xc%iZ6q$HbQ4WVBo z^6?`%xw#=fLsF6tjm5AhJsj~FEf!b*1ou$A9IMe`E8@{WBxc4%oaPRn+Ocgp3M zuDQ@(JAI!1`Mvv$FGm$WB`ak4vScRNhZ>S8oTkOK{G562dH_BC>!lYX1DeJ3t%5R_ zZt6aJ7UQ=7bD4lhM@y(2y3I9mC7f#dr6pSsCaGlQkwo|d3CM_2HQ z!#O+|q%ymVVBg?WyM520A79tUX@1n~#q-mf%N0h0x2U|GyI*YpFsgm8Xzch^%?RJv zUePEyQHJeA^5m6eE#5;Rt8Rq}htCfrz3>T(Z_?MzkLw4$kHmV5Ff~~hDEd#mWM$Lw zv2)lbCki8_ipi|2Q!draWQW$NEiK-@MuEqM@)OAt_7nW|EjE#*PhG?l!mhh%U=-FG zY(Bgknm%`I9OjFEL(47odFR5PfeDI~uV0t!1*&`!&zyM)C-e`{K_dim<%$m$kEVy4`%UwX`~8YK<(LaF6l0 z&OXJYyuQ$xP64|S|5C#7LI6H;GeA$oPcGQ&~q3lC1*DoqB(BA;nPa*2wec zhK`NXTJckH4j*P*t7`|kRL3VGM7{P~POp42=uv)*-Wg-g)3^a#8ql?*m1mio3NhX` zW%E(M`|#m}!SW%&gW7{UcJxweO~THWu%~N$>C;5l^}RUv$KKxNDl)B?J2@*X@BSO8 z8SllY+2gCn8=W_GsKuM~jOUc1ua15=nYCuk*+mchA`kH1Ehu!9vpe8ez0;(^DlRT* zZ0v7bQmW$UctJN4rtdF*WXf|u;RjN*1r=Fw%}{iPRKG!H{>~F4qUOB;%^RIhYxol; zG_}I*#74cn391PUMd%7zqDD&H0=l(m_+n&rM=Ypo%QpI(wfp0G7qlbv@S8hI6GPO5 zJCwEfrr6hc63e*Lx4GSY6iZg@#(!^cr(4IKPYA3G+g$&_d{TyCGjBMXHGf5cv-%IM zW`CkwV5DWKy5~uBe&ZJc;m*(kteXK=kYh@FJYs2Dch6I6``xvki4%@IO-83#`aE5) zb?h}sk)6oY8ZTo?r<^BGJlL)oyoL`yc;;0L8g-3lY`)rK6v<2J)Cfe3mi-)(gh*e|;84LX?j>871Mp{qcVjXwJ z3Poz~bK8ky?X;h2BB%8h9FZ=rUj0e{ zee%6uUlAaDcBEv^#$&_XKHo~fd-uhw5#{Z|*3(NJh6AlEI{MW*w+bE>^b4SMN4*b^ zovyy=w9_&mTT_l|oq8_vcGzW>lhsOb(JrX}(%hP7y90>|x&Dq2hu|7<2)E{XpbC}8 z?;vce<@O8K1{`fQ9;%eO>;6yPCSskmpWTus3vIHFqanUocjQ^`9LOrkI(^RRDFKTU zOKIJKw%aAaY(j@bwogOJzN-&06qN_9ccjyr1y0M*Sd7hqis0@QbcPMdrKD2pWrcA+ zM%G1&Kl~g|R?cg9oTy5_t;y)+3!zRj#2aie*bvc+EWT1~x{|_?)0{V;ir;cm(ZI2$ z*-|w!Ul-d`J2>~k=B>Tg$>(~OzoJqu0xp~t9hpd@reiF~Fc)#KNcV1%4kv#M4b|WpE zas7S$%3wj7Q<0Z%V)9=)74o@vz-c%O{rlRziT{7yH$SHmMkVnFaU(K)@2`7^nS9doJnl90>nORc_UjF;fz7=X9Q39_fVjSmnP|@j63e{@R zs6I6L<3zpAilVBkUpWzo5ePg4U-f$&8X9_-NLO`T{1?IADZTF(cJFy73H>?ec@6nO_b2u8 zz}xi&e~;PV+Ug!FLcaaqOPovqDS!*Udd4>YJRu=SXdRJ}e&b-VmG=JcSHrd3b^3k@ z-VynNK;>E(9LW5Attwj~O%Z=z|L?}H?;}*}>O$og!V>_14AdtMG!dT<)(5mOQo?@y z`t?2#8~jhf%6ZQ4UpYLmWLiv$%%Kk-7&K3BJP2yq{6_Nl`;*TsqM~DNL5F4|-cXT^ zNEAXTVtBiWGBAn64i;~l3h#A0LM(3qb&M8(K(ykIMJT(7XiG-T?dU@@O=wxgL1ae| z97^Mp?%1a_b3MA@o-9x>44^|q5(p7d@T0a-u(7d`)IB@@rr;2UvkcYnSF39&=2p)2nYDU7^$FP7WXZ}!_`fCdkE1?ANYBo?Qn#K;@f!; zE&?ekq(=3QvzeJbB6tPAwb*UL1nD0Dw-CWCt3WmA;szp94T%Y)DZCgOGeMTq5+nwp zu-W?C_wFvBENp%y;G6{*tFxfIH?IzK^dp*9&VC*d*THXK+PK6@g zJAI5vw0o@~P+1PW-^f!&budGbc`uV;5I3=Z0|Ns?6xdPW1869x z&gr)}UJLQzRgE&!htkq?D5f_#+TTitLV6Pr3~!=XPsxe}Zuefn$v$Vn65I?wfD>** zcWk5~@}QxLn!o8Com@Oak^7bfwv(^LAI^eEXlSeu`AO46D0KzpU3gg5Uw$dB$ah|N zTxv6B!4M6M3~IygA?e?=ygeZboT=LAxD7I%Tu}cr16|2>rEpinugI$IUIl>aATVJO zKtA@fuP+MeUIs9r`3)(*B50rhTm=HONA!6?+B?$oO+Wy`FmH)uGJ=PJC|JtUKKvuC zyaO85NGk)Pp#(*;PC$U3Z@i-CSQ<_zrv)lc#UPos1ht@H0Qk~_oQ7D>Q=bDZ^dCI! zeg--OmkYuKkzzpHSA}FpOEgm^Fpa$+RZIm+*$g$}zp|P3-T}x6YJN;5I+f{oi2wtDfZ0JHksMU( zWUh|Haf3OMMMARMc<$u1dxiP$l`)h_u#9< z9XwDC40Y`>w@u$N%t6<5KL9zA=5m07rH7_S8fpP4{1_;x3qTCQL~`gr9CIW+gm*~?290k1pLXEOJels&OAQ$s7 zH2I!kEHK^?zCGx7WP>5>n8FB3)bPq7{RglDoQ91fk(+`kgDg43dw}>?P)#$GPEI*T zH4i~_l+#p#8wgT^r_i20yiQ0jBhrEhW=sP*U=VQ~1U}s!FRXTX@01!$b->Agh>Qe$ z>x3m;+-P<{CA0(#Lc4r?jtk>@%FP2%BLnKR0Z<19_ICPV&M&~|AuaX{@Ki_Psm|Yp zVMEH$!A1*&2+|N+gLV&ep4fc*-bE3_jbQ5$5ExvE9yI4Wm;*C59vTg`*Bha^5~lGV zSrXfRjG8&Hn4neD-WzGacHcCEQh$)v-2Nj?GJt490HtDj2tZ)a!p-nzB_ur`ASn_O z`6s7zfg=HN1YAwNMc4%hE!2P?Cz}YLEI=pvpGPDLn4j>M0)*}kji%+ruvnmZe=Hq9 zFFn&MIUpyEl!=$vj0wR?u`M+SJe&0P5fqF==M~bP1JE8Qg}Vo)*BsOkgRfFi4S_}8 zghm+zavkvcwe2#vU1W^0?Mz_aVJ09QHNb9#KAj~5M+FnZV(61WFpcQE7W8;Hh|jPB ztpRo=2U=$Fn0%;L%Ld6DWV#`6e;_kjAZm0qp5+W{N8R6$ohSx$L14U7U{TI)bczo` z4=JL1f(DC#r~`UIGk-^7QBe^Bngau2-P(md!<;YMsWs9*$Ny-f9tAtaHEO;z9kG&63)y_3+|lNYmBY3JnYqcT*ob9rRSR0sBG@`XSB}5Zp$9(R-j7NIhwx zFz7ig4gD8`wM8~RzjV71uTTBNAh!h#D{Z$sMW*b74pAMnv@$+sIsxK+CFm=%N9_>f_XGJ3A?$%C0wU|>u$lDdY7|ig z7qkY(ctS(e!k&c%Gc+DS&lcF->b{|mFa${nXZW0vp)d^u3ktMm8Kh}tQ9%I@QQ84F zL&tk>8qweYIG#?<#(gQNR#3oLB)MqooFDuBzt(S*9j&z|Tf`I^n>jw+&lmsZr zFpDZiB&+u;NeOn*%Q!EuhMmZg^%cc=-Afd77klM zqnNUiQWy+I0bs-CA@?e_0#&zlg6%MjyatFd32OsEAfvZ5f=^)5gTo2-sH_I@55pkY zYxr}7ffCIG42dZbDD~_R%Yc5~#84x0c6EIrr+FiWXmI|)ZCs>r0Bj+pVUXML9yYk~ z2{)9icBnH(gHhe+mZmF@KX~l3A0BFih#5IRl7<@11dK0$i3v8JJ$p6=8a3Mue}eh| zAq7|6@ZgirU)rcIUepI^iA9HTh$)1yZ{EIz3xc?5*{-G+_MT{fY&Hq%A^YAUcri2W zcP1Pu!((DBV2Q==aPsiQR%Y{H9ekW;u1MF;N z<3TH1K@>0_Z?xRMe?JQ5(`|r2nbyKmjYU@S@PtK443I-3hs2LImCL@U<*FMnL?b%^ za8moCg)_ut|GCW6mDZ#Dk%Gv3yQyrsVdGsoe$Bz?#A&G`%|NR~(6);7B!_Jd8HQx# z=H^OZeE|E&fTr`_{rHwnJRiFG7Qp#cQBZh?L?=iqEI6fuL6o;0L7g62pAqd(gbo21 z+W5~Ng`g2wy)~ev`APp7bp3%5+Jc8S3!A$txVuP08Zb!)tbZ<*P2?l($Vm4r0*M8? z1Mf8pa%ITo42T=ViA0ETv{)S=X^eaA=-kpMybp^Vj2(anFyP!+Iz9%5Ogd=NPC(Nn z0=0w*3Ct~kJG0KXP!J*Xvt@#35GKF;F&4aChz!6@?lT+TSAsS_ zgi?e!YS0~uIQyXXtpZrpL0Aeoptgs|7~c75`vUGqr^y@CjG^>D76X_vwt^}pq>U3w zl)BhLqFVn`P{G{Z)MI}SgV0AY*i z0rET$-9?xeh;j~Kf1s!F1CY9*BN*^}=HT$?s`aT>Z!RGOPy{>*_X&3}<~kJ|mWp&$ zLQ|{*<%amlhB$~@{gu&+j?P+Nw}+nwc>P0A3`2qmh;)}|fi+TBp7fcm4JJbHTpw9g z69qI0=>sYRRw%e;ku_V@&+otzS{$n!%<}^I*N)F%WgILg!1_AiVxhBBXCzy-M~0`! zw9}bd3lyld`8>fUeJKXNfBYd2w1e{i*@U*h5|R#5VU!SX4Z7*MPU40b<^WRF8k7ox z7>XbUC_{j0KrhC-(el%I)Y@hVvs1#)W{WJSgo@Kcy{3yppLLrP5-wa2-FycN9O99J z4Pq+Z?+gt;u9NR-!AXV9Jd+dz4 zjE%r(JOXzn)Cfe`=D3NUx~XexTY;DXtQ+7h4X5QZFs=RsuaI9dtnbAPV zI%YHsDq5P3)Qey^+VMFl8zc(@8wh&5Aa4Oqrp*$v1wk`)^XGmIXxIhs8~k|?Mn6-w z4R41nLSQn@dkfED#vp17k9Bo*gF7)!k8_sGnV|cUy!Y(s}vAA>=Vw1q8nE zM=Iq3I}h}$+^jsNg6}Y(Aqt}cMItQ^=%rn*Sl~c|8UUMU!VPc;4QWTL__2bIJ0}5T zhVDURWg2qe37BdA-HhXAfPt?FKZb}$1K^8)s0xA~+K@7fp?+L_?w`KopntkPg_2^0g+gS za_lO|NwLlS*}ez?auC+R$MJFstq(3%b%CX!1^97*8*`$r}24}#@}q)VCy`B zj;tK#@%zA*t5sg#?K{wLN`!b+tAKmoUDtG7B#4`KXEONp>s29s=(i8^AnpVKC+K2R z1Z8l9SO<ur%l|IvH-e5Jf)?`244)f?uvY*@@(pzMEHymC!JFsgqRW1=#&?qSs#>o|^UF1rvBz_5E9Qpc z1aoZ({*6x*A@*6YvH|z*6wX;Q@E(zb7wB#x**8R|5LDgb0cNCW>Hxoam-_E0=>}2X zkw;MH@Qe~%f1gkEN=Zp!Y*~=`3Jgr4kd;TCfMcXBQ+SsOE)iPDjR*;xX$wX|wh&gq z2}<+}5MCM3zynyLIyhLVo{GJ6#0=u=A_b51onj!Gg{49^OmJr^?~Si- zxX+mQ*0fs*W=n+MdgRZRC#G}iIRVFN#h{JOYtR)y-doUNM!*n~@n+e77n18GUrCI!a$rVKSz!{=PSAZIu&h{=u z!MP0PAPwjaCe15hV)VzDcQE8J*y!o+0u#I+pyOjBfq{X1KF6M>6BR?m$u*d<-i!oy z83a=`=-osC>V3jKV3dns_!-dPINuG{;~}S{you((X6OA?1uk~L%7?fm08PaBM+7*Y`DCQr5$iH3zk62rl&>Z?Ek)_T`rK!)PYP1$l=)K%WtM;Cv72uRgD2;9nX6K zQ0oM0yZb+{f4l|`nK|Sy5naTMG!p{`&PRlu#aj z?!XpYfOk~@PXR&xB9fDAYWa?CXmzkiNM=@+qx?Sf?Wg}30^&UjfZh8PH&l_2b*11>(P`XZIpN z#KDIv9`Ob+nF1s&A%~C-TmVE37d9Xz&<8@&5|9+&y<0qv0AoPa5MjvxKM&Y=DUdcc zg9!p1aD6~q1h58PnH|CxgjgsY^tBO)An3@c!A^)A1VE635Wr4gQ&M|s2fk!468j*( za^mE82XZk85dmEBROCn$oGhfJ->Dw=N}m=Xz_%3PG{3VGOuJHw14thrnw1s*<;un! zd*zTHhqY{6G>pg+AzT1G@4d7i78YnEZw|fuwJjDU^N<}y5ay)h&U49I3#0|0tS zEg()jlOa(!JoN*_A3Oj6;jrDjiG~>gLPMj#gY9yUt_=9+4Rk^;pIdOJ3xr01=@TCWH8w|hG|2r! zE)xm=z@5z%Ua3+(IjB9!f&4+g^&xv=oeK>@TQc^jf@q#8^vic12SDx*;dM(Fpq zH^_Mo5(B`)vxGw{UA=R&vLKX)=x5GnWh8)*O*RA;$PI(<%L=NeAaU)uJf?jGVm&1N z1%43Qty^+n$`HE@kx+k%^aUjE3~5Ovz{f9G$-_qLW615a*7QGzWp`f~;{M;3D#|*+ zBMj@Eubra&4%dr9Kajtle^39pf-KG%z@C6NogrMM`fh#Pj{PrMRVdIBac9-zdmS6X8=KgefBQ!~04o z6!Khf>dt|^MOpmpbAu0O9PXi2&cVy`oY8Ce`+3`k8V)EF?N{W_DVr`QG5DgO;{$a^ z<)q|JMFgoE@G-+A17S90w@zKiI)p(IJ{ z(7?(CX%ZdJP^%V0*-k9YRrXG^nVio|-yYYj9K?jR7+r=K_}@z1zC`PuMfmH zcfpMPeI@fWq29gz@0A(Ejbiwpe_=HwM7{Z+e`%%o|Iv>y$zd>2kJ96$)4;*n_aHuV zno-!f=0edhp?|}(yYwiz-T=)Da!&)2>#!U3CPl`c&TS^Qb5+?yXfIq3ecf$*`O>9s zQbW{3czEIbnn`s@^%ODb5)sC`o?=n$CNJ+@OOZ{!9BxdhnnT7POZ4n6Dj@kT2IEzk zZmxhK`>1e^BQh|N;QIAs{D!}emgyD+;oIG#h=_=r`7fn@uetu(*bCx#A@gn8zJAiy z=#2MNH!l%w2p+M2%F7QhLfwvv#*U}pm-7}uYl_8c9dX_7%V$otx3{O*JZ8Au#Y?ob zv?MqvcJZ7(_+z$0@o604>2QGW%l<=f!bK=vz0&#C83`2X+mszkKv+=$`wv?In%7b( z%1WH@?vyW1(ZdHh8RwnEF`LeFl-EPgNoHLCtj_MHCo9+c%f6h)n_Mh0L_ClOF4g|D zXu%*s?S%NeC9j+$sEs#ie<)2(3<%fxPTI&lP$bL^2w)@|NegUzV(8~nH|fDkLu~3fF|}q}PXUkVzZuBH?(y+d z*(eb@j6NXwSdU$qu!CQbDiOpcV;0CX(q~k8Nhh?jgjL5NcjydZ9fkQ7ft+Q z7Pxm2uDh*S5Siwz@bnZgm9~apa;r$r@d6EyudUs#n`!&xhgW8l!XHJDN%r$%^ zd(gdb4Q_P(D>5H4A7y3ZCwAVk*@+*sk>;XkqbQBNpb>Gq;++U>$gz_Jg)Qr*%#s$m z{&_MBCD5kqEDMEUHlep@3y%%(Pzjm#ax?Va8iJ8x_&$6hx+*?%!fcj=O% z+Y@9>shAjP&~lT$V>mCLLE>EL^^Jqezd^B!HEHgd?)F!@y2(A1av@HG(!%VlZ!(K= z&AhdTheyY0qA-SF_c7(G25A@1o#8osqij?sY@_Xd7QG{@YL+SnR^lz}vCLTbjaN1) zufn^{c&FUFyu9oJ8R5nYzx{piZM&W|L0H{_D`R8GRh{#1fK~Cjc?$j$9Mj)Bt2o@? zQ`8`)FYxmrT};$bjQxjkr@1Zn&__&{0vnsEmT5zn4f&>9V38NHH^9pEBwutsc!>>Q zlg<+4%6RgOD)PsNA~WfIQJ`pbjg7_k@>K%YEzU5_|9NMl=;E8VXgo7#pnzwNswVpnu9~j80B6!XazPd-blRCKY0H#zqGcK|MJI?t_&+E%E zT;3my>kNh8zux%wK?E6b?!N0h)StVi)?+ zu7^HE3o$%UY@-Z&)KI0%c}C(pn`eCH<|ploFYPM1idI4w1y6d!Z!8|)fSdCCyLYhO zAP>aVEl~6MbNi#u$7}bT%lg!>8Kx2Abhuww(Ln}0L)BiK9^QdZaFBCsk`xUXT3 zO}TMVurHuKy~Ah};l!`0vX`o}8=ieR{JfqXz>mkbl`&*QL`3jw+~`s+pLrpXnT;RP z{K8d4x42QMu)v|lVSBogPWUuf92UL5`)h05-)-aS)vGWK6-aTjv*peDhZjF7D87&L zeJTQ5OK)-Ek_oG$!C6Jpt;7d44qW8dX^0z4ismMtSQxyyC;Z@t4lfmu)9%q<1S1Bs zI$YN%g_OYg-18(npS0a7uyX&i^wLj1LuqPiHZ8HT-QS+CCBXz4)G>u;nH@-_bXWN= zy=}HAAuslEN2zDO<*1#w01{Q=PtDDv9Z?kcuVhLyf573XqK-~5V2leHn(0EoDrn|` zEj)Mj1qtzr%x8UnmHEXR%-n>aysKugmn4MT@e#T^~yvR*FwcTZKdOj};YE)z#IE zg5EVMn0V&~t0iX-snt8fHu7@4JTo8RG#=U46e<6WoRkt<4K&oAcdooj?2nVoV&cd< zUAb>=X=&NyP%x+ksvvVZu8kCDMRe6v-39o@YsdqQzd8jujo;hhG`TtlBgOr^vQMUW zn&IL(@De00p4mM*M*H{84OXigWHn6QrN7vf__#E-C?(~_l-o52b;M_AtN(9x74Xc% z4BI&f7ap_Zm5lg^;y`+1u->Fsy(aGn;CoEpbb@Z{D*MGmFO#L*>=`6|C*15KET zd*IJJVnY6FpNU(Vi+_{VU&YK?S>yt-8;KYYyf4Z9H%IR~V>N0dJvPqg6iPn7S9#+5 zvm>p~;@fm)R@Tjeqe364M$Oj@THBqVeDUFr$nDT%7I&=PXYz7%%dy*x$Kj^FYwES~ z;Y8|?=Gz~M8}8D-TN6TuwK_Z5z*>`O{QzM$yyjA<{O&?XI~hXy}K_XDTy;OG9pE|1($H%8FE&<%iJVy?(2Tc%Fc#G zYi4cTe*P83It}@o`$^fXUngx_geKs--gny#cXj!yv-AJ1iAkS!G<{26iuXd|dtt7B zWp;LQem?P}t?N(UJ0(i46@B+4V2P+CJOXr#x#K0|bDBA}C7Cc@i!Kz6?iz1AOMoDO ziO~vn=YSbpsljuEoL!0mf^$7rPTkznbAjpx+HbFuGktEIJN?t<4h=CLJ2`<0=7B8e ztG>oMS4v-{jqzS=VRf9Iu{SLmhRdv|tdw=9^=}B}&b?F8x(a#cYv)dbS!VySy5~vx zY)L(lKwn_9NHb4xqHJ`@wp<(5`F`~W{PozF82fuZ@X-7F8z*bwN{xg5tvtJOZOX|o z2K4H|QD#9w=Q*n9^}jOXeI{)MQWjW*ePgWjBXy>Xa2mTQ$WU;K7iUmr_<3{*wqUob z9y~Hm@ut}-uKc>+RS9F#=L`&Mng~{vNgqf^N;bSyqa;6b%G%nRQR^8T-@Q)9`!{-0 zF|o0?D_lt*JOk%<*vhZP=y|`ztLCZh7u;o|@gzK7v^ijMd$}68n_WZqq*iVfUP)zf z+T|f*K=;rkvs@<+oF>b3tsduYsBO7;M&g2RWo0Ghu`$}|kDQT2?7j2PVeBGyE^1Yd zy#+z^s%<&kS0t1*Z0O4s6%`c6uskp*XA~^_50n@T+-1`uzsxQ7ck`RFD-p79q*CHY ztir$@dS0JIn+mQW=hw+KR~eqo==Jbc zi+@*7kIv7}FNnjs6?6vLV((nw|3dXU58rhI@~zeWWt7P zb!5u`R;`0Ke7n4CgYv<9C$KpyVeIE^sBx~&e)jXZjTy`o6iqgmXT&$<-(~#{I^2O! ziAxCDDCEB0G&L&~+%$*X27CgZ6X&_2vu#JrGbZ8t;g(D4OaA_vOYMY&D7L;|zvyYb zcMYo6TiGaxX@yQLN@M!jbG0=Ha{5mPrk#Z|p3MCGdl<|#uC}BkdUJ~i3T0102bFk5 z1@E`1^E3inzLOoP7*xdMY)a&BApY{a75IJ5kRY9MvK*Trsij5j=ONQ9deqLZE z>cJIo7U5|BNTH?fl^JXua~%g{ZiHOz9s4y|JPIX5}7&;)4aND%xTCz zTRXn#9q3ZH?6K|Xt8R6n)W!?1LFXCsRQ(y?l}Z;JROl?3U@s@!g1Z|uZ6oA|62b7gOdMNV6w zaB~pOh}K|ckl(%H8!v#3`+)o*8`cq~6czPyo&7lY*#Ya15_{ve@%C%&;g8y+($az1 z995q;&nA&zFk|qD!dF`!a~SO2IR%0iUomR&_!19KyW*}?6Ye>M1_J#v^oLSsY5ci+U>3`y=aXW@y#qemK#DK@^+%Id9gTKzo_Z%C=~SNzKjC7TDH(#M@!Ts*^d?(U2BQoC_`vy62 zxKK$uT~16?rBHUcxwC`gO4m$ROF?j@<90=Aq1}3mw88SvVbtYW_}PqNh|J(cMTt{~ z&qMRb3FqOHEeqnKTj@|Re42o~?bN%wYHC-`;^75zyh(pEd9Zu~MYmeRRtQofAM@o= z@9H4e?gGnDSSs@GE#K$81^0Xr&?G|DXgifkD<%so|Ip#O}y;{QT5u(J$11D@~S%b2Wqev^c1xe-JlZYylFY38pd{AIH6Vi->x_IW)*w~c+kC^m&E3v9y z7g@LO=L+6nI3d?$uKR$}EYU{t7Iq{^`SU^3349Y!J5v zcvT_Myy!zY9UpKb)?Dd-tiLXxT-ZP&fsMUQETl44R(Xz0&!W~`J-;~wsUqA)Obz>(|NEmwJy8Q+oNVFRwW@zsPAhYM3Qi3^gFP5+I6f4W>;-nxw$IZulu>x%XC{#b6$QZ-4pC zeY6GTtz7D?2vYxsQx6o=|G0)jGeW3CJR_QFYXefE_7&W?65lfgMf<1&lUXPS^;0`d z87@<<9b{eW86JeHhS{qhQ=&NyP{k_=qpDx)kF)P8fXVk(riEp7`j?6AEORSCqz{tL8j70V82I>qXhidn?7GZOOS| zWhZ3lJY&H1z91>Sv9@r*V4yx%lmpm+ z@09!5EHd(gx}QVT*z5IezjfZ9-*`tWWf9|-o}M0bRM=4IInyG$Lh2|KFNp0R7OB<+ zw|n*VAS(qSxmQQ?q9ERj`XqyfNf@WhDsEKj`L(@du#fLj(^e0f6MFF;uAHS37I|pR z*@&O~YTyy?SX=4=$B{aR8U<6Y%hu#K`2VE+s|?39eb(x?Z{I?|>d2jjCzM8|DIBwD zizaQfdlA3p=P56>{~1?;g8TKO$g7^lE?>zGTpQ`pN>X@Z50RK9!PI3Ka^;ua2Hzo6 zkC^86Ke333=+v?>8U*Q6caRLv6o>eysEkoa_xtOVh6gZNSz(#*1lmb z#zi?OhWVCB-s0)y7 zk2*+u9`J;iB+d-3t?^OiN}=!p><)|0m%@rk0}8Ly>*L+~IH@V~{`pDa_!EPElrAKt>dd_y!9jy!PV zZ+O+J%*GtYJfVAfeZ@T05X*Le4IK-P8f&>TVro`3S$lWp)7HI)g*SewkSEA>j~At5 zf(55|^Apayb#nYh`X8)kK0;e>aTamvnjb~Y$+0(T>VihwppgYr46(^?FVnKX*UbfV z4s>Ose)?Qz9}EXR{NvQ|LnED6?nQR??Ck7a5nBIb76nZIr;gh9n;Tay%aawZsP{A^ zZkAsNv^#u4$EgST*L1dGVkF1d{jk}oT-*Iu)V_#u;tj9er_PztJl&lV7AJ4mBYwjH zQ3rLfRL1|J>MOva+_t}m5Rg_HNm1#L?h+6VB`OF=qjU<=B`6(=0@6wg3IY<+jYx?| z#}Fzl-Sw^4xc}#y$LGX7TxMp!d#}CL`o-FsLz0-d2>O5*RO(AX?VD@?)BElCMED9? zUt$E}zh#`6CDQ9^hpU8tRIO$e-?Ui(Lc|Gr-LNGJwAV?gjr^!gYb+1S9eF z*Lzj{;fAVLqm7qmDVi0U%3eI94Cyc;^2p+8*!m6Zu%uaLqz8p9lYA#;-aR}vSWkeb znL{XnV&`3`enp}>nC`iJ zF{yIF51ozs{MLl8a%*nBP0zSRgVXTbwig6m2)}<|hN*2Y)xp=oMhT`nbng2cipnqi zh{F5m^R7C+G|uX)QNL{ZW1-o9#qBUJy|lxiKz@hOx)r@ei(EiCn81!cR30hi3;>h<&rBf+6BZ9<=nxP_@*KBi_ zXRVUruT~@idL~LIZ08)b-b53^;?kGsL*+tkn>`j*GQuCU?_;~Z?{k1(W3f5yU&*nv z9{&326XTL1=bb~91P09V4G|!|5GJVH>vaqDa5d+FF#d-NFwz*-JJ-4N@QGXAk7|EDYC0EhuQe=`y1Ke2y$Jdk|5+_wi$_^* z7ViCp)m&Ii%6fGAkl#ppYB6Ppvhg?z#pmpL^m40w$$i|$eLsiIW4e1qdl!g9m{o2X z6(QvdhcKji_hGM3(tKZ+#82kNj+r|rN=LHTOs&`_`SYpVMUKdGyQ!DBpP*%qRI4+V zp9~zB58E*#KVqCK-)Oakk8^UL$vbGNJ& z1P==S7M}4^OO=hBb{DXTdj=s}Oa<_f<9!yN-WSUxR*7v}zS#Zi7Xg4#oR~2}NA6ie zbDLr}v>&!;hm_tg+FRQ8YF}1D3P}zj_|VxIeVkKnB&TK>Y~JVa*`NNHuD2UonW@}N zJ*PDtS-A?u1SxU#mXoH|j(ohf)Sha$qwZVN_Iq!apI%9S{Q}VZqUkpy^tYf5K>g5I zTf2Qc%>mS$G`-jL8vwa_5$QP|&Rrc36^z#IfFO5n{Iba#WQCKvg%^e5?~Ac|bonu| zs1ym+2JuSZ(W~$LS0kKk|E;$uKi`~KMS}*;l#c`xa;W}$5)p8t@6z+r#38@Nsky0L z2_#*HatqR*YC|rM^(c>{gRmEg%xKuW1q(iCaNKKHki>uuLr?F$wK+J%+xfEosYTr~ z>iwHH)?K9Rq_ia?6!w(zJm0#TeU7iC_4I4}}Y3dO4@((aHhta~Uef4Wd~$lJQQYw5~r zlY~<+fDdRqB*a?e&y+9mOXJRVFu2i&DVXplZg|=M$3;2oWQsgSj$8bRYP5#fagzkR zH36(?9)u0)Q?6+N&o#t9&&Ph&aCDRbg-I{8UdS{=y~jU>(E(2D@S4GR#e-z^xyOn~Aov3Y=FGVRo0 zC)|9GA0YQ8C=?n)$5wjICL8cj!Bo7S|K2-PNE9)@c!T0Z6PMrC6*bCDWD5uQQ0&po zIv0A%o1MB5Mp>m}D@f{6GOMn0_wHRIdS8v)(y6!yr7^Y@V+3Bli!RSKr+xyU33ZjU zFkC^vAh~)izLTm?vz`k*sy&)B-3gFYat2Z|4k3+na5Q3 z)d0H1(o5x`Wb|t99!+i$aZ1tcPZz=zzI^@4|K=ckKv4y9jN5AW=~2I6b)hzR_wL<+ zu?GRoIvo@&e`*%bCjfWAdcv&Wq}Xq2Q2E{p%Lw(5jQ-O#mr_u9Vhz{2*n~bn2mo#z zgg3y~$;5Gk;9vVv{xyM~a_kEM_q*lG1JSBNchV46%=erAA&FK~x<~=*#@)&kZq`RR z0vDjcJ0#!ud{Yl60MS-VGC##Xx_SCJHR;QUS+OiBHXN*PgM$_|b-B5?VG5W)8`9SP zP*JhuGK4e=J%IlQ7d#aCPM|C>1Cq8y`f~ zP!^nuxyWy8q=Ps*^;8)*zHg;_t?k$&AWF4yT+v!L_D=yH+{#T3EDR~ z8EwKB3XDYxST9Jf(7+juIJ5}212+v+Flz?`9UXu9Oa6y@RY}B#j`^-3GPqX=i67Kv z-=wMA^+0Q#K!&aNWO!*i`mk#2Rji>IlIICNf6?uz3Q2b$q|uI!A?VfX?(QOfJEiH< zpn>CNJG#&d24q`doe~lf&Olu@1Lce8ugcl?fCOZu<_<$+|LW0f+LO9EjLc4URb1k% zLR$&|3<%#n$qAW0Bu3?XpyQPJ6D3_&wX+Q!GuE?7uG!nz(7HQJ0bE$ztMD@sDTOZb ze~u(U0U@LqbkcCR;m@V>XYIx-i}PNit$;`Y@zc_hRYU9td1yu`u#R6G)sQ`7P@p5u z&wELXE9pY5K#Iyb(@2O?{V~}nf;T&Hm6RM%ca}z=*s!RRQ=f+j~x)*VsnrF7kCV67MPD1^}Y~PM;MZ@v+hM>!PU|5WJz@wH`WKd9UOAZEbA~QqmZA zst>gMKUf(wQM!00!a5*ra}^UL>PiwKXs2@_L}9GfR-{jRpUtxo2|m43jt5FC{b5hW+#*qZn=p|kfCfa zx};s-h2hV-RrgIyM49m6<@TRdiQUqEa7ONn#2NEq>Wn_NJ718b2095Z?s4k2dQ3l| zT5BPz$6c$}ttce6OzYq&GaD%@z}=m!rf8r|@t8@3^c|YO{VhOGaPF1bMcr^}I=lJa z?>G#4w8F#;bdS-ebT~MR@2&d6DyM@l5EFg;1AJt-3Y23##TOZ;7a#~Y1J^XrOz*j> z+@EcwLgVmJHC%LK)(QqXKYdd2FXfu`wnODh#Lz+?fsR4Q3Ekbufr2{%N58k_pO$P1 zf_@o%JTFUsK1^Ej^oS=@m4m?0a00mx{xVvIq(MdZ;{yr^ zIGK+A>#bDl14Vum7epKs3=Qe))}tJ!-c?NU7n<;Q!J%-1=Zh(NzM zxX*s4u@ZoJb*r#}m{raLSv=R@u_r~W5`a8sh|~`X8}PH(@cnkH(HO%7ugCzMXwtJh z#)_623}lH(=@na6x+*IAxMFg#(Y9#i8do`P$9GH=>r^O9{8WBHVH4n4)~;bl7zLu@ zC=$TDylxm98*gl8Rh^=`_E4nM#2D#bi|jSPgjc@eeU%QIxW4|fDrJLBS%cXdxrYxS zROSOc(X%@PfI|c)ggA--hqucvRJ(1PS+Sipkq!_?F$Mtu-udG*-sw%ieImfqB%~6y zKrsMS$A_S2Z@Qmg7z|pT>8$4(NhP}qZJ?mK0Au2>(n;QxR}Zw42_h3-uvv@0=Lt|fXWo4{_1YmFg(ON(!bd~RE5}6ZeL&NJ+9a^&Bpn8t1oHvG` zBlbgsbb=Q2o+2fG*xng5xm=hH5VM-?gfk&g&6A(hEhDuCZ|p5SnHHrQ=!f^z!mDDb~%okFpX@ zHZ9gACB$(FJ_I=?+}_m_g(M^z#rp4*FP(>udXE^~m3+zF=58ckzXL2eOI5#j#-Vmw z2QqdR^Se-QA#*!@ez~MKztxKq!8N~(D88LQ(EUJ}^Y`1Ii&N0c!iOXhnAEo(6hb-4 zE~W|WKELq1S|!p#ijSB!_694S-yMW~q939kIU`={1D)@= zK+2tc?_R%-TetRvck0D0jYb%qxMWQu+5eqR(t{LCF6cpN6%JNUzW@Ea`UjxQ_7fZ1BilRnb9Hy0BRm}tBnr?)=e&0Q3OC&TRE-4pqQ3;N(j15JPeVn1q)q>NFMbDDLY$ zplhah{!D~&2a9j~tQXwox4#=C{|TM9y(na+zkvYkF(g0duy~+0g-%Idlu$oxHdFxA zRSPIJqO(Rd9_x8UnnaAz?X!yS3SfhQJO>{&WzKj=Jtuvkkv%shaBxru?&rIWbZiVsX%|yJMo{s#!AS6+g9EQ+ zZ~~fI{JkuBX=5u&_Vz1zhu1Hj6BH6+rj44(Np@)31@-J3j)(G)fQ!<>*2D3V zWPoPF@9O*4Sw<0x;GedjZ1h|`gkr%I;>45q+v}i8Rv(8sqQl^;*M{E+%eMD5p$@>+ z<|T2Wt?g}7C?P!drbD(@eHT=Xn|AAVrMeOY+8aLqS@iQDv%kamXty}Vw`G9rrRC>zpb_yaX5?9Xw~`|EW#o<@Ic)$d`JN)JFxEh ze&}R@J=E*s;&Wg`Ac<;#+zi~ynu$clQO`T>IX(Qnb#GgXp8EaBuhb5>_L>w}gq%mJ zRD?Kvzz&3+d|q2e{LPo%*>#YDJbCQ(rd4(Wo@n7!M&Oy;lxxrIgK9SYc-a!lY{X2V zE_NB*!hkj%IU6lOe8<4~Ot~Z4!6`fL$M%phM3z~Z#c4DYA;n!t;VIKFj8e&D<5^f#4W7{UMz@{ zTN7B{dtH{&L1}3Ws0I+*g;N>(04;#VfaXse*Uk^eM+vEOday02J=Nb9A;psgp7qKC zz2AaMV>abAngT373Xjp19kV#qTMDGuJ?!+->trba*$ZkS*H66LwYLt zsU#BUnkLylOs%Z&;2=9xT)@J@f;nQozg+hE(@$E&c>W~upKef4fJ#X84RKvsTADS@ zi>#0&pr+bs`u8pvB64wD6v#Ouz3jBLnZwOgs4!lC6`u)ZSzB@RzW~cwxl~xaMsm7F za!?L$O$m%<%M@oE2G8%$toQfR<E&vv9ClN&MEZj=f=%V1e;YAWO7p)8E4a$^$Oc zi%Vw#GHohy1o8lo@68ljryqP|QaNu{JRB-#= z#chKOGx$o_>^7 zx5DecPry^X%%1{<;9e`Q-y={#)9Nm4RY03A#ckC3;LD+61m!e@EvdrlU*i8Z=tc3j z8JMyr9+%Nze1`}k9i-Dq;GcnL4)-Pt zF$pkL;lBdMeRf?|iyXSJa7#tB2Ew_+nj}(x0_-K|-JXNIyLr`bSK{}FDF>Z47O13! zqNR3p$HDyqLXE)tuL}#{($fmono(e$$$w?*Ir0Hn~~{e#%zo?E0&Z zA87zjgN+o@ZPDL+72fbS1@sH_f?)ZywEd z5Pu)iCOJ~1DEX?b>b^P|12Q22ph-pC#)UE#QVChi|N%rzsMQ;N~t`78ic)&6$a?KIAt$R?twyymt4MKCu z!dFmgNUU=b1=bR@#vu!ZQv`N(#b8K~*~zJTL=~F&0}L`iFGuDFIfc2EmGbEcgk)&^ zt);H|;DXzr!271JqYzl&T`tz_jM}1tscr(t)7uF|$h3c>Rp0R5p$G;cs)OkW%gQ3W zeHP$1F;48>R0%3%x4;DiWdq^c_k0kKD}e}C43ENRyTF*<|DjI-0LXzbf-q$U?RQUG>fBbS$CXom{~vhia`(jc35hQe%y(|8~M z1guzS4Xpis)of}QfWZKgwyi<9`C$jzkVbHfwU#=PfM*Z2D=**Qc1Q-z6KEYkioRA> zyyeIPWD=R`( zSknL} z$3-FcBUDZ(U~a|~6xGoJ?YOjV6>K)6fXB(ta_J8X@?sJ@HHs2+pQr}tjSv<-w(`1~ z+`Sibx<|4+{*es&uE4qMt3aHeL^rzxkh>mXan7nsj6#VAQgKsAh@kV+uBx-C>9;|4 zyyWOJdjS=EN6e_gfgbuOe!h3%vm;%_u2hMNdu4xGGUwuMw(?+>KpcY$L$+V=x6TF> zt!+M0zZ>yEK|!~)%=Bh2W&KzI7UCYnXJUYaK(&6~PGUAv0I4Jmpryu_s3ul~ShG7f zon-}ew45vu*x14q->o8CX)x0wLFty+Pyk;Wy6o$kr(2o`X%huy-YisYkNX$67C-*E z+j7qTK6F?OaOc9(v4!7UvwhxiN$m<5R>MU&)p65M$2CDjR)vIdp;7-caxHf!i_FHV z@-)8H3rT(kKMgkygV#JWssWnFYvV4x3k1>R%_8;t>PWeXgF2eRm63%y4MOmFs5P)q zNFNFfW&xrrANs@HG=A^ti!5uqj+h)yc<(_A1tco|M6NwKg(ry;?mTq|14T1PdQ{}M z&6(o*RpkIMoASmV52nGbxdrTwLLWWCKm~N%YeHP(c*~0)F6sD&I$ZUE615Uov?vsC z;a`e4GC&QJ8{&`b1EdWa?EfdTx-HDXfm&W%3*YIX97S% z7JCVSA1Yxcnic>^UzQAc?u2o$xtfut-CF$)qnhRqfZ*YPdMUGtY z2pld%Ajpv7KiOJ2Jt#U22V+o;#Ul`x%N#FgZqLCz)?beVh-iqUjNkymRd>ANm|0iH z0QISEr4w@+czCF!BA^MpJ}E;Ql%F3C>5M~DQH3rS1ZOy`+-BMeaqai`O~DCcZT|uJ^>F#dqkmigj8~UbK=PuLAg90rDw+0p?z?MX zS~nG8e3Vhg@8syn3wBGHtGf_`HLRq2pw}}?;=k9NH>Q4t47t92Hj~jU$OeI;V;ZbH z8vT!l{Gm%%wI=fS3ks^=rZH@|4S>rvKxiQLz0uq-4*hdD0g6g^C7$v5h1wNFhH-M@ zhg7a`tpX2RO8RuacNW=aP{f8cHa12MA=xkF2;erSH#w)JEi}6i-C?-vdZcy@fZhL5 z6gcXp!pRXEX@8z?Xb#yee($ckiJ*dnW(oANbBmp(n*xo-`unjWT4TwSZcKwU)&Fvf zCs1%*FgQoUoTxSf=3womz0!BrYzy-9A@mlxEut%Ea&T6E6u3OpQr%ztB!lL zyJev6Dmo5j^M?!`)c$Pki%Vlz_m?Q$B&TjN9huzZ$`j>RQ!@2=kzE_k!JJSYvLqlqDYBl#zpmv3<}`*|(v z+jkf<-BCGd2rCy}+Eqshy)U~Ux&_GR2rrsJe$Ljm8S;K#C^QgJL(k#E60U^z;1c@hl`&J0rzqnSL zrzpcywn>wzo{)Y$RAg9P{_@A)EC57j27i9JTXpT!>-q(t2Z!taSxNY-mbLab(kWPK zBo~E;Tf+0Vui{coG-3C zKg*Lq0DBr5v}t`m`k1TTSKGj`355ci>n1SrA}S2E(uF7r={}<80S}(cKOJUj;7?b5 zV7L6!v0hxX`S$JG)JyZ|MzEoV7#8*Sqi$@Sj#TfyD({s*&pMtxdr4La)BNrffpT5T zaG3q0WO0Xz5q;4WVTTIVD-Q0$_B(cjV`=3QBlhwS+~!hJ1T2LkDiQ@&daUtB9LDZd z+Y?%kirdq&u&Ud#I%9^XVxJ#lisUtjx>OkZ<%j#p9y7*Ivj!@=y*i7Rcnh9>^|*nb z);e}Q>o#^P0?tsQqJfPK?xI;$RY{YRMgS0lDOVHZGVyc)oFAhCjQ zewM8P#Yd>1Bu#0I!lRYNoxd*q6@yz(PY+Htxb%VtR8LLe4Ls(@r1E%IrS=c+HeiyV z+8=y0xUHkJ0lE9DKCAPlCVF}_5bhFJe{hR$5Gaom28V>~H#43zfFYBLAT7!Z#W)sX5VNsg9*No&(hM;EUV1^S@6MW5Sx;uRgX-e zBeNZ{FsraM6TZMl`*7Y>AG{KLcs-32E?&ia#OLeFEXlyAu5Q$mzItuqTq@T0=V=Z< z3yhCBz#4b6M*sJ>Wp4TLebo^oLJ&n)kdqS(HvZs_7K?{<`qS|w7}ig-sbNXk4Ug2EH`M*4<3$q|$@rszBuv4nU2ie)mh|CO{ok*>gi2A6B!mV{=EskTknWyO?`;SF zQgDfZMkw<;3Uh+&K|}K{ob0rnTX#j zM3^Gw9WTp-`cPthOW4!%=f2U`!1u1!9E^v$JWkP8f?W&!xpUqszkfCSrR^!oi4q!$ zU`Gt6Ld)2=x1#>oo|sX(3+}Z9JS=1Hm9l-K98xoUpkK9V2-T2=psAT5!b_m!#p9v&|N$LrmV{rj8bBcIj>6kW~j59?om z=YYq|(?2mGwUL)DWczlrD*g#f1R#Wg6J(*lu~0WMn)KmS`TM1?Z(^`L*1ZJE>`$3| z*47=!PlE;7iEmV-;N5e77tvYZDe4AZF!!jN*f>7Ft{iU5 zjQN$qS68_wX28??_Lr8PCvSH4li4)L`EskOpwtX$p9O1+DJNZaPR^Ev59;1h37s&( zO^PQ0w_YZ6#I9lCL$}p0HDwgr-?b27J&UqzT-u)5J-mEGHba@)XE1TJv7t{)=V3nX z;^$AA(D@v1B)>q_Nwjc6FUZgTsbO^*d@9CWA4$BoZ>-@>wC)}@WNoVcmk+$m6sPW_ zBqbmod2aPp=jE~0$k!@Jr`OeY$TcWNh0@Z*OBJICk7 zC88UK6SCTIV03WZ)RaQnSj?gnBcP;2{=fh53q6hx4utdb$5FHS8=pIE$)?ehwP#+$ zQJ9tLwP|0hGGKt;Cj1(+xTZ$<+(|3v3H;iJ5AAQ?rh`_Z^Hjry;gv)(4&uKNRet=y zVITD#@_BGDT=Glz*iI)kbN1fo$V365dvQs%z4oW;C>#5Tg7dmd0Bw!7&M%B_UmUJ1 z@0bTv9S>QQqHN-fCCO`QZuVM~zIS(&GmCKc{Ag={q9)lz{ijMFw%t-6{Pk;-v&&@^ z`Ja6e`eZJi1SP=F59%}U3wg!%`C)y!oimx)dOj@U>Yd*5f;=Y;@wSBz#qN$6LPAlM z2Hd4pCy%gfgwp!0FHp5aNl7^6+gHI_k}XiB;yum7dzS$$Rr|{o3pmLG|BRj?%u>A38P>-EEQhr2&h2gjn);#AjfDD6Aa} z*~8is6P1omn2a2qM)%j>b+7yX`_;OllnSUyM>MoJ4~ag)y<6?@$@ej7MNWSHfkMS( zNlBv6w@}ApZr*h26Lm$RZA=fzI)z=+8=QFUIw)~E9Z3dsr3*G|wa(GQH~;sbE#{5q;EDQo;!#VXR}`Jug4*g=|}TcY5NbtO1_{IJ3ynF4eObcqAfoT1}R}4ae+C z3fNtva}+jXH#SC9IH`A6Wdvsr|9#xbZCHslFDUx6p+|6|mwFuRASH{G@tjK^e3X0< zSNkF_t#pKoPHZENraS7+srrDnhj5zDhE>Mv>*H`-L{o(gct~)GYaX@FTB7UJhwUgA z7f18n(!JCDyG!wk`BYG%X8=V6lneu)aXSbOvfU~-uluxH#VuW3MVHNrwp1BiL&K&*!`>PA-){9Q ztEMzqKGn_;VBhz{AZucS3;p0F~FM53f3& zGg;mn>r1d+VQan9?{69#i_fl+yehf*j-QA7VV5WU`n%@s?d-6*8SN*|7Nw^5?008e zN6%YgkJ?dkaHP!sjFyu5o5V4zI2nQc*2x1x z$SI4TE-5KkHFGG{8?LTk>eKSzhlqPCO<;a~k8J2)$S;1+wTOBTnKCF=;T~Guo!$1z zr5hU`SJMV-t+C~kPgL?;T-w^(VQY@7lbG|isuB)qezx~M;F0ZKA`cVHF>5RqPE-pK# z_u0y-H4^2N3S{qaMsIug>>bP5*e2%^p=Pyx%##Bu4bob4X5S1hJ@7nF|3vk_!WxFZ zhl{i#UeOb03V1$X)Gep=g2o>R?vQ(V!e#x_dtW}(^TC?QwV8E+-mas!^_@}nwEWNC zHN&Ao^$Rbo9R`K{WH2w-;}?huYhz3hISnny6UE6J^S7*y`@c-Uu}>Ry(pi5*0Bt+? z?eJdkL>tVCZx|Rvb_$(L9eM1cp`?J`MmL1%sJ@A51* zCLke@!aKIaI*NPMG6XdS^jTeEVZlo7ZiB+7Z-H_m=6Pi_x#H{U>SRd9ppkTbwHiFf za+gxYT!L@q(gp|%((0CT*$)nhI%iz^EPe$CU;S*S-_bqM1ShiBXV=t(FI80x?6o8-r`MNB$ z)gk}RTP>CQwrg8c-n%5k=u{JURY4fu5(b~;`pKi32In;yZvetn-$aE$gK4N@Ek)HAFl5ubH zHXSwk*`1>LBXNPH;R|7G%fqH7?a@MeJ{UMSW?Q?g&r(t}bmGqx2nAhMy&2m2LZx0t zBRA^jPseFEkm`zb#04q)tbZS1L_-Dv3Y2MCMXkv`Z*_|U!LvOR$KNu*FH(sf5?VKJ z;-Z?bT`V!g@?m}jcGbMhHGWB@%7ucj)n$LCW<0=dZf`j0!SHD z`bwq4H*a3GWrztu_z;hqv1G}PKB}oOcMeK z#{CZYOG<7Q{YY?{U=NpP%OWLgoBzd-^HEIs)~x{5geF;%Mw3YNiEvj4qub^WUbM!8 z2Vb*>o;Ca{vMAFPDNsNx11)w|5tu9@gb*0|L;L}g`>pP?o?jDpKXnSQa@h2wE?ws4 z-f!bRxRNzsqpUvgJSiXM2*q_LCjjP}J8yX6!^O)i6o{|hF zn=+@*m9xmKE=fs+&CHC!3<;&8bjcR|NT>jCf^dT5B1YbtPlyXOZ0$GIoOtoFYHXo` zK73$1TDDx(yny-dcGWeY)IOUG6~;%;4~IYD(2&J|_j>o*8Xwr+_dcS8_P)@IcuGh( z&rhSDu`oc;6Y&_Rz==|7{v4<3vDWwwNN`JEtavajfuASxrl=@=^+#CpZRn@SKy&zd zQ$3DDb$1isGFQv(^q8Sa)#LIyIqFT=mHB#nZz2~zW7t>#@8|yjV9a5VwWN+)Y z60}37b?9S{{*6{%2ZIlDHb$HuKe8{6-p9cSAmyze7euT6FM^Zly87EYj+I9Nl_Uk)l^E~+ zPyL{O7vNwLYJ9w?$`i zHft|AlWC#d$k4H$cxv=sQBB_~n`tPB?Iu(3 zu~AQcTA+!l-I+)kJhPguUTog{n{Urp6wi~4-Mof(W)0-H_$a7%%F0N-j9marKqwfM z0=cf^E=1fRWIJykW!A_E*3YJoL(JI*7z}HHlC{0Tyz&0Vua>n0Ig_ z8=7;47p`}a?{$x4?|pwp9MtG^?HBvM%jGlW{WDX#Q2gi3-6tw_v;SE+#LrJ?H)avH zw#t!*z9nR$T|Xq>60}P_mA+P2Z4~?b`E`Z`YFd0vi5(rwvMbNyVJbV-~MXs#X zxLV_FpK@M)79a2S|GkGVYItITXe)ET22j)vA70DGjxIqn{>xa$ENENiR|N$G)R-A> z^~@o!1}X&09Ex_`3ya`D?LRn*NkZ(hq0`fBwY9G=JU~McV}cdWr-pU zYG-?U9moVBfWw5qxFIZ4LY#@m#96#GUp|eNfw^wG;b!TVGZ(qJY4FJKxR$>tb{X(d zV}IkQ+1mQPfNRVG!&jhH+n~%wZn&l$U~}e`{yr6|*eIbFNz1kFwV;%0Kv}JMIU2Z+@0;*hh2aKdc8e7)lXtb?v|I66W$#+XLLu$$7`hd*F_BumX=nv z->EB!1dkyplCAoap<4n;ceI{qy6v=Zv5|N7Xj;k#Yn-D6ENfn>bwDGjo-k2>~Kw~#4+HYuSJe8z@V5{zS@qJ|8w+!@LilJdoS zM=6+OIz>c&pT^H0zoUask`S41v$v5@-xYiL>tn^P@zw}mpk(oGMi~1j=+nN{d)~FP zLRnJsLE)lSRaIO4uJn4CHuTiHezHAz;&t&H5$R2sWmXdOh5QqEtSgR+M;2a?bc2LlV zGR2M#mBh_mRw1FLaEf!U(!YJ9Hp!?*e+nbRN)hdAgp6Zvd~VRREa|5YNx<&p()YD# z3zN$xGcM_e9PB#&zK=BiPgVK zV&mgmM$43RiZqmpV!nrvA@EwDDPg~TPJvHOtLg|_q~3uYxUYyI5$@Jnd>}jiB}N zHh(OC^@BbmJ$%ceO{5B}Od9Y+TTt)G~ zWqbVL9pe3crDeJX>g9i205>ei5vZf|#l;VRrz3-En5MSqO(Q~WZF3`?U^ymbIO>!U zrt&PWR()47r5VS)i=H$!^}TvqSC<|c$;?H`jXoGGp(z@hBiO86-HuHsA-+!Qy>m~U zdUM=`-b1pPno#a@r={OYr>CTx^bwyd+l!vq%U8U-US+pxiY{Z_taLJcnV&B$y_r}B zB>c~M#{M3npO=c#e?*D&WU}cr^uXNL*3WUJ_3{7e_$6DdGXZ|}r}-5%o|4kCM5jg` zub(Y0;@Fk5b;d&#Qk@bTOEK??Tp+pi{-_&#iDttq>|47b%KzcVz7Q0hJ>1?RG%apX zR_!l-kWKm0tFV_!A(x=!!DWSk*#W-9VAgS7+9=cFyt#9Qx~3_vQcHu`ulnDZTC#m- zy?p;yoU(-rUZxhthkF*m&Z1j{gbmZpuZFJqpPqw>8_fU(cmiu}xYBtxW%V*;oq2nY z*4?FP@Mp6dCBH01&)_%QmMdLGm+EkIC?Oya0h#&NVGp2!7{$hZ8{&>9{Gbo|-~fOd zl-UH4IIENy{eqkxMv+{1bc`&sy|p*o-gYO~%`LdkhM7|}z4E78&Ax?(dx-xJ9;!&&TCmY5KleWpa11>O^d7M z=mA+cCPdP>plU0@w*5_CK_O4i)mn{%gC<$&_en9n%Nj7GckYAEzwk~op$U(%gZgQs^pQu zrbo>(M_8bFVl7lH#dNlX3C<2Swo(C%@5&QuBy~%1VARRgA1UJoWKmHGYx{w-X}zC5 z$rcREY

    uOBL%rg|K~aAWulxlJ`ybdCth1SJLl$JFt?kXZOvLEoVr(Yzti=x zeDh;@vUaPo#U(?-bCbRm>Eq*BG{*jKA3fr0Gz8^|LPwy}ZOjiq}7oEj?Lz_2Jj60s{kQu3f`_+V(lF z^UDG(2XkPf4km_^sM^uNP%Ybk0#v+8doWf<_0suiNCDzyl;9E`wV6-Tjg31;-QtnJIUB*&xnd~9CEr@Xxs*g9=` z|NF-`{uUDA-!`#{aIRp-nrG+apKf_I_eUpd`1?PWWs-MveCjfHu&_YmPhX%-q^X%Q zpHnK(5aTEKX=mkQf_>27s}oE45ZZ%xN<=4LF^GV>JSUL8Pnei^$6X`u{|h%T6VYy> zDh@ha&fh;h(|ZySBlUCU36*qK`3?rqI3#`P|E?&FrsIn^0v0C zS<{mrU2FpK`mGB&j*_E|iu}f%uL~~?@y`06u3BI|B5-xTzK`f1lroVOt>f9HtVk1? z6qUJYKiBFYvXS8b(LxDh9hcD+%cNLs^6jN+}o$)vhonc zQ=n!TRFiP586O`!;Q(218NmNv zzZUkc;`}dy3_=9KNb~$j1EaA%_4dvIv*zQ>9wcyV(Di=ci4>eivz+@0{$e;=vCm$c zw-b}C){4-c+`nh_@pxy;+45Og*|q@RE1i??-@CY6?HqJ^X=`ro&263$^*5Txue83k z6In>l=)G}|3Jc3rBW>Aadyx=U81Q;~`{NH4BxZbl@f+s6VYe^QS%O_=&cqdnJgZDgfidD4ze0Wv3IZaQDizpGgfSue1LkG3U&m`N6Ee++e ziXZK45l-*oI)BtZuPy_#2=fYgUVj{sxOtY`Wb>yW`z80=3e`tF*M=-kTjCs6{FrzcA;uET$eQxlcnxG_mKy>{C~G)?C>B zbJ~DV(O{0cHMCgYk8OYWkaAtiYagT}s@B%*qlt7$Y?NH-ybal^*JK0YIB&IS4{2nV zmnWLH^Po)1a!Ot1;)1?cprvDasanibrp+0XYuJ^HjZZ6kBO*47N4Rv~T^Suagx+mt zozaB6&-@L67^$7GmSOI@4@4h+*5soG!L&FVPug(Ykx0EY_3pkw!E$69UPp&q?DKw@ zgq_5%Y*0=(_^ulADg37`(1q43xp%;V`?o-sAJ?ZeMB%Lg0TOc!rt3oMj6oAz4RE1l zC~5jOgY9KE4#1nx=-Hf!V9XHS3pFdH5%u0VZ&Mn>2FlA|e`(`@Te)6%I0J4qIM>bt zUv(nSmFER?%=?*8YYr6md7dTAGpp|pta_qc5b zsqsQ6cnktwzs3<4kB2<*6AY02y%$y9g=z=wmf7Z#^g*9Kgc!<#RCok?i+3sv))@eo zWFb;AnQePhZG?;Yti^3c%6rhfG^$SXoer7zjvW(gd&}!wVsqv(tjCfRD?gx+-8AXK1*U_>>gBp)>Hvn+80H&>o57EC)R$)4H00L<- zp)f%RS-@KDvr_8aqm^-B1?|LH=xDHo^PgA1R@NAN`t0@e(LObwnp=4q3^`-b_B3Qs z$GWX!OM5|>E48l*XhAWlE4Qnebolxe2L?ArVh2PR+B zLy7%fGd}9+sYV>hv_AWfPo8jsBDk5N2o3J>oJBs$qJ-k~aKml)g1gSNL?Xo~VPso0Y6cNZ5#0WXMJxCV)$6DSEKHHB9bUDyqOd2AYS;|JVQo zT>vx5O%NOC>xcK=iRpEZ2L2F`07^$103!xcN@L}EP>?AOPVghr0v($9B?8Q=O#kWV z;6vS?B0lguFJD!2sMPct<(2+#0}2VYwzn#%^xrMqiVjmSOOakV^Uc0Wd}6u0JxyXL z8SfODpu#-kz;>aI^5UYzYLBVFu-Vqu>Weyy+T0)v2poCax)g09jm_u9W2_F{ zsocrkYTkzpk9q2Ff}(*=fOI*m<~8j0D|89TDfC7@x(LB$q@|H4&5^sqDdK+Ct2W-L zGNz}e=fVTce_>ywCxaL@%N6hHQ144bBK7^HTZ-47jO>doS1BV$)Q$9|l@(39iCYC5 zC6~Cfg zsX08}aur(pVq?xS##IZfVz`nX4T$@a;TAic!92(GpMH{?JgMZ)|KsXC;JNf&+L)a&@_sq$jaUcS&33fGO~pb*)v3h=lW3R|2+R*y^eD_ ze0@IeagXc1@9RpJy3TTEaiUAeR(D(tQr-{?eU_7RZ`pgZztGR6&t@-US`3%k!U_xH z1_pn7UfnX0_x3F##a2g-NU)svQU7`67E{FYX>9uPKfS@={>6ZP< z;nc+C%#wD;RHUt>H#-sah03Ce*Jh@R-hnIpA1j{}ZJ*asZQ04OlTy)x@!G#|Mwf`) zfy&68Jqw{gTF3CNj?q0S>---G1)l`Pl;>*}WK{hQdkyujEbfz9+$H|!`3Z&U?uWf_ zo}<4^#23>aAkJZ1o>A(#XV^H|Igxn(;ltBLJ?1&v(u5)5Nl(X+d7~`98^F=L<_G3vF_0v6|H*IB-PI#n2P(L@Ey~8mqYsMg{l1G*ZYQPapXJTq z8(&PllyL-Rt}&qfq^y?c71qUZwS6yl3p~cf5b!(m(oq zp1Sr+4i)PQJ{6Ls){d6CgGEbA)6u04aWo{bKevx@{HNT-T3P8KD(YZgSk`;>!sTJr zZF>C73{{7|dF#G85?uUyX`7`bzlzpif7w;XOXIX>gr-_^xy2664M@$^x9y5>8UGSD zeCghMw3@`m$6x*aeJ(kr@J1K&t|R#c^Aew`vJ{-t7hbFSaGu!^^Y`Q(IB@SLWf>YD zUt=7y#?2E+PH?d0H@9BT?}cupqepk{=Tpe|IW!zzWNDXPSu-bg#pO2OxT#tuv1WNk zN8e}rX*X=JoQ>*Yjw{fjlKgDSM^A5RTdH51<=s?Ox}NX< z=)*^EKLqF~M%GWoF;j8&|C*&z(MylvvMeZodF9vi{pm1!;CO_Bto!fnK*pxr_N!?i zE#6>XcnvfjV;!#1rXAq}XS0;ny+yMZM?+m5Rr2w+)`ORMEH_-aH?%Y}DF#0&Kxw+?^-svfhn$ZLNFI5c2V-sb@wvRf6bMsaqH&fPZ zQ9At|f@=FVQ9rG)J)*25`rG~5KX?4@86^qYLdV>HvY~ml@O!JKp$)cXcd3sjXYJ$g zm2CkZ>dYG*XTL|fXBodBO+Jv_xNGOmrB_)3Cu}knZgfg|M0GDON!+QJo#pl2Tr1gr z=MAZAexv8amG0>`No_-dCCJWOl}S^p zVBK|=Nb*gM`?7Nz&zk&Lc<0PWO`DK#jBZEtyB|MQ4ZiIs`*%`rbMvM0m0f~9x89Uq zVV2hz``vrdoQP?GAbc)&_Abg5=BD~tKDleI#C$F~a>7NWpi4 z@Iy{dZ}~pEEj{kpTalrn@3ApO>;+d8yJ-Ho>8)MQ(n)G`e(1(Hd-g1PfGcjaAbF0# zaYAhbnt-c)Kx&#t(AH93kp27ju5?{9wj-`TGp=iXpStmTp{0rZy@98__QiYS#%7a2 zHk9Yj2Y<@)@#3Cx*M35O?{rY--nd+~&J(ST@oy~Ek2)pa>d>ot=!o&Iu-FD-Zpw&< zXMyAMQXgjy?WKEnIVKoAm;abQ9xitA+H&J@J*|?b<<}PQ7%+QIk}WO887&k!TUAz9 zzwh0mtdXcewO7W^k#wduQ_GZkZdyMGT9w-z6{Qg8q7 z$}!}hRwrw1PZKEs``5dRhtT8k31k>Twx4^0in$J?pS|H@V&W$x>~(K(oHyo`Cnxo- z+3?Ji_)}Eh_j);PQ5+b2solxuGf_HSbNPFAgGGF{3e{$ctqs{)jWSH8ISjW>QVp#m zo82#I_z*K^=Z>{l3Zp9YVJu&l1I1a1q9vCX{cN+dON?S79$pX+`;Wyo8AF7i+uZ+0 z{%pO&;#fpwwR(P5*u!L9D`qbzdc}bmspk`~1ivP@zR1={yHh-2;8z~|XfjHYDSS#V zqWZAycxzypvoksCrNk~pyPTBJ8+&Uzc>cA}pE%%&;`Qf`ABiRyFbwVXy^9eP^s!eW zkxSQ|%VIn_x$*9^`wt$Ruo)vqOHRq1-*9FiN%O9^sy*#qNRxkMC!q4X6k8>`%dqY})Ub z)5j{fo`H?zbadzD)VJDu&CbkB0s`4ik#g1j?AgOeQdoI;x5Bp5*v^rtWfvamT2%an5r@ARuXKA)Q{8Jt!0S^m*lQ}%B!-x)Kgla4;Y#9i1+5dmMF*hxmn&iojx?OfEzM%2Q`z>RsA=MA~qa6Z)8sr8BEDxWg zEL+X~rc2kD6*aJPs&Q;@KY2&EsI#1IhwFET4U>zPFm|HPD7xM@fA`)GwcF?}O6nC{ zzB<>nvhPbmyYbni=g;rYJRld*=Z7d#ve}5bX6=ELz)e=FHst|TpZ!Z)WUd#aJ=v2* z;Z*piA(L;pNR9NbEc^J=Ga3@vUbk)~?K~dx0GX2t)k}=xS|?;a^wEn6lsGMa?ie0Uc(J7UdFyGFqmKQQ3JP&dt~ohjFEG9u9MWVn z=Iz6lJ)8f+p_4wp`NR8@g>I+6seNbZYCZcZ?Mbm+*NbMflz{YjM^TWfjr|7>MQ*0GW&Waw=-1jaI^Hk6Qnk#h6 z=9}t3_Rqz|wU66EsE;3!-$YP194=pVVgJa-PvKXT5-R)0J0k)bQe0*wFL#Txvr{!T zI`z8Dsj4^07#VpzD}VkszS(>z@^sq)MtAgHXMq`Q`0n~rTl>Hm>Y#=!IHqlL&x5B$C7V5ulnkIF%weMlUJ%8 z)aY^hXttBv{ApFk1?5;o%=x;VqJLa{%=UAqL^rCnzT~@JQ^WSDY6;6?;9+r*_P^6A zBr4MG0MiA#`&x937ZjI%-#vA4aF#Yr#ccmh%Ae?86Fho!y{`;8h7~Vh2E6x!x_VxZ z!|y{8&T5)=;Y|`UwcjI_{Y#>v?zDSlnet0J&vLkoiQZ|KkXEQp*m5^%FFSFdqch~$Uj;#qN5w9q&BNA3wSoAEFG{ynqGfC{vP zFF7Q61(+q~eayMQrWQ9a?Ot-oUnb8&+Vje|)|5?=NJL;P%k0z{nj6Qe1EQw}F0)rRjE)23zI~QsaoTG?#r;mzJ}$WnNTuqP)-_t?U!zT#n%* zOx$NXUMkeao*d?!>x!1>p?ove9zq)=V4zk^U2*a3{@XjR?2XXssIRXl2|q7#vbb$h zRc|V!q(TQ;pj#CU!EXGlm$o2UdTq-R)|r`!6V^Q^o0z^YJ#7!^gKP8a@IpcQXk9f- z!TzaJe(bg(X1(v<{mL%jLwCGs4mui=)6!U3SubfgVoXOE{SX@%d$$_4f?&CsyJ9(d zWqQ+c#fqCv&4|;{^T}D7wHzbk)TnIFoZE?kW9F@=PY++p5GkWo%Kbha5Gdv?ez#3L z`)+OT7S7c9yZ5Llsb!qT<*b!MC46hg;2}OI}@5>EvN-X>F~g zRZ5e*d(waR!@?@Q#BodWV8#q_%+UCF;>(wh!11O^x6;E5pqZE$caz!E zk4DF*_-Cc!ypEoODuxq}T_h0AJh8G!34L*R)>T^E-%(VSCQsb$xmEpH@gUCo$=`YT z_cHkiJHpk3h7P}6NU7m-D)hWl$j;t&X8;U6m~Gp44`Yg_IF0`WhxZz;9lc*|Edm8w zGp1#-bp2w6I&yh)%kYIi626gQn$C?EU&4lGsK|ug@aSqVr$)mWxuKE@b&;HOG}Pu zT@`!VKFOQ*j$W_b@?O|$(0}>gZBE>h0Xq-dG#dOWgyWY2NXWoqjNoC%AYFEl6x89bD>N=^QlZBd5nLN0@ z-ieO=?7`%y2d4RZxC9IjCl%62iSNGuXIN8iwDp0oZMES-{b2(y;bYsV$J^pE3v-<| zU_k%QAJ17m5zI;0dz3_BJxEVxX8n%Zf2SN9VIOQNxR;qK*PJ@3@iuOCYKUFICS%iN`vwc4})^#WwRF6=_EC*3V{_onbFnnO>#&|)EdnW1;w)x1APabUjBsP&d zH5HWg)G594;R*NOirs&nP8@mEBLFYT!D`TYzlU0TrFBe{WH507k zJhw37?Nr2~$DcP`VcMXg{p7UGn0aATwP}2ew7m0dUHX9cuP&|FZ`7?5I4+Kf?kAlc7q3}25{m)819&`<7 zYCJKx%kcr+JU=@erC9&l{2+>2PEH5G``ci4dD}r9d3nd=%<&IM3N>6XsOfU|?m0K{ ztEV=b?+s$qj0(+#@N2^JS?vG2dcG^_uJGICAI zVV!?%Yj0od;~`}=2QrEI3hleqVqg`U@9G`lr6*@I=5SWNiQ>&Km-(fMOLs`MLqf`i zb_pdC@3Jpho;EZx@_1%cp*Qg8QFwBe;e%G0(Wz5dFbr;BiFAwozh86?xckgsjb(_m zL`7r$uG(&-IRk^Qf=3G&^B30{2*f8Oys!xI_|{n&!s!m?q%9jyk`SVVL`O^6Ny+Es z>2mR@&*c|)lB=obajp|jYB=ZR)gv4|a`|y`MhUCRmO&R9bPCW?o#x?f3D`ZtKUqt3>HX+sR?b0)U%*p47h z|8@!g3R-M+4?JH^ioQ(HUiFG!b2PL8i6j|Ri{ZxZj9@ylCc0Ea{o(g!6QSMqqLC>7 z+fDwCi6t8^vJyn2;j4w=G!SL@ob%7q`rJ1la5Ae@a;5f!illIyeQ4-NO7e62$qSnM zZ#atb2@Zb~YbjJr^6T#xvxhaj$wGb00z(ADEispe)oRa7zV`1kF8?TE^*@u?$+w5} z8stN{xw!;k+G4m~?T{1v)V13D(5NU{469E3H1l~GI6IP)DgOJgm)D_R6B9kZ2XeB+ z=XoAi>v+$^=}|Kc$G-OVJ;QdwYss9I27%4ugrQ3{Qq+Z0-A6*toFc2Qvz#?HH4PL? ztL~iwPxRyYKX3iE5=22I-V0WD{gPs0d}%oq>$+%kUxKLxWZmw87oPjg2c0vDy&fO$ zBouBd{iJ1f-Q(&ax#Hgj6NQ%DW>04Fr1yc-@Y{n)JMP^ID9Bjvw8;H82XQgG*kncY z73gPLORgM2)BA+a%A%%M321rug8SDSRMNfE7L$ugQ=o*D6p8Q)*b|1n$GynNIgg!Mi+I8|EE=v zmKAk8Yl20B>5;&#m7j*={SDFI-c*LzeV#sRC;8wEWwd~A%bu7V$IHg;6NiPug#a;~ z(P$oB8TdEnciV615fzCHL%Qee?GIseIVmx*KQ+JD#MpSU`#R0f@Am{8ex;KQe&{Xq zt!P-!g=}9ja+pQz%I&DVOrrWX`uaALlb6rTzCj82-O8WnCC|CyU3ByoLnB-DL$Vwb zn=|A=9fooq`tmN#%$Q>^Bt9w0FuTaMDV6K`^^@j#I)9eE7Z!3=Ywo>&_)eCKj)gJM z^|azTf9b=OmD~sPiyrp%^=+Bf%+!66xqone~!^U#OEblg4XMF#u^#u@~Y+wG@L%(z25jBYnGffzZ?On-n9hg#4pIfQu z3JF+$~)4CkxQTQxGQQyPnC%Zg%Vx86B^ zIyLxCdu{3&hUd4R9hBRAZ}T~htM?`5=43z9o%1~)xaEnv1apx4<3fmYNFJft$voZv z^a@BW(E}|Ec485m?T9j+!Q5*JJNN1HXEh580XgB|rw*c9^U%Y-VWY-K_nY1LQe~Z~ zqM?y-UR6HVN;A^HJs|=-MK`Gqerq6cw35#jACJ?!PN*Yn2%8o$f4l zm9jWPyZvYBK-BC|gRaz{$?KGHl6_o!d`*E&hLt^B5865mS(3b8?G}v%@3jReMT3W3 zd-=J!AFyp$uO;L(=q!4qz*sd+M&;T^PaLhc4bQ{ror7hVUN;ghH_% zU8iQ9!kahWFLI@6%G5uNfm7uy1G8k^{9d!>(6BJ8mF4Y-H8s7x^#hBWjVbEBl_*9! zH}CuXJ8~Xn8<0U%YHRza5{wVf}ipg9nvCDK%XGzJ$eGK_PP3 zY{%V$+la+@<=?X2HyDefCrDCNRm}tCor$SwQH`vuEH6L5;)4edGPMOOmNiqO<;?Qi ze>jQ$xO}wFNi@%*fdlJ-(V|^9S;`MK7Q1S8I#g*F4JC?F?b@CSPSv-J5>L4-c z@S|^3ZOOlCfr{0@XUSO~1XbZuKCcNvOPACw<09xyXoBdKdreoDA%rhMe0Yy;*RB*q zDiWZsOU+o)iH%Jd?kpbaO!*>0Pd_UdasAr0%_K6sa#@v|I;nM^sHhGu!C5&u6%f@Q z78DE(4NZ9Zl<`MjU#{C7%W`YhoVIlEM_9ePt*r0uu6g>jx*U(1tda~5F6veCO|#IX zvHJY@P(aP5O`D3nB^~;1^O6qm^FN9YkrX_@#&(LHK9q-_U&GuyIfBItkz^p95D`gSJ^@LU;Ft(9jL3uU-|Ar~R`1@ne>(J3D&yn3E>D zL&+|X<1H{%1wq@k;P~|P1K8Y8w)wnAj%d0RFWqPn5f7`e%(HxVdmB17Rl%8_2gZ6i z!?bwgl^{Na)Qk)UEi z_J^KMt@M@KU|np{^1=|#Y76d^nwA!q+yZDdXF>F4IWzc$*hP+WkEQ=>l{=vO@*F{m z<1ss&fGHx)OfywboDBnRYN1sU@39;i7)Syo6zF8`1u~|bS69!tcI|O&zal-oFb{89 zaAU$3#}mYck|LuuH~C7@@7a^q+SbmFn;cguPXDLa=5aY(Ls@&ss;w7s`eMUm0W)>Mc*VnkIhILYgOT|G(3Ob zW6pN-{&mLiB<(i&7Q>Ax9oVY$lgpL7g& zuM+@q1(TTP{Bwe@9h#5doDaa@+_`gS0i#$M%-&qeHW{(k)+N|RrO-#sgSVJd+5ODReD^vWZsNJTCv$I zy27Hpr7|_;Sch@(=%{tTZsD_r-oF##7pgrWg%i_mSK8SGLar0u-rm7)XF6SPc{=R4 zpmd0`w}N!=9A1@zhGt?gn0OnKt;@o>rD3*>RJ-G2V)kLAylJj$AT3wuRQ)z}wMMR^ z^D~RiA_qe9bXddn_IBv;QIVt;N2eKrrYbqvgU_W#`_cWn#AWoT&*!Z+1V7|T|NIaT zHhR0>#Kgqn&9x20?O>Pl^YbeLA?hrs0oCWad`g3ZgGHV4O%12VT!SpTUOUOve~J4Y zjJ?ry(2GDL0n9C5CVM{&v`(qFSKRX=^z)03r01w9Uq18x{gv6-mQBvfze~RM@W1M6 z&X7uuk3WB2fNHP!e0?(Pb zR2rYx(|am8-%alIvy!t2ysLTxm_1JdWvX;fPmc#!$>BsKJOq+8&j&lcox5qo#m;^@ zghRo>&j*x_DUzTImgzCPzQB}ul6|(Zcw$`n^y#V-7D5^Z1{rhT+PPE0*c?NOZ<7=6 zAS$)4Ok?K}+ov8go7I);YICo+CP*%(%WR^4=jZR-6c z#f7_pd&e!WbW7*KeKH&GJRa;}-cfLwNn9&4JX~~_Ofsk!GSQYlvNYFa*IZvK&tG^7 z2DdacGBV>1EoV_6v#8Slp(yF`4@>;lh6Iz6ka1JX+~rb`t<3jsB0Bp z{zucCNTERq@Yo6&fBaAGq?(RSnx^5>`OwfCz8UH&Dsh?yzt77CHp<6d^QHOU*=b2|Gx=ymn{?at38fH8BWV;#>eW95j;*r7&cs=P$jo0h+q=CPq%$Lk45s`yMe=gJ4CE% zqt4TG-I;4EDOMABb$_nc@!YKx-TZ_4Ub9V1`V7RDmYqDeQK`W$52T&LP-|$;)IT=d zmLm;^nFKT|x<;xrVj~T;hO}?W$>FarOzvH~eqCwTvQ5`({l#BiS%{l>4j=w`!wUy@ zHYYkV%b=uV`m=CSj!gT@(81~>`Ial*7G=I%8#ew@FZDK6c;fIt@^}21XzwE3^ZpBS z%+Fd3u2j$Jm2N~X(*Ri(A^Y#AelIQ_vFZS8q9ur-16(#!Q&7|sqw4IOoV@$@zvY{| z{efVtw8|>cKpq&T#=N~0L39zsB6J&Tag(!ftmS_E*u>_=8Zva7zaSwOAYtif`IkPjOnw>?nUof|qig?b|=?<|h;uqk2cMF-{XG=j; zOumVFwEJ$|w#}q=bJQ;vz$~18^47197rB+q&GR-=4yJZr@bSB~DNQp=+V93ZH`_Zy zGBS=Q;!n3Q(9@^9cyU%mC4gMwR-6_Y+4At0xLa&Px0tDupI;7xCw6}uDOLLCr@Xp` zhSmI}5yfV6gF2V=BGHqfp*O*$f`3lBc8vnJB?FnzSZlT}JA3_eqf1UbeoM~fR0D(4 zwR3~LL0j2RgFP}H;aDW3G0w`%H-J$$6_dkEEh{+ZX@p`*e}tXwul^0EPoMU{1Wc~y z@1MOcn}5yCwb*%2@2Lhd3~p)LdlU4WzaWY;2wu&)*ps)|p>q7i!Otgsik1c z;|25DCh9-?EVAMyf&)Jp2XCYvjU^-Z;9_Hwh9{<=_&GP7*k9`oS_i4f&hnZ_wHeePe_H3Lq526ZCz6-h=#Mc zxwzD%eSP*w?K_uhXfw{4axeZrb&Z9goZ8pQm!Icec$2YPC^@V-YemD)k3D!lJ5@aa zRl{L@YN`UuX$JgpY2~)J<>km|89Sj+lcaa{>jeaB9vBOs{VZ5J`0>FCUzf;}b7#+- zsUwap)YF^433<{Yw@F!%LLfM8eblL!~$CuXhHPIWbKeM3G9W1AjQZq40h^LUF zmU|!kiLL3+{LepKB@H3b!$&-5l)VOb{OV2f-m*-usTZpfCsX+717Ue571#UT-%RTK z&~w=w^+28j9W1wc!7j7NCTC>CLa}wLin;mob>tFrrxz!C%0WmLQ6srHDpNa>mXe~P zpb$WqSad$j6gV1s&4z+RDqdcIseQ2M`}d1BZ9feoy?*@%>y<^-v}CssTFFMW+gKx7 z^0-HDfRnn$*+YlydH6FQ899XtojPwGH<|SYoPx7qrGHMFm?+p4)tCDCNKBTIhf8`D zfvKlCeVCE@Ruq(~B&OccA|jU@?*Jul8rX_QfYR9h>U>2AdwWRW(iKiQ3>0gqsXYXjl~c2}nY*W%9dS{U zHm#iompA#N=nUqgycxac}!IKyq%w4WQrBUCF6@9Fu+8EzPg?uD3-aZe;tG$s(7v} zLKx{ub-!to2c8tFgXa)GG$G#!5=O!8;X z)~hN>G>s;F%~03T;Yn&pL0bnh{9@C+3*m^5{BGRf0zEmyz4v)D%vcg%I~LN7Q>4Ld z2pSilq@%8^JlShX8=7kPNQ*l~XWZb?W4P8xv1z5YOr_{=3%_eCkks~_c>*$!lYmHM z5#vDVsvcK?Rc^PKOZv5I9rUe_8=tdfr>CDyNm)rMzm6u)|aR{2hVloRl<7@jS*W)n8 z?6EC49__u562HLSgh_$Ngcl52s-Y~e1Dt7yNNq|=kl5^_8_D*ut&S?)%wP9p?3mgfLgvS(yM~aGd@rNn3cza{Zr`jx< zcpTAGh%p%=?HZ8~F@-D~vAG#2lY$cYYsr;-k6)uh*;B+5#|W?9-bX%Yj03{2Uo;5qlopI2DiusmDdAKCn^M@yaG;Kuf$k^-35X^n1{$i5 zbd65es^zpzoiUnM1@*6yZ{MlbybPFDAiEO4Bl zEte4CAeO*M1h$KZ>oN{#sRxssLT#T!1v!;pk9V`ngebtf-Bmi#3TG42M9Zpe+tscA!H|lnddofJ{;5rMXVm=);E( zJAK$?=4Rc2h(-Zi3oW1)V{Z~D|5jihM^MrSq2V8Yq|IbVo3mW4FU)~Ie+0sRmM_3) zJ|blLc_$3v2;m(ZH7bxd{qTTz-3;L|;D|3XNkRM!xmXfDb)?p3Ift4_wD0Aj1q~vO zW`Z{#D2kA~cWsnJ5dy+lEb`gZu8ssFSySX2L5;>cZ|?P;2P1P!sf$fKEdo-|u%FXN zYht~$icoe_Z6@`o5|~>Fs7?dc6<-3@qz`$kBGAFlLdHgjcQfNLhj>JXX#%Bx&J%J6 zR%YG7!P}RBh&6#`ezuI92GFRNZ3(kdYq4tmxJMn)#b#g?e);0c!GyF8}@2>qCrnlfa0Iz>(?;A(cl#saIX8=LFn2lNE1 z@qkVL@|z76k&q*bBwiPxwrnun-o2T`dQ44C?M)j1b_-~x0jMKSinq)FMzj(E*lyUk z(c|AUZNM|>oV<|lwdm3bwF(7(Ll6%)#mj{tCfhL#!gYJUOPqqpJ|vJ^eJylM8h^cL ziw6VX<$(eptY8Ad0)1rDHaS*=c?8)%BKEueT^F`O1AtptSpEFci*Glzy>1!};+V8R zm0;p)cOPLmL0^q5bKpvP6ol7gE`9L-;EO#EPexVN@!~#Vwt*l!O>`6j6X~~k$ zbqgI5MqP@DXV|b|gRo@|sKAIN$CVF+0&I^5b!X*M=Von>;glpbW#t&{9MeLPisY1( zFDT%|AVXF<(&?m{J?F~?sPbwmNAay zIq!i3jbM;(L_Q*8gXd0Eip~UROT-eQz`nT`L3f{Z{``63Q3(hya{$!eO%}7mO#ow( zGfS5}yr4P6IT~m5lsKskNlJFjIa_q`a#0Q_`gFRcfgG90@?Mx!=~b-EBuNcHwnH84 z@9h*Li&bmLto9kYe%s=kp?>@w8ws;othSVFjN z@6uF|50She|!jJN<*{6nc!>J7$Wjc{p$s|HUp)I z5hx(q+c zPurb$40?L~HIZqAO@R%$2b<#b$@|L8U~FHX@sELl5vZLUJn zs-GTHCBT{mKpg4byu7@#SOzO-WM-Ou6W)pX3SlFOXaXP;WI`Shx}|dUa8nP%!di?E zwrwY>KLo4$(HNC<0+ zH+e7^ea{M-)i}wo5Qm~WO>|_=u3(2C=_CjGE z+BlTc@+?1Z1b^{MTi60Ty`Gg1MyUi(~l;)%=bjokhW4#u*oSV zsS*VeItGURuhwKyJvPkJR98ERd=@m|9PRVJe{&x?q=JaZ%B2kO8AOfsiI4@xz$Z|w zB~4QR=lBe+L~uN|mL3l!D8e2S~Q(?BQ3>hXIBOraABS-STI5vl0%+oQ+)1hZ# z%9x*b3t*Od&BQZH^=*O7=|$PN7S^?-zcxAxj8h`TU6{GlB9_wB)HKBAvuTclqho~L zBhSO+8!1tmyAmPZl4qqEz$B)D`eOswDTFK=xttMSoL*W{Lk0)9b*}`pG%_z?PvSsr zavEWOZpvy7R5tZ$7EkygjhuKwKJ6E$teVs9t0%3-#xSohciz+U6^Bw($LKCq^YDBh zlJI($Ae0iVMcTKt>%0F5B`O3XPrNG(R*?6b!;|2|spD6UnB=$5644iYp=Bcqb4$5U zYG>GBfsP^*^>@aJ^zgLq;o zyKTQMFYT%BMV$mZ;Lu)(@95Ce>^8$@@7R%qCDhJ9O72(qXfeFHzc*6=CD`(w`wc@6 z5n{r)8RxVGUSU9oLNdTwA>`(dw&q_G@FLlC6sQmf8G)2yYd>N|B5-#`?Dom{@DSlZ z!Ry_UI+dsxnF@k1q2eW^U9){5N|t}-r*;F)L?o;uJf4CBXNl87WRPs!K zq8sE-fE1+3jESzJhq5S$L;CRH!#|Hd1HGSgI ztvN`^r;|(6V%71FMc}zgt|lBm&MSZ;@B3_6Ba|!i0!$@W!?%vA9i={ThqAViV0qHm zpx3-RvL!L%j)aTv$L^riHYeF>Q^v> zUrRPZjTb%#%^Y07mP(<-^tI$>%}tt^gdYT`MIhMajG zo?kpi?C#gKa}&&NZEYTZs&SZ3qE%BQ6u$lAUQc4u!r=MZlgUp!vip zGqEO~tgLcsX-{xtN_3Io`SZ^P2hC9}=8=*rJ^5BD#XG+n)B%K@bVaWuAxc1C1ab8s5zhGe^QY;Y5Au9ujS9gJBaWQ@@ngebf6LIY z9b9-|-Eo#9M_TBYiC8p~y#!`)p>x99Rd3#vsCFUo{F|%f<|s0eK79DV!_6&+K>yb~ zsNT+;IddPk0eWIcp}q$4Z;CvHi#dZScnjQI4-mRWbf_f)vqS}af_~e!*iwisiF(dY z$}M8|8lM}Lqb9m^jz)4m2J6P?x|}qjI|AU>Wi>cLS~>*OZ#7Cm4XUt)IENsLmFg^t zJ4mb+$vjH2c>PgcUitH0o83gi1lnOdHVA4HP4F(>OK0On9a=h2BFR4y28sX zR8&n+!;K>}kSM6AY@DEub5`QYuSOU}Ho2_~1~Fgaf{JQx-MC>j`d-^6bs9fK1TH+h zye1+Mc?hnE>gW>9xWcgNZzM^80Ye zgnbWYgW-7Xwa6nWX+VAJwr)a=?0^`k?^~ zgKdbYED-4gs#aR46G=%K5@;dN)vx0GYny)zWkyJHd_hB+SP|uXGJuBFpaHb9d27jZ zu1W-wfDFCD^N=BZNu+`F3=BM=2rOW_8FoPX8Id|F#`R%VX+Y_KRAQ7H(kP~ z5!Ec(ml4QDWKh8d=v@>@gn8&W2Xv@*uL982O4>aLDi&PA!T?Hc!BXb}PUgsxS5)k8 zTm4;iHS^0FEBBliIXS4% zIS#E0{lTe!4g*UQ)T5b+d^BwUzFtpbdN+R{`>duy_sD(W38nLjg*Q6LQR}GHf}hQPgPrucQ&EKuWb8`PAQaf^RvMnsJC z-}P-!nweCm*s>+8l8!56Xx@jDi@S0tCUy1Qq^;)lNa)4PgCsnGPZ2;5id_+28P%rK z7fi~ASh1oX44x)TX?n)J_Od%V{YD`vh z4VSl8jMSTQAP-!#_h(G}!V@3U>CG)yR)1~XG5lIBga?lw?}UYy3pUzGWQgZD8o0BB zDdV)qNOs%*tBW-Id+_f3hDHVgTGTL$zC~O18mP z+p^)o!)qVs>(Z-AcHz{i8-U$GfnJw7g33c9kc>y9)h#2%G)$(Dl!KcQ<^d$KKmx}1 zy1D1_$04UwWKDaM*Nz|QvQ+d|5H?a;D_G?5!|-}$ADEJ^i`r~q;he|!VGans6skTE4f=8LWJAZ1G-uBGYhm&<%> z-%_`0UX8R9@0}t!e=ji5rNoZ^e-E28l|rhs%sU$l9_~y`yS<$Eh^S745cH=`leGmR z?d?^K@D&mt5I_L0-V(%ktUmI`+6R;N4qz>Cx$*mSUd_yDA-A?o-@NvJP9BKXS%=rj zgXAD}@!qw6G`GW&PM*SHM7gD|&wlM+V+5z$NSCovMZ>9S=)}u{;wO=E1$>3Jtuhe@ zp_C>TbK>uJk9i&@c>*mELX!YY-)gI$6Z*Sk#t3K$%QOTGq2c2L)+Z=M6MuXaD+bn; zA<@(a4)w@r=iPvSCNzOPeDsI|RY&712;!l#ZUMU&F7ECirn%;NNVx&E8+^fye>X4? zwQw=K$VQal@f<@dI%?Vu>>L~(F@KMA znIP`Z!*~!55%vlBs*T1X(hmYfLgh!<$tjluq~bjkf6v3*mchYwU)ymV3HyR1MXPP4yOj&N;@YCq;{;|SLaLG-SuDt#b#GLi&l{j+o zch2IXqD3mY34P1Ykv3esqWzWgPs^-IAVe zvSDlJC@J@`QVq$P5H5u*t`Z^yWF7|?@CZm?~NJkNuy)zD2@C33>n?H-5|EZ?-)W0gq1y7 z4+)4rnd0bDU%!HiyZcqjI2|Nr_=x&1?5k%0-mQ={`C*Tp_3SL32`zx=K6SpNUN)5U z>|(84*P8FDDNkC5@u9DY1M^R+O^-2B&klYm4^Ssditg?v3I zW-O7bskekZe3)!j8+Cw8CMhIjF`_qWC=6dhUeZvHXJzj&v-m^bWsVfenzXtD(wzM; zo@%8b69Ch5(Id%VII`MEti8@(G3nW}!T5=_7oNil*Imr!`u~}0D;t<=-oKmQArKR{ z)jSR59&Bgsunw~InHeX!**D!OxhCY>VpxCw_QOQhp#9&^v>TiugRBW*T1*ZGW=0-$7gitBOR@_a z#m71v_dbd?j6s3VSR|;f?d0CkzfFSDVpDfX2M-)LhZKguU1Te=+pGyYD=xaRdkYy^ zr}MJAylByySE?g>g}G~`nm=OAxGWNqe{D>+qQRk6M~Iwa?68KlwRN%o-93s_@1~dc{rlgA0!aU@9qP%8k&+~Tn2OR;pBw|E9Fj&-gq498 z`J0SH<^JyaO5Rj~fA!4;~5u0$N8AMKq zc4tdKM^OjX0AbSP&aBoATEW0}*)fDAN3?Zz)SI0+aSi(gP>xd$V2t;VN8W3%>-+1w zFxiE3=lqE|2DBKKq3`xw<% zeb$z&OjXp2^f)>?3xkqqOMD;K%f`l*Tu`7zm{8e@zf0Va(y+;QXlMv7>;)W4&s6sI z?c3qv`ltSSS(59}3|TjL0tn3SWtA3g`HME|vBPV1Fj6-)Rw}oB?1fGS_88m2NG)6J z|JNrKoJ^vDa*A28p99iu#iShl5C2S9EPkygM+cMZ~T`Ml9C8?@c;cxEc0Q?lgQs^2aozJws*lYK79Om@XP<+ zW*FC}$x9~C!>j!ye{`H%Tc^8>w#IH_l`#kMXglPJ*o2r%`8iF1eo0fk z6~zgLYabp{;&z(E)nr$P1H=M%fRv)ssX+m#in+QWN{K{!Fo0h*J-q`sqQJ@K82(0p zx#WN%Az6bae}FiE=y5EGVF6%1mPnbuBIzZ9_E#?f7UP~Yqs2kkq3_IT85!sd>fba1 ze90v!s4C$xV?H4EcQ?M)posnD%jtrUh9Nb)1t2yy^!BDyy1;#4+bSKYN`r~4$Hb)4 zTI5Qi7W2z1bGB5wh0X*c^N+^>fy?F7t1srp48-W?vt7Q#i9~yYkX7>mxs|QcaJ}Q| zdU_qu)Eo;52|@d*!fJOK5oJ}6tSj3{U^({o*~DFqR&>DdPG(CsVr6un;>XfY-($!# zD_mPTU)lA@w4>0!4so7T;)aN~`T*5fZCAUrcp7XIR>B4!&K4E}q3@_!DKCW&Zs zz319TO&&AIS$`Dx$&KPaf0yF*C#!X3m=@&~6Dy9ZTKhJVBCi20Y4=T*i0bAqCV&4e zi5~lqun_4ZHQ#+bkUy?LPDx2~tr#%6U}tMXGCM`%*>2S^51(F)#pssjk2l`W<_jTpC5-! z#Tl7-ag@yAfMc`^)w2%FK$NT_eWma`D$AjaaJ=;$OvbV9dE7?5) z?5OgdDJd}_0SHWgyv%gbsf-9Cu$J{ifObA;uS9s~ zx0doU$XThrwAj3b6~jR=cB40J!uKo?6$5VW%8?VLm-5&ety(GL z*#TcFdU&JfWVf)T+P%fU+g;_RKr-Jc6H=SXIwMvXQoYW4-s`35#%`bUQ%QMS_VVU*;yCQ!iZKE<13;6uEsR9iPp}2<{Xt#SN4S0u^F*u zSU$E$&y7HW!q^aD=E*CpZRusH(m?*Q&cMhXPGah+Jr?^|WQ`1qVfh5#v15g- zpU9vcUhz=owprix z_kW1t17qX(5jWVB5iKAYaU*Lc6>ADi=>M?x)^Sn2U)$(_ofsfkV1Uw~lr*9!-JJ^3 zDcu7qC?cRkNeM`IcPawX&Cns;(hX;AhVL)V`##V4=lJ0xD0}a@_Z=&*Yb_+XhXn8- zLk3nF0Mq8|uH&Bk7v;Oy7WR;X3IbYi1(G=J#=Zg>3G)o8ODT9BV8IaR9fAB5yBOVw zabv-8aC%^cV5A8A2VA%NwU*t0wS#Ovxe#Cg5z-|$2hOA{{jf0jxtJ0Kagpmefaw7H zJW3AhAVbo1^)KGRzI2&DvOdIgc!?fhZ>Vtq_K2EmI5}uy zBwnPPrQ-$426!)nR?Zl-Cb{D*ONS`+D^rIfB!CCkU zz@Gg4d>!r+>Fkl=FG=1x|NZd4dOqs^D2V&_pF`l&aA^l{L200d_<1e!`--U`VECE* zFc$^EvW^S^-0@C>qZ;v&q_(MvmmWpFQZW_(Z>I;9?+daDgUEIyy&e=4^v?N_@v##G zW(_DKTb#=?M5PX0(B`Z`5D49Y+iC1K5}!4paDw13A*4>PU)UP9ymF&2{4i7oF()~^ z7f=2^pTq@00SW-84N@Pl3%+z4%}*Y#fJ@sOjpxKe;$S)*=EhLv4`6p@E2rF4J5-Bi z%8S9sN&S~WzHute?)a_i&bW0!dD%6bEr;kDoRIAQR-3W0vDE*EE)|CEMe5H34{r{Y zN6tdNStMYsA@hOz-=XYbmJk;~h}!#g82H0irRL&q5|CyHc8{x-?eHoSm=)nx@Wa5$ z>l#PO*iZo_4JHXgeh?HuGTAnMhoP42GcZk;FI@s4>L1p1CYyQHnCR&If$Q#(@7^6n zAf`H51r7h0*mIRh_~pNT{bE%sgJMZy;85>}mu&kO&y+%*g9CFz#G6jqytQ$&MbL7t zN<2i?ub*YAhXNDo$kyjc$D*xE@`mUGU1je_^$4+7#08Y@rY1(+Kg>Mw49O|ViP_M! z4?1R5hBS*Z^kQ~RJlhn%_mO8AR>x+?dbIueLdBjlsn}Y8{v9p!@%^7K=LMGjZldr< zpWJkAd`~E_T)eU82+aPcvHHT8V)Zm=>xQ6R?z<6( z&Y7e5*KXdV_$SCvV=i`VXm)n?`~35cLuaM0UXIAc8bEvR6M1oyn;&dQjhZ95aYI&D zccM74>;+>yP#W=l&f|V!a=-UUXBxW0TB`UxZOgJMsG&uBD(bJ}u zma-5t$3g`G%r<_Xru`O1{M&SE23wEil5AjX90QTP;K7ZzJfNV=%JwcylUTym%+%Ct z%Rd?r9 zMtje7 zoxgsibA8h>?)&SPnArJ>t8+wOTz0Rr_h5Jtw)xa3BV%JZ$fUTtyWg0zadcFL&UrT3 z5`GMv!^)ANJiB+DHj2W9fsilWVot=AGujV`7V)m9UG>loipN>r{0#yOLO53tF2dL-_SJR0gv zE&XD@U1N$qUx|&$!^yVLQ4kKL+on9g3005PH!wGUxG;f#dMY+VIV<K*(JPN>GfRS#*>W? zEZR}wHq6OdAUhE)bBFI*&}YxN#$tQN@0Qg%ccb66b7XyUmk1>7j3>{w~LBqZRpaF>$ui=s82*-l^*@3P8T_UoI!)s_tib;E1o4~qEWaB z8H@kkd<0edn2V%%edcyYd*7F(tm$c$GtATnYan?ZIZ@-L_ENBR4?ht>H~Y_JQ`)q^#P6btb&QNehs_j03#z9n@Ptdy(b4^Lgiz_^6l939puXhs ziu<0*SDQb-P60whW!UV|NK`K&)yE6qKKK!Bzg&3~Wb8})h$R<|pDTG?|WRVgAj3lyXbQysEhq-tz9X`p9qU_Xf z2#7HA@T3Box{g^aC^i9pFa%vSGBUyel@*ZQEkq}euJjnD5e;2DJbRuBOGGZMs+HU?U8c{u91Pve<=Or_5QF&Svs?CpiyL#W?*7y{J&d-vKq zI$~ZheqCOKd6nA5wzPba5eUc5bO7RV6#!0jR=@w5UaC!$8SsXBN}U`Ui&jVh2+_JK z#tT^HfaL<{&OqGv`cQgO-lHfx{(_RQl>og_5$Z!mLL#WI+jFx^7~c1Li(X@ORIxzR zT@Vm=+Cl?f%GM07V2TG~|8-n~FlneyPwy;kI%q{=%_%ogPytgN+TOC? zynfn^Tuo!2;ljx-4h0w^tl-?a3)*#ziJ3SphYEO7bHc^g*qD6*)z{xoSHVaw#1qai z;q@fCp#SZO@+YnvM>P6tq0z((KNbw((|@Q9DkqPBqC&AagR z$@}vONl7BGAD9swwmx|B?BP*qX%YZ-fE{CDHcH9T))r_v-XF*E-~p{qoDv-Tn8ZYu zf6fq}JUm%g8n(EFMHYhKML_hhBYm4DWXLZ`Q4&fsUlV(WhO-wbDF|DNeRUUbX-V)2 zKVC3SY?p`q&(@OSXBvnQTq7lw*VWa%lkAzcN<8@YNpRAYv&Y{W7#U^H>f(+z7&i*0 zrfJ_>;ziqJ9UO`{I60An`=kfD6;sH619|+6s3hSI2>*j!%vG+Q^f(-?6C%cRLl83 zb_CgB=Wv!%9mMDNC5C}U_cQz`O45qqGFjTS>q4#V?O)w1&%n)O_76;`!Clc- zRkw}VSvjZ8)H0iBBtBez3QR7F1h876d*!=twtr6bu5&wXn2|m^n)jE*S)yf9^1J;n z>_$m)H4`|dAD`2%sduhPtL9&*?V)GeOwI)dul$cJp*@N(;lrmrMNp3q8qyDkGn?|X3>>k&WUTs<6@R#QYR*p;NbJWSv-zE`(JOZ|nR25_Y zR|A-@(RMc=HD{IJl`(@rt9iv$c+M3EUQn@^N=>rKRjrh3j&tHA&dG8x<8GvvQ2Cgd zSk#eCO`CJ&pt3O0ek>@8&f~8Pn1!#V4bB8Csmp&@|B;v|r_?JVC6ytamDNTyr&{p3 z(8y{PsMgm+^p6Mn zp#BDL%$F^CJ#pj-S5{U&%}q;qvB(f5FPBn7a@NnmrMz9w@1c4bmTs&h`NG0m-@t)d zn2eCly$qhM4Grm@0`n2KG|(q@k@s9=7eTziC&KKsFO^T>`y?{PUpwwHCbfh&G&B@( z=Zj#cR;HUBR2XZX?=O$v&SRfJ9v z`Z|_6^X{&Ea(C}#VOmb0rcp2yv5-tsFttoZ#~ls|{w2KG4_Mclj8YnE`Bz30()|-v zX9htF3iJGWw=6uzO+WZ&I9!f1EF_#a(H-xFou4DhcJ%i}sD%VlJ-W{%I2JrTKzn=# z_z0sGDj(3Bt7~ibynUAKOEA%T%!vTFqait)SXQQi6uKoPJM}S4hB$eQ)I~|m>$vb^ z9*wfaGn_)fL7TEqD&`9Jeb8fy`{G&l40RMM)W5ceMn^eev8H>!7cvG;^Uym=(H{)z zY!o%c3e%_AKy4G}z4&X-5?+ri-J~P{;XwMxj1NIkKY#vyYkMO0@-cioD{Je-oScp& zXHJ`WP>tw28!))(`T0(m%*)lHqN0<)K$KTd2*h`F0q+M=Tm=FZQp%x)FX+}$^#%sa zlBdaHmo~S&G`f^>JiR&`l;|TBZV#MDQ)Lg&32Wf@XX|`9`LhEca)oa@3IoPU=S?%E z9enE8VEZh0qUx&}n#klTC|OKYOOK32jvnFDr!NMP6gaq`0D=rateqoBtqW?Bv$c$8 z0RU1qm?lX{?o;h+9$Gyj1uud`^g27`;Z?l6y%TeDS;GlV2uz>JP>tHxhd-Xt3_1mGF!-_1u-j;*8VG7VL4?864+!!u)!&pCwi64c)7K;(&`cL4vCuc)Yirsc|vJHF9SH$bG2M{ENk zamzo;UM*^Yz|_zP*BW`IZ#Of?O-1ZtT2gX>9f0gJj_r9 zsm;qB6~6z6^yW>~G~~O})>Ke&=yT~iJ6Q(3Ier-g@Ao03kBA=Z&);Q!mQKqb>jIx! z?Kzf#oL|9IeKiuXV0`_Un1DZ1NS#kTxaEF$aX{efZhunq%3hEe_PdHn$2E$eC==PB zpdBgNY3sQi8FpN(>0WHt)o1>!ruM88+w{3hRp7-L7+iZrLL)2FCdu02WW6W;&@HKQ zb~J%3mMhmc&Y7~tKIpT##yVS2|N5ioKQK4iJ$}bKlX+%Pm8qi;H^A8?K&BXTgu1xm z$ydAn--gN5Hb7!ARi9d4t%s17t}>{_FlyH&U=?Cb9Tn2{H2*A0h?N9x@F^M?o~P3; ziB_B~$zC&M-slO#)cf^DwT$FeYs;zS+pj)TX)?||HWGOERr(fZckxuWA6Ax2Pvjdt z6O#o?Oqvhx`7x(r(~{jhDq=R|+g2yr{@u83`fPb@n#8_f*>-;udBZMuBRK1U3tJ8f z^6O(i#V6$q+O9FEKEh-evz#mL!|sadtaG1Fu-%)b%9;MdpH)O9R-mxN7i@=B*m#J_Dl7H+m)YA3K9EP0;g ztgjiYu*5Tvq`+I>)2K66+Z6W+jr_d>l{ll6db{&q_xOi3Cw>3^EGtWfYEDzf>WdM) zL-WjDz|WpUKAwELHb2L7%VL!p^77z>K=Zzq@sM|yW-vXrCRr>6SkBeCtWP)f8oY)-`Y<41py zYa*pk7C9s*O#LcHnX&PsVkQd4urp&Ky>v6ALO~`@bsTJB6ig3uM+`LwwpTy1noiRP zCobBK89TDS{rfu#wBZ$x7;W6@EVGsPEtQru$19q;^5j5i@s zc}|d}YGb2J+gR6E^&&>dezmdh*!&LP$ehhud=5q47;%8el3__=ZB$Uu;C*L#1sjdV zU6Lx{pz*OA-q{*>Uxjx5>})iPJ1zT|@2lzDXvtv_ZYvAo;UR3Eon5$GeS_@ur0e#e z^3SijbUn*Yw5hBLMFlF)QI&;+m}agoWcZo~-OKG-U+x=lVB*zq%k`VGxO;z(nxg#% z`=UZXTF&TnndqFR76}X0!a4T`3K@EGHTrT?MXCXrlH46{D`Nn-qhE;?&0%swxKDuU*7GjoIjDK*)x~d$ICo!e({@QMu__G>nZ8^+d@kP^cs6! ze~6bC%VQD^a-j5v4aSo0@2SZU^h)7e^{e2FJCO@ zW{O^eCuEtOhB}dj$yWrWH(2YRH&yFj-?XnAKBkVBuUV zLS}9og+$=yWYk^z?Xa2aRQ-<2Xq8sQfIETuni*Z2zv%xeq&g-u^zD6>Pb=LceaPgy z)ipB5|DIQ5aeR?iLbTx{a9#-zU-IlXNR{7Q5Ob% z`~1rRncG%Ng<*@+KVn4fM(TdYP`P!Vs(dA4VK$(9Lh`W$4>} zc@r2**qtLK>-n~{930&HFqc79u)mMIM6JFRt6h)f@CsqO2^KBu$Vi&55%CQEmPogU zJyplspiv9rRrB)Jhikvs#Pp5XV zSN^=aGDS935j{<4v6eV*9?wx}((#ffiI8{C_LiZFbf*DBMSS*a`fcKk=O?g9nM=<= zF2vOZHeD%xcn51%l$hvTGa;PHn4zhAGaQ(ZvDxRMgjrbfCiJhBMsk*|pu0;I%qjX> zeym>g2};V}%2g({)fKucYP~FGytVO@Pk6gwgy4SS^NGgIbY;>FiRwmu<3+=9qMx&~ zW65(xWlO$(!oJ8i!|LuN46Sy8Tzdhh-L!|@T$9uM4 zcQmQ+J}iS%wkw@@f=OtQWw(N0KaOYTudeL%v3O`e>$?5u=Ef09aj@2`EiDmHiaoIC zfzPx|%l;W5=%>Y zdYk-J#Kgb-?rHSDEc0SEU`oYFZ|9LQwY0qhm6pVQMEF4C>W1JbyO+0G+DUyQTYjFw zk=&}h=E`k;ll)jklgT&T4Zh9wJ_C(0HxPaIS~9R$sN?!Ri_(+BZ+_m{?nPPBW`15A(w6 zw&(t8N4CW{kAHEywP{1#VDUP?u-lO7fWu>m($+D`N6#gGEtqaQcjfY)kco19nQ&`I zb}nIv%@oy6PDKW>Gv)U<04-gN0|cuCVtQ%EUc!T4^bJ<>Y7$-;-L^ysd+>7CraBjeN0a z!iH4m%}jUrkT;Z&4sw;M4Q`ERgxU-4mj~4|ntWzvqhPcv$)A-unnGP88n)44)82#G z=5Q&Xj7h)K#$hdzp(#+3s%pm@6DBr27*eE2m&M2#axFeKum9B|`b-ebgm6>Gr@0LW ztv{XF)}?e~XM$s733Nz3S5v3X(1{H{vo5=^H|mSVdT2O3w?H$vm)bY&n{9~D*}N3v zbO=4agGU$##tj7=d&pfWNkCCEq*pQo8EPh$sV;d?5}u}D-D4D!`JaLhei+Cu*_8}@ zl5yhX;6S2O04Sj$c{QwBl>CP0e&?lZ>b5)%-KF>SEQa#|xAm7=Rg^P+hM2eH=I*Ir zlH-n7SCr*T@LX-~U2r^Mer4((EP#Tq@4{rQ|1uR>I#i-odqP*jZL>d0kOiwXTM-)W zGi)|a-Lbehds}u1f45t;WGjPw>ZjXXs=Vr6>z}+8@r}TE6Q>C9%`}#LNfCHPHR(*) zC_!j!kUic_4U5@1o6?cbt^gwJh%EJ|#f^5P1pvJY!snJzas zTN=IWF*O{>;A5~g{cgUrcUnX)#!0=lDNxxBty$tlV#7yZa%}5Zf1K9;sL~Zc@jS%yU7> ze@ey8bIRXP9`V{OEzS0hZM`qsM$=)BiJ;{W8&e?}Xq+!-?Q8Ez8)%EuDBZm8?Ndn|+NjOVHN%qk z(RDZdj>_LTzuMaC6aB2dtlZos#^EJH<0C#kuXgRIRC;<;E0ypRT)Yx75%0zj+!_WEwO_){5NA3-)folB_{FuB6nw)elo6VCmtx3Xl8MTC{)`EM0 z9)&z0!mmU`DG7-r`6bXy9RPE0hlm2CQIppPGqm3S95(x|2J!5^FH_ZOoAjC9iRq2)_O#{nG3ny4gz(7WFpq>P zaL+i_s@^81?i~TPpHeJ)h_uyxrT3nTe@z$7_jQ~jr!&S<@N0QY*d(fbqhVSmFyo1n zIyyWZ41+rsIk}$@oW|d(Br|1hT7CZ9$}DwQ#5I&~ zND@Q|As*Nc<#QwNf3wvbe%l7D&qoAzsnw4hS+?O93oND*EC3j3%%W-WqHb_dSjYee zB>47icU2yKO0;XcstYeSWN6b^wCgKzoI_JUjBlDL5}d*E1H(3=nSGO@nc4(3nPn<45LY_FerJ;YV6%&qXG#A#oz z`uHY|#d5g;jaj0oX<%zgb6I68;ab=f%=K#sJFCTNSR~mR_%c0<_KE7wdXZfly2)I0 zy8UGZK%F?}uHhS~~7hnVqVjJ>~_W9Vf75HF}9m z0(~NSM7MAG4m_jo6g^s7vE+REu@v-h#Y6-2MwwJbgEudJyTGEGp1Q7LWrZS)t0P9s zG<#|^fgV!PnCPb)Heu`xqar)xBXdj;`D^q`kS{2RMm+w-KTUK;Vib*r!&EK&>r> z(wU4q?S=Ig)3=Kq=f_o#RMe+MI);RKu|M49=&w2_q2FKVBA;RaG)326gf-xbAyLG) zY5h|h>}^+{EzV1G68ClYKB}fqTQ5zXdsP!M{dGJW(t-7y5P@v^9_An?BGzEMWS`eH zaH?M@gpJ#Gsi&`aD#)(dwnWUpZYWz>rEyAS@J8#22@T=RydlKI+u3x69DU;Q#I_aK z!sa~aE$L%t=+q>W!4O$qHevc#05xEJduJk7+n6|f#i!B2*k^(iO5^PI%;*(yeRCjh z(4c=6Irb#<%KlR3n5)K2se?~XVT6P;+8Lr5ni;bp;dEfEmubfg*2t`tZ*oDz%s4+_z-QN zL9wc+xO-NvOk-%9ec)Pb+SSB>gm(RPEKTs-g8MvSQJc-6-Nb(L{Sn?kOJlYb8e+mQ z5@Gi7kuzg?pSL=a0%_3!#$XRO(9qnYpomeB& z29{N&N-a9ykaVLl^%3@r6+aJa1m##+3IB_0 ztdgWBQE69i-t3s1j0ar+5v$YOq1q34c+d*+_r3k22lrUFIm{-S!t**b9*~^c7aiPe zbT~t%XnA@OuVp$^+^bTY7ye4fKvVfl)Q{Q5X%M(=sWHUve~2ayV7x*j&Lz+3W3iVy z=XTvwW}Vx1u54`l*D_H?x6SQ6@vzLU*8=9n3sOYmR_U@qq$*80`OVEvz0Pp?y^p3~=pCXivwYAPUR7h~JG%McKt5;i~YIQQ`4T$>gUN0ytk2Z`ocq*pV)#HEZ{5xm8PlfN0qYyGZYzYYnW7$}nPdt{L|u?*Ul0?Gj)qJjoT z?jxT9qtn}~pn3M4{bB>3`Raf}chXp6IByy>cQwr2!Xe09oKjB#M5U)^1&Hb#J-QN2 zeb?w0FEkrx%HdUE_p(&*Y$}SQYis2^_QS)%YB{uTZFX78 z`%ndHJ?#Isqo}JB>sQ)rtF7&oviH!-$$E`RC`;H$oVTuU=5OBu)hbCvyl@|HKYy90 zQBy*gbE;1akbXPZZyM&AQf-fDOs;=zoL((b9p5i$pwr`BzmY0iioKS(U6{+76cnV` zn$Zzl#x$FA*SOd^P-e@)=OsyEyx<^3Z}A#uh+6KT6jjzf2enOc>FggC9iI*do`)l= z+SopaF7&o9%htTjf)v0_Qq($K`CqG{NX{N#Ze4)dPHMy`6UY)nB0Ai0$z$xnqL~@& zi8_|#?*NTFw-r)WB7|PfV-pH4`fLcY%KN;t)D#&bh^)rm;YMKrHwA(|-q6L35YsIt zIPbbtPPzm7S<)$Vx)0Y{ddy8+Gi3ET5;-q%HbcGm8oSw`cI;qUY+C6H_5i>QEL)cV zM#tCOfp#rYM>meP32vbunR}b&q!eqn>+CKS6>wspMa2}&mhm==90D2P)AMONPiomm zIKSv{HpPX1YiTws0t-M+d(6OC|2z~=@#5gfe{AtXUe!%mWuT)8{aT{7(H)lbGUqK} zY1*~Nn(sNgOJv^BRXeJ7E%iy$s%cZM?)|Mi2dmZT=N@YxiNf3RO6_PDv>4>v z_O{<_gFa#z8w?K)K3;9pXmxq--rVqJ=Kalu*Vbz#6bqR1w8RR>TwMA1!2htD>K$3s z0{|6LG-bIJeVdt$O{7*GuwV6aCS9GKxwKl;I&6b0FKR1C8rZlgsnqdSw|~uHp-io; zd4$&3a(K9d2^hX9H6o@ICTVIGc~CiSfns;Jc)PyrvlHbEd+F=JGNt2UpfNb@AKO=a zoNb#=0w~y7QH&{iSJ4y9ue!AYvE{6K<7I;$SA~hN<;kIEF?*%d6RZ23y$+XL2kPtN z>>=h~xG)fvn6Sy;^L~jz5MxrBAV;=0Z|~x;ES5sG3&~QVN6Hq8Ckf?R74tUeDo0W?d+Kv*!`~tu$KCaLf=-8T?%K><5<{t_a)feRJ_Du6{tJpc&4{=~i|JE2%<;CVvBy{g*f~E4CIZm5I z4nRlD3nWSC*%Tf>^ppttew3zwcv;*=Q@|zKv07?LWx=h5HG59(*>7aul!cu8z!js~ z#NX=4Ooj6iY}+6%=B2$GU?s9F!6dKGp`FnbCP&syeTBGCQ3$;tl-oC~Odqh!@~tK& z8*6IMNp^bmYuk|_&9m?Nb>@0lp(Guj@O3k3`XAh>y{$Jw*X>Z9@~OpQ3aLA+G3N~7 zu*RxNz^W_f|3I+xc> z_!9w;Jt)RVDXhQeK<}0K<&qosrAvf6+e>G3Z7Ua;hZ$fUmBRP-{Kg2MasGJIkwK%d z=bEaz$rwWyBmY*=qV3t)iuB@JYVjYZ>x(2*j$4W!C8!~8U`yTl&T|!r)mdd=xf-xI zt-8^!*Q>gIDXmhCWtk`*xChZwj+y-Ay^Opq$!}BZuUNdgOwv~>SNG!@zils2%{gWz z>HyKJM&xQ0+pAiErI9@!ESV(jTF9>^`P9%e4s(umh4!mee)^p;)PbJT0M%Ay`gY7v=4SJx7_z>z&V{Q}kax^BXCEHh>^Jf1Pf^`oj^V&+K{#S{>h z0agJ;e$wyVyLTxsBsKxkf&j5W=vqqKc}15^s3vD-WB?EWaUjhs-~7~6dib@Kr6r-B zWo4y-u)mz!bI8?uq*Gqm_L`n94Oq_!&t*Qrw5R2#zWb8oS!YI{V_U9YLQ?pC-+pY- zd?61J`{n~|YJmzg;nK&Dp`E~iB-^+9!?U`&KC$x%!w@V10M^-ARsS|P>{|^E42tTK zgW0)a#29Ku6JgmGw59xXL6`Tt00I-u^=;${9=BQ9u5dKx{DwCemYhmH328+dBSMC2 z9oT-;ZLXSR^%>Y9F~_1jw>$H#8ve3C0)4|iHjK$m zp8hp9`b&%DQ>|S{Rk?EH5fhZ+X=+grn*0goawt6(u^d2miiwF~qM>Y#I8^VvcJ=C) zmn4X13&@keb~F_vg(0}u3GknG@WOCN;H07=mDSZ%yI$ECLV>7irrZ>s6=KcP0Uf;0 ztdkyJ2`&t-b8A#6-9d9opL;oBS6ufU|E?3qTEm&-AiYWt^y~;E&wGV5Ha{|zy?vB4 zSR^y}#(8U7=4!9oM!>53^*z3Dr?r>DMP20kJhMiA7}I1=8C&spQt;k!#}@J!Udw`I zMM(~lz5vNrL#N#M`T6{iS1+b$OCI=5o=GR_Wq9778y6X3EQ_)ZjPcejI*oXx zWTFuHCModT^slq`D}G)ix*p30puT(&rQl8IxnUV6$^0Ch_Z@PAl8@j3OoR)X<(7#z5ij6qSbz7l*PN zLcWQ0OX@Di>Mom;7A1eXo8%Q*d$TPBUb!!Z_6VO(^<59tg|)78M?dOwM~t1$TY6dW zt$HjtQ%z1TBuB0B${(?%PQBmBI1P`Rqf5#l)a3ptouw+1%b;dYV|cytCGJ_YvC}o0YDb!<*{NeE z5J>s&z)a|}#+i)os+pLYbxq_!%5%l!0Ggv_(>79~KbTIZeNDXYX?2b-X(ImXH%_?W zmWC=3${P~(&{=L`#)@I#ts}IIC)2b0xtlXajmm`<*y|$1;Q8u_)mYd_$ zrXWbmhhj1iorOk|v9}Df#bS*qzYMrL5X$^L;5$&7q@F=RuyUz&0SKmz9d48ifKj=8 zWNu|TV`=)kn&Pgb4qgb8m!x9$Kgd^CsD4TLbHLzT)b8W^_z;C-kYN`d&X_4>o$h-OvQMtFsR4)UI1WMsXzDJQ80sbCL zPcXcnrKk|U;KseH1PYzMOaiCZ~J&OW|5c#q% zv15M@sKtY5-paZ4TJ0wn?(_eYK6y>#<)?!;$oD`ZT=suF?jxliDNeWml1@!cE%@u# z&*VX|RDe?h_6ElTQNM_oqY4E^CpB%bL!zORcL#<4;{oM-w;}+aL|YJ!lplifULLvn z!KaVnPtVNwR*xu|?^BA2oJxfp^Dn1AbC%XN=Nf-`@GPYeRvq9UT|!{Y;EqmU=FxzW zMHm~GJODB%gn=v?_>R!pVE)$ysh3RPU?8832s2++HlPoSKt}`0ZhS z*q1WQ9Db9%fPbsx=_`Ky=k)>3)uj&>KQt^%t$jCs>q%uIEEQQe2{lX z3|y+)!fNl6JNeyidq?ipGc>yWQ}v$}dP zbiTrm`~(pfj-NPz6lno8RV{PFuk&R9kpy+mI80_Fq)}lK$ub9#>xLfn#*BlTQ0p{B zr}+~1(iPU{H-I(+phWh!{W-c2FA=kC%~TlSSr24T+*KBYDY$kw8A zXaG!u?C_S|g_wQx|oj#vmA188b2BChH*P|LX*`0;?fLp zb?P4k4_@$KWf2rAV5Y`nrWxpOoEO0WRP^S|Wfu#@!{=?n343Zbpx?-!<%0i- z40G$|3|6~p`CuQFw<6mc(4T-CT7{BT0}TzIIHP!F&tb%>jjJ=03mKdkvMz6bJx@eS>wBp{O3br0pe~Z3@9@| z3Ij!^y*>H`qu@Ujcg%1w%4~aWE|mkv!$A!l#U6Dzcr*$%{%>wbJuu!zr+;}|hAoamb~u8M>+kQ! zjCU^2fGU9gFrC}BT%>kfq_6?*d3!y*gE);XQO}9a9tSy>hTf@0*KcnOlafkgLB3f` zUj$2Ygo47k)J|r7i2x_x{f;S!;Q>Id!&icbN(e~DtUqH4115P`tt3-agw9OaFZ9 z>`{D#8-P^xMe@W@1JZlt%sLX@$;fOv50z*T=r6~bu%d8R z+l>WNm4o*AC(1E6vPgO19$r;;Z~<#Z(Hxd(;{}@*dMJ81Ex_& zJM(WwdHB%BpmzSDeM!DZ?LK;Pk)txGs*bq4Q^de+smd9ZNxj0DzKbqbX>=_x~%UDBmv$zZ?MYqdEJK>ln|0>mdr0 z0=W_jAvm_e7zE%p`uSiOE}n7#JQuI6ZXaCPQ_{L1atORfemO)AO9p!F+_`fgH?_2) z-u!r>-h{WlY#V&Y`9lFMkg6Qoh}m@54XFdafI^7M5OsJ2fTPJ5AqyzDmkl_!X}Xar z(=l6i0EQ((8PMhmK98>uaRQjC<*XMglAwaOLXhXkAIc}PsGbX6&(3fk^}AqwSe>BK z1=Z{>NG?5jJK|ke|C|j-Gr*==*7mr_$r&!OKRvip^7u)V1@ogv@u{h)z}KSqbx5)7 zmVAICgeQNgqWBAh&^e3K zII}^VvKM7$ZY~Wri~Z(UAkq2vm-FJ@JA)yMWY_^c2o4L3J-_dXKv2HrRLUVG&ZUwv z>EJ$ulO!P_As#shHIqjdZ7=27SXo^}-7%dtxrQ6)=QG$7E(Pw+?l0rP-v)}B_^DkC zkT$>R|M-2qD8&6>j!>gN{qbIKt(-aj_Ou(nM{f%CE>KqyG0Au9#nn9_X;^G}_2RF2 zucL~)`wwf1-6DofuVFVv1gibjxn1BU0bOH4Y@wk;a~}70C_-T%$Gm;}7C>53;6(k& z6^%qlP)N+Fs|#KVmxw@}jvYOMShaf0)cPhj%N~Jvg%ANhuivM`eGQuk!2kacJ^4I< zyJZH33D`3TA_4O3P$6_-0hCU`&38W z4|kLXrZA#wv!RDJ_vWZ?Px{NZ2qg+^BO?0`eB$@+L3Ryy=&nS;;9kKmJQ)8X{RE)o zcsqz-I7yd|f1kADYEZ(7Ae84YaP5PdCfa}tX1O-21lHv=^s8Um-t}OFHO_2)a#Z@i z9gSvCWdCrH%a5sEN8K|tFlarbk_`-~g9#=NhYhKqj?jd}#KmKcZeh;Jz55*qyd9t; ztE@Y7M>m8NcB61J`RF?s39ld$gVdcu_-NoKATr%RPw%sSFicUC@>N8cK$%#E5k1$R zAHYtZsa9qIpfdv3*32L{eaMqd7t|((;TRi>y>kWY*rT@mJ*mAQm}oo2jOlT4aeQ}= z1t{2#BF)fhn9~p<=Rfol*ih+$a&Dx28G3N{(Kk@b5+S?6Ms5d#1R`kycP<`#`y({& z^pO}^9ODGpgMR1n%g_FK89|Pmmb^UR7{!-I@h1dYn`J1dI|kt#C^o zJ~$@(V1@Yfsb{Fl3r^zHDbh=6GBV;jMCiWJ5 z)+>ip@E2d=QT0-{E+8b3)t%)gVtY!;ix9*Hg2b1F>7T&bKmgGaW;dvq#*6h4I zV*8Vnx4|$6`i`Hu)$N0`q^J&(Djlpw$jK4elTcp7i9tDg@fzL3OU#Jz`L07`3s9bx~9}Dzb|xup}?}HBIv$Ja~xyC@8Die?J6kgfFe61Vp2Z z;%{1-n*31sJUBG8e#Y+La_Hrje-FhhCexzFoHjv1Mi!_a44nuX{^QpMr~iW6vD||O zOwUUaP``az|A_-k zX(-sy+WKdM-QK|gsdiqy?ZydtvNGyQM`6&!usdZ{ zRAv+hk$y-lOiUw!=&@N4Cn-o1B%xO5&KB2eQj~H?%r1Az-*YEFP?Uy%Rzc4D&c3xI3Kxeh0u;i?d#M#I5WeFcso5?w|bs6!Y)A3&NtNM+=zsw*Ag z)g!O7zvE^I^_vYVhNlk2Pdp;eSMysNqnA;tDaqsZd zBgx!ESSO^)Ayj;d0>wsXuZPnM7*ih>2{226h$9r503L1nKv zLr|1~~HM;I4sj+u6dy3)Rz~$6g>#0uL6> z>F=3UAP>~etU@bkC(x*Fq}NpA3%9QH184A%gzu6G`ZpbTP0$u8Z@CiSw@g z;sp3C(v$#jSpvu2K8CE*DB(MZv%pq{nr{CA!Q2ibrN_Nbz!#8`Kyp(EyFUmijp$i9 z-+i>hI$6Jt6LcPm`Q=iPrpj7&+U;KH*=+4>=FA2gwgQK=l(8SyicNU}-b#5n+mAJ~PJ5bsn)A4an(L;v8-EIx?55_@?cfv;Onw(Ppb`whJD9IoWqRiQ+zQWnU0E z_4(0{MyvgcsYw{R8Vs#c?v7*V$mL$_^T2_^okgPUu_gjt;hZ*Hv=~JrA!CgHW~p*y z@mTMu$!Vx&L(Q=dy)YG*Hel)mCU9Gp&*~&ffvPT(TnJhms<*Jt&COw=EjiQ{HyMg% zGpA1K4HLqBDs7&p7|^&ihc z>2;{z3=vovILVqBUy=Hz&Gz$U`v@-|f@IT93l17j3==4HvtLlqm#nmM$l`>gi!d@! zZ(A<xWiN2ir2GBAW&fYJ(q>hobx-Q3D)0P0j}K-4EdI{_@J0BwEfAS2MLo28@_AlKoi zJSD3KwGEQ!*d!<-)hS-$%okKZU@Rm-si1NI=q2z5knXo2o1o&*=<+6ft)$wN7`8M$ zc<>-nmO93kD>WnIf%e0zKtlsVB=gxWye+-Gak+u@C|ykZiu(QdS4VFhOjLPo2QyxT zC3U>{GbApE5ZD)O`?%*d1uJGvg7+oV3v zbwgjfE32sFnDlcXZE2Gx|pgil!;?*&!IQFN}cAsnNv79VHwsSnXk81~FM!9eoeVKQqy=&d2pD=uN$%DdZ!UCGTW zNgUiRxxVDRTUWN@$-zP29=_Xsf>^Gp#y8iSEW9H_D-G!fjCDPto!hrlO*o5>PX*Vc!ZH z?2hpEW({-R>Y+%g%%pXi;2e~?Cu943FqicSge9Ry>vFMHkmxhSECZ@81f9WQkKNx& z+sBY2MMuCSWJ$y38sB{M*KoICun)S$^B1o5>_1OQQ3KZI9jA>7vU^7lyu65KNV_sM z>uzn#L2p=SSEK)yhX3vbl>F2Q-VImlIblJ2b<(D2XrW@R<}eqMqa&t${Zo4_ls#-o zPi=qjURw$L1X)AFB0C%rt6soqmjn295cyT z(_1?SOO<>an$JdWH3=E>!{h^}cAcW+mXEIV{x-TytZcV8kd=1FSN7o$jV@uhelSv* z7T_cSmPgeMlb9L*vcjN)FncQC63XBCqL?`WH5=fMp7l`|xh}B6b#&ByE&29m&}xZ> zsdh3^BFZg|kD>&Q98pNh=?Hi=6{P#E1=QztHJrxalevXTZeCf*cHUbK7vYG=YE+I| zFV@wH5-~Up;o!o7?Ex>$JqodzZe7EIWyXWgDxVfWDMkW&dSM_q{0jkmo}X2NuIhS{&9S|%~UjR}%0G*i*7QZ?vjw31NTH1q=3{`cjI<*E39d2$#jxy-TN*XiEbn%u}f z@riA~L9MN=?Oe(+nx>T%27mi;37~gF(#bTyrtOJ=aY=Lwt}#QiR;%_Fqg<^IXD%c^c<*c8gh}{NivvAUvUSYm?p+B= z(mduzT@+>eiN#t@P6Sk6(y2K#$jzhhT~mvjVx)bqk?t|Tx6I^EXQSl$`vc?Cnq(RC z?S5EPX*N+^5;AD|ra>JN7JzlgIDXtYDY=?HI!4>8Gj&zZ+S>i1OMKVL$`1_Lf#y!X zb`d3Co@+e8ouV|7u(>IdAmqk>N=RBGTxoe(M4FNi`};S+GEZQGIL()IKS9NhPca{# zZI7+0b1h_a&t`9JM=kUJmNk%0Xpg@0B^p!XayDvfss#kHVW%xKr{RREX#^KcQD=tM zWxK;q?74`dzYO=zJhj6HdY3=&n%BC<6;eFoyj9Veh@;x$NIK&|5_m4G9^Q zqJfZ*>{QCE5R!~YBzqKPH0Y5u6rv;13Z*92d;6XL2U{}64a z9-w5R`>d&D{+()+yu9k}&I_)~mh!6YhV%2Gk4gg^JWEC`oJ`tT+*Z~%1_EF4Z)0r7 zd67#_@g#!p}2dT}?qbmmUP+`OxzvvcH{7v~Pd zo%y-BwL3Ia{^)|2-2BA#u~{X1hg2R0g#%a)1!YFI`Vx|Ug>yC+e4L`!tx-)xbL zdj(%D7R4PFjB4Uny(%K*IPp#2&lg_C@^icEMr~KBdSW=3JzGUbUhTc9J*p!q>Ho#d z^5Tx^ZdJ8sp*1e2LQx2lo;m(wRrJp>DN$G?EG>QDJjk3KXC$CmmQiS+*IutDk50KC zXhZGWdn=x2^_BV^%Da%-vGL(NqkWv#;4uiB;8zjK`>%W1 zH$R*&cY-o?;g)wiZXhPfB`^56G267f^5qY0rOT_i0~zNngvgma1{vbxd=CBboHzR| z4+u#w@MsRp?Ye(I@1k@y&D@)F0t}DL?1X%o0CngITGnli(K&J?{`ai&&4JObu*Ue2 zT3^l9a6dm=mcRPv!x{?xwML)nhV9z49~fg#E^5d{H2bBEo#v7aNoPIdl*82Py(c*) zX5K}!=>sdhSW>eo7rmdD__9I!rUI>iw;ear_U$+H2@5@a)|}e5p{2;1mu5vk)IF7D zSl;DHf4t$~)UJ}#U?aD@y`?RUVSl=9A%w6l?((imvm?UxNz`6jWK{+O^J&z4cY#aGxWd%K04tgLvPeVoQU&!rE1le+oH zhSSEdMnr`!Ba6!LYUcQ(EW5E{LRJimP1BsM9LL-p^;NOUf&lDrB4)0 zNq+NRS3@D1HTm0l>6>w@)VVey^gGy22I{pEFT80Qn{EFz)Nw_k)P?UA9@p7|2fyrNx`Qzg<@68t6>NfztGe% z);2fmCYcY5-QK9&)d$M_ay46&hFiS1}eNf-71v2XDqqkV5|D^2a>SFg#llS1Dek>xu-KSuf9 z0kAz%bRBzc!QEjwE9H1DGSg_D^*GP!YZ>v7vXMa!f$dXqH|3qYRNiQXmhM!nNF9>% zPx*mXW9n#5wNc(5b5HFt+5*1TYP@8!0lwI+j`{Y;BUKWbwLNoXXI)}TcLncWr}Lob z;nRWF9SfFUD^nGmyyCKk#V~@-ad-?fRJDTVTYD#4ZL5Ui&aB*k+xADqC>@ZZCd9GG zAtvg#;DT!84Bs#>&H(f*+x)xc^fV%?i1w=@K{qt!np_v7A|h_cH~r3@;HyW3WidTN zrn8ad#JKE3f=`LY3tHp*9|6X>|PbyLvE4r6P%U`l|pf;#4y$t8=>+I@ec7bznh4 zft8UR`jE$SknTWQ2}5n07jL2WAUWlloEfN)#F@j{7gi}bO?%nJF^ey~Qz`b+%|OJK zh=P=Z(<%*HY9}WjM?_vj+ra%oho3j_yI5l0cRr&xn*)Vt(Vj^;0Iu+eDXj;1A~ITiogA8JcU`Reb=Pt z1HxYTB>6;eUgcC)EVs-PbL31pBc`dE^@Po|1_F3Z{ zY~CWmE^4)V=@!cx|V7Z%kQ2&6;6x10$mDHG+5a-YjA*#p7A?Bcv z0Hq^?_%Dw??dz16KVrF%_5BuSY(v!O$V;T509YVWl=fAhrTabAq}N0;TKYHY&DzbzU+gW&W&-D18mwAULSX6jaR<3vf3GvNrnRn4t!d)s&6`bA3m=}8 zcGq|xZU3-q@%L#3PI{-R+wI*u#nDJs>QCa+G9l$QN0R1 ze-T{2UuukIheu84qg5l&Z+U@ihK_{g4UuTzNeGR;EoPgytgJZ30IDdPQo7P4670y@Q;Ja}ST+bJM`N->0QNA{afIuDWsox9{4%6z@J=q&Az2m5MM$Gt0SqA2H=bbpc;OIv`GA35ggo zacsH#$Fj{^_eP5bh-nzpV%P0`wEwj9-1+-Fs}S{v%8#ILp9W1qYQDMZI#Q5i`pmxO z6jMg&PUp$#Rv+=g`=~Yf3P-I*Z%J%VN#l)v|3}La@hls;nBVhU z^OnYTEuXh^thm%_h%AT(+Chp~w#Q&b@XOt+X|Wh;=vLLom~r$WHWqZU_?SOP5js0N zZ&zNc!buOr5Dyxgs+4UIe&d7-IIhm!tR2;(qX}SEPCUsOxI9uzj!xZ-rmR51%gYw}sNOpm^6ZoY_0&=qNhIrOpREcy5uk!R+I~d>~l%lCHzaXYV+rGz(KTW2*U`Kvtj2PU-a@fny7=0>Ki|zVr`vBgz%)H|9yEjn zFu4)3va15z1Ja8(_V>#xDbtlFtB+U%!d1x>suY80ekyJ~vt#K_iOG_{EZg3FA#*8a8(- ztgOGx5e_2e`N=&szv&ZX@z?{FOTR4b&<@qT$l&s=F8AR?(nie~ zoNd^2`DV~?<^W%tRS_L*INisUBbT5$Hh&a)<-JADlm_s9Kgl%}-DAKT-B_#dkexG0 ztpaW*9GzZvl=@^&REkgC-F!#JtnuYhD-=AFNIt2H`_HfFVtvZaY0ER~+$e`S^7Mj& zg8q`%4VbxFBI``soCab6rFBxNw|@EZnC#EUf2V6B$!HmWa@oG&0_o9xJ=zh2j`lvi z>Dcb6!B18F6?#iaOXK{@N$poxVgWx6mt~KWgjO{+m`narn#G~{!wO5M*7lV`ArRz;xK9K2T`Lfg|*u4}d97 z^Ihm8<;m^py^cJNM4B__!9&`f0!pC$$92&S7&|#hKKt!IgEiB+(~{=x+0By17yVE| z0DjaI=_-n05?8xn6I=pP*lMG8k6~1BBalu1WS135O_10^Fjlv|iNxGOfHxs$y2`6V3S?Tu@8v{|7FBqVX?|muUV%IU!E^PIb{KXoFD5J|9Hf#p zt%yU+nnT`v`o~aCgb{hQ7`}N)<93k%Ilf#>lak?DODbeMQd8IQ6p~b=kteqfVs|l7 zOQ~b7F%2Y+n(Wer`Ml*U5sTIjU0q#N7gi|>en7A&$ZH}Y#_jYa4F*c=!dl+Js^x{M zsrM+KiiuRy1k;IBuFAp3`v7bo=|#JOn;utL)|*4m8ng`bU89 znb`Ok zzX5G(ZeC|1>yYw$#u=`9kfZ@F&5vk`1!;g>3TH}yxgMg+Nw%r>=4JX2H8qfh9a_qM zx_YnWP+AYrvkdh(4X_M+c?&k=z#|+1HTXg;zam~+Xpghpb;!+-I0wH6t&h6B<)I+FJLe9CpT^FL;5%dcgOVm$9 z;hi5NBTuKbJ4I(^YVBQ>FQQ_znww&RIoj}RkvZFfZg9rccp2-^6bWoqzx2O@x%E-r z#LL0xwViI6%_Xm+jplD}cr6QR!b^bm#7e+?U0hW3KuhX?&R_D(xnpbc_rMD)x5xt9 zZgz1=Ok+hv2}1oLk?@au#8M^b8XA!btGDmgj}@vxMjhx0Y4j}Z4*q?vhHsSVZfL5? z6QHEv11FJH=kML0lazxRM)M}DjFDgz4o=ceTMTS&LMh71*E<^+v6(wkV25HXt@2gr zeGD5K68HT5r5Ju0gYhVM=DPfRHmYPcN4zQ%=tpf=HHW}29;${*LtHR4h-~_FPWZi>%!c~!Qm|4 z8k4V7>;4;hE{8Y0hx_>cPtOy^6-SvM{OBomufA;sk`n+E0AK$Bdc;d_B7t_>wryk! zET~2dzGk_+Y4!EzL>wsi3=k)v@&L-o$EYP$V&~cW(W}@KQGS}xA`1SdTLUT8+-wKi zvYLYWS-pz!%G9zg|mQ+B5%&<8YW0RxaO<}Y_{B{s3WpLcT4 zd4U;pTd9RzY0v*}CHrH`g;&Pntk5e^pyZv0ggmAp{8PQEdkAHN3zTjfDP1ACa30K! zJflnCjm$5>FdGl~E#V?+;SHgqv7 ztLE0w74ENFTjI^idYOvlUDR5cd(x{96XT$~gP>nHvi|sWKk&oVczVU+1>1P zaa7*5>J<7>o#YIGkaPcZS_S|S1qJtPXob~fczKzVwTifjK*E_OMMhdSw%Y&P#>u_) zYZj?fWc5C7s&lDfpxFK2E}Z-JXfu&!*%9~DWik{j30D-~qItdnSqtyY{r8-hqzl77 zB|_c6zWjbNHvlRg4*ATCXxHD()X3Ss(vb2%kO~-+O5n@+gemQ->-@O725vnD#p~TR z0qR3APL8FxbxRA_%iG+gsraLrt0Yw7T}a?Q!cO#fC(xD2v&)lb*WF!xw^lM@8%lWV7SBU!7j~fYg z-T0&Y)Hlq`>JVbeZ~4mvi%7b@R_5WhbyACybzpjKKE8YP0|U!HZYJ0>j(5(?q_eKe z1q0HX@9&a+V4>(_1F;c|M!=E5FhKi@1cZcy!fuGP{H|SnyW1n^1B1W_j7uO5l%3e2 ziX@iH^sB!-clfD!i$kcF77duX@fgEIqO|+ZzP<5ZZd>LeY;**66QM1}O3V4*JN2me z3Q1vtnVPrc_PuU*QOg+26dbXF+~;47nFfze9(fu1-9>i!-u>I#AE9{>knBjnUm)*X zM1j0>l;ef({^|T7&z?WuijX7;2z`rBYEqLkTcZ`N?5mLV7gPDU~QcvdTe|?PLx7I7v0bBVAN_B!U3k??@ znPzfko929%N=+nQ|F_%vl24G*zFzi?_@uBT7t_-IXY)k^t!b*#>9tiFSWokZMFuSb zw0N0Hq+)7(YH)R4pkBDM=k4vkHc;Jn*uCY|^sLgp?mynLd4w%KtpPWs_!-p=zua9n z^)6@1mS*gyNI6aXbD>B`xkcddz0x*QVds4qU6(NLhTa zl#;0~xaQgI?QAtB$wsbLawT7eF17j#Xr?%qrDpJR1lOJ2Fhvtwbxkozx$eun1gE5qcYyn#<>5QS zim#%-=c*r?Q=Pzap>+r7RTEFZQ4mH+hY4UqwtLk~SX#-CW9 zUDF>LUPDPJ79{b?*E;qFX(lVf_vS=U$}g|1wF4eFFj34VY~AHh)HRx&r>+2TjwHod z_F!xDZh10Uz|MXFxM*2?&P(ZgUZfbM^7s76eV{6L`ZSmPT^W7d;Lf+}>eo~3)}ZWt z_(Xfboj&?Bw{I=bniR0A(?&SyX~4{d5e01An-Uou!q)I-+Z@xQE?vrpsISI8I!Vxb zrVrViU|n6EpPjfm;!2N)4^fzi`k!9*Uh)&v+!DD(2Ndfw4+WATL;L19w8R^W`Thgz-vQo@A3E=b$2Wq17s!F`Xna1}(gFhQ~)c@*56n&7LI>~{7XaL}- z=E{y^IEM*Rzdm2CTNjN|vkQU&yfaMy!oQUVzvAQE!hfe+TQXfUM5l7iLUDw?A6A30 zU$NEy+&`v)sMS-5tiv~GdMH&IR`0xy<%jkD=R(27fe<#@9S=jl1&UN|&Pvqc9eKF^ ze|w5M)%uKZ6Az4V_+CM0b~mmV=RW6if1X|eGlxJ3Y-7J=LH${h=ELSSGBF!`TRVAX zpRSEov)EM@R46Nb;@HQb{geFak8W=dQ`4IV{~0*!&9>AGs2#SR$#8coJ=r*!-Mjnh zKh$2o>G$jHx|dIhEzt^5A?=l7TNZ?=HT~V08L~p=OZ5-0-5GQk{{gC|c!m6$w1zvlv=< zXBKGOzNhKG-7nN>jXtNu%c#cfi^AkXx9)(0B;22c{S$OK=D5kQf%&6%pFd&dpr9@oAl|5?VR;3f{pi^g2t?dw%m7)E9sy zn*7wj6Qt7OgU^@P$={s1^7-uCb$V-L7X{8Kde#32|$d9I$kP- zqf>{~Yuo`!ep6mAOS=y`N^GHKXl+gmF#2>6kRmt3 z227Bq=v3%^U?~+`m6Hp{0otX^$VT2}45b}*OuoIRL7;W(&}Y&|2tp2Wu@j5MH>lIW zRlPeu@hXxa-+%;$C?g$!D01h?UwQ)%iidLL)?bt6$>CqO$~-JW7Ozdu>k)ynXvNv+3~B(dgpOjo?b>=H{LX z1{3044LK!Jivv0t{nuNc&d<;H##(BYBSvK9UXvmyBJwLYm{s+5j_yqcv*F$WE_%^E)@!q|jepej`|8!dH33FhlL`U8jJ+K%X#=C%mYQ9~Ls|)sy#XALN29?jOTv zRIDrj&*Q4z*GIQAYkdW&UHq%)&CIbY5fosM7upjs^qw*0=+V6-}FZ&%;Y>`f=gI~>#Q1SD; z&TwhNAk~eFezGCe@68a(Yw>BbT*iApJUO!c+m0x*O_|a@wW(Q{aq+7**RLx8(DpE3 zkhlhimA9hYY+zz`LtKDgOGy$hoQ$ZP97)TM5wMH4nD&d-PTA*mGX5i451Ygn$4L9* zL^NF?XA5+^7f~#e?2wHw&Jf9H5=?W3Km&Za?d%m4sh!bOyW>>v#O(DswkZ)vjK#?x zqw|XvZvG14t?|XOZw4+`Y)xs4E-B#FfeMrDJW=REw`tQa?{d;&A7HRK@ffHBECc+Bo}iW_ zUYMwZ3>&~W#TuI+KElP|Sx4Vm_XFrXShfsLOB>qTA=E3g|58#iD6WO~q78x?2HM(P z=e`d73HT8{Y`a(SFUg3|(4yFm43Ww+l@M%zIr5Prp}+h4KQ@0zM!f+(7oV4L_nF;C zX#n6EdQY$5BLLapyS2#|4_@_EQiDHA{bQ#}QG*hhcY`5(JuL}k@hd0JMz`fk{Fu#L z?%x;zAU>vgtkkw^LTJql52->Vj*)A08@dxNI_1+9gE7zev~**tVq_h(=b?dFbduw0 z_Aq#P!@ta^wRdXv&Z!o-w&FMsDPIv0;5Ay7n2f>I9AWya;jKz!Zwg+M8b+xH?Y-jf zw?LO5kf3Y{uQQ#VV#@Nf)x)^LL*J#QX8>l$DGM;$#Vd=lrNY__P0zPEWaxDi+r*hi zHCYBmm@~^23=Ab(x4#(}Nv?9PFcS2NOM3}jK575+PnylVv&E3gE`);4h3$u)<9keOOJAruOfZk5*iIjvk~gQI2b(YNBY3xe5%noEy4d^0Ss5O?$?Mi8wZS`; z_OuU+CUR9O6R+sC*c@9#Smj5q(~Tkl1uAvK(t0nxe?+sn8kgs+Dw^9=F4V@`HgvNb z?Vm3({d8{2@Pn7@+_3(7N)%MYJDQ&=l&QRCHD<4XK{cfeL78(#{dT&Vp(d7Q(e@FA zGw;pPd*UL0y-8!J6N0Czm^$W^GwftsDby-Uo=3Wr`nhWv1G(E@mkj8<2CL=ErM(tt zRRULWqA@f2B;Ww}eHeZmd63DF8K|8HY)V5@ljf9dBcel8C!d;kM-6I|^+AWJ*d}3% z`f2Y^5xufzlxVgZ{?i)T2DCbY5b`t;>d%!%Eu=bkL;iJz3gb`62XQy=yJ=n|vpYdw zJaS03ylp0*=KQDT8wH~WUVpuAWOUM}{QE*ajU(gt*kis5UpHFO6+P=1(X0Q(sWPf% zq1CNpTakn=eR{(0YkuE5eseg}u5!+PN`1sEyT0QnQdd6e8m}&LKc*xIZ;aL>WL}IO z?-_6)i1mx|Cy%S6i_GzQ8@-pVA?)Ts=g<1C+xT!3ySClsC#_pmGhXwH+T72EA)u`C zXO-~Vz#SwI?)N6hGhB`J*2^LR+Ud;An>RNlztv`DWxXU|QXx4!sDFuH(casCe7=Mx z_Vnq~^Uz0cdifac{Csj?qr2?z zrkLV(1QcynRXZ+TI1^hWebCj;gsb;vVVFAig)zR0sa2DXJ}w$o4|RJ%5jiwsJ;hd* z&d_u#D$f$GIjg8x7E4-63K_z~n{?#3B{_EpnmEW$j?9-_FBPB#Y;f~uC3FuJ6%`|! zaPpfANhSKRC&(Jr={J5?x3d>BdCQqOc=I^s^n7&qdCB4*ql=A6eWziZyR6baL7dT^vcMw=*PnpVX!A%3_kE@_C9| zpK;z~(2LsY?EA6wpVHR3k95ptvn)&`w1kEx5vF`IeymC;a!NDJ|LWk)?qPr)%z&N% zu2!|Y+XtDjvU)a;mN^w{E6ZsTu0*LjY_m2XLyfKCa-HR|&vaqjGyyhxO*R2P0?u&O zBNOLvPVDBKys+)6meWsoNgdsM#f<2AfD?HX)$&89MEgy@E} z8QaF2bBVw6kPYF=vp_sMJbzYt(XRQaZT}nbp-;~-&FEg%a;0xeds2)~RIqo5*Xwo)~j8ybX-#^Kh$- zOWv5ss|ZuBnENRa?Ml{0*qqMqNxj6kHw&HuT)^Tc%VD8T8`)TerZF==GYQRO@x{$; zna{-?@D#PHYVl(mn?8a^8w?Rt&=wW?a(V5IV;1`7&T#u`TZJKQZQpbRj`XQW<6pT; zHgZ}XMF!}Ga6!x3T-2-syQ}fxh=c^MJhI0X#?u|>12T0cLm`qvTyH|wnd|je#=&i0 zt-O1ac%x%_)*|l5F6OM;PC>X`--4DT32P9mp9-z{xKsQlw^hbdYlhc+eUD4Hx4-1| z*mj^%Obgm|V;n~>+vas^;OCuc35e)Zab;s?Ka@dJ2&qSHwc6yJ%7K`sN&PyZwy1K_ z`<$J!X>@_NzR@DEtNzjmAvWqabe?rK3(th$GSTkz5Jl zE2aVCUFO|WPKYF1yU}!LWTv(A>hNm=W{Z|qfvD^phto>2^na)3Yb|*^T zHa7NUZ|{Cktg>r*e(~z`QzzZ-@R?j(czF8p#3G!{`CnL2coF`XctOZsc<8-Nw4H>Gsr8+z*!@fqst{w2;%l|i#T^U2=iIp$6eg7NI zE_8U!-ygp7{J*>sUjNG1{|kQgYO3h}za&)P|I=D7OS|W`KAJKA3Ohm&@~2cz#>wj6 zJEypI9jHG5{v*Y+HSE{@D!*`g4MF}9#;eYm8rs?0T(#vtEU@ym`XAw=DD%dbpzH~e z69RH4L`09t3d$Z95*8Kav$DA6c~0dt-3Att=0_)g<|I64%3B1nCYzc}JX~mKf)`D! zvz3)sr^eSEYNLPfZyKvJ7i|e*vjO>s;)8Ug>3__{TW<#2Zt5_UE=!L#wV&T4+S%#0 zmQ`zuxSz@6t%|(gj$cVA-kGI$TgsEAI4;qjbD!TobQ}L|XZ^z%dj7oUBdz!Ms85fy zE-ZDX&1ZCPD6N_7o}azddZIa~IjAk@b=&QZR@zc#!`%;d|RC}HSwGaWi72EnJ-9oi*Bpm6%BEGM*@BSIiHKo?nn>O(+7H&HZ?uFFc z#Bf&^#glHU;ns|CzDH&7y(14GR}TM*^PzHdGxPI?U4`!dpkBMtrQ`{_*Tql99D;)Mpv|D#3g3luXd3Yzts6vd z|KY_f*sj4rT6b9r9-inQJNGzNjp=O~jo;3r!K@Vg;>B7fCMFJNJWhGUyD%-|s<*KX zjm-1hp8E6P7Cu7Lz`cTkNi*x!?#*njE6JX8zAIPWgaYG4lbSsej^pdV<TcoTTw$sQKVFFTaC0NTGUUHC|0h;%C%~i^9a)~9p4wN>sHl{T z_f*tCi>7B}6x7zz^YQVSv}Ygt^(El`t5>g*#Mr|hE!RGDJ$35T4kg#61xN46XpLC< z#vn0!1+ArpS=*eJ84!XV*qsfQYIt2)TDqRCv9o z1r!(jZir?AnUYEL*fG29UdV@0Q^K8{Z72hg+DL z|LN@1-!SO+g8Rb9{ECW=K&E;$JkYG_%J|PRr>0%v4z$+R)>pOmsM3e2MpeGkbZ`)P zslY|#mzB`~ZszfJcR!Uly^IC;fks^>-x4^kH+;M>IOI!}p|k18k;SLCDl03mY6XsS zJwMag(?cmPo&}jbzPvQgUszbUo8Hq3gj;ku$<6i(Q`6Pm=`z!`K1M5XO>=W|p$)+3 z59-_}PoLf^CdPsgrU*5-hp(11@MRtxOm>uoZ`$p`f`2Hhz-=p{PIPKB)}4G@VuG2s2`o)_kt86 znI$Il^T;iJebjOkH7f>19(2ztdbBd_4tmh;xKjV8zN+c#>!V|%T_@^6o%+@zffGWt zdFNw)e!UG9*meU8iziI{x}9jRBx==3fIRJiP8;lPnf5$?q@<}zTJIxo($&-B4%zmz z?xW@iyK{cCuIw4l>oxBwuUxsZW!tv++%|kLxGnuUmHP@H}#@(j<1iH`w*r>(?7IbmESrZzRVAuP11k1>Ejs^_YN2_Rr(T zCs9;Vadr8^NA&`5b*x6(C38$uE!s8^RyS|*M_+kPFJRxV9^!r8mF#?RW&+piSE_q| z%FBk=vH6(uTykZ1uil+=zYNbsYaBW$C-(zXhMvm|_jgLb7=6%A>A%g|dLc@k6j(-n z-N%E2H|$2**+CAK(bi`1@$q@)<8u!i`$p7y4Hk1PG59U<#OFN63FDwCYbZWq{Qkdl z{V`5%E-0;o9h1?~Ve4;*eh6i@S5lIlhKA;Id3ho9NX^F!JYf+LSCD$wN-~mfe)~aH zHC$mkF-xKA45he*k&y}q3cA2FHZ3vn_=|nY#Lx8>_8AUCEH*Ya5A?Hh?V95Cn4Bt7 zuQ!y>tUb7I%86muuBUI_u#pc1Qu95u>if~%eHe+JP>&3GMa2_ZTFhU*e0kuO5JF@m z{uyrbQVA04>Z$O@Q*(px@XxDP%-+-G=mJ$8rMCay;^MB!zPjS}{j>3C)y2oy`VTk}h2OtxpV{lHP=gwg z8?EVEpYD>D!(u8X(>~oPSvcBN6rvhc4YFNpy7gKY7nf&eI0+(A>oJba9tjDZ-$7!q zCpwvSQ70?T@5Jy`Z)|XPUtMJSo!O*HAw0tg1%(Znc71ym0zdASVvgpws^H%x?IQ8- z73+{bh7FY2+1Zcmc)2{gMQ=Ge8en_VZ%^~h{TbRwXyrHwgCb@sfHJMy&jSM=ZDJRr zrsx9W>O{C|fX-X667)wq3qF^X9fzn|_g1pgvWh5$PG_ofpTez^weoDJl^;pj1E1m1 zJ<^;BHejiFFQwATxQsj{3-M!`gv+$8tP)C?qpE_Xo0#u=>s48^!IV-F=u;Y7ka&Ur za^?dm=ec)~mW1Tw2ReMG@l1)fy($7F$+b+pP3Wprond<|Jw089liu{P_4=R7It!#c zJbk(uVV{AiDGgG?wCrLGn|DdoJ6g?PL=Q;5cvw)T1@%B%LPnv02Yvya@F@9j5#DVT0DKTbB=EsUC8F_;By;-2^%fB_t%cMMv{E{TcN9bge2-M^3GunqNw4=kepm zO=`nvj0AT;XPy6KtPIILO`ShFbJ%SC=AAJ&Z};0*XM&F)3-6&r6?UpGqc!9A2ncK;jkvozrH+nHb?l|1 zY?4muJcpz$enJ5e1oDveCJ*Z?zA_g<%nmyYY6+QtXRxrakj?39&k+ZgS=G4Id&b3OcAN{xXFW()Sia-?UWALt*3odGx3dqB|MEQ_;0!!`|m-5}=>!qd~{r!oXl8 zpj9#52+pT8i;#(%(^P*~L$qdb|9NrvYhhtwGJO7qurLWJDZ;OE&6?s~9kY!nN&5ZU zgjYM68ug|!Q~eDF5Z~LkZ{I=pDy?)YgT#^{Z%@yHWYfA%2o{_Jq}$)Y>0%bpC!Xw* zj(gttN?v*@CC4KyGIB4393;OJ_~YISk0koa=Vu)M{PRzBx!TLy35Q?AuuD2Ifc5%N zHiYyVxz#_op%8C_W}Hqx znwjIlOSj|qsSXn{DD!oX_*!0mWrO=Y3Vr9f$r>%DojWTD0cZe&W?1}JvLX7LHf^FM zwt1dZ3OPs3?~;R`fMHBQ{HomL`z`tKi18PFBoAqcBS(*3 zQ;kyJJL1cuY4^4Xoa!Thk2zw&m$$XEGlJ({NG`dzL|Iu`45kAVIz8!rg+!5DGg=;9 z`Yn9u1D=eQXhC0=_K9?C?mkAZ9i`S^kpJlpRC*;4@_GJe8lBr!BO`%byLM5zu}iz? z@C>1sN(n($OC;?$V$2+qwcs>m7N@J1yS#KeXtuSjZ3n@)b7x#iWxZG-vmq0oj=oKX z&KWZUg950{04-idzo?BHHe4aTy*qw?@~wF8FeN3WDeu!KPZ~3nOPI--)FqDAR#y7- zo+m?>%-b>>Ix}WL)_nEi#kRHiIPU>CjuU_WG+t6UQ6KMG;1pL;8?KlV$J60L=tGQ+ zxqTJRiEuOdg`>YJZsX?0C2aYp9DeMZ)qzue4Z&utDLv7wv1oW@JPU z#6LrOdfL(~cdgCO&dF(p^~FMnb@)>btml`M44R#tHD&)a*Rhe2x4JydrUw%^48z85qjtW!?*uyP#cw{E4&T^t%5eC6)$J~~Y< zJaX!dQZu%2^4K)eEG~z%b;dtG49+|c+W>atak(LH?#|y?auQ&gXD?6YxNew(JL^7S zyS(HaI-c!3uko!4%+{%h?tvRvqz6~IE*`yg=XK}6K*be9!vF}*i!vkLBS+Nswhc7J zyHB6h(D1X0-I%+de%m(pR12JFmVu;Cp8{~KLG3bx_}+lVg9rgHmdk|K)YbeGMv}XB zjQMs>!$Dt#t_9fj`0B}mf&$q&=z%_^i66xq_tAU4!X*@ym9IWNoQj|?)=ZlL0i0}G zfQWgZe2f0$L^w+{J!#3wMqrq-RIx))uOd>>p50(J0>vFsBQnwQYv4q|os!n4N~X8d z(9&>hp&Kzn%`nOcu3zqb-+I4c#5D6U>roZMWy;_Ic%d=Ar*k&#M5{{^FRZChdk2uw zhB?~vEaZ9rElWW<+y@lg{12DFPpKdh9&P8j&fB!TQ`nfj>fAZ+!zEBg#e{&nYyrAb zR$)bU7|w3igWq-qHkFpRlx`JL>5OBFQ`G$Gu%VWc60PCmM3{;{<2{NcT1yW@;rI&@ zF=*F4SnkWiD=z-}u-|f**K&f9xq0jqM}YK0K)J`n#FC)7KEZUCFdN<+ZZ&|aG$gcO z;!>XQNJ+iD5T_GBp?@J-<0=k3)41`qYo8ST`4Tx!cu@EJoSmOPLc~~imka_f;N83T z{^1fW#E`G0U8P8E0c8RUDL-E-T1H8BWFSir$SYB)BI@>3T+9Q73U-{5>7oExdBt3Ru0Q?!qcT8X$U+;ZqDq(qRvj~5|$h7~OcV3Mv& zIwKj+6~bds$1(^Xr!W&$H3NqtIZn}x?i6=WI)mya{g6$V!Igvnn`XeyIiq0xFFMK{ z?b(h+bJHVLWJ|xTRwz+mM~zd!=--vbFjHd_t$UUFvW5B@bg1@xo_a!93}?Q2bN`aM&_wH_f_OCP|*IEYybWuCF3p0 z7|w%jK}~q%=oPs$@y&TSVOP;HAMOm4_;~mQ`w_e3$9hJO_L-h|Y-GExfVB2!_sl ztB+D^h8=v+tKzFr{8qxT&|~v1zI7_I^UuT#hYLKu*FlBQH2p>oM5f^yv@0ykp(RLb zBPTT_cHl*s782Xv(9gPvxx#gctnRZ4Ms@u|x%OHUCTfn8OeEf@aPs`x?2Sx(3_D-W zbTS%-vvywK_EqBc74$q=xU@8H88jQOld%VF6{OvwMzT5|-n}>T?)}rJPfM($SdZCo zuFVIm7M=J;`XTWRNI=SXTehQ`mY%@pao9IO;tPg~P`fbv!h_Hf6XWCbYuYHsaxP{% z3|+4madfA=MUh~cJ1cihcd4l2%`w|Y$yN6#+TqCTdwym`naay=t^NAu*b9o~A&Ln8 z{AkrEEpHZK=67v%Z%SRyqgo}T!SICMWnLBbSu_P^CQ#6;%&|q|RqcjRMq>mWw8U%4 z+o_FWORdOTaHMPN;NT&ieMO-U|Ge>ccm=DZlhE3HgeECYWjiLik_7Hpssqf5wddN} z>08mmBKdkl?glD}naxE6xf>~|L9bu)EQsl2e^~}*9HMM`$_HT$#41W$-z~vE751CB zyOS7%Q&WHY1_Gfi_vjaxSo-VlkDsCu9K9=eIVXj=V)Jf96G0UEkt#v-eiI|NopYv@ z&uh8e#JQp+Z0+qEniX$i9%tdP8GuwmjbjwdPr8*hi6J0-NTCm56gim3Q9`xg$9r)P zTj-p>f_s>z&q`W4ZTdZa|l#N@-Mu9{`3VyFcJ?dW(@CiDnPA6(ma zTNgwaI(yQZ-yL7;-6Op;vv=)MOScp{!c&kBR(Ga!{fi!(j7pLEXGzpJB(D&CRCWr* z!=V>j>$t!qjyh!_QqJ{Azm@4&-eKK5m#>H?P@_@TUu^av2fYf`uFc0e<6L)PBdH?` z5wZyoV)x$`(~Ls9Z)86B`-UOSiMbta#=Fe z9GTV32!?G!q(V;0%E|@|PCS)flDU4J8zlpq;Y$XYqRZnE^;qrgpo5MuzwdCFk8O7z z?aoksB|w3d5UZOU>DWbB_17N^8gRaIr#k7XVr-9cpwRJf1z$qO?2e#IYfh9}&x9^}FL%4i1eOZLl?WyG3=f9F%)=V`E|j5OoGQ zVrQ)3ei5@nueEp^6^;Osd=(JT_a*);P^c$6B{wK4Dw2N1H5Tki^6CDOQwUaw>SKJS zrd=%wFphm}XOY6$f=TOC1UZ7LSL6;>GuzSj#h2D)` zR3HKo+ULOY7*4L+!nAuLLUS4(9v&nParmE zg`%tKlRvg=)16l(2tbIF!{fJ%^E0VdJm>N zG*}##c5ku)z$W^ATzB+*8zsl#djI3;Nl|JIf5)Q{;l+bq^5g*KQtfrfUHo$?XnKze z@6^5Nvhnn5TV$nF7&^HgyxgeqMLt=n;OrYK%tZ*=B|F;$pr1l!Mw4B7>npzg%`NbT z>$4UC^5?XycZ1W^FG(eJD_Wh~{VF`rZTl4ZYQwz>Y~MYR-Zjx%)pSWCmly3-PR&{A zFaucutfJg2cDdB#Bd`LU>|0xrUpHw@KiuCKYbL+12CiD17qWTO0u<|uAL=jw`uhmD(!wBHr7;D zUanx7Q1SJvGPPfT*qA(ka}t>c)~);M%~R>4@Xsip?J`1sMc8!S19R+Hd6zY{#q{R( z)lH0!Zn_uSeCRV`lc~mD;Pq>W@$qrH#)njNEWd*W1@`QbeI=pP#H2^y7S2bi zum=rHlBgxK;peYkPeJoc`8fkQC4@S>?uchytzcY7MfC%1?^%u~`7i>(1l&w~4wg|5 z=Fgp3HA0;kn$kC1BeU#`dt+7t8;I^r-Vmk8Sr`W!rha3erg~xF^;$2|>HRD4#)^!L)oC&2$iw0G1Q|mRo6y4XY;7sUOVUM zvZP#6q;ywBYU<&xsrKw}&*fhdl9FxuBO+3--kI&wL7L+EnVWS1$P)mACOmFe!zOH! zS$dqA$=n}MHl2Ac_|Ro%#zEvqet*5R#Z?M!J>A>QZ*v3gDxa@66!MLa=ZAv@MC2hJ zn?<-t^y$cs3tCT2mQJh*Zh!Wpe(RFxuH)9ag? z(;;zjfMG*Oq@K2RV7vM6fw7B$GXr7g4%q$4@7msz$@mhthUX?BQc>GqvPM!t8?eSsjK_8 zz$P**%)~bfO5zoS`Q)ChvL{Y-K_}y2)W_@XLKIPiGvlT1SNNgn_=%zO2KK3*tKm8=-kk=&-K-_!Up3aD=*I%QPx&^lxe4<~=m0!M`^yR*goNIR=IQ$CN~a$=2d~Y( zbNSG%woge(3FyL3e5Y`dat1D4z`X74j>la76%;?4&O2A#Dgk1&PdnwhJIqEm;)>6e zl^*x+uf<-V)Y{7VagOU~)n=fBPOit){VdwEJ#ml>k-(clW1Z)(UQt6eOGuCAsUGN? z4?SFE&sIt^y^WNd+u^zMMi)DdP;>0!Cw;o|Vi*{TpRT(PML$&bRiNCx969FUlr|QR z{tIU2MdxJx>5w{iYqQwWg|{=~!!2o5ACjDI-Fj)}sEh*Tns_~FffA^Exd-m<1z*0< z0!I*bV&!U{A3PDg7r7z9b+AOF@&SNFCbBs9@82sT!U*>h7%HWHI+Jh6w3;c;S6z2< zW8i0<3z4N9Y|YpPZ2SaZ!S-BdFXR&>ZjH*EnU~TtG#s^ef@YFy=tYoq-8@vHpF+<9 zC{$>9j_b0E_W}aJVp!$FmhBSIL^~TB8v%;t1JpxuiHkN;wf2#krI+p7S^eFvBYd0h z>>yM`rNF7)O_0pRPDr_2kK^K8%ILt0_kYI!58B>4oa^_0AAU8oq(ziS10fk9N=8aW z$;h5bWRz7Xqco@_Br7tqvPTlxBRgeF35Cp%k&*bF7xnpk@89ve??3M2z8&xPaj1B{ zp3moXU5{~|=i~7}$Sr^&hGDR~`clsG>ps-HkY@=lruC8jV%+kQjqtF52hRh3yZ`8s zi>Igjl z$)b!p9A}7nbRf!u{^~@(%DYer7Lcyl!+FJs$L}ByW@TmF!Op${Z;fE%&g;kKV0E0A zEW@4EhD%dF6LX*kxL)Lc7eDb4^X$A{3;L8Luc;geIkIXxQ^DDPgVJ}P7FO^!lustq@Ynh?P;|juygB zM@>fN{!HpU8h3@m7-`Bv<#RQLVJ9)+XpSGYcUksJMJa7PY$473 z*^Afi^lA5seEJxTGtjEN@CMokP*{3 z&+29=Dk`$&IT^e{Lk8myYgV*QD9Wofv_;d?(@!BSTrw*h1E5O_*~1Fwp|;SRmoeM) zZvGK+p7*$DacNj*yTtn;q+nite$o6%NrzyqVT0hhw07&j(of8V$L7SY?4sT-uUOgy z^fH!@$%VgRfP;mVhih(bBgkfCH4(67nmun~CO72eI*fgPRQOx>NYu~S0?*54hK4TK zn-M@=G!0Dso5Z{=w$Y?Vxby29-}g2@Rn<>c>soH8ogrxOS7;uzN^I{`1$X6AiMb8{ z?`{+I2c6(f3EoesnYC2>1bszEfBzavQKoZg$A=Rde(8q=O&eChH`3k~DP8*k`rK{8 zE4=1uk2ujjB~ebYZf@O4i<4IU<(T=j6k#4;shf}geC%$PSvCGcNb>{!=qsbFJLZp$;MRre#-`SPnz5&kdI8j&#=Ifs@q5AHfj9ipCKX>-qlu8^ESacwk^4;`6gt5?=w& zXgK*IWZvls_7chfmz1;Y3C-_WI<41B2wBM+@)ytmXR>5v&BIL_UT0*SfHhh|0U*fx z%44+Q=9l7jy@@Xpz<<=b+6qH&%y2q~!wZQ?bai#nz2TmH4G?(Z%qQdC?HV7&K5odn z>^SzFW^THNCD;UMpZv}mO~%Wd$%4aM?|OMMP+eQS(~wNOoci_IVoBG^707orjegG| zMLlO=unaE@YtMMvtbe)QY|1)B2QK2{es5XNAI|G}50uEo*+75lWr&DXc#X#UQ!f*` z^?!aV3D|GACi+aU+jcSgExs>sSYi|-R#47C-EydYsrig_V zVwFi25!m1sN~6`joO9EIudA2_S`I4f zjVgjbWy9vp2o~-FhzWR=kIXj$DI8L>GVnlmZRPZazr0M?25^XB=rYtWT%#WcaZ^QN zL(mwN!Nh})Nxb5ycq4$Q7Ib>QluuG_gd&V2q)X<_d2z})f|g_8bi~v=Xkf*fI=eYv&4*;uebK^*|QS3*NISZCqa9C z!u5lkJm>x#NiQTMv88u65pRzy8C%~Cp^m@0M%7U;G^yZ)xB;LAERWzr{KAs8j!DFM z9({XgORe2KJA3wf@Y-&}S z&=@)U$}tK{puOn@CeODQYOzB%e*X|&iy3Jayo^qS<(Kv4y2bB`qfKHi%ILr+d|Uhc z=*q;M+uHUxru4MFxl*KFBzZ$i2=aiP*EZA9Me?_7pgdf57rNP`J$4g)9$Etxc2U5YM5E#Q-(^B{!h=}%?o=S0DF z-K&-q23lFlnRDMhnp1wCJc^pyzlCj&4c$d{HSJFnYA~K7QjkZLOVazu9??VxiIeXgKfpIwD#EiYZt5 zA=Dp?5T!=q5t zRm~n{lcnAH+(MD4n?uBbZOKzN6$9G$W6pH}#PF7oxIz23A%A`@yL3ziU=Wdq5P}yb zttirla#!-w$&;%HgVgXt*rM$mNKj&DWS-ChyQKq0pXv1b0Onp$YrnCU?xhOy^K(Uz zyZWeijK4Jdlbsl92M(6@&;}yH0dW~{_`3Du&u#2-fd#d-8{xEi>tA^CX-gqJ1|(I3 zQT2B|a}RC@mHy_`2xTYfTw-^yC7jt zE2cd@6{V%F2Sr4TxsiKwjOJZOR6Ynt%J3S+lmXBYq`iLKB*Fmm(o|j+S{xR(Blj~5 zs?f3m(rhw)2puaEAQUP3Rb5^ERGa7Gf0m@0mf+EJM1Ne(O=B6fQ)31W%#Kutn1sgu_?qUp2pyr7!27^G1 zPJ;zBfpmg=7Ls9g)fyZ_p~_1aFYal02(RCt=m1dTxCN?o{WR3o0j}fRUIIH{pPbG= zTpzBKKSwq2h6hKcHfEA4c>r|AQ`xAx%1Ow$*7PBW(kOA;{4_gT6k~(ayuRb&?@;{n z(GMd7Euloa+yWueT^pc;2ES?9PoJZFyt|s#?dt3TRm$mKAX9?goMNj=S1x{FHaiQu?Y+NJE1vKk%LYyH{lR}ctHs8 z8$D8sm6Vj$nm@^ZJ(Kj9=jQCsl}H0LFQ?7SUA}bbRsS7MTrSos0Zc=4&}+f|747U( zGc)v@dJyYT=MItfc_Obo3$3`iYzNT~ny zX?EHWMQEWCCL!8zutTRk{PgZiTDuka??bPgt=h!Il<@Q2W$cev zZ_o+#0%7hxZ)d!+o+m+!S=jtpibbk=!o=2dNS8FPHw=U&**4Yi`!9mV3JXfZO31B% z!T^5Q$ilMz!Li#AdOn9YR8Kj#Bt+cF4OWPnw#Nr;W2Tk>nkA~&j=sLt2%lcP5+rT~ zDGwBQ5BN%-aYEli><$o(WkipYmL`B#4nZ_7>4J#kJV3mn4?3r0VL7ZoOp}B!)Nyom zLP7#k4_6{pZEt50wHrDH+*xoGGLUoac}^mZQ+!L8E+q*v5r7B_GXNHn#QDb&bqCby zXRIN?3TUJ3slde!03J{#!6r%Z_!GcX1d2tOPDMCLbdaV;1L5^(YbHvxEI7*L05y;_ z)FLL_vGfza|vJ|pEEa2)(JJ-iiM3x zMN4dwAtE6=0t5UQ4j)JtLHQA75M9viJ9p&T%HYAQM!RIl=OIP_nsOX=H3jpipbbsNTQVeV6U&4IDp4&0jyh++dY zH7sdUgT50oWVYGM#@6YhaoeJ~KBhfoaeKZ4jYr%wXncl8))JM0sNdtqORzr#&0Du1 ztt*3qhiESKd$-s)4(p)7(IW%?yTi5iGvg)^_wv8l^wumvVol!V?Ch+<8*4+zmLd0E z{lO6V2vky=T%Ru)b$G-g?zjam#1)EBq*{m!&`JLek~40-yquHW3TW^t3{mO%x=5KA zo$LencVH4<`}!V0WVD(#Cw7~l@dijCmqTiUEx!YS1U8)X$&>dh47cK+Ks>m?l^lhP z3-KhPlrn_LR%74g?u2f1f3uRo2n7Y?j6jpQ6mk^o{i2c*Dm3dZ0zNA{J3V{U3`8ai zj|V^PagIF;b!VKY%O?)rmy&)vd$2SXNOW+@RoY2Rk_#>w|`t;MK!otEN zh62)qSjQEn1;iO<60Z!0ci8a2xC{}$EixnM}*&K^+ zh2~!c%IJ0k6_he7OWmmp%O$_`lg$;f8`|1EfNNlQ(=1>}7WNNFijtC8>3 z+n|G_gWB_Bu7mKg@X>){eW1p?yu8W~%C}a6*2CkZKL7VPjuevF0u%h|3;8-y2z`)Q z6lZv(OYM2N+EpJDGz5rr8QD;`<~s5+ygXNvB%9pJv?L;=PB_*RiJIvY3UV->o=qDU ze(2?KBueD7XbC`0bi`z@L)`uG(}+sAg@!VUm@a_9d2Rgl4--tr<{gn*yAx%SWhYHcAs4HUNUm>%otglziI z*kQ-14UiT{LFqsq{po2}fFTC6Q$Go%>!!V8P6YZnS6mMpekG(fkSfQh#M6JT4!TFO z<-@Q*DQRiT%B);g95!o=qw?rXv7azaw1I@~1gK$HU!cKm08G!r$|Gq9oXRKSQ4B-x zGTz^lo6?L!>*mNa4jpBTRt67c$G&}XW=^WA^nlL!EjuI;ZWp5-0_i>4M)bDl=NArm z2M0gG5sW~32riCKSeOV6GctsU!9#j#8Y!%tp#py8&K**UQr>MH5ENA0(y|pGQ3+bp zTjAlp1+Q9M9lA$_3$;z>!vUWeOpkU`D1fFuwzTX7$Ov)qTbQU+w38yTR~kk^j@m!$ zY;4c5$)wJ`FDhCJ=8Nnc4C-@-V1&W!H}bnJ2QCGae)xmw0z_X81KNo<3f`!3mHE;F z0OkB9b*zAlfcpseb&4E2c5DYIL&PQ}*yg9X>LH`xJO6f7WK>k)`}gbI`N7po1PGbY z6B7j4$Lh{{bUGRzY@tPwD-6^sL^#n`f*_zM0${rgB60+jW(m-QG33q7n0-};u5qY6 z-xCS=H$c&h246>E9|7aH84%a2q~tAAW^o@t1!OZ63cPxa=1p+WAhed2uMa?@1xu!T zptE*B^NB9Xg~R#t9!r+3Fzy2RCXMjR3Zcf%WXNzK)Bg!{vo+U&0rV;<<8kNe0ZhDM z)23asmn|$j(X25Cn;Y_<0(=ya=RbMBgdB|WGI#sMda{5RMAA^B?gXj&5b^rkva;Rq zUWnxHf(ZiQTC)K8%U;cQv{2u+Z5x7a8sq>cWo4y~9b4Ytoa~7>j^6Ay98nRv@WI7x zq@%lwBMn__Rm-){T0+dU%&7J;QeVc8~wQukU})D-YT!bQqx$djKuDS7<(iV%sL9$4R92+MXKcP~JtnBb_( z-Mbxtcp!u?MKI+R60!~-jT3wL<{Xp6pK)3UEgy09xKJ}-ftF&|VB0}my%ioB+u|*D z?M5ahcVviu0dWD=ec5KrB6|ZJ608kz=%sN38@`{!wkOQKqK?%?k+*W$*a-# zLBjGJY6=Qoie>!PT_;yK9~2dZfeG2_d#?xGmneMLHAI{04}sXS0vv>~i3vlXJ$vhH zuh0H`A0nn@FpYd|E9HP`14l$gRI>T}RHx@!%0NTx6B$F+1(z~Is)LAWR|2{A06_zV z!lRd`eI7%>ELgS}5Nrz)#`ttBV z%Tuux)K$c2-zGY`<)r~5mF49Hs7fMrYpuu-Nj(R)?A7mbCr=hYzEJ~yikSbWPghU8 z!Y-h^8X%*Amr(GUB~i_i0%8?5CP=;WWs{TMVhHr^Z}sc>a9I84 z2p6Xy>a{}27O~J+;x#Ty@gIbNVA6E`=<@udpYv-|dw5nsc8Nld_@;;JC6`JfyK|oX z>GH@>He@v|doTAxdkak)*QI5%SJD}KwKYyP(GAJNEQSXZjY9JQR&&Xe#fE?v zc{ENvsVSo)4f5#b+=uZG1I9|~ zt&V$c-{)v`gv2dUZXSP2fZ6Xqd{~TJ>+zE(cd*eq5h%c*+(mfF-UKnrCW_A#t68+{ z$&)ox4UV`rH<33dw^17sCy+PsRM=EDHIs&~RvLIOOsjD}0U|mrpyPJn+ z9hxQ=Lb4%iD3Jr2cv*RV=?nSLCUxNpHPQMmW^?b{uQYMqDd z4_*0wnov=YmfVIzK`j8O*+Uo<0s7`62Hw{iG99|gfga1LfU&2hr;qUXccRX13Nwj_ zKLEyCGful06mE=ItdhRJ8sw5I+CmaH0YL{TXCV+u-H4bLHB99)3b6YAFL`-k@p!Y8 z;?D4XEu`=VAB9ehC8Iuc=Od}-C^P%rpdQ_|dfmDv4L<<0eWxvYduC@3L5PrOy@fpIYoI^4F zA>unxUwT~EX~IV>-BiU9zzlgqkVtF*&<y?NoE)|kP}-z^4yV2s zN%;@xLK>KnDyl6-CgvhO+DNuicvs*5af!K1H9@CFP-(T%w{{ z7XuNQob4G!i4Oj1!zsNF9dJ>MJUL5%^Q`n@Dc~^;fi?Pun2vq;vlmkF0qyr&is73U zNW>;hJ&5he^&x+OvQ`R`AoS5)FX?b?1%*_OS~^Yrp!WfIfsnp`-vH9%6wowC<2nc` ztdJ)d8)`Sf%Q$6^-gOCf>JM&<-Jsd{u*4X&EdsZ-SFVgneQ?={cp5}5lmVOBE3>cm zdCPnzC2p&x0~A4F!`{DLKKoXCjMq^7Y&EsT+I_7-=oIzGJk1lbO>5fIwsjXYS4-p}R_) zea{{P2*b9B+H!Y6keLI-VPtG<8Rc}K;A+_R+pBJWFXjk1OTA` z#R}UH#%&C|0J+Vzsga$a9yT&F(@@IcUGO&fU^RAH#sN7!f&4>)D7S9k9$)e7l($ms zTd<%+??IUs%fTkUqVEJCKrvQ{jjyyO+s=ZN(@V}xf6lh!MYGZ{p$p3_uqU_dzp(1e zGm%?ZKK*G#Cw#^=J76S=Dl6B3QE~CRf((w-?viHF{O_&dI!ZlRJW)%87mj5QxVnAe z1d5xwFLxv=vQGn?noADo1{5EKEI9{Xb_wC?S_Z1aBXxuHZKaT7|Se-j8MwNn?LJK!z7|GaQG6YWSkuS_N|B{C(W=B?&2$v^A)A5 zw6C~XJq^>S}Esl)%Gmx>btWHf8iGXTEr?Ts9z#d2D}dv zxFdv1fj3~nyorvtn$X)6Bhw>rrHH8LZs0^vWEHt@6|kHhHALFjSB=>!Qfe`%PWsC`A%}jF5cD)kuE8R8|OH4BmqzlHv z$RTsYsKgcZlStnoqB{W}t?WlxZSW zkiycDPXs-!oUF@y)OBqk)`jm}0VSeR9NBP!M%oIWQ$P(vLfkm{fYq#Vg5aYG}9X22zLJDnYSfOvC zPyn_=OXep2x zBe1mPpmVe4W?P7_cSdp({2%w_wf;1OgekCU;5&-Gd|?KTuvkI51+@z#9R^(IYsbHc zB<(bGX4lxgxOW#m(rf*H0K>(<#b5k`ofbc-Ynk+4h-o23c+1chq>7%JLj34t7=qN zHB>)tR!BMb{OyLoyJsYi*sm5_#kySSPup3}-8iPXbf^F7_74XSmc7fJ48F*- zwjLjvSN@@@F+zy5ffws0DSK$=6mOXhNt*a*mdbZ5D4Z7 zn8AZ0e8RNNCkm;vuR@)!lAvBY_;)T!2EkB@ii@i~mWWE?-+{#*lwr8>5yV{3v&DG? zVHaTDO&&sWLh7kNxE)eB7p7ry?#c&`87UfBQ5h4-W_ zzBCF&xXP$X&3@*%1~;d*4UKoQg~3+Wh?Z1mEsuX|XuFTi@bNEp58o2&@D6^p<_(Q8 z;+jW}JZ5KKW-jJuy!aBFzsSmHL|*LNZIY9?;+}^9{*MZP>pg>d}9H|GW%m z?HI-3*uSlo-PO-{wb7u=vxiGSU_Ps7$*=d=A&XxHk47dgbK`zBxGQGH4&}&8*eJKO z91yzH8&Ss69r4lr_9d9L&&6mr_86cvTz6#WZ*ZH z;CF?9Fc}&e`dTY>G(G>jL!G~@S>x7_YctQL)(k#-a@a0|wW6g(4kH}>;TO>3z|;hk zkY=uZ`c}nTT16=syEPEHqE#2Jy1TP80?--ReawsdDd64zWj#DU{E5@b2qA;k{y_C* z4G|S`M`iTwNQ=;=4PNQ?aO>Zbl;Ys}l|v%mXwB;D3O8<4cXf0`66mkxrJ>uyhfnmk zm;&iR3l1||<*;M_&RN)Lz;K}eQsMzlo4}5b{`#eQ?ATpkP)4?bVQ&@wzL&7maY|8c zP*z2u8ik9S`!qnqHPqDg%hn$b1LG0Myq;rY0#4Igd%=ZwAI5>RxVD&MN?c4#2fSu2 zAi9Zqd5Ktny6n-}O#kz~InsFc*|AkXKnfeK3JKrlty^OO?*{p-<=FbqOk_r&H3la; z`*8$pXJOHW?1r?{b}tcj|F<>lm>})_gT6ogwGsF1Cx;SI!(KUfvVi8_DittSl$1y# zerp2E*^qzpCZ4!@@T6qw!KciBHw@oHjP#wG%%88om{+(xMO5@2ci*CK%N|}s}LlbBadhQM(X!@XGgIu-`RD*NYvqxb@jvA01_l z?n$dI zzOiuY&ZkOBN@9_;l6wSPu}5D1gVrzYtJ^tvj7GxWR)X zKD7r61`IfK@vruxrs0YO5ex1!#>LgD{BuQOF;_yqZI@@Zlyq zbd>so!EmaeMADIiKyG{bgT#D}(Yt`13xj1@IYmS=YivMpQkBiUJDyuN=6vv=IN;hABF@d0$VJId39KabOklKdm?mOBZgwu%NUh)%$p8K zzKkq1PFK%heF{@0P*xcU)OAfBN+ZmVSTDXzvv|GyJcuh}0oX_%JJt&*$mm27Gi*Ow z64b63xg-C)3|1o^zV?(iFt0fD(Li{a&~eSkC>oeV1Ax1|9)11&Tox9?QhJLg$q1a2 zACQWu*;z-tV@<%+@OA#WM&?+JTT=dWcLwUWzlYK%i8*UZBVt5favnd5Yki#9Z>M0 zagd1Y~3H(ky&k2uVs-N^+EjiX%IoUf-kYoq-fV<7R{`tr=~bi1m3b}P74G% zIXRI5Ji*&~h1eL$L2q4q#A&8Fz#T>}I+HS)?m)F4#F#imG+3o&)1wfjwpvp_z{dL`u ze?HEKf=(6H!J=wFG*zI>9!Ca_y=h1JcZIOKz!my~Eb>ZYyi+IwU?_eSNXO;r0UP0aqq0N?*zG-^)Pu)!RNlmw~dN2~4Et+`IQwa_+Cd zmQ;lm|1nw_&iY$sdL-saiK+=&NmW)>)`<@1>?VPj>;Aj{>~W^_+Tt33+xwu5|1*(% zQ^nTywfIc$ZdqNQE&o2SgWdt-vAc0cWc48c58Q9)2BB`Xhs%EFe;4AQ`hbzqg{5W$ zrvj_l4bat=`{TiX7YXxOi+q&W(5}ZPd@#P)0)@X|K8?z5Ghg8o{rmiud-^a<^ZWbY zcmTL!Qyq5>Is8g!d3>(ypUHMsYJ%Xdq_or&_Q}o7O$pl@|Nh_LlooQ3Geji@VL>BM zkzjGBPlG2@j{fsd&N4^{lYkRApmhGeP2i z=&?`aGl7d2(lo0*Y)*A|b(QPXHLRxX`u^R>_SwrSzOMd0&it?)jd40!fb9Gs0c?pi zU-d64Hy1tO!BqRKuinOJ{>JstgAtWy&aAPr^^4FCVE*9;x1ho+BV;$|g%%bqR+ZdA ztfzEC&UAe@^?3O3*>+Oe?JZVAt6qEvuAhlGv3auP;!Dj$G;niidFGq%I_uy*8wclSPw1~)AEy_5$lB_vpy;N` z%+aBte#gl#)?(Kb9=?!QLyHgyrY_hf?272fT^HXN2TMVY3hDa+IiE@|Ohon|b0pyE zI7lQ=(d?!3$8d26@qLC*^0_h+mi5Jkp_@nc5dtc;^tjjNpQB;MKC8SqQRuK4Y(+i5 z*m0CyaG>|mfgm~Wu5aJMaXl`y8br_;aM@_1)#D{jY$>89XU1Rp>y4u&fDH zK=B}HPI{A#h<;r$FyLr()Fx!t@Efwpbd+9|ynWk?8ggZA?PsW+hy+OGG*Y+{W?j<+ zCH@Ov*<)DKxb8j^+qJFFhepThvkc07o<8N&)6+}qq+`uO5m0{3+h(IDn! zb{y+3UgQ*3!}}8um3^!@qFV?vWJkI&Kk+Tw^!rx$0Y zD*Wo|>8|)G|C`y@^+5d#vt!!Yu@b{SdTp~A?$y;Bx^InW=ehA|PWIb+W^aBY_qr?A z=KXJ;F)^_Q$*IOqM3-{Pao1W>L6gP(lOLi*jc*2vS!mec7D2nDGofPfuELf&_Gdi4 z|N7x@%KB+yct(at{_OsN{d!aaf0I|svO}Sv7Pfblo;XnJ4J77xdaPTw=I3Y@UpBqJ z{))dT@St0xQN2WSQsc$^xwy!8r>Pw5`(uwk8b5yQ?%eAO4^T3$bwWU3^SAD(xyiQp z+VzKbTs(0?rtb64pMlv98Lq-6;rYp$QN?|IFY_k+SUEqKHjaE$cS^O1f5yxtI5_uP z2m*?&4F2vXMeWY;zAZ5+Y|DMw)!lcCOGS{AOSbXPA2yl#o4@6DfBQBrH{8aUYW&!H z|Ne$JB{rwFh_x?O1zulz%(~A@&}jDBJ{A#$%W=wzO2=Jwb#v4oP7eFu z(T}m|t_<9=If^SU&m~Eq)Ez&JA5(F3QnC4V%;`_f(ZJa%URe=)<+E8fXD1nj1RcLh zB_4KE2b&kGIgMc!DtpDOhjU#&O20kn*2I9Gt-Kn`!SKgb zetrH1Wpo{1pNFKI_T~Qi(S1Ew?DZfG)$nG(h>>qgs|RK%hdkrtD;KZ`qy0-Xf#qJyR~&Dnos$CXtkSpmDiqrN@Bck zciAZ;m-ioEN|Q&Xkr$8E^I)#83D}}C`m@&S;cqUQKwFZ@%)_h-ISvtkuDTBE4T!;^`*3{XZSLq+V$Al>VXkaP3iV<+d+6 zW$&LoX3a%681cad85;X>ub?MStVc&1I0Th%nzbmkB_++64C{)`bb7|A=H&!Jyw&Bf zQ)XT}<4nZvUE@v5)}Qo#`5`plEB(CmWv2bdI9pomt>+wRJRdcV_x9c%xFLQ`;cHu) z=0RhxCRVn-2h(He2RLOm`tIHPwPMdiwFk337yEJMc$Kr68Iy*ST%5a)=E9GEIAEUe z{1GErpYhReB`)t7hOz_k=jZO0^y zT>IE>Wh`b8zt2>OO`i0&PE?ia`=ruX>F>`T&jyC+`m)sywB1 z-``)GiFu;CDe>i}OM$;S?og#&l)z%-b(Za&tJ!H2rz$se<_wN6=i91*msTePFURRZ zC1gM7OTTZ;-0wHYUX15&IAx>w>h`4OM~fAO@omMZOn#E&}Z zFZnaF!*;!49S^4~v$M^Vdfr=Siu_t>*3^5+JW1E$i>9~WOH`QZrDg<`b6i<@->zkVY;GwPvXv zYMlF z&Ds2mM*WUA^0=p`VODsqwxti1u%v|yucz5}wHlw+xPCR~tL0KvZkr9$TVC}v#NNI= z84|YRp!R;-6o3DIOzUtQ?(NudbG>JLTZT?-tjiqJT)AEBzKV)ZfzJ{&FmU^@QN2sI z*t+Pb*k5cPE)HWq7MP|7GXDiQ)jDoGdg?#m?cFeck3}$AZku$QQ-&kV#Kf;3GnQYn zqNEqvBb8mU%;1U;dxy!Lc6d%61_c83w=enVB1P zWMc3S(+yr86RB@^QWq<$8zaydxE|*qU$PmkPQ|IL|fs9MFbM-IM z=Xw?Y*wwSEOingGc3y-Tq!M4om)iYL;L%TekSa%=gMcgA68#`nA`GC_){X4pu zBFkQ7<>%WsB*gBdrZ=8=y!(^&x4SE5ry{tnImDl+4rCks6gPz*uXqA$Z~rU7dTgvQ zUssIk+O?RnW<9gUuf>M~{Gz9h-W#7q(PZFL4a+Z0T^D}H$nDD&QCvi>T!#?ep69bKV)kB`M9!5om z>|rO(WFFlF+;3p+<)CPb7Ny>2`RSKp(`95Bw{MGY2cGdQ_H1AVf`hVBKXs4Kh(|0G zWM$o;!H;~xU}wB`?OJ8PmZ&|uV7-6A7COKDQN41z*ONPUj`Qjz8C-nN@k;xk*q4~c zA;upScn_FG!<@eC>WMd-=(iWxC1p`o#$eJ~hVDIYTD66q9+2~Jea;Ygpt0uEfz7{j zPOQ(}!0^I6?cxAV)h;eIRdmYp-^Xhi;VO73CUiYhO~bp>f6VF@;sb;cwUuQo&BUoC zTjV!xeJH&-C$}-rwDI=V+@p*KlxLqG&AQpIY#1z&+`VjNoLlnn=1>FWV|Uj@MsWhs z>i#;I@SJ8FSC;BNLln;r=xRT>mzG9Pvn7n-+qZ^m{mO_X2cCaQpQtUVu91~xV_|V> zf8nXC{pw`srH^6ko4Jh9yN2=b%^QUWCvM+KKVP#W_vhFL(?8QaFIz4Vf3Q6-bE~e# z`Hvr0C#a)FF%g~KO#m~f9p1ii;{qnJkGJLNMmAow`~&d|w8|?ZBcsKN;?N?Q^-l{x zUa{or>%&NRgU-HanEkeYl^x^5lJLn=&*t)G-6sPoeisT7pFH!8x*2*nb|;XZqR<1@ z**dAmj`E|2sx;V9d}REEv=-pEVbFx5<6}i_ts+th1ilJTJB^3V&z22lF8Vb}rHG#~ zM>xoFGsNU1hXSh6<~Sw?EQc=V3F@I65~|He9?HIF5ll(pHJs@D zuG?9vGw~5^ksGtDyOmDg*_&FH??9I$J^u9`OQmUg9Aqki=y%05_sSp)sT)Btz--4L zN18#$pz+!hEPYTl@Nq7Ji_U+ntgRG78cl88wZ3J%2+iwHU4sz*{3dNV^BZ|x9Xs~y z`5i0wV^3@apsk(7eB+Q%>8TFsR$|BtN~mf8-z87&;^|nN=j=><*wNAFdWUlhzxjjg zDt}?orAfQ%&p+1I?)v&w-_~cB0ZrSkL)S+m9i5yuGcwwLxl&wI)P?bGNQwNU7Wcfl zN3~z_t5*|;tj_1v)ir_f5Ek7ubk43ZF<$K8!Iv$AKZ{3G>>SPnD=Ab5a$P(j5cjlD z>lhMoS$TQ1d4CN&B>B2Iz9EQYPmh{x-@@z9#f;(vU=<=<&8l{zvn)xFd4EohbtO8Z+YNH6=anTd%%us=4yGOR4` zl~;dgZqBwvvw9umeIYGYB$vMLx{jGEs5)A>-SI5Qai!zOOAULNkX7^Mj(ZbL7-l)5 zVK=S!Le699bU-T)Tu-C#qPbtY-t(;$J8SUv+{F`W`*k`Dmk}HkWI`0wg#RDg{X4=4JVZtg(E2OI%M5-A9_Jw zG&{pBp%kGXa%o{v>!-fRFj33_)V2Kc=g)&8gdxe zSGFu&rt;>}uP3;85${{9}`gnd0oM z%gK#|8FTyjY!X|~VWO+6+yCW-r?tZ`Wz04}FCgD1Pj<&+r@zwbhelrWfJI11f4d$i zZKE>Iw6(=vI4#(hDrg@EBDs;4+*)+`!n(wKX$XD`*e z1zyQHsCcbz$FE}qOI$HbGXk*l>eW{eyH$HEtW*Kb&;PJnSy!3c1_vE!wmT|U2io`6 zmc>;yXQW==xrEYO!fr+$fzoXPc{4b?3ru1nlGBP`Y)C*(W4Vk^YpMw$7dL zsm>rF$Ehn&2|pvPiwO~h(mM!nyw(u^ za%B~O<-tV?(E zC|5|7%%!1FGFl-s9{0RCd(^uj)5>66{yc@_l;qGyWK&5(AxnAn3`VYnNWC z9>Ww15Q_DnY{(k|AtD7*PsP}{S11`>53h2vEuNXHq!T@Gc6(H}cEcPq=w1U@MX@Xk z@7U)G;Emigyc#OxYVod;?USmFKvFKEsm}ZR(wlY9+S_M=4%i9102Zg5{PGF>ayXQR z{cucvji$ahs{q%c;U^a;u?3IetaNdUD?gn2 z8K!G)W@b)=nn{VARm>Q|SAjCdgQ8a=JbTS<&%@!kNwgNO9aP8X>OV=}^$FcuvGc(u zaoQ~e^qJ-G%vexma7uKz9NxoI=GBxT4lEhqS9aVuddvnfFCYibpYhfnVzvs5Fk>v# z)}NqY1ryZaaRj~wZ$k};Gt7aBEruZB%Ul$9rU}{8P}Tqsfd&^yl%>w1OQ|e2=Kd_* zW_|T40m0t=H3yd~%F0flx!>s6*je0$lcaL?%jDm8qzC}bAYMHA5(XS-lcNZ za))aHR^JGQ2nxP_R7N zPiS|k^q{Tx=4mY>QZc*=!u&!X^a7M7?$RI-Dx-?ng@s~^0(GsKb1fBJA;M5@HUL|V zMaMRKAADZ(G*q{OqPKNqPM=m*R}W}yZ3U@yC3mvT0l<$pYDHq;nPWhpQuWMCO~t@e zYC`FWq5+4JpWO5hx#>?8PNJ?VW0uUR!or)QT4>l`l0mMZ;6txa56O*>(plqANu-K!m0^j|^6$hDW-?#+dYtkZhnR6CmMAi})Cf9tH!vH>V$xw*zhy zEC&~OdGxgWLF0K4g%@zUbdIUCd&%v8^n{s3N141jv_3*R1iqF_2f(yTK0N|}n}jH! z90&{#fZ4dzeXFdToRFxW&gjI13OcBwk(M}0Sx$PxHBtvZdG?Ily|#`{_m3Ysy$j~+ zoCHx3%!6eQJY*9$_bVe`adfHV>gOG~ZdgVXd)i_<)WQnCAS@LtD>)g>1Ps31^0H*` zzAY+@PNC@gEcWRCnT@@W6b5E6 z&cs%OsX?T|8Y|_proSyW8?8m+pjW8EXyL9`8TZt5uS-MRu7(hnbQ;f{XwsTN6WUjp ze?hfk1@Sn|h#!Q|WK#uGkH9`fV>V12s(V37B%b{6_&<>iU(f<4JcyMx7>Aa_47LXR zZ$OKc^XD~05pg>s-~dt;hzdE_*`v?VC+lyqwzE^i<2Hhuf_0HYnF#wHA$ibz>1eDD z!dDhrMH2JR;f2P78S!RCT$Ryge+nfEPwVRIkxcBB3puO-`jTVx%E%&ZIp_~6^b~Jy zB=MLC+!f~M{#1J`Z#~d^SV5aENBApFkK2O>wJ1nRhsF($l62120u|_uD9a_cfj+1F z2TfXv*Dug(DHf{nD)Qpfkwj0xa&uM@Zwv9YrB>JiTj~d4KNBe9(`X21qame`de35B&39U(H?TW_*58*Y>ilt>H@6J1|(JuEYzP;1T7Wy}7V z{x#q=!KQFv{tISCG$52Emdf_d)*Lk`kl$_EHjrAjeQ#>&$ow^7vhgKN(pp9#X!;xV zbPaq~cl~N?o3Nh^L=h@Xy&JKNz-H;`jci%N8fx*01Uy1Ygdxu5>gb@)wtwB4&U-|w z;#}wB{qm#(ZCT~{gNh>o@n-iSSxO8GJ4yS*R}AH6sxanV5Efy=Sb2MUJ47zA;aCa? zT{>*(Hf~frzev>;AlVo0uFWnx)(KUC(MrGCJ{I*CG*E$xsv7Pq@*Kk_S@Z(A+JSz;0JMi z6daUpg5YY3OKOECKSo|Cqqp}P=NjSeqda&=Yt$H=|D*-#WH`n@)3Fx9+!%WKO!Si zY`W_Sd|)%oFc*k7l8Y?7h}-&|X*AMk>duZ@hSNwX7!O}d$+8g zSpqZ$rl>L|F*Wm^JU5axZu8hA+G4PHAw0g?*YZP?AvfijMd4Z-Ue*FWPXGzl_@Rjwb zKk6a@H&fW##jX3$7@8yk8t6Lyly<@y_hv<LOU(?wTi74sydtw}`c1;9WL z-49d{kEa9_sd^J)UbROkOmNRM+%B;oCG>d(gJy=jCJ>E#(W0Wew>JiIn1TA6ROKbzK9N;7 zojf$WVr8Bv2^m)29EWfs9xc=0_RSy2|AG|C9rE!+$g?%L=?^g8iCxSJL1rW7+IQXF zK9D)~^z#KvN>H16?GcV$c~00OJnafjT#BugpIVIZ9e2Zm4*da^C zdQBi_F@aKr=nHYx38=2fnS&yN{7piW9zhKlk~7EEjE}aos7^Rd1swNqJc<=ifsjrm z^}O^x?MwxX8_Mi+M4v{@EX(H}v%iAepX}+rm{w8EcVQ&{@aYS_7ase3@7SSrE-Vhv z-Wi=N4ne_&L1V+Ei;n9)Orv31i%(#n=7>5HFv4)7ZW8U|=nl0bFvV7NS)=d6bmJol z$THDXY%56&u#347e8ixFk8%Hn`)IzMjQE6b{$xFosk6%b4~WGeGs`vZ_=NDp%)k|b zYq7Djn}RZiTEm+axz0(X@_Ap~@eDKHp2&CQ+a(7sUm33|>D(F|Y|(GCjI9rt1wmnH zI5{g5&YtiTn`C0MSWUbXOk;sAD6J#V!>gS+t7^gz+0$Br0{*A zrHkaX9cp+dFVToGdlxHKg!w3r&?~}8r=!UUitb`NSb9*_ixYbWb0o76D#k;)6%`$A ziW&us*hb7KaF9f-&M!-i()w_Qni2S2wQS}ImXlX&n;tVNdnw`i{KfX`$IzS{t(wBn zLy~UG77pkvA+noy+ZG9}?CdPhyjU`1wD!0CmwYGaVzD6ceuD zz53hC-w;#EKG4l$?qGiAOut&ZpLmYQ!(7PUVA~dwrUt|pPG}p4WaZ3}LQ%&l%Rd8p z^L4oYIF#9PA_+mIBv4M0`Vh^fwJBK$!wN+F<0Y?5WLvUSbhmDe8~V1(LQU=9SqeQQ zVP}&X1*zpsu6LQzys;v{*o3FXJh?Wxz( z;zUKts~_ln)@K31q6};KK2eMF+AXEhd^&0Jd?Zf?97N>_*W3r^(uBS%NzlUfBN+7N z$`3-mwL_!aq7)Q3s9nBqeDaK z&0E5uwL3UkN~>UsjISJ0SA^2JgFk`Qa-eD#hvE=m5-19lQIj_?cV{70F4?$^c6Sxj z8#%{me0gt;Zk+#6TX;lh_RmB>e7w=yGBXojE=0r*74AQJNfJpSWJXZp*eKDEDVFy! z3S9XREV?IHg4d#n-zE5`t&MN>c|}ye42&#|DlZ(Q7)qmJybOE)7>qj z3ZaAfklHUUBz#3P6T(8J)r?SRgy+wFYFL}`2|9@^i%Or{!xm-Dm!SH1lWnIrG4*`> z>Q;l&-VEA3=Ka@+>LY%ls9m2D<+`XaGrt04M5XO#XB_PoW5j~PAqA4bVvg#_p}Bsh zqVzZhH~^-dXhY@$`qA`(#7f!YL4Ebm5+t4M$*T)@@e}*?ao?G%S0D*_d8plKa^KDE z(b-GB6L5t9PFM#5I3+s_QS;`6p@h%`=RC@b$ZaGw>@f3ly1Togxw?9g!%!Eba4R%K z4}zXmToXbc9Zghjk-9Pz#+0d6}0+MC*~LFJW&!6xCI@c_WlyN94)W*C2WUG9fMXzWlQ0a;-P#!gU_$` zsUI4FWnJ+h=*2-~Js+y&B6jT(e5Dw1oBuW2o&lFkkwj5@Wg^XpvAyg>x0REZfk8$I zY|qR9Kv1jENT^q?$}4yoP4-7s=H(Fu$`!lerj*~q&Drs)eGM&X{i+eJ(YC`pp%S@U zf1)mJ;%k--72}46d1V6U zK3gzuWO(sZ%%ML$>Qwq<1LqHix$886qG}L^7)vQD7mgi+rE>hzDkydcZ20xg<4!p@ za-ogs>iizv&;5O76%4+?T|S%RYZNrCnV{$fDy-QJ&8w} zdD@@7pQKOKp4fb|*X#RGTVi|2jjS3GgKwP^eWj1U<;S+?PMQ(|{>@b2{8ZW%Ys(sc zt&IM*j&npob7KGg@zx?2P1_DxE}i;uDC9sL}ZU(f#|kxl051XMTRYw^=9NkJY4jIDa5EV9Sp~*OhGU z+#WC8eBeQQh@}iz%w@_NQLb1%0Bw&y#!or!alf%rC+;MYmENkG7-+`42S}H&BGDIVZaKv#i z6%e#yE=HBP@w2U3C^{=VvMt0>i8dm9ymn?H@U_X=!k_D#6YKxz>wlVUIBOqmWkB=0 zZ_kf6nS#fDO^>;uJa+m`wppjw&cHGMeB-`b%RqVVm8neA+>FSuMA!=t@xZ9J%ynu39+)C<$cFx@Ts`bougdBG4kgUG%(KNnKOYl!d z`x=k+5ZmN4iAGO5{WkqVD_?Gu7F#vgQki=}b)cnHJ2&6xQ8W}Lwui^uZ@Z=3YUVBT z=$m$-7J4nW?Z;MeZL2@O_l8?{59kW>bIDd07Yjw|A7#EdZAkuC8UMv2GWY4FAtU+> z*^2#6=%-q#XXS1Pt(=-^+_#nM8r0T{MY7obs0)~ylInQ}K@bo6NkB~!ef0-de0B78 zy_<>kJ?~9Q!j5Q;_C_4?@{7Kg|2wJ129DyDWxIF@SkL6`_9uzvNe2q*+IOcDw+Nmj zDi6gf|Gi&(Yxf#e9lELe#pr`-aDn6>NXy&I>yIaMYk)u=f5wy^#DA1VN@~2S=DFKI zyIzHcMnC+M%`l5|-3g$P@D>1c(9eI^=EKC;*puYsWXPapcWx!S;A5!H9(mJuZkuQ1 zGt8r2i}(IuM*@L@5Tf6NEHD9;7jgfKuD6cL>WjKYF;PGeC8QMvq`ON61q7r+TDrSa zM5F{n1f*3!q@}y0r6nJ_ySw?;;rG7x8~2WJ8N)v$o;v&Nz1Ey_%{i#2xU<*a6c(0F zbo(0+-HWBv(mR_}BpD8ATAH04mYKlh4UDT5DZcgdi`3R2(A_Jt_}kLj)3#vTcMC(l zJY8wmB#P-scUhUr$bhy-SMEc@4@*wdUmzb#C%g9xG(4#zJa`cJOXGE- zJv?)<)d0Aryt6wQ8QFoqPshLg4f!kJveg_nzCEJd?4@lV&ll?T5{U@APE*GrST(XdS)xV-u+54D5N*dM?oOoG0?y4kS=amzDuoe)R z)6&)J>2B>Yrs^qydvSazu;(G4YZD2FthCqpJK=fZSda%~a>bq7Ga)Cc! zhE{Jt9J$WLS=)z)*C+_N>&^-|B;-S5I5FFAFlLXOoV*J?8irX~W~2m?5!ieWMRF=Y zn9INeGj8p+|Ea?qt)82l1VszqtahBY#`@G9?0>$qH1Ju0T#iv}vN2>B{H`sK2Mmxm@lSEJWPdDzT#{;w9` zg!dek9ZsXf%%f@QrJ@%G!_+0ifP0_C!yZd1WmhqJD%K~NwgisEJ zt9ZEA;q#kfp{6g3Ek7sY+SnZBsW4Xp#*RozQ(PU|S5OLejw@a2o11@stL_+Ax`K`_ zPZs6Oj~IbNaRN}+&nRur*T8FF(0!M#Khy9ekGepxtDip5;r0l+5dQcDP3AdFa?x21X4gZ7ec8>aF^6_*u5t{)e>BQ$u&WPBQq3_H3uI1_s|Zl@WJBxZ20 zg8qEWbvbJ}f!}qEkVhI>vHay-6&rl4tD=sYQn!*T-*UopIsbb3V~ms zrZJxV_Vnm6o4i#+Q^xQLYRk?^GAl>Q#tY>oMn6wPa=`My za-GBSPA4FbyNjv#ud`yvPnPJZ&K4g|<}j-NMD#YC=lNDML@M8;4Y% zo;+(oa}n&AB%SM+A3HANj$_$Q=&TUl+#Dpr;$UDE$yc&w$+2HwORGOKuf46M_+t7k+8#Acxb~EKlRESAz%buqf6!>*&aFz9 zMn23Bfa19E~eDR78IMZCNkHCNW7&Db`hEJuwe=9}m> z%cqR3I)C=0dYkP#Iyl)gBs_IVYoa~TdYdqmf*Hzf_5%KBY;hp8`P+RV2Af-GolXli zKEWgk15K$Vnr~ZlCxv~`d+2z+t~o4iScg-a^LfOamk(yxi;G^Z1Vi^#N!N1cwbJ%7Jf5&hM$nk2*QDyW^Vm;8 z!NnED#=fgL} zl#{EA94sXsK~s&j>@e6_{@!;|3pKReq@;Q_s1!1<)@e6PUxcIDCpf|`u@HC z5lz&PvT|-~U#&N+o^#=(SQ2>e4O!GovrIY6i>ouxsOcS_pNVb7aDt^pIN0(}$o*Ki zkVsN1xZkP&<8(k<&x(a5O$7aH5MsbPrk5sam}LZNlOyO&_WM*))J!y7&o&OX+Y-1# zw_RMWmX~i!l{*Ub6tWMY4QWTsg|0=2S@)r=A%3biI6|C#mKlp98e0v(fw_jMo&zGk^$U@Da`7(pK>YKz9wDq0U zR*~&F{Lr+;$=W%a>91w3oTt_2377Mu`NqbuGPTdspPS<5-okgLpDdkEc=-6SKj;;_ zVg3kQ^ICvDl?;Y)*Gb^|=ApWF zEc=2-kIe{~X3o#n&z(V8vB8|Q>g`i0NP$h-?8UT4$wZs|(JEpsn&o@%^qjYMCXrxS z84mMMYd|ll17?Uif3lan+@vS7awn=6S zEE$+pESQ-I1kapHOPPcRX6NbG52EJRR5SYV&k2|)dTKgD5AhEUgZx+1YSbk{1-5SB z2yCDM7-0^c7BfMKkI=7Q{|A{Lh;eE6ui^jpHl>`rQ&kcO)HUlQx5dB=3i@fVtCN+v z%$uDW-m{*6eR_IPPM2VA?!bA-@4bdoB>(HT)xy9TJ_4g8!EyKPTQH26s!T<|eHS-u z>1jmsvJM9^5rmmvVe+)NxMM_T9IewRmK7|9e$%st$rM@5pPrqzk_m%noR)TR2rL`6 zEF&3tTichrI+a=jZX<;JPIJ2s%fHsAMf7EFv+u9Gk&(Z14&zSC9k!_u8LA5d*#PGH z0fN5W{4n%3F7BIURi}cU=xC0^m3-So;e$5z-m1U4#*~!BB(N@w!4}Z|mrl}=B%-eb zcdkD5FXG6(ESg;KcTcZU8K-~Qp|a@|#25N=^X!KM+PqQWBH?e*2yjSV_>g>+cBjcJ zE=Kq9{t>kL2=oAm#}RlCu_G~=Al~^7yz0QH=Y%0`hGtFtx1WAZ_^UUWytJ}IQM#9W zE|uF>ao(pa{!nWQQrX+6uZf8iVEUM|@yEpLczE3Tc(pi)P%}Ihau6}0FbA39=FU!m z1L?&oRfopxd9wRHnT+X!dAiM(vr`V&C0Z!jjl#Df@@8u-@x1M!qhkue)qGV3@Vbl} zcU(($%F%)l$gJKUu9QVZ{H$TmUp(|WUU*oTQ*kNXMciQVVFU&cRHbOxFk)EVT!!{@XLUF#KZ;R9_8$lYJE2-+Ar3wPZ%3uCvKODZs3itT zXCUW2EDn?5NRX=GX)4#i|LoVt;*ZxVqX2V5e4fBwKKOIsiPz5`lpzH8-31P2>SDNQ zj*1gm-(U*(BZ${*z&sU{9FTeP7hf;I^T_87>Er*M#iO#=?nXiJ|D|~T>Lh!-0 zB5b)}Jk=~7KE5Fi5n%b6F|qU;HmASzz0QTJCvbK!4WGq3-~vNHcR`YjcNpJbYJkes z`})qu_?*0jGOKi!7%r&^r}n2a?593JM2-h)ZQr|9U{C*X5CeF&mSYg=1g5GFwI zNACxdi?u&vIkmVbK}|@=@>!j(Q=f960~?2gxd24n^&VaaSE@_P^EaAtKj-J?Jcdy+ zQ5L9Kfu;h#8>^RM@^?|1MJUS3)`0Qa z>uOIy;2;bEt`z|49SMkm@CX7X4deV5Cw&3LAwkF`bpROPk5Nv=9~L7c;-lkXz79*)z#>ewephk@?kz~m}s1fa@lSMV^(4AD4ir+nk3xvI~I>%QNAvBWF!dk1y{sL zh}NvDmnT!rREAUFPMhJskrC@O&Dh$y4@%B&Tub@-1d{W5cgsG<#l?YD{!L)!4B=D- zf*=Z*G@xgYZ$hI~;2?Uj6_>U`5UgyH#9c=V)U)@A6xT`i{VUa9XDT};@{6rL^|1_^ zVtN9!xN-Lng!`X?8QtX6W?gBf0J);W;Jm7_NQ+kS{4V2StV&AX~6 z4TN!H#i52;S{yt3O?BP4N%8R*RT27yYOJpr^zremc{n3ZU%yW7%WSE;OEVVMp!v;t zs~h-OmzCTmu;rbCqc7iq0T;Klfy1X5%Q3>)2L85{)Xl_APOiH>gl3@!eu#^kRt0`& zwQHK?JY^OnzAY^}Y~Eu|8We7B*7o(ZJYQds@pY9+lK>^Dx2(tweh3@?B$+oMQJfw0 zkz=0679ME#ZPDfa_f3K_<#e9r;x;Qzfn7-f|>Awv{bfzDypzlGCggDTFV{hU%D$Wj1C+-6X>W%`oly;XQ<`9i?Lu~RV+3Ys4{^4^wCcWmH!@iMvd~} z!+?;GMq`eDuuzZ`q5mFM^x7C3xP$nEQ=J_Q(vt{9w&+iRr)M$kmcm> zui*#F4>&zh5SAhCj=(JzI6Q*)c~fzMQ3Mv-AqZ~45swyrj@Sz#PQv(Oc!Ww2eiUmE<+8(ua#t@fVkG#1tHHb^7NM?L7A_-(g}HuPg=>=d*{i)ygNT&%n-`A(i(pRPW}v_TQ)VDX=39Ar z*25OE%;LV6<}a?>c^&$mzYDCOv{gW%_}>2a`^~F{@TO*-i?LHvK5Nh{eFK-yRY*uc zuAIy0$B)56vnXV%(G>lEmi8S60!+UmtJIVX`YI--qL7D9VY1B3OX>`ygZWMUa-uU# zKQ8C|_t@e$0qxaqYUnO_aZ6n+tXx(>Sa@oG1)?ijFMjd+|NTW6-M?pR`)hIX&GKVg zLKrK*i9&%BFN!bFe}qbL0{_4JiuU`rZ)jpQ9Xh`q@JcaxNrH8_!eN?v`7xz!l&tsv z+(*e*Gx}WXtRin&Rn-2e^Rs%HQ2w;#7&j`+doq}NF#L=DwBq@Afy1)@$;oy`2vNTE zgMDy=zLmKA4;>xGyg!6eQC_Co08Rq=8nF)ur(u6AKw2V*8N+R=sX_XId+dJFyL?&6 zvC!e}FCFm##GHToSw%&&gD@&=B~P~#&+DNzgpQxkDqk(DVsFUoDmwb~)YLN&Dn3(QEhE6*1Sz@kk^}aF`$>;7`T|k9rLS|d0e$O#CE!x2z5 zAonDg^jLfW$0qnno^tJoc^*{rBrfn424Qfki9S{@&y2cc8OiU9;--FQf3d z`UJWnG^FW;e&GWvCgJC>M49p!&O`Gi?6{9FbZMk11(`#krOTUHki%#*bbar;xmn}Q zv9V1rbgshh#O6_V9YJDbe6HKyyfquVyWHY@I6K7}giSFA|Ka`m`I$5h&WmF67VUDU zCSxO&xXlc=b)*nFu|45=kdROTzMT7<=FWX)p{>o|23AmL2Nm1cXi4ft`u(T-J$C&J zF@3+h0nb_AUrTY(xo;*G%H$x-#2Xj$x89(2FygCtNe*-3s2z^rpFeNMjc)A62*%FV z`E3^$nxUfN+HxL>{bOhNc)l`N`*Fc|ik&@edAbh9TJ`i>BO97HD>knu;*hs}P7-^4 zmqe1x%Bre#UFh=2h_mgcuH&OeU2H6$*2$gULVsPe&PYr^F4P7d&}fhIRGn@5=&Dea zB+#Na7MnKA-oj^4re8N7s*fsn4Equ<4P{4;<9bJ(bd1LKc&LAKdooc)1n9!sJ@!Za zAm{|7njkaC>D>nL3s|2fK(OX#m{=i6DX0Wb6HvNeL`g$7?4~2E2hhJYkDu*v!}!ii z5Gf#$j}qeINH8Op6vM@7DbJg)r)zCztuq`hvjwo1ly-H363r_OR?FjXnajUjXT(+Ks=w<5}l#xW7Ky>JJYz7By($!UzfF&th0*y5r zEses!mUzD0H(pM9!a}c$%#9*%|L0J!uP5LufiB^T|tv3Ih71PEFQbyGL6 zfQ1$&rO3_21@X^?nVnWat*1{ffx}J8*?;@bpgg=Ut#wp5IB6oUzlhW9j>GHkxc6(? zZ=ngRsJt5)-E^>__3UV`_0Cx@5BtNt6? z)1C2rn>y2tZ6zzGGlR|IIa}WU)OuN2 zYjG$7orL=*JWZl@o0Eh$s!f>7Vk#CeF8JkLclUen@OK&2G;Bhji&}CP8vptRhdVo< z-4GOZ2##GHU}t4AkWB_6v2xuNkX@@*x%0M0F&ja-#U*a0j`ZFjhtUN|yNW=Ry^WkV z1a8U?U%7H6D3QJudbD;>8QIwRz|Jo2tI9wC_AM=)odbd6P7i!)-$I}c2wU$lWv?(% z;`jW3*}704K>?nqaD_BI4jiod?y;(a&F{U69~~X-Z``CEo10&H33x4b%1^i@PF%|ngvx3{f4f0rAt7f%C}gO zLqqo0*RDD9@kR`BvkNEIubA`oraL^Zl03&Dmyvupp#NjsX*^=67_d`i{0dK~d!Iw$ zbOerXP>xB(as|Vr&|Tt`emzVR26elW=?_ue1Ov&X_2M-q_vk<-6n(7T& zVHnnr<-T5H*>KbD|7%^YYFvrR!^Ct+GLj)TA2|q|kCS9@bY#z-w6zQg;Vw9D=TUB1 zF55ZI%(NJA%R>43qA`#N#od1p?hnH^>Nr_nUKjE_m=jmkI*yXmzsX zqI}Ts1Gp!)d?)c20X}{%cv1_U?kI$i@?L&oYs*$kCDbSN>J>E`Ti(btA208uJt{RF zwq9E^a9@Ifmi9RcuX=jH__^%t-p##6h>+sPKV9P^$cPZgk1o+`;<NJ`PUaA%!@8-}&V zV`FPuQPDb1PDK%6IlB$}xzd*}Tjv$e+XKz<$C{F|=*MNNYoG%JOd%jDO2xO4B>06C zbr0h!hvUVbR2*n0=nE|%j}B=~K-Mb{8EfF6?H?FO$Fu-pl1PRc0+gtW62R4Mg^aP> z!(l6;i3Rbdxpt+Q3~J)TWA++T13Pzt45JRHnYw_`R&TmfO5ba3SJz;yKf5{IyR}n~ zGG^%OEKG*|56fcklQ09MKZ|^rm|SRXm6JnwfPyz7XbEQH32XU=n@{aI_Fstprsj&o zZwiSx@;Fu7U&A__L^pMF*#uexxFkTv^Up_k$CgHqKjfr^L=j%sS?o?4>G^hv2^+ga z#kOeGh~KfRW+1BZ(xnr6zL=d8_r^j~hdvLjm62#MucH9vr%!jXR6?o5LfOu{9w>(r zJ6ut*OOYVs+vseMHJO+fd+6mQh)b#azzX%=7^;E@-OUZI z?e+{O#xH#Qsl^r&LANb9sPzaLbroA9+tO#;%Dna#>x8+j3;}ALtg2%0Jh3^^)XXXC zJPjt^?5^={^A9on_cx+X3a#w%I-EJYUv7!gS=n)&+XAr>MJ~%Z?g#MCG+w+hL>M{G( zp$M<@<8i2?6%W3`K@E1JFu4;jZ*Up{-NVZl znF<1DxQ>1s(ex1*%R=qsc(Ly0wa^#mm-Wws{mgwd3DKvD!VFq%P@JH695b_$nmK2p zr7G;Eu7*~g@ddXogfaYx@l%Y9&$==~3lkH*eWtUpl|JC-FCVd~K0BfZ4?bdO-#{p< z^ybg-0Q8!HLFF6AZJ*$N4gc~*)YDT4>dI_I8>CaRj2B^LeLsv!D^YJR<>8U-)Sa9d zt1Jqkq@4YlYk{FUr(-9jXz1sR|u=1+1)=obQL5)fdLijFQ2X4f_# zc2Qnd7Oe*6KzJOM@BkT^0KUE!@SK_}I4t0TPm&5-0B%~`&iku>ayEBW)5zaxYNDJ_ zKcp%9T2{}L23Czax7Oy`H6Al0Cxqf4t1_I5pu9@%ZY0y}v8~XI3!wKx6l^m;<1@-i zN6#$+n&ZXb%wfBS#i088EzB6?f!!ud`pBP*q>SZ8m1zoqbDuka-CQlS$UgiK!`9BG zs?KOVJ18g#`iNwi_&_J#pnKBl#UZ|aIQd3@-qXEOQR{r2?~jEsRp))>(v9N{k%aZZ zuz7yR0uv@QnxwFkI8ybd+qpL(C=}!HRB&vytZSx1jJ!0ZDRC@=5Q-_LZC)9gRCU+2 za!qd(*4`e^qEKM7w5?IKYmP41*dwnLAQTX6Jh!*!05Jp92_S}F>`l81W^Qj_3Zf_k z;Ye&X>Ezo=DjvVa9mtn)U^&livi@BzSpE}5g!OHfFF6L>EbFHh#9cjwF4}LsyPP8< zzb5Alm+v{H^p0p)J2uwU)%{OeE1f*0i%4aqZfgz(AE?xTJg5;W)qJMoyM` zKxbP$oQjr(X4}P2Yx;;HNxA*2`$oN=tHOpU~pFB^;ge62= zU?$c!QVR86=_HPwC{qh9!_4m%QQ(fOhW98aZRh2@i{HV(0usdiA}I{;ODzZUXU{H! z3nWbMy>aqudxAhBY5veG%`6;lb7aW*ELOT+n$R&4JI<+^YU$599C&*P_75q|${6I} z;!F~YDwTPgL2pAugjPX{-|*4%^w<2fPiPS4W^^>tkd3?TH@1u=Sn27O?E6vhY^~(? z?rmMx>HXs?+SIfSoqYk^9H6-X&+3%CGlzEKvGwspG;VI-Pyd!Q1VOi^ff^`upkEgg z+iv*upa277Dt5HIbR8ZGx~5wvCxK0s@Vv*T$33PCvVcA~Qa{>QI6rGDAQyB7bI79l zCUzSX8_?QFJ79J5=7~uIMwQ#dB|g6opChB18hcXd-K$rzt_zX#d@2(Xij$Htn#wb% zC@{r8Cl@Gjmdb9ahejUx3*dPZz6vMOW+-otqf=a+sCL`m8X78eckL8}m!<0@f5%HT z?p zn_w}XkTl=PzFu=lIhgddKt^#wXeWNtDI~k>+`zmtF`KPPBw&PnXlNH5)C^JtL(?cG zfw4>?V6vB+hDvyZM#>^OU*ahwu6KDui^Sw9V9-Z*)SK0sA?S*Bdvd<1_6y$FaGo#l z#Bm*M_3hnZ4{&jvd3fcThGUg$YX_>jqdHV{a|>Clte|F!y(t+LNw*QhKp;dR@D-2` zG=bqN!JdH}X3sO=P@Sv2&ZkBkJluJ{e*OczYI+U5Eq)j={ z@FycKJ3jWiZv`bJ21&4XekshSH(B7`Q$5+A2=bk^4ZLH_=wop?EfoFXl=RVnaJo!DHso`lWjyk z()5*)pdv1w{>#&3B#&F~VrTkBi?l>3*kd zG5ing8}Xf<&-?`7;T_2SL%WTWVKQofbT~zl@Z*bzFsP9AP9Ir_MG=~+&6T%EwqA`_ zsR$5iG=3ayE!AA1aclXa?Pbu{65h5j5NfThtwBoa>^vp_x(qaHTD|L*uU~q`AIT?* zwB91nXX5q*5p+~wx&0RKu|50)x{z+;dZ?S3}H;oi}>Bx-fL9tIJy$GZpRrrJxv4<29Aa~?I%rD)sY;+Z-5p;`vr$s zgqriJs|z2mTu+@(`{rf?BN@}IF~uF*J`WP~tG{`L&H_(xJv|4tD+pik^B?tRh>g4M zI#-I}RE)d$apvZxs0n^CFnV?w9&8^St7c7CPG`*fN<>-F6DKEAS7&QB!FXIoHAPcx zT-tWXsQF}e@(P;W+-q5A%1^<37!r@)aK+~E_Up4D3C(&`M$Q+g^UXgMl_4);Mticw#B%FNogXUvi>Q?RojRCU z?LB~77Irr_%Wg`*CZ)_>`Ie`q=rm6l78^R^U5vI3=hntM!+I69fGdO>Lu#pOGW}S3 ztvBG;pz4@L^~J8^)=4fjS`|+l&wu4NjAsdr6$Qhu#{F%c82)+>K+Rh@-9?x0j|>oo zH~gU)E`kC)eqC4h;G}q*&cniLXQc(I^3Ba63sOO^1do=MwvozMoF7T_9vAFj>8bH` zs|!^W%%0`Jm^zr6+xF!GX;rV!24|bx^F=6AMbkR~WJi=_(!j(+zdR@rJ_xv=f=bTM z^ZjuJ9WDjfs=%d_uv381EOE;n#30iIj6b%|Pbto_v!z!5`DVU*C$D$L?#$v95U2|W zMqFoWQc)D4*W%D_SWe1$?!kBLcZZgr*YM8xka+y(%az`=Gf`Q6W0Evb={y%3H_pR-fs^VJFnM7pPn z(Nvry0;bH~LP1m+Cu|iJ#RiyAF8Rj#Tmgld%NcQl8FG}Dvfs;8cKDFvPsDDB5TSBF zZ^9_LxNJZ~yd+riC&Q=>B)4t$t6OdUrO#2c`L_f_%Kt~j5mw%)?sdj~%B)dhXm+{u z*did*$fsJExq3S!D+yMXB0VC?NCP#RbR16@%zRlxez{tac?&2fc&sPTfPk9#Z zP7Jmih<0NiBa@gB*@!N_Y%75-z5{WA&!nWV6n;v5hnrh9t6$y=>R=Zb=Yyj7J50nD zg}^92rM$^?{_+f_x72-p4Wp;!;~?PeNE&aMEpGm2nG!S&C?W` z8ZXw2<;U<0`fF)vMIjH0z1{PPXjD|7c83o+%uLpM|2q7l*mF(fGtW5aOK(7l_?eT5 zSYEkVS_=O)SiXlmk?pOcjtJzv;+c(r6yU&P@28?Rudi?Y5UM-*IVR{sE*`E6Yi!vX z23TPimH}pyIvkKMv0!4Q=V{2=wbTH|E>)u2HFG_wiwZdjpzOE>ML1Velim%CAK)7Y z^cnJG1K%!NQ9i2JGnab*7;j!&HXi2!$ z{aGf%KX1Xf8`a~-&HWc2Qt~@2jd^8&hR~PL(@4KAsG0h9LEF5Qsv5|8LM9Cm3!hL#~Msv|My+2q0UCIOJWP zPT8i?92lU@7H$2|GB8cZ6GOdnTs}ZhHwRQvI`D8 zod|i~fOdfz9cecI_g6vnxC*3JlnZp?5N2NqR~Wv;IUy#GTP++&fBa_mhqfcU30r?6NQe3H1)~e{?jn*9umFxt zuo3gC)%iBFS~hfD%R?>lC|1vqNRNw)9%dAGhw}1XIOgLcl89gyZsnWylAQS{pm_n^Mz_zczF0Wjpl~M zL71-!O}me4(H9X@gg9+vL7R&pQZI03$a)ALTC-+{ITyQA2dOS0v*D*u9GHT!u>%gA zp%mMPghNNmQ;4S6Vmh~39IVtbc24GPZ3i8XIOwZR?qu}61neHZ2QQFP-eJX@>n0NkxCyZRDekfgur!h45`y+Q(8PUD=B4tMENe8`YwI-;Rg__ z(Fs-~S6Pt^-x*mPmRI0*^62g^u(1dDA{4r3>4}w{0v_Av{~Cn%co;d}-jSZQ{i8w73+cGF!&7OD)9bix-eZ^U(}R{bWJspx>` z5!g)W7OGv!R$ZwFQVO&|`4D&wJMkY896|k{U+^5ZegUAwV&#wR;&XsSZGF-|7r{uM;TpTfiID9#VWz@Fx9 zb+uQtUK2zd_L&-hXhJCt5p=96!WeXk?W|vutBH50b;*RBZggJb^fg?{Ewb4i8817J;M?%^c?D=pMpd-b@DiA=y3p zApWMZ5*{q8il>cA7+-t(vmS13cV@6C&H8#AJfN@~byWy`!$Ir&c5bjT~CxTBX=c2HdPXNRgsaHEY zt5=Uh$w8h6-++81^|h~lQA{ami4<1$ONx`zTAe}z^i)*W-hxEfHZJZjX*iU5E&63k z4$2WOfFWBfD`STcE180D3O71BT1B6OI2e&bPEOirvS)d?yE{WH%)w+61^5SGLO@dK z_lqS=2?vHRYvs2yAF%@4=IHajZf#5Ox_q7{B1$PzUtOuGy+lJnarxOZ$XRVj zi+kqi0)9o}15BE#m9Csn3P9%Z=z;-q&xmuT0;>RiEl}=0hh3;Ni-@Vzdh#-C{JmXt zgRq{I(trK(Pn_$R9h_?5$WvQfTbCK#u#O9E9Ih%}rBhMCPEF}fiW|Vu!=|97W)A&Y zA>jE+2K|1K2zp*npz~(^O)f*jDMKq6FA9n?eDaWLACc1I`q}v&dg>3e?J=9hU}-%& zvtbrQ&}(Zu)k*W}Hz$2i+z(3P^3qMm(XyT0P1+7Qo!kvI4N|*~_-Tzd55B*8RRMMc z(>^}AhWbz31(=waq=Z~P`;?Z7mX)*TzY!rWE4%!gi#b&A@NlQ(;CpF<>1>ul>H!;T z7+!clV|MmQzLwziqod2WqY`CCErt(rZS>CKKh+dvG6;qG>qzO`7fww^p08

    xQHK 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

    &}&1hu5V`3z6P zZVm+`GuXKddzP?E%ap549oj1%G32DdV;=1cUQQZZ32A+t%@GoyQN6qB zz+}!1YeIrP+-$1}uk!foTJ(}!)+ei#y!jxPF-hTiQc;N$@T9vH7NMg``BNq|^b~y2 zRKd71z9VK&5a8=gGp4)>#_Ad`nm^gaW9IvR@{1w=;yCsAyt*!d8!nW^$y&^f%lrFs zu_b*)iS=x|Qk36)+j3FKE9fL8i;Tv5MfI1^K~RZbB{yPgwx!T)TG)?fsYFYbl2!G% ztRh1tz)w$)du+uvB!n3xpg;|R1jZLS*2gO#MW6%#0ZNSCF=WFzCx-!R8rd4DDtCIP zr6n%aNG9_|?g5C|AUnRD9D`A#ppefHR}E8q3xH8H=&@5pw)^<`6`GyU($N7|WRsMp z>LvJUFZY`!y&%)t(sBVNx|t=J@-0K9U3*km32p7qVIeQK+Ee40YC6y#r-kBCY)E|g ze!+wTs+H%q_SQ^`igI#w9nsGBXjLXYfpd$zLh%c=xaaovqz@h}=*Z-{yOT*sph`BN=qg&QS9&3dO5M;CA3k`oD`!ceTGVJz!=GEEmJzy7j6U7WkP*mQrA0nQ$WuDr*L z8=8K+*i5rjg^fCdagDh}rYU&A(=2drB4nxHh zd2+3#UScfp{1B!MyGb}FE&rKoP|c$G`fJruaUC5GkIj=F31uCGsaXMOYpa1y_l-GM z^mG8c^-Kq67Kg^yvgO-|xw@{)%1ZS1`L(u%vgr5PHCX$LxYnV#96iU|sC*SD_h7n< z4^_E@0o&uUfuU;I*?#xYY9T*6NqiZK@`vxOc9Y5ss~6{{te~2P19A7mQrb)8&0bo; zR{%IsgPiwjF5<>ZjR`4uxF8|tOG=t|bo;(}c{!xWw*e3R^UoK38!3>9pyMRWoS$U$ z_NKhwTgK+)-4!Ue4VS!aUp2R}U*#ZuV!zwN#&W%>>8v7}^wxr(Bu(mB&dtrFBvtdmZrzSUmNEMt zorHU2V!OJVlo05eO1o+@A~1YY#*Rlxiln^^9+K4-ZE}Q?n>>C*&qM zxeQPixe%thA-OWs2S$i|`0|(nqJ*fC(Q1^{2?_R95F!Rc_s6L{yJc1K^dMR3BNfMu zhY~L%0dpB>XlTC|7Lc;cdFmBKXll_I#qnpt|beX2V0TT-@PU zQ${M*-q?*Aruq3;p{Bt>pQNPfpz&el){C=AZE|}(J`Ih)PoGMGC_t{F%2&EpB9DEQ z8VLZdJPL9ghm^S!wt$3FpTj5By&5cjB4{@)R zvjoSDe+z`>U506mqh|1+6%COttY|3w9 zh)Rf9S~5p!kbv4Z-}UQzzXk_EyecL%RPB4AG*y{Aebe~(bzoD0@$cs5W-S>14yL>X zEobp;fx792^{TF(Hz@8;F5lnU-K7$ACS%jN5>$R49i>c7(y@|aYs-1e_FYPog?*JV zmm>k@gPT5qK*ojr=J_U~K}0T;&E>*@7$qb`27EGa^I8AGC#0cym>sdaJo++A%4NTL zvtA4d`nFK$?wm}@UQVh~Z;9bh0zj#?>0&t>3w%eZ6?00j6_31sjTs^xtJC%~p1Ce; zyyE%mvTfZ2d-|sIS(o)PJ1Egi%HC5;OG7NX0j4LhohHNae39EfMMi-sLdY8Z=`#Tb zn@*IX`O?TAw;`+jSN$i@gL&;;4T5NR z-9i`qZ$7lp($FYht3gsbdC%=5mPTgw*9csMz_lVKR{AImu-b7da&h-j#MiIB{n?rl z^qqG(`aKS9g-%c7LfX9)i-1}5IWkg}pZ;NChgN!QES*7d3@~|+ZFbrx>$R@-`~p?p z{=4f|*g(#Z@Cxab1MG;9jNdjUC50ZmC45rle&4|+BTGt7zHyCoDQietE;MbE1UKo+ z_wT68y(3>6MjgtUc8raAeSN#eI3VjuA|Wrajiy5xI}-5YVeV zS&wZSw~^I3SkLzkKy$e`zxA3=38GW7d^si(?1wW99MdZru2V`M>yp-3+>7Wk@>=_O z7lNN+!WJ{S3QxUvkxM;mLl84XOAm5`eI zY);3PK+;-`X)s&(wa;*V6_@ac+u1q&^jA?4`wa>~q;QFdq9W0Q2fAwS;o%@BV{<;W z1)N&TBtI+b+x_o*NH!FZSI*>~se{y$6c-{N20mv-%fwAhCiBq7%gdcAFl!p-_CX>N zX#Rud)?L53YJ8f8?GAk{vgGNZFO6|sAdD|}a3w1*55SE+ogNz)dMiR02DiV5t&IvC z-@cw?v8>h6XN)0FU(nNh^5VNmz77I?Dg!w@btA<$O)898S%=H$I-cIUshIQQH^6}6 zS)a`p;=?-Y)u8}}PM}rLQ8DDGkp5DIJv&;?jtzc#@7F*{$md-O@XnG4+Xx=$a5-O` zFb$RMT$!8egv%K&^susxYPQ5e#6-Ez@v$`$C1~<>(gVSj8o`876F!SDsSLIPiv@Ei z)b&jVfkW4EdW3%si|u_EJwYgAi+1^?!2zAx!9myY3eyeiF>>-7sJy1`>fWnHuD7Mo z_KH+i%&FdCL`!+PyTkPsUSr^T(C8z6dY0k8%l@~nigQP1(cBV?%Z+OU8uvA26P3e3=k4E8Z!qY?NpNu5 znKW+v4|jjzRrS{W0i!4iA|MJP4N58~-Dwa?h|=BNof6WGfJlcTpd#JfT_VkLzG&2EjtYy>z^x(Q3O8ynr=ci9I27+IK_nj(4c0Qw9i z;R3q#?dO2VD5X?|o=qBOMk*d0>TYfV8yg#hSg5@(6&~M5I+DDJqK!kuCnU6YcO$V* ziHW4Zv;_&(-mcLa7?#6e8c-mwfd0zD!U9?PoeIQJ-AB}cL9*#Ds+8~P#V#uV#sNc` zog<+=4J5RNo&C@FxLHp$2jTwf^otZYOy(=r#+|P&q9Cz&;Z!!9+U-`9XRRy1H4aYW zLX$l;Zgk}bLsDI__uxg%fEO$pDcOR;o~dGPjaO6C71TFEHdAi0V7|jd#MKi@mmG^7 zD?F6?kc-o-3=OK|!_8+4kbp*dq9}qryX3uc^~$$*?@l-5s7pL~`Wv8~2q#qTG7B*H0Xv*1H+(LE>G^d_-ban=Wu!o)Y?tg_8>b;VY-elE$L~_u- zX0Dg*UF3*Z_m(N8h4fpsXz|c2iR*(LQ~P;z-qD9&X(-R{k&>bI8PUI|cZ0@dL_q-> zE}lym4maY(n0#zV&ghd1=r3Uu@kr7JhXnLmDi z_+#R}QD$xNTg~}N?MXLnM`yw)AhR0%ue8F}-aXa>tqjsVrMXtu0?Vm4P_?8zxSpGt ziJDvOfWaE~IhK$DrZw}e6w)mAzk>Yy9RBuqLfZCo@rUvO2tw|XF1ZhufA3qfj%lOTRH|rIT*i=}E zL)S;FNvk!a)YQgbON;$?*6_3~AJfv_J?~hSGAi`rxHmktRY1-r#}U8#!lCR=;_7PD z{Nm~{s9Pf$R6yzS@%NW~_f9Lyd*2L5QlDbCUBdgWU%DeD(?!C)SpHJ^?sZ!zLvzt{o)a9y2hY*45X46)Vk+ z8J;e?nO*JvjWT6E*{1_!7qn3B}M;vEDbrA03q^<&kN> zybv=oUO}ltAR@}RHD~AC0)zLc1SeyDJhmhyb-5}`{rTpVYQh(hVE%wG2WaU@=<7f7 z^%Y4JBztMI+oXY+6e>@Ri(zejo0Ux(wU0_5=>;9{80)Wx59^{~8pO)lVQevU7^msl z&9P%P9@`1y;TfST<$-5Q#|OhW+mo&<5G4K#4SiI|qN5Qp&zJg8mD21=_pr_vk8brE zfC`@xVu89i`qR^8J3m3&2pU`r2E`to?s(br!_t)Z@`GMrEq;^02Ry*cCK)Lkf*Eo{ zW+Ej7zm=4PN-%}ahH^2o2nmt;wk5kc95MN}0XBxkv-ZOLfenwHU96yOOU2q?cXw!B zo^Tk2P)Pkd7*x83mrt0Rqdgy6TIy5!3Qf$?sbr|a4M8qdVSK`aOvLp6AVf^KX*+5= zH*d8N!_(%yIvuVBA!Irpo;Vl+Mep_S^=8z7JV9AyW&fW)%w}FaTH4`%6qL)mgH(&R zun>LEUwrfvBNvo<y!XR4|Mu?qHM$gvJaq%=LtRsdM zz_+=rtE(u$iQ8sA;N%0C#@4^wmx6{8Gqcqn--r!FDQGFsGnO|6?)8vx{Wv41hhmNH z?LbtV@(WQ>p18PZ=mg2i$)S5n(mtYX@rQwaWYmSniK5hV&)}2uB*BTMj%dE)i!Cw? zEPlKT7{Jg_r9Fr?;eYZZN;EX;$jtp%n@?Li`v$ryfucgTcx!Jj^{Kv|+{36hvHU!r zcx)SvPnHY>uhhgPf)nl6!elh3-oEsr=oJzQhiQWC)!Eh+V4iaqFV9NftBlok#XSNs zIGyX))j&#I71W*hf>|6lRK!(O2%(qj0Hxx>e7op?34uk$lL$ECLSJg1nyJ8FOi? zzU}2}IdVOGmS`vtsi4k4*U@!zIv7L+*Y@m*Q)egc={en?S|js~haC1a(3%`~oI3ff zWWBft=H*n#RhqBUEFzikz$Ys!$m7BkN9fWCgyZ=>CaZTJOuP7q$fYsFq;l$ zvVreX5eS@i?F}?arm@y`PjvMI1v;Gu`ARFBNN~6sB2lIlEBTP{m z0`X)*L^*;VT);TbHT?d+`Z+Z!|F`okQNO+;Y{~5`t&7tG=pA^>c5_Y50{~?yJw`*P z-s>hH*dZI_`rA*!`WwUi|B#*UjoALt71LBxG?U2+%J0zH@D!EA0~fNYiXR3OZEbB2 zp`itr7#SaLqA2;X*y!UVCHi_GRUSv?P-kZ_V3wN}FHVn-nH@LPKyJ*`qJPB>+9s+2 zHJ~ju19MQ%_6-sW3d?&tpuRew`>~)#QwVn#Gr3{dQ6q)&$V!Kq5ZvJ=#^mYcO9TAh zI@q_Ip5SDV0PFEqt_>X4s&o zjPa9-va-i--X6{_rAYkvacedsp(HBu+hTeQBYDp&()(}*#zE}i+l+k;$DHPei15nF z+v$Hpw`%yp6xP}*>=o}3E_bwqmIG}VT~GfaWwdx~Y^)xWX&rz%G_TWffqEuO{=tfm z!rh4mN02)yG0}vWgaf%5P(UE&TEEPNd{)jw=0DNDf8X9Lo5NI7mp@-%V(YSHp#P=Y zpTS>qzAL)AI#zZ#77j*w6Z{uNPnJ$c4LtykU*NRYEg~5^-L4z%*4~rU8q3~ZJbbQf z3OtPG&d#w5Dsl3LJ&t2$r znX1s$e!R>YD)#g9)l;Vn!ak$7(7v%!3hO2Y4HDhfFo3**vge(?F_my&UDk53@biN= z(wEUfU1JN2jEah&)m7qOS-~SkD`G=A9Qyqo3#;VNtZZ1WTPh7|Cgr4Krqd&Vu;TRb*_amJDP3*;$vuX+Dd@ zERmFCc2i)~kdwn?kRFXc6V6m3p-X-6(0)~#e*P*H`fxWf8$8;X9KID4fZ&gGWIXW; z3kz)YJL85Ah$uc-@oKusx1DWeg19_wL~&YU9rXTK4G$)5d!5hcC}@Xsf`f6z#CV89 zdlEOsVD%(D8Nh$ASnrK9glykoejL_fE-)F?Dbzjsq8bUt4cyW~=JeD1|2N2s<$Ok1 zJ^9@1Hx4oci^xDrY?S-(|z+VAZzgyj5*?xKSAzh==O5{B`B2dIcCi^6l)~ zQA66wVahsMlKp9CP5=N0-rne)ghG>tCr++>5ufKc^& zY8xIU#q=3H8A>D@)5)GlUb>B`8_VxZ3Z)}(o5aB6@?&!_0UiN?n5rr;GVr0f1F3%x zGE=-b7{1nT+BiH+;Njr`dIBcJ#PA=sAD=<4U}~CG?LTFSg@!sf*eE+#m75RT&Nvob zG$4BdBcpG8ybFdBqvf`l%KOpn)Ufs+@~gEUV~B&1t7L3y)5OHz>eC~AoKI03fBTtV zg=yqw{#w1ixfvQll1cYe(l09NzORnftZz)rinS<}RjZa&dfF=qpcMk*)u`Bh*^Y-W z^qs0Hu6wjN&28W7=`tT*etk|~%&#~(`K+nA81L>oeS5QVwJhiH*TpXUd;b52{;IzTS;U}v|RUPz~A z=?iTVenvwR2NaD*Fkp{8JtcM6?0WR9yR9YEs++^q>2&43j4XCn{6gcPVy+nF$CEwO zve}^LhZ|XotrQ;T`c?Gt3HFOA^`Gk}#>QUS7f0x}j>Yni-Yl>3ex|x>Y}_|9{jjmO z_nM=l0G)J+ay3kHyV<#x`bS2L>=S%3$&|~O2X)T-e1NF7Zwz)0006tDsCW}1NKnv& z-96h+uiq-0S$4WsG92y`NwO0Q#KjG+kB@@v5I?vW0!wT@pj+%=-c0}ueE%D9BpT}ha449{&NlC$~Qu*lW1 zRZHV9r6hgwm4biQkOu|N45@z2UwbvNzn3BPXY!6=+}@LCzDHC3MeG3qDABjWNI$xr^{lTUETzsW z_I}5XT%1XTpKbX^(alUaYOl!jvyfnYib9q65_>qRI^b-cZHx%JvxW${(cPV~=5%rJ zWw=Zzkyn4LwcJzEz$MAv{cVn>WyO&0d~Ygw-%9FFjG&;@Z`bJ=#9Ty??RM@Mpf&0$ z%;OVP{UarMvDAY~KxdSC?M^sw)({20rl!yK_zMfhe*PYqnWI`$P(x#08Y2!>;YNj2AFn(k}io&`rkK70mnfEh(Q$8`qTHI~Cl67)@NG!Cz)6 z9b@xL%3-)T2){zXU_NVW;N=?W_ zqvIrLFgk5F@CcP6ozx0IUN=>{F_^7pRgW{JhKtYPd8GrhH6^LQZHbsK)QSjjG2q6d zYpC367|Evzoc(Lle)A^Hj?KX!&6YC>ClJCgua3pu$P^8X75~Yl*x$lQ;H;l*zKbva z_e=E6{*3zRdYU&A=O1E)YN=U1tYy=*XRzt(eWv~>F~>%SPR!1IBcrCadzz6M zQ{@k;*iDvFS2F8nK|$g*+mCa~K9|GzG(henZWUbZjT;R_nx352b1OS`{ z+OzrQoe8|MqyZN4% z99Vro4_haH5WHY{l{n0dWn(M5Jd*F(_L_i{j0{v3f3XBd%2U%V-A_(#K0Z}AuYE^H zmuW*_oh6GdBeOeF(jC3L{K=$xXz%0=xEzx^J6rqs^31KN9-i**2Jtu-pfKg~W2FTw zC7XiUV6#oEraMpj#ZfDYP(Nh36^=N02W}?|nnvSgj|5!N0C(70xn=Ry^~izU#I8cP zF%ILMX9N|tAI_AgzZhPH-IMIbQ?^DwUl#3`H&9T~AJ}$t)P9Otl71aPmE!hAEKA{} zE7AE>q7?de%R?KF8~yoamX(CXgU~}sT&-5+u8D;wQ`5E(H0Hg_)gbQtqFla|?8k00 z4?w|3h?4YsL@RHXdfeydsi7Qt;c~cc!dEi-;rhrcn027MmXy?5`AbdAZWI_3gSWYP zhnqJ8l0tGwton<7(vff_&(?jsK}v>=$iG7ow$v68wZHCM;nTY_=YdOdMhC>v^Qru~ z<3ofly9Mc+;0MX;lVs8s7UaIZJq|}Zxuj&a?VYxC)bkDJ9tSTk$ESL?xZk`99LQb^ z%UUb%t$V`Q)6kgq);ER8B(32kLyCuc$k$hVAljI~y0NquC3g`bKR>SC<6+6TWE#cb zKdY3(F23DCv$Vc03EFqcVE0QU8iFDoX#hSSdVs82ILudi%3<&|drzO0=MVQPhQp;G z2D5g`{Ie5(tA1MPd-vrW;$`0b!FFvs^?> z4BozNB4eNBA_#Y!oUS#mPt{^%;d^;cY;QBqOuy5Zy=stD?d+7GWiZ8Q9^yxEq8DP4 zlXn{pvX*sS(j1T#zJA^IP*5)an$oiqk)L8OosJuXFm)qfK z_~C}DY^gw1eUCgN+{q=#Qx*^Ntrkk~S!^qIA_aoq!6hjpXUHWeG22jN0B zK^&&DZ{D4fZD^ELV8F929qo|>wYHhQN1i1V7P(kPMMV5m8 znrlWTA0T6|5u$y#a=UH7X19VXI#q*xd~syvhlSD1Jg!u5elNc*zO+Db%g|P4%21xJSj|Mf$C)`5BO{$T;&h+IX`@&QfHS#W$<-;-TIedp zHtE)Ld4(;e);muUle||(@>PA$VD z{bQqt*(x>4Z@+PV|LbE4EAu+)S#&~^Z{&@FT+1cfO-CNqI7uI0-+K=pv;d^o3?ZG! ztsS$k4zjA2RXb>Y+S9N<07elQ7FI&zu3BmVwdC1NGF1x;MzDOgl#x|r(ek9|P7s@2 zaeh)$W#p^9Ps6nJxVd?ho4ago7B{Hf&f?9${yx9MrlfXj7`6M^vp6!oNaccg92*<) zAV)OxN`SZB%2q}1tFUJ_AM^QBWc<9mz0({KX1%LNii&nan==8#I01P|Iy>ti^X`*0 z944k_k)^D`51MiB%i;3zIZ)3{Yf;kDein42{Gr&};5cQzaBNM-%7zIYeIY`QUqrzV zLbaB9^uYS?BQ{Cc^x|Su@i3?E;rd4>r_WF6x!undzo#$s<*47XtjhO2Kc^H8w`c~w zjd^7&@bEq3*gR&Brev+GnETTu1QvV9gd6>6M7-x_{~G<#V$^hZM$N6QiIYkQyNka7 z)|juB|1Ruf_1LfBI_>vGpP#P1zkYq3kf-3u(Kw#%i_P$M;W(l-U*G6q8?e%5c$?e> z?guY?{9SePx&Nkj);@WhcjZIlnX&AmbF)jfA~KeslE1IqJA3W4Uj zWvThyZ?w7_6OX7Z|f#zmJKDACJi*co(ujx@JjJQprBpzAs742TDR`e^Gp-rY&p z1n0TX`|%vMsm`{J=NCzNN|J_2Pt1ymzh@H6t*kuP(CDKfJ@C~fM7w#j`FqA?$y`%9Ax4!^0=O1a2BZ$0c0!Sh~ZJw(Dapn&00+S?@y4L%lGkV&o$y#SVx1cb--PKE{@mQfS2$_n21wKZJH$>mVGhF_ei z8~^>@K1FP49~3G@$y;&9ar_?mqQyanSg@-4S&=10P$An>l_GD$BH*}`6@j> zq6&SNh+!@GP;W0UD) z+6^@1H%FTjE0figuwvW=D;+ip7`F2C+HoO*;JyLUg~I~bSh1;C60beIRH~kVfz9@` zfgd(z)qMLzaJw02-;W52P~sEojpA-|1RLw_XgS;Hm;H;4QoWkfRh+;5dvQF4On%y* zE0yAMa~TfSmZCsdR!(lfxqEhF!u6gx!Ve}>-j_Y;7tbaqAE4ba3uxD)d{`F>uanb) z|K-`?*Vyj6cz7MCIEguf6wd9KjLaN3X;U zehOaLS*jE{1*4+B?JF`yDKyB|?TS?>8U6bH{Uy-w2KU#?KV?X%Dy*F1;r@-|G$(SL z7)*vZx^udg;Jgrh4F%3lPp-)k$r#3i$Bdj#^AY&mJW1|J-d^L@_V)As6nEa`CKJH0 z*~zsMB3Uas#W`SM9upCr03*moO}%#`t?T=nuTPb%LJ}+|yBl%*VK~tA5w#qgH*O2K z$R$4g9ja1vOQ-XJ;T?(|D%QWn75;mr$EOv4b2X_I)dxN2T5VxMMJH4{8(ogoINeHt zGc!LBqG}PRl!Z6m)6)akOJKFDW#zttg&@pGPU9pZeA%Fr4~~gaFg7cla_4(j@MFBj z?QC6~A1O)z)G44mdYQFP{=I^M*w}^c2S`L?C0mWh_IH2WR3>6#!knlW%v3GyFLc9B zGhxF(MV$x;?gW2dS!hwql}*KSSnsdwk^lS|K0POUa9SJlvf4$%VORwoMD2NGz@SQ` zu-Vwal*N^R>sv@A1D=&*{>fG)gfKE$O=pfV$!YFoZOf;ARRY=%diwaEVq@Prm4S;z z%6uT*P@ZxBy|;;N`AJNV9!)UTBPtG7G$rAyZPsDs#B*Zj(ac|+O(m7MVWrK3v5aQ= zTJ6Em(EQ?qzxi{O+}yFTtm$};lcVIGiW)?9J{X$)X{|3`z7mMzbG)lsN?v?mZ^ynj zW~vB1TT@_Jae(kb3WsUS-j)Z>Tn}FiE}1||9y1eoqtKIo*lwi{ZPjDdEhhHyRaUC4 zc^1xZ6MGHSAu`31hJW1mh4+Uz=C2$2(a*CqrxNn=m<7+)AC^v<(6Seu+b}C+eH>Ne z>o^1-951hNbDDP@5bd)R$Y=!wKAYx}y$XIHuPP~rd}rTFWV{rGzuyLJ0;8edMBVWm zy8Fw0&)?ua0%Q(nrz0fVRp1!Y70-c*!og$pvj+t1%zR?tmHLDAY`6)(9vO(oG^kw zbuS`b5<}x&#GW2&+$|g&I)45{CZYiM}+ zTfv(^L#g%r1o2wDF8(M^<=P*dG3Mblzp{_|~{NjFE5o}N47 zZjK=nl=6j!mRd6nN_WV_o8dJ7`if+4Hu%CEGya*%{my}(Lfb2u!+?2b#l`D~*eVFw z$@6M9aiZF@O%@t#d5=8RE5krW3*#Y4 z9#~Oaa=qgBuB&6ee%(EHb0(Rfk(n8bZQ95C)x(Ggf$|wY!gwxA4P(uJkGm5(7L=3( zO3)7gcLKfXx{nSBVA5OL{U*Ygj8_{={XB{VX2!~e?u(5$j?m!0`|aEL$x5aZU|Cr@ zzf3g5XinAv-5vbUqjq)+Mh11=wyMeCaE5e`wm`e_UQ75@ki|s9@>K22RhZ>$@i1Cn z>PII3JLxuC)l)m$jh)VG*^f$e=jZS5?sk$KPkTqicGDt1+_EMPCahmk&W~!_`FDg# zEvxzh95(nzY6OD$Hb+|9BHjv%E*6@NUK=aLSs2Ne5&rqY#~SeHmZ`j9sr@zDdC%`po_4$B zP~t8R-;Ds}zYe3W(7uJ|j_(AzgsU!W>NR;u0iO;|JxDq?7do$f4(r6b)DNyVb6>j*O*Akhm#VI`D@Jlmw9rJkTLT!zMXpvC?|= zFnD%$tduYgs0kJp_3NW}(uk7FB{fQD7T`0|$A45OIWKnKfP@lY1zwvIxnC`(Y6kgv zkt_KgkEZx`P{8ZZ=ue*j1NP|R%tNcRIyE)cVT1ndm+O$f>K#?RC6ktsDKPI<{LS6; zTX_wPXz}#)=4IvdXqa*X5))q{C=Dzu-j>W;w6pNPmU?yr($iRP^u4l+!)gF!Yaj$g zM9>~!!pTF#{^Q=Tnykb7>U!_A<%vo&>=A`*FXdvBaphdh>6Og0?frhY4)e8PrpSp( zx>0k!LPm38AL%&WVnIPh{Sy1-cQF(mq^6}C$2(?|A8diPJ|y0%)DH*9SWzG?=TOJt zM&Ll!lDJl?YBXLo4^J~UU*+udJ2r!vE3zj~M%O3Z5<^MYFm5gPVsnM$Y(4^`!hnFb zDM$?iUSt2QJfc)7zTHq?-{rcsQ8zmJF^=tw*~N~5R{Am-Djg}%AjqwC=Kw;=&AP4H zOyEj%o}4T>jZY*IF{eJVUBse>rIa__xd;eQ1fb<1Y=EF%p{dZ^ zTugvy_H!0Kc*w$%gid}O0b(ctqh{a4!mSp2vd7G36B8*>YR)X!?bpVxK8)*FPfynm z+&)V#444L5I(6p*i|83VTzd;$W;J7gWyl-~}cdGeH=7MYVYeng#YYQAXy z`f5e#sRAjPgt%8?cMv`isUT^?`AH>Xw-%GvtWH}yOIw#+z0OaGLW4#k_GJ?_HIpgR zCxES{q|AI$&p;{D2*>vwa`!Tl1TN|MerZSRUV*86y>^Na($UWzmxX+`i)MQ3BQ(_1 zb%bN&muKEii*b=e zDIY&tG&QGR+aA%)a)Pw=23m#f(S!tOAzCWcUUH%o6x=4{FT2+Z5<i>MD zD0JM?gKkzy=uxyH=k|J`+wqc+>vl5?9+#50mIoOUX{BKP^3-6u4hMX7$N{B)O-zi9 z&G51-^#uileU9kKU_b2YJSEcCuU|uhDu8t(Fpvo4K0yj1}Pybl_ksx-DMROGNl&klvGsKb_1=?|L^<~ z91RW_KsH8@5&ar;6gGhgv3Bd06@bLV4VndagqeU%u88cb;4|ET9tIgQ<5Ru5IydCj z*0u$^X=>o4&8@E^W7?xfRhAQOwCy#{VcjF6Z(PLUZ%pfRd(lTxI3 zR^ma)5`DI%=?6JlwW}KxSjx46*B}?aI2F-ht^b>TM##^7TTv02{xAqw zKn`&KfeH-5rLf4xd?1&I<=Pq+KZ~aCz6mAI4GqW7rR%}KjY4#g)ZP@Tnb!Dl#>YK;`IR@NX&|!y3zkEf?pb3cEQ26*c zO!x3@H8rNKPl4Ms{6wsN{})nh4K|dZB)+_~C^E5kQMIyazy1aphejg0RtNoeww-Fa ztU=C1WUl2hI&p2ktDo1N->fwoa^>H@uLD5^d&;deMYomp34K9if+~m(yZFv=Kwr(r zX~bk=b0h+)q|EL8MEzkp2*g5HT@RVJe>b8|!?V6ixC~VGHEz4d_!JZb-_q8$dp!`3}4yC%QFUHl%N^Zw?9A3j4#RDx?z7+Ll9A>#@6 zdmGKJnC7l`jm)p#v>SBC-#FaFo;_WQ9>@RpfZ~51USUcK&$G&EY>cp#M)!mjsbC|w zAa4-{l(e~B*5Y_2@&dzgtv5jffI_+E98{skQ$$10t?cbVTU#(KHMQ*T&KGhjXrCT# zygJ$P5R2wHs`t(e2%S(^A(Z-G`>AK4q&K!Nn260~)LgaD;6vO66z8;+OR&Lx&$hO7 zO3l|tI7@`WDW-r^ix?{oC+z#2#3vRJkq<5N{beoD@DipztMau8zUz>xj}^Nr)e45X z90Xz9ad=2Y74x0i5F{^##+ut;*~0F_#lz&bZonpp5e3N)rFdXnPQ1eVwrl!ukX^0cwL zOhadwv=?gvj?oW69o>{c-#UGDlr1rgYz+ybK3wPN$=4kP6wLJp5)z4tDso5LJqgHW z)nJs%!Am%yZh}ox6TpOb!~O+c%E9@Liwj{9ta(G_xPD&8y_`$TK>i4L{A{(p^Sa82oMz^e#@p^Rt9itIog3 z{fuA^$w%f2e5EHuPv8Xoq|QNQYjfX)W#66}V= z{^RlS#N(ArjDg&(?jP?{`at&>fD~NFu(h@(?q0J~>sxMu15-L;E(>70VV)f(6%Ed1 z(`OB)rlLIk(y6Ne+>bn4Lsl4nz1&-TWekO#J_hp}{2RX>B!3&z`T32Evu>hvOMyTB%)t-IYtanwj11>3L>q*1!x>oT#4Fr?VTSkz`|#IazhvZp z)iV_Tg__umZBf`H>V>F(i{|N8nWdGvo5i3SpE1E85(;s2=E6Sqo+K{;Cij@+QkOvBLQKr7HW2b?01 zLw})Ee9mGQC3in2CU<#!TUuJe9_Od%8;MTcrJnnT>u+dj7H;tHIFoXJ5_59G1d8S_ zSEr@+8{8;8H_$lKl?yqGjQXxyT5j1K4V?wZiLy{ezYlq>f1gT*s2TaIjWMC$3j+gM z(Bg>gUR)&)8@Nv2_pmr})GQ}rO2^sRdBwxVM&a$-ukZygmU=jt+_Pk@@_eVYEKd)D zAr(m3szLY{+CFxiIC!3Y`Fw7E9;gZEAb=^qnRayVXNZn4eHvjz$79j&tU<_M=V!Bw zbOK&Gf1bv_SMC$fz5*f>5*W8_=ve=jR`|Scx$hc8**z^jQbZwPY*X#CmR2~ zzI*q6?!Xt8qda|p3Fuzx2f?eq#81R^0f3g2U_sotyYQl^<+9=QV5h8{W_r`2p?;?0 zX`qIj9wkHPL#AFB5*qBUk0xnUy9}=W#aeo`^}nb0|NAgscYhZdf-M4_ACL}D2H92{ zTiYj$j8GoPW5WIi?OwQ-RQM3Zb2Ec~q5NKi?N_+1|NXpvX0Ly7DgSTl|J(ko-~Rvp zH2weiTiet=i2cDWeuSO@beDBtPB|z*{gbxPp!*vrzd5Cn?_COi9^ljJESsnOUVjhHZ?Rc+OsC?mzDwqtk4h}{u zWUK6e5d7E}KAmF8?5qwb3%u|~!-f+yUAxf_v=R#w%YXan%y)p0lMsvDGExVZB~J1K z%=#QQs*$0;{1uu}s%!=Oc_j_`LE$n|%*kdBzh;UXO<0huF8`ZAE@LM@Lt4b?FLztKA@f0m@>z<`m8C z(Hp?1ncgU!S_G9;EokmmZ8u>4`~1t(wGy}cREp4o0!1|AMi6CGws4i7ow+>QT0&UX zF2Ex;g!vGufXin{ebj$Rd1rR0V4Z1tC&Fd4DG4PZ}H!=y!tK<&_ zWlY*5X^@&efByVoH4nNMVPX)_=DaqNp9U%l)QCNJKUD1O1E5{5z!4^H5(MrasLaqp zG$r)YR?1eOqNZ+g0+|T2v+wEYL=S?Sk0BUlna0`#>KhmkgJV<6?m}lMtWqLbFrCAC zweyGud{pkGfs+G%3By~xwoi{*%u6Q>O3ep;yl;W)#A|T>waPW5N4P|M^%HDf$h^!7xm}r$V>4 zt#o@5c}h5&1708WV`)U}$$svVpu za8e2H<*8(cknw%-CwB>eLh7@zVn~3TQ0pqW=WBEO*(Qvj;9v}(>mkTVNxJ|k`Cck5 zGQPp2m=%;f!0t*E=GNC>y>*pLK zsP*9Q1F6FexVmfrW^4{*24XQQE3461(Gw^oKofRv+_sm+po{SN7L86WJ(8Z_Q&?E| zEKYG!&}N~nvvV#&jC=+{MoVWW=DU#BZ=4@OU;-FqjST{yigHjI+4~KKH15qgtWt2^ z%&G9F|1>}ybzWWuZWW&?khF6UGCr6#n{p!LIUTbTa_1rIKI~hEr zs0H*5uNKn61;2>|KLE}t@|Gbgz_;v{!d|oiqPi9#nq}>UgFTLzNdUl0Sb=Q;E8nkO z@7Lx`!0VfkaLn`nhvj-_p#SF|lI!I!V>uZ-q%B{%L`;FpfywG%mLWoem;hdQKP(cY zJ`H$dz)b=630hpwa;p!CAvGu&l@AJMP=yd_G+9+XQ37>D#HUXv%WlHcU;W8vkxwNf z!Qz{ImICr^o^92pz|8Yn(7k-cXs25k7+--U3F1k&k0LrXjcq`+I2pXN5e8dcI`iU3 zu#cl6BVR%z(L6~t4g&%MwYy?j zkThN*qMyfiVI4v9*L9-=2vp&)d!EDLR4`kemUa=o4Py>ipq@Iy>+&?@W2Khiz#5$p zgq=+D=+O%nTi?f0o10U$DfkQu(_34X!#RZI1)*^NQ|@Qon`~xAMvrj>_5mCB4E5i= zh_eTrV*?mM7uW{y_W$JTifOnV$U{htW7dB8FXqCYLn7^tPuFrm45DZ-VfXM53J3hC z_9mDs#qrqELV#g6`r}E&W&otg4mg>9Iq%!#JG;1yt+K?}I6AgYO-+?R)IFN=5Q43_ z05WDvek2xJaI$r!2&J6tEuq3&BjmMv3~FQ4kQlMRSC~CkNVH zb%*D`e}(4+L{%|(I}D-dV25J?D-QOuA4uK;85+0)SE*nFY_~aHUco5Am|EEU8Wu?z z7(*e6mhdO(ppG}POR1I8iEZTP7LM-jEO7XTYat_$E=drpc8o7{LMeE9`@ zF;}An*t=%E_!K&Xemk)1iJz&Kus?ke46{^OU6AH=*a(VZPz8xT7SLo$bH6zC1DB|K zL`24*Q>H5l20CyawMB!5&ESIjB_WqZqBfy?u>bhD+T5h;7RLuSH*8>K>dv=Cw7{t1 z*Nn-$4!3Fu1kSRC-aN=dOa8ydZ7w)sgo2*>h`B68Go~nQ!WNnin&AIsDFJOazY{|R z`oEvz&&Yc8e?R}P{Y_>g*=6+!R2p-w;klb%<$~e$Fhi5(=wdnzq(a3Am`zc#=AdlLh^VS@rFkVf)w{a>OG zLd@|C;x$1X*n`6X{1pr#kjLKf@p0m?H4u3qT@zRnG_dVHw-Dmw{DO2(gJXUr7~@}s zV~gxG1-yQ?4;dn}PE!DJLSED_M6oFW3X-JcOy_tFsBl^HKagMEhX4AC{yt>YA}$B3 zz92pW=jklOdI;QYH$NpLV7^<3#QJYV7$OI*!rvc&)`&KM7N55_=!uAkEDh8ah!le< znc3O7JlsAcivUYOf?%P}(I)0J3jnk%kfM-K93c6P9%=&o5e8(`4~82M#auvp7jwTFF?HI!ISL2e28dh0@Qyv}`2{fO)kADU^WR zJUlEqO}8rdmX?;-KnaM~e$@xG8bP;--T1E$+)u>k&vKiw1kY4p-F`p9{ul}>GYFWdZ92oh%@9kuupabL zS|IBSg@m8b6H;pnxPj4AEHd5!W~@deISxCjT`#uV0HJiP5yUB#prah8D|9j+g{B2s z-`OpocY$38S{dxn?=W`*#r_be*uIZj8|vv1LKH9DFlCKf?=j^}2!(ii@q393BG?8$ zfT_{60H<0#zIP$-;84N>xjy0~F)?wyWfKzOf0c+E`1XVVJPmQN2L=$p_6UVvsAy?3 z#Fsci`g2#n*FI}}Dc7wt*ngtZkz{6Oro;`>2&D26!d6pr%0^S7kvRm&ehsjbiYwhg zrMgj%mB{lRIk^Rb3xfKg3dkRiZoXL2g$vbhIfERE1fDXQ7Sv(HU_jFX=aKnY`uFdI zkoOmESmrBX!D^_?w}f=ItBinA%?L#_SED+_Fxk1~0iR*b7f%-8?X$X-T1=QY-hl!{ zl{8uqijXr~C;NYI>X#_nzt93EcpjUzSMDguZimXddwWbPCn@fy#whNWCx)Qu*4EL1 zWXpmK_bx2EU62AnW@F$6-vclv=qb?wriM|y0_HbbB(Baim#3yRCyOLVsX6FEKm>xr z)bsM;%LfCG+i6=X&b@Tfg@Hlg_d{OZc>T^V5m8aEAQuPiZygW-MY{OG83j)D znw!o9Od4IlgRFz9P6R#8?mXzWe!(7*yqOydy;=p>_a@js!#msK$`c z3`om+hYTSFK?3rMO%+qW`&od~7vylqDLHxnL2oj>kpR$>+rKJs_egOc|aES+e zJ}9ByOf?OORf} z5W*mRM^>}1rKI$s^v3V`@l1Vx1C;uK4;}?I7wp$2kYYfugMirq-@Sgy4`X*gh5h|0 zO9u(CDA=RGQ$iXnLnVr|rz|Z!I;np6FP<98P7on`2S3N-*qpE%nc?oSg@lAqnUR@T zr5n>BmIfrhx`0m9AG567;8dN$z@z#QSTj7^gBPHZA;8Z+KC}htCezUfY*rAqN~1?R7+n(B*NX0>cSt zwl%f4uY6!kmw|a4B+kX-B@l0}d&b5RLTf`QLjZcxP_2=8_6nZ;9@m8{_)OvtM?s11 zC5K;iRTT=i!@3fF?#urk#Jhh-@0Zh7q01Kl4u+fn+4YE7ugX>_rgwA&%*ne*QU<1L zSTyY%sSSF%AQudp?h7T5LSjO_gOsK+LtKK+6AH8Kq9hb09d35Zf3A7L@_(Dmue|9D z&Uu{zmin-0(VmBs3s_lMJ$6j_8+ilbIwZD7RXwtCzL*3$grdIT;Jo@vy!DNwBqX3z zC|KnDWeu*p5F`+n>6{khw>%*qhs3+0PSHsvhEbi~jKNI+)a+zu1k-a{0Z`X*Ve=ij z#`rDT6BYI!3t0Fe2&I1K2Xm4B(K2f)5K=TOzx^+d!F&ZpEWG{>P}2aicnV6@{$B~8 z-fKqg4Z&_3-$-xohPW?D+pm1|^YM;+Jb%`2fC0>v2*vcoN=iuZtziwxKpfW(BO@eK znsH{3<^56^S`C@fLRd8|uPvGhG?>!ayn3rr(vQj^4JWVBwT_l;38rdcAYHb1bBDKSB!nJoU#_MQ9p z@czvXoU$6s7*AfiEY3PFW$hn;PmZ~7D=arii`2BUCot=Whhv`WOmw24pi#ULej&%V zRTTx<-6SXNf9p%?zjxKs*B6nQ>~h-^PQuO{zg5j>#!p~tsTpJ3+1tA`sHj=}SoilY zC7PdzrByOq=z>J&OaU;+oU(jDJ>DTP)yqJSXyd zhW{Nepzzrdx(96&=**zkVFQ|>v=^O5|5;E_5WShBz5Pw`S*3q*;-xGyPRz41yX+f5 zYWmi~BFEf8$5|Xt1)PNepyylS(+?j;2zyRhf?DnN1 zKrR5$2-%RT6ol5W4m1Y|{pw+_BPD6qAF%SlD$x9}bMuuSmNvAr2tIT{euZ=iL;+R9 zBq-|lC;EQ#iGu9jLiK++G~&9yT%Y>F z8wEr`5zr210_Gi>7Hk|WLS|3cevlo;vFdkB@hbj=6P=jDq{+5dpcVMv=1YYt*}v7w zBf&-*3$XL(8lU$5p??zJ{96~Do}*@qafZo1?P?*VMjq*qj{!CWfmF^!AQIrE2Xp#8kGgtT1F21@{N8Nhd1ghXace@Ns&2)NuAO z)m|JXOqiK?T1-^z%=lC2gQ_iNq91HF6qu3c5@S`?@|8(*BFKmoPzA7 zJ*P)L2L{?y2nulNl@>TzBB56V6N@7)5lZ6FFl~hofrX}n?2M%z2b9_17UE21p%AxiC*myj}WJ7}?Ap9J2A(Z@&ZmWaf@mR)x|7fu=$e-a-xktC19U%@} zDLul-vGUc`u_VW;NAMO?LGN`dBh6}ftLV`kgDw*a-;o%UkpF2&uaA%&&N)c)+2A#U z`7EHulRA2|FI=(x!_m`PU|@%bhLx9OR8*hgSQ{*}Pt5n+cnF`c`57va&!E`~`51?w zU=)0~G;H}1)$NepVJIppf)?dUV6xT`P-Mn6zaz^vI1&Kx)gPS#U>O8#L*@K_qt(g z>F(ib?Iv(u@VD1_iNAh;|H>;UDJlsHi;63VDqdC)7Uy?%w0U&nx-to%1Mu@CswxVa z2n0^l(ME_1e^X)p1&u)9B5qvOR>U9>+W=qyfXls{0)PSlN&u(;I1K*If z$4&wu48R2dL;w&4KnwtJ03-mA1mGe7QUFK;AOnCb0G9xe1K=_M@&G6Rpa_5x0LlQU z0H6xM6#&!#xC+2E0Ima|4!{inGyu>9KnnnE0CWJ*1wan~eE z41k*em;+z|fF%G{09XTX3jiAcZUbNofE@t#0Neq<0RTq;oB(hJzy$zT0Nem@2fzaW zPXO)$;01s;06qZt0^kRLKL7y$AOW}sz0|1`^_yRy908Ici1JD9MD*#^sr~{xKfDQmU z0q6qY8vxw^^Z?KcKpz1801N;y2*3~kZ2*h_FbcqT0LB3L0l+u_695bYFa^L*0Hy($ z0bmw@IRNGXSO8!VfF%Hy0ayWG6@WDW)&bZ6U=x5X044$00bmz^JplFrH~`=f02Bad zIG8b*r~vrqbQI#~pTGZ~?po(YI3;i_)RYwvp~o3j5D2mpM;y-U#nQ-*8D&4y7nimt zB9%K|R4&k2_7AA>_H%EC#p?%AsgY4BlGC4?7^2cxBlQY3X8kU zBhQjYk6U;zeOgYL`LMBPVmc<_l=XJ;#brr+9o8<~w=c-?cmwY#lD#E7c3SQO8=*cP z&SRFF|M!>wYZs*QxVKa9*>&?ulb6OpH>OH{`uMw&UXD>u4C!s&l77IJ$}eCadypil zD5I02dqzOrfMZYJ+c;iIdRudCy?Lb{ba?^m^>&Ar6T?A zgM4}J9oHkB$dNGQdERWcK50jLG*QLPF#Wyk`~$JAKxK<9_VV>a2Jk#|E3$uRO!BNg zo2a=m5nW1VoNX%{)Z*}8j2emx^JKeD-8U~x*8 zJc&6vf9z$88HcAhT~gh*gj9t^7v6GYqaY@9;HS#s+BX{+@}ds&fuDRMht4qr3p9%x zhNXvWo)?c@e4oW%9g3Q+82*AI6g%MNd9XCaQW$E&RWaE|R~$BQ*RgupgY8vla!C2g zwD5W|hiB?Qdo@n;84HZ}(tGJxW42?j%P;{3>rsTyv_IhADh>^OrqvMP>KaP;T=VN` z^pwR@pZCT| zZL*|7>O6vTp-&Qt`*Eoo5*`P)-Y2#YCjZebPe5XkfoUFK8el2cmvSa`Cd(CImL!l0 zjn^X^!)2P+>>vg*q#g*73i!r85XVF*Wmt0x?5@Oo-7#f;$Wc2 zu`ZHU+AcG9A#}Vx_$2M(#J81h*`{0ahI~XyhnbXNK-N& zZ)$UR%PD)Dm-g0SgGIy(ar@>8#S_%LTN_C;7w@*;Nj1Pv&0$Y&J0!oSdVWed(XEFg z_47i10g>_hb2ndM!l1XE-@U=BFNs8J@5tRcM0}lkx?X=AWmlTjF(FdzxjcZLDVHsG z9IUaO4Bo2lx0AsMNMZL8LygqoUr&(0xTrZ^7;@W=DH|pY31$E?UNLdHYroDkb#!oY#AfH{p$=v z8FR{L)`0b^&mGK>sX})L_ZdHu&j^@RJ$>rTDzof&=WFFG&lx5~tLUBC0LH7Bt0P}e zb9Lt_k&6k8SufmW3Jb4x!F(T`${en6{QfRrX`V4C;**=jm@a0J0{>!Jr>dvVEC+5^ z!ri>Ym35Np%jpwNGCt^?k}P$mtgKhBrF?cT6~?BmH>3I;E{oYn;%!5iVN%z)ugXN$q(Zn`+NwVbXid4*N=`=2Zkt@w# zwJ%+W{v@HYe1s=u)KiF$5btrIJ4oM?S`J?klSv{=giHoSKl`!kt!~8ad9dv zjg=~R?=Hb7i_JdcQ{#_1HJR06R=Ic6>ua*Fx-bb#%h~n)_-F+RZ)btClb^<78!cs;LIgULObnAM)^f7uK zHF<&}bo}|2;c@S@z-%_#v!pAWHX}7|^FK}_nRjp)>DAmV6A7(GHjn34FcQilC%dQz z<%-QpHnW;avi7w&Ci}MRvq&8c7o}S&J*>M*l2R2|EZ@%%+!?(qHErlKO`Te4CGESv zS%fn+pMy(JeT{K&xTt(~uuYwfOsvowofH(IG^W~qGG^&)tMg|~egnFuCl|SP9Q0>@ z4&~}t{@Vdx@A8kmn^}Bz(RM{h7T@CC!|WZhrPl#lu2W_U)K_W0msnH%wP%LZ4DT@6 zX}Y9MQ391dzV~lGvY(i;Q0QEKl~OO+M=o8x*Ni(M*=5tboXi@X*!{g$_|a{aFBhx6 z%kN#|=p~GyslA&&mYF7<6h|%ney|x=$k=z0Q0{P_lPx_d=u|TxG!(#_B&m@OD+w; z>25uv31)m^G(4$aCvu=lONLdY0Hl?@RdM>o2M$c@HNt5(_t}`6iVO&XCnJ zN=uvg&$qqHdBH;Day|sJxkEpkwHNupBS;a5y1*=aqFIl}=R?3_ci|srCS93-0*yV{y ziwyZ=HkF?C`bvK_b%U@_F)65U#BXi=)f|7!9zQ`S`eZu#^J)rkJ0 zPq3>@E6ZtW^=6qKSMZ+KxfFpa`rv!1#Nw~3;ckNOOR)HO&xqXH)@!{NeJ|Z?xB(b^z{Nmnp#BRciHyTixgA=cTlDGw|L_BH8-bDb5Mj9=wzAl zo1*2qc9vzmcDZ#FyJV-|oE~Z=48E%vXGUaM_##Zo#XbKnX1WZyTQOV7r+O~x^iuT> zqmghz7sjO#6#)@c_}zT&L>P+(bTBA4jzqpwORpO>ZWx zHYwtJRdU)h?$dWmjBYz=`Wls-XxzqX#X2Q0k<)aS)SkQ_kCbXtK%v{WLc;X1OaR9PuQ8zx4OI1^ z=8p2C0M&jj`X==!0UG><@}sBkoQRZW-nsv{g<32XNcXFJ2$gj%^sx;e6qsr z(kUFP$#?B_HKRQ3&wplGKD<7S_2WU%Hh;2c-z%FWrQWGM%PQ8nOK;9m=eNJdkD#gJ zSloOjoOO-nOTI`?vikP^!F5{cm-ekbRB9--&6+Y7Zz8G`IlrQg5;YI>J*ER2&GKhVx)M^bDX+df!Y-U!fD3K+%r&%nW$*&EaXNJi}ReWpH_6PWUEXsxN`os4Tc;v@Vv7VR1r_eAbU~{1qx*wfJ$bPx#Bb8>?Du=LzYakIg zO-(~f$9aZ}`|P<3BBEmA5|Z)?ib~2Vs#mnMb#(Rg4Gb-^QO3@w5+`1U1im$`i9S68k?G1zIFHX_Vo`8 z4vkMtPW_yonVp+oTi@8++TPjS+dpa-4g&YDX2Jjd!*-Fwb{)gR!^I;wY8TG2yGIQt z$2-n?9{-e_27$Q?1)I=)Ldwh0X+G#0D-13}&y{1=4z2{Kg+dRIDs-Zno+^2-@r_3O% z_O}_&y73HjX~w>u=ZjUFUU6zpx}c#bESMg~jrfOK@n-%N`z2-Lig-&RbD#1xDgw@H zH9|it7pjyPEbqx=Y5vU#J91NneU3v()dondr_J_TO zB2~_(zfMd)fV|I9WQD}Y>^q0XXzhxq_(vRxmQ_`DZjH)$8m0%@8~<^ESL*iY<1`dC zo@yvkA~bYXR@l22Z&k+|B#1OA(Ar2J%U*8yfin`t6Tj+TFE_zVIbfn-QI)7E#zHjY z&c4_;99WGQak@^3z{hc=9RI81B83c*W{FzGZ+7}L>`uEHe%;7)3V+JwWqdQJK8;w? zQ)+Y0cy#%hgY6pW^r_baKE0U*aNjan6BJ>crrKj<1@E&q- zaU?%szvB8h#!z74`u2iDLS9dL*x6?fDK#z~r_{xd&owdjDlzSL1gMn3G|^|q=kY~^ z5XjK8Rx%l1Y3I)w$JoleE}d=3wB|;|-`#n&kNSe5)X=s%>PM>P+jZ}DA5KV*ph{ZS z*M^(J_y+g)<{~rPC#4-+4fR(1Or3oEvz9Ojt{uM|zLyJQGS^oe24-j_w7<*Lt;%Xu z6Rhf}+tB-=IWdULWCuzO!xyZIls9nxUvGLn0_@$T!?|R=Tkwzx6N!<+ow1q)@yUo2O)-k@2>zI0H(5Ctz#VxeL zvQ}({aVK!pCC=zhmgy~duV5o+^1_# zdip{XQ%1MT%62PX+@pC_tTbWM_)_o7!M9pJY*n_QJ*wX)OZ$~jX}Jg-w`X{P&ipLUEfF z9)`=g%^EPS4K(>TcPDVqJRE;65_6U^HzPb3_ah!tdWqU|z8%S*vevri(IzM#3?ea| zS`73o*^sCoWdDp64dwNO@g$uDhzTLz5xa*`F~G;`}8&&h*2of@Fya z+PX5S9MaKP|8Gr6>i$i6^^Dr5#HsrFIbUNCO%xx-wp%d>l~;Lh9P0|Qmp@?;Cz1Vw z&-%KK;Mk2xsOtIo%#XO^0b?X>ogY4whbi(;rQA2j;Mn@2eyO*+pL0@R&l`hydlH6$ zQv3Y8$+gxg&wf?&9HWD=r|=YzO^)5@2@GQ2Fdly6Z$HNU`aUnS@s9liVaXxxH!I$B zb~p6nokVY2JyT)kCcMFLfL;xN(@8von#)QbhEB3y5Pt;o|FaDzb^@7Nf46UPWwdcy zyyNBu`Kj1N+K)1WKQ`eaQ2+3%CQZoh;mczXX4}YpEh?tdN4TH}k$_Nk)3DEMeP`;f z5h@IW_>RJDK&}&qpz9XlKze-+dp>Dk9Rwa@U2NWLYupxt$l&Kj(xIy#%I+BWVG!bU zz0F>&Xj9}OZVqyZZo!_j4mq*Ay|#UkU_*GUJ=$|}Zb~K~xBrD?*jk0Fpw_mBf7Uwe z#1jENbUnK259_9GbRic$k)lqQ6ROz=_Y_^Gb1r zOf!9IJ);UGGJ6fVQ#)+FIXI=dzkHxvE_$~EzYv39mBvNa4Py|hS?QB#C6pMth99=e z`u(jPr#7V7qh1nL8h4l2Lkwb%vh6o~5ZI~es}$Z~Q)etrRq3OQ57AK^J+i%MfpY340x42c&)$WpnwWOQw<(1D5u&P6XS7X~T+`xGgb(HWQ{vT4!sIOy zos~LVEQLnWUyghwICZYj^Y+&;oaOo~ja!r2-HV%JOY}(#`n;aG{;v(w6aMVQMQHSJlUx#*|F0X^WIH|8P~^T||3~gY0Q^9gMjTc^h0JCuC~e z^Ybm%)kw}vOdQv(94;PZ@GBH1E6SPs=$ete(BqM3MrbxT?-LT{#LNGqx-3@bTC5yP zH2rDM591*Oc;vgf30df*H~O}%8*C~9{K_{Uq4Q2j;I$ToTn$Z4A>>GT4jyP_SC$*r zDdza9mqcFgcDQ4H>vn#c%8klavX?k7?oQ-sC~E31L9!tpKF$I@NX<-m-!H~O|QeY6X zi zQP%9`i?)_MK-8g!y0kn{9&!)S3~&~g2f*}JLY{)Dl+r42?7b&Z^_e}ElhCGhk zqu(6cU#*76OW3r75J}M~yMU_OeC{KH+#{N0-a?P*X>WV7M2IKqU zuZ_6(Q^fP_+B^Af6|YVw+Bzq31%Bh6G7c(>N3gR;q?g*6uVxslT`wJ4#vlaqk||K6 z9bHLiW6wRN?WI%!^xja{x~h!nzk5H0F@HDT#@W1JDR3j&7N~5(c66uC`bGtQ$+j z==+=D=047HZalee@g6fT8L~pSdOc|U)Ne&rP5WPy>Gt7!Rji*OTHbQ?_RptkrHmOI z$HY$I+!)=|P{un;d_K=bDNTdST>B&f;Z9k5Ml|`HgY@@=#YCi@Q}tJWN)27NXQHx| zYi9}_Ych+5zn}71x!Fa&Ied&cM`{z-u-FRK|9Gj~Wjl$;Z*03JhkbCfF`4Unb!9ug z$Q#RE`u^T8Cf^P(9CpHNO$lE;3^{e957I^?>U57i22mCEX${$DH1_c=Q^;2*RygEv z;zM_EEAZB2JI1RQTy~Zx4;XCTdWSwz-6sB#dS}%KJ2YC$)TU0~HQ&yxZZ3@dd9@F+ zU9AVre~j6O?^a*OgoK2B7#2EiTxS%~TB)P13eKV}B^$`0Db z!)d(kzzs&VTV<|>>dU2tcwb+rta6qx>ksub>7n<-gj4DS(j*q_W4e)3L_eGktYP

    ard&gSmJovTqR5lgqOTdIziTh6f!kHSOkB?zaaie-zR+uR~1J%p1J z7j?2cj64528Kg1)SOxg6{T`PK8+5zIJNEFeK?vSS-Phv#TWnaXTPPaULiNcCw447O zAz5QS3}S@{aUhF28}|73c}{th#eDkrw4k|c?@%wNYW=aTJ-K<)NxEA+TVU2@_QMWU zzJa9j;RBc~LD(@voe3;3DqKi=$Q+oJg&rka?PwlfFmkN39D~^tTJ33tWx1yfV@Y^Q z8RQ5Ml%uT1;3pxad?nQP&(PwD8Tzsh0SZ}xj#XEjS@F|&b@}j1l<`RRX7p8;U<{(x zI?6JuZ65y*^n1hf4cQOxt!jz$eOGh=1J(w@U4 z|L8kJY~3@dM`}eSD<#%Ou*Zob+C&=hrmNBpwqYyT)#Y)2uODYctEN zyc3Qwx^UBcz;6G=^Vi9DIS(U`qlFPH&37T1cdbs66ePJgziVbFz5Rhn(neZZQLke4eOY;SqQ&ykkKhTTcf3!t;)&Ot zHaIjXCAiuWgDo<=KhT&|$KkZ@Uf$-Dzp-|$=d7gC{+pZXxSu9Zd)CJ})3`57EPSg9 zn>mz*B(UQ&azIxW#a31j_)CHka+39!cyi8WLM(84P(3f)5)!-($`EN8GfiRG=fC55 z*&EAhbQQbL*l}5PR3%gsv~ODNMxy1SFo=FsDmw17@+0wYR2@WAqj|+*R*EU2w`A^d zbEJHrQ2ysJQ45QGlEhDq;J&aozMC@PjK*&9Ek7xmd*h1IsUpvl(J)*j> zGx^n-!=N)qL%joaHla8IgFsH-)kV`|5EZhU32KF-*R03eG?z!W)sJTuD-96XpF4Gu zlu=RpeOYkJWW8v@Trna4SC<0SptWZ>jh(n2!HXHey+tF=Jcwsh(RU5eEFv&l9tqX031fB*GKndg9pm zeyS46q7HD4_%Vkjx0SnuE&)^(6mNM2?Ie_Ywtnq48}_zeDAtLu+*TPu)68GW_%yc8 zeYy(7*Tv@GCn2-S z;G4zjhnU^5t${bG%SC$uZlwP-a}isXGGqE4FnAMv%hy|of5hK!r=!cqE%pz1bU6wN zNiZl-Blm^Ahg1jH?;l=Hi3*n#Z$={z!vbEHSoS*Aidhs;t!&GbXq-7?t-sYwKrkEM0sIz?zDh~gX^t@gM~l$Fo^fl69LIZ zGY&h$DZ=;j6=W!BQYTe+?(RwJ{eam`(-=(I`X7#=!z(hdl1A*yg$2>_LuL@TkPT_; zM?CKrttQmHUU@L+o+OGv=(z+WHO)(vdG|A~a>p@S_^ylO{t+j7IxPLf)&vH{HdITG zlvX7iot6Bb)g>{6PBz8SMUQ?Enh47MkSyNlj`G>x&^`BlYthjEMWPnR3Y{ezA(M>+ zi*x7+ruQL?J~s$t$4_`WKtb}O$l^{h|C?ti&iBVeJsYFKavQHB<`&vKsQx9sAh^@R z5Y7Ea57aZ?{>A<^ztry=ZUm+S8x_7wjkHaDd8wxkt9Y&=dxtxm+|HsGUB1R#^c~lU zAmCzfGwkJ=xV6z2ZnWIrs=QYYl}3&GvAGZe)GxuQybUjq?d(6Dh`J)V5+aNzZWKL? zx2`OYq2zadSsW!CG1BK?qKY(Pd>a!!+q_t}cg8e5cWx(oUeY0d^IR*{*Rw(dG&gCE z2}d0EhIL(>cWL40`@9^U%nrj427y8rqGRQhLu99D#Zbua$hoVfw!e=lDG3aMrMYea zy#Xn?bzVl@*j{p39Sl=T9VpI_-zgLp@BK5|GC}okTd$avn0;PH`nG*#^tEgsU8!KO zVM$o|x%ZGXkf-|j-n+~?3d2gCj=gXUV!)>!gK*%1aDq&#e_o!A($cbTjzhZkS!+^{ zG&)MA=%-wo)frwn48qM^KKSgn7mK3p>to8#ZL^(lBAs&~=G=@e&2JoyVDp@09E_VH z-|=5?t>l3@Kew*gHk{Mxg>yX)oQ|{M4D4sGHJf(D?hUmrJHiR~OQnoD>f-;&*4zt| z60VoX{sZLPg-tIb7@MilH7qbT+bb3RE=^=WtxDkG=79QstJmov4b&hzlTl$Ut-h7B zOC!}U6j{zeFEA(02);YYdLTCq|liVst6)m@LKrFd&|=qm(c zXCYXfNZp8BusYQj7-^M?zS=*J#k8>Kz>7*twfwu^-kr z$wi*pLkE+i@!sqGWcemL#Rc2m4++)Wh5y8_%CdvUkkd4gPkfXixmChS)uiCBSelRv z=ngpeEYioInxlrU;gj98{>;R==dSw{gUGE&`97_M8kl^>;kolEm*M1f@#(Zf(rG8= zoj1tsnW-m#DLlnavc53-Q%_$Aoc^ht8D<$ShT7l_Vw7>Z0p%UB-vNEzrebt2X&fy! zCxGHSVp$sZG!*q}iyz-8iRrURX7{uDc=6LD9up&>d3VuF))mA*6k`A07Ww62{Yl*t zCsZ<1KMmCge)*=x8P^gT#M_XDKuA9C`Ue`rD?j!9Wha3j%Drd}W<^RJ8d@*(CD7Hs3gIY+c@+a%P{6rYqM@~E9yEs*M`sxsC*&U# zQi(uSH?IQSK0qozea!{e293)@zD(dq3g6B+Sjg8Lf9F*uE&3Iw+oF~DCF<_=$yowM z)xYS>?$C<$x@(w?(UCqx_&-u}4TiRQ`U04HxXS%2)NoNRew?yqCqziATD&|tbzi;9 ziKEAzPiEg*Ct-R>;swj6z!st}zHVAyD=V-0hrdrOoAV8L<%^{`{2tI18==_Ygz_?h zDPF4&HhyQD(W9#wMPx@U*AJ($X$*Gn8e>Izl_RaJ4(3CUnr3!tY}X=RB3t3$fjSP! z@7WC2H~%huV1Jdrzuqj_0rQVU^oYH#`fs7KfO+{VZq5;hsx7n!U%^w2K2~2rh?@1sDjn(c#7uGv3t2nw$`zu8p z|I?CkhPYd%KC9|xraajN$ojE$hBX`1LrX|8cnoL%%H#7=PavDp(jhiKVBY7mhbWE( z206b_eC-#CvqSs+ji8X@@2t4544V<=+dYMnQ$gtWijV5u@Z#OVR`vfzPWvNw{<};E z3s5u|Gf?hgIfqv;2$=8_{7y%_uoAX^`i=s+KWi_T8Et}m0y)j=GFL5Rv-BDPssUOC zcVIyYr`Tca7#VUz9i{}bS=vgqM4kmoER zKKUF9D?N2nM3bop_HZm}Xy`dDln@iFF}K1v_6WLDHyI6Q4=0Yt?zAj6n;w?I^54{5aJjIkxs=HIZNcHlN?VR{mz1BZ z(dnB0Eibvoq)x_RMSH1>>jTCOBPxkIzMWep-PHxkcXD}1Z+zGki9vJ1ZVhoS{g}Ns zwqcevfjynE5+H0kahtg+4Bb`-RkewR~cQ!Ij-tBvnroP#l!B0HMw>N&c8$A>8Q#sE8DA7X^OfCY7 zV6-y*9h)RMB16nCR`vw37#TLM{gH2Zta}w+^&F@BHqX*{&$yJAdR~WNvP*UG_W$>Q zb=$T_}HZrWz6_RVB~+9wI9t7pkj6#-z5RVPOTy*Crxy1`m;p|1=fF{kUITxl;P= zmt>5sk3(@py(4#_V5Dj^Q!bK&CGgCNP2y#j`G%bfYA~r}{7V|6Fnot1tsnZ5h)SM* z1=)nfoThELks~uoK;}A=`Y3t^b$L~)qt<&b!0}U91};gS2%nl!*}ERL(u&ep`Mh&+ z??B{%sosIiofxP6ndZpCYc-Z!lD+5W+ZJZim|8cg51++i8AmWu2Fs|E3=F5%*)k7I zNk9H{^{R4_6^F0o{cpdsG_2W(1(wRe0Z3BAkNuT!P*iqIEBo1Wg%@|TX>S5j%AurmQFl>g7EeT-1myWdW zKCCB&9zxw03}U<6u<~r(RLX7;dIGsGYPVodFBc}UX%Brnt1z|UUU!%Hn~v6aWIkbT zdYC*8idUsrDp(1`)pV&@k%CQSNb@?RDUE3noUpKD_96pn67S1Ywk>odl zd~V4x?R^P+!p+V{DSHlwKrtTTpr8(UgboTLN8h2r!tDx(R#WE(~%=_II zbeb@e?ffMBA@R*&CY{r=$CBM>rMFesDtWi15*zM96@lz!iFy1otKr`b$$UH3im|<5 z_DNIN`fnPsSW+&JVKJ8OYp+29J>swDndvqo(J|qFPtxF#S6_ZcG6fWFfaXpZ9{BUU z>gJaP#%@Y0C*;7)<~RlUqH+K{q2HZ$`P~>oTO|i?frP?MrLrT1n-Z2E=J9S_l;B-i zVu7|l{dmfGHc>+Mb6(;s%%AR^|5H@2L=x&7%smeYyR*p0Qd$#j@ zEp~HQk~CY&oeNfBz|i-s_WxYpKRXaB$v6@<3nx2z(O3la58Vrk31_J8iTHcahuD|K zo&6CfsE}6sF#3zXcEp$Ti^}`6PFlP1Xym@;AC65nmKhaE4#&f9X7-vo6J_rU=QTq$ zUI!RZir;Rs-ecKjq2oGo1_a?eSU7Zo5*QRi>r>Z>lhAc5vYW3BVYngj8#?z@ws%C` z#f==j>3VgY-PhXSIw`x!1kNG-;X5~6!X_Q&>Qy>>_6z~TP<9>Q+7K+ZZ5`Q%t`8}tFn0Fs(^au_k^c8 z6^G4!d)-j2>s9l=-oBtw^ETL_U)NV^b4aOelBbzQg6UbVN3$*R{aR+?V|2mf(lE}v zREh0>4CL6@YxzdmOH+Hw>J;IA zAfe1es&Qc;XY8V;vQ+r`NIm|m7}t!B$mtL0Q`V|Rxc6%;bB-D3b5tjFXLMZg5Lg{v z6OmGFkIME|bzHKD_LaP_mV0*VxGLUVys!(u`!{qL#EQk+60@yD>eV}3FV}}V?qCof zEN)6SEj96C5YUd&rG$3W(9e*(aI5eNXh&HxLOaThbP`?DHvXEnP;b44diE2RdV{U5 zV6$y37(e2`q+oSNluzd@{|@X5?(0tKmNzzexGoZScjul z*V})99@~Yvb@{`84#a;L+1L&&e@fvN5vpz#l2dpm(?6}5zz!w3*y1=g75^QVp#uxU z$A46~{UIF~VZ-qs#{3`R0hc1`XJ3hHO})t8`f$IMM#G4&l%p*1CJRh?e}_@{vGJ?t zWk1LH+V0ry(_){%KiF3;3@wE+o2L4^08=V^BzatlT;-gvJ4^RVf7J2)o6<3h+%dDk zxdc~Jv(b;X_Do`JQh^tYqww`tg;bcIAl%UZq8O|o9U}SP7JTXbJCe`+ZVdccMk55v zXh>%NDx>+On%@5xK~B3K$~9sQe)ivF_pb=~$sSZ2wceVz?X>Lod2@{CO3guLD3ZYg zPxlX#>+T~?2uXGu^6bjIo?5WzN+{|^ zQ#xOcs;6tDw4)-&r@Hh5K_F+4fWHzb!w`)%Vfqw)mr&Jq^)gT-lZW2O{?B_&P|zsed%3z4bRZnDF9 z&IqMwO~qSJ%HL_lWFda+Gmr&5&{~LJjVo65^=FNK&NE=q6DQG1DydpNmGVF#s(=93 zhUxVP#Nek||Bk^nI!C(qFOKo6-v8f5Db?{stqw~UlCtKqcQI%5vj`a)8g7bqfBZN@ z5EM2gJ5IG$h@$k3Jft*2K0GrtYfGqP)GT0xew18B^}%p9KvwN>@4Geao%0+Y9Y#3w z%Xbe;Ig7Tv-8M=JPLAB^xcKfJ8o#dRv_zR1wY{eC!*R>gwZ_UEfk92<{oT8=Is;b1MNw2n%~MQwb|n@CUH6bkhxjr?MLCY@9_Cm$K$P><3klg zE%mo+ZOwzFKIjuW<6rMY5Fj+CoyPezA4=OTZkLs>pgg)WBe1ac+P(11GU3Fv$eAmlD#ysY z!_)=2?-V$zx7gb^_?&!28sfAZ`M4~Hu8+clu143_uc^-K+2?oSBQGaKgnHdPMbh8D zh!-u3Rr^_8u7Q+EzA9DQeDEmMQ%@(0L9*OvR{N#-Iz8c%_iys>KdVmb2I`fi7Ualu=O^xf2bEwl^jYT1tN4nwa z%zbp^J%T97!0SrqgWd(n^+bj_b)!!$-4-k^KO;w#GJSmJ2P{FD#3gvy!6h+Cntur6 zhGWl&uVR3Z`ugor?DPpc@5zSL znCq8}-(POk|K{#QJMUS`+gsaZK7BnYt(1rTRp#{*r0lcejkx_BkF#=7mz^dt2x8=R zcMP&9bCAVRR^GD40Ztw8Iuq(CTJ_e$VyhHla|bW4qIa14*2-v^4; z>nsHJXA{NIvr~7+;2`tWhE>2F#u!AMsM%qp-gdZW#ykcA(@(rIbjD{`lz-q5(rpvX zwNSmpG%z?OWv@po6O=p)K?VzhkLR zWx3(sE-h_pI z{m$ZZ85Sq{2cYz(-6283Dw?*dGR=8yOASXC92+tI2}EZGe-4riYrn8r9I>G?kP?_6 z5hXeOrSbFgl3}G!Cti~c-e=%BF&;&uib3cXg`a994tRNRsWg41xA5ad^z9|?0wkJz zNedk!?S?)aM6OFSuSVLXZb~eq?o30CK6*a8$UOk|LYjKBsO|!Awad z-~MF*>E+Hc>OQIKxf5--gq}a=5&CTNjC7E%eflfBW9_7%U`F^Nwc2 zhOBfGr&9wCghTeBEYwM#8Pr}eva>FQ#RCbp6hJbrQ6*OG#oBUO1I#lKIF@-_Nq3F z*KM(|^vc_QJK!Z=K|nANq_xfbbx?Nu`B7OwM0>FVmV%^XhTSP!_u-u!fqe2Nl4fBd zwq@L#*(rmjJc69DV)W!C2>QFEPBpGR7O$$%RW#prx#pm3#GZql@BeY;W}O}!-RXRA zLdb0o%ax^}x48+5+_m@@QAWxyIX&QHhw#?$5jQ!3=Z(~j3cT1pEpP-)3J%G12qr9ribS~b! zl#>{FOGoDn?)rr8LhOf`0*`+IA=x2=n-GWWR(9*4;XZ}^efI2VTT;{qq#OTUud0Niy>6T#_`%J}`OPeOw50fs3(XpII zXSv|YeuuWgEBnu!!-r3dd(O3M4qlT*anIFgVO3maG}Q5jbu({yZVZpKAgdYNI3m99 z>R8@yZe-}^%eEbg#~|tt@>Oee@*PsI_y*xN-qIr>cgTF~?9whI7!YT6yOzZ%q(Y3Y zB22`(R#HoP^ley2>nU%AD(jo=BU8?!7k9GGJa=k6Y%kK6nE}-FIo9XuyeZRXTTeBBGrMlWrs}ww_CV zeZK730D05R&;xZ@(UG<1j`8S6+4FSz6EuF6OHuv<x;NpT6xt`3m z)6eYC{C&@KX_uqJb$t^Q2Wh_Wtvx9b|42~r>c-m1UpD7Odxs>E z%u|GU?W>nBWXalmq`!C7lI6?D`X%cxk8)-car!^Yu=>(JBXV)Dap3uU7B7Ljym9J| z+daWXu8YljUw3AeiyvPhl7T{^k$>ObsOLpHo=0YQW_IPPCiYC6y=`mZWVJfcq75<5 zPo@|PgmBzHa>`922%5*osD|DKw|K8mW--S zKAvEd+?(#LG2kzB?4r_V`b2ZAT#lp?UmX$dJ~Q;VdQmNlvar35d0p}xcY1cy@8xQ3 zm7S#rZH9bTrg36a0+cd%G|NH0+-AH#xcS=c#NQ-oXNOyND2uhcLw3IYRry$)REe+Bw-FP>ib36>+ z|2e<7>#lY0T6b78^Rj2p?0ENn-%mWx^NCidl$DkdFEw3y=pPdMebkSp^`+!n$>@`i z)s+?AePvi!4T>2l>2VKBeyLa~CuYo{4e{8O?(P--SNEqqPkRwp9Qvipa14A^pZ)~l zm_y|3)joWxsI0544S3B2wY zt=;q8T-tm7e!H0~YeXa*RAZ{nI+DlNkskeRm?p#}$LsFcd`$$(;`oN%cDIAnt-#osn0xkSE+GW%jz6pWVXrIXzSI z68ml<1FxT=Z~?N+gnW_IBT43y&g@_Bi|6m-*5 zz4O~(m2frmuA7)6YvN7JG4z58h&kGQ=3KAw5)+y&KEiSVtSi7{_IQ}0>H`?Xr44^-_~xF7i| z@e(sEy?kf_Pl5)NKjm7tqOxLD9Jcy!VKi@8J3Q;me4OisQbrDqzeo};u*bEP=_x)q zzI9^h_q1L--YU~HCPk7!R1)t6l_)LDG1;tk#9xfFxboYPWee435LvXl=_Lr{9FV^X z^tQrD6W-XNt*U(I)v!!NL z3F#8lAM-zwNF!`nF1uO1dqCOqBCEIK>b|#;a(lD${N?8?2X}P;l_3@;O^?$Z@?oY# zxld23*h`zAx*e$3A(Gwe=zdM+vAkpj3U9_MF(-TzWSu58#51Y{UbbZ0 z4Lpw-Q4?O+JwtOXyKXK4P@*`6j(_l^Rb?TZJRs(HJ8XQ!Ikj`y_v0ss=rHa&>W0gk z^W|SsU@(&^$8iOZoV-{hStt|PuJQnHOP#_++xnUswUMNT%GO>F!UD=UrBGt=x7VEA zfxgQ2T(B<8d=>P$H|jpp1|qD^Gq27K1T1uaPEWbL%sR7uP1erO5Vs;7B#iquQcdC( z8fg@L-iOl_fZYR^X_YV)z*YR$BX$6e_$E8_>xf%gb-Db@WqQMX%u3)@rylaZaB0qG zKSYufxxIxEbHHu*O-Q^0%+84&GCp*S!9SbZb-qHq3;xWfy-kv++G9;!(<7Ug8TD4= zs3*xcJrBWXGVh@p^Dzw=68C>;p^|92Z>Se2&(KT|@u|PBgUUp$MVC9M4E@LjYg)V2 z=QDA%z~3=L`uY5Y+|#g)g>5ca^}Y?w2bG+n#FExMk{UD0coFY^_&E=Psd9}KMo({} zsFldd*004!lSkFAmVq;deK@tdl?q)ytDATg1M_v!d5&jmIb*=9uD<@H-Q#=3VLsVb zA4PXd?}1PcjP34J=#(f`zx`Qu}B)Y$4-j&6@TbB*LAC=| zM5s>XB05@K=s2`^y;VwaYYrA}G#M5P$m=nxTJf$?P~KR#E!uMU|?t`tVM! zF_SGnN_2Orv(1 z8c9cav`PudLs~ASQ>)`6>r70G!&`dgf$_0iO)h*Uf->wotxM6%H6GJ-``x+tr_5JAySavZn+NV-U&y2z>n=-0 zV$2Fb@j&cs9Yq+;;>4oesYx0fWd5yTVBm=CvZ3n4=lBaGoEE|qxP!L26NvO59=%Qz zuDV75VqC8vN0d8rCBzH>IaiXIte(HQ1V98;!pC1Azjh~E!2{Suq_cos1W=LAh5#y( zz?*?l_X9r&1R+@q>*fcgp+cO=xsb%m_YfJ58_MBr?Ia78;y?gB)JuJdaNe^Y7@h0A z`h3tDFD_QfvQv=zfw7`@-3O6F+OXHa90oDl7n=XeYZm zeF4y*f2WxMOYLt)0f2VjgWqMg+>VR?*jTwgK5m%L=&%)8bICsPN^^uY@O60x&dN`a z+&*w+0;vYIhN{?|e#!fvQ@X|5X>?3#{eb4vjJrPxD6{xlOzax!sBj7_KsQ)!hu_Ch3rhkIk0)#}#{KYb ztpZdROcJ_1=!sOGHt{`P59ZhF5;s~chB-R=Ui$|jg^^YjfFdA{zp7jWL`l}IdoFWBHOzp%3oE!C z2>?_r$dGvc0F~UKB+}ocSTzAQ3L*fI)lx9ID8@Gbl#Nl3JI*9%Xh3Duxcfc>e|`Tv zI=W4GpUwhM3K6~zHh=R&IKJLzHWx6XQlq%;5)$src{ST7-p2Soq31FHKu9kiGXD!X ztKI^iYvQSXnw=N`=EqpE6nRqR=`&M{|76|?u7gg3UHqN-R zwy9cOm(FcZb*_1S87>l@=g1M7KVCX2SGvO6!2eu4tLQ`9J=n$Cvq0o3abD-8$!PlK z#31a-KXD+Tk8q(!31$TEs34G@E;$vN8c!mFn?-+C(9(MJWDN*s5b@LoqAoXvheb6GQh}Cu`ES8@KIp> zq0>yiEt{$C=j-9m>&J;_-f}x<>VCzZXZ)Y543Z2Xet+F7@$5QFc#*duvg}CVitv)< z4hZA6iF*hE!hl3Z9DDoZ`1I`F&@e0^Jx>Tf8X^e;iOIYnN&$J|Kba19Ov9VO@iry6 zB5(Z0Q&_>ghVe2wdji3915mAy4CZfd^$#Y$lG#J&>MBHv&4?8jnu1}GfK@;>wjZ%3hsZ8o0+tNYraArf+c|>qOZzJn zLBb6pW~k#E%@f#}!zgaV$$UF{TIdwt!ZqA74Oa)5@@m=WCNpe%7Lm#Bml%;93hE9J ztc*dq><{|os|Sgf!V42!=DPbZdjnS$0I-rSzpzL~{_JoUcPhNm#W~h4rD>(gmzwq) zr>|F8)4Gn;y_L{e@6d zeO9<{evVa)Hg1EV*F^UsCg=*8g4jJr5D;a7G>dX?y29qquDFZiv%9%068~a|hyOD) z5Rw$;|ARHM4!G}u`PkGBgEg#X=0G8CyWMSsnoH&H=#PZvc?wHgFdr69NeW zgBY7cPsw^IuaD%er!OO1vs01GJNewKsDrq6cDhxR-J@DT{86y~aT^t?Hqc(Vu*LnL z++^*hfjnCox2=xbKwwfx!$nyz3m^_ceI;v7D)rI3zW}gOE zk?9H^96nE4{f~R)sf+PZMF^SG8FwR<;l^$68VFDnr?$E4^UzhsDf$b%Tu76jlP_8n z3XyQo9FYKMmm*s8+3SE=&dEZey00TYDg5S$?gd)U@p#m9>!W@mWO`3xyZzP32)+)o z`JDSz)jwidF(k0hv)@qFHb!DI>hz+fVMf)Z2FwMq8y}V~vwLIETnC=o^KAy>x<5KsU2dpv-&N`6YC!Gv2CAgvPU zyjtmOAXt_}8Uq0P?sVS3g7K;DV#}zvaRs)D*W-Obe%acFc#ZT*{}o$5rpLa|IOl>s zZs&&RFO8^fWk95oEmTNw`(^nb13IflW>$q6{@uj63?GP1s&L#tA`ME8V^A{;M@>|n z#S3o;=w9tse)HmX!}P9e7~Bp`K4^j%-yv@mh)X{0l0$c_Lrl;@Ax_PvS=L($z?4JY zt9Mzs+Q%1-oG8NWS3poI^V4l~{=d(yCcyd+-dxWMUpxj3xZ8uTg506_X@BEl+?u@_ z8SBe>DJ(k*A2S=#Q5S)t8j{k20zpyeuK;o@HVbfxygMfo4G8K_B79gZb|X>7SH&$%(_ zv>l?9!C~<^xj*&HZxr<%>PxEHac zPm6&56U%$z%0Fx$3Ht+H`G6ZqQm7sb)(nbem|KYCbjY%A39-qkTsDa*bm|X(|CD%u zINRSmge;?eq&$Iw@pjO`#PS)oEr*nF=#3bN$S&20fa3TM5!k^|B~RO@Mq&VLrLrAA zFS=d$wY$UEZ@>KZ%rjQdh$%*OjXSy!z#XN*^ilZdK_7Ny^3I?zb7GyQxS(!6S#6QnWNauwss=tJ{f0XWnOiG|x zkF^76IRP5^#^9^Yp zx*ibbf&AviDj<{aUhfZ?gn-SzhG^9L$0}mqUf&zxJv>SQug`c2{0H3vQ7KJ(4=ail% zx_do`e9SV}k5T|EQ)T117!EKbLE3-mM2(yIC~7|zuDsq8$IR{2yI3IE5e=aBplcA$ z?r_YV^eTino_R?PXsP3!%Z|*l4s+o{UB%;s4)fb1Q3c~GY&@zyz8?d(Uery zTmpc|e#?PT5^UJ*okQPil=4|;f*e=wh*m zN@-)+2q3>YtFF@o3`lv2G`=Df+)UfATF}rCD1QKW`=6jYsIlL2SSS$ia8n4IBK&q} z3i2ZWFczl^L{AMGw||000P@t0@*rf`7gBu&a)N@ma!PL)7A~S&KE43<@ovZ7b^b;N zZ0Zi!S}tvdfVd(Ar30{9cy32k?s(z$@_X~BsOad}366@aj!r4mMnbRI$irGObgb-k z514$WJ${1hRmMh?t}q%ni%*x&iSL>zOU2h7WY|-V7e<$=H%_pq4epjp`{iN-d*oQ{ zD+bjcj}ZaQ1&|^Z(bOr@P@PoIAtbCXi7U0jLW6F#uIzyT0;pjsYNtWQGY7 zAAv>&ED{$gax!K&cU7-M|2g$F2sx6jL4f%~Zw&?V4Y2z>KD#QyK(}@UK*akY932P` z?vAG;4`CcYboKwim)E`-ob~>4QfU7fG&Kle3g6i#q)GEjVj&S2%9qDa=dLIJsFh&2 z*;sqs`x(%WIc<>Jb*u6FO&9o2e^0T2#zxSztzp}<+$YiaKLY-PK5kA0)5UCk-kz05 z6WDe9<9>~bDdDWC%NSXUuRQi z2R@hXqxy!L5l=DLqgDrGS-GyN3EVG{M6QO&BT*s|OVM5ZAbbUJxMj5lnJ%U!EyQ`> zwME0|W+SmB69xjQMd4OKw{`90fa2V)JhO3o-Oe9Cb+}p!4g5unClOcK7HP@zx8*L7}VBEzAuvOL=kBhAvk^jj$44K50~GQo*MvY z?JBbSB8Y)RS7=lCioFu}*OZ$b(!a6=S1H+m<+9(r1L(waDNj7WM8qgDu|&hSwG|=r zclxa}4vt3Va#|MkYT$iC z;r;&BN@2bQQVr2>)!TEUHY?oH*{;p%eDN0Y64mu=(3>% z?^27_?s*|Dra>xn-<{DQ?~MPjP9QG2|F}>bPBj94#n;|LL@IzlCgfOn#}$tPn4<>Q zi*pxIKrEg0ELM0&5Gd}!a4TYkCZllGH6RepjEgxhMetkC+Wqut;@sDH7 ze;Rh0<%)+~udlMq_4ti*;R>*mH_;6t|3ZH)nQ7 z1nsRS9lLHvYW`(&$yPa*fl$Q*&B6nzJegH?J@j+_Eety6_e7~Kcw*~J5#E5Nd;ykRT?!L*0B1yv!_ zY7WY7UWA;_u^g%ZwH`Y{sZtY)SPnE-wK;@!rQ8`D=F@>hwKD6jngr}?d;QA0?3H% zUUjKy-HM@T7Vik%H%+X$FgdSx-q)|0Ni9x!f6nuab8Jj@CH}Y=+e~d2ZEb75X7Zw> zRD%6gyIc2JO2%HBg_5sX&-mdJeRJ_lGc6|~;b`YeCSV{iwFjJuKPdA5n|H&_)Y>?y zdYdEXll6ME>|V83Kzs=*M(P;85gss6Aky5qsm*;q=GudHv%A(>Zr`$1dEb75%+~QL zNloI8bEw{UPj63Wnvm=zC#OX3?+=uzWa|PJ1L-c@ltc)yhCDXoY+>X1Bl#%|pdAr^ejR*kd6}7q z4eyDUwAav@=X@a$IK<)N%@?C299GJuFDm?W6L)CNpL^bxJ<;XF@oeuS2l=ZNhbVZ2 zmnECu?8dXy({D7np10)y8UI>;TFE(;r-<{e+WP(9?8BhZk~;+5)ovIckV5KT|Gq0B zL=agTd~nv^PNz@mNMr9q2l$J6J+2EmXD8{yxZVVGWKJ(+Z**jyD+4+*2L0j1I@2cb zkg=(rn@GJ<-SzXii_{CFUjc){XIPN;kMQ_u<3*$Xr}N!|r7P~M)H(hOgJ_653^Hg1 zRN1M@-f&SGMq3_r@D>Q(w*;uI7(lB2Z-s;WyO&{pYI84JW5=7k%jVnKYyjk~c;NeI z+3|N;GU~x-k8Fq8b#v52!^PpN@4y8NFLY z9d2T9u-xl$Igu#+Js+IoB_~CMWm&2pE)#@i+v_;GCF-0% zry-W3(PhEeAKAe1B6-2i7ai?2+xoYI;jI4}8>3)${wByu&u#X>s1lsptO;LPr9fR& zN3lc4GXNXPx_}&L4S3W8TXwfRxB6;n~xMRUcvFPr(3u!K5z=7;Lo9*pJq$LJXH~2iy<;85S1O z0H`VeQys86FxOR0?f)s;?J2Ww%Bf8TNUW(vp#c(WMlS@r)1c>wfvQ>n!*36*#NouV zm}0<2drOpM>*DORPU+9o230L?l*U{w0V+RxC}1_+)bFYiFq# z^~SHNB357kc@A0FDxqsnqG!QNTJO4a7On;Wx;aaBybs+CP~jCIc4z}kauiXZkfyKH(G}>>+u_u(pVjNe*aB z5ssvjA(2wg{;HJ088s-p!~=AfozE4sG{ATNDrAGVaV$GQYa~pGVEyS08!CJlUa&TVQr@;5Y78hZ#*c9w<( zF3&7=P3&arRpplU1j7v9%v*!EOmBM5IG5===R%hps+hp!<19vd!E2G~?abe+G%{;a z)IyVzmL3NPNaLMoz2`+pi=Klr8h$cUHKJ2 z0{&FLOK6_!C$P(z1em}&T?XSdi`mi}zw21s(Mo)PKHKKwItK(fS7+gYAZG;NIlgSo zyojE9@FXrZW!pZi8o9n?7 zF%e!qQ4z7ncdHizC37W#KhV!>5Q>Pct)-Eyp1lRq&jnI(F;_EV5J*-Q!~kp#0fYob z2LYvyL2$q`01T802HtUjX9yS*1P#3Zs(}n91i}7lgFxwEqTlU2Fx{W)+!RY@|MgvD zV7*c>$FDYUe4qv>tiONfjTs0iKzvhG88igEZHekx+gO8sy^_n@xER?hnc6s#D?Q=i zVgpvW+5cbb{(6^?l9eatVBu!r1c87e&b$xVIUcfckaKW8WMg~C4y=#voAB43fkS+g zf4ASgrTudcQ8Wg`gv#|JqA%QUuKJ_NOQ?2MQo`m0T}cDpZcHU&H+fA!Fx@3-q`1Bdkg#`@WyR#43U zUqAa-UGV?U*Uw(r0n)UeB*c&!dF-S~83T*(;sPVsL5@H@9#z4%t>~v8h*1=?zW6>S zj)igNz1-|sHmaeJET1SUZWU54{h+fX&hdDpf$B$nEpw|}Bv*Y-F>yEAIQ;pA^6_MS zs)bZ~sKFHJTtsBGOV>$Z-5lnuIrlMulZ>5}WZrI-vY;}g7x10fnLf%3nVf+dB}PeS zBjl~QjzPX3PH^TyI9*=qx4mxXf<;|dGL3z$o`?0tsKzzoUg9TY9|YRZmYIQO@z;v} z)9QvS-W8v-MVZnc1cRYq2a4RsbVmI|?JG+-c`p&; zj3TwZ#h`w|E!5m-z*>#X=<7k)9EwR4KZuP<6cod<)BS+bJj4nnX>pC=C^hm7KI<8F_!PDiLc-^s@7 zb7W7==H93M8ZZlo*XzeG{bD86ZsiqoZOMJg)xF&9y&5fV7k1(+dg8e1Bmtu*N$_Mb zgt%``eIyYLNS41*V7{juo*ql8MS0v!^p@&TX=-B9HbI;9bqcCi?1UL#j2QM-*CSaZ6RTF&Ww*1D%@mT0!o~F@7!$ z7Nd}*1(llf1o|r@W~9OGDZ(!Lmc1n}deF$t2?lKoPb3`eatOKHYUk)?Lu z6rj-A3KXJT>>{JY9JBS^q`#Js=UN(kXwy;8RF!uqdDD}i|7b`DQ6C9ThB(EyqKKt? z;>%N0c^;5Y(vUr~Y0&tGtOEATp-<3MykC^IRkDJ3s)O)b=ma{Y`n?#ox(J(UWm`Yd zn({SmtBlbb%CQxF#e*hU*LHrIj!9>osiEc=n40P=?tz}Ao3dc_T9y)4?BXTaGgY0{eWD3LIhS~Rcl`iarzKu^5En2gOCr~Fx~>Ar$?}%inONk zY3=h4{T^y$SsVEEu<0mQRStcQ+?;yGGX9~FiS8(u-HRWA%rrC5kh4!#nzT(xl4L);&a(_7c1_)3DQMrY3^U-i+gO{cy>m&NJvM`d{=zbN?6 z#sw#oxI>|)k*`JWKn>}xcA3e6)_wGSCP+h0weWEQwOBn2_FS8{lK;3A7uIT`jj|9 zc0v6r&)yE{JmZ#wZGZb*xSp?oDBmI&k9Ve?lqk#nwL{24En#+^sonD_fgrdoL#5X{ zZHiH*2f-@;-FjdCQYWQcIW#B{2kua12>LYAnAAAQxt%Y|CQOc7%c zgU?sE>)_w^(MF1qtFQ_BB(W^XT_w?@hDCLN0n0K^>WCm)>q%*wrR2iY>Paq&WE^Mh zHdx~k!M1vr4q8XrgJacJS@MHSXew}1{F9D~9FvagutG z&v35otGBl-oM9`j2h6BzP037WhSim@F zVJACk|JV&9InD*IFI*_)|!9kQ1!|vU*xNzl?*OV6RA;!`BqAnoEXvdz}Z`vV;N( zDas}DDWln@+>-*{TCgZj!ZOHBQW%K(#0i)v#k!Og;~Dsbj*!f@csB+Ins=SZCIX?8 zmcz+HdBsI7Q8*e|yY11ro|}$5aZZhY+tjE2HO*x7epLi9=c|-&16<=+&y33j{p3RZ z-?7tuL1I|1Qh9E{ve~NnEFtk}BO896*>_%6<#Nm&95n@g%A&VJH6hMikDuT?mz58R zrNmLVlrX~5ThSh~mP(wQinCQ7?KEyR#A;_0A^}8Ui41Wpv%6yWuwxU__&G!NP~+W_ zhe_OU`Vd;5k&$U`S8ST7Uk-i|v(3Br44`&&A zL0Ro2CHi5ZECtUVrQ_IQi{(dPLsjqWk+BE6G-V#d z7-7Zc_S=c);_()e&w}tsQ5c4hbF`eRT?{Zb^bn9dK zZl;APrGt2#PhoYB&RmOSzFsl|@%1+WnMNGa_Nr*?;Vq37Zq9`!I3dPQqn1MG@~;W@ zyt5YaPYGu-Jv7waBC14n7}&iJ)SgHum-7os)6WmTc;Y&dV=X&Wqbl|K((DiyYI72QwlQUUj)gh_RWO|%)D2FpbW5^Cw$p~qw4 z?32nRVN8+qIfy5`j-wgB>h`Zd$^6LGk@m5H{1 zXNbV;5wtX2*83;~6V6+2>@%`*<%P24Yc-(<8n}-oXLcA_l;g`YX!IuLU~LPLKMW}R z1dSE-NHj8&BF8;%f#-s4h>L(uU;L(8ksKmlsSMs$V0^wN&CD$6^wD^TN=OF%@n}=9 zOkFl2v4*uiOfY-@{YQ6{ zV(?&Wy+od<@$uld9E~U(n8*~5mF%zNu~LK^Pcu(oE(hs|T{=EH9LwvNTOPnpuhmRX z@96~i34EGt9cTFXz+m{)>ltH0rebKAarr|*5~k$}8X4zUF@B9D&nStppnNYI3m=M# z^5G8(1Mk`#Qgz)KLx+Mr;`fuZE7dT~aZ5Ie34LF;mvTQw`?5F|OOSqXFX8(nt%WUH zHlOvkJXOV_8sY%0PAe)hCS&L3#YO`yyJRw%p~VaFy5p*L*uqjwXzTeX50^{EIxkXx z86`~K#BD})a;Ul}!8y8q*Zeq4>d(c=3^>)~ZW3;j^-)s=!!tbf zod>2c+0dumUBdm|fVh*lAeBwU=!Tb7Bkd7UL)ua-t8PNdBu%?ItFI~uuw-jAcooQ} z&eXuGHBdbG9nTm`e$-i37(!obnjC1Z#kL=wuxun`wOusXP2nOLx-I^w2|W6MPmo4pixb zt>egfKT16;p@xcZFNB&X1c^Szs388>HXa=c6{(h3!xxW8Kyb1Ba|6|Q4$+^(ciuVS z4CCie4z%i%Xt+5(lnEue##r0lE?m{+`i@TZ^h=D5d!ezBkYPbv1To16gZ(@X9mz86 z_@z}}IhyQYR(;@YeT_;W_($&D3GyE>o9DNqke9-M%$*^`XCBtAc{9G;ke z*XN6e#Jl_Kjn)W7Nt|qq;{J%Ccr?oU@I2D=s*sCtuaNX;KzTQ`^{EWbxeFK9N*r^{ zrQNiZnB%PEs%cTStVn)+*?Meee*|m_Zq;m07>A%m(rB?Y7i{3lK7a>IC#KjYb{|sv z+;t&tp9#l7ZM2$QysW9IGAZf`jJ78Xh(mvyxkEzQiJXD-kSl}*L_!=*m z<`9M0UBz&ix!{F`EoBrntvL^o!__$uPog3*^@A$4|7bS;c@(i4XwBJunSDFov}}; zCtdS6x>DXTry43ohAYfW+Yj{#3IyS@~ek_j0 z%fULRHuP+5C4K%vV*lpdi`7EA3adctw*10J(^7G=y$?%v*8z1NNtVUdMC^`sFVmbA z8M_VjdXB90DeTFqE++n08b6w_8sD#75U3{?`gOQh*%@!lyESEZ4QLyV9FLVg(hD-= zu-30u>iV8gtBGAMrssN26g>0rz!;%RmHd<7+Z{&S1NqqV@89(wNg0`OgTGd3Zn5}j zi{hp-Nj2bnS@-LJtI^uTD>H!;pkFdBLRGhQG1fFO@G^g1JYencG{k^bAX*U)*}krZ zq@%*zyx&iJh5lQy_aW_5A5qq zdHeg@d(R7a`5&en#W8;`bLumx$PAj2;bw3xY+ej%D@)UfZhtP`G_N`ngphF}xJiT4 zf;8ga9A>VNC*C8C+pTDqT-`)~GjJ*`d@5aNQ@~Ow;e>pzRQx6Q2-;6+PM1Mzn>Jv6 zj5UBJ^~vY@#sg`l-HYmTnG;Emdx?)WlWk z+*w2YmUvJ{xq++}%u*1qA7mGa^|H?HXmc#6nd|##Q&~c+qt-`C>T2TS+%(TwQP!mH zQ-OI~^Ux(I{$YwY`<-iUQ>vPHzBoye1)1IrqZ!6=R4-&tlCe4sLy_6ZT78=1+EhzB zGS&O2o(g>Naee0Eq4KTivo5!AoGtRJt1Sol(}WeN!xGb?KFm%k1iO9W7eO(!y#*Mj zVFc{eucj)*C}XO%!BO8fCkrIvW)bFj%={ETkn&C(wRBmr z^#pGa&pBrQo{`eU>QGLHKw00427&0m&9Xt^;&{(&! z$SpczH5amW*Z(+LuZCiq6;r@U5!q8k?Cvoh!(cPX`<^TJIl->wSMe&0>5iB3wsnFv z>3NfDiW{Gh(y-e!cekEib44{l{h@@=DMomn&K$TKFCP#%i+i8+Ko~B zaOAP=BE{0lLIrD<-MPA_^ z3&hFPbFp_0YAXrb=oYno6%tB^znQQ$oR*SZ*0o^b1ug44Gwk)bw!OOpe*An)_maY8 zs?qgF4!{!-?yi+X-cZ=61oh8-CT623+N=#o{jjd|d>a3Y!hW%{pugj@7`}_%cARW7 z$Ai>+A|?x)SX?9RQs@Y8*`u{ZwL_&sB03Qc1;v#1Oy271d^SUl;&{f7uBW{v%;n*J3S4@Iv?d0(xB44XXZ!L8Il&_#2kQFTo;lGFe}P8n-F zZiB{-{WnH3^9?1g1GX5UHqQk`RiZr{&cztuv5{K$!IcDeNUK!TC>u5}+ zvXwl^Nq+x5Y@`32f0LW8DGvXOV7`zS7gBkE28jZKND6?@D%7ykUEe16VEfuD94M!o zv#VM8FhQ1F%8s}rJHv|+54&06X^Yeo$$QfMemhAK!bpstbU0gM^Xzu)CL;T5ZKUZ*XsN9-)a#%5*MVa#D zlnZo4^&#0!ZbD`<#9aA=}%IdM;+fCGB~>iVbFb#sl8Urn z@|v2hJB5MJpo|=a@ZxNoK{Ir0)u(U!9@v!_>mz)*j_L6fsnOzhr49)x#nx%aTpIcq zS1y@T_{?_ZEJ~7+?^`weUe0chm&Z zcW^oBu@1WC!j_S;D=ujUiHTK(q`pV0f`LhTQccqLG`2~uSB!6o`n7@~+Dc4^{%HNj z$wzviPT`P{#dW1PW9lVi6G161Z1%Uq!_&jwgSf~j5&Y*PrNI%h%WTg2pzTdHBDEB| zGJl0(=ty;M1HS2wH3p+(gZ7;YX7Cyz>s!AG%UY{aS_0af^lA|&%9l#7#3Wet0N=WJ za!Lw4o-BDexhF~leuEM9>D(m8OvZvya#EB-ND_eVi{+Bh(n!Hm3s89Ng0H8{^tz8p zo-x*p7?$*7jk4y~10~a4W__)?kLo)p{%1^blq4nV+Noh0s|}T*Nw1M~zJ;Ky5~DZQ z&2Wz$H+LAHlJ(hL^nT>v>!1~?=)Dw)WOYInG)BtDWRI1vp04?xLgIbIX)5@XnG2T@ zoyV-{qET9>=7lcbhMAgtfDCn%wD%gx1A4ut95GlPV`A)zttksW^$k!R-W=Vy9N zyc_h`yuHa-A9iIqN*0udqrRTZEB9a-AcmwIf>ow^@cXroa<>Zy&}OvGl+!19?f36V zZYmHZ6+|6FL%k#)Df&XHh!x#|1G3tQC>A3g#kwE0#z|J!r&%t{ShL|S4?Do6MwJqS zR1-6ixD)1^OW@KuH=}fxkW6F=8?GeXBJL~wcu+<3GCe2}WipXIZDO0svpu~slu%K_ zUOB|10$Y{qM4-|+n6dt=PWPRR+8Z zQ+jgtfc71x7Vqk&%5qIi64WZT!t=!GO)cE=#+0=(dle}%%`ya(4Rz=NJ2C8dNmqlK ztA2AWBh*-dq(L!g63z(T@9`_8BGm@G=|PVa5={r}IBhS#x`!@Cd)er!cBu zhtVW*EQmf3hn%*X^vLZrjD3eLJ$l-Xngl=xiIM%B`1u`0T}o6`S6)$0T=%HnzUS zO&jVa3yp0L>>$tvGPNLVlRw%_zt;Jq{phA`Xk~2(taG!^wuV-QH|2qBgc}_GTugj^uO(^yKV(e7xk6MlO~{j*iUodIlDH_J-u5HdeNJ z)@~rsAIE(2EfD6-xg`fqGB-OPH#ai}3vl{>KmPT@-)sGQ`Q%6VJhpenF zE-ox)Mg}Z5C-nE@zg*$>n*ZFmwLO-b?fpJ?azAZYCr;1lrgetU|j3c9)T)W}xQGZXTg#iEMJSFo<^c18g}`Fqr(i{}2KWWo1Z)j< z0(*k}z`@`sZ~{0DoC_`i*MOVAUEo3R1b6|w4&Dc!LqS8KKw(3XK+!<4Lh(Y0K*>NU zL+L=7K-odLL%oIygL)5@4pjhE3DpGE12qaY548z(1VAy6p>d(_Lo-A3LW@GnL2E)A zL)$}pLkB^}LZ?F)LDxceKo3LDLvKN!!N9>_!H~l+!|=mM!l=L)z}Uff!-T*jz~sPG z!nDE+!z{r3fVqZ6g(Ze%gnbAr1*;Bg0_y@B02>SY5w-%h4R#cE8TJ?s4h|QN7LEr_ z5>5lo9L@tS1TGn_814()AlxF{5j;FR0X!qTAiNyB9=s!b0DL@r0l-NZf?tL|MLTH1!Obim&ostKOuJ_FCd?xV4^Ufh@xntIH820 zWTSjRnLs%}MMb4SeT1rs>WCVKnv2?kI*WRWhK0t0CWU5*=7W}qR*5!*wu6p{PK_>t z{v6#MJr=zTeE@yy9^yTkd!qOB?s?x!yjOE?{N51;76v%BQ7i*2KdelwHmqfAIBZ&MDQt7>VC+Kde(WDOm^cq`RB>E! z5^+A`%;Q4i(%?$rTH=P|mg0`#p5u|=iQpOG1>zOq4dI>O6X8F?H^L9XFUB9mKPMn3 z5F@Z4h$N^Ym?4BAWFS-^bRkS3Y$Mzv!Y1M;G9U^fDkYjEh9YJlRwVWy&LHk3J|ZC{ zksz@pi6?0x*&@XyeMD+b`i``Lbe#-~Oo+^k>>XJn*#`FrwK@*nq!?@Qiy zx}SEx|NaF9Erkk&FGVrM3?&jJFQqZ%JIZFtA5>&ivQ(Z_`BanCh}68)rqprN9n>c@ zv@~ioZ)mD$)@bo*rD)x0^J%B)Q0au}?C8?zM(E+_dFd_alj*-QKrwJJm@*_X3@}15 zax?GjWeS#i!eJg=QA&`;Icer@nxxE*j|g-UzD9iSX^E3<{NhifhKqe?!n!)ad!#s z?iMsaXtbNqK;!NXjRy$s?h@RB1`P>(!^|`P#Vn^bcX6I`?(W>WRqy*N$z3TrDI2L$ zsUv9?X(#Dw=?fVy884X@nFm=B+0U}Qawu|&a$vbB`M2_V@^JYr1zH7rg(`(BMSjI# z#a<8^NCgA|Eh|weSu0g2T`3DHe^wq)!Bx>wfvfDQvZ{KicBmn%DXXQbZKyM-yQ#No z05p^|QZ+U;nKV5$JGIcYG_|s{4z;=*1v3|Y`)o?*oxaiZIA54?VxtY z_Tu)b_9qUK4lsu^M_EU>l9^0NGo@t&}UMgOt-bmhN-fcd_ugTPeFSBp7?~b2@UzXpazrKG{0AYYzz(gQx zU|ir)kU~&NFlw-M@Q;uWArT=vpQS$+gd&Anh5iVm3;Pmw5UvJ zjWUSp_(Jt1{L5anVsupuevDVla;#`<-dEJGj$fzZc;hnTUcffsv3Ra{Sp2^P>x8jH z?!=75|B~#IrjiAcb5qb$+)|bxl8|yJAv6fOm#UVE_(t;${OvaFQ`#tu50;mXo$i~y zouQi1mPwzPlKBtr0AI|K$*Rky%#O=`$g#rWdj8kQPW8hhdpfhoka;B?!J@Jz?7*zET?$+^CHx%r_5 zrG@cD^~KpGy``09)8*|Io0a2Lm(}YvzqP;X;Tvch;LSIiur121!k;WZ>$U~9yLaSv zCU$jp*Y~XVe(ihj|2z0{h<6A(dVf@L%yZmzqHr>EYI1t;%j4JIvzT+j^Xv=ei{?wI z%ZV$)tAlH=>;HZy+>qUr-SXZ3xYNAbx_7<*`v868P6=w z9WN>`8~?ff_uqf(09gPgIyweA8s_Vl2@4Ao8@5)iF%|iHYASL{N*a1j zCK_6HI!a1rK^Ar{ZazM~_e{d#LOf!eynHGMGBV2l{@?kZKt)4A2OuG1VE#7%5PH?mBBA_GpuQ?Tk&saUsDx;5 zKM-+Cqtj{;^H|DwMgZv`7`z4A4YMTle0^44SFbzCUiG1`S;_w#`uhAoJJDX3m|k^y zuYrX6`r`k)j)Y8z^5HGFG%69T7LO&bCmONLe`^3-6ePgw0wF*WP-`aPQt%aqk1p^y zXbU%<^dOg`NGF|C@c<5Zb%c9IO``A?`(qS$MWr~8AjXv!WQ^@&bvdSc*rK)r3hvmb zbAM&TtwXZ&_{%z=r}yX~03k}N_)e*1TFx>p4R+#d#WZdawq$zfcuF9(18mj~4E$Dm zykS#+6~<>uZrHt4&>9D0NV|{m4riNt{#c?``qR`Q9U>j<=zacHK^7=<4Q_)Nd1<`;JQN*tJPV87>`+VE`1TUKkTi%zy4ULT4S~!W0ol+Y zd&6p*66*L%HJ*=~Wz_U78k6J0W)%>H8c=o*D>ahHFDE00T1y*=BYtHLRJUzB0y+M% zy4TEPvsl7U_iIW9zhR9xu!jLr;y7Ez14ijE_-m5=;^qHJO%rPZkUuirNSSukj=JLH z7RSCHh9keQJ=W4&GOrYgS329lH_z`_Ht>3*wNx}l&^?UX^-V3JlDAsD-53y{93jT! z`C99)_`v&rhn?S{^q6!HtbYpO7{}$$%*k2-o1c41GZgs*)D}Eby0$f2RX=IkC$onm zdfe6`S)e4?`lj~qv)C`&j+DVCmJuAi;;X@m>cd480A+Kd7 zcKTV`Rx851i_vS%gTauvK$d&1afTUgnK|Ztum|TI-Wlu|V%;|6P^D62mD*kSA=Ynm z^60+sLw$QkY&9LWQM)9+;phjb>hIw3nORr8p}^66Z6kUYmgyHZb+SUdjz+4Pzu`3h z=F5xY)@{mp!8g(X8~NlYGGIyYgv?h63_3+m5~;NiZGf)Lrfq#~G2w<|1+MvUd-O?(YXPb~ z3nto_#S8eUR2-X_^@f5MQe}l(LK?tmi2960=sjc2(iNWvd**#qLdcvmS~RV;rM>k~ zD9grCi906KJ#nL-h^~KWZ#ukiOt*fR$%Y3ym^HcQJVgyS2$#S=RA^?QAFK^aJsZV_l?hzsAh8;3vC#`-^JO*=GC)h*0wtqG>&m z$~`f(O(eH71NW5sXeRK$wylcWdtir1?yh8{udMpi^=OM>)Q>{7+uHj%o!-(znF{Ha zi&LfyDi_FIE|jZ}@YHh}8y@e>;>HD!tvS6=({OBp&??Q6-<0G3<(h zUF-c)2`pJCYZK$VxN}7aTp3Q3gbN833tYatJ!0M3-Tx0T2?Q;>KrLu({mP4fvc~k` z}_W=4|WYyUvr$mP!Dv&a(L=luL3C2FT;*e**N7PbmNEhxS8^T)C* z-?nVujD+ybN}i#{7BX%ghgx%BkE{nBPfn+`9%%_l5URiW?u#tSqv_(ZK{SW&9s}GuVnK7I(w`QMjt*_|-#&{`M&mt@H>^3L zp91~bp?oxN!go{05GnGcAESrG9{56ns(^<5(bz(ND#vu3cEvyEl2H{mnbK>qxc34X zD-gmR%AMGpq=Zp$)}T2RRoxCl78@N4)tGVYP#!)cKJ<7&eYx_SS?9YMX~TA)+!vyKBAJ0*x2o-6!G(U#%L3SkruoWf%fhw z_5GXQ6qsd56QDc480^G05+N4{$W?#ez|H+rx)z$}%-i194(cx6yD>WzAnX?r(`LIA z!tNfFI~39_ZgBTJLa?|daCXX5q+ziVp#CAY8h1o%cAv9a_b_TFD|eF~(xnc;mjXiB zRP4vC_{Ffrvl1g$j59?V5hgU-f#uRFQX|&~neFJwE!k_~S6BTF`SwI+o0+D(`@cQa z-noJoajhZbJ|Mbv5+un~6Ua(46d{8YJ&A$q&;98@GoKEdx_z*NZF(shp%dO+c|DYZ7_a%> zXk`XFYwx98;C2$!`E=?3_JgRjnD=94;m39hBeKa3VE3G;L3kxcrodU4i+zdSgF3LhaVEuEV658$Ykzmfj`|SR>J2 zzaG4v6>L=-Vfwo&SMgE@zZufR7vAK*7OXwaAQDq-NtEU55=BRC_-~oJpPhH3>jp%t z_rrel4`1^884=v}OpfzR!3(DEj>H~fh$-DPv`!S&xnJt-Uk){=0^AxgT9 zBOoEL7h5`w)W5%HOmfQx+fc%>bpw?v6ZRKoE~3}SxVmigjmb`Oj7IRf5->-cY;AU! zlmJ3vw|!NS1a*#u%|(on%Sgxsgw{ros2Sqg*f&&28|>1`=?^(_&d@WOa+404md$Xwb69#}OVd#1!OKpb z1`y>d30TtGkBnJN<#%jp19kWJIL1WVKj|HLM>t$Ze{zQam{mOTbmzu00l9cwadFYV zxf1+csiFa^qRE!Ii@JXa?tO`;mt5|TDE%r5{33)#^_dbDQWVKrVKP}$T*8BD!F(Ln zs1(Sf@1v=XjgJLoPB@GZmQATEI-s}Ct_{s+=-df2vux|biyW6{NHr$Sb7sDjF!n&k z__h2^4)jx=Nx;_~naAG4jwYVXj&Wu*&`?MiKf`%;s^g_U6E>#qdp@e7Xqo7*?^An= zdO6de~d*ZML0WKNNuk4gGvVnyRF;V0I*+9vI1YV10xGn;Rm z;a@xH$}knw4-{BXA!4Ufir;JQgM9p{2PjrM=il9q)0+&07=&0si(fHP(*jA81=<5P z5ZO@|nTuii#otG=OgXV&HP2F>Y#u`J=!_}$2IlOB+i-$D(1z@YW`5+hoh%L+;S;E| zqf|3Wv2MY=2?7_!WuKI1(PcUp?gugXjFPy@!0@fP-N}c98g*Tfq5j>Lw%ncC z-F8N~2g|G%mVXbMKCv~eHqIB?-muE{v;$i@F@eLQZXij~j3c=`y1j>N*qo%3147xe zRD&JIX4fs%PRhdsCG}eFq$9ETGY(G;|NO_cy>JI%P72MXFO3=t-11*=+ck$u<3TD6 z5nBgp15Fkr_u-;Pe6|`^xYnksAWcm1N)D|^6BS;7;YVVfUD58&C}A?IE-?N}KrtfC zhH8j~6(ODy-YOFG{;937Mg%g(F>_TUTyP-mTvDKuG+;kSQQ84oA4eVxq)l5+6<}MO zcrbun#bIf06B_8l@7OIHli8?ep`we9xQYuTvkhqeHrM9iGj~SDGY3*f9<`?DX2{a! zd9&;n){Y;4D?jIFYZ)gc+i_$Tr=X4!zBo~ci#Tr6nndPPZ_n z7g5tLLz`Ul3Ce!)+0=SRa%=3)?j5s9V|$y3wE4gkTg5E>_9DPKxvr z47e4ZSH#J5w$AasF_==;s}*zu|H`KX{Yx91?6yeQa<*Ny#q_JK?0h|dhQUONRtvUT^HqK|9YY3-qCoN!@@!zjVwD+L_{ zBlE&edbeA7or^7asZPHbS}TZqVD?x5Uz#k5MqO7S@TTrv0)rMUNLme;ZIZ~01U)=F zAu^Q^2}3Ba_Gtq{Corzx;%andVa>K=pc?9;ow?sosjWP$oHB>`q)h+qb?Ag$I+Om5 zj*X0})V5XfLM|i17oTj#!ul}p>AfP6GE|A$@8;hk*P_>Zgz+=m$<#L`cCa8}uG6e| zv59~yX-%KVI&v2_*tvTDu;zju%-mo$l!}vjhQgP0Gw(?vL`mKxJ`^(3INkx-|45pa zHe;EbSlIf^DE`x8P}Gj>uziEobgaC_3lT5ewCKa%Z`dNCJF!<%Xlt@H5%%lc#Pc*_ts=s^m(I+4m?}Me=YI>=@ z{$^Q>cuJ7lNSH~NN}iGL<6W~%Pw-%-;;mYmP?wS(;afAjruRTe@-$g+DQam(mUKyQ z@^uKBtwI}WKpXe!>oh1u6ac%hXUjj*P$HSTqdFy$(#OzsbE(Pv9`n_fn@vV<7gwcN zsUblu*yaAFu(c$1`#cHv40IYFtZqn0N!=<>H!kVkhm8{R4E!D14b};$ao1XtO9SUh zQT>_@*e|gv?w6lfBA_+J+xa5|RJ}vgrfRsNMSfdpw^H<0_cd~-jWkM%6nop{i-vq)Pp zn{!ip@n1}X^Eg3`S(NyOK-qZ=itD~Y__|Lw8XbKCkr9BMULKO*nH|j(=|JB`yWdr* zAqH@quP-U;R-QkJ`x&`yVR0ByuLNB=82LCHWa*_^SzDF%2z&(qHR@0v@$0^bvP0U= zud(R}p<8TA;w(-G7@&`y?1vr$IQR}dD=J?28{1kLR zhf-gTd2RAa=>g+NQ^@Eo53()Y-onr=gbOXbxV6pNg1z&=&5R15-`z6P&H@T$zD1Fs~Y==lJ!6W|-mZ{u9&Nur=!+gbxjjGAwCyB-J3yF$g zj$?=gjO$~8^$mQ|s84FZ178hPM;R?4k5jFNKqoz8aYd^-zS!NxmD%j0w2GVOJTFyp z-9ir>6~(-iT9I<6Yh^_uz0qHJ{^)Oy8x-B6I#K+lhkx+YcK4p`t?4@scU#YQN)IU6 z-rxpfXRKmdd)I6H$pnaAj{2+jQ1=d3TMWrQG05_b|Gycf_gqN?Jln zN|pGI-h1|w30s87S|(2!;u8-PEB5k>?Ju5 zsiT7uEQou(kBRWcE)^-Nm_wZ(kPZFPg;!`JR4>{R;}$#SPPW+U0~o`ZzNo6NHm#X0 zm3_^|RiezH9o20bc$%Vkj@E}KIn=tGgp%*?44F~158FLYY z5DhAfc245lIbm!@89&`(qyyV&Qk(68)N=&DHM4>K3-n^`#n z;Saxfb@T>Gins2SH=iMF?|gl$C7|0O&Kr`n;QJk3W8W}?4z99hFf`fr1@wQY62S=kD-aosITHN)JEUt{#xy;%& z7LT5)#SXvZ%P+~-Rb05$?BN6N3&g8Ji*qhq@Xmg-z_f*^1{vqwDSeLK#Br(niQbY-h zC9kE77jHT(U+|?-(EaT~((m>Y{pHH6=+$SR`8hFLqr4+jStz1d!X%hyb-nd-Qh8^l;A%x#*R#QPwF8d4K`_jS#M zwU$cDk$*o~ffV>^O1te2Rm1q(ONGWL^Zx1*vO{BRDZbvoxf6*}HLOLQJKILI*L$qh zIeZ-phYl?NE=oBO$urIq(s+SNVa8CU2gJJ(2{vUs9J0amaSkOnz$jVKdyG7I`KlU` zzxEpI)h>97cOy1Qey7PUyZ{t1*`5`mhI(qPcs z4;tghc{Ow7NOpiI$uEXz9>_kycZ%8}i^wo9iJ9h0nVH(esS`iBvhfzN5>VtY(;UU> zr)rQT;H^P7o8{eG<;gybZqcaubdsh?u}Mk@;km;)Eu^aTZuHcC7$sVibKe7nQ}+nd^-kSWbmK-S~uH{j;-RTY)%5FMhAhP%DB)ntrZUw zxRO_b;U-DEaB~jLAVsf@zxi1EB%!-|px@-20_bI%%z<9TB-kORU|ryRoGI#&-+7+j z=rF#TMhntPbHv~GYNE_)`f=C_Wz>8}w_B(HWf82^i@3bj&-!W=f%?Vf9tEhq;AYl> zOsnAzzb)XDFC#y@B~T8lct@^UguFFvR`@V%*yZ?96@;7xYZTZ%v`}Aw)hV`z4Z7GJYVUI6i zhp&cC>j2V%6AK$ZVuw3i^0IQZCO{!}3EOFxJh4H!miaX|hROU}xsjH@#_KIn7M-cr(e zV*;D1q!99sUvY~`dJvwUcn$Fy(UBKsZN5~~d{h$}w1jRAdt>)yi0d6a!yR1%!TLT{ z3ky#J-M?fU$2Wg}DaF5;A=tnsS(Xj1SQ77^7P?}c7f(!a>1=p$9E|>^*-H=RLb_4l z+lu`L!o{(7r0TN91_Ov=4P$FiK8ArC%-^c9=JL`!U>g-Ke3{%U07VDV!p332KF)NjP6>7DP4CEUdVKHSHsrCEQ zos*JGT)v>KjDtGZTqcCl_vLFxa)o2!g})t*E^B z-?D&_Kn?D_@$P&F0>{m-12PpHq2h}(KCMA3>x>B(5F^S4)2S{ljlx)p{QStay26=@ ze4l0fKv&kLDFgP8wPA_6akJ8$OPOcpLqbLUUN-9&uY+JZ*40`~jNBN%#bVG{x0gKx zF=km8DluoBGWzbsqG_B$>EJkqvs%0LpJ$$M+n0acCB#2`JFTQiXj4#1_X@?YOg zoBNDDZv%1kHvhQjOKVu9t=Ybww^q58zl68Y0FqQb!?{~ti5YQ6NVz%%s*RCmG91s5A=s0`0% z9waK1GBIx6zh)lPR~fl>b+|8U15o-A$7?NqagcIz*4cy^-9NhMssG+N$}7eCw_wXS zb>@TUXTK<3XbH$?m$PjgeywOM*UJJDMUf(Osd!cfcJ_9@JN)X5+a;xkR}0HK%vFdd z9kvrNdJoF|u^x7+MHJ8`9CpMT(CkEofi(jEa10yc^`xwa|9N3!uUoSG2~nv%a_++S z14q(3&~J%qkG3`oKns_WGLC?Zx^+%kcvA4N`hma4WWkxj#~ z;%8GSQM66ClHN`p=BLBTYh}BfDeWK1j`a{M-;;SpX)Zg#yo#CN?ECUsSH?BqSDgLB z(k3l(ROx?9o|`!k=eW)JN;iKYtx>*eRn9#}nQiKK_vN2uLp!0XhOQj3!k60aAZxyR{h| zp5}K?nq~lPbQa&`IA0Se#E@jRwEAMy7+sy5=hd~hr zWY3|>vBRxvZ9g|X(Ja|d`Z^qV*v>C2N@ZB6;?bG3=zE#8FeNJU=9%Oj2JTOOQ>YOK zC&cg^+cRN4IL*;Av4%9}S&sTPsWyX5%2o07P{83YhGsdcm+&y3K!LL_+PpDqW_Ta| zyYG(FIXtVTSc10Su2T(2B^N|jI1(gPaHB{!Bl7<01u#ogbDl=|)DSGB8m_mL6kiuZ z(Kd#iUJf%qIcQjltfv!AQn+=nO>NAP{0Gp!8){Bk;Q2b+ijJ}oio_SWtlg!b>&R&r zNN+W9_758B&|RbOW%nO!(p@1&YPpK}tAv2!D>NbGJzU8(m@0a27zxT%lo*RTyCzZI z=*UxAz$!xLCch4Q?z`4IIouj7qP$>Y>bX&IGq$V5>UlfvWH*WwCdn5mTAKJ9pCE6N zR}d=3NUNl9(F6a)km-^pwrEM5#y#(2J!aNQJ$bFh_okw1UHCshW$G=%R~GB@N&fks z7FLx5L-IgYV>0pdFCqQDH(iUaB_KET7c95KYA)B*iX_?a1=wFz#|zA1AS=R8e(k;E zXR+Jo!iScLJ7F;WN5(|QGo zKIG@cS!agBi?8hj~W!(g@=+BeY|_K4GqQSDbL*$p&1u_1{`pgEo_&M^V6NMr>dP&OC;^dbGa#gy1hOMaa^ z>7H19fp_(dQ=eC+{0Xw>f5+>8QTs!vY`%oKl2dsE*y~nu#!ct$=*JPZJYN&liECy% zSJYJ@bZ;&8i{4Dpm~tA;cUXq`w~{-r=Z|3t#!z*7YNz={Fb0mv@|-em$+52XX^ZME zlN@fH7j01z&>ih2EiQ?w`Q0rubd=~4T@N|Rs*ckM3%k8G^OC9Z_uT5RQ{RwEdS~k& za2Hl`PHv7G>n?kVg*R~I!OuXr1;hu*p7M;sZnGD^3kZf-&bVT;=sleBoca8oc^cpT zthzS9AkR60FL?Og9JSgG!${)AY~76y^_4#V5ZC>?Uz&vDSzCV(6Y8CGYStOI}4=J zH|4ro%H66bADUY|Q$Eq_ZGV^h{fmmYGa8pJE$PT|%HdgrB&B|oCP|W5{{CB5TIxA+ z+5D`9&6;;Eo>`?mut*}I5BF5vu!07zXG!@}nI4ifK=$I8+u}_hVCZ4=SV7ZFr{O^G zxyvrcKt^(8Qc?%c4wnvcLK*PEapY*nks;5`g ztHqSJKo_3$M5R{;CJ~1$yfyu5k0wpGcZjIrKTG&^F2%~BA7TCLp{1!I!9>|ye?M9b zN$J8DEfXjMFz6`h#Kg z#|58yjvGT(WjILpL45cys;4Wg&IgwiIHU+4U8my4l>wCyt#>NybXS+5>I8@@h2fXr zEnYi5S>U#YglO+V2iY1>EX0z*aJif!=9ys76zE(-={&jANWP`E$;X|qD(ma&9|t7* zir>o_kj=OzvhFQb2Ar6{?MJ4*~<O1G#@;yif9T#rvGz?75SOQyr7eaYt?bR{FwH{GFpoR=*ET+p~$V zNFlioQTA|JenYcT)px_zrUGwR%)PgYSt$UXd3=XA3N=S|szlT9)+gh$%pmnJmqiJ* zl>-fzhq4aaVOj0Ci2GcYAWQo~m6TT(s`zH^8DdL~Tcy}W+qe*_>z%M@GwUFZ6`eu# zciBn6Q?W5p2#BIk#L!lu#AqafZas+o+s#^gL$xeAe@(U*C`f2}@An&*oGdHS88<_S ze`;GzjUzSgMwJVX|C5pZ#HJ9_L~k1cy~JI#pwuP%UI@C|TiejOdwPxq|3!S!{3QZGhL zc)#H(ONJ@_eMqPzxVpM#0ge`ueE~G%FN!WLX-ZUZWL%ir`T*tfRt+ovl4g|}JM2WE z78_d0)P{0COzb+CK(wXC#`FPwtgi|)rJs_@&vvgP_wZZ25(8)Wb{=r@c>%Wc>m4fB zFl`K?Z4Ld?WBFt!$(+sHD6!h}qVSccNh4f_%6e4B%Y#+4eK!qZ@A;m;N;K2LwVsk_ zP+6<_qswc7-BI)APbrL-;>!O!nWFV;xf}x8@X`1|qRZ}Bc6B9+K!U@t8nvO3A2Q5@R3D-FSq8B9{ z-_32P*$|l@298muq?`p;&9ki}!|_es00EWe;~Z~=?rYh~s2A4_zb}&2WdfP=)SHVmWl%ibpYz{9E|t87ai~-mc+{{QL26=au4Ne6qIAs8iYMgv~-( z!u5~>OR+$r$BNNcNia_oE>8eEhAzNE9*?uwBw>z>u03KbwWIBHEMS&9?HPD#Ryu^H4cB zqC_87n0J|X!^a4?1^X2T;3XId@|Oqaw-LDO&adf8hn=H`!ftlUlak^EISnwQL_b zf71|eZcUt6Z~G9yS9V%*Iu?C1MGS6ch+32NY9hGcl-G7Oi$0oHy!iM*vVPL2#t8jb zR400}vF-XN9~@L19rYGdJkjt@ZII-R5Y=lAkRmtrS3|N}#%q(s2Gg=t zw8=P0A}Z4eOH09M=#nr;)B8rp1q+vbvk=ZgCP?{Gpyu1natEgZ2z|B;&*F13w~|DeZVD?rue6svaaYYWFKyQ z{^Q>ZYw*bC57tOQNsgoUz!8{GV@i9k7+acb=j33-1hs|kZD2_9Eb?x5Q5&Bg8`oaK|h628o8MBm= zgd{J~W%Akz{LF4^i#ej<-O5F1{K`*F#3rL+uA^fVo|;Rof!17pHnsBh%iRDZVz>R! zuNTSch;+9TlU2KGTOX;n;&tSG`SYp6cjs`S-QrK^iTIJ$F8EHC%+wB=8wPJxnsw+& zesH=WdIO8!xjjIhMUbb|0e>poYRN|AP@AaHJpDb^lrf7~Idi-wH}W5=dJjiw;owMcR?BtPJ-7u%NJruXWpV0FVi%*_Hq`%qbreG=S;_Y@RkhI>tKP77d@f?Gjy=~~k3caSE z`~L#~$8qOC6s+Xz?@n0p3z?Z%DOybVYgm_@0~p%vcHw)FV0zX@YHc)tGHkx+?oX;sz2ogF57G*n=4u(gV{XQ+9pad z)-j)uqgw|clYc7K>SXJj<%APa`d2cB&s=I~6rl{{`7 z@0Sh(=?z~FyjMHzDw;YKfX-#ePNHo1NmqKhLPv*%8RyJI#ahc%g*R?khOWK={<0nSiMUA=d8bi3CsDkk1)!$K8A<)G{5}q;LkZ{ zLff8JruyWq+GVY8-ypsGlQ0YgvPU5r!nG#kW&+BkW|>VHb1&a;G5qf zj-Ij_5{tt81C6dF2CX(8W$N#fGF;D<2Xb+#$S@&Q-a8dcu8%U)Enaf+l$0^ExgO&=;<63S z>6X0ZG)L*cwWzr0`BU8RYv#mmvJm5KVl{7yB)?aZTbI@}H8$72HcRs{J~pUayxK}} zGrR~PHoJy4W~BCkT_Crw;ua?0&#tJZmmGqB_o-)Yf+$U0?8bC;$8V&0Z`G^e4lN;E zF?|}g7QnY1O_*sl&ij(@)O0fRb+y%ywU*0^dHvaMTE5}UB(s$wh3Ik?Np`ukLg9nH zNTxqzRrjVdn@HuOFB{9zW*~qq+09^5+PAhpBx#*8JF>H_*3~C#(kuarh8cxiCp5&3 zAlGGV1DidwR8MebpTCD2TkEl~)-GYB;PdKJJS(Mok5b!*QcSUM4AfxD)VY8>J`aZd zt^InAe8xKTTx-Eisw*U>w68hePrE@znVp(5Jc;KWkn$x7C1UgIpF;WtiAJH+Y??mO z0$rX@)>#}sUJtoZ;QkTk6gm5KgmD$j``E<@gGx{%x7}!x2s5&MJTOz zMy^T%@^TklggG3(3mfw_#3W+!Cv;+`@EYcwL#5Zmv=AL3%fpyl`Ch~IRX;e6 z?T(X{H&=)lJ&Jm3`GZ%^EZ_8RcnymYseY{9o4?I`;xzV({hQM>sKYm272MBy%A2B- zhH_`1%6+|3tN3PR(+SG=`y5RD$FG-vV9Bf4&BBtF>2ofd!CHZxEfda@K|ONZ?Nerc zd*3)U_haSdNL<R`-@eiXNvsywFwG7P38@Xakzi#ZUhMRBwGH3Y}v= zy$G@M-k7J=1^Jnrb!R1)+8?>W=tg? zA5Ss&-ltDLSEW8X=7ipcj$Kc&3QV!C{s$;6O0aWIcp-GEJ9RZtp98f-Be^dP?1Mkf zH`l~pmY!gLw8h56fU9mDGWmJyjEa~C?|4W*mM3N%QCvCDL$Vs*N=@@)xsVGUn~2?* zko3?I_abdFMJk>v%C=v9@@D=mroXnu{~N28!P*te*NQX&;Gmaz3^r3Z;OBE7O^c7n zb)FYzI&C{-bN59EidhTk{0pe#Zc@b?rby;b9vWFZ&$9!kgVqc2cRMQh@z zb5E$>a>vk20x2o!qzf%%ajS7h8;7kom2!c0(`8O`S5}CJ{Un@-z_8Iyw1pk61|K)9 zsj~%cWd@nX5mkrc^NTQWQm_$2E8G!FKl%N-b<_*92`~As+P=-7A_~wf$%dUtQL|?* z@nh+ec@D?QDiM=rwnesn-O;=$Mqjzaqx`*_5E7alRyQqB`VHLdpEQ%)_o+OA0v&4W@H|* zxhlcx^=Al{A=y-CYMN@XS8J1)#ah-@CyFX2G@ZSeydcsvZG&iZl~5ObVc|@3VtCo} z`WhSpFDo6ID}2lw5LKNgF_dei#C`7J`*ElV{*Wj`bJa4DdM?iYw<}^dYV-Rxi!lH3 ztEdleUAVi`{2PQ%t{s&&Vymhntd!%tudQ<+ArNO<$7B_&3u73(xd(CJ{z-h&lFw(r z@2tkd=L*{^54M0~$Yrlj4KUsJ9mc`8lvKDe{#3U#IaC+B1Qu?dM6lYI2a(**aeIvQ zS1^+fe%kfVL{WHr{`KSYN3nYsTWp!jk?Fx;xA+QKf2V{I-XzaKU(1}~c;UvO63dTx z<9~o;jp=vfcBtw+WU)7T{{i%aVy30$Y*Kn&c4AigBtjiG8LX;;-aM5VCo5BtuKVo! zU9tVR%R1q_WUv!$9GK6sU$8q>v^dxgRpHmOah*_ihK!D`&OyO~X!}c3|f}&kwX>(=(x8HUTuimD0y&vmQ1DE_{s@P9U?c3_VTUY{PdKO5>B12zWl8X8E2B$ za+4AVq;xkryJHo{;+H5A3YgT)ikY=`*jUWn(FBwlbQXSmYjYEFNS=!Mt~u*c=iz8v z;0bh!De1>rYhM%;QlQ1m?Ty!=k`*m*zte-ogo-wpLu5)k(OcEbRo zX75ZAIDO}=LO74W2Gpi6B&<++Uu(Gy6$>{m%Kx}^`=-cs<&bYg8r;aMcj5-U_VVoP z$KNe!UbI1Y0+%}^-v+)okh*^^k*^p+vZkzBjkx?fSJBKiXuFA}i9R#JgC`!nBu_wr zuCq_>=c0|5j8PaJV%tieRHkyk>sohbJrV7G`{jm5{}65q4-<+ zj{HjstDoJcj&B-{3tk)-nO5|PUmk$W{3PBLz~f!3g4hjACVuB8xbve;46|lpcDQJ$ zLvR(v`?9ZVW_NZ>E@KMF+6l4|YGN`gqT zXy#$lgG6N)&d|m&qc5SG{R#iD1MQ1hW*$tZ1kcC9g$I?`{jS&7<#||o$AtD6+ZUW0 zG$ik$n?EVJ-!7H1tTxcui}qYg4^%n7Q3W(42T|D(D{(jHk zb{n^73ccHm&~<6nqiN0~CV(FU z94W};DAy{svCr8Rg0)ak9x4PMwV=+1j^s%UUu+%{6hucg)Ff%=~p(P2Wz5~o|_P+JnxkD=}g5e&O=d^O^VdSpj((o~Lw)T2pPTbc!z zKL7&|;DLNCAMebKG)2V~IYX&pjg@r6ZQ4^0(dptM8=+M}vk!GNCLd?asmWqXli%Q2 zxgrp%8f;mcd;`H01|HCpXkr94IKZ2Xhi0aR0l{kQX|BkhqNfl~$7c8}5X>AlDN^XiryYgH2mjso8(Vbo|VHW-iU4J^~3 zfyeZd5~E*ntfIALx=Q)r8=Q}9Ir1m)(>|p)_$O`kZuPP?iGi3BDL0bYP zC8dtCnne6oykFkg9L6V~V#r>75q%`>b>q3!#up|UZ8M&i&3%CfQve@3<>~gM06OfXn5D(4`|%)r&~u z!jQuahpqreqor8);cTc$z8sD;?}@={ib-?(=xe=;Uu(6#{UL^mYFuv6*|6cJf|-$P z=H$BV_aWz~{w1}Y#XO_!8QI|>^K4~C^d|!eg8|5Gu^MUnn@nNgNqB^Hd^wh7a=24K z_3(yb5dR0wjq(r93{za9xeEw>lykkE0APNmWQzt>6VY@Kjfn+PHqur@xJ+Qp?TAoO zXg2k8RZHBv?`($BZ;7tu1~IG?kjyT%ew0riw$Nu=PvX4d&@hJU5#c}^fPBB0f-bY$J*7oO5jrfS{SxKaSD!_xeyqA@C zD+-S!i=wU&hc?~fr;o$RZmx8Vqy7@_?u1z5kSyc_24t)2ULe=3p<<0d%)gYVUmy?5 zKLxp8)X>X05^kT70cW#zBP}AaP{%VC=W%m02TgPukaFy6#|!T`tcS4&mXhnV!DMm1 zypM`fV{x{w2%uhH$Dwh(VmRF=qbJ+DzH&_Pd(ijr$xL˔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

    qVW;=5OZa<06otiKYr+(r2{nF8qs$A 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≈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≶Yu-!~8R;;J(kMn^iejD{ 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�VVnUMj>HwTnPG`sRd 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ʸ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


    k%?HEJ0V=Z?|I@j@uzM@ZAO_tib0KF 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 Ll3oQjqAw~%k6oB5=$(-HM6 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­<$dhFW^8aNl(yRr($1~NrP#6b)86jxCVLOC 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≧|*l^1^ts-Q1`WZ-Taz~4ir65J|w~@m=3TxF4t;+dr z&!cK{MvJPs!B4w(ngx$L0q^XjevK7zKgr@3RU*JI%0?Je)xnz&)djd^4y#T}TfV+7 z@}nc|1bWS1et2Pz4T0uPPsip{t)bA@FNCshNIcl*{vrm`%Z~^>a(wx$1a+!}^?4}g zbzQQ)8H~p}=)ib33Omswq+pHOc{zN%di+;?S$$uhe<@;r|Cn+7XXvQ%nCI=``Nx~; z{|=A8s{cCfyJLH|$^uWod`DvQ#lqXdQ*WY8ixIcw0uy}0fChMAYvw3EIMJUwOPOt8 zYU-*CvWXXi(Im+B8tAT1i(!HBFy9lm?n|J)Hd!W+2bItb%Dr2GOtTbfr1Hh$7Wti- zf{icV8}n!lP3dsEu`}(U6XKv<72S((?^s%)2oRXBRDs3R^tiQlB!F&q z>kcP|`<3zSMypaE1fMi2Wz8w4bg2xI^t?kcrtBhJrfaD}5O;wGPKLwB0x#DGR9w)L zC86zRydv(3V+oE=l4IUt)^5bEmiJAnnemC-Xw+iAK;w5(Z&(g$x;M7M{!r(7hsq-V z{&whcYx@IlC%VbW+ZtcT`nCZMD9rnry92>3O`x!AS@Z|F#~5gf=5{4OL^t zCOwwpsB!fci&oZxPVr5mnn~xJ#&dd*aQv9PkUASBVaYQXbIca8gGnj-;(~7cvsq3KIW15o;LD z3FXXCn;^b5OGR}{LST_@0xz>u=eP>54B7ZWHZxNxP)Sp6QL>_pd|ZbDiY4wY?k<%y z(|F9nqLc&{{j4%dr-O1wCev)KPW^5F5|$?PvF4YGzs;^1jV^}>k*d}R0z*bek}04B zCGk&2@1^XBm0h&2L~o=q$QocNo85j8Wma8QQ=^EQnjTaRtF%6C=qzoS->fJ7!aivK zy3a%E&0i0x0uPv0fZo*3)5h$(Qo_7ac22f=T}6TP!#=CcH%e4JOc@0ssWNaVGdI2x zt+(TZ%pf>9AjttTaKwkiAQG&&HR%c`pR3=?>tPk=H<1p!ABi>M7;b{SHeYgI9qj4b zFOO!tyXn%fVi_S;o`+CtJqR0b9++PVe=+LKlxOG(4lx$6tn?etUtw=A>d3?MG|uR- ziT~#i&+oLh@i{6nIVnyI*w3pwV~ij|PP~63O=eFFiAUlzO;cmih4ufFo~ru!DvQ{o z1oY&u1Fv1bn@;!Rk{3c!I6KfE1t*Bb)mKJcEZtu2or;6|JUsW-LEI6+Zldkk2wsH8 zb$?az^ebreifS2OI$oS@+Z%6}f~g`J%kj+69KpOX@($))Q3fH(P!VG8vv5@w8xCPl`<1yJ6? z8hAPkXL1G+cLt;fr=Xwd@o&&?(QziNE$t^OYs5X(XsZo#k{f@>^c$BstzLu+s`WJ6 zj=40|xom*>U=#$6pW!la=G=Z)v=ZfoaR(#r4}YFJFM z^zF~{Qsa$c8tpq3P@;FrukCVxpJO&U^!RAA{h+`7(W6HPziNj7>XmED)}_jKfBG&} z9vr8x*I206uenyLqT0R~9H*3Ti?9P~iK2yvXGpQSW)3<72%17-*K{or%lf2C150jt zo@*Q};UF<6;C};gXSBb6)$b0+cKB@LR`_gPean8>=+5G5#!^u@r#j2~+#e6l7Q--t z{yKw@JD&KzfBt;Sb_xYQER0o{2ef8%eUd4s`88c1HXgM3`|5Ra{hO!2o{kcL_cHVt z(Ef3>2KdB|lGY+UTD>KGCMe;$uOgZ#lH_0hR$vlKDr^_nIuiZ7`9krNz@5cSYWIXS z4<LdO@gIc# zrl-EK!h$;JlUCfIT2}~$8dn8xu_SP#QQ(tsLcteKN$$bk<=Ws2;!xt7_~PC_aE!_7 z8_j!3{`m8?+YNO=k6X)1=lNd?O@w)@{{HRjcBqsf*Y-Ec@T8}?y_pHNuXv-B&e*pM z>+kiPZLO)Vm{jyz0xOl@thvWG%!NWOBhaf=n{swz7vczG3a$l>^}*j}THKw+7-^BuYyD<}J_kp=S8K;YuU~e^UZg2BUL)NRFJyeoBZ7_;mcH+X$OODWm?2S${pJf;K$dN?bMs?M^7TBu2=X0HtzO^-c8=t@3hP-pnsZB7~e5l~dlkPO- z6~?#S5bxyf(fwett8ie>E4`vw@po(yQ-Q8($)9e;L$Dlg;S`KzyACDCeDPQ$0d&wkdQOiqS1muaukXlg_jf$>e zPeQ>FHE`rq($9(OE+#kT(>|(tPV@)Ghg*P>AW!d@^T7>w1)Z2dm`{cC{IoXR1I82$R9ezrGK{0;H`Vmyh}iIbMA4U+C; zt*(Ydr9YduM{w%}OFx*@<8RW|U{xX(h*Vz=x0Fpoaujz<%OHE>B`*?q#V=q}bd0a= zL?%(HTseI*k;LIJ?Yg#zfAfzIH|&m#aJX)9h=VgpU*|sF_%0b9X9?}a5lI^+0k6u# zcfPnX8wTcqS4T!SR+Z)s7HeYaI3+AT#(gJjeWt50#OOVOjA@iHRZo3QmIowO^F5Of z?Eg|XG(V)7u_p*-M^~Fg4#a@~l~p{HRX{-4IF4K@U5fjG0Ado&hsV==fx(Tj(vlGG z{?@fh?HcCDgR$q8lAPT<=NgPxKHR&qixB%&rBLV^h#>TEO7oeytkG{J>yag83QsoO zPEPY!Zx&IT(jD>g>83qMkam8KZck(-tJXM!2<}B~mP+bme)>P!2k$GHy5o zws|sygxAx4Wm>w1_EwF#7GrfZBBe_d4_4#$LYgD?8`j-)g^m(<*Umo`z#cqp|NB&Z zzgB%8xG5dZ9<9zEoqZJ5{y)JQh}g%$e-o~5T%5i3Vn4=veB=0=6cKfB1M-YYwq{6Q zxp}F}an1tD;32E^gwv)Hdri#|LMJQB+Ctt{gonRTnxB8p}Fk;Xc-v2~dmvr5H@!C>L+EPZk+&I7|6c%1H z+aF%v@od{XUD}6lWY!L_!DZ)!@pL@-n{XpjEd~rn@cb6wF@sqO@NuQ^TL`OPe*<#!21c;&=|SCwdv z%01p&INbjCaM%8tbf>DF?M~&4`jFF;hV8YA+3D#9YXpuFp1{BF*0H{K2!hHG+*R3O4NT4aqatBff;%2b0iMAmYm~nKNF5l_%*Waz$N!JgqI)vO`WtT5|E6ASl1f_C-sz&iJp&l7vzBVZW(E;hpnU3NTNBOz!eYphsIa7%lncR z`HRWs!i<9|YPpRS1LTezZ;06bkhUJNx7IA16~X}m*>}MF?5HMzgUc9VJUw62pz+D! zj;7`$FKBvYB1eozT6D<8$?@CD_P@V>|L!o13cqY_qHjBoR_S3&Lj_N^)INbfQx07T zUv|RRE)xPR{L)>a9hnSNaUH){8At&ajoq$0uBE#PGmy_g=bw^|HF#{~#@T^N3xXiw zKACX^C9FWe6D(3@ZXj0o+ZKeAHt9;ntlfUM9UM<|zxhM1nhyyx6g6`!eDh~R0yr2L zAMZr|9G%(E#|ZC<_{COdf$~H7c-Pd)PQ}$xz#R4ubZ3IHrSvpAnOv{nRP@p+CBH1F zSX2K3pUJWT=2l~;%!Ub14aqR0UB1?B5n$0Hn7&wZQGjUA3bRNHY-*o*94`t2h!6Y2 z=g?l~y_lX%+dTzw~bi2(HSBVIr6(7UN$3D_c{~Ne%_agt; zES4SbdL0wKAFXa}i$GX?xHQ0Ucx1ZO3o;!?B0?MoUX}XgxW4kc?b#}7iq*-K4G=(p z>MIV%BUU$+m+shw>*0Vi4{be}M>bpC4c-ra|t?E6h7v+0+pF@0!*9E0}w7ml_)e9K4c@K_<$Jf==?aF$5PK>|ff+&thG9 zrEj12J=AA|C~!O%&&^uyOkxzV%k{r#V; zMkgR@{Om%lQ;D^;&##H0D9TlZVf@lgNZu$i$jn0FX(_v=j<&LMq@#sJVM~tc`4cGO zjP=>_jVJk?^9_f;sIN5f!fR);Bk3~3p)8;uWkVsq06cz!s<}DVY~{@*5DJY3Cs|r~ z+zO0G1WmGIG@dEv*k$iBPbH!H-Vuq(QhOVEK}2qaD9}@Qr{;S)D;rhjVZtr*0=v)^ zc94LjiE;6`w)tF5aS*EQ!?V19Hm55DSco8(2@Oj;QoJb1j6gbt{ejQ_MW*;$Ij8S& z$xo^FDYqag5K%lXHIFKCN z#i1c;;NsGo4Hr-8NfIuftcs2!UML07m>de3-q%(SZxZSHM&~yt63<`SHAnO_22Pbg z(i&t>dkd$eBSgE7C$C6PVE)o@apwlI|I2Jd{JX6J9>3emo+1pD4G(KY z^lV~Q5^V4$;lzViHrhDoN3mg*vYmNcFsK89$)qXm9EP^Cdw8E>Pw?C&_iAD-o^f)| z6)vuMv89-sxTL&^>g+Are0R6%_Efum#XD13loY3Q)=Y%LbNm4iD+9P@KMG{Ya8FA!~d3k z{xy>P)2>|DULJq*nN$1TvSr6{F4xxod!XljPlxqq%|5zmEOZo^Cz9+JmIcRfYick9+lNFo`2j^`=43OOf` zG7eZ$*$m7rKB(+CsULi(NMmIW+m!aXgary7eH&?Mr_`H>H6terXLB&6Zf5L~QDogfko>zTyEv&!F6QP7 zgT|Kp-4o*$WTZIoR!kO1kWP?RM`0PSDX$nIhEtN*;&Ib)O)e~miw02Y-Zn%Jr3si) zzo<|hmiu~Rc&jsn_;g30R7T_0Yk$yS?)3CPr@m+%S+Dt%sRKiI5|*L=PR5|!y3o6c zRwFyfCti|XEuiRhh7YX49Vvaa{*daQyQk@Q>~j$tPkO_uG|f|jEhd5>95DI7ocXTU zw3(D>dV=TUkdUK|jm0B}Cg;V>YY!w`7zLFp1$K^;>D4I?3xsrG6U14E)_eJK#2=Pj zoF`1g5N;?N{xUeF1nX>b2QA_+7yXEiDPmfn6cgSNys`@O6Ft-0mxh=Ne>faFqI2 zG7fG4a2QwRH=)ETx3ciuc>VF-Xsx9=0RyEA2>q6wTiU* zU~Nqz=?^Ce+08xYV$QehDOLPNf2j6z&|>h67eKK8Jek%X`aY@;1tAq<^930dWp!hN z+*y|CDL55WKSF?4zxy@)=^p*=-^DBc{@o-!c3wSHzw+XE$00mBbXM>;!nYyn$ZhxF ze{c3cEl%rig5JwGkN-Cd;IZw!`*m)m;*ojNe$&~*Y1_51`6;ga#DSAg2nLwtmgf7B zMKN!|IEc%0_(3kb3j1|unf%MJk-3>>cl6D#wf)|>OJ0;p;jvNs&feklLcg5)FXqAW z>A z4*iW9^oyppwCU*&GBr=?cTp`IP^Mkk1z~oJ|M4G=)@2pgXe40$`^nvZd`FU6%SV#U zP?y!#xU~3m?5(nY{+)Oh`ALz!Sl2%+x0`tSG$1?9_|h*ZCubB#mI=2^tr!W28B)&9 zQTsIy66I~WcLz>-?>lK{eu6}EHa&qbhn}E~)yrMZvggF zv-D_7Z6X`>Uo*&&K!9Qwt^oNSL_FERdh5jySh_X=$OgDq+00q#!{^*ruuIfu^<{>E z=$uW?0o0i{`lq1}`lDWHe=~9t7E#;#+%@lddSzSDQ>9&nLmvGx^n}h$>554XWVQ6W zo+KFBu{np)8mUxPdatb5z3Ef*-&YfQ-)m6tyOPEhtNXBz_seUy+9X9a*)=YR^T8~l zQgnYY8jHnzsi$SM^vsM^MEc|Lz4~%8qGq01=Y;MLwY~qH$?0cu`r>A6%TsX;Ba|T& zGueN!L+v04U-F$D$8*Ap47&74Soe(V$~khEtMj0=Zk2v)hfb>M55!TZk&4nZC1CIOUYK>7?4J z-N-VcNVa6(cS49kQkEv^8%`QSqTE1mLz(lV5(58Jz2l3I|76CUQJ{R= zSlMG5)-v&0CZSOL5^^xU+0*%lSaBr2u;c<`8og0fJz9W$L^IZ4GGw*YM}zyLZV{td|BPLpJu#h2Qd^X@l|t{91l9R91;M?f(RaHO?%>>BZu-=1b%*$F;V!r_8nsWi zdk|{{G23pA1qqD7AL0FjzKzAe#_sAFo}W$EW}h?SflHfS+ndJ>A}Url)#^AbFl2`? z-FNmJVRJCZ-{0G{mySBmcqvP^LXF8$xW=otL)n2A6f1&+$lF?4{O;V>rs`NR=6f&Y zW#vZl*J6oiu8(qNYscX(>2ad5@G&fgfVnszHXYIGp6{}@3{I~30&b6&ykwlQKwz z0|S^D-deK)=UctqLl_temWSYyrf4LSsU#~>fG4fdys#yc3l4;E;@|I<>dPaECFLbS z_r2A%a{~*TvI1WSydQ(a=*DW+$!53%akzkZ<$cdHT{vv#ZSlCG19b~Wx3K}WTsV6s zgaU|3CQpCW5QkQo>upB{jV_k>DJ3F@ac7Eqw&lbLqqjA(mbsj3X2vd>X%s-XX8ztY zzF2jomMjlq#%}=mh$V8W3R$m90r@p-T&$7o1Q9U{f|=DTt&12hR#8V@L0a7-7Z@Uu zxJ!Z=$LNu5k_`Xta%mIp`lr2T`?~tJe%{+!8bSBl}%5isd3eFe@r65y4<` zrvatqFc~h#KYtA^bT7;NZejbxk4-J)MGD{A zapr@+)!Wlq-{b6JuF;~Lup@?#=FER37&_s*IvwpJ;WG^T|R{-dNCC0MvvO zqnppjNX6y21OVID9TZrQ4iZ2^hZ{gGP1n#jFyb)`Yq?@ z7o)ebfKYBUnmhZIb%UpXv*zgF;8RFak~i)%VKQ5&{&L2gjnG3iXQ9pMfN*+AquSv* zmz%Zmn2PG%P@>@Z;HzVV6|PCo`}0@9 zZq{P<7*3x>{^_T>KY<4Bwk~t)@&C5B%(aEmq5O2mX*KN1P*F}B_OFizF^Y#FTx8ZG zA(1!r1mr}!G9A7ZB&nkAuMWK}w9%xRYs8?qT(n5vY|BI5(`M}K643)pZ!I=lo9xn9 zuO_~(K6)*;Bb8>K&cI=Me%lZA&obtrm@@**H!%r7lS!f$DbO~(BxtGu{9OW2y;td1DG3I_R#+E0cjcSDg2D>Stce` zAI1%%CRUvfHoAt?S=_$HSt?cP9^Tk-$6R8r!TB4DB{otH&OkNY$vYnhLw9{E_s$sn z{lGtb-keMHVhG3t_*1DQC5?wUl@yCcI%|eb+6hhU%`@yo>|&FTt`q(M#0aBvkq{== z=Zj{Gz3v5tBW^dS7v2U3kcu5f=bv#ZKeXlb{JCP){>=`VD=JI7m?8pUGx~>xNag@M z=wLh)d(F8ii-Xaw+FhlX!!5xS%-|cU(m~GM-bLVfXY26a251($`IEgLQmEs(iIGYzD+{PfGo{L-M ze`yT=nZ~32G1(-m@mAJ3wJJ6_=6fbzTAp6W`WBKz#^GHuc{f|U&*?Wo$K80Bgc>|X4`dU6A9rsiDj|HCd;6XzS6B71nul{oA>dXa4v>AvSf%YW{JMR|2 zs_shzYS7Es3hcRiVKBez&-OZL`<{3S*pMT=UD1Wd)J28{CLnXsp+@!@g$b~_5N#m5 zdVv4K2e6fk5J?N1+8@8HJsy7heRz(W=koB^Z#D^{Kc`@e^WhxM~&dp=EwPgP0&TXQ;rsd3xLw>ggPYMD)SVTNZq z$EW3kgMyy>a{l;~;n%i1?ma!fS#-5_D5jGpmnhQXEa<$hP?VW~Mr1E8__Ry}#`KR} zja_tCb$0newMZ?B@iQA*9lK~1m1YI_cuojJExizPehLNBX`i9QpjNx7<<(xb&;pn@{dh0e_Tw`G?-KM*M-i=qxC_Wk{(xCA zG{+heGbLh3vQ3fF@WP8%6#q5ouuDfLtzM3|Fwd|7I~JT#7A) z>xwxzddi}a0FJmya)jXUcTm4B&cRWZ`+@EVb@j<7W{`Ags}DfQfgAqa>awDX-jzrF zDUXQx#h7<odEF1(FL|!R1#ebYR^B%+b;7@+#d3;h%JYr{`ikD526U9( z1XH*J3lu~NLGSxJ<1<%HUNy(Efdt;w^0OvhrFAiE;mNPa?95aFX9-6OFyYZBiE5}m z;gD9D1ar;Ant^MG80Gj|*S*089UIp_^?}}2bN+bbl7Z=|0H|<1vuc*yKL^+}F)lk8 zYo4LC$*}>Lo5%vs@?CMMmjI+9-Z!6 zr0d+JYYa0-nI8^$x{^qIl>Vm^sYQmu)M%VlQ1TndNM{pApCnr@K;oXJ75~dlSi}yW z+Hrix&%$#&#=!YizOkk4hvcH5T5yTxEiK1!JxzzSWB_Y`AWL%U3apQM;XO>jHOjjU zmNo=~`5I+euu3+{NIz^4Gr;o_*;H(vK^@arlW74>^@Crn7plCyfW`{TW4DLhjH#^i zF6oFON!H&SYG6Qq2@Nk1nIfXr%h#QF3@5d$1vNb)N^synP<~WVlB2T{fb|9;@Mrd1 zF!`e!@&gAM@~19M5CE{y06{g6W1a6Fm+kyJ{WsR)MA-D(X`AP6&Cbc`-|PRsmHVH~ zyiGNLvSmUz9qH1+hCvU#d1?3<`^_ zEOxi2&jJ;sOe9%F^Z0O?dN9;%_iLI+VFZ_nO_q!S>lVMLbF*srp4Zc@$HcDVVVR@f$ET3i$ zB9XdZF4IVj-gI>0pKTGjbU#N&O{j~xW7qAuuVz8FB}s;a542EW*i?y3yp~!xeZTT> zbM;BV4Xs|Cshz{-k^wgZt|5H`?~+foC5UbshBB7O__yx3e1RNp&%agtv$V0$Ho_#g zc_o7u5*B8}o|Nw=-m_58%9xU11DT6yBV@lKP05tTMxbK4OTiM#-Gkp!v|47w^bMfW zdThGTJKI6xVyJ#GiI-T z)NjzMqJ`%l5?)=o2#cy?i#<1D7#GS1u-gn8JIAb_*OSWM2XsprHMwl~7Ih~tOW0-- zz+un;xqp`V#gEm=ocfIoA6q>Y*&$!Si9tV4cam$sFeK?Rn-#x^F4U3GYL`CPbZ0b~ zl|1g(<~cn!xZ^n;9W0U}4>sFCc(%-X7=dZ=5F17@&gv+yi&V+jQ(9&#?l^r-oUOSw z=CYbGsD%T3K&V8Ljc%S~m-n1M?;T{{C$HTj!%0D&ceMb|7e)}1EhFCJbV=Y8W1+`h z9lFQg*4wO}ElfTxXzKF?ByS2)0t=9tN2jON>5mLzX}b}C;mYVR>|OIanPO|vDPQ&9 zC*9iARuo-j5n6XFi%R7mqY#xO0TCgMO*uNg>|!a_`NfBi^aphX7HS^~J+A*z1*)(f z^?g}3fcTK1EzYIt)0im`>EW{1KhhU=!!E+weP}2Yd$cmd$c)CXQ7qnj&f0w&S64fK z{aOt`I{@kk;&jGqUo%bBKgjU2SxX9&7eIt$w;hkByS%9*bgs0ke;r&qejLuT`kvqv zubfolighr3>9KX4TW|J64Kxb8#cgKr_T$SD;3V|O-FR(8ZJbl+X zYnFz&l5~QVz|*8(B%NOD{&HIOWc$kg)-8ko(UR5UPhFyR!>hIF_L~MLQwRIYlT$R9 zNh$>eocZptuvWE2*Xuc;uU$9{5G0%FPu2Tbd1sXHO95YvKi4BY7Tj5T8yXgd|G|J~ ztRV+Be+39;uAD3JL*7rI52^w)T$&`7Ve{$gVSl$fI}WoNtlyTzDxbd*`9QcPNrc3@ ziZCkyd?weWR?F0Ji|3gvc){nHaALn>%sI$9kc$XJI}4W` z=07&taYN4*1vgZ+$=F!6JXUn4E8qKUN~R{43W&u@N=WA2%wqI;-ZIdP2$`;zKD+uH z&1BcK_=j*8NzlX#T;u|D&T`6i1#bxp3)gYOt|h&0u*0Q^Vcfr1>j%I; z=D7!8od~<*#uaIF87)Rdp1v@1utTPiv3Y~Mjx-p*9TJoaMKKpPX*HVNjO;tS*C$ja zlF$7vwg2zY(FN!HA{*#@vq$gJQjaFhWggjlIZL=`FM`_D6BB8s3;n1%tj7DLvFm6+fsUzlKkLOhE~STMwBa{th;)_v9Ao>M|JyX@}~J$%y4l zOXLb}UIJlR@HGMJm%it@{Hn~}-SI|!_)g()5mKf&KB6l-xD*#WNLXK|d z?`?%}pD>=Z|9LILl}}sFx1F~A8LYPt>M6K$Dbn!4d7RTbj((c*j>-~UIBDF&%FAyG za4$ZbGTYd<9GhNVEZGT}+$)Iele$IZ=d=PcOf!KG`amOs=Ed0^6j3s~I8=C<{ zL{XF<1hK$l7+OhjRO+@HVIkY?9iQDNPBy4}fH4B56{*2O3g*ZH5CN2*tiDe(Z7gm7 z(I_*O`1cMS1kg9r!n64U49`o*0Q!cgJ>5MG3hY)4I&vSa@v5e_vy_cl$dc%=}O%=$f3 zGHUI&()2`F;_E#%DB9IhxWEh~*meo}=Ii=vMZVXXi|?qj`~3cM^5tztvC zRPxwzV7(h=?7TUmw1l`41M}Utba&|)TmX{H*hMz!n@g+?UOLx{ZYJU8$=Pl8d5&;R z!l+!^0eWQIoLi1xm)r#deBgTOI{Xu2D8X&w;;4;e?sE0!-&7FIOZv4p$)z{w^G0Eu zespvc6dw9ZIjL`RlW6G3{Nu)w@1`fhePBF&N$14M9v zNE4pV@?!4sv*-;jnkgSY!P86ngLJOcx0NG}*u-Qw;Y=%a>-H7~Xocxzsu~7Eefx1_Hh|N1=D+`2 z+v-ml&LHo|{*cu~$8$NnupgAN5eBQ$pUPyuRdGcT{F^);Js{_kxLPSZ=3zTA?RmIg z2D)6<dzzs;VC7us$KY-+J*_{8&;4LyGT-jE$&u@rCkJ>*AfeE6UV004lS@EzbOOHe@i(Og*((b8CQez4<}C)H zJGbbEl;ymr79sD4KK59HR4Z{kSU18vJY`G)j>){*R1Hr$BHH}$NM z^f_@?=DroaqUp^r?U$)%7Tmf+a0roy3hm`wE>d|~<~XaKE>YQM82%f8=ZngbGg7ir zZ<1&J-SBHUAHKFf&yA!Wh`uE7P%=`mL8; zECqAy+x*;bfE1)k2G*W#hpH!{FF^{X7k+&(G_Ae7sJ+`2@=u$d@_x66sUruqZA!jV zni*?OdTx_rSnP6^H~`_`L#Ay%5G$?oA%VF~m=oQgZ%oIV%c|?UwYU1hoLGU8@p;wy z=y42CHCX+_6A?ymRlgY45=SPZ-d?X)5KZVuIPH3Q)um5+inNOo|z z0_vN`YZ7(@7m|_|_;68y56_FqXnEEytk9=KHO->*ESC*&U+afvdl{1qSlK#@{ty)* zvPfzPgL>809`-g$`x|EG*CgyNA2r|NjTV%_R{a!{TMTtPUKQHDB4j)g`}hCMwj(q~ z!`+?!aD|j^+M}etu>DQM7a1D?R&Xa7+^=PUkQlG2Lpxe|QCz)uRDv}_==%xG-x||R zsqYecI~%-R3_ChX8B1mF2XQmKG;Q|COoI7_=)i7npMWJ_#`Mzg_^M zBPS(&K!}K^zyL&?W;WkDS{I&w_7eM$TbZJT2rn|56%I{h+2o6uhXR)P`GI`>xjku; zFKDw%yVO@2|2E5*eGD%&7SO~$9|>&Ay#kLCXM#~9e11;0NJ>kwT{z;1CO(2YfY{iL zkfqE8dE91NJlt_qHFLhS_ZZYi4z7c6idRRWpe|E9Kr;p6@uBlkHAP&WvNce@CBcUB$>TylR6qnuG%=&sB^O zwwR0}3QYO?FOY@MqOuN_G)KpG@m^R>J*6Z0hRm2ug>{!%yYaIOVjev?FAH)e@5X_0 zTWGy>b8Ahs&FM_|K{n54pXYT8fB)Tp%`ulc8J~+k7pD0b9=A?({ZolTM0C1+C#c=j zdRk&QYN}u6<#y*EuvKF|&tSJ;(Ua?Vgy>cK=M`i2i6^Fy%-akC{i2m=FNpVTskKVR zES3*619~f`x{WxnpdNj4N|&JX*FZv!QY!%TteRUwVp~BaAz9Wj9;jsnVb%LHAZIMQ z{>)J7tn&}RpXINs)yECF07na6_N@8ue2}gHDGfP<=-6vb;NmWh=r?67j~NOjX-OcQ zEb&kgG13_k*6zB83@3%@ee<&z;W3)hZ778bV~>NM8<9VcdGg?rlOc&A{vzVj$YhA3 zz}UoMeR)G(EO9wdn=wVNN$OkqzQP}!H0D|;j%P!2A*vxbMkX*XG=qAyJ>_Ot^s@jox_siTVfUU*u^%I9~5Im>^4 zP1D;CJcC)Ich+g9K$K$;q01Td4ayM6AGrHQ;6F*IE=Wh^V~0c{|(Z!5(X|=~n1_hqdZAoKKFS(Toyp7H& z3s-#%5L+~0z7O+y3Mp6_9K87Tm!C>GNfZ&=4^xP4nDV4?++fmt#16(rB3kbO8`Iu} z#@8hI4%fb9>1S4En(dZVd54i~YRN<*`sK0M3xqii6}2j@Q;UHW;A~>9A_6<8kyY}vA#UzT| z`?YXRxR~?ocqa)F8s9HjASWUL&(q26^H>NGT&eo9$e{Civa>e^o#XFjsY*$13V!Ok zk1on8O(S_2(ae56^7l>dz?~sm*qX>kSfyHp*-1IW^LPWByla=VJ(5I+e|fgBe`;4R z|44D$oVT{XfpD^QrPT+4iGlUAH0`A6{oniha%J$P`Z65V5s(Z(6kIkabGPlguP0eh zI@o-F)DTruam8l*==X14U|EikUPE~OVD(;gP@GXJXR2CP-i%{R2mdu?bIHuw==~0$7@^{JtD~7=CO0&(Vu3z}qB|tNN zR3i7D$nI2hv`#bITi!3tvuo39M=Q&BuDg-^-N%7ean!ztFRx0+z+a(Y-{sGYkhUwm zo_u-{sfCqP#UMIOG|b2`oJ^5`s5ji^1qgXF0sp5gqcnslI0ezgDB{5p-8%z9xB6dV z1k+*>BAg%x5KBQfLj(wZl(b5iB_~I{W>F>ySP#E`?aGj5_UnoPlAA9C95{x(!HV)n zK`A1fU9&d;Vq7!t&dMPW@O&hwvFY~H?>&ZwJbHy*qFr1mRC418EcxzLIj*Y9%$c0w z$WUSW>m=AbjLHxBK!V&g&#)dUw71%TWIFn4YT7bl5HKHs!rCKtU#*V{k(9|8$OLk+ zLa53ppvV{oF8M5youMQI(H_@-2XMr`412jTSOcW(EbPq9!7FHR3kOl7gYgevlwK^WxGm0=;+jMF`+sE7 zhs;Dnu&&Z&1MmT*>0lVgf|ikKy<7mD)5`E<5`#%0KA+J^&l#SKp>^V66s)dH7s5AQ zI{qyBQh}ppkFx?q>8qn};TgLZ8j6qXDl#H<4fWOm89mo%9*@azFoK&PTVh^EW@|}~ zPEhWZ&lDdFSC$PxSRz0=d+NBeY8sv> zX^~i|#k_B{GOX`@WT_8pOfcMf9U9Ua9^BSsg$Kx0!Qqi3t7T`!!2KK*Q4ExCVNLS= zQByN^n9Iol|B?Npwf~89Pk;VrALh~A2K!Q9j=j(_drw0^DP7%!9GwvyVRTTxJl)#e z_Irl?c*pVdR>|*QenNfdUYTb6N2;a1Ng9VPK2aS!(sTpY6Py z5dryHtMI`azqQceQ5)~Fy^6jYsa8B6pg)#dp(1iLqNgSzAI5~)Sauw%-+S7x7T){h z3xc8BV9;7R!h;X@J?Z!Rgp>Mmz6oy}B<&v>k7m%<_!c~v$ZQA-8G@_}4G0h}OQ=a; ziBD;sQE=3XbI6%gieKg|6{mkxQ;jv31bDILp`N|rEp3#x!)QoA1xQ}(D!Q!|?)VHFR zU;<7b#KlPw<<1xT2&Rq)WxZxMd3q~r(3836ctI41ABD|Br#&P3N0M%7+;unM;qw#h-O=*W#+dD-E)w^-kLDCoJqnG_Zl6M~qfDE8}1vX4QOri}?O zzca3_o@<^~TYhI5GDw>Y7pv5QhOo_L<28aS7#NGB)uLIYfI?+9y+3Mhj*vQnnlk)C zr$U-Kh`P4v)6E;9ruj=QA8zV;07Bz⪼2HUFt|hh1(K8L<5rOw(5N9lQgA6Euz<# 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 z zELa~KVN8a!92Z(siS=>1ZuZq5-k`g62Z62G(g(%yZ2I0+Nx&yUy*Gl%Q}U>$}`l!S@^1a!;ulFU&T&|EE3?*!fLpDc@9XG6N>A}Zf-Ddi zx%*KnbU)%s8O}6_UvXg78*q8#9Q}%D`D-%z@z$&39Q0+WlBkdj9l55P;~Hcx(RA6t zL}`C7!!~o}OYM{bIl^<;ou4iEkS+`k>`Y5;@_9b*I6e{`$ce-&cP%5#6>5p__m5(A zexNRz$PuQ!n>EplT+(Gsdhc`m^T#-$ZdYXg(=_8vhBL>3BrGKDpS{t&jM4rqYr2~6 z0ej(w6D)62GgZz!o00~Bu z$r1!Df!Hf}b?NR;9^4*0O>U>UXUGq{KHAU)%NgR#a~|hmLc26>k`WX{`F)P)$xT#16lW965MlxZPjK z<)Cech>ssgZ~h@F`O?@9hg4tm-TsCQ4(?c|wbD*bkJmbn=T5Ml{~nyK7tw-FVG1x7 zHRkF^dd8zDLUu!gyzrA<7e4d=B29UqetpzH!Bj7&jCDuA!c&1bld8es<+bqS-|(Qm z2U_%dU;XnJ-gi;?Y;(w*<;6b{yENOLq?L_dfxA=G%^xiBS7lt$!^-|P(A@~R-ha0`+})M1_@A#t`Jr3X_9e0M{@jY89oOeV z&O(&HOPY}<+v~@>F2vpD&29~R&%!visCmt+ZANj~`V)dE(&r0o)AlKo*kSVg>`{Hw zvnC&B%k!H^Mh8FuuertfCY6}~AMtB}07!HS>eY4rT`Nk*x zHc-gm;ZZF+sA>0C8|_Qr_RPh{q-X|Gb-?CV%ui{ZCwHQDL?TaUxl=B``(s3XOXZg{ zn_7=X6R@g=m4$->9au{9rk%$%;@WyUH3F{xFa3iaA!~VA5=_9YLKXKS-iyrGC$PeAYhgJ8j7jWLd~(D|^h7cE z*W2f>^&fS8LQ1DsyEvS+oX!8}w7=lGKdbC~A&qbq5~_u(%tEoko2awrK$+FiYTO7i z*r+rPS%c9=2NopZqf@=yx{#hOZ?Rrlsm?)E7OeZ;^gN?;{IvK2XLO=KXYIK7(+sk$RSjagfNLPa zmrnJm%d8J4CX>!A`kAvgyUA$FGdD@BIJa)B(LYICLlU3d$1eux-Uv-M$Di-syw~Ag z7lwBYs)WrYx|EabjG-UNpP$Mk?g%UHKhd35fH{eWZGMPmwBGu2Nwn2@;&7At>vVQo z!F}c6%E`jny3_IN(WKi6voE|(NoPNSKQ#!Dk)8bM~ggl$^uG*j^ zfiFGA?oJZuFi~mnKEPNaEVMVIN{!s>HqatPB(sCWj27Ug3+G}Ajsw@KffXjaNhE>O zUSUQlL~ZIu>SHn?qm$Z?H7FP zF0Bb}N`@FJh0xSm>seyJId?=4(RddIv>=q&;Lbl1DdZ;s8nSVfY-??NefZH~z+9k& zqq$%`3To}Vlu|FU78=rWcYkfNZ}idpWXU;Ym~Wfc=F~bZP`v+OwPeC+wu4Um0#bf$ zti5yQwTZ&AYlPjUgjXVXwX{BgJ^@|T)Ox!s*2Z47hmma^?d^UVHsi}9SDL+!4i~fW zN!gU6Hcl-qEw-VK%bHHY1E{^73Mu`Qgw475%Dl&(6=gJ_AMQ6zpxuXJ9XGt3iGewT z1->^3IUfUlMys{8gLiotyr#wr&r#?Ni|WD+wmtV}Z-cl`(nIzVghN+e{^zHtPPp+< zOMYpUT{?JxN4IEUg^pLL(Aki7pvGjTMM# zM$BHTCFJtE0MnkGkB=+0!24gz&Fz#wEk5@8Ur_cnM625flXppGB}YPkbOt_%G8tMw zS9to~MWpmr>v-?xwJ+#a`RA975G-&ovPPbGxev54{4_a_6&&%_$dQ*fpkg-6(+2hY z2@}pT+j>EDOx)TEhi=)IpOrMWz$?1bq4}5xL7ExoEc4QtA4~Qp3PmSuU1|5m<8{~_ z%@{eUPs1P7e`-F8dU*fWw_F9*QioaQn79w@X04XfOP)^q4fRQBTki~7wXAyvf+z=& z(3pcl$s(ozZLj^Gt525pH|8Bt%vtnI$w@3Vb=`2i*7c;lW=lcwfTDOi-lG16L z8XH}V7P^w?mlX2&^nie9nvy8Hep(oll%1d0i}jx%Nx|+u08BM?siT~om|H{Gbh1j( zt5!vVb+|TnvZh7Q(p+!HrqE&HKU%TX#6sQ+G8a8*MiOz>R3T>U7G_>? zl2@SdRsl@ffAS-DSB0xsl-N&bdZHwK+$$`GIfx&-g)&xglQbr`_C5Po%)`s9R2OKK-Jh zwI$SX41-}t)+3E&%2m`v8D7HKrGAQDu#h2EyT`fsJ>yETgMsX1Gu@#q#!L*eudpe0 zl193PntsvF3m-DptcbyeGcRRzBnZtpuoE^q{B z5uS&2dSBuu<~36k;YVI~Mx8g?gE;qTst?T8s@B8KIs)hZX!VIl#bOx{l-Ya}u^GYt za?+TfPR|Jr*DTWb3Fw>$ft22@vWWn@KbgcyPUn*s*bH58mw3d<|Ghvz-#QK7#Q{hX z!2YL`0jJy3>}UttXtwt#%|2)o`{6QE;Jo+f8_1FH#wZ zpkO0wJxQ%fY>hC_ID=B@qLGS$GUu1bPY8V4e0Lb3;Y)_HYb`tL?k*;M)a<#*w=nqb zLU^d!Y0k;Q^3?UHwgyYqvcFT*sWnoR*6cam7)f0{aaD}pQV{oxaNiplhPmIr7`r54 z@-9;(5fwv;cB!+=N>};t3-&>vG_w^V2vMk z_VwS@^||0@Q?zBzuos=|F|uXKM8hux4eq`&U%KH6tLLb&shV(S=qwl+8tWARg2MR? zR?04+BRnzZB;a4H)O%`eTPhP}6|&Q7Z-%BM%4m@;Fv=NYH$VBR=wDNhD@a6SRR3S9j(dnSLvc- zZU((DsVb>1M-DrCn-{<|KvzpZsLsa9rP zK&dQY0?S>c(P#HC{cz@Cca1Rta-WYhROa@bH|Br^fDeVQ={cN^<@@w{=nGTM3eumW zb=rDcI^Srb%bOusHx?+B1JzO(& z{@VZ@BrQ-@uE^nrzPGcuF2<{mm~_7(v4oGFYxQXT@WPdEKnx!k8MWT2M}9SpgjR?|3y_lb=XkBVtE^dj4g8YwLND zs68?SPnO41e?Bdc?g{h#Q-3Gw|6QXmPxJPG1ML_Q9Iu6VhHENrNxTTu`PrG7cuHLh z2#U^e6;u5n{sM!VK(RF_RFq}?6dsQe>hI@qyf(1#3cwiRz9Dj5N0I(!_<5qO=h=Qk zK0O7S6t~mAeMl?Sr_y$YrhF5^ss*(V?FYy5_r$$NyTv0!oEOr{nH;TiQ-q#&?+HgE zm=FT`&<#0_Xq|~c(EL1<1^lL?v&M$~sjAz=14689aP8xAkAdoNW9>UXn!QxIf zX{K^lFq(J2QYR{u@+;j$SG~>e#FL*W%vAkAkhypgUC5*cJJ-{54S?k#y_!cZ-OLcw zdpzD^Zvgq>{t>MEv#N zo`E}+Wy!*H?n5m(dU#lJN?f_t&KQ9NggwCU7>D>OPC7;?&aLWezbb?7TaG2eqNkhF z=_B&g%aoIOPJH?Wv=e^$;?7z@@@9dA-+={Of(-fhBWXr!P$*L>_<1(QO;yMUj`vR} zgg_b}rfgIOzxe1~{^S&QwR1eKAX9axz0gbLsr$2$FjjCS%l4UV=5U9f%!W?G?4@ZQ z!zS@r54eb)-3OZRct=Z z^aPc;KtQ=7lZzu!7+t)2YZ}_2PN1e<;A?@ZhRiuOI3A7`pHbBh9*$h+d0FDZB@a2FG(7u@hfhSr#nFYXD#e1y^=NeL*OYi8 zJ1b(P8EjtQ#oNlm(RM71qvWO@*?5OhfD?>Q#cTz*FYg^sJWy`OYKYa68IT#^tl2(J zv|&=cQovlz!+Wf*vg1gv*&0Rt+)PElqW>G2i$a75CAg)q3;$XVo!R%=JZg}yK0G{B z0YHp7$b4SLV*$;vbP$VDGTdpdZ*6UYY_@hlSzB8twRd!Iy`0d66G`iVm)kdwURR@Q z@Fbg0#xlfCA(q{#JIXg-tu)V*?h&;{jJje&q0msMTH(q?XnmT$^ze!oOqBJB$S29Q`^NF$M(R>k3XdM|}kr%c_ zMOv3r!{@*en+Y}wgy6#?(x&+DhNd0l;)3YNG+>*$yNpv*ncK?nupkP21HPi|tW%cu zsC&8lvSU)d>IL@nCsNApUf;0x!Ah18b-#uojRY=xkSO>Zvo@!MQ}Kf~Zhp|q zL~BcHZf<;>PkPwL?=DxD9=$&O3Lbe?K<3PgvH%;P5y|0^ch5!$9k23qn6EOHlpe6) zq`q?qUr4cg(&qq@geo!jaF)_RT;v1aB$(q%_l4jC9{LEQmygPqSZ>3hH8?v-$ug}o zhVUK%wa)rqD~P)${#ec4M}p^Kii1409{a(!XH3j+b{%7vanH-cat^UJ`=7Xk_`@sxQjiX-RXsyZhRPNT@>!bSbl!Y_#G$ z{c9J2R+b@Tayz_t$mo9_1DcB&>=U41MelTZELu>L!r>)u}N zcjMmXMTDZF_EuM~7iqo7=h^S1trexN-OmkGd$U$G^Lq1$BvH41M4?cod>(X0obFTR zPWBHD4no`Y;effDR5)2ih)kiatAv{W47{O`ySKVHPUqW?UVfo3Tf5#p_j!q<$!Y_g&}wMqm;v%-|jL5JH{#`A&9>}s}2H&EuF$o z8&7z`|L2ZOINA9PtvS_t=&gvZ0nG$mEWc}FmlJqDLQP?)0mJ81Ma1)>g`G=pStYTi zRR`Xf*t7B&#kfc+jO7?-fevWvw66fAn6APyETjd;Vp09qjuN7x>+obA!@eRKq5m$nc04*{aW#+j?V(r6RUM=Yb{El3^acWrCyn<6_f3@jb} zUf>qa%*6i6^3KkVs|FD%0ANH>BEMF`>~hrRlhg9_kc@P2{Te;fZ@ZXT=M>Fo!yq)% zC}yjW(@fGb8SWCUzAP$f<7lbKlwF|ao{pk`oZq^+Ad!+W8L9g!k%n~RIVyg#H$(nXn7J=8!|0@?qM|L5tI=iXN!F7k_-?1+##` z2nIi;&y|rCfSg2oIC|F;R7^GvD!(l@K&D?kg=D7D*JT?oq>ne7ZqP}{8L0k{Wn8?< zB=rGmvIaxDg)V4}7T`exUDb!woL@nIMIz5?7f`#N9_=6I-g$oz&;F^_v+d?~80VrVOR7tLb|GYH8ww;1=;A6|UZ=*}et_5N*)h+iXUe}uGRl*A zc+T81yirpv~2Z3KuA5wZ2etT;Im2bmZvuNfr#Ms~~VVsHx za%(_cG z%k++Cj~h>bbra*Zm_?xMVEB%q9ur1Yx$nIIgDzYvb+HL&=jcs7dl!@KO4%1kG~_0r zv~`WF3Dw?V{N(|5PH|ybHZ_%0ab^wiXClKDCK{aA=S=R^^2qe+#Wo~(E^GD*(AJMG zL7~2CFOpcLUeC=X@r}c3*e8DP(E>Wx36mbKDT;$OR)o5T?gUaf+T7f{T?CL|LOK^Y zv?2@nqbdR<9018$?ZqU(`>GtinJKaTZvB$jn<=W3TSw=`vdPZtRpaL#Y@AMTG@kBG zoc_;)lY?gY+1ch4@KDc9lHrYCJWOf`&r!*C7ILDR3Kggt%x(wwvEO}Tkf`n3FMgU= zOd2DCIPFGJdc2)SGi%h%J3%7OS;)e|;UcXE`|V+I_$JhprK2PGAN1j5#4YVdy6Vpd zp(KizMv?g*k5R{EpG`nu_t66CG9qt!w*`IPsx8ZyFn)3~m4NMjVOm3g`S&=<$3hHJ z=eHmuDGzOm6qj>zb1O!Q6xUc8#NtCVUSJML>(#Pld3G+oG69FJiD`EB7M2zt=tq1v zfy^c&gHd|pQL^dK7}r)x*m)J@8BWujho;%Qo} zO}rAfR9S^R(=B~CHActy#`Qs6k20QYM!@Oz{MPb2o#K|ug`a8UUEC`fG3#ujG=T`A zBMVR9(-hdg|LgY4gTjj}#t$u^Oln(fG53t`ajiOkK@}Ei&5)>%FVPufv^4^MW-y#l z8kA^;!exWfeL+ZWU&kl9Fzz&FDY4JTDF5D3aa}{Zf8Ih;PEH3H4$jfbMY)WFA#;zL zOXjYW({XAF{OOXE@5;c*c@*Yv9=#RGGJ`lcan?uUp1zmeu7BsIEZK`IjL!h6W6lY% zOtNpE@wagU+3<~$$-Y4Lb0@4zX0W6jq|-y>0kN4|C|_IXkHdhVY2lqtCV46cZOf-; z1f`K#XveS#@W3kr(R3H$*DAzPxW4MMj6XVp>9)KXRu5a5vMO%_n$i{C7rp&YW5?O- zt%0??p6lpjPoB7e1N=|cQ*DrGusab2&5&`b4g!4#Q1kO8hvq>2CPEk6zK}GEqQ2nuBZWDI`=Rw2jn<7jlDm^BZq~ z8WY^mgn)*>8Zhapor9(Vr`^>CkgJ6ll8X=QsGwzNSS3dwm( zj5KaoEcZ_T;YtHQn(G?-GKmakeD(lfCL36I+L#3h_M|u2UY3~M9t2mows$;mj;lsh z-Ib3fh)_r@;|H$y4u>}jxB4xa{U_2p_AWzHBeeE^ecg92L=_d9C}^D??@%ZK5uscY zzXb4b`OW6_!1j}+sVF4D;f^J#gbbHobG1W_JDFb@>G`+4xco|_y4vQ;qkDJ2@8({I zL_|e~ayc$}^r8oA-?#ek2LW}-*LflMdXJWy92Z-~KxHlDGhq`%zI$y?POAJ5+%R3I+2)W6&3bs!`$ms2C=??QO$WUAi!_pi z9pt+os`%**^>guzmq3jGWEs0rV8zeJC06FbP_q(JmAeQgXDrzB|J-TS)VdeB_sebM zE0xypy86buGj_SH1$_5%q?o(`r!(m?ZRIJBxRT-#w26NSUZ3?}YRo*ym3X6+UtM5U zW^F!#u;8_}uvE6dhyCj>fPRPet`tIjv=NfK90-IYYg)oh_5RId2W1OqnZ+-)w(h*f zsGcM{1rP8b0;fcDB4x>T+M05MH1)w!1u5Vz#M&Q6=U$BxEi~4;%32RymlG`vN-yKJ zPz(2st*8>4j^O+UwEG}?&h!DGECF$VBHAiFp`yifsH*Lloo&c9uQBdlzTt)r3oH{K z$b6EM@u|J?Z)x95!jK(Esahaa)dT>>%k*{4`Z;gy%m`M@O%jYTr-?>fWs1ldmqH^my^&97a1M`{wha zMPWJIy{Yl8PfzDXMO)`m*XD1^oOPu}KIgPo47fal-LR>#yJnxH_>s?Vz$J*;jqBz% zMgaezsaDGJCb-wv=tj}D)ml49jJsQ=AxY6Sv{;8M48r(nJ{~2Ausl?_(a6&7hIYYJ z^R}%B;z90^D-}COfe}${zmaaMT?NnM@zzHIi3OTj*b6aFg6Igu6uaAL${J$Z^y1{J z%6vp8bh)IYJY2K)@f|(wVArpS~-dOkSW&H@6t6^ofvo1-KM_mi~8cuA`2MglPKgIet3Kk9^!`;XqWf8 z56>GM8?4CHn+U&6*jx4MxT^@*1_3OHYtCfkG!>X&1MYSI@;TWDcvkZX|6%RmFY3@G ze#y<{4+;{YtS{029Um;tzPfN&Y2Eos(q&fe#3Iz;m&kvGlWO2S8YO%3Pfs(lTenpA zV=1YNeAL0=#(`EL#v+2|NQ7%OW(t)m=P9Oul3fS=Ff>-G$7S1mhaz1$<1#>S zW%WEb!U@J&YEZ&$-I54#RQyq?FN!U5t`)`pqiU zaL&xcXndxB*ZU3ZW$JDt25>zL=fEtTMaHm^fovq5XOKR4s%P? zN3fAfKI-+@lxE4kJJ-YhA@2Zi@)y6)=jq&wytZy@n zn|o1S&+Q>v9}N{7>$$uu34y2JW}-tyBsbLQEO=g88^yb9FR)s3-`mY9U|RkvbPJPc zF?h@*J}#38<t^T4td!KwV*@8rF0?)= zFXK5GgTS#iMrY%qZ`)W(h)IB486-Z4-@w9|&a!-(j7}Akc`6wMOR8_c=Qt5<_p~9; z4M9qtFsJXwre!=%s}X4l5QKHSDI3coZXCvDp>QoxTmEB1U%z3Ai(jcyK5xg4RQyI$ zn3J`oKKkEl1VKeBRYL~*0Z+UprmGz%w(`n=No;xagT|f?*a`i?@6GFi-rTSoF|ct| zBl1fUufoR^Jd5mD7#5l)`ZG*VLi?>Hx2-jXJF8nTt5~p0>6&|2NpiLgKjgWyi#6Ah z%lKIBQaW=b&o~dMe^$c~Zc@X>fI!#k!@T?E9RY=T=jdqfOI}`NRNMZoeh!i6(ti$I zW%!&`VRq!E{)VjT9!(cC%cLumxZ~&dqg=mu-m$E5g1UAM<|=s~ria5>f6Jn`fi41j zn1LCeW&#n=AvgL!po;O;uUMZ49hLn6N4n_F(nWf-U5+LCEp^IS3lLXOo~&Ol5B{T~ zclwI|S0xepzbXkdX1ma)0_m~LXjr&o z#{1}G7VF>J2#Y(Q(b~TR-XO?##Ug~-v6@*e#Ii}0XG^U|F9^b5jW8Q;Ell%zo!d-v zaB_kY5?3OpGe;*guxkOiu_O|e@^^79NJ{WWdieeC00ZbkAL+>bWj~o-3r2;Y9S09K z)IWgB_!MH;K`LV0g%MM61y8OxIdxGt-<;_oUJzl#)Kv|`sUjY4@EPtse-6)kr*%2BH#{D0n-aDM_H+=gKQeu<@RazsGP?Qo>wYJ7qtF%UIi>ke6DhOiK zs2NqOwyHg93q^^ls?l0iMb&JLAjOl<^LxJE-*M!4|DPkd-`9Oz*Ll89b;yNv!nX1Y znY2NWy?x0pE)tJwdJ>nNatx)F`N<{{B>XeiF+x9oH$>1*SP)G=a=Mw2Vu#*eek~Qh zvLLUWIJEoj=K~pPUzAaTH`Pd0@G!)caJl*$*x#OU=@96;|3b_)RTUL7#z#mY96l6+ zBa7K@!!scxJG>|+YdC=+@au>N*02HYCY-`A(4v8F_4 z?4us1Z*Io8iOjwk?SV-kWraXEa;E5uA<3QL!KZ`<5wnZ+-J75QW~X_jhxs?3;JQAcebAD%sXu2`Zx zJyD}_T5FDc;XSKKwfbkbN+H?3e{!FFoDJB=T%}TxY?4opA9jBZ818Fli1FNx)iSmp z9~icWz1Ql(bT2F{=6~E86u9w;7UNrOIR8RmohI=eh)52@igmnJM-MTOwH z)zs=q#j1oKtc9N~o*gYGXFGwhg!KAio5L;Y82Gu!l>ay*SLeBT4r2jlX85ncssFS> z|F`|LN&Zh{@Wutx-NJ!HLYOCE8^?ZkZkqj}HsZ;}-|i%27M1+^DN`Y)T{?bK2E~oy zA9@|yL&{#E%u?zEh#h&EUq9VX0N-ClHTWVs7ui*Nd^?iAhNr7_l25r?7G4EoUjQwK zq|F1^*j-143%rlqyT7^!jlX-rIj(F!`=2GLuJQdB>G44Fyii3-Ii3p!Qx96~V^bH` zyVzeh9~0}m5VFH~ASWHS+NC()6=0p22738HcCS*0?Zddvc4G}2NggjcH~-iyN5WS{ zs4@>p6w)^}N63Wk2tR$wslx;EBH|rTj;u&T1tGgmm;J?d<8Q}d7KRL1|K_&%>sA_B zz8&BvJWvLNyjqIx_?9x1$n&Y$o`;Hn;rZy>UtJwT;qFYY6jP2NFY#BWm&mzlQe$i! zR6=N}cY9dj0>co^jstHeN9o3I%I?;kTmlk*nTRQXio zJt7+=jL?hsGIJqCo1nhT0Hlg7WyBQIzSJ zP^z?`5}ZRP!et(6O#flNg{CN-@*@8QIF+XWacRY6nSlb*g$knHNY@DYaRGPzf)J=D z3%(?21$HOj4?k@z`QiWuT(t=1IG~PdWMc6X#^uIrvIk5|ooHVIa!o{5eeB64R;rge z=3uq97m{B~mXf|WXhZG`-3KbvQ$7hIDq%>)IlbzqOc}w-N_0#2?x}h60;P9h-_lw` zg;Vj)Eaas;o(A~oFC|#^OeI8QF9{6#*+1qK`SYVn!B^gjJIE*kUYngjC}6BG)V0%j zxA^&9c{q89jha4^g%eKdQF90qo1^RE`*Hirt1z77$<5EPT0aA>?#v$UZERSnB#~Z+ zMlO0#@ZhFY5E>;NoVrBdcvqmGmLxz!{-w+s=nx02c#6DkrdNVNop?d}2BBy$8PBgq zAgnu}g4j8F9Xc@Q&nyf#>Y+vCI`;?hQ^VTcgX@07_>RT&y2?zGr`7s?*3+|FR6E}6 zY^ZDXlrC-|dFrWa$rpBOX$FW8Gzc~NzZcTi|1C%gT`mdRXHeA$14JqwY{NUzXcoUR zQMOiACZHh?cfD>R6zN)x7M6|W-|DmJ?zXBZU0KWTP8wGUr*ih+Y*d(X4InLkBwF5U z%}xb{LTTC_;_DdZo6k-T51-ApU(?lTqOrd|Qo;xK(DK|kSw42TitOs>I^7Sg9GMtr z3mnrgdYxQj)8(W-DXYTm^*>sGj~gYE%{!;m#xcOCCtGsuX(dVZBmlE9Xt16&5|`dJ zzi`;Kg^~Y`!n_2E(SDvMZ)uX6GQS!J2)LTD3M?zVcvi8V=NXdr#QF{|l^K;eQ9*&) z-KZxobJHo7mGCMzyIalLmzcod^LH~cO-`GWI|aUbrQg3!96r$-Jj6U28`7`S9ik3; z3e&%m;;&?7rfSD4pLk=b;m1a14Md1+IR#*($C!*+G%UMcebeXYO@aegQ(NN$-J}^9 z8FL?E=H3+Nz4`9>EF~)tawlIB#Xs&j`}|3{JvEbiNv&zPEtB-?6t92NJQYYDkKJ)_ zqd~4zl6w3k6S&!ZaixAi;Ok|GF}Lfb`8=t(_~rggot1=*p!BueldNSV=1se zsHhc=u6SsrZEF@Q(9#MKlDA;i(-yujC4E0FHaSW@I$D(lKc}=G$U&ZqWCszHm*H-f z@dOZj0@MF%-NAw?aHRC$(yk{MIVS#sf;V((>`+3BRuuv6TM`X+ven3ifqz!`+*43PCN;UC!N{e_5avzwQduo;fh(y)cSUVSr- z?N7`|au`9)ua1K!@zKnm=W6q-Y8u;}&R)L2D051lheB!0ugPgP4%=*toqHpNH?P8D zyj@E;O@k+L4KuX@tZZ)VEsG;ijc;G7(bqYdAGLYnXOd!(Zc6!a+S$?0^(~<%UwRm@ z1U326hH`eNkK0o>Ii+Y}f=Z)`Fp{FZB@394{ln5VrkUD4X%3xrTD~ z=Z{Xr5MBFp&!wr~{Y5~I3q7Fzr%hkdb#JG@B|0Fr}% z9Uts98$i6|Mib|ISW0TBK$gF&NqGq^{)xLpYV&rez^PB&I0VZ>)nGUPWTfekj;)li zgt>tbDjvUsH!DD%cWUJQ{OG^1ZL}In{f$Y|U>ZTtQFK^#5;9C8lgWS-f}!CUV0ZGN z4Q)@eJIOQwhQ;G^zkOanY&<+rvo19L(Q6>|H}J>F&rE0Lf&F(P6QSPv3tt&q#q1$(YNr0rIUB>V9O&D1}wy z5;?Bm{*~(h7q2!uBU61>wVV1MqW88F?g<}v9P(_=1 zcYmBFMdZ(q)aBE){7I+dvKs0nJa||NEpFD4yl-o#%@RoDq%Y=yqBEMB@2He6u>wX4 z-TMy5T}3O2B&^h7XYvx7@IgO8F5m+n6RhfEvVQfn`Q!Wdcqvy-|;fS5uctnCGpn4<{`roLBRm*Rb3CJS>yZ3 z$)?5BkV%`iYCsZwB3>@;k7bjUVH>kE#~EL@*|A+vh=v0$-9~E*!0AIx1`uW-m;?AV zNCY6`x0SQ?78b3)EVKN+ID*luB~ zx`P3Z^yo;1880lV0JxvH?a?(BjU3Md&+~>y{v75|IuU z<|W{BBpCy*_m z)1+pMKp)zue;?oejRyfOtTm{(>v*^@+WF-?Oy1N)hD)!h`K4~t~8vmia_s_yLn7nO=>e0XEY(41Z z%Us!%%gP}5KwVujLm=s5QH`W4|Bk6Cjndwql?$v|PbEOlZJYQ#fL`+AgRv8iKy&>z z07AGpil$8z5R^#$u2J~AuIT0+s)4)W#?3jZ&2WB@`}I6ua;%2N0JpfGyg1BHIludK z^(wheoB$>zW$2{>E6_nQBb!XBVd{X}nhds( z54aI0>ebp&P&>r+&QH##%S|Fa$t19`FfEqHEeVtsr8h)P$xTzX=)(46K@??W#jYS> zScRNDW6%7iTWPEV(@VIWQQ_xoXUoni$D0D@>&{stdbl`fp@-b(D1y}ZT(&CC^edd5S48iU zc6Nj_{;Q>oxy^$r4d>{sZA#m_=cGh0tWmWZHmb2aQWHn;ml-m;1k8@s)kFswcq0>@ zn8$<`2g8Kx0H8E*LU|?bB?YUGGquOE`1Wb5=e->!;9$fW41_6pL2J^))ql^cJG1Pe zy&tEjukr`|$~LmnocoT4TzkCIt=R`tg#-`iEbj%&mOj)>A;lMWDCQ2ftU!BqiQ@DHnV!)=5CcHmgf>iu&hR^F+F+RT zi(#ND`a_t|KRDV1*m{Asoax1dqUcb11lagz*mZUSp!f9YoT@gE1z=}ar54GX08g}| zB4{kFUVM!k_JN9Rcu?WqA77O-P1>qD#1TcA9%+lY#z)aR1yCz%JDZHJL+R&AW+#ZX z73nFMEtdhI0^A}C$O~FF+l!MX@~WtPbNiV93&AM7o-v6Rz!iao zMan*h7od?cT-G^kUh7=Jz$9?TK_J}eCNKzc; z67kt#aSCKe>%I~sZ=!#T^ca;qxP177`lkz#mKJ2aI_qS%YWaodm2CqAt-rgydp1uY zFWn{`c9HEI%+Y9ibD!0sNXUj0UuSpT=To0|igN;%X$L<56=D$T?VCcTLgZ*<1YdL7 zm9BjHxJEq!%Wc*RouTBFEE{y`S86}U_fVHm80$I0OZ#zQ!n3vr)As#Y2>7hYi5zp) zqjib;I2!*0|MJ`S3ti1iIzaZs%MTL$55p{D>3WLw6NaqbEAth@?2}Z(DK8VV4Feyn zd!FbUW%T_q`aR-UJXZC^lIorpeLvqUVY=%V_*6sMcah90QVA)rWQ{d3o%Z*=D(=QF zpwi*UN(>8Xb!`Id)?!X~>v>sAel2KO9xh?S+PVYBlsA382FR#dvTCUvc`0{qj;#h; zQwcr6)-8Kep^q9?iEb^d#L5>bkB+yOI8)o*RgFxO2I&wUv;4Mw9209(jiyR}yl1EV ztu$Jvq(5_D(UwN&7{h91AzxZ)iy&CYkzBylzEKMe(^n~RW|K zuBsW-MqU_{N<`RRy4v+v?vZNtnyDp0O)uo*P9@>p>#ydmla?+1TbRu(2@+_j-kPLu zmNG6_DlzrT0nXi}wGX^DVCf1BiPUCIUXbL88j1r;0cap`fVbZFbU;J$zVCLg49M-B zgU~5c8{>&AEUhst27Q6r`T%YZ2Z8VOgrV|EjVd9{B5gJ3Ahh6D&v2qH3P(azi#Ii2 zQ%LS1YDh5;nj}SM<-QH|{l{pM9cNmBHsOLn?KGj;PTUngclBn;;^~O}kEhs2ki+0T94m#!$6UXw{&N|<6wLAUW{V(~CKyu-40RMU_ zj|blhjtxZ1M{uL$CzOH(%{yUhB+2HmWDf>jyNXQ?6s$)h` zMjS`k{deVAn9a}*A3^Jv*_eGS!in~YNql*Vl)A(1C+~rX-wSE$OMc%*^KN8e{BFTh zU0va@IgR3`<{bq%18!3wZa29M>C8I?YtEN9il;fh4~eG~vNEhAW-()^-n(_`cP^YZ3^ z^X>Vro!K@%!`Sjt5&l1a)|b64a&(3LHUtC&9Bk%K*N-*utR+&8-{f~*f{?`}fg7I95(8Qv@vyZ=8yI&4>!ksmP7ys|In)>K= zJsRKto&R8Y?{AqxjAZw}zf}6LAkqMU({Nar zytu|nj*kWcR`O+v3-(c8-DIWci&)F>M(_p&4}`f?H#L|4=0?A6w}{m@Y`OT^48?7A zKXB$y@J`AQY1GDvu3uk-Do_VYn%xbCDppq|kH@z22qt#bY*db@rQE>maWf{N;_T4c z!5u0|$hk*Mx`HosqR2~0c!Z7%#;t#S!8$KLRYcJAf`Y9&4Da;;m6LAE34;OYnXW9U z0)TmTNGO<2Nk-7@;P;rL+^lpzE@f3&&M@b$jjhqZx}pF<2aA`lSRv`_e?Wm5Z$EyW z0*Xr=lChWP{ElKR2JELJ5D9XPKvfX(Tvr2oFu-*>#?=`v!*As4~fC*;rxNd_T0p+Hs z!(#&mTPQt5s?b)tM5^3YA`!%rSXge!GvaEj_>LJ^%&9JdA~un_7->uUR$mgLZTM)L zL?F=$^o+U%OjoX~YJ*JQ>Rq>5Jgh6RXpI_s#v;YuQ)?FiH95+u$@c7hFacq=EB#1= zkYaC$2hmuu1Mn$jsmzRmk!9CZrRnZnxd;YB)a^fNs?u`IcB!0i_EA)h{_dTxSB(hX zicuW~jwO;HDG=^n7L*81Ej#YJi`+nS=)H_@gXS#~K2NJeVQ$>?QblEz?%@NpPM{X^D)3jQp-bz_YlzRLH;l5acJR4FSP`=-$qha7u0~MK?n>j>U3EmV ztAQY-;>nTez`wsF{r(~%G3~KEBwGh?LFgKfvLX$hP&$dS4?^50vbgHw0bH;=kJ#z& z@0WN~RiSuo2pE`(?N?QtYkw(SSKFwYf~sw-6g5TYdE4!@JDEItlFwJ>i)0xQVZ}R<{zl(gtu@^=V&%y zX*y;r{NG^szyDC-DyQp)=RYK=VVYE2I5kZ3{9k2m*ko1rmfXV64HYODENJ7t6n*?D z9%L9Gg_~lfO z<-XWt9*5)KG7=`$2X+{4XmI~Ry9WJtURjC3iHM3X_3!evx>a7yEx+91&nRDbbz`>c zxp&|l>w%+_*~@w&O#v+n?z4di<-AP%3x193g4L9Si!CmyTt=-@uPedEILy&DHRfn@ zqU^-Ks#W~n^+Y?0*DVJ#^mZyu1kSRN?+SAJ>L&GN%%J;G^vI8CYd1A23ADGJyXsN5d4i_wNs(k7?QkDoX)4)-GldgktLU4UX&4*Q)-p=IC zz^in~Yycxjw0Ct=jsu=Xli?yfb1e~cbs>Ufyv#WihDKop9g8oVh%a)`Nr7o0f6Q(^ zd({L3gK3;;H32_1qVAeV7f5AQHZ?!61UUi(or@fBv7wR6HwzVe1w)hkOiU|o{2GGA*^GEYz>Eykn@2p}Y zHPQoZ+9@-o1Oi+gL6!1;vBW_{c|J_Qc%>L!Rs&)~gW4FR;dC^}KeA&E_UdZ(s=A~e z09wrHh}&cSu1L-UuiB+Zn0PePZ&l*A-+ia;#gheBVbCjBrz93T-~jTDJjWA>=)$0~ zJR}s5YT7b>>uM)C(YBP@badq>#kQ|#6KO2^t)~t;JjTv)xybq9JP=Co`${pA>acz_ z&CiLEH1HnFxL)zsqPR!-W11T#Rj!1txR~0Ut*Pae+tQ=raK=&DoKrih8-=D#OC+bKJXDk&-HKHdtmQi;Q++uM=BGfCeyw99d! z=J+qoAez#irJ%q5r@R0DJadVqO#C`^vU0sXVv;=AXD&H5Ci&pNeB`ptzXcbI?A?EV z!=61m{;-xWkl8*}sdeaaew2K^_2-YVu0>{_Nm5h#W7&D)o5?FYki-3;u8!PAr49x0 z>dZSK7~|)7%npgPH|cC&DkZ=gOD(4_KpJRfZZmV{IOtw?J?`xH3N`XpxrxOSYv}0Y zdl7SeIefX~@BiMuw|)!~s>YrZYl25GCpCdP3!UNT{D8A1fwQIM!Q=+idDrttXW#`N zPs6p*5$A!2G`28y{BFIhnVLG93z9*E?eU-on%!X~O)=V8dRjj$tpw;GigT3oaeFH< zB(J5yE7pzM0bZA!QeEGM0-(ahUqJv9vmOBNHWikp&Vo`80{a2>!fw|{v1D%>YT2?9 zXXw?zFpe9RjkOeQZL}>BVIrg{tbIun3c5D*P4_ynRSE_?vNHcb~mA$1;hHp+P15lcwz@bJIAH&N- zk;~tH>7*Zji_t3WG5cd<-s}5DDMRo2ef{V6-I5p?fwHHKB=38ko3qhm7w6@j+;`F~p?d(Fb%mD8b)=#NWq)pkde9Jxv+mF*QHFGt# z`+yJ@76uG!M|x#TuoDsVg5UM~p}LhN5SN{pp`uavC>@g8YK${;^MkcNq$7rKELa{I zK+_FfS}r(6R&0>Us)BSV*diP!G_h9Qj<_A=V?Zv<=&kM+zqX8qF}HE86u_QI59_}{ zNCJR>Iy~MbQWLH%v~OKJWZ{jij+(0RjVLdMKy3zNyBB`o??o3PcuZ@7V;%;j41!`l zpAzZz@i^42w4X!`(+jStQMQ=4rM}DuO;6NWTJUp+^Ya9$Ifsx*E!)qIBH+48_7|ZY z9g6Mmo8L0swy9xf-m66p0ESifkqx79ananw`O}rKg%ZgT=?0dPblWQ)+XMn^x-};I zqE1IhkZ=nA)0YsOR)2@^kEWuR4=AcY90a-J$ike=+2c}|!k8)(0Ey$BpOBu2@#f&V zROF>9r-pV!LqExxp?dHDI3eW3zpI$%s#2Pr*E6>dw$yHs=KEaKd`b?x{ z+-UnqYMPjzSKh4m=zA4S4Yl6h2#MQWUKb%zug$fPW3aX@8s&F~Z**W{0++$DF$qWM91d)$4k`<&J3+wm!3ZSa0)p`uoGnqb-?%sDGo2)XzCJ zoaaOSzYhYZ;{r`n&-O0t|NrNAX>h#i+%n=+^!g6v+$T`x{$$JHdD&6n(Qdc$+g6jO z5Vee~l1!LBh$v2kk)++z=1-{y8$URva?U1qBH8uq=~gQ*YpXlD*>fZJtl84CGeMr; z@?EzAJ5ZInIyV@M(O&H%HHks;rY{l<$~Y2)zu#KK$lDx#vxMHUe_Wgy|7LafX#Yp> zI)qFv3%GN-cWZHzGN9=6F`{MIt<&$p6K1Rjn z24$fNPX|y%SzdwDKmg!ECc26Jc4zj=NcFyf;LhB!HOs3Fuw4?51FWCd17BY9^VcdJ z1bQv)7Bo`Y#b8;AN}8P0&(?Ty#WwAeUmv?|lIq_NfktMK|B@{i$tES0Fd;|bYz5$v z_!Pk`9uYaS%VHlxcqaaPTShpELseEfrKE`-i&-qw@D;rv9oL%N^|tDz;EPOk?4RFu zfQLycg~CL2pm_NO9a?sdK?L6{H^rPr%N^JQmc73VSZw|>ZQ6l{3L_ACoyiXu5B;!J zTI3EIL1cVr(yq>ve4Ag{oSya>CQV$I0A9=wAU6OLnIAzS*ChDObs(aO(dHH62hc~K zZrLmGZXbHgE{MWuYWS|Nj>lfSY@d7AhgP2o<1o+sjcE4Ab0dj#FuiKP*J>?!+g#SN zCtJ&}cQApzt%r){bp_vlq2bPXZAO=b4SI8r9cj6FY$tT3XgO+{gC9x{ieo_DCu6Dg z*eQ26u+cYrNEU{fO||@6`uiJ?QQNG6eK5Z0FLB6E?OPl444;TSKU9@9V_^6lCGOez zC8L)<*F&g9b0szIn+uHzo1wO0qnGb32KAJp%(|pbTiPGH&>v32PsN}88Esi&#g1&^ zg=oFmQAYs0S2Ay?Gwc#%weo^=$YMT!J_;AFYD+6VcsC+Uxw};XHf0$%1QSmL@F4Lp z8F=NC&WjdabTcno<@-?%BlC_x--mY4D{|%~Q*G{)+CrFU!&UWu9TeiOdf6rg$1@Lh~F~}v3$Q-u@Q27 zxbiOXqASg0`0@KO6=h}2!Q?|WGFe^GcQHESLQ9ugVu;(w>7QLMv3nPMZu5WhwlIjj zJ1H;6`8opp0rHB99iiu6olS<%55mt?&{5H@Rn;wngKUOl$yl4* zBs~aKIXVCY)VW^=C@Ri{?e@m1!PKE3cR8h&v$ys|Ng_rtwE|a?D z{+#W+4a?8mz}FZ<{QP+df!@z&kJb&tPXehdn(+VP@tngCozMB%8~)$)taWJ-E8zV0 ztfF(Ye|Ggdg~3^$yfJj`*>fU!y?61919R|_fd!xrM3>*Ajsyj^cMQswkAHXsDCfuN ztbAYXY}ZY+la#z(s8@={W`Kh}HQ08CgjR_BrMJ1*1ps?fJqmFilC0I#$D+A>8=N^@c;Ld`D z{*ZjOb1ifyYp*1;t*g(}@^g`nl(5pyEG1`A-wTo?I-tCBc zVG!UgUT9|FmC%cGxA@(4pbQ>|i?fJ|rg9l)xYUo5eohp#vP;8Pe<{y(vf+cCuQHPy z)$QZQWg?_|6z3AS?A)6i(V8%JTD1^iFbvVEK*tUjL=SMI?J~J|ZeC%E%WPa)t+J7h zjDy-&Z0)Aq3H%JgX@j`)vOj3|51~BHj*jqnqN2oH2vxV%Ux^0{lhpC+y*Th~C?=`Z zTX%gFtePD0jLy{aPT)`?g>E_Q4h67xVAyfA_l2skg=O z9k#Q*@Ec61^2D$E+uQs`v1%ggFj7dzk0%)f$}g_B z)bPz;T$Ei514`Y}vWj{TbVbGL-CqiMRlj+mzrF3T{DTpj8aZ+Fisr){ruBI$&xA4* zMuq9Pvjiry1UmoyDnundi{b$CW1S8&PV>_Dao6guc;C6bo8C^6p&*75?K*Y<-2HWI zvkFieA6i{|W2L8^o(%WWwXez@Dm6b-)SjSC^;m^uucs!DNp=T4LuCZqQQWy6ISm_( z4Sjow5M$w@t4$+Ml}J1SM^~6$93Gj$K{QlFd1xCQHbO)B=18_MB@3kHsG$Oa8GyJ+ndb)0~wZ2&R-$@$enXKo#IK!=# z-Oz;{&-i`AlFjZ1li?w3Dx~|l;c;MmKfe0+>FN5?()RXt@SUc7p1UgoaB z73v6|LlZT3VxYaVFfWi?&FRI!Cc@<5@c0&vMEa&1MGKgicDvFn2$6mwxL$xIyjpP5MWDV_F+-#73KqVaCRzL|bPUBsaP|Lr*5F#Nncwk1z3S_rwt{#OaFGbe*938PmvHd(p83L8#!p^K%dmfl~JaCHH*a-?c*(saIZL zAK(Va1~%U}{D^|w9z0LnOyiV#LrKCjeqv>SMWSS61hOL-vnycL5+E!AMH{y*C*8Ar zM+)IX9yxwfIk=1zoyV{^6pM+y(JzPTXY=rr@O|SB*8sGLqWyilA*ro(MVc~KI%JwK zz&^+^Xl#gZJ)h941MI&K`|b+}Z&Hd~---eC;Pm?eEIdf}ei23S31VNv-F#~=R3cst z!lQ91ZcVF4TuxC5rbI^saAXA8Xzg%is!CN;M2g~?+fqOcOw3%u_JVOkU4iHdOZ)gg zG*S(dxnR@mKPi%iG{0(yS0(pF!rdZ9b+!^gN8pRdq5Zw zVDfr_2Hx2e;m&Tx6B;VuPtxT5u}kZlSa!xwsp zD`IYl4@mAL!{YJqC_+jQ}A56`7OcudbYZDSGFsrPn22iAhP?Oo6)Crb;+Aww8TA6d?(dH5e>o8+yQS@bG#SLwl z4qE*7sX;So$Rxqbp?3&hFg^8|{IKObd}F>wBFnSsr0nsIRmQXbWF`OK{M-BK!MoeI zX`1%-KG$55)%&xl&GUz`fIVTAH+6GWZ2!Urb}hLpKF>dPZM>F0@|;cF2k+OrIhYSPEvlUT`#j%9C~w5C zc;)W=)ZUnF?Lg#L{jPpB6E}Sp|UuUiVK_0j+5tu|X`XgF0gaXA%H#obx}(f)?dYpV4_ zUTjzIN>L}lKT=Vw;NVx0chv_Fp4VW|Q~*@)5qXqQ0JE&IP$`^VPKL z8Wi&4ZfWw8M_)%39{;5V@!po1&X&L}jM zmic^$x%%2FNMg(H4&fqJHN^}2^MQf>m0zpWZJi(c)6~2a8SkXv7ra5uvZd_`s$8Na zI-ANj9%C~Qgl1%jz_^G7kP}MBt4OD4(>F*<9F2s}V`j~dO^f5}msL)8&JX^MEuO`m zuY^B4I#mG)%&v%EV2jn*pLy#2TFOsH(pynnF^D8zuMhj1IMVjcxq6ba3wj__gk^xD>j=)MU@x<&`V7p%bk5Eu{y9 zm8vsh`vK*Zm_)m%QsKqN*;yrzscW#rdRcb4J-da_%Ywp8R{>CQvC5+0n^?o4<2o@J zC)FGw8roX$y^UVc2`zOjUW#oOEV0sa1&~6OJzWrWRh;(S0|=4561v{Ls+}x>cXT`= zDREf3gLbJquG9I`9n4``_Bx&N;kbA5iqW@1el|U)KbX!yQ;M`JBEH>UPL|Hd#-BFH>vaz~}gAsolvXFtDtzut_XAS)j#zu|1AD zsy8-){-}jGU%Mlr7sYeB%?g-!%WlJ{(f#e!nY)AwAYXQH&1ZL2D)9QW=l|Vdw=M-T zbzk>AF#L16MJ#(rIa?7}U{GER!?0rs-)O0AF*(1pMuj5x!^x^e?;W+P#rtz7+HKRU zi%tLY67CX9hOiUowTfOIbjkSWzq}LSzr`;&%(xEOXbX@r88=B0k#6ps2;QPm{mBUb zE`74xcA=oouir)7&Ee5uS58e|o@5plwYrZ;=wvhQ3=dlCYj$@A=O7K^kh~G5!;Wu1 zI+lW@e1G*RDN@~7wHN{4UFE=^C}6*;?A*m%{6+hDIp+KTI)cs+HV*4C1wq}GiRCdd zxYdHk=4L+mwVfJQqTeLivu`lw`i0vLMT%uj-d2D!Gec;gPymD-c3(K?XmigNF?zxu zfum;95n+P!rBzu`3Nd|duk@v#&2XmLtB2T@rr@Dbn@Jd*&Br zgjL(TN!Ov8TAAOe*{ah@y^bt+55mC+YAKsbscOJ}kzsB8(H)gyS4kW`;_u2v@@e}$ zo!=D_`FyF-DKpVJ+^cs1!uCCWWpvr34A;7-yhLl!&Gx~OmMle2YOA>ve)Kf>+(V!} zjsA(d88;773VAo%QbOG1@bpjEA&Z8NL3}~Kl)xt$_7wDt;HAPMD1!81&PFrvZmBH^ zYO9Wh?(f#^G~66VHF1vMS*|8&H>JA-Cu4_hhcEXOYe>+7NlK*|!T|QM)K;nGSw^l@ zf-}pYYfHL@2s>#&@vbJlW0F3qU|P60(I!#5AB75x(&qa4^+dNol|Gj@4gU)>w&ZA0 zQeJT9JGXKhe1A!DY)zTP?69fqn$RU4$RK$I@oq_kAB)~S}eA`lrD%DA|s{Vq`XU~tFc znA8U%dfnkuKHqHU`vd*!z4(UQ_11MYGtO{qtmM;YN0;chK1D?uRiNt%W@olJ8H<@! z2_qLySyoBC7Q>L|gUuB?+Vi_clMM~mw${A@X*I3r2s;A&Qwx&G$wP@n=EDk=jXzF~`YfS)l$;|C#o_b?OfMWOwwI&G|o@jxs1*%J>kIUwVjO zL3#W8#<(x~`f1^DLnu|W%ho5rPEsHtDA=Nb#c19~o{mp9ks zyYu|rSM!#OjOODZfwzhXnaT(GG!SiV->HC0{*ie70C}0q5^Dz?Tk~3tPPchk`_r-f za-?3^xy|9imevaig&nKuPB;~2+(uz>j)CizK8Xjfyxh0l=*7~Uugf`hpQr&5YV~Sy zu=fPtQo}$qv}V8cEtSpRc}relg&H|@<;uLWmF;aCrb5y(_FD&-ZnpYba6~0w;;_8sP+IFF#vlGixXJo^z7t3?(6)ZH_7u&(^TkX z2#me}WH`32S!Th;_V{f)=cOfs~pty;HfATM<9 z_J~|w`tW0oCkOz~1AHw<0Vx0=<|HH6u@Xw?xxnb)9Av3tRfH@g-|v9UBX zNc^WTTopSc#d?fXP@tF`zW4X9q>6n{-;Uy|v#YneRUY4%zre9})f5Kh@b@ z^uO(9i%5IQIiHk#{*U^}Kc7`O5;$*PJkjc2BW2zmSa?^MIJa%~ram)jR`qjLY$ShK^ftoYQ#S4#E-hYcPV530Fjghv_bUW-(%T*b`iiOqmeZJTAZ&cf*YR%MFKWDDxho7t)cDr^~ zH8xdmKjWns3|(4RUM$50tuvdVkJ<;X_51j0KFW-aD}-K$^FdUoDZ>*g=j-cK394k- zgo{O{3v1=Dg_n-a;t}B4>Ey4PAf1=*LmLb{tpmzZhv#iDdg1d`|88}z-}4Nac)74I z@VdL{W3$c25zNiy(d0FTJvG>SppW5-)cVJxbn3;d{rDSYFNcsfZpkr8nrq(DuqH)XkWaOl zg$mW}KDUz^Wpjc($C;b zEK%rlw3)f0Vxi*e)ny_gQK;tQ8l%$M^orr7bUdk6nz>MlMh|T+B8qG(8SmeDxVfxa zBss=3B#HhT_Bf}EQ!PylTQk;0tN!#G7$7DX0m&>OPoZQRc%47^J-Ebfc!P)iz-cLE zC|4@l1?vnG^biw+!4f&ODW}R-{Y=%LXe4}Eyg5x>LwMWYHK3MUwK`(&=^l$Sp@6D6 z*LCfO)ZeJ<4(t46E+?$i+>UrAVILp=Q14%uxy?l7aeUd}F}A2y&Vz&5NJm?|fB2qx zIX6?b`PKXro`lbWip2Tr*K9EBWu-YwXa*U^`#aU54c`T`Q#0X6ZuI3_I?iZe6l6Hv zI}x;)+$r7HLAExccepWrP{IrH*!Gr%|M7j4f9!qx^ptJu<$Y=re6ZOATOW1= z5vPx`v)lahw=Dnf*GVgj(_M17^XZa;{DIxJ#RpShL$LQ^;Oa{Tk6HOw0x!jAJwaUul!nD%!_clE`Lrw{61g$z{*z3=6e~oz4;g> z6~$bYd9t>%AT0CkGv2%;ma@ISNBi3W?cx8<95%j%F19QObZ(RH>4eyLNKT&yc)oG9 zGC1{HY&qpl05dsXg4C3u$s6voMl;uAc?56h>0$fk`j}F9lw4Wb=RHD$tMuuaoio4M z-ealuM++4-4)2zu)F0=8AHzY#UR(V^?w(gsV-)IV2rptfi;4Pqq@A!uoE?Gg=uML1O|AsEga4KNlp z8gY45#*Y_)1tgLj?Sf)DI}OsfX~VLx+T1!x%I%#5`4k4|!5b*&FsG~XM-rkYtm)M`8!bAL$|md+J^ zt{ScbyllSF=}qM7l-abBPJ zA?n79A@yR-N@~Eo2$1vp;HZ1M;rD2?+VY^d!gkdG1QPgIosxZo!nj6O;KYAJDFBFPdh(Y zjE+`r%+H;gn7C_}krj&IRE2`|i)FSR+UXD)IIA-${c@8|y{ta*;IM!C_ZC2D!h zGb20N3so@uZGR<%kCLQ+Z`P&Lc1n3*ZAay+{Ee*G*g!*ph3>_q)8_dJ_?qtAe2gGR z!kzSTN1-m|mh5bSk6EYk*2*ecW=?ljK?(y zU;?w9JeOmsOd)&1$CmKi;L~Y4pU(mAUTa7Fl4y zGf*YzG@!j6Dic=#$~V{74R`@&i!>Y5@ZHeC_ zY5Ijohu|dl_E#Sho=9TX#g%H@-A#-^^3S^#!^3V5c+hWr zOYM=NVUMOIhOtbSZuu$exl+*|GpAizW-5%pbhBXPH>dxCp1s@Qw_Y+_n}}r_S)bSo z%wJl|4~#`%1Cuu<+V|Eub{wRljq}p46g!GMKuQ%#N&o5Vb8^3@b0H3!SpwffhP6D= z(<`9WEt=@N5FPUzP7eTcIf&ieNN}D%(d zoSD0b2Ju5)fI*JxU0>bIV?dWp?Ssvr%}$U~VUILLmQ$Mj)LaNMUZ+=2Pwn@&B5Q?C0;2^@{r7{g0%0EO z6!e!?cH?YwG1V8-4O^75WECx-S@c)LNBMUP)ExOsD`r?cOjmaZm`;;2)MN74=VD-E zkCE2@A?jTGnQ;HVzpc?6%7!_V*hca}G0LGFMk7R_&G~$oByxzHjV5!*Az_PzoSI|K zha4Iqh9blqk`Iy`N-TtX-`{s6=Wl7HFjo_*Sz9amP0 z_R*UQt2Ma{B_6#~FlGPM1iRHDWgdTI*2Sq__I`q`i@f^6kv-KTiKTBY%8A4jiQC!bK0|~B^F(~AqeT)_uYz5Z^@QR(IHP3 zgMP4>BNkFYEIb?b*Z+1p|Eje#BwCUCdehBhd(YrE8XcvwXklC^HX}@pi1(g%yK+qF zZI|i>M?5ub6+k2=b@#tT_sC!c2?R6!^2w=8Q7m{}NteQ_LLhgF zE$wpJ%_m@(GM5k(jYA(Zg*jQQEdV-YP2ng;ae{6vY}QIbLY%cqczui*$DIEX&*7ZQ zHDw9@ymO_oG6{PrwegfL?u235sqZ63-PJcr4w(b@B3LVj)j+c zI)YE+{IgRv(cIC`v0+)2@pr%j5cQL9?$`JKd!;W{Jt$te7h-W#-*GTd%Q|`ycMugl ze@n4fj5zV{M$#b&BVct!%kFnLe?gt%>8rDvIX9Ny``Ap3u6$~F;(gqr;<|)T#JV(m}n^XNQU#;Y2%jaL25T^Ypv?t&E+Ok9PfN1{h$|=F> z4;>n)c&qo|HaT~1ADkXuzTZ?-z4jAV2Ba`Xz-S1s!IM|2F9_t;6~e|VB4VxqT#$gy zRiEZZ+1%&*^-NQZFOIJEikx&XudC*-b;c;x7`b-W5&Q2yP=&!@-7%%Va!l^SJPAa_ ztdFA^iFC!dEebdYRE*)pvc1TvNWN9~uRLoQ-R(Apzmg>tqOhh^QBiUB-9{}rqz2K? zAV0N+;xAV03MGBUvity2XcT|GTc`yJ?KEH35!`T_tbSrm~|)T&~c6z-vpbc58M+?DDf}|ujG>_VyP-o z?@M2&NKe^bi`Lb+Tb+;)N@0RG{6;f9(*R$pd`NvYPEtaIB~qR9yG|1UMFD^SRJuy> zH8CH;pB8mL^r$NiZ-H((sErCdsvQ=a4tdP#8aU$>Vpo4kWY2?n*fnst+*sZ8cS74L z>bKTItBHrJ*F<@v;=py z(E|zdr~VtSmp(R#*{cZtmxh%=V930~|MpA1?D=SQYG5VYrv9BGhEd-C%=@9hrs}XC z84~|}%zu6qVlPSvO42bXxa{~-Lyn_N`oL)iLU8LT)HTl05CGIN7~D7{&f>AJJOV{H z`;>O4Ahmj?tr}POtl+G4%kF1BppAi~rmGfJPFa3tB;#{a!>JP#unr7tAWAu@O1NCL zy7t+pL1Nz84D^{SlpH3m)u3@PP^Y@wIiDUIoCMSz!4*HB`5qh9E<%L$n(Hn{JFz$iyZd8B7&ZBRO;q2$1Se&8&O;%9J@7`KndA=yD zw_UQJq0)%-x6F0-h_yOb#rVE?>Cz5fxo=A~Lptog72D(pwr9K4c~rbQwtEubXt-IW zs!c*9tQt<}!9a;t-)2Tf`64$TdWRvOxU1tQx3&UK3Ow1`jiz#O#p=1+XSVx#p|}T7 z^Wy6eCl$tzAZD)ioE6hk)61)1@QjVE)|(^Kyv9LR*Yp`0`#|~qbISvYd^FBME3Ic+ z6@Y=k)2Ed$0@ZYObC$;|JcMz8jtkBjHD)fD(9wD%8h9+qhT z;%+Oyd9=63f9v2UU({b_2kXJN8Y>Vigg`;6!hzkD-qtsJ*L&AvB@<3R zG`}@gE!G=(oZp9w2$rfTZ>zAMa98ck8s3_AZyemwtR?(#&?D$d)yhAAb-vB9v9;N7 zv{Y;!D-&VmjrAx#AX^?Yv(O{8dVmuZm4SjF5Gl+82^hSE zz~uf`mgd=~k6%N zDrUGLt`Pr+?TPJt$|%@sW}}hC$5%3-M<%QDjJW=IiRAJ+sa$Av!&t^RLE|ogSTlHc`U#44;mii}Ao6G_n}r%=PJtYEHFyhnd@gzZF!RH~Yd<2mg zFKi;uca=VV-+J%!&PyYx@L2tJ{dp5Xa`lsHVl+9}Gp28f+>9Ka@>vq~Vvw8eWj7yl zaSNR)Z(vc%BXyEMcPp;UFL8hX{!P?EbTb%6QVi03rU8Z?Yi9*ulo#->z)w=~ z0rTmwG@#Y`q0LpkcciL?i*MF>fk2P9{Qi~|#?(^P46uv=&v8slHSdc=Lz&WlQ7+{a z9a{{R6w{~sZ*yd2LGwy-pRB%Hq3>}NIEfbmQ6-v>VWFANJ_OENdl4~2-c&5_S-hUH z*%BA_sUH5&rs9zu5o-qka>N2Ccn(8|T9y-$TzgBC5_ZdaiX*?qMLS60n!Xe%=Vp<@ z-zr_*vv(MeF=)kFdhI2Ycl;2*n|}&IKnB8uBxNq|E$vqWP2U-Ie||fvpA-{AQ*v^} zpXeh&?pN(Pass$vIv-${PD+G9VfT8M2-moQI{8o@Wu%gSx9P|Q@2b}3Yr&67j-NgD zDKKib@iYbs65s~`-SjNlRq}?7fX`;OKGzH5t#m;{0%=M8-4jtZ#1B{!$MR0=$6pKA zcx{5uX#E)$q6ua&Z+5VTubs>q-&=6sef#oo{H5X4mP&h@1t8Tf^6$&T-<3~f%1{t9 zTpIfI8&DT4jjhL%tSATYJK-vpM?)|BdHMcWyWNWp7YXqP0WEa&FeX7)OiaK0ZF&{j za~GPl>Bb2jW+XXF#>A^jPP>Y0q4LR$H=GD5+>PEKIFfNLNfD-N!OzeC?3zBmfO6VP znquF-rFwcof`SM^7Ys5}$r9}^ggYzvRRcmvE3huUV1m5EY|x)F7`#iknI}u9LbGML zl+gjre6*NW zU=F=a8d|>hdLyo;T(>PWB{rqjx{!7w-+65$-Vw;)uGAM0XWC zp6+z%bZwyF3(Sr7{rh3f>#W7_J0M5;dr(JE$=Q6B+&Kd3 zS3ar02{v#+I-`(%3r+6sww8jNSTiK4zs}&nO)x?bA49jyE*C%vG>${!A(y5?)zQkz zS2K!I&@>{kTuD@?DHt{O&^0+7+Ep#xP)(yDht;B5vQMZEFap^g|MEseEaSj8@xIjk za^U;LS5lvrQY#A>27T-Bw~*)7_4C_@yPsporG0~G=_IG2WW|r0ddBppxm3@%hrUJ3;t7dBWqxB{%3gWOvAqYQ{{!wHssflFkR`V7iBq*^HGptdh>-a z>dRy!nO?~to?{C7LPBiMPq;~;WLc54{FQZ`*;5jf##Ln`&wzKBdXMy|0t_-*1_UU- zdJ&JUP&E_xvD)-)x$7F%t|jTJ(@c%i0oF*};(-2i*F=6*JNZTbdC~Qx@JXM|^wGK9 z`6#Z8o$#Z{qhB4`N2?oO*R}T)4re!xSV#YEg-&;JZ|yf_*@8fkoM62(>q`yCyZ z3y>4L(q6Yc@2{@s2e<6>RZWRotf_M+*s{rm@VU(1>)J2)xgS&1HG3kKN$Iyy$>gp_ z9#S|#3KE1W?Hvy5_JWJB9ki`f89^0XnK^M_j4!pCdXCHv?<&~xkDBa@^85ZOTpe4Yfxnd z?qtN!bTQKU^);WXs`O8OrNz(+0Iz6u+!89cxL@i!i#IQnzG0$w(ynC!gi1Zegj61k zX+@o+>&nDX67jW+Q;T>!7w0vnYDLqtOG3XIisA$4-DP>V|tx$%neeXE%;P> zAi-|frjob>B`(;LUo~~qLv7ZLBx0vxDFmggoHD_mV8mOxecvY3vKTTz1KsQdLu9k$ zW!P7j%O4k6?a{>LsO|HrD}0Im@fhyhSm_r?10R!Dw=cgOWZ>{V zFQH-ga_2Kr@stcl(q_wVVSVX7nmmH^>|?NtGyw?%xfOz>mKN(||B(s~)yWms8$bu? z;xgMWP<+Eekn^|hnLy$zC(2aqGang9;Q+8L3jMs8m_WZ=y5C+Fv~#eQt)0}%T0-mZ zl`sRZ?C2FC$sfcI{qMfZv7U=Kj5KJ?yAQLb#z$B+oqKvsOe=Xa?c*N(W(=v@x7D8O z`_K9OOZw%0Zhu5vgRyd+6`EQapB1yaKlDw?svcaDPyb^^cu2*Ha&-iyzWMLixcJEJ zKc$w|j#*r)a_rrnym=rj>l1(5dcSM&_onaepA{7c2SV6p1QT+zE#jDaoaht8iW+|% z?&9=}i&(BZ)6b*-wFJ27LWFgw*Ar{TC!6DMLa|s>L0!AjKa~e{fYHF#lUH^k;))U9 zePHhkVuQsN+P(KhDgyOEH-}~Dnv9J`Z!vG{%+Y^ zgA_?&p$<2M3l>I~nW1;G2H5So)piMtJ2m@6oRKcB=z@u@(;r0zg#an2g}kmCm|^_j z1>U0~u*#3JEAsT6JU7%dsgsdd{`A?trfi<vL4tlHFG?* z2}h#3v!Dg)j;ESqFn1V>b)t98C}t{bD&*bB#B6I!g8xQh ztL5TKIH7p|;8Cp69hH%ncXO}$oh7_&$yHcRe>@l=CG<3mAT0%eg!HKK)?&Y{@I_5e z`R_k?5e=nc@vk)O#3gbM-(OMcYd!d>y+5aQ^z%j4&6{iCI-^XLSFActG2LB*a zd^;Z+QlDDgU#a<>wa*S@kVfe97e4Ba(CK7L$8Mx189Zf8^`uc(NBEtR%r1TO16XIQ z5ZLV(Kq=^!ZgcaS+%YJ^L|+|6-gFzFLWUMl-Q!a=<$Qc8giPv!2<#t5hWbu4ePHG3 zg3Rd*AYfEmdx5{RyW24>k~lgZjU}N>IWTNna9AB91IgTPW|cWt}siO_jL(Zh3?gZ$TE%d z2P4d@8`+PC8@((mX&YJ*HRCIP3nS*G)v}czAp>xf{h%L>5so+gwCwY^q3bL;xAv%` zPc{ShiNDm#CB{j5Qwy%G_8UHaVoR_#)}-0x!A+_msr%x@uiq*!JN|daHd-GX>HoRj zK__({{qo>}=5fi(IS#GvhPTgD)Fej?_cN5PgJhi2h6)!4`pxx-tXNcRKiIee^}sq_j=pRGORDZ-O!Hufq{8%5ew4%-8j^ zHXAh;T?hnujIKV-7$iGfPM4N4$Ik~naLp_}Pv`m7Fjp+x*`?XF+;bCZR(QGaoEr|L zgTv_(KtnSjpeJ{_K+2N%454-SiYMfQp0$+~mLq;mq*n3*Qn@oCNl_}P@8EOxZOQNU z=!k#c3QCE%qs3Clzbjc zBAD- z&MClx?q=u7s0NDuGrV8oJs0?_I)h~0BHyO!t^15R+?bVw=pH|%yus4cY~68Xdb5hp zu;UO(uP(_oP5PeBb--B%bezOjy<6jH+$0ipV;&(ob?xtGTy9unYVWDW{(d-jG_$o* z(2`JE5FQ*H8qCtl9O~LID+!z*-$~$A?Awfxc*#x0+1`Vnk*g&&8{XpAqs_SRZdo&l zpRms&w+_1&S|6|*Q_I6F=0W@0BzE7XKv6Zb(mVHJGMW()qhO$iZ)Csp^%B6AG~2?C4&7Td=PFyRQ5X2K%-l_7lju^Q(ePWBBBZSFaoTl@e{HqjwA=N*<^ct- zzt$Aa>%F>hrWyfu;gIMx;el7f>I2R_ak>2bW`wmx+cBr<#z%h+=bfk7d2KU3mM+2J zO>UR@ryEXa>AX!(U?l20j-Ojvi#$r#KByh_j0g>NbC(iZ=<6THJ)JA{|KIDc=XY<5 zqmEA#@mxp#HV4}Z03P{7HU(&><)9sTq|^gc#bsxOV3`P-85bQ{=ygx8cFuCAWGwaBl)T8$Vc$=+wH4uq0O zmp#?G95IB!*!ws_nWL!M{!@$@ylf=#EM1A-@Tnzd!WG~hu=B;F{LmDX_-%al~vIAIq zE@h~fK_J!!X|*FTrO{=F%jw)ac!Sv64L_qpD9zX2@V}9kNaJ?W`XUf_9FMm!vt9w1 znWm+~$!R`5*ltwBic}2PdR-k6TPlBz8fb(4W9FK>H}kWa&PV7K9xP9(OE zWDP|P1+C_$6rydk&CI;GA(CP^-;eSd@+c70N^M56yoQh=RrADLapa*%%3&0Et#7f*16RR&+w#Prik23=QiPggz7P6fFhDUWgb{&c* zF}SH#9rpg6`1&tY(bonX2~PlA7(7QT7Usihm63c)>6#foYNZ_tada4~AVFIN0(a8; zp81r^8p}oAgrwMjWJodn3Lk>mB#0e4m80LTDrdFu5lM1Xxr~@sCK2_N-kP1U=2%)%b}1&@)5(#-8sDw?_qSGd9|?$v8HI8k09O6*x{zvcr= zf~M!Zb5}CO3Fvpnm7&Nku3e#r0;j&{)md3X07@>S4PQd%(|TV`*={IIc;Tm0vQ^lT ziE{iGh>a|kXRYU4qj%cBd*ikngvbtwwB|cX4gC;Fl&6s~dHCD@t(%(LpV$k>=I`%E zm74?hX90-6TL*8qfyf{B9lMhyQGa%>ZTSto?fv<4!BXX5i=7xSEm#t3gcZUPz|OC} zjPGs-rr1R^q*9kXX-{IY;cegASNUEnABfZh>d3sHQt<|L8_eFDRWI&sM6rANrqKY| zpGAS5dp=uh8s+{L#A{BMt-baJRkgE6QRYIvBApUzh8$!Ev`g;R-4Ut?RPwJ{vN|V@ zI_W3QVP!Bez+*nD6}OLGW*z{H%@)V8V{Zp5dY)Y|r@Ua*=8>4~9SA>wig&@_=)`XK z)D8ha7Gd`YpsxTL$9e#$VT>-}+f;U++KquryGb-QPQwG}T2>p5=&-A_G<$z3T>p;k zaRSC>d%G|3=MAjaJyoGJueH$xS@Rx>nP^6uC{JIq6l2jRpb4+!xD&B)TIuGCUXA_s zOL){1-*_u&TQcBIlJWxSS>2s6iJxJoSX-@g;R8wXG9y?Xh;`w1E`EKU&0Jg*&M&sn zHMW9hq$@(X^VvQ5>E#gdd-v{PbGTN)PI_K2OGmp95i~Rn692)dOR@xWzQ1uYCx8G) z3uExl9v(-QOSD^PqlAw~T?5ycHiD2K*=9V((xe zg%3XdwNY5GG{N`E&`Twl0EeJxGrz`2O{#o4o{}h5WGbMx`jOuho%4l+(iego3A&g~ z+GOb&mF;c*f&qI%dX)OXk1mB%_`oiBGn(@G^K$u0vd}!GiOjgGXD#5^?rLfbGw^8f z==a=lqTPkQr)F%JH8VH0;8*BOZdMx{<>4ZhGte7$tx9PAyV)D7jbZXfLw3c%c}fadov_mx*W z5#Z5<{r-F|^cw?JxeGb^S>93A;@p6hU-KM|o37oIG;uCy>by~l0d6zli)h z%ZcjU_HTBm6eY~JT~he7qET7lwR-jxQT4Q2tl0$LL}G55o#x9{W#QmoRz_Zget%Vx z%U+^JM$3+vdrx$+#JT9ss^Q4V+f^X!Z4<4?zrJlgBz4W{ksZ$^!be={@3l3pryN8^O6*M(h*voqHcwcWyvnK^!7lnwM(wP4v5bf9@%Vcx z@?CnW$T)gn;*XHD_J|@D^HeuXDZSdG{YOxf1aXUNGQ5Vatzw)qZn#UuE8fzDjkvxBM3c+dKzKUYf(r-KX&h7$kyPNYdfZ?)3R#NKCA=34xPg}< zF-$X393w8C7N5R%SM$FtKtS|&m_$6Qp9FG#PcpiO0Naf2OIIk#op}ubI-lrMrZ4Bv z4tO3YlsUx;an~pUC9bS;$R$;a%v&$UCjS6AtH`}1`)z-5$G#PT<#+#>Ur(n3gl`h# zMYxn7vMZgtK>JiQGyg}?Q zU|7SO2+Rx^EEksI(cNDxfKo0)^|=azxS^hHU#s2l*p}WqUIK)0@C|Vu!Dy%`_?P>0 zP#HH@?Ah@60 z3Zx{YTLk<8*L`k^vXV@$h$dUYQEZ(uSEF|=d8;Wvz^Trt50j$aqjnO^c2)$rpe*?H zpNwT@#aQSY7=J!xkNk>D1s-_jf6L_d2lkGe8`pM3l`Gr|GK<{xZFUHP zpX!=%y`lU7;O05iuyOcPLTOF=;K32Q1y`Q4;GiB2;F2XmY)0EM`m-+4aWua#p>5Y8Td*He(q~fW7$m4ayb!6YduuK0 zFgY~Wqr3~?&GMVopqiyZUdQ|1k|7%qU^7T79gibQRmsp0W@r zb{x(gWqaI;Xm&{Plm65@Vaa|u_Pv?g@WR-e3Pm!u@J;tLt7MFA)lGBU2JI>fE-Lg-Y=#v5WM#^Wj6U~5Q`(-eBnNAS4{T*nOV&0>a# zJy?3oq46WM?eDLws9$_@hcm3XBS|z2SmEt(lbz&|@u)8q14uQ+6RSNF$$q)mPH>V) z5;-+P{KANp0Tv}!k(nL(v`oRn1VG_n+pAXemw`I7Q@NkHM++=oZryygf(|(KQ}-L3 z*k4=*dfs#i{X&J{g<=54u#Ls-LK0*l-|#cZ-3c8EBO(}0As&pCgQKJJLQt55t7ZiO z?~E*^$wa zxrSmBy)pz31rD2j7+)xN)`>t7)@7bn0eZQ6mb}>V$t-zn!oGSZabNKX64$L;D26}o z1RS%*C2T74fXy3tv2Abcu6_P1cBT_HQtVNez}i0}8R~_@r-7#_==^C%t;lKI4>caK zXi_Z2u+TH=qso^ciQL)B`b|QvGXHW}~xl(`jLPJ8g|EEy?XK4%#-Hxi*D{++Yv)>ce zKWMaBx{;w3-t_nD&Gz_?quC#J5jfG!!=N`EGpL%f+2MFH_$|0C&_y3)(O1rFgPM|h zJYj|@Z>7b%9;u_0YAqcu?C|VggBDvi_h2POCA8P5c)iv4r_?fSE`ZX&c|;<2UH$LABw2F#f?Aqy(#MPV z?qZLp)rhO3nJ~5(D@nIpsl@$kErI}a10!g%iC8^Cdq)SA>Jcs~EnHc22zuLlYAs7t zk}Ruy%o(Q_8e)Zaa}rW?2jXN^rIa4PS1L4hcVSB^OMn#NwN#8avmF>W`IfZrUS?E_ zDOfpNxT%f$8pkIg&q;I_f+NlGI3O$lmHEnG<4(}9K_BAFY-kSy!cU?nybHay6^JIL zQllw)Pcy8b)hO>NPc6;k7yze}U~thx;j2n#xk1iYt8$y)^2E(P87bX)-yp0(%Ebo+ zeb_5`xoa}~sIL)BDtcN@!b=FBAu1aGW@;S*45@(V19yVP!(c6uPgjabmRH6siZB9zhaB;vA_HF z5zrdnP#Z7+VunQI4X!u=FvO%kJDYQIe`Ct&sBV53K^bO!mZtHQoqss6z2|@6t3z=W zUtYVhHB2QX;Kf{gH>8JJZG~M@tp%=9~}G zxH~&6kbep$5W+byz84hMA%TBv01&y&kzXhP%<1K#+ODcB?W>>W!CJtP@uoWN(x_*X zA`3Me^I>@X?gq!DoJQu`zIrq86vOioTfNd+w*Q;5ez?1}&(3ihKl-xa|NmZ_+n5-s@oL89Sa z`|e)Ji{!?}fY;@yJ45K6pYvVP6?{CU4-u7F7g~U(7Qm-rvwU-xON|d)w-AF;7 z&-vF`tZ~+DL;FBNyItbJ+E-848^c(j+?APY4AIfDWOasX{t5)bJ^egB%{?YeU!P2_ zi_GIzB<5bNFZkz8;ML-M>19!rJc-3e!LK>2_)qA3?O%^_{n znA&O->UI_ir{@R&8^&h_2N~W&>O-~lK{Gq^$7%%sLCn}wL+5&S*PV@T6E-%kZPa*Q zVf-qWF9Q)Tb%9a98`5T;_NPf9mr)2V-xpNz-EXz}oOyi=ZZ?#G<#!e`8*6xVQHOy} zS?Q9zahen_X27+GcUUrePo`UWnW&ZDabGHv?GmF>5t0uJlq8`r)<8piOBfcDfe^Yn zI^LSwJ9GDWA3`wSQfEZzK4W#$3$|W-0vzll5?{%z99hay(F}jib`50P)-AeXCDz;D zsJ=vi&=_~!U{N6Qs+m-1!PV%Jvr?Cp?!Zg}Sa#ZlOK%h3bCNJAb_Sl0ETztB>z=4< z=bK-OWnY1;xRP27_ZKG=wDYrbWc1O5GOhQFnZ?7tl+a6&4hPQ@E)%JuMLHW%h)W_TioZJD# zg1~MAtdv(eQc_ba%|a9ftU_R#E)krir8WZ_gv1+IZH?e5xbqZMav zCtvol3|WyScGFF4UG&CyRkuWQsRuQK)tgA&v-I*6zoC%n_0;W^Z9GgaJY=24vZc29 zw3Z`uL0B#&;VFtu)Arh*zbZpq%pPKzwJ8}#g_+@DeqzT#l@xxqiR;XQM(?;vt%!$O zR zWsV2ms}9+py{aQNUBb4jUWj4~r0XR3)Ok_O*R>iNL+S z_hzltKjQ_5qUP*I+7~LiM{VdeYaF-4o4w8k^AG2{)?r-M0Qh=`6nbGuD9I$1AN&MMrqsym5s z7ra5aY^!g@0C2EdFB^gqi@1J*6qZG5LvvOx&1r*Wxx0pJT&ny?)1EnF!BLjz`|>UNHRQTh=n*0x>L|RU?P6+L^IFO$>wkZ-i#*$ zmngX;uSn+y66r=;q;g$Z4Bq}#paahdDF$7(+^CytGw+T75VP7QJG^DZ>GbT{UWhm~ zpN^u9B&0IpMN;|m5MC#0xZ;~>^oZ4n)zhFBQ98X?0HA9w^lz8gRXCK)O^|}AdIR_- z%&IATq;9hSoA#@LlRH^wV(4CvJX}E4DxTa66c0{m_E=*uI4tToQYgmBA1lWx%{E*9uA zXf&sS*;9IYV{2PXw09FbHew3k=fxc8<>5X@x2`s1cFYPOtB2GF*XCOx!kvi!^XgA)v?OQ_&47*PNJTS4=<<<2PDT6nUUzNsK0~vb_O`0lI++sZmM1^ zR>mb*2nSL`3m9F;(1@E>v-LIAL~`m1&y#c#CI0mjwuypC_L-8KTj-~Me(jlI5DBo; z*FEL>Pyo(rA9?_bL=TS1()2bX1KOQ@bo}NNi+Z?la3Z5Jt88vIIi!2$<%70%MIG4m zi0e>`t1wJP%g1cnd2XtGnF8@$YbAL1*)*lSv2&D)7I0#~sG`=X8NFho_PEC9WqGVh z8bcTRjcV=sCnwiz?r3v?$=vTvk#Ka>eq*OV{^~GAwnlwA1DROKc(pl2|D*ZcQEe+~ ztLuMnz$r#ipBxVUlL^tWyOiDWcc6ofR39+4kG8arjyB~MHb9GqCKnYV^M_#0UcSxW zR^tZ7PYbv|${t=}a-z`FAeZ2p{NDJ@xK1y&a9qEIu z)J>xC(sj%IX4{l9o_9i*b5v_v&nPQfdR^`|$ol;V06yva?1ih8JoJ*83g<7f`f`qR z_lMgjC6?dJNypr71y}$p+g$h@Z+ih`%jHXCVZ4X|DU{O3-sG_D@otvg9rs6JEAWZB^{}TwQHdw4Cyg1n3PY*Xn z*+^R3<@)R0gHdIsmCG*a{VQ`0K`;Rf=d43aD=Mh}eiw1fg^MIA!XDW+hZVC!nU+JQ za!O6ucvG$7by)f&Lik}G!ZmhGAXRAidS|i1(j_FqJtpL$9zA14&)rzH(F|jyr-x@C zc%MBG!%Bh8bcq;ed{Y!~j)%(?WR6q@ zAb~u!kn{dgZ$TOEc()o^d{WJJQRtkw*Fma7yn&t-=^Z!; zm;p;wkLxuyF0`8qlakl*p5_-No_?)ncspY$V9H zonLdqgoM6?jw7qEV8zkPY6#gr8rZ5tqv`AU`p;*`)=)0$)YQPDjRov=Lkg6LZDMD? zA!z^*4*W^ZD50vS^xp zhk0hejpS)F3Or*VT|~t@!GK!Qhn1C)a&qyfm7{yVXF6rhy5GniwOKV+8{&#Zh32{r z3B zX{FhZU2~Sz`E^2DackE9IVaYFgr8JC?$kgD^jv%(XO8)uRQwn+yr9+96c2grUmSOZ z`&d)2n>lQ<)bQUr28gw}(%6)uKB4c;R9QRmW@KiaMf@5e>`v&HXM|3lA#9uMw?7Xs z&i0zO#?lu=8lTOw0~f4=mRysK=XMVKLna&K68X2(hZZ!}do?xl_!Fr4P--dbj6~`W z(WU8AlE^%^8}F6DWcBI0^{XKS{5CrjeZU64V6Y=VC& zc6`%kSrj%0_+>>LLMAg%1*j9F`4&JR$~p9N4n%G$S=^t|I?^)*g(S*; zQ0|$}&BUd75(31i?JMgrt*ls8zTerWzk(G0)2kNr6H~%Z&@S!Zh$NNg}eO6;5YqUJIuAcoZCIPH3 zmCX3C!I-*wlhgTwo|55BXC)Ic`bdNs+GC0PVIhaIFAxsxYzP#hs(6S3TdpKlzGy8^ zk{?bgzoe+ponhlKw(qA8M!be329r#N0}pW6rhDE~b?Ta^+EjzW_&#@C!scumnRQb zSVy_zbIgXrK~)KbFi8+7xY zVZ3re69|Zh=oMbST7>$uQo$M*d@FnH+3lAD;>O8e@GMVB5L*_H()-s~ZCNd4UWhY8 zm&*yyQvc6)eIualE?2Pj@IHD-Jvu(EfSb!es*IL^=lUgfuIQg{Q|B#wh(umx ztm5y^*gmXjMy}Se4}8*CLAdjJ#ZAqw^K>9j0z5t{?12@=z_^@d9rEHhD7Ca2nwhQq zq1}-irbK=MjIZPFRab7~hgj>i?m(`U>p8j-+?(&7MiK~DPb!0AWY|Cw_14oWW-}^m~@{MvudJ#QrmMMM<`L8Mu&GU{5&?gVrEJn3xLt^$>pEnurbPoPJ2B-pORqE#sa_^r z9t^+Q@@t8q7@JcsAwT<#u$+p@3rW3Ab@SK z1-$gzz+wUD+}qYU4Vv$6PA_gm((*5+@%jCGHOD?uqz$uXPuJa8t69_KySS%z^T=F| zoey+^j4I$J?QVA+cdjfacY0<3tyA&h&bfNk{3lGsVN0ILUS98B()uN=S;PbgzxB;i zi5Dek2_$hUZ<#hjlgt4V0Mz6;y@fSY2m}BzQm6!3t^hDstx@G(oe=`(ECd&lr_pJ4 zn8esWrN&s?Jn5I{mfCw=?xwsnUo+lgaS7L+=Un9I-qb7qVgiRHo+zcH0_J(>AC!~* zK+f`XvEt_e;?ez#ruZN;(6_eH-jw-FpXq0aG?`=2uOz{|$hOp2>I>5iXLWvP=*9^{ z-!p65_p1! zR!^)YTAaU%|Cpulvz0#gabsUj`+ukd_Hv}K{U7oma-!iV3(vtEZ{M|U{b53}S*=n~ zc%c;;nB;e~Qtc@e&{FneO1rM&db+a!b#Huf_l<<@T$q>7(mJ4igQ*a;yVb}H$r0eH z8;G32^vP8!SPo!{M+xHpp#rmn&ClZ9-m{oLcY07$`vY+)fZvC^L2u?FgZJYNt)JDM z2WtM}WvSl_KoNax_1Zh;X4e}RH0tdsHb5BrX=)XGH>+Z3?{JIN`Jup1z_b4y`JHj& z!dhgG_J+6D=`{|{5|9na>&w|}E(jJ9HH)re71 zGwGnUzp+wPRZ&81QIs03y+<3PBE$$Osz!~V2(@d}48ABzjH*>NTPle0%k_Hh>%O0V z^XK`>=R7~-INnDjW4??wBZHn<5sjepEhZ)nk;R15O+?hO;1ixQSZJl$<$Nz>5L)Il zQ(}n)BST=5$nfl2rlSiC zl)IA7A>YP*0Qhw3t;hAQf<$BYb+Nq9h_^{r-rNa%@mH2fNlxk~pB)OH?o94wFcM}| zj!s4+K1kf6LO~qAcGiT_Zjj4OUl-hQm5LO0u4Jf+-vc-1qO1^rO9^ISrlWtwiXO!KHj>kB%P z3+T+i*@ki1g^v=Ca})z6xJsat3i5KEGn>L|E-hyzi9yiXl#}A0)hzV31*= z6>xW}N2O44@>2cc{^9=N(Zcc{pN9PjGq#;Se@3T^=Z_cb{cBqPcIO*BDS)QA#93=J zSL@Fuf%jBbs+gh#0$e{^f1uUrx18;~cS*1Fx?S@nU!ow9+)E!Vt=9jOgb>~~8$6F( zCxRnTD}v>quJTeMo0gc4dsOm5^iOJY(dqL2($h7`wS+6SL&x>lgO@LJ{`v3WYcPE(SBRX(te~OBa~;M;$ZE))327b z6Tf;@8(U4tI|}T(Xn3>u!|fI^HgHY1x5%xmx(Bx5Z(?${>nUn!B*RX}yflV3n+n>p z8$)D_<*n6ExfTZte||hXWiL#sO&-Nh`dmI|peb>s?t`ny&mPq=@C?vwRj7wky$lXcNdNj)3nv!-)3McD z!K&vJ5bkW}usGx7&+oCv^)y;0l|d0B2sJdN<8N1#-$hs&WX6|#b1;_@({~P30!jo) zp8Iga*;G&V8YdlOsg2i7``iV?38Is~%gViBLKO;V>jY}$b2+992^%|@kd&y%u+Oj3#Ka_qk5;j`DKg*QzeHUFPr<7JO;(d3=$?J zsR1;=hQX;bNEb9*xFV9ojE%I9&@z(a<#Tm!X%(?K*Y+={6cjSV4TJ?MvAMmucpa+t zo~dI%jWO9J+Cc_!5w!fuBBn3-q2-(9(MAKP*mWkcOaIp0({WBQ(AgYK6=cKg9&gdM zjfVPCGf6L!;uwEwaWePH!S9nEr&w)ljs|AnI6R0RZ-YBo8CyK)hx>Sq@Yd|>TW+_) z4%*c~QE>{P98_=3(}nG`*1rm%CkQmgyGVcu-TR8NFeZ^i3q`!8PQYUrp*m>Yfcd)q zJKN{^l|E)mRJ6Qdf^qb8k%fJyYfF)z0VwGo@tkn~Glzv_bfc2;?QxxQa+gk*jwF!T z4CrxzLtgETy`Bl_<;ui_wdzsw3Di^6!u>FY&A`cHj_rQB4^BU08>cOSYqZQ1_ z5Bp6G>KAcFx+;&s?SxUm6S3S{KY3|VG)#CkFzj^AS4+3Zg^6F0vwqa)u0?Ee zi+H|H$>18Q#osvxZ5i0~R+H(DNGoDBVz{fAp7$#cHcUUKO#Pallf0kCte-7tNK%|XG6!Ui3ZOu5gPiLWcwU7c*J+8Nkv9Q{`2 zip*pKlS|7RbvAq{ZVwO1Z93rU4=bp27uJ7d7-VJPI=H-$H%pDQ8&Hn^HU0p3QUwy{ zEcHmp=(|R@+h@1NvY)j=3%shu!^&*n`0AUC!PV#wGBRV1``E_Jhh;zHTvb2l#=GfF z*Y-~4EAUO#UC?sM5<&yOatzpX2APh*?x{*j1)v|=PTVV44v}`?X6}uPHB6Cd7g~~&j8%Jm?c)Bf*@2af$M6nN1t6k4`1qUo5II?mv{JkFN}jJU3){*1Q?u8{0@AC~ZW zoAxkB3?=uC;tqb?I<(`CzjAscyp(LOuM&L&0-uUE=W35b3x2TPA4O7v{s^fw75;N? zu|Vnh=;wmScFun@7Y`3rZ(&xRB6$Zb8xXQOx)0OJyqrgc4EoLeb^DC@NE1cYs$T{f z=cogobNd-iOD3U#`;vT&xa49{UovJsguV`aus!$A>|r}YWTqvXiMMpFVYNpA(0+Z?wiZz3l?ivk z4do$GONW1arnS<)R+16oA7Vkw=erd@~3wQO38~Sl?&NBk`3=1 zR%e*P1bR$hG3JG<;a)t)ci;y@%cmzVkJhuNDdqo1U(B3C{XG*nk*`eShM{(Ut57{? zzseMIa?gH^?b`2ehPBL9+$Qkjh-njWd8y8!#he`bm+pw0oq;1{8x8eGMNQ*KdZvx+ zq+YI#@ips&c(?aY;No5=G;aN`VXe4Hq1n&k#aOx0TO#k$+2{IC7Y2&wdVZ@oU)O%2 zIlL%boIBb-@k>B-PPAoMwdq2FCADt8V$-#8>_@t0cV}*@rJS`HA}vl_PPd>69T6~( zh2#p0Mr-7y)ww!7u%k#obU9v z8Qdrgw=nilsFgd(95HAV|CBg5608}$ar3JD28zjs?c4axLNaG7wddrlahsTyFI*5c zU@nH;=vXo_SJev-YsQ%uOmr_vGGBp)l1V14rWWxN$l5pp#(p2p*qitwUn_`hTUby>mlLxj$2BZ|>ISH`(H#sU!*m0lQ20Yrwtchqm(Pj6nsYJCQRdsBGO;N$a_?uxiBu_rYJ}JQ4$w?2X&L;-~gc4!t#p&c#rckCtC6t|$*>od3#eRN4>6_IMLk zh47Ucp&+N``RNOR;c7{{8!gw)Crp<;4!=#Mhg`EtnblF!5JReJ(Dn|dZtL?`_<>!C z9%ZyvW$nz^sj+sPJ<88XvUg^@$mqVN&RGBOo#*y>T*19Jv z<|MkL`(i&VHx2>%0{c?+hVRFC(=O3g}-f9l(Y?hewiOSaUou!Eg<{Iga( z%K*_;Hfei6Y6Qa%U1qU-v7<{Z)@K!ZTXz$h&>^=8ZTHvyYo<9t{l`p`y>~r2==4qd z-`G@me%>Bs^UrvO?eRwOeAsaS9iq(U8SHLVMhyEqzFekQVcXm`!DP=a3A~E==<%)2 zJR$Sv&)Hct{{<`l&sV?iY&iPmt`f4eL5@kD(x#9Rns8{AD$vEwug2BBoe5Y$N0NDV zl&*Md1ZBCXR0E*Qh9fQ*KnXnR``7ymyx63w7u7>t{EQ#<<*xbg$d?+QP8&!gy978B zfwHBgj)_K&3SwMe@_m1=OMwNy4?j*`isUq5_m%(BA%8B{zu-E4^JAuqy;Jnc4>xBW zv)MOV_$nb!MuR(p_BhFoGK`zlWYgPQ<7Jh%RwjXiN$dJ z_V*jV>6enC^vFpMhm`4jX3CzokS=VBM}uY^kakA^AGn-i3ysYAL`FL|kqiDqEFN&4 z!Tb+7Q8FUa++9eQ8}#;br3_f^ID~7V>EHEI35KQJu~C9;Hjr{tZXY zY&lS&86zXUp({?xL089lKDm}Qy#0+C5 zwk0HfVSG{l7k!tXU(q~J%PB}jz`3{a%Fg85;D9Cn`-_GF^2gV>qEcek>#*0<7%%Rq zUeiyZ*E*(VUjMbh0-U+uKwC`TA`@8Hz_LgR^(H;ehk(U-#8~N@O|HLT76+UHTK6o! zpF>G2r6j|Ih`8bbBKsreX?|2MgE(lFK*Ay2xkN&bZrr-dqmfyZ(0%3NK=6_gPlYLU{iSh@{n#@p*+K)8IZ-N|$M#pXj@Z)F609adN3d|Q zII+aNtE}4UA0#I&-l&&svsNJ0(!6i`GsPYfBvx>y3c8ci>GWgum|90DM45%-A4D_+ zqPLB@wTdILB=M#Xv<|aqzUTZ`SVD~;0ARl*ude+}8~PL}S3ppbn<3BYz-D$24==*` zXDVo|x8Xj!iz;y+c%Sg7w861U3z%JD4Y)i=81HKg@`2I`9<2LygCnzvaaj|TzmV=v z^SMIKZy{!g@f1Ri4N{(Do?kk1Id@T9;%XM5U<1~PqOoevh;j7-+b#WR}1ZqK(}S5a-E zMkkJa8~S-Ebui78CHq#x6aA$a^||IFN(JTR{JyDsxLQtbu6hkWpBIr2 zN0O-!@V`s@)YcquusQokbn)=C12p|BhxTJ`HYW#3?602O>>Q)5uC8L{!zf4zx-mUW zO=PQet+if$c9r1E=|LR76G}oH{3*&XMYZ(`( zu1A07bsCfC_$DI&@QgfpD!zoEOEjf*KJonHrpR+_nv^m7sEUL z+kVjSu-1S4Moxk}vt0vZ9lD z7oGlK+(9~0yG)W^*)z~l^$S?wQUfRh#ld_Uf6NbfdJ{)?Uy@4T2S)5V)3vYfY5`RT z*=jo~8T-FStD@u^$NROI*v(f!m!I{PlX%BDMSZif z0d3)Dr)xp8W;K_b*ngW}A6Q-v*lOvC`C`59E9uhMq(6P5W@oJ%*A<1BT1nX7QXcGP z{+P#R0l=wCKqaHW-*Yh{Zih4nY&~S=-$YrivV#k z>$cN@^#CO5341PTPqj=~yV(zCq+Jti%q^|Lju=OpxJKc%bvT*YElsbxV0Cz7_LOe- zQO1^n7Gi(s4A8Gv)#tK6B!E)6Q@+PYwwb5t1_e}1+%3m3PkgdiH>Y&p zcZ>;aRC3N)7(;RT*5E(Jv#VR1nURWfZ(UW!=|uvHA@TWquFe$7M4j@{&vRHKC*Uii zVXapt9Z+Hnbp+ERaZkR>M0{Atd*54AMD>k2TE0882MZ%Vr7TC85*!jWp0!z18(m*= zuxF8b(W*y+=XOl{>&DZ*4Fj?hhMul;I-)K!tT@?}*T1+Ot?&8gP<~~ye&jT4ofag2 z(t6>vsqTL(Z*K2OKAp_){9md<#_3V|VsNgZ2{%@0GQad))Vgyxb!$ao7_+OE)YB3g z#6NCWw=nBB)!Ml6I6E3!xb}1Zu_o>33hdi|ZZp$J7+F>RJ>_8UPlvAN@%IGNvJV=f z7@?1v>i01ZFd5paLftCb^BNb=*CNobcD!?ZEm+_9(rqr!Z==IDF#6lZAIF+|Z}Lsw zz-%lQB#v_ovh)8DGA-O%UOrS#`W>M5tU|V&P9mS9c@w7L9=ar_rJs)w_$vMp>kquB z64Vf9x<}TVHDKk~6BJCvnf(JgqL;2*@8<=w4k>r2x3A%sc)MU$uFP2zjDUE0HhsLw zs|JoT*}BHGeAvxV=%$JYb*{ceiWqlO)#o}XJ!r)+;;Vx%;nurmK@_H-}L*?Z_aW8HbdLgVYdW*i-?;0B$qg@iMAc9AxT=WX`OJtpc!$N+!=={FmiHA3D#rc z@(NMlO3;1rfLkk%-5$-(qk7+#;)XJ?cTn<`Hxf(8GeR-x>P-_wK8if$GWg8Ju%-O^ ze4!YJ+jyPF72p@nai++sfJUlVo&f>~U%XtjX+M5RmV)9}E_3X*36 zn@gyyJJ=~yW2nbl7|V=pp$9|yU38?+@^`VKJ&s9^FHn7CdbWc~lEy0&A9>@3AA`3B z19BGLfvpN*2h6NE8#)@U> z;mB8FoNvB!J`kLx2Y>6vN@yFlPnP}+QZI@9_$8t%V8HHclU9u>}4{{BP zdYh>Ab+(nL)4!ARCQ*>#p5FlkMMX?8rD=VWRVlLgb@m(Aa%*^#4Wn~%IkE^@ssyvp zqCZhMLOpJXz_|B`$#r0b-90sF~_| zdMR*9t;IAM&y>t=;SMH_uvbPE=@ZV$WemhdXk6>?CKnW@ca(0dcoxg(H&SZx zI4;1)ucm|K!J(ec7ff7fUXRnP8tz=k`QwARJskQ^C8LWh{e7#8DKx*SwwCZ9RnZpAl9S$8DRbS80tnv%6FV1KtLu}riIx@+p?&~01fD)l;G{vMcsQ~WSF@v?c^TZUckuV74l7K>Y}a;J%zJ@%GYbq%_2E4Cerp8XAL3Ozip$&ZHI zgIs&0BcA=0p1OYYSo3Tk_jKo)=IKsT8*O1g)aLm%ebZXt>1c$p181y@BpINtkz*cR ztk*CE#4V~w{P1b2s~h*oM$LyEO@J)NXI?e9G}C^Bmi$#S_Px|kwGI1?kY5#s9($|7 z!B&(RISXcMlELg&&!SqACsd2J88qt`9<(aN;lH{-M^hGX_hYrSD1J(>ge+>m_Vyac ze<}W}0nvfg;_?gYP+PuNa}T)E2L5uxfK$PbKP8)%k1`DzNlFRkm+2^}Z3=6=$t0QQ z-cp95Q_FCHLxD+)BR#4f7WP1ZxbDk&>gZ)$A%ah3v`F;*B+{}!FTi55XLd$kwDW>4 z_mXGm3kB=ibfO{FHM$*FP;N!RvveWhVDe4(l5!RpV(+AGYB3-HN4}tj8T(A3Q5C{g zTw8Lxatl@dWigMsfZl&R&BSIHlO(6O`+ir13MZ z)(m=O%=dzjuiL|s(dml|<7sC1HA%Nt`58s)1=xx3B~o$)mGa zU$Q~hs7B9HW>QTA*2kt(Q2d2Gf>qx4RvOMJ%`|{SpjPdG ziq;mU{Jo`E?smb>XA0(oU?(mEdVbQ3LjBzEV!*dd`_|{#5!m)FIRib2nuLrvK?uhj zs@vyl3WMxsy^MbP&1__%&b71nQA$B}*4&y02n+m+j;TeBy^5^`c) zM&x|4n37k}7&I7YjK|w+3@b~h<6m7Vd(3h{(!h*OIYf^uFUmB}2*!oVdeJ!eSC}nZ z$i0Pg*p5|oCY|N>=US8#NNK>O|7tKZI?nu?7Bi%{fkpA|Id)$!NdmrhN7^*g@?C$S zRt&;4MMg*m-j2&rouyM*klm$)iyfA3+`3Mgm=~)~2YXmVL7r)VlSz~obCGq}Gi^{H z3rixK9o&<-T1ny(y8~0^qD8#yid>>v3T_`~*WXV#{M{6(Ep zt6dw^e>?eHR$Sd3ZaqCZJN`1T`}^+MRNL{$_SupT?caU(S-%O8^Ni^Egl8{(iGsu!0}-x|#YZ=V-r;&-q&_mX`0imNJ%HAO~3zC#CYFMV0W)n3Mw z#V1K4N%=wc>@yVsRG|?lLN~>yQ3|N6h|YEPSt-a~jZc=uLLXF zuE0Z?Xqggz1u3kTfA~g54W@&|YwE z@V^9L4A%m~pi(}#vJx1CB{}A>!6{Mg3ec zUI2`rqM0ed`|<$ieRT}JfmU1{%{+UdC1LpKo zu1#zmlN75!8bfS>OA>nYmgJYro=lhSv1KGY&gelFHrZ4R;3a9> zrc$xdX}9wYpit@eMweo&&YSXyEb!;|FZgCv!NEZ7wT8xTsS+x}iTS#j0=AUF5W<)o zgn`e5(amw$JcgM~<(uw1(%1NoK4Av!T6DT^;sRrd*PA4R`|JzO9k%EB#ptdE%!6Ax z^w;!+{}r?fgHsGa0@4|Iqu=14=KbE+O%EjC2@qYg6ef7-Wvu6j{&`qoHQ*mXcED$Q zd`@{RDM*X}ZumudwtXFOyyHhxoD1C*I6DfbJwLnK|1Hy`DkzyfykP2KbM{CeuTXOHsubFHMo* zReMhv&L2q1a*#w+uv%Mlj6TDrUjse;dqV}I(MTyseAxq*<=HG$S_o+9nQ}L+Qi)K0 zHw`qnsLOu!&HX5-pZX* zCz-R|i1palxC3nq54!9qtgl$gMZh@reklCVUq|A!-3GyG?Ks=Ev=8rg9i1(PpJas} z{7+2P{pUw#dGkLlPiP*ubKUz+pAg9N?cCohL#eiXJQY@Z@R#>M9d#Mg-%j>2?Y!^3 zg51tC;(+r1TgxRq-ncDfEC(kWqP8OTlx=Oc81_R2ib{VJy&Ur!58l=g<|WIJ7_#h? z>(RRDjhmE2115cj=Co?GGwYt05tnn6`4=Q4QXC=B6p;DGRo(nm1{As?$rbRptw^^Wtu#5ZGI(Vah^r!_5v@5b<9qSO-79X z4kjZ@{JNZ8%n2U_0ZcwmI{tfuG5EvRq1{5eWMNBX-8gvW}weesl9cA}Nw=F!y)opE@C#A9DI$({e8fE&-)p z0$09W=L8NF#7Hv&Q4790$qR-eyxK4mhnQllmGL!>I-`VI=M`3M3wE51rN3OCjuxz_ z_=>mzGcPBT&$~%}-RseyU6SA1m=x$C^x*L3s<6l{iRd_$3pw9mU{e23JJX11R$a>$ z$;|n;>#f0+B^fx;2k2C7a+!x&+(_$=r=hk9o!IIn9&z^NpuN&-LA-O<>|o3*OVpjrst-_CH`595aqA z2E>X%Fn_;uX2%+uor7_vrR330aTM0j+ z90W>EgjgUL5m#}MFd(y3l^k!Siq6Aq)U9It-6Rdj`wy?O2ZivQRR9hDZutjqDjzR} zUn#c`#R4+E$}L><4^W9luxB!QzI2>$HQrKo;g@E;;4;8;0S1~3vyq)Nhl9slGNI6G zozdFJ(pXCiCnRg(LsJy5PvqU=D%`Z}Jw}0)6q)>P7;`Zvrj!L+Gc59mtJPz(%~q`V^N z%L%MCPqSPKUWA6pn;*2jxv=SB@_$q6{kD;sBiXFe)>(Di3+0s=yy4-J--gYlivaL+4yy`wz6T7a%kcy&!T>XSjF z%t&JgKQ?XV4U~RU985))IIZ!M%C-H%olaaHb=9Hv#pF+1I0Gg zii8qORs6=%hulo#mjn=`~jb znQeO59fy`Z0@T&TVafPOy7Yl~6BR;RdlchAkxryT0>*9^Q|b^3)gB&Rch0%ruzAg( zMe#R(>x(jZSV(4|-!PsQ?j0U1-?k0^q#pWd&U4ZV_}g`4Y*h^U%a9V=gPd3(Uda$#V&=FNY8=xbC2X+ID7o8fm9$3R~zn|-Y+5Z5Q6L{Zis!4y3 zu`9}N`g#w+s(Y{p9OLZh9SukWd=ig>Vzq^M#pT4=xR-~?cOluRA|!)Cp~;`1AJUPQ z+Rqj^sy$W+MOSPUCMlcer{`*{ZCV3AulWTZ{mDJsou~Z{PwBJ?J54xSXghs=`e*p8 z;{gqGIwg9XaQ3S$#CpBtXy*0$CmT!nLt^OkzzIWDy(y(tX@xQu!)`j;S>&IckjaO4 zOl%w<*!<%Y9%Je8SLMj|WL(kXPU`Vb|1jF07qlBgYrBWuiXal{#7F#dC%Nbi9@?#< z|2&2FR&2vWDevpS-=CTaVeA3dUk(|=D6Q92*yLpMD`#{@IGM_GJD(*fBMNX1W0)St zg&DJ(P#R&s@gauU!WPpt^PXnyacml&4$8mvdWzGR6~-PdGu!sKIs19OC;!Tcil`jMl!@$`)4evDHSq(8p|95#dx|}p zJnlLt?tY>^eCh67MvB|1_93e(1``X_+dk2)9wj7F=sq25LRRiBelWbHU^=J%Bx~aF zt@g@>^QZq4+f2`R>l}T)SANP)I+~M78qVMLm~K1kYa6hl&PH9mzJ0IqIu>oW)4JVR z_#p2=ePGUNeXd4{uxQS7Q}HX_`j8onDct>vL^L{+gfq>a6UBN5H-`RR&Vb!n?JqkD z$ieie9(noj7m*%Yhazqj(NudJ{T$dj0(0{ipqBRP@inMgv_?p#i@aczQZOO{r4z;K7+4>i9VP^!Dc3pRM}v zyHeH@zfR9k+fULZ4O6b)3yVXS;+yoHCZZ$0Y`EOy2m$(?7#^Gpxmag$afE#1X~a+| z8Q>2^0PR=qa(qN9Riss*kORuYj{9~@HNV(nO}Gu2 zI8xcObtEI8GwOsApR!U8%YKt0LZn`=lq8X_okoYm<$e@_3~J+9&_%vT@|* zCW+g3<=_*dCZldpXuBt)SFR9OO3Jc)h(KM$?EYMxs?1oYP;#(89>N=}D@yCOv+>SL z!jHam#i02q+ls%F_W#HG`rzc(URlNXr0E{jDm@%(YkfRc{?K>3MG#hs6cqFz|Y|5;C?YFSwJXKUffQ5&L!5mDCcV(JfUml}e!=QcR zKR(!2PO5p33tqpnOz;h$?}6rqw{|s-CTXup_rH3sMy6flbV`2qCPBypZm7{s2d(~# z)a|{h-aM>2lWO7q@McZCWE#D1h<_s~BC*rEZljL#-E)=!V0`aD(Rd?+SbP~mT4Rfv znFB0|>wP^Upmej$`Ab|6Tp+dQQS#@&oO;Zq2zOWP+;Gls3pBcGs>xt{G!u~t;t>ND zJ@52#FpOX`in`fC_y-qn$gP%&xA?Geh08a|2_&YL(q71YZkAYkk7B+U4LgTlV+Q!T zzogtk5UnVRO&_FqN}>XsjGQ1+P;kO!2sEYLh;9LX(~+@W;U=pW1K^Ut3Zadtz08?k z%DaH+PB6$f*BcL~2guLd-?j4?=&GzekM$L#dsSb?!w5p0GXOa@NqYWxry7B4qX zi`u&;r2+)7LLWx8O>vmthR39dbxgn=>o^t6ttg52YKRl*d6W|a3}+RH?OA`R(`XM} z9=n7$?2{CWh(jdCM=RkB!?U+TqGM~HGBCI}Jp7gFBUP^)r?e(J#B+W7 zi3M0R@DHd!c57i_!9a zL9l!7oUE=mJrt;Cs^xWGyAH~H;1!M*I1x0fJM3LVn}Cr%fbVlJOit1vt(>Mm_#R%G z*`ki_i-yyhFqo#ZhnvHxk-n`#m?dcZ%jE>Khgkk~k86xGaD`r0)b0^jp4eI_q=SFw9}XG-8<5Mc|4tu^7j7zC?W1W zcZm8Px#sweEQvFfnFKNWcz~fn+YI$}3FiEN0o0oc!(lU46eMM6cPEoW&ZQ`6$G2jX zczqm2SvD<=`;%EryHVJ?0|4cd1O0dqD5(|Fo{?%#FPfCbhywXgF&IqmC+o`hR1FvI zm_Dch%*q?1`o48svb8eby9fX=M+HFEH}{oWwkO>XmT&&ynW^I#sLNX(>ohZiQ=zD@ z({5$>uq4NTWJwi?Xu(2!7G3tMZ?|Fsf;vbe>_;TUqGJA7^=F$@JUr|uxF*GD03T*c zIWO@RpN5Eep?xu?s}^7tao^0+DB(k7fH;eJYDXzVz$4be(!(icH8H}V>Dg}!IRVRb zRwgaGj(P<5N}9c*8}X}AZVWnRI5U(pcPsMm1tAQZdgayNBCSsnsgHS>#HunOAN!du zm9u#=%5dAAwhm{nISMl_yb)i?R9>O2z0ZZd#Z?0k#><9kkl^lKv-H7oTwU69-F?{h zYNq2SMl#YT*Gqv~`CbCV%gb_4aNW@xJ(0QGw;SEu1VL8A^ zPK(H=+ntUI544?<`IH?~X+Lex=EFhu+@~rSyB`ka5Os@BmVug{)UbV3m5|CWII!aW_?ZcQfY@YHU0xc5N%a*o?+xgLd#-Q5_FOQK&X=n;6K+xR%}WCb_0aBKJ^$9_5s|D&o68JM zT(AdaILKy+sc+PY3&$viOxu(lMZC&b4Vy&arvrpG=SaXRi-_4$C^-xq4cyQsetgr@V zajpl^#ULa>JNeGsVojA_;r!RAW7BWlcVc3uI7{y!P(=DpPxGvXLB-~1$dFK{RPd4N zs-o?DTi6U`JktE3*rG3!PMG3)a$ zO#dSIzN$fIT9&QhBR*JsY(O&sJ7lY0MVAkpfeASPnR_4OpTA9ec{dBI9R0--{qv!R zx5+bR0#UZ9dX+#XN=C;IMT!l={Q4`cvlB>49(qdslL6l89~FIi zM}r}oyfb-K#S^r$HX=bVD68A7&X|DD*2%XAUg5Z=B7sp(MI)lYc#FcibOWG$k$Ktc z>{9&YiIT#k7yV8Z#0bHK2GB(b3Ghr@;QT&|j_r*TpfVjBD?C8->fSSYyY0KD(ZgKzM=HTpxzFsd zJE*|9?a;O>Bly3#veWl#np(uxJu%L+^+Q#t%S!(<8prhav%TM$eXaF$by9=%P)@yX zR<$gLuk?_H)pg>gXJo)qBG2zly0PtKRk4kE$FN}hPqwH=TT2Taddw8>N;Ib;%`l6n z%ct*%DxIC#X`*v;FDTVn;IXe_5P7kweR-aG4CQ3QMf4p6Uqp@Ml!m37Do|QCuOt{z zed%)8#9BA-ow0k&t>YM&j2=P1!;BlvyOY-Av5#C-uk0;w!h2`lYyZZ zZ#FbHXJKXN+$81U%$DHoPUxfV8#|q8&j~O?;EpP0cd={}VZ|uc|HZ9~Fo*ZWc0Be6 z^W-s@NA`o{wIjKTZb#D`bM2*;8^Llqi&I31T>Af05s`^K~DA1VE15Cq8qsha3zV-W;iiDNb zA#J*dS~PJIjkQw(NvP|7fiXHHW5Ca3k#J{jYNFAD@^fDAxH98LXNMORZlsb`CApvy z$$D8`I4_Kq=xYo#nux0oJ=*(cth5U&*eMXwGI61cx;Rr;mL^-?qjGjw96nVaN}*P^ z9UFaKr`#)B_HR4fJlPOk{k`lbx}ZF{et-6f8694L-ckLMDuE!?9W8E$@1CA&td^tf zj)G_wD}V9IM=CDc8oMS*L=$`T<58;+8BrJQ{EJ5xP*d@*be z1zgWb4@UWnf@7&LQ28Ht99X^BZX+xc+!{aRIO zuX8ge;Rrc6H>A~|N?cz&5p&X5)1UaWCinfLA%lKS?x}ipp;f_kCnF!F3;ywFqw9KZ zI0o^Kdg5kAOWDdEhDyCh)I8n+4@WBB_&q&Mu|3Pfs}2oktQQ?EUkd+@&X~NdxmAy; zd`_3bARC^24NQC}^o+Y@cq&w*qLO3|wfba49slw@H|(g>yY1|h+BRPw>P|EV$Hu+E z^JhAroJf|>pXkmH(!sp{-$$^mIc%JCbOs1JJN=?5KOL?vD8i>8O-vhTeNss~*`p{^ zi5|p=WFX$G-><}Lb~QlFRb@i{8R+aA}RGmUcMgy@u*TX{JO_{R05=fZF2fs zJhTCQ)At?ar(5h7nA8~bqxF)=8l5NCCt^&NW$kcy)kNF$%f-rV#KFo_hM*H>e#RKI zzR3(LkkJHgxpZs)rpF_GELtc`b2#74jZCK{H}7{(R$_tfKJIQs9QeOpa{3@9Jhu+3 zy)+XC7aOd^ok{K7T062-PPn!zD}EzEmeunHFeMNngujU>(KhL25>Cuv7|>>v`cp zDS~T32#WfDM4gK_)A1kwXDGL_xr>;Q7-1Gsa%*yFa>?Y9I}?&yxkhMeuG{3YAxVfK z_xm+uVo`+LNl0?PEQH^_zw`Tke~#l1aL(uRet({?=j-vHR|R?5^rrnZu<@I(sp)}- z4@#0yJjss3Fjy{3S00#)Lv883<&-aI$|z0Zw;~0+64piGF94mTcn!L6#$8zBd|Y9< z_G9BWyvT|YuIBF#`i#UH_V~0#JKk^%6`7B4iGc510u}%I91GE!{}Zq?cdsbz^SO&l zJ(96qgaFL*i_FVHvBDcHOggv?k_$(L5^EG|5wiQU90rZ!@bIEkSvac)VuK3$?|Lp>}y0TnghsTaU4d>OE z1nkD5AiX$s6YLV#>y26GQnpTnjQef>+xbw~O$?4L*j&x3CM}uMk^nIOCiGJ?L@zDA zTwao`A*}vGB_A{5Nwg#7O_taB7e(ZX!<}zP@HCRu6%hN)r&WSY2Zz1hg1=)?JHpnW z_HV6?@9aq>XxXs|dUN`e(_HQf${GJ}zxNlik z8f!_%;k+3y2Debc>8F#PWAs_Cvn1C`(=|5Ex;=107A{45zNJsXr0p zeTHFSx4q;nKnX|~zH@(KZ*SQf5*-_Z044=`jP|*m4?|?#PJnAN%E}F`4{|jZ{n}0| z3y*r={V?h1)Zv^tsD7GNq|bj7hc}!n4Btwe|_-D=RB#i#!sCwf}pM zR$+GD&8(sG6eIHV3uQsO{iPKf-8s$ByB(HB9v6h6qF{*pNd$(bUWkuq;wFYqC|c?z zLn%FbTaClr@@s3txynnl;FC@2%!5*LY>{1A`qO>J@4;^03WH}bwn&@*_4aUN&pC!X zHH9AK9rzc{KJPcpeiG(o`M>1lspiq?!r?Z-r5$hM@VQ6JiZ4r!wb+o@T{Rvq)6(&b z48!7u&?$w(5u5$`aLCZNMH<5qGao24v|FbL+vyu{_)ZckY0ORbU$8C$Fs7c^{q1)q z&bl=625we9|DW$ziK;@N^6nTO-e{s~2X?f%C2`d~G8t=R=4|A2Q9B0x@liq)8|)O? z<1w*t?bs1cx&P;$})VA~w}|A&ce{E5&@WGw?s8vjsKs zt6-P20GkKGrII5Qe}(S!xWZHwq1|QqJXq;4+Zh(P!f5!ZGy0{UjjSJq2yBsDkc=7Y zn3WZJ%%v+lE!VORS&u*2n>ijs>Fw|C#-I<>ye=KKCT_F1PmEhmtV~=~3J-Zor^Pg@ z5-p3%6X1jf-8?kXia=hIZd@(M?Oak1<)XvmQ*U{aC*7(cNrN2+@!W4#z~Yh(Z>q zhLXB5PLa{UsmC*Qo6AvB`kL~>hV0I|8o3h|4HnE@F8!iOZr&iL=RbSIHlzeO;p1_J z%y*%?V&eI=c|v|BaDxlWgb;;h^_TaRnR~P3yLu}z$EZKoEjKa>Q@b;WfX%nW(?$?U z3{)HFc-G;ig%osf%DD8qWR-;M-CFS~DK#GK?nzbAx7^b4N2hfiOMkgF1^cty^=MMf z{$6vmx9x)|dRaYwDi@BS;e;{9-@o(CRt+T3v}KLsT=UAmS*COJ z)rft&Gvwg{U#q>HJe_$ zlD$n$AC=}=YKRP(S6lMCr`Xie%tJIWF_G{OqC*Hxqk{^Eed&tgOYrxj>FSHC^DYS$ zHiSb%qOY#RE^IZGU(Fb#28GY z%lperfHebd6^v@TwL$5~2!llM3+z;@x5t%~!^Pvo<7SSzkc{FO@KL(yED-YGg_NK1 z?a+;WJ;xLd1LfCGi67%MWm!D~THzaX=T7$fJ)|paL zX{jKs^h)z$0VsOV55lMX@>Ot>I=P_`JoLM-hXEzBg-d_Rdz2(46-(jk>^!wmILu4* zikEst<^gN&f1R*Vea3gp`+PDq)CwnzBvzO&lVVw+dAhe7q&Lw!HY@7>(mpnsBsFjI zr}YsB(HjOT#x~!ss2Sk&K3kC=^)pCg_r1$3Z*sX^vP|(H(}<1*aD9A(orBS(7uUdd zi!pZCRa+OHA${?#$=bl|i=>Ixkl^+3$Lam^*h9)runJ79Op5^n2n}g!Ud@IN@;W-H zSYNv+C9mt*D@88XlNRhpA?)BO#Uel{#Hcx0I9{C4aKJ3>*_DQ5D!A+dWp@r{`Etm< zIBpXS8e7UD8smc_+`wZri3v`$ypjx0)>K+*65^W(efxb z8rvysaJYv5DTWccyu9$2jj)-M;3wMLdzL%5bIE?#D_<~IyEQcaY%i653rNVV9o^er z6$m)q*b8j1C)K|W-ysS!tWTf*h}Eb<_dCUpeGk>xl)HbmJiXC%5itzI(3*dV7IP+Q z(KEmQPn)zdQr2S0SYv*ASoies|906==uc1nZ&7xk?O(dhN|5wFhsOIS_V3FYcrD4d zASz=vpR(51+dvBuj4Rr0q}I_UK6`)9KfmYe(QC#>IHTFvr!qUV1TE1!XtbU3yp;dI zHh|9f+%&YXUWk|u3vGBH9Fl#c*&Uwra@#l;s0kug5nFx$p+<7BMk`Ws`R!gq*LEL9tEG9J^WK;4g_RW)h24;?AYj z97alYE%IK)1|FX~rdrZHX-2}fDmAs<(!FqhFTJOKB|w@>pi1YOU%!s(!x;c@hVnj4 z>-xW=Bguf(^ue9K2ghjbFz>Jln^G9Z&tKOyX!4To;(c@SU293mOZjoCwWxppwg;f{ zy-VuQr6aWijThXiY0jCcs63*@NI_0rfyx z_wi1-Ky87g+fDIlGGk0Ey)hh_gVQ*BQv0jlv2~XlN@>zVz7E0&JS#Qu$mmnHD^XhM zOl}M8kGXY;B>{f_D{V)o&(cgTO<1;99&#s@<||%|uLhP|=tu=Lva!FUu*+aH{ilR- zrKG#QQ6UE;N%eYDIRDMPZ3dmeHtcUCMCdxg-L$^adv#&q5)=KN2!E+P=>iaiU~K+I z<-&4E+q>IK=_|twZ1B+7)J5Hi?heLU5=n=y`Hts~E3o$u3elWVYg5;ER+_ENvzWri6f?=l z{*gbs3tO8N+|fZ}F=-*Y{l|{!rFpf~&>zW| zI`4SgyxNOFBq|86A5O*|hV%=EC#_Wtkb6+ssDQ68Wn)ae_`%|xQC8yY{5BIgqCHZs zP#0FpXLY5ln+XwnU-S9Q?m%5#3knGaJQw`EDbf%q3@DAblwV@ze(8d8j1ckmOPVadNyt=x2^Q?%ip=x9z@p%`_cIO}4lu&ZSd)l=+MG9p$R;Vx+vpzvnrGJ!u|QY_8S&%-kWBA;1x z;rM5NML<0!_I|2EnZS%h@H#=*(P9h}VD9 z!A0Vhglw)h-*T3KI!Q?Ld|s%szc$^K)sUpaV+L$^@hfgQ6cxvA)w%Ff3ZbMCy@>m% zi~fj{jZ&8mK=UA>$?eGxK4p%~Hg~d?*jOOXEG-)ds5rS9-M^`8n6d!heSGDsjpuV_ z(wdHy=0?ryEOMu$hS~?98=4<@ub?na=2BsHWVke_2Pq&Y{dL5b(=q;7YM)k%}^y^M*uB49-xEDAxD9W91`1+V{x{%ZKaV zstZdc%ZhaBZ8lNR+s+qkFr;A~BVC?YflJ-FQamVR1rFzU-^?op7ww^pRhE&B1#d;h zEB9R)I?lCJ$`pRqu7ivv?c+A8z8R`V=}LJL*fQjP!Zp+oyfkyq&m+oTm(;B7>n=gN z$LN-c3(e=hzH4QNj;j2=wsRSQPK^B=N7l>h*%FT}BEg~-eKEXnew(|kAN~HlZl2Qk zAK+GamvPfPdE|e5w5>I&c64&_d3tQC#2P790Mu{KXf5`&)-^g9d91D+hCRt@Vaz>S z@qDr{PM8=t*SvZsBACnc-rim(_iL@z))~#DmYNZxBI(?cKyRNqKZZJveu73s&_|yx zAQ=Q{8ZH5VV2~kX4R^K`9oDGA?9Kvr%njWj*DDWQ3puW!(erFIm8*gXm&M=*IpdUB z3(I@LiC<^ho}?n(5>L;m^Y{iCTF%v~fK0TpnX<{xscthi#rfw5;8q&7R3#{gK9{Wx zmy1`TN>KvN(u*iI-gA|US<)Y?NwV0%S24+hG^-Th8jv^&1dBWjWq^ak=~Ng zYg4a>a+T^#@hbAnAkV9@Ri|cv=l|gN?>?t(;ApeXueF}u%%f+MU6NK7aw)MXe4vyN zei!&r#B{-ccB`F(Cz_?AJheArLr7Cn7isJL*r#qja9#W;Q0%CFhCB0IPi?AA-JxF} zm7?+Nr<%LgLpXjk{irPBL^7)L2GW|-45BQF(0Da;ol&DA*%bBcx*Hak2!hQ7cvXf@ zIXlFTvN#u(XF#EYI$h9GeqeWq^dO>!#0R_x|1P7{c<1#C+{o&=<@Gv6OXIi%bG@F9T;0`1R}B0!K*)? zIe#4d=nTyxXN;{z1kufVul`FRwd%F9!X;&2&LST;=Sp>K;yxQmvdAd2n-vRO`o^A} zQj(XMvKJcSeK2%%MEm7Z$Zr`hMgO*3P;IG^l2=%39(TWdpobJ8M%@@&YJTNDRkyO@ z2(P#6cC&=W;A7l9?I>_VVJnWAMs4v??Jd;yV&qg?DZOw-sH+h6R|7?A1Xyp z^lH*9TJhP{p~Ax8d_KnPRj|f%u0@<7g|z^BY;X(C!-6lF^;$o z07c*h&I?j6ag!~0g{}u&(s%f)7$T6D%FoDgje~rx15CLL)4<0B9?gPi;V090e0%>* zFl}cy5I^^kYprvsFG3dDHkqV!w6o=z>%lY zG}!M^yp#I*zM&FZ+gK6T&u{!MglQWtYqUHG^4eN=_=mVUcjB&Lf4ryE?$xM|(*8L< zpJ2Yb;CAtneB-(|4JE_WLa+2D2S0r}Ahc6iQ~C{4V}Jd3$TWJ`!lqc)vApt6SfA9u zt8Q|3$F)`2rQ*&R)(9&3#tm9&>ijq4E z52gSbkO0je9v=uu_!6E^Hw05Pm9}31Y;kGI7h>pHfC$V36f# z8$~c_)JLeW7vNID<1$4&hov@riVFH+&cR!x(J>iL%RTT9*O6kXI}ASxuuf&Uzks=* z97&#oHx1Z$dWl?I9J>zfd}oqdGF)O&l}lm7Wt=&Ur+?JHF0FBn*+;%7UR$K0FmSog zC7QZlOZ!Q4#Gk?yMiaxTpL*W9ldbcj{ z08N6ljlSX{2l&9qpo_7(4dhyH!G)1p{-c6f14wxXw?*pX>x$hy)B5N31}(5DELa?l zx*eA7j**sRx};ZHet&%kvG@oxZOfZX$+rp-P18hdow%$|g-VUpt~7_($w4bAjbY-w zDFAcsCrYy-uI#7&IsPr1Xln z?D967w&`%e88T-Dhc#>LbRSnG<~D4Vg*XClNGNN&&y&sC(ZM4?Eedx}Q=!Can^25hY4*|VMg-yOT_Occo$F%#o7 z-W>FYkSxW%WOCc#@=8cxs^WN|VOz7e_2%{fq)WJ>^j1x)gAcC$(uxO$N(LwFbS^38 zXMvZQ%m^Qm>G|*GyhU~8OC4%CiS>d_QQQ}isJb6UnCv@#!!3I9eU2} z_TlA4DgbdpCI^h^A;+tWGR|DN@wZs#6m>&j(SJUn7Q770o#a)9Eec)hsPOdgKD#39wiuX|VA0cs>@ajC*RAX>`0o#= zi+B9fNGfw^!z@lrh+JX9W@!GT^~!hXZqSDG%NDk4qnGaGHriqllEwqR{D9m2_g2oc zX)zW^kM{OCiyqyKg~|Ar1*k#k3xhkAm!f+pjXRnTuOK>ia3tx#NS-%F!J;<7H$$=S zgrN{AD98+GE^Pr%j?03ZZSaHHs|2o9@)Rq#z^Z`k1|$|TF~tgte%{dJpdg4&ybKO+ zYMxALI-h1eL*I=Fcz!d3-&a@|WV#_##GCP}QXbW1Ae?G3XN_ZdBG$Qz)sGFeWa1cj z4*y~9ByfgqM0#S}+9Zly-i;+#m60&_*%W;LAwmzhghe0pn}DZ$Y$>YyJgBN#R;lf^^<^ zdSa&Q2ZofnA8ZP3+-tp$H;5NnTvB^MZW2Ef1N%5=zWw48L6=l+2|wUFTt4)mzm0t| zZf}7lzv1A7RmHZpwkB=()U9}QLae3UFly#akAh4P+!w)F&-@lVp5d%qlNRvC*T4|B zh0e%3)_`p*897rd@}B{8Tp>Ny;q@&aC{LQ39i8`ub*QTv{Wjw!0AT28*47?!4BKRu zM^g_^=^~NXI5u`BWLLQkfa@nQp{FX78>URSZ#`OIQ+1l#$o59$c%OGxs%%MmB4^(d z@r$6gJ;DACd5MVSzITtk0l%WwVq80!zDUM2l-br_n@v}28(*iNtSFv52@BhA{?BmyYc zl#R>-tK^v#U7}JCE8mxTSb~Nc6>=-bJGuz5rnGMvmU`Ch^jDM^L2ZYFz0m!7yUtVJ z^1chh49HyCeN=QncLWE`4)T6Q|ROXbRt=EY#0oxnj2kbHm9h#JRjng1spIh^%RvulsH}LlPswz$YIemn* z8IhINDxat)VAJo1S!^sJI$@|sJsTlDPn%Yu!41tBuY@~kKJY&Yoajluk6A-$#2 zrxu~e`q8XZImw|RE_S9ETn-OMF;6+}jck~;j%My0z<{ltz@CZ}GPC}Ol%hdUtL!Jlu1`1Gc1?ECAEYZjT+#&V7Jk*?B4RN6-0hlN> zuQ5Q2JUy2L6UU^p7?9W_3-#;Ii?@gN(6U5=bQRk7pTPSXA0i(tVkCq!j{kN6LbV3AHTs?bu2w;B@k^MjX=AJ|K(}Zu7VSS3Kru}* z^n#Awj!31+H_4#0BKC%nu)%6;Y?Cd+YiirSA^!B(!)3Ln10}T$gmfs_5e6pC8pu@u zE2{5F3~cWmOH3@R4o!qKo#B4L(POq*#Mnv+ZJFv1P+Do+sjJiM*T@a^I^~-khFwWG zV5{qfwbhxG^{(sCm!AArL1uE)nq74;qrY2sBoJGWco}`)Hf-S&*R8vpGQW0L!)Mm1 z6^Q3!h2x9AWf240GG9hVZ{1AT&eGhV6{4!(h%tJANr%Y<6iaxIv|WEOF?H#4Vc$s8 z%vxa5Sp0L1)oD`Nnt&KukJh!dk*|MS(F=$~C0ht+I|$JH5oQAXW=z;+o7*zZNJyXB z)b(hdhF@lQg(`UtLIc~|K}6nt(iHv~*1C{_GbHJKME~$}7dO3-Ad&J>sc)i%!oe0x z)+5D03zc#@Ucr`N6xcvOos;lp=ve4b7z==7MHv2o#14l1sQzdIw04tt2D<24FBu8C z6mE>452W|7Y2jTgJbifgH0kyRNPs}LSu7-+iKu2036$*xfs6erLHIMo+QLi_$2A(2l8&CqMn#O}DJKRqOnD%TKEG91M6PQdbgWxG0(2yxdV0rTr?hb-hM7s}M40@M)k8WmQaO=o4Ur#DQ>!qKWU-2R zEWWtJPX8Ntgi9!S6hxB(xE1-?Ydx%7=nc(Y@=Mr4ZTP>-Z)8KjE4U?drw^&Cst?p$ z)mfusY`fkKIE1dxi#kPQy@05saZ$&tdrmP%urY@fw%xcli0XmL`^9se&VTgHu~qx7 zgX!d{hgXWFFiZfLl;v>#?!<0j_FIZoURj^-1pX~(=^0Y{%4zLF>K}#NZO`qEl8gm1 zn)R|I429HA5qp=2E9_ONg(go+c6ifiEUxGtj%!PXU`jqcBydP{W6CQR*ytpdr#~6llqXELx5%3Q!Fi;t%C*=@N1bWza-;rFO>ae_tneO zk0yO^-)!B9G5qJU1?Y!i_jwnYAuwJ!_u&h=c@AZD+dJufUhBrGlN?MLwY`l~S`>e~ z^l6J!bV#rE~d+Nw# zXlq3H%u|iW)CiU#{f%gq0RT(gh;nE6lyh~U)zi6K zLT~H3X$YNA(ZdI`<3Yu}>V%#5hkh0v<5xOhj4hehs-{+GVW;}@s!zBk=>97$oSdpM z7j>ob9xoHv0Wfnk86K9p$ib*UDJl1Qia!I#e(xvFDo$9&&<%Pr!qf|$F&OBg%goYR z1xRdcd^)laB(E{WsV&U9tnvK(TY1)UPWm*?v26X}!uM>U^@pyB zK%G<0fm&Lc56Nq5E?lrXMjkzkImRb|*xG+M`|`PhPJkX<0;IjSJPIAVjm?GiiH9?x z&8)G;yMEX2_LDZAOji=(YdmZZDis3opD&xpYa`L;poqDZ68qLvj1OaGncDhDzPXz^;LyfcnYp)4KhlurCFck6NlRna zO2_Wk&()UFS5^m}9<8`d==Q}o-Z%Mu25Ha@SI=o2lo z3>`+ALMfnf>pR_uAQo;*JYZ2#(q>4L`A}Bjwg>M_95mnmXJ|K*=4L&bi0j6^j%d^Y z17Zza0oq=x{?_TzeS`PAXWLf7&UF57miTSv8{-i?EdT^XvF*OMCM+N$2?!3)KucDH z<<&Q>EiKJ0t(S-8`C^O(4 zH>KICxt_)8KZCPIyC;4c%RB7w0q9$Q1FP^V zg^3}na;<;C@DV~i$Axk>K3L3q^uGEd7YR?=Mgy5t2gZayav`(Tp^tPMVzn9bGRHuiTPpYK691sG zxCFi*eW4XXJ&@cgOL^$jJp4IOKtss}_obToeS7DRY=MTJw@Cm{4iB6doG~rojz73Z z=;&%SLEKOS4xtnvmLDeVp**JiQapURUdFZqpUN^{IYr_u^n@d^DCGfp5Qvva*f2%~ zTxo79%*w>UD+^;rNU(7V^Rbzmre8iZyOZb)h# zpEh8T5)%NUkl!%ZHJ~+&QVy=_$nUruz!oPQW2JYF&&6@nE!9}NZ|<_oE0tXwGBSpZ z_NdNJyul^p&Xna%3hL&A4vR!^Q=#gsS!Up1K4W#SkzXSAXUKE1V0C_R?M}55PKIXc zh8e}M(oqr47b2@kABMX6r)*=ig| zjr%0Ng?{!M)+)KYlGkT44^&J7RrdQSoabHHVd54)^$oR92yq0NIW@kfe(2JD)Hd^m zvfIjdWkkq_^IIYxaR!~%*7Y=w39(Dxx1VTKxaCq1n^p+KwrLiQ(r-8fkI(%#MJZY; zIp%(In!Au=lZnL>rYHyn=X}j9H1bLOL>u5@Hh|tYp0;;LtD%+wW$88jazhKHj!>T(!^A=bjq_+vV_1`YcKUW;|!!*frd`Je*p+Cygbd`ciI-tnQA^xa;<(CI$4>WXiW*s5P1zpB5L^cqI5>t0M{6RNp zQE3>B{la@aRy%c+-N*D{M>LxK6UZ#hjo&l|hG;9M-)TQar2vEg7#|7<#!_Y8QE>ao25gz3rkjTE~JV21Kl>6TG4@TDRA@ zd;wpH=+-nfM_$|52`}!gEv-9B!>BNeBQb#yPx3B8A9&pzdEaZ$P9RVY4i>hrK1d*1 z3mh{pS9BLH$)EX`mLigzD9New8dD|84@c#cZ#m#tW1D1fYfFXQr~*L!Z~0{CC)2gfUeY#QL_( zFjVg%e%+m2$Cci76RR4=WHNxK;EI#wIaeux!XBk2wxtb>JQfamyCkw$z!t);x1z?0$CFB%7{*_eK;aMifP490s=E`OFwe#h_j7M$S_zabU1q zK=7Z=hlft4dcVMuQ&1kqa{-2~qA!{x!Ekn>-uI){U3-8_TZ}Lz!B=bTUE+%}l407Z zgs51Q#bv)Q?8^)2o^}A4KSo;@AF33&5$9{hPrhK1HrL|ea1hakpMP|P#qo^?{&euq zL{6eL2Rn(-P!0t`0KY5kaQ73K$V(Boe_qz*uXrTwj0~i27~teVW{}*UPO4K&3t}-X zMYwTS2XqA?`S+l;O45<79bO&(Zh%X~KVxv(s54X^t6G6yn(U<#D1e@=rFa`sOT~47Sjm zA-j}hyJMvc<`LGbzp|D(%cl#IBDCMr7H(&c-hKxJkfaQ7sVcAA*%e7*e+~3sJZT=G zK-_DFt7F=$+a!m7Zrttn&_{+kU_$CMC2}>5wm?iUxr>>tFiDW9HlJH6YdP~3Kblhr zAFIN54TASD2KgyQ86?bOuDc#ZtL#sEPpd=nMk2+C4l=Q z-yJS5rWzRZZvTBwND1NLZvj;)`)5gRM@fu&@VbZRUB`hLT?u7LfMaX%_i~)1WQNQS z*D^r>+jhxg2vnL9ErUcl>FDAw2L&jyn0@qkCs;%YVBpcj_;>_#8NDW55+Q^K2$d;^ zZ-ve2TDlEC$pH|o4W#7lR3w+eD)k*%0GH7oFxs4$DNY{uYK%Oz+B|cuk0D&l1(N4A zgmJbec=`mjnBvum;@{s{_HMI#`fu}!RZS@;;I;#*CXKihf*E0yf*bd|hbC6lOfr{6 zz`sk2%-0ix11pCWUyHn4_$&J5e}~*thyP@eH`{2x5f|bOIsmU?eQggL_u$UfXVDT^ zdH0(vYI}zbDus0gltd;8IV?HW;*rAdusbsKGiLy4k6Z33Ft8sfWlNj$K2L8^8of(b z^!C-((1t^baSY{i>w4W`60G_C+Wh5sl+;5CB@xGHEqqOnA+c|SHoc;LKz$0C3_5i$ zw2Dpq-2jiGHkfgwDkET~1Ohx@yx`sFEAbkW4_#Oknnk86c-qr0bp5k?6dCXKwYHj$ z_ZdCpSGM(PsZ%f1cXdMpmEpI*g5Y9gzI&rS@=0h|)4kf2-Nu=Cw8fzxy6N zp4gbz5L2*8lTNmZNm131qkWAhi41z^Hz<1RuG`uQt{!2}g{>_y;VAwdy)=sFni#t- zg@ZAB=l$BhJ%7}q$WQ?2;$;5SOJl)I;Fu!OZuZ`-(1!Z4ignny1?N_1)AakGTUF(A zl7qlxKs2t>v{2E@#S}%)43m(yys8Gh!3P9;7#mzoRVx1V2Unnr1k!;$K+>9RR^ZPp z@7--h48z6jxXfS=&*}o9+SPE4O2q(jB8ovr>g#>JZmk_Rm&!VhERwBb(dLqHa)m&& zbx|phi-5ueA=XGN+6;^|2RNO@Qh4UT*{K`XM>10*+p*lwos3Uw3L-IjI%vIu!rQ8? zeU%eW_#HosEg5G3^dQOiC1^<{mlgpB};{6t1F zXnzYov8s6dxovNC@OWQbk(S3nBrK;g$6EW_#n0BR&w;HwO6h28VKUMpGxo*OYUs(< z!i&Cxt<|HY1Z4Z;3441+**cthI2E8Oo&qZC>!3;9)8+lh%}Vr3g1_QxdetNX;b7-r z{-N}YBK zl6E#~%20fBESImHBPxCN6u2Cr1t;$%p8oFdJf9L{jcK@QJS(AufHS{*!Cm#@oy*m2 zIkGjfz}P|j#TgDcwt$=1Fl6;enwuFvG`bUdUZ_GFWc__oQ}cbJ9ph5>x;*TadzPeo z{Grr^2}+E`GjEX!d{4;X6j=sFgwh{q}3yz4ea(HYyLAs#W2k zgUjlO)|BMA(UohiC;#?qf?Ap%tc(DDtKnZiZ4F?wk^4eKQ`O(WpcZJp|IikKF8=)+ zjE8G<6w9P}R(jqjVRrUH~NDAC)mK3 z{2Pln01JqNUc!@A@7^t6NCUD!+&8kqSjly)A0+}&MxoUk3y7Jj(D@}2&8N@0Z+icr3u0jol~ zB9&b*dMT=A{El(G9GN3aT@4mpU^D7hTy;=iUP5WIOpfuS90`q*MmuPW>F<-WFxVt&`w(5$93-H!=fF{1T^%AvB8cPIN)ts^bDeeUD^ z*Z;mg-BnDx<&bXg>b`=6QoMXl`r7tK+m3f%habGuB5M7+QFhKnhPbLvk{D@xn4Zol ztM}31bnfE`5`R=BCf#1b+`&>DgV8!!TbkJY%}~$kk|T5_K2$1Llg!qlSmDwmZ&H3m zJ&pIR!msQ;7!TD#0GF(}SUTq3PPbhePn#~I+h)C;6xn>2J_?29MsIP6h*|Sk11M*R zkSEeVW38mWT|#I)ASod#s2T=-Pz=wqQ9CUmlB=Xkic9Ivj4qOI!Krhxj-sA%Wi^(- zqGyHrb{V_oA%VQ*{w7+vssxzV6UTv>U7KtdL@v;!$O7zMC|- z@fyNs!i@{DjmH;fD&ETU-t4>$wrS*Wx+8_9>@#hOlX_l1JNRE-5*FJ3`{_Hepxb|g z4tT*iAP}+gcSXfN`<5GQ&~KUD96n_YuVb`LeUA=?xxJ#{pNAQnp&;67MK1NUR*}U01pv!1G2hi=f+&Zjy^sXmfjeCYehyL% zNr_-+)IDV3%(=CeVEu(hEZRC4#=)f3Zc~NoKhJ~-5P9h`7sAyuo+kL}(!J$W`1t~a z3QSp?S93g%0!2^^@?wKSE%_aF&s5dE?|DEyd)E2XPr|p%L8(s?r}${h~;&kfv}i3mRmIvUDv@m|>*v;r^JGf-RcZGV>; zu_!^|PKW zhP*60Y$p0hGrd_HawkEJe*FzcTx^4~nEkV>RN>S@9>zG8&5A!&Ob4CrW}Uu!usKHs z$ha-X3j{!|kYhp%57&q<<Fi2BRIv_2rBj|y_S zAdyj#oYCB6tw~jsfr2odF#pw3!?$j$tV&$n?Q_5{oQk=yaY-5ftkcGPZ*Y&o5C7FZ z^s+rCFx#9>Fg2}dSYph)m$L&PS42`RRGc7cWnb1EyFNK#+sJpH{ueKieej-;S3AH~CI)8uw`H#64m{j!nh9rSpz#%g?x2Gh z_@szuth$dx2diregskR_JX7ftm##-JVddRC~6(%93J=m`gwIGPSuOPo)ac zKQA=V=N8_;cw}5fUHGE+lD3bpR#8INxF6`PaWt2OjVKsLZ4ZyK(ro;$4TLw z-qPr}_m#V37|?%P{gOtr@Yc3m}ng>sfQaBJq4Y z&~Z4a#!DRY&Nldh+7Ipa1dG*`Mx|oMI}dPdT#Boe)!C{8LG50_sEsSi&m_)hQQ`eA zifop@Z7)h&irKS{g-RyV7=0@Xey0z*a*x>LyE;Be;XaMI^P{1zoX%G4g19{`}MZvf~Yt2pFoVG^np*JK=mQ%@DO ztv1$=N43IFKKn4p{0D+3`%e#NHn`gc>qfPL4|jHt=HI=3x(03ZPUz~IZ)G-<2$gcQ zFS|P@T|(9D@b|bS2>r2tnq+98kbc*L$Kw|OzgFEKbrGY!)`XWZE@F?n?71ENI>Ta* zCY9Thfb$z~+^tI=txK=do4{w+icea$lhTC`4epB0YtXG1ujsHsrJx=D*;FA( z4cssP5GQBYy#wWVsag0X1o5&58$rw^VO~wMrR7qeGHvgub>`vXX8j(Cs76_%nk8r( znCe*Fg!d?chO+hD)c3bm{``?)MykkAX2MaC(>F+k3EK!Ec_59MI)q=XCjV6 z36DBb#rPk#JZAkvjxH%zQa_x~-zhyL~%JvqVbQrarnG1AZ< zC$H$7Tj0vi$ z+LBRfH&dC^50(HpUhkciljC?PEP4HT*@Wu)U-t_FP;hjd0N=px$Idz0P=OCXfV0G@ zox(UQ&^%d>C{vUSV29j~sB@O@h($=s;Fa+`K#0Ic$M)qi#cgfir-YK7cA#!_PlH+Z z{~_w!!J|%%+oT83JUPzQkZE!wBz&POL{v-)&U-_f8}Ht~`$ zN4nY=h$kKyfLAcw4P&IaFFDT!>)(27U@s4fhjpKdB@QPpCcjMVi(K#9P8Ky)UfVc%kaygA<45F{Tc`O-L}I}B z#Qv&o-QR)8uLtjCshSwk4(oN+Nm#rEF(yNj#~{T3!LzuIwsU+@Z1Qrz5HHZ_(){3* z`=NMw@o*WO4KE1hdDWU1aY-0rg>^;Uk~Q8gtA~JF7z&j)*)oVaV~5e zoINKZ2YeOX)%DWH#R&4;!Q{D9cl5~dn(B-i`WLKH_-v z^1vS;y-?^&HQoEpz0e3ehmU_3dZ{Do6cR(Zb#*Y@WiH+)NMls^&`*~?f3Cik0%e6) zM%moQ=XBv>Ws@NqqoHN|--T{wOQLc)BKu7ZA0n;74qw@xLLYSRE$|3yueSc@&w1fIwtws4*Ds8IkU3_n9blWpyF7cu55MWkB4h(rgX` zZjTwRqFE|6dIi{>k&Evd+6`}s3=7_=Uz`nb-T4Ykwe@7#$>JyM1}hK(13|wUxAr!Y zo3D1+*MhwrPQZ1h?wl@eva1;vi9Wy$E0DP4FbLwn;p%EYU8XVWb(b}Bp!jl~~ zXm7l`FogU7@{Q^M7wM)$Jc48~ILgrxfvV(V8W>R3$6^nyfpJ_ixZ{kLaKdGjTtaKt zQ`;kWCn^yh`2DWTi;dB{sok;{IFDUNDcjmf6AuyEmBQ#XqK)UchXp)nax4FH#ck8t zV>CX~A&Dp~>eK#XHMxDQ8_H34p z;~d4G#V^llA4>IRfZ}4l$1=;aR`{{4vEM4<(zn+!`d*p?1WpF7=nIFZr(3e9nKv6J=elH zdC+h$eMI_8^TBFRL|QR#_u?+Gc7Rl1qC`5=9}7QC%eEwtUYb zD0kEz7zom!O*yjyY)$TH?Mz^`v*M)S#{d4D8PaLAKj|BO!?f=9QUwe81x=1S=0=gT zh(;=Z9xVp~AUK*#|9}b_f~KdyZ1L%}$#5A(4HIdDH#9|4n{}dm9%*;Pa4B=C(nBc# zPQhiJr4{hPTDhZmur9QrLE;&Btz>Wva}xk^!H1AVt)28yNHE?WF}^0U*NRea@{yDO z1Ir*C4>okNb`^K9+uO17+M>=#ZnA&Fs>T-2FHuz=keT(9k+4fyE z7+%~lexTI{!>_mdh9{&P1jH?F?+J4R`wai~=K?4YwvE6^Q#sY!5^z%sF(pz+lA{jW z^vSxtO@^35SXglI+T5SDvX-l4YU9eusn%DSJ*3Ry;we??l+NH+{jo51tA=Y7N^lBt zr`?;prDGO^#`PbME*|Jp)(DX;`)&PgpriSg5-*;?#Df8BLom_(n4CJo#Y|?YM3~t* zkJiF>Xr$h7-6i7MQo0`5l)cAyzfu+=P~VC>7Z{y!!=v~ZHv%qaq`z4o;+*D9$aH;c z%LgKp89OI_kGB~*A9f`;Uv_em|Lfmq)LN+86Yb{doEVVgqaR z?f5Yf6(f0ewJAPqd-e50i^X#xE6!g=8k7Aehc-g${;W?2as^j`D8~&D9X8dZk)JkA z_7bX;Nl|iP#06X~ZESPly(o{7b1yO}ctzFvx79=_F&fp@MQF>zn4s9H61YZyN}iok z=G5G>Ocd>u{Ulm{L|)5keu$v*sD5C{%J zVYVc7QGT0Gf)Mf`Lx+D+#iJX48k=ozDWw;F>?^&~`e(MCpXw4jbwSa8AZljyVij$u zeG}Nu4@ebNZ4A_0E%JPk_(meeq|Qpo+R9jz0wgHdX9M8dk6w~!8h&3KzPEX_1O6<8 z9CKQe$e4?l6Gd5C35sY~PaTUnEc*^-;LA#D1Rh*FXwSVJvh$yY_?0E!@U_j=42N=2 zeR)%Vg{M6g$4$+yX()Lm2EGYssHoscCGYS@8pVLYU~-{{xM^h zrq9y(RY%0Qxa#(}|AxT+i=kqP9|6Q=N$>H#qMJU}@u`>?=3RIbh3!ILu6-!9+W3=8@`-)Cdw@mYbs zbP5}#jLnC%wmm-7<`8X3r9syQtI@utW`6H#Of?^w&7hY_ zBa}#ra&dwpaGt3Gg=}X+0omty%+Vi8&bL3PB?|gE7_XTxPRzV?CGDH zf4}stv_$q{3^GYaRCuB4$^)c3fZoI<(qbO!ue-?35uUI6)}G(%9)enbc=>y*>aN)4 zo*9^wt<(K~yJstpu2}Ot>FE9rbY{z3c-{CoRCi%ydd>9U)*s#Aw^fQR>PI9+r%d}v z{zU<)>T$u}{gqN(ZQ0)f8*Y~M3=Ete3tigc3nP*6Nqs_@t|N7QCB!wU*Gy6QLB$aWtiil z7mU1e-48p;%w1W&(Ef%3gVPk!L!USCfU&7CK{y)dhn1SvY6y0-z;NepRBHXJBlOW< zf!QyZV$-A(06f^IzCqZW02b2dlQ58rX?-LKq)J514I;R;4b-`T0#*VKD#y^O4oOT4RhNsxjeTv6@%*&&X^loiK|8vjU^do?+09RnTjco zT!Ez+!Jf7-gm4xjl15;I*D-A7k4^$Zk8=5hT(JNGXjT(*?=;L!vACxK=6pVR;ygdv z0wC{Th~yDj3%jEmTn|T8IzSWz7q6-=Rp^wNrx&X($!{c2{8g^EFa=$n^2>hv`ua8W z=&#DXqH+pDe!&fbJV$v{`ocL-nOSfxtZP!`*lUB}2`SziY(!+pv(X zgE~m`I~Gjw3bpK?_<1YCodGiIQhs&Z)jr3h?x)+Ge95P9Ei_mqb19Oe%jp}QT{y$- znO;;bo~;mr`8+G9G+hB1+#aoOBYP9_3U}i&^CykDN(MHrLMTh}o_~9)3(ZF0-TdVeFKu_s0TqT$|F2J#-)7l3Wf6;wsI|2y1#&yr`rMkZz3int%{uwDW)XL!L^q zy`5|K5^MRXMN_XOeQ2kQ=7nIAYMdWlNO=tt`IhFZhb!y4ka}WFK5qzyz{V5&(?y zasMmy^pTeBf2+MJ6LU}hH4m-&?{T)ZPf%U033`7T-Y zd76F)TOcj8$1-3vL#H&47l59QXo=*km2su=<9$QtMBG~Mp3!A?X3#sJD%??D{_r=L2Bw_e0n!(KJ?85wrn{Pguvc9V&k;4OOn<=E>oVm zj$Oy_zsGU!3awp<{t%+ShLrd+&1NajphWb+IumdqGCWItvxt6}*viIA(LGtOX04Z= z03`@87?_~1A({}=ZJA*s@~p~?-SuWA)bkRJwtYHU#@!<~y{cFs3VRU%goETx_JoXR z0#5k>#8o%yN%y3hti*?Qq(ts|HdVcgH)&KBqrck1aSwowbI}w^buNVf7+wkp@i^8I zG#MUhd(E|O+*>F1>aV8owTAHZWyykUR75rQKGlWTk!bwb6^Ex5^QKfv(N`;O2PmNy z@~iTzc;bfw#KaJwcNB?lY6@AB5Sup;!Fx%XU;EpirEM%MeC_43%|Tsj-hHpu-B-Ql zG`?P;;}<9|I7kH0QXYdy$y2XL*FE0s87C`)$#H& z?PMW2e!>W!e#w+|M+oc@`shqZov6yzDDqk@DX*Y{m) zQ87y^Oi#IxLkETt@tYmbVCEz_LcYUf;9SioH44k7QQ#W)DVMoUhSl%M1SRl*YumUs z9Q$LK2mW-g_UL(=%g@VUFc->s!&gh9lLM$XO4li+l(3wL?8(UOTJYbWz7{y%FGDdI zgJ_+Iu;7DzPPne^_nnm>l3|e^D~XFHY!Rpf2n(Z%XPT8`-2fE zvwD9>6SY4+$r&%>W^sd7COH3LVdVaOpWEu3z5jpjp{+bOCAd3j__QBuzdh@(U{T-H zz|>sa3{Cdoh}%nXL_kmn1|&urKK3YS#y^OhBY#Qr(*^ih5UH}bt>d_>&{ET5-rrhD z;SAtQ(ZM_?!&rrxTDnqfW!&gD)Kw=)rbLnm^I> z{q#&jZeVif_Oa`Y6& z9K|zh*}%}HF@r)>7Gl7YP|AsT#c0%Welojj-Nl0FBS`2fTDzoNU%Nx=0ss(7j%X(r zOL?KnE|=$O?;4&U;tCthXCA zmse&JU**pAQz*oNK<|GJj109D5pawvoP>V>L2qL9t*ph_MNsm0)Zrve z3ih{93wLT?T17p-7Eg%>J3>=%aQIZX%@@WU_{TSVLW|TWwh)s((ipUY7DQ@AIUXk5 z_XixLT{x}#i%RH9xNcKo@0!q7-sz*PQ2>7d z>C9{Z_o@Mm*d+4^By=IBV%%ARw?tnr7|~GpXiN^24oynwxb2XG15o0Dl4}ECNu<>S z)vaW=d!llVa7#iowM&S9>r@{ECn_g>3ss?VBv3Ia;YyS4jObAjiT4^{cb1q43W1jx zxM?qZv8E8V;+(kLilC!~+C;P^;y+nmd#I1~c97cQGGyQf!}mUrBQpd}6HT-D+Gbh#*xw4`3Yq1opA=dt>QcIL}8 z?nTW2swSsUa`0j{l2gt(1Zdg$aA$w>&cWujmfgX!h>eomus;X?v#Nyu>Ts78M>yy9 z-2KRM&3))^H19Xz_p9q!*h5#YcxaA!{ll}e7j8SmU6nDNzhwcrjuD~9F-I-0;r5sJw!H7t5^fbeP!&w5 zv1*2-c&^TA){ioty=R?HyzXJ2NlHM#kED~rTzce=n=y5?+u8D7nYKy* zZL9T)S69{}a)O+~wwA|NCwA}V#4$as2_Ru263<7*fDoU!cl_$Y+wF=KHO?*{Ez6e2 zS);d>#itfBG~eA~T3DsTTYuP-_%LpKk2_^bOkBH7b}rzdXc%tKD?9@HRzCmt%9peh zTH5gdI>{CqQ~An2xPiOnZ2sE+z5h7!@2`OhmSr-hnTCuw-BK|+i+VoUco0bGA(_~^ zz(3{HBu|FzHT<->RYIlTl?f8Ke8c!z8ctN474Vz7CcPId^TQYiz{O{GNfu`0skVTuo2i!lrH!DQ%1u>RA?2)Kb;>7Wjdb>#;cUu=hk7UC41{WQ>Q#HHy>o}`a469(+Jt$fs}lE8$J2)H zT^kEE!ih6YFP*7WV@tybR+3x`RNp|XtvbqLYMN?HtF+#Ff5_g78T^kk*0h%SkaWC+ zc3kdoB^dXd@jftxz5r(c0mhXV=*wrdMIkmRJ|g%KYGy??&l=|91lWXy!rb;DJLa`)`l%($vXS2ep$cMsYcbSxKaNm`Z3>p1*il@ZA*T6@oVD8@dm!_`d*6jA}vk^Hj7TEwQ^^^vl zp*)tzW`56+@|p$dk88y1{*;rqS{h8R%^j>oIMuS%fXHEKVbpx}D6!k0X?J12Io zV|KBAiWo&U$yiGcq!mTCx@R{uI^|4sE9Da7;vkSXAqOHTj$mp+c9G`=nkR-`V)RkD zFY)fX>GU!pAKpdJ2`MCKp4;qmr4E3*E|%t7-Tv(~M$i~`R>jQ-iiDLzlswZdZBG_VUFWQm3Qj}Xf%@ouIcet^UBGsP6(CNr35kG-{t3<^d(NbTO9yi48+=AvL@&X4SsYrM{4POK~jumtV zA7AjCxA`t1li~Pw)x+$nNu7>;XJL*>g!F=YI9n}LNXpHe2z;e1NpFwXoby5iZE^2_ zA;K# zUq73!uyFc>%ClP8D$}+Zui$s`S7fSn= z6!SgG=pNbSdE7-1Dl}vrvPQ$B#BS778EwzgmmP80iCt~f_g%-k(jZz#$C)WN8}yAK zgv3;^c>isf6P^zbD(_Mrhtp%^=tw#Q1iCH%P41h*ERRJrytq z-u~uUU4>6h5JO$Q%zZ;s*5^_97zduP0>m%+{AKReO!^_9u<@#IbE^ z3MZGFo-mnkxAV!Ii6nH{V}g?0kwH@>*`xuTX2nXk-H0GRS*V^drURwr%v8gwIB5ZJ z)H*eOo~#k<+Uf`bqR$I)+`83NRUXB4F!q}fFw^~p=U`VXFmG2Ko(7!A-~%nVj7d7mz{KWf%~4+CTMWH(hI6YBL6CXERK!2$C}{Z-tb%a6`{E%aG^Z6P8U+A% zP;rn~`s~~^$WsG)>x>-*2>QIAeX4(6#yuQZYh99~CGiUR}EJtFI*@GBo&X&`{yW z3dV;dX@ng7smPTnk`*(a**4xgwfxPZay$Kspb%NL$&`KzZ78@yBX+5ksab zeRpziZicV8x!ikK5)mE6xJ*a@T>;?k*?{0!ga7~ocA7Zh`ck?Pmx46H;xhD8SVPpu5~1SbjCjNT3Z=Sb%9 z;_C@Hm*TaYsQj=S)f_!uBFVRXWvC1mUBcXsPuL||oqQ&j}5)~&y)@rrfu z!BmV*ZtjG*^_hn88>r}*_9uX0FTt)m%{xcSudCXv_rs5W|CH%vpFi|Wz-P5c?Yu9ni!{wA!4$T-&S`D|IoGen9!HKT3Ipe@$JQr$qQw=68= zW4RX_fIebwok4QwaFLfKPo(o|kByJ*N&o=x+=_R3X?ewKrG{WROdOWS@;s@w(#O!o zlVC-?!o>p&T~5Qdi6GvHcW_0RfYExdS8cCy?n=KGpOh_BEXGZ*yZ#`O-*(M3pKxHA z)^dR>t(lf5d(>C%!_=N`J?prWlT%bKT2!?y@q;rok6kGgRT7dmvcG1}n-*=wOR)C; za<IbK>G*fM8ZyyMHC5*%Wn_+b40{_<>z6rMBJrtrc z?JKEaa;pBqN!KRtVGeCg+qAnrjg)2^W2&{O(?$rkrqWIcqY&wJSc!*8Pp$;msm{7D z9?mH>M>&zLmn@GgjeoJUDDnu@qQ%JQ!Udw z?_GiF!-au0$t$`Qi))YF45e8IGrE6yJYN%Cnm@a)tC1%A$Z$dd>Etl$mW9(hVw@eJZ%*$!uIdk z*@$H$&xtG^8$%Z}@%wed_1svw!E+`Y1yb$N7gKsh6Sq(zC3y5NbF>a)^z{*NJbb4h zPXSlHn*T)hrcM$BF+{Rdj7dGK^KXHp7krSsKYpggPpL02Gr;~@T5Dli&7BDW z)0K;~FfJQ1qM>QbJ4mca=R$hDvMFbEN~>?kXv+^dXXzTgw_H*-(GFA1XSgm%;NY2Tlzp0Q%i!@#`oKd;yL>M;T*MDYYJC3sfdJ5G?p9M!372}xwd=B_DU8CQ?v8w0 zG6)kve#jreg=F^$or&w%J~bG{=-9A*(t-J%5LV3vzHE1V<@$$o_(R~&h{SA^b7FrS z@|hw4VbPx&@7=$*3UN}>I*8LUx_P&#Ef=x{iH93^bSSSK{(f2Ifp~ejPMD2LYPbK_ z$7g#VC48WIqsL(%+wIN|@WA4gP|JIzH#D0Z5PS|81#b2-DT4cMIJh~`5S)kd>QNv0 zN{Run4jl^)4R0GJHSNxets*_1m{?pD5Hgr`@x@={@`Sb1=}fIp=nn?ykZmN_?R{!X z=d1hB?Hejk2Mpd!zh3mJF`(cnk*-e!NG!nL3sJke40=dI2A-}KPAi&81Biid+9cA1 zZF^h8u{Vx`yIlZ%Qf9!&5I5TwViL`9Al_gcfYmNmHMP&E|DrV-VeW`>MUX!r zYi>2jC42&bfzW0B#(DLYz@$& zl6S($sSjDB(e%?!$onY;3dvO>yjpFOfjhD!h;=ngdm{Rxea^CCf@gNrD$xk&Uvh4chi) zqk(lP-_O=sg@=ffgZzfo8mj`OJDXSf%=@Y`mIlP)y=(jumz|}5A)|YC=XU+WBkDhQ zcdT~D$KhIo%_B&E33$!W?#k;yTl^yX|6PHn!uqRr6YF<=0&Lr96e*KKRhu8tMG}4rws0=A7!?Y{2q)bUzUJg81{1g(k6s1`ef=P* zrFxuw>fsv^w?vJwtY1YK=zcyJ2(kUcgeC0W@QF%#067=xwiLqpG zxxb(S$ehQ7lD%-5J!Z5egwe-1ZFE&~%@=r|Y5~Xxm7{5d2Z2&J{Bb3aj4droma>SMAHN!t* zcD{_feb>L$9Qk*Xvp3mvvUs#w?_a#XFkZE>Uf3K3=Ao@pAVe^`mHFBTGw`f8Op8h+ zX%V#K8;71Ln-BoCDrs2|O42vxvd+8y3$^V|-(XE>BnDG9iL6 zRbq{I@xnyj0*wuZ)V0~#2swBB3D=^YPn>&oovXdwedgwc^OhNEc}D}ks7RyBY2~ZI zn~r8(DcLkS6flqmJBhu$K2f%D$;A-=c6ZZ_i&l&HyD8h!pgj8g2%;OpSwO0BZbN?mb zjJ#sI6!xs?2^7g*s&A^h-cql_RRP^F4L{i5^R~B6lQgJsL{@kpQCH4*jx!2TP(OU) z(4K^MEM6Qc^ENfFfHx&}!~1COID4`&m~8EoWK2xPJ6Svle)I}N(}_F+5w)-ujTVxk zrvTNC>^jC0m7^heD~~59{`xnsgx8)0Dn7_ag;zQm0oX*pB_5>w9U6^5b&56S!-1k7 zKdA{v*DIIE<7@Wr0iT*q7xx6z6}(`oC_i=Ftbfs#{2B;%a`TNZYuT>Dyi8sWx;+49&kyP9!}1}+R>Z&h-1dh zVpe7W;u*mq{RaB?*zrvb=r+qiv@!_(e41-K1_N~~&t>w`B}lT~n%Z#f@wR6#?t4yk zNDtXQ&$p@HlYIE2Rt5`TA4T2pn{k`Amsdk0k0J9CUJ7W;mRHL*oj!9PY+zxiVqgtJ zvRhNx#~gc;EL=U(qZEPJA7MhNcq`K)K{8bm7(F}BvQ5U4GDtP}yJ_A!hPY%c*2?(d zo}6!rN_f$4@G>W|BML|BDga;fr@DwcxkRu6C^0ua{B2dSVMV{!xbgN3ytN-si%DrdA?!4Cyh zGyhoCi5~Ah7rXMy<+E3jo+zGjI|Tq7*tbi!rhi0}Ru1JW@Ph>C0{FIa8indLicdqN zxv~N_PomPR?w8f~X4P>_&Sxh^+w@LZw?X2n?z^Qk|&?cTR1F zS6N|v1@BX_cnq9nkbs~wpOh5|mdl6s~GE&h6qS9J1OCN$-E zZs1EH2s@DpG!i(T0A&CG+aXc$P<#j8uTHK&X)~&87`(}b3{_npvW_izfl>4|C{>Q; zhAV}|tUE{oXk_#VfZ}Dh6%L0}u$4OXaa$9f{dq(xvz3UtBDe0*4arp)^z+;{9_`M} z9GW~sJs8{Hk5~QmKRcPsHqZ7a&j0|!U|8FbF`{kFcHH|Bxm#5BJ9l+2!&ihmLzrl+ ztDf7M;UZ$~BV2nb{K|f3`IT0oHYXHrT34515y#7qnVyQ$1;j`01U@wqB;f?367}kb z17~Nlo6tifzoa7%C13muwVsRSot-|eqa+n<$yD%H-%OBj4x3z&YHMUIRm*f1)r3ZJ zb=}uX$xX>}g{au9`p&zXYg$Ph08$*T#Qe6{BwYG;;nyR+?2IU+Sqv07=3j7Pu4kzS z^$E^qxgecM@<4S9rRinnT*e#HTYY%_+a+aYxVYn`2) z{&PG}i%O0oGlmEZPv$o-vH(HDuhRC185@tMRaG-9t&chjX?S{ZztFPxqeb@5Hg9+D z$_u4w>U!59O8U3pX+)d>$+PMz%Ebwl1Q8!mJ+$gCd?z@M`V2lqHLo3lN8oP5u+!Z*0GcJl|` zlD)={U!6FaN=$l+>wTD6ot7`V#o;r4RB?mBtLE!+{Hc)u5PQ)}+h1tlss{*vZ&)q% zhKXHw>S=WQxLe-^eH~f=?7dCQ@tNill2G3IXB`y#`W;SAN>8=W(n@Y*PU89yiH`V) z{)7@iqGCw^jJlkNu@Z|Q;*PO>sF6a+bhR7)^`GYBkDEFNe+Jy>g&7+ajkRsRW?-Uv zBith(*GPH@wV~4(DbtQKuDCtREAYxdH*&`}+eH2==gx{QXK`<3zkTxWh`H{*|8l51 zOJJ}f;PmN8ya2Lq?Osdxs;TO5g?;r#{Uwj1NVo>7*mgU`#rQjE>?m^b#tk?WWk?n}Mih#6OUHe9v@z1BbGwvB-FLk|w59p_nYz~DCOg->#O3Gb zumj|XJms&xo>6{4|< z?1Nu5rL$OG;dR$tw-KwP#jMMN%r0v`MaD0;mZ8mh)^l=k_$_$zjgy_PRZah`TW2?p za}Og6HM(J2<7E-s5qw#y+S4}W;jH9G34yS#PR@E-Ub@!$Ff1cP;mMh(^>wUAq~ z$I(ZAXHesj@rS=H1HceTNy*9q2|CS!qV7gK>NoL*QFztI9Dp|g_YuG@8Euf@O$~p1 z?IMLJ)lF#QqjMX0@dRb4Ptv|v;uB^Rjjr}i(Nf?64abKfziXcS@v%kuv^M;0dq2NJ z6rMtSod50eHH{4+RAA8QL%64>u7TKz(3u=Pe@Eugs{jYbEOCjdA>5a(Cdh+wH5k$xcGHANm3T56$c!N8<{?f8GEqwAcN`voSoWs!+x~L}R($S|4naJ_;BfaSwzc?LyWV$riY40hG2(d~4f47uOOlSv>a;bnt6}}d2&P<2TGKKLqR1DD>p2mOP(t`F zivO0*xeAzCt@)z|b?w*b(r%ut&m`KT!Z`5)dDk=nx}!L)>a@H<$IjF4U8Q4p*D1C#M5IDb!P9XB{x34@DBLK1h z>kOJ+!O@s-KS2QCc}7Y~DF4x` zL6hf$sOWUl+}Ch|(`{2%M@L8UX~f*xSmf@4k<(apfO{3O)KN!uel6t!aOI#;_Ub`z zUw7oD@WB7}wURDs!$GbIK?HJN*TzaQkB+g(^J zWY}Fxw|qS`8gZ@0+k{>C*?|gia&lCa7Jg9duzlG8@;sQ*SH&WV&QZGB+LbRLVD#8f zRJyC)R`B_5qTi1Nu;Q`X*`0LnM66-%&6pTQyqa8CUQ0|j&%4d@LvR=MyZG!M@1?Fh zX$~V#`Rr|PS9pzn%5e26jmSa!-unW+BIi@fG>|=K^kYO>hW8J+;)N$!z@|C{k zp(EnGaA`_LW<^+iqgauI#JJL}DRD*Pqffws?*#|W8!XnVp7T$%FnLHBz5B-XUsQn7b<=3!;bcz4JOQj~ zVDh`}52`JZIp?z_VN%5!eCBqtP(U!nCJT15&`?nSXE^w*2sch5 z3U|D!fy&a94v-}~C+;<8lIlcJMKOIpskN`TX4Y!;CT>NbZ?z$qtd5Z5sXveSY*`?l zD*23n=`Itt#8bgRx#ra*FiPpQC|3|?nhbcEF6Wp?XA8Wei_a z`i3=grC5m-+6*ZJg?_Vxc#tfF=Q*m5Q{{l#qky)iJI$k2Ue$13rc<&wvw-Wxc_tEYc9PH|Xc>mqZ z6-*A103!Wl$BCv&Dc{@;Oo|NbW-SNu35HT zrb=RT4Sg>>8J9t#`&5sJ(Mh%9bP~xk)2oEdyHLBL(MY0-WP<1^=>{pE{1~xc69e5a z#}X&{4*}0jyv|I0L$IhsRg^A0TWLrl&koG~X%CuQe9h%hZ&buAMl`6fBKAJKke}5a zuGYjLQP9tQXMWz$JDx!z*>?ADCGRzitXiqIiq)A=U(Ari4daY*>{jLGys7jl&hN1nHgaofbFD9K$-8Eh+D0E0PG~zfnMN{ zl#__VHn2blM0@PTWN8^LNXo?dwrP{i0INy)*PmI=kI`RO?-{$TJVkrqC9b+lmRGZU zm8b=IbBACX>0qTztgNU+>}==n0mSZs_t>iqj=q?kud9^+t~%`<@Px2#gatFdeC}P#7S3jC z_i6O*{~8_Lnmq8~VyQbLHV4p-D1bKBB18@{FT@|7UIcRRh9}BB%zOI@XFxuO1&~a(}Li}1(Ii-{MkkUo4!lT-_zbVvo zj`4eLqXTeZ?84ilkwI^I{jC8mxYm)wAck$Bk5d*J_tFA{yjW1O!NJdGLA_X2PqGp_ zpsbH6&iRHLGfKchjSISsqiE(G#GtM9$|vY(Wlg-uC?e0G<8Z zg|j6Ga_fU-2iu!JmpeXt++(~Cgs%yLsmM8!hu4RX($ebCyWWR9iZt0D(9vueWEp>p z^4w%TO zJG<_$9w(}zJD(0X*D4@WFB{}s^nLUWoT5h)2jk;i(4Uo$LV3^DRI8XSaC}a$Q;A)x z6P>{?lOQ}0FaaW*>+PbCZ^H?{0h_N!u1W@qc|jbw*r zD(o3C*;{+#)^Z})swE#WBt1l_2XgE_>4=N61$yl#2hNe0vzJ2v-4Q?yb&wKd!E^rz zon`qDkJ6tJATpdfH+zWrVPxyLkh%Q(~p8`|^w+?ijy6{U7gA-i5J4My~Cnh;~L zG>e+Q<)@qK{)q!qa^}0(`l0Q$igxHB1%Xd(8jtWPUu5rf;c zvk{_p=`>!LWU#L>TAvj7DQv{Z38Foz#8I^e`v1c07%*G!qK4 z8|G$AWgVUI6jAPx*P_NbarCZ64e11a8~qR9N3hHm=lb$wV{`b{W)T5C=Pcw?JUYD? z?oT?Snr^CBfbnjN8QFzOE>$FSRlmXzI}YC^XX#1LJhfA)sw!^czEA&45TjTGr-g9_svD(CbdPVxeaZ&DB=hnc>98qa1$>4vgWx)jGWho$Qo6`q3{v(0%EZgZAF7!s_aJw@tl{ zDm8%zXErKAhOKRGX3+k5{Z>3WFi6QD;bqaq!-M`l z5I&b_0zn9e!xMh~psgN9gs<;$diFAxT%D(OWZkBF>Z>dT*ZvPtXBrM=*vIWLCdLvo zNR(xaNyt8xCCeCt2}Psq$~r=}?EBJSM3@pY$WoRND#n@!MH!Sedy+j{_JsF--s63q z_ls{1$1&!zu$Rw1pw%^LAQptG}+#6~AW5YGwhpqJMza*I@%E=yq4aqfufqyS_? zEmNThu{1WHI`?5bD5~LRU|@f69xpI0LB`xkoSiuE8K*$JlQdJJ_g>yHG+n-^@KymW zra*x6i)irX4K~n$7r#|GL+M`FukaQ@{s^wSvFs;e;+k{yw?sz8s>oqg)gG2-`?-G1 zk$*6yLlS5R$)^udmTGqu#I6S0%DKw|7Yq5J`fFNI=`QDw<9*$M7QgI-QnJTAL_ z1B0RTommFyail;~@F1x|CJ-eA<>bU;T0$S-fqU4JJ16F!{!{5)O>SMTF`2HnE-P32 zh0m1?uj1tB42v2A#g1gpb3;Js1jfIa8NFC!HdT-fevO`cUd*uvp%ZqZ(HX>0i<5A+ zG)E^w@Cw`}*N{#zu8(s=-x84h8cJbD!M#ZsQDHXbsKf#1X=DsdvFUfDu^4N6Cnzu= zXZv?)9G;G3BB{ZQ9&qvs9<84I6y+Y&z;>4JQT-W)EmzKLubEDGKBwCelf-U^{=n`e+PucM_2y? zVN=oF`#LQ`ZfPwa^yoUQ9_leN>hu^(j)*w=C)grChJ|1y=>t{Vt`*%w#GDV$QtT*9nVdw_*vxNFawiu6b2tQZjESMZK=LfQ=g=z4et93{K9UBmH}` zrsg*x*N#gjrw|;0z{0+8_>NLW%>a^wfl-g}{b0^PN3Ein2}LmtMEoNF+j=VMAt)NA z^XGR;K<+(tH^Q*LPN$>RC&hbv*``dJ3muAow`Z-aPms-k>HQ*wSOxvk0SFY2|LpsE zJffn(4-_8rNal;iKYA}~cuJx@&xm1v##7!Sd_->Q-89<}~H z^61Y-zr5(3ipsIB;tQCCZ(6IOOg*uMW^#Q74?6vNL8PyW)dve2<2>RHRPMl&WW;WD zW#X6H!r_`=Y z_p#r14^CpKbz?|QGf;8pt3M?2{p1=80sNFZNBc8f2fb=?Mf_(nRvOAruk((V@=5fN z3kMmsR=U)l$!(#_oM1_xl2d4{<3HBY{}%h*OQS7yJ!KYxCwFoq55{h2pULp=f)w6< z32O1y!B-T@JhIBaVY2sbrNgIG8sQ_=X+v94=VgKx-n3j;C_XPUc7`?+5!oD>J-XH* zNcNhFsJbohwXD3>95&)r>p#XL)^i1m?CLl?d?$)Sp<*vE4H5vULv^5(zpXshuW_O= z0P(%%X(}+LZ&(Yxkf<+1|G01<;B0L`apb&osfsRJSy}0rr1?p8AVjnRAd7dmX#~YA z(kKF7pMU}04_MsyrJ9pd`pcV6ajZ(?;*1F~rUV|iilZk7Gl=+^Mq^V1k*=UvKsTJ{ zfL+z+gpPuJKl=I>8EP7v947w6J#rIuvb4Fi{f8u0g@?pT5 zJ;~^Yzz??~oof@E$k_U;-;5GFlW5saI3y?bIvD%urx0}^wU{eKNX^1Y3X7w(q=ZVE zpiU^5IMtmoCTSo+?QMNP%?>A}j#xb;d5h}csUJ1)udAQy>{hwsU@S;oqU3A$!2p)pC-CZgT#BuN!}cT3(u(V626e|U|Vb7 zK@ZFK2XkXayWYOHlsO7JZ|WOs-!3>M2kFFc0tbTcZdL0M*_cl9(~)oJw(7C~VHXne zn)~MZO;-Pl`kU1_?uV`gtT9gbo&uxRb`m4a2oEy)Vp+BQw2vE|xJGQ3m+pg-GMj!nvoLcAW^5M&z)DSzj{&ed`jhqe9wJaYWsc*@N8J91u0 zgaQTeCwA7M@rp7U>S9W-JGZlpvk_6t4R@txB5M6s^^C^(nIsv|A37Z#!{A!c-RAwN zBZHw8sA_-RIkXV1cKCF!dQXp`Evc*F zrDcFwr#Bi;lqeeU6Cf^5mq!06J0y+$#%$D|1uf&le3RXy=gPBF=8@HtFoGpMPOq>akUQ*oe+QE#|<-w25OS zI>kW~>sGF?&up>6ugbzI_yrSE`^}i6WSlMcm&3C_goo;3f~n~9+`iWM_9*yKP^%If zzY~cJQBVeJNlBu!p5vOz!+)G2nJtjTe0%9DbIj@ONcq z2KCD$Kj;UA9_ZU;1injv3SMJUTG4*)0K)RM<51I4&8#siFB;=%P1QrAnQTwUmz%>J zP`d1?zyke*p(?1xb5^j_iscC zwF|D%%PYk8G7U^2&iIFh2ZyWf>gdO>i>Mj7%ic23eT>UygcYe~-}>1q6UCQ6v9_)0 zVu!945l8hi`SV7Hx&rE7W%ygFeE76*kUuXKmHiU#?|L&aE)b1AIgID_MXwwJ;kn4* z$g!H`x2OW|k(#cW3cH92IpDsr$<bJ^nK-Qe+g9M>UKxVg(^OI|eR| z_$83{1lmPczWU+5EpM`wgQ)d(c}5WdiN5Ts z(R=6|YCY6-7_fCH!rl>aci6acs=6F5#&p#ht8c!GKW$Xx>?$uWUvS;_EbNMnP^goL zwDr?gFt9qNuKMg8`5gUGK30!DnxQ~x@=>;F0um?7T%GdmUGqyu0%CK#+V z?fUF|lRI59d#Iio99qBHG2*2x(`Qv^YkWhai-`j- z+vd8rxkiVIF`RImeHDzC&+4YDM`?x{)z}8LH5a6|j8CTi6 z>=|(mBrH2VCkQZ!p>4!mu3kYnIfYOg#KmS_g%^AsxkzI$bW!KT2@|dJ<+Q|%_yhS(9(pr z^-$i!7wBDIf&af%Wc$xn(e50A$5HBj{VSkG=MiP`uB@S?GD9}6A#^Q#YBwUMb{EiF z@6WDm|Lra|wzutgW6O_WuN_L)I_%dv@qDa9-~1Z4m>4-9u)U2Ki`^c*zr#y?xc=>u zFW+-c0|*NBJQy;Ev*Y2nGeFS=h&uje7gH3emIYvS;5(>cX7`ggCotm^z$^3&&dN6oKVl^D9q z{PqO#fm%?&EkJBo9@lL*=#KB- zhwYQMJgh^1`7|=e^8w>IQ(Y|}Ru(8M-K;D4kM$4+l$p|)GRgq)1^U9bS$y|bk+L`92J{NmT&r7w3a zpHK|dDy_BxuJtN2kOTe}EV8kr&^5#7&kmapGmig6?u#CEREak41M8R8aph6hE>P;( z-}E1Q<*s-6vAZn*7(Hq}SU#SqJpQM3ARlpf`uKD0R78Ba>UBqu6Qt^9Nm7AZ;b5!M zh2D=kI4gI+aPy#HVr_Q}z#i*NFz3|(Ets0_k|Xur85M-RrPV1ZBWG8cdo-rJBDaX~ zfE7SBbm0=zt)#M2p38N$Ro!+r3YH4Xp)#p5JP$NOhVx_6K$wMTm$fJhtEW~L0x)FT zIE74U4Idq#oYzYw3&Lr2X>Wn)Z5^H%o>QtDvdK~5-zjV5L@-)>AI;cVPbVc0>NTatx*2;Z|T*iMG- zUWnzLjB9bXT9D(Z%0F2Uf`A8}wzS+;_WET>y(5c=OZkd%#Nl~S(cQ^VF*s2QLLDrm ze=*wgN?v}FzRr3`3jQzZ_ei4;5REY}Eelhj?z0}&?*U20?~U0Rg*8`2CS69Fpd+U} zyFS|aQ*G^Ve#q~}gR^3)7aQT`&ytcp# zLRhsc^pm%~k{4}G5b@BUUz1V^Fb#3|Rg^e$b^!vt9v1t9mID%`LWN+_B#I(sltxMI z#OsnQ>b?q%a4;Li%P5&j4c^07o1g|?4z>Kzww|F5w*NZy)%X*QzeKIE> z;>!j**2xMNWSphkt*>@=kSirvh|-;$RCGs~nFXj%Fh5<8E}taHDUeDNS-g&l<S%NmG%kIPR{#2#S#{I?GvZf43?5chF3+pNE8YrEWfv1yVnU*Rp^DhFCgG$X zG?g)Mb9%5on5msPm8ue{A&$HW&jbFmET=cxNf?9lG&l!~y#awa!B=ZHv>5im3gA$? zyE{zW3cc_&fowv3k!GJsQ8?i1=23||+N(U;Zayk&c6i=96}ek`ynN?y?`X3r_xPJv zgbqdEb#vsuz2W176|YDR;_*)anQeUZQ{Ksz6N8RsgH1e3h*dS*w_@QkvaxuMVs>a9 zt%h?}CA})AJKLkk*@E|0Y@r2itJpm#Y2)E#S1>KB>VC1|She2Bsu?yrrLp}#EvD%faMJpU#b9luJ6Pt~46Shn zjIl7|OP*K>1zsVwz4A1jy)DJ$7J0u=XI zydYlPhRl=Q5bUeg!kW>gf3m8QVjuc%UJA1aLWvV%xJ^-*i`?n0NUpq6ggPrv3K@!W zsNi<=4I*A2-~m(J8qk;$dOFgExXY74u+m80j1Wq|7jjnFr?2mRyhpNdr`@S9JSCP1 zS-?q_+cxtT)D|LR>X|@FBVWlskSD$&V++z6WH`|A9VWtRpm zZzi@L9M%lgq^DoIf(Zg?PZQidy54%6J-y*=#w&&WU0R!x#m!69mg}^3EyVALQ9jFn zIPGkkfGo=HSqCSXWh=K8&KEya8+1|3PELAHv4&>P33cR`0p@6oj=?WN7m{H0qB6dp z@MU2ppz&0?6$w;Z^P_f3E+hR{^WkhqgitF4WS;|fOadZgv%fJC%gEjmWpVo*Ium z+ylM_X8k9Us#F!QqIpf(!_-!#?u(OBUhtc@3} z{h!FxCC%EVGHEn&D08!ML*YfKa`BiarmlBVBJO4(qx035r|>sJnU2XDkKjympDD>u zs0aq~grpneqQ*kiQ7f_sv%u~jY#i}d^QP#(_~wJqNcXYymk!w>&jgeWs#s}LwHfP21SfBhD zcp$zaK$VJW5KTtOJdKUU`mePq$;9yHWUS0?Z6$hXy}K=Ex9B>t)A_3X?Y$@yYxwgm zgar6|isM>`eJQateJ=Z}SA3%4aEaXms1lnYNUcDDcP2tOeX@pL9s6)#KN5VGadXFy z<086;h0Mj`-!*k|59}XaV7G66eC=oEdqB2q!tR3hST#i8uoXT^

    9YT!6m#|0?PLy|eidtNF1ZGcs)T#TOhFZk67bso*S&Gh*u(MYKjJJ7+rw~$gHROiJ-ivw;g^D)i4$;%GAm5C+x{0{Jv&>3@Qi?N^wxS*H-S3uP zvd7)6(@TQxnsA(ajb{ze@4qQl@I~|ByEKwn0VL)fWA`(x7Z8%d*sj6(x=vSJgu~bG z?KvcUK2RE0B#zqj#DDdDd=y-Y>#23LbC3v<#!BdbAARrVb$MjpN9W}kGJ{bNU`|OY z)43EMS(_Rwy8d62v!I|Y9oy)9IXWEB*caSPf1N~#*s^ZErCZ~1t2XyYH1h45Id1RC z@nYoBdjB1v+L^`K*~-HU$4hsP&qmHDAJHQZpCmH|@}sG#uGjHT&nZqY28=v3Iik%B zugC-bXW({)D@J__c(Q*JM+%9q7u?n_2g;G zZ=FJj4;2Vk;z}DvZWzcGDrH!mh45g4pqsAlgb39WM@NtIM?6l1ZvefZez1HU5%vKRk-*ZvP#vHk#{Pf(s7zlVA;CzaHMi zUDUzbwXe9k7hWH|an)vJ=%CMyqLh3cbBi7G_cik_E+{0}lK@$qiRV_+qddmv1MUW= z4t!NBAHL)3`?ZP?tJ=30QPT9m!tjQ7wiUy9je>Rb0L@&_TI;plh*fDG&mx0U4}yeP z-=x(%gucPeeY>^2-M{RvwWHWjZyc$q7dN)h(HpVRKNb=EcgaRN7=h_wUoDa6X{#we z$Uj_IWD$&t7Krjx9DgLhJfTgCwZ6Izyn{LwUQ9$Iqz z!LF}HF7@cV*8WuFjCsn@K)U}aNA3nj&U+nB78{Em)kgl)IyxP>m3vrwywF_Tc2wScxOR9H`8W4_f56Qe z$EgXR#32E@Zi2J2Vg_AP`Lq(y9pgp!XQWJuN(qE^Dj~Ct&lfcjw z?=gn&Dmg>EFA2X8jSt3qINN4;=um(JC7F7apyWmhF0FBX_MWHY6wa!wu#<2a;1f0x z1kTZ|#`+A(*)U%S96Z-PUQsFlq7}(7M?c{^KW8cH_nTrn8axVbq7-(?cAp4N>8G){ zI&D;<6XXdK0bG}idqwBDfitq!L^9RUV&j9&oWxkTQT!!c2zU? z{o5<=Ox74<+!SPAJIS;nyw-JT>G2W(se$*A$#GW7!kPsZk zK`qL~g5->Vea+6)Lo;LfKd;w+NTqo`+_eaWFpTV4Kfg%;m5pz&02CQ}+-pw0+r7m% zjT4gqFEF0mnXPRmm_Vaa;DXwu*c}Vo7N&Y&7Vo_;~+FVn8aj9Db*a9>$}s< z^q5ReByVXN4R*6_RP^d^{f49p8oH0YWk3VPz8EE1Se4Nc`HdeNz#y?fv-)-Ken*=> z^u(L#g*CI`8WjgBTsj>LKV!)7_rR6I@4GonogbMRgBw^MSL;QckPPQKcHG(6S?MTY z(JP8Ci&iLKKI5rjKb)oWyc*HRsE_~|mbbLh-`vE$%~w{gh1&~`QmY1OGG;Wn!<~S4 zI}wT1ol(#zZ}UL9$)o&=Gj09gantU$8&AZ)UQ{}FLrF0jBpLnl_NU7Umk?1-kFV$% zU9u&HX$h#{Bw*t3*tirs2QfnbLDB|a7$p^nhEf(Q28}x|nt>A6FM>eE(fFHF_L#cU zR^Z_8vjKU_l67e{YFt>Go~LJ4L$YFhGY&63`}Er1+V~H|g6Yrw`T||8khP{1CP6wm zP00e;?`9jh^`dz{@HqVLO3LxK$d86)^71z%rLLmJy&MIcc;vdCPiKr3zLufqTnDt~ z`l2raPX_KP^mZmKG=Md~%E?|T5tG_7ef)J)3sUq4&HcmyKc(2Od*VH(bo&@Selyt?+wY_4KA0rCVz8N@D ztk{`-o|kr$9&RbzLg=-u3-~TfwEbB93P%}mZYSZM8*0C6H)L zzTzG61VCr+h$FF|YgKSYX+!-PzcAomm=;dRS8`JHf#0`K6&!nBYTCnd7_e#;ShnyI zL@@)xl#2ROJw_o66>lcIKC!(u;JxC=xtVXK9W=p@c=vO4HCHoy)Jxf1%gY738bZ1f zu_*R0rt#Y^GQ6YP zE?@RY6ge|@@(bK6A|zTA z1m7mqa5Ba7ay7H|soSZi^M2kyP*s>i3UK#Z!#>^1e8Yg$v# zI2>aHONQbFQbnTiN+-NQQBrw5OvXrLp!pyKiWg&npdIs_N51kh=offh^iV+sQ1QgF z=<~$5tj0krS}HWkX^sy*=VPg3HONr1o*V&WHww4( zl;DhZhC&vLo8?~htI1R2#n(Vcw{qk8s>YMTA{3ghSxt3m?efBlHGSE))jLOJyYB8j zoU9-$ON&ubQqoL==!+~?INTJGj1Qdu39?A#HN+S_R{L9bTW-7hYNK`T;Hz|h+tX*; z;^P4?TLw-caFdgymqaM3CRkIJR!2L0#;F*HwX99wXXb2J^32Y3oAL+vZ;Ht3bkU^j z0Jb~cs&;@n8@|9V{@nyAc`+LvjZlOE&!e5$$q1I|fe~Rb=;MS~N+0zH01{@xwpjoB+%XsjGi;>fe>fc&mdu z$9pL{oeu@H?ed^619sa65K%W;Ju{X^(`OG4HuuLz{}@O7G4*Fff)uKfIy+|;_%%P> zC9rRp%LDt<-=}@*CU-6*Anc2Zvv7STp^dMK%Vo-8&h0BTYo#*_IumenBIIUZ7nFn| z;kxoT9ReV|s5!H-ntMjSbX?Yurn>!a)=&g%Lt(gug#~VomcV#LOb4yzgrj(fnY7Y? ze)-e(EWdC`Mw|P2##p=nTc&HNxT!^I!W#_4f{`yEmK=QMJPebm7uT?dPr2KE%^=eh zBO#8|1&cWl3L2NcSyFMWLP)$co0;^rI&gk0>SD>I$8D-6sT{B?FGX%&aF!{|rn$$g ziW^O^VoIe1GR!F7WxR&RRzd(`hGB2vtJrT7ZSys9yJiLU(xpRJ4CWCdp7 z(zeQstorc7Bj>S)9dDl1WMrHsl9C*!y44ZLox`ug%a>re%^~wex$h4#w{F*LUJGr| ziveB!Nw2|8-ja=q?rZzhi3i_rsZU42#gtN@tN^*-Qzs{yI~NIm$j6TYV}MWsvBxND zC=llx&mb(zSQ=My91g!4-ap_nBB;*fp^gMKR& z?~nEk+;v@e*3NWOmY3|T)leGeT0*~crnJ<|O}C(HxvX)X?3#a?CK2HPPZ3nj(bocU zlpEx+_mP)R8{d(AZ(DKn_n~iK%RP_n#jr{F4CAS={z_#%_3~wc+bQBt@+*QtiE~M% zS7k=m?EY;1P^nstbFiw`1dkL*X<#d099fm>E#WdmfGHq{hI*C*1V7Q{oy!YxD_wW2UdiF?@3n4190NhyVHd@cz4rzvb~mx2XF9;om*K4F+siOkRpB zRI|uq{&>%rSr3L{aR4Q$YMxZpVFvNSSH-r;IDpd{1&`KVc+6GR!4c&yB>-r6(i<)g zPESA0jNOTFk^qxo;>;hifyWPtCpn?`5TKrQ*Av?73_tE`y`D+J=&A(sdDu4&0DNk5=x$c?(OLY(I5E?b*>}$}`qXW@Z~F7UqYtIm zyehQV1Dt7ozJpL!(gJh*n=@dAb}K{cq2=v>MjO4gCC@0^Zp4iXI#w~_s2kSi#=v?z zT81a$J?x3A!(-)7k$9PGX!L77*LmKAt#8pU2c-+a&$Hkr8ZXxVuDY8=Vt3*(txt5ar!n#+b!;$7fyhi;QilNs-SF{pO_j#6tkl~w|JUcaqq z;wDysmcGp$8xiv(FE2es}u_ z_bg&7BJ`M$D1)UA-dkB3K2%A50j_f)0Zd6Y4wK{vJIc@*q;LmJJ6({xJ3o~ZFy zxvv?&uxT>WwayL-i|;*N;@bRQ{oC}PUESYyd8rjG$s6H%&P+d(Fkcv`n4vFSn}Smf zR=u3StB0k9@syk;v;4N^i|tbyO|=yrqYJ`n#Ftv-R=q7!)0?Us{xn}WM6apv#uZpo zIS5Y$*Rn|ql%jMH+X9?x8kP`+OJ!4hF%6^jh4X9+^2S2ZEb^C^_(`dDDaLk7S~dwu(lY*K7g7J z27gs_&n3Fwlo-F#4}n<()nF;WH6;VPt2c*(f_eqipl=)o9h-%LgDQhB_fD1Lmg1-V zFll6}lnnM=nMm!#Ez1I!e7T25H&i)Ls`K5eF_pg`^vew0Pl>Y|Ix9-ue%RP})`{KM z^%PX{4F&YP&Tj;s0B|x|{udy<)-L@W>fmaQns6b|5h(aRB%UBk8CWXoE@mF~M`MxvmPP zo_I~@XqCK`>2l)AKzzLLj7o#1hpwA#>Z+{sprs`diogwF&)e8ASis>Ho)-rw47)2I+esgaqVFaCmMfqx4vwjvV5usuc( zIV%}$ogH<>8zs?=Aig;>LpY81H&FyGxCmM*f`7l_0^Yb;T?mz!7l3;TlF03-1oGT< ze9L-aFeP!o|3jqUTf!q|dy0u%DdX=(;@xgOG*v6E^W@ z*q_)2ZIgQRkx+m>qG{(h~O5d;y?Dg+N{9U2IJIG<#~0*2k*_2t1D( zse5(T3H1fSVXiDL;k5Vad>7-bAuOA6n9X0?wNm2|K6d?DCLfj@<>1Y^eJIe>`^*S* zbCB>57T>5{BY`euPEa6roM_3-Z*2Z^Fd*NZ93H%$(Y_-(B)k3p9+#uo4(_?H(MW2DG=gzk3a*h{}6a9@JFvtMp zFZ_d@&8QQFG-Y9Zce+#`+$F?eOl7YxZJc+iU)>yh;|)UC@BQn&s>0Mdanqe5jbu=N zD1b3ICS`LESvt|`)2R_@_OGkS0=ip*|pTt9> zp<-~P3!lTB#<%f{A!>GS?M}%&SbqKBjRavBD4Xm|_jk-FL1$f`G{{W5^7o%o(yOge zvXkIzsmz^h8d#~j-8xWtMTzfIoK32tPkC2mQ<(pQAdUm?arJlUL#3myO>K?+rN|-6 z&98I2`b-Mw67(8>%L22s$UjeV$31I{caq7;Gm@Q;42LUsJf631T{D!@r5YxXbo6m3C)$2G zz*t_L^Aw?9mXJW2n)W+e;tJ9pu3p8{pe2qFlu~akM#|aN%t5-`!`RrXcG*Ly5c*I6 zVi9L8RX6}nZQ50g3&l9$di(+ z`WN>@Mp9-}nzevMekVZDyl=htbj#ZDv%4a{!Z)`zYg*gqS7w^)0$2aHVi~pp&tT** z^Rdne@Q=W(&k7)FJ-wlN)XI6<@~d;vaF=_|<$}2e!|1~9JO}AQr6=AL0?+z_PMoGz zF3%fx{Z@&Spz)JF1h2Xb&3f94cw-NBbhqr2Q*Tog?dHT4^Ve-Erkn0PnhTQjMPhUwq~Obg)qtsu0i4?KjTNcEw2t&sOA_;qgy2YY*V zUydxczj#RMv^Ea;m`1UY#>1sfz$d~Npn;&40>Nu?GW1(`C>jB7?~?`<=<|rE#Vsia zdv2}+b~g2@vWBtW1y~8abb>({kkHd#i=`!CsPMv@4mpR;0K;&NHW3O#371(&vS%dO7!6S#K66hKDX%CLM{Jjn!Kod?Yj-V zR88+d(FmJYfua;%s|lXP;ipXM0{T-DRICljygJ3Qo3ld8 zic)NA zASAL!LvXj{DigG0mlD`uJT~QP@u$Izbp`ab4wA&BxRsCKtiFAynVI(pT*-!R^v;0 zCekdEZ{tX_o(W`?or&(mG^-2Hu?3vp=w<(9{Ytu+gB}J9=hY^L?4g?25cE_i%ozga zhhK+ae9yPUbo##fBrg6~0orGueyQhry>zVl1hPBsjIVSt$Msv`CI0re4P+T$OL7Jh z5K?&6<`C&=kgcdi$v#Eoymi>lhhQf%e(w-Kw`5!pI(i&)7(QllR4m*Z_KWq+%zp)0 z$HyObpOrx{$v{lAV8V@`2f!m2dr#1Bxvzk_|Mxvb#EHjKi~I--*A&c zx!WE@{B|SZaeBW+mh^Cpb8TzgpJmEB?K^%=Mo~%jo~4DrhYEuE0%&Bn@(!PuOK;YI zUo3>q+0=R@7d6&11?`yxMMP8-)*UPy)~pq|x$Oi$$V*d_W$9R0)$I5!NTJn3InL*g zs#G%%)MtD^de}Z*5BR;vL@s0pS*(Gsl1EwjMur9_COwCnM0Hpd(yeMn{kFPhx9|M@ ztKVCUW~$>tNs--4){N(4ox}e9%5j}xj0Jn--qtE9k>MbMoXVXi(x)|qgjw)ZigB*@;i@mLb2Fo`w2_Jc$?q7d{X~|aqI%ogBXGB z4D=8RQMfo{3#So2N6`i?4n@EpaIhf?4w6(+c96bl_>C;5y0L;MkfY$Ra8D#d0~xc} z$ISv5jx1|5`~tU&=L7qKem9zUxR;lM<{Ieq&->Mi22=XBOPl*Pg*;zcbQsX+D#?-KmKB`Tv9h17KqF;KmINB$t1X54FBF6*fE zcE-HEslCw5G(0p^7od03Jw03tqg1IcI{m1;Jcx57-QR}` zj(H~VPwn(uI(zGXLtge=tHx1%FL1Hp6QWvmU&=j7`1A_mgk^CkUFMmL90nQ&yQ)g8j@7OkIr31BJ zrOCfyt@FjjURq&$dpjEwjeS;*4p_-TVv+vugNo8ks~Z_7Xkg3%rsa!s02e8?-awWO zno60bF)hL_7xR(arF11WxB%IgxiCN0-d|4wYds3gad7W&Z>4z$kX?OlQp2^w*1&_o z%Tr&R)l2RGDVTQhNeI6XFQ>=OL@blPT511d@~a8|9C7Sh|Mx-RfBDM0C#M1{jwYfT zrhvG?!2_+m2f2s8U5*RQR^myK%U=m?a;dx3Z!S3 zM25RQR_9(XPaAauD%jFds&Ntj)?G6N>eKvf(PHAm&gbCqC?m*nc>L8CvHp_@9Gf+A znRaZxI~p@`A*-$2m5++rlZV@kvV6P$@$ehHJkkH@IYj95aD1Aa;Q zrL|*#ejSHPQ_%nWX#Hj3y|Hw`Gw;jC`Z8VK*~--}`zI$>5{#GGyOdlddEu`Y6{P~<;)yO zDhVRuGvejBG+mitz7o3i=3$tBh-Pg->7&MwrH3ew1nITj-uX?{O63!Ke-DR`y8`s+ z^nv;Qfcp1H?F$?a>`j`tr%OHg=N4Dn%FmB})o6nXNpcbgGftebLyCKYc@>boO*DD0 zDM;rP%lE9@MitjL9XopmG+fmf8FY=x-r+I&?u%A-2%qVP2WA&I8nfKiI^ZIyBVQhZ zisubIPzt?-8;eg4n@%2YrZOU5vAA7r#pt>m9;~ZXH;-(&tXcIG=1x6Ae zb}NHC zdRldPA*jd}azp8>s>)KO#7|HMHfYy6*cF#g|hW1@ija z&U%N2$>Qka(&Y93Z5gZfZu@Spu}s3gr9}Rl5k21Ph&*09K8)PsKAv9t*RvKjy`;t0 zq;cLjUVgKQMyr}Mif<4UgEg?hWMI)(P(EiU!WarD(^rL#e#dYthck?z=PurHaL$<<`nK9UgQ_oKgJ1H?V|3);CLT07Q<=#Dqp?rS2 zj$Q9HHd*A?VTNy4;hCi^rlZvTzAay&R+dFRX9s~Z)bX2=U1yv-L@+P6=R z2)v)XK5zB;1rMD712I{<|M1?LS&fUz78mfm9JYItF5Cyz_`oEq%`EG~Rc5M$ItS}E zyIe4mn+)2w)XW|P_5sv?u`ii_2zeJf8IU+Xn7NKP<_S){IAK5fJ>zXU(lZ3DUfn3+ z+o$8`+I@cTT~0cqQQ=g;gOoUX_gVf)7hShm1_IsOhy; zd6zqyzua5hN@nYqdGa`wLXN%K+B!h_%+PFVqWq|l{Y9I&qXm%Zc9y1bHU_H5!6Yi1 zsz#qUWoV@uu+|pxk+Ub$#7H`m7HBXvwpGG!LGx-TD;o#$2l)Yv?%rTi{UOGQcFf2!6fj&BVzM$g?Cz#sQ2&Y$@^{TOe<4hIv4mk!hSZ$6nU-+vZdx2w4$HFpf2AWFAKbdI;cEHv!Z|a%kA5J;4(TdO^&IB7((7KK zz+q_KG~r1!vlgCtu466LJHIj=?`gb+o1(Jsc_Mhd!hWfg+>WMO zQ)4GI(C+0(rM3@B%urgPjBH2stTk2a4OylO8#P?340OsLDI)rB(e`I23`2|_9Ddcd znE2hWW_sn6J)onh^7bekh#^&0=I+c$>fY>7Ne+~kpWhTrfcaPs7t)LS1A-eft(57V zTaxYNLxMjqeG({&7EIb#oql)99v>$YRiLSUy({GQ@Rw{iS7Oudq2A)tg*Z{iDcxs+ zpO&-M^v~72xTDqdsL4eSz8|!|_ayg-bh?6GgJkmGI|`ZD)r^}M2>hV1{>|&U#%Eqf zy$WVs4C1SiGb^M$`v$Z3@#aU;byI9S4*D*|ptphfms$Gu{;TkR|ISZ&7Ozb7|J_*} zyp&Gw?$5v~2#B9>f5NNF9mw(lXP^!F;7~$qmrU55e%N@AM$1)306>J)``4@WOGmGd zkW{3=6Q)ldBzPWNOR@O{0Rq2`w)%4Z7YNL$b=7@JJZ!s;qNTo@z)YT|b$6m>#Sh63 zv>Fe8_bX3roh=_*|C(Po09+1SLY^r)m|e;8Y7P!QKH8t)fSV671{~i-{H>N*nb_R) z_TLPZoq7u}|KUJmG?6q`BS)7ZXh!_q`@8c=*C0*D|GS<0e6jD9+=YO#c#*k98mRmd z-_^NwDMfRBJ$oL5>0aXcKOS*W;S6N)@>fJ@1?FEel{P#f+>@Gk1>lDq96dW})vFfcD6PtTU`#m_G zZ)$}1@1N(r0(cN?8uYp@WfR8Bs-hyXE;Js^`4jxT01BgWn<|@gCo($CTkqgr;SI5S zE;CK|3$aX5z}3pnfJOjFx>A+55z^SrMB!8h_73|+r~Z~jZV$&UM&wP^!^64P4DJwS zK|hMM4i`m_rbQ$6)~DAFo0@mWnh(bU0|)*CRdQDOS&~5{(ZE>ijHrvd(m)TW1PdKa zQF!)D*C>q~s2V={RV?8(8S+Ar5YzTb`BQuE^}}qiYWG$FJ}O9ahP@L}&N)scha7TdG)#n*!&ah1N=}hO&Y4gqNulOg4oOTo zEa%_r^Zork-`_v4e|NiWd%mvcbzP6g{SoX}BFQsjvDX9Y{CcmsdHd6kxlujDzc@XF zaq+7+`)?0PpcyU9@@PxQfU3$A}7BMMvMYqzAM_D${~nPt z7!4jeVU2{8**%vNUXPHT+AR{P%k?QGT}jv7OrpysPZ5+&FPyz`H~=JNdex+h0PVsk z38g#Ro>szp&r~?=Yqu~&sDRMtOAdf{i^aDu=h^98PBk(z80JTgetm)z`bMWNFocYy zrx439i*yr!A6RM6xWc0I0=rZavWD8`>hCGdNPsDc-#!M$CMcbsJTI0i)f+`pZc?pl z57%N6O`YoO=2#RDBkhLMs^7lWFJ3P1l)j?Lddhj2uVstID~TRgI4P*^{A6rH3krhM z=q1^7#1A4>`&tA5dpz~s)=yaxH!h3AV)d^H0dlK5P!JwSpBQ_1rxT+}=v7TQCaY@`S-p|Cv+J};j7dok?yZ~v5)(_-tBRdIsb!L4rlI|KVJ_WQpE_I_mo!hv?r z>Gl&Z_X|Y0mCegdi@<}2ERV0)6Vcb&fy*mr1z3jxCTW6RO2c9k-0vBKJioZUzP{Ad z+ILL%Q-$Dn=0YQQO|zg-{#Drk*(Vc7N5Yz+pQQBk1bkoLd4l^Wh3)Tdi`JGqTzQE)3~@TbTNoEEk6_{L?X7H%wBDZR zk@_c1vY$vYkh5m}V%~bkoF>!QvzFw`l@_zVAIWC^KrDBaJAudy+37y^@xYyxzvnDB zTVmq$+b?ZYlq=%u`+VY_rqqegz1Dklp`^O(3FBO(L9FhxNWUa zP&}Y6SpdC#=iq?*wZ8igR<2O4`^P+2OA1X`C*Y!F=K~z-*6|n)b$`jhgx@MugaH5ef^yu=M}rIU-4q=6@9X$E=)I83L@Lu z+Z+5(SNNriRv>5szOHw&QYR|&I0J#sfyv6MvL-Ca0QQXlHL9$81pQUzb5#kvYzMHK z&g!oS=Zbhn@|=01?%TZ?Y|*>QTeswLb4-gbhfhWa;?6yA zv{LRv;UP05)t$%k`#;v#XSefCwsPk(h_;~>Jzr+-I1vtjwxs+gfsaX{>r37XIQS!A zJc?6sdwCjD7B={$ogK~h@D{p$CFn6AXik!{B=gUlnmXrA+L(||0Ds^Crzk=iXH{(N zJCA9B=-E^(C<$o(UZ=T z+uy%iKmxz`8sTtT6~BaK z9RyH$3_QA4>~(sU?KB~re-4;OF52Egb%wFI!}P#7GY_ z867jNdn$l_r2bq$4EEx}+iLaGM>4IRc_{VTe{zanMC(%`(-ZJvj#Q{9NMA21Fe%U0 zQZ0=2hEI$C9L*$&D!s6<@VoaXotFn;u4|@^5qO^KyA`ARpm-Q2asNZzm+;F>GkKkx z&wI!W-6gpx8s7r6KnKf521h&rZ>eQoeLpcZoXnVwQon9Hacw0e9nd=7LL#2%kGJ!5 zB1IEBkp4mhaaa1SEW5BXXCXc|G)<=n6pvz*QSmEtzW1SE0?~*IU?t3ouheD|sg!i~ zbWBAymgb%~APv$H^K#4*Vrro&-xJ61!}Vff+cDCl8yO!5G?w+iMfi3_C)>p(Ml$WCWK* zgyO;*uKQhcS7IGA4(A%QWNPs73M^h5fftokE`rSqkN(?a-WilKao!%H7VEd2m&XBm z0rfQEJ!KgF(#Tybj>Q@ulMXlw@_>;I_~12EEIQX?wOP@|TX>Cd7EgW6qA2vwf|JR{c| z1uaB3JftHXL_pF3#1???d7|gLasuk;HgDW&##)M`%b#`kxZ@XM_uh{9tjmwNuK&N% zwHLW4(t2S(g@+xtO8dtDH$r3e5g0^&CJH9s<2d((QtTduRj}*LBP!M-^yGwlY{il7 zF`G3Uc9g?a3478UkS6&irlqazvf98v;l0e&;m&W3av6qO>65YBHLj^ps%nC$Z_$g) zX*`2$ngB)Mv!9cUIOF4iUIRkjk_dN88Jc`F1A13Jr$Iw{FE>8;$;koJp>!iVwJ7cK z&fr#;`nI~oN>wYhjH!UT%CmBa1o_P+)fwLA(dFHC7Swx=FRI*X5I6#hzoBsd$(zZbmV)DA<40`Ma{c^LtK~$1P@{Yv>Br%cPkd}_)S}u7 zwtr+PI}JO1NlYjxC_Mhcd?S=_`HEDVGv`sl?DSBG{qCQwrb|_+6xFVGMMj}uF zcHK_^1nw}82T$eJ2xn7}L@FF!@Px;z;=n%&dfgM@@>Svo@^4ix)~p9GBD4*jiu38d zi*gvYjL|7YY)Ol_OReN)b_UMH+h>7bh*17k{s8{Q20>S~EJq z<*sHH7{TB)hzC<2*_uD7tjMzDclIqGx<$Pttko~w72Q7Gvdb-ssl zAM_cF+MYr)F1xCzJ1X6Jc)KD@#;dUcN*En)Xnin{H@K~S1|=aOfe{EN;^)*udWR2# z%5niT3gSRV8^_3DBuokE1W7}lNAkJL#MV#KwV~ux!Z9YUeuDCJxJ12=zbTQ%I7dB1 zGsz!?xu{7PK?RF21bGKi!{Qc`+Ho@`aqu`jt@G7XrGsj#Hv^&MDgJh3>oS8nAxQX-y8 zY2b#ay-Nr9hyr*@O6H3PC+7#CYXUy=kxX^EP}!lrT|Qi z;Z8lKlHIvXCc{X)C_6y~(Z}%Pzx8;pR)pZ%@AqR1=#E|ExO}>DFb|ud13>HbkUS`9 zn>-0Iq~7>P^f>6RX8ijx_InD;r4BxILnqUqMqJcmR-Lo$=FkZ0FR!vizV3mB_hP=4 zR3@sHNnZc5QNQFHS5*SN9_X4>C~u(Hxfp&aUEy_+3|^desy$f0`frps) z>Xs{d0=@_(dqK=PA(_`9CQUxTN`>&KYPW_;W*@FsfTN)rVkCDY3Rw%y6EZvJ>0xVp z;j^s@%F!DohPJf?Vh1BJqNv79ybx5Rhlmlk82}agsIgwwJ)bp77GmKG0>+8t7E?{0 z#({${{2JK^3duZ`=@F35>t23bKJR;(hsk|~ zG&30w!#B#kyICP3((~QJRnq@o)Ks!=CVe<`6-2SU>MDu&Q@yzU^MWNpA{hd>T(%}! zL^$IJPdcc(T7ysR)W~VZtEVP&r>&WIwvUv-;Cw717oB2LdQ zfsc?=JIj;M4{N+3$VZpy4Y49PGm?U>4*t!AYIUP`Uhb zRIky?{}%eV=5i({#$umIC}3Zlu=fK~tODm7^3>0eXCoYj&p7%$rL4TFS2%P5}vZ?@0Nh zQHZq5N$wzz3nr=3oA!QDW)Vs#3mb_i5WMIdgoU3W4ie~v+DHwQ!i#Jb;>hmdg3fe0 z^?jE~wvOw^f-LBij#aEl5Gv&qIpIoT0USKN&{b^j_ssp<5xfIEUmK0~JYlJBW3xo* z-1)oGSib&y8VtwsQmw17fN?%vbNqD&o2vHMh&UCi)(lcWMBkG$Jo(8PgWFQBt!InnP`56tg;iLg2CI!i zwWP%7vS>Jp5DgR~g-9(^!JU6Eu9xP4);}hOKcu`YDUa_?jWjP37v^cNXeP!@hL-xq zK`Ib;pQ1h%^T%8xfIw3fh4#3R$?#sH$W0mu4=vCXf{THvh! zJu)IcQf!{@*M3m_#2fJYV^E*}nJMXWkPfKnkLui%p{=!uTU3unD!><(QaZ66J{cR{ z)`GiRhP}>F8v^rOPalk)v@ZRg*|tfVtY3<8wCXQ9w9@ESIWLH@v#}k=^-Od;zJ*ob zz2=1kXb$qN>qi(GAzXjk8B68MH(t4!{SERRgs9_0d`Y>PM}M&_@F|Xg*5uPq%4}^L z0HBt%2MkXkvt;RXa7L=T^eO3yIKj}PsE|UTP+Q46KaPM+F$nW0M-^RP2>jn4(kMP} zRIm+|^|slpi-IqP_;`5QQY^$od@+nOHIX|EsVSx^7CtVE`iS}fLI%vjuy?9KHrm%l z7Dw-6<%jL<*=?5^j;C2F8}5D?a0)zGRW%&|^8?^ad3}mlzh`F`qz@cWm(W&+TF~r5 zT}9lLdd1?+LDDo6;}0-k{kG`Q>e8U*<#lx6`yzUx$Q^vpfrO!Q@mxgw;tCrsF9?!Li2?sabP>brrlS0WiUP)5~Uj04gG6W3N4eql03-v5$v%0qN-KFPC9iEbOkbAT5tCo#y9ys%kwQ30@+qFR zR66RT#M1!2V!ZmR`Lm5Q!y}6+s{Y7US+;;l;t8R#Q@z9+Z`*0rfk7^5kUPwp#6{up_Pax0@=BM$IN!<3|vd zw3PF%R~d23CTZ$To zm(GuMS3`d>9Y&esYMm$^1vAbIRU!qpK!ei)G-8B+WbIC|uN1U;R6~F%C6)FD)~U++ z_<*i3l&o;~sel#FwUNFc-o4xKmySEA_fJczLW|VHK`8zM2k?({Oz?jkW$!zhfsk+$ zcODR$hsVRAaZ?sp5g|ZmJ+vxsr<9EYJ<>Zu347ee8&%}%)D^@bO`nw~KTj9Re0$f| z2&B%{Y0V7kRW(hOM!>RCv*~bkF>uEj+8yn2HD2s3m1k3|Bj)ZXc#<schG7n^UB`ZYwoJ_NOJ&XCVM{Th~O+Obt zHH`b)t->AU<)4Z3Pc8JDUTbY_Y4N;n_xKxwMwc_V2El*qpHE1KoDzcsW`ppaoz9TM z6AmE_zZDS(Yq=QP&fC2iMyg2`h$M$3!4NPd?7-k*n1L$#rJaQIIH>y5n{kvZ2urg_ zB|{z61D=RUUci7rX71je59vekK$)h3GP_dCj^0aMA)h(|(pr|{LE@Dn(mf8!OkIFO z%5GneH9Q07;k~ZbSK8zI<9e&hOsLCG6_qZaAOtLLuh+O%d7K5MJ5UdS1cR*C#fclB zv<`an*7Rs4aO0|6M3p&Na+YS7W*4Rh5tH z0gv+}zVM-%~o@H;e6#Ff0^1BN$#g z!7VH5d}muHK3!JEI?2i7*1IBO(mU^TnRS*sS?UMJ?FYBDT&^e?wx1c}o(v4kc-v_r z4mHq!c?aKXF?7t;&Pv%g9H$VO)^Ub1tMGs!R742#2HgH4dxp_bk@(U~K;I_v`u*y58{X4FUb!LFGR$%7=RId!|orm!1R7qFi>&+qwK0`o}{bilDHi4ALzR);dO&ILCghI}y@&i;gL> z#U{c>){XG&Hs9i5pUPha+=DQY%%1CCel__fzjAEMx}(nPK~Z_aPijOT@aJ5-?B(H< zQ5q;GC*lP8J-ZvmIV}LkT3Xn9O`tc1r~WJx3*)!WJLU$MOd0ed$sDJjHF`fY3k_T2Bcr3^W$NfEsHh01^uhYR*=-pL z#wAG#s+*GJ(O}TmHco4}%x=^hk0y5on>pjgB(-dl7p<3|E3ePqKX~DwNa)|Wg;mD- z&Q_UA@u!B7yx6tbAUtW1#~ByW2kjVkauvZI+yNrF<%Cm)m=o;nS?u_<{il@MttHUp z`nHA%r$9oNZPO;O9Ckb|A^y2WHFgp_H9ehRzx|`wL=^^?zIi#vG#A_RJ@%BRid8?~ zcAJFS-L-Cf$*_jmV(S2lF!%PdYTZ>e(nQZ?fBEs`FX^;%HpbQY6^8)Ez@Jy6a5?H( z1S~};ui82M6(dhf%@dD%D+#Q#-8N~yI7z`Lxvv)l1hT6}P${rJla@I3ti)NgvebSQpxwJ`EA0#Ibgf~qS}C|pkn=a!(y2aHMGb|K9C(vHgxo>xriVF6vAsb=|%_MwOF)1GT$7T^_ufohyw)OB5^le0j& zk14TI-dJ2MOL2xW#x?_KdrcsHbL;OXoi64M-}}L2K9lShk`G`y`vnxt0qFQ9p~cp^ zlpgbEK5MP(a{ZYl2C^9=t0fJtx0<$RgAw?GHUR*VgL{7LDD=bX!otvkgQ?f(a0;;Q zF}~Bk-PW+nzBJDb)wzV?WlRnLGNMitAcT$4FC56L2&Am77Vf7l=M^}6YLm_3cdkn7 zpoY+Df+n}K`ho9kbM8>ed+luH?y$!h}h zT_8nW^<7ua?0VGZXMmL&zsuRbFL!o-3*b|MS_1CZz3((lqlU^*?CL(*LI+vopjd64 z>A7w{HC4M%k8edDzvB$HS0?TU9~|hbUy3~?bE8$MC@HWanrIeB>8W@9Zgr1e!EM98 zF*R2s*_uD2nc?`?DG$ok$fjE+0Zbf5;_67tx;GY^DI%g`i4Soq`1@Ph9P7^GKBlx3 zF#I)OZdw>WR{*LLM{N+uSHwk$L^2s-A}VQLdw-pB*;8q*M>=5vhq`mDLp{=ybMzP% zbPSmqBV-9`J76S5>b<$rRnA}Xp0u#lBX^-g0FZKGSYt?%BXOne4Rz3E` z)Pjsj_cnvjD3A~+$XW_LhT?(4lHM3*<4rMGf1z;xABlHT=iJJEHmM7u&zzl!X>4XF z;Cv%=jcS67GBl`g7{DLv>mK}FouB{y+nwoj%Fk;30ffz_M<{JasH9nIEUq}bV|{{0gd7aOTqJhZSD2fUWlDmONJG66`9;pWD6 zdu%J6cHavRw^4i3Q@}g7MS1m>IC4{{(f+57v;dV#fuve=;bj4s31-N!P)BPVK})ja z`!{ZiaOMx=o-flZ9EG51t7WeF~Pg6_AIgvEd^DkqGR5>IJ6a`A~Mez@RGN;Vt);9 z-^obG8Ex3TZJ;XwFLv?UeLFue8MCEYWYE30w>LX7x%c_f-kbg3oc$5`-9E#uq5Zvh zDbV9}@VTpz26Cy9qsNN;?LaF4#apGK)T`EG!mzMl*cSHCU4QB~PzMbQPi}`DHTvAd ztzUAM@xuSA@3&R~i5Y%4#9-H7s;^M>6J6RasHnZ{{p6L%Vykl_HD5R-mc3Cw;$y5r z*U@6<95`SuUwiznv|Jld^1@=H4Y|XrF<(b~MbV1MrCczTC@!ZKMJhZ3mzi5$oJO*| z0t;x+^2E0qd2T@kc2fws>%7*YZ+=XNXefQ}P9{=~1SAiz7~4=9gpM~zM?e*fvj`Mr zPruWV;+Par7hp#4`?f9R{^HU}8LQt8AY{zi6PBHLpuRvgBDP_K3**^o1r9Y<%}F0u2;5W+PKs)I#&T&O}rtvAD!Ej!=R zsZ%tX#==_JDOXMa%spUo@8`u!asL{WU)A}<1XeH_2tIPpMwIYslAy!i;UW>L`-B5&GA3qFz5d3r)Rf0@{2Cns-kvX6FdYbRi{r#*X$RCoT+R>M&_$={MCU!8v zMIDsoC@!dR^r5M+NS{$olwM1lOT9+cVQt{>=cw-O#BXx@Vo>F$biiH3gd!e~-Iyi) z7B3W)YQARhHB5}=^!!90cxCH`aJap{SAG>+O;GK;X<9iUA2bqse<+NC@8qs-2c4|T z`XTi=`%jSWt7y&xQGveej!BOA7s!*w}Aa7x@P^xE0_A%@WNI}0uhfi zI~zQ()+o_V=}PZnNK0#jDUc3Ox{0kl&_3Iz{rGiUt%p|_&6V=vYy(7YK0!fae1k%c zh{*F$G0Qi>=k$kd?HSTM2FQC&swEA>(flB_*@cB?*`m@Ts}e{ci&DcZJZ;6>qy=oU zePok&hDy|d2rfvY@n=RSPC+X2>#n}%w_YkVA(cR<9aFlZ#{=UzM#5is z|5CHtj*kLW%2*=z(+*Oi;+#CHdYJ%^0C>rq;EHnGcFY=knR}<@epDG zEN(&R0+EG53(^({$y_+@&&1f|#Ke&Pn7l~o%@b+4C7%YjRt%z2KxXeelCwxcFNb|b zBO>GL)R8q%AGkdW4*_UBim~)&9j?a2#DE8S2LluLSe`l&3$!|tmR|F!$%G!C3XHnh z8f`8~!ZJdbSRJqc1J98bvZQjEO6$iJuAF#ePA^4+&hfZ^JeUB5MgS;17ddxtl#)An z;qryqTQ(HIMC7d+3~co_PV44Vn=iqXFq!w+M&9~gCk*usbBad#d|s~J_yRU=bjK<} zb0}njP$!0m2TyxgOb8DK-IUSGK;iX z+%%!uk*hH@gv9ko&0UYtPQ5BGIXz7U{h@hlf)~ztoX7@b*Ca_A#pu|1(^PFx6dM=f zDh!oEz*9jgoeVfbl8`k;v(S2+h@T5u4b`#+4ZzP02=!u&P|8=AztkS=o1ja;&^RQ@ zGw$v=rG8_sOB3LVS!MiGzl$a(F_I9L&-y&=lu@w%H8E#_*Vsg|vkQCJ`I!z@w*cV4{5K{rr!|nF?ei&@RTs#any$=C4PPoJQL? zP67haX2=zmxMcreO7p-|k2%LX4jjtUvffjfSBuA?oZ3%m><>a&NRLKmdCg=hu(5Vb zab$;|5W*YqfxL-__2{>y3>H^3#`KWJ_6KN;QbDaw^cYLj-SMKmvJ=!Jg@_*@5|o|t z?nwhyD>#TkcTD~I!zf^5%eRkW;XbJsKir}#a2&JzD@MzAV#Za1Na z`H0i%8eX9S$!^STDiE#$hQWP|q#RS5tlmAtjR}(Z9o6R5(}mo7jAnDvg$oT$U;34h zLQrFR62w!oAIz7C1b?-O5;u6Ochk+}L#`8x_wt*%WL*Ao<-2r|a9lIDAk&fV`(l(A zocO_161J}WPL<5t^2*kSe0QOTC49U$pq1ZAC9wKsDy#(;xBccR}SlU=JW zTJd-LPjV+-N{UJj4*A4!hcbc7=*BuAU#xhz{!%qIeR0W5wX;c2-`LyF_4&WFx7kp- z0qbj%wN73UjVrX)D@$6{tG%q8Lr?v?6crmA{XDF!L~ew>9(6{EWN`8*2+E?W;}Fk= zLXWvkSrry%Cz6*l$R*;4TOi#kUcRRHPGL zf{Nrd%|L6PNF+?K)n#I<1vHL}rr{@sgpwF^z=00WVo-h%z(x=WAJ1-d=iZ7J1^(|) z=%6h)U^0eX@0w-xtaM0p8SriVjJ-EsWe}538}iEgi46k$M ze*SA)Wa2=%v^{8cj3P6Lp~}Xx3tL zdP21B)?oD#({(&m0|bOoGsk(a(|s4|@A*FP3;PcERH|I>zEb@1W`yqPyh*KG_!C8R)vtO;H1i=o>!14%+gNE2f_%eO`t+h>%+#=|L& z>fl=S5I#g=5aL97k;~Bs3WN8YMM|*x|59O6a=b_>4dlnnGHo*>Gx$dkF$k21C!ipx zvxeP76Kw&u^c1!H5XyK)Z{nURk;Qta@{}CpJOUWxo7--1k)F!My&dA|oVbnirimKw zhju_%bELc;*ZpIVn@QQA6&k~4bn>cG3P~ht{sdG z)xryflQ9q>>hxW4hxdx9VE@1hZfiqRkd5+cK8?=-B#AJGvREDU+|OuFx?;z4&!KOL zbs{oen3>;0^UI;5eF(fn=8z)7MoongIj)5lw@0?bAD5Jr6!kFpdZc634J|^Z4M*eM zdE`y6GNj04xK30!5#ix6pqIYZv*6_!WtQw~J0`ZJ0sj8?90k{(`LPXcD4cO!zmutt z(@6L|npO*!Pg`3dg!mmvy#qoY%ed3>3xu@ApT?;l`sQK3Su3afedQtM|NCL}z zE)+AR(dLUsAr;`HC!2%E3d%cKU<-0rR~Kbwx#xUF5GR*{A*yt;I(qB~Fez9Ts?)T8 zY|QR}e!c(sE=N0i$17=6qNO{gc>CowO(1tuG%Jp^PwkS;@<79iCDlwF)p4j!;muQ6 zls8JY))-U_y?BAA+Mv^{N$^Fk07FQMMkD|}#cNz+{6BiISI6MD4csOwi7qdNLPQR| z3uS*TK;YgrZ{ksf>@!F)UUg5d=+8p4P4c?Vt>-O*}+--oT-rpDdKZg+vmgt@L>WFM1*|iX?CDF>LGU zcrrEi)S~9V(8#6uQ=G?I+yDbr-L8i-&3EoeLvucX^%Z!>P`En?Wi*oKx7&&LjO>Ii zmTF?BYJ}87N5I$T%Q$c}^p#uHz@(c**taOg`@53H8H52@D2z6JZTD+EFt+%s6~AG) zCzJlS9q75X+41}Pkj66@h!32n5ojM%!dBasrVT#7Wde6s>(!U}xzJ2?p+L4~++ykK zLMf;14tckJZ~1rt=nH^yg#~1{Dsa(6dxmzA{xLXv1tvae4PL@ zU)idnO9&+ALHdt<-ZbO6C+CRhEpbIN5Q^k^po=U;y7EDdo=t@*h@~`4aO+Qk`WEb{ zFNf1|!{=AGOT%~91%}Hcd0JXsjUx~`Cs(nbEq(*>I_!GuuzOanxw9+J=RMAXSzSdX zb#cw(1t;bU_huG-811J6^@Y{s|5J_rbK>Hlas##n6 zYT-W;qM9p5*w1gD?ObfCXxRNTQ*pbVOTLsL4=aS5ki5&uTjA-PnjlSeUo*H1X8E+)>hKj zsNdZ*+f+S{d_-@=Y8}4yj(WZ#D{@UPl47ca`Tct!Hn1N|&`XA`B51Q<^PDI^SBM)z ztchnK2n6#3(mbN1qN8-j2zaNBSw978-W`L)c%uOBmn|v7BX*KONVU%fBY6}SKJ;{#KQjMDci_?go8>Q%T_wbby(gLh)rCVC1w81q95rv_S= zyw)IDC>56K*~V!4cIoaMJyE+nWYEBjqYp26nroX^l0WeFW48mhZktdv+{51Z`6=94 z%;sfvXZ4(L-HF~WTWYfNo4;C8!XI`;4I2`HDCNGxZPHiw{T}eLnZfj`cre zp8B}4akX&NBy%j8yzFMDwz@SJJDKaW5ev$)R1W(Y3q6|VJ+rzRQZajM)QAFjP7T!h zuxZdK&ZWx#Jv@6;J5PPrPwEd$`YG)1uZPEBW+t2KwnZtDJ-aF&I7j=9)qvVXS9!RG zXysZLUI_7}u*0IGn;)F;V{f-Dp@?16bQ9I4rT$@OodK6nTRF;+KmFIz0|J)i5RdC( zCvQsmDJU89C?$v!Z?cFGafHgpF_a5cKcvxAX;vXJXH>?hrYz~^X@SS;W4wP>o)Ss6 zNJ3`wcWnif87DnoG~}6+fb6SahP382xV-)R^;6b9MHou-t%9GarkpQpDa(gepN@2& zXBFjELjhoYEA7zYqQkZ4d#pEQNWjG>|*@8bLYLoZoJ!`Nn=6al0dx+wF8GxM7AtX{v>15GtLlGy9w zhd>d240AOuxBk;`s|#dzEAs_+nsPU*7eCZBU&|X1-R$3-Vv#f4y}0;KgwQC$H1rOS z+AvW?m-o%ajhn?+bn8|~r$v!q4eZ@AQ5%x14Q~YNJ3$V%Y{HWYg`_S7QDy0r)S;o2 z&FUf5)tBmT>;1jhFw=7ac`KtEY8-|KEERH@88{+SaL82!qm zpe;|RBM}tt~&8s1)AZoQ;f+t@8m*O`KMLOla`X#0tUaZ&T|0L%6ET zKEbqvV#0i6Tzn)D#Tqu=5F1FqsDL_HtEaXBMqvB#dXWTO2twV~sEI8#e$Bf$3o3}p zwLLrJf|p(aJi%|5XjhhjV8u10Dm2L#x411Fl)olx6K}yPFJe)MFvded&ofsO6VhLW zo>zIiSOjRyS}cQ~G1wyolR%2eCLDny^}TE?9pWviw#^B6OaU|Bkt#(Ko~2%eaT^*MJnF;`kk6nf&|o!b*Z*n(hV0tu(0-Z-sIB;2>>(ZQZdF=vg?h5}UA%u^(9oG(8rf}I6K>vR8=zV5 z9Ij;kl8p35NF4#ZwY(wWyhUElFll%Mrs23Cq6AnwWj#6UjZ6>aAtH_JfPa@)W29(f zDdV`H!a?gNszt<5@!B&_o}xY=-WFs{6);p)$i*epvn6HXgdbkTr*V8iPEGfl5!WeV zuOC&(S4?uFY0#`WP)8Dunc{#fIS(cD%iG44#b&ZSfe;=1fFqJ@#^9w#WE2tq<>p$7As{kZQ zYzIN@E?7cw5M)=0YGO;Bn!cyEHpNQ`35W3tG(qiOJ6=|LI(6p+@)m+J`?AIP-GK+O z+{H!qMw5QXv!NDN=}@rl*pby!)+&(df41+p@A~`Qzim+4;&##c)Iga3^L5qP%=q=^ zR}5SY+v`Vwq5b|`xSyK9L-Ii2NW*`=i_l8UH|ft6Ny@Oand*R87k*M)Ow=8!OjRnK ztotv}V%LdSTbI>TT@1HkJ(U>OKW{qV)a$v%j=UG4Y+wdr6{$6}aY`;!mSm$;7Z3>G zoh&nB5GAVGH`bqg+k@m)KC*aS?z^gT(kZTxd@LjP8Ie$2hnxnyT2^LI8o_&cTMk-q zozukc?NO2ANPk9nR6Klxn*Zz?!Y{BRTUt&Zs}LOMpRQ1(`iqnRgRo>f2M=QJzA|sT z?PTYerB0KD>*;-DL&-;c6c}g2%<@432l%31O3C#%`KUPp9+{Zw2C_8On_11ju%RgIMZRe`rn>P3Yhj}nzI2+Xg@wK&`z>KJ#37%f-*u6n&p^$e;!E#{a~{Ekw$#F?%hTmPWhKHP%9GM z7bBX3JR_8AVu^aHBT>k`!Rv1J+gkwTZfU?5M%62aOh!Lf8e_M8`;gpt+M@;wN;Y@L zl)`nIBCBQ>YE(~7wnfQ9%Uz!K+WM-Mte=IM#9YeoRZ<$9K8_@7muEuXbOMvnW#B^m8rHGfH49RwUadNCP-y~Z7ICRM4@^gnSY?qSj2Ei{oEO& zh^}2U@|m}{C>Zlj|Lsz>7m_9-q#oFb z!orf~RZQ#O8E>CUe$D!E9|F#fSy}$u6?jiS?6Ali>a5(h%KiS3I-pFuWA>ril zf{|z7zd;2h#TJ$;@8PX=VwnuBQhm_}V><24lZL{MV!W^+%RK4u&d$mx8QE!@ekS&z z$~g&z5}8W2$4tI{NotE=v8L}duZCXHC)uNv zvC23;bm=_;xPsr!PXmgF!ib->it@O&0+zd3Q7Wb1MP96EHY;l7+wyD- zS1*^0pbW2&6dkBKr+nxogGZg@yp)=oXNP%e&xMcLRL%egR0Im6AgwRRF+(P{YDFY# zyo=@lD_544^!Gk1_2X9Ti_}DpM*@oK^xIT30aBksY_GTw1z7)bS?OKVGo# z^)i*J#@JuoP^o?)=!S-_v`ma%1kxw za2MBIhUOO5RJx)Hl;+YxMBZ_|hpULPOCx?9_roSUu_zm3MFv||(ySooJj?f#6{6Uc zC#8OZuz)jO&&1lNiQX1ZS(r{McJl}^P%oNg`V`-|LdkNIH>|)cx^Ui2;_${=12UA( zl_<|lSG>#ffaV%mUu$$VuR`?Q%^h~yzzc@u_3JnMftT*5D`j1;I(J{$**mNC z7Xn;C08Hd&L^K_L+v@)ic9*%hh=a&J!XTOD6*&p`d{{B9v}V@LPxe;h)&k3NF3hrP zzwFwp$-0>QjA3xv%`0PLi>y8jSr37f_|e2@tf7KU27)xp`3dY41H4JGpm1?Rp{2_v zYp5hU(8)sJHP$&`LIInVl|MMHohhp|8d~I5=VatNIk@`>YDR?V-zGAe0^J2aY1pP9 zS7p6D@x0vK&}U43abfEllwY1d%*LfS`9jxQR*rxv%vZoTimAbw!EsA6a9RytjQW-0 z8-|Tbk#qr0HvyeNGr~dD;f9FFj}WJEF{I_d3k9aiMPcRL`3@d4iAvfmy~7CfJ*?_2 z0(nhy<$rfSo`dfHj8lg}!NruggSj|=LfpTxxMQHMgU#mvzH!yk?fJpsgER5LWDpoc zY`&y-TtP7eyvI2-{%Z38Fw$!Zr7vbA;+cp4N7lKHGdELm9%$a{EqBS=ZFQ70aKeJ^+ZLg z%X}CI>u~n!j4)aWHIF z^0F!Ir_~6*ZuSht@R0gsYxqIM@fIX@eNy>v=$SF<*R2|_+!wF*QnQj+ zm7yXrB6s#zdp(M7*x$nhQ(^0RJjUftHa#ixef?(e@1BHF;?0&l%-ebT+d!&03T-N@ zr}qV8mLz6+O&DGb5B#~qX7E!x-GwClKsoV-bxJ&P*&E4@z$?&d1AMG&E)~uDhb1%m zxc;tffm*AU`R-o2*EIPs`OXm($~q~E9fAm!OU%bSsh5TtB(;UnwN!rto!~Swtngi0 zVw)i4sS*ZyUzqc;fz@=1m9kIBRQ+{5C$gXoyn9xsrDdM0p9O3+B0JK|eD_XFqV7oM zuhrY*d=%A>mzWKB`@L$mca-_0nZo`>ko}u*sFTG&)63WLdqT)bCtCs}5T}nXU;XTi z!*PafFE3|y!)T*L*f~vL^R*BpOrR^G-`4vDFti2-I?syiwbZd%CfHcmq4jsZDiR&d z#NVS}5b}tyFvTzv1JXVXmntgvOlT9R?s+CHKK%A`iz28zhgj~^-BD#s&=YqLB};48 zyodd%YtcrFkYU&p-Z|I8*)Khoskcbk%jY9RIzva#zn8LB{<#9{1;Z z+}8EDoxHf6%W<2R<94g!cK`h7jr*OvlRWof@47Uo*kaCyoikdO#+6hNv8~-zgT@{ z$nWCKF_O@8xbcpAc6nL@!t-OTo>r z^wF~(X@C?H6#&R3f8cu?)m>g%u1pTCH~F!Ke;eUzYI@|&lfT{OBH|gE_7_}1wE$C3 z#`@&#Mv%gKPi8K_z;b*$^Y2`RW=n1gawnu6_U&_v+iY5Ty!pyh7e|j}Ny(AG;oZB> zHdxzm#U^wx>7+7!$Hl_n8`n z6-Ut>ov$_~hdUgnqE_f=nIcIv#T-mgFl*1PT|mR8;tWpkhVNI&y>}ERcnHCq}91(|WLOXW^#~^)1RdT?UN%-hxk**EC0U z##vqrzFCV9!+$0cCd zao{4-^Y zPp(hM7J>^Sy;qimhNVVmiDZ(NHi%Q=>*jdNLHnd=sppGdZo#@YK7kQZn0N&0^~CEU z^lQfBJ0b=_GKN3rQyqOZ#&%T(SE?#xzRfpf46CvpZe)pDTCOO~&1~(oE$t<*Q|uS+ zX8hQk@wx&ii!S+k%`zA4?EW)NZvI-%8`xQVuCqKyzXG_G?9&Byr*uVQxqkiM!|v-l z5~&iK&(g`geluY&@1BWV(1N_*e4-em z0B2V0-e5qMYe9c>!F%RTWQR^yw2_-D|7^yJt_!NLl{&h;JbH3n%ih!>`Hc`HlSJf) ziBHe!yq%A7a~JH>q))Z?veR3 zCS!ZUJh=E@e`eig=>e8$pf<*R1mE<$>Q{eakrgS$r=W&nsE(5h7C>e%vmv!hsYU=7 zjnNZmS1E0GJHsy|E9l86*v*L`5)-gz4IZP7c!>E8%Nygh3@LDxk5S0tV zDP7Y8WZ=DP8&*{w0BnV8h8iPIQ`*0k9(RX?5m5$q3`R@9^d04td`hLJF$7_hq$VM_ zEcuM)(stA`fsZF0G}x~NA8jk1D$+^UW=339GS@VE1T|J&U)l+s+VXOW-F&M1C4jZ$ zrw#O3^6`BWkpaRfH&U_RH!=7crpSx-A>Mu zpb(|q<$qB=d&_Joq?y|qn|9>}(1;u`B+>JT0fA!UP7=6dh{V?|9xb9PtN+?kpuXUkP(m25Q z(Qzah#p7xuSU7hSG4^!D@8!fUYjd-u^V)k`Ij=oJN8M$?tHtm0wpRqFi+2`oH;*18 zVoo=VmQt3MQkRXDH8BwhUbh=X+3AhWRvaeg$GgcY+bdmPd+GmCrUmQaO?03?dsG#0 zm<-k`v8?vovuPkODi!f&6;T@#8`b7r%}y0M>p;*Eqiou}5J6Q7WS zXk^%(G*^P2R!*Bqcz!{mA-U_-$h$t{x7P?CZH~aDMzm>25Cj+VUDI-XbZb%+L3Z@L zm{Chjqu-gpJ5)y!D>w{z*%S0bsIEs!fe@qppp;bc2k^Estv1;b`eelK89kj#Rq-g? zP=M#@L4DtnmCz|qH+>L}qdNkib`L#&UNvKP7adEF6Lg(W9YUpi}&A zviBK@xoA!=eLhCNgGTcQ70W!)2?+jlaDxzD4&IS5x_g_Ix3K?*J~s7LZ7h$)oN@6L z_L#~@h-!@5(L$m#GwnA0nuhP0;@_{oD$I>2cn+j=wrgP-jI1wXtmc(sxeAwJrDi*U z*RTx~9xzUelr^_Bcf8av8yX)ZT3OBd2!f(s0?1mw3E6C3M}d?J)h6S;Ld*J?5{q{q z>jI2Ver>OVTjf#m%%mF4B*%?E0-OGS4rYRYo^v<8_oP0{L#&*6LR zUL-O=(u*k01s=?)%DZ;HwTAY-!=;J&2tAV7u+v=_+iafM#y{*PEH~=Ed5V3#|BO_3 zRx)O${uE&jgidk~t?PyNF<3EJDhUvXR11TZyM0JB73j;A)s3$i(LvWHK z)$HXg_43BO$#F5hn_L9S+?R>1m@_ptAEn^8uI38Sqt1|{g=TSCAYv9JGyP{IiHjqd z)F;iaRB_23i6pDHkAEl20#k6PX65?G zmrnZ&xB10vG%sEe7lc zAnC(vpW}jfE03Dzzs|R0?#*fjy@7GDHA*=mF!PukV<^7-wNr-^L*}3~#S1eW}&zf&3GStOh{*{k{O1%s9qtF#VDP%;r z{6O1P3!wZTQR@g-{R=ju#bF2D)Av@dozhFeN$0QWL6NZ@__2+JazSO zeoi;4z|u}-t25&@JoVK_(;H&KV=;RhJ6^3(Nl(}%(O-qAizhPmypNp=Z;Uq&t?4nR zHNKDXozMoQ@2a6(wzak0dzu(bY+jotO=p)Zlxb-jN{$H`mt+ut;DwS`i}Kf{OU;E9 z7qqX_)>(^RMfjvRQ=n$jpwh%`w?6ex8ux(28ETT5%D@s(h&4(7xD$U z$oXezfoig>tA2r@z@w>40`bB~B8?Mr-pM!SinC%>^)D@D_xy^g)Z$z(mMTDV9<*&M zJmpnWfr22h%*V3uu&~1*(ftmy4G+Dz{~fl~eZG7k%O2jX) zl`E0b??!MPE0O7xHe*lEOP3qp2_}(9ZW%E62X{d>I0PE_G)`HU)MX4g4rxMkKWG|O zFf!P_$)10Y7>`$d`BWa*K~6B<$`rKwQ8-=>Aii$8#2T}XUEK>F&0WKm_?$F=%Gi_p&D_duU(;#HWai-UVgyC>r3q~JKt#W6|$_o(xV z9~U7$d@(Yl(M@N(UrW0)Dl#JC-{1X(yJzCG2JatR^!q)+)VCJ)bp!o0Ny(88)>%wv2EEwS3OG9O06fj5b4}ua9oXW~@l*C&i1!O`& zinDR?R%(I?;UBK=+~II1)~^nS3~15zQGXn8N?z|VeSNDiyn?xTJR$|jWsWLTaFn;i zDO`^g(%vIds!)S=0jutphbf8d;ub$)h9!g#dpvc zK3MWg$}zQp&)U4%q=Jm*mBE{$wOj@SZcdJGPE`?)SABhbS;k3TnHdaeq#)swxGHw5 zMVKTOBUef^$ICe(`h}1U)Liix4DC-H9~ZmV3YjLIuqYQeNA=dX+^c1*W1p7pd}aYT>W1`hv9H$5PWJfJB)=(Y zdngRTFsY{=mRT9^-_z2TT$$M|Iv2J)-WEJ}c=xV3947vE#2rj-uaIqZWPT6zDnN`crp7?pJlD=z+iZhav{b8!7T8_ZjN)7Wy& zr{mvJZ-BhDqXqvvN@}>gm-WuC&CQ+LcYH1YcMcOf-$batd5vs>^y_cg@tL3=EMu$F zGIX?hgLOkk*3s~SoPW!eb}|eZeLX-Wqx~34_)a>%r-^}P-5W|qNPw3C$|hyz3bWD|AwQw#2SBoggwKD7JY#y=AKV$q9@X0J>Z zVaN99>|$(Z@V^OAlN1l?+IF#vE}v8glB1rP7lXX$5>-Z4tcZx|*`UL6Y+xwbza zQzY)3JjOa0tjhD*YVTIL`vj5s@ZlFb2S>@rOM6R^wNAi8=?y`liX;4rRWoi6pWeHD zwQ{KmGu&Q#E#{xEb`fVWs|9?E0(7DF*DiO}*dC#Es4brbL73=KKdDmXo5jBtre9rE zT5OT~%rcGTkEHa@ONlCrW#7HM9U6c!GAzt(ThZ1sO?>(SiO?YGx72U8 z!2i5lrvtN!M$y$47O>~MdX>v&?mLCf0V1m-F31h+Z0xSJ17azuJaAwQ6MH5v=Hrj3n7-0VV*<(+G#3B3Qa5GwW#4!ZsW_2 zzVw0kaNB=Ryi_kOD~ffsYiHg=G@=B!&O3~?`{@k5P-tIK2h`HdPXyh%hq`{PgxT}) zu5JI>51xDf{|?+v=W0jYr>@hshg+)q#iMgw7iG}Aoz;5a>FDCvwfj8OPsJqxV~h6C zJf>7C8u!Q4{<0HKv&?CO%BbH_r@nhA{iZAHJLUo*Qf;fEqsnj|(9v#lnS!bXt`C`+ zl&4VFR%JcOBA-Cjf!YIC!Zso?iD7+VVeH8>V(h{A(xB7~y zG8DA^$DEB&de(+AcJUq;wj6Z^$j!3g@RdmpPj)x;ugeMv=KgO@H#0Xr{`^`|s^*kA;Cezn5-$ zYh!L9YncgY!rx|98I0aQ92+hzys&uIW-rndCYSvf>AsxVW2Mg7$}3Rm6#hP~m|vY& zsGC=47^(dliGU;~T1^CHa?VN`fj>gAcezk#u*J90G+z74h=QRirki2_JwLpd0O8_s zBS@mnVV1rf&BHQRxMLCw%SCLhi*Rg?RwqBOX)EH;Z_JF`1M8)aD_pQ|H4l+jA2M)o zd3;p1I$Qu}q~sP6(UI#ummG%fF`*@pRd41W>HgX>w>Ti3U|tg>zdMs0=2sHQg1vya z5!_<)uR9WK!~i%%lV8@KWjY`3Bovd~KNATiG8b|(#g)%AVyKfDhP+<-GM+lo$3R$+ zqcnoIVYC_}X-&;4duTirCSgHjMlR)xf1y{KO!eOI;5kF)UVtTiVREQjo*Yq>LYP1k z6N0E<5V+d#>DZ_f`eU_?_4RQh5r4ervFWuF!u0(?EpZ-4Zqo!$Rh&h*x;FmpW{@d? zLuet_pU(Hl!nXU*0vPBzOLhMFy8-9r6F1;b<9CHHOt$zTjV7FAhSaz+8u@_Y2pg6h zYs;Woj(E-;>R-nG(!-9uG7RLYgU3y=1D7%ljvH4@my5TUeHteuV_xqHJ z9C>ZYEL^?h{oD+5eHPrcYo9v8WZpT#HRO1`B<)-M;PnRvWLC>otXNFAH0qwekgT~` z5%G(Cf@66aef%98I?v~=ruOzEIJ{tM6krqss&aT)My;R2(IF<%WEo`gj7ef7f%;8M z@C^B0O`Wx@OwZ}wRi*Kym*;t32;PD=N*YTB+8vOtmH}ii|k@yF@!&9pEP7xO@7g`Ygd6W6H`5^cBl14Nli)?NO z6M|**&8ESEjYE!`txOZn(+s?e=a^Wrw-X+%FMwOXTOoRWXu)i9a`MF6fu--o%hQ7N zSIyk2>e<#u^A^7PwN!|fmcBES@E*l3biEjg=f;fhpgv!EGMz1IzWF1KF$6iXwIp7?~F)>0lC zbYHq1({ZDjxnOOWLNdiZX4P{kwcp#?9H`>S$iQViDa_ru8)oTI<9FJ_nG+}={t+kfz$vu^e3uRq866g%Cf+`yXBA-m5DZ`SK zzyH{Y?wII|JvizM@E27_wv}7wBO*St{FfO*AUEzzt{gC^TR!0289KHs6Gd!uV~@XY z=s-%oF7Bt!k?DiRqq+JRzz+NZC`kb?N+H-(I@*CO??>O#v@{8tXE{!GojZNY_aLjY zK{?&2h;m`LZ+z6xc}%(ep%>u^zQ+x#cF|TYH9%yw%i8rH!t(t84wVFAYSHN*mGQRg zZ2aM<=t0=m_y00q|1elx-v#ZzrNh7=tiEAxTW6HkmFKL@wF@>TsSm;3JJW6(2WxA) z;j#HuzXWTkF}`_=ON-CDcGgbm#vV?m@CTG_n}vuBMiprMbh#mPcAKn6qlr?0A5%r$ zE?N~64NxbRk#sbMlrWrOIJyy%#szwWH&Z*+FWrsK2Kmd;Ttdd{rU4G>5egW~#_g*H z@g!j`tYgkKy$*P;kI%nO6Ve9z){;OAI$Go7V%k#26oMQIaNq3YC7o8HDmN#4$y^3C z6`%z22P8RJPr)e%*_a_JWrX?elB%E0A>X>!sm5sx7%6(HeyRCMPEgy`*DlD;gTH^);A3-^iF}e~k4-J-l9L7Zreb$P zD|NIF{*HPDBZeXC-zG{8Z{Hz&5H%`4RZ-8dK%CVn&q#Ip4T)3YvUbv^<$dZIRmoAqpPlHML|aICR6VVD4uhZLl*k zyzmomFGT9%rGuF_mD^ZaYI z2DN0vfU&FWd=dvs%f$%t>c+u&Bxy*nK+Ph(HHs>MFou9l$$v{?GwelOz;)zh{K5`oAM?671_xD0E zvNxEA=alaLA5$wl2&c`*_@O8vuU*CyP{e0qmk)R4;#^Ofp9W?#d!#3?fV=o|@9%5& zHQtCLL}UJ0`Gi>u5>ZGGo?}9y$=A@*K;OXP3*zDnz0v$B>de=1%-KihO9vIunE`E% z8?&*+CU|2ukRIM1->+ioLk(SFqgmVBSI+|9&o{MFk6f8f^_~T+ldkduqRVOX!V@=F zim;h8GeIYD-p5j#2nx2-HW%Qh!V*5VSqRd{Q?$Hgm+91L5f3-n!4?L$a6aBN=K_k+ z?*dEA%=+B%@LU-L{9)J%HB7Uj1vMeXp-xX~_@OYIxnK<}YnuL6XwnZ4ir2$P6FI@B z$5iUUpuTR1Q>&dkkQL=m%dzg zzw1tdtj%f%R4&WEVtu9?sXuD`rWqO60q?HP1y0Fh^9L~HJM>ef!9^A;lS^>?+UCHz z+VkgdSK&ROa+|p?H$xifCx-u7;iXexILY=eeypt+T`mnQa~DMvvY5~8Blg$`v0F9geem^5 zf+=L_^G9PjgC6xT$R10EcO&s?9uG7xDkP9H!=+_j7`Nig^l4Bp9f8L&eV9~y2GrOS zsWtk0x-b8(*7$Dv9p~DwTmK?EMx9(KsWq5$d}va#IY9CYNWM>HTMJm~I3!x=#ZBdI zzMR@wUXu85zy1HFpV*9@t7E^WW~jfmejG~7WA}BTvFZQblj!O@YBizu#ixp8ZUtP6 z*`(@1qNBGDrvGG_DvgOqX%|Y2?=!0`^9CxY>Es%l8$MBoe>d0Hm%Q{`YhfwyWgVLK z&5h1lXTf6+2>u`^e!DCa3Y(iRkfh`GnWl5;6OUdlup{3^3jOT#Q#C?M8$h^li*L!& z5RgAX7#(EO5O9o!gv({|YB8|)4N+(qPA9-dG<`8sR>2UU2Xgy{tN$J%A$cNvY@`WT z9H&Iy?1aL&As(Ne%OmMY@O%;k$v-EJyDw;1&R^Fn%NqZx{^CpV`;7Q6e%`e<0}UJL zFfR?=_f>vZo}YQX*OFIlFnX|_A3RPS!?yx8NmQ*K;h^QeOgOO>8~a%^K3Yo8k-^p~7<58q^G;LbY@ zdFLnL=s-fFu^_JdvJLa4rOH7p=WE7_n<^zEx19Hi?*NNQHq^rYDj7Bv{qI32%y_nx zK_SBJRj|Fqql4O{*3>7LZt0irG%++eeV`7z#957&T=hR0u^V186LqW?g>ySxrv8pM zR_H)0Yoc^>vT?u;2huk5%w2Q%1=On|cABpGb)<(RDI<1IT$h%_#z3%OE@+Xor z?p3zbv%Sx?Q~sARr+bdRD;5CW=FB7?PaC}YxU(?r19s^;nD;a12^J9WbQdh0L<^-n z**@6c-(OuNngFNcm}Ftl$N4x71!<34Ya?L^}^4YAL^ZZgZwkm zD_UZ!z#aR@^4EVi4>2WX;)X%*D$RbapT{8ym)RH=Ri07spG>%V}Y2BZAMF z*JQq%2DvCma{aVvDcy%O;IdV#$#^^XyYZ5Q z6cW3h|Cz&;C@o>+j{r#OL{dH}C!d%d;$4!$O?hhgmqo&$3Z+)_fr2gbmRk+luvu`B zAv8-+WDi-45~<}wKNYm+S(#+ADPZnrrOJZ!l9~xI#N_Q^P^(~dDvS&`j)eoc@Ct89vbl7Rc^DNb#X&=<1w!-8alMF9y+Cr{5NxJYo@SdxLYefa@3&(ae3|*O z$~d|FBm+d_r6TpC1u~|QN&2m=$)`q$v$6^{$7}EAMuf1X*;JMi^*kH`6r+qwBQ&l& zrw(kc{rzi4f@g!d-5P5gPPh`SWcIqXkM*`T$B6ucVe3aa&LtO03fuOlOPM?aQoqg$!A4fJPQREmCp&wyS|XJEiaL>|)p&2W`+g3q zGat5HZpTt;Fc3Tt_WL^Qt zs88^THAM6jMn`{0$ZyUe{`N0T$ec}LLu4gp$xe>CCw$AVIE}Ww2H|MT1bTnf^Yd3H~dk~WV7P3OXQ!)|X6gL&8=N}guZbrXV z#TXzg*Ly%|Ld6q`IG_lq{1#OT<0HtQ#HH8SdLlqbL2bb+f6tAa{#(br$k8h)y7%Tx z?4P^W_P<}(-2;>jyG-C`qt)``%73=u?~7JW>y|tHlMso!{@~k_i64U!vBi}@#N{*{<0f$b-i?utsSYaFUM=Z&K}V<`kCm<1rHcNpMvysi(Q}r6xX;gQ=M87QgjL z;o+ofV^_2+ZNz71v`S+4f1JsBvWIZP|6VSuFjOxcZQq>DoD0kFs&@Iw>;;C%ONUnP zt857gZ4|lh*7Q>i7KyOTwGernkxTKH(^eau56@=(_VA;E%gQV}9j#Cd2uv2167RMQ z6CxWY-|>B5I(OnEgFZp`m~s};`QaFBQ;lf78fIWKoXmu#MERD5NtF3{6jvqpHU_oL zgyw&Nd2+4CES0tw%GjHOL!{Xj^@1I9jWOP{WZ{(Q1va_{@7A)!wYv2tb1!yYO9!g9 zLZ#-I%_%^v6fbPZ-;+s?@%Pk--i?e5-K z5r3=Y9N=a|!gGOaYn?6-p3J`kvf(ik8aCLN09PHKFE75#&&~!aJn;C0Eo#dBHTzKRUaqB>j`o`8Kv*=%T8prb2-2MqiLR_@z9d0 z79^|c3xX|(L#X2{Lp#Qm#Cz#tISML6B0<@o^%T$3*%Xl@QrKhKsQcjb7XW)4*mGj; zbH6_Aj!)q5L}wxNf7Yj$nsY_FIEW7~rjb(SLBhpJkU-g4WH$uMoADr0#$-#2tDL@b zQBcWNvZrd_Z#C?ZvR}`=r$CY5TXg#?t4lF0BpPNG%LggH*Bss`rUy_$c4p!LpleX z$vX{qeybUoT<(O28omkxUPb7p4=KLYq#SYA*jHP|0vzHA4pqVkr7?RF-e>XUPHS`M z=X#<3@|vTCu%qkJlF#&|ywk>we@ktlI7~97E9oaP4Q1bO=mVSa3v$B3FYlS;|3YhQ zvdDTysu>|GzxoqoZ3T)Knt(Dw%8M^1z5aA<{3iw-mMLo%>F)lx)IN31<@jTtfC;)G z+0g70fas=TqbJhDqP#&=soxKjBdv*o~ATEFUpTxhPrw%uC&-vDdw$x5teO`nYe)H_96tNeE?$mz_1%bEDUp@C?Ag4&DWG*o)3A z%|AA$2-d^H#(Jr;0{V}`&xyMkH93nQv*O9cx4bQljM_5-FLV=QrV63xBPoar!%qEn zH;k5JN+_WkVe8AI^!B~UF_2aEM!l$%6zt9ff{Te{uRuCDdzWB=ck^StM$*#Ek>n2)3e12(@?Z%&lki%QrQozz`MrEwjV*@}D z^+=(eF4QLO_|0jrQ@KZ`cCd$&VpEs7Qw};;fMIDgQl}&%;2_qqY4ZPl*v@t7j{9yN zc1MQ=^TzdR$5GumK>N$Lzc<*_G6vF8$O=L6mOy})0B%--dl%c7Rj+MKMy}MH@JH(R zm=}T#LUa^=M7DLlqS?(>E7=0`N7=RwUy9ihO#9WIcgIrBIYM%Xk!*GfJ3OSd?sdb_ zNfd1y$0s=<<%WXdc~NL==aK`#U55RG+v&V-01^h2)7=9XNA^mKq9o-q;n{=rlvm)NzfT{vN*+Z zcKSU_b814EvO7dp&rF8^+zr1eI1)hH^}g4VMCy6M23{2wpLtGQJd1Sv*;JUXjuYB} zMO>0Lhk+m%oSs8&MJ}4O&^dL@w z@?F{uf&(}~+rrXUn8}Lt`)}ak9F;{#w;cBG)s(GF&MM1iGzP#2f7C< zC5NKugTGz7XDqAM*Jd(u*L|X5Iy$eSAM->-#O#b6{sKmhPtSqFxpU_5i|*l^^_#)g z`LDNyE?)R_Au+thi&A-awE#gNg%`}#7^e8v%KYv~Y}+0keGqRk#~1t#^!%InVtc`6 zjRHiG*CF!*7EluTR^Nx^J8Op9cov+5$b^Sj$AoEe;@p)6Y;OF^kz}m#R!`kX?Dx2~CjS^2PTau5C}EZ~s*_N+_aX3!Eh}Nz`qgf-{Ng%{ z)WPAt+~lm)h?bIkdhHi)Wh{t|4>T1rReogrYSjO-018B~DSJfP0wa2Z8)=d}A;d0P zJYq^T|GkiznZ@PschI~TVZ9MeuouXsqfaANGY6%NWLkL|{r!pQH}!J95pufC14eIw zD4qv|52tDvAA52& z(rE9IrCtAS!wT!YpOgTiZ7aq#QXK%(c7$bwA8vHk)Qv3)P5Av3!WcE_gR7Vjae&qw zsb12Y!|HUKUHeN$P|}~Fj8H zv$0v#C}5CmVt-v*%0{RMgN)JAjtxJYUW;6adicw(=}A3CirKzY8;VBfIF;w5nNVdD zbpO5c@cj{VW&0+9TOSE6B_1swSW`dgDPwC*$u)%!L^^MersmWfVaqX;nU!9Yl4=34 z+Wv&92+9q^(rFJd)}r@d)X`y=($!yLG19Xo`(uZL5(i&OD!y!vb?xdNRvork%uG-G zkN}7w_Izv|pvDI0aVp-BE08oj^qisitX z+`5uqT-@pD*7s_{e{AfyLvGF58)g(lx|`uS+kcYJf6?ie%0<4`fN8%DNv2QDmloyk zcBj$z+%O8Jz_rYB09%yD5f#}9@OrOGjX*S2`H==y{_t$lGpIUadlY-0!r(#*Bl)`T zkik|IDcaj^PtDOc^trZd4A-xy0J>nUi~I{L(tT?(#=-vB`s%#Lv&9p5V)C~c6FU<# z4rvg>yz%phlx(4mMq)ERml1X)cR8^9V&J<#a{Z*SL9H$1Z~gRZ@KFcy(0zpp!JieQ zh67s*5ffhxq=6!5K97hted^{pNgQBly?G^Iu|?~%1}>%5Ti+Z>kjz?9=$1n5ACx!$ z`xo?2=W^Ho?G`(efp6Q2@KnPY&Frt=sA+Ma3X7@2Yep-sm@cwt#^O2%(htN|#vS4vlD z>if*k`cD?pAgHv=ZJj!8o|N5rHU!{^ojAq^latgEL%+P&K_&5*hHx0j_Y+0Gc>qi^ zX}vAH0iFSa3VHlR(!Ja=pQYiGuR7RQ`S2nElQ4!&133cBxsxxS*vXJWbiel}qSjVV z0U7X;6e{?&*`z)3Atui>!KdUIW?o0ax~+-4M=~F?Rs%IlKgJ7FU|R2v(EwPvAg{sg zfhJGEPc}_Ya#s=7=v30Q8}geN7~h<$IaUDA?cBacp3*K%ys1J4YeZ^lCUBmRl;PzB zw?@c(HIca@v&2G#$USp$?@_tvCEsY#(Hwfkk4ufUEeI63geM{aehUcvps>M1NJtvZ zTsw96Q|utcbAJ#R*vAgHrmh12u3dGgx#B;nX*AigG$HYC8aPwBA_hYq5+yBe%gBt? z%(USTS}mhmbU+*VM5oY#@td&JvgM}1{*IfV)*85fwnF%_tyA6MifQW8y8 zy#uV%5A!|YznP#iF)Nf@{XtWt+t=~$x-V9lK(r$75<#<- zOhm>9%>=U4Umj6R0)o`X^MhJ_!c_qbyHQ7&%?Wb5YBK6#QE@4Yq>la|Hhv}4pta`Z z5fY_&bT%Iu+bUF3P~Cn`GR347td3Kb8s5I~)$+~njF6-M2J-&xI7bEa8I9*n|94v= zaRN{Vad5|8eRvphofEVo?9VWMtQlMvKR$Q!ymLw6>7cJIiVO*H2?`9Xqsjr1%#JbS&n%K4w^{fGNzl{A68xqTjEqF;ucPlxp1)CG63M|j3X56_3ZpjgVHYzwfK;}$(sX}R{9f;tcuJANPN>?3quLXIQ-8tt#`Vv`pE#{9KV{%XDta@fe0toZ0 zDv@_f*yPQy1DW)Jx?ro)QxBoGj3GuQo8tYhMzC@*v zvn-+Cg@LUezN$;nx{ZB|fGjhdz9wmqJ;fx2;MZ)|cCu%4Qz|{V#1LkmxiB|(+~7@b z?Z?gz&jicS_g$37&Ka_O4o{e^m+s~Qnu}wRnR-k`AI&9D*@2cn#BZtf2| z_cLb%Cv5FH7=_!fCYC8%_6qh9%4AhgdFbC{aSFX1jcafoK?&MYS#VAprqp@Uf zz-8~8sgXspcc3x{w~7RQiUro&%fQ;9s+p^Uk^?aKVKqN>#?D);#q}`X8u~J3&9hif z`g{=lc9@#7yQy}lc<-?sySf3`O}coV8cXKT#Lg(<>@p2?+ZSykc_dDD1y9c&|M58m z`bnIrtN#^j`CX=_&N0Q1$$)Pvow1-bpV4%AmU!jy;O(Blf5^IIGv(Y-vl@uV za|T&0>3Af1t4^siPDN9PzPLS2aA==8Y>>Mazie@i;aqoDx)#!85Y{^tJ|j{idP_V+ z6N(h(aEtHm?B;^=cF=T=;80;aKOjnlj#NzvRUqMo^mu*(lEuxiCmI{zH^jb#~J5(xDl=gAqry{Qrp}8WtLL&4td}1 zPBiQ*Ou~OnP|I~k9jgRkK0|L8Sc{=QezO5Ip|W5M#<+RWEI?tmVLxuy76{yWc&7wW<{&fzQOisb^Em|fX8Z;7tAj$GO&ELV<*wUyOl9r^0j}2ALW$7wKbWdIeArWXP_#|-U z8!SW)GYiK^p&y4vmaMlVg$3 z<6sfaP<|07#~9uE9KxV0N&8jagVrI$zo&rkDjg&DKffl#0HCWGES#_w5v6d52Ex|N z8p*Q=h7(zP3KOF}$Rg&wvUXE}6N^W^EO0%Vs#JQBnSL1`(5LY-hh`H}Pol48o~kDF zer6^z#pLMbU*{_$j~VmV4chO$o{3xizn2&Lzx4X(673Y>2PVH=+f4cv1u^KCT-rXU zBwfFbP+59YbmieeX!CC0O{`B_eMGDMD_52cKE|zKD{Xr zfy4_S;w)b_GlyI(B#_>p(?s1cn|&4~dQ%K}#l_9zN#tbbO(VKKmJVh~)f*vx4;rXm z5%ZxCQ;E|$s&hK$au@(|?PE>EZrbL=W*noP9{|Dl8mLT|`|=J$q=O*oA-aX#@m8s7 z>(i~2m0J=wUr0iAf9$^CNHKU zj(MMoaKaa<`FZ*3^xkM%t%L;auoTw3t685SiNJ2^&(diaFZ%+f6fIR%^06*;RV5$0 z(PfZ0_fuRUbq;X>18#IXO94 z^Z%cf{ZIE7*C+nGZZj!x>!Y~3pcW!DRO#`q&ArnfYgu0`^q(TBe~J8J2yP9$S?!wg zk=p&U#hh0Rfxe2+yXLa!N5xT$Vp(+8X(ZsX|u_#qp1MS5H?gq&5I9SQ=~ z2PfZY@jq%AU=fVgWMKiQa^NzNq71ds6-WLy=jNcZkfEzw)$(!-DQG6(IVZUCtpeap z_+3J|V1p&s16VQ!5o8rUu^)kx^J8wLNg?vmA^FCoW_{G!;Xia^oC|%(D1nGBlKBD2 z)pRJdJ`W-v{puoT+S-0yRvmt1sG*Pa_I3PSP1WU4<{H4NSXxevV945;aka>2)u!G! zuyeUydQtl5w)JTJ%b<%ccbq2!Lra10>ctSGx+Gx;Thl%|%*2W)Ss)@TnL4X zBCVPAza?2iL70AzN+C6soaBgh)%o($xXKF&cRd8UZjO=UFuhxj&c zb4k#sU#ax9ZIYa9GP>y;DtX!`%RmzSG}_Q;X?>TGXuPzY#&3*Z1Nsz8n*{*KDxc)9I#xg4J89@mJEK}PP{R~Eadu!ad~Lz9%0swZ)`7y||tR^rEkR1xCRW9Q{$ zI2@qPlG@l=B}im5#~IQKzb`nK^5i+2x^+g+!=r;gDTl{8yHo!=XTI^+ylHGz-7qbi&osQC&RXoLY4? z^}PIne=&lixp3J(llycxh)pODTUE~=1(5(eAOK#TGf-wIv)2a114n&xtd~S=QH)b3%?pkgCD4m#QKw-1WfYBFBlw)wp1ymKH6*cu5ElC4c2t3T1(GDh+fpV zT1H(R3rX9unbXP~rKD6p->Z6I zcLy8S*6LG4MJqgGQ<6>l!bYa*pVGSZ-i>%=Uw)#26ceX2(wy{}ki^n3kQ2-*;Hqo0 z&zOvO!j8=NGX0GjsQfHukiIZ_5u}akcxd%dHP_?d@8R!-g`c;W+I*={kFn8UOh-Y) zudl^xytu^CJ#RTk%mbY5L^7gu`(Sr{WKyy>&DdUFvVIS(94#_AKD~H1z{>=E{w6XG#WvPgG}qu_nTslU_)>`E1ZCK)l4kYBtsppKt&e~Ehu_T zp!}=_Qh;#PM|q6^=8@5H>$Qhg<7Pd}V`~?BO`0cGdY{lje{@ooadmB+Lr1^(I}BrV z^~DMS)Zo7*;x0}k@}-TQtIi)Z#s=tO37 zZxFIIyVI`d0F+BBV1mX$a3o2TGmfuG{D-++@X%Z&>p&_50RmA>b+zoiEV`5owMaD= z==fd^dy%bce4zWVFj4z%N1^Uq>}U`p4#ndF{E8;L&~yombf2g`7}FAAS+B8`Wu4q!<=V_hFYHwqG}oGYC*5joMrTTEI&wkEIFw=yFZsh0J0Mny%@u(f%ut^PNpUR=&& zW3*C@i_sjP{s8<(2~C%lC=9jy({|e>fatC!Pa@-fPy>3YH4HoGi3jFMM8SdkH@~VG z=p$Ha>0jT$+`A86S(h&tb<=~R$}*qHsVK$AHlAoAO;Xr3J}-USk9c9+Nc_9Cz!Nbr z(Q`+O3_X_@%gIrSB&MX8xG5~DV0KAL!Fh58bixbZ&TK;d1G%K&{`8a|G|;ofQIM)B9RTqtc{c*JR1};MRdHm>Uru z02v-h5#ST=qz=q`N7|c&TRk1TbQzYAnpUg1CQ^wiIU;|IORzfR_Fr zMq`6isl{r5T3qt$&A0OFC&6zwCW7DErjm6%-cz@!%1dA(Jv?)WQwHV80lVpVJkmF- zuFwAWEbF+HxC@hjdZdy<1V}++r#^|mRQ7( z2aq^L;1XQ=l5!c~yZQ%z1K1p}EP?FRsQPF6IK(Z~WlhB?9pC2(kn^05FIK28L7MnP ztQ0F=aDd8DsQs^*v%HI0EuRm-&}-vuit`u6>9@x)1|X`$3NN7j^b&l*RzK3WY1n$S zh5z<(oEus=4uV&&T(bSz7V~8q3W%05a{`R<4d~=_0h9Q^6kN9QI}Kj)I}|hqjCv-MdBTmY-wX6HHW-iRBQw zR0kgL)!ogR)%nw0xTn!Y?R2Pym-FM(diTO~`qh-C}UiD|wI&)3M{{t?=zXO2LV=wf1X zg)nE?_lb!h$yn`%wfaFy<|T*@Sm2!ARmd{nBMH@dM5aqOYKdKY{7?{`4|NMkU!Pb+ z3YI9J`{FEJ;2}slUri&<+e6KI0R;k*(VYOP&$JPS7ck-I7*3XFVTRjP!TcY+_vZe^ ze&jE~(}jZ`7ChFFgE*HTtI7)oB!9%}60yk63}_dNCKO){zg-mTC#szBQkTP+`@sM` zrbC2{Q$NRiNyR!y$9;S+`6GVVdcuaGnusB!<0Q*6Nn~E2@YWIY&OPP)_K-vY=09gy zU1u|B9rc}BiIczV2Mc4zH`=TItFpaXq!-2G{6UV^K`s2CBA?zhJkYsZS>tA9P) zP#sfJGy)xNiYQtCbCVRi9i}F3JT}(Hk27BPu4_2^!E+Q=u70rI&Im`;>zf7U3cjGY z>K(k6ZY0Wh18LkSt}duyt7lUMhpdqCh=vT6B9vJhYf{^{+p?KcR#m!t(3LUhUXJAG z6ssG2y(`8N&xsOxy6pe++fnsr5qkl^`@t&Ze6f%K`<^x>yR4 zPpZF%lzbu+mOqvyKNqXUet~PyUl)Kaw-{17He`}yU>NwgUZNZp#UAI19-t=K1$mRpgT}@JFUovZU;2( z(<;wu%i)8iGnF?6i?C}VkX$cCmymsCI1Vt^9I{aPep51^Bji>E zlupn3NKflaV=`KQ-dLYU@b?hkPetG_ktSrP4JiuG-~W;p5Z9m4S1B5Hu~*qTj#SDFgH1ZxDItrSv**3xgy zp-?J72vN)TYTr?>N{dOaH%o5c{VcNRf_31-)kS#W3|U2+8jOqvx#~$_Rjd#h%8Se$ ztcjg>OGv%@iFd0o-OA`r-d(HTW%D_xTOIaQi@bwFSFVK!wVUVCR2C;2l45b(?3a~; z#aLW!>Oi_%ZtK4ozw$G_$$iKDp_RbO)oN)^u^Slv|9Sx;9#NGS`9;OgX`2ERFUMtR z%_y*TcSwkuff7x3zXuEybJt?xvID@03MoDU3t%ZG4GmT>o(VILgnYy$PG4GrV(xD! z?8suC#s&tS53kyN=JKUkx-TwB^3wa5ez`x^+u0eYWKV|r?D7o5)tXu&JrPN8sLF;N z8PsGeeH3Xx+3$Ykd#&$}&7jHshl*d7!dTi@k3Zb=d3Aa>@(A$g%KOL7JtzOH?ftjd zd^3fNDo+nG5eRywgwW}Krh54&-}8@q^N-&N9l!gJOLyj1{fW)Cr|-(v(c|~+t7Yvw zys%;1hloPV$LfXtH|;CW&CG>s7< zyFf}tDg=rnSmWRSeIt-DXPDpbJp>>w+DK`Ir?gP zr&gSpn=o5Q2V9uhv|fH`$oh)RO`4j;MG!$$hUrUSj@%;ubNO`!DYCoa_1dyev~)R_ zjq(j5&4)>_^&w2J8{oA;;&{r@nfxH`s}Mdup3E=>>_VqTC2JDWL~Om?=62NH_YnPt z_%g9I!+J{e@xYBH$3WpbduZ@n-RR1LFa2@fdB<7BQaugt?0$p+N;axCx&b#Qg3aZe z=!!vlTmv8p!XaTv`w*1qhw1jSTz9Nmg{GPdJD^_3=b9wYp|VOZ4tNzxjd0v)w)nr* zNt-yb5rkc{jFICX0^`mX-?v(XCt1|=t?46$4?$!mumLJ2b%3uVj=6Qwxvq5|eG-p{k?l4zXA*KV!1_ z71v5_e%+~(^lVDZ4T^wc$UhwLcxBF^l}Q;fVKDTImK}jeLjzJ#(Ex%enWMJ;%agAb z>1GmftEdWFh}uB~L+a%h(b+jGwm-w~e;pVJF zfQ$9IJTu>IU>5!)%*^7)3?`s(J%C5-u3LV+2(+GlhpwT#=;i}A1LIQa80mIq?858O zYXjmdA0nLcqfM2P-X1m7I=i94mqfRNTZJ9cxiqlj*6rTmo>vh81NE8K`o{5eSHbUB zFFSt^edj;>Kt0jPnAyw99-ld@JnS3%KR;hc2t(6=N>{73gEzD>IwrzXIy+t4%MC*m&FXfq%d1^{bX(xswO7uo zEqPVmbkDX`|N8FUO>}P7u0Um5Va#FnnH??>#1AODx@-8xKzC^?3j@KprsrdyV-1n!dvIQ{y0vqS1!UIsW?KrGC> z7a^Q$Ze?H;Gkut3dy*SAf_GiyF zQfprtK>Mq!l{jYE?gRhDgs?i0G^0bm0e@_jmFLY%D5y*>68x}t^YcvBWLvyuBU*#x z1^V4GXh36*rEO)di8`B!@uuK4i2+8blIHRt5Howu^R+tOsL;3eN4#wQVM+|DiOq6m z=@w>IqlbHc!opis^YZko6r2X8>tz;b#iLY-*v^$Y6_q^Olti>ejM|&s=|gNGTuoJl zEysJW$$n{r4N54>1Ybnj(cew$4ZDjQLl(;CGqeNiZSp1DtI`9NKSa(`KT zGtd^3D`e8=-XBy}Ulr6l^nFP!Zqq2R{9H&3>+rT2SXwGw%314QoMsk|JUDjT z`LcIHItQ=&9{t&X+fi)XCx`8+?COeezNb*Xmn<`e|KE!N%yNpmG9{~Cs`PXkn36+z zx|N%n6Q2Y=Mt1i4%y=MD2hoi|VeeSx3JD5kQhTO@Jhy|jU{x3O9WZ1x7JLBvn)i9i z+LNQ{rDuP=Za^(*e&x5nt?$vVrFylI79}ZKDJd^=Az_;mdb4g?jM?qS+M27+M3#w= z(jDv-iou609<}mYPI~AWI)Lup48h;-le=BMpkSVmkUpAUF}1CIF7lQA|2Z3Ow4)=h z*DC|~)!xp`u%Gd_ohVX~HS|01{?@EaMEUwrUVxD+T2<<3bb5MPrIS{A1(9pa{>nG& z@!sI+L4bYH$G*lHMj(rf3?~o zrFSgTh>+u{H3yu<1BO6 zYKR~Coey0$X5s0;UKJ4aZsv9jl%*bGxZV6|+JH`cfC7CRZgUr^Jud-%@!dL$ zzKu@ib`HyVu6X(9??++wx0zT+HiBF2?y0w#rWa@0*0!4bT&Pof{Clo7%Xi{IJUq+V z1Ezn}wrT!_LA$AFIS#L6djW-H5eKpt8#OlART1Hc)oCNe%W#!AAPs_tRjqx43&HC}0&h0#x(yp#kp6&|!&DW$}Sd6m? zt~czDE>SzWrA$nO(g&TKzdeeGn2;W`zmg|-mh$*-%IW*FE%g;s^AQyLw$d*_znfqL z%gGeoGjVo07^x3sgfpUUQ6fvYO0OGD@Z&DM2qQmX=;(DgItV#C7CIZ6IoN-^*%-NZ zZ#N=;+*98oR-1Kp{0P+uxFc^FT|ne$B7xBDD_#O_v@SZuq5kp7dLKP|akPhh@N8wK zmQ-J);RvI_JL9%4PyUM{6={|9@J|IJ``F+g9VHA6WhY1A!otruS?{1EK0XVMIM6L; zWO;(7kpj+P>-{IBC1hWM9v#djcI{7yb-Sxx$en1IYbi<8praYqFQXX#Jo9@Psx+pR zn`i#%;E~!`_GY`u|KyF)w-MDPBA4qA_g#ZFDay3`r$OysB~N@WK{^uaU63n7_SbU8 zuPdH=)tQo#LVPr#0I!3r#l!{}zoOUH#Decx?o2qTXD!%BRJGCs8Lh*`iP6y4G0w3v zOhQHLVzrCJ+_greq(Gn)U?`XqErS3O!of@c?QU@%WiU8@)uCr?%E;34VlU;VpS{|n z6ogZGiy>#?6h{w7v7PYFcP4*$P`N&VSVHzl15%;qp3QDG z4}QpOF3LV{IAK#e%Hp6}DUqo6k<|I|9g7u#3~@J(sT#5lg%`F`q6e8eZE>ia@O&K2 zvHLrFN)Q?P4vb)unc_!9p>VC<&WSBj+Qy;BdsQPJd$BQkRI(`;IwRoz`bNwfjq43bC5C1=I}h@ca48zCrcnSv zIG8&&HR-!PHNN2nguoDHo~mq5sTr+h9L5)doLDjs4mCv)!e$ld}hp_t)CDH&5cS-`6fT%W1*cnN-eLZIf`H{bcj@P#z|H(HhG*+_fx*&452!&HZpYtaYKMt2wDKQH} z4FESKG@ObYlLa+FU`!G0!R=TLx~h87-e7?E!xS%Tra7#j&`Rpa-d^$Ft#(X`Cv-3J z;y&>rf!M}~cAv||-DWD9*wG+#B|QinELs{=DG3u`;|&?v`>)C!_l~{gcF6wVdvwQ9 z_Rf9+PVVTkPh1QH3!MX|nd$41f73k+pW95#jU+4A4!5@aTBoGxAnbrBqH86Pdzszj zK8L<`o}ggc;g9AD1xu7xh@Xw<$$Z7Ds&?|shN6WiQS^TFgNdrhmkc*#mq?&q5aah= zqx#MeGlvRW(~qQ#&10fCKRX0ge4Yb2c%PB??gU|VN9JuX7+P|EU6um zczD34GO2h9Aj?(&Kvd!C3^cy3j~1GBo7_>nJ0K1>wftn}DGD*t zQwxfn-1!+YBW-r2c&SI{!S?RY9#(QZ?K)!lo2*iPl>2}q6o^R_no(l{6bvi7#8iG=^)b764e*CGwYJ#qyMInJ{#zFET0U=-{ zw*zGkhL@tp!Rykb0;D?R=&|CX#q);v@=LR9$vuTNtz{--j}Km*ik>m%4T_6-dEXHz zspW==A$2LDuJw)zqT<}+NA+t}YU5256CLq)ouVIO9?^UhDouinw528ytLbP_7r2`n z65)bjb+pbTL>bXH(m&L=1ct8h)H+V%(yTotJ%4CQ&}OR;1o>Oll(x3Wr8D+$-@SjV zGIRGU-8Ul!;+y<^-ENQ4s-Af+f0_D4ajMl|fwJ~-czp}2o?$(4eRAT^hiBv{)YT_R z-QqHADRX0YVt?DbT5jYpdW<$$+ydA~V_@O4p{lr*OLzVeO8 z2LhJ9KK%-F`eYSwspq%TV^<&Ao8i^!OyL3&6=>MsiSGRzGRa=tuKtw( z&1T-Xq9`sd(_i`BF|YV@FAC`fCfj({myJAego<~$P3#Ui<_}kvS7-r30pQsy^(T%3 z1Wh=kYHisHjB_)FJ+NF-F5^2Vo|e(y&>!lnMr!*9^6KQvoteK~uLL&KL!D1IHtmlG zg$_QwQrrJ-k`foQ!mkH_vbuT8*X7`{J_&H*3pQ>?!PSEC{gd^nB*E9r zzktkorFQwMFGoq?=iWR*1yg&9tbHVt-?oi7(b5{B_F+^M8O zZDZ-yWUEVlU}$VyJrj{@b_0vVCiB7)b%B+VP`dmZ-65~Q2jr{r-B87lJ8#|6GvnAI zx-s!ac@B5Q6}M@E8IT#5O90%C0Z*aQmnmuQ*{;KRP*lDPhO1 zQ7Xt*jG3M2o~P0|T(Bd>*d+rJ$Z05(hEw(3=X6skmi1Rh#!B45F8Y#DoKE1*Lpgse zgbR~NLc*NPV}n3KJ|2-L=QQMOGPUt!7S+jqOL}-fb8GBBp%{GJh(1hfhV!#ha^=99 zLWpr97Y!ayd;8tY2I^4zT|*Cpmt%P#2j{vDVel=fWK@Pb|LC4u%xfhDFeL&otY95* zp#zhcpWN=Mk47GHS1aH$uc)iE>&LILB6REe)>Z@5l*8D}(77g-Zq|I#`d#_*E=1nW z+NSRIh#Qk(x27T6-6?)5#ENVd9rPz3izoyFojO)C-4GDp`W6LLLfkVaZhIphyw%#= z>LmQ%ty<*M^HYkCnTTC0-!rbM?GGnh(;q7%a@Dk`CfA4rJQ0aKSb>`vW&sU)CuO1Ba#6#Q0L<}$AM-2(E1|+N4 z!&{S-TP_UXEnp~K58nTjaFW!+Maz!U4!8(m`qdF$$99!Zs=R-sGX@rWfnky#mCE^= z?)r;jkbPYMg#(y?$U@`0=YF+Bj$L4IWJdw=N*;}}_o|e+B28bFON#g^-?7OQU7}&j z8-`uW60H67kuOW)POh_d`856`nw6g6_eoRzp4q*iu;ZX|ryBwD|5GW)7Z&JsBJ};) z9gVgs8HNt!iwAIno&9M1iD^-bXuGUGLpNjfZ(mPlrdz@F zNM-|)zAg55OZ@*3v7uk}knb`(hcz3~?2@IfPKqH6NMga-yg~xpy7$Me))l|l5^8D5T0}bZA-dMIJRrDy&&|vBnAweMPTam;-%=+EKi3QYZYx<} z;Ht(y9l1Z1W1`Zgiq5T)zWV5!*V>z5cQ(L<*2n&7ScQmui2QN2q0wci2#gudB7@`5 z^fItZY8~}5DwUH%kh2Gree|>9m*~(`qS*kcSQ?kK2*G2BW%J3dty4{_vMJlw5qB#( zSP{cPdI9%uWi6NnnSj!pcbX^WwTCQLPzPTpdpqrny0{QENJrQYKsC|UOyAIgcD1up z7!Ha0+|Og~>D>u`-t8(8(KzLUQlc6wl!!m zg1RwuNDfhxf?P<9wlEuK3$l_P_tN!d$6%tSi(?Teg_CO7xZs|*dz?FyXFNGh_G;hB zjs0M{RXJPNlO*-rfH?Y<5i|9c^_G`Z~x+^AocXABZf8=BP9=S)pxxg3EX_=nCGi^8{dwf;t{Ob#< zY^HCOfnM>PI5Ek0-%Yt|Kf8{bELS>TlT5E0ue*X-3&=Veu&!K%8(O7SWii0_~ws4r?F)qLi5ON;71w&77x@liZe3~o_HoiaLwa!;%&N* z1!HvruJ9JMBp%KCn|*4?eAr-pIV2sY0N6zZ5UWR{d0ED;-e$r>BQ#Ph;nmu}ayqyu7^Up{;2S!x4DERfQM7x@4L zicqp%mow$Q7)?~v$<0kT1rTB`Z>d{nY%VhUr7~PvR3wd&NfIk}L7t%pYZhRh!g@yVf`_yzm9n&Exby}RPtbOE5${xxBN#? zCNBU0Gc%>z;zCgw)pxNkDwCORMicLPRs-f75g5;>N>51#bDlazXuYiOj`eqX;AJLg zn$fOH?Rrg9FyS$SFS}$Fml*+G(#Zz<%v0XBWxreq2t#(5S#>^q? zBa(qtIQ%v1LH0XxX>uOjF6&N$H+uDIG#^x+&bEn=NR-e0sA4JG7UQUwo>2uGIc*F8 z0Ughh`fP~kK)Q%c&~w>&YTT4wR+G`s8?WB(y**p1@O^vWruIGZuX%ptN^O4YNoT_J z?k4qKXs11XbrwDF6%sX|zNHG!zAxw&zfuHa7b1EQLTX$c)x_Cz$SgSbG}O zf2gs2bQa{+{QE~jnit>woUE18gB$99Wk^*=#q3tXOOV9irk2Cg{iF4bodcc@+x?&K z*(1LV4DyZD05yy1zO!9Z8=Lv|eKn&cGO3jrtg+=WFJ3TW@pG+K7B^^1lruB2C5qyw ztkOO|YbbA6iIWau`UYZz(U$!A+2eluN!Y~^UzWQGYDh&jsPktQ`zUB}lm)#`hyFp$ zR~f9;2d*b#2*jV*|KHIiES*%1jAg6s5{ ztGWrbRc*MkKa?tH; zjfJ@={%LDVIGt?Y`{nk^np^YCj%2uJTit8v>FYFJnNq0;MSHuccBL$8>H~MWHavRC ztt2zRUQ{Mwo*Gn@_0ztTGIr(R+>}pa!M&uoGHF4|G9eVDQWU;bmM4?QNI2kfFJXAM&z=& z;HxUz-No-^N1yAaTN}S!FUDfk2A!n?YSyBtU|fFmn-z}FphPf1mtj;S=IcT_C)0yk zWkp9rif84sG(uDdO*NZxP8^(U3g!W7eljdW$<-ALM;BR45N??$-sdx*y(1M}F6pwZ zklvQ~f!?n#^SIp5IvLVoYbUHSnYQ&|#eJnU;pAfcPVv2Q5Rg>nZnOAa1f&r#V0SBq z`W5BnMVU|mVR{dKeds^Ao*ehKwZd~)VdT5;V#8#s^8Pwot03*7)64Tv;RWvL#RDgP zgI@6oVVQ?bD7_z2dZ}nYKdfvs3_vdZZb6?&AP7=YdAOl+g2>NQK8_UT@b$sdUybyQ zs^FyB36o=A!o$XZ8hpp`y zJwB@8N0|njhRG=Prn3#9)0xJ+$8)_YZ~pCH3iChh_f`9Qn$Nj?>6ZIQLyG$8ms)zX zgoSTlR|;JtQJes1mpvhR9BI`pt@u(%I4y9i6xtVsB={8;_J zonhz0d!9j9m&LQ?cRJQ5Uxue>YE7A;k9chpHHfV6s1(&;oc+$gNrL}N59Pp<-VHB7 zo_!3Ww`}tU@=Z(2IBP^N9p#g~*%rR!(z+6N>Y*|QS(be=v#gjXP!~Y&%eMn(=iP=P zUlEzA2i{p&0(jFVdqsp90iY*w%{e!e$T5`vYz*iw3u2I(i??mgW1Ykbi7)C~_=GDp zEC{*)&&(SD$oW5qX)%7~mN^`p956@vK7TQln5x|wLE-75@7a8Ud@i;%bAz)Xah0`k z&IBcp>~&lBeX(%F=o5HQqfCMbPq zBou|yw4Pd_78w)^g<)*#f|^ku3j4Ev3W)Fh*9#EaHHWG%rj$1{&~PtgIArNon*trO zJ2|XLLDZ`XkMBlO&5b1&sEs-OKH<@eU$Qyt{ToKX1)Md~FhNuT16%b$iRK{>h=EvCgo|Lo^8{VT zTUH<-gN5g1_Ha!uH$Y{7rYjbMp`|A}J#KQ~D&hL|EtLrKQ@3+?f7i*z*jP~!nGu7J zL9WIbXOAt4i|1GzHrE@?sPA@jUe%o9@y#s?45JfLbS3ms30b%I7ZWNpUzVbSZnOS~ zD*tZg$)T`+v@aC;*R57EzEaGmKg4ELF0)(IptqUC%C%UfpeRp{;U(TV>l_)mC?~^7 z0za8eFz%~Sr?O3Wt3zajH;jV~Y}`D}Z9E=SCd6eppd@?V{?-RMS#u}hcfRtdAARC! zzpk=BiB=kEd1ZYy(<*9db<`p!Y@_Abrpb}fHK)FGC{uy@NrvyEql(8Q-~6dVTF>sw z@YUznP883Ug-&*Q=rh`x<9_kSy9Qn7g%I6_tmzyD)Tu{*Hczv%eA{-H+D``aADwm$ zw(YF0-8(y+y0NMDyUe8IeqMCO^uJ^P1}=;x>a^RR>x4S)(=vn(7Y0fFOti@3kyrWc zyL;@9&)9wLQPmF?t_h?{FP<}`{nD1;k(PW7aHx2)<%J`pp+?1Q%v_83|dihxU>8UQ|F&;NNCi$leT2%ig2?ZV)2<~^V9#^_L z6q-u9<9kD9U&{mx)!_A!NqUajv-?nRX)z)N`191%GK1arkDg@r13lw_##BG|sG_H_Jd7vtQ>5hxRIXYo&bC=7@eTvswpKTt# zGraGOArjasgn3uZmi$3rMZ3j#z)_V}A?9vl+tp5osXc`dI-0y45Ko}M_^Rh8pZ>7C zlcNzp!&@O?Km5z zJTJ_g4!l$#+}tc*yZa(G4US@srI4p`9wt4|r4gV7iRLVA=`ri0Mm<~a(?XpPVdl2JT*xpAp3|d)|8AxaAThU7`+6!%Yo^Ahv6an9yf0y zetB*QAjk+Oj)8RER7ztGkee!Q=_jAR8qFH98r{*+;}OieuO4xKaxf)g`G805=pd{8 zc;Q54bE>-jJwJYx9>$Iso&8HSpLx3O#*3v&mIZSk2^}wsKR)isKNdQjC{^FRr6#Eu z+{!)^x!SLOcFNwqCtfNPvAYwyL=HVkdL5S4_w&`G`O>3o!Dn&?B|r>sIY0WvoT18N&<#i ziG+vQOU0JRPo3yegjo&!RcpK^H+Q)1W~a>Z_rP^mSm*bD-&hC#EYYQnnbwzW9)EU+ zbZpkPGzKZ*p~g|wqpZRpksU2Ht0z=#o3|mG1E(lsoU1-<<#&&e`mcT8_TACoR`iVt zfvN%aql$?}-|3d1;O$>tayy+I8$M!KESK)PH+Wys+#*>XXMDWha7hVb$4&T2L$?Q z(9elZ;H{PcBb^ac5>bk;Gphk|OT4)Grr%hQFbiTdtogR*(CAYqSY`bdyqk)f*+2O# z^np%M^~N#gm-dQ)&I>yd%35^Nsf5-x-|}tQlpyOm^eyT>BmUZ2HFOop2OZrt`ajyD+ShVhd=zY+X!9unms_qlw?ah$ES->ot6Cu=QpNtI9l zTfM_OvtchP4~Uk|6QlihKn_FQ(E{3NUVQx!^Y?UOrQ)%U1reC@h+2Grj? zbmu@(n z#_%kLClEoCtdKXon!Yikem3rVqTqk}gFY!!Kb_-2#Y?{?2fz_~%{Ct%Hcw`mnHi&D zWd|yD4aEzAINmUqmP@bY*_tB44r!G(2&s$_|Auji006#fP2IgQuP{l=6a;Q-nM2}ZOmql2vFD#N9 zgHMzo#-pIlQ%O9}NFH{h^*AxXCsEqS;-jVifP?+QS|$REuh|(>GgxyXdBfZ^!9Vux zEkqDoUt)LvPhk(3=jlGOuIReQ|LjaBK?n;=Ie{_s*64lw7+^$|K|&KuxIX< zJj0I``zP*~YDsF_7&IfTE)=jrv30iFxqL4ER?t6WDAr4Ehc$<(?FY zD1l!`us@jncaHE8vi8uZ>B*~g13}mv8yoQ>*BDFi*xDh1$g9iCU0EM=C;-$=#CCV4 zt4wxgH&<@piTEvf0RRYiA&qhi31tv|3i@%|rm0dIFzl3s7lx@En+X6YQ(Bf9;J2{hL6 zbZ|sw#xct#n`5sK;z*LC%p}LEgE$G{ckb`wzJLFpzs~2quGe+Fo-YcKYj#}-N^`*y z4f&Ldjpxz>v>Tbfg;m3JE{woq07SlMEawww2LjUI$b+_U+Qqz@Tlh$ud-U4flgXnM zt&6SYe)Rn%=O?~b-sm5$7E){Qbe`AgGuFyz)gjo;08Mc>+HSC-0}}%~LbRViGo&)J zzjNMi7WT93lI%K^X#feJNwKU6RYGejd6?&1Wb|7n-&ojI-FoP#r!5n)yk%W^e3dk_t?*VQgyk%tLe?~w?qA!F~;4$ zwIcs)x^|y`o!^OAo%cEaHtAKk6S0oxVgp~V;yYL@>V7>$BZw2w}p%%;po}Lz-4sVYOn(dU#&=X1X zMaNgo<1)el&;6Kl!X=mFQe}-3TjK*mzyy$3 znl{E%3xML{zRP~-;t^%ladX1Xjnoa$*K(}NWQnq_vp%6)pyElP%%AKA3&Ttmt3a`4)cpL@}P>(C&EPQQ--dPt@#{eu+Wb7Y=kr?v4_=Cd!Gj z%L_gKg3tf_c|US^esX?94DLN72lukSRV)nslUO0T8T%+3WfmiRfhhy@90{!wqAF$a zw9wbO0L<%~7ZOvor^|t^-E;)}Yu(J!@$bAeRni%FVwvgU$P=yNx}C0Gc2t3=Ji|fn z_OBl;KO|w|@5#>L+oUQ`0$>UcXAcg3bk^a%?E_CKwiM{e;NLd?Z-I3vwc}ZPHoDwP zKdR=}N82y79FB@W?Z%i{2O;977rDWUe2`}!34$=eEhQO)7geV6-b6v4lSn(`3mgy*S~_LxyL26C4Y{G7 zKsqijE5KXB1nBxUF)(f0w;g-;21-jS*j|1nM_Ir4B?7j9-~0|CVW^&uue3~@B-Pou z&meIyA0MxhEVPC*5cVV8N{o2*9zcZcFtiX74fZ$kuA9B(&_s!MizDCNwvHeH3F%ak zg75Q!;ad|dCv)@1Kv8)N17yu~%QTxvh4+#|iE}#0FTX;*RC;*b5scY$ZfnM(q1?_W zaeWSOEj>f|%rE9@dNLr@U)t6OVBn=C2}@L|x;1l$9F#Y`U(_S7rgS)`Wq}3r30iyN z@5O8=o|+wP&TTzoI0QA09}Nd(gQ=dyY8y{xbQ!^MqJ=5Gq2X`w_?d5=$+PQU7<;5k zVs49i)LPHnrKJr(jx)Y_or_nn@kO_Hb#cf-YoqE2dOT?FC1TMvJDEixp<-VpOPfpC zJ*~W|Jf`sNV>n~{YqW~xHp;RIrOx|7;q-lbQFfJAsib~|xfwatDmB;oImp5bXs%XV ztzbs?h2_@Pb6AUud$L}>uwbz?Wy0q)K2ecc?RaaP59}8m1@M~QUX09d;I%~Dg&n;Q z?mZ#r`Ro*idxwz3o#;VO8kqCLm86alo;dG~+mftVThTySqms;YzaV-^({6_0(84CY z?CI73KxX!z03G6ZB$U7r?}z8-bvH%OXfGyPgiiTdff z`BoKy)_*Vcmb^C~?=C56;JL4)cK&HxruVl8!tKka%N+V+;OheAvwcTi0u>L`YXzvV2VPFFJ`({~FW5)OFYG8OWi~vny&R(m)SOlBFsj zd(8HwR^jg*c>q-LWIiBJ=IL>Xc{;FNyxmM*2l8V;JPnGjvOxOZP}I^wcS;tsxele9 z-5${XaXq*~biQ|d!zA0v#&chFXT;j37Qdr-ig@|D4O^`uGrod=eJkHlGxYSj5qo7N z@G~udZm84fz^#7kd_VKBe&WG#4=3fY^V8A^@hJP|z5mG?eU?kJ)>oIDW^4wR1l|p3 zeEKEeaA}!xePf-yCfFY9$rk#)X|rqby{~$J^0;Hvg=9tV#mjLM2o{5a3jK)(p7OQI zd%q$KlxpKXVl8JAn8&Y6GkD1=nml@86q4=V;z5>#4YB;FG|61h%#2m0&cy+E@X}~7 zKP=tU!-F3R6MGEtaP?0Al>4r%db}y1Y?XlH70L=#n06a8bbpcRM4y6s<6o3|xjkMN z19AMoDAa#-AfdA6mLDA)3U?)X)Z(cIJ^x!M2h_tK&io!@p5?g9P;fLB3*xA~m+b4C zSbY&5IM_ebFy{|ke8y`go-Y#LfOTc^mn1J;2QryXmwVq(&6ImgFK^a7XALOL2fZiE z5Ef#2!F+@P+XAeL`24T(Dyx}fctuiT+?Bkdm*lS_g%Ks;r*+mX^jqn4(Zs-Sa~|BA zii5Si;U@*bQI zzNT_;?Sy{;3t`FxAd7O4+V&=XgvdU77B2+hY`;k(XFofX7YaqlLTb6g;d%q$c2uge zTzebI`!(aJfza~@?HoO17CKs+im01_vXGUX{@7WNsnv4|-Nv zO^+PNGi?=DYwye%*1w4Iv&-1F*y;Tuu9)2NppiWqr++d!BD* zY+SNlUzvM&|BxK9&fa&t6LoUf`8tX$BonnlWgAY|hlK^*ymQnTX|_1J%2aIaNv@CF z%9uBfB6UvPbrTdYS;k2pu5#H{kbr;xy%9K~oF5BZf3AFhFwSXbQB$#_wq?naOBC*^ zj>={-TgcTlu2YA+xh2C_d$wMC%!hYCU#MoKMZ|)#y@|5xK?z6(etzYJV7hiviiy8gH{2Y z#rFqSqno57)f*dFn4zir(o9165=lL~d666tZtB|w_> z3)VCbuah^Y2$qh3_(6*|7B)e_L)#LR_)AkWZ6kB4{Z7BapZR&k zxB}UcRLZ7wL0GFI0+$q)_!qeGZx( zx#CNX&OgV94L9-*>=9Wzuok1GpZDWcw>Ai_57a67#hilh^68t! zN-YM}28h#{crZW=O@okJm`K2(A%eo(=_ptZ$6B(=!^*(U&WL^yM!6Vfoe?g)bQn&} zZxbW$N0UB&dgj4reA4@aTEGHWu}!?~rB;C^w#@U_xp0_{35))l&^CaP%+tL@g;N(WcZz8-svTef%{msP21?K1- z@BTodS{7OXH+(4!zT6HH;>Z!sia{ktPv))ssPOssbNO_by4n|K{l|*Vzh|rO9Zg1T zyssE$a|M=ha*Wz(MM0V93aOOR3y4vYJ-&TE6rEmd_n3?1De?)rld_OQ&ISnED z!}oAb;&Rp}R%OvFyYztfhIQ7S4r5b-7DGt$ANKgnsFF&S1+vXi% zOYz2yBulm3ot`@)rTM=f`oCd)pO2kAmQUKwku$?Wfp2Q>$kXoT-rwQI%YIV%91noG zqVe~bg|ueXoLsd&C}-#U*=0MY)l^xT1uBAc;iwb`SHU=tmSMtdED^4SzGIs6jF$%C z0ONpJ+H_e9mDcUR7Opw#7nG)#DimbDbFir70&kUjZ}omIuj8Hl)~myhX;IMynds$M znRx*C`jL4r!@jdIDg$*=;QWm(l`qUsULL>9>O?q%{ax&u?_7Wy-dYaU=ims17fUks z+xEaAZ`0|%N`};|s$Lx)oT*`Ou;HY=la~fmfzjo}hgLqTPdwOWv2VKj&^qPCN5%w@ z@Dq+8v%uhHN~|HOark-ctyf)6P+3lGG;J}6@rmmPIE&j-`5KyAjXfVxtjQA>ZfhMv zN~cnSIQ_?%f72)hETZ3Hs)+hGf^mMNmzJKN16zCyb8-aNhSI;CyX@Eo3BPZW?+IL- zCoG)iV+oZtHPtnejnQ$hq;E@U!a&bqd3^4r(VxM8+4xdZkjZ}$5daUkCao#vV`nst zjaH&0(@*lli}Lc{A1qMA`+B4=TRNM|y}$Q{VQZ}VH+ytHWAHajM@N^}$)WZ3xgfae z<^AQOzh@;rFED+_73T->RCknv<>Oy_GUqNDMI|;dwgN><=kYs>r>A|{`>H(3X#nxJ zLNGqqOR9nP6OVXw4&FRYuR`J2HxG#6#e-F>+)8=4o>8V1mrv}^fBgG;YsT8s1!H`E z)Q1*$rTI!&c+>HNetrJ1^yCm>@Ex}C3@(QGaL%eGshU6Gu=21?{alhG4;4fXAr95-qVFbF zS7w=3Fs7IxvN~+cVjozWj16Bt>7qHgB(xAYoVd07hhnOotxDj+-w>?G)m)16YdK zM*xn}q@&rQh^Fj{Fah2t-Cgy89S>&F(07hgC+&5!t9#dt#~1h7^NsFqHFQMy;TH6<~n;mh6gS z42POUdi#5mcxW3VT#*NA77yn zgI=QgbXE$;Ob&KX z7)Bn-{+wtPk?DqU7N5ctd0)s=Vj`T`Y1Ebkan)1$2-FK&RF8R^$U8Kx}h zfD+vVr?gTNu=sli4dWJQXj75Qy7%YP$b^VY!JU(!e^HDMUaEfHTy@|wa*p+v_ z9AnH!rf#pv%^iP#x7lEb_h{S3*Rr$M3lwU2M*fQY)f-Lc;r$fSf-n#CZv^&&KH)wbppf{=cmd)uS zb}Qdf@20oZMMMJlHBx7pm_#3-o#Iqbdhf0kTfFCTVH;&`zSRzpK$QofpfAeh61kx6?cYS**xx54?0#vf70^b&0#Yt6+yWNzebz2}wYaU(I9eKK`akO(jUt|-tvV3}6f3{Zi zZzpO`<6LGwucH3xzrD%xV-4%G0-vc(^8ERx%pLpl-O01Ob7>eg|3H?DZG6hE`-cka z4+FYFnc4UX^?wxm)7}5T1XAyobMF0HqMjb_>?;ML7UUQ=&wL~7+Pt;_mRyXtrSKkt zbQm>N8nm(n^Psym*T&Jrvk&oIgR&>@YEx=)D%ukJ5lUbH&;i!$R^{nw)8^PpSqi%a zmvXV4O$s^sPJYI|6h+zUS-acY;td^`{BV8d((FWV5Msx5%=^vOi!1-xr+YIi*QnjU z%!xj8gY)!DA1)Q0;#T+f#v;P$)iqc_1Tn3F5EUtb$iJG~U&H=DRy*-TxpWR3uiWF1 z?bXg!IrmJtJJY*U;VIZwJe&!}RR^zd|HG5^=O=QJz=soc#ED#z(#EDHysSh#L%^nY zlg!b8h7eCDw%rajC?`TQhHBCmWMX2@G+%i7PL1{%z^aUxyRza<##|SFgbD)yM7h2X zm}*OL!Y-yR)ZW;AWvJ;~TtzG%BN)C+E1?iiy40ZDj#30eI@8x4;;=@WE}TD_gBAuf zEPJT4`ZQHdmWsoW<*3QyvT))4YJt-EVmJHjI+jfAq7`Jc=?AgX=oD*&b0^JKSVC&E<8>gtV*KM=GgfDtov!lF%DvPCRN+S=%9>47Azz(#byq8OS>C$v!Nf5{q31$MW;@0GCI9{rtQ@9RAc z?|pH?-Y5I?U`mPLskBhA6|5df5jc;Zj(E(%&u_#lJ~F*H8FgRd@36eqzAV#I>ZZ~C zTg$Gnlf}QOhmlz>@rjaO?z5i&0o(<+M;A}j;(^!vEaT#FtV3K{f~H!U&H!NXD4(lM zyzIRnYYhuh2EyWc-=YDAELh+Mj^FOK=1^eIb8ZwCL{OC+-weoKFCGB!;&^vE48#GX zb=+l;hUUfnD9$tLQF4%Swvm!Nvg-41*eBv(N_U69FR*g)KeybAEB1GKKUtq9c3*4g zTTOIr)foRV|G8DBPyj=RVG)=Q`VS{>emN}UfdGF!yYcL4DTO%gSA7BcVVzmNcK#0s z`?#s5Z?H@7;rQC8iL0;kjjVsX^BZe?5oE#K-pa3IW^1>=kQm$bXonTSxS}*EMnl*p zvP35`y%G*nLL&CPkEN<>=EB;hCJeDvpehijr4qVB2*!NJUyYAV{qaHJ{4nadTv)I_ z)S0{1U#g5a2VA5V4e^}sm@G50w!~L138W11kr^Fae{}|4k(4CBpTkB8sOP1oOtQ2= z0pP^=1}RLX@(mf$O)m zx6DC1t%38znF;V~zVTv8W#&7yxvI-wIOXp8Ak|lKt@Q7u^WW!@>KfMvYwhc1_amyu z3wk3D(jTOBzSu5Pvl7KFK8DhyW=dS-afIj#5^C`CJPLB033N{;KeZ}EScX8+pk}eg zgDH+?LrxACB&t(4=NW@2?YFb4dlms$LbT&1npnJQIpH^P@856gGg5B*)Dd{FA1DlQ zgaO7-XvX(eOHrY1d|81*k5Y^mbm9#&oeE?~MXDN#J8x2|@sf$H)p-xX#$gc^(iA{Ic-W(yr1&e5l#{;oZT7 zxEFAwj`w!wS4))r>B30g*;G`mnYh`D-6Sqpl3~iBU3Yg^-xZM0F-1l|qvu#D#VBtI zFay)Wm~RKrxOwd^p0-6%1oVsPWye>2cOL5ld6H#!Rm1fEeULf-bXuR4fbX)^r4sQ^ zzw7q>WuD*1vv+Z*&xf#OTaQr{mb2sf^bt}T@8+gW%G%#Ene#_x1^gGL3U=6|cKZHK z_FX-DKe#>9r3sTq@P5kuN`<5mXwg_M9A`JXE-z!=p;t?-PsY|J;@WFi^p$4*ax3r& z_0xFt6seK5*>_|Txq(~TxoKth_BU!-n^z(wW3}tH1IM^rARxDK|GemEP~+d=^4YKDv!3OX9_ql_GFMu##eq!L*QjpYkpFBz>OJ-s zX765mR{v>bhm6?Jy^&UAp)Oz&k6CCQ0f0FHIj^euvX3HuWv{PK@yTJTu;w%SN5?H{ zMQjFAu{qjYX_MKcBVVs=^^bPj0jl{Qwmbij2jdvzBu(uuKDC>54FZqpyXVeMO}xm_ zLs6qnx|G5&;UOZfaiT)pS;V;p6Lxu;I0iT<(SYhUAbUUh#+&9%B4a8g%DCVMyDJI{ zRPZ(}45s>6AdpRQPJ@FEpQSIna55ZTK6m}jK)08TxJzz%#rpbor-#Ws-V)9y5Z0K{ z79zOAEpVHhM&fZ?G|?_2S8cB-5NZ^!*Aq%^_`k76waAso0bS8JpIRU^5l(}!^5L$- z1Ezg-Nw63IEIoBVZj#vms6oG)xLRW`8PANxwM@=85R}Pj=Tk#d+ z`{Rd8d8Aw^UYFXKkIk8&t}0GV)EDy;e;*R7+`_*w zanx8#?WIXeNHLeG5z4u+Twm4C3xq*`)gfOAN^nSX)db}b%o9K0`AHoiMhO*73)H%& z<;UDHB_h9kbtQz0yL5d-G>6pj@>C)kTTO$>rp%rEpAXP z`1_(z+s&j&8-?KUUlEFO{U8Zd_-q)apX1{8^=EH)cQc#1B6^lon{_JBPKz>3bE@kon<5;!O#i_UivYYE^ z*bIuAB!qYrJwUZcI+A~+k-R+h%oEZPKuI-dSr#fl&lP4u=kS9LT5Kxe$~5(w$k%FJ zj`Ly-&ZMp66rfVw#rEBvvOHT!RtURAH=|W_Wx60a{*Y{cSE)UAzO^pw85zC5Zw6@Ep5W?;Il7Z_Li zvtS6@(KYug>JK>3Lf9F-aF~%QcGY?(Edg6>aRHZOW&WHlO-O#4{FD6^1_uI+l@74b z(F@gb+)XQVdQhahe`w#^8Ab7^ncWZT9S?V=F&;$*`;-W2JKy+q0>2W_pA^36%= zq)_FnDdVPi5IGzdP7frl7w9+Yw!U3oxqReZ=eEAsyJvjnvEO!Sf(l%8uj=`~_no5m zzb{9OAGdaXF86JSwgtQC4%IS5KDyMN%E$`{2dKelocY-N3)nRN{c!Y}w0c4vjDikqhI}5tb8~NoXN1xS#!|+QJT5)2zOWlFQ`TLPG*rD4*h6MJXt%2`iaZt^w)104`bu$7px|(a)UdQOrZ-{ZifrQxEdlKQu{ zN8aA)Gld{g+|Iy$;ygXCHm4x4@*ej)L(%T?G*M^Eous?#33`%$3K-h|kZ=#U1r3p+ z*EJc~gbOcbDF1w2yFNKLc+`e4bpsCT~vT(#Fqa6h2UT>N%NY+FE0 zr)Hm>jHI>e+X=oWxy;ofoD&rsbn}-X^K(H3oqVJ!!ldz~1Ecp$*4VdGlDy(Ltq`aK zeRU-lU~V2RF+GIJ(c3^JZ<4{hE3FhdXC%O|f30EY`hOX>_WJ{QSoQHJC|O1Tt@CK+JJKC0xdB}nTB=un>$#@rB@`&8z zzcpsj{$-=b249v5MSe@Qg>7v3{}U6QtiE|~jJ_8y^JV<)C2twKo-oR_zTemORnPx} zP7LllS)@*?-PGu%{U^J-cIACrkRA@=!%mg|39zrulpam45*O;P{fIM(N* zi%J%jA^Rym<8P0d27~eVX#ba+&l%lz zWOUG{>vZTLstdu{HQf|M-#NlFDAfdKdgW*ekPtO_1($sVy;B@7cLy(VY5N;f8F%fN z_S^=oP$oUetSc^5NBu!z+teGe3#GajA>4F^?4GyoGF_v#>)a-?>Sv>sK|+3j@5N>7 zZndwKU5N>aVlW^FSnyXBGYH#%aAo zF0Q_=LKn>({$uyc96b)#@Y$W}xU8+erbErCyzQ8&7m#QOx&=r;VjRXA2+msIAQw3D zxr=l(Dv5EE-y%`^i&~Qx`K=y-Fp6SH0EpGlh&z7c-N2;*WK}8}#Hh>-Va~>n^Y=Ti zsiQ!LD*81vo&Ie%RgpJb1H#X7S776|9Tifz7cRP!$GSQ4k zWbzNeHh>^$qNty<=}Fix!BX-d_JfIp!&plB zr~f^rB&n+R8QJLj;&Qlh0q#F*{_MlfzYja-XFF8T*C}y_N((uwaiiSnNPVV#LLi5oUSE303jlq{`{`Co;m9<(B0en7A`g?jS~S> z6I5+g=V*d5`J0rXlAx~7sc3(0Hu>=R($v%yYS~_~q@Z}o6?`W?aDJG`gVYvv_222q z9yA@}LQif}Cbkv(hqT>i4SCU{L*Gbgy#g9$5DC+n4Ar-^@{A4=VNt4>Ea|oH?D3&z z$Fp`#zUdnx zn_2R@jVBpVkZd6Wp_X^65gnF_9bL^Ur=0~Z{4Q2$_n(y|aKmb9eSBCmzyV>-Z5L#KNM2$#A{bRwnyb zgdloauJ7>o1=rRTgolmuCcxlpdMU-?sh-nz}J7f_3+CrxX?r(_xFP@7yMAp zaesLh?Z1#6Vmcf`eWQabemQ#4gZ7ca0PF%GcO8_&3@Rn*8NftXgp5O%AQO zLs~2jdcnP~!i&hMiSewu&CFRA-u{TL0UqOmm4MdTY^Mpzfz8G}mRe^PXd8%()DYJ+ zn!B9x03jg=K$QjzjK(n=JOMLrJmU~?y))#vQHKq#m~JvG+ak_3dKvl#KghwNEL&>S zmQ;JhD9@&Qy5hUK)=p`9fMd?&Nc-?jMhx!Ej6f~mn( z04*@*f~Fjj2iGc#?vF(b&glS>K;5DxeFbZdbDS5d!KPY>RzBlx9D{O*R#I!Ul_uO# zNmPq;zrOE(&FMQ8P9tAt$JDu}j-~u$y&f zkeZs4Jw6lni}Z5*dQtMo;FDa^fX@q&6`!r$(?`d7=R-1{lp+}AxXxvhdH+ZwY-=RQ z^1qGM7k%&UTfaFk=zU^;+xvuJpzOaNeg1Z&}O|_i$uHnY%iO|ux)h~ zwsB`5WON{_j!?!8)hV@R%7Vdb@!s@?G02tiQW>N8_}1?mNkH|-?Jmx)xXccvVp^W{ z?d?vx`uPpuT?65Zf{#Jo$&l0)+!qxnM4mG~{?+F}_Z@;c1h8A!a79h{8<``S4G4nQ zkUa%jKR+K3(g9yEn{+E#<%#X6HnhHN;#tyVf`*DG+O&6s!?Z#~2ED7_z0@}Z#VW~3 z4!7dbs>Ia@OLDnO&x6@<;m3yx4Dml#4AiP$t_S*WyT+gpch;A@Y=g(wrWb8dIlO={ zq=+)o(m@1(q8A}oVXCcTF;5Q!Q=2PMUpix1MLPR#-Z9YpFrw&FxTMVBcKq+sx7_tO4o%%JPz`j4Vs_>a7e?-Y}$xkSMY|3u|Y)@Ax|_K zU%8-IZd+zu0)>UPyP^cs#wx$eiCG)Rn+4q$&1}lM)Z~U+_wt;j(BRW|kN&m4-hT4O za8fL`jkpwX+*#Qhwzm}2Q)9f|=ta~KVH$t%Mw`ynWN}?H-F-O?s9E?N@4b!3Hf0eG z+LFU?sYs~AzN5J0W;Czb&)>T$f?2C9Ag6hr-<1PHxX`D)dg3Ep8Cfv^tsHWZn(7Dq z(p7dxO}+RvI&w<(td@1490To_5}soo$7DeE_zh5W|dQ;MK*5>bk}z^L0#0( zjFq0Qsd8!Pc&6KaZCg%i(W~XHBntq|Kefng>Ud8|k`HpiU4#Xjgg7`07Pb(|E{}UF z>!-q@qo9Rw(V^9DE;w7x^AFY@4>famAC>D{zL9vv1kus~!xFu{z68!&?+nHr4GykO zPd9gUq&S`;vQJJ1_mn1@)4RLw!aiNHSz0!l?+*XHJWzJBEN35P61DF6uPS2YzdOkI zI#utATs^;1H2e8HXp;fR8**4XTr)Oqx?{vZr)1xTXHDb1JHNZ)$d7fSIs?7t2`S&6 z^gIxP$q!tWPZ@uh#GlM-u@Rzjbzse}_h3ni`=ORfTNVHw5v)XXzwA1{F;8@0F>auS zD#N;NzIx%97MP0{gO z{-&UqEKCOm;!K0faR_Q#qu?g6A-jzD1?$z(GUAvixQkWb!vGdJHaNVxT7oA#f#hW& zX<0D|HapwIyRkX5OWGFZ&k!^?ap*+tp={WsT5gSbuusng4v@flStUp?H?Ixq`h9RQ zEl$^yHbxG^2r8_foQ|l+Z-+RHQ|T=YkYEb(K`^W?73(O{G@)MW+?MHU*@c zEY#q=Cf~}*`d#}Dh1>f!32H+@ybn4P_QnEeaN z0~ZNGX|xeJLTT6s^^bz>NnugJhg+wI$?^Iw#-@LxR?5x)Td-WQm-4ngtw`+K^ytpB z`z65-F<6^^!tdlvvQt&%V=MN*64}vOu|A__y_3C7i4eEh{x;Rxo4v`22CiFQ8P1ZX z#s^tu<+^uKEIn@kfkQ&T^ic7@td6|R&SAu%9?+m7KvRkgt=kBo&*rYt$RI0T75mH) zDbg*KL4(c{L{}?0JF6&XAMzLCcB`EbEy6&mj2i`|apiKkG`zy1%qaTm z5f|W=mY~Q(62zMq_S5Hd_wd6n40bA<<047ztv7pHq9bYuu(DEntAIz(TpyK+;|1UM zA2rYHp?#+Y``+XwVeOHi$9~DxnPdu*8}{`Vh=b9IjY2x&CE-7OuaNb5KtcmT3pE|$ zG0EI3;Ww3lTqasf{wN1%k|9f&%_|)mB-(emnOjgOqP|WDhG+z{r!;!;F@kDPVg$Dp zhzVxhw7+;{SKW_ENA+`9^*-O%qQbh#$r01)t-^0#MjW{B{hC}4+#aGqHbnJ8fJh7S z&W`=U@^V4)w0Ta{XVO{y-8Dt(f&SlSpvRNxEsYERJiTRu-8Jbrw@&KqtcSK0Q(OlL z!8c6HV@q>akN*7&P>c7%^hyRwT=?eIg0F<4yJU+wjFNN!{Haz}BKJfYm`jyDyF0L< zy@_4+bFCC3!2b0KiPhf`i%FQA4kR~3IyQ$lEn%U@N9_|WO+q^K6QdZ-fDr7{^x~nb z9~}mz7vK-j9fBJcqnKbmtQ=@PORQVbdlou45+;_!!pFj>|3i-!29|TOy`P+_@;kDa%-^$&^aOsb=&&+msgTUUK(7S1~{*Tx)o zhSAG0Ueo)+Ls}e61)?qJd_8_OQgl!feo?`u7vXcQ^Z)`D%sco(7eh${8e($v-Vam{ zC6P<;f)<`Lrp^I2GS_Ih*9M;JPa0>ls4iTcc!h@`-(H7Qk1eiPx;^|nb@Fvmc^_{- zzk0mY!*16b;)7ztI()aTSi___M)ugvZ)EW%3BIJIMdpwVq^1{yBuhTXbJWd_TUarj zeq&gU3XAx=>nR`^%zRPMQOa-cOm%qXYMJEz^<$pet7UvUD2u!o>lE0SRxTD0qROxO zu%-2LN0xZlC5*m7T;7qKlva)_ixr;8d&?Xv+x#5M1$%Gkf2FqTCS+oqI)U)0=;?7p zB)5s{@C%eSs*Zhq^g;3n-m56$&sU-is`ydRb|XDn_-B`b83AeN1Q&!9Os*5d#n;Xq zcNXouzRusQUq85M{z8`ID6o{%{km(jT(J1l!+s;qpS_^VZo6pu%LgKDF;Pk1YF~t0 z+Wj=GEu{H6p;Yr-_hRivtZb0eQbErj)g%+jO;rXNkJ^HQOVh6cMuJE79P6}eFW(Tc z@UOA@e0Zojc{om}y}_cYwc?-VV)gm)yn<1>fBE1}J>0*@Uk(h!T&6?F)5>;MQ8qSY zANS#0NYhPoJR8G$3Cf9RT(y_atk}M}al+S}=28Mxp)Q0=1u7RzR!mnBpQFhuY~VKHg5k>8ul%1Oz zd%L{LNBi%EH>Z`#p+xJfGE%KU1t7%I0Ln_CAf!lLx>y+_6qIoH@afOmwx`wf01*`CR>n<^*jQd>W==stfHsPb z%2;oICwssYdGM8AZ9o3xkBKESgNoMM0YRDtlV@Lqt^*=i08s9Abcr#4KNh1*$1=be ztpre2XB%SXy!oa&0U`gih6e^i_yY*a%!xm)8*0Se3PsV$i)KxA#Wy1Qr#3&Zy;h(_ z=U8I=nY4Akgy(q-Nx}_FU4OjgN@(DCCXw@%CmJv!!T7#`7Zj0y51G~?k_J84tunjw zr1R!)2uw$O{p%tj+z_22d+;>r!8NdQ|CHqlXw>;NIT?g{3D09i`LR=ZY)srG%8!dw zhWV!HnP4$h{9DPfUvsdQa2I`XNE%KDgAjJr6rls@YUyyff>IErgAeSls`dkup&d{f z2<#Och23j3xka1~4U%63G13quRda;(ISjr2@?2+{1_x(CS6nXrSZ7l$(QaNq0 zZY8|0XaP{jY`TYCR^Zc)#kpGGP$T9gCMT7%B6mL>E{aN0A}NNo$u7v7a5#e#2Jjq6 zfZcp6MGf>!e?kb#xQcl_c7d~z2Ho+7!{MR&tai@fp(0RaM%XmhDQQagiWbfU>yW#d zADQ!Bs8LTM)*!moN9C~&7;cbmx@|k5*d{xy(1`;ALeRO@KzUIh48^raGb(;(Mm=5^ z`d#*s_lS?Q!)@h?gTK44sv&69OH043e6jaDPIC_Qf|^>$00tH)lFC8Y^}UfNv^J1# ziHYIh1b)en$uY3KEuMY>Xz6VAVZ13TY=IT}tws9Z+9j5dE-(L`I)#&lL>W9eeEBfT z59dmjJqBP+x7=+FK8RoKBNVwd?mRsGztz0Zv46T!H*V$Jc(K^T+a^%-5Z$ zTW&R}zkC3HpMP>fIbONN{e9Z+xN;_;VvBODE{GV1SL9BnFisS+-{nNd2WFP_E_tKO zv;F23y(W$k7S8}?hzo~Q>W|l!+Z}+C3-|Yagb-G^LRKhw-5bQN%LLdRy!3DPwU8V| z`65JoBh^Sj#0Gm|Bj7NH6B09cm(?-%0-bC{zUdF8-x&!sTBnv=Xjr;Q@eMl3GQRH$ z4)m*=0Zj@^y`kZ~s-I0+RV9-b4sX%roaA4o!cz3D;8tHgx~rspGQB2y0YFcYwOd*S zb-biWB1oFUskwzDZBsgjkYxo72tVzjR%ATeT9vF-^EBe`sfJk5QxpFCOdn-!d{i#d zl;{0;kUcgq--?$t3>3Jv9x#h=G9n~lbuGi}BrMVf+D_+2vYI88FTHnEu24Pse>}Z+ zAe(>p|DO=VPViRLNFr2Plu|_1jJ;}A?M+d8?;s^qt*Wi6wKZrf)ShqDtSVYtRZ`Td zTD5+;f1mGt|LH&1mFv9Dd7bk-&xg!FXsGQCp?SxSCa+fF+dCVU)g}!Ssbx9V$w(Dp z@Gdxj4uC`|yIvQ%>F!7T1Yx6fMJW8Ho+lUDk0t4j0wlr`vt7* z3+!*}(@jTo#dXDQQjRu(4*v4Y$;tiK>%8rEDX5#s;3`op%d)&iL`-od3kkS91gRjF z?+XE2{vHH-Y9*<|UHeRfSfR0CS|r^cz>`&KOOLyC6#+KvlWpF4C;lzDV|-1U2Qq)b z6~35KNezLb^&?WT=!HPBfOLNRo0GUV~A4Z0UhSv&Eb6tB4(zP z#g%qHQaN(}M=3P=;ulxlx6|C2xvk*M*A#CYdGb~`A#ZpU zEtDBy^uNG}TCJVxtc%RoOEa8{(Tn8+DE(Vc*Ol=Xqld1z9ja3bBEBe(8{>wE-ukCv z_SDNN=X_6rOY+*7MY4NDw(mL~+Q36?K0f6*#pt zHi`nU9qSe)QhZXM%r_Q{qp+&h80<%g#sefM4XrKj zmuaf}JIul#roWH3^89J<7k7 z#anyLh<#C`F2b3J-KJWWIMfs-;U5wN{-#^}cpYW+Q<{mxnN2*a4;pKulQ~p4;iq3= zeH~yRr95Pj{08y4v0V$5HlF7brKhTc+^MT8r=^?$Fkbm0C~pr~GIxFOnHrYJ(LVZi zN0th;zTzL8085jUq|#&WZ~h@eu#hwP85wmBGb~n8EG{YVEYu~|uY?yYJR)T&^q5Wv z3jRat`GrwNB9|w;tyGw_DMXsN)7#G*L_Mpnf=Gp)gq;1ylsU{Pud5=dfiKuZQ=+Hs z4Ry)7!Wm%we@2?b}Dm8q+N=*-vur%SIeeRa3-U6ROJ7FG8s zMW}ekcnpNaZ5s0dA%l0}E-TMU+5Mj9V_pb|b9_1?vG_DG3qJA?5S$14eXs)El6u=B zWsG2ee70r|KnZpFI=v95e%x$^Mz4D2uM{@~I8K;bt z?*y<)4@r-f-w=`qHHI;nvxF?`id+27I40Ok0D09)oNqQ``i#P_X>jt$%r2T_76xeN zCAk$VE{uGhurbKRK8P<&_qQ=9E6n_X6LJWmDbg|ZuO_dJX!tC(o&CyDI{mgve!QQX zZ%p|~=45ZqH9nQZqo=G5Z>-@414}E7DmM$CLIuXjlCuZXO-)DplWXhi0fNOP3rs!T zuJCZ{>`~44+8BNE=2o!9bRnh*=vrY+^}4|0>n;jyb*xASG}SgM#p}6ZM6??Yw!%mG z?+s1(>|Pum9{*`jc#-X*{?gjhCVO(-c|~pDUQzX|#t8QvM}u^^I$ei(pBrUu=ZBsd6DN^)eU}4`#GBkKkH%!hB1A^!hMCp^n5Nm=)z{N$oc`pkJ zir)Abf5jQ_vQ_7QHNFp}##btWeGkD!b{T1_Dq}5&t`x@{{%!2+*dZKE2k(0s7;69Z zJSD9OT|w#E%|==s7sOsGSuV)H1oH=MqWkTOQ^>VrMlJvI9=e}@n3%QxPVN`uV${5!WPcJ%vqqDMu zrT=xUZ}v7Dy=#$^--3gtEQco7&jOnj3a9Te25`xcezgm9Y=Qy&$+4;!XD~zUa%<{L z)67=O*4%W&II5K=nIbhFZut_#UG6ay`*N}AE?YTB`<6+AR}6R4<`#{X;imTMpaQSP zZKoE=J>wcvmO#h{qJHa?F?#RI$~LNO@|}3tigF-;l?qyJ=}8(<*7ipckH)@YyLtzH za^CxF>`_IOFak-a>I_;)4E}RC&1+Q#x6b6CO#l?|zvR@ftalbx>64^2zXr!AXHqef)R(mha`6dA^k%u&ke>}QcZdD8Zy z&8MIhZUn02xkbHCAV#Is*-<{WB;>WCw+H7EToMI}cpV0Cnw;@f)1Z_IGRMbePHA(# zz7bLEL)Ug<=KkdB>S^QcqFP0>QLnj1z$bTX;9R4G6V%avA6-$OW&9;l?{?68#R_dU z?azk^&_NucVp6-8^-`U(*2g4gsb)eeQpWHq?c0LiSf6!{2@_oql?Jj$M47uX9sDxd zIsnAPp%YZKa&eHD<6_}K@K7{cAoEfKri9@Niq?t|(Z|2{2ZF@BRR9<;1RAS#c_cgf zUwmv)@vUvk^HXLjOk~J_reSljDF43>1uTGcjCjs7oi9LVBzSzrMH$tb z=)PX4<(Q`h`!x*>B$WyTnJZJlL-Q*Ao~s@X1Q^s)N#W&$^3&43mwj0XDerI2Lb*Te!rqij>5nlbE4fCMX1)LNVE9YEsq z1P@L{&)ven>Ceo}kzk3}7}`vKsyCOODtFl*t)z60vEf9m@kL@ z7B2+&y}f+o<9r1O3q0Yb+Mcz#Rk06W`?Npi5$K-q4j91?qEH!p8Q+`^+tE}>f1-BU zBO(h8u7Oxnz_Mn{rY=*0K}8mLdME`e-m5UOSN~pv!c`+Yt&_8#2>eZmEFkfZon}4ku2^P6$RCl+aowl~*~pKh z5u4meyo0@FZks$nOqqD0voxJUHBmwFM@1s-h2pGtzTxI7d0g@-^>kr(&3Jgc&T_3Yw zF{zdyJiSW8EQp}3o6K+1+})fb&3UPYa5WI zB)boI0Jtwl<(QlUYl=O?Lyd>eyq~b^WC+z6lC`JbL>+J3C}sfgmz1wWpYDz>o!q?8 zwKa@6vAdk%bmj_ZoW8wbdyPu{gFNgF61g75WWM#fs=Apmz+k;iu_0<{(PyT^>cPi2 z4MJ0U6Dfa2-Ps|;O*KUDYY-c|1fjy@YSfOHn3;b979gMFl56n3hZ}VCVN|hh<|$QA z;8<*wUdU}vf*5(&U;Zu(G}+eSRuX8rxVYpuHo0az{Mlv#K4Jt~b>g+Ro$;1m@E1?{ z^jA6C_y*z?o6w8$(@hpk=2tzaa>TU*-Unl37n^T)%S$Y)*8T2E!3zG-hDehZk7R1M zPTr4?mkA?Tv%+Nn_=}* z^ZzwDJ2WXlaa3fO_M&*c1)#`M5hD-lAiSf)MgXvpdb}YHY{HZ7kk_(tB0>Qo5IiK; zu*k`$=;X=Gj!I(nD6UHz08{AyS#5%!wtn{m!^H290MW)ldPkuUn2^zXUmAN5-WN2e z4RcJ5J|55WP=**O^P&S{HGfVzI0ReUVnC{Z&qhIXc+r&DZOwfEw=y6dtg&423ISug zB}uuvy`&5G1pwKMg=+iqa;f@%mI#Z2>`f|0*Au{OgIb9z3lI77JP4{;>i#-OXa#`a z$BE=$_S@T-zCIiWm?Is3MO!q}ZJa(f6)X<}t6_o%)Ch10C?USalk1&SXrHT@VdPK^iA>NV&^RFa#!F?fZ=dIhO*Hu6?1Y0 zttxGhIb)sX+hVz)bUcxEQ6X^70#v*k6MX#%teJlgut@I8G6<3cCra#r9y*C&t1UzA z0dcK6?ag;`z69lS7aL$D7bMcbnh!ucaZ)s@A$)3{1iakn2w!Uc`^0KmM@|)Gss=2~ z&Yz~Mqp5crco*_1oYH|!7KCDRpJ^Ecq&hsy{Lv?J%bGk5Lcaxlfa~FH$eRazfMNH$ zI!C#Q*=FvzDh$Iex(xmEt@G-Bw>C}6uG6)nD+fW_7Eyj7mFgdK{Po| zRQVXiJptEa?lLP%&tCfz9Mx%Cx2=Iky)`U&twgC?gHXiMzGL><0?oQH&8E@ThyN|{ z&l&<|He#wNU|_+=uaEyc20(zWw0H~SoAojhC(>sMpd-5@LT(6QYl$$q39W z%gO*#JB>|nzrV+o5f;-K_w6KbCF>?yw+i|D_eJnRqvzc9UMj`j@;pJg9_ibY5;svd zQNE2U2H9025ko6Tx!D;s_>eABaT}W~4Y3@Ewr_V&gifl@AIOD=W1Q7}ElDul%It zX9074XNSX#Y_t2i>_5#GdQ=Zyx_f%CA|RUHWTyxqo@sc~Td9R(D<#b3T6FV`pkk z^t0XAU+>A(tzyj?UOK02W)eEjn=WVT&M6iNH_yw4*QoH@8a-G!eNWW*z}W7D8`ZR= zY*8;0IEg#&Ge|hG++3lBv5g0;0iB>vmtNSgv((l>=|vEK zP@XJ&^St2=`JmK$n>HzN-FzwX`1_Na`~t-tVNu*sz6M!R67I*J+@YK6fBwB<_h-Ux z$u3Pj2^j}`DKqeJE*s#lW5~*y(_)(KTkpH0ruE{c;W}>jr8As`7r-g+3Ss}vHMuai zs8cokE;=;qgtVrP3(yt~I*g8rvB_!sV)+g)!EfLX#Dlc}EC2wDuYkpWqbQQ~xN3R> z8uLi-Xzz1K(E7?j(61Ey>r!ouFD8I8;Rs1nYD^1R5t!sU8Q8jX2dxO?VgBrCQiO6i zFuG#jUA^%2=H%*HZ(bZ^{ysFN%joQV~1N68!M?my{vCk`8OnPJ-PNmUUrjzCGgnz@$6t$GDY8sNTQ*hXCVhE z161UnGmuWV`Voj8C;&dfrmShDiYt)n&3sZ7yd=s2F&yq0dEMlD6aDy<_bxs+6je6r z?erqRK$|T9G1e!^VM8HIXNGrrInDL|BqiK_hDr@CeXw;ZW?E!n%A8KZWD{g*49hCN znaAwX&E#BJn#=#~mZNEOv(TXIOP1%5b{`e~8$5sXtB<1~SXiUlWh^Wr>Q3gxC^xWymSIpmV$KGSGK}WA8O}v&wGt+%aGHf#!+iQ z>+PKs^{N5ck^%4`qH}9x1R=qZ@aj(Z?zN_50F&bw22uDdF3~_!8W+WK&072l%}>Gs znz`^DuAYr6A+Ba@SGn(~fM^=LVfC$lhreM7Jji&*3o?&xs zS*8Kdp7j_Q#08t(}>y&E9wKfcZ^x%nLcjd3jpdExBkwYSnhC)@HaWl`syB zgE&a>y}o-_k>FY4{MXWxW^D7}+^X0>oZ=)VX)wNl^O26T;V zZ*MPk+(3+^B=$dULVe9s2I`GrdS(0y{)=gchf`a=ItC_N_z!~;thQ0Q)D6W zy0xID=G`?_`3)OW-O^G3*50*N$JL!cRU%LRSv?dPDt!lz6y~7n4{P{DC5J_KIq+T6 z>(dkrkNo8m5)eQIHNI{355hj5Lfh(?(0|u&^5%zJZcd@YPkz*h?}y8<>srX zk#=~d^AFg|UZ$HcCItkQAlL}gGct<6VzP|^tHG`Cw@APDz2G}8)d-mZX{7+meFTOc zCD82;p@L~qeTi6_<%fu1#_XN8rPvvl_3!8nmorIxX(uWN`Z^C0f1O_ZJ#6f>Yd=yw ztACL!D9DjLLYa^bLiu_i9IBdX#nwphru)ISxzjCUe^qB@gUGQbSJq7ew|{0oP67@# zH6F+mG4U}YK2aMPtEe*W%W+DBKlR+mmgV)pDVo?o8VEG><4s8YLzvH`m!6J=k!tB#Do zRH3T5=^4JMRWko9z!Xa2nkFjp9xsqY^s2HY2Oi$3=tCz-aD6C&GaY$)GIq6O$xtS{ zmO3RaDAc&*-$pvAa%`2H*gOQA&bD7MAA~?S2KTJXxB;HUvYJ3_bN*6lE26h|U!ksw zgPN~u@6TFDcVANnYm<|Zss1`jNoRs1Rys-pSl6c>w-w<$3kS zLHPOTf1DMLpDxL>{ zwC?83)5dYdMy~);gZPTAj)(W_E$UTy%IgxSrj@t~c?AGC=F)t)D$Tbrnx~wLS>{@y zm3>kb9_j4B?;25@Y>E^x`3Zcq5@82ow3;Xb4iPLQr$sCCXr^gmHhPX{Zx_6D-Xz^y-6fFsdsh% z6-6EdR#iD8fr$NkPZf>C)*7b6<%{c1^=+8vB@^Zzic9i?>&WxWVR^7j+ul#+}U2-Ap zuUGNw*aUFE%L1pa-gSqofeTBjZ6p^l&nCaCGga)gv^2f|W+a7!qn-IE*U)CzvJ&>` zQE&d5Df&qj6hiIrvc_koAimRP3GaKCV3N4u{E8^1e-c@oBo8(NGe%p!ca_zw#3*X}+P%Y~w@=M09lMqm@zp?99Nn`C3lfoX31NYC2S9 zHUqr%uB5{3%u_CcY+<~*zt{#R)FXIKmbs`p%eiu!FqM^8Mtb8B<%7>nUl{F;U-nn5 zaQQaCRZXf5m^V$kq@C334M6Gr#AEa@$|4A~n`$!HwcMCX+sy3X!90SL)|iSw4L>9_ zHP+r>GmuJv^%Szx<&H^Kr1*I*P(8aNkp@71#!3mPO?zG07f?_vdwG6tL)FbY4}9Cy z{R{h{sd2~4lMfOwhOpL=F$)2+f)MEgiHSEAFBK}-fPah%>2PXtyX^=6i?pck6_zzI zO%fMg2d4rP#OPlN*Ee>HYL9);iw|Ar8Yy%2i*3pRpih+tCUOL^9c7VCCX?;Xr|iz3 zeQ1kOIP1#=ME||hu|IA&RVsJb4^5)M6Ng$zlP%Wb6%_+gF9GkFAN%4&P*d+y3Nv>f z*^FAw0iAy4dMiK3F8g6=vLdPy>iHC4xH;Q3_tmSqW?YiChpAXzDOv%l*fItrX~yy_ zT>1ufi!m`fZ1{qIU@)SNSZ`OXrZES9qc3y?V8VBgnm#ShG#SiHhZ*{)H+q-eL?1)1aNL zMjsbcuJccdCAPSGRo3U+*9RRxc%g|WM-#Ut%%Dd2IElB;+M;iOu}-6zBDQuiMJ-u0 zsK1M?+fwpi2qf~?HD3*j&ukEz)B2ACnRylu06^d^NowdSLN@`IYVY73%l~VZuEbth z^+d0|TpZY>>!P6NKHAJ zVg`HxdI(YCj}jiJX6g4wt<6a;X}&luUe1keS4cVr_ZWZzz`5vmcVG1aFs#ya!NL?r z;S32Avmz7P*Y&MXIF++DKQ?jA8DxQ_qn60Pq&FKrl~ny_ifv;5giUSkbc(Ml9t!<9 z3Vvxt4ARobeQZ!oYm72)k$UJ((%x)>RmyKQoqGW#}t3dS5QS{FG z`udgVl`Aibi!YVh7B9(>H)c9dd6Q#I`(w--V&+}rTs{K0{6xKuPlJ4-6cq~5Ycn}M z%fFA;_Q@5*)UuW_uO(;+k#eT6k+J|_z{2;vla)wYO56G4+Mas=-%R=hcU3lzJVnpw zm0FvOF6&Fp%^TmG4Kk2|(jR>b+(-f2Q)#4VS!}%XN9BGFT8g+jq!aj%jSWUetucaw zLR7GrK3rd+&LM!Yc!hLd-T0&4FOv!xRz0oFcg~2^dc{Y9ADgE)oJJ%&I~L{24gx(~ zPl+|xnS@GTr&pSwUrk>py1L3PH9mzH>#P95eYww&4!bZWDh0AX+AdWCD^c(gV&r+= z`86WP*5Y%`S-`@gE(JB&QRtL2r_Sxr-DRyHp^81&z&ipSryX~QZMTsR5cFzw;lZhr3v)#mu`d>oGgK1V)~F>?TRAL&Mqu0a3u`x6^%zW9&|KrfVVsTF!13%G?fz<5T)Iz z`^KY%k8v~@5A`map*TS8@Va!dVdq)r#bIE?dFSQUW$>GWh?};BR4-_*&36hEhynpwG z&?udXmlGhrB2-T=0u=hSu=jbO^o%8*n+FQPIU&p=2K~+Yi1gJ&zf$h(~%HV>}P8sa*8U zr71GkC@ow{_jP>y-K06c6rGR%72J9=YF#(xk7kUiXH;nDaldTG+gi`D6StT{x0uVL zn9KH~#nV3@hR!jk?G^W4%}gCMr5u49Ri9A<7*^A%tBFs~TUbkcNYFMG)3F|+9H0uLi6iLI>HQ#8^MOB2jK*RuAoCo#LNJIF z;L)0=vgvK#P2SKOs05@y8+Qd#pXa@$Pgjg?_$seBX9S zI4;l9^Wh8LB)NB`kWAcXS1;yydQ`s%LJQloTy1akkSnoV-^?ThnEoXpy+3RCT}QsT z*P*ZC^ZTelIhI~&9VWAa<{V4Qn)az6i|qYx7=N&cWU?<(iV>kU7G!f8jBAyr7Zi3@ zVe9Gj_Nld6llJYBmhN>`uVHg!;XVqr=8srkmAGdwFrwTZM)5)X$+5u98&4Okf`M=_ z`~)SGr_%Q6DSI3AVIL5hTk65L(go%6&8vS@nw6-rB*jiZTATp1z%4>0t)QP5gMptG zc;3TY%AVI5%o}_sIOyl{f?31}_hZRHk~j=S1psE#EHoV6cZ-nYzxuND7b3ZGHp!Q# z-*$NQ{B5JFYVX!)XoNmSs}EHMf6z7UAr-P;_NDC2ElhIBlm-?J0z%Y~8?(AImeo}V zWo2Pub=oLC&uL=89SHl|W`c_tvGO|HOEQIcKR^wEOqT4}*1cwFP(jRsb;rFe!S_M< z(==}jB9tGsTd1kJaV9?^{YcH1aoF)#AUv-w-%g+feVXA>T1?U>I3hK+1{ zdk}9wB#hsHWabMZ*mYsTOZOjkQRs&H>9iTt15gQh4E?h~xSQz>eeS}MeuqJ1JBQ5D zQz!IIA`u46h~-M3SDBiJS4cCd=}dI%Sm57F#Je-Bj*d>rxjINk1Vl%&yC!KB49^$L z{Uq4vF2-8-V@qQcPt9K_qlr>?d(dOasPDQ_v} z@;v9JT{QX568FH~f0EzDaoXka$v*i~AbR-HJgfzIF#6=_$wAO%`4l~zCIt@s72b3@ zp!s2P6wyw&4NhAHZ1*VWn~a6c?|dON1}hZhZ$vja(G!~PTl&lrWA9mcz9$hFjajrK zB*6-__TIIGrs=B>UUGz>XN-xanrtMLi{CF@xUvTAuJ>Yg*^$A=bP4(zARrT+{|cB3 zeJN2;P#u32ARl)JPDKT*1VK4m@4vUb3S`jTQIEKS*kmGA4zbt}+?T%Rn~cFVIH3|U z3)5(f>X=&AONxK-Y<^An4vH4~?c$c~<#hyQ6F|-OQ0=&H? z)ft#l+(%aB2%FXIhUoXN$6Rs-3eGS7J?gmJ{mlZsilt6%wNdfIR6= z5htgy4h+ye$w-uBmi`s2Hb%IONr69_GNmnD7B*95LKajlZu>4YbhMm)nqq0CP71nl zb4ST~)}qG1yp?=9el~Y`Qbci@W^x*FP~zn`WZjQk+$zt~08@|#|J(_l5?MKL#6d-} zi1{j+c&p#j*~*QLvmS$#j3xO<|CZ`2ePST(Vp;^PikfF_DV6JJgGZk3HG=MNZ(zU& zlx|Vl6Y9qyz0D)$b-_Q4sAoKKPbEx;~^)d#?NCRNAR-T*HD-r|1HU;X)eeD z(d_1P6CUReJi*rYt!D-um>hDX8d%yg(UrC~`rnT?;?14(##v|TNK=->lc~tuc%Dj2 zl=|pzxnIGPTU(>IiX(0Sps`(||N2G*Nc{i-FqA>6Or3tIY(?Lbd!7GHN%H?mNtdl9 zf1VPaM+Lk%9n@XiPQTQuz1n7$e(jY{)TY(t+4$wzs894W{KYQo<*sbZzHG5l%nRdL z%Wb8*QwM4L8CgN9Ad)O6V0+HtYbx$4cwerxH(FtPz>?xV5n;a7K7Ffre1Bb`PB%re z+@6KyQ+PqnZF1}ff+rAw+*ls+EhP8bgHpJRl4o8ObX)A#I`iY5#*!OGo=ovTxS=CM zCy!iBbQ0`cWAW)J5DR>1e2A=>(2p#t8YiC=91DR%N)Vvxh*0(?2HBc%RYgwp1f!}A2|V>}uQ z$Gv4()ST)2>_kAa0W@?RJ9>O*7Pu>T;X3y zW-8Ez^_#ZXL>gNf<}AB$+(^B2m(h(~&m;s@|{}{=x>5 z335bQdmJf;$?_bxWLsW+HP&_uAt_7fD`XXnFqo}5eAV7~f1!w`@zN0ckkg+EJALOv z^G3_aKNJ}p1t#ec@3X0t=OPjTQ&xl^ z0)h%poL+3fYk}F++zCWZi*f}fxV*N;ud?Tp^twrGR8KyzOQt=e?#pFvZ@wNEJ3jDQ zkSzm(W@`{<0YWUTW>?KpW=_=twY2VEZ%sqlK3zTVRx0Jv{!M-{v;TKvZP=0#P-x($ ztor?PI6;h6E#+67Ud*;63!EGMx5BeN z?)#1Uv|)JYzq`t}vwMGqPciu9VDDbjjLW#}&YSA8EJ{l@=H#^V^7Q|&=+4MWml2&u z5q2j-=7*=}mjOTjUZcI-V?O(O$X*~CvtUvG&s2tO&WlDHVIF_EUx}*@kwGDr(;6I& zrQi2Y0u}hIJp1}aK*~=|3DdX6r2wM)DOw{;Jv#Ldn?w{`O1%pCUe+{v5Z+T$Ym|zX zR8EB*%nGtmJmp$AF(c@pBNo~|;YWJPaebf!+6@hG#^VKu8GgR4p|)J~U04Ayu4QIc zE;I$m_wp)`hQq=4k64IK(nwTmCeA-^J) z+lofkNrp26V#|6SkH*Hs*Sz-L#u#q)IZOnKPXBw{b>;Pz1R=x$&Va9W$!FK3*yTYosy}gkO!Gwb?mL zVOp5k|2!?syHItTkYXQ5q{HmVp$GqHV!*gJh**)3t} z85}f#Z~{RVkYA<+@t1tBC0T)DV`V9uDw}>bZclnhX&i0W`dnYB<^#TA{^9puEdaP} z$_uZE<4Ou+wEHsMox=6}Q(PaU-@#W(8Pr3h)W@oNnNpHrp3VuXyWu|z(m!>#Qee17 z=0UzI5VaIZZ_h9kj#sdn(HQS;>v^MWIsvXTrh-u|bVQIKtFs$^ciHW!KUp$Uv^N?X zT`UD-u{Axs zC#oz<)-6WL1d&_rAj|B;Qt%AXuAOz6B&GWQ3ctsU#SDrQmQkx)zCod{$Jh1mf0_$e zKXldFbGJSB`gq>Z>ZPEl*b%z-ebespuWZNO)8dQu;)@OQ&cACnV@`@f7QbEJz!WD3 z3d96Ne2;1CsE=xGVqwg^gTM{0%JCkyhItdvY`_OMgevf%p(h(=Uc|-?7UJ~ikDcS) zd%9wq@~M*zb2OX|9;6NMLVlx}XOnCD5%E^9H`iO@_i|6qb_+r!CxDwf58aZd)`V2( z!=ZRg{LCDcA*s-ew|RL@;(fi|^Rs@B!x&v&5jvlPyFPM5EIkXJ|CJx#dO8pRh9@ZF z3HQyOkCxqG0HQuri_Hd#@%DU}GfM6HYGpU{w>{>Pzj_TWSkip;L5k$l*Ah~(Rcs~< zd5_b5^ZUi#-+haNM4&tgx;)@?`hcORCPCqh`p%AxS-XYyUj%p0j9zKx@min$tO*-4 zs~wJK818}Y_`>lglCv_bZ-!Etx@f&@ht>--Sb8Dp0bo>rSe|ap)SGz8_tbwD???iw z56g%x;@D#Ysi;09w&Lu8)%namkrm(8y2b1kgD`W##V*}Vj)V4)P5^jAzD}2* zK1#*FWl1f2<5Q)S#x%)Wdd((Fp;UWnpiPONVx+|#+ol$Bo6zo&yeDBZ09#yH+0IgX z@p+lqXq`mL7Ew@mF;m7no;F_RJs>?&VL_xz;(d%2r0JF*z0DVEANRD-t)lQj1~^{l zi*1HS1l)P*lv+jD+&k97sp2S4u$|i1DFK8Reso$f~jbNf=3?STOse%4;`04}xJTZ`FYMq3H?Hq7la zB%Bdd{xfuCkOabbYBG}lcfA0ul$6=b;`FVMIp)c!hR)VjPr}sV)ED}Hct06~Yopw6 z`?K|xaeglM=;A0>nHmu_5Nr*atZo-;Vg5M4l@nBCNQU=I3OTTZ!S=g)@J>Uk60pqp z8VhR3%dH=ohjh-un5|Kds|gC}&RxGGGOeFZ9yDlHy^&$Kw$gQWys=F|Qz)JOYTl`X ztrh+@Jpa;Kr`UG7eD-^7IEVK5?EOw@R-%J{)8xAJxSJGn?6AkIRm$W_eMEFb`_fZ< z!E3&b7kW$biFk3s&VK{VP_XzR;UakStg7Xr;qBDd7?N8wiS=Tcm15dY@efyuT-UV= zKm7I0kk{^Vu%L3|KW3CMX9F>3(@h;_Iw!w#I?pKMuFV|^$x>SX0#(y@JRq|>aA>P^ z7$^T?YmRAkXl9T)D>z#Y2{Q1bc@c zTqb%GNl&cSlS$4nWgt4K{w19Z;9h|1?KC9I^oZcIdS^B>ui2#B^d`6&5ZUF$FrS{H zuCl33&yyywz|E%jWdbXpqdK+3AF zw5s+<2T;J#{enY&4Nej)4o}RgCFu>}Re9s6zYyivZ^eSI;zmDsa((c;^8)c%oH^qG z1`{gwYr8C)g#`8#t8fuUrb?EU5~qWNdf;xZ&PZXlY!QbM!Ix$PSVu8S+VJXL#21Cao$I z_-gS{5o1cAmbv!G#6W}E51xPI>m4$=w7R-lfR^|yRR##oxj+LZmD$BM`_B82!K0;7 z{vaQw0wefd*X7{%&lE99f%k$l>0!?fknapgoEGlBTbhy4- z{TOA({5-(`4zyR#;+v!3?R+(!#E~9lE|Wl5MtXn&N{L@!oKh{x149jB@%?^ZcglOC zL!zQ``yHM%D=PycDDu0iU`)(=`4i{1u>Wh-S%282C$kf#ntl>TIk(-Fi|~!6jf9qq zJDvM?I**@p9#g8goR|x8%tb}a-wM0)4fEn#bBoa=;a^Qnl!IvVFXh6tUw5%lXL|6& z?(DnI<)P2z2IX(L)ZJ{cw#hbe;bzFH+}5FaFNYy9Yto5H6<&XvK69YWQpxHm zZ@Nl9ysD-5_1!}vPFYQ>=aFmKbMIMGs~SG2qkT9ZbZz-NR*QCfdn(A?h2W`KS6OE6 zE&kJ46(L%3WIHW{OLt^|OZfRrjp({taok}Lg#NosX;65YO!2ySas`8eHeGBY?(n5S zPvoC2yve!mq0;Zp)9R6zBP3--!xfw3aj8Vy@hb)Xxl0;7Lfp<)9%aMne7U*%y zeFER0;K1k2-r>Y)tEx?RMZt;DQGKj3A2l7_htAGBGXbM_6X6NnTs5ceck`*BP2U%* ztYl@cF|j2|X9X3drO75zQ@`LRrNrOkIeZ3@O0E)O2rE9;X*gVK%Z;acQ|61Oymlk( zC@(l3v_$)F#)c)uzqic3>v&_&d!42`!ppOcgKkXnF_#d-zpT-JR#-37b`Bl&R=&9@ z6_lS>)v90h7TzjX<0)5wz!@JGR*JP}ul72rJ@9D1X#7#5j{KydBMCT z2QmVNk|0EX?SwBAO0UGnfQ(#++C|lIK*$BNo#+|6{3_f&Op?^5VS3G+yG+cV>_Rzt> z#UY7A@(2m~YQtAv*ju2kLnr%n`ZHipKXQ)!N=fwpi@;;k-K6OaLw^5VS5hQb&c!WZ zM}_f<#p_tOqs}_%FDX*Kn37$kwtmIVf69`-^;<+Go!o)Y)ruWz$t{QE5&Q7HSz3;G zR6oSAs!W^_4$9u%#vy^Zqa{^&)QQTtQR}H`V%B1Tg~^ty76>ypC=O8g*4%30DK-GE zKM=l($jxs?18z09!jh>4Z<)-9W6>2{)a*Q}9ET_adhd3m{qtLje{ z7cmwM%G|784dnWMk%LbS57?b;Oy|za08_Lp0LmrIxVsP!T@QSbH`wG++X~Nhw`eVh zw`4(S5AqH!jFe>k4So0dQ_1vw&$ZZsx$1Vo5B2P~CxcLg+f-kshb`|ro3dxX*y17a ztyA~aLvxLJuCeiy$JY+*hoOkWgU}TJW92Tr8+qUl;v{Iq-Gfd z|924WF9V>y!p6AGJ@c;8lZQIu<>PvHT!Mw6JFtWbNvptKv zUzXcy-Ie;}{wzWPNggJ$hLQ}D(C3TQMDP3IA+lTTK z{gbZ~1s+@aR22|){NoJhV=a+BNV}}8iDr;b^_P2te94W;i}WJ+zAj#XyDrGI$;G0J zFPCaKx{&AiB+&8ug4|m$8&GxXzSZ0hso3V;`%{{TKtRYscAY5-foRFEX|cF*5GjAN z?EaQW3SO(ywTuIk1>x=PYSK)KKb$To9%f)s0Rg%0sZy3u-ZnSYdJ;IW7$%~J8%8)4 z1;pmFO+t+R!Q{DM8B&z#M|IheNahip#s-m4_RvJ5 zkW6Wl6+FX9r~ZFDor^yc?*IPh*hFlSRAOe75<}&X!?2uBk(_cY%H(W0jEo#6a?0De zlpI3CTjsQe5Xw-o$zjfiST=`P&cA)W-|y%54|qI=d-v&o5ad^OtKKf6sa_iw%O~I(*(T3vDm!kbI6pAhLU{!3}GVN|p z+BQ*#cH(Hgx8NT^_#RGYf9NCtoG2x|zFbe<)F{dxTK~JY!dO{}7+Y;YnJovPDG|iB z=;mzB>5jsofMCp19KrV3kV`55L&H@!te<{i+#}~fx%f`CiabhY9$%mv-w*@NXhTsX*2qm1Iu;RP{?E+>&4H!n_cw#} z;wEokRcw3+Brw`s4SdqnL-h3|G5vRUOl}M~2^xQJ^`D{0-L-)T!$jKE6H0v6p)vqf z72D(AhZ`Wfn(W@W>hhh42_8t*2@ZXn;5)yLSh6@Lkn05wA=g*u$dp577J@3w>vyvBRhTEhCQM+ddiQKvtxlw}RBc<-%A_9l|g^&!d0L{V4EAhW7 zJzWO+p}}r^Qbr=8463b@iMPgG<7XDx-OCf%d&I;sO!`FCi<$nJvf-ek03je*Jh8Wf zx6B;x@U**YZ)O^tD)b;IsW1^dUbt$rgmzzdpSfie~jYC zL@7>1e@4V~x<`v`fMRno9})lvvJtn4y-7t+cx!XZbNvnzH^I~f{Pz-fvv9G5Aq|~E zOQYYlTUNQ8!+w2^!Dj)Wi5|_5d(DG+?lya$(w_VYC=4f4LgeVS6GG}7V&GU1yx5Jb z^wyjC%fw>xWB6y-vu(8^4X(6su^uT;B||Q|fMXEHrP3S?v$rKprbB&moqcwpLlk$N z)d=PaV-Zi-tgAdDl|igTQ$+NDoHX*IE0^<~MtljMZJke?|5{gFs!*!->2OyAe!6%P z!%o}BI6tRGtU**Had;?3S3=)SwsLA_hq=d!1Fp+8ZT-X2$RLTF85}Cue)=-lMPJ zZJ%09mv1i5tcSfChch;6xd7KN?4Cp-CePYzZ+&qwK+S9@t4M2n%7w`XpiLDDO*v*v zq)c%Dbd+WPO!3>Ul8BfAhxwBS#OVLKrNU-y)(Q^5OqO~35%LP@8YvovU-ea*!W?Zk zwjB^^qE?-zcBuyk2WqKDyESa(f-RrRl@%ziUk#aqqsN9FU%bN`}#(4p0}N-hwkR$Bnb0W?0d1E|z*zqfZy@-#Z?wi%0M12|;T zNv?b%dJC^zu>yz{PIy;FpjMwcmlu)&vVpa`RI*aNNU8zBs5M4myyKtXpe>B=p zX=@wzYmPi_O)h$EC`}K)os8r@a?#n6!vAlDx!tt>!*+2K6~jurV&BWBQoCZZ8CD|%6{snfljBQ0 z53Y+>6942ar;F@{->P-kTMmm3jbMXZB|u3RjoAsUpi ze223t<@M(_=62SJQ-|AIALyEkbCGO~VQ4H}uImkjK=3oqTl4y;-Wl#P;6kHVKg$C0 zR{Bt?W1w%p^`^{z4l722xyVskQ<6#QCTx{)boYz%qv(RCMxeZEw#&&*-}K&ab-~&l z6HI?`>NAq*rzNM(2 zOu?Z^+PJlcS;{bm0=cN^e7^mCL(4Fsn#9Vs5x4fpKs!6xT?m31%PA4}l#6`uwx`l# zcyPp(I(hxCb|WKR4b*IFgL!LH`dGi({RbXAFtStx&PYTbB8x_Z>LEf^36r<3WB}JM zCUNt$Qc56L_^&mzSP&R9d23AFy2Vs1`YJJqp()1rXe{=IYJjgT>L z*WH8}xhPxyXRhxbf7_8M4H;;AbpLYMk@(ckKq#B4cI0ULKi;O1C#xfeM~751-lA&T4v87X4AXRRc8=N`pE~@W_5_LS zgilOPc8mSzkhMFdh7`GJEA;7*Onl(HziXT|65YF5B3&NQVEF0NvRQTj_VxL+k5T0_9dxm=0|aY?;y#uFgl zuL_=uRN_H~GX16*KqE5N2Vd#W`7Nnm0PvRE_WEs=;9w@Nn>ZNo@fut@ZnE<7)3yOO zA*AJ|NM*uGHLosC{aF_%7RQ0Dtk|9;T&pn$CWv(xj%Lt|ZIK=+$$2p+!DC+cc+k<|R{**J60TTop-x(o21-ds0jybu40s{^6|?3$R$QgL>LZ5TLNU5(lYX-Bftvr~ zjHnuKs$AjMUD|2I0qWyK=Zd}-YGt}UPU)#0-KWT>cYS5WB&9-s^*N|V%~+tfzJ099 zBG4lX_@%{n)E~^rcWL=O0uU4a^&akrlXNUR>1n4ZYoV3B{7UV@Ut2Yi7krqy_!?DK zy@>ZeTGlED!N}#KEsI%Z?pM%f%L{EP%xyW+?GxJd&t{Cyyk9}N0nWSU4gNC{^(wc* z{sA;ad|N%4cmpl1cg%^dhcqw1s4^*)(o#}j;S4}Fb%a1}xP3b{lNN99^MR@^7<;#$ z1N#)l2dvc|c63tZi4)@j$2u@c+k#{o4Seq_x0?_8mtXC{n>t+n6@p2M$XvuLOht^k z36iTmfqDxVmtnt5cp;@UL|-ty85*K$`*51{LU&AnM<04j^)lg4|FTsaR|VUOm1nS+ zep2NaSk^>$LyZ%gPr2i`GZPn`x8~ru3A@NSX-Z}9Z~Gp^0Da)uY`+^ul&8oI%3Tx z>g><_5AW|kw2Y#I(IVg0E0&S7IVFn!W2T5dYK{Cs*p1F?be>W@YA)}~C_fSEk0-H3 z^u4L0L(Rdyx<8YaUs;q-?rm>a4xS<(kq3=|>V5rN3=&IQ2q7di zRh09&{|Bguo$8DV?iJRXrq)w}G+&Yf^0%e9*)B86odl@~7guLV!M-2aglkxjmnXD@ z(=trf?|h4}bJjPTgRioTCL*H4S(T{9YF@80J$Yb1iB(LXwQ8OUXKosY%&!Q3NKQB?tT}e+kN0(<7Vox>3%;`NuU}&_ru5T zny&6KsYxNCk|4c~O5lDS2c0L2=(E-0s{tyd?jBwlZj7?YmWFD=Hend;96X?_H~kQW z_Wkxf7F97l{Yb9FJ2&Vn`A0#1LDw{r_Zx-$$idY2r7_ZD{?`O;D@^-j$6c>K-4a87 z=~7qNQSUqcs~-zT>gv{ZB9(`-X8S1=57A+ng|c_uhkxNL+1x?_9w&d6Wb0WE@p}Uz zoWix-U@!;g>X>cPPQcGA_*dEC4mo~Q0(+~Qq&{yo|-OCMhE>J)iwa2KLl9kN8-<5_8iDwqy zw(oKO`TXQZK@-^3n$3JHLeE1&&rH0ff$9VKDl9QFiZX?9t@kP?q^E~Ckgi`hR0$Oi zo=iKb4sydK)%bU7PE65WruNiTtCt=;sWB-<ie>xv%deSN&TC07<&kKnoSFilS z^&<5yl5y|+2&z1%-7`gyn%!McvK;T#W1-LvP%+8E=NRCaKOqKlU+S2zb1BCLT%hdE z*OfSGl}h@({lSFd9;$3E7zcCaGjb*bV*C6?YKh(<;P$ zwPNcGpZqRL0KC3opd9Wn`xDs`xp6(#Fn(epSoj^3FN5XDb3af_&D;~%$WY3fsMqI4 zK;9HQW@%w-s~RRFd>9rx@JdlGwCz_~gweO~=9@nYEB&o`u33f=l%h z>}u-M?Ms|Jo%?G6tX;~%44i@IY^wtvUXI)SUq}rb7U+6TTNr;h^KjR%@Ppm=(B(tz zt zlprT_y}88H`8F&K_*D>_x@|K6Q*Yja9K9OqW1$-?FbC#7bRKqYJz(=%B!8m zultz9m5TU`p-z=#ZqN?SOF7q!(E3Sv8sDx8jG)8!{^lYx=RF-p2+H4sT3;zH$!Fr? zzfG9qt51;~>1C4`L&)5<^PBEsywD&!114=^kr}noaztHU(3dOC^SW>NHC2E5R)Rpi zpK~nwoY;T80GwP1isQI;^rolpKOfX|f!Ue?vp8H9fYtl)0Vul7M+vx2k^@%s`>-i4P&d}%8!TMfFQLchG0 z=oHPm%B)y*Y3}2en{QI8@if|b?WpzImrJeG0HWXNhto4OC`H?VK{g(cM&^CTj_Op3#Qq|}#y zHrM~6zdR-q`8_*WqI|hUo=`0T23DFFCAyFGm^C;SU?5KoeV!);$>|TorZB`WV%tHf zExvQPu9A#89Ox6($>u>OOeWCh`2?f;y9|MzpR`!WEL-*yJ60lmF;Txwp~Wu=2kzEo zHufRxPg zyWHvWuM60DWgM;!sKn*b{z^BVBd(V9=eS;WEf9Jfs4^aE4{}pINCk2~#7S6~wK6~d z{@fC(WS7d#VQ&kL<>CvJoU^qxbmInFAm!D8L`+x!gg+UGM8#YIfzEey@UdA2>c%Dr zc2jZ^myD7}uIu1wFuNV>IM&6<_Zo<}9rgZvyhWluGs0OEB0pzj9BXB=jZ>WZ7|!(x zIA`V37I_mmMyTHUA-NZx*OS4Ap>21^^enMMUyV-VWHJTjHow1ecsLWFkrg9fEAR$Y zX6j5(6&5vu#fh}r2c7NtH|wMC_(H_1J}l7Ji9=J!IF9}KQh}gh;uRm68SC!SJFis zck<`RKu&zjzrNZY(saZ7?^waf0F!Vr*cXWtMjg0R;6(vZ>IpuM3;?)2qK9Ta^b!C# z&e?Q{R|8V{2F2+XT62Z0D+UgdW0eyDu5=Cf+xf}sHs_KUJ z5>=tXwPV=mk_{>-81szqs8fW^5{m%KH_yK{tudggSIhbslq zlTH7H#~#f{e_xq$vzy*~&`JvPV@8xO>l+{WyqwfY2|l_Wi^;f@?)Iw3vaR6BPT!!y z$mV)juN(zUFIzm^-3nztWbiWHP6qD4IC9M_J;l zTInoqJ|n#j#`9SA4N|7Y>}}YXIW;}7cL#1>J~tEj#HD7bnO!hjaTy_Ao&@BIP1l+j zuG;qWozu*|3%m(SO(X`sO7QLqbBU5Mk#|t@cZ!PCPV+R&^dUhq;Wyj>x#6n%z%SwK zJO+uCfa@(`yyNYv^kQ@=FRUL1pa>@wEX`@V_T9Kz1{==3d3A4k+!{ld&$Qf=917dJk47V8k))((< zQ!5)y)k}c>&w1jnsg+b9Kp32vE;5^8Eo*@jn;g03=`JNjHcpVT4DA`}JDuYj)p9pC z*XGhw2;aIFhY!A5E7@#r8s&9%g|NNZFrT^9`Np3>8N*!m%w?wLphpKT=M)Bgy(i_N z$|XC{aTX9m_NyENPx@LzU*~}l$agom+r=dI4o^cs6-gMVM_Oxjp$Z0Cro53nRI%ll z(}#u04?4f~mTf&(ZpmO&`0#3G6^r&Yg!})xGqUjePG(lt#3TQ$sh2a`@By5WT=?`t zgu_UmRUI&IduQhF%0lvKq0r5%-)_A97!`D3+SUDhW6i@U&4B-dax|^my-Y(^F*gcY zud@y*>=E#SkNHy_=Ats42Hl^LFRa69!Te#cp?(ce0 zhFGL?w4k`uIm0+qD1Ag#9FZxH)S%si0o98J#|SQsr8Sl#n{>&@qrbDCoAEZ6bpFm0 zO=~DA=RY=-`XwM_yf5Yx9dk{EpRQ@CodAK89!hR1lui@xhq*1fUxa2_Cxpg3aU!2V zWL2Ilu>{@93M#i#!OC@@f-}0HTg*x?7_tKa{<_E%Iq_f`K3%eSH96H(o<=?*t7qQSI&mA1B1=Ij=Ya552vhF=r(NFfe z+8xJ(n&0>RSaCFwV9$=9lgAo*%2mmQnfJlG->3<9TaT7mxZeH__mp2UniR+HFN zyS{p!BRImP;fXf!h7ybMBW1L{MK1R(k8T_B02lwAhxG#ydmy zKML9VCM3|gaqGk26OPWmVXgaYyO#d>@~M5&5xhSb@_OD492+-GLG~uyi%u?!%ok!K zs!-#@yXhz09@z>*iIR!`N?7(s+Dwg6iH-ne1;Ag0Kqo5BxbK131-iO5EC{kNx%z9)LxDyuky7)Z@>FK|sR%ZzF!| zL&;pX^zH*<+XL#qwY;2am5DX}vAI*{aysy`QG5xvb>nY2~;kmmK^`3x(ZE@%Ka7?!o`ax#EIzeW!(lSmogZ>LgcE)KuVK zx2@fVn#uq2{n8Ttb5bIu+fF?B?91qs-Ff*p-?=(EtfTSvzf2*WZ7EJOy&Bi4s_&3^m?NEN{aD4u_S)5JHa2NL`b=b12|r*M*uSt67#~vAkP39OhJ2g$y{_lkmF`<9&n1HGu5^WLW*$+G8oew z5?~7>23t^TxUsN$IF2gwqB&2f7c=8^2)dbuAr$J_<5E_Th`44Yz{v|1d7n8uC;Bly zezLu~eo?Bd$L?qPYAN|fCMK63QFj-47Wq054EC(v5^c3IT#4U-15w z3Fw6nK34tXedX)>U*yTq8R|p}CKev& zc+8SMI+n+ss#QOWv()4SVih)QL=^tq`{1!-8cJ$D7Gkdng7W3=8vcYWbEif&ZwrW=E_}PYg#e z0T(kPMjZFHBf}%KT@@Y}cbLtkTPE&==o04JuEOd5M>>BGul_}hN55Ok8zpPMCq?f8yNvQ!kN*w@CSX0A z5$$&VQ~4_`?*}ahJ4WvY4X`C%A(T(wLXdMcM__0uH&(GNGFaPna4^TQ3N9qah5X<} zD3UCyR~5Y2Wphc%0OC9Lo%53%Hb(3zrx+I3ax6cw`6dJjskmVPRFOg={b`zln?cQ?ly zk2a%^gbs6}H!S&f64~~{=%oufX9PEw53_CxgY$*-!~f1xbPnI@uuswNq9dnh7W1$> zEqdwmg(+`b@ymGdcl-$2*Cpeffaj}4b)oooPDdM6itLXgBkf_JAuu;KzOX6{I=y%q z5!Q5rPowV`Gmp1FP&2`{rf!7L0&zqZ5 z$krxkpTQARw%0*Cg6Twy5xZ#4gZ~AZu@BF^Y4#(cEn5h!_N0Ap zc4yC(RKvay1{$s3^&G~Ffj}IL^tiO1WlYf%PJrmY@=kWqk$VkyWG>-2ksv=5zM=X& z#BrqM+NPTq*tkPIDe*)hce76K87g5ZMmH3s)cxVA8Mm*p~Dgy!x z_1yJ{xrx?d`42DJz_iZfeu@i`y-s(abW08rnIwgEr^dIEZ0 zB2x5{v8V9u?kB}CJ)EBx2ME!@QTwPsYCbS`B0Vr)R(6t#uQnalcz#b|A*lIJY4uXP zrgAX7zkmA*FBDna{>zK^lbjSk^k10!cRy#0PrnvtaaDd|%RQ6$^$FCf0UNSO_AIpM z;o^+nQ5)dCopYrn7$jEw7G?oU%7p2*XC{A$;Q%vSc1ueF&p(+CVWW4rB$t#xlv5ED zxE@(wVx^r-y2h71M%cl;WOJdalk%yCFEwFSuSf+Apzwl$c-RuQ89K*XABbn&x%wtQ)F1OLVMhe z%y1kyjQRm>b92Ca`rHI^|G#o+jk;vgo#>p61Ks$2{eKU%8&*3vr;b(*7Kk-}{jMC= zFxw98l0zL2UYZuXJ@?FNU}L$w$jAi0eA<-_=3!4`QG1_r{B810&h){dtv*^z!qM!q zcYZlLJ}r@2-nra_=hp>(0LjdEcpLHXeIXrFOa9ln`ZV5Gg7>s_fC|sG+s7IoKI7*5 z693S@F4c-f%f8V8#cn5H+~a_%Ub9;8mk&dq+I^sJJp-^pLpx#tjs+Fj?m$&vUuMN1 zjC`LF2gHd=jPU^YbdC6~(^=(1YAI~ZW~;?sb@xFVe2K!+!b*#U-EZUx9b3X)Oh-KcU#;&}bAw!tQfU^F=#q1p zuSkN?(@E~=8Jcj6+N9X^&7B;Mh}JM4`m=D_b-2%?p!H*$WJ1NZfnZ`M2Ly$$lNIKa zJ#!okp4Aq86?ErAS=2a+z5+5gr;%7!vy}&$M=Y@FO8<)F3$lwio}Bf9pDt z3+Q&{d;jsWOcVJ=ea^{UVWeR;)VFu~o*Z|(ky-urB4bXC?@iq0mXp2q!yi#o)GCLG zm#Oy@LNsHSgB;4j_Zckh1Iwey=zkUHgVBelkJz)n*%gloZM>}mtk_T~R>T&HfC#I8aBjg?7c!y?6?9YbX+fIXLn5pj^_p&e9 zsO3NJ4A77u5Db$=X}Lib(nHVOX%VVW)IaVDsH6?P~hYOm!%EAl~uW$BjdQ&{30Lwm%CP*=3W4+It|#RAP`WquAZH56Q|t%ZD@Er z$&O^rs4ry-C#xB#o)UEvHO7Us-mNdtbqf`4CAOXGxh1^OE&6J)fx zhdhG#^0YUdt#avqjSqI85y=qIH0v)2GU-_daiHo90@~wQaN8KGe%b$1)0ohcuylI`yjl$LYUFI~Kv&Z<5IHaJy zjy40HXBE&Dq)H+e{KeUKTLHmu@qS6mVH$#S>4{NKblUt5ruN38ohW7njz?2RjXDRP zUH91u+-3j$wM3mmp~C^X9l!) z3y{o?0Wnj{gKJv$K32u5-vqh`tJ-3LdawaGPvI&&;c;tWV+&!j;N}I$3^b0-!y^(H zsGPp|IH675{@aASt;r-KqRWVFP|G<+@_mDP>ZkLX-B}l9R?pLTz~p?Cfc~XS!OdPh z@caPyDGqeHL_A&deHFpt?5~)WSU4==$>wn5<7f>TQ3HeffZNxQ{py4)Mm}FPsF-f)W+`TfqWDj__0wT6)fH>dEApyc!g$yPm zB6L*{fx8kLufD_%lAwbd?{0K<_Eqoh@4rX+Su`c9SU^kfOO*h1VICk}sL(|iKj^cVjV2pi-Vw>ah3i8fEi)-_J(Q{d_3!|5Rj8wtX zz&A5%LAL;)7Zqq5Xh0_w6&ef#7#RCwObTO7-fON(jii(6^l2(>Qm!=w5qPg7q`QTnDf_ARq@Ow}f_@c$39fkH-u1 z7qH=-9gof$at8#jL*~OZ#hNNreHq&G${@5I)~#f6&(lX!^6SN}T$%6i?J<-p{K6-x zQ>!hH>7;@)fW@rDKmZi>jY^Z}YrLbFvlPnvNY3eRgCBP;?8Hz^Zc)uh|8Q=R!s+M; zVOZz|q`QJ#S|@z|$B3+V-Z@zE!!U=pUzByvnmD1N@HL$7Kc#XR9Mie!z3lPA9 zXE;P+et}?xu;n{GKBt=+CMoap(41eM;nMcTJ_7wD8obW08m)WOCD4oap_8b*hz@0exfyuW(pF!NqUGk* z#rmn8Jvt8#izWU$k2#(B-xKgWEhWvcDq6posq?!#h?(|nvyJ(}| zy7XxPHgi5qv)&KmTAx4CFsRHVv@1Y6>I`4zSR;Q*M^uqG;tiV$_)Ncet~%TH4@28e zO&|ykc6N#1T5gW$%fOItSwbuZ~F#KZSP}Hu&1u7$@0yoSBPs$v)N2@ikr8 zQ&#rAffoxAWbvgl$M>JS81M1QZAO`xE|zpo@7)>x!8!W`Gi1LnGv6Sa*X664aRc3> zzr8T8>~_9>lh9l*%-jhgm0T6mW8Xb=mGqG~r7Cxu(y#fkVeGvt`{E6fDvKGqI4Wi= z47vV+Aq(QM@^RL(T21Fy8KJ(Cl zSWIM1N)1)*uY`pH64*;~v{U0X<5x^Z=SM=e^@?BH-`QYM6ZP|pb5;f-5{r2--@aKz z*TWv2gJt?i%~5&uU!i*X9 zDJff_)}QVZZ(n?8ASM8lPclymwZnBr8X>RbEJQjFH zupD+N=F9ZwnUJ$R4%`$Bg?HErdOGx2FkG|EIl@+Tit1=$QGvMIi08#Rw(rb>otQj% z@hz7C+8@KbR|pNryU$YY$*EtEau?zJxvHQ90hg6p=lBMJD9C4tfC%pU*Ihc{qWYSMLxOY zwh7oc?$@Hkoy%ZO?%&&h>f=Dq-ZzfKaOUJWJ#00nvQYFg1Lu7 z*#X=Ri{Xg^r=X`mqzF`M?EG|x7UwWcb5dpmJ+5DJvhP(W&rH3cUO^rvw?&TUn+s9~ zDSJN^=XZSOkZ>K0MEf|024k+#=t()A%hjE?HSbDeje`{C(z`!7EoE(3jkUNBA!-8% ztyEvyolCRagE_$>FqZFg(@EU(VN&Klj`fTv=yi)_D#f0QLsUQbW=^_#P0?q#S-61~n@apXh3GF#C#8=)x0X0%ih zxiTVLvrmE5_>7^(db7Y(M91d(U;q6ZM~sD?<+Q`^I-ElAasbjw2Qu&LO3dG?iwii$93#dOopSTz zi3v8s#y8v5CfZrR&Pj|-)Cl_^GJNrq|7gloSnwUTHeQH1$$Xw zMZlG5`Iu+ZXs|Ix{Te5FPSx%h7{41e-o%ipV0D8h!cE z;^%a2t8@KooAzRsgHfD0sY><@?1z)xCc70K{$yi=v0isKr_`S?a((LMS9qE7-R#SM zUd6=O*cHGC?vLW0!vWlRKZs!jB^lOF)GEr+3EFz&m3S;N!CL&&4P;z?ULH}}MpV`d zX00M@VO+QN>S{mEo$9C(yjtm{3rI@04~;)jy|h&IDd`8YFj3d&wk;AmTX*+70*R`k zw;Z>IG7uy5ScXg~On4D2__sRr-dRJD@Vg3Q1$mqo^lpy;dyUylo$k*4p!{Qo52HpK z{4`Rf%S*s$=X};xQ3xleM|NSi_t)mTBaWDHMFP8V#a74mUk>?DRC$O3SLPEmLN?1!}$-b7lPG}lk&cq#>Ri}x&tXpq9f z;ElgbWP;>sBwT=-58C!UO_WoI)C9VQQFIA?V;Mf_;g$!lXM#wF`-9PfIAoT!=!~_A z|L)(v_Uwzw4+Ve~6HjqMA=JqcdW3dSVxi5~htG^aQph>DIJ~g-xFW4_vT?Eih3W@U z(F>h#1oS!07{v9$vaC4cu<7rb&LgIH%2_LuimX8Kr#m03(W4E0v+Q-HkoG$ULjpX8 z;j#IE`x#*xcUL&cNDZnME9H{2usYsYP9(aEJrw)Czuxa;aKG4-){>W1Xy24xv4xKM zt(A0taqcQxJ~icBn-t5)J!YI}y?D3Q=b4y|#(XBg&^UPDAvNa|=%e>I%0ecPT8qaI z`b+jG1E*W$$6EwTOR{VO z2TCC-hYP1JwNmGqc2xz)|L^p96bW-Y&<8UZ%(o-k(o-AOJ4dIV5a6e
      h~fbcwd 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 z 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

      v3%`E>9=Zh*KBI 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

      u{J5YXGiiE3|rb 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

      j52gP4H@eko)PB;lFxpm_CV%%) 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ΊJ=wfgU9eO1mknO1uNWQvzCsiZ)$vBwV`gS% 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 z

      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

      T##FF0 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

        &=>FP=z?!jDc7%9pain%NtRKZCcE)USjv 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%0A-P%V%%S`#Nk#RX{!Ke$!;Js|8=@ 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 r>H_2*+XcuAZMPzSDix~bG$QwY`+l46 zt%}@}6p2ugFLbgzVHQ!;!c|*_yc!p6-=oXJ@5!+KzHN~sDQ%`r@gurXN+tG+V$Vl$ zCOQGj^3H~wtz%6d zRz6TIF^S(IJbl4TEYSH%s%;^|SzskX&a1r5-TwgDeY299cA=#f^JQQOUPF;kP3Db? zsD;M#l?|@IX`254a06l(WuEg+c+8TE$_>BEk0oOg{4IxZT0n0nj|`(clFGAUF(AoS z@3q+J?A`9{Z4aZ}s&e$rU(|g^FBP=C1}Sm!@I3xK(N8Rhv%`w5<&ozVBGWR*x|+)F zXp_8fm%8EAA4Ju&CC10xF|ek2O3474RsskbQjs!;+WQojOBSS_m1t?-dM+NS+Cr;o z*r=l`4de_=4Dv=Ljw3S7D)3};PQicafKpuW)g{&5)9jghi&w?N7_7N7WyKna5=2wBXHB-st-7s_>b50~(7Wl~=dnE- z?8fXVJ25bI{d-A@M|wF2$JAS{>G}?flzT@& z%6YrWSuwHV)$tLcIN7Njl1uxcHhD^eB8Imyjr&U#je-4Ool{I2UazcW>pjPdD#Y(P zmRRFhmwaYP96W+okH{nT_~a_#nT3(z#}9}90E)*5nP-v_XPvMnOa2^FLtlR9-_ne- zW$FH6#gt~i$HyE=3X4pdlF(Ce7TY%!>Dq^HN2m7=qp9oJI)1ByqHf+XVlG1E1_VL+$}$ntM^gF34)RA@80d(XQ&yH{;XThGYM*(edr&dhvwD+NVnZwzP)c;bs{ zM;!=46&sDR^c?L&7TO6U60XH79Ex@qa&{mFhX9`__JmbJp_ugFqV|TX6z?8JJdY7_ z5lYvvF(+-t!HE>yAHLU-(wSLgtvmX3SBLntjm>#JN@NOaM~pBa-cEkpukzT1pl9^DoCo7z5?k10vYKryLfA9uQA z^di{C;PSfVx@7v3eNWRnF9Wt$E41~u?kq{nu+Nh4BwiAwnM6&w$)*M!(Vv2NuW^I4 z?K4SD1@dyTBx#JSAj4P#8DesqT{25-THOA_yMgy|ZgAE;J=F5_jC~hPLo}+g0gNR` zoHS_dC+(7`WO6PwP^FQ8-Mn=UX}yQuy~PfG9-D^P@@T~az|4G%!dHxV;k9`$X(2!l z$X8WjZ+RJG%ugg5Bdk0wGPYd1-B9a(U9BFbMPpEPGudR>*Swbk+G5jEvx?BXuFQI4 z+gffHZcN&~nWyX84z#r_1=s5|yr>cUGJuV2vXZ|Fb`=}g8linJ(({e0rkAU0I;U-y z$@-l?I&JU_bx9g*B~l(Z*buAxpqFcTBzKjhexlyi*L8l%T#P+&bK=U!$c(5V*JCWJ zQM_zIs3NxeKxQRoVg}%~B8C&EJmfQfFn5g)(@Rh*?I~1nywPdW*2NzV$Oa zI!}0N!gb9|h_y)GM4ch|WHAhwqbPtFqKjpP+R{qw+xm`sPrJzO1yZtP>GCm2Af6+( zbRmNRBz>WXH@A2AvJLfTJudD2J0~|)%9k0RA3GW2(@+mHK_hu2B~^v_2>qZLm)H

        Tapcd#RJ@_PD+{Tlwe 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

      1. G^$;99k}&r(k3(F-0a^a!T2gxDJl* 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
        *WFwLM(VlvAlW32 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≫^!M>8q|K0 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§nttTp!WSQs5tnVeke z^P{9Go)uqOf3nuA7Kcy{lv`pdx$S;1p{oPfAV!-xjStIK2ir|i)2vrc)+I8mp|g_8 zOIaY(^_`=1kaE+q4?t^vNrQyoQyO9SVjn{@0MTebL1p>kom?kD;}FZQEsu(&Lu2L& z@mY@h=h|oW?Dgd+UqSah^pCWODvP@L-AmvY40<++mhdXLdWDsarAy7>02No?#-p{8 zv$?(MSA`DMTzSIzVLoKyG;MyxR~5N$r--2S*`vFY)$6tDn~~OHr3UV~o~p2A1z6$sQInNd*ot>}?$&S& z0^eHS#;1iyGju|_Yo6T)wd9Ix-UV)6{2s?EU!ltCB6sh|G<>|A7FtmT@-_u?!Q)sjU34L5UM8} zgFf;^opBEc@=pU7V0YbGRwT#{&O=&AU9N6@NR+?JMqp%{Ledax4z|_V|Msz=HEWL5 zuHEg3=2vaX*^vG(&eF-QGgZXXK#+%?9d9Zf)r)m(cc8-Q(U0oUGM~oL)%x1mwX=fh zb?MVfbyjA7X&=0VYhZTk8QYR#$`^&_=$(>M^-z|iGJnG_=>4{>&Dm{S{U`u-l*&60 z3mMxNFNjO3Q$68L(+-*it*1qTh43~qnrxPB=VasuIJ}9j`b3J z@;Wnlb|rLM1&l0<1Kz9zQ
      2. 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

        M67&JD2QHf6zE~(3t*U-4Y~$A)eb?B|`_c zV*6kvrCEq&s^hXw$;F6x89%~zyGvc=LkCQK5}9Ib`3qN?v&81fz8_2&3P=Ezt{29g zKGJ9HW-8ud%Psbw!B)3y>aL`yPPCU4aD%*3BSTnJ+s$7u=5k039i0Kw!L&1t0ad2w z)nI43bsq`+V~LM{aBE5#!u)Sw*;=$rg+v#=lH}h>N+Oe7>K0M=00z-@hgJc*!%fY= zd8#)Gs;Um(CmXpRQtoPZ4cp^JZ8*jeR*CxV1Zd0akCTDeQpx-;LUwNbbFzxzTTeL; z+1}c3T{rrfG?o9VQ4kg=qieyu-8<9L)Kh?Hmx#K%X4ab!9C(G|uZuQ4!q$dSwfLsj zyUY0{uRND=mwfLH8l3G4eF=+djPzWTZpqEj9mkY^hzCKS28*SS$R_=oYKFcY$vL;~ zu^P&$my^DJ`~X0U!|}g+oTNVj^^U)GF&z(P4iIw|SPr~R2|kMqJ_QAT4&qs9UqHLp z9;g$;z~1oQTdNPB2wffCjp*4%YC8PkqChcCbQlCKd{X1g4c;JRd`HPB{JZWXX)0bm z#PD}S4~N;fx>p5|?JCRS5GcKh$RjYP^|1$KorBG%-7a6Z|?{>2UIlc|@wmg*50y)A8S-+^41Jt81qS!-xMaLu#%0r^A{^7Oass~G1AyS!y6-LILRg-$48$X1XtnrWQDNhN z71tuLZbse6QZRc4SFd~~WfOBJWxg^8~R z?m7|Jbou$D3{qc~R=S>b(JnO51Zfa|u3U#^4u^fLsP8 zI_XQ|CBoLw$*7snRGQwc`hjE&#FX#8(j@!T?)%f_yEOj6aDr@G+yeqL4=P6Q$mfhr z8y03po#U%5npPgJghWM@(n^R(rtGHJFl)$>0RD?KjI?zLdoDs>|4ZErAC88APn-Co zsw5tJZ%I$bF511y_k_q{?k+7Y?uW}F7iU;S0X7g5#mbIHq;1ak0HyY~i?~>}cuUu( z6=oto1XUfmOnkYd`mca?u$B&T9$E;a_1R+~Nwf;$iVwn#Fy+^`PnqN+=FbpB4U zo!7=Z0wE>J-TFOa$Fw})AUIyC<#N*4mi(Q@+N+-k>E=V zPCqZ4Y{U>BipPxms0XG#t;qd0>*mF{(YOqH1JY}Z2X*CLvQ2{7*h;OQhy4mOxKKA5 zd-%R%BlCNO0~sBq@5=V6utjiSNwB_84_u`oW&Y{s5>9=#Zic-4mfc{cD+9tIKmM*= z=M7}2VVl|4K&i@iHS_jv{9``{eh>6r1A1)0_FoLMyfqcHPf;eqi1FmaGi!9#U`X@f zZw>p;dt-1PhqK9(pNV5wpELb%+IT1jek(${FsjQtvNp1YGp!REBSB+nt`My+5UFf{ zYbsTlu=*S+%uc9B^cyV6?$V0!hjVz_EuRKW;55desK9lDjE7rvr(eJmqq-dtu)vhp z&uDTV(n10ATf>jSAo5+J1^8(L7SXu)55?zGKGwIM=^or0hfkYiX3rME` zrnBIlRR`N>e%6aM2oSA;$edNymCT-A$=7YG7_1I0o^hWoYEfHzuRh=X!)9qTuwJi( zoyJgXzq0@Ug&Djn$m#&SiF=kq_BaK{(mR9@r6w3#B~!4ZYNXm~UP@i4N%xtqCx_=K z6aD&=y<&{8l`uoRTo6yea;%J8Z3i|`a+#5l=2V;NsAt+;mGJwixYnmwmR=&#%7)+y zF!YRbLXLDLF#W%ZI&S3xpCbY>T$pKkL#S;ie;0syOTk(6LB(AoC*HAE>x56tc70CS zU7>W?pEoSxbh;m4#oda*2GYEz^jF3lL{l=!nc;t=`ztCh{B8TuTZ(Ne!19pkHX>1AzOU3W#TVo_lstP#1#q;8J`r{5VF4jrd z=v_rgW<8tRt<1F@uu4di)IR`enTGgK&x=+4cjH-4xI2HerF(O8j%2Zb2 zs+36JFx>Y}%YQ%ULPb86>XBT)vOzm-i`QjImLP;=QBjC_y8-(xwlGh-#PV5u!iNEtXuoP^D&5iw3dXvbE+oZ+%66|ngvkp7}5yXh(3h7eB z*7@1q13un;4krEc8{TyLE%*BgN+IRVQ~frcW&~&E`8|NICTE?^_HuMhp*y6=#t?4i zn4SM=)m!x073yleqr~*2-QFLyPCN8WC^;iJG*N zN6)48bCv$IYi$eRL3JO(o6Y8R9PftD4>T(=u-}KRe3WE2c&r%jX4sS&`sE{sNksoD zmcfrp-t8Z0;SqQeE2;I^JIH!yJ$~1)ZDpkaiATub2ed;aA+T2sw_ZLiOfE&Fj zoz*WzLwF>k5A1gud0eqv@`u__q zy?U=Ienj*QUgu;=PydWPc?L+wi0jOvKvnSd`S2S0-WVxT>>Nzdu}IR@o4i_Ez{eo-8NwK8m>lzS%U@UHdm^~ zJpl9QOoX)07{wl{`hGTj^EZQ$WloSx$h)y0*)@HT>WJK;0bIjOksO7GAM1H~FgxoY z7apG_T~P9etv5A>Ul@awfLkWUt2ihD!Y?~h{C{%9wk0in5Km7dXfcFuIwJwWz5)bE zq8~ufc0%7{kEMQcFU+g0i)B1hny0MVh}Gx*^57A)0C=ZJ_{Ng8+;0kImpJX}Q=!^IrP`KV{5^(EnRj{#K- zf%9i(hFyY7@*a1;ssq+Jvn1<}5eD@QUzPZJXo;&2DuJMoG*F;!;{3Pi>~c9|E<-QN z@=(>=SG!{$9xR+YQ=Y7}l)u@T`oLox2QjeneF{)93+QM224lmAbQ&w=h{8yAbJZdS ziW>#Kw#TXXGyNFJy($xU;<_YJj0$Pnle(}!1vlV%RjFW}UN3AbwLi&tpDGTR5Yf8U zEV^lBxxjPRUwGEbWW#mkUfn6a;1hLDVXdnWxA$5aJA~*i<(KWkijMr=uA{)!`IzqB z`bO`pPZxbl@9aSZN4NQ!geOVoXG_l0R{`NB*!_2DOSv#TpEo{Ld*jGgi_S zXia1N=)v;bz{eF?@f)qxQH`k+O0$73DaNoL^j-VlCs$?1L0gF?0Y5J)5BoZ2zFIIQ z4f#S48dv_>?<6#4-jpjPDtuwf*{+n66q^ym`>GR)NAOT0mXf~Kt@Y1T)8BnJLS5{drw^ymFG9F!t96S9%_6;EzoG0dBs%Ahp)*>Ipe}zk^lR{{yW4SCtE~db{|2Sv@=Gn5L>O-wfmIdzT8w2P)b`(=B3 zSI2_%>HG{)>mdLNH%+jya40b>s!D0lJ!V>tV|-k2OoAanqU|x7daTHwF;A7|=#P;J zKtL&FO2E;1IghBsplsv;{@m!C(J7Y4x_2&JRPnOi&N=Bm?iRG0TKI%jO zJ`t)*-?EK%SR6loQueCzxN~7~u&=eY_TlU8xo4?N$z+_4;id1YMG+!|hCgS7?OFi2n`L2K9Gx{`PNZ3T%gYvfRFsm}`Ih(J1Tm_!*CF<}4f7;Nh z1YsO^k4h1qo&Nr4sF`twpuXO2>}e{V*l{yv86i}4@H{wmxWky!kR#m#KK?(es(R2d zTm`IwNIAVYIJv}WVj@F)xQxHm+$>*->;=G}QcnY^i>^Edcy}}XvYk>%+&X({niO|P z&z*e1eYBFZN9)*7@fUN_K*rp6(U+ zply>uOG*Zj`OAQ7Z}97A=HF4~(E@P-6xz}sB|jx%#Q65?HiWPyR38o#43F3%uiWz0?1}}ed}*0FHR@hrQ*2;wNFMySwpeNR z2b_Z9x=5YOexAU+2Mu?W83%Ds-mC_k3QH-&;;*#i!t^INvEJR;SFq;ow&T)u&7709 zmM`q;zNof%76nSKbwg~@>`2tkcC0EMA4Yxf;nPRILznvsLB&UE_94-g^`(m9o|i`d zbP=`m{9OdJ#>C?5%+=u)+)ObSV5@gRBpCI6F=CZ$uL^$oam=qIy6cHqf7!qtt?ieF zagrZyFX$8{dTF*o%&I(~gh3!Z{H)Vm4gvY*9=AX%6D}UwHQN)uHZAmQr{6&iQ9JjRGKe)uj z3q2XD&jBT6xsQLct33-Nqu^Twy1dM#)3LVyFtp)md|u*ftVA{Y?ZZGLVlj?SjHM-X z9?ipQHM9zymME^9C&{ElalD;IA-gF{~l(+T@Zq1~N+vq_bdZ$8}vxQYM)I5|b7 z#>{~QSa)L%(!R8x-N9*0@BM*A9;TEtqy>-l&6~Wa|Ij@p?RxJ{SOjp;CU1_nyKrA# z>KZgR8J%uQimA}w2KGsro^Ra)$Q!qtT52W}-;~uXz014Z&#uTVruryQEv_Y4#+5+= zc5;;5w09jl>SkfE2Q!84-TuCf)6v0v_O#R04zigS? zYh+B`@nYNqJ_OvV(amJPODG02fN?)n#pJ#u4H@#!DUb`C@c=vcXGL*(84cC+CsV!! zTz?d%4ba*@Kk!h^ux^|_oJiiGv$K-Y5eN3^F~K%MK3_|nzXNmJmUkDRE9Ad{iW;VN zYrv>g=Qbl+pW!d7pId>fsY7e+1l$-GmtdvpHZKbeQ>O6^SAk<4iEJyIE2-D{(QGnb z|6?Wu4zO@2Gf=V#!1h>FZnun<8?FJ9p8$LO0*}OcGe1$xAzb|5vYok#TtAg8?)(`I zKn}our^T$eR?iCVE-$#hMgd-RlK+%?=($WZd1R1mpBBx_VAc09WLe7hCP$*)H0hs% zUVPPJQF4qcqMZ?Auf)8c4z#YhJ_r#Ux(A%=jFD^5ne#Y1d_1Xj;EEI-d_R&kPrXgC zmfpNIW;`kI{xNDA_sEa;#W<3pI@V)dd>a_C#gO>V&_91z47|wA$vgoRlkS$ zMJDNG>YYBZ?4(8Pys^jLYo=q#l%79r;{%V4;vH5UJ(XNYt{yu)IXc(-GR#eBJ1C6D zw?veAEJbofZgQ-$0&fX~%UnAD*5#qe!4O6o&D~Mv5g=4xUq8H!2Ys&+m{~Z~{=@-g z|4OPO&6u>$Hgq-uuUJe!sCtoVx3p#vtHdKEZMyNB5X;QYhphsxoNLFEfM1I2NDPV0 z$*LW|Ez2X6`)BA^Q05@&3?k1cU6pn$e1;u|;pk6La$LAzSXb~!<+R@9fQ zi`vVRW@9^A?#{vJLT@%RwtQ*cSkCQ$hwyPsM z^nBtfdj;w1iEo!f*L-joq%P4o3xgRZy`sA#@hWdOTwMboG!?1#0hklEY zjEKVxDGEF)w>50~M4x&wuuj25{XJvjg(Yr67(C8xwzTIg8)(MEdJy<{h3aC9-RvAp zQa`ix@nhe5r&doe$qY)`2j>9w%y3tuZZL4``4U09HXVc}SEe7}e-DTVi^Uu(9N$qv zUGp#ohj&PAXlqJu2qeTfWzJ9rJ$PgsoLd!y9a)>7&#a^IG4DObuBpRG($7Q(Qy@sY zF0`n#R*E-&D~ACV3d7AU-UFOS@ZJO7Qwl8XidO%uBox^CHMG@i%4Q1DJDtOv#yB9m zMu@+5E{n@Yh{{opCUR@j`Y}Z#l$;!KaQ_E!ZyD8A9CrDJQlKqRTHK*U3x!hLr7iAm z!HSdO?i30X4Ni-M;u0Xm-QAr)aCZqBv^VcNvS#LfoVjy9WM$>!$x6<7p1ps2|J^-T zULHE|wP@LCu;WsFj(dQpM}Jt$$m*I65_5=T{qyAiw-%L)m2E9ICUYK*rD@l@SG_V4h*9zH&>q60 z{Pr=D2|vS0$BQG4$)oh)sd>MmQE!>exPX>c$V~Tw>QvflkMuy6Vf;)Cn=NNkrh8(T zlmS~Y_?NC&;Sv_Pd5`UY8~-Ms_X3@1R<(Qq|B;r!ka5RpTMr$=$83^wd&%2I!oB_s z>2Z6schTcjHPpPrH|@vMbQVCbSMZQyk-{^Ev&o2w`hKfZuU|i-v+rd6%SNYNG2Lsw zRd$?LU42MYEyyyN;pwWQDUb2|O#~AOA+UqthkULTgP_jS>FWQ%i81wx>W<&7lm@Wx z$mNd){&1uAJ-<=IK9Gxa8vS!iq)=Y|Tn7)M53LUF681q?sw=s~`bAT2;Y#1kgG5u> zdzhzUS|k`G$!tnyb-y0d%wbF)Szhp21&M+;2!b4HVj%RBX55Qiv_rpMS#GLNBzZDq z)Bd`E;f5jC=*zue)$EB#x~@Px6vVOGSno#Q%T_rDIOXK=+Uhn=wFTgZw1mClG9)iA z?Bd#|eK%uPSrz;Fx%19w?pB0If{!%~j?aaNM6meln#S|IJO9a$c;fSzEYyC;E!?|c zFGW}^VSaD6!qBjoQI>Gk;!?r@;2)YK?EZt)WA&$*WK?3}_kDjmm+Y`-Ppw5KC;ls1 zrepoH=1nfjQDeH!o_}^yt`OWzyy|)qiJj=szt&2B|2a{y$(~3y8EbUqA}Y?sZ0rU@5zkV`jwGjchr0ztjf2!4lFnx zYa7T`BzUP;=F_@;X6Oiv9G|@8(CxZrK2U0~VYEcd0m5ikgYh-1lDI?CYToa^Dsw60 zlWo(yj!ID2yReo&9qVLY=lFVU0{Ji$@27EK?QH;{G&G zBO|xjR2y7T19b+_9JtsTe+VWSlJe_(PVAF-mev0F1Ky%r_9HD*g6DknO=q(>_ljj6 zJmKh!hvQx-8(|dHWKX3Mw&kNtQo;^Ky`m@+W-ZU{`VYWVw5~T0`y1a-L=8Tv`_zdA z6NC)?EAv4P60K0sE**?9quy6ec8TKdzm8pXy`OI6#zevtxrm zYAS1sWP*L7P7-vgX4Tbof2$*BXNkj}C9%nbU`Q+fR|qtEFjD`gHYQ_Y5Eh4bYE-jD zyjPgwv+ZG>_IE0Qvz{z_?Q~f_fMYA<%inn4PMkbKqJN@W6sczdQSxQWl7Bncvmcpn z0^b;mwzBw+NRF{5G&~>@+v!vd_TBt7N9$!=C23BaJNPeK(@@}eW%4@kICn?5m1U}R^Jj_ zTtIuc3tBA|_0@54iQN+ww9#CFnSSZ6`0#MPg%-|T`!s|`%&zk|_^S||0pMB!e}DJ8 zCqJM($KIcxM1v>tw2a-j6TECrdpXeq3&!|xJC1!FogaMC1<$e3FsJ!JFZpJN5H~eE+ zm6QnbfQBafi~aJX8xPT&3HE`c;E=G{c8Jl|vPrp5r8TE|lQTDX9aG>NDvk=nsdwpQ z!-fw_N5hX8Xh4l9F+0b5FHYyA%35zv*Dis6oXwFN-QTt;jbU~EG-0VAj+yB!55Zm) zG1WiUqPo+|fYYP^g41q(`*Y)wi1Nj_KrbyzsmI-3oORzBwJrp3EIZ6Ly;#jHx4D{+ z@402@v*cqn#)`VMcUzP=bAI}WdA5Cm*Mj+y;NTmYPvCX& z2k{ybHkq{M*bL^EwVZ`jdFAMpMst!Cmf;|(zpi-WH_r!MYDaD8^qzcYy^_%8kdWb;{{P^v@&?t&||ZND#Q{H`}1WDFgD`ebOxZD~*0 zSg`%?%FzX;_|kJUG;|$@3hDMVm`!#R zNKzL)51wm(Q9idO1;F$5g+VtTR{*y`|3ZfqS)bo*!`m z^a*@!7UX6r8N$AOZM5-|trbmO)h4GMTO0ZZs0Q)K*87c<^_7zo92gln)4jZaCRO?y z-wM4=Tm2R$K+aBvBc6-4IIhc=|7QZ8oz4LHlv0tY{)u7(_9j>m5a^YqG|TJL@^HTv zFjdz&7d9?Y2JqnPzgLUcMuEypEkmARp31H1%kLfH+jSzMO5zV#FT+Tba? zf?r+b1(j2D!s|VI+pyOal6chPFJz2)>MB`3(=5X`K=kmW%Sng+)j3H!&=-3N(&t#_ zd+E9Mu3l=T_{>i_I+o=%30-AyBx`xqPUrtRtF;;-%MSWBS}X+J{{fVo&!edw+V4M3 zAzE`_yr}%sWmV$d#`3r#KATifubjG5OM@sjO~k&S7#6?_C{RW-H{@(o9t8zx9q$3L z3k&vzwc&|H^NR+<&#|nciy7T}eJ-iN2L1&__H!=IlC*c0>n0bb-zy^fkVc1|h_Ahy z36@Xk{Ak#IULmR%hZkLAd85P(&0hXgrQ5NmH(xPtj>eP@P702 zbqZdB*PqQfx&p0@>Qeeg&U$x_|I#$Hi}%gx*69ur0v((>{>svan5gM5;x! z0U@K44O}f-kOx>CfzxV8anEC-qAp1d3vMPM_)%71)c}Gn1hu;5naS{+742iIZuB_r z8yJOESX>z-XOMY}&AyA{8iR=uw5jXt{vlwQX$7F{Zg)q_J-rK|)W6~)Ub(1JHPA>N zAfUGY09B)*SVLluW&ZA@0dgDKQIEHxiKwqFVUfV1Da2Sq{2wn9>C>LV`D%Z0DlLX> zOA60_0BLf;wkcT^z|HkPJ75JeQhV)PnUbqjx;(|;p0`5=iH`y$6?^>w5ML7bw6vtZGE$i zW4N}$V-a1(h!SZ>oDt$w`X6bM0lN$tFI6N3=?Mz;%}yOVQv~9HBrWx?YfqTHzsp?o z11x;4X&b0@{i&V12&D5*twZk+Xa%jI)jPv(@39z_JoL=J!d>JT=G}J%E;p_MrV!!Wi zr5+h=Mx2vcXkx-s^*4_D#bmdyxGDSZzb&sJswDYLXO+PO2Iq*1t5<17iAu0y1E%>G zMsb)KFrX(aSCp>6#-o+E#)x#nyrSW!2>bo;W;D%C!(qTLSVo$ui#+VlBW08P>79ZV zxrhZ_P<+q>dld%D@Veg$$wc9ynYN>E0Np8`7-+RFtj0+G#57??W#u}%W{v@8MhiwK z)nkM5Tr&w56$$uYey4pn^jNwqTpxWKRDz8@kjA6OV_LVsPw;;PO*ENO1mD_P#WTcU z>o2Zi?90RWkg46Ux3+F=1dY7VxT z5-&E(qGALrq2eK&Yx}7B;*qnS`;|pIBd;7I#cr}xWgfv49aa@DrTahDe@Wn|K#eEb zB8~7gZ;n0PZ#5#B!rBbmQgi+^v zxL(BkCkmR&?9A?MK@j-Z;=Pm_;fEq4wD1RMDo*z-H<%Or!Z`^^(8I&J0h^eD8hB?W z&RlH(#8NC2?d5Tf9TT{WobNdvwlL^;h1 z_chH(rC0cp!V7A!J z)!t8Ujc8%-ZX+_Eb(`lsuoqfJNJUVtVx8k;t7j1OWqmWf>HSlvA;7`;YSDgaD;gsR z(6`DSR>1i&wW;`$oRbb_9CN^FXkUY#?=q5GMxTw?c6olEEi&HK)%l(u`eUMKjGF77 z%^&A8T=cWkUt0tFks(41x6c(W&M6K-)(sbYoNTqli_4k%TPO3=;18Fm%nxDTOuA_q zDyA58EYq|JXg4Dk%)sfTznswxIp4%F{KZS~-8e*Vp`O^xF zs;PeM1TMR#9rPrbVRrWb@xn+peO{Koo=#bBvh`D^CRJt_BxL+F+V=F}XBTVC zo8MLOWHElN5(Xw)Q<#0hkSwR1E2#c{>238{B}cQnE#W~`qYl;I(}&>wUMG6va()Zf z%)XZ$cTdsF`!x@&Xph|p@^0^PySO+oCU_Ddqv}(2B^t|~A~-m3P<%AI*4*k`tr>Nk z9+){+2#SZdGVB_VY^ErkEiLsrAs33?5IE_@VbCUT!fAPtG^wGRlW&`ye#BI5-W1ac zNiJuKhcN677%s~ady$X0E0TFF<7#$gcMWD*Q!BMBryM+Zi0K@xKWq(-khG?xbc~m} zP}Fe~-5UY!**_@HK6<3+aw~0CiMYt~?My9kNzp&W%%BYTT`cf>;KYcSI+J(v(mE!s zGe#6xJRXx%eQ>^b6+`=ARgZOdRerpTShm5ygzXu#=i2>p6M;^=Z~jzl_oR)lVu$7% z;np&#klV2@*Z|VdLZl{O0L4pCvdD6fy}1YF{a+B@K79(72fUQ$OBML}KG#3KN@?X{ z*!gB0M+m9g`C)wpTN%I9@)B3(PP#I-T=FIrNzvEJzKP0b^MNCfAkt$=w|Jh#=l;t@&BPnxroP$tH6I=tttZ7?P4?!iObcK*Sy&Hxz zDqzbul>SLSt`D2Vqa zB|a<{8v@Ha#&{EfmlV1EI`FhxvT8#L&hq|q(fX?M*VFLqIRgVksGJt5D4}pxF^qr8 z{R30*JKD=RTitp0uZ!?HnXIbdh?@Y*=-X{(?IX~mBIpJZ3M#Dr`HTX)dczmW5P>QG zibgp8q9l#x)T^B(S|@X6`YjGtRlGq4&IqlzZ`22>eeio#$`K(5$4Ym!%d>v~F)5l7 zWg^2hnf=Q^A}{WRKK?B8^VSjHZ+I!!R04R^mgMdo8@t|D;vZaBPe^Qpe^;kVw1A1)PtPg{{^vyNn~TRkNhP~AH)Hd}*X zp`eCMXBK}Orp!#*#11*g>7?mNB~*uX8&SSeHK*J0G@($DAjJWOhdt^`mNU#m%0zT^ZQt-wIgTgkSI}oI_cC!vJ9Mo22 z>S>~W!$aG@epHz@4;(rX6OKf(K60Xdl5#i}^7~*CA<rE!7D~K5z%@PEifR+)s6)mSfPu85b#`n~3>li%5pR zEK*a*aK)M~+{ZShHtEduA>8A1-K``olj}*cypfd5VgkkeICJsQS0io(X^o=tGHQv@ z$!Vg5L&o;=X+So-#3TLN@Sn$gzF8|uy_0YKepQ`)KLBf@bqiGE)N%RyWAz*e^GAi4 z4vm-3N+R6PO(}P}jmourg+9dy`RY54@26b|BI@tiE-RsbMqIAW-L~thZ#u|FyftHf zU)LKvPVzV8eGBAfpBRZt?EPs`3%s36)EkFwXy`gxhX`{r2QZcgMi!H_C5Y9pJkH^#R7Q(g_! zo5$2mMwIBn0X;yh>A*RNPQ74NOp!u4Uis1q0vhGf+~l!mOihpDU=@I*oN(QW{S?>P!G}FnVg411NVeF#Cj=&CCLybRG3eU$ zO~jWU=RClekbP{!i&B%HkeAJ;_RCrLGwVxy-B{OomfCvMBov}oJFzWnYM+ z*<(!0%NS5+AQ^ok@T~vyW!W<{O6R0i;IBhOR`z>ZZ)B9mP+f2#5tv-oJB!0tM{`!~ z4~ms9@aJQT%=>205^rI!W7bkRd8s$>V_3bz!Yn>y+Vv15e~g)BcT}w!s$G2`Rq$L$EM8z_8~#fPEd4s-?x4f^oZ`E_Z0 zbcOJas2gy~><(^eu0!1isxzf!e`P?yO>b$V#oCJARzmRm+${X@ebmaVZFl{w7&x{g zi$kwd9SWrj_LmK@IE=IlYDsX$jD7QV5h<_|!@XNSY{TO8Z#Lw3s}^Ufk{A-9zN$YS z34ja0KG$`Tev4S1cv}bgm#+6p&V7GrZf}qCAbrUiNqbGoy!RKvV*o>Crs&4JW~O%B z7w6YfLJ|>s7v+QL)V6r?#B#-yfRYj};+H`$J2RDn{^u?IzisRP$KEl=L~YkAX#cwD z{VMr{3B>b1lce|OlDhXVZlpl~NAWVn*oT_+{om8Qc2A1iAmacRI!=*H*ig31d@_jy zTzMVZFTeiYaiXtKUK2G0Y%N>q^#$2Pqx%{=@kNQ5q%$()G0N;1& z9})&LRfJ>ovE<9LVkE?gH!sdhB=1CN*%mVKlbSd9s)(F{hiXfPgj0sf^1DsaO#}(vAkRzKC@h2iwyg>m0PBx%7lw}tCT_g>;lCz%B<0`leUbWF*BNCBOW@m zuO_yqHX57ZIud+5)#hye!nDcT24xFOlYioalLyqCwG)ozUwjIae=eep!I9vLVKhyj z+QQ_zb*`key+p~qRRtfRbOMq)zDOAp>@ROpoDLs4*JUWT5v~g_tTob^ILfR4p%l3s zUU9)tzb`Un&xiT)x!vXK(*zw4F{lFEFJF7fz`m4%=iJ#?)x0d4AgxBG`L*hpBv|{j zWuOsmVtb>3%`sNrcXL%fiRRM68;yF(6K-SX-f`?=eYNa*`@}h`-1VZz1D$YETUuI} zGf;GQ=l=XuL4VUVD5p6ch^hz_Lz`?)J@_RV9NhyAD=>OmfT)ucU#3C@nslhc3W7yv zagdzv`aF=FH=-7Ln1-_!1Q-(`bN3aoGc#VG^~|kmsN*`uPP-S`>)xl4fe1_h_|MpE z!$wRYi*@z^e9h02)wQSCn|%%|AywhR)U546)g^Y$3$-1%m4*$(hYkfbxHuy@5e zs`licEd4u}9Y4MK+E@&^VPum#c_Fw-FWtt3t7r3K=OuPnbe z$m7%>`uFjjG|J?^tjI&`b6LnblRFV;i}kI#NW8e2J(jkB$)Y}&4!jpg5 z9PHF}-f^$&vASPB7T-c~4wMaw0Se6Kl(C*{*WOFK5$8e4s+&S*ua# z(eOStNUqj(87cJ)W_mmx( z0a6(NRjah&f}0*kE0kUVws}5+&1)K6gYpNU51Na+rFzZsjy!9o>5j$i5-Di8`HU)g zkdUge?x}8RfS>Aruz1GO$a6^uy4NE`co@@ZD$nw_wU%t?C@-6`880v2fQSZsSu zD&QQ!am-+o_jyUK1AP#^xq{|qTKwsnAfKp4yir?sRu~!NSp!<&V_J@3H)An7|KiKO z5q(RGakXb0KpxrAmn){=-a4&cfz_vCckfAl0$f+pn#pSvTs;S#=eo{ySy4kZvtxCW zX9cILqn%2G6HOGn#BWEZx@HXme_=|!Qfb&}J4m}p{8InQxO6nYeNDE&7oNMFN~Eim3gH$*JByGe zC;YL*EcD1fL|fQmE3BZj)n%UliC>oCv~KP2ks`Fl9*9vqnodgl>^ni*HQ3K%z2(i4 z`KRL!Ef+;<3?Mv8)Q~KEhQmyq>3*nz_+c8j;r!qv7UQC3r0BQ3ezmvd!Sr{eon_pO z#5ppuQV67zY1=Te@1tSIuR%z7j0wK#(bv&c8|+BBpx@NRDg2S5Ts$?~C}L>%D{S{y z@x`HCbW8~wD>HX7UXxM4X|c`!m)tXEw>YmC|JH}p9!fW+HCECK`mJZH;$qL*#edP( zY^Md(+RuL$Ai3Lo#K8;T>qj|kyP#GoG7c#(oOfSKUiA5cX_e67R`NFtXZT zS8E7*HbY`kVK%xp70VX*47Dv{?_Z5C!&2w+s97D3!AxyV8xG&oeAg?IuHH3W=B{i! zcrt!T$(}wf>bq9PugYn!@s19h0T4x$$utYm0S|vA`P{pgpn~%rOSLBS zXgEd(lXzpacyQ@(G&b^!dpyZR2s>UF4n5ewV0`mG?d`6OnCb*CnaORzq4#8;eF@g^ z@?24?x)IXuS7rPlV9ewjO!1aBgWEo>DGv8c&K;E&@NjMYr-TomLl%8rPwS2tzdgk+ zTzzmi&!pW@@<4a9{CM*ZVAES7@itUB(&TqJ+mK;*@>7@XHhQC;-FLq*q z-uzcwcCT#Xb>0`^g*2eh$x9{rFM=fVyLDO38Y;G|c}5DA=`)!IwqbgM!q^&IQWQ^h zN!Gz(wddW}!dhP^_q@--U$@mt{CE(&f~idH=$p~-L>hgPdmNQAOZ(l)qm#hfwO+DT zIHsUuJ(x&gU(OipX0sI&*;uD0tFA8Aj#=hGN6K4t=uXb3C--FcFd6;42|Yft>KhZ7xj_RHQ^X)Z!gXl3>sLUDeUd$^VykY@C=^ix)tN=jcGhP&bObf{5zFIr`d5}Ur|F#U zpd+4r=W{B~icZrxM5wd5ZT%`Y2P&$HTf$KA9uc80I$o;ABN4fbBWLcBS64_8k% zDevq%BiVa=g;E6N0Q0XZ+|XGYv)rGuwX6$mPct9qG57upm8a!yWB`||IWGr3S(FJm z5xOA8*rcQKQ)S!NfzZYz8Rmh|)i|k4!NpgY8NOhJbEsuo)0Z<2PDYts4QBcWF7|16 z0=&6{N0xMx>6xuG9gR4-n^-=zC*>j+W1@trB=dT6H&UYYVPrWQAxFR&uE&XGrK{85 zZPTmS3IfMo(XWOazUXqv;{~}SywSX&tVZ^1QOAPjFHH#c3@(!@M!x-BDtX+SJ|n0@ z>Ha);JyKvYWa;#g(VBvW+=F2bj^!tkzYQ)Mtg`bCuDZ6WGbus)Z9mecq>GGp69mul zHAU$mv0UT?MLUm}K!QG&dXt~v?OM&lcy9)w&hs0;1*q;?cS0SwdW=cYmHFNccdJ$& zy_`Gi1lkypYPU?*%us~p+)-uFC4aXzari9oa0V*GTP&Ktunx`qL|i3q^H8+1^T5!X zowSoS6>OX_ODR4JjT;G>&6ERj{etM47gp3GmO!S!VikNBu0`LOx#OSYOF*82v4XDk z^_kxljCZj-MuDA8Vc@=xGC}bi%|B6xTvRtjFfpQNcW9bQ8EkiwzoJ0OotU+k$eUUu zmmDK9F<97i^{P;YLs{`}727Fd_@v8(c z_xfM${RIjENE>KvC9*J2pH!cSlc7LbH6H^lnX2N?hCpZBcd>m)?3^h+OvaL7SL2wx zG3p6U$p7gmmmIi z+y4W2eAT?m$4sV8K1$oltl3WIC1OiXR``2~-3m$^ov2x85w~8PJxgACSetufAZE?~ zyQATX`h6sfwdqOtc->}qIFiBqYA@N60uSG7G^F(Bl3pFjBAC!St^|sVb}x`Z7>sh# z>z+)s*6^93zOEgAD{#$(I1t}v;LUFRXI%r|1XD~d`cC;>M~C7m?Vre1cW?+T-YjS9 z#1+MRL+Y}`pW|n$OC6XnM=9g)(#++2EHuA2kpW|mguz=@3D?>w#9KKD78tGhYSjK8 zFG~>Dp`x#S^D$%a?*+Xl(HH$*kZy&3q?m-?;q*yY9~|quVSC?4lap_U%K6@_K0}= zl7`xTe`AW1?l8|5xFps_H(H@LsEpXj7N;J5Lu-k9%j@$Y{9ep_twqp4pPi=9Eumqk zf4T4;hoqP>irAjvua=sA#37c&uEBB^^nHkGv*E8)EIAg2*dMgg2D7=|)f}H#2VP!H zvc<^>u{lqr?J4uQc_sdbdj#d1$P(Fyyh+!Zb*Op1X~jLLfc;1^Hkdn(VL(b*B?nmP zaT4HprGjs>SGOQJq{(=>MEVc#E$Uo1*Y-M!ss8;EmX}9zG1`+apB*xO7#*L+SW@Rar5uep1~Ja?!K*>?uoFqGpFCQ3x?-cFxJSuyk1q3 zj;O?d{khvw+H95dt4S1OS!P;2f?Lbfqc~vrp+w|4_aB`~?$804K+>JHc3!E`Xec~V!*%sCp+05=<`0nj00srC-=CGPa$e~XFFUEOTqMufD z+A(jYEMB3zx2bJu`DU<|&1TG?umF}G^(#=I%8bV=Tr|73WL6#;ZWA!WnAVmiRF%k)%hoJ^#$W^v8TYeM+|UgNU(BXDiP09e!NCQU%COPV zr@;u4=hQY_#Ari`Qm8Ret;t13o0QA9Tt#(?o}jY@JBr{pV(Cfb4j-7t%l8XJ(HFW3 z|9CpynLkJECb&vhe4_W)4|sZ?_nhPMnb&5uf}}(U(XEa~nF{AfW_9JTrOo+N0pdag z0rf4CviQ;P9@QV?lXZG;S5x4Gk({hs~Hl&&oG8moM-!U%1hV`)n#nc=$^Az_G)3WJYIiJWQ|`_DQ^ z!q-5%Op`O7Y_0x2Gi5SYA|m|-I#@~e?lc_*@@2+vHYA8zR-%v1mht!DEEa-DS9Ojj4^WegY2oG z&ma4X$xI~A}y3#)Ph3TR&=H4Icx_%wJ_mV9ik^FSDh@I z+@9+sN6*lCzej8k0om*L8Z-h*-wPX(PI07Z=E0_7p#2kk8`5QpaSk^qFges^)Tb#i zh4CR!>BZ3aJw=X}?B_eq^p}ji7WHx4@`lq{n>bGz73F(ID&-eX18T~I6(}JA0(7Fv zxf8Uy$aID3s>xD!Dnk)3OHc@PW#20uzhVYP_q#$E3Ld9t!j=B?8kR5Wy|#@M_~H2e z>li}Id)##f{^wpscEjY|`!ebVlHztBhvcG%m9!QdIXJ0c`_d?T*Ec>MB7i|7l*0lb zZU?xOugMZLts_|r5NG~Cu{c^XSj8qNNH0L;BId1$+HQ(cRxn&B`gZi_z2i*D>6;jN z8S}Z*Kn9lGk#DC1b;WyELlZ_}=zxnkcb*2giBg#zeotKELCKlz4PE(cR@gfQ9GZ}o z6q7&1Df7WV(XA1=BpgqFdN=S>g}<)i#`Wg45hP+Qld3D8*GDFcq{tMLd$S57!xA0d z@ks+@Nl&4h;|%9Fd2$|+=*R6Ac<1&jY~sJ%(@8R6Ae~m)@#9Oy+9&K@L-wP%b*Dww zESShL%2QY@;vNjOy~Wdr$5Zz&u%Mxsi)*+AsNUnAMGU0~2y;#Q*J$HZ^w{|fKQh7{ z+zorQQ#?j{SkTqW7#9Go^qemMT>+ZeQ4Hui7ZYlDsy6@eSWCNhs9=$lKGnx8zAIL}tTHId>oaNHI;ORvE`Rb{UCYDd6?uGczCw8jidgLw~j* z`>vkf#^w#`O(o#<+YEp9q)hXarS*W=d==qyC6xP`5w;^mmp#;w?@WQJU*F_KG=^C{ zK}$OWjS#i26=@;EmZR(T`5{sFlzT4z*US~e55wyx>-EoRrWO>51+b!(`n64PG7GbN zeYHW}zp2X5$M<;!D#EK%rucB>Hfz{xwD8E0J-&Lyyi^E&KVc}?fLD{$O z07uhDVt28Sd!ND%YX2~31-gHNsl4*Zj=OcoDY%coBd#{#&6qyzHg}|$JYL|NMB|7x z$B+-Uq5|lmMfpy%)&Yl?ll~N7Mqhwz;9p zax8BcV(7@*m|PQ4OVf5X@m)yh@uU!Du-B~Y z&-{BWM&*iLDQ-ce{3Vw&{Pe&WC)>_<#$_7gkWwsXiCG5cPg&ulglEUoYwQL`{C&G8 z!E+=tie+C)Bzv7DUm2M2#dIzx^`K7~&O?W$B_``Y;nOfuxkcoNJHoyXQQf3JM9Tf8 zRQ}j`>_C#V=s)W9N(9nolM4smwoD%$tqK+pnnY#zq z=MTfaK4jc@mmcb)YYyZ7`*@-zhsn75LfX zYD$)20{@}?kqjA-S+}IFQ-4jHr(ud2m)S%bY+ovQW7p4dw(MVc`nkiz-7?3@yUf?u z%k8VzM&--L)_9t{4qlgU-MvpA6-OUjeX|3niAznt$TaaEhFOlL(e|q zfc|N!gi?^$%>}eeBVd9jOL&<6uV%PEfiXJM2A2@|Pkm!(U7#}$DO#vK5zT*FcwZwc zqTzfHC+HaP@Br%MvnMb(y3Bzi1BtU;{8keJ*bk zKra?&Cm;p-hrqOA+!o5fQ+|sq+gO~HO6R`Uaa0CM5zpwo4zF9VGk6FAaSIQ+t2VMg%K}u$?*%N!d*|B4tYC{+k&H5LG zb!FFJVOQdO;~$uV_YN=Fy*t^>KXQ|hWBKfa^h<<#n3m+-5Tvbt!`s4&^q3qPS!pZ$ zWKY*^`C2Y1+J|!YsK&b{3iUqw>-i#=^wlNH9A4r@xz)nzb#yiY67Y*mOzEiaQN*}x zjqb@D%1F9P0qzs^PN&{E=+Bk(q2R&5!Kffi4pjw(k)pa*aSw*3*2Uh=4Hs~IcndxW zZpOi^@5Sg7wT9Dn`3Hgu<_A1|g{7XFzdv@uL1o#U#h9-jU5vf=;fr?a8qDv$v38Wf zZKwO3Hkz-eshcR`q#wXQ!D;aE=0a2j@lbZ^0?MmEK0}Dxg=o|%8yp=UGsG~tD3ZU` z>kt}~1_ba`tv(2Ja_!4O=&KulQ-{8sTIW3&c!6Zh z+G40$Q(09JNh3`Dw)zDg=t z7Sq7jH&lG#kXva}h*zaINbbLQ#@;;6w-upX=e`FNJB&QgTALB?Vg0m7E6cYOTr%B~ zK6hix)c#3JhnsCuWo$&ewN5O@C~)+tv+cawsK{rpc8rn)(AQ=+!? z?HGCFX%}UkoR6;cAP?tbWj^l27-#k;L82ywqe$_PBE^cxle+KuIvt|He~>+PHpWko z1qCG&wnS1C{{She)&rP@f)37OW+tj=JlHX~8Pk5vD`k6Mx@ku5)l?v!>6N5^6S^jJ zy@~CA2?n;Rq6(c|{s9QxbDdlcxU_e2u&4r+bZ1G<$@=h_{Uz3)UYF6*w?#0;gn!ch z#C5yniUJ!9mNbeuac>np5Qw1blC@Dxdn4w@UE1~ed%&sCF-QELTR!Pm=VsqW91){0 zFd?A0Fo%rUXaS{<=vr)?DKlqzC{K3U2F-zDhbJ~2<=)E{<-x*-%QG}(zJ)*FngFUt zsTckO*m}(h%~`RtrkN-9o;0=c1x0+#V`qpxnXRcBt(p&|y$AGd{2{8zYsHEXo%G#X!|_@M^K%#Z&BWy_ ziWD5eFJn}((S=U~_#6PGxsl^le-(#9qeP_k{jr=srKeXe-U4MfA++h4MsH)&JK6|8 zlsUewnB7j;pE!;BNR=0Tn>Z6*?h=^nbK&VR1^8MYDd}VHE=jbd^3ecACySvG-ly^c~tW2`{tLjqsC!KSQ1)p1bdtpwm<}%g|4OFUIWzI|o2i1S==V z2-2&rQ1CW4d(7r|jCF}oIrtevk*F3D*ziV+urCNOz_--(RKVJ;B6kP;TMFuIt0qI< zMeLji|N1>`-75*+>CfvT)M=nSHTC%1d=1`tH%6L_W`p?=3gR!=3HZMX7tyr~TR@z= zE@8Px92|%5*Q#qG%<4j)$WlgQsc~WXJ*S^@@}hILIkVwnl9$x0@Ntjx z9(Q|^?w5>VS}$XTx#Qyk*$z5qqBnA?!~@0JXFF$rliMNl{{Tkv=&=93=&S#c8iD-^ z5I}is$ReBe>#?UapUBM-H17Wq&I#yxCBIaA6Hq<}TMsS6wO@H<3xgSBoA(tVR zYpNuR%TaQE62-sIgVDH6U4~zG5V}rwKqGW4r_%~DR_wGKO{nbu`V=aku6U~S!4+3p zY_rU%e*+JrvpgVM>K+t&D$x<4Aw4Z>UPJOyql57&(LaDPxii?*``DMx{yevz_N$AN zxY>vio&>|TwYYtHvla>YQ4^gsaZF~R&C`t_751W20tmXSv*9v}bg1y%lOe_UY)Rqf z3>=nSDa<+Fw5@=pZ9s0mtAN1yqR9wfhqzk;&p_4*QR3~)g8r?mv5{AUNY!y=$wV%R zirCA_dG&Ga@aj*$FG`n$SBU|TWDig&o>l!}%FYz?mNlv8%8TYtXm_^}e>ks)-+1oh z8qh_{Usgi>#ONfpOnE2ha!%_>Z?6s@!-Y8h9@=@&<6??*h-by?JBr8qpqYYs3!fzF zA{i!>;(i}5mrp}(!5trr@8k7ONYmM$AavdCb#_dQo`1gQJ~+I&liJmQ6b+vhAi?3* zr-hM@)!ubn!Ad=7Q!XVQqTcpO#{Z?P-9V(qyHT<)W=PS>hN<~Q^q<|()~AflVB=52 z-iUGR4rZCNN@Bw$Ind3Zihp@k=&BsnF8=H_k_o+LGphhV#2gVGN300Wf%%`e?l^8&v z)_I2B*NIPYM95GXx2(sYp-t3?$J90lDM{4C4pSQ!&RMyuKJrKFo7ve%uWr_#46(27 zg1^Hd!U?LIB3hbdFJg+Spkyguot&c&dIye5#6%tmhwhrINhcP1eH=v65B6?#KO$LV zT9K(guB6FRZYSH#ECO^wumk7K1`e+@Z}ld9@MVWkR~^ zij^wU&=?xFSzj4b5EEXmW$ANaif^$#_9@e=#V6xlbM+Ehv3NJ5Gr{MzskflmqH8@z zyim{7@-en`X3i$-*}XmV(DAVCZ}&gI+2qZAsr!C&o8$2{Nm8+id25Qu{PD1$MT)lu zIfJ*QYv>n^;l6Q<+17NF>lz(OT2v6~gmV?M%+zQ$_Yd$Qu-zq)&<++PPO-O)``y8k z-5XkYfBjw%%#a-ILF2t2sBjEb(9)t=-l3J?hP)LYl_1zgZ>Wy*6F%|%1@%&?LU*0WR` zM<2jSq*fYV0=lb?`&o{)*J}KR@^Ohmfph&vA-b=j?6kfXg5UK~{w(^6K}@`%xLJE$ z#1VIwXkP$NU^VY`#^agBbM1$h{@?SKlIPW;GLp=j#6R7AOBK*iW_L)CdEZAqAeuH^ zn_kEl;WM0;x0S@Xhim2kO=EIba3Qz9T&BDI#ORXvhzVDLB@BJ?qZ(cMEa*Fnnc?egB;J_`o>T(x0MM!jE<4X+R%sMKZf`&k6ZwZgz7an0 z#)=yN*i1AQ^Dcg9(`{^6if8;$e06lIYhR2qQ4jwD5wrHsTcBUt3 zU$vlyByTy(jrXg6$18kFJ2RqRT&_KSRoOrEa>mvszhZu`4pYR{ki+G*AYV6PnWXn6 zyS!r*D;9J(lOGbkXohs#mv*I07;1?a@r89o?e=v+g$n$O9hlFlV*xMwB$EC1;ri{= ziS3vzKG#2Y8cypvR|xi8wh`-A*j_Ugy|~<2Jz@SmZmXu#3)T@m(cWbj(r%10ByVpeZp${|{?#8P(?7t^0MBbM~4B9kRDLGQ`-h}-ojl7@-qNg)X$xM z`{|wpq;dZRZTf%D!bs4!m$XRL4Myj}7&+$-`%F&N;W!BM6Fn95kjM`KC)wJ4jsqQ! z?>s8Btns%D0otsC9%@T0!T`c)Ed^`K87k`-T5lj0M!ldl0@-hW=N z=Gq)mPHSU~*1~IN2?e?e;`KiZ_2b~4^)b5c@hHf{OpmN&9KTQJ z)0)lQk?GYmSIjVy)jBW8vs`G2WLXYq0nspaX`g3kT6(c|TL0cApKTD(SRqExe%Tl6 z7QT{Ob(4aFy)6D7$IZ5a;rw_;T|&oZ#d9MNZlK-Ooj(4-GPze+r^{vK!8#%-iFc}h zqOOVFVaEM9xH7R!ODs`bI-33LrT0Fc#{>cZIn_7Bz z$W7TW4Z&K`NjsLCP~@X~k0b$i+6S*-Wr{tDnDaWH+o^2HZtFoMLu>p9I=1#j%}P_E zQOUt5sdOuLrB{rzcClXRs(piWFE>|lpNaLy-j%g&FnWMxb!?BmnxsWaMbic$k6AaH zK_~I5x-zV+{adAmuDK(E#Hxmlh@c*$xeRJ0&IPr)lo)1(3^l@=vCYnhz?JxIPE9Av zNmuhfjjJaZF4wx!jR#~{3Ii-ol`>sZQJHO@k-GJ`jq;x>=Ek;f)h9@)18(Co z{{d)v9=F{0(as!d+ibnA%9_6Ewb6T=UoT@t;Anc0Em%E%@OteBk zVUid zSF^fq;Sm$k;o!MSaoT$I1Gc`>-Jf3)JHP`>*|))^wfUP*=G(s$6hi{Jz1aQe`|{j& z5hcQ$zuY&PA3r#|OLQ^Eb0bvsT1HdIbaIZv`ZBgRGO42Qv~2RbBCYYPCnlc9fBnvk zl?AH?#eQEhQuk%d7MGzV`CHC$x_4Z@=AtW;8-dJ&P{P#z`XY8_y|%6tj{Q}D(YIGsqI(Ar0Z>L^5yKE_IL z6Jj?fc0O|!>vE?ZT6YMt; z@kEUsO0PyZ-L4V4b>fXLAwqg3!L^Bd;JXtyjbw1>wDwHG=xuffCBd%^RE?V9gC=m} zkD~<4KcGHfAl4R=OOUr(x;5@?!mM9a+!9ZKH{kLjT2CKtcBDldTaN?Iz>T3y<* zeGTKCm>)!ZmU{Smear|obIf$q(F}}jSPke=4sReG^GodeF=l@6uN9i?zyGwZ^NT^o z!3j&4el{cB?X{^$Y0c#2vgJv94c~4u1IRZ!*Fu>rB67)`MW!nDpp7Uk+9?~rXOoDZq9OVAFYw2M-biLJYoxfpN1UY#Dd!db z7DOU(q}1C>4~+;BL*H85*H63JkOqQIG4Ui(efLuSqhioFZjUzVHYj9m8Pwx~coaOd z(PndKrK{o0r{`vG3yZ6H)*LUNMwme!nrNlghd|(7G7gO2zkf>3E=hcHd-a67#4MGv`ma zSF<>BjX0W`Oiu4p!kMHe27sxBI#*D&mNtyH?i(&YRkfz6qxXA2^5z#APKf6Uh0NRT3#Wv#YB=Widj@S-G8nUR>OSppLS@s~Y@dUPBQ`aS@gZH8 zwz4QrGkZ|ds!H^C1*p^WZ_n>=>PSLK;PV3ffaeo!takT-cFE+D2G{dVl=~TiI#2j) zW%=-_D1Z;XLyWTL@*nk6&?Xmt6!ER$>F3wv+s3q{M>L)k*C0vCl`MY=F(Lyi(fHar z)n@e%J0gVjtnF(-1|jL?M-lRNkVSEwH5!7Rv&`DXA7$-#oaq zEwlot4;E^S_>L6>PZ<8(HF`stuOOuNwuL^EnJaSH5^ApOUM~9?`7c@;$+PPMg})h8 z_WmXD0g%5auuQ>7T|XqW%F|2N!kq|*Y)m$Cv_VbAH{B0VbPAadnoDY}>KN1}B9 zo`V#Lc^F^^zJ3!lyQj|;a@j#ILSAQ(o%XbnnG0DSvCpzhA|q@sv^TRm$NKi=4{MYsgW2(bG)iR_tV#+HK^);$}`XpJxQIzOr}7uB|9jItW>DXxj8&pXoKCooo7ey4@5 zBPHC9M&G~hHp2TD{V}o5ixD?6AHs(FN)~Le@~fP;=r}s)$dd4sY=mrXb=U!gnhqMJ z&wf!`mrfu6xe?p zM2&PUFI#B1G!YG=3q)G`BOw7)OO=|9N{WYA`wlJUUP zHdd$ekJ8JtFKuZPOg6|GjfK2huMSi29)(10-t!iNbG_Sg4l!8H^how}wST1WYY~y4 zuC#zJHsSWJdbXl>hB`BE?Gry=gDOvzXqhTJ1$&vI{XD;*+($$DHxQWDiFt4#P8}iN zW4#LGw0EO%nf012HJBX5617(Xc_@OI=hYvx%)_5g~P)#zAQNi^uE+e zdt1LcW_Pn{%pRysplDX5)#Ri7_fRylDgV}PuuuN%(hbo^4^G%NQC(gB33?J4u@Jaw zp7e~|@k}l5cT(~+hZV@$mkzSqTQt^Sw|<`Tr!M0Qid>6jeU2%n&?ogyIYG)Ny_@$( z)6&dK;Lb~z%YuAX#2v}+7*5~xSmo5mckb@?O7#k1Z#7G9c)3(ZQl!SL!00p-OAQy8 z<<{#ZvfK7Q2SNWk9Vxm(HIbe`{i`7h0@M~_^I8WGyYo#8t2&|^%$O+^bB}-3v1sjV zUFDPirOA`}Qq7_G2vh1kZBdfeIoK2-sEh%}$StE&kaBSAg}U673Iz2SX8F(Eq4qwb&xm6dliNup zBC(Zb&8p}9AcC8(?sSProSj+0?=9TYpe5}EvP8j@;09!(Sl|v3a{Iy04|frF0bZ27 zcvuS!v}f{sJ-Rd9FuLd!NK9uu-#3-}AtEF6Q&CZjf)4>j4T7{=wY7-=XPT$THK@cx*#t)>~S4B z)7TvgG>!g{nBy;F9ohVyDxt5cGpJ|}3-U$er{kew|6NuNjEdRfrMB%J8u zwbJ{|Cr$vW5W^{cM0>Bw+a^k8)V{a3Wc;QUJ&Xkh=ph8p;pK{FH^G)Ic?!}4#b5~;7WP!j-`z;JNN21>(B**twju1^bKKfv%N|Ix6@mTCVg zRfThhaZnb(UWbOLu{gOn>}Bh>^ER=!buC!t`2NaZdC=^|vO{6U>XTooOVN0GgU+T3 zM~_K@3Iwm_;lZ7U{gkoJr#xC?EvSQJdVgW#m=5G{>|nR!X=;yTSJJ}xRX^i{qkUZs z7ie@w&yQs1Bc2FUq6|@F469)Tuap>AYGYzH9X6zeS=+b3tHNb!?~+hQG8rcPdQ0wt zYr9@={|?rq8Q9mKL9mqR`lxuZ^lwv!wQ@<*sGS~e`50JnWm=%kFYm~drh!E$3X5>4 zRL$}ib=mB`B83FKd^IRftk7fG!9lp&9C9Y}?O(H3K39%!G@x#B4u^pjjk7-%6u^6Y zzjTW^Ys$pG{DC4_ofrOT1UB$QkGgK>@<^DlPQnKT27_#B09)0W{SW#;CdHo;TKn&5 zy0v+GCwklhkh3E74#~;VS&Z^x-Im4@+lJONW2n|hTAmj(6Oc)6=I4F*_`iEJo&?=d z-|IwYvpHew7jz3|cV!%=KCNIs&zEaNORq7#;mHfPem#kwC)z>e+ zRo~OHt#gGg%vMwyK;9~e4!M2ieF2QdU-a|$%J6A|SNFV@!j>lQd>gEqwuX-`@t?_{ ztT>BowlaedvHsUyR`EG8_5H?P8kb*?Mrz?(5+5tERgcd;c~cY+5yqzj+6Vdd&`Obe zc#8Zw9q~fzyR(y$P)592HRH{xNXRiZD>ad*$K}#jO67n_E>74Druu~TfJ;>i>{m{r}ngS0YJx4~H+1E`}dI9}r&-<6g zqESO(qf@ZV>Uvxx+*&FBCkY2JTllP2_PPPv2I+(CXT=}HHO`;rEa&TK`{0<9%^Q8) zcyHu3mKh@*3WDB6Rg~MF`6f8#?RAuY$=&X;C#hyhX)BgJ=xXFIs+Gw zU_}57o2yE43OnDX;yba_Qi}`(RhrS4t?%o!59N(gIr3C)PHTS-kQ*RLE|j8P>y_8E zTQiM+EtI(79@Gz z{m1OH2!3;&VisSQRQD3S`J;1F8p<=n(S>>7_g?pa7niCpVjH>SdBc zCgn^Slmcb+O@-ie5c&WoQ8ibaPF7p z5mDi}2-{jtxm-J}nT5-pei~ z(BV`zP}Hh=-I*0TgfmyTnDO#*&nq)j;7e8ch{0oHjigxzeJpHERHClhjt-;oP{~@a zE)pw9kuAO8*8o^I4Oq5+emDDS;Gq7ozF5Gpb7^5t3gw~SUq}S$VAW#&|Fie;@4r>l znE2N|XFo|ac=4#NHX=9rrk!GQ`W_o*=!FPGL!Z18fINwHO{dBJYoDQHyOQ<5V z4Oqn3Qq%&|rj67GT-%8BJ(3JE)f&yuhY0P7z&EN}$3}=N0jd1g6`BHpw3hmemCZIX z4hK?wo7$y0Th#C<9i+^5;(Q@GLIBGqVs0H52At;=RkzJ#W!;OWFLQ}G7<5wk$m$`8 zD@1=Skd2hfG8o-DGp5+Q>L}l@PBf;&bEnEk%aA+XueqNQYe1zerCFRGjbnHvin-C&EnYQtGPADy{pdn>@TT;o=CO)=f@ zp6=B_1^Uz*vC@qM=j)Iy)Too7QLi+&5o-^{b^GAsD-Up!JPe4X|Md4PHS~ck5`;9; zC44B*1Td2WTu8XP3Yw}vYdNar&5q^ra(XtNlZPx8xA_W6b7kTAwT;*fWX)Yc^0JT$I=s8q|bLv?-qk5=~Ydb)p6t40hTIRMIuC;Zk$&usUfXF_hj zvIhKKJSKdtjQPRs=JNP}MO=F`S>UvCQI_>7L*Rn({2aAX++q*&@D4h?wdATLDcLg_ zELy6b61%c@Ng-|x=M}Y@Z3uT@N)mrKKE9hNHgLN`TD-BMY9}R2JzJAY(SN+vwq1Yt zy(8@FWIYNlgS9GVCZRJv?}L0ZVAe(QRyb18-0%AZIBHhBv7hdRX8lFD!WQE8Gw}tq zrJbgV7Pmdx-2l6b6m*en+wl!pfDs>6gt|(S+O2KLM_ilp90+gl;dfW_e*k?_<*_sk zWzeE?kT<%rg7V_hQs7oCFXUUV1GV#PgQ90;Bt&;%7mXT@r)x1|%#*5ruvJ~%XqvKt z9y6g(D6$8^uqPOLcj@@GzjUWwQ(Md}){?~y!~e&-!4NNv#IwhYf~!*!z`o-`90+A^#cTKEq@ zpQ*vxw#PMF6o? zrXa{f7)mnTo}KbHG250LDoX)+)PAtYwg}zIn!y*pdK^XFvL=u3>dR%u?Nnnl{4HN3 z=C2oXs4dC*nNjbF7#zmt&s~vhv~ryV_XU@W_ut6p56(r5X-F>H?|H$;MOS~&PXX$J zNxkYQzCO?&={<_VSzL)A%;0Ho*w^17Jj7H^B71(NW?HcY&7+U_5_zw4XN!x(%?FP) zWt8+1_uX~{4t6_INIKK@qgfc}-X1-FEmP^1#HU@DKXLhK8fQFE7Z;1nY?*An|1DCg zl@B)&j>A(em{#T*1BY1!QK!&XG|iU5Ri-vC>~dr+H%D=7)w&71S$fQypLJNtHr@u_3X;VyG+|Tcya6AeNoz5m|v2FiaIL8yoI~=8moWzPCNB> ztjmz@3?nSd?4%8{p+pP%FinDX6f1a06nuk#v7`@;n=~t4VczwNJdtO(OiQqtySWkw85P9`zzut0PWm5v; z@17IXLiI`RK|58W_1-}ML$ zC|6>RpZK!?ZB(Htr;?qw)7jzTs-8#4t6nyL`pl;!)NRQh$N`}L13Y+x3@4drO!VA%`Pm``wmHY@SqUcj>jqExy`y^PU8LhJpfpgKSra+Q?+ zN1yq>{X`RTyS_F7oc70d>N4BDq!6N{h+xk0;J%0U3rR>gNs(5?08>aA>zUxLM1KhvvOQ}pM6t276 zSU5z=_{8n}o+j9P1i|2%6nW**!N7;PAJzP~t<;ClP!{p4{RaA5<(1VJ&#E5U#rn8Y z-pEKyZ``0&^2#5!6Xy z6v$@ZRmHymQSd!fSX3!k^W%o}T~hrTae5Y`BDSLWvC?iT(*UUU!iCrVPuIYiu1rtj zyWR~E@X|Ao$)CL{1Q~>kWQv>`ad>~ZwQ^s_`=In;P%!mV`hcuzW_7IZ<~_axfnTYQ zl9G!&*m6tS#aJ^TL<+OuZCu0%%Z$rPXlMVTl5WVM)uEBXZPc23Fsv!FX8xs1viwkK z0j;`UI|0t($(omT+@2ra<-ra#K6dwiSeo&zAiP!OqMre@>1KIF!rDv|f_%%d&nmH?5 z=v7G;QwqQfGZTy=g4w8m`#jn4=YmPejHA9{J6zsdpiIfU&H%{hr@gVsPfoSBNX?VK_ zUw!@E%B*pM`2Fh?E_hr`S6SyCeCgU%ziaA-o%{JeQGMao7Zo!u2B%z(5gh))pXKWD z)XF#EcS>C})*-m>G0a}wSDAYJxD{PCS9Y&SB3H<;%`+$ZTj4xcV1K76;{o{Nai-lD ztHkSAc8ul4YtxucX6m%KfXU`dRwb(MX1|3u9;|LR%coVhyu`6)?lVP0}D(NTiT{=ws+4=xVX zX8sjm=%eqN{wJ!e-Jz`}N{~tG+-S$E#*d_#|3nH>1K4!_*m1L#a=sd-yPR0Pp$C#x zY_K|h?k~8Lp(5woG7gBuD)S@$Rv9Ug1qHf^Zx~F8C@PDJ90?Ye;7|T^fdRhNPOu_-2;73ZXRQJbM{GRv^YrFrG=$L9x!A#S zI_;0FIC#>eOQifm%bJFuB58nUV$0dEM{2L&d52q~+XV|G3v;+f?ja~|gAbm^Hv(OW z%F)>qm99&EDUotvVmFL z;wBrv{9f+yt`1b5ynJboDu`RAa!#XCQJ(3lBxCEee+rXd*jXR-wflLLU2#n^^XN65 zEKo{0#K`D&%1nEN)NanR4cnF}uEpsK*8%fC9(X{B3(MTfne6-QbWl)fXT+HfIyc0M ztteTtY>~4}jmfVHlsqFk_359?Jjz99rypd6xZL2MuaPRJ8jpNMKM_r?(z9yTOPfoR ztB#E-Z|9AIBbb*Dhu)L!-6Vcb6t*Nv+$|EuS=S|$GE>`x3q`G3Ri+g9(vOP!+PQ6e zlVW$WRsyK#`Hg=uLQ&C@D_kt>&komzT%QV}kYS84-C|`=^ zG!l)J!;gKM;*41SZ9aM_Mt&c&Ql^C&v>@;D5oySA@>J~g*ml4KAK=-KqZle7E@bLk z&l2)-UnCkxIGLkXNno6|2h&ABN2I*WYzyYb%sgL@*g8_lvfEC?hZD*d7n3P_$EryH zVfBjvDJxZNJWhE3g2$6quBYB{@_TtjD9Rg~YDWmkV_}}u(>P`}i-u=#L&m-}n;zrf#UcZbfzNG886JA=zCeUh_cyAS zrR)P#CnsOB(8af6cTT1Cd-3D3LcJ#Y+x17ydK_?F1vOe^R7hiSvq=iebaJZV8` z7^u;6bSet>fnk>f(Gr#u_5ykj-)kzX8Zw+DHe~$x<_Me(x7S8qoPM0j6*@0oUgEaU z5YYfQG$2vNyLI_(iqZfnPYc@uogpiCY$bc%_*kKTL2E32N?;tg-Pj9-+GRD=x-m+L z*~B6(F=t(?LB}gCqvzL)D%FW6=PrROZyL6u*O<$Nr+xXX5S28?-QVRuqbRjXr zf`=jYT6RI_1CK3`gtODmA6F!`ttv#a?)f}-&A*(&-ydHP)jUZV16s6f<~n2w0Wx8nCH7zAv;TgPTmXAia3wPef2hQHRRSnLR|e#RGZ^R$<=$Wk~SFJ6=w;XJ;5AVw@5-c&BfcaV;wZl7S@ z{@e~#M&h$nN%=LTv5{<7TmXm}1=*GZtUt=0Wp_R^G(hs|5_|W5S|pAHdVaq#qc1mf z0stFI#OMM<(P68pjs*u~gh4T{Sp6S(P=RMX&|G39TG&$5DD)VwEWv`N=F@gytRkIS zALBDqjb#=xJE*{(6B(7Bas0GJp9 znPU1Gs5DG>#ofvi1y+d+Z;K66HQP*D&SHA=w|`2tVmyH!?i zRcEc+UWu!gD*^Al6SYdZb4c^eC-(GBQW3(}Wj>QK(F1IJm0Q)+akn#Gke&z!Jo)Pw zwtz)}ElsDmnasatmwReq8XGZ%xd-==5e~qqvYk3dxXF5J_TNWoXxn#R;K#zjMA6Ay z*wm}a(ICQxOUY%){K@7N@|kIkQgaF?=4>sO)y7LM?xC~#xrGv2&Ir4s7ybDt zmH$EKQ=W`r7Ek6h;(jVluf_@0^Jm6Uvu{EaO#sV{sFw!sqC5&08CqHe2oK;ItwJ*V z;j6wV?RUQnR)vdY*&eMGn(s?FYsy{EAkk!kJdor9GL}{QWr?=}g0tYHQXdEFC7P@a zcNg99)w7X8XW3igx}_`L$84g=*_0ZuwnOz*%krewRc|w1*zu4;7y59C{G+pOieI?+ z$2|}AuMk`IyJmCjR{Z?xQYy)@ab(>(z9k_ryOqI3axk$hVl{bg z78B`dybH{L&iv9jlNxc6r1TbDz>HjZ7VxV&2(u%Jl45dv`|M$VOJ4SNVV8WTo=sh% ziM=-`W@$k=7iC1Vxwa~ONZy_TJRSM+v6vEPmb?q;frczODLE`SLizTe@@Sj=Jc*xN z+27@si03F^?WqVq9?m^u*No&GKWE{#VQiT%5SCYbk_};dg-u# zEB2CinOjXf8hXR-tk!jb-5+Am2Q0Puy54kQ_<6%OD5TiMX8-!iqr~ndLkWRiR(9FZm|EE2=d-I)vHrvj zvY(McxTbDJqJ{}pW(A8QE@O_bhfCjzbXEoRGwkb{fQ-xgga16Fk$zP`xfC%GVpFxn zMLq@xh8=PM+tN-U4NDoqPMBN5+5RIf!cd$-==TAK}RDmVJZ(Dn(f&O~jOMHtY z7ok0V1WTN)_dUT8-HBtbgw*;dOl2vyVy5WbFH5Ya)MT^$dj{i=$2+R0alwF@{MHM6 z=N?Cd5%C&abv+aBaD}5$&Lx$CmdUo%GN+?`)^e?&L=aXlm zMZv$Dzjx;w#e@yDMAlvlMm=G-WcJWfRw4|81(SU9!H*OD**ib`WN05V3mDytd|#dg zw*|RyRY00nM{cBr7UJ-wSw{&P3EeyjoUQ1HO{^z-rrEH(tmNC32?4>!_A8=wd zvzti)D?e&`A#W3o*7$wMPIzqS=J&H=R38Fcd2lDb5J~tlP~k=xg_k{=lqe?axb)|k zKmd0#OJ~DkmDCqge@dzm;os^eJM)VT8t%FKwC610AbgEnkcI^kImSq@afUA@XXM!NBbsO=sf)I94~)(d8^ zr^;dVKd#qTm`k)su5<4t(+b;^FTsJ@h)ID}l_0pzH1^GYlUV2!JzY244!=13DRn-R zr@Nk9v+K!@bu#kVYX8<(HV?To9MEC>_xgrdi{R&@QLcwt|A-H>)x0xa72%HJB~56< zzmUtn4*Uoo)k_ALhGr}4zPa_-o+nVO*+0zRY*ZE-^51~i@wJV}pGL^sd@v?^BMEcf z_hrQmlsRu;Gp)t8B>Wt^&k)E7KUo*R>Qn_A5 z{4~XUBfmzM>o`O=@#$Vv|DAa*Yu$O>BhlpZYw`QqzZ~7;MLqf5BnGm03|sD(U!c$^ z-KzrxS7?SnP*>0c>oud|OEX^2gM25E_918_;ELp!TLo|WC8)V_gebfuroznRNLKft zYew@;%REwo{&Jm%^KARqV%^o2yfm@4)YiY!N&bB~84>B(ca3N~Ae)KVYK;rIC01Gs zD>2S_E1Y|rL=Y&lx;w$bJo`iN+t$^Jq5T410=DSkr%gCQ6}kr*Yt~+WlI_%8YV_Ht zMPZ_-jjjfo8y$$zvbgx@MEk2K0IoA>Jzz%bttGX0MDnk@(l)m(H0_?h{{y%$-nq&& z?tw~VdkU6k8CYFcieD%sf1OYyUHIsL6lpXpR1}pn%(iQ6=Nz|;2-_*r!m`np*)jq@ zYsC{iz-e?X#@8IZ^bbqSm$FmFJp-Be^m}r56SOlPpyAq7N_6tdIjoHHdq&tmhF)!) zX?e@d@@$r|{d+h}d$bjEHg8fuF*VgAX4g_Y-jjfED=5uflB;~zFbMBD-=o!R=BTuO z*V4B54xeqNBd?Gx6TLew9C4bIWfZf|uMNy!GGJDxo_r-n+W#2gqE+YXFwZ>Cl@Gow z%kJR#uLa0|K9+UFs;^DNc&K{w@sfcUWy5wuaK^QGsC`M1Wqv?dsx#83(jY0cjJSd$ zP{|`P%I$ipna|8LVz4TsoAT0@KnqJFal;=JNJy86?awBpVcCZ*TTk*`{5>uktSIfi z!n@KMu-)usPcWZ&u}wgT3LH-ZU-UTe5b^E8Tr&h_zKME$8kY3vkd=(OEEDZjp4kR} zYdG<_!I_EctZ$82JmdPMfBp9ui-N?OX(OGzorPq;)Q7Al;mB0NWHO|scEn(N!`nJ>^n!G;z7)N?;MZ1oO;M-zRPQCv-nJz` zf(zC)J<}+VIXh{@<;|`}To)2yNM^>OBquj=`EYRcit<@401Y`es4B49sS1j)ZxZRiIcLRrm-M+&tPKvAI#&1P$}k(s1_ zi&d_DL`OGH?0BPP^uyDfk?5W|AyJG7ueM`drSA^|<`=dxbwtx?k zL)au|E2Xs}r2*BCa^LOIalX1+3X%Pc7Kwzzgw0iQR}l`_)7zyj8G3j1$n6ThOF~^% zM=dKGr|DjJO1v4+qH)hw?=#oQ;{YS?$eSTCIwXMLixvCCb+7PNo(}Lx~6Z*@n7km?Pai6btr}KP# zaY##GqCf2WoWn8{$0uCN+(e!ZOe9;Jg=@SVN?%$JjWEdzkm7YuwCC@{bP^N_7mYaf z>Fz&MTG1^&i_{QMctN->3+46`9{iCKr&`1ks-{9*d@OGtcvI$k{yd$`fIaRw`MVII zAO5&Df68fu%hqPU3T zdD(_CeA^G3I*!hsoJ1uKg?C?k#4@2bDuW7wepuoJ=quMVT%2EUJ=F~UsQDKCxpyxs z);tUO-HJ2ga*U%43qIla4UEs`<)-7*E8N0|kwnCa8yB5fBdY6bB}~~76}zm^Cm&1H zoe|&{h)6hZh^!2&W(abKRxUdsF1y9Nuv)6LF%~+08>*Ues-PLF-x!nY5%(7FkJDI3 z7oQ75cm_09xZj&j8$dGMp|yJlNsk_c)`sy~D;eEc8}Jk!hw}Z6epFh8<{xx{E#bFVMmm zvBE@I1Nfes^FS_}aL>bOt*`=3>_6zJ0Q|tjuovt9ZP*PCG^UlH^0#H*R-OxX*M zxVK?`4(*07%AWZ4x>NrHAie6_Z)~n#!nF`MS;ef$t3JzV3@^}9ymRM#PZ8l^ly9vCDSsb{6a^jB=h&5GVMThR_#kW>KrB1bvSX9I13h20xKQgD|}h6DW1`<7mzY zwSu*Q2VUPJ-#Xy9j^&B&R9vahST)+EI{R#^Fn*EIPeWhwLdozHcPS|+nM2BK-9KY6 z*yiu~-Twm^ZC>0^hEZC6`6}gaXEx;IdvNhM_-qtEFt0xwENP|sX$yvDeb_C!Jz5Ce z8WKyy)_W^3h6VE9DDB~g(AmJbXnKbM)?4nMyC}*zOZ286hVd*rn6oYAcjN&3TC;#I z;gVlg-0id5O0S{^_sU%bkzSOg{>pAH*k_)l>ixhWLTL^RPA8`wpr~9&b;M)^;l*yN9301Y3r(l8YGbB>u z%k@puz~Me@dkx|r-oj$ds}tt6S!2?BqQu><9}h=4#euFHr^F=}`fX`j0uO--i#-d% z7im04VouOA=c3%9lTzhj+(Op2)`V>E?t6v0T%AbU{8F#ouxFI7t77`MP8UaNm5d!u zin5QgA={zvWPLHA>vj^Tx09qMl=~O{!aPfBbPs#jKc%Yk5?Og>_`*ZBjGeWQKi@dr zX(4JNi5sx_f>9YWjnSdBp$`%V<*coB#fy5~RKJg-GoN>C|v}LAgLueqq z*qiwLEdjTl&G6&j!w;{iTwNw1BMvV@Mv(Uav$Wb%799lin#ie4OwO+#cM+{Gve;q zi*Fcg2Z!Z^+oN`ose-T}c{jkJVau6OXH{ZckC4}djxLVe9AUjA#!j3~;#k zBOThC>gbl;Ff+jx!P3Uwl~tZ^k_v!aNTEupwcx#N;%0tz^Eg=L+y|bktlr@<{@#zfy(A}b zH=JJRQj)YVxh@XxvvVM4d*$mS764xjSc%h?{-Dg;D8chUv&1~v(i|4nqsJDJBadP#Zy{SqD*?1xn+K)T_O4-*gN&I!VZQgmo`b(@Q z!B*pwW~3{d` zUFqKuODK#d?()EysB?1K8TW3={A*ySD~$^F2*mEZsIuK0aEy82fV42Czf(~k?gbxw zO9`C2Sp5Y(`m(g2^6hi(c+Ca9q{|tRWXS0`1XF%Gyoq;7JNW>bb|0~{5ImfE0!+w_ zk4y%NL$Q}8VDJA*Sx>&+(H7z1r@>B(8af9dP3<>f2-Y;px#oso+a*#=2AHRL)CS56 zW<1?kNQSwuFKak{oMIZDqpAviIM$P2uFK5M!n>n7-H8n9gj%Ix+0SwQ`3FM2GA;PC z>zt*Nrs6`Xdr0<3%D*LQtYSYC7Z!AuURVBg!qi7e0p$9XEPieHZVrj&+m@Y%+JQpv zdQ|J+To!0g!4if|`f0uiJ8mnSUJuD-FQ2x%gXb*r|J`ng{z*_%E;Le_4MB z{s(Pu8PsOmwrht%fl{PU+zYf=f#R+$?obFW#R*W{o#GCK77gwY+}+(tio0uYzrWni z`##TmuUYHIw|=Z2nPeDdGL!4N&ht2rW8b%(^7gK@u01Kw%DVS;c%}z?zXSjv(%SBa z0heKWwMKe<8gtLmUu=>!gy?Wm^u`k&wak(yE}j5|*Zq+8uU&^&W@Vjt)y^F`j|70i za!R(D<2Y30EPR>LMONFqdJ>!@+o3mp_jBT=i-t-|d&M839qTnUcQ%L2BH3fG`H=5{ zncCj()6{3|PQJ5j*EA1WsyybmWD2?-!?>6nqg-agO&B#w-C1>?27XDp#1xe0?^0OL zorWHlK}5zrCJsic%^&CKJHXRjm~s3>x~1&}A{8gMw&JQ)95 z9F4rgM%fBA;D_QaRq-l3rk|~TdP2{YnRVAoJ!t21w>mz}f)ljbd~19`mVmZw|0(ZD zY~T@XrM05}Du>!4AK;}FTpaAO)AAFh!7|J23c;ND8)1)-w(hON9Ee}u-cO>mi!?#8 z_B!g~gtNr*>@ZYz567Jhq|0=znG~1zh6lIMR$kFv9O}D8c}vZB5XJ}9g4ut^b8mE}+(g(|Q^WgYDYSIX^95NlciDI1maQ-GF3akLX5sP?JLz_@ zcEP^dWM}fz4P}Kdr4$`iluva&EfXN4HkPQ1q`ivNoZZg{BbTcshz;UiR6k zn?%10r-_!xVbDOXq+pyomDHy5Rn{!5EoQv24aQeh82z{GggFh~5w_Z6KnW^(k(QGF z8T)ko+pFc6+dk){ZBa6_1VI*ZR7&jxwUGlcJwL;7fBtg9JCxuZ+mit&LjI4+YKkt` zz^O3~rZvn918$R&PhgadmS`$967^KTH5oH;K^TuaP1*csil_;jl9KAT)Sdmh9h+J@ ztd-%m$#%<3)7E~Vx$;2M$7Q0cEbNH?e#CL`Zqv>x4s=U1yu_jl@#^o6Ow{z)4~Amf z5{C?O>pgMEW2{(AOLWz^cI~sOUd8eDb^>z}rP#3*%_=;N;{Q&A9L7yydalT0__#4w- z_#9RE;62KCgjUMTaodK)#@=*QamU&>ltg%h1;|P-V z-e#RXvFZV0Bsw?Yr2U&mgff(;fR;~pCTNATFn)5i2?nq5Oe-AC_(;;N+BWUwOb;_F zi?|aH;;kxf=-x%RIp(q@vH_W11&{B~M6F#AQmAsv@!?}>Zf)R)s89G0rS6XfM!8%_ z8S8xwA@iF{SesQIzx_$>)}8>=UcTH7dfp9GMr{$tp0wUQbIPbK7zq7U<3yMN7b3I> zs2uTHvAlT2^mC&fZV|0h{4Mg5Np1n%)Ru>B$;`BQ4eOm8@l+? zmecrDVvN8gg!?ue&L%r2^tQz6-f{Wv{75o>6C>ZPn7+bZN}AdQBGi;rVMo{4m{Qo3 z(jXM&s2%-vHcPY8eZKxK9mk+QXpb6bpFB+1ry z>YJlR{WWdA&Ae6RLMM;ENSmUT){TY5uKHD>lEJ~`+}5YQDFdh`0@hJ3S8qVe?oYf1 z`;3UHIfUhmD1N5PGy9#+grg}O?6}|?O@}9_hZ5(AkDK`f`nIs)_4-HVf>gv;QD!#l z1+Be8(+ZDTKD9bIJM|2(hSysB{P$kkx|^GPBr>73 zOba-z1t#gZ*Blc{RuF$2>A}20^aalHqsKx*a^O6Aa>vZs2Tg0pr~aZzuHAADYB2+& z8w_82=A28IWyuf~=zrZWUxA;Va-fz<>@*xsC+uodVpR0uC$);^wjx)UK*Dq4zX`VY zv7VPKIKAheNyD}mgqbVhtKEw@#7h}cWQEnU-6$6?LSn=O>?oWTsV|Q}6V$iBO^`x= z)w~S;n!wW8$|f}_;1D9DVkgGBokqNwdKt~SBCpT7@JjgO%JNj) zA>5Bk%cI%b9bN+cm%QcSW@8iS4f{5Nl9;b5{Z_>iZxNAnhJ8MsV`1$wY?FThJige7 z1WSp2*82-!knd&fg%eygOg@s-4uhQ|eso)cr1jG`+U|)8@{7FJ2_HncZ1?;I+N@zZ z)^dAy_dj>#?A~gEvWKk=Xp^qU(#Wg`(X#|e^~~m50y6!bCq(85ovnrD8SmfKzq-wx;h(Du1|g|2SqXv=HJwHM7!d5tm7rRP{cCs&p+6>~jc z3(_dEl2n3jgiei^54Jh*Qoe7U6Y4`4h-T9njepV3UQ;Q1wi$c)U^0ZWo2hnJ2a5Ll z^L0e%AV70J0vF|R9@5;QKm$=IkKeVPuM4=~p#KYkuDI*VJjMr4Tau;vwbMg}Nge_) zi5;%Fw3SCfaQja(DKi;q5$MIdOup8TLDd1&)&_BCGDUuBGvn1?0IoMwfegr_&+qq4 zZ$nnRm@P6Ya@|sBB^JFaIhLHsl=t;^ew7k{jrjUJ7gi#hShF9bf04)i&c{IA(L6vp zo^IvTs0E9|%YrT~5PlIXonD(;m)H2% znGPIZ;AyI?&_w|nqlJq)Bg+mz%XWnY72Dn(nzD*G+rTd?LK;tBd}bMadr)1T|l zhG}Pz-~MCG7qx}-U;54%FL%50t%k-B{_J?UR!0UiBhNq_6kyaXc+F(UMR+yjG&h{= zW4#**k}_g7qHu^GAitrUlLUA#QgySDiwjvM*Y|1p>*-a@-XQ90YLM$@w~k+6PRL=O zPR@$bunr5)C@!K)pQL0yLS)S;iK}|^K511&X29Cb9zVTcs z7RfJG+*ul*cNId~0~`U?F#78ZBnx&6lh-tv3frG%zuz|Wj%}i|Y^2Fl*MzKwDNx^q z309n-uG#=GlY3XWTb(|+2;nj3S#7=!evyGy<|vw0<=xHRLcY;D7g0=jGEtNHIj|JH zs2}QiT5{wlkQvI|OtK+jePv%d{IEG)HM<5YB;$~#utv00s3hPbg{;3k=<0bBqM3-IG}XIMOyNQCusW;HZ?^6%W;aLA-PM91Aq&hJ9b>+QDRd8tdNGG9ZFZa2jxBmV zX}y)QhdT@S&kA#1(oY%dF_J!p1_>Hyzsrs14t@=iK@?WHnOgs|_u&J8v~b#@gou9eDH+3)&UEobrn#zCzTt3x@vB)Y67EhonwXQNLF5d_EO&0S+nLb8uE1 zVs$Q+kr$Shhn`BAj_dzul3zKc;|Yh-R6TN^xvq4UHSc7>Mn8FniN^@t42>)A8>C^f z>vqR=;Ys3Q75z6M2_W*Hla@^aooa1@Kn}x@IRf2S#<{VG%&4`|lqBBiEMEJ>A)bYG zz$^gMu50%3m&Fwp>I8_ETTcEjt>b@m?2sf0#tXOhQ3amTuBUaB5ZZ@a z5>fwC+1jLeXM|;BmbQfs&Kp$=c`Z=@U(jAX(d`L(cS9W?aN?(Pk#-s-P<#3uP`I#& z@J1=hCdHmpW|RgrwR$zJ?Ce-%?x;7*l5bVz%R3HZd1zF*&>d6Y-rV`&7&D5?HShdd zzoFP}=zFrFQ?C7^rAYkHg`CT~*%)vK)WGS3;M6Ax&vmA*Y_Jl}cd{@F^Tfke5!l1| zIwKCI=E|2O?O%z{@eQIs>L5hc_c2ZDhcc;z zPITGiOeEN{T0;*5_nGqqin_WpTOd$5>pf#GpP3~Y?IpzWR=c#zZ=JXdmo~;$@P;)k z%S=hGUifb4K!(1}jo`2wp;*#ao^asvFg}!vx=|YNzx5M?6GeP@g;iUh+;h6Dm#snB zNvZWDipRX@%tDHVEFGlOVD1uyH_f}^N>2yAn0ZlaS@P*WhRnam{F~1VwZ&%_>h9rW z-qn8&fTMaaW9^0KM9P+|RV&B(xu&oz8w;x=Kja`pHpyPY9m13F9PNt?;ogd{;8J-95_!YXv*LOS6g&3WHQcM)N`Qnm9=Wo}n9b@OGHXQhk1`1?I% zka`OiF3Dk^Cq7bNtAuJe4^|KVF8ReuYohd9(EU?+o?sM+I>7?4j_biMToZ**aCV5j z^qzye0WY5EmV3)&>LM6W{g#&;Zkr(apdHZ|QrmtooKXHI)`sY;AKoa$u7NH+YfBYC zS(jwy{^w+*#7khQ|7Cuch31E7iK7fLMw>Eg0OgM;@V++BFWMOEwz(d%UAimoT`6$; zL^UK@83(^5H(S1Y4FFOb3Q*N+t6jndxhbbx5Jbz&XBJ>Lr`y=&S$cgXawsWYRJsT( zL@k~WdFIsSDRb@S*l8+WCu)f8Cskgs-OQwK)QXVd;25yvI}H@yoonUR@2EsKf8f7( zR-Lh*A9}>0igv#$?{`2btn;=eN(M`$etw_J(64-Jnh33UP2CeQI8#VgmAb%-^fsn$ zXJHX+T_PvTm+URNK?ZqsNM%#6%Jh?w?qlyOw7&pa7y9GTCGN1k$d8Fy0$QWeKgS~7 zzq%bh3{VK-8UTe_{?vo^zvFOrgg6(*YwMS-e=MJ+2%>&~*}be^Xb-#dWs2sL;M~%i zo@#FfWnX-caej>er@AMaZg64^USzvFz6rYdX)y`E94HqU(BbGIHorp}qAY0tJ?p$k zp)+=j$T_krUoCT@HU=AbQhA<jQgUBts!foko5CI!{DDN);0c*-=^tFm;=~E+ZtJo3lu~+1~Je z!{kxVG4C2Jwin~>h^f^=4*e?)ApVz4I;PK6k27+I@xB<9!2SxgN*2*hGZ~BKsfrU;6o;N%iPjI21;7y9 zCGw#`EK%14s-)uwLe5GQTr$1()m<>Od6`XOx>nb`VaEBvOY09{gA33uU?;3we2B>4 z+UV)!l;@#TKo!Egq)b{~)UovaFcp(gUd({KXBO?B@Zn1R30wTK0&RopN5vz>27LmQ zQCIHwUF9GVlYgd4<{vtwBT32J+fW;^nn~1^(zBG0+jv&(@9?Cg#8Sy|Z-XYbm|M0pIfX*4_P<#Gj~A9 zB=UdBXd^zAZ2XO1y;pN;t}T3Qc6gp9J<87e<%OlLjK_G;iCz;2VDoyamdJB`89HI#Qc>_KB% zlV#&|8?UhhiyAXj+kT0%Kh|h7H_^r1$D}hVse5X#PTnKVj-iqe_#c_9CBlo`c#PRfar@I~KlI7?{)3I@|&G1TX+sD2*WsHmN)l zie*@`dhgTUg}exgX{-nw-|;d>l{m#E?&2Sq_UG9vkYpOe8w_RYp#lF#R71e6s5Bup zLqGd{=gmTAOU8sciBSi%hlkpO_b&C`dY~-+OWJtY$pG3v7;p1J3frTfV|=2sHo7wy6#3Yg z`q&s?6N8x?Z?Wk*W1pjni5JN8Qyq~UZ<+(eR@8Tq;7Xm@6>{B zSe{@&MTnxEV9NtvHm!+FN2Vom_CKaf|LpSsAjr4d<=^3&;DS<99bFQf8kwb-%&@kH zC(tVME_mTZ*YTr9{((5LqyuQ1@JO2&ywzP(0wJUL{i+D4X7SdRX9p#9uiTJ{IkK*C zf6STi*FhMP5G+;=i}TXv0}W?zG%QJjy&uG6j=2?K3JZuuEp6*W=1y!8M(6vin}INy zD1Ons9oLoUWm&FaFz_&Y7rIB*0sFMWIieV7R>uGL-Tm+P3%@YG*GBNqBBl8py4GuEJw78*n1Iz~J3dix z(b>o$3#g|i>`GYRU=kk7!+|uRKpC37zvshz*lar4=kQiiNcN-c9K~nkTT;NCz-q5n zr+J?XDP{Zy8{U#MMf8t-`s-Sly0~7!fK7tm6E*r?QdHQnEeYdB)P@X=~fy|?RW>b&~ zF)J?=ip@UOSH#ES$(VwNw5+#%?{=HkIjHCSTy_0%5hsZ)Te_bZ_b&i!fIIeMjx@Hw z4Ww}=knFb(UC{wCZ+k~epl|F1rKx+D_a&Qk@hR{Eu?fK6Cp=W zs8T}P)H1nqlZUDM`?h}eF_5l4K^IzTXfGwftdOAn=u|6|C6QnlGAt!_*U{{Oj9UGz zg~@|^Of6~RJKAqYUG;MLYsNsUg3Xmmyi1dEtvajkg}7hrMZ+f$HSv|}a{RH-3U2V$ z`04s3j@w4#_fOuDZ_Jz)9Z(n^5zT7<)N3$~;j6m&Y!u@xw%A;xC(uAG=urQyA|Z4v znV#((6<74FuNbiMmQ1dxZie*vnJD7?FwYT_%OS=;Xfjjwk#i6t7cFW*Mn#ZfV!+W- zbUja@kFTne{?Ae!E&b8#?B~k+GmqvP?3+|$t7&dTfJJz0x=B;#;Jrzk_f%nzi@i*J zeX4DncjJi3Ii%=n0)N7zXe@s};m+a9qFJNV-R~O=FQge^M^OP!mnhY54Dn(VKQ$c- z@?0kSh9f5Lt{L;|?W=S9Z^tQQ5YbwE_7#8W<=s#RmeRiQl1+;%Dn{&cL>4M z_3;@V-tTyjRG7l&-aarJl^r{Mse%*6i=-6w?dXnvvbP`h;>hgPj3#K>rs4vvVhX9R zw=^jx{cKM9?YBH;-Le!jFMfeM(RhRW(fo=ag!wc)4(R zOK-A(`WzMBr<7m9?li}F?&Nl9{cd8BA!{!kajlMi**-Lmb*RQ>Bzw?6r z(K(N5qPw)n0B<{&s<@}(*5nCGXSr^)CK9PMD9gNXU<*ZyhrceW zUQB-sNN2_qgK#v%31&&3F7$fgiVlo%s0Zpf&j5fZ#;FjIAH_hbUH~n26GY{fv#_p1 zH{^VUCqmBxT%t3UGhsqmjvs`_ zXhQ=wCqJRgEi6~ab<)w$=iTzo!0+>d{va};0L{H!mkM&Cta8F6xr53iYYtSsl-|{ni=I#mF)gkcPd-C}wseH*^n=$s2ubP|`ExUf zM%4DYjw5ke)r*J06*wego^C-Rgzli8>8@fa^I5iB)p}66G1Z)kJr0cT2;|jgfKv_U za!``!DqeK5b$$EZZ~nW+ZlTFwQ4C4B`s{vbMt_d;F5$*pX1#?teleFkoec@G>8BH> zS1x1>dIRs5FxJ+J9pZ0+ancYF?htF_`^g_tJN&(PsMtM0AxEM^@m_3A@}#<2)Vcc}%OW*R=p5(Dq`nI#Q*^%$EkQw8=__X4 z{e3bd8mv*AJ-s{HGBLMRPSmeTuf}feG@DzS(y8L{8F!obpTXtMKmYCiL7?jzJU*__ z%%0fsrRo+ND1qIZ=nE;VTX{`0vFyB+C%4aTVqFB?mcBK{ElV7U+{?&5ks)H}IzjOv zisgEaA-mI4z4Hb20=gc}PWmsS77>(L+tw%k@>0Q71|XJ<)_wZFiq(%b!BG{Uid(Do zazTCG24J+K!Tc+2<&Zbd zju$r^1{pbzf967(oKjiT>vKa-CR{3n6p4hc6#Q?vs~3NF@7mqq`2*L6z51GXBpN$- zMwu-?dHgs)dl3lZQg{bWK0LUsZ721tuVfJ`Ygh(vU}!Nu{f!5ex)`wmDV)v~dK6Vk zBg0dTpp0Fid=(h@@rYCMZQYs7%R|e!ef$(JHmCUYJrD~uZNrCj{rEeVqPSUXP(7-P z$oenpSbI>>Bo`H)dyG^xOMX=VpU25m9FCd#2vs3vo`Yma9&~h12$1Ew4Cxv(&VLY0n7nvxD9lzC|mM-tFDv~1@-u$y6t7#Di ziAh^;lY_f`4_T1XZ*#NdyLVctJ>=|l!_;t#TcVnhIWy-eoc8! z`}bLI+l>sp=maPBbwkk!N%{&A0qa{CD?{7axnE>?GvwbT_8 z!#(qJ(S1e4-J&cU62|o{XHhjlCdAK0^z_Z{;ou|slcJaOk5*l)jSSJzSX=`sG%%`% z`hoCQ=&XZE$#IR)(FjfNn#nO$8|7gk!~}6%V$OrVXt%w+vUpz@W7L9s9CI*+?l6@i zt9~2Ma6xdHoIjuh z%9()>D37{VD4maANX=SQb_5)sWceg~*?g&dce>=HiAWYDPrW#pYP!1f{g!Pyzo6`y z2OukVF~kxQ{=UKDX=Rr*R+oS#NM|Zy{QXxF^(EFFFnvGVtISZ+xKMY<$%Snxf<3{< zH)y3j=?pCxCs>FtPS0p{+Yg` z?)o`z?u{W^Zszb4d~fItUeyPga6Zvd+{4s`Ngen zUx3n|-qq62huG3H*%hd(Yc9dZCG6amGuXo|kURpw$6Tu1hU zSHe$76^2rlc+|Rp%{nI$VQBDbj0@xEz<9m@_CM5JPfn^HJYY3=rKQi4VsWZ%&R6qWgPm179XU)jUuEWt_xBH`csjxboX4v zw4O|c)|q^@_AiCT&*zk1pQ$6Jr>^Ytr49i1w4Xa@MVEz>-6hyP4f>JK89!Lec3o$$Zz4=pXX7X`WOzb&nYM~3O);$_PG2wJOlgabS zt2r@rz3fX~hIvkForT94tT%z`joy9(g1t4%MLPu(vRJY>hiE}kbWY?2Z|#o3rjw1% z#(#q14Hcv|WD>;FKcQHxL{R{_W*a0nKDK8P=JQW$MkST+l;7V-sx{ z_B6J76m%PB*wzV(ty&}v40diZ-0qSfXF5!vai8zhfQH+7a||pOTr()job+V*lhUkz$;{#gESXmBKh2zKk6AfEUi0h}uS&0GUpPA* z30pt%B8uGQOVI#dvX--Fut*MDZd(E_T{mMVpnR=jnto0b%8 z4G0|v&ckl7Xp-sP1#L6QuPR#>8xJafA>5+d8udW!%U4_mvH(0fkfa!k>40VNaT+mQLP6{9a-EQ?f!lb4{Zv4N@p72%v zdD#8WXFb*iOrXwwM|I)|*^9v~`=i2bvq!!OZ%l_F7`(mdL%=$;DU?RrOiQEdp=pTz z91-~1YuQ}X+8A!iA4?knIA-~!?XD^A!W?oM?=v$%oT95x6D^pPRF^r7^Jj=2eI+g5@4q-%S`uP%bX=h#s@e-g?-}pQ+ zm*enUp}yTn`Gm9k1S*B_&7I1|qIdF(vI#!`bN@NY`w@(i03c7WM6#@K-Ry(rAS7Li zPC>Dpg6e0&%GqkpuCB$QeLw1{e*1dCm_b9%8tD_sPMOG?#&;qN-nh0=ocNHNBILkF9SqCwMJw**uc_K^yo)Sl1O6lvb&d7!z@ee zDUD4MJrb-L{Ef+hT5_mtq!9B;6uZ<(@?mzJ+j%1YvP}w0SH8ZZoPx}a4WhfsJ?d2VjrlC1r-?}x%Wp9!07s746(@ztssmE_G$_cBSQ zg!pk|WoB58ku98Pw$nt)5H(V{HABIN#W_S>E*2QU6ay)px75+QkIDWNv4EQ_EGrB^ zZlaGsO|%Xa>d9yqFb>F-C;^v zcFOZ78-D>*U5lF%XL0+tMN%MyZMVXkiXx8n2qxZCNOvnQMhayfzn&ks+=o^Y;BFE6 zOzd90p+TA}Uf3-H=Xhm!hT(7ztF+W10Eb>))z+$c4Kbge^A>X#N&;vZ%$PdgNTCZK zZbW~ZR^$Y>RwrRP>W;%X5F;xf!m~dx(D7QNH7rJT zk~*GeSK(@Oa4tL0v^6Q`q*JLlliDf0Fz5OTzS6`bvD*>U=h(toR@vCq#a#jeNOx^C z5wki>&ds&Fx7TURS1j<6#MCn*aQe!rrxc&Hbkg+|5dx6!BWZ;;Z?o30+%g=k?#iBy zY2J#w9vgxHux}7U=EW*!wzcV8NwC+pRXj5}d{8-OE%tOyy3`#a6A!!#-)@>1iJ;F@oi|g&}jExF^`{_-A_PXA)|!Ubg$;! zn36@+{Nl2(x9i5tkHX_OYr@W}N<#RK6Qt?)BeFfR^ll^W1@}+#GICyUq>1S_4FNEX z(h=e)j2&BV8FP&68iVL{=HENjW>kK~Sy+o6qx;EG{hKAJsU?O@f$tkNk>YNi-z{l0 z|6if!Hrwg{EUmiZ-5iA($h&F}W9NT;{Bw^9?rsJ3q^?Q)XrO6NGQ-T*dVydfwz&_4 zi(u;a`LQ5Kd93T_TX9v@X6ALqK4wHiXh%%7226fZ5|ao zqOWdO-qr4@Z`nJ1wD=2PUQyc9f#t#?p0L|%XKQ=^6vK-ug;33fVhD#QPx}kvyqH%c zOnUz~7U12jH5ns;87vyMyC>=LH7t^pi6&T*SVPqxEh`^E!`@g8HHUeV&n#qnl?y*l zMwBLuM17*TcRH z;ZD9M(cbqO_KzCZu%ChQP!vB5At#${0-HPyK1^0Vkxg3enSD`o7e*ak=#_h}!ghA; z%W!gswyKz?Xn^860YVcO+8f`IibAOL!J*~lZ^tZO>bFP2hfwArZ*eQPvn$2EGBxD_ z!m-vO5liB~0GOdOQys_?`q5|`6^RbnvJPd#ED&4RPBcDPbTaEoB%?hY>R3uVl2lWX zjM}E7RL8eWZ_E1-E0NO*RJ-jfU8-SCGyZNtvaX|M>ic+&T-A@WsdwSN+sD!52CWbm z%4qrOD`o@~g4b@=7eYeUqii)ibVMMJ6+T3g?o#n^!CnE-#?IH-cPEKaylXw+3GRbT zLU?A{#&7h1A4HKO3xlhlD03frmYh#@)Ou%%bC$LSwtlzb?WVSRK@N7M^@w8X9u0f4 z`{jyXbN7TCV2dgEb|ksgUEIXD@F#946_V!_OGSS*J!>JN0vq-><4_+TQ8H4{hG7B? ztqSZ^yhtxtFrGeVk9oSL6icy)n`fazYT@`EbX0OJxdv&anlTazl^Id8L$rt;LnP_5 z+MJr?LSvu!x<{tI)NSmQvC7-i#MnbI3dw&%3+xTwdRx$ka_!l0-ANp{rF0FjOAfLM zU-*ks$(D!8E zxX$=52dt|+cuEi>hdlmg5G#9~lEW?Vx7GcRWZII z7p#7LIO*mmOQvF`QsW!bEi=UEKg^-4aL*Vm?V@7bf2_HM&iw}xX75LQMES5@kYf@# z>g5_^57+{9vQtUYpN)A#Fw+dneSU2Sdro|*R&^o*zwb1SS$+0&7OPp>{9t9Ob+^)$)1;B%t*?G3Eb6pC1}ONVYp{}CU8xYkz%XP=MCsYKb* zMtK6cH$+2ucpg1&w-`x zF`%w}^TCTOg~cw{vM{{9SyTm-bH*FO+GR*)=U&PF zxwlTqXZpGO`JYFP;DK z^;=FeRq8ipfjKix-TFU>{Xy#8-=`IYWUaO6ywoo-+y~>GNVlmG_vaKM{azy>i&w0`ZBCm>fXD5gXqh*aw;L3~>z>orz_*Qcy ziAplT>>zK>>M?3?!v#sN9?e8kLpopHetny-|0TD_zJWrT#p>h_wQ3SNTm?V^m%V@; zNuOcW?8)Wc`-VV;#nBfdWani~<2bPF>knBn24Zp*4l+~KKHD@u%@__+G%Qui(yb*0 zGs~^c{JNU^g6s29+^(mVdTTz)I>n`hI3&E<Az22BgjP+uoj7uQfyOS?UXh8fL;N$MVI}* z@m8}J-G8@I|9)k)RoBnj6x6f^(ATHP$&y8dpw%fO`W+2$wskM}&uW2+9BaxZo?}~| zX^}p9Im9{LgbMqKsv{0+!Zl1|Z~L|E^m|AsIE1B9+XLV+DQr>RnimWDaq-oE7E3WJ z9Nj(*Gzr}RoTl6CV2X7$Gqz>4!HR9IAad&iYydG;v{5cSy-W7~a2tb4P!xpM>&|u0 z8)yzA;{3>SHpEqCkH`H{*)Fh+x0~vfkod-nU!Nb&4$seY=vQwx=TVFF<;lkXhm`j4Np~8Mo7;?oU4;&ck!j9?b(w|F0mf%Hfpg}viW~N;A z$f={l6R^=#5VOohAxqH_;pG~RHuoFAfILSB+nMv7urA~n?83Jw=3a%-uAQPQX0x}> zvf_dI6$4Bj;)7s`vv63<73}|f%K!h<3Ha~-c}Zb@KcF}TVZCDM_!dKBj@c4~pgf+Y zZ&F+saxm%Y>5U0}dhJdsWtqLC`z^71>!K4853*nElh(6f=5Hi2<7{f2sYP>nZ#J;S z+_&EPUJSL7-L?&in|n1CYrHceF;-0&*5 zt1j?W2O5X22RyrPGbo}`Z9K=ygO6tFhF`fzM~=uMNdWdZL^Qg{F-_WJ&oU>J+u(|` zZprpbvIHF&uaews-ucrZ_xl=87|LCjjtJUHjO)rbs)0QID;x?m-#x4z%9V0g;2{x0 z_4dfJ8+zz-`Yb(q&r^$}SLb@|OKVK|8XghaD~iI#vNW-tA#SQT|G+)9FwFVL$|ov; zh6sVxdSroDC8?PhW4O6B(&2Qz0Oi3Ibz|Sqe9;=Zhh^Q;D>v3oEgT$%vk@zlKFu!h z1f9-4b4Ra(LwHiZ9(t56MN4ga$PC+t<5X~7P(dh{*;oJPN*jLkHmz=)d8W6<8zL*? z1(8oy?HyKqjlVQAz6H)+bv>$`A-nHNglV@r9JtyTp!y;Q-Na?icT(TSde4pv4X$DV z=f`))k{c-aDy}*gM-b4CW1RHP4LF-~UYzv4)F7d|1^}BLna;3Ql4wB- z+YL$XJ%n*pg6k-6MtiEL*RXp;S}o);w^@{0eO;7-(T1{a?K>a^((aw zt2wN=CcN8Nmf;u_o{*$UIqW<%sFMV6Jt3^xU?4zxXt3mviVUD8%SrclqL!#>1o^(4tmW^ifz)_cy_wr{RuA@;Ebijh&6(XVn7d*wz!M&9 zP;;aSP4{}cgn%Z_*T-sxYl^d_mmw|Eb8mTyMy~5NM$ZUP8;@W{T-)+$RnC?rY(P&) z)Gg^vkRxc--rnjD7@~#s9BN{V6lD${9=ooGy^y>!RsA!U+B?H)lBm-tqq}7}VzMWF z3tiS8{adl?u!?V&I@9SE1*vU~XM^pc-2>ySbY@zZI4^G?UU16L?;FA|PUV}3wG+2| z_coJ^FZrG|&f6ANZoPED%I(Um8!L!@nedZz)d5Z$zz1s`%bKp9ee468^&Ypr+`KJM z2u{Z(1Z~=7eY==#x;aBowG~>iUR5po-pz<4NgjPR?lq49k{G2t#JbvA)F#HW45yHChT$w-~WZFadvIVJJ#whG0orSG0pRg3&_);kqi4c1} zNy*YOrq)jK^bY@;6L}S%v%{PgdC(nfhE(Hh_A*lNEZcYHg?ugf@lw_%qVyYhcNgu0 zwPr=BjAHe16KxPf#6M0{jJXi7$`!xv;KH>xQ#{AhjyT!^_AGOnlLq_kxALr>xjHp6L zy#zEJ|C&3az&(cN?zdm<>ZF6_F`h(c%i!37R-&Fkbm>RcV6-|{QkI1=KDHHq?vFOv z)$I}Id|!W$ylF$#G6F+xQxA<(=)+`5hQTunrHc#Qle;9SDK?UAkI9=SjY}dOyLT!t z@BbF(|37#MF<%FV$eh%YRmw&uSPo7A0t*Y<{p8LCwHwJ{(;Y;uJkPXeSg^RL8&~>c z2L@3uOTm7@$NWlRF-UUxE`lDt4SAh;4GiCsbron~Jlklq4s&btCzbtWy+c3;so4m8>&QI%j_>$ zgX!xJYk*~X)0}OON3RckKgAyq$s3^#k1M5NmDoK@@C|9hZYvYwXUv-zy@-mt6KcI@4$81eJFGmFqib-O9+ z1=F|u`vTF`#r+)QPJbL`0^&eDt(<2aN>Cw>5-Zp%*Hk?m{_trr;*y~{e%hIZwwP1> zSvx(lZyz_%{D(>Yc0?|-H+%ij-b&E0si_dh?22(XVKPHG`YzX6T#(QP zTi&zWGsJ0SSs&806_i0Zm=om`V)!Rsh7YVq?3aXqi+w7j1GS=n=p4Wz+F7c7;6XxF zWMX2=zlyS)e`Mt3L`Wc(TWSD@?6DXn5&Tz|Lvtod=`=t-HMsSq`cs#i{(rsPFl+qfO@BSRKTro$Ipzvax4FUwUjMkze+MlUa z@>3Asw&Nl!cKZuh=fO%dL!*IyvYv+wHqJ~spu|0s3NW*2245$D-g>y>nJLKlNSuow z4?Vv8%GB-mn!V46oeyX|2|9nc7HZIjy2wWsUmnlsbgsSnMhlV?h`L!ko~~AG?gbE6 zEN-Mqe|IqPjNq-Z%xIHV5xrzu%WC2n%x?y!MXK$(iL8be${$Q^Yx?-ei<3=P?0aTF zW8GO<(u-+9753zwq}~h_xirZ;_*&r7FN8v-|-fyPOSE zjXgcC#NO$O|1q@Owqe%3f7I8iA+W-O-qW&WEx zsBb)C-gfUwT#~@x{u)c5+iN6w5fk0i=?Lw+=j=sqdq>@jZS>gI2&UMklbeXY3;iD; z)&^ND&TW+fQ8RH%v=mK~`T3UNjSLBLJ0~Jp_fvB|EZl|G!~1df#v$ljN*L|-rXmD= zGu9IAJPXr{E!2QmQw44vPUz9M(6C?WCvb@nR?1e+KxbsbX(B#xWO)xPhi`#BhwAIh zRr|%uz=R;RTcvTb!K`J@CYe9!Oz9S2Rm3fX3@4HVi@~9#ASPQ`daHH5^;}17hs$x1 zEEqR=Bln-%z}4PoL1;xCenZo&0kJ%LI0sFX=`nJHx<5bv2`G37wP{J&JOe~`>SX;2 zB=>4KPJE~74}G6yk7%3Y*8;EGkKZQu*4vC{cgoT>1|^N89ZuC>2gKA3@7JspMn>wS zzMTKV^kRGfNo?ptd&b#y<^nL(`S2A0Puwo-c3@>-Y-W{v!w}<<#jPB4eLq^Hu2_}m z?rL~djniBT{v4=WFOVtx+=fZP`eo}L{H`}85W+VVGBtOfvO?XIFwx_gKg&|D_5U&V zmO*hee7@))34tKNU4kaKyC%VdYjAfT+#vxH0z>d%gFD0EgS!)426uONc+NcUdH0^( zv%9D6t=(Jqewga+nlDpRUETlxPaU>mNjy!yeZAKSvw5bo*?2`-}< zzO)|}+T?=#VZ(Ld)}bTq^Sv|H2z}_%o0@lg3^eR%I&yF~oeMdBwW(u!f!5?LqAm{w zG7506!kzuLYSY2yfIJUq<|WP>lFo#9EKp7p^{qmlpUV49jyO&M@9)QL+=FE3=t<qKuCsW}i;!f68k_3D(yBV~W<*q1$9ge)AykE?Z%Rk?QSC56hcx@~ z^VpS-8SM9fIq+@!m)140VAnqJ+vhKb2fCV3)9c4Rvr%jgybUbUJ$DGMM;rJz;q&7E z>Bk$V+c^|s5qCg^A88x!xmUAAp5o@)1Csj-U>&~){<>0>H(@zh{7xiyZJeirMV7Wo z7_Y31Q;JfG&`D(Nz}V3HYey^9*(XLZV};PQAN>hfaVV1!1_GwNuI=T4)L*GkB2afB zZ_#L47FYWDS9)RPT&S3*MG)6>c?Bw3;`;o6{pY22nx7h;N<9S?L{O_%f~3DY3tI>5ny zOdA(1LEZdtBL;6bC?Uv9)z>HDB(td9*nwK_QsEBXeZ!=3c3p`=f#NY>u3Y`Ra8lh;pjuJI z(F#wCuExCHK%-d=wtl`nA}Y=dGv-MP+(^K|v9)4=Ct7sJ%DbqIr`)K(+HsxK-T1mT z=tpE8hp=zw^ovx8Zq`1Zwe5k_ zxOpD!UIhDA9!ktTJ~ct3!1VDlr&YEU6iOvT-|JjHeI)-2AR2bh1$|Q)YmOp@fXmeK z2V-*jPhHYmAku*=+sbuK1g%Z>(NpxG4&I4;#n4-kmDmk-$)>osUj_osRW$jJrsAOfn@mC`%n|FT`_ez5`Qg(?c znCDht&tR$SwvUgo#dcf&b;8>E!Ex;mM~_gU@*NIGDyPCBnYbaAMwYcDUy1!bFI$%a zPT(;A`i`d#-^fRQO-w!oXEzt_KfXu)6+ffGZB@2t0*hTP+gPh5iih0i}jg z(xhsr5M&_^x-X2os6(E!e?a!$3PKKX_GW1eX1}$X7*(`&e;`pOK|Xo)HR@~B1K2lp zRh-tJ;HzHJhVJRw8$0#36t>a|Tm=>NX8$r3(R6CNV^Q|r1J#Clv@H-9wNXAO=-POu zu|&zBXt-yI8qaPXyK?Oz1iQ3gajpRX%^+1>`8f7WsK!Lwy4qL^Ypsi$KVD|}>GKjE zsfk@C_DYnjC%zqwo9GD(=XK%9Od8~q$SPYB$w)XW7sH8lv;c2wg)fsbCL(%6)&Hm{ z1E3nGIvr2O`g4BJAMQ;QXDICK41m7??oS=?_)$tupwU&K&An9&AVO*K$YJC8s9E9b zB~@qngeF}RFWB}=x$dskr2By(of2&FFb7v(KMTZ58GLocR4g{iXBWw0KH>=TBpmc^ zTRV=}pkZhQ$vLa>%X+*v4cv9*OD=fwn&>Ojv22y=eFzFvEXH@+5OC zA>3B(%^*s?mU%QiMYg>^gd;qN+($!?$waC>K(e`cZylqL2pc>oZ?f~X3M1$n0`UNa z->+5*etrl>kY4R2OzgUgyPf0L)0$MhRQYH4-KkIC_)GoA^d07(C1=mi11~)GdS4=) z7@U4D#har)mp{=egW@stk(S1OW=a6|cu%LNO=sq9A!x*yazRJ)23)p7Ec@cO^1wRbgiyOYLZfYK(r)jLk#R8J52Xc$~bETVY_nNQ z(&Hs5GwSN&08C-I<{-_@psP}}b*Ea!#5Gm6LYu9ogioY6BAklATckdS-IrNXRopQ+ z?wP$(qapIln!L@CB}2r`M-%G{l#48EA_-jS99`Zm)VP4zjVtlz>46`4Q_hx64FMN_ zwiX}2UGvq@@>E+~-AxX}UVf!H14rf-v;X;KF(am6@O@{3=JMeRXzJBP4-)4r8lRH$ zd6re#yd34ZZ|a3LQ9vD8nci5kxvx%kK9(K4i72l;X0SvfQK->vNkjrczZ3NTmzQf6I)gKr=(X;TCC2nvG=s9C zBP-H?bid1Te&eWAIXAY;p*iA*5iQ`Y#S9RFC;>X`+PW=MXd&T`k%!XVwyf?WR8;MWqM#VrimnN;6E= zv?6(N#J!&V`N}+?=T*33p*?YG+4`t*sD4^FDQ-8n>wW-Q!+OiQA%{wRI#}eJK6;rD;GK3~x{0?$SM_d^3flwS%IMHh2QJhSjr9I{ z*u4fZNO9Yk*N4h6N}kE(QGVR7HzD$V6ppzHT^Ox~rkzIfTbNqn2QC5hFQ&XG;_dX~NJdWZ@*QfhWKt%ZN#XShTO~5jwgGzO4Yc zB#xCTzYv2#=2O}glmV8Ux&a}t3t%)hj>DCe#!L}ntUIC~jNGP4&Ue%uolU(ck?ET? zWqHp+eg-4Nnkv!Gz33gm(nxaYBQ0_`3=?x2ghkTVq~OS?vm}#!l#`7Wq#Avug(Ng*{xL(k#`_LBy{{9+>}l!}@- zs`95G9EE-N7Va<27W z8uJ-8TH{{aL#~3RVull0u& z*w%ChM%*MfcNRCN@2}qXC1Hrgg!O7`RpOV_#XFyvsv6C86zPsyyM?SGyin3&Q&D8# z$m-vBioHf}rkZgfKE$MP6Cadn`$@hK-*X;I6fk3nXrA{k&O(c81IU%(H8&O0Y;=uv zz_=JNP7&R&fIhx0Us$`oJd@7&RSG1R)l1ebR4MlpSi^1oikr0-(4wbDY7JMw7;H7?TOGW;@Ji~!VhTOu{rkJ+Z-x4i!wgs)v}yqvPItbk z?q|*ObEnP-Ai7DaY>;gTGw{%M!SaFit{|cboNvWE>`#8A)NU6~2AkZLB{m^czu5oYJMY|Aqz=gT8747AVQ?QD>1-5I2cY__+DHyfS|I*R%#|~ z_MYz37ahsTB$H1$Gc>E|Yjsi6_wS&tEG*QC$_5i|#|Su#`@`SsSM%tGqOf<6vPs|2 zgANP0(6-|_D8tth_{=}nwnldv{S?Y>J-00tGWxr@=rQnQ3=t(T)1}SAKjv!K8(XxM z_!DTP@)q3tv{oM}XB8beKoO~x0P3caDo>N2mSh%CMH>^w&VjzdTr`XJU4OlxUH2f^ zfSvE3jn%>1t4^G(f{pyi; zmlwo;L_ZzQTAa_c?KgE+RV;)4lz~->a8~KfRGUWd4NLKJ4cjh^PNr^_e!j=V<}j~@ z{UUss;vv38#~0&VLxQ%ZoW0r5%j})Ir0z25Y8Q6e z>bqa`i{UCQEjvO}c^({NW#v!gl>FYF{y4jHHEaWKP!_F_zm(nb9xSP&&6lppTUqXm zd{-(I`fv8%|KOhcKYia|Om$l;`ab*QNBo1#&U>3EZgf;9^TVv2gAhY4|D!XY&Vy{X zkjaGrTLNw;aaEi^X5Th-l8Cm4#RhpUj3b+DddeE6fxTDGQBL2|TJLjgDFT)iVtN!$ zB+KqYE@7BU2v#Aib}H#->B?A`dXmLl!?2aMQD>I5+x4ejZ-TzI`#yMAktF?~sSixt z)%EHp?a{QsH|0y_MCw2KWKdj7uchZ+>At0q(`Y@F6|Oocg=&GjoYY_(A^a^hCZy&j z>BD(984=UCZWy94-4m{5bjdJG$iB0gxF^hKDgTrN{~NPa`}+m_PgB@O4=-nPryF7o zdNrB>Ye52Jo!QtWx)0~vC4WZ@A!qA92sjpdp-@ZFNX#@}tKcoz^?)xlf^(ZlAW70l zI--8@pqr?cLirH%9}LaM8DiGQK!x zkU@)oS@tQCyPaP_qx|0j%_;1hbErIWDKOMS=NzM`!xWMI`*N11p|AE| zK^qPR#os;B$8b-aC;g1~rz^@_w(}T0J9+z~}G}g(+x)bTs9!4t+I^@J?kCbL@1i{1V#Y&{GA=`5iHl zdL;+?0)a-`NvC`By0GdWrs2zMm9*FdNbQ6d;mMHUCY-mdeGES~;knA`rUbEP_05h3 zO7hAoz&YMDU8m!2x!+P#k#m`!baQz=varU6swIb`%{QpLv>T$BjXlkClP^CG_%O$& zXShEUWuhHH^6Lc;A zbRL7q#wW{8v~l^$Ce}d8O4DO`|0pvo9p3siE=3Ps^|+E1AG#}jWYT9dh$8@>Uu`BX4Wa6 zfADzGTR4c-_qS76$9D{!s`P2!uu*t=R_9zMiR57{g3~JetYa7b;1gsNKiSHT)8GGI z^>txU&+p*zUbmAizBq|^erXRU{sQN4JcJ|{g*4Am@684%2PPf`Qk;$?uQ>`F3L8-A z;WsRSc4Av}Z=SWF((gLCrr%EYXq7+&vi|peJft4)m9_H34SvO>UvqXCoK9v@T&_`o zjp*5pR@WXM_rCxy{J+?H)73OofGLm}FEGq!LwWA3VQZIs1W21y6t_yH=w9~o-_$-8 zem^3qmUw&>jJ9b%&AY@uDOU*^8RTFm7!o zTn)kt#7NUj);&$f8=?a8rw2E2G#mE+1A5yPyN^_2G+-7)Aa6gi!Gmk74dHTDAHzY? z%tKdbvFbe@HRtw+PsUyI{B1airM5}1pS_slp)$fISClF$8V9-+k6fpp$vwT@`j7Tn z6#oM3e%h{bFZa^ut9OV=akm$fHE7mXVjr<@7(M;e(0;{~MYR)oa}vISwRt+3q5tK4 zMU$pXE!Rnx0Oa$0w&~g{Ub}3YDwCG85Rmq{5?1{!qlYGnhG}X8VwgifN9xPtxzuO-Q#nT2^GPQ212N}e4ww6L^Z?{&PAVB3BxOy$s zvUYsKjW?#dfy3O?s7FZDjC))Zo|4VHx3lKdTBI&M(iHyoW4-wA13hgCoLc$XCKBiQ zSBF%R*1zRDIn;4J#z(m>Mve&D#qD}%j<~pMDA+w0LjCz_iCU2+1(6E0Q$So9f8?Gx zB`^+{$rZiXSXb+6r4_w%b=S3aOI`w~W{XSbqI}F^?;yVAkT046`a#}*i{+&L`QM-s zZ>&)Et;wm6%y99Sx}ku?I7>PBX@Pr)q3Pr8A?Phkzyf?C@3%lwsJWxdC^+%5!;MEva`#LllyjM(>M@E#VBlAj%-7kkXRjNLPugj%n z+;(oD;)W{h%(o1-G!lyC5yT8tixN*&s^^Y7?p|ZOgR-5$dZer3967qms+Niu7`9R9 ztwqC7O=H?rAeuWQEY+C&WCe_YBdJYdQk!zY+`?H*q~?)Dd>O2Rl~@XY`d2(euLkZh z;eV3huzSc{<5YQmLq;1&W<)IbP%KP*~P0+Ma6FTxT1{=lIb*15ms@o+L$VydmW`DzhzN zjAL=l3o)Kg)o0Yvaeo1HqJJy7IkB5Nr*LAsNKp#Er%F8dMoaQ2kY5GTtiiZD zSrIBMNFw0_tL-%x#Mn_-c=8blz0Z^fA9gqoc&Bd9 zGK*FB8h~BUco6fol^|)aFoc7(3-7b`#bb)#E(t{dQlG?UcVDz`H9=UVi06~OW9;)~ z6_=OzoETa~7P=^pB^xLLQ2)Y-fy$x8w^*X<3I*`+RqygYU?jZzdLeknO?$y%T`1JHMvr&bOB;5NQRACZz8KO>ZliXYVb)4Lwk7YHFHH9Iz=jeN98zNFe~< zy4R7n#q<8zjZZH2Vf1rds&gXyf;m9O4REKdEF<7?A33aDu#^BA*!tc75v;k?g7c|n zI&Y?SL01jN5waDp=Xz1)C zM^^C^)bs~F8|yj$G^-!xv!sV$8M-*@t(rXUqQM`)YJL+YB6>v^`g)2_Os89?;6kf8 zZrgm)^-k578AK59J_jqKG_;(n@HqFtg+f3%&)G=%S+;F26Yr6ySaB;2R^t#XK9z=W z%Y|Tu+{PMOsP~DQ$>n`{b7>)jb_PuXtiv7=0jw*p?PzV#gXUjSpZ@!g#rwXAt?{M|TLaE)ocu*YTw(yK8YH*Ki@92ehIT^J=j)ln zKshtP_8ZfIXDu^w0`GRyCdwFIq$M>2NXypN*Y{t@M~=6?Y!_OaspYhIG#7*x5221rqVH1f&1ef@ye4bx6d9B!Ga z8$lMOPoO{nOWrl~icss_e`xh?m|+Ye-d{JbQ}bc2xa`7>=`2h%+AgV;rqbW_l}WP$ zEznZFaK_@7i4oy37!BtGPzE}{y>CwYh!in5^3`Hv3k~JXix~3a@SPd8q@Ib6VxXUO zqz&AYKN#x$VbZQwdBXT-;P2mmEwjk?KXntmc`x0Wd5)PC-l423`h9IfojFQa`CQ%PRZEjK9Yx2D50jAE~atc2JLeVpH&-&m!v zD7q>1kT+0%DCYGxR!P=+yY&4##S7{lqs)RmSAFIjnJixG0S1G8T^^!4}Z`} z&|3^P;22=^aW)eRIB1P#P!KJ;qv)e#_3+YD=;i3nB!GoAv(Q&?62m?%ETsR^{N=U* zDiOM0Zw;L6wkKIKJn0*nOV%29R5V*MjZ@9Ka+4gOYR3#v@^NgL>qROz(Aqron-{?&>f#W%(Y+*uYMd7K?nKYy9UKSRcIxPQ47ziNUQR^E|liO@j*ijb~$9_AZ%G z-UM^-qE5EA@19H6db6VRlnXJNQAGBBC--Xs!h=jORb5#KQa^G-w2}K4y-##oCQ@S2 z8p++{xdsAu`OaL^9{PTKFTR0ZZ&ZO)_9Uqy{?j4LZ1J{G5mtXrWbX18pl1`SBe1Y= zOMT%sbj0l=Yeg_mqcn*`EH6^2G#{mf7?{D)$rFa`41Td^&pJBUz1Um-&s@tFq*o5Uz zxvBJ)uNAr$Oux~Oo=?u9*3jSOkZ-p27&p!l^XZMyuMT+`UBlQWR>z*{m=8w_MoAde zK~1q|qDsjcp}K<#aL+)56Zg;PEyVvi5W`*473fOADr-6vbXfmrKg6qKfDjo$4Q~_k zl}c}kRU?;BMqd%XY8mND>T6w^zVOWOHEZZ_Vi^;cyul)RRCFoZZq8iCu9^vG>o@;NE;9`H3(&Mwj7zH#d8X2i?o_CT5UI_Sl^A z_gvBGh;*S&aP6>^yC2y^sFBpLPohb{3>sdl+!E-`!9*T^3I&E`URr{7#BV~OGCbMh z_XA?sxob{!^PX*tG4B~)k0($s#mWG0qhi{1su7zT-)!BPa*FG`Nd5080nF#b%M9P& zq%bt9zRojcD$X96k_Sa&1i+5mf#^H6y+Ha;?~ecC$ZqsyBigj^%vVm4n0h6Ax6(T)Z+^z36)D36%q_mQP?uocIL*SoQEAXmQPTnF*jpFo(gboDX=U4C zkYd|U@(!!>)xP*mC9L|QbU|?aTSeIsh6Z*eU+YGd?#;$imh7cOK6`cP*{f0NnP3sUyOVWLh(Ls>IU@vB*?|v#I~kBDFMk&zj>rrQDBV>EJs(+6 ztxlRaCP-bjd{6JhO@heyd-!nnD(XGf=uBh$y31MgggaHO=U;$TP$I*IQvN>76Bi~f zuf`0mp#KWWkcY4luZbs`EL^cPMJq)t$v(~FbSSH=yBXf; zk$XJH@edN!$(}Tirj0g_CZv-j)RI9C8ADS3H;@5_UU_WcL8^ZeSw^0Yc2&UcCMoF^ zRm39Dh;BVISVPjH>2xHA?Cn5pvmnc;pzD;!YSh_O>P@4p7DAn$Xc{V3ELhl($2^F$ zWIX~VX;FMPLEo#1WE7LN#Cj3#d#2kn^0VB~7XH=Z`uz8zXTRXalpj3HhO9#SW4&2Q zn%6XV81>DaWLQ66xA*#m>f|S$J=gv%`n%?Y<*v!d=2kj2yONkM5cm1~M}FHR+w_<1 zOs~Nzl)+gz_-9ASkr}zu9<#^8O+s=;K3)!Jzv>4TCKm+Do#jKf?>)lj8RI_Adfwmb z%q(+_vtF&B+j$bF(M8IUHcv=QS3P#LAtOOaPsO7hEv>$PIN3jmX|^Yp=9wt`J&18V zRhoB;acncb)2y5JP)c(7}j;J0s8<%yV?;risBu7^u40koh6V0YO&_A<17Yu9scnkRbr;-p2~30)dWRqf8x!tJyz%FTHHs$V zc8bHDn&2o&YSTeQH|0TV)?GsZhM5L4?yEC`2pc0#lKE2PjoLz`ghIK`d$-yPE^l9r ztb<-p*j!MdTT({RvRyT#E&~;&LG=S~hiYfc43TwP;O2t}t%G+YymE zSzwxn@g6aE$-y4PGpt{f2@S}pzGIqNhu{I|(~+i9r`Cuf|A@bx_}cio$E*;|E{Qq> zC9|_!-$;Kc%Z5P*)tVA#9fvlUDd*qFCEo#{qPJn|O#1cB5=a(!?~>N0D;tz0RSHQZ zB3gVY{m(XSY_e0Gu?ux%g`8N?e?;)Zd+;8886LgSXmlsS7Y)Xav@(l$CVm+PrT0?`+I0ZmcXbB{Eq6I1EiAud}iW;<-mRvYfjC z#~wo9e4CyZjwc531xMBmmm~%TK6lwU!c9WK9@~v1^yI+Qbx64{P+!$fSGA=y6d~v} z4DarBskVYF^{z$1A&)fph~!ZYPva-~W@iqGV|Lf0C!o<=@*y7&!e$JMRBPPcpVPn7 z0pfY^iPksc`d!aNm6KbV_&H8#&O)9-qBjRIosFETPK7+8Ach_d5Uwid==s$m^v&5x z$3tZRKXlEzJGS3zz`O~wu=t${YEU(NQWWXv5?;M28^s_R%q_SsuY9^0oa3A;ZJb1jnroh&_T-_|!^TKWW}9{L=?d zKgl>DT$>K`YBkg^@=tg`o&_9pJ>QR7CA?G^gI!-yYuDqNSW5Pf-6h<<;*EWL_(909 zzG8u=rsT+>OUX-lrV7FVX62o6wZ4x@hewa-_D{td(cF01vGf<2Vw_*SE&zdimzFMV zSj_~jzM?md&_CDLC67WCd@H7fQ_1x∋bo%1p=PjZbe9wBT;LD361q17^#weTMd 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

        P(rDZGv~<@ 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%0Du~iJ306L?pBn7>$9iG2@+Ed@sACOHRs&mD`Aw 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

        iH!hU`;yn{w&wzo;_;~V_uGKib8ND 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

        vJ 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

          o>{VA~4k;{F0!+Ys#SnRAR*EIV0P$A= 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

          9uUAP!_$tF;ebzQqg)h89Kg`x@ zo#$2gFLeo&WU*&^PQpWk#BoUlbio#ExiCY#Fm}Z-c{LY>_C#yhL{QupP_)E+rDzso zn2Wvzg~{lQhOvvb7#YJDj>)l+{{EO9^Tm#d*dJRNAS*ItM8=ajGG@FPW|YP#1Db2Z z>1r$*lWhb+Fj;U^nsDs0rpX$jmYSkY$1bZ`s#yd$TLeI8>X{wdI^#370a_%P5q|VX zKcky~^lHC>kwtS_xhWhNnVc;M9JHoL%#k#$rCP1kw9n}r&50b)=`^q8&VJ)V*5p6BVFz;(8p44=id4WPvAXsZIoJs)Z- zN~4?}`k_kw*`M85O84QP_rVQv%Ume1N_88cuoPX>t?krBpwdmIEMq?8$w%U?>8I`?(W0-w6s ze9hXt-~08=t*c-ACC=gO-%�1*qW{)+eM0zZ7Tk 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

          T0PG;$z^L{UU?Mg&HK848xL zMNsrbDHld6r$#VmMQL$tVbo2>(q;r^{b9+QcgoH?fWSWlDM~@Uq zQuj!iv~-bx2UI6@nS=?Vv`MxpN|=;&r3471q)Lkbc7TI+k1%M0GdQaRON2u>ZKq7a zR7}AHOoS6mg6C&)cXtOtozGMd2qBNmv=AH7c#nroi&r;`7fzVBPI3NodGC}?G57>L0bJCIY9VHcQT8I@sv-zQVAfdi}oexfl{ zo)M#+;TpXG8Ke=TIzR;J7o$?uRKIZ=!=Y4Jg``xK9L%8tEdU+#*QC)Q9%OY^Dyld(07MWeWY{RF`drYJhSOzT*5!s%HZ z04U&sHj+*LHxD2>%fWup=UK(J*wu#Md4jaid5J^+qh^H4(YQ06FS z=Qw9nFrO+hPLr2-d4rt}k#`Z{5P~*K%9&`16FC66{%DN`X@DSUl=e9ZNeG-HI-{eI zpcZPGwmPpfk)#H-9cep?pa=@oYEzqTBMCesxo#&JJtS#AxxkdlBa^x|KEy_o;}by3 z=0C_rKK(P4I!QhIBerwPKKJuK?qfhl*_7dyl1+&~fQz={W^3fuKl3J%zH@B{4tA3WRfLBJN@==YN@$t$(0GGL#*Qo2nPy-z;L8+3!zI0qHvdd*+hG3aU92S zBBz)lCzx22m|g@%Q6xsV8%DirbDm(CzzauklyfX6nPwD6$s0#?1Rso<)QBbeyDHGN%Sp&p7D*f$uDaek6PQ;@M3Hl-Lu zKp2rB1W6@S*@vSlAjbHIerSvuzR??{fdfQ98uz!xQdJyB8XR;CrN=Q

          k=+Z*Kppyh7a#m%(pRz#)~IYZa~;_UCa$EZ)VWoL4pASMw2dW`ZVg)s#mja z?fNzB*s^ESu5J4^?%cX}^X~2YH}K%XhZ8Su{5bOD%9k^5?)*9Q=+dWCuWtQ1_UziX zbMNl`d-MW8!jLa-{yZ2k z7;>n<0t*x%nvIP*`Y5E4N;)Z}m9lsMrV~gI!KM-HvP%S>e(I^HpNYwBn-*KFrkE;A0JF_9D*yqON;@sJ(+%)I z3I26(Ac6$`N1(Ug66nIX9+2z8x#ps~F1zc#&@Q^~zA*mpy87i%LkuzGkZ%k%*6H!#rM8r`{q45+Qd;IYfTTC(MoN{jA#T#Cr z{Kgh3zmdipF~{*n9Ddkrb0B^Mva=t51Omv;fCxRb(1H{#$RC0TLWt6W45IWPgfKlw z)KptdH6e!(q6pQ84C3`6VP_pS*<>qH_Ss=0QZ^!Mw|xjAimWX++;O*UH{N&ao%h~- z-;GY&w*an+-?!XtIN^wlqYfg8BLaBa+&tcR;)XMhh~b9^jt)A68!k8^>g1vd>7;kA zis+@QPPi(Fla4t$ptt_GchuL|+S3opv>$P-Td z@Wl_GiYV2q5wxXkr~20SF@2ArOxM#3LTjh(KTh5O}}?79X)QG3JbnVqAnD7NN#8 z0%B%>c*7&!fJQ%b!Dd}pgdDpNhdR^|{*N=8*&Fm2vn~)akX?uwAG^Q>LN3w^gnXnU zyWoW_NK%qs;DRGBiAj}tAq^)p*%q+CGB0SMlqEBz$+Y0HH;hb9r5u?lO$p0b#&TpG zQ)S1#P$ymTa%4}a(-o%hgeM5|V|5zl7m&HjVkYwmMyQh!qDjm76FffS4& zDo%9@O*qh$sVIf2Rn>|Jvbq(jWMwdV`6^iTA{VjZB`tPIOknKdn6xtHF?dl-S^tt4 zzX;|qgptgG+A7z=NTx0vpp0QS;~)kRcCdnK0E8y=fC5yjv5tK#WFsrt$x^nmmc1-y zGppIna<;RcZH{=zLx%H^mOWuGEql^)+Vs$e2CmJI3_#Er%w$HcVM!2f<1$;pW+p-v zBGiXG)FDF^>O&wRZUPwl+2t~~xz2qqbfYWX>0W052H3$E$iRj*_~=JKB2tlzR0~=t zNlRC<5_+YCr72-4N>Ki42YkTMnEDBXgI?e;N*WfiMerqYEjb`j!T>8e&H9i`m17N(pPtqfDS z%CQ+h0Up4C0}04K0s7Cjz{M?akxO0ULYJA*46k<4D_-)-j|=p}FBrrC2K&<2z^JLo|U47M?sSfLRvEn8gfcFsoS| zdxy^6R-W%)s206VE4jq#FUE4aBxyD@%9qLd8m zWFs><2lcH*)tyYN{7AZO^kKz@-c=*(J3$TIWd|{i!E%bLk^tJDN6&wU8JfT1S^$&rhC;V;ni zLm{611gHJ|8Bl}n;GqIt=>O?J5C}mK0ALUpltCGRKv~2=IaEQMln@*QL{8Pb-Z7*=65NQ5}R16Y|Gz9AgOp&ZU39oC^8-XR|5p&mkqb&UsU z{b6~emV3lUeYh5V#DENhz-4&Gpfn-}&{kmh2U!4$S}@pP4T^?1Sa3ahy z$O16R9+sjho+2uyqAISUZWsUxh=F$Xh<6DIc;P}V)Pj=WLOVE#lWa+P{bK%=^dfxi z;+NdQEX;y^(U+NALYlBi9H0Rjm;oUTm@Q2~J$aN00EL28;$d|NggpQ$vZ6SSBRQ5M zbTtcyc^Hp@7>MZ#kk!hL<(P=M7>m`|jJcSM-J^=pBRlq^KmH?**;tI>qpbKCsR-GR z;mVL5S&IhnF7OSC-8lwsIKnxkfA*#~%;xNysWfJ?WC*_oB(xv-15sLPtY ziwm?FOUghD00F<;K%LduzwiJL=vkim*}*8x!Wf#v0OiCSS`%zc6clC0Pz=aWnxrwM zE5%HvolF|QOv^l89VK2J+{_!~jH#WPAEX)}D9zCTLaQx}SuRb~IQ~tnS&i4MWz=}h zt-JP-nn0x9&5cZNa%tZ{ulz>NzoKd5g1L;-AR!Z zNs-QsQ51bB-!;M`#6cYFOdP~f9Qi@b1VZD<(IV6lA=!+HhFTn)LCn}uAl2yQbpehZ zlI4Y77t}!{WzsZS5+@<)B8}1~vCM#Jfy!WkoRCuNO%lt<5*4r#lxhJMppq-uk}6$+ z7l5fMmC_R+UoPzuFAb9_ooO;jUoH_}fxRj8&1v>kpEqe=HvN(=NmHKgDfCHGG?`zX zhF>~)6BQIeItjrOyq`R^Up|r3K>5==`4j&AlRW8@0}^0D5yb!L2@51tKPf~+>4`%T z6cL1KN(t0PT~tFPgav*SN9~CRUPMTpltsLh2}Yp)O_2l(v_M9z1WAYlOPBx=yu?cI zAV{c$3FL%L*n|w?;7$O=4f+I7B!yHs#ZyTI32fB{bn6LhKni5lxO(eW0L3ICNLna} zf<$3iMIsZn6}$#Y7J6YM?iCf{>ljvHUCC=0av^0X;TDqNWdxRCX~thQqJw~=MmDU& zJ}ksWti(<%#a67vUaSBV01Au&AOfOl4I&}BRwC{eCN`qUPR6=w3vQJ~Zygq5H5emm zq9=Z$hnOMRmSOO%di8BINfIa>xE{R_gR0I#;K!RxtH};lsg-D1b7tq$N z-QKO;qN9^JWUdsXJMIcRvKTwU*x&+Wj?v>h7H;AmZsG!@<36s9#iNO>3W@Q`s{9H= z8cT-}OQ%3&L>7xgPUHb>*yxh(vosg!j&78x?nI{U>W(hnrU;fjzy@fGm?emqg}}Ci zBuSRpN&4=(s3c3WnVYp_OX>#=%p|}33!v#FPVPVs6wJXS%)o3lBN=Kd58Y$nd@d|PAY0ykvN<+RP^pw8YfPUrmFzMUqx z;ZDAxPU(Dbyv^HYR-52trUZ{>zU>aWx$x_trelgQ3EvLE;pT7#4{%mb^H@*!0C93A zXK@bk{iu(|QBB9G&mf4LcA5`%+K>6bPsi;~{zxaxc|yv`Tm?B$&H3CXG*HcH5CD|| z&cSDVa*%v>kkNU9)79q&-6zzo5Y5)(TTzl8l7kwp^+TT3?31lDWfmu+06M8 zQmE04ArYw}X`YZW66bA_{v_2wBgF|+s$R*A5~kT+DXGj9Op+?aOvm_gD&bz4(o!(Z zk}QSkGxO5%$*C%Rfff)`nGT=xEt5BMADrqE^95=*WuNtV-!DDW7mVNdi68m7bNPLf zJVOD+Y!jZyAEZKRp3qZ2^>hC9lRxPIKnIjU5!3)86aXUB02V?2Az(Ze!KgBz1`0$3 zg6c_8#6nQSMlqm9WW-3B)JBEWNSvTc$y5r0L=nV<3%*24tV9dKL^j?;O+;%AS}P7J zRZ?K9wwgc)d_V~}#RjMVR1hIi5Jd`bMGhL-8nciZ`uv9Lql$hnVisUYC zKazLjLN0ozw|cKPdk3UEPHvCI_mCarkQob-6d`yb!PP#<&aQ3r*fY4%j#h)BvCXOiuEE!9Xv<6xzc~j1OdtqG1fiL`+d? z%%gGdq{&{TaS~Oc%of0mai4D*CEm^OOwbU`AHc7w2@TUk!m35W)G&?Itfkb*<=5O= zo9mjb0dUzUC)^a9ox6=+)_JqFjb1uipEEGEDWks>&Pj;5i{T%xPVexmqT+9^^b>6}x{EvE8 zyU#%owpWlF3tiE55C0RQfk(T2T`er%AC!XWck&Is6%wRkp z1u5orJQq+>BW=QFAWsX`fD?I9-!Dn-eyv6QP!$I=M4CZ4)?&{$D!5 z)BCv-{5@(s!4o{$AN~O}K$)sT1t6z}YN#gELluMr5|l#tpPpPqMPo!md{jv7iAU)` z5hz4R*D9`FL`1NF2#)kgkp!@&AQ6N_N)xL~qXe?108D>GO#@X?2}M%X^iyH$P|!qG zacfdzMGzigR%O*p1V+1-MO1%9WVq{Bxs`57p}sodS?xX+!d34xMq>m&UWFm?pLOv6 zRaz6QW}M;jYeoY+VqG`@8!Fd_SHJaNKlW$8_HRG;FIQg!wt4(@d%%Z$fPonNfP;L9 z$xevLMu-|_HS8zIfbg#FW(NDOe{{#~ChGquMp*a%KR^f&IFMjLg9j1*CRDhPVMB)x zAx4xqkzz%Q7cpkkxRGN=j~_vX6giS)Ns}ir4rn2U4H-6U+QgKji6$pbvSiVsg^MRU zcJ6+<6FPKgJEBLCy2GVZD9?7cZsCH83)QJps8DUXbjcAOuXy6bp+e;i6)jV~Jb?m5 zh!7nrbbRQbA%q6I8ZzX~(10%kzkmHIV4xtu0F;LjCsw?eabw4iAxD-xnQ~>zmoXAJ zuvtRq&JiN)61^)lY0;%em)5nKHS5v4T(@S;OZIBowQb|3eS5ZS-noC{?(JK+F4)Ca z9~W(WdGpt&p@R-RojPgh*Rg|^Abq>%?Ge6v?=GJF0ng?onCJeizVl}Hn>D{bK!E

          PQSlBd;k0a1du%mCP0t81I07YJM{kBPd@nQBLK4rDU56Y10K-80}VO|!GjMw z=-@*SKP=J24_)xUg%nj>F+~?)jM0S`R;1C!8F7?>h8SYFL53J|$N|V6dhj8K9)k2? z2O^d1VFw@D8e)hjg@_`GDzCIMiYB6%qKYo32y==prl3MhEvVQ+i!IdD!V539c!SM1 z(s;wpE#i3Nj4sabqmDQH2-J^70x7i6NZtU%PDBA|6p%jz5d;uPBdyfZK?JFUkWB~S zbdXO!Rpiq{LLG$ELr^vKR8(1QwN*t>MdXlNL}69dTmBV6Bv)B?z4Z`8fIUPNQGhMh zSVU6E<=AD7RfSn}oK*)AbP$PFT4jNi)>%ZxQH9!S)%o_8X{%Lb++v|sMcsATMJHW$ z)qU4lZ^w1^7Illg*IZ!dl^5Q4p+Y2Jfs2K=TzvPPSKU-pN#$UM*A<0bVi$JU;#4rk z7}}YD&;98*Q?s zmIUoe)`q(hx8ttF?z`uf#A~l3(cAC2BMDp*{!9js1QWv%Km71W8bQ1fOd5%t@x>#r z91}b$&s_6I014!gMmUfBkwEHbq|nhv4mvP~r3By^A=ycq94b_w1dE-l6YZ`7WM+-it2Y^x}E!<&1NS?B`t5%{Q|5;*BZ9 z5A%&G&PQK-H@(n8e)ru!OaA-u|KhAK!aVDVC+2sSEA;OPX+aDB3>c;-C~$!Vbf5yK z;K2Vy@CimpixK{31Po&EfB*Y}2GN2+3UY8QMu37^Dp*1juH}RkY(f)Q$ilV=0SZlE zf)JWuLL)GN2~f}=6Lz>3AnuTdJQM={6Lip)Ah<;cESTXF+p+^4FkuI6nIaOCNCYG3 zAc=0_A`5iD0x*UV2V@LF8Oz859I$`~U}OPYz^DQqgs}*11S1jN@U8Hj_tJp8 z$a9?Z;D7`az%Ui^=Rf`d8c=}_l%NGQ=s^*hP=zj(p$&EDLm?VbiB6QF6}9L@ z2ao_Bgn^?S^(aTd5Ymv&U1-716-7v6@w_Zk4ND_3Bqsl7JqJ z;UzF>gB)g}37g2`Cbg)=PH^FqcKpOBM5$|1@Ol(nw1cnh;K@{Caf?`BWfPXT1SA{* z2|Oq^4rX{mp4fyw3JPI~d<;Q|g4s*G2(_p#ed#{I8d}kgmb9fc?P&!XAq7dmG^1e- zbY8=p4Cen_l&&no~4p_ae{DZm4Wxd9H1=&~Ll5r|I2A{3!$MHHT}jAZlz8{KF|Kf1vU zVgLgW^C(Cq=7E!Tkm4t$*at11;gqx#V=IMe#$XcDnZ_hpGQmlF-jmave*D-vbiogg zUBnyeAgDn2p-_neL?i_921z-pQIVRIl`BPvNNs9Ul>ikXIt8jQi+K>D0#&LGA*wXD zDi^MjRjpWM{<2`j>Q{9(mYtW?=3)^GSbS#IpO1BmZ*A*Xgyx1i?8PlkSz*A)U0Jn;~6PJQ8ZA1VrNDx8nmHpwMzIb zYEJVu)Uc+tt6Ab{KD!0i!Ui_7ts8CXUfbFvF}8P8Vs4bs8@(klw@O@M-+9w_-zouc zz4eXYd<$IS5N9|{EF5wRZ`{K*r#Z%D4s)ghT^#`NIg0}V51#XQ>OQV0K!j!FiXyq{ za2Kfl+0pI|k05fOj0~vZ5&3!3E$nOpKiy!{*cLl5mFn|BMUjzrpKlA}`>^Ej$1R)5)FQjGd4MckZIoQCq zXYhk*kzfQjc*3~n9fd8#pbukMLm0l0hHPm94v)w~4ML%ajNc&o#D;$NHAgeEfgFPqW{oz&@^)(M@& z$(s_81CEIS;pqX@NuF*h0x57WXo@iUslYUF139n*J@5lTFa$+#1WB+2P4EO!kOMPH z20p3acFbu_T49W1HE~Ev>%B*A}t!@G*a-t{L zfvE7lH%0f@?Q+%N2(U z7HM%7VbK<4F&9_Sw_33leGwRqYZ#NG7@dQ;o@+XyBQ>a_x}5PDvunP#D?8?^zx-u*)3nE4=J$9INpiyXzaX@j(Xc6BX*f96$pi z(ZO^oL_9zSJirJ~#6(!+MO36kS_H#fghpnBAvLVScqAf8>;{4aNsc53YJdl7U`bX? z#e6_Yq(lf{EXIal3Svx5qQFeb1jpE9P1?li*d!+B1jzJ6c#{$E^(7^Io z(81IgjnEJcSjK^1#FASGCLOo|U&iGuxq;DuMbOp-9dZHD;zb>D0bcw?U&fMO)Foi* zg&VZg;)R3R_z1uC>f6&9^7^99uY1*@W$9a)xMf1{6qP5?Ur`j7DcXffPIe6wvKyz|Gs7hTN=%Ym{bd z&<$+FhHRSiY}#$!^rmg#CT-pZZ|u!(=q+#Tt#ABhZwk)-;0R~o0*5>uXW}FWJs(GM zA_sCBr{W?95F)M-IIa#bK|blzbQZyMKF1Flfyw-!by^2@1T;|^;jtboP#)nC9xD)t z%y;r+clv~PjOTca$4;gP=enQ{kSBWT;CiA5=z8vYwg7vsr+d05>EvWh-lXcB?tI$k ze8}WZT+&VMM@?Q*vhGLg2yiF81UJn!?EV2s)Vi%!pt$Y}Mr=#13p5xM^8_H- zX!kI6kOb-YRA2>Kz>t(r`5FoNQ~>xgiTa>Vk|aq4ILVSi>H0)Tlu8MeuCM#N50*qJ z1z3q!Z%O@fsr@z}1TKjK=C7E7i7xEISnID@;jjPl5C5`hTDu9E1W;PJ$yyVToz@AQ z2Jl-G&|4vJTsLbk>gk>MVlNng0~+7~xX>QqHD2X)Ug@=7?e$*qHDC30Ukz#ia9{?) zfDByl1z}JIL+Yexzy`%&3~bN`g37a=Dhq+orqWd}m~}2X#0XymMl{T)WS|NAq6ee! z38nA~r4XrnkO44}Us<+gUG`;RHfFuB0RB)w3|!(RVxkQ+VJ2*%4d1FK`05UWq7I4T z4)v-i{7NYR3o8Dwunr3n7=aP;AS@6xO;i$0Zzzmx00eZ(nC6MIjLI)oR%XezY|Zv; zQ|mtR>lj_D7>z@@m}?kc5jbjVHhu#aZ;=;QQ5IeC7Wvi|Tk&u4HgA7xZfntSg=4v7 z%Wc`VwVbONu_HR9Lvo+79ied@;SoXf>oYd@Ji;*=#p^&qcXOxFa@EngO4l975p~OP zyXuQO&M_Rr<3R93!0H2S7vsQ~^|C@_14N|4AS}WT@*t6rcwHnRIkrYPR>L0BrzDa` zZlDHg;3AP^BR6uzkc7pmD8;6v{(G|oOK40>XsmzAL?v&`CEbU7?u1Qp2YPHyd2&+a zUT0C9OeiVk%8c?-yi8M;^2@~R5Sa2*&Wu%5#VV~bSFmzdVntT$3|4NX&wiy>f@LfB z4A2~nSsbk}v!yPbWz+Zt5h7C+(o%%U<<v*XGl zci^{okVj9HXL^<=dV&snoF{rf6nvB}$k@c_zUS(yZVKMu37!s{vAGKBhw82_fW`!W z`bU7cu166_N9iX_251V}dF{}Gg2?wt`Nx6Su7K)!NbQd8IOv0{w1v3z2?F}>px}e_ zZY{dhgi^?aUI@fdH2ipYd2x`&vcO@HWyC~Jl)?};=|Pmu_TtcZ(@hzO7f z^ANRg8)tj$WGg_$X8R=q&_E`246-9qCk&I;j`w zkosr@R6vtfRgywrlUOyCwh#Me)dWZ&Rztu9N+A3?36)xD{LD}N*l+!0X_w#+S)CP| zrs=Jh>Hp-qTEhuj=UV^nPXP~5oVInF$SGU_+nf&2ofeRs$aMnEwOl1|v)C1%9AE)5 z5qBkfvMIZ=E&H-DJF_)=voERudf){IwqR#aq<#RU6!x^mpbRX~2W1KiB@nT3ibML5 zL^gII8-u&c2FaX~IFykTr>nV?QNT?D8ZQ?eD>rsKmpo>i#@o@xS(hB65xdfH z8gsmIFPF!EyvKi>b+s$IW*l@AWXa{D9{n342A}{O-~;L+ryR^g9&8|mmqnH^A(2-h zl~;Kg(x-$ZB5ME!V4xy<00*38dY7cdd;rB-YzMkmB(Y=&tOQHG#KvsQEX0IN(6>#h z{`q@+OiuXZ(DMX&0_Dh>Og`tAK82Df^Vd=;1yeF*DVee8N9bzQL)iws!G?O!{MPhEvibwM_ zrI^>yy;fL;*iPoxOy<}|0TfzhW^|Jjj^<>1li&3{je~~Tn#O44_&Am3YOdyKeDgT* zm~6I2Y<%Vt)CM}|EpFzmI_WLr8QBvW+20u1Zval<2u^UkhHw%`aURY*9S-9D0tY_d zGZH@elv5d&9fg$Lvkp+l;|is9UZ+59IT8|mmT#v)k8BZ=XHaCWLWd_n0i{p601y78 zcbaGCum|Ucj0w?rt zwZQ8R$bafSN!N}^-R{QhE}rfAfktS9p43V$XbQO0g8nCQZ)=%OL-2prK)7qz496p5VZh&&JTn5c_Z+KmYH5owyH7qyOLx>5P4 zQT0fT#7Osu;Ejmy_kOzfF11qwDOC9gl90NQ3W<+WRgt6r~umA;{uf6r0 z+R3m1A_IpE88i?yNHC#7f(;ltY}hbigN7P7FmO;{fPjr0J9_*GGNj0nBukn+i87_i zl`LDjd#!vS!VgF>mf{*R$u#3k+aAjs7~d>eZ}UyM7Hjw(Qxo zYumP2fX5g&Y}mAEBPX~fO`JH%I!=ogE_Tdu;c^E(y1RDLp+B!K{krvA)7!Oke(P4O zSmIH|+H~m>q(^EX#d*Ia&YSsD>O;AILQiYbyPVu>Z{!V8Qt#)zVdFve)3 zia6@HB9A`q2xN{w4k;v&Jl+W8j5MM+rk;r^ z8m9yoT1Y^Jkxn{cr7RWjKna3{V3=Vccu*Lqh>d!f3#Eo&YN@8Kx)@`vzMxoRvcjrZ zWHH1$QzBkk#E0%{0nfv01E<$AO;_7 zFd+&LG6*3JJ3NRY3@^;^Acrt~amE>2d`QP0f84Ps9V7BFA|#KDh$to>LUPL{zs&N> zGS5u2%;?;rip;9y{4&q#n4C+_KmUx#&N`$1Q?tqG6rD3VJmZYBD(a}>G}Sxr+=|p! zU+pv^x0rl&(O-)#cGX629X8rVBQmtlJgd!g&T3zs3f-#Iy>lvc>s@pzMT>Ix-GJ{b zir#w%UU=f76mEFqiKnu-D4yIR$|#GcVoEBOTMo)3q>wU7=%G|T3h1Rwa!Vv1Oi`=SYRL=*g*b3#6f}*+!wzlD8Wa}hhO=6ga+%?1$)V75q>y> zy%y1~F0hMTDhy$};-JD6rm$UH@B$5Ih(j-Ip$j%N*SWMXpDmOtUFgywx~A|3Aie>K zNaPl}k~l7LiOUP&0^+#F^@JsEFk3*Jf)>8;g>QZ93Qri<6rON}`jqhtUi9J$6-m1$06T2r9vG^jcKsY?&?)1v<6sDD|=K#+=%rb>0H z0SZuF9FTyFSZb?W?W$M53f8cSb*yA9t69&A*0id1t!#yj0nEY`u!Lo1BD$Bfj%Re&4gyNpiw|p z+X~vyigvW5Ev;!!i&_N@-~(;-&w3c~o;Z{t4pgY_6smAW{NR#5{pr94RLWC^SjIATS-@Qk#DLGH zcD?LvuY2DMUy@YFLU`KJi?DRxEJ-O!OWLoLXe6W%1xZFX60ngDjNk+-SVz4mu#O14 zqYt5#I-LprQF7`rhA!kN3mt$`@mp5ml2(MXFRKrc_gAm1D1rWf#y& z%QCdZ4x8ufZnYHa_b1S#Gb9Okq;q7keRt4bRjqbg@ zdvN}Y(;MS17dgm5?iQf9#UVsNImj(8bfF8+BtSv%(1C8@$SWP_TGu+?sg8FO=N;}m z!8?p6FBHQQUh+D=yyaPf5|@yk@v;{^@PW@0*4y6oz?Z(|#k>;XtHdR0E{XL;0_Qu2 zU(SC%Kb_AnenE%d`x^1Sr0cJLL+{_x3n;)w5D;GrBw!u(7YG6-T7g&3ItDLDzzM#m z5n|7meD?JS5|Z!@i&(^bU`WDwq0kTVc|#oH?}SR8a`;aWg6=nYpG!jFlgu&#D^2PASGF?x z&L5@pUm45n|8o1xx+O7*c}pSW=lk0a0{Lg@O%@;%2hlWtHl4Z5Xfl(V@@D}Nh@gJ_ z@5h|aB*HgwU{2&DfC0Ep@st88Fi-KM0`;_j2RKjl#7+k|Q27K<{S;6Fbx$I|Pz%LS z62(vvRZtBH)4|@KNBkQvY#MEhU2|Oc@5eQOb{$1#WUkHX_ zD28K5hGl4mXNZPr$W;Zf1VHc=WIHSh~Zc=pk=c17&JfwGY|ulQCXoOSe7*)m1tQFz=dkaiJj<)p9qSfD2iB700{sD zuJu~KAzQO$9I|j*%E27Gbw>sC zu}4i1O!}b$Ag}=%aD!20SeB?63s3-~sEymmjolbp^MxTEvSIp_UlpcdQ}QAc)?XAB zVLgH*Ir5GRCXe%IB)uSy4)$P40$>0pCFe+v{xy#H0)An zkPrDK5NRb2Nhk;zVj41HFlLb{rjT}WV`;);bkZn47G#h@0Nw}`NR|OhwpgG-7>Cg* zqw*#y&^0>@B_+{EJNTdQ5k2^ zGH20J1$9O(cIJ8Y!7WwPXFg;^>4HNhltO;sc7E_d{?cdx^9KS$Fa;B7l4fa^MhKN4 z2!lYE4Kp#GMhF)pY8+!RrFICXhH9}UGANU3wAL~#6Em+SGb+=VjoEA2rfWUJHYW2k z$Cfi=!wrbQ4a-)UUW09F<1}WoGvaVHw}6^fvol|VGui%j3sqw>Ut^loMm21sHJKST z+V(TVrZeRhH*vFWeuFlHL!9hJIDLbh?uIyp!)}IiZ}Vnv&?#`16FHHSIi|2VqW}us zc?$^_I;G%nqVPGTBc2e~IjKWCp94I8OE*6T)IaYNb@+n^ zPNzSB5TXUtK#K+lk5C5@F0?{# z$1X5rckhBje;0U6dP9ZRL+3(8Pb5S{Bt_<;MgEw#L`alHW>lqGpm$OKLAr%VD!PSK=Jvks3KB z899*_DJaD2B^GJCA$GjH3u4Q=ykP>p&pTqn+q=)AT1R<1#^}y*n(&EvB8qZEkdM2=ORRJU_*7=Lh_E> z$;7a>m`+SHvnH7`GsXV7_B57xY%jBH-X=GQu$oNM3SXRUTdWGGX`4}VnrLI1;(*3z z%*Ke23$M8~M00LbGc~D+HKtj|d%SMUNjHa+H;CXjb;B~Qxj0_qZ>ts_D&ube_iy^< zHYpL5FasXOnPJCqO# zpI`|WhdiGEJ)y8X(vxx`r#&N=pDyQemB61a7jxtTJ~S6T+VgYW({t&=bM7-g>SLkw zqoEsWbV$c^PlpGeaCDe}2azCk2NVfg_b+&`byD{T3gid+^9YeJACWLY@VqY+Bp(Fi zql=(H8q{`v!2Wh;38X_xq%fpH1l8`2OW40eM9C_LkDd`HS~8;3YH?g zrSqW$U7!U$GPEO{1-N&ofn=s}WYex!1(ozh zzvp{~6nl*{sk^sGk>t~mDtwe=O39a~mAXir`bpAvN|>st)3i-PP@d17H9+U>0;$S7DJBYylT=VTWSi26o7YD0|*& zpxzT<5qA-YenEvlII~QKi1NFLjF_`z@fa@v0~tVxT6l?<6||joAV_Q72aezguHXy) z8Us)ONgxKjk&3^;ipSxK$q|d*K^?UCwH-bk&ykDHfwru03#Y)g=V1xX#R%+y26Jl$ zW*|i0f=A4_ek$+*g@J?cO*cB&kCPj@Y5urO(vOSVA-{m+9`Xwk z&?R01=U`IjT#}L28%57synfES5Q)3Lo4kL{ zkbTmo1W zH{dHfaKHy_z&ya~yzT=zz`#2o1U`W5QQ!m5;(QfMXBmuooVUSzc11&EEz z8AAVTFAv1RF8sp(l63(yX*Y~827{LjV`+QoFn!sVp(Zhb2{J@n#2_OwF2nvZig0U; z$uj-^GAh$*Ns|bZIWw}kYopo4X@dw(^Togh$6S1EU(;83Yd^KV}RaEpV;Go?TJ~{_s6CYnG6v_M$rK<#XI@GJ;+ch5CSqhuEdap2E%XO?Ek`Q3h&A^t={-ClR|F)w^~ z21P0#ewRWO4bgzd1r{yQwa-I!F#G0$M9GLQF-}EVkOfxcl`&rJR|G{V-FYQ_MKG-` zFAQ(JbtS#932CiWDJ(_RQJx z1BekIK7{yibi{`dPos_y5mkf%n;S7%tOLjcja%Ies89(M6 zS#x5|kTX|?>=|@q4xUw~R^8fjgAA}^x0c<&HtWa@94s&}K)`R{!G#YeUflR`J=7j043`P{A?8XwVHe)`)No3e~7k4K>o}paBLtbbx`|Y_l!4 z+CTyXhwmRV{!C6-uFxnxmEAbErlNYOasj4rnDLJKXXc%lg?pm3-p z5bzSUu-t3|F-TO4Ows@@TXpqSSYwrSR$6Pd?f_gR&{cv6bn*4qU48{t*k5@eR#;w) zE!J0Kn{8H?WT8zq+G(q`_S#;m&34;fvgKvlZ@Ufm+i|-E*V|;#_4ZtHxt-QrbK8|S zU2E07_FjCig?8CvecdHkUH;uAf(QgQ_!oo|MmU20Ul=C1VS)!Xcw&kFEtuelEtdG= zi#INKc|}_3U7MERfTs^2z*ee>8{mNx?DC)kuDAA@>kw8 zef7^r|9$x5mw$fxRY61?L{zaqfBw-&$A10kFMsw^hbqL;3j2vef46v_{r;CfblgIJ z3e;Z&35Y-es^WhWG++R4k&6JT0)!!~APF_7KXnXHf+h^$07Iyb5wb9Zsn8z{Whe?& z;IM{>NW}nocneW5FnbInBKdA{2p}Fp6hjn+C{po6C#Ir_M?~T+p7*CijN%rfXyPci z=tVGwF%+MG#VA4%icyea6odHFBuMebG@3CKr65Hq&N#gltd{bK}tzP zLY1kM1SVGLN>{2f5}3e5BO2k#M$EF7w%p||ZTU-JHo_2fs3jf%(TG4iA`o?WgfSbT z%-q!>4uXh;?BWoKH#8!facD#w;sA&@1mX>k@IxGKS5Di#VG*-iggMV}&N|Gl3x0U# zJpEwLF4W-+uX|lSQ^$ombb$-4Yn>PBz&eB`lyw7L9TyC$g*Qwgq7psbrL^EsOl4FH zSRftgv|!QDg*2m6z!c~-deSS9w4^D`lu0}H1d_s3rZUx(<~H|)FW_`@o8uf#pWsu> zJs}EBz^M^(s;Ms|^{1QK{uEJ(`cor7;R!}~0u-n!RU=Tfs-22zR;y|RCOm-&O$aMl z!O8@yb_%U)MQc`>Py~bsVXQ(Z!dZookdEASAVLU&4({4lzy6g80>LXr28$8AeySoA zsfY?#FcKY9WFRaM$zx3d5r$~wu|&A6NJ7F{nuLV1J`rtAMr)Iw+(flQSwT&Ba+9I_ z1SwE?N>h;Xln_)!DpQF{R!s1ft(XNY!wmseHn5iCiUlpdMT=bE!j=)ri(snT z7{MS$yM2{5B+O>LsZo8UAjJmrZ_ds1_o z>$E2}SWioy%RaURSNdMeB0G ztJd&J7q9-`g)LT_TG;zCHL;b&tY7p(Vaxu-E||TrU@UCe5%5LBJeISVQ7mO3vsuZ2 z<}z=0yJzC&nafs&ZJU{UXXw7!&Ae@}m#vIu+y)xa>TPd)N5E)FQ(Dpby|hk0EoxGm zTBhqWfC6AG11jp82f{YCtwEe@Dl!|z*VeYTy)AAoirdCF?gG2rEe1D$K@LV9xWNIA zaDv-G%X=UM9vp55LhwNpXdVS4&|C8;!6Jf-=D zIP~FmfxsQr|4{Wm08i^$CmtY>M~LJRViL|HyYs9!J+xQv5a7$+AlS}5@vYB%Nmd(4zPeO4B-GNSa`yt1AY5jVc|)rz{GFRgQ{3z{!$pg%gfO5 zn&*7y8*f9-gI@GBe4_rGxW6VM;)qK`;u3*4Mb$Skh&YVm>5q6sHr^f-O$5aj!6=F_ zj-rggMTVia~Pg&gg8MpESQ`DZM}A)il)IbvUscbudr6j}W}S|X8+EJgPp zd5K155|fo^$x4EwFz%q3cirCai)Uoya7`UE_X zB|La02ehR}XoO>uz+(yo2TUfYdjmk2CJo#`4g4kze1tf7gg3aIMOcJ$LZ@}|{(};{ zr!H88E|8tnaX}XxD1vgG8zd-(N*&hur`1`VI&df<^a6)k9V$4TEqDVekf?^bC@(l2 zquZ#C!jwz#D33a+k}5h(xdJRCDb0Z?Er6*jNGZ%=sV5-1GsGOu>8YSvs-NPinwlw@ zvZ|#rf+?UXJaj`hYywUBDXdB>oZ_mf`a`LbDxxZ@xoQHlVgk21tE^HhMkFgn6auRn zEV*iegg^)#*a3kEEWH|tAh@f9c&vnAh)z@qAs~Xna)`;Yh{%!%h)9Xa;)sx#EYD&H zk>D(ha0t?(3780q(>kr3$cdo{iWW$LqCm!wSb?Abil|TuXoQN}s;v+H(5(#^fv@;2 z=3EeLBSTx1BuDkdP?7}X@XpHR=4azVPePoRB z;zxZfulFL2&j=0pnv5B1jno(n+^Dbn%8l8OG5oTx*l>W|D1b>bIE>6ljoe6%>`0IN zNRSLkksL{q9Iyf~02BZL83>R8K@c$jf(>&Jne;FZlMoTBkP2x748agIAQ2GZ5Ey&0 z___-exiN{;xEb*=AG47lqmdvBG97U=M?112Ig%x_N+3y+0w_tY>`JfvO0Wz|vAmK3 z&;bYWGBRlcFw+Dyu?010lWxF;H%T)(p-Z}SGd`gcKye2-qqF{7m<3iig+swJOVBe& z=rcx`lrvzR&(R!CxhoaGfe}zNu3@y-07@lmfFI$niyTYO{7ldcO#{mnqY0K@*cVX? zmS`b0en~ZHc}-^tHrXT>dZEo%yG?PqwRVXY-V_&J^UYb~7UA4YUJ!SPvPNEl_4wuGs+YJ;{22!`*JfM}C8@N5`gm;h@V8Bg;xZTlII zkr|fZHg}s(_LMjElsEa@w))&Qc+)ojJem2#nQN0zd{ei4JJ5a8H+>5@r`Z);!Igp& zP3w@b0&oC!w6Tb5II$s{iaQ$)MVq$4xQu%dxzVwXbN&GtxEqs;ff~pGzUiC4=^MpS zoW=1QA(%OubDYPqxtgm2n~Q?X0aDC~0-DmC#w00^q5@1I9VDC`)KQ%`0JPb$CKfcO zsoR}E=!31>IzjNd;yE7VAs*#<9_C@5Lm-4RO;hMmgtWsR>VdoNA)oKLyCu>)^}#zi zb)U84J3XDBzVo~OX`uaCyjnX1AO%kV1?0O0H@XE+&{i|DBRMjo zKhi!xx})pUBSq4qPza<+sy;_rBt<$u^qZteGCxpqKTMK@^|K^>-K17JrTp{PRN_BY z0zgbiB~_{=g2kmff~G*IrZILN_*`lo;zs3KGygF+~vEy5>^C@735 zFR+v+{DLLL!luLUl(FIzMr13nl0-)wD@Hu4!38V1 z@+&5IEQG*OzuGGn5JkBzF-g=h#%v$FhiA#DUDZ zMTrQ4(DI4VnuyaXE!0v*)lw~@&|TEx3gG1}s0fRwxJGO|UKMDHv+yl#{D2b3ifsI? zb1aMLZ3+=^E)lR^>B0(mq%QBJv3RtL?xl>yDBpVQE`Kav@EXYVEy(l2M@9n;_BxG& zlrPhWFZ!CVg}mQ}Y%hqMjmy-H1lURmEnovaU<6KJ1zunVZeRy~VDu<}gi`?-Xi5!J z5E|gH1!)ivgOCur$r9U15zhVtMt}qk5RncE${3TezOXS3&9M^Qu^*dZ12GUAp@G;? zva2+*B;yfDgJ2*IVj&)4A}-?d7=Q!-0yZFnE*q1yWJ@u7OIipNIDwNp!Arbkv%I{M zTWE(a4isDZ6i!|9wM^dRO-@dDG0x)T zWL?uubctkPJLE(5g>F%0U*OK}M40SMm}slE@1(Zv6wg`?1_}6uXp6S*{DobXwsz~! zVELDT37G#(=84%)|Nh+1cuVGVBj#l`w_&EYmU(9UWH)WDW|}!rZzh@qT~MJ(P+fu0 zf{Rc;_L2u6j1B03u<;s(n>cxfVGxC3wb3|^E77-+ffkVge-^pC*&Dz4n;IaTzS#j9 zMVuYz0mo^ao4c!qo}4D|(VnYQ#I9|v}-${hEwj*yYo>ZUo9W$R;?jb z0KK>lAXiPj{?@y@Kk?Nis?#9yRU~RXDGF>UqP#&61!6sfYQ-YplOkwsY&GH|PZ)%2 zH9l+g1op!}=*y$%BUkCmBkdz3a`nD<4Wvf$K1XsSMPffj(xgWMrA2AKNh+oHTR-{Z zze&KqND$al!oO1Tq*an7T4GpTN?3-arAA04hux(}Xuw}$*kGbS=Dt`9oWP1rCUNpu z4^*XV@}`hI!E-{v7F^ktg`IR-Cv}>^8FayZlBa;`f_>_z8w9A<*}>L1sG)5r{1&Ju zJi;T?f+JiVOTiSW4e8PeaF7z6qZ27D#6qjpD6Y-gOc_Hm>>N$e0+v!k&bh<0?Zco_ z!=P&Z+b@g)x1Fk+dRtAADyDKnI{d?~nkug<#I35Tuo|nTQpCZP;~P)h!6GXtki@|n z+=9?VBVdRd^{c+pD;@~NyJ7*r%0#dt^2B0+PSgRB7~N1*0U@y6R-|%|h{apvEHGyX z#v+0skO`Tftl6bq6)1Dp8b+b`385&8IQNMb0E-W33EY}3s0abx>Md;qi>-iOJ4Xv} zRpbOEi{w{(PEX!>OcrI}EKcO~`QH4Npf^r&K~7K>2BQ~cQugHL>^11@mR~T= zVPNG}?gj2lwyXbzYEw3;_xfdPW$p|HvIoy<3x)~MW$`3?@#K}VFZ*X(82+9)%~3;U zWwv`|&U?Mzd%o{`zyJGbZnvL#H;zG>Z^pNNI~t>DPzQZbbT;AwNPrTkF?iNcc~+5k zp67bz&=LJOj_WuWk(-r_0T>{;(sxl9mC?T80fcUxh4z7$6P(6rXvpEY$)RYV1G=D_ zf{a$uDZ~_y7M;^^QrOu7*+HFq3U3xvrf|YimyT(f4%6Wogqs#S>t7xQ zP$f_xx`74<7Br|%mAG4o7#>WR@Zi8(3MpdDc<|xFfvE(3%=i&e{;H55Lw-zk2$92E zqE_C5+0vybQ8W*UDw(QgNl}At#XNKi6wpINcjg?WRH-OZOO>KhYUNfel3}6xmW_&xSJV=`5vCYeQM``j)KMww^3mqU4EE-o2GP{gn&Y)1|?HDIu0b zsgh#Fj4MHAJW0}H%9JZdVr&_cq)3uFM+%K85~k9T8j&X5NK&KHm>R);EgLrN+ISiX zYIM8NqdJcO)o$eHO=#k8-o$AH2sxlQ%>ym+6Wxz=>2c~*kN$@G@kQIIQ|}_)PnY9y z#G`*B{>>RbT+nyn;sw6=`Sas@k)L0Fo%~+@Q*j&>T5R$DMuA#*v4s|IOz{SRT0p3v zg9s{^AcPlAaiNAALYQHO9ZvCKh$CJx#T6xLVWNpCKJi71PfX$B7coxpqKi-9m}8A! z+=ye3M!aZ5k2&Vp#1l|_VFZv%LUAM%PabIm6jI^{WD`u_Xk-&x8o`8@Uv>$Fms5Iq zWtU9oaHf}CHX(!#LI~ld4nfQr1e|cP;HI8#>VT%3L=X{YpE~G31QROgpaPsKFscI! zJg}ex4v{+gC=P_O5Gf0Y;(!C7I3Sv7rjv@Q!U&9R%BZTFrkbj%Dx}at3aYN4LJPFc znk%EXzWTujBZM%5up#^^tgsu5fUF4{Y_P1eCP4nXtgjzLyTJ!3G)uy?%rYy2wak9N zED0oRK!UUypqs7+9jM!`yBxS1ue|AIK(D*?)~f-&_oAD@zWS=0FTMf?46wfY4t%h` z2LtS{!w4^oaKi&f{IJCrTiief8aKf4#vg;MF#`__Ab`myqnxtJE3@3P%P+$mv&=Ko zT(iwLu9Yw*2B8*8WmxEgB2A;;jE z44wxhkZ|k(0}VXhvBw%atZoOFWA1?mF8*xpf(tUd5W46ykY2j!Gk`&Q>TAyc1mq0B z9y<-ASW4&Uj##v zm)vA9I%&xWL?9Rv*d!$#Y03z=(1kH?JCNSxgrma~H(~Wh$51Ol3lonbJfiD647BYhp8-5s&~VQ<%bTdh>)O9AOC0 z1}_hE0G;VXr{>nFxp!_Z1n=~m=IF^e&*Af)`P}CV@)i?72SVrpoFpp#1Rn@t2ug~A5TalNjz%G*Q;5P7L>i)!hG+{OO3{b3K!qt7 za0^t}LV?U+AOm%wK*&+gcfjL^KmaumZwSP406|ov0wSq^5X4fM+EhUhLJ&}u>L3VV zRjXEF5LMl(RuwUbLumC7ga9j94`J4`qSdU5IK)~JVOF=U53<$OWjF$;wO=~N?J%^3bB|aEoga5c-7*Tw3Om5X}QZM z;3Al~=tVDHDNJE1LEph#;xCBVZzUG97{%n*zMuKTWeVJx&mh<{p%Kk!P{WzffW|ej zISp!BbDB@w<~6~21Z$L|o7?1uHh_2pY@h?1I3OnyC@#*5lkuFagG-;o-UAwJY87C8IFU8H`L)g^yxw!>Odd))W^x_dCz~kaG(FoM?S}C(1c=Y zpaRhp3lq|i0XH<}2elMJD1uNHT3Y5Bl}JS_EfI{g0HY9DVMZ~+QH^{wBR`jqN7v499HKob)pMJFLBN>P!56r?VNC>`*i2t**1q>^1I zPbG>7Dp>ZW93`nzy-Ed>$~L!owJS!=3Rbf6b_;3+D-(QM1tut#u|xm@b{k7r(VDjj z%(d=m`D$6r(s#J7)huSIfLq?$fCx@df_h_X1C~n{yB_$!cs;ye{j%4@=hd)@FAU@V zB3Q%>)^U$BjN=&ZSH(!4af%77VwH0k2Qa2EjKMtS{?b^>XWoDZ?2eo|-#O2F?(?4m z{ypeIA3D*CZuFxgJ?Tnc`tb^2fD?e=2BlkD+~x*1F^mCjce9(``sVe)fqigokOL&z z0EtW}E)$Ep1ji!Ru?#ri?QhQ)x*V9f&25`v3I+aCA27e4W!j~(q>{pxX%KG(bB z7Vf}BJLES%T+AXCy2l?XHo-qUI06rNI0G64m{XYw`bY|l6b?Snfe@@KU^agp?i4?} z1!QpZ+TT9+yYKzX6X1j=jpr zlQNOv8ER7+dJ{L1-!`qG_>I%|QBB!A00*>_1HqF!u@gMa6W-O+J#|jr<=sAcPCxBk zK*>N2)Bp^`Kn}#fLDhglaj3_5IrCA{5dacD$rv4XM*hO5_MN~p%U=+q) zAVz%=hJW>!eQ_mWL`Ee{MrDL$B|I2oWX5MeSXwGrXP`!EjD~8Q#%u&fYt)8@@dj?t zhVU7}Bm4$!1VSSOLL``nAhcL>G=g&+<|06cj8R97=UrA~lM zT9aJomYB(xXc`l2$)=IXn2?E@D2bTF39G@{oao7${_u&O1PYuin|&5amk>&zph>0x z+X68g^F_+BRZ6Bv3K4)xqCne$ssIb%0G()?t8g2)B}%&S%B_%_x7kXpY^bfU00_hz ziB5~Luv@sq+qyLiv@{E~NXxxx%LmNpxX`Gzh=8~F3b%~QxNwUJ7)-h-oW&7o#TDti zh}_3<+`o(*$W@%gEa}TZOy#_s$*tU!DvXt8K+VaV!%WW1MUa17x2ZqG_6{ z>6)@>o4V73H3(3Q>EsDKQBf!eGM5P*T7X59~5-56vY*4+)?l)=~iP1p^N z9K^xkl-=1aP9}5$<8%xIaDdxM&fL*m!>!By<-n8P0Te)uPU+Bq>a33Gtj^ld00&SX z;#J=SRo~;)X|3Aot>S8~>guk3Pyq-*^nhOIjUMTFPxz3J>!}|4v>xlV5A3}U?a9wA z%)7?=6laFajQID*>579Vm#PU7DS2$_Ipir$SH!UFz&4-t}Ej&}@F3UL!G>5#s=v~V78RiX>7M`s;2EJ2 z0S4g2`q3R7(l8K19qExC@lgg2k{$h#AEB%wePAIyQUv~j2J+D!!EDPy5(q}p&E6~~ zkrF1gAScz}&(dHH_ADe#(hYVJ2=4x11jv#QGHuf~Ei46LF4d9~R-qA6Efg+c6*A$} zYV8(sVb^luFp=RGl5H6>Q#4r<+KS;dwV^e&AscR!8-^1cnhXKd>&%#q13+KqguuDF zlOFP69|qze4x*@vsv(Z*KfQoJ)j$j|Vj~{Z4M<`SSfVBN04PEfCN@;7`9S9iff2w7 zDVCxtuHs0Qt}D8tN~sh~xh8?!A{E%wE$&p1l?QV86mmx&qg%0~^^)T{>Qy`L6+8B$_x2TJCDuUP z<2@>5MxcX3XoO{{??5hOX8zIRLRJ?10+wiPL`5`YL{bD{NhC$ERseg1L%@V?@fL3Z zMQ_esD)SH1rEd4d{yOq?H7Ob7h+iDS3*XBF@}Fx#$%i%S{|5L z9#~qo}GFL$Rqcr{)k+GhIF!TYJn99XD5fqiInmy9w(2;NOC@BD(^^(^x2=aNRr&h zpw&pGHCirjNiJ(Alr+hE0?CtHny8^Cj$la>7#f?PCo!Yvn3$TH^ogk{kPtw@odkib zvD&Q7+OEag=L!L!w22NB0io1dp%iGMyh(&M=%g?kwIK?kNE?GL+dPAcuIbvGG^nds zs5)OLs$6KS#EPo4fULYq3YgnK!-}bhfUvyVulx$K#9Ig;3yiv`i{_h*T8oXQz`ae& z3G`dSiA#@`3%CR+y4Kyo9jV08-AYrOk%HXG@k__C^vTg3!vtx;T+GBw43vgk$+_H> zcB#xYfCGU3>B9`Q1LWM@D)mw`byGX_Q$uxBOZ8M!wbKlM0iZw&$bj0Q&fCll4Y~1(8fuOZH?_c4b@kWn;|%v_RcV5B0QxCVaN`XixWikFlzr zJFtVYGV5xykLhpu%ih0{`?6BnTe?oq-v2ff;N;9aOs);6IPc43c`?J-poHBl29u5B7tQ`@d#lBW;~iQfU(t;|@!yk2z) za6sSM-5%y);D!L_3@$x&IU)8Fn2QdndJaK3?hQQR4b%V+ta%T(`6cpz=UPFW9ERzYy5E^so4fn118y}|1uM;z$XkI|TA`V=q*)uSJyQZbb?0>U6TBmPu@ zCGm0<@&2+Ezw_+)jd zaC^ZpS~TT&6{TFXg5)WIi6RdD!5Qau7t!NzhFM{yixQmHXuwy|Qq{_z_#W-r>9 zPen%_*RFabS$lNBc?eJ)s0SaX$7g~j)lZpy><5%_fi4zEfWQ=jc)?5w`fExugxF># zKgghCGAOS-iIj4j1?Ol%Qv(VF?q633;BHrJ0(TtcjdRvk)MG5F7!Vyor6@iG9MFetxqN6bhQmGogS! zH($!ASev6v%B3(HvJncY=$f&4iaKiwqR>f(?z5`s0J?z+qexr2MX0U33PA_-hMK@Y zL;tLRKnje&LZ2wG7)!8>0KQT5x>XCbgv+|k=)RQ;zF~_9fOL=ks(-j_0K72V`_Ie6 zxqrLVw8RDJOoyD2!n95kj7=v@{sV-D3`4ebRp+kulHF^|j zQl(3oHg)C`Y>4q<2ACN%z=#p^ zgN9wbd&i7%^LI^P!D(&NXSGG*Fy`O-iJ9y4&}+)$y04x>AG zDDA;TYSk{_zJNOec3jwUX@jvH*S2jMKsqa6;QKcN;lcii4`+~Iz**(XnKyU-9C~!= z)2UatejR)Er2`TG8N&uVn>KAUmFIL`maJN|aN%Od&b>Q#?Bvg{e;+?C{POkVYUj?s zc5u06zyW8O<&;=rvE-6VAcF)CMi@Ec3^Tf@V~Z`Q_+pADnh+w0AaGCt1ky%Rh@p}i z5Y9K?7Er)}1ya(E#u{zB5yu>L+>u9>2sl6j2_lGK7hQDW`z^?1f8Sy3~?OExiQu%P@Hn=1eVxQB%z{!(0fPP>@njxTlrwU0qw zjbxHtV~w>JR+AxymSeafhnH{Yfo2|TuEFLVeCR<4A94^PhaGh8*@&Wj=(*=8qG%$D zDVkP#3a6umLX{*AD|2D^?f&UmAXH~i?rkG9?RBM`U)0VI&R z0l6D*Km@^C5JBGPyKh1S?|TqI1|ejS#1%i}aK#5Xgz>}~R|Im(A-^2+%MpQm^Fuo4 z-1E>kS40%gH%Fv%)D=OU_10Z~{dHATK|Pn*ZI>N)*%8Sd_uXgDMIA)YVg2^vb4Q1F z+0_9)dD+EjzIWVjd0zJErB?-b-&MHv|2`E}M9IB;M9S|S5m7`z{gy*S zxut#j+fN1m^HVwhe*E_@{TA_qT>SQzicyGS6r(Vp0TGx$2R<-?gSdqRZvhHVT+kB| z%-{q=F^Ue3!W5wpp$A16ic*yR(1eySVJJKy!WOR3gp@EL1~F&}N_gUi7_0;aFF^?( z-tZEh=piL8QHdXVVuzI|A`vN32}w*s5>7N?6rCsuNkpO&PK<;VBeBITUh#^UxMCzQ z(Zw>7(Tt5yBPKA>h&HP66Om{{B=GRYM&RL&co0M*9^pnnJOU7EAc#1;;gE5N z#2Ww+hd4AM4uE*WA_B1pOZs6EZHq(OEUC7*X%cOg>;l{T5Vk`uq6?c$8zSpaHnyED zZKIT>E4#o2S$4q-x5VWrz0gZ8^wJAn>sr{lriC|T=nYz!LfCq#1z>JrYtW3Q)}*<$ zWNvM1QN!jor*MUBW>fx|QwV1_r*?&?nbVwK;E+0}z|JQ;p+iyQP=~(oPIbQX3F~}< z5$IXZdV1&yQNZUrJJbY#8uSZBfPzAw00oB{VW0b4C={B&1SUANp%rZ?6BJreA#jul zAF?P%p#ajNjnoJh{U{WKz|xim0YpO3K@fBx1e?}0rZvSW5saV%pBjM(I$!}2n7{&| z>Y%7HH7X8pVAP|kKnGCOK@o&X1RVHOs7BT5P+8Cd7KA7WDqulVRZ!Nll2rvGGAj#6 zWY(yfwFN3@K?+hJ*Rsylu6d2C3hG+c5&ZQ79|%EU|614$d_V<&O@RqaumQ$0mIRM= zED1h9*~&K7vHq2{>;^dd0nToK1fdmeXiac}&={lxrxi_VReM?vwALUAfo*Fa5?h26 zM79_?h;4IgTio_`w-dRoL=FOx*n+0E6Ui+`n41xYY(yiS>BvY*!jJ_dU`7qo?smD` zUGIJuyx|q^c*$E{^PU&I=~eG~%~AjZoWKM!paE{^Vwbw`WiNL5iyO)yn86r^Fmi}P z9s~@T%0#9zm&imXAhC%CUnWJ;<;X`sBbwEY#$&2cnQL4#gV)4nHn_n}ZbmE@8hB(l zEiz7U6wo3CTsJxFmGO*eTw@#G7{@u*v3I$n12=?cJmV>kCeV|fTC}G<^kK(;{<9w^ zKN&x_{s2%r1VkVLB`6lBKm{ro$q{4kc?t846Un_SCLrt*BJ} zTGyXy6|jTti(wxdROGepkNpov(e*i(dc>c)tWTFn<*cCiL+B z2R+PDfj$pq01tRT21XNt3uDY<7|-y>P@|fVrKaO0TaC(4R`M6HECw=w*$rNn10M9? zM!R--sYsB3cnKwX0VsCvzJKz9UIK(CH?TRBr1AhnTzN zG8a0(BVu)?6W!lUcRJObuJEW!{QF?nc+}|*b=13E?Y5`A-BF%>w%Z-*x;H-Dbx#$@ zd%W;&5j;fPLUzmxo+_4ydhFpYe6Y`j>q8GcanN3O-_yP4p?5yq;qUkQJAMA>0@%Ly z1@L{z&!71UxIgBnB7PJ+!~{jb!0I5Cq$(kJJc|0>O|Xp^y~mZxCsZAnA_~ z2@ojB201B{IEj-SDG=0#ZQkGvI0YAKg=$qRl- zmbl=T-oOjG=4-kJn1IQduqm0mz?jI8455h(x#pYJP@L9qYrM$~(f;Y2$Vr*ZDV*3z zo%AW6;3=N=FrGLhpZf5hrl4pN3Zn37X{MkF3<{tI>YWS zuTmhc;;OF3Q5@x}t5P7a))52%%N<7`upa9J9!s(qi?i%8u$O^owPs5pVN14x3q?W$xFXWGl8d({GPr6Bw~9+6{+&y=l#3#U%eWrmwJf3{ zqRS*Zf*~A0x;jE7LEZ>m9 zYYfD|FO*UY_RGHpV+{`DFbV@P5+gDk1HmNY5;|ckxAHPJAv59(B1i%>C}v|gZsa=b z!$2&=My$kgBMf$O7TDuG zs7ybg3^D=aKJ?>1`r{U=%s>!C%P`{-903v-;WP1oLS#vr{;8yxU_?NmL@o@@RAfcy zOvPX<#sHHxYtuGw6G#3`NOs{Dbb&~cB+;OxNe*rP(X2#F7!5g(Q`AJQOw8ob=mgU? zjX62Z(>m=1yff7h#ZgjC)d&UGW-U-QB|X=3)gEQnW=+>FrPe;h zJ?GOGilNtv!9I7SD4LK0+dvOK>|i4+lHkV$|YK)BtnU^+tTgZ z#?9L#bU4wC+c?xinT6e+1wzY3UE&Sj*yTj~EnWnTUgAYx+y&qU&foS$NDQvv2nJzR zLSf87VHU>WY7;0$Kp{c^!!#yiG%n*fu46!MH9{^mHf-dcR7zbyzFZ~-fZztQGzVbL zW_Vx+wiE|yF6VZD2YkRwb>?VfmkWrU!e_><$%h{>E_Ft`Y=+5FC{dDgklg?r`WX?=Cg(D(6!B?sE7JbU?@O zM2B(=&viU!bsP^>TW5A2?{<7g9AYmQm`8WQCl_`nd^WH4K=1WfFZ6uJcj#w(qQ`lZ zM|vc$dQ#6Wst@?Ym0VL{ z`YtDc4q<;3sQC&gfeh$?xNj6FX#70Ef^Gr)@>POD;S)S4flz@I_%#&XuY){6{`61& zRw!Xxh!XTqg!<1CAQp!PkYa-f0REH6ha{nien^QJu!t@}W249cod}As2#dJr0llb; zDA0_|NCPvl1MO&y=17hNNoMOH5XMet`ACh5?A7lH%r)FsW^N z@C}f5ZQN#*HmPmipbm=gkjf^M&}NiqDGH%*3hTg@u<$~x@Rz=j43DW!Gvt??X$ylX z47~sg#3da>7N8@pbF}p4sj7Fu@WOH5-E|P7V4rJs-zY%bQdwCKB@^)>J&}Nq+AyjRk0Ic zDyE(hr#exlcyY~;Di%Kq{;76=1=cL6I&rL=Dj2Wo7_Z6~nK7uSO02Sq1*SKvR3JpW zsv6B|MAWLRv@v_B5ghZXuf`F4!kd13=&d3d$e^BC@C{-W^XyYx# z;J)%pzx=`t{3{LAATX$sFya6)79$T148bCUD>I=%I^i-N%oZ*}11`cOQS0K2RAio1 z20W}a#+WUAST1D#11`ZJ40MAAG{Y{7BgL?5HgnjH?--BsSdaHOEC#>;exNYHL&!8C z4~UEt(nCGi!#&=EJ|gomBQwgTtjY*v7Fa>c6eMCBBs9T{LMo&S%phyziK3Q@L=-q7 zQ^YlY12}@?x(c9<`52aCS(bB>0CaOV#ic``r8ui3LKm$|9L>>wdD4b?nB(M3(!@>d zWKN7h9(?9$3KL@l{3e=vL4cc%e*@8t@HU*%w%~XEjmoK!JuLL-QliUz3-ONox zg|nB*Etmc~)Z9MQLZ>A}MbzEq&0JCxUQm=pUsOi>OCS*RY<9b@;g4*Oz#x-092C@{XVTMb$v`b;G2X^48bx!A^ zKuv>AO{rRGnm}rXZcgV^nVilD!RBkI&Xm4Z>)xhm-=J>nrtA(CZxq#U*zQpUC+;TI zaqe0X>dsRU2k$b6ax5oxzI9YfCv{dw6h_rl6;E_hm9cfFc6`-$Ft2!6l~`X-cyP6M z&;eGH$Mj@J^u$LUI?sAwkM(|ac919b#K&86uX?CQR(A*WWc67eZ(5(#T4kqvQUQK8 zZ~pkwb^3tSd~o|(tIzn%=UjdJ7OoFo52*UsRe|KS`y@zlE+}!Rdk`*Y6h5JZv^!zp z&%5Oh|6ZsRN+G=GZ~toOyn{%+FKCBwD2obEV|^%#<{OIMJH8)~iyF|1_8W{=*1yLH zjb4@m*$5Nxh>hH61Z|cC0RfLrP>tRI6XN=iSWplaNd_B9k{ZDVGbsl-yp%NQ5uSFE z(xz=l>6NrjZO&$G{5H7m$;y7h6$RsU<=(g4a+bL$1rcJ ziEEBYYuvC6y$KGl01mk+a0_=1sU{EcP;sd|o*Xw2Bln&x7oUtktKSK8G1n0r{&Aod zDs)G86ipYSEb0*AZk$SDyrr3&mM}QjH>a3_y)Xn!B%jz7#(HzUMuIdUN z=h1ybps-YcvEs3@9!u8gm$T&e9_^QaDQkZ{%LF1Tv`!$j_V*wZ*uvfnAs?989r(7M zoggMyxTGB-qa7nBvLP=xB#A2|E7G_YLW?DWi%Iw-D)qb-GA#_C1XN(Yh;j^oK#29CFWf*3q`)ct3yA?t4GzO9)c}hAC8IJd0}`y* ziZ`L+FT)l#VT<9+xxCm!mNYF}V=dK~k=>TUFK(==4;;O z(Q5#DfD8gT$jGCR&*PBSgE5!PKAH@YA^9<>3^Oxx7Ghz`Pys9<12pkK4JO2FGNcX^ z*K~oGM2J+`$5KUDWR)G@#bEO0&mQg5ek^peUDPdF%7sc2dY9)OOsM2ILrqMGc~3%3 zPNW1+G;K}NBs(oFIz8=Ax^o!%q|`12JS~M#OpQI|lh(S~QM%dG-dWbL+42KLKOvtz zbFH26a~MQlp5>XHjcuLrGZ^IgpId)c0#raF0H0-L_VZcU0@VK4ux;2*WmO1T+$0py zz%A~%t)jn;_^0IfAG$(^Q}`{~`LBhey~SLnzur80T|%1QR&-xV+TY;iUQ{~J0A^sm zKS<<(;avKq7bYBTlRFyV1HKr;I_4~SdZ(3?Nu5-~f|}$wj5TC{|Rs6TfDd ziv)Glmtf-IhaW(t36vjrywOFLJ7pOMP+k0#QyqKiB&beaa3N@+ITh+f7g})P#T#3^ zp+%&OdSU6LT4?cx7g}7psTW&h%4w#OhMFlBnP%Ejs#Byo=@qHMszs};o^-_&x2|+W zu3vo7YOlRc;p-Dq5L+y+!#?puugfmGlCsTyVZ;*W z6mWnDbb|ud;D$9Ya1C;Z!y4kCh6=`^4RVl!8X%#DOhCeenaIQ@AaRKhZbF2cNTCW> zm_iUpO#>mwKnNVix4m^B1Rd~z4t3~)9`^7BKzzXrggApD8u5q#oBTiOrsjt$i_Ch@r`hFUjb4e1~QO= z4QWalsB;xWka{IAkIh$;d`Ja*>EMWINh{i(60<7qiGDD^9Tq zRG{J#mvDq5Ai)Sm;Nc93+QR-!h{Y`^2q6eUPyq-)&;c7(E&~pL9Tl;t#a@0fj=&72 zFo#LZVjA<9$P@qp2yg%iNMIMc(1kRo$qQcS!kX8_W;U%^&2D=0o8aU{FM1))a+Y(P z)g}86X`-NQY63j+WG*#n>oCDVkD}YBZ%Kjp#)$ z3Q}LB)TX{j#zljnQ(y4Zr#KC2Fm}4rU>NnNNDT%uE}&GSGPS8keX3EBk<_YMH5k7z zsxPuS)2{yF7rxl1H2%}MO>dHOtlqrlHG2`wX^z#c-7IT1)mlxp(sizN&8uDE3Ri8~ zRh!rhtY7`QS8BTTu!xmrG#9Ij#X7dJ(2Q&Zb}?DXN;a~Wjeur1Ygx>0)|s3AtOP_W z0dhct9Oj@0JyNUM*485&$rK~*65s$3=&hDH+@TJ0yIbAv&;=d!yX3Lhdz|S z50@Ln9>$;tF_1wFrdyC4SQjA)=>c{VauFZwz`Gaut`NE#g@O$s3RMURNjlPmmmF&) zE@_o2L)DU&biqg95K3u^R2EEN27l$jUKz_*($W^O z9D)#S!7y9a{xX*icbG7E(MwzQq8GT-a?3GLBCZ8@{}z#*5+0W_JAJ-0T=QyFtuinnNAlH0Kt^ zQI3d}(;V%X`8Z(?Gj;}Xi?Fo$&ByVCdj>I{@OT0(@c{)W4p9p9_8C3M{$@^ zB%<{GhAaW%5rK$9Af{Ap|7NM$*?z+!YQiTzy#bYdO81>~VkbLw!B9Hk0=(mmC`(z& zQI@)|y$jW;I@nv@T)+aTB!wwcVd_SNv6KAtS@N6SHhYV#x;&B zTNw*l#Tr(zw9qV)Q;S%)QdWDTpmJI_?$5r}ZGjA5N!1yg|#SO7AS;UJb| zkEO#F_A!v93}-o0LCMIzFd}@62shi=&TtSkw+k)qCU6?lYPN!=^$cc4GyKy&FoOQ9 zRju(M7y$^frh=-8AZnP;JlVFEwX=ckYhFVe+15rk(WA`-Bp}=D{3bZOZGiQykG<^w zra0O!E^?*A{q1R3dm3i$_NGIf-Burb)NyWgq3hi2kk9kvEWH5bP13^N{^rhjBp01 zlm;^KEbcNdY==X5Q%i&MIk7`UFQ@=4xJ3$(00q#4eAtJ6_=kW0IgJt4~7GpyO8HxcKHU=Avkqfs#897E7;@}vq5E;2?WTKH{ zsvr(i<{6}sW38!U$cY#*))`Dz8?R9sw*j0uwwhLE8@%Bg$~hSEVH{G{VuK+H$^m9> z5g%1(InI>IoV$As^BqBhqOdVrn5W2`j>CtQI0J5+gAJqB4?d zCpv4ewj(yOBfEwNI+7$v(j>oTU`%3cQQ;%VR&4&k)(DG$ZOaCv*me|u37BzUU|Ujc zL|PP$@CHqKZQa&w&waBsVM8(x}Jc zEpMI&M+8hjGA-jUVJ9+cCw6K_b|$lS4nua#+A?HE1a@b4cZUNg zqchfet%E0chi9!zGc-W+tvaJLK~pn9!~S@W7kO9%HI63&R&zF>mw8*WHK+G^r$+)R zV0!ra0UHoE8=wNK2YY=3hkJv8vsXBh!#Ir-dxjH-2wOOwld!lqI+wG15?eaIcRH$L ze2$ZR$EP~a*LQ)J&t*R%hjq+a!;V7`>0EPM5e&m}rTV*iNOGi37F0|8!3QMNj~xiSvYt!$1tE zC{y|LPzHri74^QeSWzbhzY#URE_J^-g})=y698Y2*D6MRTNx~Ap}FP$Qf~7BvBG10Tafu z67V%CD1j-90+;zVm+ z6_(3k(P5tXnId)<>KS4yHez=%X2YDCsL5ivu$wRjWl z#$}0tW^0BV#-V2AIiGP6A8y8G^Vw$bAqt)lpYO5IqabMH0ciL!XoLnJ1A3qY0wA8C zAP)Ly5)ulK#vtzjp`fH`5~^t#(x4y$A{07m8uFp0HfpPOA}lf^s+MZD<{~~FYd2DB zEb3}Ta%)L)qr3KNzviO9hHQ9{%1O~|N&zMawg^c9ZGbRsOHpl0@g_#mZIAG6ao`7f z;s;y$6Ltb8HQ{bufR{OeN@pOZg7V2aA*S+nUvepLi-K>3!q;tjZ*Qt_^d(;grzxRA za0e%+4gM!9t`e!na&f&fE0#QRlFg`#im4<=agsVKCI@n?B&pnTa^Rxb;i7V&-Kp*( zF79$JYuE(v;@av0b3wN*rkXEIKy<9Sbg)V6ER%JG9zO# zze=mhYBLtYc4e0`M8E^d%B;&uttMkJZMUo}fOj~ct$AlN;VLvgg9Al?t%H{|Kr=Lg zS2X47HX&fH?AmyZ$2B8xd12$OUvsaRr>|s_dS2r;pqB#rdawA3HgJPBf%7+T7_b8y zdkqe;2b-|1x3C9`vAgGcp~K;ugRr^BvB-C^8hd=AvwX$}vMDaIw8P@M1UnC)hb()% z{xn|WHh$wcp5r>c<2>HuKK?y5nLj2#f&x_J^G84iG(Zg0K>EkDYoG=bB!GD&2ao`@ zVVDOYgteWp2_@9EUJHRMgbH9A3pyZnw5kI2eK;GCfjp^Ob*z*^L_|bXL`$SZOho4* zc(+hgf-j%}eG7wtYejqbQ7(*z7}}kb@<} z1-X#UtMrJd#1)B=P!Gi%`NU8Rl1xlmC@BtGEDl`%5B8v1W(<=r`I2aCyaTWRBA}CR z>;W36fo?ur#5Ko6na3S?lt|e_(iL4XPyv z@dRp#UX$$-vqE3=1uFP8mwTNPT!2dLMiYx5)-(|bPZ5|&L6{6S6$S>&T_MYjITp1{ znUiT@ySx^fiOX)07rmSpw{K!^abltwVy8)(!k?OoQT)N_%#l%?;*8DD44czAo2&7g z-^?1SApO<<7u5O8t9hI?CK}*OW$fI}_&ol?fn~v=oYe6f&p{o?@f>8P9pq`AWTu{A zhMsg5|Hq-wY&HmbHlOaHo&Ygu&@E4gCfzDEYE-C&q!x}Mg=!(gP!21GVps~}#*G>~ zmLgTElqZoSJ)QJK$&tyEmr$Z~>GC8cN|i3rq*;lQr<*o)>i(2ONs^>VLM43~np9Gy zN|GWqg&JvSBurGLR&9i->ei}}vVO(X=&M+11!9Qci&IFH^8cKkTb8_I72b=k|=LHsC-5 zRaa$IgAO`q)m2tINHtblZ_QxUTw~o;)n0SW09ap#)j-%?h1HeVV}}K{*<*usHri){ z^%YubGvL75YqjMz*akBA_FHSkCAR?w9!OyR00Guzw_SJNg*RS#=cTt^d+)_JUw!xG zw_kt%1vp@V2PU{+gAYbHVTBiFxM7DMhB#u0C#JY!i!a7FV~scFxMPn$203JrM<%&s zlRYjV0S-Wjfd(3807DEQevnxVo87Qkj4^H&!wsL;0D28I)QDpZHi~W|jyB|oBNH_; zfg}$(pzb6SsIT7Sl1)0N1U>3Y^!NWKlal{Rm0bB+cP~h>$6`(wU0#3#}bImvBymQY#2R(Gr zM<=~>(@z(900YEeqjfggfL#;WHR1k57Tar~1sC0Scc*vXe+NEz;o13J_gio|eir3V z8Jp~^A#ubJJo1R+j5AzoPPq7>Xd-PLKmehG4PMn1+i)9bAaVy7KtFQGEk`|m`RAv< ze*5poe|`cEkU)Y6bkPMb064$^22g+oEFdowxIhLrkb%8;paOd_K?zdOf)m7G1}P{E z4DzBE90cJ9Cn$^%ijagH{2&NXsKOHpV;C+R#s_@?!x++V7%#kG4t4 z1mhQ5EaMh`@rzzevKL#Npf6-t$zPz5l9uFTB}1vnNtW`G!k{Dp6<9zBI?#XubY(1G zxyn_(5`he~Wi4x2KwbjyfCublFbPP&T@0|8yErBQk*SMgHggvdfF?4fIZb3n;F-{j zrZumL&Hj<&AKnzlKf+0lafrhn^`M76&RGw3-s7C%_(%RYSAYj(KyDs*6+T07Pki#z z10k?m-RO2Vf!-~kd6Plj^0qg*ia zYAO?%#cak8gdq$d2=f=fRJE#v5CmWZAqYZrm8)AN#2^T92!VuEtcM8eA<&A}L6DWK zicqUt<2qNhB4Vy~Jp^76f!Dm+)vtY3#9#O7S40GMu!Kc~CfNW-SQCV?lcCwwdEIKT!3el?K7N8w1X;Zse(W)b}rk(6$M|%rIbXK;H-Rmtz ztB%U5cD27v?POa4T+60nwTczREpEYB<%%K|sX#<3@~YTd2E|_XWvB9)@Czf~#PhL_930L?gIHB-`n-UbDOd=^l+3-?`vJ|N>MG}}`N+hUK zl@p)XDq5imSh5mh6_bT3c<_o?w1Q)?oTU+fcnev6+=#c}0T6h}3z7q|2)~HsFpY?V zVd5|uuPkCQR<^QU7V`!yH?=d17|mjo8i&zz#x!*xvze3H1=g^J%}Aw#}rFVtZ+ zcJ|F|^6Z=5MCUkfzz(31TJh5)tSN-9PJ!P z%jf>l@LA7%aLOM?v*!!p;ocMSvmXB#p+BcKkbvSNAqgdjK@#%MgBApz4Dp%?O-N9L zTJ51GtjI$PTF{9)gdY=msM#nwQHzGe0uRB6MKQWji0OiAz{Ak_xy~q$kCj-c@pwnyNIWJH092bHbCq*;J=G$!Xwy8bPNJPACv0 z9N~Q~7k)~#G_ z@@FZF=FKv>&9B9*nj359+A0>bfi$>9 zde*hRb*^{a>t6?Z*u_3}vX>oos(Zi&YA`s#?JQAbk#4pX4B?fCZ?_?7s(o@P$8o;uqie$47p< z3ebZwxZ!oMi=FH^Q9Ik^Zg;qF2lj=xeeV0N9qv#r__MEE%tkBV`&M|h)4}5-`i3(F2}jA0grP4%0U<3OTGd$zyn0U1k}3y;h+D3{vZfaB?pQn z38X*?il7Q=B@NQR4Dz53A|VJ0Ar%^-6f&U}N}&&QArc~n8%jYOs-YO_p%{!oB0{2J zAci1Om+PA{_)mA|j$cKWj zhBQ(mIa;GCq$4nzBRUd8KtiNMLWTL`z*5gyn9b{r`oU@4h;DVmysd5nT85CZPlk0_V|;!w1nf;8qBj^V(w zE%1V&LaNrFjLDb`$^ZnuAdJC?3#+m!LI8xU$|^v>Dy-tFuBrq=_(-wpDzh3Zfmo}x zQiQfLNtINqwxTPwf-9J;E4ae0!rH623ar4YtGvo9!)mO)YOJ6XO2;}Z+#0OM(kxKyR^&Xva9b(uIgGY@e;4(!Y=G;F7iq*@oFpO8VFA?Oi(z8 z^(u&47zO*9uZkFjgdhcmc!-3+h>#csRLIQCECo~e1dd2BkH83%C@_;42?vX?mXL{- zcnO(c3Qu4Poxll7xCEvU3J~M4NR2=l6}0r2G)nspOxuntu(VU-jw>J!pZX8-U=L8EkNEgB7k!T=5Dyv^f>WC{S(CK@ z*`8XP5M1LPWFrt=Q#DoNo(w5A4N(zgJCP>Xkz!MkB{eqt(}5j$5hHLB9MMuEC;}F7 zkr*igAgQ))8#f?95-%~gBQX;rp^`S0H+ahuDOtB5kvDmJku$LqI?XpV851|bfg&(C zfm4Bk+mnEk6GK@zLK%TSQPe)cloq(SQJJ_%sT50*6p0g+MDaLJ0lAPPfkZh0NFkI~ zS-F#wxl=_|n9I3UWff}4xn=2$LZ1HrMGn8}%#p}U^( znY_!ppiu+98ycmVvcJoOHh=`Esn>hO8pe}6u(`a;>zaPenphBYLS@0f+^h)*~Fjso28-gT>L^0iK*S9^)y$Q$U5HMZfiP1W0f{>p256Fi1t) zo)UQy{6o2+V>*!4y~$w!2N>D@mG#=M1>3M49R`#DX~INiDyB$m#0FB^2BM$^dfT|= zzzebw@{6Gv624Xm&6(pe@a-mL&p%x}q=wLoI@%Don!G9iuFiT{$XUHX1`Y zLWVYKqdvl;KO&?$;v+bOLo(Ec-$jNuB*QxjLpwyHL3G|y5{5yXBvPuREkY$w%B1U^ z-ah<=D|)01nqEp;pa5zmM>OB@rKPrw!~|kQOk~?xx}{*+B~a|dw58us48^o9#c5*2 zRFo!IgobYtr*HBm0v7&<13o8t$i;i`#d`q83qXKj1ls|401mh(SP22T@uz2`n+)dQ zXawPgZK%_GsBFwe7nmp;0LL2uf*i0Ya!kjK;;0?yfs*P0ALxOUGASJ{DVUlmdgMo# zs)GHBu< z(n18Md@R%&WJJI$RlqFXQe;FXWZFtCbO_7es!Fs}l8$0SmAMTd3+NppArt7dIL(kj+`=&N-K|1%QT;Qv{S2&Qu{RWs1N@5 zk6Ggm{uRR8jgJPoH3MliWTUkV(GUsAk6*(O3^D6pi&AA1kr074cubMG{!$;= zl5D$?8o`ln0}>j+ku8Z4A)%3Vo6~c%k{6lNeKQgwc()?S5_x0OI4zPs-BW&}l09t` zIO(^5OMw>nY(4QeGHEzQ1r*bE)I^z7hwR;gm`x6%w$N4G6kb z$-h(uZd84_m~**hsnuAmxnAW}n8Uf=o>imMRbKVEqsx|E4c6-()~gK`29P?j_3rNm z@9-Ay@h0!`Ht+LB?}af&19*TDhyj?H0dS>(xNAF`i94Oq8Juy0GFaEX6B?lz8Z}7% znx%;YIbfQ4y_!t8gvDDt#oN~hpFCUeSInEdScnDwa02*9kRbuR5K!2Gx< zTKLKFHh1$kZ&tF^CQa-_53=+0UEA`lz_+zP48*_<+#tNQ+rTBk5kf%`DnUd~A;KM8 z7kr`Uy&=Yh^v0b*%MC)%H3lT&!O#7{8Z4qEav~>sT~QbH&(*;qMBP+>-7NlULRHV) z(0wB{YIQKm!qC;-Bt#?9b=@!w!{D_eLTbY`6y6H}_A_+DVrRobqQgbPBj$BpOj1Nm zLM2Qhr9b>6J?x|zs`gOgB)5{FtG_<<(}acJO#XW)CthYN@X2{?cQAONtXCkv(( zRcS`jYsP?j#t_aMgCeMFJUwh=sECp%7GB|ux`B*3$8+p~8c4^I8Yy>FDIYc|nsO;1 z=8m1B(IW20MWccY6%IU8P?UDF(r8G^a4NuvDvES^FV3os{Hl-qNd7P;Nisewl~m(g z#>toTdb)zEH=bjj9DA}ytT`Uav~T2Fcw|V9tU}f-KF+M(dM(g8twG-8MV>9Ov@F-k z%B=(~K{hR^q-4vow;y$6fg4P<8mUxNQ zJP8PUO>WLG+iVGLriqlu&66l+prDDR@Xet}v38z{ra-aebc*ih3g^U%7}GJfAb;o- zi%Q>RNqh+VjB?Bd1a!!vcbcqz&8V@Z@Ly=>8fQOg%C3a7lGsYOdl zEiJdSyxH>2O)XP;-kfstiWa0dXFdt4h04t@PoBJaGR0`qDN>Uf{qn`=lq*xFjVtdAeRy+wKSDaxO>zCH!` z6eC82m_Opf{SEd_@bB+`gMa)1Xu<{nelTDP1p+8Sfd?j7APEtc0HJ~$XmFth9b||h zhZ}at;RY9GfZ>QDlK3HtCTdV3iz1H5Vg@g^xZ;T>!bl^IF0L43i#*0iBacA(*rSXY za4=+%NFv!l223{jB##X+DJ2IEBrt#gS!%f@mtA`KC75A~IVPE9nt3LgX{xyIAU&{`V{Qg8{jnh+|4n4t&Zdf)=N<-Tz4xt*%J zE*LX_+U~pYf)NI&^oC*Yyz`tBOus{M6i#;~kWt)9A z+G#sXzySwHAVCDX?4k=Vy4Zbp-Tu7j%}XzItoi!hXHo_Q~vd)|5HnG=)wFv65>x-h>KUOMZ-5Hk$yvCBUDFt5X23^B>* zK1?#j>|V_6xC2j&@5LBjj4`_VKFsmPGv9pk%q#yq_09utz4X984}37i>mH2qz7!*V z_sxUvd->@X6HNK*8{a+q#UO)BF!R?>{{{5ZuT3!g-#@?ow1JHLAwwJayC3`5H^2lk zFn+!WhA$!r!3g@I7r(e*1bdOe4E`c@zQEuGJJ&(g{lXWi)1c~1_`wgRP8bpNVB!EL zL%tnuhBmw*4s)18y3NpU{&n*q5C3*IybZC4Mm(b3et0*z%}s8)U?LQE5x2L&0~+KY z$2k5$4lQ0$9OUrg7q2Lfd(@+hWh5gS^Kp-0yv=O~AOIZIHmL$UKm;TD0Ju8P0T1X= zTzvE+AOY!uagA$`SIO6dbqk}?Xbi~=m9(1a>PVG6Ol3ND9&OP&mcCpy{57E0m~r+I`69Kpy$ z5~7fa_`wfv07NnY0ZnOAvzmec#5Dz>O>GiF5QO+9AqMfyK~zGVgE;3P4nc@RoKu~L zc&8%L`A&Jx^PTqoyr(@CaR@}*QxW{+=RV&FP(+9V5&ZP0K@+Obgzj^p301{HA&Ll9 zX3LH#QR#1FZ6r{N7Ee7#bP=wX2qZoxKQt?($fMO72z3W>^F$z+cVy}A*#ajU@*inSS z6r}(xVMC$UP@p0djt#|O59?S@JeIPaD1|37ds$Ox_7a-StY<%~*-ChV5~ig@B~W|X z)KcOTl0g2gBvSj@N=PEMm7pypVryI7(zX(jh(v5L0bJl>Lb$?>L~)V(+ut^#5s_$w zaH0F$<~G6+)WrjH8-WKr07AQlpsqBj+lWU1g1muP#Cg%%2tSP159EDABjNx}`Nkm- z=WXUA6!M5>HuDXOz=J^wvIv4u#2^87=0p?%kvhZyA{kLIL_YEm32S5{CLu{mjOm3s zeB>r238oj85@IaKBqt$WicXvoloPKwEMAzxi?3i670YDCMiI+byaE=hbj2uISPNW$ zJeDDkMaEj$OIzS#1gR`pE^v9vTk_%-w=Aa0Pxwn<+`@#Z2nNcGf%29k(*)3rdCZ() z!v2{7gJ#NP1~f(xLK9w7n$e7A2fYyjYVtfAIm0G1xnThlaD$uR5LySv;X!PG106+A zhXvIkLUWP>o!=;j1wt4Pe0&2R@SI0GDkuV{;R7G`Y`O)aMvn?ou$~cEX9V(@4}R>k z9{~*rK(;0je?IU56ObU+Bv256Y@LDw9cTj#D$ofwkn9L0yFfYWkcBQ}wGVM1+9`^5 ziBhEPY`@4xIGRz9yiFt>fxFv3+L4fwr0yLhX-7v2(z}&3Bq#Z3N-?sxlccl&EXlFo z{{A<>11|7^6TILCKRCh@uJDC3yx|T{*rgt@0U6N1Q=fX5s7__7F>pLprfQWN{$eHa zTD8GeYJfy0$UsmGx!^1B2v6H>*Wnzw%AogaGZpa1cC7rpEC4t(T?-tn~0`j8I* zs*n4~kNhMM{nQTw+Rp;%j{xz{1@zAaL?8q5kN*(R0y3ccuun2f5Cn}61^GhhR8Zkm zPzI$A31!X*xzGyzLhQVd3!%^jc@PU(kP3Cs;KYy&)n4G(kPqhG?d6RS>X6?g(Ge2i z5h>9S0;7@E;Npiw`RVHsXPG`x)j zv`yO(!0WjQ9aUQ&?UA^IK)BdpAO(^kg^MBmp&}t&(k0!wK$89pTv80gzzt*)Cv6fa zJt7YDz$fuQ50p|Ru7)bTk}LT@6bL~qRY4U@K`4qM6L!b z1TrPqLde%MO;a`DqBLdGHDS{>X;UQ-!flyTIE9lrol`j3lQGH@JvAdf<KXN4AMdBP=-)@hwqXmTalk zYr$4+p;m9{R&5PeSxUlh9amZ+mvbpsbUoK|MOSe-7hQ_iCqx1sG#7Gpmv%J*U*Z8K z)BzxH*CPbNBQ(N!*;ipMf*%AzGtn0y#DQPdS0Kc}K=^@WVy0y-f`17_K{V4tI1@oY z1Ve~KM7#kWJXlCbL>G)iYo5e{RoF?8goSaKN(fUI;KYXkMM`YJGOYxQIR#L7*oqy6 zF1=VuP(@e>MNtGrO{Ah&aK(*{#TSUhSVYBH{e1VfaS&&WH zc`inl$;DqRMq{km6OdVaZdrU@S(#M^6qs3isu^gw8EAOMXV3B z0S@$$4eU`Oq00;`U8ex+({+l|fy%JTOV!bf)#VEi?90FW3+ffBv`#CvR;#sME4C(F z#r#0rvBAc)fgI3X$c#+hp^Uly9lG}2;H|6SwZkpYLeI_Fn|IaY}b5E0tigDHmt)wEW{d2?7hw0BvIY?9t{Pd4+&xI@gDCT zPUD1Z@fF|ifsV<34$5xM$#VXV{A^$VuFnDj(ErpA0p(8w4iEup1OF5d z0V$9IHqZb*&;w0S1P#M400RY;kOkpj+?Egu+N}$7@-jw;sZY1Lq0ge+jwppwN17bzyde`9{N$yg$o|)As_l7@%CXL9P};BS@vxL@6X9w3IqpltM<;JmMokdQ?3I z6;jodOqmoS1l2@oln(P0Ivk`sHY7tfBoTYmRms#X9I;eU6+nGe5|CN^;~(=9OZV0xA3?VhNUD^;IdL0$+VXVVQzsCDu?vR%KZhW{E;( z8D&&vmL-VR{vLl8S8ioha%ETER&L2wY)t}L_7-g|GFsNwBcmlINWvr|*KsA+TTYjB zX|g6aR~^)4Uvk%9`ekz+CV4FaAfT6ht+HVTLL;CueJR9qMW=RZZFyRD^!7n#E#TJCc z7F$9xQFfJ`;6?b@ydsjbx-usO&FFvzhf+XnpF36OvYl)$lBo0Vdz zw5c_UXsL>jDT!!lw|ObL)%9G@b&X`3j+7~pw40l*sgJN5o6aem-W!xmNxmIP13Uo3 zMyz8$He^S(WKT9_SGHweHfFoYr5M1(J>A8jO2$p9q;g!Vu!^P1%B;izt!Szos9Ywj z9LkAmuxtX#5lzi0ORBc&CfLHWK#R^%%Wm@=Z^wepNsAX;!6MMAKCcFD5FH-M03!Y| z61ps%ureLIAgjD6E7eh*2WZ{1p5B#Yws?;>d6&0&pZCKQ01mi8#(3+-h^yU|Ou4d* z-mwfjq-)Cz9?S$@;n~d2#H+lrLcJ2rB{+g3Fao|NO@rxcQAkB%Y;?C!O@>Tck%->b z7;L|Qw*jOcdUv>oe|XwWYy=?TF6<562#zjvtnLA!?;&pDhAfObj>v}2%36-`wd{>E zAIox1?U)V;n$FD14l!8Y>%d>_TwnEtAMfO>`2}szW{=Mj?fo53{Y`n%UU}0N?bB{K zmv1@zIBf#1PyIlx1M1J#YApcGPX?yB01c4V{*RfTZ3B5=1f}iZ4#Nk*4*m&}pa$W2 z3A$|usgR)OtqZXr-)2tR60Y2~Pz2GCqa!Zj0O8^?E~U?q58@sXW_slok>zeK5-Cv> zKG6>~(G^NSHf+&9gl-pdp%=A!7p5*boNhUsQ5mXHKBy5ssA280VH>{DwH~S->XESj zk+=x&9u_YlArc}T?;}aK3^4B@Dx$P+QuXG5CV5gP^#Bj>fc9>$DG5OjkWwkRk|&05 zEWwg3)l&NA5?FjQb2<$x#;+^R??Wt;Ld=&f=Ayp)?==yEFLo0*d6PH^V>%_H!LL(0 zp;J1=lRYVLKi$(b7L)}y6vZQgKLr#9e`7&;qeMj%KH_7?7I^{qpku%VtN&B86=jN?6!z3X@Bu zm_n?W7i2+*RbFobg>TA)PrxsW!PtwXqD=T0bN(Dmh(%S{7*{aocrGVdWQ97<#gOd< z=GpUCw1r-989*4B(gezrCQlGfL1=K{!GlnY6np})pb>;jm|TQ%FeAZ&P?$8qh|x$B zBTP<41c`DaNhU&Cjyx$Oh!7n&ndm^NgNTuyM1&Bzsgvjt9W{gKU?GI&(3>ihs=&d* zX$vAat`gzFg6mKsDp-J}%3|sYAxm4RP%Bl1khNjiu9dq&ZCVvAQmjpp7H^*y1mwsYFmFgOtZ9BQ+6-8y&g+PrlKZ#{hXZr;F;7bl+K`0(Ydn=^MleL8gL)QvmmAbmM^ z?+v_v|K5N+2L}!k3=puMeS7!s;m4OhpMHJ&_wnb~zn_19|Nj9DP{08REYQFM5lm3Q z1sQD6!3QCXP{Ii*tkA*>G0afI4LR)4!w*3WQN$5REYZXT3orl$8-SPrj2UPE0}L_5 zn32XA$DlDsH^gwmjWvK|14uQ7TqBM(xroT5RFM3oW#`;{J*!6oNvCCWP3b0}niq!2=guctKD>XDHOr zLtT7P#zhwm0}MxH3`5dKAC)u=8ZuCT0R}WxAc6Ew3{})oNiEgXQ&CM-)m2$-)zw#F zHL-ve+!%umHrmKllU+68#8+8lsf89=aB&BhV%c#=*=3nkw%BH&RW{jnsHGN{TdtjD zmQ!Lm1r<~*x#SW@AYp`&IM6twi!Qv_f{HD^P>7?NQ~&{l4)CQ-I`GJAVAD-C1$Y5a zV=dU=gAq|VS=uCXrhr$I%#5tA%#N5`yO_1pUYh{oKpnqrwv90cnYhU=d+xK}c3bbg z`R<$VVDtt&7{T2}X7FN=DF*Pw2S>*7U<`lUamO#1-15pRx193F8;9KU!9fqk7sWyM zB^h5(Ki!vMe))y<*Ih?_nAK+&Ms{C>M*SDmZHN6A+gI{{dXiBFnfjGIPTBhHx&N4BjXUPp;*H54|9g$mPhaC**w2_^jCYAZ{)pj$h8+9J z$zT6*$Pq`J{sBmia**R3`V*i4{_l~%d*A~f3(N-to#Bj#O)vrxd)NU8(6A5<-~kQ@ zK?v~Wfe?mJgnQ!C2~p^Q5V+ukEOg-u0Tsg+0BVLcl;NOUAOj%8;08VHArO2R#2n6vh=LHV7zHghp$Sva;uES6g(*~F3RBR68OwOa zEx<_&TX5qPwlIY*Y+;V;^1`~fur58u;SGEQL?8bM2tK|65QQuxAq^=ALncxXgb>6d zAL$7~3}O(1pyVJ3F-c4wf|7?I1Sbb^2u^}Bl%h1{DG#9tM5NM`sublaVR?vE%2JlF zv?U^9iA!9H0++Q^g)VvisY_k{5)rw$1u=;!OjW2N7sPDlFPXVaTrN|Z;(+Ed#c@nT zNK+N+pr$I&am;TbGo0HTr#7i6&TXzUncUJKm;#E zaSMU|^A@!Xs6SsR&_nc7l>Q8;EDtJ*h2BCG6@4fuKrxC@+(M%j<)}t)0SbsciciLpi^5|v2nSjUP9 zwx+cajle`B*vkIayRsFpc-^aA?^@Tu*0m9Mhy-C90SLr4;t`8oL?9jk*+)b+5S0zY zBI+84M#Mq0ad-qF-|z@OjMfjI4ee(?>xV9=cC?G=!Xn-P+c)&_4XR!3Y`gG=It)^e zxmDM?>d;$u2{(_y^@11Nl*i+8A-Q*KIvHd>dB*p+S^-^9i# z9M_E9H7}gv^#m;-N$!U$7paub`}#3vH& z2~LcFlm3_7ga|J|%2|RC1gPi$Dp(Q9P>P_Gr$mJ(IN0%5xB?caaK$Wek;{|i0s}50zzIx4 z0zIDq&uiX5Y=GmM5cr1Bgbp;I5uKalIHx$eVNP&_qnt!9I?<69&Z9B?XzNJF(cHOC zbU2-X?NBE?r3TNwGSC1H^h?zYct8Qvqd{5En%1?p^{sK8YhCY}*S+@juYnzGVGnzQ z0vNym4DbLG$e>U%s?m+aFa~MUh(@*I5s=CNByFpK+udGL8BS>n=`$OLaQbqP#kvbUPdl%`mqLJM5zZoJ9}g)8#lgMYf=3ub`uL&?ZR&1N{G zAU-KdIf~+w^4Gramuq&t)oe-rs-5 zvzP5`XFl^8;SEoWnmx^Ew38asghsTiNi7*oqgvCRRt%@b&1;%x+SV%1HLP*|jr7IX z8raO1Hr20Q^=gY-+uUZh#1$@YaAVu-VehxTF^+MxM;zjMPdeZ?Zf%k?Trjku4dZ7{ zbI4FWGA_V;$U#4HpsT*{eIdGJ3@&x3^Zx2w7yj4P&ik`7zwFGP{^HF}c*5A7(cWJ? z;~`II+S9w=@xOQbQ}6yK+kf>;rvJLfW5mZ|2rzsM5PTAFV-~P{)Q9de27KHne&`2( z$YC7*A%FPCfDEV{JTQL>s2t+q9K@j<3g{dbD1jJg1@R&JB1V2-aDpBtgV=6AknI6* z1BCWu2Sq4_QYZv`@K0LE;8=(VW9SHFC{SKN1_nikcqoW~=m~phh^YQhiI8ZBe1Iu@ zfCqTsiK-|HrU(qRXbhu(jI_v$$|wz|;9cOTjNE07;IO)+>yFx`3-V}P-XOPfYqt0> zkmBGE3<;4IX%Gb=5*i5*90`&dDU%$jk~9gEDCv_v36vErRwn>>+uurk)&u!qyBvArEY2zOkosCVWwCr z6kZCa6fzWmiXn$es60UwmZ}s`VIr9-shTPymrAOzYN;q;t0=(}zDldIDy+)tBTe!n z-HH;>s;t}!uG~tk(kc?MI1uvN^x7ua4+UO0ufV#4PFpn!S=Poxf+!4yKl z9D+`2b0PW*!gLcMEF!`}VmBY+2{eo%2!bR;A|hG>BtA?gu5KhoOebD~DVTx9pR2Z~?^ydo#4;>M&C#b`_iaDd3P;wGq~2*QHLc!DdwLdeDfF5ChtR3He9Y$~4Y zD^x%~>%uRn?8*3o%KD-|gCGS)Kn1>xFg(LE4g<~}Lj@jVF-TxBBBMergE26}%v9q9 z<}3w1P!Saqc&zk15&imSX5tF^w2QPI3%sp77aNxjnT40Ign%1x+6zJ z&C?joJ7~1jh%`J-E!DV#Us%mkIIaer^hu%qG)kp(N~yF;t@KK!}t=qUw4wi&Y)nMG@0NtKsN~9zc-p$?K?Mlw1 zOvZ%X236m_ z0ES?;G*wk~Rav!FUG-Hx4%u+PM{WgI+5qN$C0K^#SdK;KZm#Em_2-tQTB_w(1WH@d z#9L5d6D%Q0Ai?R< zU17Cd-Su68&Fv&60wYj+&SwDeHG2M>M_&QY?`B445U=nMuV!e5U=3CnoW^J%&uE55 zVTmU4n8s;BPhvyQYOIDBqQ+~6A#R#R^EQ@f#D?@v4{hkiY;JG$zGiOZrf%Nm^I>e=lY=2l}LZnPy-1_f8v1y2WWuuCmsgq9N?iG z6o>^GXdfa-Vq&m@2={_$F#c5w00&ic2T6!eOz4DwFbIXvg^UmhWp{=GMF|IG31c94 zc_?>*2#AD;3Xez#aG(Z`$cd(C3$rkJlUEF}XbhX+49iH2)KCrMD7xa%jgBia@lr4G zkPm6gdjkoP;$RRBi4Y1&5fu>-9*Gefu@W)~6D84;K1mTm>61DMmF~BdHu07CSCoS3 zmHt_Fz3a7T1AwK~X4icyu zQm7y@sW1{Fl?tjXK_jb*Bdw|usOqaglB>RItlSE$OcJf&imYBzCf~{?^NJ_)iYD)h zCykOO4-1inlCbc=t|A$)6bmZr%8~)0u@>PG6iX@nK(dsQvo61ns;G4IGtmW#Ox^9>>s4z0@zut1m# zGcp@9y4WbZm|42Yh%zNpGS5p3ICGofguOB|Qr)Y(@XL(e3pMlWzfu!7Pct;}>%X4B zA{I=+8Y02|ShK)(Qza?_B0A#0L_#De0>TKQIa}iDKFlOuBB3#Y2(At~LjogeVkwA% zC}5(+h$1JdlcJF#2v{J+j)Fahf-0hdEOdYecuXj=f;@?UD_A-{#R5Hb>@Dik$mGJw z{vs_>ATO$HKzCX#QUJ_GAS?{y13+K|K)}t?3^C#?sVS5MLf``?gE2HzH9Yh)QsYA> zRL``U1X2JqL_jrgBhb8+&~U>wIABE;?L~V7MrAaut;0o|<2NpCu0IV(?YcVf`Z_M{ z(YB+mi&Q+2^hm*D)kMwJP!(PgJFyjeu^GFu9s98%JF+F4L5?limQ73RZQZ|PzBXX3^h#hP2YH%x4HK* z+iM`SXa`_`2yZu2H&sy*<>5RvR4dL>ECmO^j#C`q0Veypu{*o9d%L-t)>K3c$e`tJ zRabf?=742aZ7%106n=5AgO_Z-IA_ttw@9RX8(?iBEQ z05@>^c6|sJ9_r_CIdB{PhaAvBe+r0zLhuBIeSqR&1PQ1dG&2#%t84z+iCXKM@iXpqLYkNn7wKd(f3Bi3U!ICB^lR!xlC&`mW2@^XhltL*J_xF@oUX)zPm1xP8Y^i{4KA40F=Uowj zb*Y(@DHW^$OzMdlZgq;zD;c1(ip6P|&o^Ao2l+o$$2^OdRn`}`PS^*uD zQS0qVgYT&t?a79r386r^pM3Zm518%UexTf*?c0$Z-BBG)Du+4hqx60rJ*uQqfupL} zAMddry%?s#cp$|X@ox&J5MLpO>LFt)sT^{R*BGjp>W!@`^PwvKBti0yxhkwak|jl7 z^!K>*0r{+CQjq_6u5_{|8M!C%>L~r{kpoNi7mKi@va#w)Di?t%lM)Xy8L}+vDzQ?K zveL5%skBmglS8ZdQ+c#j%e87N4(b55Y?&?Pl8=0uwe%>sl*^8Us|)G?FTG&=_cD)| z%b2wQnG=(`26N$on=r8;z}txa-(fd(?r00Rm-4tSJX1 zkf@OfB$;HgNhX)zsb?pUYy#*eodjyjCWQj}Nuhy@dk^Axzhud<~4;V6qA*o9qG!94X-d0~8S9%P&Vrv&=NdEc43-B*1e53#k0F z&piK3^a9H&@bj`N_iTUxF?$Pj)KX7Pb=6k4cz^^F?6M0lyy&8f*J6)Nw%5Ig-OJf! z^OE-2ZNCk-FuceucQ17d)3z{p@16GEc-w8a-h%5L_b|c?L(JiN55u_Ojys-sS8#?8T5?4D7|bK0NWr3@`lt@XIe>yz|lHK726ISO0u5!7Oh*GTm$M{r0$ruMO_o zYZHt%7mSb0`nbD~{srQPzkU7oYafg+)@$!eF~0ntzyJAf82>9E0SRcp|1s_tjPu3e z7^pyBAaEGJ@Wn5L;lTg(!WSDvU@t0oxVC*w7inV~+SpdY6uK>iCS2hPTPQ-cneBvY ztDy~V__YzraD-q38xMU5wqIxs9^`-qImq!3Bpz{z;y7YCmUxaMM)8T{IENLh7{z#C z(TecE$3F1kMKA7SAJK5e)+7*tG^#O;T9d#5-gq@5xhw(F@jwSU00QWEV2^ve18i3b}=nr3}ap>rWY>usZUX% z3vW2X8$9I)Khz;&Y#ePy|0kVNXOHLZAaJs6Y>j2vLXv5eywDLm8^jhCXzn6s4#t z7stQ%)LLC_mX-RWoQj?0~79rK>N>!nbT(C5x;%I41SsGKCnslZv zHR(-F%Fvl+^!^s;NQEkH@lbS#LKWOVggPGj)Ranfsz60*P=k7lg{IV~A?0dDQ^8e4 z++v_vg=i`ek&30J6|ABFD_B*r*0{Ent#WPaT+?a_yXFR)_~BEYO0XZgVBiNobHZ=v!h0o zhCdAAI)K;<8s>tCy}$($r?{9at^ALAGGyU<%|7 zRS1=jkBnp=59A6;&KN@&f)FbVL<OJvC3M^ zvX-WRMJ`|23Rjr0Xs#gUFLe2fTkdj|!SJ96d;#@czT%d^5Wy~bVT`L^4VcG7Mg^Gu zd36g+KxBuI^ISQDJpKzldANkMRebDV6G zKsVI^*>=1=o^XqsJ>9v_cgkaK^w0-B@Ntj2+XL@+ic_5KR41J4DNsD`IiM6}C`wWJgDnJj$Fs^c$%UtQ=1Sj0}u5QeW9qwQ}!1~p%e?dN9j<1)& z2zHBDoZ=L*SePXo1_?(*jACl=LKD3P2>66`*Il z@4fGT&$9;hdKUd4488{lCwIZ zlRBqEI-5g0p3{H}xH_oAJf5>W6u3LU13V2_JH}%?7`QvWgMqhmJpRWsJ`^~DB$zxY zI6cl|JS^yf&(l57^E~0hKISt&+v7g$Q$9PGgXS|n^@9xPLxaIUgxXU*`V&CGFbn}C zK?O8C{c}JQG(rEvKopcfha*81bU+#OL3)!x93%`Ngh3883>&02B!o6Gq(Uxiq zOSjYz7I6@zGGzxLOrj!n!vthrUj69!>%KuvydP1dvs+N4d~^atA{2#p{J z>jh4P08Zy52>i%S?37OP6i@YJknwa+_*75)#E^%O3x@zu0VRgRkkMIW683+@0VHUOsi;zstq>do=U|i4zA_ijRxno^GVjm`+ z>4{>-k!o3r14RHAMBr+%78#S_YPBY7n86utY8jmo8ol-z z!iH?7F#;Qqr>F4&DPRIAKpVA@8m!T5&~_UeP^haxZP%u4$I%a(2W*EV$wV4MH@yhpZDzu@!5v7mKkOYkdWf17qL@?cjKmr?UJac>vQ60&_41V=$e^FrVizqBk*U5C^AsOa%cEE@5eK(Td(i zAhMTyCv!5i7k57bEw(|&{NH-r;7 zhdVf+bAQ4RIrB#hWT-gA;D41LTEqUBR|$tgv|Sd{gXfW6TSn~KLsQ}0~Cc#xP=i!g;RJy zUPy*%1BPYDK~~rch66WdLw++vHhN1#KDi(oD4N)puz>N*D1yt~j!*oo?^af@?1q`NP z_bQ#A5@GHL$nj`R^*E2>n=y2>$d>xv)?L zWl#t;P^nOo3gwXwB~cIMkspasB=u1ng;A~CQXx4~D9Mr{byO}TRH}fJFSSwPFj63; zQ8Tqt7#03fQFT-;#Zx1hl`RF#6{QYD`Bdt_4a`hc9u-m^c`#O`%}>eA*Njv~1yN#k zk!=N&ccoBJnO4_qRBnZqcBNNt#g?WZmU*>Tr9jG}5L#^+SakVVq;Oc3MOdVOmjbO= zmnE2$C720)n4INVhUr;})mn@>nU9HDlxYc-Nn4X}nW$w6ymgtLc?lo=(ZGe8$0Z4p zkX$FN(y19;)1_R~IIz08Jy^~O^twGjc{N_ZB365 zkN@>d(fKLc^h^iV$JXg71(uzjVqg}w$IO&r3swgemX2NEOd(cc>S>3 zQ_y9Nt!Ag95+RxrB-#WQQD=09qLnRYKCx$U78FKNqj%;MP0$pGmZMw26f(MKK#CPl zY87V@1hfs?USVljp`=%l6LaySo%R=e@uYcS6VQnVx0Vi;6 z!qKSPh8mE19h=JEqk3-s{T|{bs{U~wnkuU6mT#n*s_r%)0-_)E=Bn}L9X<@J{`^*} z86F@7*LK3!EO86sAui%0PU0nQ;wO&cDX!u+5`7(~0x|%tS2C?zq9rLOCMLHADt9K^ zx+ZP#CNoEKa#AO9kaKsECwTHF=SnC+_bBR$u8d-InDVZd(sc96bebnAP*-7kEli=p zul^bX0Lyg*D=P+T=2mjBWQTSN%dlZE0~yeK2@oMGPUm%Q=XZ|hc`k7UzyV?qcp=*c zBYSwV052v>FDSdRiJmX^QhD`q3ji}P2NMgoz$7+3V@tM3 zTkIy|c1!bo(WmFl?(8R?eG{;KJ=A^Qw>C0Fhy9!FZ5TIiI5#MSxP~jZ>*s!ilYjVE zf9ZZW>2A6GSGo5`xtW^`n@hQ#gE^iXx}j@2`;I!qz`79FI;(5D5vaPy(>t)^x*iC; z82GxlySo(l@Fqxtwd*^=8@$Q$yDGRp#;d$QC_P4KgvaYW&l|n(Lxe)ugYq-I?bAL$ z=swU3g!O|zL`d@zq=f$CzV55O5@fy&w1o|1Kv4)m3)DbiC_(xA3ub7)A*4Y0t3q~@ zxBh$WY$!qptcGs5zzF=me!Di-PD5wIeL-aH)Xp`8sKJP+!HWK9h>S=?=a9lu^oVY+ z!sMXBmRQ1;D8pl<5BuN@(11oZtVV6*MmmhF;L^i&)JGi<0)|w?f`r6|gv3g0i%lF! zkfcb%7z03XNyBJKy*S0k_{CT(N}~iz(C7orXaqyB17sXaLvTx|f=jx@OTOfwwcq6z zV@&5rDxmUAAGQb<76;Q*P49S3+@ww8q>qcdkLmP}=Jbz|4E+NMPX(Dz`{YjxSx=hW zkOZYrpZv)O)%_0nP^O&9rp%E=S&|jS%qFQ(tc;Q-`IAzGlSesKxeQaZT+CD%%esur z9ku@G01&EFA-bgs9U^t=5Gq8}Fk!=n0wqpVrEns_hW?@&-r9I56-9xfJ`VhtO4Kcm z89CnaIMQXwR3>A}oLMubNSrc7iKJ<2rzlfCb@~)F%IGLkK}n4Y#Wa*DQlv_aLbbH% z(@4jVAt)xqOD@l?x zxKiLqfe9Cu6sd6~Opqf@mK+Jw>Q7eCJZ)QR&ZJNDw$ zvHR%~r_1>BUFy6^fBp@Z^zhHam*2&U{VrU*{&3NsA3uFB0^~xAF0>dhzyP&CFu*Oe zXs|&q9MocpH>Q|E3k)rs5JN4V;P68bLA>IMDMqwV!wx6(u*4}meBy}~VVuH>7A>>_ z#usa>@rfv&Xkv;VUlh{E7n>mRMJSpuvPd7H5aNj^eQY90C6jbQ$tSFwGRY*FV4?{x zjQ|r&CX6VvOf%2)a!oSV)PV^dga|?iI_aEK&NrD5;!PrSAOg-k{nR1PI0t2c1srr> zLD5B5kW&Q}{Ot2kMHyuw(n}XrVNoJ5)d5maaZo{2P$6xhR8&Dd)znp2g*1gtQ-BrH z5o)z{gbzm8Kv!Hp@YMuhHvksc4@xlp;e%n16?Ow=Q()EvW=ZgsS!zkJ_F8M1{a^zQ zH1PIYaKrVs193a(R@`qhKv!LF*%jAa4cJvz-geWCx7~U3t@qvx=CyaYpn(Mj5MX1DJNEcvkV6)EWRgoZ`DBz+R(WNXTXy+n zm}8cCW}0iZ`DUDR)_G^1d-nNfpo12AXrhZY`e>w+R(ffsn|AtXsH2v8YO1TY`s4x( zC;YWi3OEK+Ouy9 z)-$xQiYk1N!G#xQsC@?9a|e6uu)`i(>@dIxet6=;F#h=9Ghjf01QICVYUrbvetPPw zxBhzUv)6um?z{K?d+7&AAOcz z|905#ez(9y0dYaVTTBiWmN?ucE&+*0FhV(MIKvsbu!RV1;R{pvLYfqX0}yDS1LPtX zzWQ~s1~5Q{%UdDE7Vx~F4WIx8NWcRW-~b0OzyT=aVGn)y!;4w0Vkoqj5PL{56{fI- zIZWaTFNVYxs!#z7nEoR3rr5mZ8DNG27=XsW_eC&_s2>=tn>bqZh*1BOwJjNIweWkb_htA{E)lM@CYT#1O_X zDrrefD$?62oa+n*JHy#dcn0H_@(e~jyJ^pRdJ`Gi*k?B{pwDjdQ=jxihCSBvVs&asbs{No;tI@CN4)u=tCV;kKFN2vPL zjl0m}E+ilUY`}vYTjgq3y?TzXf)%XsAV)dQK~{2*H6CLv2U+29)^nKS9CO{rKJ;PN zy6z(y(70*@{Q6hG`ZbLbIKTl2P)4T}-~kN?fd@L^*vERn11^wkWGgFK%wpCBl;vz^ zH#^zQhE}vMAngli7upxd;07^>!D?^t+SSG&2d!Og4|rf(9^_yLIpD!nE0>TE$g;USM7ypx^Y z^u{-V00esh@m~18R}g{##C+#V2tnZYzJnkHA^1B800$VrhZuw+4ng2S9KyhaIPifP ze251(Si%Pu#eorF;Rav$!iUhXMm&s&TyU7f8i7cOON}z;!uS+ZlR7`s6!w`z6Clcl9Cs11jZJDh&oc@5QdmI z$^_A|L@=_El-wc}P@afOgp3G{NW>&4IRr;UA`qB}LKQHX^PFqK6P}o4CwfkWDRll~ z5>Egn6@k_>PJUt(SRBO^T44%P7JZdbn8g%K>B=Wa;T24qg)5#o3t2)T7f+M|Euo-< zT1fpCwA>{wcquhpCb5^k^raGdk;GmG!x&muA`*rn%wQse2}uB(Fq+{^Bvb<$%Yddc zquGqHjold8q=q%2$qj4pfSW+rrV+TQLuiDv2;lrC+}-JpAdC}-MuaEb)OkZAx&s{X zqz*gJ>B1Sz+ng>G2R+rPPIpxIZ~xpUJ$1m3eF9|g{q#pa3tITX5wvg&@#hK&`p|*-Ka!3k~xlSKK=zLxSUBs zTGEkt4h1Pu2?|5cQqYYA^eqj2=u>J_o6KY;D1_-uY0}f0rVgh;$w}*TdQ+j`)TgY| z3G0#)0ujp2fO7zfr*0P`ltrS2@1fr)_ zwXj73ZTTu;B`hJj&V?@A11$IN+I_tYwl8||%lE(!zP=o$Fn=`+`6fJ=!Uz^I=s%1D z4Rb)hIN*Q;coDJN=YIFS|9$X>U;N`IfBDUSe)Okb{p)8x_qu3+{s)MlYrPZO7{)+0 zvZ1YPYIBrGgzH1;Gh;6IwQb46X<{t5TV*D z7!-mcDRQD9)IOe(p&D9%#i|&Kp_mgIqKn}G9x@^y5+XwWoJ1h%#6t8Tis2z9Y9R%1 zq8w6yDGEX?GJr1Xq9%MrSd2wkq?$8Iqcw`7I&vze3aX?6DqqASKnli0;)O-(qhfR< zMq(sMT1I0WrAm56VW6Z;BBf9Aq)VbkY)mCiN(NL4rBP}nV*tlnA|+drrCsVJTe2ow z8YX05$6Z<`YGOxb8m3~ZCTo(%Uizk7!lrS;rFBZDb@Io597up1$aY$&bNVH4YA1jq zsC<$qWVir)(x-nasDOgVV9*AP%%_4nsD(O6h_a}T@`ZMaD2fV6i;^gj94VOc1(8ZA zjT)(mA|;V}sX_V$XgsMwVkwvEqhIKwlrkx2bjJRY(x{UXN}@C=LITD*LMlHxsz1`H zpyEZP+Qp{AML%*XHd>@XQG6Eyuf!Fkb9T+YjFaqWBfhbU} z+-$BFVXo(*F5sMk734S!!65PS0)Be~@dB^(V2|ujjygcE;8?HriZA-2uSl@3LMR0L z%CG$rg#Yrd{|Yei3@`#aPYElq37fDD!~QT08!-`U2n!R1TtG84Be9I&F#Fuk6YI|v zQ?e8rh=I5<0hI_PJ5U3qF(5-SBoi_sE3yH#G6H?jAL}xSXa#X_GB3L_7DI zh!P9YhfoJ6<4_C5h%5Utf*6T9Q?ojAvyt#HRlrZ0fC-bR(VUPoJ~OnM@UuV5i5mrq zpb&*pK!up73PnSTQGkl3n2M-aw655SsfaXGcr;A=v{2)UujtZG)3mt|3s9?zwHBaCROJGx2ql8)$3^<*&S?jgOn6=2zwa7@eV9N~0Xf|T&49iH3(CCb43yn`` z4b)(bI#|?dlMUaX4c2%BMisa9{(6K+cms0_kK))i>3Fy9c(39Jgyul6^LWnaOip|Q zkM1}Ff-6Dx&^Pt?w>sF5f`gA*)ereNID@OzTHTKbaX1ArkONr|2H7qSxwz`EkP7(% z49Nm7n1TiYxhw#=4>36sDLIz&kQCWgmQ%Tyb2%Lu*Bg-$DFG5F=nhD1`jTclt<@R7sHxCyJ6NN6sjW5-FB? z$(fuCir|Jb=_yxg&2W;@Fvg9hQQcH5sDzI`(c80688Y^~=hqkKAyu?em zTC20t2Yv2Ka)^dBB22&HO28`2t17JURV;7WfDy8+%B;-GY-rE|EzTS*+99pe0!`5b zg3*Mn*2;k!sDT=|0p40o)x@pda!uPBuGt)}h+wk z3Oj_a<}d?$PYqLq4YN-U%LV+@PYvTw|AdGX12F+rF}N;JB7-pk^)f^tvLHLNxYn^B zd(b80u>utc4b^LfK!<|h2o`gQ8XE@@710k}(Hb)dieQM9kTNN&QB`P#iIB69aM3wK z2{d!FTL5jFz|lL4vzrjoI}-|`@UuNLwAn6-qi8fHU9?8?imo69RA7ov@QSV2Qr_+~ zxA-(J4GT`|ic(7pv?$ZLi0)Eb3s%DmzJQBbD-7(W(>g_r!AOithz!EW(_r)dwZ;Ip z&)^J6Xaq+PRAduWX_GcgaMWm%jcdydN)3eiuFl`!jclufY>NctC=LNPwor`&c5Aod zU^jd#FF&w1?mCH!mPKVEyoiyAKk-k2=5*V^xp=;g1Mu zaf;)R3ZW1!sE%vZf-AVz8xN5T!H^rbkZiT_>B^A~;Z~iCkr!#X9BC06Dc1=p*Pdh7 zCts2$Cz7Mv5+vDIc(qrhgV&|&a(`75*StD|?L(_G*fMz&s)M^bnG=o0Ix>G)I_bJW zF}sc>f^3*ffO7-*_17GJ6}7Oh1paoyhi?S0bsFNnw`AL z)7eWom7VRp5U>?w*%o2}y<+q*roh1-7t7qTtewq0AbWn1GTKHWpU<6D^LlUoxCm~K&FgxN%hsXjt10qj#m zBHngx?{;thc5n}OaUXYbFL$7kp$ABT${iaTKpV}qKm9YCwgKJHt(!GygS^3;0h9yN zRb9V<1j0$2#OVaXnZVn1oZO8C*-d!b-N4-qL5Tm|Sm<5PF&)#11xttpKN#@tpn~vH z&Iu7tDfodGyqy^Y8|a+ClmuIJfAku z1S^E!_IV#!m|p=hL;hX*rN7@ZB%lMrg*8kdH?#x?lEXQSg9@sk*2zPhi#n`R0T58= z5lRJPsER70+9_;SVxj6qY8J*jGNeS};y}V;(%)i98YF3y z#!BL(FvcWQN~Jc2eQNY1*l(q6OeIqiM{}&DQ_B50UdLIwM`?N{JjUa8B>rYPhI#a3 zLVhM|`ljH2rd~SabK<4y-$zBxe(nFqgXDg7DrHH={z!9ZcA3AVG!$9~yjka2P^i zzX&2EII-8lVZVk&943q-FODXAl{|^kWJ;7Rd8LHu5++TWx@h*gc@w6tT@fU}!$xlC zzkfrIA|+RDD7_M~T&X!$( zcHtrP=+C1=hklXT#f#RgRlATu<3@}dwr$t`t`Vd5jT||8_~yaGH*n!bdie0sW5}ksVIqFdMTxwQYs3ksd!pr zDyD#1YN?)xVu~rLdRmI8rN9EqC!^3BO0BlqN{T6;;5teupQvhUDZZ8xim}Hc8%nXI z6l;mHlz7tYC(ecfttXyX;t3^|K-(?1+ENm(xRg{<$+qE2Larp{u1iU}lB8R1CGgH$ zNhFnEg73WfN^)-`m_!mV!2bp;uq2pZ(#XFF1FUev3OAB)BNIzJvBiMkVe!O|OpI|O z96wSAAdUDjaer^bAxI=~xEIMA6UPw<%8#H72+K4BvPgY?=$v01i@Z@^9ChqmpL|`M zF(1nK(MKN_O+OuV(_V1l1^(4mU){ykTvV+!)?Z)k#TQy|4Yn3uj5oy_Q)saT+ii~* z_jp&lEw|iLWRZ5-Q(Qs!6XX4@#otp59{3Z7pLe)-Pw>sSrJ%&1QblrPW$Xk+-^key3=k1@3jNZgb_mM zK>T#XGoeHB$?HIb5JVKAL-9mNuRIaSKd-`cDzLzU4k~=_z4tnd-#rfIi~l_l)OSzB z`Qd|41o%3%po0C}6%0y2<- z93&wNX~;t&GLed0BqJN?$VWmll9HSxB`aykOJXvUn%pEOJL$e83OG^UCyKn}=Y(>CC=4Vu`gCOE+f zS;&H(w7>;Bit3J|x}zOPMXFMlnpCGY^{7gnsylAcj$7aY7kFX?D^3v$RG`8Vm$-x@ zAi)Sm#DNh>^FkWBpq?pw;c(Mofe=&x0v+6mkHM zfy@IO;Ml(YzHzT%Y@;2|_{2B9k&SiCz-G-z*}h)ZvvZ^@UrFl#$fEYNkUcE}8qiw5 zy4JOT6>MM$TiC-UzyNuaDQ|o0+us5=xSH%sUWpR0~r@qu!fJ(VFM#W z!ywMEh&60t5@*;L#n5muRGi`#7X!w~fU$~W4C5QyIL9$gMly<#j9}z=7%>)djD11m z90UH@7sUW_jDbAk5CT6_Q;JMCsHpoXjVrP)#xy}W_^FTO4=tENkA&RC5MIKUUBNsX& zc>cvNGC~nwd;}pL5eTENi<6ary1FHi2}wjf>QhTMy1FpQFMg7ZY!D?WvVKZcvI3Q( zTqP=2DaTiaA{MB8MJ#3E3RQv~53-m8Eojk)K8BK)xXgtvKeZW1yg;6MmA zvzg3z+cTW;OlL#`n$w&HHR@)~YuMcy*SsJGK;R7wYLkQA@TNCC*f(&3!viDa!2WkW zXwJZyBc0?3AqokP!VoTZ9qWWA3flpX+r&eKwxtK-UVu-0;KMSf)gfpovk!m#AT$4< z96$zI(18R|2nNBNK@Xbwg)Vf6nk(W#H{ZD;2C;Jv`5Z(-C((ZL9 zkGO#&I@w)FQVJBH_+BVJ2}(t7SH&v~m8d3N>hM6)RH786sKtMZQ=TeSs5)hNQjH2! zm=_hPYE&atrHWRfAN?pyVXV@J!W6zzmaS&B`cV`sS;i`bCs@C%Y0bV_{>sW$wyuS( zYjG=F;0jmp!*z*qA-@uqsKh18m9BeHA`P5RNX>j$4SjT=*Jw>0P>lwD&C_%s*ia4EoDCP8 z&DVSZ+MvzZz|9QWO%0xh-SEvo-Js-%2ip)%4_X1^B+d^CA>mvB;{@Rk9--t!4&iK$ z>0r*`d`{*_Ar*d36QGXl$WG}Pf$WHm7lw}Lz>e&UA@E?K=m-J+>I9GO{Lb$P4-=%} zbTEPUz+vwY!SIkz^)OEnq@fNN0rdbP@dQB-2mvA1Rr%<^`{befuut>Ik0YwU`LF;E zNFol%PxtIkBHj-U_>cX#kN*%*1@Vso5m5i6Knk#c0Vxpww16rakO)N31BE~arBE$S z5C(BjE}oDHozMrQfD4I03Z&2qxzGlP01cf0F%shjERhgp#t=!y4|PB^PDT=0<26!I z5H*oDW+N0~Q5AjTHb)ykU)?SI@I7${5vEw*~(K@2h8m$p%U6uoIKxny<10=w1 zVOu}?<39pqKnmnQ5@bOd%M=jR6?s5=Q<&F7=Wa ztU(zB(=fGxFeMW*L4q1Q6Ejs)CTs#ERMRxEBsa;VOor1rk&`W;!a98uI;|5q-P2D3 zWl(A`TC!zZCdL31ff%sCT(Ut<>C{g76j0RyEeusrwF5gul~W1kU<#&E z0j4`-6)s#AF4V#-*b^#zl~`Q@Bsjt&oRu1!K|ra;d2C1M%oQbmKnOgeHnNdl0oH6e z00W3+ASqS>B)|eZzyg#&Uva=arqMf!5gqN-J^t3wJvM-Cs*z-6R%YR&Xk8X+Atz`h zr)#MeYPHsB4%TTBmSH78bt;xyVrO=0=XNsE0UTEZESGbkns_=FbfMZwkeW(Zmv?d3 zNPri3eOG*z*Ley!Jf-PbTALx1sCdlf@}5hyVnXoBsRfHi1@ z8Q6n5*n&Nnh_%>;Ap?eu7=~qNhH0pTaTtp&SczRIgw9xu)tHO9n2yodko}jB!RU+f zSd=A$FRSdPxwlI>`dp_!RknV5MQm4%s+f?1VC1C4 zk{LvfDcO|*+MNNYp7~jw@tH^jTAuBh{*eKim@?W(7(_2nM5SSxM_dG+9Yin0X{A*J zn>N}-6a=0w1fezBoHiG!#RPR-m#LW=c}^Fd`b0K7g{;lmP?W<`EX7b{MOR#fRaix? zam6`o#ikZputkMAAX{0G#j>r%J~-Q4_{6G88(qvrUK{{-s*(XjMhD1%2WWt3f*WR# zTd$UeXp{!JrQ5ot2E4(BYRG^L(8g}i25rO$7ZSr$8p@#XiXQy0ln_WeUMzq{fEjGNWZomg8%}A z2yBDYT!m1GgJ_6`{9Mre9MBQ|ozMy0iaace#E8)`3e)8Rj<86M*hr7)$e^f6oA^kY zh@Fv0o!(hVlz0h~?1_`8gO(Vc*TG$raNW#uU7RS%lKcpnMKE3ZejQrZgU58wot*@+Yt=x*~l>#ZCf~~Bc>?KR=g#xwIUMNJ%u@q(R1>d!7%kOmyxD4O8 zm`k{rOSzDXyS&T2Fkkak-@cR!_w|eR^^3r8pXXu%_?6$nkRQaD?)qs=Bj7MrMnxGeW4c4?^+;{;Npr9A5huxsB+`K{Dw66_bf!)x} z-Dm;b@Sy!}NBl;P;0(^>aOM->Z{#eY;&4Y2Iw9s<;pQmt0xPiRgihx8j_E)_>A+6w zcn<5hP8ee02CL!dyrCP?P8x>r8e*aH=wb8xArtJt2vZO9NKXqt&-1`x5EM@k(AD?6 zPbQ8}^SlrE_;CDSA`xI>_ec*5e4_kxA}8)oCkoL05YPbePbaP-3)D~j7*GVMP%MIw z38c^nq)-U`V*Ut?5DATt35gI0iI51WPzo922e?oR#ZU~1fHAtz5b2dP4$%f6Q8ZHH z5P4%bUgI{BkrhReID(@ghocu&Q5J2{AfF=`rQ;&I<88{LXAvi6@l|JWmOhT9ta|b% zgK{W~@+gyXDVy>sqjD;%vL!u+0iXZ~u!cg>fEZvUE{(x0b0jZ$WJr>vF&R@yszD~G z0W&p|G&R#ST|y=#^Gq^xKKW!ejZ;2(lTYH4Py(er0VQNw!Z(FgIThtTZ34*vO&u6- z1EP(3ywwy)fe+Nc3ryuhF;rG!rA2Y2SK6}}d{if|@;>u(Kl}4P19U*A!YMpvDQv=6P3BqQ0a|6IdZ6!i zd_fr6a3qdEUX3OfK^AllmI9>a0u%rrDOM|2r(-!5aIPaEH=`j}@;f%N5&>&2(%@Crt;IVNqvw7C=r5bXR-zS4Wa@J)2x87kM%ls6AJ6g_>HcXLh|O zN4O_@#&vy?7kthqeTvt6)falb7lOuDf6W(Q6T^TGwqN^ofD&kcA=rZ^HiSC%V?(Hh za_EG1n1`j9h*ju@j;M;6Scx73iq;s4(pZY(SdQ_Sjh%Ln5m}pM>5=IellAD1GFg=V zEt!#aS(hbgFkFC??Y5ZRwv{nym_aF-(e{o-8J@9dY!?}s8ibjWshNVQk$ps&ZmD#) zmzi=}n_e12fCQV;sYYnTFFXXLiK%#7#6gI6MpQ(i9hyeCXQ@S3TBG$^Pghz$7k2T2 zF8oBJ#@eGQ#ZgoRrY?o9c}1<61yv0Auo>G|n1fgt8(DmXsj9^|ki$Gk8>_ZzT+qb? zcxNgu>~Iau8f|G)Htuhr%Jb!(qo1oGZkIhj*L@#hC}jq4RpYff<-V&|u(w7!Cdel3XD0 z2g(fyAUwjz6i6cgEX&0l!a~TwCM?ilh=zCwhbZjMF)YNw$i_Zhi5T6U(}*ZM9n>*O z)Foby7l~3!ydByt>Ee&?e#6Q91HFFp0Bk})jPrv4EZt4__1!pi2k4Hrf%xGZpKUu z{?YEpa7@n7Zta3O&HUec{O-yC!piI}@Ww#_-po-1U;^nx$-at#TJVAzzP)szkRevJ%b4GUJy&&yyP$e;}>J^jY74c5(*`{3kE zPW<+u;PCGgB;ny4VH0K!4^9pMLjmDn2X=T)=R8i?Q{e=kp%y+t7fNsihhYZ84%~|l z?O-A5-2EH+AsmV@?I_O(`~BY&4+_tf2{VriQ&00W5Ag)zAnJe(r%zo;5BH1@_4u$Q zu21}MVj^08_o%@7V4@T^u@g%%|ExeM29PVJA}X??6}LbO{(yiQcQGt>u?l#x7we)f zmaz$>00vpm8Q+lXE8{P^5Dmdl36y{_E@KkuRUcy`5&e+!C($1xkvCdD9ASSVYyb3j zQBY$)CAVWbS{6F$W>FjGaCR0w<|7_~b^E*j`@?_y%m4h-fBoD4{S!uO(&`7mzzo#V zECB=!F=D_B90O*|7&i*VxLM=I;Tnk&+pJM@@nRk|kmPWL1Su0pNS#7v%5-THq)nSL zty~$)$P7;M0Q&6_!Q_WT)iXwjodmo{yAK!Fuw*tBl*T2mWMnmEa_ zEsIueT-sF9ZAN%aFqjHGJ^G3M-rt!Ve+D??esWZ zWwljfY*m$4T|3{o~9hO*RlPTudW0NgLQ)rnTX4y!gt(Mthmd$pUV3_sA zmuZXfCE9Gm4aOI5i}6<7VB8G`nRn%dH<%0JjTc^g^>z1Nd6Cg~U1Qm0S6gqvRaaba z$sL#6VH748Tta_w*x`vGruY|OBK}4c;z2K7v=?9C942Iqefjg`l7;!@mtII7hGm6Y zMpWgFJ5E$&j?D}cOf`Kjv&=EYM6+jJbUC`p2(W<%8giU|8ftjXAqO6*$(b6Sr{f`K zYp%PF=bUr4-dgN<%oaOru+287Y;(+s=WVpt)`#wW=yqCy2=tC%7ryuAd&<72j6ebj z4j{nE#0M+jfebbLob%8{ci{!jOFvzP7f_FZbr@o} zf%VsKnEi$va_Hf99(v%x_8fHI!3Q6B*nxNhOxUxP=Z8fyFL%Q61_yqZ(_NMi}C7j4JG* z3b_czDUMN$bhKj;TfxLsFcA@d{G%#T@y9?GG8Lj2Bq13oNJJu%g^E;UA{FTgNqHMc)N=O7MSp4)XaRiZyI%Ruw*@9pK?>H(U-ypSzVh8~3Pv!34~!rL1vUW)3M_&HkH7>b z*#1C-CA@(NTiC)MurLWQya5f1AO#i{frmA$;SHQ%10)~;iZ?Lg5qo$8A*#=OG(ck+ zU&zKcmT`tWbYmW4s6!v>v4(og;|>{FLP`EHk|U&K5t+!z9J0`e9Mm8xrwGdsYQTyf zlphB*KmiFTfa1tpW;34|&1qKin%UfDH@_LqahCI(>0Dq|hQJB+|XO2<>4@&Hyn z>>)4YHeh2Z<0nTt0uYbtA{Zh0`2i0I(3U&Yfg_)Y170Tbg)9{0CF?lL5vsX}be{7H zv3$!hU(t(NRP>P3C`U)v(E^zMqXZa0Nb8pR)Tv%|tLp_ydCSt5xOB8Hxyfi;@7d1Q zlqR5=eP?qrlb_~fr$7D4?RtWHpY~L#HX+JTgsPO@9o6@|J1QBck`$``DmARaSISeL zN>!*bl`3HwBN>jDe5#6Zj8?g7SFPF=t!(8gUwQslz6yQli(#zCBa2wcihSyug{W*v z%k_beRJbA)Dc6sSTd&tW!NP_6Z!xP~z%M<&=(R6?{fqd;mzTZVHGG2MYhAAoMl#aX zt!Pyr_YNCZ;3IZ1g;C7=4ujalez7s}pMOyl0~E{11g?zvg8e5GzsWSFGLnhxWZ+ua z{WaEq`PaW>&ZJAWZcTi~?6!pLb_QtrMgo=wY98=uvW9A=25ZhiYT}_BxMpg=hHJ{f zY&1}8GEi>LMs3vQZQiB?PmpcmK_BeKZuEg_3TJNwM{fj&2KWBPa1Q6{BqKE*paeP~ z1T;VfDn~vtM{|r&b3&kVmN0ZYV04}^bWTTgN{4e~AO~1S25tZba$pN@pa*6r2fVNc zir@!~;0AQ(cYI(6b_aOWFnE+Fc#ubWhCq6r2P>kWv970kutIyNAg-(;*}TUps%m_w zVhhfIse&q}JSu+V$A0Fge)bsDu>3gf?h|PDq6!$%Sl)hG@u!cJYmf2#8=vi^gb*rYIM*2#I=Vi;QT8 zicuNG;TCeiikLBriV=#KsE@YD7t2VFvIvmIp@?oljsDn(jk;(U$w(NV2#m~8kI1MR z7s-!QK@_+FheV-~3WS{)wUTsSzZhq42;E zCW@i(rx6}u67z==0b!#u>J3h+qfAPq-hiZ13ZzsjE#Dvz;$RV8>M7o!5!t5;-m)%t z>J5nM4BE$|+-Inyf+~V4D!8BvxPYqafG`IW{;9BvFbOlM9`mW3syyD{tF|hvoJtF# zO02d@e84BF+zK?YVy)yVG`VLA=*l$t%CD|suj1+n>T*}>$jSVJ%dXHgy21Spt_2HyMjx(c!0R3E4{?4yZ95lzze?M z3kQn8z6vzH@T3+)Bt{f4dAT};te+H?Kbj_7IuR- zcw;#LjyU@5-;m=uZo%NhNIL!y?i5hLD3szO96{p5V?5%(;pkWp$GU7k zT!cq<esQj)e(C}kL?!BGg$@C;8>I)(8NZ}J=u^l0U3 zHxKlX!SYh2^G5F&Yz0_6?_VSjS(?RJIz?@zG3T?R&8*2Q0rul{i91#uG>afeS}N>BI@M)%Ie`m_)HY!70fg=6YA{D6UC(og(i z2L0X-Vj9L_Lgr!sMPb^{WkkkhOr}o0ul?ZU{Y>U$TBddh#rp&h?O+yYe#T|BRYMusbvPJ^OW^3TV1G$EJ#l~yk!E8#fY{bTG)TV9V25e9eZtBJb zsU}LKWN`YX25oQ#^~P`zhh$S@0b&et;==<%U~-5M3G)|!KgV;N(0@e-fJp}mNkC>B$QifK`bc@c|yQI3Y_hJYv+aOjIwff|cQ8ky)BpD`JYD2j~n7~8mw znUNf?2#3(Y7jMBIZHSBJ*oMS$jnrt0V91K#h!<~xgz)Gbhw&a4Ns*aok`RfJ=rJJS z5g;+CkwGaT12U01X_GpslN2eHMgbNYvLS296i5MFD{>-HVH7+PmNxR3JOP+s*_MLI zB!fvKNwOrX$(mHsnTiRTF5#N6$rB_Yn5PMxDB&i}>72$1oGyW!c2b_+sV9$8p8_hL z2+E%RobsR+s-6^TDlwrBK7pYeAuF>|qA2kywK6O5Kq~`bqc$p}Mk=M`N!Uaxq>8G4 zKB}l1VG#mBre;bm{a`O=IH%}R*orDu--jyJCooU74&Fy95;KM)I---xstFFK>xhkx>N~_%J4bBQQQyP5Qsx;~9G_k@8RMW2FimwLCHUsMl`l>c*v#tQk zuW%C&8B4E%Q#gCmvp~xTNb9pU>p7X4sg)D7h?A+Sld78lJ7ep#rgJ;BdbUiR;zSm3&d%RTD4yReJASb)3qTDyo~y|4?r+N1uy z*bBZ`V6f>6zxb=Z=F7kQO9g^pzub$zQlJI+D?=^x142MWRaC(!?7}2W!ZZxDK@`S9 zY{Wi51wibyO$t?nJiC0d$T_#mr=@+q$nCyR%!nx0}1W+q=ITyc6RGmQguQWUTsrn zEfzL)C@djTwF6W^6(yDe5=7NhkLoea11p-q2YSFO28}GBjaJ*j+Hmz&Y5qU~yfnOD z9L8f@#%G+yYn(C)00`dAHRNqJI>Fv|yD{w&`5Re(cV7Y`G<*K?a@63f;MzdtQ+)={(kB^@Gv*!$*KbWNn<%E8V(L z7HN2fWnotA4sdsUw`P0yO?b9Wc$V$t&Q4C^A+}1yQ`k^?EN{z=dJb{aku)aOWjo5EozIJ^9={-lMPi9#{H$FZ#?ya>0de zx36=}kNXw{VrtJ9I2Zg99{$RYV-!B&8y;Lj#${Gl|Ku-c$b@E0w`B6KW+aAY8U_Gk zHq;gHW!2W-S+@=Fn$f-0XTqiuHJr$5OXfae?iA{me2_YxPVp1bO_i5 zWZ>*&Ck9}^b-?fo!|?5WhX>}KcZf%W?VbnXPMTmqx zNQGK)7E5Rrhe(RA_=;yJi?ui%p~#Dok%@8v8q-*bxDkiM!HIZih{D+T;piKu$QiLH zjoB!W)nSa-$oa8R`c-HgZ77G(A&`Gaj=xbI<7ge_NFH(M8tKuG94Yls*|CMui$hFw{U)qy`EMRf-g;QU(n|j2O|=#8MVL zF%0F&qCroTLW1l#QY0miAycN5Bnc%YmLVlono0htQlyzPWwOl4vZv2TEHPEWgefSd zNJk?fjns&#(ngq?LT%L4DOEgFvr@$b=n){SS|3pbMD>x_K!5y@~UN z>e{(?7y0qCXwlp*e!BDxthY;-H-HbHc~b`u;xmRB$2lCQP94LBxpdK-*^3v$bv}3b z>_xNZ(_Fl~@uKC;7T2u3Y&oq3wH7X1ZhNk+rMK_iTYhT^KBaeY;k~aM_pQ9Rl_}4) zK%X+@iFE7MwJ3j5{R(&Q)Wbg+|HKOS@zcpafuf$h`teQHzh4i<2>bf?*EeYbrT>%t z{WZZve+2T!1QP-t$b=CKD(IktLL8_=g#HH#p#u{-T$mw-3$hTQ5E1G?1QSFMF(DBV zj>tj~AO_(fi$bWN0t+l;m?050>Y#!SMeL{pjX2UsZ_%`I;*I);(98rxt1zvt-As{E3gd!YizB>BHKU%4lGcB z0MJG&?X=WZYwfkzW~=SC+;;2j{=?z`~DEAPDY)@$#* z_~xtczWny<@4o;CEbzbt7i{ps2q&y?zXKFtzyln}Km!5S2H^pFt0XW5B2yXb{g(t2!5D5&h@Z*q2F8Sn?S8n;`m}jo}=A3u# z`RCXcpn@1|l+H#QsLP@Li6)%1E{iO+(1Hst?6l(!JMP%-&hEVT?)&b#1K+#u?X)xd zEx6or$}C%VZ3)_tIPwS{al~=PVrINS#oX1c#{`Hnf}lYM9au{2vJEhx{`%`H@POk3 z#NTiN2|VCH2EXF(s-)&`x@r04!&Cq(wW&&lpi%)Wpr#f$DFuG&fwIDtuJBi@{7EWV z$x;^j7=XSFrmuq^RG$OXw=DLhj{y#N0R0N^EYP{|g)oev3}=Wh0vtdByU+zMc%egH z^n!;w+~E&}IK*BUk%&k1p%It(Lnbbf7s5DV6ninnDjKnh!pI^Ov&h9RdeMu-2%|8D zAq--WaTvrXV;26y7{+0sk&I@HBOAk*3}V!=j%{RPF{WV*V(gI^eGDWY0U1bR48s_R zG^8>1n8;%!@{y14xT^2)^yc~uvbU9346!Vw89HuXg8H`{Qvzfst1~Q;Y z&1zntn%JafF|^stUv_hw;EX0Xe>n_s4%3#&Fs3oxs7_)IBb~K0W;}gSOLp#(mb*-+ zFnh61VG47X>kMcy0~*U+{$d!vh@vos;fr4E^PvY7#zFbXP=@mJ7Y+TzFO1kwjt;}2 zPjq4tMgFS99qK|CyO2OO;6aX-y7Z+jJ%>x-aSnK}lpN=%X*^^akCyKAr#(GKPk)-z zcmP$XMir`1&9T&Yn8T??eX3NU8jpSG!>aqhsRSYrfn9j@t6c5sF2X8Su1Y`x2Ot0q z0XBdKG#~`zBcBK4>Vdh|^{#mJfD1y9R~P8juPz9zUG8XQV2mU_^)l!23Ngf)T6=L^Svoxp1&5ZqeWg=Ry@2rZ9#tEDj8-;=&%zaD_3fj$3Hh z!|K3rhc}$!R-hxqFn)1^5pfH202ssQNU?{x;b26lLmm572akOW#pme2@9Fk%V*N?@cE zk+yWCEm7%CpX3rMF^MN6k&;Th#MCpnM5-%s36`juB{z{otd(LDSOY~8MM+9hkaCn> zKjkSzX-ZV6!j!3Kg(`K>3R%7qh(`nh6Uh!lBc%O^I>bQ`bcsVGu3f#k&_yZP21Fdv z5(mBL#Sh0lZeZ5E7r?B0F>9fVVbG14;wlC+_|Erb^38?NjHWc9F->Yz)0(!8rZ%VX zLcqTe8ienrH>{D{6|>w*K!HE}`MJ;i6CeT+=syjrPl67_AO`+Xh(b(v5Q7Bt zAsy@hLm`75-Qq&0;r6@g-08j$NQ~^8SKnRLTRkoL41Zj2qVD(;tyNZ>qbZ@Iv z3F}t8nxLujmn!BT>-ibLUnOIDr#5inD}@0|p(C0PPorQaFWF zScO)2g;pX z3SQHKm*5DHzzB?h2G?^2UT_9;^9Elab5H<2Dlh_+l0d@}eIdj?>Z1S(kN_-H0QIu~ z*oQ*FH+;4?Km#;Bxpyg{D2k(aim{T4zz2QDQY@~x{w$CPLbBLF9ArZ4b3zM{iwj_h z@w0`#_=~_8jNoEJIMhQybc{hXQbVLfO~i~PU3>jIExa3E!R1D~(k--#_ z^i-0y#7fF^Oz@OWzl2O0=?l)}Of0EP+XPMFlubB^li_rez9ddHnG8M|46KAq!30nQ z6;L1vQ2wNp|HMx4Bv0z}PD&|I_Y{@06b%0Uw3JLKP!`otV?;&!bWaq;P#^VCU)fN; zAW_D|PsT)+V>Cq~bwo|{Ltdp)+0arqMGiNWmw8DJ@xW3wB~vv859L5pLj_cRiBv}g zR6zAqKjoNI<(N|iRZ^u7mT8%Kxm92lR$%2-WEECul~%&YEd}rZ2Q*i4MOSupS8$bA zef3wcSy+R$Sc~NXh(()$`-m0$41UxyH3{?(unDqy)F z3KI%o1GZoqT46WVV?B0a42EPJ8e%#oV>lLK5cXgl=3q*uV-rSVxd34l24oYqU#fr( zC)Q+3=3@?4WVhg>Oh%$MieWTXq(h3L0M=wiYGOv#q)O^x2X+f*Mq^QW3;qRWT&8CG z#b#i}W?l+sYBpzWre>mG3Z)=sZ)OT~c4l&RW}#p z+cp<+ffwSY7LDK*-PQT%o=9VJ&C*Ku;)LpSO% z1q{n%B zA}AtIC?dcpC9nZ?t0#?!isln43xs=m+bO~qxWuQ5uwp8M`+LRLiHd7{$MT33BrB{K zxyYg{vDhpH;5eh1xthDVoZGpc`?;VSx}rO}q+7ZN6F(300eJ&Be1kFh$1!6d2C)k= zAR`7Qvj%J+fGb0QaS$^xBL{JCGd44W3b=q2c)U+Dfk|_LVdFH-`+*=>H6-|fP%}0s z$b!$~GcEWtX+wkFJA;N;o^!)-;0aqhfCG&sg!D&$Mwog*oMI~JaT9}##4v0K!SLP z3Z(!&kKl)l5C?#Wo~ls=)PZzow}`E2Df!a?9I!zQpa8WviMwb3n&{L)l z$xP)mPAN&w1m#Z{rBMo%P-)3f9i>hfb^B#pzM3v&5GC?x^&U{lZl zQ!llbECmleg;NtvQ#7ShMMcpRJ<&wPm`|mcP6e5cxm1&B4k8^7muZ>e;Fp^D3taV8 zp81(CJyvIR0HP_n4TAz15LbMaR~@jLKkb@+rB_59Sal_vvPqjteOS54SiC8mG5!FY z!D*bHg`AsJTFEI|r}dmW&|0qLTGlyRJ&2v*u>~fqThu{u^C~y0af4ov2Cf0u*>)G| zc5aJ+7H*-R(Y$PB zUCkXr`bLfTpJl@d<`j3WydF{s}Q@kA~lf ziV+oI5fH&?iRuZFT4|*aYL%7}m6{Tk8WN~h6Raj{q=pkL@d-ZBske4(L2+wEQL0J- z;=D#|PC*nz!4$)$6{45R2;asQ+7<^ot`^zWZE4Z0 z&FXH8;TP7k7vKbKnh_X?u^E^Fu5N>G?^+t?N*bPF83~64w-Fp! z5U*H3aPw-Ot>Ihyx*W^_=i2cbx@E825ppNo8`z=e2#X#k_va@Zuq9^&hj_8%Q3Vi7 z9x->Z`yn6tA$0ozAV;UM0n)Jr(jS%%B8fP%tHmJ~q99NAAP3U^1Sm4IFKZ$cvLRkq z1R63TGfN^ra8@H>s0jhTboo9Qs z7eE`pDWS->gxe~r*eQm~DyEXeyBB=7rz^jwe2+LmOPsj>&MU{_e9-5Llbb=VI6^6e zxnNxJ7Ju;=pYa;M@f_dr9{=&%g1Qbc0zfbWdZRZNlYjLGyCK8!Yw&-!t1>6EG6N_F zz?%tq(1115fD70OF?hVki!@7fG%DDEQ)BedD>WV%HMRaAf?VT)UPCrx<1?tRy=W7I zF8G4p%ZJg!2yDIuRG?e1B?LQA12$lrLRf@qKR8HOIPojLOeh8!P`@Bw_jZ5xc%S!r zZ-oPp1Y$r2ZZN=NxH@Ji3uxF4vctd-{5uc4J8{^C4;+VcI6KLcJhu=vTf=EG=!a?` z!i3lbU{5y$A_PMMS8+8e=X1p|EW?wCeGb3@{1birlPMek#6N6`s(IoTgT4a9Cma1^zHL5T!MsM{jP{a-~lmUhqVz}Xk7-V3vMHW@eA%`A#sF8;rcJP4*BX$6i z2OoD7Vu&GxD6)wmqKKjiCZA+-3MZ$avI;7VO2zF z7~+IeNf_dWO_3PlQYfYvV~RyFB^8e~mUs|PJgEc}PevhSlu||s1!hw|3B{C9UJiwn zn@4du6rXPQDWT+Qthe5}lCDw4+UrVC zmZXwO%BH03v(=WQ?Xv#eE*ld}B$>NyOd^rHkx1~qI}*Jc(fjVd^Tq`5MgTD!@H#NT zV{gFm*fViJ9tq@;MgqYc@I?Yy1dv4*iDPdy1yM7OJxzZD^*iHe^AR_@@B?-==kx;) zH_v#Zi#l?T{f#qX?*sNUaqprFE{f;k_~X4WzIf-0XTJI5%k*OUE~>{KdoH}tLW|_P z4-<I52Y-qyw0J-MEabmpiYN4c{|Wlj-{1c9mp=g(kV;S3 zpB4N!1uHO6e+WdN5t@KNC_G_;7KC61pHM*vLcxO*Y=RIh*n}o{(1K7X;Rz>L!4G;+ z2rhgf6J$6;CjJ;fhC+~`4Rc7t8{$w0KV*Uqh#-U=08s}))By{0V8b7>fC)+@f)I}w zMI8u%ia%6A5`U@_C2WYIL z3Ra+kBB-DRb8NvMRgi)fupk9~9AqK^naC6vG6f?Tfe1t}0uVql1RwYSBu!v~4Q$c` zAMhk6IoZikZorf&Fr_I!Fv(P=Qj!}e!3Iu10ur1cmK(t21~jnC4(!sGzx1UpeVG9b z5EGca1m-S{smx(ElbOYYW-&9c%xNlUZEmxg*_5U=rwPt)j+30_%;q@5 zX-;;w{&SiQ$N)U!2~T>?(*X-8zyJuePk#2(pZ^4CKm|Hbf)>=E2SsQ?6}nJ{Hq@aH zg=j=2I#G&N)S?%~Xht=L#wb z39e=UCPCT0f~#KzD_3ptRa=ZT7FM_BNygFhCE;zy{*B!MK`0 zt|mBP3t2Rm7PMdoE^y%v>AJ(Z*TrsjwYyz+w4=N20Izg$af@2qf)%HT1u9B$iAy-* z5s+ZSBjRud`kEn4Q^1n`pdf@G2tfrx7(p+QIm~%BfB^?SumTi(V0dzX0}W`vFdM)D zXf89Eywt#eGmPO4Z@57i{xFAmDPR(V_`(;~FfuiKVrGK#neJ>SgyZ>6dP3O7H?}bY za(rV1Ge7|haDW38kbnfN)VD`Qa*~z2WF`lc00$V4E~LB*UGSn8yuh-RwQS`p_u|U_ zT<)@$u`FgUlex@S7RH!`(Tg>EdChHRGn?Nm3_91@&UBV@orysVI`jE5!r=3s0S#!% zT!zoX*mI(Zf#^gtS|P+p1~H}~5SJ9hAOjIdL>w{@f-FSSmo`R83?hw)XyhZtxCp8- zV(Mi$MARTLMn@o`7K5yWCN3!kq+=43VW{LJd@&18-cl34=p`sY8B9`Kl9XXY#V2rS z3bK_F7_Usl+ETd+wyPo*uW-BD+O|uzPm&C(*d;E3VN76Zg6^CIBi-p13|xTXl$Pkk z-GHG>v(=)OuYkocc#(@++_D#fM`kjWDRX8F?&X}YIWv%XIAnhDaMAF>7p(pfjc0xl z0eH}6Hn*Wo$3HIej?>0C~ zAo`FDV6-9@u_y;FT2T&SP@^8yC6M?dm`4~pc2DEPohLQoQutQ3VQ zFrM*}%@X9T)V=nBNla!MQ<}EWCeG*1O>pum8!rTtvhOC03Nma*z(t!r)TSm#m&I-+%pZn6Jc+(^IkkA;qHsef1KcmMgpWv_V& z?D^+Pg?Tv`Rk?)#JeYiW6@)ni^!pcuSrv)_m;iK`hM_=?k(dg!m{i!9jscm15rtCd zKnE;^TbKlTxdl+*nV7*DnHdF|VHs3F1)nJeQXmCW2%4X{8KJqE9SjAd=|Q4tno>X- zsF@n6u>?!tnj@qHB;*>dxtg)L1WGWQOPE3_^cuBEo40YBwTT3{X`4!ro4vW4z7fN{ z!J9Mmo5E>?G1Qwh^qa(KgipW&OaKJPNt`;U!^5#0z_FZ1{&o2o#&~8=qbhHF&$x80VV>=|p6$t=?sM4IHWuxBtcTiKRTpCf+Rzl zBuKK!5y&J^BBfBmq*Cf6QyL``Ab}6qfE4(E6W9PrB1%(|BoUA$SlR$uIsv3ir4Q%; z3i~AiV==7UB?kj0u4J*WWU*^9CKoHq7yBi%tgsg|%XE^ab5bXBYO%OXCw6+vx`eTM zVkdd3u?KsAB7?fX6wJXS%)&Ix!$i!)RLsR>%*J%g$Arwtl+1uC00Y>79C!g5n1Ro- zDV*A=pArL~5(767gEbgUp<;ugN~)z|%{Gt&Mu-DBV4bSMDyh<{tm>+;0;^JpE3P^# zw?ZqmVyn11tKN(SwmMGal&iXmg}P!+yCVKh-%KmLN-OpPtiWQg#9}POVl2b*Lq_P5 zD$$?H5#zaS$`muP zBlWN$Ez%Cluo4q7Cyi1dT_?9hry0XizLc>V!?7;yQXMm}9&>=dOn`hE&@)BTG*wdp zpbrU%fHAwWDuYuk`!YB^Gcdc;Gyc=lH{*pggR?q|vpEaYJF~MvrL#gKG(+<$Far22p#pPqQ>lh!;a^ttKXjgZISEE=qx)6+C zm<-M^IL|N*xH!1daJVxYjfi8j&R~rQcn#Pf2id@l+VHsG_&DD<4wPGt+-SL#i@E5S zxtX)MbFdDdv$>AdIqk5y{&?6qp7V~A6%RKxx}!U~^;kNVJrAc_Qvhix4(O#2Sda&a z5D3{>uIoCn%Mh|V5fU*wvkMUvS&o0*+kqk20VFvR zBzck{aFQo!ys?cu$fJTcxDxgOlk+(rF?k+W+`KVKojC!$I(Y-q@dG|Vy+8RALrJ|s zX}v+I1lx0zN4XSAnH0oTTuF%(Md-ayF%`%an8*bc;X4&cp%qzazUI@FW$_kV$p!R_ zKXxgWW+4`I*gjQI7V|R}(^ZAgwLaC&m0`JsX2F$i*}wFQ7w{VwZa`gaiQV8umf#gY zec_dU=|6;VK5`NMg@>t?b5WP({TGM_IYTmBL%>PHz%iURgu}-{ zM8H8D#F3m5cHuiS0Me4zxS)`ujc||X%gD>F4GSLDu(E=>EMKorg@7uw1bf6U%yzrhC37eCDQZ za?5p^%Wm=}Z8}T5#7l9iFn793ftE`SfU&)Nrx|N7c^W4O8`A=q*^9>LjMnIl=ID<0 z=>Cre>5vxbk#4A!Du4oTfEI`W_T z5+&=yGHXX*1W5Q!M!*9`u#$0flEV`M^TaF+=`7D`&%BOL`E*bEoKG8A0Q@BB!6xj& zHtfSj?8M&a0bl_!I8X)EgauWu27S=ynyv|*E(+D`?6T0#{!kAsFI+$`7~BN0HmtN} z1lUZ2H!y=<^hOFo5<0TV2SKK3daxYJ(G9pd2ze$ar7$CXQWbkrUlMK)+W;jM{?Zat zQXZvI;cgHWqvs{HXJE3hfxgm)mS`I*FfYY1Ff}ml1~MWOY{e$;@;2}McrrJwQ!yK} zEu&K|Yi~2dQ#}>4H0x78l`}UBR71tHIV03Q8#Fxt8f_a z3kTOVT_cNi>(!mm3xR_Pz`%@{P&S@83SdRnz)04Mn>eTFHmmprZ)1&MXjUhO@@nI@ zr-+JW3$|q=j9QDa?MycU)Y6Tn1|O;SdR<2hMkR&`;AG5*yS*}^NEPFb+3W50)*u^oj65A+wyvK_?D|sI*S=)8LJhzRWPF#~SfE_uRlSjOhyaj~3^@Bb+y+Q~SK!^lG z5qQ{h6xn-}+MB&dS=>-*T*;LbPNCf2o7`3z72~TFSrL`ZZNC0>S>EgW7VZ;=>>J*X zm%oFdU3&?6YY~_1tC#9a7SY|7@cR~8!Ce7Fgmh2`Za|mmD;Mpn7IGmL))haS$3I=s z7vzN(gBd^*Tovd=goXi_2Xw#)lwOX}UhnN*?bX0kI0cEpn1aC=QwV!e7=&9WdwMy9 zQb2{45&IN`nU`^ymYG2stQnorK_0}xrZF1+z2BP|;HV+Or$NH0xrCEhLMHT@1g2mH zreLq}1ht_;E!^NQl!PwaLJtn%GBiWHDPc40o5B&C!ck!vPMpSRgg)fMMzF&=z(YJR zoIuzU8x9>uBt#!xMAS(gJVD|=RAM8}#5b@+B$g8=p8n!9h=U_`9yLjmHnHL>#^P2K zV^=K2G2R~K@#5+69x@r9^zq^_d1JLrV_=NqIG&&S@#Fd7#`nn|0J=u^A!Gs4#zTgn zXZ(WKhU6-ER?hbWJ!+`i7+AJ@*_->9z7QE$O5KEA}Uz$z`??2&Yvt;5cwG-h)o?g zf9h1>)G3apPoK7M+M=q86e*};t;%9+R;MgRWKA(*goq7i&we;-V#9{Fa80O?3wQ2Z z6LvqGxclMn-LxA@Y&b#UFk-e9MR^X8DjH*eFxgA*s-Aj5Iw$ul@$upq$z0n(>a zuWtQ1_UziXbMNl`JNWS8$CEE_{yh5h>esVx@BTgf`10q|uW$c8{`~s)^Y8EfKY#%W zI3R%q8h9Xr2`acCgYOk!KnWqxFyRa{fFZ_(KmZ|z7-MuehKC)x;l>&zuAzpBYs9fe z8)~Q#$BTK$kx3?U#E}UkIChfBCXn>F35}ZwIi!%b5GiCVw%8I2lAFYmWRglQ8Re5u zR(U0swP1PWCa63qq?emqBBUjjh$-g&C7E2ZCM1wt(k3L1#Mvezki>B(9*~?-#S~LS z5k(V52(d#CHQ-=_3op=6VTE8gY9SbqhT&)!lY%j6rI%K^DW{X-09}KjiaIK(rJ8yw zs;R2FDyyx!`YNokb~iu*HMl_r8*S*?h9uE>uX4)u+po(Eyv+Uq0}eExfOF3kFhF#&`usD{K?^-Jc?V1oK`*@Yk~A+$ zE4?(+P&b|Q(oREtHP%=+EzHwb3$ygsVTav|FlC#4w%NoGBh1>u472ty!??Y6+r-FS z_uFsVt+v{F$K5yI$xJhiF~k^CjNyhSQ@AmWJN~%i#~cGW;gDNy`81PX-nizRH(t5q zo?l)}=f)tjc`=SBvpDO<46{1ys~f{Q?61dNOx(67=B_x4mLS5E<{2AO#=D zKKdmice$(HFnTdOVepP@#S`K1N;tge`GSNYlpFMZ@r!xDgB&)rAv~Z#jvC%@hvYa1 z4$lFPcnC2b!92t{*DQHt>}2NkJ!#VuAbi&n(q6zS2$D^gJ( zX4HoebSmGEtR$!3z?FNf*dqlQM|GCvOmgQO4i~ro2H8Oqqiou#yKn$iXUm z-~(6sV3xDo{sAr;g8s@P;?6Yn$8j133L4h;2rq4}kCkAkwMMb+S_sfcS$T;u%ju2!arV7=%3sflqrL zVi5f#L_hI)h<*lipaT`?Kow!oLm=W1qFCra8_LjzQk0<3Dvk)AXcw?M~9V=B{^%2cK)J*hfWdefV#;ubN5=}&Kg2%%yWrsxnV zPJMdRm8!#}h;V6B5uuKy_7o9ERjEmV+SI1X6r)7V)=*da)vpefsH#W>S`i_NhYoe1 z**e7jS>uYM$osu_QeAr>idZN);AFJ#cv!M5r{Y} zA`puJ1UI=Ehe!w_4sSp(eYpt;2gd;rivVXF{BYq5cR|A$cJLy!c?NCzL7U#}FgE`E z@P;lpIGc6ICXBfdV;RfX3tf;gHm~UgE?lz<*7QOhc5GuI|MLL^c!D$0{H`oN0nJ}-bDPCXW;lzv z%~SXSoZH-lJU3y_etyE90WD}a`&l6baY&yD(&vE?gwX;S=0b!Zkx7#TBa~)>5HOq$Ma(wNi8t6_|{gDY7QYPKI(575JnDN>PCh z#G-1eOr_X$DRxy_kOCHDMcKqowz9#Zm9RKvE!Jj>3i1*cz1-z3+`da(HvaH|4W!^N z<3@{Mzzr9|Am%V4c=x**0~v+^3^W|zK*Z`TvVBt~HYF1cz)f}<)dW1?0=La=Wr@3 zW&jkJfCi3=6o$qCh7fUxLm(277~CKQ60spgE>Z&<)X)YP$)V|Yg2aq+lp{6mXcL_f z(wL5<^(Jj%NnK}BlE7pOFMVkfw?LAWvh<``R7p!!B0Jc-)TJ_QqD*62)7{zhrZ>5% zO?e_$9OPi9IH2JScnH*=cF>R=@W4QkQ|1E^p`Y zn;^l6a@{EoTQI{Gq6{yF2q6gdf>>mXvohIGtOJ7VH)IOwu!hZB1LB96#5#tt@uOd3 z?!Q>~;h+AEeJo$($INCdBeK;@+~UFEm&?3N12l)m?F#|Q3es4coAd-MEe1 z+zkxU4GhMO4D!w1@ZdBMLo%pM;|R{`7>+Ug;O1D4=9CWpX$RPUx79<($swEY1+JPBBbF5EfzMybbP@VeP~X^VHAobdc=?kn;=!^;D1b?9cMx z;V-069ZF9hPR}1c5BYEp`N)tV5~2)UkN6ZK_@oc}h>!n(&+_b!^TRv>o_ zzyth|WH{0xDUu-x3?m_ABuP>wQBo#FDRty3@jws2k}L5* zE&0F>)KW?k$`1U1;_bi?_`ohT!Jqh2Fab(1A=A4YQ=dRnlu6k%Z9x}Q6O45Mx~!Oj z)xjHR*fu#BI3d_MsS`Q@f;+hrRmM{x$P+!q(>@VGCFGMn-4j3^!dMQ1BKVU&9h5;S z)FH4XM0r9kM3h5S)J4@LMX^;!P1Hn{lvAw~U-l(Q<x-z)nH;3Qk|4g`BY8KR7Mfi zYtmI%A%bkS6>WyqYN}OkdR1DT6zSqmMMG|c6t_Vu@-rDXDN7sW|hKgrB-*A)^O2QncP-v4Hs_V zmTwIgZz&gY$(C>VR&@zibVXNn8CP{x!gqBScpa!DkXM2(sDnm=B$SsUL;{75*LuyD zc$wFF$rpXSS9{r)efgJr)d7700v^~Ge?3AVJc5cYLL@9$Bq-P$G(v^N!6Q6ag-zH} zhSPOy8nY1rPzZ&t4TTCEg$}g9QhdZt z5L>V{1y&H73M89TfW@*lD^@tGR#@LwOq*GZfLe$ETYP|CbgQ?1t6Xr~2b7z*mFu{^ z+Xtk@xD^Jw_C>qFn+T--Kw9uyX8a3fze?O|jK*#N z9LWTSZ7^(Z0EY$)NB5G$9Am8ek{m_tjLZm$(F3io-BeCKmtTa z47|V$EXsx4T+iiP&~bQH(1m2CR^2pU~ozgl8R_&H#t=5tql9-9yorxvnosT3R-@yr;C|{kt2#nl`8N@*v_<%3z zfDqt-5QwA=jFQVzUZm{pI8F#_p$2zO=tvF|8iNK~PU=_=5iXA6s38#o;p-ev9Kzx1C{G8yp$Cbg@KDbu zdg2_?Vg4fa;qXw8A@)KHL5~v8p(NhnB7#pLo)7kLkNAjB0bx%HQ6eQeu>swW`*flk z3UL7iu^gVU9O@77JdguPkSlIa1+k(mMo=s=kSx|B1JU9n3J(AYqujKRA-2#k{_)Zv zG5KTzGxm@o@6a?_BQ_?{5oKc}A5kO^Q52m+H%9U}N>MwOV-=~RCwq|=SrI5>(I}VE zKFs4dN`M>b!anY!KIY>+&awm?00ERNL7qSc2$CZ4viC7kBJr{!Ipicoq%limMq*MX zVG>5lfD8b^D9M0F_5eqgQVisPE47jk)PO4)0ZQT$N}{9?xFk#p0WUSgFX5yx`N=Wy z{^YxC)4OcJ6qIS~R@0dJ*oeVcf;A;SL)e2&B|8Q5RTe^4%F{g2lUV9gSfZsu`%_t} zB|$;dT1vD*t(9C>R72&0D0I|D|D{LwB}k7HV6xOm`IJdnrb<;+OtB_PMHNe{W=vTo zW%iV3;uJ@*=0{bPRjJfx=CmrLgK3^7P92q5)znp;)KZm|S1I*i&L&xPv|5QmZr;LN z(&k;!m2+P8ZvrQABIjTA6=N-yb28RfLuV<7!YHJ5XQlONVODmMLU@`&cap+qoz`i| zb$hl}YO&{Pg~DpZRw&rkdCI434Ht9i)_nr#Zvm)c8y9jpSAjVBHbQ>o*M8AxfYIn1L;@gCD23H% zj@GD-_V!XPf`iTIjShE+g;R%d7>d1tQf?E9J@<&c*os9d7fd&hVH1vJ(~uPzk8P=s zZRwU)lRbN>kzs+D0wt80x0$AC7X0L!W*M7qS(UxZmG$J6wb_-`_m{CLyvXU9x!Hd| zft=wPp4l0m1zMmbs-iCVp$!C}Me0KInG;N^5X4KMK|!Z7L8ux5r&5I6UWBG~IERy( zprC4|nHs8nnoOXYs;)S#<-|wK+OGv$5%9pVsz6c9S`hdeu<`1z6)XOb8{4xztFm21 zvw{V)X@#{mTUcntwPEYEaa*^}1qs9j34}nnaVuP;K)4mgxSc?}ZU70GK)W3VnIlFC z^hLR$M#WsOXW$#Z^($xW>%j`FZZzy{99+SI-<{va!Z95G)ds@``ovwv#BT4zW}E{o z0Q$18qdz*NN4lg>I;B^-rC)lbLvG}D01!-wquAWc_FRaBNEwXCi0o_|n1LJ|-HS9` zjRYQzv`MW0$la;Q(h^D8MakDH3DZ`|l6V~|oZXbDotC&=)-o+BSVAnA3EeS!*5MuB z?cJO}!Xr>S8qf(NxGox?K^mli8KglJFrF(3K@T)u4Rli8>i(_et^1`=3g%^A;4(U< z&pW->yS?8#zISXN^#B>*3gz;O%=Zc)0uEpSGJpasdIBUsqvyNQFTKyWZwBguE`(qQN=?Y%U)V@?t} z;RyG=3a_vdW+C9SuR@oSI<0lz2yu^r0L+1DWP$dKwoqayPV4*8G| zWg`$#@(@un6h*QTb)z(zqbI}vI&$(k#y=>7aygmaX-a`)~QEqgmx@54rTX(GL;&&UrK(UekpOvRK` zMlr>dB1Z`&$x)arWfW4NEX7GuoE)VTQkE<-lr2Lkh08Cy@YYtn-pfDxpM@NhGNxQArk6v{6PQiIh=EFu`Qf zN+ZFvkw_bnB-2JP$utsBL){b;%0R`VQ&cGfqz+c`P&JT7@X)LgK;nobj$IqeH4?~l zZLG4&0I4hv$R6=yk;smHN4Sr)S{7V#soX}hr2k6r7qHe1Ht=%TU39#f19F1kQ0 zu{zRS3^BvnZI=r#(53fXE&jZC1K+{kz(R|Cy#V;%e+e6S;422!R||vj+n12o|xi^kufGY2+CuVM9E|{NyB4;Rg z=DCTUoA?=uCY%sjWS@H$0tzOWfWnBSnP$QWrl*ct2qvz^+Ul&C)YL1ujeKL2fOFiK?N3cz<~uK_CDKhB3jTPh!$8#TyYlmR-pwI zAcq`>A|j961jiwNJn|G8S0M$?BTw9M&JpK)gws*~0QC)2H^Ft+Sx_S!ed zeFGD8|A6(}KM=up{t}2Uf%xN*KY;}0IS7FR4WN&nCF!Y`{`u;w&j5Srwcnol47!IN z{O`rrpnL7lH{bm9)o;K2^3h)({PX9Jzkd1UuOEH=`R~60@c-9<0M<`{4sbvMOp-ta zE|7r@bl?La7(oe6kb)Jo-~}<5K@Dz@gB|qX2SFG@5sr|AB{bm)QJ6v%u8@T-bm0qO z7(*G(kcKt1;Q|L>01>Dl1~l;D48{NkF$|H2MI6Hs$KVDxlwl1`bmAJ+5Jf4fAr5k& zVkWAX2}o>Fi;&oa7c;SmOKgISWi;a%V`0WLZo(FAv_&l5n8q~5F&1@vV;SFAi#o<) z7JKaD9_<+Z3sjIX7M3Wa94$e{K`nBTnHUr#E&<6cPLdIffJ7y!7zZ?LQVnT{LmEI? zhOX=Y2VJSbDP!P*8O#6-tXw4+TFFXS&Jvbk2tzGzX-i%1a+fqnzyNL-Okoa_n8h^a zF_D=}WiFGM&2;87p-Dpn{9p`hux1;u*#=E)lM|ef#W!hz3vrIq9k?i`JJ6XwpGAFj0omgrghn=tns^6OfLSq%F~CNlWTbm0r}LEWM~pr$@aISaf^g%U}QI zH$eUY?v$rJ?I{Bq08{~TK!8AXzycQV%V;i@sZDk2Q=yuX0~|mCyWquDv6|IhTy?8l z?ZsEY8dkB2RTyRE1zCmh)v~I!tZQxSTjA=~vJyiW!x%#W#F&t}*WEf)_k+p1Nk70~sWR|m<#jIzIA&tw9mb9eJtY%NU zSV~a73Vn9~1wUsPmhk@9{CL_0Y^+j%ZYggUo_P2utu5gF(TjdV+7s*|2 zag`h0<^F=YzwkwMf63-ziuz0zIpdXvjr`2H5d z7s>Diea#z;VVJiV^u2F?i;-OV_IDWm9k4Hg5#R&g_qPg8aDRgl3}hff!V{*jg)LlR z3~RW*$S8(~J^bMi1DM1luCIQf>)YQpm%Hyxu0pZ_4`|4k95uEvJa7yTa_IOR@z^nr zeGCsDlOrBOE;5meoa7$&I37$+ay-oOWGNRp%1@?8Jg!V-EGPNOQT8&Hs|@8YM>)&- z*vCG~L5_J;bs@Sah?^G@=Z8QfArXl{MJ^Im6BfV$&(lcPgO_DzqQ}9Kt^!a*l{P1f1jC;zlJx5sPk4B2m~JMK6!hi+~Pv7y*ezMBmZR zg~X&$h+^qS!qSnHP6|_C2}_|Mh1IE~Brt{PN@Eg}m!uS?P{2w4N}fnln>=9&O4!Lw zY_ikZ&y=S-5lT*!s8gZtWNp+i3N?mWRHGDSslR(FQVmKr zv50Tk-dm8l*0l#Gs2^?@In*=Jl>R)XUes*1{VMvjyyDA76gi z_4gH~Fo%tQU{gR?#5899DOlkyAQKtJ-tRH>w?Aa>KUu^)HnK0UZ2u{f8O@%c3Wi2z zjNt!p=4E8&XM$z{UFK(KrU8paXj}$qaz<*RMrx|&0yF+lYo>;4F3@X?KnH|i1lxuL znc!=R;A~FtYu@GrPf%@M&}+~}Z|KHvbl`7jkOlmPZ~kU)M8|Q2pl}lB2E9gcR-key zr*c|Ab1>&|9tU)k5DGbG3O%O+ON`QC9Fb#dD zcQ!x-zK{gO&;*c&1VrEjHb8kuV0UIJ1FnaqVoG{8prHiOrm%+)xhHzY=MdW`eHc-E z=*NB#5fSNUeJF8!_6L71@qXY(12_PuJn?@3h<_S@r~+sd9iRa8EEQF863~2#)9ojsVGyaN!m<;T`qp z9qR}c>d27x$&4&vj0Q!F$OsbT;E^E75hiJp9^sN00Sy>oS2hWh&fpBvzzobF4ay)5 zcEAR3ppQ}kL<*($@}W2i zFXu8ZU+Se=il%6aEu#l93vm%Kk$)UOfHD9wC9|ga4bEtY8zY&MK|IDy`P47i`luaT7P?Dz0?1t?a6pG3WJs+zWCQGsw>#zVHl`OKz*yl zgh9QMt3cH&yR3`5yi2>ft3rML!K!#+7j&V;#Ou4ND*~tsM6v5Zt?RuW)I=E+MG-8z z4y;9eOTnCLzYc7_8jQgL%trs~z9Ou|M(o3U6vKctNQE>=e-y+>?7;wxxAK!geJi<) zYeCBk$9Am7bSxWe?8koW9Biz~d@LS-tV^d%$dF9Pri@F=6w0*hOp`3k$Sh6M)Eu(R z9M}|1&*9AQp~wj0A$Xx6;w*UE}RJqyszV?K-?eJJcZ;%40#oqh8em z;lg9!DkMA*fjtUN-z*M30Jh)q)jsykU{#?N#Nl80!$L9+<0f`HCYC_(140gD;L-zN z=c7S9wnP4-V>OmTI0Qs0Bwjs4-clqyRs=<6#6)t=Ms5U0Zln~1MCf#6M|h+;aJEXA z#7B+<6_Ughl*CE8Zb`7tNxCHKO2KHaPVBtI5n>0D#Qsm@#7_vt+Ui74BtcIUW$z}1Q4l2(JSA@-h43gPQWOtU05|a{?^H&G za3>E|T7_0_rC2D#^f zzU2&(ZTGgt_jZpl#AW%8PhINe_-q&Y>HzwDEnOa?*8;|O2L=ng01L2h3$Va1ywCgo zf?>$7d7D>a)bC$1Mhm9*V$=`+ECvCocl|_$WLU=kz*l7u@MUynd>fE_%a>+!CTL^^ zX?kX8;1_032}cWF%joSeY!Y&&bSi!rxVXOjXg0k^#>H?SdI(m zmprpj^>~l@xR3q#j{!N51$mGOxsVOHf_gClN&p6IAQ)-D7>%fihF}?!NQvB_8KaRJ zrDz(bF%Gnmi?~P|H-Q_+C>+CajpWFT$Wf5kXdcZ`jsVFPZebnk=oa4bkKS>R5UG&< z=CP0x2_XFuk{F2~57M73i6M7I4bUJg(?B9U36$cX49vg=Moc;*NaN(H=-q1KY3BC61CVkSB|q5xAc zLrO16`lM0XCGv8kU1~516Q{*}15V z`jDxrAiOH8T=O;03aeOiteToO$!e>p`l@&Ht+LuTxw@|KYOcKcu8{Mtk~97}nbSDY z8aj9DJ}V18*|W4%%dt31wZ0Rzw3D>Xa~jIivCb1c*E6*M+p(76vfLUv9jmb3v#}UU zw-9?67OS_A3$h_QxMs_^5VT31R6x}$tu{MCeL=enR6-#XyISnCuSyp*^t3e;wKa6k zSeqBBOBW#YysB##z{^BSG)CX+K-J5>oC`<$3rG3uz6wme0L(@WEV+TZ#5%0Q60E`` zEEu$5!ZZxSrdvp>+ro;p!+P{cgB!7S`?rL_zJ4LX$RWny!Ah%iN^^|8+uKWbOiPoD z$dHV_kL<~uOijZ~O|uM5wXDDQn;zu!O||UHnCu+PVIO)79w;JDQU05?ACF56qCG?!- zSv)ronq_hk{&cJ5bf;x>nhKGcCBEP*I@vodC|{c%Y$nJ75CJFf0hNY*9WZ`#MrfWu2u9}qeGBmGqoxV6W&2aSzC__4SVYg&J93XL0+6Un%yZ_0lN z$c{S^G9xpnJM*Z$|NFr|{KbF#$-n%~|NPNk01j0JWI&sR=>3HV8H-4X#K4j-`H7-v z4cZ`z_Meljv5NpAQzl3PFKybC=~5?z2OIt#jPZxp69)|%HEGhEX=)}a z6*E+(;;>O8YmXQ%T+H|i25i_FV9J_38>Vd9wP4nUc?sK zdd*2zY+1E%*~aA#H*R;ld;9(k+&4Sk?TQ!2#V%dCS*K>PM0IecPo&i2n0Z5G%akuq zo4s4>Sp>L{a-O7keBkv6I*q0%I3%%+z{YAB|ja!M+pfA(q2pQ@&sOsmtd zI!rRL`qJv1vD$j)FL(Ol{>w1D`szzBzz(CUFT(sHjIqZ4(o3+uF#8L$$Nuu{vduQB zi!QwAvWvF7benCs;&R*Vx4VFQ?k*8@3vRT%L`yBN)x!I1w7bUZYcReP!)q|Z@Vjro z#SFafFu^1fFt7XqOmMII3cPPH#Yh|s#lav`3^E#TjEpuKd#sJeABzk!#~qu@amE>A zEb+h;4-9iL$-ulXz`RDA4LLgRtTQ}5|4h!$@xXHqIq}33^wIDPZS>GeAANMw=Ri$0 zJy4rN_0d?Jrj(O%TywKGPoO=%XnpRq+3Tyz0`_bDmK@dWKgBZji`ge!|8c>0UXrKWb2*C(Suz{iw#UT)J2vJ~A6uGz{1~1q^ zM2Jv?AoSn}Pl&=3szMbhL<9?2C_+`JBZe+qVGLi02z0D)hbzp5I(B%A6$X)qHmo5J zjfjpI1`+-dw-{j%ljuT3sN;tx79{iA-$b7l~NLG>YOD zYh>aGE6Bz)sv;G0Oa&cRXvaL-5fP$Lg$DHq$UKT76%{0;9t%lGQxH-Vqe#Ul9yy9Z zj=~g^90e&*5sFcSB9o;cMJY5nice~ilcexuCrc3uQ+jfftn@@FP#FqXmckRXe5EUA zX$e|df)cr;r6*$I2}=C(5|p^a|7bZAT2|r`mGC7oD*;VtQlb))fTkp-c};3oQxcMh zL?t58&2D~^o8*)PCL)2(bE-2En23hT@;t+_4KGdO)c*7eWQHSw$VSFS#!y-KD zP>psWq9a{tOXC1Oht?scU3f$Iy!SmX%=D&p$Y~e6zy#7#6;8iV50jyyy>sOsO1uZ)aqchIxvC`ZadoB#um4+{w0DA zh#&+a5P=E4Wr1#gds`OJ&bUQTfeMm~0~V-&1uVb;5mazp=TeutLeRl>jjMy{I#&lE z$gXt7iv#Djz_}@KE_>h0f)uQ`1=3}~d{waC_NJh{&K>&qPC_*ca&;~RF zAr8QJ#vOujif8Ph5k)9O8~V_VLFD5e3%SNZ7EzHm1mqm^m_$ex5s5fNqbECA$|$08 zi(qsj7&#yTbSa#dzYOLui+RjsF0+}>jOH|}dChEYvzy-x=QzuG&U9Y>a{&~c^;?q- zA4gfxHG1^u(W65^+R+0>hon+c0s?|=qeE$=q(Mp^S`bjWMOs?A1SJ(v=ezfp{RP{u z>;B&7a}NCm5y!xWsO)tjbO;u!P8mMs3cn~_sgo*a7b6YB zIbY}QfaesZ^*DlDGD_5O@Kh9t>l8!c!CfJ2oIruzQYZE?ub`0cp|ET}2R5Ycin=Ko z*iA%!Z?CdjBV3rF9#gx@<4@Nw>)&<%c=03R+taUqzQ4<*!~mtrW990@UI;2;PkpEM z!Mrg;E_R@>`^r>~UARtScT>IZ!`%WRkZC6%W4 z!}-=M5AQ3ev|DZLO_5Q!$oOVJ=o#BHmoBMTY>io@zG=KIdiTyQeB6q{EdK{%1=p^y z0jn3ftS_Qi-vmC*muQA%%Pb*shmUA+p&C*wYEbUKEqM$r+iT|E`pnn5d^)u17J1g> z6a3aq&%lbHd~ON7l5mkqvRhdmTzOZ)|L6s!{q~Vs=g&3;haT@gm%!{({BE#NZXX_oV+kJa!RTfsX!3p<=;E3tdPND`JK*(xOpPB2mx9wGh(H zqD%|`wG5e^R2ek}*;9zDsus;Y2CLmHYs?_4!$8>g${JnBI+x)@Jmf{IsQLXP zP|-rEn8LtAQ7RU&_~9ta*)mSMEX(*sv|+32-C*;LD7D~IJjuRR0(L{~8R~A%f!dYp zT}pcsiwv8QC%1~TjhDU{e0a%Bo-GTomwOY&C}3N~{3SeU1bnk!_P z>jtAU$<;J=(K$EfniXiB7**S1Ra>S!$71xCi(LCbiw6YLX=|Q)R=i)9C04-lshm|% ztEES9e%lgf_^yg2!YWe78goT_A7Z_ZwN8w&j+j?j!xlul+f3Y8C&XAsT@`Eu6r>8+ zq`HF(Dr{@!ZP#*b*E(!B4qxMIi zfdKw#y$?IR56*UiJa7_x??e+)3W{|WM>(@+1Igr_1$2S*x@EACGLAN9>9!zMeOHyE zGVN?0g*I2DrK|Rst7>eyQd^MWauAvzKCN`qw{Kw|T&e=&O*xxeL1RDV0XM z>Q}mZRX$9t^sK4$9;3{RS`3n?CgWaxWk-O|ygd9@YON%Ydyk$AW7dFA_4*2L0HO3{mB zDY8@P-nWrUP1h*#_%zrusP!_uf{`k3G9+V2$8{MeD;Xc2GR`qGnVOQ=A($)(cy=1e z+5?ax3M93mw8P9y7@6-4F+b{M{}Be zsXwU@dy6SM6=}c~TL8^3c7`wPgPSzN(=^9DG;34TY)>e-(`saR0#i|(c9=&?boud2 zT$=t&2ne^texL&s_9?AV|7xP^t+~CJdZUMg6{o- zX~*$MvzH6wv)xP+D^Lo&R$qvux0-E-gQ-p{?U;1%^z}j>7-(mB^XEEUw(jwV??K$bfF)r^CfMFp99nXO8GM);( z7ZR1p=;+2F2CX7`;zU1azVH1dF^PLWMlbd$Fyi|R<&t#kqc0&1wUKL9om)-fD-S!j z0wtEtB?yuTg)-5(z-Q;YlJpsft6{|HFk<8z<*f^%TlzUoI|f=N1!|UJ0by32N-x7O zJm%7Pu8VFE^20(B)$%yzhDCJGtnw{(;+X&V$O4c9)i*%JWV89voe?&EZbh?le zU&H|niP;T}_F7&FGCcy`fqPQT;7O*U>!R z0Dn#UOb--~O_kVcV{)2fBvxaJx0Om=W2I7+D;~!xY}BcqDyu-^?o!2d%!1UW?ht6L zr%;uCa}^_$%5!A=rzlHPLsichRg13p<;S^-!Dx7}TE^nw$z!!|T6gn3?*0PZ{VkLD zS1S?dmRQxENbaUy-L4K{9A+pddkfWM1#5KW3`2K@pHJN5FW0~tjtEC5^UY~}gX6V2 zV9BQC6w1*rCCasG5HBv;U%0ls(4M2%K)yg|>$qoXJ4Wjqd*~F3X*$l`yA!RWBCB;D zouVx}_M=_f&`s-dQTvg0ig&rjyJKA@?eV{g_j;4bp1R#5%Dva`gT$ayNj&dSDy7Eo z>%F*4r6Jdw|C3tGsQ((B&ZU&jqnFN~kS@Y%u&0&BDGpOIu7pu;AzcZ&U2$p@3r5GSPGkk~`!HeGX5tmiaha@2R@HLg@Ou1J<;ER3(vW^xt_7jxFAL5oio z6*hU!S9uPDc}|g*3y+Dzb}iQc`ICH>LBYg6s+NA#R$;CAPl>Ji$qS-`tv=~l&)gJD zR(}}{EBGP|j*79tauP3++oZ-=7hS!sU@9z^E3CO%G(>^l2-vm@fM2QF{Rp$$1lad5 z+4siSH_Ij&Qh*saGDYdblN20MuM02@>tE-Q*I2OZ|;i}!;aMVx>)^Tp8Hl|L20 z^LgN)>Z-^_$?si9zU39JHUN;B0R5Jdg*cO1Iy3()1y!y|y$9g=Q-PEVYYHOkLNMpu zzW@YtvnoZoT4J+?NV(2Yxf1(V-Eg;)ZdY~PuLSk9d7hiun48HPS0Z0`&^oW_D|eb6 zB3g)_;rIsi_YK0NnoeSq!FZF&cavo@nq~?pJ@wF810)M0ai`nD$a};K`eWad_-uG2 zw^gM-@C<;FssYHQ)F40&2w4Dm=}*u621u5&SLGf(9S=Ptk9Scb9cch%d$D)RP<31J z&bwmzSIgC(10Yo>3MD$9UP~W4JOhsc=cmesj7r8i-A8t*Bo7*h`|~(08uu&!psIc* ziPSglQoaY3%m;hS%WN#}gz!10g@xt-D{&BId=TS{KZr3WA{015Ur4|Y{mFzVTQn$J zFdRhRX!_{_atr_Kc4j}pu11$^HAJOcnt1cWbM1`C-CZf?XP}?<(r-5$DL*Dx97Qp z*O7|kD6|)*w-?ZNL`y#z0^G{w^Y5wh>zJAg}4VZ(@=S&P#j8)jDMOY~GBNUE9Zp(7z z;FPL9LRLRYKzq(NaMC$FWQKB%Q9TbXddS3j&rmey?^+^xbcdDZ1#(=L6Z9DtqNHbw5{b&H%MsC@UiVs5;rU zxPsLXah1D&Oq~Xd>{To2>y|F5aw0kKu8Z{KvN0!5B0($lQH>Rs^v$kyOwTJ2HCUO;RYTRrxc1G=l zEULAlY3Qa)n9Nx}AzQY@i;ip)cRFT|#?W`n1IG2Gzgaa@e+buMw9Hy;a+$AJ6}8M< zG_BSh48CLaeXXO+FkzWp!OzjWWG`J>PT$|j4965l!ITqFHBiB2@Qfp|>5W+hLZ;Gf zY4(9ZAv}!Y@6x4!$t&41-4lFux`%$F`NzV)?`JCXGx_z#UO#Gf0i=+aj^0WT{E%E~B=yn$VnU|G z1DGiHrHkRS>dnA~i8}twtu#R}2a!q66YbPTrp4-xHr1ia$}|-$MxjZyf~R`pwG*az zrjc^)IATtuTqZG($~-n6Z9bn##vI=Rur#uOXQ7$Vr*r0Z2{27!ra*U%MKi3x{DM8! zf_afSTh4jOE#IibhS?0M5knVf#IxdM(Y~0W%n0J4FS}u3^?f2Z4li%qQe0z~_OdJ-!yXhqRqMd!U}=;e&_Iz+ zM1XY5a8G<XFsIp{t{oU>x1 zKU{62qSR!k;`yj=XBT;?W!grbQ{t55JWR%zce7RsAxWZXL2LLP`eTpBkJZ%>2Tdw$3#Tp>J-JkI7PzI zra{2yz(NslN}DMhb9)c*oyBPy{p{B>-Xx9OK`~=2 z1;Q2>aU!$E${|~(tmtWIw1K5o-vF@mn7(|RTt;~Wy+^xani4YSN~$siP{&K9KI1PZ z)kGmx@lt7F9OVQD7gkGpCM}u@%lkKH6o5M3)<;NE+OKxq_b$E za)kL7^wGv*57oZqPQ?ng5ZEC==R}Xh<3oe{KbrtlP6TW-6$9)+<&L{Okioz1(ENYm zitd_NGJ2ZQ(M=}5yGKx=W0cY_*1Vt_qANcxoE&I7oBzd4NNFX(_(`dG;YImF)dZtaewyGmeGL7@?;#cIoQ!4DDxq}u(0YNTis9OZ(#geY3wxO+JV2K*y*<#C z6M2#B1uBQWuF|P!M0pyzveLYU>%Rb)#YxYVN;@3LLcPpg;FrZzoVrqh%jU&D8B4DD zYc$S0QTM6(S-MdoYLRJ#rTbNN-|3)arpV{}*IRkl6GsZI2}X_wn)%C&-qy{+3r$Cw zZ@t|`?Vg-jIvl&a4Xp6C|7L5|hA(CLxZ!>O>UORM__KQOl-L=7H&}F{T3|^q5_6`u zO?HCHLSKmcIP-Nby0|g3rtbPkrJgN0VSYA`ObvOo2H4JI|7?CUKSXS1w>;}e)K+Kl z*30OQ?J5`OUHbNd9S)ARDXnhVW)lE@~(TKLh|vrv%?Qt1upv3T8G2; zNo0S1y#;XjWB4Eda*mDMr|jwg{Zy=;qjY-VB_9`y%{`^_>6h$#h`9Ss!?YjO2PB|p z@eZ&kXt^Q@qDq6xD>aH^6*h>d44?@ogyi;nNL3FAg)1j~G}jL&Qe6a&HX0HG=cgDo z&^>3&vyTy052G~CInTuI@WTKJ&t>w`SY|d#fiX+!&rY?tfrP}>W$(lZIT%JXy{G=C z_mi(gG;G!9p~jBV=O_r6hfFH|?myP4D41*st?7Z5P&fo6by-R(4T)Bxt?P>eg46YNX_Z!Jzov4ygF@8>5?l8 zg3ckkK%4WUS|ZxFk2+XUVCmjXyuNQBV>;4ZNd1h=(CuxaWr5C$BhRR4``eR-I^wzN z&?LLbb7qT7c8Q~Bln&ZbEap7|l0Qh2;RNd|zI%e0Da?~fSYIm9jK30*OR%3(F+j~x zu^Z{mimqf_6ej8_Tggj?!eVrZNg2A^)lvkZ>2~+$0bTj}j_47GZMHQOPB9BM=@+tn zz75$|>t$F|RNM)yn-2M(79UY#yt;qfr)M7E zup?L4pSgP)mkIs6%mivRb?KWkO)8doI_B*?I1PhxRE%II4{7iw^~0*DSYAe+jwfU~ zY)4a3vO6)#J5}0z%55@P65cB+nk8A6jr4WeSF>k=QbKne9pSFO6 z=Q>3}oY`ULK!w-qSHM3II0&K{NwWzVRpyL_@+hU8zYi%uR?R7+~(`qc0 z$(U&^D{6nudRe`r$i9sm#4$rkY{s`V8Zxu~1>D^ABkytd%=RJArt8UeYGiimVD@9h zG8VHiT@x|+zX~!1giaIk?JU%8EYIkmw6X+^bIub06vB}cr38rK!A9L+l6rG2Z3V2- zb6CoA*nC)DjzVo}SkpCfQxBneJh^$~nmlu?e3z`Rb94E`a{2i4UY7{K!EE+Nti;Gl z;!aJm34-`ZQ{q@t@{cBhFs7H{(2^F@l2Or;1?Q7!aX?Z5BzXX-V(bV2G@8Jn(B3aM zQt)Z1Uyg|LE*gYP1)b9k%#VVe_QH*%WSeyk4a%T3 z0UX1mrk5JKA_0vS*Y}=~zMEDCf!@h#*KCy{3`s$P#c#c=~t8;^% zh>46+_$Za(m`{~kdv$?X)u%b(*NGyZWkt#oYpQTHm0luM`XW_FF>kg6E4D#wavFRjl81G6rwF&qF)CHNN8=RS#4)uZR@hA!*z_qsptoax;lEX16i?&8Zkn* z)(Iu@jYDiQv2J2(a_UIjjqL3-{pU3=g2nXnLaF#dy7-m7$xpYp7pvl{^d^r^>s;Y) z*Ucn0#z^+1>vzl~jx_7P@y6}(64ZNfp;P~TbCCe+NS@G3l3vyS>XSIjn>t^X2!}~t z^hx|ULS4K3M{6_%Zmka_n+{wg-OCf)y_DSaF(u+d5HU=WC4fmLUl^-pE)ipuJ#%4+g~bqr(;vt*54%f@3`^g3k?%Hp+BpPc~fW{sxv02 zitG)9-1#wCjz2{$k!6lYn@#OP{b^z&G${oc)6}!@_;FIJ`nz{ft3Xk!j?kn~QL2yE zlpRx)fxnZwU{q!hMYAc&J|`+nzZFJ?YJB6%SVQudhhkEcVvKn^ej4#&hDd3`iTdRo z>a;TOTm$vXDC_JbYCV)vcCGaqoMt_=qxiylFZJdA2u(@9(zjHa5qq@gR+B<-gXDyYW%?4rodA?o_^pkW@!0 zRCRWALh$XK?^hr+!jQKW5Q&jx$ju!l)3o<@x>%~yhQ@K?<4tsBSSeLT?L?a z$1_8Y4yYLb6gpKEx@I7x+}GF{XM;Z&yD{D%Ym z4zvB7dmc5i5UdJ}BR!!~SO@|@k7BuUc=b&9{_`6QS@|n^vEE=|EOpOUCPQfWnVxmH zK+znAeIO^bx0gsz^VKwzORNw4vzO$7CaE!No@pQX&tAdkK3ldi$6Hp1EhkdNJa%el zIxc5=31O>4Ja_x5+On=tAWNPm*>Wz(P-n*gS@a z!?hj;ad;HKsGEko3Shz`x-1{u3@6=;*4>Q1yO}KH_3Hr?U{UP0!y%VE#zdvIP+mS4 z(kK4zk;%Ie(e9#sy!Pt6&!Y>?bBGa%oIe7<(Xy`<4}dZ~Ajx8Bp(Ox>2*94|tf)DY zBxc4J`GBQrgshpLhuRDY9MvjCa53?7IXnp9+GmG844}cflL%0-m+Om^8z(k|JkSek z(|f(6#~M`e@9+JDFjlgmjbZ>B&Ef{WY(Stqv(MRf%oVt4;^+}evsoKm+q9+ce^mL1 z?G0f*;G--Q2ows_G)RdRY6&t(t9;{mAcRRYc-}OgS!vKEOVS?X8GAGls~MX;R`pWZ zut1_ZS-IL3Dx7-mnLsb>3H3@dn|R%3IE;qpq))`w9FCy9M(p9ag-22E-?*s5U&&XM zuze~8*33-^H3%9-mey2^2`yzBRh8B_pVqAUc(=SaT0@JjUm9%{)VA{)10GNRYpU(^ z72UI+tfM%t2{-O}KiOYne5`#u6eu?Ib8_U?c=cTDX5j5iy7-JH$wPILpAl~_eM~+( znoJhHU7jIvog!HiiM=hTbDF}NEJ)OEE7ubVpcZ}WiMu8KHq{^CBuLjJo;%gAOZ<20 zB0jNz(v^hU1WFq9oBeG{R7x zh*PeD8Zx8U^dN1ujCYMMS$2lne1`D%dqX3|a7T)z){LnW3+;sDK4vF*P{0ceNQGH3y(L7i8tGwi-lPjj*}(B<`Yxnt;7S-Ao*0q)=WsE z>s5l8IkBT1xlLzV5xy$02t$$IkSJ6nXBAB5+cWR+Sl*S=(xPmk)_!%6|*mMRvM#FPBC}l|)9DIe@+P zQz|OnD?n0xtRUoPv>=;K>afoCq^PzPe~Pmxn$1&*gH+nH<$5DJI@T_Z-ZWKrIyL}( zi;)U?d%D2cir6TW5gAB<4oJ4@Vd~e2Kf5vA4MtJCr>S2bu5~Kd+>cS(&d3h!7_w{QuD}ZJZ^CCA{?uP@-!$6vltXcPH-FV_huSlQASTOYadF>>{Dved#k zt2FbVm~Ej6N1>6M>zbace8~3q0N3wvuF7gid>pr`BNBt;L%d*>0e?biw8v0riBP^l zVHGRJ21G0(LQ~IhL&>a8%D5Y7Ab$>m-yl|xRa#&?TX=L1iBKo{lqc`EHBtRo=yRdk zb0D=y5PZ5+H-*=zCP;X;(zr+QiHTFDPlBxk$NizNRmRC!AMeY7)0@;Uww z6|3wbVdVb|g#XQc$pXXtbw_Mq{!kzMzbAj%W9X&?}&2f?JBkLbegj2}4Bnu5G@+C<&<&?d=a}KAH62o6_BQ$7i@cdHuXu{m2 z39q;(Wbd&tRAicQxf*7nxiZ|dY`ui3U(JMuCBJg^l6jE*K;K+2XF1-cGT$>qxH8AG zQ20}(6`SjuEYs!chlS3@tR9)OWXk0Pu90CEF$B$nmnGB7B$uZ%^9h$_=pT(E`l!kd z%RgK;9U?yZFH=_aUuxD!O4aL&B)~qfmDY7dK)2#r*Y#^9I?u;yidpGm~@6^Q& z@pgV|93%Oi)cjfP+qmS+t=Zew*;{(U)Vih@!!XPdn=MXc;3f=-czoq(+|HLA%^m&>Ub(zCHi~z0V<~h zj{{T~?k7tPb7o|mDP0U`1r7<76`YTrUzeSaN%R*;tDa35%8bc;@iA7}JBVmf+IL%h zti(Gk(=xrEs%89{9tr7{?9?U-ZXD8maok9!?N0u=E2kW&TACvKlSUj?`l1OQDx`$Ofh(%m!#0+ebx$h`!Az0U5Nb zlLT&KNavi$X{!>sj89{j3FBjd9134`f2JB_46%8ywxGmWf{AuCV|5ONX_Y3U@oFhU zV@{&oACshikGJ4$@I>iKf~ONo%sxLdB$3_se}$%y)3mNxu?u5`(>B}w!9DX-VCplf z7(#)Z!VDtKSOSmXWv@o++Lopj7Hh-BOesw8)>{l&<$uPcaqnne*vwO=1ZH< zRcFYXwBM60Nl4Ij0@8-YKj0%eBl93BrAr|=Gy$e@-fAwPSSLr0bx6W^dvi!m!T>wh zS-gVS7WGu!nkxJBq{4v4lWXt+?|VqsN-&`08R|eY;7g41KnW!sAq~}$IwfH(TjDt7 zp(}YrEIGGX23v!lnEfIVFOUs^ui=>0@`%O#ODgP7fy^#7G5K4JZ^Ya^jh`OP7Ug}X zs1#jeY(m6{s%(vXrKLOwlAIX0E#fqTDuFjFM>qb1dbHQ5Df$O5`sJ0@H(f2 zDR4gpbCWKlj*i(on)d)ho;xo_M-a90HmEl!J85{_6$SGaTapzC;GFOLwqb6;kp3s| z_MwG3cx5Z3MeO?cp>;8Ere@>ahm+$+0sbo+HO0gu4&VJUR&e_@Fyar9z7(nXxFeEZ z@23gl{IXgcHHJl*oiN`<6TPO5aOx6-N|H_*0O{+VbhBUkQVivN;7^$w!Yiq^39QCL1 zzh*ZfuR{9;+h|EGyIg?XId^FmX-O3~Fr-1^!^-PYDFhb;H%MtjlZ!CU_u1j&QySHG zl+MUM-Vu8ImWU*@hs13ojdjY2-<50>IzX7pKeeIqg*LM1uG5jO3a404nqAz0OC(c@B$1qLKy+ zT$l-UE;q5p1VwwG%qt}=w$oEq&JEbMBJw4b(?(m$n^<}8r=K2mMaj2>34swFG{LsU zj^8qWDT*pglIlWmw2W~|^Bu+^n2Xnt%+>uiR@&($hQiC!J(Uye=b2nCXIk&;0lwG( z>~%jDZ|^W9QyETDUsy~cTSY``rm!^b`?EPNMvJa$zRq}um!%s1U51w~X~UO~t#w3K z4u3@VH7uz7zdK=~Vy!)lYDt&F1MXd$)ULV~F#y)37tN=Lv8I@mr}E)rAy_20UA27T8kc~UA4^%>!H49KXb3@98^wNj2~yWjQEKM*@*sK zo3U&gxOy9qRqOCgpQUSAK=SvvxAV{CS08VK0odK~f1Xi9Ka*sju#Z%RKtZQ2u-1SN z)nE|SOpxKAqSJ^I)qs!Tm=o1l4%I}9p~{HX#GK(!a@Pd`yZCO2V|Tkw~gipK2U)pzWT_pUK?ZZvz^ z09#Y-J;kg>rTN2hnumW%SX$=vx&aRr(I@@@^%LV$G8690-cyxQWn!SJ(dRSSlnWJF z9#qN|x({ak83s=wDE4^Zn!ln`ZmLXf255zAKL0uXjGsyo9V-(s;K?8oY^gx% zRIn<9H#t=#XiAc|4{^H%qD~WO=>zZfQBYU5Jaz6 zXoifPfybEXhtP`#(2JM?1?>9_hRXR-ngZ?VMo07#CvGO|^fCZ)hy#}1=a+nxQsVXi5T<8GPNzM)|e%hXUpYj$gJ;?Z;W)zF$Tj0CdOIUK9=3C$8Q zXIPCsnKC|!m@|IOXz*#yNTU)NIcEgmW%j|s+U89DW}&Qm7OlgXb`&?4WgRDQm=Kebq*I+al#>aJ$MKJVg4pQ-Jzs?% zzQTFtBp&9Zd*6#0)@y8&RQp$OJg)Yd|Qn}Us* zWHmT-v9y=!EaBQn%s{i|H@zyncAI;CTXi(G&tYDm_q*_K?{MDjiQn4Oy-lG+whdVJ zp8PHXS2h*nutEIsjQBp0efKT#M{;{-j-kqGkc6zRm`ZF-jjcPffVGO5=6HeTR6Q`6 zgleFN>47s7u3)8ZXtbo@bG7|A6Y1oOp5P#{Kv>*lu2qmBY0zR1S+Up{u7{NB-mpF? zS>5WVV0ALGwJGA)Pr$>W*F#gB4xa^crUAoPxts|8#WZH&6tn8*U?dhwhN-h&0FaT& zjx1(*&)c5NGY`hfeu`5pil5+2>~TnJA(NbQNKQTZvL2s27oS`=vQ9|y-mIlukF2th zrxS6Ni;-uFjUKCx5qy2?*~s-*tCTs4T6t98rP}rKeH?RJ$O|xBdkI{-)d^c;2|ILS z-*)x(*7Y*&$#W1~g<_-WP|#QD(XySw6P>Z|YwJJG3cmxsp1Y6LASshP602eNPb%Z% zyVkzz-@n{VtVb99WTI>UJO5<;aVDSCjNxukG(e~uwB~TPWg4^=e{Bz?{8KUBF>(Jd z52#~@yL&FFch2AgEK26|Yqxfke7Pi$7e>TYEYG;n4NV5lP;Pl?Auh-JQ5(d@RKyRc zNQ^hY%Ed$WPNZ!xvLQpV#EsF3Wb!f4WKKV5#qg6lV(c{eGuUWsb%TV(NU1tYBZ(1mqvfWP`6ZkXQocu9q4$xzH2dAxdh%B){U@PD!lVft^4 zXcUiG_SC64UTz_zw&BM#m+I`6lZ=#Dy6c`jAL9cQ*febtCC9PfNhP}3qWoJb%ZmdYPJv3MWL*fak5MwXDH%LOn%R^z5(0i5C|i0Cp+->? zLzFL5sjeW(w_9MNGGb2@N!YnStt-RHIg1<}<0zk+avGCV8k0L63w9csK*#DZEmMRy zW!00>V0Kg2l@VSv>`46GL0I&ea=D8EW)XA(=4uRPx*5`X?s5*Z=F0A}F|!I; z3`)TjI$9al(kZYmhVw3Sm2L*Rg;`}O6V-049s~MBOjB()gL}0?Ll~`j<*s?StE0#0 zOi`(;B&d5MYiyT^RN8Z)*kZ>tx>Yh7I0%}`$T55DJvhqrAS@1EqfIz1j2&7{y3yvj zG*+Hil!F}F2H*#LViW~I&aOh@BiMyO75XOzE{p^b3RBD z%Wyo;K(-K^DD;HO(k1LosNjOLl)P)jL%L%k257IdOs{XrzDF?g!&YYR66S}^>U1NP z{?%^+cHcar19;NH9}ylp(-u765qU&fdSIA+1ZaH2y_T;r2W3E^;->S^V}h?K<)63>Wc>lw|%=ZwgtR%@(cPqLIap@D1Iev0J_ z#fe_yWJ06vTt{hzM*k<=soFy}*VFuf75WGBYP#oDjLjXhoKj{HYM6~v)^C8B#No~QETBG@c`aMiEvR$b) zS6go+tkp#nIsl&64=wz5Q+N?p^!ujhArgS;fmRK^Z;BBdi0K^D6z>sr-01tbRQnOY z;S3$>;Vk%w7Zu6G2^bEQxWqbdVj!nIG#;yc^e?FfFuHC$BYMXJ4+cH~`%;w2EW#c)cW3o(QV@T!)m>)#6o$ut^*xk zIsWelFV+VQw1(a!9Prc+dpqV7k4m=}e$`JPwB(9Bz87mpWI{ltncvG+3s0C5esuVL z;~jfL_Vt{OyQ*%is*2)l&9|;ce{rVs@+7fNyZegnzyBbT=Ps)A9DeiBUnRl)=Vs$A z+LXT=izNBA+I_}vskMIQ8T{Sk#t%|n4@Iv2OX|g68r*)6{L|+L;41#d3j6vk^6R&5 z;Q3cP+q2<6l3O4IQPBj6uhSUx6i}87{F1B!ZvgV0?hxSBS*_1*4g0ejldDeDG)5$` zhC`wLBVENRK_d;<`V0S@7JR62v_y-mbxjH-O9iXTXdjyUn>4f3OfH)%J4Q6c%2a=h z)^nUUh%~5o)M>?xH(@liD*tx0C)p*wL8dmDTqhy?wOkJZ4wJ(UeR`SiL_ZAI@JK|n zb@jRc_wEw!{Q##ZGkrcqZLyFGVRx* zW8(4hFwLy8j}r@QxlSwVONm!cmrX#<;q@%|E#A5%jO^;=h#S?nB)k+b&e^j4dAVff zU=rLBUi!N_aeumqKkBw?mtpU%oy;sxy1x0^Xr0ExpV|Y#UgmlFS+XN zObTzzQPV!EMBYzACvWc1tXeOHCiu41+oVj~hVAWgy3pEt$uNA}a#&91K)$)EBYrVpjCa92-X>wf+CAL-W*)8RMiTVGOA zMn6RU!JNu&{rLD%ov63`eWE&}&jkM_om_LVt1|`<3$_6<)M$(2kx~uw=n4j$MA|*psT__=M za<*RZXGCZviFf79P>NR-q*IDE*UjjQchv<_N)B>dBnl6yFnkhdg*Q(KwGgzQ!ejPk zMlvT68Iy{ef3^}Nvm^Q_lr|%_5~Sb8o14JN9MGnkOp%x5@VrnLGkwlT&3HlntV}b# z*B+YYaBZemazVi?Mzp!XJT}4dg@*;1pi5S(g}LYJ)_Jp-DXfKH@|3d`Z>YN_DRaC# z*1|CXl1~gLe;rZP_yWt7pgfCZMpy{{4U379R}{w%PexSif2eS+gjK z2{y;PTJty0d9ucYo_gZ=%%bOA3^jVO2h2bw0o{zE!}ow=S=WhNqR3-IqiE%ky)Jax z$P$-C1x3IXJ(B1KoGQm$;zA=kRUAcQ`Hc0!E9VC`?$lnfO3}H&3$Uoykv}{3sc?H? zyCn(VZw^Y+9BA|6|;HOclh>r*RcB&`IIPmz_38Db^b}) z+B5d=?Yo8f-`}5nVE@r|wVwau!(Tl6X%8`X!D%1$U5>K>ruzkFL!8e!&PN1_3eLyG zKXP15$bBuim{k48fxn#6;eLHNP73eA(4$kav8*0Mpb*3W5r|C6=Urs-%AkK4flR&T z43%3zMN!MmdGv>F?_$8|ySwfD3BES>Kv`7ygNv;s53^9OWVBlJx zC1LaGF;88YEY2Q5k%}cFzh@cl5)5w?Z7e5?{!VzAQLZS*ED$|;F9UK1t=u7G+er~l z07_&&)6J5}b38+_o(cvW)Jy5W*uv7iF{sI~jEYl3m-JazX+PyLbw;<8^tIy&N7Lo$ z#Bg*O&tDIuo~@ZPBnm1te}IS$Fms^-RY(yOqfTB_E>KsfyqvC7^0ax;&r9eKSq&=1 z6kW!31zk>!m2D}R^Fo%f4Tsj4SJ=L&ln$;z4c3@tg(p{tWK}!7sF5jXM0 zT=>~aH#I03ah7yndxNF(S_ctfXTMGVg{Al4ZD3T%>W;hubTIWhJ}3&CeB}7<{Q?11 zO`Udd^Jif-qW({QXl3ps?^WGlaIAbm0N|&idiPn3U&QBe$KUlVANK_O5F69?|J^EZ z{iXKDZ1T_o`uVs>xDYsE4qDQ?&_25Cd(qs4gR*%J7kNEGRr=T|%)Y&kE5x7h)!Yir z>F?R}k*iES4@PTniQ+j4*FaINd5RCA6qeRrl zFVqpmwHQV!H_}`9xB4YMdjKzCB zqZztnb?q{S$Yol3ieMP>FA1p*5K>J7t|8_jQ*XJQ$HBA(9vFFRP;D&`Dnwc|nrX2r z13dI}Z4GxceN3Zw7Wv6Xk(r;4Ge`IZ#Tv<5yrmg(f_4SO_4G{!&N8z@JK=8Rzf9WR zCYEpzbDEQnoA{P6Xrp&UXPEV^hIliptG3pE4ZUl9JLA{($8O22aRf~x#niD#Ea7L` z?s#2F@!?=_^I3;ZuQ1;K1BW0Jlsg8_bpd_(yJEWnk?d~hOktK;z*ycx_<2a2&(+25 zR#?CAM04fOqPFDUof*L+_#T_=R5HF79ux?~yC!TN3o7&-8u{gIC+vx>9lo-j49;=o zJh9$aT(2IO@0|_)rVUg%45JMjiAp%{dPC>*#$@?0s_=GWU(Ih=i+_(MUYBv?`{Us# z*byeKYvu3vG)(FSHzT>mz~(7TGa?o;5Xv@KqDA2q&8-{6OW*rH02V>%zDPkKdP9q9 zgrd&3C=NU7QICcsBp>Oh3quMLk>22i)*A^+REiRjrt}3bT!Hqo-x86$6ecu@iAleg z6Y#H)CPCTB3U8Vdovy&9FnWy3`aP1qJRuAqtC%l%od4C{k_e zQJRWWs7^Ji^J|J&zS6;~URA4DH6c^af>o_*h5mn94J-bDWmk9wS_&{$ScO`gWma7dv4Ks zY~g!!5qzx2e82}7W5E`9@qFHgePTg=V!?fqk$ui*6X-{Owx<*}!GEYxfCR`InWuoX z@qip54h~3x6bM2f2!bkTg0>(HFbIP}7HUC_ z)`%TO(vIk;jpFDeOLC6zh>!Zn6=ne@2dRII4*wR3g>t|i^K6kMiIQRf2r{Y6JSoh; zY|FaL%RC?iJb;*7>6V&OmWJv6DP^gbLI4Ir;Fe6lDrG5`kcpXUX_=CVmXzrOUg?>z zX_c@kDX9sSRLPp8iJQKuWx`2j;xe4Na0}-$X1b6InFea4rfj^%0URI$1oNHZNuJ#4 zo*3W(5+ETd(lH+sGOLIH21>{js-QYcvmgqhEXtxL3Zp(Vp)_iZN4LuzKpHbn343$~KXzt&r-h!iuTBN~y}~sn+YNzKS<{^QwX~te#3a*~_e? zY8j>qthB+XmTEfJYN_Umt>j8OZIe51N;Yo_rgBO=Un)Eo%RCwDu@>v1hQYEL%QT0f zp)eD(5^6N%6SN8nKlA>xv`j0tRBN@0%*beKwgz-SBLKH@%eGGIw-yw*fXldsi@1Et zxt6Q3oQt?Dv>2MJyQ-@gyh|Ih%e%UZyuwRF$*ZZ{OTW%5ztoGp;>$(p3%}AUMTL{R zj$y(8tif=Uz!c2D42;1R?7!DviN%YhtdtQ^Ah#^NEz;K3YXOdf)aKUoVv1=O`_OUWYhZwkNxN+6p$U<0Pf z%JkIAvP{d2lFPtMP(kU;HtEd7Oa@+{k}QeN;LOb!mCkyA&T3!>_$&u_;Lh$W(0pLf zjNpV6?Sv5Rg#JP(9v!VtwqOcSRaKcJOr`|WN>B6@??yn)4@k{cNlg$IMAddR)?f_~ z2tn2eL0Btc5P)?c5CT~dVj+SpArc}YhD{_eA|giOB0PdxPa;}nLR(b=+GxTkrVU(g zVkO$GCt3j!biyap;oQUx-^#5ezO^M<;U}76CbGgM^o`!W;wiF1UuS|`RRLb{O)R8M z-g+Y6?p59TP2fl(6>ecI1kNseqA%EDE+B5<`XVoGK@>DLBMR=}9HTHUZZIbRpju5LT9V?5Xc6U5_d%T7G%gFebOKFSvC8e#6> zE0nR1_st&QE)@7gDmfRQL~kn}7(wmwfdPS7c>Zihx(vw^@`$0TECKm?eG-a9R}p zkXzPw0^`>LkwsisKm+qvTf(J(RX_u^MFYP@1mDG7;ssw;P=Fhl1?6Q1?PUi4B?WG9 z1gy|t5@v%7reYXogFk=-DrSQ>0A(&l1dOl=DF$RdW&=cq1fWm^N??XJfCO^pXSNV# zI6#M2<_p8nX@Xd1gcuF`k}uDY44Y;R*-&ZZuxgOFYwB>Fq-JZ>iJkWF4%=xk+X*oj zfQaN2jKf%r$C!-E*o@B@jni0-*O-kTrxG1t1Zv;~UI&K8fD?ZJ6vrTUbjJKXP+$zm zV2d=8Bg@E)KvIoJ5{~L9B~@~c-iVFb;f>s3kJ_P+`bd6Ip?v!1S*GAw4lO4!wS^LT zQ7LIC#f;1bwUlIF%_s>5WB{6A2?t&YDmVIMLRwQ>hP=Y{q76 z_Gz4>TB;v%GAAGcLX$o}>!CU;qdXI(x9 zID0d#ysD`3TCUvcI)N&$?7BO3N<48Yr$`&8PFu0aQ?Q1Crq0u`B#S*I%d%DqKIt<) zC2BsinxQ`HJ}+}WOG~xdG(ZUyL0RjzV9T~{OSx^!7aWv9f2+BiJ3=dTxp<4YD66?T z)Ve~HyF+wDP4og#RKH?WMqkvt$@{$Ti>%(OsoE>RvH?dA{;a?ljJ^ZRM;+`(2W&_2 zTf>wT!sbCq<-s3BOvLEn!Ys_fnpD9xEWl3@C*XD0|!m zBzjS000wR#1{^ibYCw{9z|Iny&oGsd?92zIoY1ITR2Oa0Lg<7ZEz*9M(o!`{ki-k5 zL`s4rM>a3>G7r=qfp7z15irC-c=gp@&G33PSns@82Z303O<9|jAsFIWp|v3bJz70t z*_JIOmdzxd&00_5FP<$W!1dayjo;4IChj8I$O0z*h=SYXb==t1E9k8#qT*ZC0Ugp! z-+;nibwVAy%_?Osp9;MC3G_O0L~_AREZFA&Zz=%O$F;t)1gV~<^9 z_ku9=V&h1*Fbtyi4bx61xRU~4mqR_YN?~@o?~mXR_nC3JKkgL%r0!t<7>?hJLaQp^WziT?rkvv zZsVgs45U8(V{QTA5mK!`4o~n9uj5Tk5Kaw30Kr2Vk3$|oLE@khA~)1T1Vn0N5kk%K zUj7VRgmN{vM<%xm>R@wI&*wQ;^hh`NjD-G3fTVO)w{?-83$S2Hm_F%SS9Ztb4a@|0 z(Ig9UxB1p2`sBoRk?;71w@$PmPS^xa{sd8?PfxZUQ6k0r+Ftw!CH&r=dM_nZgkXC$ zMF`f<{p{ZTM1={Ufc}i2{(Plb$hTCC;CuN`|BQeL>akbmw^@og0ik7CAU|3vzgUpv zTZDxNieOtVkXzDaTMD>aN?%-fU|CE*T}*I++a+FJ|6WwEU0|?+XYd6rI9_sa1V9*s zeei>q5QJ?Q_&dggQ$S;i(1o243O}ZWqp)N&reH{*ipB6{Zsvz|=K6=YX_R>TwLcA$ z2K?L5X~G|7__AxN25Yhg{nc=tvi^9T{?csVe`?@qo*aNNryBqBU;p=?|NGzn{~sU( z2pmYTpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m#b#sUT&e5e5g%nXxa#()t6M2yQZ zV^YR+BgT!JH8^vwQNyz*8aZm>$bpoJ=uo1NHWlr(NomukP@`_L)il=Bs++9F(wa4v zt*v0giUnIMR@t$!Zc%NDY7?qbO)o)}yXn#;NOtk+y$h*t-#Bp~#R-ZAO`J4{6Q?o5 zxUrcnR3LAeLWS~_C{wCjj>4I<5F?+3?AXCWhYlM&NWPeH(j*wytzW+mGaC$T+qT2# z-W`UAfdL+a3m;Crxbfr2{*x)+46zkXb}w9^iNx8QQiEUe6ON?WKj(S#O4L@0z0 z6Yk){4mtFY!-g^35QAzi$ne65F1%2pi6Xk7q6{v?V1o=W#DGH$GTv|l2sq+60thzj zsN)De=BPrBM1r6~k3|kiq>?$Bz@!N{4hf}@Aedmn2OkVMi*Vop^s_CZ79Uwsjy7ajYn(C>m3d2jOsJ@D-FtC!E>a3;G znk%Wg=GyD8zzRbQF|-mZ%rL_uTMRMDFguJf!y1!}G1L-6?X}k)L+vrzcFXOz+)8td zG}@4ROf}<5BTY5huv?8Z&bZ5NyYp6KZ@cSi(=NXG=1Xt6)x<0Ay6To2F1X)PE6ujq zF3j-44m*r3w8lJJF~!zaJS;K8blh>p9(PPkF(D7*OUEa7+>6Py_Hr_*zWg#wsl2c{ zDyyp2Y--Is_pD3Jx&$3GFGBB9v@W|Ooix%)H|_K;5hxus)KEulb<$TyFtyUZ{1S5n zzXSue*unmU9Rb;8`x3L-Y

          O#oprpeA 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

        blQEU8$dgZENuc<^d&9 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

      3. (jA=8)IPv2`lcRW{c6Xj~nt^^?m;U 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%0An#3pxLCbl{~;M(&G9 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�|yvuQ)LR$~e1aptC%^X8Ack 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